Commit | Line | Data |
---|---|---|
1da177e4 LT |
1 | /* |
2 | i2c-vid.h - Part of lm_sensors, Linux kernel modules for hardware | |
3 | monitoring | |
4 | Copyright (c) 2002 Mark D. Studebaker <mdsxyz123@yahoo.com> | |
5 | With assistance from Trent Piepho <xyzzy@speakeasy.org> | |
6 | ||
7 | This program is free software; you can redistribute it and/or modify | |
8 | it under the terms of the GNU General Public License as published by | |
9 | the Free Software Foundation; either version 2 of the License, or | |
10 | (at your option) any later version. | |
11 | ||
12 | This program is distributed in the hope that it will be useful, | |
13 | but WITHOUT ANY WARRANTY; without even the implied warranty of | |
14 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
15 | GNU General Public License for more details. | |
16 | ||
17 | You should have received a copy of the GNU General Public License | |
18 | along with this program; if not, write to the Free Software | |
19 | Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. | |
20 | */ | |
21 | ||
22 | /* | |
23 | This file contains common code for decoding VID pins. | |
24 | This file is #included in various chip drivers in this directory. | |
25 | As the user is unlikely to load more than one driver which | |
26 | includes this code we don't worry about the wasted space. | |
27 | Reference: VRM x.y DC-DC Converter Design Guidelines, | |
28 | available at http://developer.intel.com | |
29 | */ | |
30 | ||
31 | /* | |
32 | AMD Opteron processors don't follow the Intel VRM spec. | |
33 | I'm going to "make up" 2.4 as the VRM spec for the Opterons. | |
34 | No good reason just a mnemonic for the 24x Opteron processor | |
35 | series | |
36 | ||
37 | Opteron VID encoding is: | |
38 | ||
39 | 00000 = 1.550 V | |
40 | 00001 = 1.525 V | |
41 | . . . . | |
42 | 11110 = 0.800 V | |
43 | 11111 = 0.000 V (off) | |
44 | */ | |
45 | ||
46 | /* | |
47 | Legal val values 0x00 - 0x1f; except for VRD 10.0, 0x00 - 0x3f. | |
48 | vrm is the Intel VRM document version. | |
49 | Note: vrm version is scaled by 10 and the return value is scaled by 1000 | |
50 | to avoid floating point in the kernel. | |
51 | */ | |
52 | ||
53 | int i2c_which_vrm(void); | |
54 | ||
55 | #define DEFAULT_VRM 82 | |
56 | ||
57 | static inline int vid_from_reg(int val, int vrm) | |
58 | { | |
59 | int vid; | |
60 | ||
61 | switch(vrm) { | |
62 | ||
63 | case 0: | |
64 | return 0; | |
65 | ||
66 | case 100: /* VRD 10.0 */ | |
67 | if((val & 0x1f) == 0x1f) | |
68 | return 0; | |
69 | if((val & 0x1f) <= 0x09 || val == 0x0a) | |
70 | vid = 10875 - (val & 0x1f) * 250; | |
71 | else | |
72 | vid = 18625 - (val & 0x1f) * 250; | |
73 | if(val & 0x20) | |
74 | vid -= 125; | |
75 | vid /= 10; /* only return 3 dec. places for now */ | |
76 | return vid; | |
77 | ||
78 | case 24: /* Opteron processor */ | |
79 | return(val == 0x1f ? 0 : 1550 - val * 25); | |
80 | ||
81 | case 91: /* VRM 9.1 */ | |
82 | case 90: /* VRM 9.0 */ | |
83 | return(val == 0x1f ? 0 : | |
84 | 1850 - val * 25); | |
85 | ||
86 | case 85: /* VRM 8.5 */ | |
87 | return((val & 0x10 ? 25 : 0) + | |
88 | ((val & 0x0f) > 0x04 ? 2050 : 1250) - | |
89 | ((val & 0x0f) * 50)); | |
90 | ||
91 | case 84: /* VRM 8.4 */ | |
92 | val &= 0x0f; | |
93 | /* fall through */ | |
94 | default: /* VRM 8.2 */ | |
95 | return(val == 0x1f ? 0 : | |
96 | val & 0x10 ? 5100 - (val) * 100 : | |
97 | 2050 - (val) * 50); | |
98 | } | |
99 | } |