[coreboot-gerrit] Patch set updated for coreboot: 54b40ee RFC: console: Make 8250 memmaped console independent of Oxford PCIe952
Alexandru Gagniuc (mr.nuke.me@gmail.com)
gerrit at coreboot.org
Sat Feb 15 22:10:25 CET 2014
Alexandru Gagniuc (mr.nuke.me at gmail.com) just uploaded a new patch set to gerrit, which you can find at http://review.coreboot.org/4587
-gerrit
commit 54b40eedb527a4d591088290ea5a5ab7ca1ddcb5
Author: Alexandru Gagniuc <mr.nuke.me at gmail.com>
Date: Sun Dec 29 19:33:06 2013 -0500
RFC: console: Make 8250 memmaped console independent of Oxford PCIe952
RFC: Request for comments. DO NOT MERGE (YET)
Running the console on an 8250-compatible memory-mapped UART was only
possible via an Oxford PCIe952 adapter, as the console code explicitly
depended on variables and functions defined by the Oxford driver.
Change-Id: Icde4cdb2d671865502293183aed5664e8690a9ac
Signed-off-by: Alexandru Gagniuc <mr.nuke.me at gmail.com>
---
src/arch/x86/lib/romstage_console.c | 5 +--
src/console/console.c | 6 +--
src/drivers/oxford/oxpcie/Makefile.inc | 1 +
src/drivers/oxford/oxpcie/oxpcie_early.c | 13 ++++--
src/drivers/oxford/oxpcie/oxpcie_memconsole.c | 62 +++++++++++++++++++++++++++
src/include/uart8250.h | 9 ++--
src/lib/uart8250mem.c | 53 +----------------------
7 files changed, 81 insertions(+), 68 deletions(-)
diff --git a/src/arch/x86/lib/romstage_console.c b/src/arch/x86/lib/romstage_console.c
index 68b10eb..0ab0187 100644
--- a/src/arch/x86/lib/romstage_console.c
+++ b/src/arch/x86/lib/romstage_console.c
@@ -40,10 +40,7 @@ void console_tx_byte(unsigned char byte)
console_tx_byte('\r');
#if CONFIG_CONSOLE_SERIAL8250MEM
- if (oxford_oxpcie_present) {
- uart8250_mem_tx_byte(
- CONFIG_OXFORD_OXPCIE_BASE_ADDRESS + 0x1000, byte);
- }
+ uart8250_mem_tx_byte(uart8250_mem_get_baseaddr(), byte);
#endif
#if CONFIG_CONSOLE_SERIAL8250
uart8250_tx_byte(CONFIG_TTYS0_BASE, byte);
diff --git a/src/console/console.c b/src/console/console.c
index 38ac3e7..c0d3f2c 100644
--- a/src/console/console.c
+++ b/src/console/console.c
@@ -106,11 +106,11 @@ void console_init(void)
#if defined(__BOOT_BLOCK__) && CONFIG_BOOTBLOCK_CONSOLE || \
!defined(__BOOT_BLOCK__) && CONFIG_EARLY_CONSOLE
-#if CONFIG_CONSOLE_SERIAL
+#if CONFIG_CONSOLE_SERIAL && !CONFIG_CONSOLE_SERIAL8250MEM
uart_init();
#endif
-#if CONFIG_DRIVERS_OXFORD_OXPCIE && CONFIG_CONSOLE_SERIAL8250MEM
- oxford_init();
+#if CONFIG_CONSOLE_SERIAL8250MEM
+ uart_mem_init();
#endif
#if CONFIG_CONSOLE_NE2K
ne2k_init(CONFIG_CONSOLE_NE2K_IO_PORT);
diff --git a/src/drivers/oxford/oxpcie/Makefile.inc b/src/drivers/oxford/oxpcie/Makefile.inc
index 6cc29c4..b967e02 100644
--- a/src/drivers/oxford/oxpcie/Makefile.inc
+++ b/src/drivers/oxford/oxpcie/Makefile.inc
@@ -2,4 +2,5 @@ ramstage-$(CONFIG_DRIVERS_OXFORD_OXPCIE) += oxpcie.c
ifeq ($(CONFIG_CONSOLE_SERIAL8250MEM),y)
romstage-$(CONFIG_DRIVERS_OXFORD_OXPCIE) += oxpcie_early.c
+ramstage-$(CONFIG_DRIVERS_OXFORD_OXPCIE) += oxpcie_memconsole.c
endif
diff --git a/src/drivers/oxford/oxpcie/oxpcie_early.c b/src/drivers/oxford/oxpcie/oxpcie_early.c
index d04e9d4..ed6a7ff 100644
--- a/src/drivers/oxford/oxpcie/oxpcie_early.c
+++ b/src/drivers/oxford/oxpcie/oxpcie_early.c
@@ -38,7 +38,12 @@
#if defined(__PRE_RAM__)
int oxford_oxpcie_present CAR_GLOBAL;
-void oxford_init(void)
+u32 uart8250_mem_get_baseaddr(void)
+{
+ return CONFIG_OXFORD_OXPCIE_BASE_ADDRESS + 0x1000;
+}
+
+u32 uart_mem_init(void)
{
u16 reg16;
oxford_oxpcie_present = 1;
@@ -92,7 +97,7 @@ void oxford_init(void)
*/
id = pci_read_config32(OXPCIE_DEVICE_3, PCI_VENDOR_ID);
if (id != 0xc11b1415)
- return;
+ return -1;
device = OXPCIE_DEVICE_3;
break;
case 0xc1581415: /* e.g. Startech MPEX2S952 */
@@ -101,7 +106,7 @@ void oxford_init(void)
default:
/* No UART here. */
oxford_oxpcie_present = 0;
- return;
+ return -1;
}
/* Setup base address on device */
@@ -117,6 +122,8 @@ void oxford_init(void)
u32 uart0_base = CONFIG_OXFORD_OXPCIE_BASE_ADDRESS + 0x1000;
uart8250_mem_init(uart0_base, (4000000 / CONFIG_TTYS0_BAUD));
+
+ return uart0_base;
}
#endif
diff --git a/src/drivers/oxford/oxpcie/oxpcie_memconsole.c b/src/drivers/oxford/oxpcie/oxpcie_memconsole.c
new file mode 100644
index 0000000..d1d0ce4
--- /dev/null
+++ b/src/drivers/oxford/oxpcie/oxpcie_memconsole.c
@@ -0,0 +1,62 @@
+/*
+ * This file is part of the coreboot project.
+ *
+ * Copyright (C) 2003 Eric Biederman
+ * Copyright (C) 2006-2010 coresystems GmbH
+ * Subject to the GNU GPL version 2.
+ */
+
+#include <uart8250.h>
+#if CONFIG_USE_OPTION_TABLE
+#include <pc80/mc146818rtc.h>
+#include "option_table.h"
+#endif
+
+u32 uart_mem_init(void)
+{
+ unsigned uart_baud = CONFIG_TTYS0_BAUD;
+ u32 uart_bar = 0;
+ unsigned div;
+
+ /* find out the correct baud rate */
+#if !defined(__SMM__) && CONFIG_USE_OPTION_TABLE
+ static const unsigned baud[8] = { 115200, 57600, 38400, 19200, 9600, 4800, 2400, 1200 };
+ unsigned b_index = 0;
+#if defined(__PRE_RAM__) && CONFIG_USE_OPTION_TABLE
+ b_index = read_option(baud_rate, 0);
+ b_index &= 7;
+ uart_baud = baud[b_index];
+#else
+ if (get_option(&b_index, "baud_rate") == CB_SUCCESS)
+ uart_baud = baud[b_index];
+#endif
+#endif
+
+ /* Now find the UART base address and calculate the divisor */
+
+#if defined(MORE_TESTING) && !defined(__SIMPLE_DEVICE__)
+ device_t dev = dev_find_device(0x1415, 0xc158, NULL);
+ if (!dev)
+ dev = dev_find_device(0x1415, 0xc11b, NULL);
+
+ if (dev) {
+ struct resource *res = find_resource(dev, 0x10);
+
+ if (res) {
+ uart_bar = res->base + 0x1000; // for 1st UART
+ // uart_bar = res->base + 0x2000; // for 2nd UART
+ }
+ }
+
+ if (!uart_bar)
+#endif
+ uart_bar = CONFIG_OXFORD_OXPCIE_BASE_ADDRESS + 0x1000; // 1st UART
+ // uart_bar = CONFIG_OXFORD_OXPCIE_BASE_ADDRESS + 0x2000; // 2nd UART
+
+ div = 4000000 / uart_baud;
+
+ if (uart_bar)
+ uart8250_mem_init(uart_bar, div);
+
+ return uart_bar;
+}
diff --git a/src/include/uart8250.h b/src/include/uart8250.h
index a3868c5..493e32a 100644
--- a/src/include/uart8250.h
+++ b/src/include/uart8250.h
@@ -20,6 +20,8 @@
#ifndef UART8250_H
#define UART8250_H
+#include <types.h>
+
/* Data */
#define UART_RBR 0x00
#define UART_TBR 0x00
@@ -130,13 +132,8 @@ void uart8250_mem_tx_byte(unsigned base_port, unsigned char data);
void uart8250_mem_tx_flush(unsigned base_port);
void uart8250_mem_init(unsigned base_port, unsigned divisor);
u32 uart_mem_init(void);
+u32 uart8250_mem_get_baseaddr(void);
-#if defined(__PRE_RAM__) && CONFIG_DRIVERS_OXFORD_OXPCIE
-/* and special init for OXPCIe based cards */
-extern int oxford_oxpcie_present;
-
-void oxford_init(void);
-#endif
#endif
#endif /* UART8250_H */
diff --git a/src/lib/uart8250mem.c b/src/lib/uart8250mem.c
index 1482142..39dec37 100644
--- a/src/lib/uart8250mem.c
+++ b/src/lib/uart8250mem.c
@@ -20,8 +20,8 @@
#include <arch/io.h>
#include <uart8250.h>
-#include <pc80/mc146818rtc.h>
#if CONFIG_USE_OPTION_TABLE
+#include <pc80/mc146818rtc.h>
#include "option_table.h"
#endif
#include <device/device.h>
@@ -102,54 +102,3 @@ void uart8250_mem_init(unsigned base_port, unsigned divisor)
/* Set to 3 for 8N1 */
write8(base_port + UART_LCR, CONFIG_TTYS0_LCS);
}
-
-u32 uart_mem_init(void)
-{
- unsigned uart_baud = CONFIG_TTYS0_BAUD;
- u32 uart_bar = 0;
- unsigned div;
-
- /* find out the correct baud rate */
-#if !defined(__SMM__) && CONFIG_USE_OPTION_TABLE
- static const unsigned baud[8] = { 115200, 57600, 38400, 19200, 9600, 4800, 2400, 1200 };
- unsigned b_index = 0;
-#if defined(__PRE_RAM__)
- b_index = read_option(baud_rate, 0);
- b_index &= 7;
- uart_baud = baud[b_index];
-#else
- if (get_option(&b_index, "baud_rate") == CB_SUCCESS)
- uart_baud = baud[b_index];
-#endif
-#endif
-
- /* Now find the UART base address and calculate the divisor */
-#if CONFIG_DRIVERS_OXFORD_OXPCIE
-
-#if defined(MORE_TESTING) && !defined(__SIMPLE_DEVICE__)
- device_t dev = dev_find_device(0x1415, 0xc158, NULL);
- if (!dev)
- dev = dev_find_device(0x1415, 0xc11b, NULL);
-
- if (dev) {
- struct resource *res = find_resource(dev, 0x10);
-
- if (res) {
- uart_bar = res->base + 0x1000; // for 1st UART
- // uart_bar = res->base + 0x2000; // for 2nd UART
- }
- }
-
- if (!uart_bar)
-#endif
- uart_bar = CONFIG_OXFORD_OXPCIE_BASE_ADDRESS + 0x1000; // 1st UART
- // uart_bar = CONFIG_OXFORD_OXPCIE_BASE_ADDRESS + 0x2000; // 2nd UART
-
- div = 4000000 / uart_baud;
-#endif
-
- if (uart_bar)
- uart8250_mem_init(uart_bar, div);
-
- return uart_bar;
-}
More information about the coreboot-gerrit
mailing list