ARM: tegra: flush caches via SMC call
On Tegra186, it is necessary to perform an SMC to fully flush all caches; flushing/cleaning by set/way is not enough. Implement the required hook to make this happen. Signed-off-by: Stephen Warren <swarren@nvidia.com> Reviewed-by: Simon Glass <sjg@chromium.org> Signed-off-by: Tom Warren <twarren@nvidia.com>
This commit is contained in:
parent
6dca554f23
commit
8e5d804f89
@ -3,5 +3,6 @@
|
||||
# SPDX-License-Identifier: GPL-2.0
|
||||
|
||||
obj-y += ../board186.o
|
||||
obj-y += cache.o
|
||||
obj-y += nvtboot_ll.o
|
||||
obj-y += nvtboot_mem.o
|
||||
|
23
arch/arm/mach-tegra/tegra186/cache.c
Normal file
23
arch/arm/mach-tegra/tegra186/cache.c
Normal file
@ -0,0 +1,23 @@
|
||||
/*
|
||||
* Copyright (c) 2016, NVIDIA CORPORATION.
|
||||
*
|
||||
* SPDX-License-Identifier: GPL-2.0
|
||||
*/
|
||||
|
||||
#include <common.h>
|
||||
#include <asm/system.h>
|
||||
|
||||
#define SMC_SIP_INVOKE_MCE 0x82FFFF00
|
||||
#define MCE_SMC_ROC_FLUSH_CACHE 11
|
||||
|
||||
int __asm_flush_l3_cache(void)
|
||||
{
|
||||
struct pt_regs regs = {0};
|
||||
|
||||
isb();
|
||||
|
||||
regs.regs[0] = SMC_SIP_INVOKE_MCE | MCE_SMC_ROC_FLUSH_CACHE;
|
||||
smc_call(®s);
|
||||
|
||||
return 0;
|
||||
}
|
Loading…
Reference in New Issue
Block a user