[PATCH] Add support for Penryn mobile CPUs

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

 



Hi Ruik,

On Mon, 06 Jul 2009 18:39:20 +0200, Rudolf Marek wrote:
> Following patch adds support for mobile Penryn CPUs. Intel documents this
> poorly. I asked the Coretemp author for some help. This is totally untested and
> may not work. Please test!
> 
> Signed-off-by: Rudolf Marek <r.marek at assembler.cz>

> Index: linux-2.6.30.1/drivers/hwmon/coretemp.c
> ===================================================================
> --- linux-2.6.30.1.orig/drivers/hwmon/coretemp.c	2009-07-06 18:25:46.934758067 +0200
> +++ linux-2.6.30.1/drivers/hwmon/coretemp.c	2009-07-06 18:35:38.602757417 +0200
> @@ -157,6 +157,7 @@
>  	/* The 100C is default for both mobile and non mobile CPUs */
>  
>  	int tjmax = 100000;
> +	int tjmax_ee = 85000;
>  	int usemsr_ee = 1;
>  	int err;
>  	u32 eax, edx;
> @@ -175,20 +176,31 @@
>  	}
>  
>  	if ((c->x86_model > 0xe) && (usemsr_ee)) {
> -
> +		u8 platform_id;
>  		/* Now we can detect the mobile CPU using Intel provided table
>  		   http://softwarecommunity.intel.com/Wiki/Mobility/720.htm
>  		   For Core2 cores, check MSR 0x17, bit 28 1 = Mobile CPU
>  		*/
>  
>  		err = rdmsr_safe_on_cpu(id, 0x17, &eax, &edx);
> +		/* Platform ID bits 52:50 (EDX starts at bit 32) */
> +		platform_id = (edx >> 18) & 0x7;
>  		if (err) {

Logic is invalid: if there's an error then the value of edx is
undefined.

>  			dev_warn(dev,
>  				 "Unable to access MSR 0x17, assuming desktop"
>  				 " CPU\n");
>  			usemsr_ee = 0;
> -		} else if (!(eax & 0x10000000)) {
> +		/* trust bit 28 up to Penryn, I could not find any documentation on that
> +		   if you happen to know someone at Intel please ask */
> +

Indentation is pretty messy, and first comment line is too long.

> +		} else if ((!(eax & 0x10000000)) && (c->x86_model < 0x17)) {

It would make more sense to check model first and eax second IMHO.

>  			usemsr_ee = 0;
> +		/* Mobile Penryn CPU seems to be platform ID 7 or 5 (guesswork) */

Line too long.

> +		} else if ((c->x86_model == 0x17) &&
> +				((platform_id == 5) || (platform_id == 7))) {
> +			/* If MSR EE bit is set, set it to 90C otherwise 105C */
> +			tjmax_ee = 90000;
> +			tjmax = 105000;
>  		}
>  	}
>  
> @@ -200,7 +212,7 @@
>  				 "Unable to access MSR 0xEE, for Tjmax, left"
>  				 " at default");
>  		} else if (eax & 0x40000000) {
> -			tjmax = 85000;
> +			tjmax = tjmax_ee;
>  		}
>  	} else {
>  		dev_warn(dev, "Using relative temperature scale!\n");
> @@ -420,7 +432,9 @@
>  	for_each_online_cpu(i) {
>  		struct cpuinfo_x86 *c = &cpu_data(i);
>  
> -		/* check if family 6, models 0xe, 0xf, 0x16, 0x17, 0x1A, 0x1c */
> +		/* check if family 6, models 0xe (Pentium M DC),
> +		  0xf (Core 2 DC 65nm), 0x16 (Core 2 SC 65nm), 0x17 (Penryn 45nm)

Line too long.

> +		  0x1a (Nehalem), 0x1c (Atom) */
>  		if ((c->cpuid_level < 0) || (c->x86 != 0x6) ||
>  		    !((c->x86_model == 0xe) || (c->x86_model == 0xf) ||
>  			(c->x86_model == 0x16) || (c->x86_model == 0x17) ||
> Index: linux-2.6.30.1/Documentation/hwmon/coretemp
> ===================================================================
> --- linux-2.6.30.1.orig/Documentation/hwmon/coretemp	2009-07-06 18:35:53.765759446 +0200
> +++ linux-2.6.30.1/Documentation/hwmon/coretemp	2009-07-06 18:36:39.817757139 +0200
> @@ -4,7 +4,9 @@
>  Supported chips:
>    * All Intel Core family
>      Prefix: 'coretemp'
> -    CPUID: family 0x6, models 0xe, 0xf, 0x16, 0x17, 0x1c (Atom)
> +    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).
>      Datasheet: Intel 64 and IA-32 Architectures Software Developer's Manual
>                 Volume 3A: System Programming Guide
>                 http://softwarecommunity.intel.com/Wiki/Mobility/720.htm


-- 
Jean Delvare



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

  Powered by Linux