| /* SPDX-License-Identifier: GPL-2.0-only */ |
| |
| #include <console/console.h> |
| #include <device/pci_def.h> |
| #include <device/pci_ops.h> |
| #include <security/vboot/vbnv.h> |
| #include <pc80/mc146818rtc.h> |
| #include <elog.h> |
| #include "pmutil.h" |
| #include "rtc.h" |
| |
| /* PCI Configuration Space (D31:F0): LPC */ |
| #if defined(__SIMPLE_DEVICE__) |
| #define PCH_LPC_DEV PCI_DEV(0, 0x1f, 0) |
| #else |
| #define PCH_LPC_DEV pcidev_on_root(0x1f, 0) |
| #endif |
| |
| int rtc_failure(void) |
| { |
| return !!(pci_read_config8(PCH_LPC_DEV, D31F0_GEN_PMCON_3) |
| & RTC_BATTERY_DEAD); |
| } |
| |
| void sb_rtc_init(void) |
| { |
| int rtc_failed = rtc_failure(); |
| |
| if (rtc_failed) { |
| if (CONFIG(ELOG)) |
| elog_add_event(ELOG_TYPE_RTC_RESET); |
| pci_update_config8(PCH_LPC_DEV, D31F0_GEN_PMCON_3, |
| ~RTC_BATTERY_DEAD, 0); |
| } |
| |
| printk(BIOS_DEBUG, "RTC: failed = 0x%x\n", rtc_failed); |
| |
| cmos_init(rtc_failed); |
| } |
| |
| int vbnv_cmos_failed(void) |
| { |
| return rtc_failure(); |
| } |