diff options
author | Kyösti Mälkki <kyosti.malkki@gmail.com> | 2014-03-14 22:28:29 +0200 |
---|---|---|
committer | Kyösti Mälkki <kyosti.malkki@gmail.com> | 2014-04-30 06:59:05 +0200 |
commit | 70342a7f51a0069446966c42db4dbc44f6db16ee (patch) | |
tree | c701e9fe78ca219fae3664fc7b4d54ab187f7f4f /src/drivers/uart | |
parent | a8d089d3acc0c2254b3dbeb04c1e622ab01e6d98 (diff) |
uart: Support multiple ports
The port for console remains to be a compile time constant.
The Kconfig option is changed to select an UART port with index
to avoid putting map of UART base addresses in Kconfigs.
With this change it is possible to have other than debug console
on different UART port.
Change-Id: Ie1845a946f8d3b2604ef5404edb31b2e811f3ccd
Signed-off-by: Kyösti Mälkki <kyosti.malkki@gmail.com>
Reviewed-on: http://review.coreboot.org/5342
Tested-by: build bot (Jenkins)
Reviewed-by: David Hendricks <dhendrix@chromium.org>
Reviewed-by: Paul Menzel <paulepanter@users.sourceforge.net>
Diffstat (limited to 'src/drivers/uart')
-rw-r--r-- | src/drivers/uart/oxpcie_early.c | 2 | ||||
-rw-r--r-- | src/drivers/uart/pl011.c | 17 | ||||
-rw-r--r-- | src/drivers/uart/uart8250io.c | 28 | ||||
-rw-r--r-- | src/drivers/uart/uart8250mem.c | 16 |
4 files changed, 29 insertions, 34 deletions
diff --git a/src/drivers/uart/oxpcie_early.c b/src/drivers/uart/oxpcie_early.c index b81fa8914d..fd378068b3 100644 --- a/src/drivers/uart/oxpcie_early.c +++ b/src/drivers/uart/oxpcie_early.c @@ -97,7 +97,7 @@ void uart_fill_lb(void *data) { struct lb_serial serial; serial.type = LB_SERIAL_TYPE_MEMORY_MAPPED; - serial.baseaddr = uart_platform_base(0); + serial.baseaddr = uart_platform_base(CONFIG_UART_FOR_CONSOLE); serial.baud = default_baudrate(); lb_add_serial(&serial, data); diff --git a/src/drivers/uart/pl011.c b/src/drivers/uart/pl011.c index 41e66face8..e2db87760a 100644 --- a/src/drivers/uart/pl011.c +++ b/src/drivers/uart/pl011.c @@ -21,26 +21,21 @@ static void pl011_uart_tx_byte(unsigned int *uart_base, unsigned char data) *uart_base = (unsigned int)data; } -unsigned int uart_platform_base(int idx) +void uart_init(int idx) { - return CONFIG_CONSOLE_SERIAL_UART_ADDRESS; } -void uart_init(void) +void uart_tx_byte(int idx, unsigned char data) { -} - -void uart_tx_byte(unsigned char data) -{ - unsigned int *uart_base = uart_platform_baseptr(0); + unsigned int *uart_base = uart_platform_baseptr(idx); pl011_uart_tx_byte(uart_base, data); } -void uart_tx_flush(void) +void uart_tx_flush(int idx) { } -unsigned char uart_rx_byte(void) +unsigned char uart_rx_byte(int idx) { return 0; } @@ -50,7 +45,7 @@ void uart_fill_lb(void *data) { struct lb_serial serial; serial.type = LB_SERIAL_TYPE_MEMORY_MAPPED; - serial.baseaddr = uart_platform_base(0); + serial.baseaddr = uart_platform_base(CONFIG_UART_FOR_CONSOLE); serial.baud = default_baudrate(); lb_add_serial(&serial, data); diff --git a/src/drivers/uart/uart8250io.c b/src/drivers/uart/uart8250io.c index b2f234b283..f4a7b0ab74 100644 --- a/src/drivers/uart/uart8250io.c +++ b/src/drivers/uart/uart8250io.c @@ -19,6 +19,7 @@ */ #include <rules.h> +#include <stdlib.h> #include <arch/io.h> #include <console/uart.h> #include <trace.h> @@ -102,37 +103,36 @@ static void uart8250_init(unsigned base_port, unsigned divisor) ENABLE_TRACE; } -/* FIXME: Needs uart index from Kconfig. - * Already use array as a work-around for ROMCC. - */ -static const unsigned bases[1] = { CONFIG_TTYS0_BASE }; +static const unsigned bases[] = { 0x3f8, 0x2f8, 0x3e8, 0x2e8 }; unsigned int uart_platform_base(int idx) { - return bases[idx]; + if (idx < ARRAY_SIZE(bases)) + return bases[idx]; + return 0; } -void uart_init(void) +void uart_init(int idx) { unsigned int div; div = uart_baudrate_divisor(default_baudrate(), BAUDRATE_REFCLK, BAUDRATE_OVERSAMPLE); - uart8250_init(bases[0], div); + uart8250_init(uart_platform_base(idx), div); } -void uart_tx_byte(unsigned char data) +void uart_tx_byte(int idx, unsigned char data) { - uart8250_tx_byte(bases[0], data); + uart8250_tx_byte(uart_platform_base(idx), data); } -unsigned char uart_rx_byte(void) +unsigned char uart_rx_byte(int idx) { - return uart8250_rx_byte(bases[0]); + return uart8250_rx_byte(uart_platform_base(idx)); } -void uart_tx_flush(void) +void uart_tx_flush(int idx) { - uart8250_tx_flush(bases[0]); + uart8250_tx_flush(uart_platform_base(idx)); } #if ENV_RAMSTAGE @@ -140,7 +140,7 @@ void uart_fill_lb(void *data) { struct lb_serial serial; serial.type = LB_SERIAL_TYPE_IO_MAPPED; - serial.baseaddr = uart_platform_base(0); + serial.baseaddr = uart_platform_base(CONFIG_UART_FOR_CONSOLE); serial.baud = default_baudrate(); lb_add_serial(&serial, data); diff --git a/src/drivers/uart/uart8250mem.c b/src/drivers/uart/uart8250mem.c index 5a186f07a9..976bcb6949 100644 --- a/src/drivers/uart/uart8250mem.c +++ b/src/drivers/uart/uart8250mem.c @@ -89,9 +89,9 @@ static void uart8250_mem_init(unsigned base_port, unsigned divisor) write8(base_port + UART_LCR, CONFIG_TTYS0_LCS); } -void uart_init(void) +void uart_init(int idx) { - u32 base = uart_platform_base(0); + u32 base = uart_platform_base(idx); if (!base) return; @@ -100,25 +100,25 @@ void uart_init(void) uart8250_mem_init(base, div); } -void uart_tx_byte(unsigned char data) +void uart_tx_byte(int idx, unsigned char data) { - u32 base = uart_platform_base(0); + u32 base = uart_platform_base(idx); if (!base) return; uart8250_mem_tx_byte(base, data); } -unsigned char uart_rx_byte(void) +unsigned char uart_rx_byte(int idx) { - u32 base = uart_platform_base(0); + u32 base = uart_platform_base(idx); if (!base) return 0xff; return uart8250_mem_rx_byte(base); } -void uart_tx_flush(void) +void uart_tx_flush(int idx) { - u32 base = uart_platform_base(0); + u32 base = uart_platform_base(idx); if (!base) return; uart8250_mem_tx_flush(base); |