[PATCH] platform: support starriver 9530

362800175 362800175 at qq.com
Tue Feb 24 06:03:47 PST 2026


From f93376ac9420836b1c23e885c2dafa30da96aeb3 Mon Sep 17 00:00:00 2001
From: nwumengfei <362800175 at qq.com>
Date: Tue, 24 Feb 2026 21:34:09 +0800
Subject: [PATCH] platform: support starriver 9530

---
 lib/utils/serial/Kconfig                   |   3 +
 lib/utils/serial/objects.mk                |   1 +
 lib/utils/serial/starriver_uart.c          |  55 ++++++++
 platform/generic/Kconfig                   |   4 +
 platform/generic/configs/defconfig         |   1 +
 platform/generic/starriver/9530/9530.c     | 141 +++++++++++++++++++++
 platform/generic/starriver/9530/objects.mk |   3 +
 7 files changed, 208 insertions(+)
 create mode 100755 lib/utils/serial/starriver_uart.c
 create mode 100755 platform/generic/starriver/9530/9530.c
 create mode 100755 platform/generic/starriver/9530/objects.mk

diff --git a/lib/utils/serial/Kconfig b/lib/utils/serial/Kconfig
index 21619d0d..75334425 100644
--- a/lib/utils/serial/Kconfig
+++ b/lib/utils/serial/Kconfig
@@ -101,4 +101,7 @@ config SERIAL_SEMIHOSTING
 	bool "Semihosting support"
 	default n
 
+config SERIAL_STARRIVER
+	bool "Starriver support"
+	default y
 endmenu
diff --git a/lib/utils/serial/objects.mk b/lib/utils/serial/objects.mk
index 94cf3a4b..24b57133 100644
--- a/lib/utils/serial/objects.mk
+++ b/lib/utils/serial/objects.mk
@@ -50,3 +50,4 @@ libsbiutils-objs-$(CONFIG_SERIAL_LITEX) += serial/litex-uart.o
 libsbiutils-objs-$(CONFIG_SERIAL_UART8250) += serial/uart8250.o
 libsbiutils-objs-$(CONFIG_SERIAL_XILINX_UARTLITE) += serial/xlnx-uartlite.o
 libsbiutils-objs-$(CONFIG_SERIAL_SEMIHOSTING) += serial/semihosting.o
+libsbiutils-objs-$(CONFIG_SERIAL_STARRIVER) += serial/starriver_uart.o
diff --git a/lib/utils/serial/starriver_uart.c b/lib/utils/serial/starriver_uart.c
new file mode 100755
index 00000000..47247a93
--- /dev/null
+++ b/lib/utils/serial/starriver_uart.c
@@ -0,0 +1,55 @@
+/*
+ * SPDX-License-Identifier: BSD-2-Clause
+ *
+ * Authors:
+ *   362800175 <362800175 at qq.com>
+ *
+ */
+ 
+#include <sbi/riscv_io.h>
+#include <sbi/sbi_types.h>
+#include <sbi/sbi_console.h>
+
+#define UART0_BASE              0x9000000UL
+#define PADDR_UARTCR            (UART0_BASE + 0x030)
+#define PADDR_UARTDR            (UART0_BASE + 0x000)
+#define PADDR_UARTSR            (UART0_BASE + 0x4)
+#define PADDR_UARTFR            (UART0_BASE + 0x18)
+#define UART0                   PADDR_UARTDR
+#define STAR_UART_TXFIFO_FULL   (1<<3)
+
+void starriver_uart_putc(char c)
+{
+    volatile uint64_t *dr_addr = (volatile uint64_t *)PADDR_UARTDR;
+    volatile uint64_t *fr_addr = (volatile uint64_t *)PADDR_UARTFR;
+
+    while(*(fr_addr) & STAR_UART_TXFIFO_FULL);
+
+    *dr_addr = c & 0xff;
+}
+
+unsigned long starriver_uart_puts(const char *str, unsigned long len)
+{
+    unsigned long i;
+    for (i = 0; i < len; i++) {
+        if (str[i] == '\n')
+            starriver_uart_putc('\r');
+        starriver_uart_putc(str[i]);
+    }
+
+    return len;
+}
+
+
+struct sbi_console_device starriver_console = {
+    .name = "starriver_uart",
+    .console_putc = starriver_uart_putc,
+    .console_puts = starriver_uart_puts,
+};
+
+int starriver_uart_init(void)
+{
+    sbi_console_set_device(&starriver_console);
+
+    return 0;
+}
diff --git a/platform/generic/Kconfig b/platform/generic/Kconfig
index 0c11fbd2..4a783bff 100644
--- a/platform/generic/Kconfig
+++ b/platform/generic/Kconfig
@@ -99,6 +99,10 @@ config PLATFORM_SPACEMIT_K1
 	bool "Spacemit K1 support"
 	select FDT_HSM_SPACEMIT
 	default n
+    
+config PLATFORM_STARRIVER_9530
+	bool "StarRiver 9530 support"
+	default n
 
 source "$(OPENSBI_SRC_DIR)/platform/generic/andes/Kconfig"
 source "$(OPENSBI_SRC_DIR)/platform/generic/eswin/Kconfig"
diff --git a/platform/generic/configs/defconfig b/platform/generic/configs/defconfig
index 727c5f4a..b531b73e 100644
--- a/platform/generic/configs/defconfig
+++ b/platform/generic/configs/defconfig
@@ -12,6 +12,7 @@ CONFIG_PLATFORM_STARFIVE_JH7110=y
 CONFIG_PLATFORM_THEAD=y
 CONFIG_PLATFORM_MIPS_P8700=y
 CONFIG_PLATFORM_SPACEMIT_K1=y
+CONFIG_PLATFORM_STARRIVER_9530=y
 CONFIG_FDT_CACHE=y
 CONFIG_FDT_CACHE_ANDES_LLCACHE=y
 CONFIG_FDT_CACHE_SIFIVE_CCACHE=y
diff --git a/platform/generic/starriver/9530/9530.c b/platform/generic/starriver/9530/9530.c
new file mode 100755
index 00000000..37705692
--- /dev/null
+++ b/platform/generic/starriver/9530/9530.c
@@ -0,0 +1,141 @@
+/*
+ * SPDX-License-Identifier: BSD-2-Clause
+ *
+ * Authors:
+ *   362800175 <362800175 at qq.com>
+ *
+ */
+#include <platform_override.h>
+#include <sbi/riscv_io.h>
+#include <sbi/sbi_console.h>
+
+#include <sbi_utils/irqchip/plic.h>
+#include <sbi_utils/timer/aclint_mtimer.h>
+
+#define STARRIVER_HART_COUNT            2
+#define STARRIVER_TIMER_FREQ            375000
+#define STARRIVER_TIMER_ADDR            0x2000000
+
+#define STARRIVER_ACLINT_MSWI_ADDR      (STARRIVER_TIMER_ADDR + CLINT_MSWI_OFFSET)
+#define STARRIVER_ACLINT_MTIMER_ADDR    (STARRIVER_TIMER_ADDR + 0xbff8)
+#define STARRIVER_ACLINT_MTIMECMP_ADDR  (STARRIVER_TIMER_ADDR + 0x4000)
+
+#define STARRIVER_PLIC_ADDR             0xc000000
+#define STARRIVER_PLIC_SIZE             0x10000000
+
+#define STARRIVER_PLIC_NUM_SOURCES      0x35
+#define STARRIVER_PLIC_NUM_PRIORITIES   7
+
+#define STARRIVER_MTIMECMP_SIZE         0xbff8
+#define STARRIVER_MTIME_SIZE            0x8
+
+#define UART0_BASE                      (0x09000000UL) /*!< (UART0) Base Address */
+#define PADDR_UARTCR                    (UART0_BASE + 0x030)
+#define PADDR_UARTDR                    (UART0_BASE + 0x000)
+#define SOC_DEBUG_UART                  PADDR_UARTDR
+#define PADDR_UARTIBRD                  (UART0_BASE + 0x024)
+#define PADDR_UARTFBRD                  (UART0_BASE + 0x028)
+#define PADDR_UUARTLCR_H                (UART0_BASE + 0x02c)
+
+#define STARRIVER_TIMER_VALUE()         readl((void *)STARRIVER_ACLINT_MTIMER_ADDR)
+
+static struct plic_data plic = {
+    .addr = STARRIVER_PLIC_ADDR,
+    .size = STARRIVER_PLIC_SIZE,
+    .num_src = STARRIVER_PLIC_NUM_SOURCES,
+};
+
+static struct aclint_mtimer_data mtimer = {
+    .mtime_freq = STARRIVER_TIMER_FREQ,
+    .mtime_addr = STARRIVER_ACLINT_MTIMER_ADDR,
+    .mtime_size = STARRIVER_MTIME_SIZE,
+    .mtimecmp_addr = STARRIVER_ACLINT_MTIMECMP_ADDR,
+    .mtimecmp_size = STARRIVER_MTIMECMP_SIZE,
+    .first_hartid = 0,
+    .hart_count = STARRIVER_HART_COUNT,
+    .has_64bit_mmio = true,
+};
+
+static u32 measure_cpu_freq(u32 n)
+{
+    u32 start_mtime, delta_mtime;
+    u32 mtime_freq = STARRIVER_TIMER_FREQ;
+    u32 tmp = (u32)STARRIVER_TIMER_VALUE();
+    u32 start_mcycle, delta_mcycle, freq;
+    /* Don't start measuring until we see an mtime tick */
+    do {
+        start_mtime = (u32)STARRIVER_TIMER_VALUE();
+    } while (start_mtime == tmp);
+    start_mcycle = csr_read(mcycle);
+    do {
+        delta_mtime = (u32)STARRIVER_TIMER_VALUE() - start_mtime;
+    } while (delta_mtime < n);
+
+    delta_mcycle = csr_read(mcycle) - start_mcycle;
+
+    freq = (delta_mcycle / delta_mtime) * mtime_freq
+        + ((delta_mcycle % delta_mtime) * mtime_freq) / delta_mtime;
+
+    sbi_printf("%s: delta_mcycle = %u delta_mtime = %u mtime_freq = %u freq = %u\n",
+        __func__, delta_mcycle, delta_mtime, mtime_freq, freq);
+
+    return freq;
+}
+
+extern int starriver_uart_init(void);
+
+static int starriver_console_init(void)
+{
+    return starriver_uart_init();
+}
+
+static int starriver_irqchip_init(bool cold_boot)
+{
+    int rc = 0;
+
+    if (cold_boot) {
+        rc = plic_cold_irqchip_init(&plic);
+    }
+
+    return rc;
+}
+
+static int starriver_timer_init(bool cold_boot)
+{
+    int rc = 0;
+
+    if (cold_boot) {
+        measure_cpu_freq(100);
+        rc = aclint_mtimer_cold_init(&mtimer, NULL);
+    }
+
+    return rc;
+}
+
+static int starriver_early_init(bool cold_boot)
+{
+    starriver_console_init();
+    
+    starriver_irqchip_init(cold_boot);
+    
+    starriver_timer_init(cold_boot);
+
+    return 0;
+}
+
+static int starriver_9530_platform_init(const void *fdt, int nodeoff, const struct fdt_match *match)
+{
+    generic_platform_ops.final_init = starriver_early_init;
+
+    return 0;
+}
+
+static const struct fdt_match starriver_9530_match[] = {
+	{ .compatible = "starriver,9530" },
+	{ },
+};
+
+const struct fdt_driver starriver_9530 = {
+	.match_table = starriver_9530_match,
+	.init = starriver_9530_platform_init,
+};
\ No newline at end of file
diff --git a/platform/generic/starriver/9530/objects.mk b/platform/generic/starriver/9530/objects.mk
new file mode 100755
index 00000000..b88af7cd
--- /dev/null
+++ b/platform/generic/starriver/9530/objects.mk
@@ -0,0 +1,3 @@
+carray-platform_override_modules-$(CONFIG_PLATFORM_STARRIVER_9530) += starriver_9530
+
+platform-objs-$(CONFIG_PLATFORM_STARRIVER_9530) += starriver/9530/9530.o
-- 
2.34.1



More information about the opensbi mailing list