thermal/intel: Fix intel_tcc_get_temp() to support negative CPU temperature
authorZhang Rui <rui.zhang@intel.com>
Tue, 6 Feb 2024 01:54:09 +0000 (09:54 +0800)
committerRafael J. Wysocki <rafael.j.wysocki@intel.com>
Mon, 12 Feb 2024 17:41:38 +0000 (18:41 +0100)
CPU temperature can be negative in some cases. Thus the negative CPU
temperature should not be considered as a failure.

Fix intel_tcc_get_temp() and its users to support negative CPU
temperature.

Fixes: a3c1f066e1c5 ("thermal/intel: Introduce Intel TCC library")
Signed-off-by: Zhang Rui <rui.zhang@intel.com>
Reviewed-by: Stanislaw Gruszka <stanislaw.gruszka@linux.intel.com>
Cc: 6.3+ <stable@vger.kernel.org> # 6.3+
Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
drivers/thermal/intel/int340x_thermal/processor_thermal_device.c
drivers/thermal/intel/intel_tcc.c
drivers/thermal/intel/x86_pkg_temp_thermal.c
include/linux/intel_tcc.h

index 649f67fdf3454cdf18039f21eac373a06534cfef..d75fae7b7ed22bff012fd8bd8927aa5a6124280e 100644 (file)
@@ -176,14 +176,14 @@ static int proc_thermal_get_zone_temp(struct thermal_zone_device *zone,
                                         int *temp)
 {
        int cpu;
-       int curr_temp;
+       int curr_temp, ret;
 
        *temp = 0;
 
        for_each_online_cpu(cpu) {
-               curr_temp = intel_tcc_get_temp(cpu, false);
-               if (curr_temp < 0)
-                       return curr_temp;
+               ret = intel_tcc_get_temp(cpu, &curr_temp, false);
+               if (ret < 0)
+                       return ret;
                if (!*temp || curr_temp > *temp)
                        *temp = curr_temp;
        }
index 2e5c741c41ca03467074b615dee8dcc65c9b2deb..5e8b7f34b39510a28f2c253e585b0eec54397450 100644 (file)
@@ -103,18 +103,19 @@ EXPORT_SYMBOL_NS_GPL(intel_tcc_set_offset, INTEL_TCC);
 /**
  * intel_tcc_get_temp() - returns the current temperature
  * @cpu: cpu that the MSR should be run on, nagative value means any cpu.
+ * @temp: pointer to the memory for saving cpu temperature.
  * @pkg: true: Package Thermal Sensor. false: Core Thermal Sensor.
  *
  * Get the current temperature returned by the CPU core/package level
  * thermal sensor, in degrees C.
  *
- * Return: Temperature in degrees C on success, negative error code otherwise.
+ * Return: 0 on success, negative error code otherwise.
  */
-int intel_tcc_get_temp(int cpu, bool pkg)
+int intel_tcc_get_temp(int cpu, int *temp, bool pkg)
 {
        u32 low, high;
        u32 msr = pkg ? MSR_IA32_PACKAGE_THERM_STATUS : MSR_IA32_THERM_STATUS;
-       int tjmax, temp, err;
+       int tjmax, err;
 
        tjmax = intel_tcc_get_tjmax(cpu);
        if (tjmax < 0)
@@ -131,9 +132,8 @@ int intel_tcc_get_temp(int cpu, bool pkg)
        if (!(low & BIT(31)))
                return -ENODATA;
 
-       temp = tjmax - ((low >> 16) & 0x7f);
+       *temp = tjmax - ((low >> 16) & 0x7f);
 
-       /* Do not allow negative CPU temperature */
-       return temp >= 0 ? temp : -ENODATA;
+       return 0;
 }
 EXPORT_SYMBOL_NS_GPL(intel_tcc_get_temp, INTEL_TCC);
index 11a7f8108bbbfeb5a92e054f203b242c340ebaf4..61c3d450ee605ae429e111f98b4b35516bf4d835 100644 (file)
@@ -108,11 +108,11 @@ static struct zone_device *pkg_temp_thermal_get_dev(unsigned int cpu)
 static int sys_get_curr_temp(struct thermal_zone_device *tzd, int *temp)
 {
        struct zone_device *zonedev = thermal_zone_device_priv(tzd);
-       int val;
+       int val, ret;
 
-       val = intel_tcc_get_temp(zonedev->cpu, true);
-       if (val < 0)
-               return val;
+       ret = intel_tcc_get_temp(zonedev->cpu, &val, true);
+       if (ret < 0)
+               return ret;
 
        *temp = val * 1000;
        pr_debug("sys_get_curr_temp %d\n", *temp);
index f422612c28d6b4da50bd690e3b142139f267912a..8ff8eabb4a987cf908f3cfcf05d2d3ad6185effa 100644 (file)
@@ -13,6 +13,6 @@
 int intel_tcc_get_tjmax(int cpu);
 int intel_tcc_get_offset(int cpu);
 int intel_tcc_set_offset(int cpu, int offset);
-int intel_tcc_get_temp(int cpu, bool pkg);
+int intel_tcc_get_temp(int cpu, int *temp, bool pkg);
 
 #endif /* __INTEL_TCC_H__ */