Re: hwmon: (coretemp) Check the sensor existence instead of enumeration

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

 



Hi Huaxu,

On Fri, 8 Jan 2010 17:23:27 +0800, Huaxu Wan wrote:
> 
>     hwmon: (coretemp) Check the sensor existence instead of enumeration.
> 
>     The processor supports a digital thermal sensor if CPUID.06H.EAX[0] = 1.
> 
>     Signed-off-by: Huaxu Wan <huaxu.wan@xxxxxxxxxxxxxxx>
> 
> ---
>  Documentation/hwmon/coretemp |    3 ---
>  drivers/hwmon/coretemp.c     |   24 +++++++-----------------
>  2 files changed, 7 insertions(+), 20 deletions(-)
> 
> diff --git a/Documentation/hwmon/coretemp b/Documentation/hwmon/coretemp
> index 92267b6..09ff9cc 100644
> --- a/Documentation/hwmon/coretemp
> +++ b/Documentation/hwmon/coretemp
> @@ -4,9 +4,6 @@ Kernel driver coretemp
>  Supported chips:
>    * All Intel Core family
>      Prefix: 'coretemp'
> -    CPUID: family 0x6, models 0xe (Pentium M DC), 0xf (Core 2 DC 65nm),
> -                              0x16 (Core 2 SC 65nm), 0x17 (Penryn 45nm),
> -                              0x1a (Nehalem), 0x1c (Atom), 0x1e (Lynnfield)
>      Datasheet: Intel 64 and IA-32 Architectures Software Developer's Manual
>                 Volume 3A: System Programming Guide
>                 http://softwarecommunity.intel.com/Wiki/Mobility/720.htm
> diff --git a/drivers/hwmon/coretemp.c b/drivers/hwmon/coretemp.c
> index caef39c..70e7af7 100644
> --- a/drivers/hwmon/coretemp.c
> +++ b/drivers/hwmon/coretemp.c
> @@ -428,6 +428,7 @@ static int __init coretemp_init(void)
>  {
>  	int i, err = -ENODEV;
>  	struct pdev_entry *p, *n;
> +	u32 eax;
>  
>  	/* quick check if we run Intel */
>  	if (cpu_data(0).x86_vendor != X86_VENDOR_INTEL)
> @@ -438,23 +439,12 @@ static int __init coretemp_init(void)
>  		goto exit;
>  
>  	for_each_online_cpu(i) {
> -		struct cpuinfo_x86 *c = &cpu_data(i);
> -
> -		/* check if family 6, models 0xe (Pentium M DC),
> -		  0xf (Core 2 DC 65nm), 0x16 (Core 2 SC 65nm),
> -		  0x17 (Penryn 45nm), 0x1a (Nehalem), 0x1c (Atom),
> -		  0x1e (Lynnfield) */
> -		if ((c->cpuid_level < 0) || (c->x86 != 0x6) ||
> -		    !((c->x86_model == 0xe) || (c->x86_model == 0xf) ||
> -			(c->x86_model == 0x16) || (c->x86_model == 0x17) ||
> -			(c->x86_model == 0x1a) || (c->x86_model == 0x1c) ||
> -			(c->x86_model == 0x1e))) {
> -
> -			/* supported CPU not found, but report the unknown
> -			   family 6 CPU */
> -			if ((c->x86 == 0x6) && (c->x86_model > 0xf))
> -				printk(KERN_WARNING DRVNAME ": Unknown CPU "
> -					"model %x\n", c->x86_model);
> +
> +		/* check if the CPU has thermal sensor */
> +		eax = cpuid_eax(0x06);
> +		if (!(eax & 0x01)) {
> +			struct cpuinfo_x86 *c = &cpu_data(i);
> +			printk(KERN_WARNING DRVNAME ": CPU (model=0x%x) has no thermal sensor!\n", c->x86_model);
>  			continue;
>  		}
>  

Hmm. I don't like it for two reasons:

* Which guarantee do we have that "the processor supports a digital
  thermal sensor" implies that this digital thermal sensor is
  compatible with what the Core/Core2/Atom have? Couldn't the format
  change in the future?
* Each CPU model has its own high temperature limit, which we use to
  compute the current temperature. So we can't pretend that we support
  all future CPU models, we really do not. Just look at how complex
  function adjust_tjmax is.

It would only make sense to have "universal" support if the driver
could report a relative value. Unfortunately our sysfs interface
doesn't support this, although there have been discussions on that
topic lately:

http://thread.gmane.org/gmane.linux.drivers.sensors/20721/focus=917317

-- 
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