Merge tag 'for-5.3/libata-20190708' of git://git.kernel.dk/linux-block
[linux-2.6-block.git] / arch / x86 / hyperv / hv_init.c
index 1608050e9df95755ed369b1fe024a2e5bd818746..0e033ef11a9f73c6ae0ecf2c4a077bbb5e4fcc44 100644 (file)
 #include <linux/version.h>
 #include <linux/vmalloc.h>
 #include <linux/mm.h>
-#include <linux/clockchips.h>
 #include <linux/hyperv.h>
 #include <linux/slab.h>
 #include <linux/cpuhotplug.h>
-
-#ifdef CONFIG_HYPERV_TSCPAGE
-
-static struct ms_hyperv_tsc_page *tsc_pg;
-
-struct ms_hyperv_tsc_page *hv_get_tsc_page(void)
-{
-       return tsc_pg;
-}
-EXPORT_SYMBOL_GPL(hv_get_tsc_page);
-
-static u64 read_hv_clock_tsc(struct clocksource *arg)
-{
-       u64 current_tick = hv_read_tsc_page(tsc_pg);
-
-       if (current_tick == U64_MAX)
-               rdmsrl(HV_X64_MSR_TIME_REF_COUNT, current_tick);
-
-       return current_tick;
-}
-
-static struct clocksource hyperv_cs_tsc = {
-               .name           = "hyperv_clocksource_tsc_page",
-               .rating         = 400,
-               .read           = read_hv_clock_tsc,
-               .mask           = CLOCKSOURCE_MASK(64),
-               .flags          = CLOCK_SOURCE_IS_CONTINUOUS,
-};
-#endif
-
-static u64 read_hv_clock_msr(struct clocksource *arg)
-{
-       u64 current_tick;
-       /*
-        * Read the partition counter to get the current tick count. This count
-        * is set to 0 when the partition is created and is incremented in
-        * 100 nanosecond units.
-        */
-       rdmsrl(HV_X64_MSR_TIME_REF_COUNT, current_tick);
-       return current_tick;
-}
-
-static struct clocksource hyperv_cs_msr = {
-       .name           = "hyperv_clocksource_msr",
-       .rating         = 400,
-       .read           = read_hv_clock_msr,
-       .mask           = CLOCKSOURCE_MASK(64),
-       .flags          = CLOCK_SOURCE_IS_CONTINUOUS,
-};
+#include <clocksource/hyperv_timer.h>
 
 void *hv_hypercall_pg;
 EXPORT_SYMBOL_GPL(hv_hypercall_pg);
-struct clocksource *hyperv_cs;
-EXPORT_SYMBOL_GPL(hyperv_cs);
 
 u32 *hv_vp_index;
 EXPORT_SYMBOL_GPL(hv_vp_index);
@@ -343,42 +292,8 @@ void __init hyperv_init(void)
 
        x86_init.pci.arch_init = hv_pci_init;
 
-       /*
-        * Register Hyper-V specific clocksource.
-        */
-#ifdef CONFIG_HYPERV_TSCPAGE
-       if (ms_hyperv.features & HV_MSR_REFERENCE_TSC_AVAILABLE) {
-               union hv_x64_msr_hypercall_contents tsc_msr;
-
-               tsc_pg = __vmalloc(PAGE_SIZE, GFP_KERNEL, PAGE_KERNEL);
-               if (!tsc_pg)
-                       goto register_msr_cs;
-
-               hyperv_cs = &hyperv_cs_tsc;
-
-               rdmsrl(HV_X64_MSR_REFERENCE_TSC, tsc_msr.as_uint64);
-
-               tsc_msr.enable = 1;
-               tsc_msr.guest_physical_address = vmalloc_to_pfn(tsc_pg);
-
-               wrmsrl(HV_X64_MSR_REFERENCE_TSC, tsc_msr.as_uint64);
-
-               hyperv_cs_tsc.archdata.vclock_mode = VCLOCK_HVCLOCK;
-
-               clocksource_register_hz(&hyperv_cs_tsc, NSEC_PER_SEC/100);
-               return;
-       }
-register_msr_cs:
-#endif
-       /*
-        * For 32 bit guests just use the MSR based mechanism for reading
-        * the partition counter.
-        */
-
-       hyperv_cs = &hyperv_cs_msr;
-       if (ms_hyperv.features & HV_MSR_TIME_REF_COUNT_AVAILABLE)
-               clocksource_register_hz(&hyperv_cs_msr, NSEC_PER_SEC/100);
-
+       /* Register Hyper-V specific clocksource */
+       hv_init_clocksource();
        return;
 
 remove_cpuhp_state: