| From 6f2d9d99213514360034c6d52d2c3919290b3504 Mon Sep 17 00:00:00 2001 |
| From: Jan Beulich <JBeulich@suse.com> |
| Date: Fri, 8 Jul 2016 06:15:07 -0600 |
| Subject: xen/acpi: allow xen-acpi-processor driver to load on Xen 4.7 |
| |
| From: Jan Beulich <JBeulich@suse.com> |
| |
| commit 6f2d9d99213514360034c6d52d2c3919290b3504 upstream. |
| |
| As of Xen 4.7 PV CPUID doesn't expose either of CPUID[1].ECX[7] and |
| CPUID[0x80000007].EDX[7] anymore, causing the driver to fail to load on |
| both Intel and AMD systems. Doing any kind of hardware capability |
| checks in the driver as a prerequisite was wrong anyway: With the |
| hypervisor being in charge, all such checking should be done by it. If |
| ACPI data gets uploaded despite some missing capability, the hypervisor |
| is free to ignore part or all of that data. |
| |
| Ditch the entire check_prereq() function, and do the only valid check |
| (xen_initial_domain()) in the caller in its place. |
| |
| Signed-off-by: Jan Beulich <jbeulich@suse.com> |
| Signed-off-by: David Vrabel <david.vrabel@citrix.com> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| |
| --- |
| drivers/xen/xen-acpi-processor.c | 35 +++-------------------------------- |
| 1 file changed, 3 insertions(+), 32 deletions(-) |
| |
| --- a/drivers/xen/xen-acpi-processor.c |
| +++ b/drivers/xen/xen-acpi-processor.c |
| @@ -423,36 +423,7 @@ upload: |
| |
| return 0; |
| } |
| -static int __init check_prereq(void) |
| -{ |
| - struct cpuinfo_x86 *c = &cpu_data(0); |
| - |
| - if (!xen_initial_domain()) |
| - return -ENODEV; |
| - |
| - if (!acpi_gbl_FADT.smi_command) |
| - return -ENODEV; |
| |
| - if (c->x86_vendor == X86_VENDOR_INTEL) { |
| - if (!cpu_has(c, X86_FEATURE_EST)) |
| - return -ENODEV; |
| - |
| - return 0; |
| - } |
| - if (c->x86_vendor == X86_VENDOR_AMD) { |
| - /* Copied from powernow-k8.h, can't include ../cpufreq/powernow |
| - * as we get compile warnings for the static functions. |
| - */ |
| -#define CPUID_FREQ_VOLT_CAPABILITIES 0x80000007 |
| -#define USE_HW_PSTATE 0x00000080 |
| - u32 eax, ebx, ecx, edx; |
| - cpuid(CPUID_FREQ_VOLT_CAPABILITIES, &eax, &ebx, &ecx, &edx); |
| - if ((edx & USE_HW_PSTATE) != USE_HW_PSTATE) |
| - return -ENODEV; |
| - return 0; |
| - } |
| - return -ENODEV; |
| -} |
| /* acpi_perf_data is a pointer to percpu data. */ |
| static struct acpi_processor_performance __percpu *acpi_perf_data; |
| |
| @@ -509,10 +480,10 @@ struct notifier_block xen_acpi_processor |
| static int __init xen_acpi_processor_init(void) |
| { |
| unsigned int i; |
| - int rc = check_prereq(); |
| + int rc; |
| |
| - if (rc) |
| - return rc; |
| + if (!xen_initial_domain()) |
| + return -ENODEV; |
| |
| nr_acpi_bits = get_max_acpi_id() + 1; |
| acpi_ids_done = kcalloc(BITS_TO_LONGS(nr_acpi_bits), sizeof(unsigned long), GFP_KERNEL); |