Skip to content

Commit

Permalink
x86: Move get/set_wallclock to x86_platform_ops
Browse files Browse the repository at this point in the history
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>
  • Loading branch information
ftang1 authored and KAGA-KOKO committed Sep 16, 2009
1 parent 54e2603 commit 7bd867d
Show file tree
Hide file tree
Showing 12 changed files with 21 additions and 83 deletions.
10 changes: 0 additions & 10 deletions arch/x86/include/asm/paravirt.h
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand Down
4 changes: 0 additions & 4 deletions arch/x86/include/asm/paravirt_types.h
Original file line number Diff line number Diff line change
Expand Up @@ -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);
};
Expand Down
50 changes: 0 additions & 50 deletions arch/x86/include/asm/time.h
Original file line number Diff line number Diff line change
Expand Up @@ -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 */
4 changes: 4 additions & 0 deletions arch/x86/include/asm/x86_init.h
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down
4 changes: 4 additions & 0 deletions arch/x86/kernel/efi.c
Original file line number Diff line number Diff line change
Expand Up @@ -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: "
Expand Down Expand Up @@ -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;

Expand Down
4 changes: 2 additions & 2 deletions arch/x86/kernel/kvmclock.c
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down
2 changes: 0 additions & 2 deletions arch/x86/kernel/paravirt.c
Original file line number Diff line number Diff line change
Expand Up @@ -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,
};

Expand Down
12 changes: 4 additions & 8 deletions arch/x86/kernel/rtc.c
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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;
Expand All @@ -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();
Expand Down
4 changes: 2 additions & 2 deletions arch/x86/kernel/vmi_32.c
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down
2 changes: 2 additions & 0 deletions arch/x86/kernel/x86_init.c
Original file line number Diff line number Diff line change
Expand Up @@ -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,
};
4 changes: 1 addition & 3 deletions arch/x86/lguest/boot.c
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
4 changes: 2 additions & 2 deletions arch/x86/xen/enlighten.c
Original file line number Diff line number Diff line change
Expand Up @@ -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,
};

Expand Down Expand Up @@ -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
/*
Expand Down

0 comments on commit 7bd867d

Please sign in to comment.