[coreboot] libpayload: add gettimeofday()
Uwe Hermann
uwe at hermann-uwe.de
Mon Apr 21 21:02:43 CEST 2008
On Wed, Apr 16, 2008 at 05:44:45PM -0600, Jordan Crouse wrote:
> libpayload: Add gettimeofday() and friends
>
> Add a gettimeofday() implementation - it works pretty well, but it
> drifts a little bit so its not very suitable for keeping time. It
> works best to track changes in time over small periods of time.
>
> Signed-off-by: Jordan Crouse <jordan.crouse at amd.com>
> Index: libpayload/drivers/nvram.c
> ===================================================================
> --- libpayload.orig/drivers/nvram.c 2008-04-18 04:16:35.000000000 -0600
> +++ libpayload/drivers/nvram.c 2008-04-18 04:20:20.000000000 -0600
> @@ -93,3 +93,42 @@
> outb(addr, rtc_port);
> outb(val, rtc_port + 1);
> }
> +
> +/**
> + * Return 1 if the NVRAM is currently updating
> + */
... "and zero otherwise."
Also, please add a "@return" item for doxygen.
> +int nvram_updating(void)
> +{
> + return (nvram_read(NVRAM_RTC_FREQ_SELECT) & NVRAM_RTC_UIP) ? 1 : 0;
> +}
> +
> +/**
> + * Get the current time and date from the RTC
> + *
> + * @param time A pointer to a broken-down time structure
> + */
> +void rtc_read_clock(struct tm *time)
> +{
> + memset(time, 0, sizeof(*time));
> +
> + while(nvram_updating());
> +
> + time->tm_mon = bcd2dec(nvram_read(NVRAM_RTC_MONTH)) - 1;
> + time->tm_sec = bcd2dec(nvram_read(NVRAM_RTC_SECONDS));
> + time->tm_min = bcd2dec(nvram_read(NVRAM_RTC_MINUTES));
> + time->tm_mday = bcd2dec(nvram_read(NVRAM_RTC_DAY));
> + time->tm_hour = bcd2dec(nvram_read(NVRAM_RTC_HOURS));
> +
> + /* Instead of finding the century register,
> + we just make an assumption that if the year value is
> + less then 80, then it is 2000+
> + */
I'd add a FIXME or TODO here :)
> +
> + time->tm_year = bcd2dec(nvram_read(NVRAM_RTC_YEAR));
> +
> + if (time->tm_year < 80)
> + time->tm_year += 100;
> +}
> +
> +
> Index: libpayload/include/arch/rdtsc.h
> ===================================================================
> --- libpayload.orig/include/arch/rdtsc.h 2008-04-18 04:16:34.000000000 -0600
> +++ libpayload/include/arch/rdtsc.h 2008-04-18 04:17:09.000000000 -0600
> @@ -30,9 +30,9 @@
> #ifndef _ARCH_RDTSC_H
> #define _ARCH_RDTSC_H
>
> -static inline unsigned long long rdtsc(void)
> +static inline u64 rdtsc(void)
> {
> - unsigned long long val;
> + u64 val;
Yep.
Can the inline be removed as well or is it required here?
> +static unsigned int day_of_year(int mon, int day, int year)
> +{
> + static u8 mdays[12] = { 31, 28, 31, 30, 31, 30,
> + 31, 31, 30, 31, 30, 31 };
> +
> + int ret = 0, i;
Maybe this?
int i, ret = 0;
Looks a bit less confusing. Or only "int ret, i" and put the
"ret = 0" in the for-loop:
for(i = 0, ret = 0; i < mon; i++)
> +
> + f(r(i = 0; i < mon; i++) {
> + ret += mdays[i];
> +
> + if (i == 1 && (year % 4))
> + ret++;
> + }
> +
> + return (ret + day);
> +}
> +
> +static void gtod_init(void)
Nonovious abbreviation, use gettimeofday_init() for better readability
please. Ditto for other "gtod" occurences.
A test on real hardware is pending, I'll report back.
Uwe.
--
http://www.hermann-uwe.de | http://www.holsham-traders.de
http://www.crazy-hacks.org | http://www.unmaintained-free-software.org
More information about the coreboot
mailing list