lib: sbi: Simplify console platform operations
authorAnup Patel <anup.patel@wdc.com>
Wed, 21 Apr 2021 12:33:50 +0000 (18:03 +0530)
committerAnup Patel <anup@brainfault.org>
Wed, 28 Apr 2021 11:28:23 +0000 (16:58 +0530)
Instead of having console_putc() and console_getc() callbacks in
platform operations, it will be much simpler for console driver to
directly register these operations as device to the sbi_console
implementation.

Signed-off-by: Anup Patel <anup.patel@wdc.com>
Reviewed-by: Alistair Francis <alistair.francis@wdc.com>
Reviewed-by: Xiang W <wxjstz@126.com>
25 files changed:
include/sbi/sbi_console.h
include/sbi/sbi_platform.h
include/sbi_utils/serial/fdt_serial.h
include/sbi_utils/serial/shakti-uart.h
include/sbi_utils/serial/sifive-uart.h
include/sbi_utils/serial/uart8250.h
include/sbi_utils/sys/htif.h
lib/sbi/sbi_console.c
lib/utils/serial/fdt_serial.c
lib/utils/serial/fdt_serial_htif.c
lib/utils/serial/fdt_serial_shakti.c
lib/utils/serial/fdt_serial_sifive.c
lib/utils/serial/fdt_serial_uart8250.c
lib/utils/serial/shakti-uart.c
lib/utils/serial/sifive-uart.c
lib/utils/serial/uart8250.c
lib/utils/sys/htif.c
platform/andes/ae350/platform.c
platform/fpga/ariane/platform.c
platform/fpga/openpiton/platform.c
platform/generic/platform.c
platform/kendryte/k210/platform.c
platform/nuclei/ux600/platform.c
platform/sifive/fu540/platform.c
platform/template/platform.c

index 7d648f0..e24ba5f 100644 (file)
 
 #include <sbi/sbi_types.h>
 
+struct sbi_console_device {
+       /** Name of the console device */
+       char name[32];
+
+       /** Write a character to the console output */
+       void (*console_putc)(char ch);
+
+       /** Read a character from the console input */
+       int (*console_getc)(void);
+};
+
 #define __printf(a, b) __attribute__((format(printf, a, b)))
 
 bool sbi_isprintable(char ch);
@@ -32,6 +43,10 @@ int __printf(1, 2) sbi_printf(const char *format, ...);
 
 int __printf(1, 2) sbi_dprintf(const char *format, ...);
 
+const struct sbi_console_device *sbi_console_get_device(void);
+
+void sbi_console_set_device(const struct sbi_console_device *dev);
+
 struct sbi_scratch;
 
 int sbi_console_init(struct sbi_scratch *scratch);
index 6736169..0d18ef2 100644 (file)
@@ -95,10 +95,6 @@ struct sbi_platform_operations {
        /** Initialize (or populate) domains for the platform */
        int (*domains_init)(void);
 
-       /** Write a character to the platform console output */
-       void (*console_putc)(char ch);
-       /** Read a character from the platform console input */
-       int (*console_getc)(void);
        /** Initialize the platform console */
        int (*console_init)(void);
 
@@ -497,33 +493,6 @@ static inline int sbi_platform_domains_init(const struct sbi_platform *plat)
 }
 
 /**
- * Write a character to the platform console output
- *
- * @param plat pointer to struct sbi_platform
- * @param ch character to write
- */
-static inline void sbi_platform_console_putc(const struct sbi_platform *plat,
-                                               char ch)
-{
-       if (plat && sbi_platform_ops(plat)->console_putc)
-               sbi_platform_ops(plat)->console_putc(ch);
-}
-
-/**
- * Read a character from the platform console input
- *
- * @param plat pointer to struct sbi_platform
- *
- * @return character read from console input
- */
-static inline int sbi_platform_console_getc(const struct sbi_platform *plat)
-{
-       if (plat && sbi_platform_ops(plat)->console_getc)
-               return sbi_platform_ops(plat)->console_getc();
-       return -1;
-}
-
-/**
  * Initialize the platform console
  *
  * @param plat pointer to struct sbi_platform
index 08f9799..6451c23 100644 (file)
 struct fdt_serial {
        const struct fdt_match *match_table;
        int (*init)(void *fdt, int nodeoff, const struct fdt_match *match);
-       void (*putc)(char ch);
-       int (*getc)(void);
 };
 
-void fdt_serial_putc(char ch);
-
-int fdt_serial_getc(void);
-
 int fdt_serial_init(void);
 
 #endif
index 08043be..bcb019e 100644 (file)
@@ -9,10 +9,6 @@
 
 #include <sbi/sbi_types.h>
 
-void shakti_uart_putc(char ch);
-
-int shakti_uart_getc(void);
-
 int shakti_uart_init(unsigned long base, u32 in_freq, u32 baudrate);
 
 #endif
index f323392..9c465ec 100644 (file)
 
 #include <sbi/sbi_types.h>
 
-void sifive_uart_putc(char ch);
-
-int sifive_uart_getc(void);
-
 int sifive_uart_init(unsigned long base, u32 in_freq, u32 baudrate);
 
 #endif
index 0a1b5d3..6b9b48b 100644 (file)
 
 #include <sbi/sbi_types.h>
 
-void uart8250_putc(char ch);
-
-int uart8250_getc(void);
-
 int uart8250_init(unsigned long base, u32 in_freq, u32 baudrate, u32 reg_shift,
                  u32 reg_width);
 
index a431723..8073a44 100644 (file)
@@ -10,9 +10,7 @@
 
 #include <sbi/sbi_types.h>
 
-void htif_putc(char ch);
-
-int htif_getc(void);
+int htif_serial_init(void);
 
 int htif_system_reset_check(u32 type, u32 reason);
 
index 7189b9b..b54f7a2 100644 (file)
@@ -12,7 +12,7 @@
 #include <sbi/sbi_platform.h>
 #include <sbi/sbi_scratch.h>
 
-static const struct sbi_platform *console_plat = NULL;
+static const struct sbi_console_device *console_dev = NULL;
 static spinlock_t console_out_lock            = SPIN_LOCK_INITIALIZER;
 
 bool sbi_isprintable(char c)
@@ -26,14 +26,18 @@ bool sbi_isprintable(char c)
 
 int sbi_getc(void)
 {
-       return sbi_platform_console_getc(console_plat);
+       if (console_dev && console_dev->console_getc)
+               return console_dev->console_getc();
+       return -1;
 }
 
 void sbi_putc(char ch)
 {
-       if (ch == '\n')
-               sbi_platform_console_putc(console_plat, '\r');
-       sbi_platform_console_putc(console_plat, ch);
+       if (console_dev && console_dev->console_putc) {
+               if (ch == '\n')
+                       console_dev->console_putc('\r');
+               console_dev->console_putc(ch);
+       }
 }
 
 void sbi_puts(const char *str)
@@ -390,9 +394,20 @@ int sbi_dprintf(const char *format, ...)
        return retval;
 }
 
-int sbi_console_init(struct sbi_scratch *scratch)
+const struct sbi_console_device *sbi_console_get_device(void)
+{
+       return console_dev;
+}
+
+void sbi_console_set_device(const struct sbi_console_device *dev)
 {
-       console_plat = sbi_platform_ptr(scratch);
+       if (!dev || console_dev)
+               return;
 
-       return sbi_platform_console_init(console_plat);
+       console_dev = dev;
+}
+
+int sbi_console_init(struct sbi_scratch *scratch)
+{
+       return sbi_platform_console_init(sbi_platform_ptr(scratch));
 }
index b9ce67e..43c55e8 100644 (file)
@@ -24,34 +24,13 @@ static struct fdt_serial *serial_drivers[] = {
        &fdt_serial_shakti,
 };
 
-static void dummy_putc(char ch)
-{
-}
-
-static int dummy_getc(void)
-{
-       return -1;
-}
-
 static struct fdt_serial dummy = {
        .match_table = NULL,
        .init = NULL,
-       .putc = dummy_putc,
-       .getc = dummy_getc,
 };
 
 static struct fdt_serial *current_driver = &dummy;
 
-void fdt_serial_putc(char ch)
-{
-       current_driver->putc(ch);
-}
-
-int fdt_serial_getc(void)
-{
-       return current_driver->getc();
-}
-
 int fdt_serial_init(void)
 {
        const void *prop;
index 32d6953..fae55b8 100644 (file)
@@ -16,9 +16,13 @@ static const struct fdt_match serial_htif_match[] = {
        { },
 };
 
+static int serial_htif_init(void *fdt, int nodeoff,
+                           const struct fdt_match *match)
+{
+       return htif_serial_init();
+}
+
 struct fdt_serial fdt_serial_htif = {
        .match_table = serial_htif_match,
-       .init = NULL,
-       .getc = htif_getc,
-       .putc = htif_putc
+       .init = serial_htif_init
 };
index c6385a5..4f91419 100644 (file)
@@ -29,7 +29,5 @@ static const struct fdt_match serial_shakti_match[] = {
 
 struct fdt_serial fdt_serial_shakti = {
        .match_table = serial_shakti_match,
-       .init = serial_shakti_init,
-       .getc = shakti_uart_getc,
-       .putc = shakti_uart_putc
+       .init = serial_shakti_init
 };
index 9e487a2..f4c833c 100644 (file)
@@ -32,7 +32,5 @@ static const struct fdt_match serial_sifive_match[] = {
 
 struct fdt_serial fdt_serial_sifive = {
        .match_table = serial_sifive_match,
-       .init = serial_sifive_init,
-       .getc = sifive_uart_getc,
-       .putc = sifive_uart_putc
+       .init = serial_sifive_init
 };
index 5030b82..918193a 100644 (file)
@@ -34,6 +34,4 @@ static const struct fdt_match serial_uart8250_match[] = {
 struct fdt_serial fdt_serial_uart8250 = {
        .match_table = serial_uart8250_match,
        .init = serial_uart8250_init,
-       .getc = uart8250_getc,
-       .putc = uart8250_putc
 };
index 7c1148e..e77a985 100644 (file)
 
 static volatile void *uart_base;
 
-void shakti_uart_putc(char ch)
+static void shakti_uart_putc(char ch)
 {
        while((readw(uart_base + REG_STATUS) & UART_TX_FULL))
                ;
        writeb(ch, uart_base + REG_TX);
 }
 
-int shakti_uart_getc(void)
+static int shakti_uart_getc(void)
 {
        u16 status = readw(uart_base + REG_STATUS);
        if (status & UART_RX_FULL)
@@ -38,11 +38,19 @@ int shakti_uart_getc(void)
        return -1;
 }
 
+static struct sbi_console_device shakti_console = {
+       .name = "shakti_uart",
+       .console_putc = shakti_uart_putc,
+       .console_getc = shakti_uart_getc
+};
+
 int shakti_uart_init(unsigned long base, u32 in_freq, u32 baudrate)
 {
        uart_base = (volatile void *)base;
        u16 baud = (u16)(in_freq/(16 * baudrate));
        writew(baud, uart_base + REG_BAUD);
 
+       sbi_console_set_device(&shakti_console);
+
        return 0;
 }
index 72c8a62..57d80fa 100644 (file)
@@ -66,7 +66,7 @@ static void set_reg(u32 num, u32 val)
        writel(val, uart_base + (num * 0x4));
 }
 
-void sifive_uart_putc(char ch)
+static void sifive_uart_putc(char ch)
 {
        while (get_reg(UART_REG_TXFIFO) & UART_TXFIFO_FULL)
                ;
@@ -74,7 +74,7 @@ void sifive_uart_putc(char ch)
        set_reg(UART_REG_TXFIFO, ch);
 }
 
-int sifive_uart_getc(void)
+static int sifive_uart_getc(void)
 {
        u32 ret = get_reg(UART_REG_RXFIFO);
        if (!(ret & UART_RXFIFO_EMPTY))
@@ -82,6 +82,12 @@ int sifive_uart_getc(void)
        return -1;
 }
 
+static struct sbi_console_device sifive_console = {
+       .name = "sifive_uart",
+       .console_putc = sifive_uart_putc,
+       .console_getc = sifive_uart_getc
+};
+
 int sifive_uart_init(unsigned long base, u32 in_freq, u32 baudrate)
 {
        uart_base     = (volatile void *)base;
@@ -98,5 +104,7 @@ int sifive_uart_init(unsigned long base, u32 in_freq, u32 baudrate)
        /* Enable Rx */
        set_reg(UART_REG_RXCTRL, UART_RXCTRL_RXEN);
 
+       sbi_console_set_device(&sifive_console);
+
        return 0;
 }
index 9635ba8..1cf6624 100644 (file)
@@ -8,6 +8,7 @@
  */
 
 #include <sbi/riscv_io.h>
+#include <sbi/sbi_console.h>
 #include <sbi_utils/serial/uart8250.h>
 
 /* clang-format off */
@@ -68,7 +69,7 @@ static void set_reg(u32 num, u32 val)
                writel(val, uart8250_base + offset);
 }
 
-void uart8250_putc(char ch)
+static void uart8250_putc(char ch)
 {
        while ((get_reg(UART_LSR_OFFSET) & UART_LSR_THRE) == 0)
                ;
@@ -76,13 +77,19 @@ void uart8250_putc(char ch)
        set_reg(UART_THR_OFFSET, ch);
 }
 
-int uart8250_getc(void)
+static int uart8250_getc(void)
 {
        if (get_reg(UART_LSR_OFFSET) & UART_LSR_DR)
                return get_reg(UART_RBR_OFFSET);
        return -1;
 }
 
+static struct sbi_console_device uart8250_console = {
+       .name = "uart8250",
+       .console_putc = uart8250_putc,
+       .console_getc = uart8250_getc
+};
+
 int uart8250_init(unsigned long base, u32 in_freq, u32 baudrate, u32 reg_shift,
                  u32 reg_width)
 {
@@ -121,5 +128,7 @@ int uart8250_init(unsigned long base, u32 in_freq, u32 baudrate, u32 reg_shift,
        /* Set scratchpad */
        set_reg(UART_SCR_OFFSET, 0x00);
 
+       sbi_console_set_device(&uart8250_console);
+
        return 0;
 }
index fd70fb9..2fd38a7 100644 (file)
@@ -6,6 +6,7 @@
  */
 
 #include <sbi/riscv_locks.h>
+#include <sbi/sbi_console.h>
 #include <sbi_utils/sys/htif.h>
 
 #define HTIF_DATA_BITS         48
@@ -98,7 +99,7 @@ static void do_tohost_fromhost(uint64_t dev, uint64_t cmd, uint64_t data)
        spin_unlock(&htif_lock);
 }
 
-void htif_putc(char ch)
+static void htif_putc(char ch)
 {
        /* HTIF devices are not supported on RV32, so do a proxy write call */
        volatile uint64_t magic_mem[8];
@@ -109,7 +110,7 @@ void htif_putc(char ch)
        do_tohost_fromhost(HTIF_DEV_SYSTEM, 0, (uint64_t)(uintptr_t)magic_mem);
 }
 #else
-void htif_putc(char ch)
+static void htif_putc(char ch)
 {
        spin_lock(&htif_lock);
        __set_tohost(HTIF_DEV_CONSOLE, HTIF_CONSOLE_CMD_PUTC, ch);
@@ -117,7 +118,7 @@ void htif_putc(char ch)
 }
 #endif
 
-int htif_getc(void)
+static int htif_getc(void)
 {
        int ch;
 
@@ -140,6 +141,19 @@ int htif_getc(void)
        return ch - 1;
 }
 
+static struct sbi_console_device htif_console = {
+       .name = "htif",
+       .console_putc = htif_putc,
+       .console_getc = htif_getc
+};
+
+int htif_serial_init(void)
+{
+       sbi_console_set_device(&htif_console);
+
+       return 0;
+}
+
 int htif_system_reset_check(u32 type, u32 reason)
 {
        return 1;
index aec91cd..338159d 100644 (file)
@@ -164,8 +164,6 @@ const struct sbi_platform_operations platform_ops = {
        .final_init = ae350_final_init,
 
        .console_init = ae350_console_init,
-       .console_putc = uart8250_putc,
-       .console_getc = uart8250_getc,
 
        .irqchip_init = ae350_irqchip_init,
 
index ea179e5..4f32c42 100644 (file)
@@ -154,8 +154,6 @@ const struct sbi_platform_operations platform_ops = {
        .early_init = ariane_early_init,
        .final_init = ariane_final_init,
        .console_init = ariane_console_init,
-       .console_putc = uart8250_putc,
-       .console_getc = uart8250_getc,
        .irqchip_init = ariane_irqchip_init,
        .ipi_init = ariane_ipi_init,
        .ipi_send = clint_ipi_send,
index 5eae477..77403c9 100644 (file)
@@ -180,8 +180,6 @@ const struct sbi_platform_operations platform_ops = {
        .early_init = openpiton_early_init,
        .final_init = openpiton_final_init,
        .console_init = openpiton_console_init,
-       .console_putc = uart8250_putc,
-       .console_getc = uart8250_getc,
        .irqchip_init = openpiton_irqchip_init,
        .ipi_init = openpiton_ipi_init,
        .ipi_send = clint_ipi_send,
index 8c1e06f..445cbcf 100644 (file)
@@ -210,8 +210,6 @@ const struct sbi_platform_operations platform_ops = {
        .early_exit             = generic_early_exit,
        .final_exit             = generic_final_exit,
        .domains_init           = generic_domains_init,
-       .console_putc           = fdt_serial_putc,
-       .console_getc           = fdt_serial_getc,
        .console_init           = fdt_serial_init,
        .irqchip_init           = fdt_irqchip_init,
        .irqchip_exit           = fdt_irqchip_exit,
index 0c50af5..495d214 100644 (file)
@@ -149,8 +149,6 @@ const struct sbi_platform_operations platform_ops = {
        .final_init     = k210_final_init,
 
        .console_init   = k210_console_init,
-       .console_putc   = sifive_uart_putc,
-       .console_getc   = sifive_uart_getc,
 
        .irqchip_init = k210_irqchip_init,
 
index d0a45a2..4f4f884 100644 (file)
@@ -202,8 +202,6 @@ static void ux600_system_reset(u32 type, u32 reason)
 const struct sbi_platform_operations platform_ops = {
        .early_init             = ux600_early_init,
        .final_init             = ux600_final_init,
-       .console_putc           = sifive_uart_putc,
-       .console_getc           = sifive_uart_getc,
        .console_init           = ux600_console_init,
        .irqchip_init           = ux600_irqchip_init,
        .ipi_send               = clint_ipi_send,
index cdd8293..82f6f75 100644 (file)
@@ -156,8 +156,6 @@ static u32 fu540_hart_index2id[FU540_HART_COUNT - 1] = {
 
 const struct sbi_platform_operations platform_ops = {
        .final_init             = fu540_final_init,
-       .console_putc           = sifive_uart_putc,
-       .console_getc           = sifive_uart_getc,
        .console_init           = fu540_console_init,
        .irqchip_init           = fu540_irqchip_init,
        .ipi_send               = clint_ipi_send,
index 5bdb186..fbbac30 100644 (file)
@@ -64,23 +64,6 @@ static int platform_console_init(void)
 }
 
 /*
- * Write a character to the platform console output.
- */
-static void platform_console_putc(char ch)
-{
-       /* Example if the generic UART8250 driver is used */
-       uart8250_putc(ch);
-}
-
-/*
- * Read a character from the platform console input.
- */
-static int platform_console_getc(void)
-{
-       return uart8250_getc();
-}
-
-/*
  * Initialize the platform interrupt controller for current HART.
  */
 static int platform_irqchip_init(bool cold_boot)
@@ -198,8 +181,6 @@ static void platform_system_reset(u32 type, u32 reason)
 const struct sbi_platform_operations platform_ops = {
        .early_init             = platform_early_init,
        .final_init             = platform_final_init,
-       .console_putc           = platform_console_putc,
-       .console_getc           = platform_console_getc,
        .console_init           = platform_console_init,
        .irqchip_init           = platform_irqchip_init,
        .ipi_send               = platform_ipi_send,