Drivers: hv: vmbus: Move the extracting of Hypervisor version information
authorK. Y. Srinivasan <kys@microsoft.com>
Thu, 19 Jan 2017 18:51:47 +0000 (11:51 -0700)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Fri, 20 Jan 2017 13:48:03 +0000 (14:48 +0100)
As part of the effort to separate out architecture specific code,
extract hypervisor version information in an architecture specific
file.

Signed-off-by: K. Y. Srinivasan <kys@microsoft.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
arch/x86/include/asm/mshyperv.h
arch/x86/kernel/cpu/mshyperv.c
drivers/hv/connection.c
drivers/hv/hv.c
drivers/hv/hyperv_vmbus.h

index adfe8cc9f7e362e9ca490c924910da51e185eb71..54729e3cba4775391dfd65c59308e4bd7ba97fa1 100644 (file)
@@ -5,6 +5,25 @@
 #include <linux/interrupt.h>
 #include <asm/hyperv.h>
 
+/*
+ * The below CPUID leaves are present if VersionAndFeatures.HypervisorPresent
+ * is set by CPUID(HVCPUID_VERSION_FEATURES).
+ */
+enum hv_cpuid_function {
+       HVCPUID_VERSION_FEATURES                = 0x00000001,
+       HVCPUID_VENDOR_MAXFUNCTION              = 0x40000000,
+       HVCPUID_INTERFACE                       = 0x40000001,
+
+       /*
+        * The remaining functions depend on the value of
+        * HVCPUID_INTERFACE
+        */
+       HVCPUID_VERSION                         = 0x40000002,
+       HVCPUID_FEATURES                        = 0x40000003,
+       HVCPUID_ENLIGHTENMENT_INFO              = 0x40000004,
+       HVCPUID_IMPLEMENTATION_LIMITS           = 0x40000005,
+};
+
 struct ms_hyperv_info {
        u32 features;
        u32 misc_features;
index d3705a44971cdda178269134320fe28651b16abd..b5375b9497b3aed6fa2f54f85f9667b243c18f46 100644 (file)
@@ -160,6 +160,11 @@ static int hv_nmi_unknown(unsigned int val, struct pt_regs *regs)
 
 static void __init ms_hyperv_init_platform(void)
 {
+       int hv_host_info_eax;
+       int hv_host_info_ebx;
+       int hv_host_info_ecx;
+       int hv_host_info_edx;
+
        /*
         * Extract the features and hints
         */
@@ -170,6 +175,21 @@ static void __init ms_hyperv_init_platform(void)
        pr_info("HyperV: features 0x%x, hints 0x%x\n",
                ms_hyperv.features, ms_hyperv.hints);
 
+       /*
+        * Extract host information.
+        */
+       if (cpuid_eax(HVCPUID_VENDOR_MAXFUNCTION) >= HVCPUID_VERSION) {
+               hv_host_info_eax = cpuid_eax(HVCPUID_VERSION);
+               hv_host_info_ebx = cpuid_ebx(HVCPUID_VERSION);
+               hv_host_info_ecx = cpuid_ecx(HVCPUID_VERSION);
+               hv_host_info_edx = cpuid_edx(HVCPUID_VERSION);
+
+               pr_info("Hyper-V Host Build:%d-%d.%d-%d-%d.%d\n",
+                       hv_host_info_eax, hv_host_info_ebx >> 16,
+                       hv_host_info_ebx & 0xFFFF, hv_host_info_ecx,
+                       hv_host_info_edx >> 24, hv_host_info_edx & 0xFFFFFF);
+       }
+
 #ifdef CONFIG_X86_LOCAL_APIC
        if (ms_hyperv.features & HV_X64_MSR_APIC_FREQUENCY_AVAILABLE) {
                /*
index 9b72ebcd37bcd271497d662e765edb3755a9110e..307a5a8937f68a579d96d1ab7a7c9cba06c32cb4 100644 (file)
@@ -221,11 +221,8 @@ int vmbus_connect(void)
                goto cleanup;
 
        vmbus_proto_version = version;
-       pr_info("Hyper-V Host Build:%d-%d.%d-%d-%d.%d; Vmbus version:%d.%d\n",
-                   host_info_eax, host_info_ebx >> 16,
-                   host_info_ebx & 0xFFFF, host_info_ecx,
-                   host_info_edx >> 24, host_info_edx & 0xFFFFFF,
-                   version >> 16, version & 0xFFFF);
+       pr_info("Vmbus version:%d.%d\n",
+               version >> 16, version & 0xFFFF);
 
        kfree(msginfo);
        return 0;
index 1a33b59776d3fa3a1a428e659ca7dde36e1597b6..9985a347ed03c2ccb33877d912c7fb5944405d65 100644 (file)
@@ -42,51 +42,6 @@ struct hv_context hv_context = {
 #define HV_MAX_MAX_DELTA_TICKS 0xffffffff
 #define HV_MIN_DELTA_TICKS 1
 
-/*
- * query_hypervisor_info - Get version info of the windows hypervisor
- */
-unsigned int host_info_eax;
-unsigned int host_info_ebx;
-unsigned int host_info_ecx;
-unsigned int host_info_edx;
-
-static int query_hypervisor_info(void)
-{
-       unsigned int eax;
-       unsigned int ebx;
-       unsigned int ecx;
-       unsigned int edx;
-       unsigned int max_leaf;
-       unsigned int op;
-
-       /*
-       * Its assumed that this is called after confirming that Viridian
-       * is present. Query id and revision.
-       */
-       eax = 0;
-       ebx = 0;
-       ecx = 0;
-       edx = 0;
-       op = HVCPUID_VENDOR_MAXFUNCTION;
-       cpuid(op, &eax, &ebx, &ecx, &edx);
-
-       max_leaf = eax;
-
-       if (max_leaf >= HVCPUID_VERSION) {
-               eax = 0;
-               ebx = 0;
-               ecx = 0;
-               edx = 0;
-               op = HVCPUID_VERSION;
-               cpuid(op, &eax, &ebx, &ecx, &edx);
-               host_info_eax = eax;
-               host_info_ebx = ebx;
-               host_info_ecx = ecx;
-               host_info_edx = edx;
-       }
-       return max_leaf;
-}
-
 /*
  * hv_init - Main initialization routine.
  *
@@ -94,7 +49,6 @@ static int query_hypervisor_info(void)
  */
 int hv_init(void)
 {
-       int max_leaf;
        union hv_x64_msr_hypercall_contents hypercall_msr;
 
        memset(hv_context.synic_event_page, 0, sizeof(void *) * NR_CPUS);
@@ -111,9 +65,6 @@ int hv_init(void)
        memset(hv_context.clk_evt, 0,
               sizeof(void *) * NR_CPUS);
 
-       max_leaf = query_hypervisor_info();
-
-
        /* See if the hypercall page is already set */
        hypercall_msr.as_uint64 = 0;
        rdmsrl(HV_X64_MSR_HYPERCALL, hypercall_msr.as_uint64);
index 947455d307071efe49bb76e63df54ce46ab6f81d..a7e35c842fed392e5a2a8fdd01532dd92c9a5240 100644 (file)
  */
 #define HV_UTIL_NEGO_TIMEOUT 55
 
-/*
- * The below CPUID leaves are present if VersionAndFeatures.HypervisorPresent
- * is set by CPUID(HVCPUID_VERSION_FEATURES).
- */
-enum hv_cpuid_function {
-       HVCPUID_VERSION_FEATURES                = 0x00000001,
-       HVCPUID_VENDOR_MAXFUNCTION              = 0x40000000,
-       HVCPUID_INTERFACE                       = 0x40000001,
-
-       /*
-        * The remaining functions depend on the value of
-        * HVCPUID_INTERFACE
-        */
-       HVCPUID_VERSION                 = 0x40000002,
-       HVCPUID_FEATURES                        = 0x40000003,
-       HVCPUID_ENLIGHTENMENT_INFO      = 0x40000004,
-       HVCPUID_IMPLEMENTATION_LIMITS           = 0x40000005,
-};
-
 #define  HV_FEATURE_GUEST_CRASH_MSR_AVAILABLE   0x400
 
 #define HV_X64_MSR_CRASH_P0   0x40000100
@@ -444,14 +425,6 @@ extern int hv_synic_cleanup(unsigned int cpu);
 
 extern void hv_synic_clockevents_cleanup(void);
 
-/*
- * Host version information.
- */
-extern unsigned int host_info_eax;
-extern unsigned int host_info_ebx;
-extern unsigned int host_info_ecx;
-extern unsigned int host_info_edx;
-
 /* Interface */