From 5a043fe08d84490356888d236ee7d190aa195217 Mon Sep 17 00:00:00 2001 From: Marshall Dawson Date: Sat, 5 Nov 2016 18:31:33 -0600 Subject: rtc: Check update-in-progress bit While the real-time clock updates its count, values may not be correctly read or written. On reads, ensure the UIP bit is clear which guarantees a minimum of 244 microseconds exists before the update begins. Writes already avoid the problem by disabling the RTC count via the SET bit. Change-Id: I39e34493113015d32582f1c280fafa9e97f43a40 Signed-off-by: Marshall Dawson Reviewed-on: https://review.coreboot.org/17369 Tested-by: build bot (Jenkins) Reviewed-by: Aaron Durbin Reviewed-by: Paul Menzel --- src/drivers/pc80/rtc/mc146818rtc.c | 2 ++ 1 file changed, 2 insertions(+) (limited to 'src/drivers/pc80') diff --git a/src/drivers/pc80/rtc/mc146818rtc.c b/src/drivers/pc80/rtc/mc146818rtc.c index 5fb9cf695b..c3026a4dbc 100644 --- a/src/drivers/pc80/rtc/mc146818rtc.c +++ b/src/drivers/pc80/rtc/mc146818rtc.c @@ -360,6 +360,7 @@ void cmos_check_update_date(void) u8 year, century; /* Assume hardware always supports RTC_CLK_ALTCENTURY. */ + wait_uip(); century = cmos_read(RTC_CLK_ALTCENTURY); year = cmos_read(RTC_CLK_YEAR); @@ -388,6 +389,7 @@ int rtc_set(const struct rtc_time *time) int rtc_get(struct rtc_time *time) { + wait_uip(); time->sec = bcd2bin(cmos_read(RTC_CLK_SECOND)); time->min = bcd2bin(cmos_read(RTC_CLK_MINUTE)); time->hour = bcd2bin(cmos_read(RTC_CLK_HOUR)); -- cgit v1.2.3