aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorKyösti Mälkki <kyosti.malkki@gmail.com>2014-02-15 07:53:18 +0200
committerKyösti Mälkki <kyosti.malkki@gmail.com>2014-03-04 15:27:53 +0100
commit4770749edca1e54c9a04b48ca6909d786139fa1b (patch)
tree05ef5eeba7586e3ba28f24eca77b349b2305580a /src
parent1d7541feeba372ec3d1d441442238e1c65972bd7 (diff)
uart8250io: Unify calls with generic UART
Change-Id: I6d56648e56f2177e1d5332497321e718df18300c Signed-off-by: Kyösti Mälkki <kyosti.malkki@gmail.com> Reviewed-on: http://review.coreboot.org/5234 Tested-by: build bot (Jenkins) Reviewed-by: Stefan Reinauer <stefan.reinauer@coreboot.org>
Diffstat (limited to 'src')
-rw-r--r--src/arch/x86/lib/romcc_console.c8
-rw-r--r--src/arch/x86/lib/romstage_console.c6
-rw-r--r--src/console/uart8250_console.c9
-rw-r--r--src/cpu/x86/smm/smiutil.c2
-rw-r--r--src/include/console/uart.h5
-rw-r--r--src/include/uart8250.h10
-rw-r--r--src/lib/uart8250.c51
7 files changed, 47 insertions, 44 deletions
diff --git a/src/arch/x86/lib/romcc_console.c b/src/arch/x86/lib/romcc_console.c
index 52b8a872a5..1ed498a083 100644
--- a/src/arch/x86/lib/romcc_console.c
+++ b/src/arch/x86/lib/romcc_console.c
@@ -20,6 +20,7 @@
#include <stdint.h>
#include <console/loglevel.h>
#include <console/post_codes.h>
+#include <console/uart.h>
#include <console/ne2k.h>
/* __PRE_RAM__ */
@@ -28,9 +29,6 @@
* we could use the same code on all architectures.
*/
#define console_loglevel CONFIG_DEFAULT_CONSOLE_LOGLEVEL
-#if CONFIG_CONSOLE_SERIAL8250
-#include <uart8250.h>
-#endif
#if CONFIG_CONSOLE_SERIAL8250
#include "drivers/uart/util.c"
@@ -43,7 +41,7 @@
static void __console_tx_byte(unsigned char byte)
{
#if CONFIG_CONSOLE_SERIAL8250
- uart8250_tx_byte(CONFIG_TTYS0_BASE, byte);
+ uart_tx_byte(byte);
#endif
#if CONFIG_CONSOLE_NE2K
ne2k_append_data_byte(byte, CONFIG_CONSOLE_NE2K_IO_PORT);
@@ -64,7 +62,7 @@ static void __console_tx_char(int loglevel, unsigned char byte)
{
if (console_loglevel >= loglevel) {
#if CONFIG_CONSOLE_SERIAL8250
- uart8250_tx_byte(CONFIG_TTYS0_BASE, byte);
+ uart_tx_byte(byte);
#endif
#if CONFIG_CONSOLE_NE2K
ne2k_append_data_byte(byte, CONFIG_CONSOLE_NE2K_IO_PORT);
diff --git a/src/arch/x86/lib/romstage_console.c b/src/arch/x86/lib/romstage_console.c
index 4981f39ee7..89d7f820a6 100644
--- a/src/arch/x86/lib/romstage_console.c
+++ b/src/arch/x86/lib/romstage_console.c
@@ -26,7 +26,7 @@
#include <console/spkmodem.h>
#include <console/vtxprintf.h>
-#if CONFIG_CONSOLE_SERIAL8250 || CONFIG_CONSOLE_SERIAL8250MEM
+#if CONFIG_CONSOLE_SERIAL8250MEM
#include <uart8250.h>
#endif
@@ -42,7 +42,7 @@ void console_tx_byte(unsigned char byte)
}
#endif
#if CONFIG_CONSOLE_SERIAL8250
- uart8250_tx_byte(CONFIG_TTYS0_BASE, byte);
+ uart_tx_byte(byte);
#endif
#if CONFIG_USBDEBUG && (CONFIG_USBDEBUG_IN_ROMSTAGE || !defined(__PRE_RAM__))
usb_tx_byte(0, byte);
@@ -64,7 +64,7 @@ void console_tx_flush(void)
uart8250_mem_tx_flush(CONFIG_OXFORD_OXPCIE_BASE_ADDRESS + 0x1000);
#endif
#if CONFIG_CONSOLE_SERIAL8250
- uart8250_tx_flush(CONFIG_TTYS0_BASE);
+ uart_tx_flush();
#endif
#if CONFIG_CONSOLE_NE2K
ne2k_transmit(CONFIG_CONSOLE_NE2K_IO_PORT);
diff --git a/src/console/uart8250_console.c b/src/console/uart8250_console.c
index 86f1401d8c..52f59f643a 100644
--- a/src/console/uart8250_console.c
+++ b/src/console/uart8250_console.c
@@ -19,7 +19,6 @@
#include <console/console.h>
#include <console/uart.h>
-#include <uart8250.h>
static void ttyS0_init(void)
{
@@ -28,22 +27,22 @@ static void ttyS0_init(void)
static void ttyS0_tx_byte(unsigned char data)
{
- uart8250_tx_byte(CONFIG_TTYS0_BASE, data);
+ uart_tx_byte(data);
}
static void ttyS0_tx_flush(void)
{
- uart8250_tx_flush(CONFIG_TTYS0_BASE);
+ uart_tx_flush();
}
static unsigned char ttyS0_rx_byte(void)
{
- return uart8250_rx_byte(CONFIG_TTYS0_BASE);
+ return uart_rx_byte();
}
static int ttyS0_tst_byte(void)
{
- return uart8250_can_rx_byte(CONFIG_TTYS0_BASE);
+ return uart_can_rx_byte();
}
static const struct console_driver uart8250_console __console = {
diff --git a/src/cpu/x86/smm/smiutil.c b/src/cpu/x86/smm/smiutil.c
index 98ef223073..3702e5c179 100644
--- a/src/cpu/x86/smm/smiutil.c
+++ b/src/cpu/x86/smm/smiutil.c
@@ -45,7 +45,7 @@ void console_tx_byte(unsigned char byte)
uart8250_mem_tx_byte(serial8250mem_base_address, byte);
#endif
#if CONFIG_CONSOLE_SERIAL8250
- uart8250_tx_byte(CONFIG_TTYS0_BASE, byte);
+ uart_tx_byte(byte);
#endif
}
diff --git a/src/include/console/uart.h b/src/include/console/uart.h
index 9b52a78c69..8aa8ea24ce 100644
--- a/src/include/console/uart.h
+++ b/src/include/console/uart.h
@@ -37,10 +37,11 @@ unsigned int uart_baudrate_divisor(unsigned int baudrate,
unsigned int refclk, unsigned int oversample);
-unsigned char uart_rx_byte(void);
+void uart_init(void);
void uart_tx_byte(unsigned char data);
void uart_tx_flush(void);
-void uart_init(void);
+unsigned char uart_rx_byte(void);
+int uart_can_rx_byte(void);
uint32_t uartmem_getbaseaddr(void);
diff --git a/src/include/uart8250.h b/src/include/uart8250.h
index af95796733..100a216257 100644
--- a/src/include/uart8250.h
+++ b/src/include/uart8250.h
@@ -105,16 +105,6 @@
#define UART_SCR 0x07
#define UART_SPR 0x07
-#if CONFIG_CONSOLE_SERIAL8250
-unsigned char uart8250_rx_byte(unsigned base_port);
-int uart8250_can_rx_byte(unsigned base_port);
-void uart8250_tx_byte(unsigned base_port, unsigned char data);
-void uart8250_tx_flush(unsigned base_port);
-/* Yes it is silly to have three different uart init functions. But we used to
- * have three different sets of uart code, so it's an improvement.
- */
-void uart8250_init(unsigned base_port, unsigned divisor);
-#endif
#if CONFIG_CONSOLE_SERIAL8250MEM
void uartmem_init(void);
diff --git a/src/lib/uart8250.c b/src/lib/uart8250.c
index 3171e00d13..8e1714d190 100644
--- a/src/lib/uart8250.c
+++ b/src/lib/uart8250.c
@@ -40,40 +40,30 @@
#define SINGLE_CHAR_TIMEOUT (50 * 1000)
#define FIFO_TIMEOUT (16 * SINGLE_CHAR_TIMEOUT)
-static inline int uart8250_can_tx_byte(unsigned base_port)
+static int uart8250_can_tx_byte(unsigned base_port)
{
return inb(base_port + UART_LSR) & UART_LSR_THRE;
}
-static inline void uart8250_wait_to_tx_byte(unsigned base_port)
+static void uart8250_tx_byte(unsigned base_port, unsigned char data)
{
unsigned long int i = SINGLE_CHAR_TIMEOUT;
while (i-- && !uart8250_can_tx_byte(base_port));
+ outb(data, base_port + UART_TBR);
}
-static inline void uart8250_wait_until_sent(unsigned base_port)
+static void uart8250_tx_flush(unsigned base_port)
{
unsigned long int i = FIFO_TIMEOUT;
while (i-- && !(inb(base_port + UART_LSR) & UART_LSR_TEMT));
}
-void uart8250_tx_byte(unsigned base_port, unsigned char data)
-{
- uart8250_wait_to_tx_byte(base_port);
- outb(data, base_port + UART_TBR);
-}
-
-void uart8250_tx_flush(unsigned base_port)
-{
- uart8250_wait_until_sent(base_port);
-}
-
-int uart8250_can_rx_byte(unsigned base_port)
+static int uart8250_can_rx_byte(unsigned base_port)
{
return inb(base_port + UART_LSR) & UART_LSR_DR;
}
-unsigned char uart8250_rx_byte(unsigned base_port)
+static unsigned char uart8250_rx_byte(unsigned base_port)
{
unsigned long int i = SINGLE_CHAR_TIMEOUT;
while (i-- && !uart8250_can_rx_byte(base_port));
@@ -84,7 +74,7 @@ unsigned char uart8250_rx_byte(unsigned base_port)
return 0x0;
}
-void uart8250_init(unsigned base_port, unsigned divisor)
+static void uart8250_init(unsigned base_port, unsigned divisor)
{
DISABLE_TRACE;
/* Disable interrupts */
@@ -107,10 +97,35 @@ 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 };
+
void uart_init(void)
{
unsigned int div;
div = uart_baudrate_divisor(default_baudrate(), BAUDRATE_REFCLK,
BAUDRATE_OVERSAMPLE);
- uart8250_init(CONFIG_TTYS0_BASE, div);
+ uart8250_init(bases[0], div);
+}
+
+void uart_tx_byte(unsigned char data)
+{
+ uart8250_tx_byte(bases[0], data);
+}
+
+unsigned char uart_rx_byte(void)
+{
+ return uart8250_rx_byte(bases[0]);
+}
+
+int uart_can_rx_byte(void)
+{
+ return uart8250_can_rx_byte(bases[0]);
+}
+
+void uart_tx_flush(void)
+{
+ uart8250_tx_flush(bases[0]);
}