diff options
| author | Austin Zhang <austin.zhang@dell.com> | 2022-01-13 17:13:25 +0000 |
|---|---|---|
| committer | Eric van Gyzen <vangyzen@FreeBSD.org> | 2022-01-13 17:24:00 +0000 |
| commit | e1ef6c0ef256f797d629b9490db3f0034b28ae43 (patch) | |
| tree | 5ef04bc3a4554a47e348cbffc9c5bef53459410d /sys/x86 | |
| parent | 900a792250c2e8824ce7ebc49fef59ba6e82c9a4 (diff) | |
Diffstat (limited to 'sys/x86')
| -rw-r--r-- | sys/x86/isa/atrtc.c | 37 |
1 files changed, 31 insertions, 6 deletions
diff --git a/sys/x86/isa/atrtc.c b/sys/x86/isa/atrtc.c index cad8015435d0..aff838c53851 100644 --- a/sys/x86/isa/atrtc.c +++ b/sys/x86/isa/atrtc.c @@ -79,6 +79,7 @@ MTX_SYSINIT(atrtc_time_lock_init, &atrtc_time_lock, "atrtc_time", MTX_DEF); int atrtcclock_disable = 0; +static int rtc_century = 0; static int rtc_reg = -1; static u_char rtc_statusa = RTCSA_DIVIDER | RTCSA_NOPROF; static u_char rtc_statusb = RTCSB_24HR; @@ -421,6 +422,31 @@ atrtc_acpi_disabled(void) } static int +rtc_acpi_century_get(void) +{ +#ifdef DEV_ACPI + ACPI_TABLE_FADT *fadt; + vm_paddr_t physaddr; + int century; + + physaddr = acpi_find_table(ACPI_SIG_FADT); + if (physaddr == 0) + return (0); + + fadt = acpi_map_table(physaddr, ACPI_SIG_FADT); + if (fadt == NULL) + return (0); + + century = fadt->Century; + acpi_unmap_table(fadt); + + return (century); +#else + return (0); +#endif +} + +static int atrtc_probe(device_t dev) { int result; @@ -435,6 +461,7 @@ atrtc_probe(device_t dev) device_set_desc(dev, "AT realtime clock"); return (BUS_PROBE_LOW_PRIORITY); } + rtc_century = rtc_acpi_century_get(); return (result); } @@ -548,9 +575,8 @@ atrtc_settime(device_t dev __unused, struct timespec *ts) rtcout_locked(RTC_DAY, bct.day); rtcout_locked(RTC_MONTH, bct.mon); rtcout_locked(RTC_YEAR, bct.year & 0xff); -#ifdef USE_RTC_CENTURY - rtcout_locked(RTC_CENTURY, bct.year >> 8); -#endif + if (rtc_century) + rtcout_locked(rtc_century, bct.year >> 8); /* * Re-enable RTC updates and interrupts. @@ -592,9 +618,8 @@ atrtc_gettime(device_t dev, struct timespec *ts) bct.day = rtcin_locked(RTC_DAY); bct.mon = rtcin_locked(RTC_MONTH); bct.year = rtcin_locked(RTC_YEAR); -#ifdef USE_RTC_CENTURY - bct.year |= rtcin_locked(RTC_CENTURY) << 8; -#endif + if (rtc_century) + bct.year |= rtcin_locked(rtc_century) << 8; mtx_unlock_spin(&atrtc_lock); mtx_unlock(&atrtc_time_lock); /* dow is unused in timespec conversion and we have no nsec info. */ |
