drivers/pc80/rtc: Make use of alt-century byte configurable

This legacy alt-century byte sits amidst CMOS and conflicts many option
tables. It usually has no meaning to the hardware and needs to be main-
tained manually. Let's disable its usage by default if the CMOS option
table is enabled.

Change-Id: Ifba3d77120c2474393ac5e64faac1baeeb58c893
Signed-off-by: Nico Huber <nico.h@gmx.de>
Reviewed-on: https://review.coreboot.org/c/coreboot/+/56214
Tested-by: build bot (Jenkins) <no-reply@coreboot.org>
Reviewed-by: Angel Pons <th3fanbus@gmail.com>
Reviewed-by: Werner Zeh <werner.zeh@siemens.com>
This commit is contained in:
Nico Huber 2021-07-12 17:10:59 +02:00
parent 4df5779ba9
commit dee281d03f
2 changed files with 19 additions and 7 deletions

View File

@ -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.

View File

@ -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;
}