| From aee5a93c99be7acc1666b0df4dbc228eca8efdc1 Mon Sep 17 00:00:00 2001 |
| From: Sasha Levin <sashal@kernel.org> |
| Date: Thu, 10 Nov 2022 17:31:44 +0100 |
| Subject: platform/x86/intel: pmc: Don't unconditionally attach Intel PMC when |
| virtualized |
| MIME-Version: 1.0 |
| Content-Type: text/plain; charset=UTF-8 |
| Content-Transfer-Encoding: 8bit |
| |
| From: Roger Pau Monné <roger.pau@citrix.com> |
| |
| [ Upstream commit 2dbfb3f33350e1e868d3d7ed4c176d8777150878 ] |
| |
| The current logic in the Intel PMC driver will forcefully attach it |
| when detecting any CPU on the intel_pmc_core_platform_ids array, |
| even if the matching ACPI device is not present. |
| |
| There's no checking in pmc_core_probe() to assert that the PMC device |
| is present, and hence on virtualized environments the PMC device |
| probes successfully, even if the underlying registers are not present. |
| Before commit 21ae43570940 ("platform/x86: intel_pmc_core: Substitute PCI |
| with CPUID enumeration") the driver would check for the presence of a |
| specific PCI device, and that prevented the driver from attaching when |
| running virtualized. |
| |
| Fix by only forcefully attaching the PMC device when not running |
| virtualized. Note that virtualized platforms can still get the device |
| to load if the appropriate ACPI device is present on the tables |
| provided to the VM. |
| |
| Make an exception for the Xen initial domain, which does have full |
| hardware access, and hence can attach to the PMC if present. |
| |
| Fixes: 21ae43570940 ("platform/x86: intel_pmc_core: Substitute PCI with CPUID enumeration") |
| Signed-off-by: Roger Pau Monné <roger.pau@citrix.com> |
| Acked-by: David E. Box <david.e.box@linux.intel.com> |
| Reviewed-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com> |
| Link: https://lore.kernel.org/r/20221110163145.80374-1-roger.pau@citrix.com |
| Reviewed-by: Hans de Goede <hdegoede@redhat.com> |
| Signed-off-by: Hans de Goede <hdegoede@redhat.com> |
| Signed-off-by: Sasha Levin <sashal@kernel.org> |
| --- |
| drivers/platform/x86/intel/pmc/pltdrv.c | 9 +++++++++ |
| 1 file changed, 9 insertions(+) |
| |
| diff --git a/drivers/platform/x86/intel/pmc/pltdrv.c b/drivers/platform/x86/intel/pmc/pltdrv.c |
| index 15ca8afdd973..ddfba38c2104 100644 |
| --- a/drivers/platform/x86/intel/pmc/pltdrv.c |
| +++ b/drivers/platform/x86/intel/pmc/pltdrv.c |
| @@ -18,6 +18,8 @@ |
| #include <asm/cpu_device_id.h> |
| #include <asm/intel-family.h> |
| |
| +#include <xen/xen.h> |
| + |
| static void intel_pmc_core_release(struct device *dev) |
| { |
| kfree(dev); |
| @@ -53,6 +55,13 @@ static int __init pmc_core_platform_init(void) |
| if (acpi_dev_present("INT33A1", NULL, -1)) |
| return -ENODEV; |
| |
| + /* |
| + * Skip forcefully attaching the device for VMs. Make an exception for |
| + * Xen dom0, which does have full hardware access. |
| + */ |
| + if (cpu_feature_enabled(X86_FEATURE_HYPERVISOR) && !xen_initial_domain()) |
| + return -ENODEV; |
| + |
| if (!x86_match_cpu(intel_pmc_core_platform_ids)) |
| return -ENODEV; |
| |
| -- |
| 2.35.1 |
| |