[PATCHv2 4/4] arm64: dts: socfpga: agilex5: add support for the ECC manager

From: Dinh Nguyen

Date: Mon Nov 09 2026 - 11:31:31 EST


Add the ECC manager to the base Agilex5 dtsi, along with OCRAM ECC and
RX/TX ECC for EMAC0, EMAC1, and EMAC2.

The eccmgr node is an interrupt aggregator, not an MMIO device. Its
INTMASK and INTSTAT registers live in the System Manager, and the
driver reaches them through altr,sysmgr-syscon, so the node has no
reg property and no unit address.

The OCRAM and EMAC children are MMIO devices, each at its own ECC
controller address. #address-cells, #size-cells, and ranges translate
those addresses onto CPU physical addresses. ranges does not give the
manager its own window.

The children stay under eccmgr because they are clients of its irqchip.
The Agilex5 manager binds to altr_edac_a10_probe(), which walks the
child nodes and uses one IRQ domain for the per-RAM blocks.

Signed-off-by: Dinh Nguyen <dinguyen@xxxxxxxxxx>
---
v2: add more context to commit message
move eccmgr out of soc node
s/38/36 for emac0-rx
---
.../boot/dts/altera/socfpga_agilex5.dtsi | 69 +++++++++++++++++++
1 file changed, 69 insertions(+)

diff --git a/arch/arm64/boot/dts/altera/socfpga_agilex5.dtsi b/arch/arm64/boot/dts/altera/socfpga_agilex5.dtsi
index 161f3d4bbefe8..12d623d4b892e 100644
--- a/arch/arm64/boot/dts/altera/socfpga_agilex5.dtsi
+++ b/arch/arm64/boot/dts/altera/socfpga_agilex5.dtsi
@@ -160,6 +160,75 @@ qspi_clk: qspi-clk {
};
};

+ eccmgr {
+ compatible = "altr,socfpga-agilex5-ecc-manager",
+ "altr,socfpga-a10-ecc-manager";
+ altr,sysmgr-syscon = <&sysmgr>;
+ #address-cells = <1>;
+ #size-cells = <1>;
+ interrupt-parent = <&intc>;
+ interrupts = <GIC_SPI 15 IRQ_TYPE_LEVEL_HIGH>,
+ <GIC_SPI 241 IRQ_TYPE_LEVEL_HIGH>,
+ <GIC_SPI 95 IRQ_TYPE_EDGE_RISING>,
+ <GIC_SPI 120 IRQ_TYPE_EDGE_RISING>,
+ <GIC_SPI 8 IRQ_TYPE_LEVEL_HIGH>,
+ <GIC_SPI 9 IRQ_TYPE_LEVEL_HIGH>,
+ <GIC_SPI 7 IRQ_TYPE_LEVEL_HIGH>;
+ interrupt-names = "global_sbe", "global_dbe", "io96b0" , "io96b1",
+ "sdm_qspi_sbe", "sdm_qspi_dbe", "sdm_seu";
+ interrupt-controller;
+ #interrupt-cells = <2>;
+ ranges = <0 0 0 0xffffffff>;
+
+ ocram-ecc@108cc000 {
+ compatible = "altr,socfpga-a10-ocram-ecc";
+ reg = <0x108cc000 0x100>;
+ interrupts = <1 IRQ_TYPE_LEVEL_HIGH>, <33 IRQ_TYPE_LEVEL_HIGH>;
+ };
+
+ emac0-rx-ecc@108c0000 {
+ compatible = "altr,socfpga-eth-mac-ecc";
+ reg = <0x108c0000 0x100>;
+ altr,ecc-parent = <&gmac0>;
+ interrupts = <4 IRQ_TYPE_LEVEL_HIGH>, <36 IRQ_TYPE_LEVEL_HIGH>;
+ };
+
+ emac0-tx-ecc@108c0400 {
+ compatible = "altr,socfpga-eth-mac-ecc";
+ reg = <0x108c0400 0x100>;
+ altr,ecc-parent = <&gmac0>;
+ interrupts = <5 IRQ_TYPE_LEVEL_HIGH>, <37 IRQ_TYPE_LEVEL_HIGH>;
+ };
+
+ emac1-rx-ecc@108c0800 {
+ compatible = "altr,socfpga-eth-mac-ecc";
+ reg = <0x108c0800 0x100>;
+ altr,ecc-parent = <&gmac1>;
+ interrupts = <6 IRQ_TYPE_LEVEL_HIGH>, <38 IRQ_TYPE_LEVEL_HIGH>;
+ };
+
+ emac1-tx-ecc@108c0c00 {
+ compatible = "altr,socfpga-eth-mac-ecc";
+ reg = <0x108c0c00 0x100>;
+ altr,ecc-parent = <&gmac1>;
+ interrupts = <7 IRQ_TYPE_LEVEL_HIGH>, <39 IRQ_TYPE_LEVEL_HIGH>;
+ };
+
+ emac2-rx-ecc@108c1000 {
+ compatible = "altr,socfpga-eth-mac-ecc";
+ reg = <0x108c1000 0x100>;
+ altr,ecc-parent = <&gmac2>;
+ interrupts = <8 IRQ_TYPE_LEVEL_HIGH>, <40 IRQ_TYPE_LEVEL_HIGH>;
+ };
+
+ emac2-tx-ecc@108c1400 {
+ compatible = "altr,socfpga-eth-mac-ecc";
+ reg = <0x108c1400 0x100>;
+ altr,ecc-parent = <&gmac2>;
+ interrupts = <9 IRQ_TYPE_LEVEL_HIGH>, <41 IRQ_TYPE_LEVEL_HIGH>;
+ };
+ };
+
timer {
compatible = "arm,armv8-timer";
interrupt-parent = <&intc>;
--
2.42.0.411.g813d9a9188