coreboot-kgpe-d16/src/lib/fallback_boot.c
Timothy Pearson 3bfd7cc61e 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>
2015-11-03 21:55:20 +01:00

54 lines
1.1 KiB
C

#include <console/console.h>
#include <fallback.h>
#include <watchdog.h>
#include <arch/io.h>
#if CONFIG_PC80_SYSTEM
#include <pc80/mc146818rtc.h>
static void set_boot_successful(void)
{
uint8_t index, byte;
index = inb(RTC_PORT(0)) & 0x80;
index |= RTC_BOOT_BYTE;
outb(index, RTC_PORT(0));
byte = inb(RTC_PORT(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
static void set_boot_successful(void)
{
/* To be implemented */
}
#endif
void boot_successful(void)
{
#if CONFIG_FRAMEBUFFER_SET_VESA_MODE && !CONFIG_FRAMEBUFFER_KEEP_VESA_MODE
void vbe_textmode_console(void);
vbe_textmode_console();
#endif
/* Remember this was a successful boot */
set_boot_successful();
/* turn off the boot watchdog */
watchdog_off();
}