diff options
author | Kyösti Mälkki <kyosti.malkki@gmail.com> | 2016-12-11 12:56:37 +0200 |
---|---|---|
committer | Nico Huber <nico.h@gmx.de> | 2016-12-13 19:15:22 +0100 |
commit | 7ce1a75602c30c0680992265e52c08c292af2d7f (patch) | |
tree | eeb47a959eda6ebc45cd152549922bbb6b2f8b30 /src/drivers | |
parent | 16b3e4bd2c2dbc14c42be85cca60ea647e60bd99 (diff) | |
download | coreboot-7ce1a75602c30c0680992265e52c08c292af2d7f.tar.xz |
pc80: Move set_boot_successful()
Don't implement arch or driver -specific code under lib/,
Change-Id: If75980ec5efc622582e2b5e124ad0e7ee3fa39a3
Signed-off-by: Kyösti Mälkki <kyosti.malkki@gmail.com>
Reviewed-on: https://review.coreboot.org/17793
Tested-by: build bot (Jenkins)
Reviewed-by: Martin Roth <martinroth@google.com>
Diffstat (limited to 'src/drivers')
-rw-r--r-- | src/drivers/pc80/rtc/mc146818rtc.c | 34 |
1 files changed, 34 insertions, 0 deletions
diff --git a/src/drivers/pc80/rtc/mc146818rtc.c b/src/drivers/pc80/rtc/mc146818rtc.c index adbc611e14..0d36b004a6 100644 --- a/src/drivers/pc80/rtc/mc146818rtc.c +++ b/src/drivers/pc80/rtc/mc146818rtc.c @@ -15,7 +15,9 @@ */ #include <arch/acpi.h> +#include <arch/io.h> #include <bcd.h> +#include <fallback.h> #include <stdint.h> #include <version.h> #include <console/console.h> @@ -404,3 +406,35 @@ int rtc_get(struct rtc_time *time) time->wday = bcd2bin(cmos_read(RTC_CLK_DAYOFWEEK)) - 1; return 0; } + +/* + * Signal coreboot proper completed -- just before running payload + * or jumping to ACPI S3 wakeup vector. + */ +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)); +} |