summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAnshul Dalal <[email protected]>2025-10-17 18:45:25 +0530
committerTom Rini <[email protected]>2025-10-22 12:05:52 -0600
commit567a683e8ced54c3ffa53f62a4ed7e535268c6f2 (patch)
tree9ea4a7e0433c6bf406fb3db321edb6ba7dc56d20
parente55e57d240e0bdef604efca5b386978b1c70d513 (diff)
arm: armv8: mmu: export mmu_setup
The mmu_setup function configures the page tables based on the board supplied mem_map struct array. It is called implicitly as part of dcache_enable but this limits us to only be able to use APIs such as mmu_change_region_attr only after caches are enabled. This might lead to speculative accesses before we can unmap a region that is marked as cacheable in the static memory map. Therefore this patch exports the mmu_setup function in mmu.h allowing users to have more control over when the mmu is configured. For K3 specifically this allows for the following configuration sequence as part of enable_caches: static mem_map fixups (TODO) -> mmu_setup -> carveouts using mmu_change_region_attr (TODO) -> icache/dcache enable Reviewed-by: Dhruva Gole <[email protected]> Reviewed-by: Ilias Apalodimas <[email protected]> Signed-off-by: Anshul Dalal <[email protected]> Tested-by: Wadim Egorov <[email protected]>
-rw-r--r--arch/arm/include/asm/armv8/mmu.h5
-rw-r--r--arch/arm/mach-k3/common.c3
2 files changed, 8 insertions, 0 deletions
diff --git a/arch/arm/include/asm/armv8/mmu.h b/arch/arm/include/asm/armv8/mmu.h
index 6af8cd111a4..3807c702fb6 100644
--- a/arch/arm/include/asm/armv8/mmu.h
+++ b/arch/arm/include/asm/armv8/mmu.h
@@ -197,6 +197,11 @@ struct mm_region {
extern struct mm_region *mem_map;
void setup_pgtables(void);
u64 get_tcr(u64 *pips, u64 *pva_bits);
+
+/**
+ * mmu_setup() - Sets up the mmu page tables as per mem_map
+ */
+void mmu_setup(void);
#endif
#endif /* _ASM_ARMV8_MMU_H_ */
diff --git a/arch/arm/mach-k3/common.c b/arch/arm/mach-k3/common.c
index 7f2a4e6260e..ea287ba1226 100644
--- a/arch/arm/mach-k3/common.c
+++ b/arch/arm/mach-k3/common.c
@@ -30,6 +30,7 @@
#include <soc.h>
#include <dm/uclass-internal.h>
#include <dm/device-internal.h>
+#include <asm/armv8/mmu.h>
#define PROC_BOOT_CTRL_FLAG_R5_CORE_HALT 0x00000001
#define PROC_BOOT_STATUS_FLAG_R5_WFI 0x00000002
@@ -261,6 +262,8 @@ void board_prep_linux(struct bootm_headers *images)
void enable_caches(void)
{
+ mmu_setup();
+
icache_enable();
dcache_enable();
}