Re: [PATCH 2/5] hwmon: (coretemp) Use model table instead of if/else to identify CPU models

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

 



On Tue,  9 Oct 2012 14:09:00 -0700, Guenter Roeck wrote:
> Make the code easier to extend and easier to adjust by using a model table
> listing CPU models, stepping/mask, and associated TjMax.
> 
> Signed-off-by: Guenter Roeck <linux@xxxxxxxxxxxx>
> ---
>  drivers/hwmon/coretemp.c |   36 ++++++++++++++++++++++--------------
>  1 file changed, 22 insertions(+), 14 deletions(-)

I like the idea. Just a couple things about the implementation:

> diff --git a/drivers/hwmon/coretemp.c b/drivers/hwmon/coretemp.c
> index 1937cd4..7107096 100644
> --- a/drivers/hwmon/coretemp.c
> +++ b/drivers/hwmon/coretemp.c
> @@ -208,6 +208,23 @@ static const struct tjmax __cpuinitconst tjmax_table[] = {
>  	{ "CPU  330", 125000 },
>  };
>  
> +struct tjmax_model {
> +	u8 model;
> +	u8 mask;
> +	int tjmax;
> +};
> +
> +static const struct tjmax_model __cpuinitconst tjmax_model_table[] = {
> +	{ 0x1c, 10, 100000 },	/* D4xx, N4xx, D5xx, N5xx */
> +	{ 0x1c, 0, 90000 },	/* Z5xx, N2xx, 230, 330, others	*/

I don't think the 230 and 330 should be listed there, as they are
overridden by an earlier match in tjmax_table[].

> +	{ 0x26, 0, 90000 },	/* Atom Tunnel Creek (Exx), Lincroft (Z6xx)
> +				 * Note: TjMax for E6xxT is 110C, but CPU type
> +				 * is undetectable by software
> +				 */
> +	{ 0x27, 0, 90000 },	/* Atom Medfield (Z2460) */
> +	{ 0x36, 0, 100000 },	/* Atom Cedar Trail/Cedarview (N2xxx, D2xxx) */
> +};

Using 0 as a special value may be problematic, as I think it is a
possible stepping value:

http://openbenchmarking.org/system/1109120-IV-TSCP1539338/tscp1/cpuinfo

(I agree model name looks odd, not sure if it is a public model or some
engineering sample.)

In hwmon-vid we have:

#define ANY 0xFF

and we use that when the stepping doesn't matter. Note that we also
support stepping ranges there, maybe we'll need it for coretemp too
some day, but I guess we can add it then.

> +
>  static int __cpuinit adjust_tjmax(struct cpuinfo_x86 *c, u32 id,
>  				  struct device *dev)
>  {
> @@ -226,20 +243,11 @@ static int __cpuinit adjust_tjmax(struct cpuinfo_x86 *c, u32 id,
>  			return tjmax_table[i].tjmax;
>  	}
>  
> -	/* Atom CPUs */
> -
> -	if (c->x86_model == 0x1c) {
> -		/*
> -		 * TjMax for stepping 10 CPUs (N4xx, N5xx, D4xx, D5xx)
> -		 * is 100 degrees C, for all others it is 90 degrees C.
> -		 */
> -		if (c->x86_mask == 10)
> -			return 100000;
> -		return 90000;
> -	} else if (c->x86_model == 0x26 || c->x86_model == 0x27) {
> -		return 90000;
> -	} else if (c->x86_model == 0x36) {
> -		return 100000;
> +	for (i = 0; i < ARRAY_SIZE(tjmax_model_table); i++) {
> +		const struct tjmax_model *tm = &tjmax_model_table[i];
> +		if (c->x86_model == tm->model &&
> +		    (!tm->mask || c->x86_mask == tm->mask))
> +			return tm->tjmax;
>  	}
>  
>  	/* Early chips have no MSR for TjMax */

Other than these implementation details:

Acked-by: Jean Delvare <khali@xxxxxxxxxxxx>

-- 
Jean Delvare
--
To unsubscribe from this list: send the line "unsubscribe linux-doc" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[Index of Archives]     [Kernel Newbies]     [Security]     [Netfilter]     [Bugtraq]     [Linux FS]     [Yosemite Forum]     [MIPS Linux]     [ARM Linux]     [Linux Security]     [Linux RAID]     [Samba]     [Video 4 Linux]     [Device Mapper]     [Linux Resources]

  Powered by Linux