Blame view

drivers/hwmon/hwmon-vid.c 9.85 KB
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1
  /*
15872212e   Frank Myhr   hwmon: (hwmon-vid...
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
   * hwmon-vid.c - VID/VRM/VRD voltage conversions
   *
   * Copyright (c) 2004 Rudolf Marek <r.marek@assembler.cz>
   *
   * Partly imported from i2c-vid.h of the lm_sensors project
   * Copyright (c) 2002 Mark D. Studebaker <mdsxyz123@yahoo.com>
   * With assistance from Trent Piepho <xyzzy@speakeasy.org>
   *
   * This program is free software; you can redistribute it and/or modify
   * it under the terms of the GNU General Public License as published by
   * the Free Software Foundation; either version 2 of the License, or
   * (at your option) any later version.
   *
   * This program is distributed in the hope that it will be useful,
   * but WITHOUT ANY WARRANTY; without even the implied warranty of
   * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
   * GNU General Public License for more details.
   *
   * You should have received a copy of the GNU General Public License
   * along with this program; if not, write to the Free Software
   * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
   */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
24

1f923c7a6   Joe Perches   hwmon: (hwmon-vid...
25
  #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
26
27
  #include <linux/module.h>
  #include <linux/kernel.h>
303760b44   Jean Delvare   [PATCH] hwmon: hw...
28
  #include <linux/hwmon-vid.h>
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
29

d0f282706   Jean Delvare   [PATCH] hwmon: hw...
30
  /*
15872212e   Frank Myhr   hwmon: (hwmon-vid...
31
32
33
34
35
36
37
38
39
40
   * Common code for decoding VID pins.
   *
   * References:
   *
   * For VRM 8.4 to 9.1, "VRM x.y DC-DC Converter Design Guidelines",
   * available at http://developer.intel.com/.
   *
   * For VRD 10.0 and up, "VRD x.y Design Guide",
   * available at http://developer.intel.com/.
   *
cebd7709d   Jean Delvare   hwmon-vid: Fix AM...
41
   * AMD Athlon 64 and AMD Opteron Processors, AMD Publication 26094,
631dd1a88   Justin P. Mattock   Update broken web...
42
   * http://support.amd.com/us/Processor_TechDocs/26094.PDF 
cebd7709d   Jean Delvare   hwmon-vid: Fix AM...
43
44
45
46
47
48
49
   * Table 74. VID Code Voltages
   * This corresponds to an arbitrary VRM code of 24 in the functions below.
   * These CPU models (K8 revision <= E) have 5 VID pins. See also:
   * Revision Guide for AMD Athlon 64 and AMD Opteron Processors, AMD Publication 25759,
   * http://www.amd.com/us-en/assets/content_type/white_papers_and_tech_docs/25759.pdf
   *
   * AMD NPT Family 0Fh Processors, AMD Publication 32559,
116d0486b   Frank Myhr   hwmon: (hwmon-vid...
50
51
   * http://www.amd.com/us-en/assets/content_type/white_papers_and_tech_docs/32559.pdf
   * Table 71. VID Code Voltages
cebd7709d   Jean Delvare   hwmon-vid: Fix AM...
52
53
54
55
   * This corresponds to an arbitrary VRM code of 25 in the functions below.
   * These CPU models (K8 revision >= F) have 6 VID pins. See also:
   * Revision Guide for AMD NPT Family 0Fh Processors, AMD Publication 33610,
   * http://www.amd.com/us-en/assets/content_type/white_papers_and_tech_docs/33610.pdf
15872212e   Frank Myhr   hwmon: (hwmon-vid...
56
   *
15872212e   Frank Myhr   hwmon: (hwmon-vid...
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
   * The 17 specification is in fact Intel Mobile Voltage Positioning -
   * (IMVP-II). You can find more information in the datasheet of Max1718
   * http://www.maxim-ic.com/quick_view2.cfm/qv_pk/2452
   *
   * The 13 specification corresponds to the Intel Pentium M series. There
   * doesn't seem to be any named specification for these. The conversion
   * tables are detailed directly in the various Pentium M datasheets:
   * http://www.intel.com/design/intarch/pentiumm/docs_pentiumm.htm
   *
   * The 14 specification corresponds to Intel Core series. There
   * doesn't seem to be any named specification for these. The conversion
   * tables are detailed directly in the various Pentium Core datasheets:
   * http://www.intel.com/design/mobile/datashts/309221.htm
   *
   * The 110 (VRM 11) specification corresponds to Intel Conroe based series.
   * http://www.intel.com/design/processor/applnots/313214.htm
   */
  
  /*
   * vrm is the VRM/VRD document version multiplied by 10.
   * val is the 4-bit or more VID code.
   * Returned value is in mV to avoid floating point in the kernel.
   * Some VID have some bits in uV scale, this is rounded to mV.
   */
734a12a36   Rudolf Marek   [PATCH] hwmon: ad...
81
  int vid_from_reg(int val, u8 vrm)
d0f282706   Jean Delvare   [PATCH] hwmon: hw...
82
83
84
85
  {
  	int vid;
  
  	switch(vrm) {
d0f282706   Jean Delvare   [PATCH] hwmon: hw...
86
  	case 100:               /* VRD 10.0 */
6af586dc5   Rudolf Marek   [PATCH] hwmon-vid...
87
  		/* compute in uV, round to mV */
177d165d7   Rudolf Marek   [PATCH] HWMON: Tr...
88
  		val &= 0x3f;
d0f282706   Jean Delvare   [PATCH] hwmon: hw...
89
90
91
  		if((val & 0x1f) == 0x1f)
  			return 0;
  		if((val & 0x1f) <= 0x09 || val == 0x0a)
6af586dc5   Rudolf Marek   [PATCH] hwmon-vid...
92
  			vid = 1087500 - (val & 0x1f) * 25000;
d0f282706   Jean Delvare   [PATCH] hwmon: hw...
93
  		else
6af586dc5   Rudolf Marek   [PATCH] hwmon-vid...
94
  			vid = 1862500 - (val & 0x1f) * 25000;
d0f282706   Jean Delvare   [PATCH] hwmon: hw...
95
  		if(val & 0x20)
6af586dc5   Rudolf Marek   [PATCH] hwmon-vid...
96
97
  			vid -= 12500;
  		return((vid + 500) / 1000);
d0f282706   Jean Delvare   [PATCH] hwmon: hw...
98

6af586dc5   Rudolf Marek   [PATCH] hwmon-vid...
99
100
101
  	case 110:		/* Intel Conroe */
  				/* compute in uV, round to mV */
  		val &= 0xff;
9fab2d8b7   Jean Delvare   hwmon: Fix the VR...
102
  		if (val < 0x02 || val > 0xb2)
6af586dc5   Rudolf Marek   [PATCH] hwmon-vid...
103
104
  			return 0;
  		return((1600000 - (val - 2) * 6250 + 500) / 1000);
116d0486b   Frank Myhr   hwmon: (hwmon-vid...
105

cebd7709d   Jean Delvare   hwmon-vid: Fix AM...
106
107
108
109
110
111
  	case 24:		/* Athlon64 & Opteron */
  		val &= 0x1f;
  		if (val == 0x1f)
  			return 0;
  				/* fall through */
  	case 25:		/* AMD NPT 0Fh */
116d0486b   Frank Myhr   hwmon: (hwmon-vid...
112
113
114
  		val &= 0x3f;
  		return (val < 32) ? 1550 - 25 * val
  			: 775 - (25 * (val - 31)) / 2;
d0f282706   Jean Delvare   [PATCH] hwmon: hw...
115
116
117
  
  	case 91:		/* VRM 9.1 */
  	case 90:		/* VRM 9.0 */
177d165d7   Rudolf Marek   [PATCH] HWMON: Tr...
118
  		val &= 0x1f;
d0f282706   Jean Delvare   [PATCH] hwmon: hw...
119
120
121
122
  		return(val == 0x1f ? 0 :
  		                       1850 - val * 25);
  
  	case 85:		/* VRM 8.5 */
177d165d7   Rudolf Marek   [PATCH] HWMON: Tr...
123
  		val &= 0x1f;
d0f282706   Jean Delvare   [PATCH] hwmon: hw...
124
125
126
127
128
129
130
  		return((val & 0x10  ? 25 : 0) +
  		       ((val & 0x0f) > 0x04 ? 2050 : 1250) -
  		       ((val & 0x0f) * 50));
  
  	case 84:		/* VRM 8.4 */
  		val &= 0x0f;
  				/* fall through */
734a12a36   Rudolf Marek   [PATCH] hwmon: ad...
131
  	case 82:		/* VRM 8.2 */
177d165d7   Rudolf Marek   [PATCH] HWMON: Tr...
132
  		val &= 0x1f;
d0f282706   Jean Delvare   [PATCH] hwmon: hw...
133
134
135
  		return(val == 0x1f ? 0 :
  		       val & 0x10  ? 5100 - (val) * 100 :
  		                     2050 - (val) * 50);
734a12a36   Rudolf Marek   [PATCH] hwmon: ad...
136
  	case 17:		/* Intel IMVP-II */
177d165d7   Rudolf Marek   [PATCH] HWMON: Tr...
137
  		val &= 0x1f;
734a12a36   Rudolf Marek   [PATCH] hwmon: ad...
138
139
  		return(val & 0x10 ? 975 - (val & 0xF) * 25 :
  				    1750 - val * 50);
4c537fb28   Jean Delvare   [PATCH] hwmon: Su...
140
  	case 13:
0a88f4b55   Jean Delvare   hwmon-vid: Add su...
141
  	case 131:
177d165d7   Rudolf Marek   [PATCH] HWMON: Tr...
142
  		val &= 0x3f;
0a88f4b55   Jean Delvare   hwmon-vid: Add su...
143
144
145
  		/* Exception for Eden ULV 500 MHz */
  		if (vrm == 131 && val == 0x3f)
  			val++;
177d165d7   Rudolf Marek   [PATCH] HWMON: Tr...
146
  		return(1708 - val * 16);
6af586dc5   Rudolf Marek   [PATCH] hwmon-vid...
147
148
149
150
  	case 14:		/* Intel Core */
  				/* compute in uV, round to mV */
  		val &= 0x7f;
  		return(val > 0x77 ? 0 : (1500000 - (val * 12500) + 500) / 1000);
734a12a36   Rudolf Marek   [PATCH] hwmon: ad...
151
  	default:		/* report 0 for unknown */
45f2acc48   Jean Delvare   hwmon-vid: Don't ...
152
  		if (vrm)
1f923c7a6   Joe Perches   hwmon: (hwmon-vid...
153
154
155
  			pr_warn("Requested unsupported VRM version (%u)
  ",
  				(unsigned int)vrm);
734a12a36   Rudolf Marek   [PATCH] hwmon: ad...
156
  		return 0;
d0f282706   Jean Delvare   [PATCH] hwmon: hw...
157
158
159
160
161
  	}
  }
  
  
  /*
15872212e   Frank Myhr   hwmon: (hwmon-vid...
162
163
164
   * After this point is the code to automatically determine which
   * VRM/VRD specification should be used depending on the CPU.
   */
d0f282706   Jean Delvare   [PATCH] hwmon: hw...
165

1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
166
167
168
169
  struct vrm_model {
  	u8 vendor;
  	u8 eff_family;
  	u8 eff_model;
734a12a36   Rudolf Marek   [PATCH] hwmon: ad...
170
171
  	u8 eff_stepping;
  	u8 vrm_type;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
172
173
174
175
176
  };
  
  #define ANY 0xFF
  
  #ifdef CONFIG_X86
cebd7709d   Jean Delvare   hwmon-vid: Fix AM...
177
178
179
180
181
  /*
   * The stepping parameter is highest acceptable stepping for current line.
   * The model match must be exact for 4-bit values. For model values 0x10
   * and above (extended model), all models below the parameter will match.
   */
734a12a36   Rudolf Marek   [PATCH] hwmon: ad...
182

1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
183
  static struct vrm_model vrm_models[] = {
734a12a36   Rudolf Marek   [PATCH] hwmon: ad...
184
  	{X86_VENDOR_AMD, 0x6, ANY, ANY, 90},		/* Athlon Duron etc */
cebd7709d   Jean Delvare   hwmon-vid: Fix AM...
185
  	{X86_VENDOR_AMD, 0xF, 0x3F, ANY, 24},		/* Athlon 64, Opteron */
5bed13f58   Jean Delvare   hwmon-vid: Ignore...
186
187
188
189
190
191
  	/* In theory, all NPT family 0Fh processors have 6 VID pins and should
  	   thus use vrm 25, however in practice not all mainboards route the
  	   6th VID pin because it is never needed. So we use the 5 VID pin
  	   variant (vrm 24) for the models which exist today. */
  	{X86_VENDOR_AMD, 0xF, 0x7F, ANY, 24},		/* NPT family 0Fh */
  	{X86_VENDOR_AMD, 0xF, ANY, ANY, 25},		/* future fam. 0Fh */
1b871826b   Jean Delvare   hwmon-vid: Add su...
192
  	{X86_VENDOR_AMD, 0x10, ANY, ANY, 25},		/* NPT family 10h */
5bed13f58   Jean Delvare   hwmon-vid: Ignore...
193

4c537fb28   Jean Delvare   [PATCH] hwmon: Su...
194
  	{X86_VENDOR_INTEL, 0x6, 0x9, ANY, 13},		/* Pentium M (130 nm) */
734a12a36   Rudolf Marek   [PATCH] hwmon: ad...
195
  	{X86_VENDOR_INTEL, 0x6, 0xB, ANY, 85},		/* Tualatin */
4c537fb28   Jean Delvare   [PATCH] hwmon: Su...
196
  	{X86_VENDOR_INTEL, 0x6, 0xD, ANY, 13},		/* Pentium M (90 nm) */
6af586dc5   Rudolf Marek   [PATCH] hwmon-vid...
197
198
  	{X86_VENDOR_INTEL, 0x6, 0xE, ANY, 14},		/* Intel Core (65 nm) */
  	{X86_VENDOR_INTEL, 0x6, 0xF, ANY, 110},		/* Intel Conroe */
734a12a36   Rudolf Marek   [PATCH] hwmon: ad...
199
  	{X86_VENDOR_INTEL, 0x6, ANY, ANY, 82},		/* any P6 */
734a12a36   Rudolf Marek   [PATCH] hwmon: ad...
200
201
202
203
  	{X86_VENDOR_INTEL, 0xF, 0x0, ANY, 90},		/* P4 */
  	{X86_VENDOR_INTEL, 0xF, 0x1, ANY, 90},		/* P4 Willamette */
  	{X86_VENDOR_INTEL, 0xF, 0x2, ANY, 90},		/* P4 Northwood */
  	{X86_VENDOR_INTEL, 0xF, ANY, ANY, 100},		/* Prescott and above assume VRD 10 */
5bed13f58   Jean Delvare   hwmon-vid: Ignore...
204

734a12a36   Rudolf Marek   [PATCH] hwmon: ad...
205
206
  	{X86_VENDOR_CENTAUR, 0x6, 0x7, ANY, 85},	/* Eden ESP/Ezra */
  	{X86_VENDOR_CENTAUR, 0x6, 0x8, 0x7, 85},	/* Ezra T */
014ab488e   Jean Delvare   hwmon-vid: Fix ty...
207
  	{X86_VENDOR_CENTAUR, 0x6, 0x9, 0x7, 85},	/* Nehemiah */
e46751bfd   Rudolf Marek   hwmon-vid: Add su...
208
209
  	{X86_VENDOR_CENTAUR, 0x6, 0x9, ANY, 17},	/* C3-M, Eden-N */
  	{X86_VENDOR_CENTAUR, 0x6, 0xA, 0x7, 0},		/* No information */
0a88f4b55   Jean Delvare   hwmon-vid: Add su...
210
211
  	{X86_VENDOR_CENTAUR, 0x6, 0xA, ANY, 13},	/* C7-M, C7, Eden (Esther) */
  	{X86_VENDOR_CENTAUR, 0x6, 0xD, ANY, 134},	/* C7-D, C7-M, C7, Eden (Esther) */
5bed13f58   Jean Delvare   hwmon-vid: Ignore...
212

734a12a36   Rudolf Marek   [PATCH] hwmon: ad...
213
  	{X86_VENDOR_UNKNOWN, ANY, ANY, ANY, 0}		/* stop here */
da97a5a32   Jean Delvare   [PATCH] hwmon: hw...
214
  };
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
215

0a88f4b55   Jean Delvare   hwmon-vid: Add su...
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
  /*
   * Special case for VIA model D: there are two different possible
   * VID tables, so we have to figure out first, which one must be
   * used. This resolves temporary drm value 134 to 14 (Intel Core
   * 7-bit VID), 13 (Pentium M 6-bit VID) or 131 (Pentium M 6-bit VID
   * + quirk for Eden ULV 500 MHz).
   * Note: something similar might be needed for model A, I'm not sure.
   */
  static u8 get_via_model_d_vrm(void)
  {
  	unsigned int vid, brand, dummy;
  	static const char *brands[4] = {
  		"C7-M", "C7", "Eden", "C7-D"
  	};
  
  	rdmsr(0x198, dummy, vid);
  	vid &= 0xff;
  
  	rdmsr(0x1154, brand, dummy);
  	brand = ((brand >> 4) ^ (brand >> 2)) & 0x03;
  
  	if (vid > 0x3f) {
  		pr_info("Using %d-bit VID table for VIA %s CPU
  ",
  			7, brands[brand]);
  		return 14;
  	} else {
  		pr_info("Using %d-bit VID table for VIA %s CPU
  ",
  			6, brands[brand]);
  		/* Enable quirk for Eden */
  		return brand == 2 ? 131 : 13;
  	}
  }
734a12a36   Rudolf Marek   [PATCH] hwmon: ad...
250
  static u8 find_vrm(u8 eff_family, u8 eff_model, u8 eff_stepping, u8 vendor)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
251
252
253
254
255
  {
  	int i = 0;
  
  	while (vrm_models[i].vendor!=X86_VENDOR_UNKNOWN) {
  		if (vrm_models[i].vendor==vendor)
da97a5a32   Jean Delvare   [PATCH] hwmon: hw...
256
257
  			if ((vrm_models[i].eff_family==eff_family)
  			 && ((vrm_models[i].eff_model==eff_model) ||
cebd7709d   Jean Delvare   hwmon-vid: Fix AM...
258
259
  			     (vrm_models[i].eff_model >= 0x10 &&
  			      eff_model <= vrm_models[i].eff_model) ||
734a12a36   Rudolf Marek   [PATCH] hwmon: ad...
260
261
  			     (vrm_models[i].eff_model==ANY)) &&
  			     (eff_stepping <= vrm_models[i].eff_stepping))
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
262
263
264
265
266
267
  				return vrm_models[i].vrm_type;
  		i++;
  	}
  
  	return 0;
  }
734a12a36   Rudolf Marek   [PATCH] hwmon: ad...
268
  u8 vid_which_vrm(void)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
269
  {
92cb7612a   Mike Travis   x86: convert cpui...
270
  	struct cpuinfo_x86 *c = &cpu_data(0);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
271
  	u32 eax;
734a12a36   Rudolf Marek   [PATCH] hwmon: ad...
272
  	u8 eff_family, eff_model, eff_stepping, vrm_ret;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
273

da97a5a32   Jean Delvare   [PATCH] hwmon: hw...
274
275
  	if (c->x86 < 6)		/* Any CPU with family lower than 6 */
  		return 0;	/* doesn't have VID and/or CPUID */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
276
277
278
  	eax = cpuid_eax(1);
  	eff_family = ((eax & 0x00000F00)>>8);
  	eff_model  = ((eax & 0x000000F0)>>4);
734a12a36   Rudolf Marek   [PATCH] hwmon: ad...
279
  	eff_stepping = eax & 0xF;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
280
281
282
283
  	if (eff_family == 0xF) {	/* use extended model & family */
  		eff_family += ((eax & 0x00F00000)>>20);
  		eff_model += ((eax & 0x000F0000)>>16)<<4;
  	}
734a12a36   Rudolf Marek   [PATCH] hwmon: ad...
284
  	vrm_ret = find_vrm(eff_family, eff_model, eff_stepping, c->x86_vendor);
0a88f4b55   Jean Delvare   hwmon-vid: Add su...
285
286
  	if (vrm_ret == 134)
  		vrm_ret = get_via_model_d_vrm();
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
287
  	if (vrm_ret == 0)
1f923c7a6   Joe Perches   hwmon: (hwmon-vid...
288
289
  		pr_info("Unknown VRM version of your x86 CPU
  ");
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
290
291
  	return vrm_ret;
  }
734a12a36   Rudolf Marek   [PATCH] hwmon: ad...
292
  /* and now for something completely different for the non-x86 world */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
293
  #else
734a12a36   Rudolf Marek   [PATCH] hwmon: ad...
294
  u8 vid_which_vrm(void)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
295
  {
1f923c7a6   Joe Perches   hwmon: (hwmon-vid...
296
297
  	pr_info("Unknown VRM version of your CPU
  ");
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
298
299
300
  	return 0;
  }
  #endif
d0f282706   Jean Delvare   [PATCH] hwmon: hw...
301
  EXPORT_SYMBOL(vid_from_reg);
303760b44   Jean Delvare   [PATCH] hwmon: hw...
302
  EXPORT_SYMBOL(vid_which_vrm);
96478ef3f   Jean Delvare   [PATCH] hwmon: hw...
303

7188cc66b   Jean Delvare   hwmon: Update Rud...
304
  MODULE_AUTHOR("Rudolf Marek <r.marek@assembler.cz>");
96478ef3f   Jean Delvare   [PATCH] hwmon: hw...
305

303760b44   Jean Delvare   [PATCH] hwmon: hw...
306
  MODULE_DESCRIPTION("hwmon-vid driver");
96478ef3f   Jean Delvare   [PATCH] hwmon: hw...
307
  MODULE_LICENSE("GPL");