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

From: Rafael J. Wysocki (Intel)

Date: Fri Sep 04 2026 - 11:09:07 EST


On Fri, Aug 28, 2026 at 10:20 PM srinivas pandruvada
<srinivas.pandruvada@xxxxxxxxxxxxxxx> 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@xxxxxxxxxxxxxxx # 6.3+
> > Signed-off-by: Thorsten Blum <blum@xxxxxxxxxx>
>
> Acked-by: Srinivas Pandruvada <srinivas.pandruvada@xxxxxxxxxxxxxxx>

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;