Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 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 | } |
Sebastian Witt | 3886246 | 2005-04-13 22:25:39 +0200 | [diff] [blame^] | 100 | |
| 101 | static inline int vid_to_reg(int val, int vrm) |
| 102 | { |
| 103 | switch (vrm) { |
| 104 | case 91: /* VRM 9.1 */ |
| 105 | case 90: /* VRM 9.0 */ |
| 106 | return ((val >= 1100) && (val <= 1850) ? |
| 107 | ((18499 - val * 10) / 25 + 5) / 10 : -1); |
| 108 | default: |
| 109 | return -1; |
| 110 | } |
| 111 | } |