aboutsummaryrefslogtreecommitdiff
path: root/arch/riscv/lib/cache.c
diff options
context:
space:
mode:
authorTom Rini <trini@konsulko.com>2018-11-26 13:45:29 -0500
committerTom Rini <trini@konsulko.com>2018-11-26 15:52:39 -0500
commitef0b75d3d8afccebd3b9822de6bcae358d4bc0e3 (patch)
tree9a1e0c04a8a3ecd641f0e219991eaf6ce98eefed /arch/riscv/lib/cache.c
parent6b21502229035779059493b2193fd790448fe85e (diff)
parent52923c6db7f00e0197ec894c8c1bb8a7681974bb (diff)
Merge git://git.denx.de/u-boot-riscv
Diffstat (limited to 'arch/riscv/lib/cache.c')
-rw-r--r--arch/riscv/lib/cache.c36
1 files changed, 30 insertions, 6 deletions
diff --git a/arch/riscv/lib/cache.c b/arch/riscv/lib/cache.c
index 1d67c49c2c..ae5c60716f 100644
--- a/arch/riscv/lib/cache.c
+++ b/arch/riscv/lib/cache.c
@@ -6,44 +6,68 @@
#include <common.h>
+void invalidate_icache_all(void)
+{
+ asm volatile ("fence.i" ::: "memory");
+}
+
+void flush_dcache_all(void)
+{
+ asm volatile ("fence" :::"memory");
+}
void flush_dcache_range(unsigned long start, unsigned long end)
{
+ flush_dcache_all();
}
void invalidate_icache_range(unsigned long start, unsigned long end)
{
+ /*
+ * RISC-V does not have an instruction for invalidating parts of the
+ * instruction cache. Invalidate all of it instead.
+ */
+ invalidate_icache_all();
}
void invalidate_dcache_range(unsigned long start, unsigned long end)
{
+ flush_dcache_all();
+}
+
+void cache_flush(void)
+{
+ invalidate_icache_all();
+ flush_dcache_all();
}
void flush_cache(unsigned long addr, unsigned long size)
{
+ invalidate_icache_all();
+ flush_dcache_all();
}
-void icache_enable(void)
+__weak void icache_enable(void)
{
}
-void icache_disable(void)
+__weak void icache_disable(void)
{
}
-int icache_status(void)
+__weak int icache_status(void)
{
return 0;
}
-void dcache_enable(void)
+__weak void dcache_enable(void)
{
}
-void dcache_disable(void)
+__weak void dcache_disable(void)
{
}
-int dcache_status(void)
+__weak int dcache_status(void)
{
return 0;
}