diff options
Diffstat (limited to 'lib')
-rw-r--r-- | lib/sbi/sbi_console.c | 31 | ||||
-rw-r--r-- | lib/utils/serial/fdt_serial.c | 21 | ||||
-rw-r--r-- | lib/utils/serial/fdt_serial_htif.c | 10 | ||||
-rw-r--r-- | lib/utils/serial/fdt_serial_shakti.c | 4 | ||||
-rw-r--r-- | lib/utils/serial/fdt_serial_sifive.c | 4 | ||||
-rw-r--r-- | lib/utils/serial/fdt_serial_uart8250.c | 2 | ||||
-rw-r--r-- | lib/utils/serial/shakti-uart.c | 12 | ||||
-rw-r--r-- | lib/utils/serial/sifive-uart.c | 12 | ||||
-rw-r--r-- | lib/utils/serial/uart8250.c | 13 | ||||
-rw-r--r-- | lib/utils/sys/htif.c | 20 |
10 files changed, 80 insertions, 49 deletions
diff --git a/lib/sbi/sbi_console.c b/lib/sbi/sbi_console.c index 7189b9b..b54f7a2 100644 --- a/lib/sbi/sbi_console.c +++ b/lib/sbi/sbi_console.c @@ -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)); } diff --git a/lib/utils/serial/fdt_serial.c b/lib/utils/serial/fdt_serial.c index b9ce67e..43c55e8 100644 --- a/lib/utils/serial/fdt_serial.c +++ b/lib/utils/serial/fdt_serial.c @@ -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; diff --git a/lib/utils/serial/fdt_serial_htif.c b/lib/utils/serial/fdt_serial_htif.c index 32d6953..fae55b8 100644 --- a/lib/utils/serial/fdt_serial_htif.c +++ b/lib/utils/serial/fdt_serial_htif.c @@ -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 }; diff --git a/lib/utils/serial/fdt_serial_shakti.c b/lib/utils/serial/fdt_serial_shakti.c index c6385a5..4f91419 100644 --- a/lib/utils/serial/fdt_serial_shakti.c +++ b/lib/utils/serial/fdt_serial_shakti.c @@ -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 }; diff --git a/lib/utils/serial/fdt_serial_sifive.c b/lib/utils/serial/fdt_serial_sifive.c index 9e487a2..f4c833c 100644 --- a/lib/utils/serial/fdt_serial_sifive.c +++ b/lib/utils/serial/fdt_serial_sifive.c @@ -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 }; diff --git a/lib/utils/serial/fdt_serial_uart8250.c b/lib/utils/serial/fdt_serial_uart8250.c index 5030b82..918193a 100644 --- a/lib/utils/serial/fdt_serial_uart8250.c +++ b/lib/utils/serial/fdt_serial_uart8250.c @@ -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 }; diff --git a/lib/utils/serial/shakti-uart.c b/lib/utils/serial/shakti-uart.c index 7c1148e..e77a985 100644 --- a/lib/utils/serial/shakti-uart.c +++ b/lib/utils/serial/shakti-uart.c @@ -23,14 +23,14 @@ 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; } diff --git a/lib/utils/serial/sifive-uart.c b/lib/utils/serial/sifive-uart.c index 72c8a62..57d80fa 100644 --- a/lib/utils/serial/sifive-uart.c +++ b/lib/utils/serial/sifive-uart.c @@ -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; } diff --git a/lib/utils/serial/uart8250.c b/lib/utils/serial/uart8250.c index 9635ba8..1cf6624 100644 --- a/lib/utils/serial/uart8250.c +++ b/lib/utils/serial/uart8250.c @@ -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; } diff --git a/lib/utils/sys/htif.c b/lib/utils/sys/htif.c index fd70fb9..2fd38a7 100644 --- a/lib/utils/sys/htif.c +++ b/lib/utils/sys/htif.c @@ -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; |