diff options
author | Aaron Durbin <adurbin@chromium.org> | 2017-09-15 11:01:17 -0600 |
---|---|---|
committer | Aaron Durbin <adurbin@chromium.org> | 2017-09-20 23:53:23 +0000 |
commit | 9fde0d780dd0abd24119ff6f7854b4b5939ce7d2 (patch) | |
tree | 2a42e542b93e2dc73712182a634a9483f512cc1a /src/drivers/pc80/rtc | |
parent | aa51cd5c12596b0b6d5f61eb1108091bf3a4fd3f (diff) | |
download | coreboot-9fde0d780dd0abd24119ff6f7854b4b5939ce7d2.tar.xz |
vboot: remove init_vbnv_cmos()
Instead of having each potential caller deal with the differences
of cmos_init() and init_vbnv_cmos() when VBOOT is enabled put the
correct logic within the callee, cmos_init(), for handling the
vbnv in CMOS. The internal __cmos_init() routine returns when the
CMOS area was cleared.
BUG=b:63054105
Change-Id: Ia124bcd61d3ac03e899a4ecf3645fc4b7a558f03
Signed-off-by: Aaron Durbin <adurbin@chromium.org>
Reviewed-on: https://review.coreboot.org/21549
Reviewed-by: Furquan Shaikh <furquan@google.com>
Tested-by: build bot (Jenkins) <no-reply@coreboot.org>
Diffstat (limited to 'src/drivers/pc80/rtc')
-rw-r--r-- | src/drivers/pc80/rtc/mc146818rtc.c | 34 |
1 files changed, 31 insertions, 3 deletions
diff --git a/src/drivers/pc80/rtc/mc146818rtc.c b/src/drivers/pc80/rtc/mc146818rtc.c index 0e9a88ab5c..830ff09a59 100644 --- a/src/drivers/pc80/rtc/mc146818rtc.c +++ b/src/drivers/pc80/rtc/mc146818rtc.c @@ -26,6 +26,8 @@ #include <rtc.h> #include <string.h> #include <cbfs.h> +#include <vboot/vbnv.h> +#include <vboot/vbnv_layout.h> /* There's no way around this include guard. option_table.h is autogenerated */ #if IS_ENABLED(CONFIG_USE_OPTION_TABLE) @@ -95,7 +97,7 @@ static void cmos_set_checksum(int range_start, int range_end, int cks_loc) #define RTC_FREQ_SELECT_DEFAULT (RTC_REF_CLCK_32KHZ | RTC_RATE_1024HZ) #ifndef __SMM__ -void cmos_init(bool invalid) +static bool __cmos_init(bool invalid) { bool cmos_invalid; bool checksum_invalid = false; @@ -111,7 +113,7 @@ void cmos_init(bool invalid) * was due to the RTC alarm. */ if (acpi_is_wakeup_s3()) - return; + return false; #endif /* __PRE_RAM__ */ printk(BIOS_DEBUG, "RTC Init\n"); @@ -150,7 +152,8 @@ void cmos_init(bool invalid) cmos_invalid ? " Power Problem":"", checksum_invalid ? " Checksum invalid":"", clear_cmos ? " zeroing cmos":""); - } + } else + clear_cmos = false; /* Setup the real time clock */ cmos_write(RTC_CONTROL_DEFAULT, RTC_CONTROL); @@ -172,6 +175,31 @@ void cmos_init(bool invalid) /* Clear any pending interrupts */ cmos_read(RTC_INTR_FLAGS); + + return clear_cmos; +} + +static void cmos_init_vbnv(bool invalid) +{ + uint8_t vbnv[VBOOT_VBNV_BLOCK_SIZE]; + + /* __cmos_init() will clear vbnv contents when a known rtc failure + occurred with !CONFIG_USE_OPTION_TABLE. However, __cmos_init() may + clear vbnv data for other internal reasons. For that, always back up + the vbnv contents and conditionally save them when __cmos_init() + indicates cmos was cleared. */ + read_vbnv_cmos(vbnv); + + if (__cmos_init(invalid)) + save_vbnv_cmos(vbnv); +} + +void cmos_init(bool invalid) +{ + if (IS_ENABLED(CONFIG_VBOOT_VBNV_CMOS)) + cmos_init_vbnv(invalid); + else + __cmos_init(invalid); } #endif /* __SMM__ */ |