[coreboot] Patch set updated for coreboot: 586d9a5 Add bootstrap to select loaded romstage
Kyösti Mälkki (kyosti.malkki@gmail.com)
gerrit at coreboot.org
Fri Oct 28 17:55:15 CEST 2011
Kyösti Mälkki (kyosti.malkki at gmail.com) just uploaded a new patch set to gerrit, which you can find at http://review.coreboot.org/304
-gerrit
commit 586d9a5f5480080210a40b15b8833bf992e9d6e6
Author: Kyösti Mälkki <kyosti.malkki at gmail.com>
Date: Thu Oct 27 17:04:39 2011 +0300
Add bootstrap to select loaded romstage
Just before loading romstage, read the console serial port
pin (DCD). The level determines whether normal or fallback boots.
Change-Id: Ib8b6984ddd886cd21638880c6f43dd90d078c844
Signed-off-by: Kyösti Mälkki <kyosti.malkki at gmail.com>
---
src/arch/x86/init/bootblock_normal.c | 9 ++++++-
src/arch/x86/init/bootblock_simple.c | 16 +++++++++++-
src/arch/x86/init/bootstrap_dcd.h | 41 ++++++++++++++++++++++++++++++++++
src/console/Kconfig | 9 +++++++
4 files changed, 72 insertions(+), 3 deletions(-)
diff --git a/src/arch/x86/init/bootblock_normal.c b/src/arch/x86/init/bootblock_normal.c
index db9d0f9..f3f4e50 100644
--- a/src/arch/x86/init/bootblock_normal.c
+++ b/src/arch/x86/init/bootblock_normal.c
@@ -1,5 +1,6 @@
#include <bootblock_common.h>
#include <pc80/mc146818rtc.h>
+#include "bootstrap_dcd.h"
static void main(unsigned long bist)
{
@@ -14,7 +15,13 @@ static void main(unsigned long bist)
#endif
unsigned long entry;
- if (do_normal_boot())
+ int boot_mode = do_normal_boot();
+
+#if CONFIG_TTYS0_DCD_HOOK
+ /* high DCD overrides to fallback */
+ boot_mode &= !early_dcd_hook();
+#endif
+ if (boot_mode)
entry = findstage("normal/romstage");
else
entry = findstage("fallback/romstage");
diff --git a/src/arch/x86/init/bootblock_simple.c b/src/arch/x86/init/bootblock_simple.c
index 5d7c611..f5f3158 100644
--- a/src/arch/x86/init/bootblock_simple.c
+++ b/src/arch/x86/init/bootblock_simple.c
@@ -1,4 +1,5 @@
#include <bootblock_common.h>
+#include "bootstrap_dcd.h"
static void main(unsigned long bist)
{
@@ -12,10 +13,21 @@ static void main(unsigned long bist)
sanitize_cmos();
#endif
- const char* target1 = "fallback/romstage";
unsigned long entry;
- entry = findstage(target1);
+ int boot_mode = 0;
+
+#if CONFIG_TTYS0_DCD_HOOK
+ /* DCD high selects normal */
+ boot_mode = early_dcd_hook();
+#endif
+ if (boot_mode)
+ entry = findstage("normal/romstage");
+ else
+ entry = findstage("fallback/romstage");
+
if (entry) call(entry, bist);
+
+ /* duh. we're stuck */
asm volatile ("1:\n\thlt\n\tjmp 1b\n\t");
}
diff --git a/src/arch/x86/init/bootstrap_dcd.h b/src/arch/x86/init/bootstrap_dcd.h
new file mode 100644
index 0000000..956b116
--- /dev/null
+++ b/src/arch/x86/init/bootstrap_dcd.h
@@ -0,0 +1,41 @@
+#include <arch/io.h>
+#include <device/pnp_def.h>
+#include <arch/romcc_io.h>
+#include <uart8250.h>
+
+/* grab from devicetree.cb ? */
+#define EARLY_SERIAL_DEV PNP_DEV(0x2e, 0x04)
+#define EARLY_TTYS0_BASE 0x3f8
+
+#if CONFIG_TTYS0_DCD_HOOK
+static int early_dcd_hook(void)
+{
+ device_t dev = EARLY_SERIAL_DEV;
+ u16 port = dev >> 8;
+ u16 base;
+ u8 dcd, i;
+
+ /* power-up uart, set base if not already set */
+ outb(0x55, port);
+ pnp_set_logical_device(dev);
+ pnp_set_enable(dev, 0);
+ base = pnp_read_iobase(dev, PNP_IDX_IO0);
+ if (!base) {
+ base = EARLY_TTYS0_BASE;
+ pnp_set_iobase(dev, PNP_IDX_IO0, base);
+ }
+ pnp_set_enable(dev, 1);
+ outb(0xaa, port);
+
+ /* assert DTR, so you can jump-wire DCD high */
+ outb(UART_MCR_DTR, base + UART_MCR);
+
+ /* just powered up.. better not to trust the first value */
+ i = 0;
+ do {
+ dcd = !!(inb(base + UART_MSR) & UART_MSR_DCD);
+ } while (++i<10);
+ return dcd;
+}
+#endif
+
diff --git a/src/console/Kconfig b/src/console/Kconfig
index 8382695..b1b2fc8 100644
--- a/src/console/Kconfig
+++ b/src/console/Kconfig
@@ -91,6 +91,15 @@ config TTYS0_LCS
default 3
depends on CONSOLE_SERIAL8250 || CONSOLE_SERIAL8250MEM
+config TTYS0_DCD_HOOK
+ bool "DCD line is bootstrap to select romstage"
+ default n
+ depends on CONSOLE_SERIAL8250
+ help
+ Status of DCD line on the selected serial debug console
+ port is read at boot-time, and is used to choose from
+ the two romstage prefixes.
+
# Use "select HAVE_USBDEBUG" on southbridges which have Debug Port code.
config HAVE_USBDEBUG
def_bool n
More information about the coreboot
mailing list