]> git.proxmox.com Git - mirror_ubuntu-zesty-kernel.git/blame - drivers/hwmon/hwmon-vid.c
hwmon/w83627hf: Be quiet when no chip is found
[mirror_ubuntu-zesty-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
RM
134 default: /* report 0 for unknown */
135 printk(KERN_INFO "hwmon-vid: requested unknown VRM version\n");
136 return 0;
d0f28270
JD
137 }
138}
139
140
141/*
142 After this point is the code to automatically determine which
143 VRM/VRD specification should be used depending on the CPU.
144*/
145
1da177e4
LT
146struct vrm_model {
147 u8 vendor;
148 u8 eff_family;
149 u8 eff_model;
734a12a3
RM
150 u8 eff_stepping;
151 u8 vrm_type;
1da177e4
LT
152};
153
154#define ANY 0xFF
155
156#ifdef CONFIG_X86
157
734a12a3
RM
158/* the stepping parameter is highest acceptable stepping for current line */
159
1da177e4 160static struct vrm_model vrm_models[] = {
734a12a3
RM
161 {X86_VENDOR_AMD, 0x6, ANY, ANY, 90}, /* Athlon Duron etc */
162 {X86_VENDOR_AMD, 0xF, ANY, ANY, 24}, /* Athlon 64, Opteron and above VRM 24 */
4c537fb2 163 {X86_VENDOR_INTEL, 0x6, 0x9, ANY, 13}, /* Pentium M (130 nm) */
734a12a3 164 {X86_VENDOR_INTEL, 0x6, 0xB, ANY, 85}, /* Tualatin */
4c537fb2 165 {X86_VENDOR_INTEL, 0x6, 0xD, ANY, 13}, /* Pentium M (90 nm) */
6af586dc
RM
166 {X86_VENDOR_INTEL, 0x6, 0xE, ANY, 14}, /* Intel Core (65 nm) */
167 {X86_VENDOR_INTEL, 0x6, 0xF, ANY, 110}, /* Intel Conroe */
734a12a3 168 {X86_VENDOR_INTEL, 0x6, ANY, ANY, 82}, /* any P6 */
734a12a3
RM
169 {X86_VENDOR_INTEL, 0xF, 0x0, ANY, 90}, /* P4 */
170 {X86_VENDOR_INTEL, 0xF, 0x1, ANY, 90}, /* P4 Willamette */
171 {X86_VENDOR_INTEL, 0xF, 0x2, ANY, 90}, /* P4 Northwood */
172 {X86_VENDOR_INTEL, 0xF, ANY, ANY, 100}, /* Prescott and above assume VRD 10 */
734a12a3
RM
173 {X86_VENDOR_CENTAUR, 0x6, 0x7, ANY, 85}, /* Eden ESP/Ezra */
174 {X86_VENDOR_CENTAUR, 0x6, 0x8, 0x7, 85}, /* Ezra T */
175 {X86_VENDOR_CENTAUR, 0x6, 0x9, 0x7, 85}, /* Nemiah */
e46751bf
RM
176 {X86_VENDOR_CENTAUR, 0x6, 0x9, ANY, 17}, /* C3-M, Eden-N */
177 {X86_VENDOR_CENTAUR, 0x6, 0xA, 0x7, 0}, /* No information */
178 {X86_VENDOR_CENTAUR, 0x6, 0xA, ANY, 13}, /* C7, Esther */
734a12a3 179 {X86_VENDOR_UNKNOWN, ANY, ANY, ANY, 0} /* stop here */
da97a5a3 180};
1da177e4 181
734a12a3 182static u8 find_vrm(u8 eff_family, u8 eff_model, u8 eff_stepping, u8 vendor)
1da177e4
LT
183{
184 int i = 0;
185
186 while (vrm_models[i].vendor!=X86_VENDOR_UNKNOWN) {
187 if (vrm_models[i].vendor==vendor)
da97a5a3
JD
188 if ((vrm_models[i].eff_family==eff_family)
189 && ((vrm_models[i].eff_model==eff_model) ||
734a12a3
RM
190 (vrm_models[i].eff_model==ANY)) &&
191 (eff_stepping <= vrm_models[i].eff_stepping))
1da177e4
LT
192 return vrm_models[i].vrm_type;
193 i++;
194 }
195
196 return 0;
197}
198
734a12a3 199u8 vid_which_vrm(void)
1da177e4
LT
200{
201 struct cpuinfo_x86 *c = cpu_data;
202 u32 eax;
734a12a3 203 u8 eff_family, eff_model, eff_stepping, vrm_ret;
1da177e4 204
da97a5a3
JD
205 if (c->x86 < 6) /* Any CPU with family lower than 6 */
206 return 0; /* doesn't have VID and/or CPUID */
207
1da177e4
LT
208 eax = cpuid_eax(1);
209 eff_family = ((eax & 0x00000F00)>>8);
210 eff_model = ((eax & 0x000000F0)>>4);
734a12a3 211 eff_stepping = eax & 0xF;
1da177e4
LT
212 if (eff_family == 0xF) { /* use extended model & family */
213 eff_family += ((eax & 0x00F00000)>>20);
214 eff_model += ((eax & 0x000F0000)>>16)<<4;
215 }
734a12a3 216 vrm_ret = find_vrm(eff_family, eff_model, eff_stepping, c->x86_vendor);
1da177e4 217 if (vrm_ret == 0)
da97a5a3
JD
218 printk(KERN_INFO "hwmon-vid: Unknown VRM version of your "
219 "x86 CPU\n");
1da177e4
LT
220 return vrm_ret;
221}
222
734a12a3 223/* and now for something completely different for the non-x86 world */
1da177e4 224#else
734a12a3 225u8 vid_which_vrm(void)
1da177e4 226{
303760b4 227 printk(KERN_INFO "hwmon-vid: Unknown VRM version of your CPU\n");
1da177e4
LT
228 return 0;
229}
230#endif
231
d0f28270 232EXPORT_SYMBOL(vid_from_reg);
303760b4 233EXPORT_SYMBOL(vid_which_vrm);
96478ef3 234
7188cc66 235MODULE_AUTHOR("Rudolf Marek <r.marek@assembler.cz>");
96478ef3 236
303760b4 237MODULE_DESCRIPTION("hwmon-vid driver");
96478ef3 238MODULE_LICENSE("GPL");