summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAhmad Fatoum <a.fatoum@pengutronix.de>2023-05-26 08:33:54 +0200
committerSascha Hauer <s.hauer@pengutronix.de>2023-05-30 12:25:47 +0200
commit24bf58796ded4c5ba7097960042f6a1ed6b92436 (patch)
tree66fca4fab59619d2891c0b1a98ce579b9de1de3a
parentb0ff5f14e7063c5e72222ce6dc6b6d9cfda2eba7 (diff)
downloadbarebox-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.c4
-rw-r--r--arch/arm/cpu/mmu_64.c4
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;
}