blob: 89c4cc297cb6132ca888e0110ab69146e75601ac [file] [log] [blame]
Thomas Gleixner4f190482019-05-27 08:55:14 +02001/* SPDX-License-Identifier: GPL-2.0-only */
Linus Torvalds1da177e2005-04-16 15:20:36 -07002/*
3 * longhaul.h
4 * (C) 2003 Dave Jones.
5 *
Linus Torvalds1da177e2005-04-16 15:20:36 -07006 * VIA-specific information
7 */
8
9union msr_bcr2 {
10 struct {
11 unsigned Reseved:19, // 18:0
12 ESOFTBF:1, // 19
13 Reserved2:3, // 22:20
14 CLOCKMUL:4, // 26:23
15 Reserved3:5; // 31:27
16 } bits;
17 unsigned long val;
18};
19
20union msr_longhaul {
21 struct {
22 unsigned RevisionID:4, // 3:0
23 RevisionKey:4, // 7:4
24 EnableSoftBusRatio:1, // 8
25 EnableSoftVID:1, // 9
26 EnableSoftBSEL:1, // 10
27 Reserved:3, // 11:13
28 SoftBusRatio4:1, // 14
29 VRMRev:1, // 15
30 SoftBusRatio:4, // 19:16
31 SoftVID:5, // 24:20
32 Reserved2:3, // 27:25
33 SoftBSEL:2, // 29:28
34 Reserved3:2, // 31:30
35 MaxMHzBR:4, // 35:32
36 MaximumVID:5, // 40:36
37 MaxMHzFSB:2, // 42:41
38 MaxMHzBR4:1, // 43
39 Reserved4:4, // 47:44
40 MinMHzBR:4, // 51:48
41 MinimumVID:5, // 56:52
42 MinMHzFSB:2, // 58:57
43 MinMHzBR4:1, // 59
44 Reserved5:4; // 63:60
45 } bits;
46 unsigned long long val;
47};
48
49/*
50 * Clock ratio tables. Div/Mod by 10 to get ratio.
Dave Jonesac617bd2009-01-17 23:29:53 -050051 * The eblcr values specify the ratio read from the CPU.
52 * The mults values specify what to write to the CPU.
Linus Torvalds1da177e2005-04-16 15:20:36 -070053 */
54
55/*
56 * VIA C3 Samuel 1 & Samuel 2 (stepping 0)
57 */
Paul Gortmaker27609842013-06-19 13:54:04 -040058static const int samuel1_mults[16] = {
Linus Torvalds1da177e2005-04-16 15:20:36 -070059 -1, /* 0000 -> RESERVED */
60 30, /* 0001 -> 3.0x */
61 40, /* 0010 -> 4.0x */
62 -1, /* 0011 -> RESERVED */
63 -1, /* 0100 -> RESERVED */
64 35, /* 0101 -> 3.5x */
65 45, /* 0110 -> 4.5x */
66 55, /* 0111 -> 5.5x */
67 60, /* 1000 -> 6.0x */
68 70, /* 1001 -> 7.0x */
69 80, /* 1010 -> 8.0x */
70 50, /* 1011 -> 5.0x */
71 65, /* 1100 -> 6.5x */
72 75, /* 1101 -> 7.5x */
73 -1, /* 1110 -> RESERVED */
74 -1, /* 1111 -> RESERVED */
75};
76
Paul Gortmaker27609842013-06-19 13:54:04 -040077static const int samuel1_eblcr[16] = {
Linus Torvalds1da177e2005-04-16 15:20:36 -070078 50, /* 0000 -> RESERVED */
79 30, /* 0001 -> 3.0x */
80 40, /* 0010 -> 4.0x */
81 -1, /* 0011 -> RESERVED */
82 55, /* 0100 -> 5.5x */
83 35, /* 0101 -> 3.5x */
84 45, /* 0110 -> 4.5x */
85 -1, /* 0111 -> RESERVED */
86 -1, /* 1000 -> RESERVED */
87 70, /* 1001 -> 7.0x */
88 80, /* 1010 -> 8.0x */
89 60, /* 1011 -> 6.0x */
90 -1, /* 1100 -> RESERVED */
91 75, /* 1101 -> 7.5x */
92 -1, /* 1110 -> RESERVED */
93 65, /* 1111 -> 6.5x */
94};
95
96/*
97 * VIA C3 Samuel2 Stepping 1->15
98 */
Paul Gortmaker27609842013-06-19 13:54:04 -040099static const int samuel2_eblcr[16] = {
Linus Torvalds1da177e2005-04-16 15:20:36 -0700100 50, /* 0000 -> 5.0x */
101 30, /* 0001 -> 3.0x */
102 40, /* 0010 -> 4.0x */
103 100, /* 0011 -> 10.0x */
104 55, /* 0100 -> 5.5x */
105 35, /* 0101 -> 3.5x */
106 45, /* 0110 -> 4.5x */
107 110, /* 0111 -> 11.0x */
108 90, /* 1000 -> 9.0x */
109 70, /* 1001 -> 7.0x */
110 80, /* 1010 -> 8.0x */
111 60, /* 1011 -> 6.0x */
112 120, /* 1100 -> 12.0x */
113 75, /* 1101 -> 7.5x */
114 130, /* 1110 -> 13.0x */
115 65, /* 1111 -> 6.5x */
116};
117
118/*
119 * VIA C3 Ezra
120 */
Paul Gortmaker27609842013-06-19 13:54:04 -0400121static const int ezra_mults[16] = {
Linus Torvalds1da177e2005-04-16 15:20:36 -0700122 100, /* 0000 -> 10.0x */
123 30, /* 0001 -> 3.0x */
124 40, /* 0010 -> 4.0x */
125 90, /* 0011 -> 9.0x */
126 95, /* 0100 -> 9.5x */
127 35, /* 0101 -> 3.5x */
128 45, /* 0110 -> 4.5x */
129 55, /* 0111 -> 5.5x */
130 60, /* 1000 -> 6.0x */
131 70, /* 1001 -> 7.0x */
132 80, /* 1010 -> 8.0x */
133 50, /* 1011 -> 5.0x */
134 65, /* 1100 -> 6.5x */
135 75, /* 1101 -> 7.5x */
136 85, /* 1110 -> 8.5x */
137 120, /* 1111 -> 12.0x */
138};
139
Paul Gortmaker27609842013-06-19 13:54:04 -0400140static const int ezra_eblcr[16] = {
Linus Torvalds1da177e2005-04-16 15:20:36 -0700141 50, /* 0000 -> 5.0x */
142 30, /* 0001 -> 3.0x */
143 40, /* 0010 -> 4.0x */
144 100, /* 0011 -> 10.0x */
145 55, /* 0100 -> 5.5x */
146 35, /* 0101 -> 3.5x */
147 45, /* 0110 -> 4.5x */
148 95, /* 0111 -> 9.5x */
149 90, /* 1000 -> 9.0x */
150 70, /* 1001 -> 7.0x */
151 80, /* 1010 -> 8.0x */
152 60, /* 1011 -> 6.0x */
153 120, /* 1100 -> 12.0x */
154 75, /* 1101 -> 7.5x */
155 85, /* 1110 -> 8.5x */
156 65, /* 1111 -> 6.5x */
157};
158
159/*
160 * VIA C3 (Ezra-T) [C5M].
161 */
Paul Gortmaker27609842013-06-19 13:54:04 -0400162static const int ezrat_mults[32] = {
Linus Torvalds1da177e2005-04-16 15:20:36 -0700163 100, /* 0000 -> 10.0x */
164 30, /* 0001 -> 3.0x */
165 40, /* 0010 -> 4.0x */
166 90, /* 0011 -> 9.0x */
167 95, /* 0100 -> 9.5x */
168 35, /* 0101 -> 3.5x */
169 45, /* 0110 -> 4.5x */
170 55, /* 0111 -> 5.5x */
171 60, /* 1000 -> 6.0x */
172 70, /* 1001 -> 7.0x */
173 80, /* 1010 -> 8.0x */
174 50, /* 1011 -> 5.0x */
175 65, /* 1100 -> 6.5x */
176 75, /* 1101 -> 7.5x */
177 85, /* 1110 -> 8.5x */
178 120, /* 1111 -> 12.0x */
179
180 -1, /* 0000 -> RESERVED (10.0x) */
181 110, /* 0001 -> 11.0x */
Rafał Bilskice243822007-05-28 21:58:09 +0200182 -1, /* 0010 -> 12.0x */
Linus Torvalds1da177e2005-04-16 15:20:36 -0700183 -1, /* 0011 -> RESERVED (9.0x)*/
184 105, /* 0100 -> 10.5x */
185 115, /* 0101 -> 11.5x */
186 125, /* 0110 -> 12.5x */
187 135, /* 0111 -> 13.5x */
188 140, /* 1000 -> 14.0x */
189 150, /* 1001 -> 15.0x */
190 160, /* 1010 -> 16.0x */
191 130, /* 1011 -> 13.0x */
192 145, /* 1100 -> 14.5x */
193 155, /* 1101 -> 15.5x */
194 -1, /* 1110 -> RESERVED (13.0x) */
195 -1, /* 1111 -> RESERVED (12.0x) */
196};
197
Paul Gortmaker27609842013-06-19 13:54:04 -0400198static const int ezrat_eblcr[32] = {
Linus Torvalds1da177e2005-04-16 15:20:36 -0700199 50, /* 0000 -> 5.0x */
200 30, /* 0001 -> 3.0x */
201 40, /* 0010 -> 4.0x */
202 100, /* 0011 -> 10.0x */
203 55, /* 0100 -> 5.5x */
204 35, /* 0101 -> 3.5x */
205 45, /* 0110 -> 4.5x */
206 95, /* 0111 -> 9.5x */
207 90, /* 1000 -> 9.0x */
208 70, /* 1001 -> 7.0x */
209 80, /* 1010 -> 8.0x */
210 60, /* 1011 -> 6.0x */
211 120, /* 1100 -> 12.0x */
212 75, /* 1101 -> 7.5x */
213 85, /* 1110 -> 8.5x */
214 65, /* 1111 -> 6.5x */
215
216 -1, /* 0000 -> RESERVED (9.0x) */
217 110, /* 0001 -> 11.0x */
218 120, /* 0010 -> 12.0x */
219 -1, /* 0011 -> RESERVED (10.0x)*/
220 135, /* 0100 -> 13.5x */
221 115, /* 0101 -> 11.5x */
222 125, /* 0110 -> 12.5x */
223 105, /* 0111 -> 10.5x */
224 130, /* 1000 -> 13.0x */
225 150, /* 1001 -> 15.0x */
226 160, /* 1010 -> 16.0x */
227 140, /* 1011 -> 14.0x */
228 -1, /* 1100 -> RESERVED (12.0x) */
229 155, /* 1101 -> 15.5x */
230 -1, /* 1110 -> RESERVED (13.0x) */
231 145, /* 1111 -> 14.5x */
232};
233
234/*
235 * VIA C3 Nehemiah */
Dave Jones32ee8c32006-02-28 00:43:23 -0500236
Paul Gortmaker27609842013-06-19 13:54:04 -0400237static const int nehemiah_mults[32] = {
Linus Torvalds1da177e2005-04-16 15:20:36 -0700238 100, /* 0000 -> 10.0x */
Rafał Bilskice243822007-05-28 21:58:09 +0200239 -1, /* 0001 -> 16.0x */
Rafa³ Bilski0d44b2b2007-01-31 23:50:49 +0100240 40, /* 0010 -> 4.0x */
Linus Torvalds1da177e2005-04-16 15:20:36 -0700241 90, /* 0011 -> 9.0x */
242 95, /* 0100 -> 9.5x */
243 -1, /* 0101 -> RESERVED */
Rafa³ Bilski0d44b2b2007-01-31 23:50:49 +0100244 45, /* 0110 -> 4.5x */
Linus Torvalds1da177e2005-04-16 15:20:36 -0700245 55, /* 0111 -> 5.5x */
246 60, /* 1000 -> 6.0x */
247 70, /* 1001 -> 7.0x */
248 80, /* 1010 -> 8.0x */
249 50, /* 1011 -> 5.0x */
250 65, /* 1100 -> 6.5x */
251 75, /* 1101 -> 7.5x */
252 85, /* 1110 -> 8.5x */
253 120, /* 1111 -> 12.0x */
Rafał Bilskice243822007-05-28 21:58:09 +0200254 -1, /* 0000 -> 10.0x */
Linus Torvalds1da177e2005-04-16 15:20:36 -0700255 110, /* 0001 -> 11.0x */
Rafał Bilskice243822007-05-28 21:58:09 +0200256 -1, /* 0010 -> 12.0x */
257 -1, /* 0011 -> 9.0x */
Linus Torvalds1da177e2005-04-16 15:20:36 -0700258 105, /* 0100 -> 10.5x */
259 115, /* 0101 -> 11.5x */
260 125, /* 0110 -> 12.5x */
261 135, /* 0111 -> 13.5x */
262 140, /* 1000 -> 14.0x */
263 150, /* 1001 -> 15.0x */
264 160, /* 1010 -> 16.0x */
265 130, /* 1011 -> 13.0x */
266 145, /* 1100 -> 14.5x */
267 155, /* 1101 -> 15.5x */
268 -1, /* 1110 -> RESERVED (13.0x) */
Rafał Bilskice243822007-05-28 21:58:09 +0200269 -1, /* 1111 -> 12.0x */
Linus Torvalds1da177e2005-04-16 15:20:36 -0700270};
271
Paul Gortmaker27609842013-06-19 13:54:04 -0400272static const int nehemiah_eblcr[32] = {
Linus Torvalds1da177e2005-04-16 15:20:36 -0700273 50, /* 0000 -> 5.0x */
274 160, /* 0001 -> 16.0x */
Rafa³ Bilski0d44b2b2007-01-31 23:50:49 +0100275 40, /* 0010 -> 4.0x */
Linus Torvalds1da177e2005-04-16 15:20:36 -0700276 100, /* 0011 -> 10.0x */
277 55, /* 0100 -> 5.5x */
278 -1, /* 0101 -> RESERVED */
Rafa³ Bilski0d44b2b2007-01-31 23:50:49 +0100279 45, /* 0110 -> 4.5x */
Linus Torvalds1da177e2005-04-16 15:20:36 -0700280 95, /* 0111 -> 9.5x */
281 90, /* 1000 -> 9.0x */
282 70, /* 1001 -> 7.0x */
283 80, /* 1010 -> 8.0x */
284 60, /* 1011 -> 6.0x */
285 120, /* 1100 -> 12.0x */
286 75, /* 1101 -> 7.5x */
287 85, /* 1110 -> 8.5x */
288 65, /* 1111 -> 6.5x */
289 90, /* 0000 -> 9.0x */
290 110, /* 0001 -> 11.0x */
291 120, /* 0010 -> 12.0x */
292 100, /* 0011 -> 10.0x */
293 135, /* 0100 -> 13.5x */
294 115, /* 0101 -> 11.5x */
295 125, /* 0110 -> 12.5x */
296 105, /* 0111 -> 10.5x */
297 130, /* 1000 -> 13.0x */
298 150, /* 1001 -> 15.0x */
299 160, /* 1010 -> 16.0x */
300 140, /* 1011 -> 14.0x */
301 120, /* 1100 -> 12.0x */
302 155, /* 1101 -> 15.5x */
303 -1, /* 1110 -> RESERVED (13.0x) */
304 145 /* 1111 -> 14.5x */
Linus Torvalds1da177e2005-04-16 15:20:36 -0700305};
306
Dave Jones32ee8c32006-02-28 00:43:23 -0500307/*
Linus Torvalds1da177e2005-04-16 15:20:36 -0700308 * Voltage scales. Div/Mod by 1000 to get actual voltage.
309 * Which scale to use depends on the VRM type in use.
310 */
Rafa³ Bilskidb44aaf2006-08-16 01:07:33 +0200311
312struct mV_pos {
313 unsigned short mV;
314 unsigned short pos;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700315};
316
Paul Gortmaker27609842013-06-19 13:54:04 -0400317static const struct mV_pos vrm85_mV[32] = {
Rafa³ Bilskidb44aaf2006-08-16 01:07:33 +0200318 {1250, 8}, {1200, 6}, {1150, 4}, {1100, 2},
319 {1050, 0}, {1800, 30}, {1750, 28}, {1700, 26},
320 {1650, 24}, {1600, 22}, {1550, 20}, {1500, 18},
321 {1450, 16}, {1400, 14}, {1350, 12}, {1300, 10},
322 {1275, 9}, {1225, 7}, {1175, 5}, {1125, 3},
323 {1075, 1}, {1825, 31}, {1775, 29}, {1725, 27},
324 {1675, 25}, {1625, 23}, {1575, 21}, {1525, 19},
325 {1475, 17}, {1425, 15}, {1375, 13}, {1325, 11}
326};
327
Paul Gortmaker27609842013-06-19 13:54:04 -0400328static const unsigned char mV_vrm85[32] = {
Rafa³ Bilskidb44aaf2006-08-16 01:07:33 +0200329 0x04, 0x14, 0x03, 0x13, 0x02, 0x12, 0x01, 0x11,
330 0x00, 0x10, 0x0f, 0x1f, 0x0e, 0x1e, 0x0d, 0x1d,
331 0x0c, 0x1c, 0x0b, 0x1b, 0x0a, 0x1a, 0x09, 0x19,
332 0x08, 0x18, 0x07, 0x17, 0x06, 0x16, 0x05, 0x15
333};
334
Paul Gortmaker27609842013-06-19 13:54:04 -0400335static const struct mV_pos mobilevrm_mV[32] = {
Rafa³ Bilskidb44aaf2006-08-16 01:07:33 +0200336 {1750, 31}, {1700, 30}, {1650, 29}, {1600, 28},
337 {1550, 27}, {1500, 26}, {1450, 25}, {1400, 24},
338 {1350, 23}, {1300, 22}, {1250, 21}, {1200, 20},
339 {1150, 19}, {1100, 18}, {1050, 17}, {1000, 16},
340 {975, 15}, {950, 14}, {925, 13}, {900, 12},
341 {875, 11}, {850, 10}, {825, 9}, {800, 8},
342 {775, 7}, {750, 6}, {725, 5}, {700, 4},
343 {675, 3}, {650, 2}, {625, 1}, {600, 0}
344};
345
Paul Gortmaker27609842013-06-19 13:54:04 -0400346static const unsigned char mV_mobilevrm[32] = {
Rafa³ Bilskidb44aaf2006-08-16 01:07:33 +0200347 0x1f, 0x1e, 0x1d, 0x1c, 0x1b, 0x1a, 0x19, 0x18,
348 0x17, 0x16, 0x15, 0x14, 0x13, 0x12, 0x11, 0x10,
349 0x0f, 0x0e, 0x0d, 0x0c, 0x0b, 0x0a, 0x09, 0x08,
350 0x07, 0x06, 0x05, 0x04, 0x03, 0x02, 0x01, 0x00
Linus Torvalds1da177e2005-04-16 15:20:36 -0700351};
352