arm: armv8: mmu: move mmu enablement out of mmu_setup

Currently mmu_setup for ARMv8 performs two functions, first it sets up
the page tables based the memory map provided by the board and then it
enables the MMU.

However for some platforms runtime fixes to the generated page tables
are required before the MMU can be enabled, such as K3 family of SoCs.

Therefore this patch moves the enablement of the MMU out of mmu_setup
and to a standalone mmu_enable function to give more granular control to
the platforms.

Note that no functional changes are intended from this patch.

Reviewed-by: Ilias Apalodimas <ilias.apalodimas@linaro.org>
Signed-off-by: Anshul Dalal <anshuld@ti.com>
This commit is contained in:
Anshul Dalal
2026-05-20 08:21:49 +05:30
committed by Tom Rini
parent 7f34bb50a5
commit b53128d528
3 changed files with 10 additions and 1 deletions

View File

@@ -810,8 +810,10 @@ __weak void mmu_setup(void)
el = current_el(); el = current_el();
set_ttbr_tcr_mair(el, gd->arch.tlb_addr, get_tcr(NULL, NULL), set_ttbr_tcr_mair(el, gd->arch.tlb_addr, get_tcr(NULL, NULL),
MEMORY_ATTRIBUTES); MEMORY_ATTRIBUTES);
}
/* enable the mmu */ void mmu_enable(void)
{
set_sctlr(get_sctlr() | CR_M); set_sctlr(get_sctlr() | CR_M);
} }
@@ -881,6 +883,7 @@ void dcache_enable(void)
if (!mmu_status()) { if (!mmu_status()) {
__asm_invalidate_tlb_all(); __asm_invalidate_tlb_all();
mmu_setup(); mmu_setup();
mmu_enable();
} }
/* Set up page tables only once (it is done also by mmu_setup()) */ /* Set up page tables only once (it is done also by mmu_setup()) */

View File

@@ -222,6 +222,11 @@ u64 get_tcr(u64 *pips, u64 *pva_bits);
* mmu_setup() - Sets up the mmu page tables as per mem_map * mmu_setup() - Sets up the mmu page tables as per mem_map
*/ */
void mmu_setup(void); void mmu_setup(void);
/**
* mmu_enable() - Enable the MMU by setting 'M' bit in SCTLR register
*/
void mmu_enable(void);
#endif #endif
#endif /* _ASM_ARMV8_MMU_H_ */ #endif /* _ASM_ARMV8_MMU_H_ */

View File

@@ -279,6 +279,7 @@ void enable_caches(void)
__func__, fdt_strerror(ret)); __func__, fdt_strerror(ret));
mmu_setup(); mmu_setup();
mmu_enable();
if (CONFIG_K3_ATF_LOAD_ADDR >= CFG_SYS_SDRAM_BASE) { if (CONFIG_K3_ATF_LOAD_ADDR >= CFG_SYS_SDRAM_BASE) {
ret = mmu_unmap_reserved_mem("tfa", true); ret = mmu_unmap_reserved_mem("tfa", true);