stm32mp: update the mmu configuration for SPL and prereloc
authorPatrick Delaunay <patrick.delaunay@foss.st.com>
Fri, 5 Feb 2021 12:53:33 +0000 (13:53 +0100)
committerTom Rini <trini@konsulko.com>
Tue, 2 Mar 2021 20:53:37 +0000 (15:53 -0500)
Overidde the weak function dram_bank_mmu_setup() to set the DDR
(preloc case) or the SYSRAM (in SPL case) executable before to enable
the MMU and configure DACR.

This weak function is called in dcache_enable/mmu_setup.

This patchs avoids a permission access issue when the DDR is marked
executable (by calling mmu_set_region_dcache_behaviour with
DCACHE_DEFAULT_OPTION) after MMU setup and domain access permission
activation with DACR in dcache_enable.

Signed-off-by: Patrick Delaunay <patrick.delaunay@foss.st.com>
arch/arm/mach-stm32mp/cpu.c

index 3faa4ec..d332f5a 100644 (file)
@@ -212,6 +212,35 @@ u32 get_bootmode(void)
 }
 
 /*
+ * weak function overidde: set the DDR/SYSRAM executable before to enable the
+ * MMU and configure DACR, for early early_enable_caches (SPL or pre-reloc)
+ */
+void dram_bank_mmu_setup(int bank)
+{
+       struct bd_info *bd = gd->bd;
+       int     i;
+       phys_addr_t start;
+       phys_size_t size;
+
+       if (IS_ENABLED(CONFIG_SPL_BUILD)) {
+               start = ALIGN_DOWN(STM32_SYSRAM_BASE, MMU_SECTION_SIZE);
+               size = ALIGN(STM32_SYSRAM_SIZE, MMU_SECTION_SIZE);
+       } else if (gd->flags & GD_FLG_RELOC) {
+               /* bd->bi_dram is available only after relocation */
+               start = bd->bi_dram[bank].start;
+               size =  bd->bi_dram[bank].size;
+       } else {
+               /* mark cacheable and executable the beggining of the DDR */
+               start = STM32_DDR_BASE;
+               size = CONFIG_DDR_CACHEABLE_SIZE;
+       }
+
+       for (i = start >> MMU_SECTION_SHIFT;
+            i < (start >> MMU_SECTION_SHIFT) + (size >> MMU_SECTION_SHIFT);
+            i++)
+               set_section_dcache(i, DCACHE_DEFAULT_OPTION);
+}
+/*
  * initialize the MMU and activate cache in SPL or in U-Boot pre-reloc stage
  * MMU/TLB is updated in enable_caches() for U-Boot after relocation
  * or is deactivated in U-Boot entry function start.S::cpu_init_cp15
@@ -226,17 +255,8 @@ static void early_enable_caches(void)
        gd->arch.tlb_size = PGTABLE_SIZE;
        gd->arch.tlb_addr = (unsigned long)&early_tlb;
 
+       /* enable MMU (default configuration) */
        dcache_enable();
-
-       if (IS_ENABLED(CONFIG_SPL_BUILD))
-               mmu_set_region_dcache_behaviour(
-                       ALIGN_DOWN(STM32_SYSRAM_BASE, MMU_SECTION_SIZE),
-                       ALIGN(STM32_SYSRAM_SIZE, MMU_SECTION_SIZE),
-                       DCACHE_DEFAULT_OPTION);
-       else
-               mmu_set_region_dcache_behaviour(STM32_DDR_BASE,
-                                               CONFIG_DDR_CACHEABLE_SIZE,
-                                               DCACHE_DEFAULT_OPTION);
 }
 
 /*