[PATCH] arm: mach-k3: Clean non-coherent lines out of L3 cache
Lokesh Vutla
lokeshvutla at ti.com
Tue Aug 11 12:35:45 CEST 2020
On 16/07/20 2:32 am, Andrew F. Davis wrote:
> 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 at ti.com>
> Tested-by: Faiz Abbas <faiz_abbas at ti.com>
Applied to u-boot-ti
Thanks and regards,
Lokesh
> ---
> arch/arm/mach-k3/Makefile | 1 +
> arch/arm/mach-k3/cache.S | 24 ++++++++++++++++++++++++
> 2 files changed, 25 insertions(+)
> create mode 100644 arch/arm/mach-k3/cache.S
>
> diff --git a/arch/arm/mach-k3/Makefile b/arch/arm/mach-k3/Makefile
> index 028015ed66..7572f56925 100644
> --- a/arch/arm/mach-k3/Makefile
> +++ b/arch/arm/mach-k3/Makefile
> @@ -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
> diff --git a/arch/arm/mach-k3/cache.S b/arch/arm/mach-k3/cache.S
> new file mode 100644
> index 0000000000..a5717ea203
> --- /dev/null
> +++ b/arch/arm/mach-k3/cache.S
> @@ -0,0 +1,24 @@
> +/* SPDX-License-Identifier: GPL-2.0 */
> +/*
> + * Copyright (C) 2020 Texas Instruments Incorporated - http://www.ti.com/
> + * Andrew F. Davis <afd at 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
>
More information about the U-Boot
mailing list