diff options
author | Ahmad Fatoum <a.fatoum@pengutronix.de> | 2023-05-26 08:33:54 +0200 |
---|---|---|
committer | Sascha Hauer <s.hauer@pengutronix.de> | 2023-05-30 12:25:47 +0200 |
commit | 24bf58796ded4c5ba7097960042f6a1ed6b92436 (patch) | |
tree | 66fca4fab59619d2891c0b1a98ce579b9de1de3a | |
parent | b0ff5f14e7063c5e72222ce6dc6b6d9cfda2eba7 (diff) | |
download | barebox-24bf58796ded4c5ba7097960042f6a1ed6b92436.tar.gz barebox-24bf58796ded4c5ba7097960042f6a1ed6b92436.tar.xz |
ARM: mmu: invalidate when mapping range uncached
memtest can call remap_range to map regions being tested as uncached,
but remap_range did not take care to evict any stale cache lines.
Do this now.
This fixes an issue of SELFTEST_MMU failing on an i.MX8MN, when running
memtest on an uncached region that was previously memtested while being
cached.
Fixes: 3100ea146688 ("ARM: rework MMU support")
Fixes: 7cc98fbb6128 ("arm: cpu: add basic arm64 mmu support")
Signed-off-by: Ahmad Fatoum <a.fatoum@pengutronix.de>
Link: https://lore.barebox.org/20230526063354.1145474-4-a.fatoum@pengutronix.de
Signed-off-by: Sascha Hauer <s.hauer@pengutronix.de>
-rw-r--r-- | arch/arm/cpu/mmu_32.c | 4 | ||||
-rw-r--r-- | arch/arm/cpu/mmu_64.c | 4 |
2 files changed, 8 insertions, 0 deletions
diff --git a/arch/arm/cpu/mmu_32.c b/arch/arm/cpu/mmu_32.c index a324ebf71a..c4e5a3bb0a 100644 --- a/arch/arm/cpu/mmu_32.c +++ b/arch/arm/cpu/mmu_32.c @@ -327,6 +327,10 @@ static void early_remap_range(u32 addr, size_t size, unsigned map_type) int arch_remap_range(void *virt_addr, phys_addr_t phys_addr, size_t size, unsigned map_type) { __arch_remap_range(virt_addr, phys_addr, size, map_type); + + if (map_type == MAP_UNCACHED) + dma_inv_range(virt_addr, size); + return 0; } diff --git a/arch/arm/cpu/mmu_64.c b/arch/arm/cpu/mmu_64.c index 940e0e914c..63e7096322 100644 --- a/arch/arm/cpu/mmu_64.c +++ b/arch/arm/cpu/mmu_64.c @@ -191,6 +191,10 @@ int arch_remap_range(void *virt_addr, phys_addr_t phys_addr, size_t size, unsign return -EINVAL; create_sections((uint64_t)virt_addr, phys_addr, (uint64_t)size, attrs); + + if (flags == MAP_UNCACHED) + dma_inv_range(virt_addr, size); + return 0; } |