Skip to content

Commit 7bd867d

Browse files
ftang1KAGA-KOKO
authored andcommitted
x86: Move get/set_wallclock to x86_platform_ops
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>
1 parent 54e2603 commit 7bd867d

File tree

12 files changed

+21
-83
lines changed

12 files changed

+21
-83
lines changed

arch/x86/include/asm/paravirt.h

Lines changed: 0 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -24,16 +24,6 @@ static inline void load_sp0(struct tss_struct *tss,
2424
PVOP_VCALL2(pv_cpu_ops.load_sp0, tss, thread);
2525
}
2626

27-
static inline unsigned long get_wallclock(void)
28-
{
29-
return PVOP_CALL0(unsigned long, pv_time_ops.get_wallclock);
30-
}
31-
32-
static inline int set_wallclock(unsigned long nowtime)
33-
{
34-
return PVOP_CALL1(int, pv_time_ops.set_wallclock, nowtime);
35-
}
36-
3727
/* The paravirtualized CPUID instruction. */
3828
static inline void __cpuid(unsigned int *eax, unsigned int *ebx,
3929
unsigned int *ecx, unsigned int *edx)

arch/x86/include/asm/paravirt_types.h

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -88,10 +88,6 @@ struct pv_lazy_ops {
8888
};
8989

9090
struct pv_time_ops {
91-
/* Set and set time of day */
92-
unsigned long (*get_wallclock)(void);
93-
int (*set_wallclock)(unsigned long);
94-
9591
unsigned long long (*sched_clock)(void);
9692
unsigned long (*get_tsc_khz)(void);
9793
};

arch/x86/include/asm/time.h

Lines changed: 0 additions & 50 deletions
Original file line numberDiff line numberDiff line change
@@ -4,57 +4,7 @@
44
extern void hpet_time_init(void);
55

66
#include <asm/mc146818rtc.h>
7-
#ifdef CONFIG_X86_32
8-
#include <linux/efi.h>
9-
10-
static inline unsigned long native_get_wallclock(void)
11-
{
12-
unsigned long retval;
13-
14-
if (efi_enabled)
15-
retval = efi_get_time();
16-
else
17-
retval = mach_get_cmos_time();
18-
19-
return retval;
20-
}
21-
22-
static inline int native_set_wallclock(unsigned long nowtime)
23-
{
24-
int retval;
25-
26-
if (efi_enabled)
27-
retval = efi_set_rtc_mmss(nowtime);
28-
else
29-
retval = mach_set_rtc_mmss(nowtime);
30-
31-
return retval;
32-
}
33-
34-
#else
35-
extern void native_time_init_hook(void);
36-
37-
static inline unsigned long native_get_wallclock(void)
38-
{
39-
return mach_get_cmos_time();
40-
}
41-
42-
static inline int native_set_wallclock(unsigned long nowtime)
43-
{
44-
return mach_set_rtc_mmss(nowtime);
45-
}
46-
47-
#endif
487

498
extern void time_init(void);
509

51-
#ifdef CONFIG_PARAVIRT
52-
#include <asm/paravirt.h>
53-
#else /* !CONFIG_PARAVIRT */
54-
55-
#define get_wallclock() native_get_wallclock()
56-
#define set_wallclock(x) native_set_wallclock(x)
57-
58-
#endif /* CONFIG_PARAVIRT */
59-
6010
#endif /* _ASM_X86_TIME_H */

arch/x86/include/asm/x86_init.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -114,9 +114,13 @@ struct x86_cpuinit_ops {
114114
/**
115115
* struct x86_platform_ops - platform specific runtime functions
116116
* @calibrate_tsc: calibrate TSC
117+
* @get_wallclock: get time from HW clock like RTC etc.
118+
* @set_wallclock: set time back to HW clock
117119
*/
118120
struct x86_platform_ops {
119121
unsigned long (*calibrate_tsc)(void);
122+
unsigned long (*get_wallclock)(void);
123+
int (*set_wallclock)(unsigned long nowtime);
120124
};
121125

122126
extern struct x86_init_ops x86_init;

arch/x86/kernel/efi.c

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,7 @@
4242
#include <asm/time.h>
4343
#include <asm/cacheflush.h>
4444
#include <asm/tlbflush.h>
45+
#include <asm/x86_init.h>
4546

4647
#define EFI_DEBUG 1
4748
#define PFX "EFI: "
@@ -453,6 +454,9 @@ void __init efi_init(void)
453454
if (add_efi_memmap)
454455
do_add_efi_memmap();
455456

457+
x86_platform.get_wallclock = efi_get_time;
458+
x86_platform.set_wallclock = efi_set_rtc_mmss;
459+
456460
/* Setup for EFI runtime service */
457461
reboot_type = BOOT_EFI;
458462

arch/x86/kernel/kvmclock.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -184,10 +184,10 @@ void __init kvmclock_init(void)
184184
if (kvmclock && kvm_para_has_feature(KVM_FEATURE_CLOCKSOURCE)) {
185185
if (kvm_register_clock("boot clock"))
186186
return;
187-
pv_time_ops.get_wallclock = kvm_get_wallclock;
188-
pv_time_ops.set_wallclock = kvm_set_wallclock;
189187
pv_time_ops.sched_clock = kvm_clock_read;
190188
x86_platform.calibrate_tsc = kvm_get_tsc_khz;
189+
x86_platform.get_wallclock = kvm_get_wallclock;
190+
x86_platform.set_wallclock = kvm_set_wallclock;
191191
#ifdef CONFIG_X86_LOCAL_APIC
192192
x86_cpuinit.setup_percpu_clockev =
193193
kvm_setup_secondary_clock;

arch/x86/kernel/paravirt.c

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -306,8 +306,6 @@ struct pv_init_ops pv_init_ops = {
306306
};
307307

308308
struct pv_time_ops pv_time_ops = {
309-
.get_wallclock = native_get_wallclock,
310-
.set_wallclock = native_set_wallclock,
311309
.sched_clock = native_sched_clock,
312310
};
313311

arch/x86/kernel/rtc.c

Lines changed: 4 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
#include <linux/pnp.h>
99

1010
#include <asm/vsyscall.h>
11+
#include <asm/x86_init.h>
1112
#include <asm/time.h>
1213

1314
#ifdef CONFIG_X86_32
@@ -165,13 +166,13 @@ void rtc_cmos_write(unsigned char val, unsigned char addr)
165166
}
166167
EXPORT_SYMBOL(rtc_cmos_write);
167168

168-
static int set_rtc_mmss(unsigned long nowtime)
169+
int update_persistent_clock(struct timespec now)
169170
{
170171
unsigned long flags;
171172
int retval;
172173

173174
spin_lock_irqsave(&rtc_lock, flags);
174-
retval = set_wallclock(nowtime);
175+
retval = x86_platform.set_wallclock(now.tv_sec);
175176
spin_unlock_irqrestore(&rtc_lock, flags);
176177

177178
return retval;
@@ -183,17 +184,12 @@ unsigned long read_persistent_clock(void)
183184
unsigned long retval, flags;
184185

185186
spin_lock_irqsave(&rtc_lock, flags);
186-
retval = get_wallclock();
187+
retval = x86_platform.get_wallclock();
187188
spin_unlock_irqrestore(&rtc_lock, flags);
188189

189190
return retval;
190191
}
191192

192-
int update_persistent_clock(struct timespec now)
193-
{
194-
return set_rtc_mmss(now.tv_sec);
195-
}
196-
197193
unsigned long long native_read_tsc(void)
198194
{
199195
return __native_read_tsc();

arch/x86/kernel/vmi_32.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -818,14 +818,14 @@ static inline int __init activate_vmi(void)
818818
vmi_timer_ops.cancel_alarm =
819819
vmi_get_function(VMI_CALL_CancelAlarm);
820820
x86_init.timers.timer_init = vmi_time_init;
821-
pv_time_ops.get_wallclock = vmi_get_wallclock;
822-
pv_time_ops.set_wallclock = vmi_set_wallclock;
823821
#ifdef CONFIG_X86_LOCAL_APIC
824822
x86_init.timers.setup_percpu_clockev = vmi_time_bsp_init;
825823
x86_cpuinit.setup_percpu_clockev = vmi_time_ap_init;
826824
#endif
827825
pv_time_ops.sched_clock = vmi_sched_clock;
828826
x86_platform.calibrate_tsc = vmi_tsc_khz;
827+
x86_platform.get_wallclock = vmi_get_wallclock;
828+
x86_platform.set_wallclock = vmi_set_wallclock;
829829

830830
/* We have true wallclock functions; disable CMOS clock sync */
831831
no_sync_cmos_clock = 1;

arch/x86/kernel/x86_init.c

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -70,4 +70,6 @@ struct x86_cpuinit_ops x86_cpuinit __cpuinitdata = {
7070

7171
struct x86_platform_ops x86_platform = {
7272
.calibrate_tsc = native_calibrate_tsc,
73+
.get_wallclock = mach_get_cmos_time,
74+
.set_wallclock = mach_set_rtc_mmss,
7375
};

arch/x86/lguest/boot.c

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1318,13 +1318,11 @@ __init void lguest_init(void)
13181318
set_lguest_basic_apic_ops();
13191319
#endif
13201320

1321-
/* Time operations */
1322-
pv_time_ops.get_wallclock = lguest_get_wallclock;
1323-
13241321
x86_init.resources.memory_setup = lguest_memory_setup;
13251322
x86_init.irqs.intr_init = lguest_init_IRQ;
13261323
x86_init.timers.timer_init = lguest_time_init;
13271324
x86_platform.calibrate_tsc = lguest_tsc_khz;
1325+
x86_platform.get_wallclock = lguest_get_wallclock;
13281326

13291327
/*
13301328
* Now is a good time to look at the implementations of these functions

arch/x86/xen/enlighten.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -842,8 +842,6 @@ static const struct pv_init_ops xen_init_ops __initdata = {
842842
};
843843

844844
static const struct pv_time_ops xen_time_ops __initdata = {
845-
.set_wallclock = xen_set_wallclock,
846-
.get_wallclock = xen_get_wallclock,
847845
.sched_clock = xen_sched_clock,
848846
};
849847

@@ -980,6 +978,8 @@ asmlinkage void __init xen_start_kernel(void)
980978
x86_cpuinit.setup_percpu_clockev = x86_init_noop;
981979

982980
x86_platform.calibrate_tsc = xen_tsc_khz;
981+
x86_platform.get_wallclock = xen_get_wallclock;
982+
x86_platform.set_wallclock = xen_set_wallclock;
983983

984984
#ifdef CONFIG_X86_64
985985
/*

0 commit comments

Comments
 (0)