:: commit 8679e68efcf22529126f3ca41160dda5a06a17d2

Mintsuki <mintsuki@protonmail.com> — 2025-11-29 15:44

parents: b029c02441

lib/gterm: Add flush callback for riscv64

diff --git a/common/lib/gterm.c b/common/lib/gterm.c
index 38a4b5fe..7da62101 100644
--- a/common/lib/gterm.c
+++ b/common/lib/gterm.c
@@ -13,6 +13,7 @@
 #include <flanterm.h>
 #include <flanterm_backends/fb.h>
 #include <lib/term.h>
+#include <sys/cpu.h>
 
 // Builtin font originally taken from:
 // https://github.com/viler-int10h/vga-text-mode-fonts/raw/master/FONTS/PC-OTHER/TOSH-SAT.F16
@@ -458,6 +459,18 @@ static void generate_canvas(struct fb_info *fb) {
     }
 }
 
+#if defined (__riscv)
+__attribute__((target("arch=+zicbom")))
+static void riscv_flush_callback(volatile void *base, size_t length) {
+    const size_t cbom_block_size = 0x40;
+    uintptr_t start = ALIGN_DOWN((uintptr_t)base, cbom_block_size);
+    uintptr_t end = ALIGN_UP((uintptr_t)(base + length), cbom_block_size);
+    for (uintptr_t ptr = start; ptr < end; ptr += cbom_block_size) {
+        asm volatile("cbo.flush (%0)" :: "r"(ptr) : "memory");
+    }
+}
+#endif
+
 bool gterm_init(struct fb_info **_fbs, size_t *_fbs_count,
                 char *config, size_t width, size_t height) {
     static struct fb_info *fbs;
@@ -789,6 +802,11 @@ no_load_font:;
         term->rows = min_rows;
 
         flanterm_context_reinit(term);
+#if defined (__riscv)
+        if (riscv_check_isa_extension("zicbom", NULL, NULL)) {
+            flanterm_fb_set_flush_callback(term, riscv_flush_callback);
+        }
+#endif
     }
 
     term_backend = GTERM;
tab: 248 wrap: offon