Commit 7251b9e8 authored by Zhang Rui's avatar Zhang Rui Committed by Rafael J. Wysocki

thermal/intel: Fix intel_tcc_get_temp() to support negative CPU temperature

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: a3c1f066 ("thermal/intel: Introduce Intel TCC library")
Signed-off-by: default avatarZhang Rui <rui.zhang@intel.com>
Reviewed-by: default avatarStanislaw Gruszka <stanislaw.gruszka@linux.intel.com>
Cc: 6.3+ <stable@vger.kernel.org> # 6.3+
Signed-off-by: default avatarRafael J. Wysocki <rafael.j.wysocki@intel.com>
parent 841c3516
...@@ -176,14 +176,14 @@ static int proc_thermal_get_zone_temp(struct thermal_zone_device *zone, ...@@ -176,14 +176,14 @@ static int proc_thermal_get_zone_temp(struct thermal_zone_device *zone,
int *temp) int *temp)
{ {
int cpu; int cpu;
int curr_temp; int curr_temp, ret;
*temp = 0; *temp = 0;
for_each_online_cpu(cpu) { for_each_online_cpu(cpu) {
curr_temp = intel_tcc_get_temp(cpu, false); ret = intel_tcc_get_temp(cpu, &curr_temp, false);
if (curr_temp < 0) if (ret < 0)
return curr_temp; return ret;
if (!*temp || curr_temp > *temp) if (!*temp || curr_temp > *temp)
*temp = curr_temp; *temp = curr_temp;
} }
......
...@@ -103,18 +103,19 @@ EXPORT_SYMBOL_NS_GPL(intel_tcc_set_offset, INTEL_TCC); ...@@ -103,18 +103,19 @@ EXPORT_SYMBOL_NS_GPL(intel_tcc_set_offset, INTEL_TCC);
/** /**
* intel_tcc_get_temp() - returns the current temperature * intel_tcc_get_temp() - returns the current temperature
* @cpu: cpu that the MSR should be run on, nagative value means any cpu. * @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. * @pkg: true: Package Thermal Sensor. false: Core Thermal Sensor.
* *
* Get the current temperature returned by the CPU core/package level * Get the current temperature returned by the CPU core/package level
* thermal sensor, in degrees C. * 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 low, high;
u32 msr = pkg ? MSR_IA32_PACKAGE_THERM_STATUS : MSR_IA32_THERM_STATUS; 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); tjmax = intel_tcc_get_tjmax(cpu);
if (tjmax < 0) if (tjmax < 0)
...@@ -131,9 +132,8 @@ int intel_tcc_get_temp(int cpu, bool pkg) ...@@ -131,9 +132,8 @@ int intel_tcc_get_temp(int cpu, bool pkg)
if (!(low & BIT(31))) if (!(low & BIT(31)))
return -ENODATA; return -ENODATA;
temp = tjmax - ((low >> 16) & 0x7f); *temp = tjmax - ((low >> 16) & 0x7f);
/* Do not allow negative CPU temperature */ return 0;
return temp >= 0 ? temp : -ENODATA;
} }
EXPORT_SYMBOL_NS_GPL(intel_tcc_get_temp, INTEL_TCC); EXPORT_SYMBOL_NS_GPL(intel_tcc_get_temp, INTEL_TCC);
...@@ -108,11 +108,11 @@ static struct zone_device *pkg_temp_thermal_get_dev(unsigned int cpu) ...@@ -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) static int sys_get_curr_temp(struct thermal_zone_device *tzd, int *temp)
{ {
struct zone_device *zonedev = thermal_zone_device_priv(tzd); struct zone_device *zonedev = thermal_zone_device_priv(tzd);
int val; int val, ret;
val = intel_tcc_get_temp(zonedev->cpu, true); ret = intel_tcc_get_temp(zonedev->cpu, &val, true);
if (val < 0) if (ret < 0)
return val; return ret;
*temp = val * 1000; *temp = val * 1000;
pr_debug("sys_get_curr_temp %d\n", *temp); pr_debug("sys_get_curr_temp %d\n", *temp);
......
...@@ -13,6 +13,6 @@ ...@@ -13,6 +13,6 @@
int intel_tcc_get_tjmax(int cpu); int intel_tcc_get_tjmax(int cpu);
int intel_tcc_get_offset(int cpu); int intel_tcc_get_offset(int cpu);
int intel_tcc_set_offset(int cpu, int offset); 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__ */ #endif /* __INTEL_TCC_H__ */
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment