]> git.proxmox.com Git - mirror_ubuntu-artful-kernel.git/blame - drivers/hwmon/hwmon-vid.c
hwmon: (w83627hf) hoist nr-1 offset out of show-store-temp-X
[mirror_ubuntu-artful-kernel.git] / drivers / hwmon / hwmon-vid.c
CommitLineData
1da177e4 1/*
303760b4 2 hwmon-vid.c - VID/VRM/VRD voltage conversions
1da177e4 3
7188cc66 4 Copyright (c) 2004 Rudolf Marek <r.marek@assembler.cz>
1da177e4 5
d0f28270
JD
6 Partly imported from i2c-vid.h of the lm_sensors project
7 Copyright (c) 2002 Mark D. Studebaker <mdsxyz123@yahoo.com>
8 With assistance from Trent Piepho <xyzzy@speakeasy.org>
9
1da177e4
LT
10 This program is free software; you can redistribute it and/or modify
11 it under the terms of the GNU General Public License as published by
12 the Free Software Foundation; either version 2 of the License, or
13 (at your option) any later version.
14
15 This program is distributed in the hope that it will be useful,
16 but WITHOUT ANY WARRANTY; without even the implied warranty of
17 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18 GNU General Public License for more details.
19
20 You should have received a copy of the GNU General Public License
21 along with this program; if not, write to the Free Software
22 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
23*/
24
1da177e4
LT
25#include <linux/module.h>
26#include <linux/kernel.h>
303760b4 27#include <linux/hwmon-vid.h>
1da177e4 28
d0f28270
JD
29/*
30 Common code for decoding VID pins.
31
32 References:
33
34 For VRM 8.4 to 9.1, "VRM x.y DC-DC Converter Design Guidelines",
35 available at http://developer.intel.com/.
36
37 For VRD 10.0 and up, "VRD x.y Design Guide",
38 available at http://developer.intel.com/.
39
40 AMD Opteron processors don't follow the Intel specifications.
41 I'm going to "make up" 2.4 as the spec number for the Opterons.
42 No good reason just a mnemonic for the 24x Opteron processor
43 series.
44
45 Opteron VID encoding is:
46 00000 = 1.550 V
47 00001 = 1.525 V
48 . . . .
49 11110 = 0.800 V
50 11111 = 0.000 V (off)
734a12a3
RM
51
52 The 17 specification is in fact Intel Mobile Voltage Positioning -
53 (IMVP-II). You can find more information in the datasheet of Max1718
54 http://www.maxim-ic.com/quick_view2.cfm/qv_pk/2452
55
4c537fb2
JD
56 The 13 specification corresponds to the Intel Pentium M series. There
57 doesn't seem to be any named specification for these. The conversion
58 tables are detailed directly in the various Pentium M datasheets:
59 http://www.intel.com/design/intarch/pentiumm/docs_pentiumm.htm
6af586dc
RM
60
61 The 14 specification corresponds to Intel Core series. There
62 doesn't seem to be any named specification for these. The conversion
63 tables are detailed directly in the various Pentium Core datasheets:
64 http://www.intel.com/design/mobile/datashts/309221.htm
65
66 The 110 (VRM 11) specification corresponds to Intel Conroe based series.
67 http://www.intel.com/design/processor/applnots/313214.htm
d0f28270
JD
68*/
69
70/* vrm is the VRM/VRD document version multiplied by 10.
6af586dc
RM
71 val is the 4-bit or more VID code.
72 Returned value is in mV to avoid floating point in the kernel.
73 Some VID have some bits in uV scale, this is rounded to mV */
734a12a3 74int vid_from_reg(int val, u8 vrm)
d0f28270
JD
75{
76 int vid;
77
78 switch(vrm) {
79
d0f28270 80 case 100: /* VRD 10.0 */
6af586dc 81 /* compute in uV, round to mV */
177d165d 82 val &= 0x3f;
d0f28270
JD
83 if((val & 0x1f) == 0x1f)
84 return 0;
85 if((val & 0x1f) <= 0x09 || val == 0x0a)
6af586dc 86 vid = 1087500 - (val & 0x1f) * 25000;
d0f28270 87 else
6af586dc 88 vid = 1862500 - (val & 0x1f) * 25000;
d0f28270 89 if(val & 0x20)
6af586dc
RM
90 vid -= 12500;
91 return((vid + 500) / 1000);
d0f28270 92
6af586dc
RM
93 case 110: /* Intel Conroe */
94 /* compute in uV, round to mV */
95 val &= 0xff;
9fab2d8b 96 if (val < 0x02 || val > 0xb2)
6af586dc
RM
97 return 0;
98 return((1600000 - (val - 2) * 6250 + 500) / 1000);
d0f28270 99 case 24: /* Opteron processor */
177d165d 100 val &= 0x1f;
d0f28270
JD
101 return(val == 0x1f ? 0 : 1550 - val * 25);
102
103 case 91: /* VRM 9.1 */
104 case 90: /* VRM 9.0 */
177d165d 105 val &= 0x1f;
d0f28270
JD
106 return(val == 0x1f ? 0 :
107 1850 - val * 25);
108
109 case 85: /* VRM 8.5 */
177d165d 110 val &= 0x1f;
d0f28270
JD
111 return((val & 0x10 ? 25 : 0) +
112 ((val & 0x0f) > 0x04 ? 2050 : 1250) -
113 ((val & 0x0f) * 50));
114
115 case 84: /* VRM 8.4 */
116 val &= 0x0f;
117 /* fall through */
734a12a3 118 case 82: /* VRM 8.2 */
177d165d 119 val &= 0x1f;
d0f28270
JD
120 return(val == 0x1f ? 0 :
121 val & 0x10 ? 5100 - (val) * 100 :
122 2050 - (val) * 50);
734a12a3 123 case 17: /* Intel IMVP-II */
177d165d 124 val &= 0x1f;
734a12a3
RM
125 return(val & 0x10 ? 975 - (val & 0xF) * 25 :
126 1750 - val * 50);
4c537fb2 127 case 13:
177d165d
RM
128 val &= 0x3f;
129 return(1708 - val * 16);
6af586dc
RM
130 case 14: /* Intel Core */
131 /* compute in uV, round to mV */
132 val &= 0x7f;
133 return(val > 0x77 ? 0 : (1500000 - (val * 12500) + 500) / 1000);
734a12a3 134 default: /* report 0 for unknown */
45f2acc4
JD
135 if (vrm)
136 printk(KERN_WARNING "hwmon-vid: Requested unsupported "
137 "VRM version (%u)\n", (unsigned int)vrm);
734a12a3 138 return 0;
d0f28270
JD
139 }
140}
141
142
143/*
144 After this point is the code to automatically determine which
145 VRM/VRD specification should be used depending on the CPU.
146*/
147
1da177e4
LT
148struct vrm_model {
149 u8 vendor;
150 u8 eff_family;
151 u8 eff_model;
734a12a3
RM
152 u8 eff_stepping;
153 u8 vrm_type;
1da177e4
LT
154};
155
156#define ANY 0xFF
157
158#ifdef CONFIG_X86
159
734a12a3
RM
160/* the stepping parameter is highest acceptable stepping for current line */
161
1da177e4 162static struct vrm_model vrm_models[] = {
734a12a3
RM
163 {X86_VENDOR_AMD, 0x6, ANY, ANY, 90}, /* Athlon Duron etc */
164 {X86_VENDOR_AMD, 0xF, ANY, ANY, 24}, /* Athlon 64, Opteron and above VRM 24 */
4c537fb2 165 {X86_VENDOR_INTEL, 0x6, 0x9, ANY, 13}, /* Pentium M (130 nm) */
734a12a3 166 {X86_VENDOR_INTEL, 0x6, 0xB, ANY, 85}, /* Tualatin */
4c537fb2 167 {X86_VENDOR_INTEL, 0x6, 0xD, ANY, 13}, /* Pentium M (90 nm) */
6af586dc
RM
168 {X86_VENDOR_INTEL, 0x6, 0xE, ANY, 14}, /* Intel Core (65 nm) */
169 {X86_VENDOR_INTEL, 0x6, 0xF, ANY, 110}, /* Intel Conroe */
734a12a3 170 {X86_VENDOR_INTEL, 0x6, ANY, ANY, 82}, /* any P6 */
734a12a3
RM
171 {X86_VENDOR_INTEL, 0xF, 0x0, ANY, 90}, /* P4 */
172 {X86_VENDOR_INTEL, 0xF, 0x1, ANY, 90}, /* P4 Willamette */
173 {X86_VENDOR_INTEL, 0xF, 0x2, ANY, 90}, /* P4 Northwood */
174 {X86_VENDOR_INTEL, 0xF, ANY, ANY, 100}, /* Prescott and above assume VRD 10 */
734a12a3
RM
175 {X86_VENDOR_CENTAUR, 0x6, 0x7, ANY, 85}, /* Eden ESP/Ezra */
176 {X86_VENDOR_CENTAUR, 0x6, 0x8, 0x7, 85}, /* Ezra T */
177 {X86_VENDOR_CENTAUR, 0x6, 0x9, 0x7, 85}, /* Nemiah */
e46751bf
RM
178 {X86_VENDOR_CENTAUR, 0x6, 0x9, ANY, 17}, /* C3-M, Eden-N */
179 {X86_VENDOR_CENTAUR, 0x6, 0xA, 0x7, 0}, /* No information */
180 {X86_VENDOR_CENTAUR, 0x6, 0xA, ANY, 13}, /* C7, Esther */
734a12a3 181 {X86_VENDOR_UNKNOWN, ANY, ANY, ANY, 0} /* stop here */
da97a5a3 182};
1da177e4 183
734a12a3 184static u8 find_vrm(u8 eff_family, u8 eff_model, u8 eff_stepping, u8 vendor)
1da177e4
LT
185{
186 int i = 0;
187
188 while (vrm_models[i].vendor!=X86_VENDOR_UNKNOWN) {
189 if (vrm_models[i].vendor==vendor)
da97a5a3
JD
190 if ((vrm_models[i].eff_family==eff_family)
191 && ((vrm_models[i].eff_model==eff_model) ||
734a12a3
RM
192 (vrm_models[i].eff_model==ANY)) &&
193 (eff_stepping <= vrm_models[i].eff_stepping))
1da177e4
LT
194 return vrm_models[i].vrm_type;
195 i++;
196 }
197
198 return 0;
199}
200
734a12a3 201u8 vid_which_vrm(void)
1da177e4 202{
92cb7612 203 struct cpuinfo_x86 *c = &cpu_data(0);
1da177e4 204 u32 eax;
734a12a3 205 u8 eff_family, eff_model, eff_stepping, vrm_ret;
1da177e4 206
da97a5a3
JD
207 if (c->x86 < 6) /* Any CPU with family lower than 6 */
208 return 0; /* doesn't have VID and/or CPUID */
209
1da177e4
LT
210 eax = cpuid_eax(1);
211 eff_family = ((eax & 0x00000F00)>>8);
212 eff_model = ((eax & 0x000000F0)>>4);
734a12a3 213 eff_stepping = eax & 0xF;
1da177e4
LT
214 if (eff_family == 0xF) { /* use extended model & family */
215 eff_family += ((eax & 0x00F00000)>>20);
216 eff_model += ((eax & 0x000F0000)>>16)<<4;
217 }
734a12a3 218 vrm_ret = find_vrm(eff_family, eff_model, eff_stepping, c->x86_vendor);
1da177e4 219 if (vrm_ret == 0)
da97a5a3
JD
220 printk(KERN_INFO "hwmon-vid: Unknown VRM version of your "
221 "x86 CPU\n");
1da177e4
LT
222 return vrm_ret;
223}
224
734a12a3 225/* and now for something completely different for the non-x86 world */
1da177e4 226#else
734a12a3 227u8 vid_which_vrm(void)
1da177e4 228{
303760b4 229 printk(KERN_INFO "hwmon-vid: Unknown VRM version of your CPU\n");
1da177e4
LT
230 return 0;
231}
232#endif
233
d0f28270 234EXPORT_SYMBOL(vid_from_reg);
303760b4 235EXPORT_SYMBOL(vid_which_vrm);
96478ef3 236
7188cc66 237MODULE_AUTHOR("Rudolf Marek <r.marek@assembler.cz>");
96478ef3 238
303760b4 239MODULE_DESCRIPTION("hwmon-vid driver");
96478ef3 240MODULE_LICENSE("GPL");