x86: Move get/set_wallclock to x86_platform_ops
authorFeng Tang <feng.tang@intel.com>
Thu, 10 Sep 2009 02:48:56 +0000 (10:48 +0800)
committerThomas Gleixner <tglx@linutronix.de>
Wed, 16 Sep 2009 12:34:50 +0000 (14:34 +0200)
get/set_wallclock() have already a set of platform dependent
implementations (default, EFI, paravirt). MRST will add another
variant.

Moving them to platform ops simplifies the existing code and minimizes
the effort to integrate new variants.

Signed-off-by: Feng Tang <feng.tang@intel.com>
LKML-Reference: <new-submission>
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
12 files changed:
arch/x86/include/asm/paravirt.h
arch/x86/include/asm/paravirt_types.h
arch/x86/include/asm/time.h
arch/x86/include/asm/x86_init.h
arch/x86/kernel/efi.c
arch/x86/kernel/kvmclock.c
arch/x86/kernel/paravirt.c
arch/x86/kernel/rtc.c
arch/x86/kernel/vmi_32.c
arch/x86/kernel/x86_init.c
arch/x86/lguest/boot.c
arch/x86/xen/enlighten.c

index 1e458a553303c15635f10b8f21cb1239b2345556..a69ae87bd7d821d8aae7bbd8da3230afe2e43e18 100644 (file)
@@ -24,16 +24,6 @@ static inline void load_sp0(struct tss_struct *tss,
        PVOP_VCALL2(pv_cpu_ops.load_sp0, tss, thread);
 }
 
-static inline unsigned long get_wallclock(void)
-{
-       return PVOP_CALL0(unsigned long, pv_time_ops.get_wallclock);
-}
-
-static inline int set_wallclock(unsigned long nowtime)
-{
-       return PVOP_CALL1(int, pv_time_ops.set_wallclock, nowtime);
-}
-
 /* The paravirtualized CPUID instruction. */
 static inline void __cpuid(unsigned int *eax, unsigned int *ebx,
                           unsigned int *ecx, unsigned int *edx)
index 0d812e592e3bbe9d724b52a60e5f7c8c08ccacf5..c25d5e3bdf9c8236a0e7882733f512bebbd423fa 100644 (file)
@@ -88,10 +88,6 @@ struct pv_lazy_ops {
 };
 
 struct pv_time_ops {
-       /* Set and set time of day */
-       unsigned long (*get_wallclock)(void);
-       int (*set_wallclock)(unsigned long);
-
        unsigned long long (*sched_clock)(void);
        unsigned long (*get_tsc_khz)(void);
 };
index 9c5608b21c277dd574246d9a62b2b51f7da2ab31..7bdec4e9b739d8359072d2afec04dba72b2b6511 100644 (file)
@@ -4,57 +4,7 @@
 extern void hpet_time_init(void);
 
 #include <asm/mc146818rtc.h>
-#ifdef CONFIG_X86_32
-#include <linux/efi.h>
-
-static inline unsigned long native_get_wallclock(void)
-{
-       unsigned long retval;
-
-       if (efi_enabled)
-               retval = efi_get_time();
-       else
-               retval = mach_get_cmos_time();
-
-       return retval;
-}
-
-static inline int native_set_wallclock(unsigned long nowtime)
-{
-       int retval;
-
-       if (efi_enabled)
-               retval = efi_set_rtc_mmss(nowtime);
-       else
-               retval = mach_set_rtc_mmss(nowtime);
-
-       return retval;
-}
-
-#else
-extern void native_time_init_hook(void);
-
-static inline unsigned long native_get_wallclock(void)
-{
-       return mach_get_cmos_time();
-}
-
-static inline int native_set_wallclock(unsigned long nowtime)
-{
-       return mach_set_rtc_mmss(nowtime);
-}
-
-#endif
 
 extern void time_init(void);
 
-#ifdef CONFIG_PARAVIRT
-#include <asm/paravirt.h>
-#else /* !CONFIG_PARAVIRT */
-
-#define get_wallclock() native_get_wallclock()
-#define set_wallclock(x) native_set_wallclock(x)
-
-#endif /* CONFIG_PARAVIRT */
-
 #endif /* _ASM_X86_TIME_H */
index b6c89428137dcf75624df0aec1c895f75ccf1303..2c756fd4ab0ead09c83970ea588ad865a42c1708 100644 (file)
@@ -114,9 +114,13 @@ struct x86_cpuinit_ops {
 /**
  * struct x86_platform_ops - platform specific runtime functions
  * @calibrate_tsc:             calibrate TSC
+ * @get_wallclock:             get time from HW clock like RTC etc.
+ * @set_wallclock:             set time back to HW clock
  */
 struct x86_platform_ops {
        unsigned long (*calibrate_tsc)(void);
+       unsigned long (*get_wallclock)(void);
+       int (*set_wallclock)(unsigned long nowtime);
 };
 
 extern struct x86_init_ops x86_init;
index fe26ba3e3451872c083c10b6ccf62651fcd762a0..ad5bd988fb7958834cc731266f2c9b7a02d21958 100644 (file)
@@ -42,6 +42,7 @@
 #include <asm/time.h>
 #include <asm/cacheflush.h>
 #include <asm/tlbflush.h>
+#include <asm/x86_init.h>
 
 #define EFI_DEBUG      1
 #define PFX            "EFI: "
@@ -453,6 +454,9 @@ void __init efi_init(void)
        if (add_efi_memmap)
                do_add_efi_memmap();
 
+       x86_platform.get_wallclock = efi_get_time;
+       x86_platform.set_wallclock = efi_set_rtc_mmss;
+
        /* Setup for EFI runtime service */
        reboot_type = BOOT_EFI;
 
index 75a21b61b8633c19eea5df1a45e5f3890c042996..59ab94db12ea50bfb30a3700a31de1cbcfde2b89 100644 (file)
@@ -184,10 +184,10 @@ void __init kvmclock_init(void)
        if (kvmclock && kvm_para_has_feature(KVM_FEATURE_CLOCKSOURCE)) {
                if (kvm_register_clock("boot clock"))
                        return;
-               pv_time_ops.get_wallclock = kvm_get_wallclock;
-               pv_time_ops.set_wallclock = kvm_set_wallclock;
                pv_time_ops.sched_clock = kvm_clock_read;
                x86_platform.calibrate_tsc = kvm_get_tsc_khz;
+               x86_platform.get_wallclock = kvm_get_wallclock;
+               x86_platform.set_wallclock = kvm_set_wallclock;
 #ifdef CONFIG_X86_LOCAL_APIC
                x86_cpuinit.setup_percpu_clockev =
                        kvm_setup_secondary_clock;
index 7cbf898d839baddbba8b1bd95ec7beb54722ad05..c0fb85aed432a3a3d58f7b7c1e95ea06b355b72e 100644 (file)
@@ -306,8 +306,6 @@ struct pv_init_ops pv_init_ops = {
 };
 
 struct pv_time_ops pv_time_ops = {
-       .get_wallclock = native_get_wallclock,
-       .set_wallclock = native_set_wallclock,
        .sched_clock = native_sched_clock,
 };
 
index 5d465b207e72c3bfae75b29f6d0e1dcb3365e6b4..b8652f2e6855bd4769faf2173806bb2cd10e9507 100644 (file)
@@ -8,6 +8,7 @@
 #include <linux/pnp.h>
 
 #include <asm/vsyscall.h>
+#include <asm/x86_init.h>
 #include <asm/time.h>
 
 #ifdef CONFIG_X86_32
@@ -165,13 +166,13 @@ void rtc_cmos_write(unsigned char val, unsigned char addr)
 }
 EXPORT_SYMBOL(rtc_cmos_write);
 
-static int set_rtc_mmss(unsigned long nowtime)
+int update_persistent_clock(struct timespec now)
 {
        unsigned long flags;
        int retval;
 
        spin_lock_irqsave(&rtc_lock, flags);
-       retval = set_wallclock(nowtime);
+       retval = x86_platform.set_wallclock(now.tv_sec);
        spin_unlock_irqrestore(&rtc_lock, flags);
 
        return retval;
@@ -183,17 +184,12 @@ unsigned long read_persistent_clock(void)
        unsigned long retval, flags;
 
        spin_lock_irqsave(&rtc_lock, flags);
-       retval = get_wallclock();
+       retval = x86_platform.get_wallclock();
        spin_unlock_irqrestore(&rtc_lock, flags);
 
        return retval;
 }
 
-int update_persistent_clock(struct timespec now)
-{
-       return set_rtc_mmss(now.tv_sec);
-}
-
 unsigned long long native_read_tsc(void)
 {
        return __native_read_tsc();
index 052ae81ee08baef4fd75595ea3e87a204d3f6336..31e6f6cfe53ef8ea0ecad83b8d28940fce256ca3 100644 (file)
@@ -818,14 +818,14 @@ static inline int __init activate_vmi(void)
                vmi_timer_ops.cancel_alarm =
                         vmi_get_function(VMI_CALL_CancelAlarm);
                x86_init.timers.timer_init = vmi_time_init;
-               pv_time_ops.get_wallclock = vmi_get_wallclock;
-               pv_time_ops.set_wallclock = vmi_set_wallclock;
 #ifdef CONFIG_X86_LOCAL_APIC
                x86_init.timers.setup_percpu_clockev = vmi_time_bsp_init;
                x86_cpuinit.setup_percpu_clockev = vmi_time_ap_init;
 #endif
                pv_time_ops.sched_clock = vmi_sched_clock;
                x86_platform.calibrate_tsc = vmi_tsc_khz;
+               x86_platform.get_wallclock = vmi_get_wallclock;
+               x86_platform.set_wallclock = vmi_set_wallclock;
 
                /* We have true wallclock functions; disable CMOS clock sync */
                no_sync_cmos_clock = 1;
index 68824c7be4e2d401da5eafaa80e272d5baa247b6..4449a4a2c2ed7398768509b13f1e8a95213d38e3 100644 (file)
@@ -70,4 +70,6 @@ struct x86_cpuinit_ops x86_cpuinit __cpuinitdata = {
 
 struct x86_platform_ops x86_platform = {
        .calibrate_tsc                  = native_calibrate_tsc,
+       .get_wallclock                  = mach_get_cmos_time,
+       .set_wallclock                  = mach_set_rtc_mmss,
 };
index fabe745513d935baca9fd3fe18a1ea7c223afdfd..4cb7d5d18b8e691b9a2123060e9d701a3d34472e 100644 (file)
@@ -1318,13 +1318,11 @@ __init void lguest_init(void)
        set_lguest_basic_apic_ops();
 #endif
 
-       /* Time operations */
-       pv_time_ops.get_wallclock = lguest_get_wallclock;
-
        x86_init.resources.memory_setup = lguest_memory_setup;
        x86_init.irqs.intr_init = lguest_init_IRQ;
        x86_init.timers.timer_init = lguest_time_init;
        x86_platform.calibrate_tsc = lguest_tsc_khz;
+       x86_platform.get_wallclock =  lguest_get_wallclock;
 
        /*
         * Now is a good time to look at the implementations of these functions
index ee8cac77c8a4525aabf8c2216fa640e435acefa6..b5bf8b9119a31ab5614b918df85f76552952f367 100644 (file)
@@ -842,8 +842,6 @@ static const struct pv_init_ops xen_init_ops __initdata = {
 };
 
 static const struct pv_time_ops xen_time_ops __initdata = {
-       .set_wallclock = xen_set_wallclock,
-       .get_wallclock = xen_get_wallclock,
        .sched_clock = xen_sched_clock,
 };
 
@@ -980,6 +978,8 @@ asmlinkage void __init xen_start_kernel(void)
        x86_cpuinit.setup_percpu_clockev = x86_init_noop;
 
        x86_platform.calibrate_tsc = xen_tsc_khz;
+       x86_platform.get_wallclock = xen_get_wallclock;
+       x86_platform.set_wallclock = xen_set_wallclock;
 
 #ifdef CONFIG_X86_64
        /*