diff --git a/arch/arm/cpu/cache.c b/arch/arm/cpu/cache.c index 95c8338..7aab55b 100644 --- a/arch/arm/cpu/cache.c +++ b/arch/arm/cpu/cache.c @@ -134,3 +134,24 @@ #endif } } + +void v7_mmu_cache_invalidate(void); + +void arm_early_mmu_cache_invalidate(void) +{ + switch (arm_early_get_cpu_architecture()) { + case CPU_ARCH_ARMv4T: + case CPU_ARCH_ARMv5: + case CPU_ARCH_ARMv5T: + case CPU_ARCH_ARMv5TE: + case CPU_ARCH_ARMv5TEJ: + case CPU_ARCH_ARMv6: + asm volatile("mcr p15, 0, %0, c7, c6, 0\n" : : "r"(0)); + return; +#ifdef CONFIG_CPU_32v7 + case CPU_ARCH_ARMv7: + v7_mmu_cache_invalidate(); + return; +#endif + } +} diff --git a/arch/arm/cpu/start-pbl.c b/arch/arm/cpu/start-pbl.c index 6f03c4a..3ef0118 100644 --- a/arch/arm/cpu/start-pbl.c +++ b/arch/arm/cpu/start-pbl.c @@ -59,6 +59,8 @@ endmem -= STACK_SIZE; /* stack */ + arm_early_mmu_cache_invalidate(); + if (IS_ENABLED(CONFIG_PBL_RELOCATABLE)) relocate_to_current_adr(); diff --git a/arch/arm/cpu/start.c b/arch/arm/cpu/start.c index 580c1fe..5a3c629 100644 --- a/arch/arm/cpu/start.c +++ b/arch/arm/cpu/start.c @@ -124,6 +124,8 @@ { arm_setup_stack(membase + memsize - 16); + arm_early_mmu_cache_invalidate(); + __start(membase, memsize, boarddata); } #else diff --git a/arch/arm/include/asm/cache.h b/arch/arm/include/asm/cache.h index e5621eb..f5f8bf3 100644 --- a/arch/arm/include/asm/cache.h +++ b/arch/arm/include/asm/cache.h @@ -10,10 +10,15 @@ #ifdef CONFIG_MMU void arm_early_mmu_cache_flush(void); +void arm_early_mmu_cache_invalidate(void); #else static inline void arm_early_mmu_cache_flush(void) { } + +static inline void arm_early_mmu_cache_invalidate(void) +{ +} #endif #endif