summaryrefslogtreecommitdiff
path: root/src/lib/fallback_boot.c
diff options
context:
space:
mode:
authorTimothy Pearson <tpearson@raptorengineeringinc.com>2015-11-01 02:13:17 -0600
committerMartin Roth <martinroth@google.com>2015-11-03 21:55:20 +0100
commit3bfd7cc61e73439a2b1ac2d85faa7aaa988969ed (patch)
tree2efc202d627313811141f9d42bf24d80cccd41a8 /src/lib/fallback_boot.c
parent2a4f58ac1283e45d1f0cc6102a319b6d442a888d (diff)
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@raptorengineeringinc.com> Reviewed-on: http://review.coreboot.org/12289 Reviewed-by: Nico Huber <nico.h@gmx.de> Tested-by: build bot (Jenkins) Reviewed-by: Ronald G. Minnich <rminnich@gmail.com>
Diffstat (limited to 'src/lib/fallback_boot.c')
-rw-r--r--src/lib/fallback_boot.c25
1 files changed, 15 insertions, 10 deletions
diff --git a/src/lib/fallback_boot.c b/src/lib/fallback_boot.c
index 74572df323..203071fc8a 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