]> git.baikalelectronics.ru Git - kernel.git/commitdiff
platform/x86: intel_pmc_core: Special case for Coffeelake
authorRajneesh Bhardwaj <rajneesh.bhardwaj@intel.com>
Fri, 2 Feb 2018 13:43:37 +0000 (19:13 +0530)
committerAndy Shevchenko <andriy.shevchenko@linux.intel.com>
Sun, 4 Feb 2018 13:55:53 +0000 (15:55 +0200)
Intel CoffeeLake SoC uses CPU ID of KabyLake but has Cannonlake PCH, so in
this case PMC register details from Cannonlake PCH must be used.

In order to identify whether the given platform is Coffeelake, scan for the
Sunrisepoint PMC PCI Id.

 KBL CPUID SPT PCIID
------------------------------------
KBL | Y | Y   |
------------------------------------
CFL | Y | N   |
------------------------------------

Signed-off-by: Srinivas Pandruvada <srinivas.pandruvada@linux.intel.com>
Signed-off-by: Rajneesh Bhardwaj <rajneesh.bhardwaj@intel.com>
Signed-off-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
drivers/platform/x86/intel_pmc_core.c
drivers/platform/x86/intel_pmc_core.h

index a255c4b0f7a8e809ff21bb5480f31fafc5539cd8..43bbe74743d9e85efa43584346adddc1bca1992d 100644 (file)
@@ -25,6 +25,7 @@
 #include <linux/delay.h>
 #include <linux/io.h>
 #include <linux/module.h>
+#include <linux/pci.h>
 #include <linux/uaccess.h>
 
 #include <asm/cpu_device_id.h>
@@ -537,6 +538,11 @@ static const struct x86_cpu_id intel_pmc_core_ids[] = {
 
 MODULE_DEVICE_TABLE(x86cpu, intel_pmc_core_ids);
 
+static const struct pci_device_id pmc_pci_ids[] = {
+       { PCI_VDEVICE(INTEL, SPT_PMC_PCI_DEVICE_ID), 0},
+       { 0, },
+};
+
 static int __init pmc_core_probe(void)
 {
        struct pmc_dev *pmcdev = &pmc;
@@ -550,6 +556,14 @@ static int __init pmc_core_probe(void)
 
        pmcdev->map = (struct pmc_reg_map *)cpu_id->driver_data;
 
+       /*
+        * Coffeelake has CPU ID of Kabylake and Cannonlake PCH. So here
+        * Sunrisepoint PCH regmap can't be used. Use Cannonlake PCH regmap
+        * in this case.
+        */
+       if (!pci_dev_present(pmc_pci_ids))
+               pmcdev->map = &cnp_reg_map;
+
        if (lpit_read_residency_count_address(&slp_s0_addr))
                pmcdev->base_addr = PMC_BASE_ADDR_DEFAULT;
        else
index 8b7731e6dea2682206fa819ef4a54c3bb0db95bb..5fa5f97870aafe4890ff77ec591bb94e7fba68f5 100644 (file)
@@ -23,6 +23,8 @@
 
 #define PMC_BASE_ADDR_DEFAULT                  0xFE000000
 
+/* Sunrise Point Power Management Controller PCI Device ID */
+#define SPT_PMC_PCI_DEVICE_ID                  0x9d21
 #define SPT_PMC_BASE_ADDR_OFFSET               0x48
 #define SPT_PMC_SLP_S0_RES_COUNTER_OFFSET      0x13c
 #define SPT_PMC_PM_CFG_OFFSET                  0x18