Devido a um problema no kernel Linux-socfpga versão 5.4 e mais recente, o HPS EMAC pode travar ou parar em algumas circunstâncias.
Este problema deve-se a uma configuração incorreta na árvore de dispositivos SoC Linux Cyclone® V
- O bit Shared Enable Override deve estar habilitado no controlador de cache L2C-310
- O limite de transação pendente de leitura e gravação deve ser definido para 0xf no DMA do EMAC
Para contornar esse problema, execute as seguintes etapas:
1. Certifique-se de que o nó da árvore do dispositivo L2C-310 define o bit Enable Override compartilhado, editando arch/arm/boot/dts/socfpga.dtsi
L2: cache-controller@fffef000 {
compatível = "arm,pl310-cache";
reg = <0xfffef000 0x1000>;
interrupções = <0 38 0x04>;
unificado para cache;
nível de cache = <2>;
arm,latência de tag = <1 1 1>;
arm,latência de dados = <2 1 1>;
pré-busca de dados = <1>;
pré-busca = <1>;
braço, substituição compartilhada; # Verifique se este está presente
arm,double-linefill = <1>;
arm,double-linefill-incr = <0>;
arm,double-linefill-wrap = <1>;
arm,prefetch-drop = <0>;
arm,prefetch-offset = <7>;
};
2. Edite o(s) nó(s) ethernet para adicionar uma(s) referência(s) para um snps, axi-config e adicione nós para os snps, axi-config em arch/arm/boot/dts/socfpga.dtsi
Exemplo de GMAC0:
diff --git a/arch/arm/boot/dts/socfpga.dtsi b/arch/arm/boot/dts/socfpga.dtsi
índice e404220.. 100644 90a0560
--- a/arch/arm/boot/dts/socfpga.dtsi
+++ b/arch/arm/boot/dts/socfpga.dtsi
@@ -560,10 +560,16 @@
reset-names = "stmmaceth";
snps, multicast-filter-bins = <256>;
snps, perfect-filter-entries = <128>;
+ snps,axi-config = <&stmmac_axi_setup_0>;
tx-fifo-depth = <4096>;
rx-fifo-depth = <4096>;
status = "disabled" (Desabilitado);
};
+
+ stmmac_axi_setup_0: stmmac-axi-config_0 {
+ snps,wr_osr_lmt = <0xf>;
+ snps,rd_osr_lmt = <0xf>;
+ };
Esse problema foi corrigido começando com as filiais linux-socfpga-5.10.120-lts e linux-socfpga-5.15.30-lts