the following patch was just integrated into master:
commit 69b11f9d407057f0ea76784ecb0e9970cb7d0991
Author: Timothy Pearson <tpearson(a)raptorengineeringinc.com>
Date: Sun May 31 18:46:40 2015 -0500
northbridge/amd/amdmct/mct_ddr3: Fix S3 suspend overrunning the stack size limit
Change-Id: Id7441dacef2e46e283d1fc99d5e5fa3f20e0d097
Signed-off-by: Timothy Pearson <tpearson(a)raptorengineeringinc.com>
Reviewed-on: http://review.coreboot.org/11959
Tested-by: build bot (Jenkins)
Reviewed-by: Martin Roth <martinroth(a)google.com>
See http://review.coreboot.org/11959 for details.
-gerrit
the following patch was just integrated into master:
commit 502d457bf9c43e7b100007ca66fd8d61f49ffa61
Author: Timothy Pearson <tpearson(a)raptorengineeringinc.com>
Date: Sun May 10 04:37:56 2015 -0500
mainboard/asus/kgpe-d16: Set DDR3 memory voltage based on SPD data
Change-Id: I21777283ce0fd3c607951204a63ff67dc656c8cc
Signed-off-by: Timothy Pearson <tpearson(a)raptorengineeringinc.com>
Reviewed-on: http://review.coreboot.org/11956
Tested-by: build bot (Jenkins)
Reviewed-by: Martin Roth <martinroth(a)google.com>
See http://review.coreboot.org/11956 for details.
-gerrit
the following patch was just integrated into master:
commit 2a83935d9f50e3059e7747338a700c2fceb1731a
Author: Timothy Pearson <tpearson(a)raptorengineeringinc.com>
Date: Sat Sep 5 18:56:05 2015 -0500
northbridge/amd/amdfam10: Set DIMM voltage based on SPD data
Change-Id: I67a76cf0e4ebc33fbd7dd151bb68dce1fc6ba680
Signed-off-by: Timothy Pearson <tpearson(a)raptorengineeringinc.com>
Reviewed-on: http://review.coreboot.org/11957
Tested-by: build bot (Jenkins)
Reviewed-by: Felix Held <felix-coreboot(a)felixheld.de>
See http://review.coreboot.org/11957 for details.
-gerrit
Timothy Pearson (tpearson(a)raptorengineeringinc.com) just uploaded a new patch set to gerrit, which you can find at http://review.coreboot.org/12289
-gerrit
commit 7af6bdb5db7d4d82f7ced1685275c429dc250248
Author: Timothy Pearson <tpearson(a)raptorengineeringinc.com>
Date: Sun Nov 1 02:13:17 2015 -0600
drivers/pc80: Rework normal / fallback selector code
Per IRC and Gerrit discussion, the normal / fallback
selector code is a rather weak spot in coreboot, and
did not function correctly for certain use cases.
Rework the selector to more clearly indicate proper
operation, and also remove dead code. Also tentatively
abandon use of RTC bit 385; a follow-up patch will
remove said bit from all affected mainboards.
The correct operation of the fallback code selector
approximates that of a power line recloser, with
a user option to attempt normal boot that can be
cleared by firmware, but never set by firmware.
Additionally, if cleared by user, the fallback
path should always be used on the next reboot.
Change-Id: I753ae9f0710c524875a85354ac2547df0c305569
Signed-off-by: Timothy Pearson <tpearson(a)raptorengineeringinc.com>
---
src/Kconfig | 3 ++
src/drivers/pc80/mc146818rtc_early.c | 56 +++++++++++++++++++-----------------
src/include/pc80/mc146818rtc.h | 2 ++
src/lib/fallback_boot.c | 25 +++++++++-------
4 files changed, 49 insertions(+), 37 deletions(-)
diff --git a/src/Kconfig b/src/Kconfig
index 79d5994..865f7f5 100644
--- a/src/Kconfig
+++ b/src/Kconfig
@@ -268,9 +268,12 @@ config BOOTBLOCK_SOURCE
config SKIP_MAX_REBOOT_CNT_CLEAR
bool "Do not clear reboot count after successful boot"
default n
+ depends on BOOTBLOCK_NORMAL
help
Do not clear the reboot count immediately after successful boot.
Set to allow the payload to control normal/fallback image recovery.
+ Note that it is the responsibility of the payload to reset the
+ normal boot bit to 1 after each successsful boot.
config UPDATE_IMAGE
bool "Update existing coreboot.rom image"
diff --git a/src/drivers/pc80/mc146818rtc_early.c b/src/drivers/pc80/mc146818rtc_early.c
index 421af2f..268cfc2 100644
--- a/src/drivers/pc80/mc146818rtc_early.c
+++ b/src/drivers/pc80/mc146818rtc_early.c
@@ -41,12 +41,24 @@ static int cmos_chksum_valid(void)
#endif
}
+static inline __attribute__((unused)) int boot_count(uint8_t rtc_byte)
+{
+ return rtc_byte >> 4;
+}
-static inline __attribute__((unused)) int last_boot_normal(void)
+static inline __attribute__((unused)) uint8_t increment_boot_count(uint8_t rtc_byte)
{
- unsigned char byte;
- byte = cmos_read(RTC_BOOT_BYTE);
- return (byte & (1 << 1));
+ return rtc_byte + (1 << 4);
+}
+
+static inline __attribute__((unused)) uint8_t boot_set_fallback(uint8_t rtc_byte)
+{
+ return rtc_byte & ~RTC_BOOT_NORMAL;
+}
+
+static inline __attribute__((unused)) int boot_use_normal(uint8_t rtc_byte)
+{
+ return rtc_byte & RTC_BOOT_NORMAL;
}
static inline __attribute__((unused)) int do_normal_boot(void)
@@ -54,42 +66,32 @@ static inline __attribute__((unused)) int do_normal_boot(void)
unsigned char byte;
if (cmos_error() || !cmos_chksum_valid()) {
- /* There are no impossible values, no checksums so just
- * trust whatever value we have in the the cmos,
- * but clear the fallback bit.
+ /* Invalid CMOS checksum detected!
+ * Force fallback boot...
*/
byte = cmos_read(RTC_BOOT_BYTE);
- byte &= 0x0c;
- byte |= CONFIG_MAX_REBOOT_CNT << 4;
+ byte &= boot_set_fallback(byte) & 0x0f;
+ byte |= 0xf << 4;
cmos_write(byte, RTC_BOOT_BYTE);
}
/* The RTC_BOOT_BYTE is now o.k. see where to go. */
byte = cmos_read(RTC_BOOT_BYTE);
- if (!IS_ENABLED(CONFIG_SKIP_MAX_REBOOT_CNT_CLEAR))
- /* Are we in normal mode? */
- if (byte & 1)
- byte &= 0x0f; /* yes, clear the boot count */
-
- /* Properly set the last boot flag */
- byte &= 0xfc;
- if ((byte >> 4) < CONFIG_MAX_REBOOT_CNT) {
- byte |= (1<<1);
- }
-
- /* Are we already at the max count? */
- if ((byte >> 4) < CONFIG_MAX_REBOOT_CNT) {
- byte += 1 << 4; /* No, add 1 to the count */
- }
- else {
- byte &= 0xfc; /* Yes, put in fallback mode */
+ /* Are we attempting to boot normally? */
+ if (boot_use_normal(byte)) {
+ /* Are we already at the max count? */
+ if (boot_count(byte) < CONFIG_MAX_REBOOT_CNT)
+ byte = increment_boot_count(byte);
+ else
+ byte = boot_set_fallback(byte);
}
/* Save the boot byte */
cmos_write(byte, RTC_BOOT_BYTE);
- return (byte & (1<<1));
+ /* Return selected code path for this boot attempt */
+ return boot_use_normal(byte);
}
unsigned read_option_lowlevel(unsigned start, unsigned size, unsigned def)
diff --git a/src/include/pc80/mc146818rtc.h b/src/include/pc80/mc146818rtc.h
index 0e15273..38f2ad0 100644
--- a/src/include/pc80/mc146818rtc.h
+++ b/src/include/pc80/mc146818rtc.h
@@ -25,6 +25,8 @@
**********************************************************************/
#define RTC_FREQ_SELECT RTC_REG_A
+#define RTC_BOOT_NORMAL 0x1
+
/* update-in-progress - set to "1" 244 microsecs before RTC goes off the bus,
* reset after update (may take 1.984ms @ 32768Hz RefClock) is complete,
* totaling to a max high interval of 2.228 ms.
diff --git a/src/lib/fallback_boot.c b/src/lib/fallback_boot.c
index 74572df..203071f 100644
--- a/src/lib/fallback_boot.c
+++ b/src/lib/fallback_boot.c
@@ -8,23 +8,28 @@
static void set_boot_successful(void)
{
- /* Remember I successfully booted by setting
- * the initial boot direction
- * to the direction that I booted.
- */
- unsigned char index, byte;
+ uint8_t index, byte;
+
index = inb(RTC_PORT(0)) & 0x80;
index |= RTC_BOOT_BYTE;
outb(index, RTC_PORT(0));
byte = inb(RTC_PORT(1));
- byte &= 0xfe;
- byte |= (byte & (1 << 1)) >> 1;
- /* If we are in normal mode set the boot count to 0 */
- if (!IS_ENABLED(CONFIG_SKIP_MAX_REBOOT_CNT_CLEAR))
- if(byte & 1)
+ if (IS_ENABLED(CONFIG_SKIP_MAX_REBOOT_CNT_CLEAR)) {
+ /* Set the fallback boot bit to allow for recovery if
+ * the payload fails to boot.
+ * It is the responsibility of the payload to reset
+ * the normal boot bit to 1 if desired
+ */
+ byte &= ~RTC_BOOT_NORMAL;
+ } else {
+ /* If we are in normal mode set the boot count to 0 */
+ if (byte & RTC_BOOT_NORMAL)
byte &= 0x0f;
+
+ }
+
outb(byte, RTC_PORT(1));
}
#else
Timothy Pearson (tpearson(a)raptorengineeringinc.com) just uploaded a new patch set to gerrit, which you can find at http://review.coreboot.org/12289
-gerrit
commit a8b694c823e869258b2319ff8872ff6ced30250c
Author: Timothy Pearson <tpearson(a)raptorengineeringinc.com>
Date: Sun Nov 1 02:13:17 2015 -0600
drivers/pc80: Rework normal / fallback selector code
Per IRC and Gerrit discussion, the normal / fallback
selector code is a rather weak spot in coreboot, and
did not function correctly for certain use cases.
Rework the selector to more clearly indicate proper
operation, and also remove dead code. Also tentatively
abandon use of RTC bit 385; a follow-up patch will
remove said bit from all affected mainboards.
The correct operation of the fallback code selector
approximates that of a power line recloser, with
a user option to attempt normal boot that can be
cleared by firmware, but never set by firmware.
Additionally, if cleared by user, the fallback
path should always be used on the next reboot.
Change-Id: I753ae9f0710c524875a85354ac2547df0c305569
Signed-off-by: Timothy Pearson <tpearson(a)raptorengineeringinc.com>
---
src/Kconfig | 2 ++
src/drivers/pc80/mc146818rtc_early.c | 56 +++++++++++++++++++-----------------
src/include/pc80/mc146818rtc.h | 2 ++
src/lib/fallback_boot.c | 25 +++++++++-------
4 files changed, 48 insertions(+), 37 deletions(-)
diff --git a/src/Kconfig b/src/Kconfig
index 79d5994..38cec16 100644
--- a/src/Kconfig
+++ b/src/Kconfig
@@ -271,6 +271,8 @@ config SKIP_MAX_REBOOT_CNT_CLEAR
help
Do not clear the reboot count immediately after successful boot.
Set to allow the payload to control normal/fallback image recovery.
+ Note that it is the responsibility of the payload to reset the
+ normal boot bit to 1 after each successsful boot.
config UPDATE_IMAGE
bool "Update existing coreboot.rom image"
diff --git a/src/drivers/pc80/mc146818rtc_early.c b/src/drivers/pc80/mc146818rtc_early.c
index 421af2f..d09dbe0 100644
--- a/src/drivers/pc80/mc146818rtc_early.c
+++ b/src/drivers/pc80/mc146818rtc_early.c
@@ -41,12 +41,24 @@ static int cmos_chksum_valid(void)
#endif
}
+static inline __attribute__((unused)) int boot_count(uint8_t rtc_byte)
+{
+ return rtc_byte >> 4;
+}
-static inline __attribute__((unused)) int last_boot_normal(void)
+static inline __attribute__((unused)) uint8_t increment_boot_count(uint8_t rtc_byte)
{
- unsigned char byte;
- byte = cmos_read(RTC_BOOT_BYTE);
- return (byte & (1 << 1));
+ return rtc_byte + (1 << 4);
+}
+
+static inline __attribute__((unused)) uint8_t boot_set_fallback(uint8_t rtc_byte)
+{
+ return rtc_byte & ~RTC_BOOT_NORMAL;
+}
+
+static inline __attribute__((unused)) int boot_use_normal(uint8_t rtc_byte)
+{
+ return rtc_byte & RTC_BOOT_NORMAL;
}
static inline __attribute__((unused)) int do_normal_boot(void)
@@ -54,42 +66,32 @@ static inline __attribute__((unused)) int do_normal_boot(void)
unsigned char byte;
if (cmos_error() || !cmos_chksum_valid()) {
- /* There are no impossible values, no checksums so just
- * trust whatever value we have in the the cmos,
- * but clear the fallback bit.
+ /* Invalid CMOS checksum detected!
+ * Force fallback boot...
*/
byte = cmos_read(RTC_BOOT_BYTE);
- byte &= 0x0c;
- byte |= CONFIG_MAX_REBOOT_CNT << 4;
+ byte &= boot_set_fallback(byte) & 0x0f;
+ byte |= 0xf << 4;
cmos_write(byte, RTC_BOOT_BYTE);
}
/* The RTC_BOOT_BYTE is now o.k. see where to go. */
byte = cmos_read(RTC_BOOT_BYTE);
- if (!IS_ENABLED(CONFIG_SKIP_MAX_REBOOT_CNT_CLEAR))
- /* Are we in normal mode? */
- if (byte & 1)
- byte &= 0x0f; /* yes, clear the boot count */
-
- /* Properly set the last boot flag */
- byte &= 0xfc;
- if ((byte >> 4) < CONFIG_MAX_REBOOT_CNT) {
- byte |= (1<<1);
- }
-
- /* Are we already at the max count? */
- if ((byte >> 4) < CONFIG_MAX_REBOOT_CNT) {
- byte += 1 << 4; /* No, add 1 to the count */
- }
- else {
- byte &= 0xfc; /* Yes, put in fallback mode */
+ /* Are we attempting to boot normally? */
+ if (byte & RTC_BOOT_NORMAL) {
+ /* Are we already at the max count? */
+ if (boot_count(byte) < CONFIG_MAX_REBOOT_CNT)
+ byte = increment_boot_count(byte);
+ else
+ byte = boot_set_fallback(byte);
}
/* Save the boot byte */
cmos_write(byte, RTC_BOOT_BYTE);
- return (byte & (1<<1));
+ /* Return selected code path for this boot attempt */
+ return boot_use_normal(byte);
}
unsigned read_option_lowlevel(unsigned start, unsigned size, unsigned def)
diff --git a/src/include/pc80/mc146818rtc.h b/src/include/pc80/mc146818rtc.h
index 0e15273..38f2ad0 100644
--- a/src/include/pc80/mc146818rtc.h
+++ b/src/include/pc80/mc146818rtc.h
@@ -25,6 +25,8 @@
**********************************************************************/
#define RTC_FREQ_SELECT RTC_REG_A
+#define RTC_BOOT_NORMAL 0x1
+
/* update-in-progress - set to "1" 244 microsecs before RTC goes off the bus,
* reset after update (may take 1.984ms @ 32768Hz RefClock) is complete,
* totaling to a max high interval of 2.228 ms.
diff --git a/src/lib/fallback_boot.c b/src/lib/fallback_boot.c
index 74572df..203071f 100644
--- a/src/lib/fallback_boot.c
+++ b/src/lib/fallback_boot.c
@@ -8,23 +8,28 @@
static void set_boot_successful(void)
{
- /* Remember I successfully booted by setting
- * the initial boot direction
- * to the direction that I booted.
- */
- unsigned char index, byte;
+ uint8_t index, byte;
+
index = inb(RTC_PORT(0)) & 0x80;
index |= RTC_BOOT_BYTE;
outb(index, RTC_PORT(0));
byte = inb(RTC_PORT(1));
- byte &= 0xfe;
- byte |= (byte & (1 << 1)) >> 1;
- /* If we are in normal mode set the boot count to 0 */
- if (!IS_ENABLED(CONFIG_SKIP_MAX_REBOOT_CNT_CLEAR))
- if(byte & 1)
+ if (IS_ENABLED(CONFIG_SKIP_MAX_REBOOT_CNT_CLEAR)) {
+ /* Set the fallback boot bit to allow for recovery if
+ * the payload fails to boot.
+ * It is the responsibility of the payload to reset
+ * the normal boot bit to 1 if desired
+ */
+ byte &= ~RTC_BOOT_NORMAL;
+ } else {
+ /* If we are in normal mode set the boot count to 0 */
+ if (byte & RTC_BOOT_NORMAL)
byte &= 0x0f;
+
+ }
+
outb(byte, RTC_PORT(1));
}
#else
Timothy Pearson (tpearson(a)raptorengineeringinc.com) just uploaded a new patch set to gerrit, which you can find at http://review.coreboot.org/11963
-gerrit
commit 6b5a233cbf8b8f493f466cb9af7a455cd73de876
Author: Timothy Pearson <tpearson(a)raptorengineeringinc.com>
Date: Sat Sep 5 19:31:20 2015 -0500
cpu/x86/lapic: Add stack overrun detection
Change-Id: I03e43f38e0d2e51141208ebb169ad8deba77ab78
Signed-off-by: Timothy Pearson <tpearson(a)raptorengineeringinc.com>
---
src/cpu/x86/lapic/lapic_cpu_init.c | 2 ++
1 file changed, 2 insertions(+)
diff --git a/src/cpu/x86/lapic/lapic_cpu_init.c b/src/cpu/x86/lapic/lapic_cpu_init.c
index e5404e5..ef150a5 100644
--- a/src/cpu/x86/lapic/lapic_cpu_init.c
+++ b/src/cpu/x86/lapic/lapic_cpu_init.c
@@ -5,6 +5,7 @@
* Copyright (C) 2001 Ronald G. Minnich
* Copyright (C) 2005 Yinghai Lu
* Copyright (C) 2008 coresystems GmbH
+ * Copyright (C) 2015 Timothy Pearson <tpearson(a)raptorengineeringinc.com>, Raptor Engineering
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
@@ -490,6 +491,7 @@ static void wait_other_cpus_stop(struct bus *cpu_bus)
}
}
printk(BIOS_DEBUG, "All AP CPUs stopped (%ld loops)\n", loopcount);
+ checkstack(_estack, 0);
for(i = 1; i <= last_cpu_index; i++)
checkstack((void *)stacks[i] + CONFIG_STACK_SIZE, i);
}