diff --git a/src/drivers/pc80/rtc/Kconfig b/src/drivers/pc80/rtc/Kconfig index 350863e99a..0d064571e6 100644 --- a/src/drivers/pc80/rtc/Kconfig +++ b/src/drivers/pc80/rtc/Kconfig @@ -2,3 +2,10 @@ config DRIVERS_MC146818 bool default y if ARCH_X86 depends on PC80_SYSTEM + +config USE_PC_CMOS_ALTCENTURY + bool "Use legacy-BIOS alt-century byte in CMOS" + default y if !USE_OPTION_TABLE + depends on DRIVERS_MC146818 + help + May be useful for legacy OSes that assume its presence. diff --git a/src/drivers/pc80/rtc/mc146818rtc.c b/src/drivers/pc80/rtc/mc146818rtc.c index 42671a94a0..9153a03fd0 100644 --- a/src/drivers/pc80/rtc/mc146818rtc.c +++ b/src/drivers/pc80/rtc/mc146818rtc.c @@ -191,11 +191,11 @@ static int cmos_date_invalid(void) */ void cmos_check_update_date(void) { - u8 year, century; + u8 year, century = 0; - /* Assume hardware always supports RTC_CLK_ALTCENTURY. */ wait_uip(); - century = cmos_read(RTC_CLK_ALTCENTURY); + if (CONFIG(USE_PC_CMOS_ALTCENTURY)) + century = cmos_read(RTC_CLK_ALTCENTURY); year = cmos_read(RTC_CLK_YEAR); /* @@ -215,8 +215,8 @@ int rtc_set(const struct rtc_time *time) cmos_write(bin2bcd(time->mday), RTC_CLK_DAYOFMONTH); cmos_write(bin2bcd(time->mon), RTC_CLK_MONTH); cmos_write(bin2bcd(time->year % 100), RTC_CLK_YEAR); - /* Same assumption as above: We always have RTC_CLK_ALTCENTURY */ - cmos_write(bin2bcd(time->year / 100), RTC_CLK_ALTCENTURY); + if (CONFIG(USE_PC_CMOS_ALTCENTURY)) + cmos_write(bin2bcd(time->year / 100), RTC_CLK_ALTCENTURY); cmos_write(bin2bcd(time->wday + 1), RTC_CLK_DAYOFWEEK); return 0; } @@ -230,8 +230,13 @@ int rtc_get(struct rtc_time *time) time->mday = bcd2bin(cmos_read(RTC_CLK_DAYOFMONTH)); time->mon = bcd2bin(cmos_read(RTC_CLK_MONTH)); time->year = bcd2bin(cmos_read(RTC_CLK_YEAR)); - /* Same assumption as above: We always have RTC_CLK_ALTCENTURY */ - time->year += bcd2bin(cmos_read(RTC_CLK_ALTCENTURY)) * 100; + if (CONFIG(USE_PC_CMOS_ALTCENTURY)) { + time->year += bcd2bin(cmos_read(RTC_CLK_ALTCENTURY)) * 100; + } else { + time->year += 1900; + if (time->year < 1970) + time->year += 100; + } time->wday = bcd2bin(cmos_read(RTC_CLK_DAYOFWEEK)) - 1; return 0; }