summaryrefslogtreecommitdiff
path: root/arch/microblaze/cpu/cache.c
diff options
context:
space:
mode:
authorOvidiu Panait <ovpanait@gmail.com>2022-05-31 21:14:31 +0300
committerMichal Simek <michal.simek@amd.com>2022-06-24 14:16:00 +0200
commit95b7a8fd128aec8214d13b33131a4ea1fa4cc9a3 (patch)
treeb3686f51bf152049642c884e67f912e8d6a47f21 /arch/microblaze/cpu/cache.c
parentb195134984ec714f92632704e4725ced170ab1da (diff)
microblaze: cache: introduce cpuinfo structure
Introduce a minimal cpuinfo structure to hold cache related info. The instruction/data cache size and cache line size are initialized early in the boot to default Kconfig values. They will be overwritten with data from PVR/dtb if the microblaze UCLASS_CPU driver is enabled. The cpuinfo struct was placed in global_data to allow the microblaze UCLASS_CPU driver to also run before relocation (initialized global data should be read-only before relocation). gd_cpuinfo() helper macro was added to avoid volatile "-Wdiscarded-qualifiers" warnings when using the pointer directly. Signed-off-by: Ovidiu Panait <ovpanait@gmail.com> Link: https://lore.kernel.org/r/20220531181435.3473549-10-ovpanait@gmail.com Signed-off-by: Michal Simek <michal.simek@amd.com> (s/bralid/brlid/)
Diffstat (limited to 'arch/microblaze/cpu/cache.c')
-rw-r--r--arch/microblaze/cpu/cache.c14
1 files changed, 10 insertions, 4 deletions
diff --git a/arch/microblaze/cpu/cache.c b/arch/microblaze/cpu/cache.c
index b99b8c17066..cd8507901d4 100644
--- a/arch/microblaze/cpu/cache.c
+++ b/arch/microblaze/cpu/cache.c
@@ -9,11 +9,16 @@
#include <cpu_func.h>
#include <asm/asm.h>
#include <asm/cache.h>
+#include <asm/cpuinfo.h>
+#include <asm/global_data.h>
+
+DECLARE_GLOBAL_DATA_PTR;
static void __invalidate_icache(ulong addr, ulong size)
{
if (CONFIG_IS_ENABLED(XILINX_MICROBLAZE0_USE_WIC)) {
- for (int i = 0; i < size; i += 4) {
+ for (int i = 0; i < size;
+ i += gd_cpuinfo()->icache_line_length) {
asm volatile (
"wic %0, r0;"
"nop;"
@@ -26,13 +31,14 @@ static void __invalidate_icache(ulong addr, ulong size)
void invalidate_icache_all(void)
{
- __invalidate_icache(0, CONFIG_XILINX_MICROBLAZE0_ICACHE_SIZE);
+ __invalidate_icache(0, gd_cpuinfo()->icache_size);
}
static void __flush_dcache(ulong addr, ulong size)
{
if (CONFIG_IS_ENABLED(XILINX_MICROBLAZE0_USE_WDC)) {
- for (int i = 0; i < size; i += 4) {
+ for (int i = 0; i < size;
+ i += gd_cpuinfo()->dcache_line_length) {
asm volatile (
"wdc.flush %0, r0;"
"nop;"
@@ -45,7 +51,7 @@ static void __flush_dcache(ulong addr, ulong size)
void flush_dcache_all(void)
{
- __flush_dcache(0, CONFIG_XILINX_MICROBLAZE0_DCACHE_SIZE);
+ __flush_dcache(0, gd_cpuinfo()->dcache_size);
}
int dcache_status(void)