Linux Kernel  3.7.1
 All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Macros Groups Pages
longhaul.h
Go to the documentation of this file.
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 __cpuinitconst 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 __cpuinitconst 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 __cpuinitconst 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 __cpuinitconst 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 __cpuinitconst 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 __cpuinitconst 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 __cpuinitconst 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 __cpuinitconst 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 __cpuinitconst 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 __cpuinitconst 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 __cpuinitconst 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 __cpuinitconst 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 __cpuinitconst 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