summaryrefslogtreecommitdiffstats
path: root/arch/arm/cpu
diff options
context:
space:
mode:
authorSascha Hauer <s.hauer@pengutronix.de>2023-05-11 13:09:13 +0200
committerSascha Hauer <s.hauer@pengutronix.de>2023-05-22 12:38:17 +0200
commit6dba5339fddde7cb6825f0dae648ca20e6d40d18 (patch)
treefa3001e6d3f622d819d325a48c407379b65599cc /arch/arm/cpu
parentd7e6afbc836dd45745e8dd0b3524d8639f33a8a2 (diff)
downloadbarebox-6dba5339fddde7cb6825f0dae648ca20e6d40d18.tar.gz
barebox-6dba5339fddde7cb6825f0dae648ca20e6d40d18.tar.xz
ARM: mmu32: Skip reserved ranges during initialization
The early MMU code now uses pages to map the OP-TEE area non executable. This mapping is overwritten with sections in barebox proper. Refrain from doing so by using arch_remap_range() and bypassing reserved areas. Signed-off-by: Sascha Hauer <s.hauer@pengutronix.de>
Diffstat (limited to 'arch/arm/cpu')
-rw-r--r--arch/arm/cpu/mmu_32.c21
1 files changed, 18 insertions, 3 deletions
diff --git a/arch/arm/cpu/mmu_32.c b/arch/arm/cpu/mmu_32.c
index cc5c92d716..057458bf9a 100644
--- a/arch/arm/cpu/mmu_32.c
+++ b/arch/arm/cpu/mmu_32.c
@@ -519,10 +519,25 @@ void __mmu_init(bool mmu_on)
vectors_init();
+ /*
+ * Early mmu init will have mapped everything but the initial memory area
+ * (excluding final OPTEE_SIZE bytes) uncached. We have now discovered
+ * all memory banks, so let's map all pages, excluding reserved memory areas,
+ * cacheable and executable.
+ */
for_each_memory_bank(bank) {
- create_sections(bank->start, bank->start + bank->size - 1,
- PMD_SECT_DEF_CACHED);
- __mmu_cache_flush();
+ struct resource *rsv;
+ resource_size_t pos;
+
+ pos = bank->start;
+
+ for_each_reserved_region(bank, rsv) {
+ arch_remap_range((void *)rsv->start, resource_size(rsv), MAP_UNCACHED);
+ arch_remap_range((void *)pos, rsv->start - pos, MAP_CACHED);
+ pos = rsv->end + 1;
+ }
+
+ arch_remap_range((void *)pos, bank->start + bank->size - pos, MAP_CACHED);
}
}