[PATCH] thermal: intel: int340x: Fix temperature selection around 0 C

Thorsten Blum posted 1 patch 1 month ago
.../intel/int340x_thermal/processor_thermal_device.c   | 10 +++++++---
1 file changed, 7 insertions(+), 3 deletions(-)
[PATCH] thermal: intel: int340x: Fix temperature selection around 0 C
Posted by Thorsten Blum 1 month ago
Since commit 7251b9e8a007 ("thermal/intel: Fix intel_tcc_get_temp() to
support negative CPU temperature"), intel_tcc_get_temp() can report
negative temperatures.

proc_thermal_get_zone_temp() still uses *temp as the current maximum and
as an implicit "no reading yet" marker. However, this breaks when a CPU
reports 0 C, because a subsequent negative reading can overwrite it.

Use bool temp_valid to track whether a valid temperature has been read.
Initialize *temp with the first valid reading and only update it with
warmer readings.

Fixes: 7251b9e8a007 ("thermal/intel: Fix intel_tcc_get_temp() to support negative CPU temperature")
Cc: stable@vger.kernel.org # 6.3+
Signed-off-by: Thorsten Blum <blum@kernel.org>
---
 .../intel/int340x_thermal/processor_thermal_device.c   | 10 +++++++---
 1 file changed, 7 insertions(+), 3 deletions(-)

diff --git a/drivers/thermal/intel/int340x_thermal/processor_thermal_device.c b/drivers/thermal/intel/int340x_thermal/processor_thermal_device.c
index f80dbe2ca7e4..b0284c2e2e74 100644
--- a/drivers/thermal/intel/int340x_thermal/processor_thermal_device.c
+++ b/drivers/thermal/intel/int340x_thermal/processor_thermal_device.c
@@ -179,17 +179,21 @@ static int proc_thermal_get_zone_temp(struct thermal_zone_device *zone,
 {
 	int cpu;
 	int curr_temp, ret;
-
-	*temp = 0;
+	bool temp_valid = false;
 
 	for_each_online_cpu(cpu) {
 		ret = intel_tcc_get_temp(cpu, &curr_temp, false);
 		if (ret < 0)
 			return ret;
-		if (!*temp || curr_temp > *temp)
+		if (!temp_valid || curr_temp > *temp) {
 			*temp = curr_temp;
+			temp_valid = true;
+		}
 	}
 
+	if (!temp_valid)
+		return -ENODATA;
+
 	*temp *= 1000;
 
 	return 0;
Re: [PATCH] thermal: intel: int340x: Fix temperature selection around 0 C
Posted by srinivas pandruvada 1 month ago
On Wed, 2026-08-26 at 17:31 +0200, Thorsten Blum wrote:
> Since commit 7251b9e8a007 ("thermal/intel: Fix intel_tcc_get_temp()
> to
> support negative CPU temperature"), intel_tcc_get_temp() can report
> negative temperatures.
> 
> proc_thermal_get_zone_temp() still uses *temp as the current maximum
> and
> as an implicit "no reading yet" marker. However, this breaks when a
> CPU
> reports 0 C, because a subsequent negative reading can overwrite it.
> 
> Use bool temp_valid to track whether a valid temperature has been
> read.
> Initialize *temp with the first valid reading and only update it with
> warmer readings.
> 
> Fixes: 7251b9e8a007 ("thermal/intel: Fix intel_tcc_get_temp() to
> support negative CPU temperature")
> Cc: stable@vger.kernel.org # 6.3+
> Signed-off-by: Thorsten Blum <blum@kernel.org>

    Acked-by: Srinivas Pandruvada <srinivas.pandruvada@linux.intel.com>

> ---
>  .../intel/int340x_thermal/processor_thermal_device.c   | 10 +++++++-
> --
>  1 file changed, 7 insertions(+), 3 deletions(-)
> 
> diff --git
> a/drivers/thermal/intel/int340x_thermal/processor_thermal_device.c
> b/drivers/thermal/intel/int340x_thermal/processor_thermal_device.c
> index f80dbe2ca7e4..b0284c2e2e74 100644
> ---
> a/drivers/thermal/intel/int340x_thermal/processor_thermal_device.c
> +++
> b/drivers/thermal/intel/int340x_thermal/processor_thermal_device.c
> @@ -179,17 +179,21 @@ static int proc_thermal_get_zone_temp(struct
> thermal_zone_device *zone,
>  {
>  	int cpu;
>  	int curr_temp, ret;
> -
> -	*temp = 0;
> +	bool temp_valid = false;
>  
>  	for_each_online_cpu(cpu) {
>  		ret = intel_tcc_get_temp(cpu, &curr_temp, false);
>  		if (ret < 0)
>  			return ret;
> -		if (!*temp || curr_temp > *temp)
> +		if (!temp_valid || curr_temp > *temp) {
>  			*temp = curr_temp;
> +			temp_valid = true;
> +		}
>  	}
>  
> +	if (!temp_valid)
> +		return -ENODATA;
> +
>  	*temp *= 1000;
>  
>  	return 0;
Re: [PATCH] thermal: intel: int340x: Fix temperature selection around 0 C
Posted by Rafael J. Wysocki (Intel) 3 weeks, 2 days ago
On Fri, Aug 28, 2026 at 10:20 PM srinivas pandruvada
<srinivas.pandruvada@linux.intel.com> wrote:
>
> On Wed, 2026-08-26 at 17:31 +0200, Thorsten Blum wrote:
> > Since commit 7251b9e8a007 ("thermal/intel: Fix intel_tcc_get_temp()
> > to
> > support negative CPU temperature"), intel_tcc_get_temp() can report
> > negative temperatures.
> >
> > proc_thermal_get_zone_temp() still uses *temp as the current maximum
> > and
> > as an implicit "no reading yet" marker. However, this breaks when a
> > CPU
> > reports 0 C, because a subsequent negative reading can overwrite it.
> >
> > Use bool temp_valid to track whether a valid temperature has been
> > read.
> > Initialize *temp with the first valid reading and only update it with
> > warmer readings.
> >
> > Fixes: 7251b9e8a007 ("thermal/intel: Fix intel_tcc_get_temp() to
> > support negative CPU temperature")
> > Cc: stable@vger.kernel.org # 6.3+
> > Signed-off-by: Thorsten Blum <blum@kernel.org>
>
>     Acked-by: Srinivas Pandruvada <srinivas.pandruvada@linux.intel.com>

Applied as 7.4 material, thanks!

>
> > ---
> >  .../intel/int340x_thermal/processor_thermal_device.c   | 10 +++++++-
> > --
> >  1 file changed, 7 insertions(+), 3 deletions(-)
> >
> > diff --git
> > a/drivers/thermal/intel/int340x_thermal/processor_thermal_device.c
> > b/drivers/thermal/intel/int340x_thermal/processor_thermal_device.c
> > index f80dbe2ca7e4..b0284c2e2e74 100644
> > ---
> > a/drivers/thermal/intel/int340x_thermal/processor_thermal_device.c
> > +++
> > b/drivers/thermal/intel/int340x_thermal/processor_thermal_device.c
> > @@ -179,17 +179,21 @@ static int proc_thermal_get_zone_temp(struct
> > thermal_zone_device *zone,
> >  {
> >       int cpu;
> >       int curr_temp, ret;
> > -
> > -     *temp = 0;
> > +     bool temp_valid = false;
> >
> >       for_each_online_cpu(cpu) {
> >               ret = intel_tcc_get_temp(cpu, &curr_temp, false);
> >               if (ret < 0)
> >                       return ret;
> > -             if (!*temp || curr_temp > *temp)
> > +             if (!temp_valid || curr_temp > *temp) {
> >                       *temp = curr_temp;
> > +                     temp_valid = true;
> > +             }
> >       }
> >
> > +     if (!temp_valid)
> > +             return -ENODATA;
> > +
> >       *temp *= 1000;
> >
> >       return 0;