[coreboot] libpayload: add gettimeofday()
Jordan Crouse
jordan.crouse at amd.com
Tue Apr 22 17:43:15 CEST 2008
Changes made - awaiting your ACK.
On 21/04/08 21:02 +0200, Uwe Hermann wrote:
> 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
>
> --
> coreboot mailing list
> coreboot at coreboot.org
> http://www.coreboot.org/mailman/listinfo/coreboot
>
--
Jordan Crouse
Systems Software Development Engineer
Advanced Micro Devices, Inc.
More information about the coreboot
mailing list