diff options
-rw-r--r-- | drivers/hwmon/hwmon-vid.c | 82 | ||||
-rw-r--r-- | include/linux/hwmon-vid.h | 83 |
2 files changed, 91 insertions, 74 deletions
diff --git a/drivers/hwmon/hwmon-vid.c b/drivers/hwmon/hwmon-vid.c index 7c8ed0353302..a54d08699973 100644 --- a/drivers/hwmon/hwmon-vid.c +++ b/drivers/hwmon/hwmon-vid.c | |||
@@ -3,6 +3,10 @@ | |||
3 | 3 | ||
4 | Copyright (c) 2004 Rudolf Marek <r.marek@sh.cvut.cz> | 4 | Copyright (c) 2004 Rudolf Marek <r.marek@sh.cvut.cz> |
5 | 5 | ||
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 | |||
6 | This program is free software; you can redistribute it and/or modify | 10 | This program is free software; you can redistribute it and/or modify |
7 | it under the terms of the GNU General Public License as published by | 11 | it under the terms of the GNU General Public License as published by |
8 | the Free Software Foundation; either version 2 of the License, or | 12 | the Free Software Foundation; either version 2 of the License, or |
@@ -23,6 +27,83 @@ | |||
23 | #include <linux/kernel.h> | 27 | #include <linux/kernel.h> |
24 | #include <linux/hwmon-vid.h> | 28 | #include <linux/hwmon-vid.h> |
25 | 29 | ||
30 | /* | ||
31 | Common code for decoding VID pins. | ||
32 | |||
33 | References: | ||
34 | |||
35 | For VRM 8.4 to 9.1, "VRM x.y DC-DC Converter Design Guidelines", | ||
36 | available at http://developer.intel.com/. | ||
37 | |||
38 | For VRD 10.0 and up, "VRD x.y Design Guide", | ||
39 | available at http://developer.intel.com/. | ||
40 | |||
41 | AMD Opteron processors don't follow the Intel specifications. | ||
42 | I'm going to "make up" 2.4 as the spec number for the Opterons. | ||
43 | No good reason just a mnemonic for the 24x Opteron processor | ||
44 | series. | ||
45 | |||
46 | Opteron VID encoding is: | ||
47 | 00000 = 1.550 V | ||
48 | 00001 = 1.525 V | ||
49 | . . . . | ||
50 | 11110 = 0.800 V | ||
51 | 11111 = 0.000 V (off) | ||
52 | */ | ||
53 | |||
54 | /* vrm is the VRM/VRD document version multiplied by 10. | ||
55 | val is the 4-, 5- or 6-bit VID code. | ||
56 | Returned value is in mV to avoid floating point in the kernel. */ | ||
57 | 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 | } | ||
100 | |||
101 | |||
102 | /* | ||
103 | After this point is the code to automatically determine which | ||
104 | VRM/VRD specification should be used depending on the CPU. | ||
105 | */ | ||
106 | |||
26 | struct vrm_model { | 107 | struct vrm_model { |
27 | u8 vendor; | 108 | u8 vendor; |
28 | u8 eff_family; | 109 | u8 eff_family; |
@@ -96,6 +177,7 @@ int vid_which_vrm(void) | |||
96 | } | 177 | } |
97 | #endif | 178 | #endif |
98 | 179 | ||
180 | EXPORT_SYMBOL(vid_from_reg); | ||
99 | EXPORT_SYMBOL(vid_which_vrm); | 181 | EXPORT_SYMBOL(vid_which_vrm); |
100 | 182 | ||
101 | MODULE_AUTHOR("Rudolf Marek <r.marek@sh.cvut.cz>"); | 183 | MODULE_AUTHOR("Rudolf Marek <r.marek@sh.cvut.cz>"); |
diff --git a/include/linux/hwmon-vid.h b/include/linux/hwmon-vid.h index 6d9d4f9bad58..cd4b7a042b86 100644 --- a/include/linux/hwmon-vid.h +++ b/include/linux/hwmon-vid.h | |||
@@ -20,83 +20,16 @@ | |||
20 | Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. | 20 | Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. |
21 | */ | 21 | */ |
22 | 22 | ||
23 | /* | 23 | #ifndef _LINUX_HWMON_VID_H |
24 | This file contains common code for decoding VID pins. | 24 | #define _LINUX_HWMON_VID_H |
25 | This file is #included in various chip drivers in this directory. | ||
26 | As the user is unlikely to load more than one driver which | ||
27 | includes this code we don't worry about the wasted space. | ||
28 | Reference: VRM x.y DC-DC Converter Design Guidelines, | ||
29 | available at http://developer.intel.com | ||
30 | */ | ||
31 | |||
32 | /* | ||
33 | AMD Opteron processors don't follow the Intel VRM spec. | ||
34 | I'm going to "make up" 2.4 as the VRM spec for the Opterons. | ||
35 | No good reason just a mnemonic for the 24x Opteron processor | ||
36 | series | ||
37 | |||
38 | Opteron VID encoding is: | ||
39 | |||
40 | 00000 = 1.550 V | ||
41 | 00001 = 1.525 V | ||
42 | . . . . | ||
43 | 11110 = 0.800 V | ||
44 | 11111 = 0.000 V (off) | ||
45 | */ | ||
46 | |||
47 | /* | ||
48 | Legal val values 0x00 - 0x1f; except for VRD 10.0, 0x00 - 0x3f. | ||
49 | vrm is the Intel VRM document version. | ||
50 | Note: vrm version is scaled by 10 and the return value is scaled by 1000 | ||
51 | to avoid floating point in the kernel. | ||
52 | */ | ||
53 | 25 | ||
26 | int vid_from_reg(int val, int vrm); | ||
54 | int vid_which_vrm(void); | 27 | int vid_which_vrm(void); |
55 | 28 | ||
56 | static inline int vid_from_reg(int val, int vrm) | 29 | /* vrm is the VRM/VRD document version multiplied by 10. |
57 | { | 30 | val is in mV to avoid floating point in the kernel. |
58 | int vid; | 31 | Returned value is the 4-, 5- or 6-bit VID code. |
59 | 32 | Note that only VRM 9.x is supported for now. */ | |
60 | switch(vrm) { | ||
61 | |||
62 | case 0: | ||
63 | return 0; | ||
64 | |||
65 | case 100: /* VRD 10.0 */ | ||
66 | if((val & 0x1f) == 0x1f) | ||
67 | return 0; | ||
68 | if((val & 0x1f) <= 0x09 || val == 0x0a) | ||
69 | vid = 10875 - (val & 0x1f) * 250; | ||
70 | else | ||
71 | vid = 18625 - (val & 0x1f) * 250; | ||
72 | if(val & 0x20) | ||
73 | vid -= 125; | ||
74 | vid /= 10; /* only return 3 dec. places for now */ | ||
75 | return vid; | ||
76 | |||
77 | case 24: /* Opteron processor */ | ||
78 | return(val == 0x1f ? 0 : 1550 - val * 25); | ||
79 | |||
80 | case 91: /* VRM 9.1 */ | ||
81 | case 90: /* VRM 9.0 */ | ||
82 | return(val == 0x1f ? 0 : | ||
83 | 1850 - val * 25); | ||
84 | |||
85 | case 85: /* VRM 8.5 */ | ||
86 | return((val & 0x10 ? 25 : 0) + | ||
87 | ((val & 0x0f) > 0x04 ? 2050 : 1250) - | ||
88 | ((val & 0x0f) * 50)); | ||
89 | |||
90 | case 84: /* VRM 8.4 */ | ||
91 | val &= 0x0f; | ||
92 | /* fall through */ | ||
93 | default: /* VRM 8.2 */ | ||
94 | return(val == 0x1f ? 0 : | ||
95 | val & 0x10 ? 5100 - (val) * 100 : | ||
96 | 2050 - (val) * 50); | ||
97 | } | ||
98 | } | ||
99 | |||
100 | static inline int vid_to_reg(int val, int vrm) | 33 | static inline int vid_to_reg(int val, int vrm) |
101 | { | 34 | { |
102 | switch (vrm) { | 35 | switch (vrm) { |
@@ -108,3 +41,5 @@ static inline int vid_to_reg(int val, int vrm) | |||
108 | return -1; | 41 | return -1; |
109 | } | 42 | } |
110 | } | 43 | } |
44 | |||
45 | #endif /* _LINUX_HWMON_VID_H */ | ||