[PATCH] platform: support starriver 9530

Bo Gan ganboing at gmail.com
Tue Feb 24 22:20:17 PST 2026


Starriver is not a company name. Please use your company name as the
name of the directory within platform/generic/..., just like others.

Again, what's your real name? It feels like you're intentionally hiding
your name and the company's name, and it's hard for people to treat it
seriously. Please fix that and CC folks from the <company>, so nobody's
kept in the dark.

I noticed your mail was not delivered to the mailing list, presumably
because it's not in plain text mode.

Bo

On 2/24/26 18:18, 362800175 wrote:
> Thank you for your review. Starriver is a chip platform developed by our company; its official name cannot be disclosed at the moment. 9530 is the chip model. Regarding the FDT configuration issue, please allow me to reorganize it first. Thank you very much.
> 
> ---Original---
> *From:* "Bo Gan"<ganboing at gmail.com>
> *Date:* Wed, Feb 25, 2026 07:09 AM
> *To:* "362800175"<362800175 at qq.com>;"opensbi"<opensbi at lists.infradead.org>;
> *Subject:* Re: [PATCH] platform: support starriver 9530
> 
> Hi,
> 
> Please state your real name and have proper signed-off-by.
> 
> What's starriver? A SoC vendor? Can't find anything online. Also, from
> your code I think the platform init logic is not necessary. Why not get
> rid of those hard-coded values and use device-tree instead?
> 
> Bo
> 
> 
> On 2/24/26 06:03, 362800175 wrote:
>  >  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
> 
> 
> -- 
> opensbi mailing list
> opensbi at lists.infradead.org
> http://lists.infradead.org/mailman/listinfo/opensbi




More information about the opensbi mailing list