summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authordfr <dfr@FreeBSD.org>2001-10-04 15:26:05 +0000
committerdfr <dfr@FreeBSD.org>2001-10-04 15:26:05 +0000
commit62360262bb7f9578f00d8642585d57256bd00d15 (patch)
treeb155418cab78a3953c4c7d4c19764eec6f266c3c
parent7ed4fe75282315f1dcd2a52c1bf47fda743592b1 (diff)
downloadFreeBSD-src-62360262bb7f9578f00d8642585d57256bd00d15.zip
FreeBSD-src-62360262bb7f9578f00d8642585d57256bd00d15.tar.gz
Use EFI (or some reasonable simulation) to read the RTC.
-rw-r--r--sys/ia64/ia64/eficlock.c (renamed from sys/ia64/ia64/sscclock.c)75
1 files changed, 26 insertions, 49 deletions
diff --git a/sys/ia64/ia64/sscclock.c b/sys/ia64/ia64/eficlock.c
index f25b5f3..bf10549 100644
--- a/sys/ia64/ia64/sscclock.c
+++ b/sys/ia64/ia64/eficlock.c
@@ -33,34 +33,10 @@
#include <sys/malloc.h>
#include <machine/clockvar.h>
-
-struct ssc_time {
- int year;
- int month;
- int day;
- int hour;
- int minute;
- int second;
- int msec;
- int wday;
-};
-
-#define SSC_GET_RTC 65
-
-static u_int64_t
-ssc(u_int64_t in0, u_int64_t in1, u_int64_t in2, u_int64_t in3, int which)
-{
- register u_int64_t ret0 __asm("r8");
-
- __asm __volatile("mov r15=%1\n\t"
- "break 0x80001"
- : "=r"(ret0)
- : "r"(which), "r"(in0), "r"(in1), "r"(in2), "r"(in3));
- return ret0;
-}
+#include <machine/efi.h>
static void
-sscclock_init(device_t dev)
+eficlock_init(kobj_t dev)
{
}
@@ -68,54 +44,55 @@ sscclock_init(device_t dev)
* Get the time of day, based on the clock's value and/or the base value.
*/
static void
-sscclock_get(device_t dev, time_t base, struct clocktime *ct)
+eficlock_get(kobj_t dev, time_t base, struct clocktime *ct)
{
- struct ssc_time time;
+ EFI_TIME time;
- ssc(ia64_tpa((vm_offset_t) &time), 0, 0, 0, SSC_GET_RTC);
+ ia64_efi_runtime->GetTime(&time, 0);
- ct->sec = time.second;
- ct->min = time.minute;
- ct->hour = time.hour;
- ct->dow = time.wday;
- ct->day = time.day;
- ct->mon = time.month + 1;
- ct->year = time.year;
+ ct->sec = time.Second;
+ ct->min = time.Minute;
+ ct->hour = time.Hour;
+ ct->dow = 0; /* XXX not used */
+ ct->day = time.Day;
+ ct->mon = time.Month;
+ ct->year = time.Year - 1900;
}
/*
* Reset the TODR based on the time value.
*/
static void
-sscclock_set(device_t dev, struct clocktime *ct)
+eficlock_set(kobj_t dev, struct clocktime *ct)
{
- printf("sscclock: TODR not set\n");
+ printf("eficlock: TODR not set\n");
}
static int
-sscclock_getsecs(device_t dev, int *secp)
+eficlock_getsecs(kobj_t dev, int *secp)
{
return ETIMEDOUT;
}
-static device_method_t sscclock_methods[] = {
+static device_method_t eficlock_methods[] = {
/* clock interface */
- DEVMETHOD(clock_init, sscclock_init),
- DEVMETHOD(clock_get, sscclock_get),
- DEVMETHOD(clock_set, sscclock_set),
- DEVMETHOD(clock_getsecs, sscclock_getsecs),
+ DEVMETHOD(clock_init, eficlock_init),
+ DEVMETHOD(clock_get, eficlock_get),
+ DEVMETHOD(clock_set, eficlock_set),
+ DEVMETHOD(clock_getsecs, eficlock_getsecs),
{ 0, 0 }
};
-DEFINE_CLASS(sscclock, sscclock_methods, sizeof(struct kobj));
+DEFINE_CLASS(eficlock, eficlock_methods, sizeof(struct kobj));
static void
-sscclock_create(void *arg)
+eficlock_create(void *arg)
{
- device_t clock = (device_t)
- kobj_create(&sscclock_class, M_TEMP, M_NOWAIT);
+ kobj_t clock;
+ clock = (kobj_t)
+ kobj_create(&eficlock_class, M_TEMP, M_NOWAIT);
clockattach(clock);
}
-SYSINIT(sscdev, SI_SUB_DRIVERS,SI_ORDER_MIDDLE, sscclock_create, NULL);
+SYSINIT(eficlock, SI_SUB_DRIVERS,SI_ORDER_MIDDLE, eficlock_create, NULL);
OpenPOWER on IntegriCloud