diff options
author | 2023-10-10 14:33:42 +0000 | |
---|---|---|
committer | 2023-10-10 14:33:42 +0000 | |
commit | af1a266670d040d2f4083ff309d732d648afba2a (patch) | |
tree | 2fc46203448ddcc6f81546d379abfaeb323575e9 /roms/skiboot/core/rtc.c | |
parent | e02cda008591317b1625707ff8e115a4841aa889 (diff) |
Change-Id: Iaf8d18082d3991dec7c0ebbea540f092188eb4ec
Diffstat (limited to 'roms/skiboot/core/rtc.c')
-rw-r--r-- | roms/skiboot/core/rtc.c | 62 |
1 files changed, 62 insertions, 0 deletions
diff --git a/roms/skiboot/core/rtc.c b/roms/skiboot/core/rtc.c new file mode 100644 index 000000000..3c0dda71e --- /dev/null +++ b/roms/skiboot/core/rtc.c @@ -0,0 +1,62 @@ +// SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later +/* + * Real Time Clock (RTC) Cache + * + * Copyright 2013-2014 IBM Corp. + */ + +#include <skiboot.h> +#include <lock.h> +#include <rtc.h> +#include <timebase.h> + +static struct lock rtc_tod_lock = LOCK_UNLOCKED; + +static struct { + struct tm tm; + unsigned long tb; + bool valid; +} rtc_tod_cache; + +void rtc_cache_update(struct tm *tm) +{ + lock(&rtc_tod_lock); + rtc_tod_cache.tb = mftb(); + rtc_tod_cache.tm = *tm; + rtc_tod_cache.valid = true; + unlock(&rtc_tod_lock); +} + +int rtc_cache_get(struct tm *tm) +{ + unsigned long cache_age_sec; + + lock(&rtc_tod_lock); + + if (!rtc_tod_cache.valid) { + unlock(&rtc_tod_lock); + return -1; + } + + cache_age_sec = tb_to_msecs(mftb() - rtc_tod_cache.tb) / 1000; + *tm = rtc_tod_cache.tm; + unlock(&rtc_tod_lock); + + tm->tm_sec += cache_age_sec; + mktime(tm); + + return 0; +} + +int rtc_cache_get_datetime(uint32_t *year_month_day, + uint64_t *hour_minute_second_millisecond) +{ + struct tm tm; + + if (rtc_cache_get(&tm) < 0) + return -1; + + tm_to_datetime(&tm, year_month_day, hour_minute_second_millisecond); + + return 0; +} |