:: commit 1023de329ae5142cde7c058ca963ae858266bde2

MicroFish <2609948707@qq.com> — 2026-02-02 12:25

parents: bfb0280bcc

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);
tab: 248 wrap: offon