Instead of hard-coding the offset of DRAM entries in MMU table all over
the code, auto-detect the offset. This removes error-prone code which
would break e.g. in case the MMU table is modified.

Signed-off-by: Marek Vasut <ma...@denx.de>
Cc: Fabio Estevam <feste...@gmail.com>
Cc: Peng Fan <peng....@nxp.com>
Cc: Stefano Babic <sba...@denx.de>
Cc: Ye Li <ye...@nxp.com>
---
 arch/arm/mach-imx/imx8m/soc.c | 19 ++++++++++++++++---
 1 file changed, 16 insertions(+), 3 deletions(-)

diff --git a/arch/arm/mach-imx/imx8m/soc.c b/arch/arm/mach-imx/imx8m/soc.c
index 225e4e12500..988355f147c 100644
--- a/arch/arm/mach-imx/imx8m/soc.c
+++ b/arch/arm/mach-imx/imx8m/soc.c
@@ -161,6 +161,17 @@ static struct mm_region imx8m_mem_map[] = {
 
 struct mm_region *mem_map = imx8m_mem_map;
 
+static unsigned int imx8m_find_dram_entry_in_mem_map(void)
+{
+       int i;
+
+       for (i = 0; i < ARRAY_SIZE(imx8m_mem_map); i++)
+               if (imx8m_mem_map[i].phys == CONFIG_SYS_SDRAM_BASE)
+                       return i;
+
+       hang(); /* Entry not found, this must never happen. */
+}
+
 void enable_caches(void)
 {
        /* If OPTEE runs, remove OPTEE memory from MMU table to avoid 
speculative prefetch */
@@ -174,10 +185,11 @@ void enable_caches(void)
                 * please make sure that entry initial value matches
                 * imx8m_mem_map for DRAM1
                 */
-               int entry = 5;
+               int entry = imx8m_find_dram_entry_in_mem_map();
                u64 attrs = imx8m_mem_map[entry].attrs;
 
-               while (i < CONFIG_NR_DRAM_BANKS && entry < 8) {
+               while (i < CONFIG_NR_DRAM_BANKS &&
+                      entry < ARRAY_SIZE(imx8m_mem_map)) {
                        if (gd->bd->bi_dram[i].start == 0)
                                break;
                        imx8m_mem_map[entry].phys = gd->bd->bi_dram[i].start;
@@ -205,6 +217,7 @@ __weak int board_phys_sdram_size(phys_size_t *size)
 
 int dram_init(void)
 {
+       unsigned int entry = imx8m_find_dram_entry_in_mem_map();
        phys_size_t sdram_size;
        int ret;
 
@@ -219,7 +232,7 @@ int dram_init(void)
                gd->ram_size = sdram_size;
 
        /* also update the SDRAM size in the mem_map used externally */
-       imx8m_mem_map[5].size = sdram_size;
+       imx8m_mem_map[entry].size = sdram_size;
 
 #ifdef PHYS_SDRAM_2_SIZE
        gd->ram_size += PHYS_SDRAM_2_SIZE;
-- 
2.30.0

Reply via email to