1 /* 2 * longhaul.h 3 * (C) 2003 Dave Jones. 4 * 5 * Licensed under the terms of the GNU GPL License version 2. 6 * 7 * VIA-specific information 8 */ 9 10 union msr_bcr2 { 11 struct { 12 unsigned Reseved:19, // 18:0 13 ESOFTBF:1, // 19 14 Reserved2:3, // 22:20 15 CLOCKMUL:4, // 26:23 16 Reserved3:5; // 31:27 17 } bits; 18 unsigned long val; 19 }; 20 21 union msr_longhaul { 22 struct { 23 unsigned RevisionID:4, // 3:0 24 RevisionKey:4, // 7:4 25 EnableSoftBusRatio:1, // 8 26 EnableSoftVID:1, // 9 27 EnableSoftBSEL:1, // 10 28 Reserved:3, // 11:13 29 SoftBusRatio4:1, // 14 30 VRMRev:1, // 15 31 SoftBusRatio:4, // 19:16 32 SoftVID:5, // 24:20 33 Reserved2:3, // 27:25 34 SoftBSEL:2, // 29:28 35 Reserved3:2, // 31:30 36 MaxMHzBR:4, // 35:32 37 MaximumVID:5, // 40:36 38 MaxMHzFSB:2, // 42:41 39 MaxMHzBR4:1, // 43 40 Reserved4:4, // 47:44 41 MinMHzBR:4, // 51:48 42 MinimumVID:5, // 56:52 43 MinMHzFSB:2, // 58:57 44 MinMHzBR4:1, // 59 45 Reserved5:4; // 63:60 46 } bits; 47 unsigned long long val; 48 }; 49 50 /* 51 * Clock ratio tables. Div/Mod by 10 to get ratio. 52 * The eblcr values specify the ratio read from the CPU. 53 * The mults values specify what to write to the CPU. 54 */ 55 56 /* 57 * VIA C3 Samuel 1 & Samuel 2 (stepping 0) 58 */ 59 static const int samuel1_mults[16] = { 60 -1, /* 0000 -> RESERVED */ 61 30, /* 0001 -> 3.0x */ 62 40, /* 0010 -> 4.0x */ 63 -1, /* 0011 -> RESERVED */ 64 -1, /* 0100 -> RESERVED */ 65 35, /* 0101 -> 3.5x */ 66 45, /* 0110 -> 4.5x */ 67 55, /* 0111 -> 5.5x */ 68 60, /* 1000 -> 6.0x */ 69 70, /* 1001 -> 7.0x */ 70 80, /* 1010 -> 8.0x */ 71 50, /* 1011 -> 5.0x */ 72 65, /* 1100 -> 6.5x */ 73 75, /* 1101 -> 7.5x */ 74 -1, /* 1110 -> RESERVED */ 75 -1, /* 1111 -> RESERVED */ 76 }; 77 78 static const int samuel1_eblcr[16] = { 79 50, /* 0000 -> RESERVED */ 80 30, /* 0001 -> 3.0x */ 81 40, /* 0010 -> 4.0x */ 82 -1, /* 0011 -> RESERVED */ 83 55, /* 0100 -> 5.5x */ 84 35, /* 0101 -> 3.5x */ 85 45, /* 0110 -> 4.5x */ 86 -1, /* 0111 -> RESERVED */ 87 -1, /* 1000 -> RESERVED */ 88 70, /* 1001 -> 7.0x */ 89 80, /* 1010 -> 8.0x */ 90 60, /* 1011 -> 6.0x */ 91 -1, /* 1100 -> RESERVED */ 92 75, /* 1101 -> 7.5x */ 93 -1, /* 1110 -> RESERVED */ 94 65, /* 1111 -> 6.5x */ 95 }; 96 97 /* 98 * VIA C3 Samuel2 Stepping 1->15 99 */ 100 static const int samuel2_eblcr[16] = { 101 50, /* 0000 -> 5.0x */ 102 30, /* 0001 -> 3.0x */ 103 40, /* 0010 -> 4.0x */ 104 100, /* 0011 -> 10.0x */ 105 55, /* 0100 -> 5.5x */ 106 35, /* 0101 -> 3.5x */ 107 45, /* 0110 -> 4.5x */ 108 110, /* 0111 -> 11.0x */ 109 90, /* 1000 -> 9.0x */ 110 70, /* 1001 -> 7.0x */ 111 80, /* 1010 -> 8.0x */ 112 60, /* 1011 -> 6.0x */ 113 120, /* 1100 -> 12.0x */ 114 75, /* 1101 -> 7.5x */ 115 130, /* 1110 -> 13.0x */ 116 65, /* 1111 -> 6.5x */ 117 }; 118 119 /* 120 * VIA C3 Ezra 121 */ 122 static const int ezra_mults[16] = { 123 100, /* 0000 -> 10.0x */ 124 30, /* 0001 -> 3.0x */ 125 40, /* 0010 -> 4.0x */ 126 90, /* 0011 -> 9.0x */ 127 95, /* 0100 -> 9.5x */ 128 35, /* 0101 -> 3.5x */ 129 45, /* 0110 -> 4.5x */ 130 55, /* 0111 -> 5.5x */ 131 60, /* 1000 -> 6.0x */ 132 70, /* 1001 -> 7.0x */ 133 80, /* 1010 -> 8.0x */ 134 50, /* 1011 -> 5.0x */ 135 65, /* 1100 -> 6.5x */ 136 75, /* 1101 -> 7.5x */ 137 85, /* 1110 -> 8.5x */ 138 120, /* 1111 -> 12.0x */ 139 }; 140 141 static const int ezra_eblcr[16] = { 142 50, /* 0000 -> 5.0x */ 143 30, /* 0001 -> 3.0x */ 144 40, /* 0010 -> 4.0x */ 145 100, /* 0011 -> 10.0x */ 146 55, /* 0100 -> 5.5x */ 147 35, /* 0101 -> 3.5x */ 148 45, /* 0110 -> 4.5x */ 149 95, /* 0111 -> 9.5x */ 150 90, /* 1000 -> 9.0x */ 151 70, /* 1001 -> 7.0x */ 152 80, /* 1010 -> 8.0x */ 153 60, /* 1011 -> 6.0x */ 154 120, /* 1100 -> 12.0x */ 155 75, /* 1101 -> 7.5x */ 156 85, /* 1110 -> 8.5x */ 157 65, /* 1111 -> 6.5x */ 158 }; 159 160 /* 161 * VIA C3 (Ezra-T) [C5M]. 162 */ 163 static const int ezrat_mults[32] = { 164 100, /* 0000 -> 10.0x */ 165 30, /* 0001 -> 3.0x */ 166 40, /* 0010 -> 4.0x */ 167 90, /* 0011 -> 9.0x */ 168 95, /* 0100 -> 9.5x */ 169 35, /* 0101 -> 3.5x */ 170 45, /* 0110 -> 4.5x */ 171 55, /* 0111 -> 5.5x */ 172 60, /* 1000 -> 6.0x */ 173 70, /* 1001 -> 7.0x */ 174 80, /* 1010 -> 8.0x */ 175 50, /* 1011 -> 5.0x */ 176 65, /* 1100 -> 6.5x */ 177 75, /* 1101 -> 7.5x */ 178 85, /* 1110 -> 8.5x */ 179 120, /* 1111 -> 12.0x */ 180 181 -1, /* 0000 -> RESERVED (10.0x) */ 182 110, /* 0001 -> 11.0x */ 183 -1, /* 0010 -> 12.0x */ 184 -1, /* 0011 -> RESERVED (9.0x)*/ 185 105, /* 0100 -> 10.5x */ 186 115, /* 0101 -> 11.5x */ 187 125, /* 0110 -> 12.5x */ 188 135, /* 0111 -> 13.5x */ 189 140, /* 1000 -> 14.0x */ 190 150, /* 1001 -> 15.0x */ 191 160, /* 1010 -> 16.0x */ 192 130, /* 1011 -> 13.0x */ 193 145, /* 1100 -> 14.5x */ 194 155, /* 1101 -> 15.5x */ 195 -1, /* 1110 -> RESERVED (13.0x) */ 196 -1, /* 1111 -> RESERVED (12.0x) */ 197 }; 198 199 static const int ezrat_eblcr[32] = { 200 50, /* 0000 -> 5.0x */ 201 30, /* 0001 -> 3.0x */ 202 40, /* 0010 -> 4.0x */ 203 100, /* 0011 -> 10.0x */ 204 55, /* 0100 -> 5.5x */ 205 35, /* 0101 -> 3.5x */ 206 45, /* 0110 -> 4.5x */ 207 95, /* 0111 -> 9.5x */ 208 90, /* 1000 -> 9.0x */ 209 70, /* 1001 -> 7.0x */ 210 80, /* 1010 -> 8.0x */ 211 60, /* 1011 -> 6.0x */ 212 120, /* 1100 -> 12.0x */ 213 75, /* 1101 -> 7.5x */ 214 85, /* 1110 -> 8.5x */ 215 65, /* 1111 -> 6.5x */ 216 217 -1, /* 0000 -> RESERVED (9.0x) */ 218 110, /* 0001 -> 11.0x */ 219 120, /* 0010 -> 12.0x */ 220 -1, /* 0011 -> RESERVED (10.0x)*/ 221 135, /* 0100 -> 13.5x */ 222 115, /* 0101 -> 11.5x */ 223 125, /* 0110 -> 12.5x */ 224 105, /* 0111 -> 10.5x */ 225 130, /* 1000 -> 13.0x */ 226 150, /* 1001 -> 15.0x */ 227 160, /* 1010 -> 16.0x */ 228 140, /* 1011 -> 14.0x */ 229 -1, /* 1100 -> RESERVED (12.0x) */ 230 155, /* 1101 -> 15.5x */ 231 -1, /* 1110 -> RESERVED (13.0x) */ 232 145, /* 1111 -> 14.5x */ 233 }; 234 235 /* 236 * VIA C3 Nehemiah */ 237 238 static const int nehemiah_mults[32] = { 239 100, /* 0000 -> 10.0x */ 240 -1, /* 0001 -> 16.0x */ 241 40, /* 0010 -> 4.0x */ 242 90, /* 0011 -> 9.0x */ 243 95, /* 0100 -> 9.5x */ 244 -1, /* 0101 -> RESERVED */ 245 45, /* 0110 -> 4.5x */ 246 55, /* 0111 -> 5.5x */ 247 60, /* 1000 -> 6.0x */ 248 70, /* 1001 -> 7.0x */ 249 80, /* 1010 -> 8.0x */ 250 50, /* 1011 -> 5.0x */ 251 65, /* 1100 -> 6.5x */ 252 75, /* 1101 -> 7.5x */ 253 85, /* 1110 -> 8.5x */ 254 120, /* 1111 -> 12.0x */ 255 -1, /* 0000 -> 10.0x */ 256 110, /* 0001 -> 11.0x */ 257 -1, /* 0010 -> 12.0x */ 258 -1, /* 0011 -> 9.0x */ 259 105, /* 0100 -> 10.5x */ 260 115, /* 0101 -> 11.5x */ 261 125, /* 0110 -> 12.5x */ 262 135, /* 0111 -> 13.5x */ 263 140, /* 1000 -> 14.0x */ 264 150, /* 1001 -> 15.0x */ 265 160, /* 1010 -> 16.0x */ 266 130, /* 1011 -> 13.0x */ 267 145, /* 1100 -> 14.5x */ 268 155, /* 1101 -> 15.5x */ 269 -1, /* 1110 -> RESERVED (13.0x) */ 270 -1, /* 1111 -> 12.0x */ 271 }; 272 273 static const int nehemiah_eblcr[32] = { 274 50, /* 0000 -> 5.0x */ 275 160, /* 0001 -> 16.0x */ 276 40, /* 0010 -> 4.0x */ 277 100, /* 0011 -> 10.0x */ 278 55, /* 0100 -> 5.5x */ 279 -1, /* 0101 -> RESERVED */ 280 45, /* 0110 -> 4.5x */ 281 95, /* 0111 -> 9.5x */ 282 90, /* 1000 -> 9.0x */ 283 70, /* 1001 -> 7.0x */ 284 80, /* 1010 -> 8.0x */ 285 60, /* 1011 -> 6.0x */ 286 120, /* 1100 -> 12.0x */ 287 75, /* 1101 -> 7.5x */ 288 85, /* 1110 -> 8.5x */ 289 65, /* 1111 -> 6.5x */ 290 90, /* 0000 -> 9.0x */ 291 110, /* 0001 -> 11.0x */ 292 120, /* 0010 -> 12.0x */ 293 100, /* 0011 -> 10.0x */ 294 135, /* 0100 -> 13.5x */ 295 115, /* 0101 -> 11.5x */ 296 125, /* 0110 -> 12.5x */ 297 105, /* 0111 -> 10.5x */ 298 130, /* 1000 -> 13.0x */ 299 150, /* 1001 -> 15.0x */ 300 160, /* 1010 -> 16.0x */ 301 140, /* 1011 -> 14.0x */ 302 120, /* 1100 -> 12.0x */ 303 155, /* 1101 -> 15.5x */ 304 -1, /* 1110 -> RESERVED (13.0x) */ 305 145 /* 1111 -> 14.5x */ 306 }; 307 308 /* 309 * Voltage scales. Div/Mod by 1000 to get actual voltage. 310 * Which scale to use depends on the VRM type in use. 311 */ 312 313 struct mV_pos { 314 unsigned short mV; 315 unsigned short pos; 316 }; 317 318 static const struct mV_pos vrm85_mV[32] = { 319 {1250, 8}, {1200, 6}, {1150, 4}, {1100, 2}, 320 {1050, 0}, {1800, 30}, {1750, 28}, {1700, 26}, 321 {1650, 24}, {1600, 22}, {1550, 20}, {1500, 18}, 322 {1450, 16}, {1400, 14}, {1350, 12}, {1300, 10}, 323 {1275, 9}, {1225, 7}, {1175, 5}, {1125, 3}, 324 {1075, 1}, {1825, 31}, {1775, 29}, {1725, 27}, 325 {1675, 25}, {1625, 23}, {1575, 21}, {1525, 19}, 326 {1475, 17}, {1425, 15}, {1375, 13}, {1325, 11} 327 }; 328 329 static const unsigned char mV_vrm85[32] = { 330 0x04, 0x14, 0x03, 0x13, 0x02, 0x12, 0x01, 0x11, 331 0x00, 0x10, 0x0f, 0x1f, 0x0e, 0x1e, 0x0d, 0x1d, 332 0x0c, 0x1c, 0x0b, 0x1b, 0x0a, 0x1a, 0x09, 0x19, 333 0x08, 0x18, 0x07, 0x17, 0x06, 0x16, 0x05, 0x15 334 }; 335 336 static const struct mV_pos mobilevrm_mV[32] = { 337 {1750, 31}, {1700, 30}, {1650, 29}, {1600, 28}, 338 {1550, 27}, {1500, 26}, {1450, 25}, {1400, 24}, 339 {1350, 23}, {1300, 22}, {1250, 21}, {1200, 20}, 340 {1150, 19}, {1100, 18}, {1050, 17}, {1000, 16}, 341 {975, 15}, {950, 14}, {925, 13}, {900, 12}, 342 {875, 11}, {850, 10}, {825, 9}, {800, 8}, 343 {775, 7}, {750, 6}, {725, 5}, {700, 4}, 344 {675, 3}, {650, 2}, {625, 1}, {600, 0} 345 }; 346 347 static const unsigned char mV_mobilevrm[32] = { 348 0x1f, 0x1e, 0x1d, 0x1c, 0x1b, 0x1a, 0x19, 0x18, 349 0x17, 0x16, 0x15, 0x14, 0x13, 0x12, 0x11, 0x10, 350 0x0f, 0x0e, 0x0d, 0x0c, 0x0b, 0x0a, 0x09, 0x08, 351 0x07, 0x06, 0x05, 0x04, 0x03, 0x02, 0x01, 0x00 352 }; 353 354