riscv: Implements read-evicted cache refresh for non-Zicbom SoCs.
Signed-off-by: MicroFish <2609948707@qq.com>
diff --git a/common/lib/gterm.c b/common/lib/gterm.c
index d18a0d85..7a76d61c 100644
--- a/common/lib/gterm.c
+++ b/common/lib/gterm.c
@@ -477,6 +477,13 @@ static void riscv_flush_callback(volatile void *base, size_t length) {
asm volatile("cbo.flush (%0)" :: "r"(ptr) : "memory");
}
}
+static void riscv_flush_callback_nozicbom(volatile void *base, size_t length) {
+ volatile uint64_t *p = (volatile uint64_t *)base;
+ for (size_t i = 0; i < (length * 2) / sizeof(uint64_t); i += (64 / sizeof(uint64_t))) {
+ (void)p[i];
+ }
+ asm volatile ("fence r, r" ::: "memory");
+}
#elif defined (__aarch64__)
static void aarch64_flush_callback(volatile void *base, size_t length) {
clean_dcache_poc((uintptr_t)base, (uintptr_t)base + length);
@@ -847,6 +854,8 @@ no_load_font:;
#if defined (__riscv)
if (riscv_check_isa_extension("zicbom", NULL, NULL)) {
flanterm_fb_set_flush_callback(term, riscv_flush_callback);
+ } else {
+ flanterm_fb_set_flush_callback(term, riscv_flush_callback_nozicbom);
}
#elif defined (__aarch64__)
flanterm_fb_set_flush_callback(term, aarch64_flush_callback);
