From: Zhang Rui <rui.zh...@intel.com>

On the new dual-die/package systems, the package temperature MSR becomes
die-scope. Thus instead of one thermal zone device per physical package,
now there should be one thermal_zone for each die on these systems.

This patch introduces x86_pkg_temp_thermal support for new
dual-die/package systems.

On the hardwares that do not have multi-die, topology_die_id() equals
topology_physical_package_id(), thus there is no functional change.

Signed-off-by: Zhang Rui <rui.zh...@intel.com>
Signed-off-by: Len Brown <len.br...@intel.com>
---
 drivers/thermal/intel/x86_pkg_temp_thermal.c | 9 +++++----
 1 file changed, 5 insertions(+), 4 deletions(-)

diff --git a/drivers/thermal/intel/x86_pkg_temp_thermal.c 
b/drivers/thermal/intel/x86_pkg_temp_thermal.c
index 1ef937d799e4..a2eb9136105e 100644
--- a/drivers/thermal/intel/x86_pkg_temp_thermal.c
+++ b/drivers/thermal/intel/x86_pkg_temp_thermal.c
@@ -122,7 +122,7 @@ static int pkg_temp_debugfs_init(void)
  */
 static struct pkg_device *pkg_temp_thermal_get_dev(unsigned int cpu)
 {
-       int pkgid = topology_logical_package_id(cpu);
+       int pkgid = topology_unique_die_id(cpu);
 
        if (pkgid >= 0 && pkgid < max_packages)
                return packages[pkgid];
@@ -353,7 +353,7 @@ static int pkg_thermal_notify(u64 msr_val)
 
 static int pkg_temp_thermal_device_add(unsigned int cpu)
 {
-       int pkgid = topology_logical_package_id(cpu);
+       int pkgid = topology_unique_die_id(cpu);
        u32 tj_max, eax, ebx, ecx, edx;
        struct pkg_device *pkgdev;
        int thres_count, err;
@@ -449,7 +449,7 @@ static int pkg_thermal_cpu_offline(unsigned int cpu)
         * worker will see the package anymore.
         */
        if (lastcpu) {
-               packages[topology_logical_package_id(cpu)] = NULL;
+               packages[topology_unique_die_id(cpu)] = NULL;
                /* After this point nothing touches the MSR anymore. */
                wrmsr(MSR_IA32_PACKAGE_THERM_INTERRUPT,
                      pkgdev->msr_pkg_therm_low, pkgdev->msr_pkg_therm_high);
@@ -511,11 +511,12 @@ MODULE_DEVICE_TABLE(x86cpu, pkg_temp_thermal_ids);
 static int __init pkg_temp_thermal_init(void)
 {
        int ret;
+       struct cpuinfo_x86 *c = &cpu_data(0);
 
        if (!x86_match_cpu(pkg_temp_thermal_ids))
                return -ENODEV;
 
-       max_packages = topology_max_packages();
+       max_packages = topology_max_packages() * c->x86_max_dies;
        packages = kcalloc(max_packages, sizeof(struct pkg_device *),
                           GFP_KERNEL);
        if (!packages)
-- 
2.18.0-rc0

Reply via email to