GNU Linux-libre 5.19-rc6-gnu
[releases.git] / drivers / cpufreq / longhaul.h
1 /* SPDX-License-Identifier: GPL-2.0-only */
2 /*
3  *  longhaul.h
4  *  (C) 2003 Dave Jones.
5  *
6  *  VIA-specific information
7  */
8
9 union 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
20 union 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.
51  * The eblcr values specify the ratio read from the CPU.
52  * The mults values specify what to write to the CPU.
53  */
54
55 /*
56  * VIA C3 Samuel 1  & Samuel 2 (stepping 0)
57  */
58 static const int samuel1_mults[16] = {
59         -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
77 static const int samuel1_eblcr[16] = {
78         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  */
99 static const int samuel2_eblcr[16] = {
100         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  */
121 static const int ezra_mults[16] = {
122         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
140 static const int ezra_eblcr[16] = {
141         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  */
162 static const int ezrat_mults[32] = {
163         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 */
182         -1, /* 0010 -> 12.0x */
183         -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
198 static const int ezrat_eblcr[32] = {
199         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 */
236
237 static const int nehemiah_mults[32] = {
238         100, /* 0000 -> 10.0x */
239         -1, /* 0001 -> 16.0x */
240         40,  /* 0010 ->  4.0x */
241         90,  /* 0011 ->  9.0x */
242         95,  /* 0100 ->  9.5x */
243         -1,  /* 0101 ->  RESERVED */
244         45,  /* 0110 ->  4.5x */
245         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 */
254         -1, /* 0000 -> 10.0x */
255         110, /* 0001 -> 11.0x */
256         -1, /* 0010 -> 12.0x */
257         -1,  /* 0011 ->  9.0x */
258         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) */
269         -1, /* 1111 -> 12.0x */
270 };
271
272 static const int nehemiah_eblcr[32] = {
273         50,  /* 0000 ->  5.0x */
274         160, /* 0001 -> 16.0x */
275         40,  /* 0010 ->  4.0x */
276         100, /* 0011 -> 10.0x */
277         55,  /* 0100 ->  5.5x */
278         -1,  /* 0101 ->  RESERVED */
279         45,  /* 0110 ->  4.5x */
280         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 */
305 };
306
307 /*
308  * Voltage scales. Div/Mod by 1000 to get actual voltage.
309  * Which scale to use depends on the VRM type in use.
310  */
311
312 struct mV_pos {
313         unsigned short mV;
314         unsigned short pos;
315 };
316
317 static const struct mV_pos vrm85_mV[32] = {
318         {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
328 static const unsigned char mV_vrm85[32] = {
329         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
335 static const struct mV_pos mobilevrm_mV[32] = {
336         {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
346 static const unsigned char mV_mobilevrm[32] = {
347         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
351 };
352