arm: omap: emif-common: Fix ecc address calculation
authorLokesh Vutla <lokeshvutla@ti.com>
Mon, 16 Sep 2019 08:17:15 +0000 (13:47 +0530)
committerTom Rini <trini@konsulko.com>
Fri, 11 Oct 2019 17:31:17 +0000 (13:31 -0400)
ecc_address_range registers contains the start address and end address
of the DDR address space. But the ddr driver is assuming the register
contains the start address and size of the DDR address space. Because
of this the ecc enabling is failing for the 2nd range of ecc addresses.
Fix this calculation.

Signed-off-by: Lokesh Vutla <lokeshvutla@ti.com>
arch/arm/mach-omap2/emif-common.c

index b384343a3f4a291aa1699d7bd5cf911a4b42c5d3..04bbfd84a20b26c8abd1a2f1e00ca0ed1ad0defd 100644 (file)
@@ -348,7 +348,7 @@ static void dra7_reset_ddr_data(u32 base, u32 size)
 static void dra7_enable_ecc(u32 base, const struct emif_regs *regs)
 {
        struct emif_reg_struct *emif = (struct emif_reg_struct *)base;
-       u32 rgn, size;
+       u32 rgn, rgn_start, size;
 
        /* ECC available only on dra76x EMIF1 */
        if ((base != EMIF1_BASE) || !is_dra76x())
@@ -362,22 +362,22 @@ static void dra7_enable_ecc(u32 base, const struct emif_regs *regs)
                writel(regs->emif_ecc_ctrl_reg, &emif->emif_ecc_ctrl_reg);
 
                /* Set region1 memory with 0 */
-               rgn = ((regs->emif_ecc_address_range_1 &
-                       EMIF_ECC_REG_ECC_START_ADDR_MASK) << 16) +
-                      CONFIG_SYS_SDRAM_BASE;
+               rgn_start = (regs->emif_ecc_address_range_1 &
+                            EMIF_ECC_REG_ECC_START_ADDR_MASK) << 16;
+               rgn = rgn_start + CONFIG_SYS_SDRAM_BASE;
                size = (regs->emif_ecc_address_range_1 &
-                       EMIF_ECC_REG_ECC_END_ADDR_MASK) + 0x10000;
+                       EMIF_ECC_REG_ECC_END_ADDR_MASK) + 0x10000 - rgn_start;
 
                if (regs->emif_ecc_ctrl_reg &
                    EMIF_ECC_REG_ECC_ADDR_RGN_1_EN_MASK)
                        dra7_reset_ddr_data(rgn, size);
 
                /* Set region2 memory with 0 */
-               rgn = ((regs->emif_ecc_address_range_2 &
-                       EMIF_ECC_REG_ECC_START_ADDR_MASK) << 16) +
-                      CONFIG_SYS_SDRAM_BASE;
+               rgn_start = (regs->emif_ecc_address_range_2 &
+                            EMIF_ECC_REG_ECC_START_ADDR_MASK) << 16;
+               rgn = rgn_start + CONFIG_SYS_SDRAM_BASE;
                size = (regs->emif_ecc_address_range_2 &
-                       EMIF_ECC_REG_ECC_END_ADDR_MASK) + 0x10000;
+                       EMIF_ECC_REG_ECC_END_ADDR_MASK) + 0x10000 - rgn_start;
 
                if (regs->emif_ecc_ctrl_reg &
                    EMIF_ECC_REG_ECC_ADDR_RGN_2_EN_MASK)