xref: /openbmc/linux/drivers/cpufreq/longhaul.h (revision 2c684d89)
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