thermal/intel: Fix intel_tcc_get_temp() to support negative CPU temperature
[ Upstream commit7251b9e8a0] 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:a3c1f066e1("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> Signed-off-by: Sasha Levin <sashal@kernel.org>
This commit is contained in:
committed by
Greg Kroah-Hartman
parent
868e3264f2
commit
9df6a7a3c9
@@ -113,14 +113,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);
|
|||||||
/**
|
/**
|
||||||
* 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)
|
|||||||
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)
|
|||||||
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 @@
|
|||||||
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__ */
|
||||||
|
|||||||
Reference in New Issue
Block a user