arm: mach-k3: Clean non-coherent lines out of L3 cache
When switching on or off the ARM caches some care must be taken to ensure existing cache line allocations are not left in an inconsistent state. An example of this is when cache lines are considered non-shared by and L3 controller even though the lines are shared. To prevent these and other issues all cache lines should be cleared before enabling or disabling a coherent master's cache. ARM cores and many L3 controllers provide a way to efficiently clean out all cache lines to allow for this, unfortunately there is no such easy way to do this on current K3 MSMC based systems. We could explicitly clean out every valid external address tracked by MSMC (all of DRAM), or we could attempt to identify only the set of addresses accessed by a given boot stage and flush only those specifically. This patch attempts the latter. We start with cleaning the SPL load address. More addresses can be added here later as they are identified. Note that we perform a flush operation for both the flush and invalidate operations, this is not a typo. We do this to avoid the situation that some ARM cores will promote an invalidate to a clean+invalidate, but only emit the invalidation operation externally, leading to a loss of data. Signed-off-by: Andrew F. Davis <afd@ti.com> Tested-by: Faiz Abbas <faiz_abbas@ti.com>
This commit is contained in:
parent
e1c3668594
commit
864e285739
2 changed files with 25 additions and 0 deletions
|
@ -8,6 +8,7 @@ obj-$(CONFIG_SOC_K3_J721E) += j721e_init.o
|
|||
obj-$(CONFIG_ARM64) += arm64-mmu.o
|
||||
obj-$(CONFIG_CPU_V7R) += r5_mpu.o lowlevel_init.o
|
||||
obj-$(CONFIG_TI_SECURE_DEVICE) += security.o
|
||||
obj-$(CONFIG_ARM64) += cache.o
|
||||
ifeq ($(CONFIG_SPL_BUILD),y)
|
||||
obj-$(CONFIG_K3_LOAD_SYSFW) += sysfw-loader.o
|
||||
endif
|
||||
|
|
24
arch/arm/mach-k3/cache.S
Normal file
24
arch/arm/mach-k3/cache.S
Normal file
|
@ -0,0 +1,24 @@
|
|||
/* SPDX-License-Identifier: GPL-2.0 */
|
||||
/*
|
||||
* Copyright (C) 2020 Texas Instruments Incorporated - http://www.ti.com/
|
||||
* Andrew F. Davis <afd@ti.com>
|
||||
*/
|
||||
|
||||
#include <config.h>
|
||||
#include <linux/linkage.h>
|
||||
|
||||
#if defined(CONFIG_SPL_BUILD)
|
||||
ENTRY(__asm_invalidate_l3_dcache)
|
||||
/* Invalidate SPL address range */
|
||||
mov x0, #CONFIG_SPL_TEXT_BASE
|
||||
add x1, x0, #CONFIG_SPL_MAX_SIZE
|
||||
b __asm_flush_dcache_range
|
||||
ENDPROC(__asm_invalidate_l3_dcache)
|
||||
|
||||
ENTRY(__asm_flush_l3_dcache)
|
||||
/* Flush SPL address range */
|
||||
mov x0, #CONFIG_SPL_TEXT_BASE
|
||||
add x1, x0, #CONFIG_SPL_MAX_SIZE
|
||||
b __asm_flush_dcache_range
|
||||
ENDPROC(__asm_flush_l3_dcache)
|
||||
#endif
|
Loading…
Reference in a new issue