Re: [PATCH 9/9] hwmon: (it87) Report thermal sensor type as Intel PECI if appropriate

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Hi Guenter,

On Sun, 28 Oct 2012 11:20:01 -0700, Guenter Roeck wrote:
> IT8721 and IT8728 support Intel PECI temperature reporting. Each sensor
> can be programmed to display the temperature reported on the PECI interface.
> 
> If configured for Intel PECI, the driver reported the respective thermal sensor
> as "disabled (0)". Fix the code to correctly report it as "Intel PECI (6)".

I think the driver reported it as whatever the other configuration bits
said, not necessarily zero. The configuration scheme for thermal sensor
types on these chips is anything but straightforward, plus you
shouldn't assume every BIOS out there is sane ;)

Anyway, good catch, I had not noticed that newer IT87xxF chips had
support for PECI.

> 
> Signed-off-by: Guenter Roeck <linux@xxxxxxxxxxxx>
> ---
> Another potential candidate for -stable.

Seems difficult with this patch at the end of the series and depending
on another non-trivial patch earlier in the series. Anyway I consider
this a new feature rather than a bug fix, and some more work seems to
be needed (see below), so no, I don't think pushing this to stable is
the right thing to do.

> 
>  Documentation/hwmon/it87 |    3 ++-
>  drivers/hwmon/it87.c     |   18 ++++++++++++++----
>  2 files changed, 16 insertions(+), 5 deletions(-)
> 
> diff --git a/Documentation/hwmon/it87 b/Documentation/hwmon/it87
> index 92ce617..3d938aea 100644
> --- a/Documentation/hwmon/it87
> +++ b/Documentation/hwmon/it87
> @@ -217,4 +217,5 @@ Temperature offset attributes
>  The driver supports temp[1-3]_offset sysfs attributes to adjust the reported
>  temperature for thermal diodes or diode connected thermal transistors.
>  If a temperature sensor is configured for thermistors, the attribute values
> -are ignored.
> +are ignored. If the thermal sensor type is Intel PECI, the temperature offset
> +must be programmed to the critical CPU temperature.

I don't quite get this part.. Who should do that, and how?

> diff --git a/drivers/hwmon/it87.c b/drivers/hwmon/it87.c
> index f3f3e79..f8336be 100644
> --- a/drivers/hwmon/it87.c
> +++ b/drivers/hwmon/it87.c
> @@ -237,6 +237,7 @@ struct it87_devices {
>  #define	FEAT_NEWER_AUTOPWM	(1 << 1)
>  #define	FEAT_OLD_AUTOPWM	(1 << 2)
>  #define	FEAT_16BIT_FAN		(1 << 3)
> +#define	FEAT_PECI		(1 << 4)
>  
>  static const struct it87_devices it87_devices[] = {
>  	[it87] = {
> @@ -261,11 +262,13 @@ static const struct it87_devices it87_devices[] = {
>  	},
>  	[it8721] = {
>  		.name = "it8721",
> -		.features = FEAT_NEWER_AUTOPWM | FEAT_12MV_ADC | FEAT_16BIT_FAN,
> +		.features = FEAT_NEWER_AUTOPWM | FEAT_12MV_ADC | FEAT_16BIT_FAN
> +		  | FEAT_PECI,
>  	},
>  	[it8728] = {
>  		.name = "it8728",
> -		.features = FEAT_NEWER_AUTOPWM | FEAT_12MV_ADC | FEAT_16BIT_FAN,
> +		.features = FEAT_NEWER_AUTOPWM | FEAT_12MV_ADC | FEAT_16BIT_FAN
> +		  | FEAT_PECI,
>  	},
>  	[it8782] = {
>  		.name = "it8782",
> @@ -281,6 +284,7 @@ static const struct it87_devices it87_devices[] = {
>  #define has_12mv_adc(data)	((data)->features & FEAT_12MV_ADC)
>  #define has_newer_autopwm(data)	((data)->features & FEAT_NEWER_AUTOPWM)
>  #define has_old_autopwm(data)	((data)->features & FEAT_OLD_AUTOPWM)
> +#define has_peci(data)		((data)->features & FEAT_PECI)
>  
>  struct it87_sio_data {
>  	enum chips type;
> @@ -581,6 +585,8 @@ static ssize_t show_type(struct device *dev, struct device_attribute *attr,
>  	struct it87_data *data = it87_update_device(dev);
>  	u8 reg = data->sensor;	    /* In case value is updated while used */
>  
> +	if (has_peci(data) && (reg >> 6 == nr + 1))
> +		return sprintf(buf, "6\n");  /* Intel PECI */

Looks fine for the IT8728F, but not for the IT8721F.

For the IT8721F, the code above works fine for temp1 and temp3, but as
I understand the datasheet, value 2 isn't possible and the PECI flag
for temp2 would be bit 7 in register 0x55. On that chip, the CPU PECI
temperature can only be mapped to temp1 and temp3 and the south bridge
(PCH) PECI temperature can only be mapped to temp2.

Speaking of PCH PECI temperature, apparently the IT8728F can do this
too, but differently. Relevant register is 0x9E, but to be honest I'm
not sure exactly how to handle it :( I suppose we can start with only
supporting the other registers for the time being, it's already better
than the current situation.

>  	if (reg & (1 << nr))
>  		return sprintf(buf, "3\n");  /* thermal diode */
>  	if (reg & (8 << nr))
> @@ -604,13 +610,17 @@ static ssize_t set_type(struct device *dev, struct device_attribute *attr,
>  	reg = it87_read_value(data, IT87_REG_TEMP_ENABLE);
>  	reg &= ~(1 << nr);
>  	reg &= ~(8 << nr);
> +	if (has_peci(data) && (reg >> 6 == nr + 1 || val == 6))
> +		reg &= 0x3f;
>  	if (val == 2) {	/* backwards compatibility */
>  		dev_warn(dev,
>  			 "Sensor type 2 is deprecated, please use 4 instead\n");
>  		val = 4;
>  	}
> -	/* 3 = thermal diode; 4 = thermistor; 0 = disabled */
> -	if (val == 3)
> +	/* 3 = thermal diode; 4 = thermistor; 6 = Intel PECI; 0 = disabled */
> +	if (has_peci(data) && val == 6)
> +		reg |= (nr + 1) << 6;

If there's no specific reason for handling this first, I'd move it last
for consistency and a slightly smaller patch.

> +	else if (val == 3)
>  		reg |= 1 << nr;
>  	else if (val == 4)
>  		reg |= 8 << nr;


-- 
Jean Delvare

_______________________________________________
lm-sensors mailing list
lm-sensors@xxxxxxxxxxxxxx
http://lists.lm-sensors.org/mailman/listinfo/lm-sensors


[Index of Archives]     [Linux Kernel]     [Linux Hardware Monitoring]     [Linux USB Devel]     [Linux Audio Users]     [Linux Kernel]     [Linux SCSI]     [Yosemite Backpacking]

  Powered by Linux