[PATCH] Add support for Atom CPUs

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

 



Hi Rudolf,

On Mon, 06 Jul 2009 22:38:10 +0200, Rudolf Marek wrote:
> Thanks Martin for a test. It seems that TAGET MSR is not implemented, also
> driver incorrectly reports that it uses relative temperature scale. Fix it with
> updated patch.
> 
> 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 17:07:16.458757525 +0200
> +++ linux-2.6.30.1/drivers/hwmon/coretemp.c	2009-07-06 22:34:59.417758968 +0200
> @@ -157,17 +157,24 @@
>  	/* The 100C is default for both mobile and non mobile CPUs */
>  
>  	int tjmax = 100000;
> -	int ismobile = 1;
> +	int usemsr_ee = 1;
>  	int err;
>  	u32 eax, edx;
>  
>  	/* Early chips have no MSR for TjMax */
>  
>  	if ((c->x86_model == 0xf) && (c->x86_mask < 4)) {
> -		ismobile = 0;
> +		usemsr_ee = 0;
>  	}
>  
> -	if ((c->x86_model > 0xe) && (ismobile)) {
> +	/* Atoms seems to have TjMax at 90C */
> +
> +	if (c->x86_model == 0x1c) {
> +		usemsr_ee = 0;
> +		tjmax = 90000;
> +	}
> +
> +	if ((c->x86_model > 0xe) && (usemsr_ee)) {
>  
>  		/* Now we can detect the mobile CPU using Intel provided table
>  		   http://softwarecommunity.intel.com/Wiki/Mobility/720.htm
> @@ -179,13 +186,13 @@
>  			dev_warn(dev,
>  				 "Unable to access MSR 0x17, assuming desktop"
>  				 " CPU\n");
> -			ismobile = 0;
> +			usemsr_ee = 0;
>  		} else if (!(eax & 0x10000000)) {
> -			ismobile = 0;
> +			usemsr_ee = 0;
>  		}
>  	}
>  
> -	if (ismobile) {
> +	if (usemsr_ee) {
>  
>  		err = rdmsr_safe_on_cpu(id, 0xee, &eax, &edx);
>  		if (err) {
> @@ -195,7 +202,8 @@
>  		} else if (eax & 0x40000000) {
>  			tjmax = 85000;
>  		}
> -	} else {
> +	/* if we dont use msr EE it means we are desktop CPU (with exeception of Atom) */

Line too long.

> +	} else if (tjmax == 100000) {
>  		dev_warn(dev, "Using relative temperature scale!\n");
>  	}
>  

I think function adjust_tjmax() has reached its limit of readability. I
don't understand why it needs to be so complex. For example, the case
of the Atom is very simply always return 90 degree C. So why not just:

	/* Atoms seems to have TjMax at 90C */
	if (c->x86_model == 0x1c)
		return 90000;

at the beginning of the function, and be done with that case? And I
suspect the rest can be simplified a bit too.

> @@ -248,9 +256,9 @@
>  	platform_set_drvdata(pdev, data);
>  
>  	/* read the still undocumented IA32_TEMPERATURE_TARGET it exists
> -	   on older CPUs but not in this register */
> +	   on older CPUs but not in this register, Atoms don't have it too */

s/too/either/

>  
> -	if (c->x86_model > 0xe) {
> +	if ((c->x86_model > 0xe) && (c->x86_model != 0x1c)) {
>  		err = rdmsr_safe_on_cpu(data->id, 0x1a2, &eax, &edx);
>  		if (err) {
>  			dev_warn(&pdev->dev, "Unable to read"
> @@ -413,11 +421,11 @@
>  	for_each_online_cpu(i) {
>  		struct cpuinfo_x86 *c = &cpu_data(i);
>  
> -		/* check if family 6, models 0xe, 0xf, 0x16, 0x17, 0x1A */
> +		/* check if family 6, models 0xe, 0xf, 0x16, 0x17, 0x1A, 0x1c */
>  		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 == 0x1A) || (c->x86_model == 0x1c))) {
>  
>  			/* supported CPU not found, but report the unknown
>  			   family 6 CPU */

sensors-detect needs to be updated as well.

> Index: linux-2.6.30.1/Documentation/hwmon/coretemp
> ===================================================================
> --- linux-2.6.30.1.orig/Documentation/hwmon/coretemp	2009-07-06 18:31:56.262759644 +0200
> +++ linux-2.6.30.1/Documentation/hwmon/coretemp	2009-07-06 22:31:01.905898848 +0200
> @@ -4,7 +4,7 @@
>  Supported chips:
>    * All Intel Core family
>      Prefix: 'coretemp'
> -    CPUID: family 0x6, models 0xe, 0xf, 0x16, 0x17
> +    CPUID: family 0x6, models 0xe, 0xf, 0x16, 0x17, 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
> Index: linux-2.6.30.1/drivers/hwmon/Kconfig
> ===================================================================
> --- linux-2.6.30.1.orig/drivers/hwmon/Kconfig	2009-07-06 18:32:31.974757310 +0200
> +++ linux-2.6.30.1/drivers/hwmon/Kconfig	2009-07-06 18:33:48.566759515 +0200
> @@ -402,12 +402,12 @@
>  	  will be called gl520sm.
>  
>  config SENSORS_CORETEMP
> -	tristate "Intel Core (2) Duo/Solo temperature sensor"
> +	tristate "Intel Core/Core2/Atom temperature sensor"
>  	depends on X86 && EXPERIMENTAL
>  	help
>  	  If you say yes here you get support for the temperature
> -	  sensor inside your CPU. Supported all are all known variants
> -	  of Intel Core family.
> +	  sensor inside your CPU. Most of the family 6 CPUs
> +	  are supported. Check documentation/driver for details.
>  
>  config SENSORS_IBMAEM
>  	tristate "IBM Active Energy Manager temperature/power sensors and control"


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