GNU Linux-libre 4.4.289-gnu1
[releases.git] / drivers / cpufreq / longhaul.h
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