On Sun, Apr 14, 2024 at 06:19:46PM -0700, Ricardo Neri wrote: > On Sun, Apr 07, 2024 at 08:24:40AM +0000, Zhang, Rui wrote: > > On Fri, 2024-04-05 at 18:04 -0700, Ricardo Neri wrote: > > > The Intel Software Development manual defines states the temperature > > > > I failed to parse this, is the above "states" redundant? > > Sorry Rui! I missed this repy. > > Ah, the commit message is wrong. I will do s/defines// > > > > > [...] > > > > > digital readout as the bits [22:16] of the > > > IA32_[PACKAGE]_THERM_STATUS > > > registers. In recent processor, however, the range is [23:16]. Use a > > > model-specific bitmask to extract the temperature readout correctly. > > > > > > diff --git a/drivers/hwmon/coretemp.c b/drivers/hwmon/coretemp.c > > > index 616bd1a5b864..5632e1b1dfb1 100644 > > > --- a/drivers/hwmon/coretemp.c > > > +++ b/drivers/hwmon/coretemp.c > > > @@ -17,6 +17,7 @@ > > > #include <linux/sysfs.h> > > > #include <linux/hwmon-sysfs.h> > > > #include <linux/err.h> > > > +#include <linux/intel_tcc.h> > > > #include <linux/mutex.h> > > > #include <linux/list.h> > > > #include <linux/platform_device.h> > > > @@ -404,6 +405,8 @@ static ssize_t show_temp(struct device *dev, > > > tjmax = get_tjmax(tdata, dev); > > > /* Check whether the time interval has elapsed */ > > > if (time_after(jiffies, tdata->last_updated + HZ)) { > > > + u32 mask = > > > intel_tcc_get_temp_mask(is_pkg_temp_data(tdata)); > > > + > > > rdmsr_on_cpu(tdata->cpu, tdata->status_reg, &eax, > > > &edx); > > > /* > > > * Ignore the valid bit. In all observed cases the > > > register > > > @@ -411,7 +414,7 @@ static ssize_t show_temp(struct device *dev, > > > * Return it instead of reporting an error which > > > doesn't > > > * really help at all. > > > */ > > > - tdata->temp = tjmax - ((eax >> 16) & 0x7f) * 1000; > > > + tdata->temp = tjmax - ((eax >> 16) & mask) * 1000; > > > tdata->last_updated = jiffies; > > > } > > > > > Besides this one, we can also convert to use intel_tcc_get_tjmax() in > > get_tjmax(). > > I thought about this, but realized that the bitmask of TjMax is always > [23:16]; no need for a model check. If anything, intel_tcc_get_tjmax() > would remove some duplicated code. But coretemp.c would need to depend > on INTEL_TCC, which seems to be a non-starter. > Calling intel_tcc_get_temp_mask() in practice already introduces that dependency because it returns a fixed mask if INTEL_TCC is not enabled. If that doesn't matter, the dynamic mask is unnecessary to start with. Guenter