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 */ | ||
