// SPDX-License-Identifier: GPL-2.0 /* * Intel PMC Core platform init * Copyright (c) 2019, Google Inc. * Author - Rajat Jain * * This code instantiates platform devices for intel_pmc_core driver, only * on supported platforms that may not have the ACPI devices in the ACPI tables. * No new platforms should be added here, because we expect that new platforms * should all have the ACPI device, which is the preferred way of enumeration. */ #include #include #include #include #include #include static void intel_pmc_core_release(struct device *dev) { /* Nothing to do. */ } static struct platform_device pmc_core_device = { .name = "intel_pmc_core", .dev = { .release = intel_pmc_core_release, }, }; /* * intel_pmc_core_platform_ids is the list of platforms where we want to * instantiate the platform_device if not already instantiated. This is * different than intel_pmc_core_ids in intel_pmc_core.c which is the * list of platforms that the driver supports for pmc_core device. The * other list may grow, but this list should not. */ static const struct x86_cpu_id intel_pmc_core_platform_ids[] = { INTEL_CPU_FAM6(SKYLAKE_L, pmc_core_device), INTEL_CPU_FAM6(SKYLAKE, pmc_core_device), INTEL_CPU_FAM6(KABYLAKE_L, pmc_core_device), INTEL_CPU_FAM6(KABYLAKE, pmc_core_device), INTEL_CPU_FAM6(CANNONLAKE_L, pmc_core_device), INTEL_CPU_FAM6(ICELAKE_L, pmc_core_device), INTEL_CPU_FAM6(COMETLAKE, pmc_core_device), INTEL_CPU_FAM6(COMETLAKE_L, pmc_core_device), {} }; MODULE_DEVICE_TABLE(x86cpu, intel_pmc_core_platform_ids); static int __init pmc_core_platform_init(void) { /* Skip creating the platform device if ACPI already has a device */ 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; return platform_device_register(&pmc_core_device); } static void __exit pmc_core_platform_exit(void) { platform_device_unregister(&pmc_core_device); } module_init(pmc_core_platform_init); module_exit(pmc_core_platform_exit); MODULE_LICENSE("GPL v2");