From eaf4cd02d38946a701f2174b9b8d44156e006eaf Mon Sep 17 00:00:00 2001 From: Alistair Popple Date: Thu, 13 Nov 2014 17:16:01 +1100 Subject: rtc: Add a generic rtc cache Some of the generic skiboot code needs access to the rtc (for example the pel logging code). Currently this is accessed via a call to fsp specific code which implements an rtc cache. Obviously this wont work on systems without a fsp. This patch makes the rtc cache generic so that we can get the time on other platforms (assuming they have some kind of rtc). Signed-off-by: Alistair Popple Signed-off-by: Stewart Smith --- core/Makefile.inc | 2 +- core/pel.c | 5 ++-- core/rtc.c | 69 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 73 insertions(+), 3 deletions(-) create mode 100644 core/rtc.c (limited to 'core') diff --git a/core/Makefile.inc b/core/Makefile.inc index 615b27b..8540695 100644 --- a/core/Makefile.inc +++ b/core/Makefile.inc @@ -7,7 +7,7 @@ CORE_OBJS += timebase.o opal-msg.o pci.o pci-opal.o fast-reboot.o CORE_OBJS += device.o exceptions.o trace.o affinity.o vpd.o CORE_OBJS += hostservices.o platform.o nvram.o flash-nvram.o hmi.o CORE_OBJS += console-log.o ipmi.o time-utils.o pel.o pool.o errorlog.o -CORE_OBJS += timer.o i2c.o +CORE_OBJS += timer.o i2c.o rtc.o CORE=core/built-in.o CFLAGS_SKIP_core/relocate.o = -pg -fstack-protector-all diff --git a/core/pel.c b/core/pel.c index 5cbb3f1..faa622b 100644 --- a/core/pel.c +++ b/core/pel.c @@ -3,6 +3,7 @@ #include #include #include +#include /* Create MTMS section for sapphire log */ static void create_mtms_section(struct errorlog *elog_data, @@ -56,7 +57,7 @@ static void create_extended_header_section(struct errorlog *elog_data, memset(extdhdr->opal_subsys_version, 0x00, sizeof(extdhdr->opal_subsys_version)); - fsp_rtc_get_cached_tod(&extdhdr->extended_header_date, &extd_time); + rtc_cache_get_datetime(&extdhdr->extended_header_date, &extd_time); extdhdr->extended_header_time = extd_time >> 32; extdhdr->opal_symid_len = 0; @@ -159,7 +160,7 @@ static void create_private_header_section(struct errorlog *elog_data, privhdr->v6header.component_id = elog_data->component_id; privhdr->plid = elog_data->plid; - fsp_rtc_get_cached_tod(&privhdr->create_date, &ctime); + rtc_cache_get_datetime(&privhdr->create_date, &ctime); privhdr->create_time = ctime >> 32; privhdr->section_count = 5; diff --git a/core/rtc.c b/core/rtc.c new file mode 100644 index 0000000..60d2d85 --- /dev/null +++ b/core/rtc.c @@ -0,0 +1,69 @@ +/* Copyright 2013-2014 IBM Corp. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + * implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + +#include +#include +#include +#include + +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) + 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; +} -- cgit v1.1