[coreboot] New patch to review for coreboot: 6b91039 Add bootstrap to select loaded ramstage
Kyösti Mälkki (kyosti.malkki@gmail.com)
gerrit at coreboot.org
Thu Oct 20 20:08:17 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 6b910392411668b395536da4646d620f3efd2fc7
Author: Kyösti Mälkki <kyosti.malkki at gmail.com>
Date: Thu Oct 20 21:06:14 2011 +0300
Add bootstrap to select loaded ramstage
Just before loading ramstage, read the console serial port
pin (DCD). If it is high, select alternative prefix for ramstage.
Suggested use: During ramstage development, never overwrite
a stable combination of romstage, ramstage and payload on a flash
device. Instead, place the ramstage to test under the alternative
prefix.
Change-Id: Ib8b6984ddd886cd21638880c6f43dd90d078c844
Signed-off-by: Kyösti Mälkki <kyosti.malkki at gmail.com>
---
src/Kconfig | 13 +++++++++++++
src/arch/x86/lib/cbfs_and_run.c | 14 ++++++++++++++
src/arch/x86/lib/romstage_console.c | 7 +++++++
src/console/Kconfig | 9 +++++++++
src/include/console/console.h | 1 +
src/include/uart8250.h | 1 +
src/lib/uart8250.c | 5 +++++
7 files changed, 50 insertions(+), 0 deletions(-)
diff --git a/src/Kconfig b/src/Kconfig
index 525d452..a224cdf 100644
--- a/src/Kconfig
+++ b/src/Kconfig
@@ -46,6 +46,19 @@ config CBFS_PREFIX
Select the prefix to all files put into the image. It's "fallback"
by default, "normal" is a common alternative.
+config DUAL_RAMSTAGE
+ bool
+ default y if TTYS0_DCD_HOOK
+ default n
+
+config CBFS_ALT_PREFIX
+ string "Alternative CBFS prefix to use"
+ depends on DUAL_RAMSTAGE
+ default "normal"
+ help
+ Select the prefix for an alternative coreboot RAM stage.
+ You need some hardware bootstrap to make this choice at boottime.
+
choice
prompt "Compiler"
default COMPILER_GCC
diff --git a/src/arch/x86/lib/cbfs_and_run.c b/src/arch/x86/lib/cbfs_and_run.c
index ad36ddc..b4e6883 100644
--- a/src/arch/x86/lib/cbfs_and_run.c
+++ b/src/arch/x86/lib/cbfs_and_run.c
@@ -40,11 +40,25 @@ static void cbfs_and_run_core(const char *filename, unsigned ebp)
void __attribute__((regparm(0))) copy_and_run(unsigned cpu_reset)
{
+#if CONFIG_DUAL_RAMSTAGE
+ int bootstrap = 0;
+#endif
// FIXME fix input parameters instead normalizing them here.
if (cpu_reset == 1) cpu_reset = -1;
else cpu_reset = 0;
+ /* Go altenative way, if any bootstrap returns non-zero */
+#if CONFIG_TTYS0_DCD_HOOK
+ bootstrap += !!console_dcd();
+#endif
+#if CONFIG_DUAL_RAMSTAGE
+ if (! bootstrap)
+ cbfs_and_run_core(CONFIG_CBFS_PREFIX "/coreboot_ram", cpu_reset);
+ else
+ cbfs_and_run_core(CONFIG_CBFS_ALT_PREFIX "/coreboot_ram", cpu_reset);
+#else
cbfs_and_run_core(CONFIG_CBFS_PREFIX "/coreboot_ram", cpu_reset);
+#endif
}
#if CONFIG_AP_CODE_IN_CAR == 1
diff --git a/src/arch/x86/lib/romstage_console.c b/src/arch/x86/lib/romstage_console.c
index 8adb3ba..587e331 100644
--- a/src/arch/x86/lib/romstage_console.c
+++ b/src/arch/x86/lib/romstage_console.c
@@ -61,6 +61,13 @@ static void console_tx_flush(void)
#endif
}
+#if CONFIG_TTYS0_DCD_HOOK
+int console_dcd(void)
+{
+ return uart8250_dcd(CONFIG_TTYS0_BASE);
+}
+#endif
+
int do_printk(int msg_level, const char *fmt, ...)
{
va_list args;
diff --git a/src/console/Kconfig b/src/console/Kconfig
index 02244d7..ea16c0c 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 alternative ramstage"
+ 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
+ two ramstage prefixes.
+
# Use "select HAVE_USBDEBUG" on southbridges which have Debug Port code.
config HAVE_USBDEBUG
def_bool n
diff --git a/src/include/console/console.h b/src/include/console/console.h
index 8283f66..f37e7b5 100644
--- a/src/include/console/console.h
+++ b/src/include/console/console.h
@@ -62,6 +62,7 @@ extern int console_loglevel;
#ifndef __ROMCC__
void console_init(void);
+int console_dcd(void);
void post_code(u8 value);
void __attribute__ ((noreturn)) die(const char *msg);
int do_printk(int msg_level, const char *fmt, ...) __attribute__((format(printf, 2, 3)));
diff --git a/src/include/uart8250.h b/src/include/uart8250.h
index 4a02179..fe49161 100644
--- a/src/include/uart8250.h
+++ b/src/include/uart8250.h
@@ -138,6 +138,7 @@ void uart8250_tx_flush(unsigned base_port);
*/
void uart8250_init(unsigned base_port, unsigned divisor);
void uart_init(void);
+int uart8250_dcd(unsigned base_port);
/* and the same for memory mapped uarts */
unsigned char uart8250_mem_rx_byte(unsigned base_port);
diff --git a/src/lib/uart8250.c b/src/lib/uart8250.c
index b224671..3221a94 100644
--- a/src/lib/uart8250.c
+++ b/src/lib/uart8250.c
@@ -62,6 +62,11 @@ int uart8250_can_rx_byte(unsigned base_port)
return inb(base_port + UART_LSR) & UART_LSR_DR;
}
+int uart8250_dcd(unsigned base_port)
+{
+ return inb(base_port + UART_MSR) & UART_MSR_DCD;
+}
+
unsigned char uart8250_rx_byte(unsigned base_port)
{
while(!uart8250_can_rx_byte(base_port))
More information about the coreboot
mailing list