summaryrefslogtreecommitdiff
path: root/src/cpu
diff options
context:
space:
mode:
authorKyösti Mälkki <kyosti.malkki@gmail.com>2014-03-14 22:28:29 +0200
committerKyösti Mälkki <kyosti.malkki@gmail.com>2014-04-30 06:59:05 +0200
commit70342a7f51a0069446966c42db4dbc44f6db16ee (patch)
treec701e9fe78ca219fae3664fc7b4d54ab187f7f4f /src/cpu
parenta8d089d3acc0c2254b3dbeb04c1e622ab01e6d98 (diff)
downloadcoreboot-70342a7f51a0069446966c42db4dbc44f6db16ee.tar.xz
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/cpu')
-rw-r--r--src/cpu/allwinner/a10/Kconfig49
-rw-r--r--src/cpu/allwinner/a10/uart_console.c48
-rw-r--r--src/cpu/samsung/exynos5250/Kconfig39
-rw-r--r--src/cpu/samsung/exynos5250/uart.c23
-rw-r--r--src/cpu/samsung/exynos5420/Kconfig39
-rw-r--r--src/cpu/samsung/exynos5420/uart.c21
-rw-r--r--src/cpu/ti/am335x/uart.c25
7 files changed, 64 insertions, 180 deletions
diff --git a/src/cpu/allwinner/a10/Kconfig b/src/cpu/allwinner/a10/Kconfig
index 267e1f48f2..63c44620c5 100644
--- a/src/cpu/allwinner/a10/Kconfig
+++ b/src/cpu/allwinner/a10/Kconfig
@@ -72,51 +72,8 @@ config SYS_SDRAM_BASE
hex
default 0x40000000
-choice CONSOLE_SERIAL_UART_CHOICES
- prompt "Serial Console UART"
- default CONSOLE_SERIAL_UART0
- depends on CONSOLE_SERIAL
-
-config CONSOLE_SERIAL_UART0
- bool "UART0"
- help
- Serial console on UART0
-
-config CONSOLE_SERIAL_UART1
- bool "UART1"
- help
- Serial console on UART1
-
-config CONSOLE_SERIAL_UART2
- bool "UART2"
- help
- Serial console on UART2
-
-config CONSOLE_SERIAL_UART3
- bool "UART3"
- help
- Serial console on UART3
-
-config CONSOLE_SERIAL_UART4
- bool "UART4"
- help
- Serial console on UART4
-
-config CONSOLE_SERIAL_UART5
- bool "UART5"
- help
- Serial console on UART5
-
-config CONSOLE_SERIAL_UART6
- bool "UART6"
- help
- Serial console on UART6
-
-config CONSOLE_SERIAL_UART7
- bool "UART7"
- help
- Serial console on UART7
-
-endchoice
+config UART_FOR_CONSOLE
+ int
+ default 0
endif # if CPU_ALLWINNER_A10
diff --git a/src/cpu/allwinner/a10/uart_console.c b/src/cpu/allwinner/a10/uart_console.c
index d6b91e763a..bb5f41c312 100644
--- a/src/cpu/allwinner/a10/uart_console.c
+++ b/src/cpu/allwinner/a10/uart_console.c
@@ -14,28 +14,13 @@
#include <cpu/allwinner/a10/uart.h>
-static void *get_console_uart_base_addr(void)
+unsigned int uart_platform_base(int idx)
{
- /* This big block gets compiled to a constant, not a function call */
- if (CONFIG_CONSOLE_SERIAL_UART0)
- return (void *)A1X_UART0_BASE;
- else if (CONFIG_CONSOLE_SERIAL_UART1)
- return (void *)A1X_UART1_BASE;
- else if (CONFIG_CONSOLE_SERIAL_UART2)
- return (void *)A1X_UART2_BASE;
- else if (CONFIG_CONSOLE_SERIAL_UART3)
- return (void *)A1X_UART3_BASE;
- else if (CONFIG_CONSOLE_SERIAL_UART4)
- return (void *)A1X_UART4_BASE;
- else if (CONFIG_CONSOLE_SERIAL_UART5)
- return (void *)A1X_UART5_BASE;
- else if (CONFIG_CONSOLE_SERIAL_UART6)
- return (void *)A1X_UART6_BASE;
- else if (CONFIG_CONSOLE_SERIAL_UART7)
- return (void *)A1X_UART7_BASE;
-
- /* If selection is invalid, default to UART0 */
- return (void *)A1X_UART0_BASE;
+ /* UART blocks are mapped 0x400 bytes apart */
+ if (idx < 8)
+ return A1X_UART0_BASE + 0x400 * idx;
+ else
+ return 0;
}
/* FIXME: We assume clock is 24MHz, which may not be the case. */
@@ -44,14 +29,9 @@ unsigned int uart_platform_refclk(void)
return 24000000;
}
-unsigned int uart_platform_base(int idx)
-{
- return (unsigned int)get_console_uart_base_addr();
-}
-
-void uart_init(void)
+void uart_init(int idx)
{
- void *uart_base = get_console_uart_base_addr();
+ void *uart_base = uart_platform_baseptr(idx);
/* Use default 8N1 encoding */
a10_uart_configure(uart_base, default_baudrate(),
@@ -59,17 +39,17 @@ void uart_init(void)
a10_uart_enable_fifos(uart_base);
}
-unsigned char uart_rx_byte(void)
+unsigned char uart_rx_byte(int idx)
{
- return a10_uart_rx_blocking(get_console_uart_base_addr());
+ return a10_uart_rx_blocking(uart_platform_baseptr(idx));
}
-void uart_tx_byte(unsigned char data)
+void uart_tx_byte(int idx, unsigned char data)
{
- a10_uart_tx_blocking(get_console_uart_base_addr(), data);
+ a10_uart_tx_blocking(uart_platform_baseptr(idx), data);
}
-void uart_tx_flush(void)
+void uart_tx_flush(int idx)
{
}
@@ -78,7 +58,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/cpu/samsung/exynos5250/Kconfig b/src/cpu/samsung/exynos5250/Kconfig
index 9320184bed..2fda9b3e4d 100644
--- a/src/cpu/samsung/exynos5250/Kconfig
+++ b/src/cpu/samsung/exynos5250/Kconfig
@@ -88,41 +88,8 @@ config SYS_SDRAM_BASE
hex
default 0x40000000
-choice CONSOLE_SERIAL_UART_CHOICES
- prompt "Serial Console UART"
- default CONSOLE_SERIAL_UART3
- depends on CONSOLE_SERIAL
-
-config CONSOLE_SERIAL_UART0
- bool "UART0"
- help
- Serial console on UART0
-
-config CONSOLE_SERIAL_UART1
- bool "UART1"
- help
- Serial console on UART1
-
-config CONSOLE_SERIAL_UART2
- bool "UART2"
- help
- Serial console on UART2
-
-config CONSOLE_SERIAL_UART3
- bool "UART3"
- help
- Serial console on UART3
-
-endchoice
-
-config CONSOLE_SERIAL_UART_ADDRESS
- hex
- depends on CONSOLE_SERIAL
- default 0x12c00000 if CONSOLE_SERIAL_UART0
- default 0x12c10000 if CONSOLE_SERIAL_UART1
- default 0x12c20000 if CONSOLE_SERIAL_UART2
- default 0x12c30000 if CONSOLE_SERIAL_UART3
- help
- Map the UART names to the respective MMIO address.
+config UART_FOR_CONSOLE
+ int
+ default 3
endif
diff --git a/src/cpu/samsung/exynos5250/uart.c b/src/cpu/samsung/exynos5250/uart.c
index 1dabc093eb..a73a01aba7 100644
--- a/src/cpu/samsung/exynos5250/uart.c
+++ b/src/cpu/samsung/exynos5250/uart.c
@@ -157,30 +157,33 @@ static void exynos5_uart_tx_flush(struct s5p_uart *uart)
unsigned int uart_platform_base(int idx)
{
- return CONFIG_CONSOLE_SERIAL_UART_ADDRESS;
+ if (idx < 4)
+ return 0x12c00000 + idx * 0x10000;
+ else
+ return 0;
}
-void uart_init(void)
+void uart_init(int idx)
{
- struct s5p_uart *uart = uart_platform_baseptr(0);
+ struct s5p_uart *uart = uart_platform_baseptr(idx);
exynos5_init_dev(uart);
}
-unsigned char uart_rx_byte(void)
+unsigned char uart_rx_byte(int idx)
{
- struct s5p_uart *uart = uart_platform_baseptr(0);
+ struct s5p_uart *uart = uart_platform_baseptr(idx);
return exynos5_uart_rx_byte(uart);
}
-void uart_tx_byte(unsigned char data)
+void uart_tx_byte(int idx, unsigned char data)
{
- struct s5p_uart *uart = uart_platform_baseptr(0);
+ struct s5p_uart *uart = uart_platform_baseptr(idx);
exynos5_uart_tx_byte(uart, data);
}
-void uart_tx_flush(void)
+void uart_tx_flush(int idx)
{
- struct s5p_uart *uart = uart_platform_baseptr(0);
+ struct s5p_uart *uart = uart_platform_baseptr(idx);
exynos5_uart_tx_flush(uart);
}
@@ -189,7 +192,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/cpu/samsung/exynos5420/Kconfig b/src/cpu/samsung/exynos5420/Kconfig
index 5f78cc5d92..e46d8893e8 100644
--- a/src/cpu/samsung/exynos5420/Kconfig
+++ b/src/cpu/samsung/exynos5420/Kconfig
@@ -90,41 +90,8 @@ config SYS_SDRAM_BASE
hex
default 0x20000000
-choice CONSOLE_SERIAL_UART_CHOICES
- prompt "Serial Console UART"
- default CONSOLE_SERIAL_UART3
- depends on CONSOLE_SERIAL
-
-config CONSOLE_SERIAL_UART0
- bool "UART0"
- help
- Serial console on UART0
-
-config CONSOLE_SERIAL_UART1
- bool "UART1"
- help
- Serial console on UART1
-
-config CONSOLE_SERIAL_UART2
- bool "UART2"
- help
- Serial console on UART2
-
-config CONSOLE_SERIAL_UART3
- bool "UART3"
- help
- Serial console on UART3
-
-endchoice
-
-config CONSOLE_SERIAL_UART_ADDRESS
- hex
- depends on CONSOLE_SERIAL
- default 0x12c00000 if CONSOLE_SERIAL_UART0
- default 0x12c10000 if CONSOLE_SERIAL_UART1
- default 0x12c20000 if CONSOLE_SERIAL_UART2
- default 0x12c30000 if CONSOLE_SERIAL_UART3
- help
- Map the UART names to the respective MMIO address.
+config UART_FOR_CONSOLE
+ int
+ default 3
endif
diff --git a/src/cpu/samsung/exynos5420/uart.c b/src/cpu/samsung/exynos5420/uart.c
index 290eb35a8d..8fd4dea61f 100644
--- a/src/cpu/samsung/exynos5420/uart.c
+++ b/src/cpu/samsung/exynos5420/uart.c
@@ -149,28 +149,31 @@ static void exynos5_uart_tx_byte(struct s5p_uart *uart, unsigned char data)
unsigned int uart_platform_base(int idx)
{
- return CONFIG_CONSOLE_SERIAL_UART_ADDRESS;
+ if (idx < 4)
+ return 0x12c00000 + idx * 0x10000;
+ else
+ return 0;
}
-void uart_init(void)
+void uart_init(int idx)
{
- struct s5p_uart *uart = uart_platform_baseptr(0);
+ struct s5p_uart *uart = uart_platform_baseptr(idx);
exynos5_init_dev(uart);
}
-unsigned char uart_rx_byte(void)
+unsigned char uart_rx_byte(int idx)
{
- struct s5p_uart *uart = uart_platform_baseptr(0);
+ struct s5p_uart *uart = uart_platform_baseptr(idx);
return exynos5_uart_rx_byte(uart);
}
-void uart_tx_byte(unsigned char data)
+void uart_tx_byte(int idx, unsigned char data)
{
- struct s5p_uart *uart = uart_platform_baseptr(0);
+ struct s5p_uart *uart = uart_platform_baseptr(idx);
exynos5_uart_tx_byte(uart, data);
}
-void uart_tx_flush(void)
+void uart_tx_flush(int idx)
{
/* Exynos5250 implements this too. */
}
@@ -180,7 +183,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/cpu/ti/am335x/uart.c b/src/cpu/ti/am335x/uart.c
index 858926bc31..d398d9aba6 100644
--- a/src/cpu/ti/am335x/uart.c
+++ b/src/cpu/ti/am335x/uart.c
@@ -16,6 +16,7 @@
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
+#include <stdlib.h>
#include <config.h>
#include <types.h>
#include <console/uart.h>
@@ -154,30 +155,36 @@ unsigned int uart_platform_refclk(void)
unsigned int uart_platform_base(int idx)
{
- return CONFIG_CONSOLE_SERIAL_UART_ADDRESS;
+ const unsigned int bases[] = {
+ 0x44e09000, 0x48022000, 0x48024000,
+ 0x481a6000, 0x481a8000, 0x481aa000
+ };
+ if (idx < ARRAY_SIZE(bases))
+ return bases[idx];
+ return 0;
}
-void uart_init(void)
+void uart_init(int idx)
{
- struct am335x_uart *uart = uart_platform_baseptr(0);
+ struct am335x_uart *uart = uart_platform_baseptr(idx);
uint16_t div = (uint16_t) uart_baudrate_divisor(
default_baudrate(), uart_platform_refclk(), 16);
am335x_uart_init(uart, div);
}
-unsigned char uart_rx_byte(void)
+unsigned char uart_rx_byte(int idx)
{
- struct am335x_uart *uart = uart_platform_baseptr(0);
+ struct am335x_uart *uart = uart_platform_baseptr(idx);
return am335x_uart_rx_byte(uart);
}
-void uart_tx_byte(unsigned char data)
+void uart_tx_byte(int idx, unsigned char data)
{
- struct am335x_uart *uart = uart_platform_baseptr(0);
+ struct am335x_uart *uart = uart_platform_baseptr(idx);
am335x_uart_tx_byte(uart, data);
}
-void uart_tx_flush(void)
+void uart_tx_flush(int idx)
{
}
@@ -186,7 +193,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);