radeon_ni_dpm.c revision 1.1.2.2 1 /* $NetBSD: radeon_ni_dpm.c,v 1.1.2.2 2018/09/06 06:56:32 pgoyette Exp $ */
2
3 /*
4 * Copyright 2012 Advanced Micro Devices, Inc.
5 *
6 * Permission is hereby granted, free of charge, to any person obtaining a
7 * copy of this software and associated documentation files (the "Software"),
8 * to deal in the Software without restriction, including without limitation
9 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
10 * and/or sell copies of the Software, and to permit persons to whom the
11 * Software is furnished to do so, subject to the following conditions:
12 *
13 * The above copyright notice and this permission notice shall be included in
14 * all copies or substantial portions of the Software.
15 *
16 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
19 * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
20 * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
21 * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
22 * OTHER DEALINGS IN THE SOFTWARE.
23 *
24 */
25
26 #include <sys/cdefs.h>
27 __KERNEL_RCSID(0, "$NetBSD: radeon_ni_dpm.c,v 1.1.2.2 2018/09/06 06:56:32 pgoyette Exp $");
28
29 #include "drmP.h"
30 #include "radeon.h"
31 #include "radeon_asic.h"
32 #include "nid.h"
33 #include "r600_dpm.h"
34 #include "ni_dpm.h"
35 #include "atom.h"
36 #include <linux/math64.h>
37 #include <linux/seq_file.h>
38
39 #define MC_CG_ARB_FREQ_F0 0x0a
40 #define MC_CG_ARB_FREQ_F1 0x0b
41 #define MC_CG_ARB_FREQ_F2 0x0c
42 #define MC_CG_ARB_FREQ_F3 0x0d
43
44 #define SMC_RAM_END 0xC000
45
46 static const struct ni_cac_weights cac_weights_cayman_xt =
47 {
48 0x15,
49 0x2,
50 0x19,
51 0x2,
52 0x8,
53 0x14,
54 0x2,
55 0x16,
56 0xE,
57 0x17,
58 0x13,
59 0x2B,
60 0x10,
61 0x7,
62 0x5,
63 0x5,
64 0x5,
65 0x2,
66 0x3,
67 0x9,
68 0x10,
69 0x10,
70 0x2B,
71 0xA,
72 0x9,
73 0x4,
74 0xD,
75 0xD,
76 0x3E,
77 0x18,
78 0x14,
79 0,
80 0x3,
81 0x3,
82 0x5,
83 0,
84 0x2,
85 0,
86 0,
87 0,
88 0,
89 0,
90 0,
91 0,
92 0,
93 0,
94 0x1CC,
95 0,
96 0x164,
97 1,
98 1,
99 1,
100 1,
101 12,
102 12,
103 12,
104 0x12,
105 0x1F,
106 132,
107 5,
108 7,
109 0,
110 { 0, 0, 0, 0, 0, 0, 0, 0 },
111 { 0, 0, 0, 0 },
112 true
113 };
114
115 static const struct ni_cac_weights cac_weights_cayman_pro =
116 {
117 0x16,
118 0x4,
119 0x10,
120 0x2,
121 0xA,
122 0x16,
123 0x2,
124 0x18,
125 0x10,
126 0x1A,
127 0x16,
128 0x2D,
129 0x12,
130 0xA,
131 0x6,
132 0x6,
133 0x6,
134 0x2,
135 0x4,
136 0xB,
137 0x11,
138 0x11,
139 0x2D,
140 0xC,
141 0xC,
142 0x7,
143 0x10,
144 0x10,
145 0x3F,
146 0x1A,
147 0x16,
148 0,
149 0x7,
150 0x4,
151 0x6,
152 1,
153 0x2,
154 0x1,
155 0,
156 0,
157 0,
158 0,
159 0,
160 0,
161 0x30,
162 0,
163 0x1CF,
164 0,
165 0x166,
166 1,
167 1,
168 1,
169 1,
170 12,
171 12,
172 12,
173 0x15,
174 0x1F,
175 132,
176 6,
177 6,
178 0,
179 { 0, 0, 0, 0, 0, 0, 0, 0 },
180 { 0, 0, 0, 0 },
181 true
182 };
183
184 static const struct ni_cac_weights cac_weights_cayman_le =
185 {
186 0x7,
187 0xE,
188 0x1,
189 0xA,
190 0x1,
191 0x3F,
192 0x2,
193 0x18,
194 0x10,
195 0x1A,
196 0x1,
197 0x3F,
198 0x1,
199 0xE,
200 0x6,
201 0x6,
202 0x6,
203 0x2,
204 0x4,
205 0x9,
206 0x1A,
207 0x1A,
208 0x2C,
209 0xA,
210 0x11,
211 0x8,
212 0x19,
213 0x19,
214 0x1,
215 0x1,
216 0x1A,
217 0,
218 0x8,
219 0x5,
220 0x8,
221 0x1,
222 0x3,
223 0x1,
224 0,
225 0,
226 0,
227 0,
228 0,
229 0,
230 0x38,
231 0x38,
232 0x239,
233 0x3,
234 0x18A,
235 1,
236 1,
237 1,
238 1,
239 12,
240 12,
241 12,
242 0x15,
243 0x22,
244 132,
245 6,
246 6,
247 0,
248 { 0, 0, 0, 0, 0, 0, 0, 0 },
249 { 0, 0, 0, 0 },
250 true
251 };
252
253 #define NISLANDS_MGCG_SEQUENCE 300
254
255 static const u32 cayman_cgcg_cgls_default[] =
256 {
257 0x000008f8, 0x00000010, 0xffffffff,
258 0x000008fc, 0x00000000, 0xffffffff,
259 0x000008f8, 0x00000011, 0xffffffff,
260 0x000008fc, 0x00000000, 0xffffffff,
261 0x000008f8, 0x00000012, 0xffffffff,
262 0x000008fc, 0x00000000, 0xffffffff,
263 0x000008f8, 0x00000013, 0xffffffff,
264 0x000008fc, 0x00000000, 0xffffffff,
265 0x000008f8, 0x00000014, 0xffffffff,
266 0x000008fc, 0x00000000, 0xffffffff,
267 0x000008f8, 0x00000015, 0xffffffff,
268 0x000008fc, 0x00000000, 0xffffffff,
269 0x000008f8, 0x00000016, 0xffffffff,
270 0x000008fc, 0x00000000, 0xffffffff,
271 0x000008f8, 0x00000017, 0xffffffff,
272 0x000008fc, 0x00000000, 0xffffffff,
273 0x000008f8, 0x00000018, 0xffffffff,
274 0x000008fc, 0x00000000, 0xffffffff,
275 0x000008f8, 0x00000019, 0xffffffff,
276 0x000008fc, 0x00000000, 0xffffffff,
277 0x000008f8, 0x0000001a, 0xffffffff,
278 0x000008fc, 0x00000000, 0xffffffff,
279 0x000008f8, 0x0000001b, 0xffffffff,
280 0x000008fc, 0x00000000, 0xffffffff,
281 0x000008f8, 0x00000020, 0xffffffff,
282 0x000008fc, 0x00000000, 0xffffffff,
283 0x000008f8, 0x00000021, 0xffffffff,
284 0x000008fc, 0x00000000, 0xffffffff,
285 0x000008f8, 0x00000022, 0xffffffff,
286 0x000008fc, 0x00000000, 0xffffffff,
287 0x000008f8, 0x00000023, 0xffffffff,
288 0x000008fc, 0x00000000, 0xffffffff,
289 0x000008f8, 0x00000024, 0xffffffff,
290 0x000008fc, 0x00000000, 0xffffffff,
291 0x000008f8, 0x00000025, 0xffffffff,
292 0x000008fc, 0x00000000, 0xffffffff,
293 0x000008f8, 0x00000026, 0xffffffff,
294 0x000008fc, 0x00000000, 0xffffffff,
295 0x000008f8, 0x00000027, 0xffffffff,
296 0x000008fc, 0x00000000, 0xffffffff,
297 0x000008f8, 0x00000028, 0xffffffff,
298 0x000008fc, 0x00000000, 0xffffffff,
299 0x000008f8, 0x00000029, 0xffffffff,
300 0x000008fc, 0x00000000, 0xffffffff,
301 0x000008f8, 0x0000002a, 0xffffffff,
302 0x000008fc, 0x00000000, 0xffffffff,
303 0x000008f8, 0x0000002b, 0xffffffff,
304 0x000008fc, 0x00000000, 0xffffffff
305 };
306 #define CAYMAN_CGCG_CGLS_DEFAULT_LENGTH sizeof(cayman_cgcg_cgls_default) / (3 * sizeof(u32))
307
308 static const u32 cayman_cgcg_cgls_disable[] =
309 {
310 0x000008f8, 0x00000010, 0xffffffff,
311 0x000008fc, 0xffffffff, 0xffffffff,
312 0x000008f8, 0x00000011, 0xffffffff,
313 0x000008fc, 0xffffffff, 0xffffffff,
314 0x000008f8, 0x00000012, 0xffffffff,
315 0x000008fc, 0xffffffff, 0xffffffff,
316 0x000008f8, 0x00000013, 0xffffffff,
317 0x000008fc, 0xffffffff, 0xffffffff,
318 0x000008f8, 0x00000014, 0xffffffff,
319 0x000008fc, 0xffffffff, 0xffffffff,
320 0x000008f8, 0x00000015, 0xffffffff,
321 0x000008fc, 0xffffffff, 0xffffffff,
322 0x000008f8, 0x00000016, 0xffffffff,
323 0x000008fc, 0xffffffff, 0xffffffff,
324 0x000008f8, 0x00000017, 0xffffffff,
325 0x000008fc, 0xffffffff, 0xffffffff,
326 0x000008f8, 0x00000018, 0xffffffff,
327 0x000008fc, 0xffffffff, 0xffffffff,
328 0x000008f8, 0x00000019, 0xffffffff,
329 0x000008fc, 0xffffffff, 0xffffffff,
330 0x000008f8, 0x0000001a, 0xffffffff,
331 0x000008fc, 0xffffffff, 0xffffffff,
332 0x000008f8, 0x0000001b, 0xffffffff,
333 0x000008fc, 0xffffffff, 0xffffffff,
334 0x000008f8, 0x00000020, 0xffffffff,
335 0x000008fc, 0x00000000, 0xffffffff,
336 0x000008f8, 0x00000021, 0xffffffff,
337 0x000008fc, 0x00000000, 0xffffffff,
338 0x000008f8, 0x00000022, 0xffffffff,
339 0x000008fc, 0x00000000, 0xffffffff,
340 0x000008f8, 0x00000023, 0xffffffff,
341 0x000008fc, 0x00000000, 0xffffffff,
342 0x000008f8, 0x00000024, 0xffffffff,
343 0x000008fc, 0x00000000, 0xffffffff,
344 0x000008f8, 0x00000025, 0xffffffff,
345 0x000008fc, 0x00000000, 0xffffffff,
346 0x000008f8, 0x00000026, 0xffffffff,
347 0x000008fc, 0x00000000, 0xffffffff,
348 0x000008f8, 0x00000027, 0xffffffff,
349 0x000008fc, 0x00000000, 0xffffffff,
350 0x000008f8, 0x00000028, 0xffffffff,
351 0x000008fc, 0x00000000, 0xffffffff,
352 0x000008f8, 0x00000029, 0xffffffff,
353 0x000008fc, 0x00000000, 0xffffffff,
354 0x000008f8, 0x0000002a, 0xffffffff,
355 0x000008fc, 0x00000000, 0xffffffff,
356 0x000008f8, 0x0000002b, 0xffffffff,
357 0x000008fc, 0x00000000, 0xffffffff,
358 0x00000644, 0x000f7902, 0x001f4180,
359 0x00000644, 0x000f3802, 0x001f4180
360 };
361 #define CAYMAN_CGCG_CGLS_DISABLE_LENGTH sizeof(cayman_cgcg_cgls_disable) / (3 * sizeof(u32))
362
363 static const u32 cayman_cgcg_cgls_enable[] =
364 {
365 0x00000644, 0x000f7882, 0x001f4080,
366 0x000008f8, 0x00000010, 0xffffffff,
367 0x000008fc, 0x00000000, 0xffffffff,
368 0x000008f8, 0x00000011, 0xffffffff,
369 0x000008fc, 0x00000000, 0xffffffff,
370 0x000008f8, 0x00000012, 0xffffffff,
371 0x000008fc, 0x00000000, 0xffffffff,
372 0x000008f8, 0x00000013, 0xffffffff,
373 0x000008fc, 0x00000000, 0xffffffff,
374 0x000008f8, 0x00000014, 0xffffffff,
375 0x000008fc, 0x00000000, 0xffffffff,
376 0x000008f8, 0x00000015, 0xffffffff,
377 0x000008fc, 0x00000000, 0xffffffff,
378 0x000008f8, 0x00000016, 0xffffffff,
379 0x000008fc, 0x00000000, 0xffffffff,
380 0x000008f8, 0x00000017, 0xffffffff,
381 0x000008fc, 0x00000000, 0xffffffff,
382 0x000008f8, 0x00000018, 0xffffffff,
383 0x000008fc, 0x00000000, 0xffffffff,
384 0x000008f8, 0x00000019, 0xffffffff,
385 0x000008fc, 0x00000000, 0xffffffff,
386 0x000008f8, 0x0000001a, 0xffffffff,
387 0x000008fc, 0x00000000, 0xffffffff,
388 0x000008f8, 0x0000001b, 0xffffffff,
389 0x000008fc, 0x00000000, 0xffffffff,
390 0x000008f8, 0x00000020, 0xffffffff,
391 0x000008fc, 0xffffffff, 0xffffffff,
392 0x000008f8, 0x00000021, 0xffffffff,
393 0x000008fc, 0xffffffff, 0xffffffff,
394 0x000008f8, 0x00000022, 0xffffffff,
395 0x000008fc, 0xffffffff, 0xffffffff,
396 0x000008f8, 0x00000023, 0xffffffff,
397 0x000008fc, 0xffffffff, 0xffffffff,
398 0x000008f8, 0x00000024, 0xffffffff,
399 0x000008fc, 0xffffffff, 0xffffffff,
400 0x000008f8, 0x00000025, 0xffffffff,
401 0x000008fc, 0xffffffff, 0xffffffff,
402 0x000008f8, 0x00000026, 0xffffffff,
403 0x000008fc, 0xffffffff, 0xffffffff,
404 0x000008f8, 0x00000027, 0xffffffff,
405 0x000008fc, 0xffffffff, 0xffffffff,
406 0x000008f8, 0x00000028, 0xffffffff,
407 0x000008fc, 0xffffffff, 0xffffffff,
408 0x000008f8, 0x00000029, 0xffffffff,
409 0x000008fc, 0xffffffff, 0xffffffff,
410 0x000008f8, 0x0000002a, 0xffffffff,
411 0x000008fc, 0xffffffff, 0xffffffff,
412 0x000008f8, 0x0000002b, 0xffffffff,
413 0x000008fc, 0xffffffff, 0xffffffff
414 };
415 #define CAYMAN_CGCG_CGLS_ENABLE_LENGTH sizeof(cayman_cgcg_cgls_enable) / (3 * sizeof(u32))
416
417 static const u32 cayman_mgcg_default[] =
418 {
419 0x0000802c, 0xc0000000, 0xffffffff,
420 0x00003fc4, 0xc0000000, 0xffffffff,
421 0x00005448, 0x00000100, 0xffffffff,
422 0x000055e4, 0x00000100, 0xffffffff,
423 0x0000160c, 0x00000100, 0xffffffff,
424 0x00008984, 0x06000100, 0xffffffff,
425 0x0000c164, 0x00000100, 0xffffffff,
426 0x00008a18, 0x00000100, 0xffffffff,
427 0x0000897c, 0x06000100, 0xffffffff,
428 0x00008b28, 0x00000100, 0xffffffff,
429 0x00009144, 0x00800200, 0xffffffff,
430 0x00009a60, 0x00000100, 0xffffffff,
431 0x00009868, 0x00000100, 0xffffffff,
432 0x00008d58, 0x00000100, 0xffffffff,
433 0x00009510, 0x00000100, 0xffffffff,
434 0x0000949c, 0x00000100, 0xffffffff,
435 0x00009654, 0x00000100, 0xffffffff,
436 0x00009030, 0x00000100, 0xffffffff,
437 0x00009034, 0x00000100, 0xffffffff,
438 0x00009038, 0x00000100, 0xffffffff,
439 0x0000903c, 0x00000100, 0xffffffff,
440 0x00009040, 0x00000100, 0xffffffff,
441 0x0000a200, 0x00000100, 0xffffffff,
442 0x0000a204, 0x00000100, 0xffffffff,
443 0x0000a208, 0x00000100, 0xffffffff,
444 0x0000a20c, 0x00000100, 0xffffffff,
445 0x00009744, 0x00000100, 0xffffffff,
446 0x00003f80, 0x00000100, 0xffffffff,
447 0x0000a210, 0x00000100, 0xffffffff,
448 0x0000a214, 0x00000100, 0xffffffff,
449 0x000004d8, 0x00000100, 0xffffffff,
450 0x00009664, 0x00000100, 0xffffffff,
451 0x00009698, 0x00000100, 0xffffffff,
452 0x000004d4, 0x00000200, 0xffffffff,
453 0x000004d0, 0x00000000, 0xffffffff,
454 0x000030cc, 0x00000104, 0xffffffff,
455 0x0000d0c0, 0x00000100, 0xffffffff,
456 0x0000d8c0, 0x00000100, 0xffffffff,
457 0x0000802c, 0x40000000, 0xffffffff,
458 0x00003fc4, 0x40000000, 0xffffffff,
459 0x0000915c, 0x00010000, 0xffffffff,
460 0x00009160, 0x00030002, 0xffffffff,
461 0x00009164, 0x00050004, 0xffffffff,
462 0x00009168, 0x00070006, 0xffffffff,
463 0x00009178, 0x00070000, 0xffffffff,
464 0x0000917c, 0x00030002, 0xffffffff,
465 0x00009180, 0x00050004, 0xffffffff,
466 0x0000918c, 0x00010006, 0xffffffff,
467 0x00009190, 0x00090008, 0xffffffff,
468 0x00009194, 0x00070000, 0xffffffff,
469 0x00009198, 0x00030002, 0xffffffff,
470 0x0000919c, 0x00050004, 0xffffffff,
471 0x000091a8, 0x00010006, 0xffffffff,
472 0x000091ac, 0x00090008, 0xffffffff,
473 0x000091b0, 0x00070000, 0xffffffff,
474 0x000091b4, 0x00030002, 0xffffffff,
475 0x000091b8, 0x00050004, 0xffffffff,
476 0x000091c4, 0x00010006, 0xffffffff,
477 0x000091c8, 0x00090008, 0xffffffff,
478 0x000091cc, 0x00070000, 0xffffffff,
479 0x000091d0, 0x00030002, 0xffffffff,
480 0x000091d4, 0x00050004, 0xffffffff,
481 0x000091e0, 0x00010006, 0xffffffff,
482 0x000091e4, 0x00090008, 0xffffffff,
483 0x000091e8, 0x00000000, 0xffffffff,
484 0x000091ec, 0x00070000, 0xffffffff,
485 0x000091f0, 0x00030002, 0xffffffff,
486 0x000091f4, 0x00050004, 0xffffffff,
487 0x00009200, 0x00010006, 0xffffffff,
488 0x00009204, 0x00090008, 0xffffffff,
489 0x00009208, 0x00070000, 0xffffffff,
490 0x0000920c, 0x00030002, 0xffffffff,
491 0x00009210, 0x00050004, 0xffffffff,
492 0x0000921c, 0x00010006, 0xffffffff,
493 0x00009220, 0x00090008, 0xffffffff,
494 0x00009224, 0x00070000, 0xffffffff,
495 0x00009228, 0x00030002, 0xffffffff,
496 0x0000922c, 0x00050004, 0xffffffff,
497 0x00009238, 0x00010006, 0xffffffff,
498 0x0000923c, 0x00090008, 0xffffffff,
499 0x00009240, 0x00070000, 0xffffffff,
500 0x00009244, 0x00030002, 0xffffffff,
501 0x00009248, 0x00050004, 0xffffffff,
502 0x00009254, 0x00010006, 0xffffffff,
503 0x00009258, 0x00090008, 0xffffffff,
504 0x0000925c, 0x00070000, 0xffffffff,
505 0x00009260, 0x00030002, 0xffffffff,
506 0x00009264, 0x00050004, 0xffffffff,
507 0x00009270, 0x00010006, 0xffffffff,
508 0x00009274, 0x00090008, 0xffffffff,
509 0x00009278, 0x00070000, 0xffffffff,
510 0x0000927c, 0x00030002, 0xffffffff,
511 0x00009280, 0x00050004, 0xffffffff,
512 0x0000928c, 0x00010006, 0xffffffff,
513 0x00009290, 0x00090008, 0xffffffff,
514 0x000092a8, 0x00070000, 0xffffffff,
515 0x000092ac, 0x00030002, 0xffffffff,
516 0x000092b0, 0x00050004, 0xffffffff,
517 0x000092bc, 0x00010006, 0xffffffff,
518 0x000092c0, 0x00090008, 0xffffffff,
519 0x000092c4, 0x00070000, 0xffffffff,
520 0x000092c8, 0x00030002, 0xffffffff,
521 0x000092cc, 0x00050004, 0xffffffff,
522 0x000092d8, 0x00010006, 0xffffffff,
523 0x000092dc, 0x00090008, 0xffffffff,
524 0x00009294, 0x00000000, 0xffffffff,
525 0x0000802c, 0x40010000, 0xffffffff,
526 0x00003fc4, 0x40010000, 0xffffffff,
527 0x0000915c, 0x00010000, 0xffffffff,
528 0x00009160, 0x00030002, 0xffffffff,
529 0x00009164, 0x00050004, 0xffffffff,
530 0x00009168, 0x00070006, 0xffffffff,
531 0x00009178, 0x00070000, 0xffffffff,
532 0x0000917c, 0x00030002, 0xffffffff,
533 0x00009180, 0x00050004, 0xffffffff,
534 0x0000918c, 0x00010006, 0xffffffff,
535 0x00009190, 0x00090008, 0xffffffff,
536 0x00009194, 0x00070000, 0xffffffff,
537 0x00009198, 0x00030002, 0xffffffff,
538 0x0000919c, 0x00050004, 0xffffffff,
539 0x000091a8, 0x00010006, 0xffffffff,
540 0x000091ac, 0x00090008, 0xffffffff,
541 0x000091b0, 0x00070000, 0xffffffff,
542 0x000091b4, 0x00030002, 0xffffffff,
543 0x000091b8, 0x00050004, 0xffffffff,
544 0x000091c4, 0x00010006, 0xffffffff,
545 0x000091c8, 0x00090008, 0xffffffff,
546 0x000091cc, 0x00070000, 0xffffffff,
547 0x000091d0, 0x00030002, 0xffffffff,
548 0x000091d4, 0x00050004, 0xffffffff,
549 0x000091e0, 0x00010006, 0xffffffff,
550 0x000091e4, 0x00090008, 0xffffffff,
551 0x000091e8, 0x00000000, 0xffffffff,
552 0x000091ec, 0x00070000, 0xffffffff,
553 0x000091f0, 0x00030002, 0xffffffff,
554 0x000091f4, 0x00050004, 0xffffffff,
555 0x00009200, 0x00010006, 0xffffffff,
556 0x00009204, 0x00090008, 0xffffffff,
557 0x00009208, 0x00070000, 0xffffffff,
558 0x0000920c, 0x00030002, 0xffffffff,
559 0x00009210, 0x00050004, 0xffffffff,
560 0x0000921c, 0x00010006, 0xffffffff,
561 0x00009220, 0x00090008, 0xffffffff,
562 0x00009224, 0x00070000, 0xffffffff,
563 0x00009228, 0x00030002, 0xffffffff,
564 0x0000922c, 0x00050004, 0xffffffff,
565 0x00009238, 0x00010006, 0xffffffff,
566 0x0000923c, 0x00090008, 0xffffffff,
567 0x00009240, 0x00070000, 0xffffffff,
568 0x00009244, 0x00030002, 0xffffffff,
569 0x00009248, 0x00050004, 0xffffffff,
570 0x00009254, 0x00010006, 0xffffffff,
571 0x00009258, 0x00090008, 0xffffffff,
572 0x0000925c, 0x00070000, 0xffffffff,
573 0x00009260, 0x00030002, 0xffffffff,
574 0x00009264, 0x00050004, 0xffffffff,
575 0x00009270, 0x00010006, 0xffffffff,
576 0x00009274, 0x00090008, 0xffffffff,
577 0x00009278, 0x00070000, 0xffffffff,
578 0x0000927c, 0x00030002, 0xffffffff,
579 0x00009280, 0x00050004, 0xffffffff,
580 0x0000928c, 0x00010006, 0xffffffff,
581 0x00009290, 0x00090008, 0xffffffff,
582 0x000092a8, 0x00070000, 0xffffffff,
583 0x000092ac, 0x00030002, 0xffffffff,
584 0x000092b0, 0x00050004, 0xffffffff,
585 0x000092bc, 0x00010006, 0xffffffff,
586 0x000092c0, 0x00090008, 0xffffffff,
587 0x000092c4, 0x00070000, 0xffffffff,
588 0x000092c8, 0x00030002, 0xffffffff,
589 0x000092cc, 0x00050004, 0xffffffff,
590 0x000092d8, 0x00010006, 0xffffffff,
591 0x000092dc, 0x00090008, 0xffffffff,
592 0x00009294, 0x00000000, 0xffffffff,
593 0x0000802c, 0xc0000000, 0xffffffff,
594 0x00003fc4, 0xc0000000, 0xffffffff,
595 0x000008f8, 0x00000010, 0xffffffff,
596 0x000008fc, 0x00000000, 0xffffffff,
597 0x000008f8, 0x00000011, 0xffffffff,
598 0x000008fc, 0x00000000, 0xffffffff,
599 0x000008f8, 0x00000012, 0xffffffff,
600 0x000008fc, 0x00000000, 0xffffffff,
601 0x000008f8, 0x00000013, 0xffffffff,
602 0x000008fc, 0x00000000, 0xffffffff,
603 0x000008f8, 0x00000014, 0xffffffff,
604 0x000008fc, 0x00000000, 0xffffffff,
605 0x000008f8, 0x00000015, 0xffffffff,
606 0x000008fc, 0x00000000, 0xffffffff,
607 0x000008f8, 0x00000016, 0xffffffff,
608 0x000008fc, 0x00000000, 0xffffffff,
609 0x000008f8, 0x00000017, 0xffffffff,
610 0x000008fc, 0x00000000, 0xffffffff,
611 0x000008f8, 0x00000018, 0xffffffff,
612 0x000008fc, 0x00000000, 0xffffffff,
613 0x000008f8, 0x00000019, 0xffffffff,
614 0x000008fc, 0x00000000, 0xffffffff,
615 0x000008f8, 0x0000001a, 0xffffffff,
616 0x000008fc, 0x00000000, 0xffffffff,
617 0x000008f8, 0x0000001b, 0xffffffff,
618 0x000008fc, 0x00000000, 0xffffffff
619 };
620 #define CAYMAN_MGCG_DEFAULT_LENGTH sizeof(cayman_mgcg_default) / (3 * sizeof(u32))
621
622 static const u32 cayman_mgcg_disable[] =
623 {
624 0x0000802c, 0xc0000000, 0xffffffff,
625 0x000008f8, 0x00000000, 0xffffffff,
626 0x000008fc, 0xffffffff, 0xffffffff,
627 0x000008f8, 0x00000001, 0xffffffff,
628 0x000008fc, 0xffffffff, 0xffffffff,
629 0x000008f8, 0x00000002, 0xffffffff,
630 0x000008fc, 0xffffffff, 0xffffffff,
631 0x000008f8, 0x00000003, 0xffffffff,
632 0x000008fc, 0xffffffff, 0xffffffff,
633 0x00009150, 0x00600000, 0xffffffff
634 };
635 #define CAYMAN_MGCG_DISABLE_LENGTH sizeof(cayman_mgcg_disable) / (3 * sizeof(u32))
636
637 static const u32 cayman_mgcg_enable[] =
638 {
639 0x0000802c, 0xc0000000, 0xffffffff,
640 0x000008f8, 0x00000000, 0xffffffff,
641 0x000008fc, 0x00000000, 0xffffffff,
642 0x000008f8, 0x00000001, 0xffffffff,
643 0x000008fc, 0x00000000, 0xffffffff,
644 0x000008f8, 0x00000002, 0xffffffff,
645 0x000008fc, 0x00600000, 0xffffffff,
646 0x000008f8, 0x00000003, 0xffffffff,
647 0x000008fc, 0x00000000, 0xffffffff,
648 0x00009150, 0x96944200, 0xffffffff
649 };
650
651 #define CAYMAN_MGCG_ENABLE_LENGTH sizeof(cayman_mgcg_enable) / (3 * sizeof(u32))
652
653 #define NISLANDS_SYSLS_SEQUENCE 100
654
655 static const u32 cayman_sysls_default[] =
656 {
657 /* Register, Value, Mask bits */
658 0x000055e8, 0x00000000, 0xffffffff,
659 0x0000d0bc, 0x00000000, 0xffffffff,
660 0x0000d8bc, 0x00000000, 0xffffffff,
661 0x000015c0, 0x000c1401, 0xffffffff,
662 0x0000264c, 0x000c0400, 0xffffffff,
663 0x00002648, 0x000c0400, 0xffffffff,
664 0x00002650, 0x000c0400, 0xffffffff,
665 0x000020b8, 0x000c0400, 0xffffffff,
666 0x000020bc, 0x000c0400, 0xffffffff,
667 0x000020c0, 0x000c0c80, 0xffffffff,
668 0x0000f4a0, 0x000000c0, 0xffffffff,
669 0x0000f4a4, 0x00680fff, 0xffffffff,
670 0x00002f50, 0x00000404, 0xffffffff,
671 0x000004c8, 0x00000001, 0xffffffff,
672 0x000064ec, 0x00000000, 0xffffffff,
673 0x00000c7c, 0x00000000, 0xffffffff,
674 0x00008dfc, 0x00000000, 0xffffffff
675 };
676 #define CAYMAN_SYSLS_DEFAULT_LENGTH sizeof(cayman_sysls_default) / (3 * sizeof(u32))
677
678 static const u32 cayman_sysls_disable[] =
679 {
680 /* Register, Value, Mask bits */
681 0x0000d0c0, 0x00000000, 0xffffffff,
682 0x0000d8c0, 0x00000000, 0xffffffff,
683 0x000055e8, 0x00000000, 0xffffffff,
684 0x0000d0bc, 0x00000000, 0xffffffff,
685 0x0000d8bc, 0x00000000, 0xffffffff,
686 0x000015c0, 0x00041401, 0xffffffff,
687 0x0000264c, 0x00040400, 0xffffffff,
688 0x00002648, 0x00040400, 0xffffffff,
689 0x00002650, 0x00040400, 0xffffffff,
690 0x000020b8, 0x00040400, 0xffffffff,
691 0x000020bc, 0x00040400, 0xffffffff,
692 0x000020c0, 0x00040c80, 0xffffffff,
693 0x0000f4a0, 0x000000c0, 0xffffffff,
694 0x0000f4a4, 0x00680000, 0xffffffff,
695 0x00002f50, 0x00000404, 0xffffffff,
696 0x000004c8, 0x00000001, 0xffffffff,
697 0x000064ec, 0x00007ffd, 0xffffffff,
698 0x00000c7c, 0x0000ff00, 0xffffffff,
699 0x00008dfc, 0x0000007f, 0xffffffff
700 };
701 #define CAYMAN_SYSLS_DISABLE_LENGTH sizeof(cayman_sysls_disable) / (3 * sizeof(u32))
702
703 static const u32 cayman_sysls_enable[] =
704 {
705 /* Register, Value, Mask bits */
706 0x000055e8, 0x00000001, 0xffffffff,
707 0x0000d0bc, 0x00000100, 0xffffffff,
708 0x0000d8bc, 0x00000100, 0xffffffff,
709 0x000015c0, 0x000c1401, 0xffffffff,
710 0x0000264c, 0x000c0400, 0xffffffff,
711 0x00002648, 0x000c0400, 0xffffffff,
712 0x00002650, 0x000c0400, 0xffffffff,
713 0x000020b8, 0x000c0400, 0xffffffff,
714 0x000020bc, 0x000c0400, 0xffffffff,
715 0x000020c0, 0x000c0c80, 0xffffffff,
716 0x0000f4a0, 0x000000c0, 0xffffffff,
717 0x0000f4a4, 0x00680fff, 0xffffffff,
718 0x00002f50, 0x00000903, 0xffffffff,
719 0x000004c8, 0x00000000, 0xffffffff,
720 0x000064ec, 0x00000000, 0xffffffff,
721 0x00000c7c, 0x00000000, 0xffffffff,
722 0x00008dfc, 0x00000000, 0xffffffff
723 };
724 #define CAYMAN_SYSLS_ENABLE_LENGTH sizeof(cayman_sysls_enable) / (3 * sizeof(u32))
725
726 struct rv7xx_power_info *rv770_get_pi(struct radeon_device *rdev);
727 struct evergreen_power_info *evergreen_get_pi(struct radeon_device *rdev);
728
729 extern int ni_mc_load_microcode(struct radeon_device *rdev);
730
731 struct ni_power_info *ni_get_pi(struct radeon_device *rdev)
732 {
733 struct ni_power_info *pi = rdev->pm.dpm.priv;
734
735 return pi;
736 }
737
738 struct ni_ps *ni_get_ps(struct radeon_ps *rps)
739 {
740 struct ni_ps *ps = rps->ps_priv;
741
742 return ps;
743 }
744
745 static void ni_calculate_leakage_for_v_and_t_formula(const struct ni_leakage_coeffients *coeff,
746 u16 v, s32 t,
747 u32 ileakage,
748 u32 *leakage)
749 {
750 s64 kt, kv, leakage_w, i_leakage, vddc, temperature;
751
752 i_leakage = div64_s64(drm_int2fixp(ileakage), 1000);
753 vddc = div64_s64(drm_int2fixp(v), 1000);
754 temperature = div64_s64(drm_int2fixp(t), 1000);
755
756 kt = drm_fixp_mul(div64_s64(drm_int2fixp(coeff->at), 1000),
757 drm_fixp_exp(drm_fixp_mul(div64_s64(drm_int2fixp(coeff->bt), 1000), temperature)));
758 kv = drm_fixp_mul(div64_s64(drm_int2fixp(coeff->av), 1000),
759 drm_fixp_exp(drm_fixp_mul(div64_s64(drm_int2fixp(coeff->bv), 1000), vddc)));
760
761 leakage_w = drm_fixp_mul(drm_fixp_mul(drm_fixp_mul(i_leakage, kt), kv), vddc);
762
763 *leakage = drm_fixp2int(leakage_w * 1000);
764 }
765
766 static void ni_calculate_leakage_for_v_and_t(struct radeon_device *rdev,
767 const struct ni_leakage_coeffients *coeff,
768 u16 v,
769 s32 t,
770 u32 i_leakage,
771 u32 *leakage)
772 {
773 ni_calculate_leakage_for_v_and_t_formula(coeff, v, t, i_leakage, leakage);
774 }
775
776 bool ni_dpm_vblank_too_short(struct radeon_device *rdev)
777 {
778 struct rv7xx_power_info *pi = rv770_get_pi(rdev);
779 u32 vblank_time = r600_dpm_get_vblank_time(rdev);
780 /* we never hit the non-gddr5 limit so disable it */
781 u32 switch_limit = pi->mem_gddr5 ? 450 : 0;
782
783 if (vblank_time < switch_limit)
784 return true;
785 else
786 return false;
787
788 }
789
790 static void ni_apply_state_adjust_rules(struct radeon_device *rdev,
791 struct radeon_ps *rps)
792 {
793 struct ni_ps *ps = ni_get_ps(rps);
794 struct radeon_clock_and_voltage_limits *max_limits;
795 bool disable_mclk_switching;
796 u32 mclk;
797 u16 vddci;
798 int i;
799
800 if ((rdev->pm.dpm.new_active_crtc_count > 1) ||
801 ni_dpm_vblank_too_short(rdev))
802 disable_mclk_switching = true;
803 else
804 disable_mclk_switching = false;
805
806 if (rdev->pm.dpm.ac_power)
807 max_limits = &rdev->pm.dpm.dyn_state.max_clock_voltage_on_ac;
808 else
809 max_limits = &rdev->pm.dpm.dyn_state.max_clock_voltage_on_dc;
810
811 if (rdev->pm.dpm.ac_power == false) {
812 for (i = 0; i < ps->performance_level_count; i++) {
813 if (ps->performance_levels[i].mclk > max_limits->mclk)
814 ps->performance_levels[i].mclk = max_limits->mclk;
815 if (ps->performance_levels[i].sclk > max_limits->sclk)
816 ps->performance_levels[i].sclk = max_limits->sclk;
817 if (ps->performance_levels[i].vddc > max_limits->vddc)
818 ps->performance_levels[i].vddc = max_limits->vddc;
819 if (ps->performance_levels[i].vddci > max_limits->vddci)
820 ps->performance_levels[i].vddci = max_limits->vddci;
821 }
822 }
823
824 /* XXX validate the min clocks required for display */
825
826 /* adjust low state */
827 if (disable_mclk_switching) {
828 ps->performance_levels[0].mclk =
829 ps->performance_levels[ps->performance_level_count - 1].mclk;
830 ps->performance_levels[0].vddci =
831 ps->performance_levels[ps->performance_level_count - 1].vddci;
832 }
833
834 btc_skip_blacklist_clocks(rdev, max_limits->sclk, max_limits->mclk,
835 &ps->performance_levels[0].sclk,
836 &ps->performance_levels[0].mclk);
837
838 for (i = 1; i < ps->performance_level_count; i++) {
839 if (ps->performance_levels[i].sclk < ps->performance_levels[i - 1].sclk)
840 ps->performance_levels[i].sclk = ps->performance_levels[i - 1].sclk;
841 if (ps->performance_levels[i].vddc < ps->performance_levels[i - 1].vddc)
842 ps->performance_levels[i].vddc = ps->performance_levels[i - 1].vddc;
843 }
844
845 /* adjust remaining states */
846 if (disable_mclk_switching) {
847 mclk = ps->performance_levels[0].mclk;
848 vddci = ps->performance_levels[0].vddci;
849 for (i = 1; i < ps->performance_level_count; i++) {
850 if (mclk < ps->performance_levels[i].mclk)
851 mclk = ps->performance_levels[i].mclk;
852 if (vddci < ps->performance_levels[i].vddci)
853 vddci = ps->performance_levels[i].vddci;
854 }
855 for (i = 0; i < ps->performance_level_count; i++) {
856 ps->performance_levels[i].mclk = mclk;
857 ps->performance_levels[i].vddci = vddci;
858 }
859 } else {
860 for (i = 1; i < ps->performance_level_count; i++) {
861 if (ps->performance_levels[i].mclk < ps->performance_levels[i - 1].mclk)
862 ps->performance_levels[i].mclk = ps->performance_levels[i - 1].mclk;
863 if (ps->performance_levels[i].vddci < ps->performance_levels[i - 1].vddci)
864 ps->performance_levels[i].vddci = ps->performance_levels[i - 1].vddci;
865 }
866 }
867
868 for (i = 1; i < ps->performance_level_count; i++)
869 btc_skip_blacklist_clocks(rdev, max_limits->sclk, max_limits->mclk,
870 &ps->performance_levels[i].sclk,
871 &ps->performance_levels[i].mclk);
872
873 for (i = 0; i < ps->performance_level_count; i++)
874 btc_adjust_clock_combinations(rdev, max_limits,
875 &ps->performance_levels[i]);
876
877 for (i = 0; i < ps->performance_level_count; i++) {
878 btc_apply_voltage_dependency_rules(&rdev->pm.dpm.dyn_state.vddc_dependency_on_sclk,
879 ps->performance_levels[i].sclk,
880 max_limits->vddc, &ps->performance_levels[i].vddc);
881 btc_apply_voltage_dependency_rules(&rdev->pm.dpm.dyn_state.vddci_dependency_on_mclk,
882 ps->performance_levels[i].mclk,
883 max_limits->vddci, &ps->performance_levels[i].vddci);
884 btc_apply_voltage_dependency_rules(&rdev->pm.dpm.dyn_state.vddc_dependency_on_mclk,
885 ps->performance_levels[i].mclk,
886 max_limits->vddc, &ps->performance_levels[i].vddc);
887 btc_apply_voltage_dependency_rules(&rdev->pm.dpm.dyn_state.vddc_dependency_on_dispclk,
888 rdev->clock.current_dispclk,
889 max_limits->vddc, &ps->performance_levels[i].vddc);
890 }
891
892 for (i = 0; i < ps->performance_level_count; i++) {
893 btc_apply_voltage_delta_rules(rdev,
894 max_limits->vddc, max_limits->vddci,
895 &ps->performance_levels[i].vddc,
896 &ps->performance_levels[i].vddci);
897 }
898
899 ps->dc_compatible = true;
900 for (i = 0; i < ps->performance_level_count; i++) {
901 if (ps->performance_levels[i].vddc > rdev->pm.dpm.dyn_state.max_clock_voltage_on_dc.vddc)
902 ps->dc_compatible = false;
903
904 if (ps->performance_levels[i].vddc < rdev->pm.dpm.dyn_state.min_vddc_for_pcie_gen2)
905 ps->performance_levels[i].flags &= ~ATOM_PPLIB_R600_FLAGS_PCIEGEN2;
906 }
907 }
908
909 static void ni_cg_clockgating_default(struct radeon_device *rdev)
910 {
911 u32 count;
912 const u32 *ps = NULL;
913
914 ps = (const u32 *)&cayman_cgcg_cgls_default;
915 count = CAYMAN_CGCG_CGLS_DEFAULT_LENGTH;
916
917 btc_program_mgcg_hw_sequence(rdev, ps, count);
918 }
919
920 static void ni_gfx_clockgating_enable(struct radeon_device *rdev,
921 bool enable)
922 {
923 u32 count;
924 const u32 *ps = NULL;
925
926 if (enable) {
927 ps = (const u32 *)&cayman_cgcg_cgls_enable;
928 count = CAYMAN_CGCG_CGLS_ENABLE_LENGTH;
929 } else {
930 ps = (const u32 *)&cayman_cgcg_cgls_disable;
931 count = CAYMAN_CGCG_CGLS_DISABLE_LENGTH;
932 }
933
934 btc_program_mgcg_hw_sequence(rdev, ps, count);
935 }
936
937 static void ni_mg_clockgating_default(struct radeon_device *rdev)
938 {
939 u32 count;
940 const u32 *ps = NULL;
941
942 ps = (const u32 *)&cayman_mgcg_default;
943 count = CAYMAN_MGCG_DEFAULT_LENGTH;
944
945 btc_program_mgcg_hw_sequence(rdev, ps, count);
946 }
947
948 static void ni_mg_clockgating_enable(struct radeon_device *rdev,
949 bool enable)
950 {
951 u32 count;
952 const u32 *ps = NULL;
953
954 if (enable) {
955 ps = (const u32 *)&cayman_mgcg_enable;
956 count = CAYMAN_MGCG_ENABLE_LENGTH;
957 } else {
958 ps = (const u32 *)&cayman_mgcg_disable;
959 count = CAYMAN_MGCG_DISABLE_LENGTH;
960 }
961
962 btc_program_mgcg_hw_sequence(rdev, ps, count);
963 }
964
965 static void ni_ls_clockgating_default(struct radeon_device *rdev)
966 {
967 u32 count;
968 const u32 *ps = NULL;
969
970 ps = (const u32 *)&cayman_sysls_default;
971 count = CAYMAN_SYSLS_DEFAULT_LENGTH;
972
973 btc_program_mgcg_hw_sequence(rdev, ps, count);
974 }
975
976 static void ni_ls_clockgating_enable(struct radeon_device *rdev,
977 bool enable)
978 {
979 u32 count;
980 const u32 *ps = NULL;
981
982 if (enable) {
983 ps = (const u32 *)&cayman_sysls_enable;
984 count = CAYMAN_SYSLS_ENABLE_LENGTH;
985 } else {
986 ps = (const u32 *)&cayman_sysls_disable;
987 count = CAYMAN_SYSLS_DISABLE_LENGTH;
988 }
989
990 btc_program_mgcg_hw_sequence(rdev, ps, count);
991
992 }
993
994 static int ni_patch_single_dependency_table_based_on_leakage(struct radeon_device *rdev,
995 struct radeon_clock_voltage_dependency_table *table)
996 {
997 struct rv7xx_power_info *pi = rv770_get_pi(rdev);
998 u32 i;
999
1000 if (table) {
1001 for (i = 0; i < table->count; i++) {
1002 if (0xff01 == table->entries[i].v) {
1003 if (pi->max_vddc == 0)
1004 return -EINVAL;
1005 table->entries[i].v = pi->max_vddc;
1006 }
1007 }
1008 }
1009 return 0;
1010 }
1011
1012 static int ni_patch_dependency_tables_based_on_leakage(struct radeon_device *rdev)
1013 {
1014 int ret = 0;
1015
1016 ret = ni_patch_single_dependency_table_based_on_leakage(rdev,
1017 &rdev->pm.dpm.dyn_state.vddc_dependency_on_sclk);
1018
1019 ret = ni_patch_single_dependency_table_based_on_leakage(rdev,
1020 &rdev->pm.dpm.dyn_state.vddc_dependency_on_mclk);
1021 return ret;
1022 }
1023
1024 static void ni_stop_dpm(struct radeon_device *rdev)
1025 {
1026 WREG32_P(GENERAL_PWRMGT, 0, ~GLOBAL_PWRMGT_EN);
1027 }
1028
1029 #if 0
1030 static int ni_notify_hw_of_power_source(struct radeon_device *rdev,
1031 bool ac_power)
1032 {
1033 if (ac_power)
1034 return (rv770_send_msg_to_smc(rdev, PPSMC_MSG_RunningOnAC) == PPSMC_Result_OK) ?
1035 0 : -EINVAL;
1036
1037 return 0;
1038 }
1039 #endif
1040
1041 static PPSMC_Result ni_send_msg_to_smc_with_parameter(struct radeon_device *rdev,
1042 PPSMC_Msg msg, u32 parameter)
1043 {
1044 WREG32(SMC_SCRATCH0, parameter);
1045 return rv770_send_msg_to_smc(rdev, msg);
1046 }
1047
1048 static int ni_restrict_performance_levels_before_switch(struct radeon_device *rdev)
1049 {
1050 if (rv770_send_msg_to_smc(rdev, PPSMC_MSG_NoForcedLevel) != PPSMC_Result_OK)
1051 return -EINVAL;
1052
1053 return (ni_send_msg_to_smc_with_parameter(rdev, PPSMC_MSG_SetEnabledLevels, 1) == PPSMC_Result_OK) ?
1054 0 : -EINVAL;
1055 }
1056
1057 int ni_dpm_force_performance_level(struct radeon_device *rdev,
1058 enum radeon_dpm_forced_level level)
1059 {
1060 if (level == RADEON_DPM_FORCED_LEVEL_HIGH) {
1061 if (ni_send_msg_to_smc_with_parameter(rdev, PPSMC_MSG_SetEnabledLevels, 0) != PPSMC_Result_OK)
1062 return -EINVAL;
1063
1064 if (ni_send_msg_to_smc_with_parameter(rdev, PPSMC_MSG_SetForcedLevels, 1) != PPSMC_Result_OK)
1065 return -EINVAL;
1066 } else if (level == RADEON_DPM_FORCED_LEVEL_LOW) {
1067 if (ni_send_msg_to_smc_with_parameter(rdev, PPSMC_MSG_SetForcedLevels, 0) != PPSMC_Result_OK)
1068 return -EINVAL;
1069
1070 if (ni_send_msg_to_smc_with_parameter(rdev, PPSMC_MSG_SetEnabledLevels, 1) != PPSMC_Result_OK)
1071 return -EINVAL;
1072 } else if (level == RADEON_DPM_FORCED_LEVEL_AUTO) {
1073 if (ni_send_msg_to_smc_with_parameter(rdev, PPSMC_MSG_SetForcedLevels, 0) != PPSMC_Result_OK)
1074 return -EINVAL;
1075
1076 if (ni_send_msg_to_smc_with_parameter(rdev, PPSMC_MSG_SetEnabledLevels, 0) != PPSMC_Result_OK)
1077 return -EINVAL;
1078 }
1079
1080 rdev->pm.dpm.forced_level = level;
1081
1082 return 0;
1083 }
1084
1085 static void ni_stop_smc(struct radeon_device *rdev)
1086 {
1087 u32 tmp;
1088 int i;
1089
1090 for (i = 0; i < rdev->usec_timeout; i++) {
1091 tmp = RREG32(LB_SYNC_RESET_SEL) & LB_SYNC_RESET_SEL_MASK;
1092 if (tmp != 1)
1093 break;
1094 udelay(1);
1095 }
1096
1097 udelay(100);
1098
1099 r7xx_stop_smc(rdev);
1100 }
1101
1102 static int ni_process_firmware_header(struct radeon_device *rdev)
1103 {
1104 struct rv7xx_power_info *pi = rv770_get_pi(rdev);
1105 struct evergreen_power_info *eg_pi = evergreen_get_pi(rdev);
1106 struct ni_power_info *ni_pi = ni_get_pi(rdev);
1107 u32 tmp;
1108 int ret;
1109
1110 ret = rv770_read_smc_sram_dword(rdev,
1111 NISLANDS_SMC_FIRMWARE_HEADER_LOCATION +
1112 NISLANDS_SMC_FIRMWARE_HEADER_stateTable,
1113 &tmp, pi->sram_end);
1114
1115 if (ret)
1116 return ret;
1117
1118 pi->state_table_start = (u16)tmp;
1119
1120 ret = rv770_read_smc_sram_dword(rdev,
1121 NISLANDS_SMC_FIRMWARE_HEADER_LOCATION +
1122 NISLANDS_SMC_FIRMWARE_HEADER_softRegisters,
1123 &tmp, pi->sram_end);
1124
1125 if (ret)
1126 return ret;
1127
1128 pi->soft_regs_start = (u16)tmp;
1129
1130 ret = rv770_read_smc_sram_dword(rdev,
1131 NISLANDS_SMC_FIRMWARE_HEADER_LOCATION +
1132 NISLANDS_SMC_FIRMWARE_HEADER_mcRegisterTable,
1133 &tmp, pi->sram_end);
1134
1135 if (ret)
1136 return ret;
1137
1138 eg_pi->mc_reg_table_start = (u16)tmp;
1139
1140 ret = rv770_read_smc_sram_dword(rdev,
1141 NISLANDS_SMC_FIRMWARE_HEADER_LOCATION +
1142 NISLANDS_SMC_FIRMWARE_HEADER_fanTable,
1143 &tmp, pi->sram_end);
1144
1145 if (ret)
1146 return ret;
1147
1148 ni_pi->fan_table_start = (u16)tmp;
1149
1150 ret = rv770_read_smc_sram_dword(rdev,
1151 NISLANDS_SMC_FIRMWARE_HEADER_LOCATION +
1152 NISLANDS_SMC_FIRMWARE_HEADER_mcArbDramAutoRefreshTable,
1153 &tmp, pi->sram_end);
1154
1155 if (ret)
1156 return ret;
1157
1158 ni_pi->arb_table_start = (u16)tmp;
1159
1160 ret = rv770_read_smc_sram_dword(rdev,
1161 NISLANDS_SMC_FIRMWARE_HEADER_LOCATION +
1162 NISLANDS_SMC_FIRMWARE_HEADER_cacTable,
1163 &tmp, pi->sram_end);
1164
1165 if (ret)
1166 return ret;
1167
1168 ni_pi->cac_table_start = (u16)tmp;
1169
1170 ret = rv770_read_smc_sram_dword(rdev,
1171 NISLANDS_SMC_FIRMWARE_HEADER_LOCATION +
1172 NISLANDS_SMC_FIRMWARE_HEADER_spllTable,
1173 &tmp, pi->sram_end);
1174
1175 if (ret)
1176 return ret;
1177
1178 ni_pi->spll_table_start = (u16)tmp;
1179
1180
1181 return ret;
1182 }
1183
1184 static void ni_read_clock_registers(struct radeon_device *rdev)
1185 {
1186 struct ni_power_info *ni_pi = ni_get_pi(rdev);
1187
1188 ni_pi->clock_registers.cg_spll_func_cntl = RREG32(CG_SPLL_FUNC_CNTL);
1189 ni_pi->clock_registers.cg_spll_func_cntl_2 = RREG32(CG_SPLL_FUNC_CNTL_2);
1190 ni_pi->clock_registers.cg_spll_func_cntl_3 = RREG32(CG_SPLL_FUNC_CNTL_3);
1191 ni_pi->clock_registers.cg_spll_func_cntl_4 = RREG32(CG_SPLL_FUNC_CNTL_4);
1192 ni_pi->clock_registers.cg_spll_spread_spectrum = RREG32(CG_SPLL_SPREAD_SPECTRUM);
1193 ni_pi->clock_registers.cg_spll_spread_spectrum_2 = RREG32(CG_SPLL_SPREAD_SPECTRUM_2);
1194 ni_pi->clock_registers.mpll_ad_func_cntl = RREG32(MPLL_AD_FUNC_CNTL);
1195 ni_pi->clock_registers.mpll_ad_func_cntl_2 = RREG32(MPLL_AD_FUNC_CNTL_2);
1196 ni_pi->clock_registers.mpll_dq_func_cntl = RREG32(MPLL_DQ_FUNC_CNTL);
1197 ni_pi->clock_registers.mpll_dq_func_cntl_2 = RREG32(MPLL_DQ_FUNC_CNTL_2);
1198 ni_pi->clock_registers.mclk_pwrmgt_cntl = RREG32(MCLK_PWRMGT_CNTL);
1199 ni_pi->clock_registers.dll_cntl = RREG32(DLL_CNTL);
1200 ni_pi->clock_registers.mpll_ss1 = RREG32(MPLL_SS1);
1201 ni_pi->clock_registers.mpll_ss2 = RREG32(MPLL_SS2);
1202 }
1203
1204 #if 0
1205 static int ni_enter_ulp_state(struct radeon_device *rdev)
1206 {
1207 struct rv7xx_power_info *pi = rv770_get_pi(rdev);
1208
1209 if (pi->gfx_clock_gating) {
1210 WREG32_P(SCLK_PWRMGT_CNTL, 0, ~DYN_GFX_CLK_OFF_EN);
1211 WREG32_P(SCLK_PWRMGT_CNTL, GFX_CLK_FORCE_ON, ~GFX_CLK_FORCE_ON);
1212 WREG32_P(SCLK_PWRMGT_CNTL, 0, ~GFX_CLK_FORCE_ON);
1213 RREG32(GB_ADDR_CONFIG);
1214 }
1215
1216 WREG32_P(SMC_MSG, HOST_SMC_MSG(PPSMC_MSG_SwitchToMinimumPower),
1217 ~HOST_SMC_MSG_MASK);
1218
1219 udelay(25000);
1220
1221 return 0;
1222 }
1223 #endif
1224
1225 static void ni_program_response_times(struct radeon_device *rdev)
1226 {
1227 u32 voltage_response_time, backbias_response_time, acpi_delay_time, vbi_time_out;
1228 u32 vddc_dly, bb_dly, acpi_dly, vbi_dly, mclk_switch_limit;
1229 u32 reference_clock;
1230
1231 rv770_write_smc_soft_register(rdev, NI_SMC_SOFT_REGISTER_mvdd_chg_time, 1);
1232
1233 voltage_response_time = (u32)rdev->pm.dpm.voltage_response_time;
1234 backbias_response_time = (u32)rdev->pm.dpm.backbias_response_time;
1235
1236 if (voltage_response_time == 0)
1237 voltage_response_time = 1000;
1238
1239 if (backbias_response_time == 0)
1240 backbias_response_time = 1000;
1241
1242 acpi_delay_time = 15000;
1243 vbi_time_out = 100000;
1244
1245 reference_clock = radeon_get_xclk(rdev);
1246
1247 vddc_dly = (voltage_response_time * reference_clock) / 1600;
1248 bb_dly = (backbias_response_time * reference_clock) / 1600;
1249 acpi_dly = (acpi_delay_time * reference_clock) / 1600;
1250 vbi_dly = (vbi_time_out * reference_clock) / 1600;
1251
1252 mclk_switch_limit = (460 * reference_clock) / 100;
1253
1254 rv770_write_smc_soft_register(rdev, NI_SMC_SOFT_REGISTER_delay_vreg, vddc_dly);
1255 rv770_write_smc_soft_register(rdev, NI_SMC_SOFT_REGISTER_delay_bbias, bb_dly);
1256 rv770_write_smc_soft_register(rdev, NI_SMC_SOFT_REGISTER_delay_acpi, acpi_dly);
1257 rv770_write_smc_soft_register(rdev, NI_SMC_SOFT_REGISTER_mclk_chg_timeout, vbi_dly);
1258 rv770_write_smc_soft_register(rdev, NI_SMC_SOFT_REGISTER_mc_block_delay, 0xAA);
1259 rv770_write_smc_soft_register(rdev, NI_SMC_SOFT_REGISTER_mclk_switch_lim, mclk_switch_limit);
1260 }
1261
1262 static void ni_populate_smc_voltage_table(struct radeon_device *rdev,
1263 struct atom_voltage_table *voltage_table,
1264 NISLANDS_SMC_STATETABLE *table)
1265 {
1266 unsigned int i;
1267
1268 for (i = 0; i < voltage_table->count; i++) {
1269 table->highSMIO[i] = 0;
1270 table->lowSMIO[i] |= cpu_to_be32(voltage_table->entries[i].smio_low);
1271 }
1272 }
1273
1274 static void ni_populate_smc_voltage_tables(struct radeon_device *rdev,
1275 NISLANDS_SMC_STATETABLE *table)
1276 {
1277 struct rv7xx_power_info *pi = rv770_get_pi(rdev);
1278 struct evergreen_power_info *eg_pi = evergreen_get_pi(rdev);
1279 unsigned char i;
1280
1281 if (eg_pi->vddc_voltage_table.count) {
1282 ni_populate_smc_voltage_table(rdev, &eg_pi->vddc_voltage_table, table);
1283 table->voltageMaskTable.highMask[NISLANDS_SMC_VOLTAGEMASK_VDDC] = 0;
1284 table->voltageMaskTable.lowMask[NISLANDS_SMC_VOLTAGEMASK_VDDC] =
1285 cpu_to_be32(eg_pi->vddc_voltage_table.mask_low);
1286
1287 for (i = 0; i < eg_pi->vddc_voltage_table.count; i++) {
1288 if (pi->max_vddc_in_table <= eg_pi->vddc_voltage_table.entries[i].value) {
1289 table->maxVDDCIndexInPPTable = i;
1290 break;
1291 }
1292 }
1293 }
1294
1295 if (eg_pi->vddci_voltage_table.count) {
1296 ni_populate_smc_voltage_table(rdev, &eg_pi->vddci_voltage_table, table);
1297
1298 table->voltageMaskTable.highMask[NISLANDS_SMC_VOLTAGEMASK_VDDCI] = 0;
1299 table->voltageMaskTable.lowMask[NISLANDS_SMC_VOLTAGEMASK_VDDCI] =
1300 cpu_to_be32(eg_pi->vddci_voltage_table.mask_low);
1301 }
1302 }
1303
1304 static int ni_populate_voltage_value(struct radeon_device *rdev,
1305 struct atom_voltage_table *table,
1306 u16 value,
1307 NISLANDS_SMC_VOLTAGE_VALUE *voltage)
1308 {
1309 unsigned int i;
1310
1311 for (i = 0; i < table->count; i++) {
1312 if (value <= table->entries[i].value) {
1313 voltage->index = (u8)i;
1314 voltage->value = cpu_to_be16(table->entries[i].value);
1315 break;
1316 }
1317 }
1318
1319 if (i >= table->count)
1320 return -EINVAL;
1321
1322 return 0;
1323 }
1324
1325 static void ni_populate_mvdd_value(struct radeon_device *rdev,
1326 u32 mclk,
1327 NISLANDS_SMC_VOLTAGE_VALUE *voltage)
1328 {
1329 struct rv7xx_power_info *pi = rv770_get_pi(rdev);
1330 struct evergreen_power_info *eg_pi = evergreen_get_pi(rdev);
1331
1332 if (!pi->mvdd_control) {
1333 voltage->index = eg_pi->mvdd_high_index;
1334 voltage->value = cpu_to_be16(MVDD_HIGH_VALUE);
1335 return;
1336 }
1337
1338 if (mclk <= pi->mvdd_split_frequency) {
1339 voltage->index = eg_pi->mvdd_low_index;
1340 voltage->value = cpu_to_be16(MVDD_LOW_VALUE);
1341 } else {
1342 voltage->index = eg_pi->mvdd_high_index;
1343 voltage->value = cpu_to_be16(MVDD_HIGH_VALUE);
1344 }
1345 }
1346
1347 static int ni_get_std_voltage_value(struct radeon_device *rdev,
1348 NISLANDS_SMC_VOLTAGE_VALUE *voltage,
1349 u16 *std_voltage)
1350 {
1351 if (rdev->pm.dpm.dyn_state.cac_leakage_table.entries &&
1352 ((u32)voltage->index < rdev->pm.dpm.dyn_state.cac_leakage_table.count))
1353 *std_voltage = rdev->pm.dpm.dyn_state.cac_leakage_table.entries[voltage->index].vddc;
1354 else
1355 *std_voltage = be16_to_cpu(voltage->value);
1356
1357 return 0;
1358 }
1359
1360 static void ni_populate_std_voltage_value(struct radeon_device *rdev,
1361 u16 value, u8 index,
1362 NISLANDS_SMC_VOLTAGE_VALUE *voltage)
1363 {
1364 voltage->index = index;
1365 voltage->value = cpu_to_be16(value);
1366 }
1367
1368 static u32 ni_get_smc_power_scaling_factor(struct radeon_device *rdev)
1369 {
1370 u32 xclk_period;
1371 u32 xclk = radeon_get_xclk(rdev);
1372 u32 tmp = RREG32(CG_CAC_CTRL) & TID_CNT_MASK;
1373
1374 xclk_period = (1000000000UL / xclk);
1375 xclk_period /= 10000UL;
1376
1377 return tmp * xclk_period;
1378 }
1379
1380 static u32 ni_scale_power_for_smc(u32 power_in_watts, u32 scaling_factor)
1381 {
1382 return (power_in_watts * scaling_factor) << 2;
1383 }
1384
1385 static u32 ni_calculate_power_boost_limit(struct radeon_device *rdev,
1386 struct radeon_ps *radeon_state,
1387 u32 near_tdp_limit)
1388 {
1389 struct ni_ps *state = ni_get_ps(radeon_state);
1390 struct evergreen_power_info *eg_pi = evergreen_get_pi(rdev);
1391 struct ni_power_info *ni_pi = ni_get_pi(rdev);
1392 u32 power_boost_limit = 0;
1393 int ret;
1394
1395 if (ni_pi->enable_power_containment &&
1396 ni_pi->use_power_boost_limit) {
1397 NISLANDS_SMC_VOLTAGE_VALUE vddc;
1398 u16 std_vddc_med;
1399 u16 std_vddc_high;
1400 u64 tmp, n, d;
1401
1402 if (state->performance_level_count < 3)
1403 return 0;
1404
1405 ret = ni_populate_voltage_value(rdev, &eg_pi->vddc_voltage_table,
1406 state->performance_levels[state->performance_level_count - 2].vddc,
1407 &vddc);
1408 if (ret)
1409 return 0;
1410
1411 ret = ni_get_std_voltage_value(rdev, &vddc, &std_vddc_med);
1412 if (ret)
1413 return 0;
1414
1415 ret = ni_populate_voltage_value(rdev, &eg_pi->vddc_voltage_table,
1416 state->performance_levels[state->performance_level_count - 1].vddc,
1417 &vddc);
1418 if (ret)
1419 return 0;
1420
1421 ret = ni_get_std_voltage_value(rdev, &vddc, &std_vddc_high);
1422 if (ret)
1423 return 0;
1424
1425 n = ((u64)near_tdp_limit * ((u64)std_vddc_med * (u64)std_vddc_med) * 90);
1426 d = ((u64)std_vddc_high * (u64)std_vddc_high * 100);
1427 tmp = div64_u64(n, d);
1428
1429 if (tmp >> 32)
1430 return 0;
1431 power_boost_limit = (u32)tmp;
1432 }
1433
1434 return power_boost_limit;
1435 }
1436
1437 static int ni_calculate_adjusted_tdp_limits(struct radeon_device *rdev,
1438 bool adjust_polarity,
1439 u32 tdp_adjustment,
1440 u32 *tdp_limit,
1441 u32 *near_tdp_limit)
1442 {
1443 if (tdp_adjustment > (u32)rdev->pm.dpm.tdp_od_limit)
1444 return -EINVAL;
1445
1446 if (adjust_polarity) {
1447 *tdp_limit = ((100 + tdp_adjustment) * rdev->pm.dpm.tdp_limit) / 100;
1448 *near_tdp_limit = rdev->pm.dpm.near_tdp_limit + (*tdp_limit - rdev->pm.dpm.tdp_limit);
1449 } else {
1450 *tdp_limit = ((100 - tdp_adjustment) * rdev->pm.dpm.tdp_limit) / 100;
1451 *near_tdp_limit = rdev->pm.dpm.near_tdp_limit - (rdev->pm.dpm.tdp_limit - *tdp_limit);
1452 }
1453
1454 return 0;
1455 }
1456
1457 static int ni_populate_smc_tdp_limits(struct radeon_device *rdev,
1458 struct radeon_ps *radeon_state)
1459 {
1460 struct rv7xx_power_info *pi = rv770_get_pi(rdev);
1461 struct ni_power_info *ni_pi = ni_get_pi(rdev);
1462
1463 if (ni_pi->enable_power_containment) {
1464 NISLANDS_SMC_STATETABLE *smc_table = &ni_pi->smc_statetable;
1465 u32 scaling_factor = ni_get_smc_power_scaling_factor(rdev);
1466 u32 tdp_limit;
1467 u32 near_tdp_limit;
1468 u32 power_boost_limit;
1469 int ret;
1470
1471 if (scaling_factor == 0)
1472 return -EINVAL;
1473
1474 memset(smc_table, 0, sizeof(NISLANDS_SMC_STATETABLE));
1475
1476 ret = ni_calculate_adjusted_tdp_limits(rdev,
1477 false, /* ??? */
1478 rdev->pm.dpm.tdp_adjustment,
1479 &tdp_limit,
1480 &near_tdp_limit);
1481 if (ret)
1482 return ret;
1483
1484 power_boost_limit = ni_calculate_power_boost_limit(rdev, radeon_state,
1485 near_tdp_limit);
1486
1487 smc_table->dpm2Params.TDPLimit =
1488 cpu_to_be32(ni_scale_power_for_smc(tdp_limit, scaling_factor));
1489 smc_table->dpm2Params.NearTDPLimit =
1490 cpu_to_be32(ni_scale_power_for_smc(near_tdp_limit, scaling_factor));
1491 smc_table->dpm2Params.SafePowerLimit =
1492 cpu_to_be32(ni_scale_power_for_smc((near_tdp_limit * NISLANDS_DPM2_TDP_SAFE_LIMIT_PERCENT) / 100,
1493 scaling_factor));
1494 smc_table->dpm2Params.PowerBoostLimit =
1495 cpu_to_be32(ni_scale_power_for_smc(power_boost_limit, scaling_factor));
1496
1497 ret = rv770_copy_bytes_to_smc(rdev,
1498 (u16)(pi->state_table_start + offsetof(NISLANDS_SMC_STATETABLE, dpm2Params) +
1499 offsetof(PP_NIslands_DPM2Parameters, TDPLimit)),
1500 (u8 *)(&smc_table->dpm2Params.TDPLimit),
1501 sizeof(u32) * 4, pi->sram_end);
1502 if (ret)
1503 return ret;
1504 }
1505
1506 return 0;
1507 }
1508
1509 int ni_copy_and_switch_arb_sets(struct radeon_device *rdev,
1510 u32 arb_freq_src, u32 arb_freq_dest)
1511 {
1512 u32 mc_arb_dram_timing;
1513 u32 mc_arb_dram_timing2;
1514 u32 burst_time;
1515 u32 mc_cg_config;
1516
1517 switch (arb_freq_src) {
1518 case MC_CG_ARB_FREQ_F0:
1519 mc_arb_dram_timing = RREG32(MC_ARB_DRAM_TIMING);
1520 mc_arb_dram_timing2 = RREG32(MC_ARB_DRAM_TIMING2);
1521 burst_time = (RREG32(MC_ARB_BURST_TIME) & STATE0_MASK) >> STATE0_SHIFT;
1522 break;
1523 case MC_CG_ARB_FREQ_F1:
1524 mc_arb_dram_timing = RREG32(MC_ARB_DRAM_TIMING_1);
1525 mc_arb_dram_timing2 = RREG32(MC_ARB_DRAM_TIMING2_1);
1526 burst_time = (RREG32(MC_ARB_BURST_TIME) & STATE1_MASK) >> STATE1_SHIFT;
1527 break;
1528 case MC_CG_ARB_FREQ_F2:
1529 mc_arb_dram_timing = RREG32(MC_ARB_DRAM_TIMING_2);
1530 mc_arb_dram_timing2 = RREG32(MC_ARB_DRAM_TIMING2_2);
1531 burst_time = (RREG32(MC_ARB_BURST_TIME) & STATE2_MASK) >> STATE2_SHIFT;
1532 break;
1533 case MC_CG_ARB_FREQ_F3:
1534 mc_arb_dram_timing = RREG32(MC_ARB_DRAM_TIMING_3);
1535 mc_arb_dram_timing2 = RREG32(MC_ARB_DRAM_TIMING2_3);
1536 burst_time = (RREG32(MC_ARB_BURST_TIME) & STATE3_MASK) >> STATE3_SHIFT;
1537 break;
1538 default:
1539 return -EINVAL;
1540 }
1541
1542 switch (arb_freq_dest) {
1543 case MC_CG_ARB_FREQ_F0:
1544 WREG32(MC_ARB_DRAM_TIMING, mc_arb_dram_timing);
1545 WREG32(MC_ARB_DRAM_TIMING2, mc_arb_dram_timing2);
1546 WREG32_P(MC_ARB_BURST_TIME, STATE0(burst_time), ~STATE0_MASK);
1547 break;
1548 case MC_CG_ARB_FREQ_F1:
1549 WREG32(MC_ARB_DRAM_TIMING_1, mc_arb_dram_timing);
1550 WREG32(MC_ARB_DRAM_TIMING2_1, mc_arb_dram_timing2);
1551 WREG32_P(MC_ARB_BURST_TIME, STATE1(burst_time), ~STATE1_MASK);
1552 break;
1553 case MC_CG_ARB_FREQ_F2:
1554 WREG32(MC_ARB_DRAM_TIMING_2, mc_arb_dram_timing);
1555 WREG32(MC_ARB_DRAM_TIMING2_2, mc_arb_dram_timing2);
1556 WREG32_P(MC_ARB_BURST_TIME, STATE2(burst_time), ~STATE2_MASK);
1557 break;
1558 case MC_CG_ARB_FREQ_F3:
1559 WREG32(MC_ARB_DRAM_TIMING_3, mc_arb_dram_timing);
1560 WREG32(MC_ARB_DRAM_TIMING2_3, mc_arb_dram_timing2);
1561 WREG32_P(MC_ARB_BURST_TIME, STATE3(burst_time), ~STATE3_MASK);
1562 break;
1563 default:
1564 return -EINVAL;
1565 }
1566
1567 mc_cg_config = RREG32(MC_CG_CONFIG) | 0x0000000F;
1568 WREG32(MC_CG_CONFIG, mc_cg_config);
1569 WREG32_P(MC_ARB_CG, CG_ARB_REQ(arb_freq_dest), ~CG_ARB_REQ_MASK);
1570
1571 return 0;
1572 }
1573
1574 static int ni_init_arb_table_index(struct radeon_device *rdev)
1575 {
1576 struct rv7xx_power_info *pi = rv770_get_pi(rdev);
1577 struct ni_power_info *ni_pi = ni_get_pi(rdev);
1578 u32 tmp;
1579 int ret;
1580
1581 ret = rv770_read_smc_sram_dword(rdev, ni_pi->arb_table_start,
1582 &tmp, pi->sram_end);
1583 if (ret)
1584 return ret;
1585
1586 tmp &= 0x00FFFFFF;
1587 tmp |= ((u32)MC_CG_ARB_FREQ_F1) << 24;
1588
1589 return rv770_write_smc_sram_dword(rdev, ni_pi->arb_table_start,
1590 tmp, pi->sram_end);
1591 }
1592
1593 static int ni_initial_switch_from_arb_f0_to_f1(struct radeon_device *rdev)
1594 {
1595 return ni_copy_and_switch_arb_sets(rdev, MC_CG_ARB_FREQ_F0, MC_CG_ARB_FREQ_F1);
1596 }
1597
1598 static int ni_force_switch_to_arb_f0(struct radeon_device *rdev)
1599 {
1600 struct rv7xx_power_info *pi = rv770_get_pi(rdev);
1601 struct ni_power_info *ni_pi = ni_get_pi(rdev);
1602 u32 tmp;
1603 int ret;
1604
1605 ret = rv770_read_smc_sram_dword(rdev, ni_pi->arb_table_start,
1606 &tmp, pi->sram_end);
1607 if (ret)
1608 return ret;
1609
1610 tmp = (tmp >> 24) & 0xff;
1611
1612 if (tmp == MC_CG_ARB_FREQ_F0)
1613 return 0;
1614
1615 return ni_copy_and_switch_arb_sets(rdev, tmp, MC_CG_ARB_FREQ_F0);
1616 }
1617
1618 static int ni_populate_memory_timing_parameters(struct radeon_device *rdev,
1619 struct rv7xx_pl *pl,
1620 SMC_NIslands_MCArbDramTimingRegisterSet *arb_regs)
1621 {
1622 u32 dram_timing;
1623 u32 dram_timing2;
1624
1625 arb_regs->mc_arb_rfsh_rate =
1626 (u8)rv770_calculate_memory_refresh_rate(rdev, pl->sclk);
1627
1628
1629 radeon_atom_set_engine_dram_timings(rdev,
1630 pl->sclk,
1631 pl->mclk);
1632
1633 dram_timing = RREG32(MC_ARB_DRAM_TIMING);
1634 dram_timing2 = RREG32(MC_ARB_DRAM_TIMING2);
1635
1636 arb_regs->mc_arb_dram_timing = cpu_to_be32(dram_timing);
1637 arb_regs->mc_arb_dram_timing2 = cpu_to_be32(dram_timing2);
1638
1639 return 0;
1640 }
1641
1642 static int ni_do_program_memory_timing_parameters(struct radeon_device *rdev,
1643 struct radeon_ps *radeon_state,
1644 unsigned int first_arb_set)
1645 {
1646 struct rv7xx_power_info *pi = rv770_get_pi(rdev);
1647 struct ni_power_info *ni_pi = ni_get_pi(rdev);
1648 struct ni_ps *state = ni_get_ps(radeon_state);
1649 SMC_NIslands_MCArbDramTimingRegisterSet arb_regs = { 0 };
1650 int i, ret = 0;
1651
1652 for (i = 0; i < state->performance_level_count; i++) {
1653 ret = ni_populate_memory_timing_parameters(rdev, &state->performance_levels[i], &arb_regs);
1654 if (ret)
1655 break;
1656
1657 ret = rv770_copy_bytes_to_smc(rdev,
1658 (u16)(ni_pi->arb_table_start +
1659 offsetof(SMC_NIslands_MCArbDramTimingRegisters, data) +
1660 sizeof(SMC_NIslands_MCArbDramTimingRegisterSet) * (first_arb_set + i)),
1661 (u8 *)&arb_regs,
1662 (u16)sizeof(SMC_NIslands_MCArbDramTimingRegisterSet),
1663 pi->sram_end);
1664 if (ret)
1665 break;
1666 }
1667 return ret;
1668 }
1669
1670 static int ni_program_memory_timing_parameters(struct radeon_device *rdev,
1671 struct radeon_ps *radeon_new_state)
1672 {
1673 return ni_do_program_memory_timing_parameters(rdev, radeon_new_state,
1674 NISLANDS_DRIVER_STATE_ARB_INDEX);
1675 }
1676
1677 static void ni_populate_initial_mvdd_value(struct radeon_device *rdev,
1678 struct NISLANDS_SMC_VOLTAGE_VALUE *voltage)
1679 {
1680 struct evergreen_power_info *eg_pi = evergreen_get_pi(rdev);
1681
1682 voltage->index = eg_pi->mvdd_high_index;
1683 voltage->value = cpu_to_be16(MVDD_HIGH_VALUE);
1684 }
1685
1686 static int ni_populate_smc_initial_state(struct radeon_device *rdev,
1687 struct radeon_ps *radeon_initial_state,
1688 NISLANDS_SMC_STATETABLE *table)
1689 {
1690 struct ni_ps *initial_state = ni_get_ps(radeon_initial_state);
1691 struct rv7xx_power_info *pi = rv770_get_pi(rdev);
1692 struct evergreen_power_info *eg_pi = evergreen_get_pi(rdev);
1693 struct ni_power_info *ni_pi = ni_get_pi(rdev);
1694 u32 reg;
1695 int ret;
1696
1697 table->initialState.levels[0].mclk.vMPLL_AD_FUNC_CNTL =
1698 cpu_to_be32(ni_pi->clock_registers.mpll_ad_func_cntl);
1699 table->initialState.levels[0].mclk.vMPLL_AD_FUNC_CNTL_2 =
1700 cpu_to_be32(ni_pi->clock_registers.mpll_ad_func_cntl_2);
1701 table->initialState.levels[0].mclk.vMPLL_DQ_FUNC_CNTL =
1702 cpu_to_be32(ni_pi->clock_registers.mpll_dq_func_cntl);
1703 table->initialState.levels[0].mclk.vMPLL_DQ_FUNC_CNTL_2 =
1704 cpu_to_be32(ni_pi->clock_registers.mpll_dq_func_cntl_2);
1705 table->initialState.levels[0].mclk.vMCLK_PWRMGT_CNTL =
1706 cpu_to_be32(ni_pi->clock_registers.mclk_pwrmgt_cntl);
1707 table->initialState.levels[0].mclk.vDLL_CNTL =
1708 cpu_to_be32(ni_pi->clock_registers.dll_cntl);
1709 table->initialState.levels[0].mclk.vMPLL_SS =
1710 cpu_to_be32(ni_pi->clock_registers.mpll_ss1);
1711 table->initialState.levels[0].mclk.vMPLL_SS2 =
1712 cpu_to_be32(ni_pi->clock_registers.mpll_ss2);
1713 table->initialState.levels[0].mclk.mclk_value =
1714 cpu_to_be32(initial_state->performance_levels[0].mclk);
1715
1716 table->initialState.levels[0].sclk.vCG_SPLL_FUNC_CNTL =
1717 cpu_to_be32(ni_pi->clock_registers.cg_spll_func_cntl);
1718 table->initialState.levels[0].sclk.vCG_SPLL_FUNC_CNTL_2 =
1719 cpu_to_be32(ni_pi->clock_registers.cg_spll_func_cntl_2);
1720 table->initialState.levels[0].sclk.vCG_SPLL_FUNC_CNTL_3 =
1721 cpu_to_be32(ni_pi->clock_registers.cg_spll_func_cntl_3);
1722 table->initialState.levels[0].sclk.vCG_SPLL_FUNC_CNTL_4 =
1723 cpu_to_be32(ni_pi->clock_registers.cg_spll_func_cntl_4);
1724 table->initialState.levels[0].sclk.vCG_SPLL_SPREAD_SPECTRUM =
1725 cpu_to_be32(ni_pi->clock_registers.cg_spll_spread_spectrum);
1726 table->initialState.levels[0].sclk.vCG_SPLL_SPREAD_SPECTRUM_2 =
1727 cpu_to_be32(ni_pi->clock_registers.cg_spll_spread_spectrum_2);
1728 table->initialState.levels[0].sclk.sclk_value =
1729 cpu_to_be32(initial_state->performance_levels[0].sclk);
1730 table->initialState.levels[0].arbRefreshState =
1731 NISLANDS_INITIAL_STATE_ARB_INDEX;
1732
1733 table->initialState.levels[0].ACIndex = 0;
1734
1735 ret = ni_populate_voltage_value(rdev, &eg_pi->vddc_voltage_table,
1736 initial_state->performance_levels[0].vddc,
1737 &table->initialState.levels[0].vddc);
1738 if (!ret) {
1739 u16 std_vddc;
1740
1741 ret = ni_get_std_voltage_value(rdev,
1742 &table->initialState.levels[0].vddc,
1743 &std_vddc);
1744 if (!ret)
1745 ni_populate_std_voltage_value(rdev, std_vddc,
1746 table->initialState.levels[0].vddc.index,
1747 &table->initialState.levels[0].std_vddc);
1748 }
1749
1750 if (eg_pi->vddci_control)
1751 ni_populate_voltage_value(rdev,
1752 &eg_pi->vddci_voltage_table,
1753 initial_state->performance_levels[0].vddci,
1754 &table->initialState.levels[0].vddci);
1755
1756 ni_populate_initial_mvdd_value(rdev, &table->initialState.levels[0].mvdd);
1757
1758 reg = CG_R(0xffff) | CG_L(0);
1759 table->initialState.levels[0].aT = cpu_to_be32(reg);
1760
1761 table->initialState.levels[0].bSP = cpu_to_be32(pi->dsp);
1762
1763 if (pi->boot_in_gen2)
1764 table->initialState.levels[0].gen2PCIE = 1;
1765 else
1766 table->initialState.levels[0].gen2PCIE = 0;
1767
1768 if (pi->mem_gddr5) {
1769 table->initialState.levels[0].strobeMode =
1770 cypress_get_strobe_mode_settings(rdev,
1771 initial_state->performance_levels[0].mclk);
1772
1773 if (initial_state->performance_levels[0].mclk > pi->mclk_edc_enable_threshold)
1774 table->initialState.levels[0].mcFlags = NISLANDS_SMC_MC_EDC_RD_FLAG | NISLANDS_SMC_MC_EDC_WR_FLAG;
1775 else
1776 table->initialState.levels[0].mcFlags = 0;
1777 }
1778
1779 table->initialState.levelCount = 1;
1780
1781 table->initialState.flags |= PPSMC_SWSTATE_FLAG_DC;
1782
1783 table->initialState.levels[0].dpm2.MaxPS = 0;
1784 table->initialState.levels[0].dpm2.NearTDPDec = 0;
1785 table->initialState.levels[0].dpm2.AboveSafeInc = 0;
1786 table->initialState.levels[0].dpm2.BelowSafeInc = 0;
1787
1788 reg = MIN_POWER_MASK | MAX_POWER_MASK;
1789 table->initialState.levels[0].SQPowerThrottle = cpu_to_be32(reg);
1790
1791 reg = MAX_POWER_DELTA_MASK | STI_SIZE_MASK | LTI_RATIO_MASK;
1792 table->initialState.levels[0].SQPowerThrottle_2 = cpu_to_be32(reg);
1793
1794 return 0;
1795 }
1796
1797 static int ni_populate_smc_acpi_state(struct radeon_device *rdev,
1798 NISLANDS_SMC_STATETABLE *table)
1799 {
1800 struct rv7xx_power_info *pi = rv770_get_pi(rdev);
1801 struct evergreen_power_info *eg_pi = evergreen_get_pi(rdev);
1802 struct ni_power_info *ni_pi = ni_get_pi(rdev);
1803 u32 mpll_ad_func_cntl = ni_pi->clock_registers.mpll_ad_func_cntl;
1804 u32 mpll_ad_func_cntl_2 = ni_pi->clock_registers.mpll_ad_func_cntl_2;
1805 u32 mpll_dq_func_cntl = ni_pi->clock_registers.mpll_dq_func_cntl;
1806 u32 mpll_dq_func_cntl_2 = ni_pi->clock_registers.mpll_dq_func_cntl_2;
1807 u32 spll_func_cntl = ni_pi->clock_registers.cg_spll_func_cntl;
1808 u32 spll_func_cntl_2 = ni_pi->clock_registers.cg_spll_func_cntl_2;
1809 u32 spll_func_cntl_3 = ni_pi->clock_registers.cg_spll_func_cntl_3;
1810 u32 spll_func_cntl_4 = ni_pi->clock_registers.cg_spll_func_cntl_4;
1811 u32 mclk_pwrmgt_cntl = ni_pi->clock_registers.mclk_pwrmgt_cntl;
1812 u32 dll_cntl = ni_pi->clock_registers.dll_cntl;
1813 u32 reg;
1814 int ret;
1815
1816 table->ACPIState = table->initialState;
1817
1818 table->ACPIState.flags &= ~PPSMC_SWSTATE_FLAG_DC;
1819
1820 if (pi->acpi_vddc) {
1821 ret = ni_populate_voltage_value(rdev,
1822 &eg_pi->vddc_voltage_table,
1823 pi->acpi_vddc, &table->ACPIState.levels[0].vddc);
1824 if (!ret) {
1825 u16 std_vddc;
1826
1827 ret = ni_get_std_voltage_value(rdev,
1828 &table->ACPIState.levels[0].vddc, &std_vddc);
1829 if (!ret)
1830 ni_populate_std_voltage_value(rdev, std_vddc,
1831 table->ACPIState.levels[0].vddc.index,
1832 &table->ACPIState.levels[0].std_vddc);
1833 }
1834
1835 if (pi->pcie_gen2) {
1836 if (pi->acpi_pcie_gen2)
1837 table->ACPIState.levels[0].gen2PCIE = 1;
1838 else
1839 table->ACPIState.levels[0].gen2PCIE = 0;
1840 } else {
1841 table->ACPIState.levels[0].gen2PCIE = 0;
1842 }
1843 } else {
1844 ret = ni_populate_voltage_value(rdev,
1845 &eg_pi->vddc_voltage_table,
1846 pi->min_vddc_in_table,
1847 &table->ACPIState.levels[0].vddc);
1848 if (!ret) {
1849 u16 std_vddc;
1850
1851 ret = ni_get_std_voltage_value(rdev,
1852 &table->ACPIState.levels[0].vddc,
1853 &std_vddc);
1854 if (!ret)
1855 ni_populate_std_voltage_value(rdev, std_vddc,
1856 table->ACPIState.levels[0].vddc.index,
1857 &table->ACPIState.levels[0].std_vddc);
1858 }
1859 table->ACPIState.levels[0].gen2PCIE = 0;
1860 }
1861
1862 if (eg_pi->acpi_vddci) {
1863 if (eg_pi->vddci_control)
1864 ni_populate_voltage_value(rdev,
1865 &eg_pi->vddci_voltage_table,
1866 eg_pi->acpi_vddci,
1867 &table->ACPIState.levels[0].vddci);
1868 }
1869
1870
1871 mpll_ad_func_cntl &= ~PDNB;
1872
1873 mpll_ad_func_cntl_2 |= BIAS_GEN_PDNB | RESET_EN;
1874
1875 if (pi->mem_gddr5)
1876 mpll_dq_func_cntl &= ~PDNB;
1877 mpll_dq_func_cntl_2 |= BIAS_GEN_PDNB | RESET_EN | BYPASS;
1878
1879
1880 mclk_pwrmgt_cntl |= (MRDCKA0_RESET |
1881 MRDCKA1_RESET |
1882 MRDCKB0_RESET |
1883 MRDCKB1_RESET |
1884 MRDCKC0_RESET |
1885 MRDCKC1_RESET |
1886 MRDCKD0_RESET |
1887 MRDCKD1_RESET);
1888
1889 mclk_pwrmgt_cntl &= ~(MRDCKA0_PDNB |
1890 MRDCKA1_PDNB |
1891 MRDCKB0_PDNB |
1892 MRDCKB1_PDNB |
1893 MRDCKC0_PDNB |
1894 MRDCKC1_PDNB |
1895 MRDCKD0_PDNB |
1896 MRDCKD1_PDNB);
1897
1898 dll_cntl |= (MRDCKA0_BYPASS |
1899 MRDCKA1_BYPASS |
1900 MRDCKB0_BYPASS |
1901 MRDCKB1_BYPASS |
1902 MRDCKC0_BYPASS |
1903 MRDCKC1_BYPASS |
1904 MRDCKD0_BYPASS |
1905 MRDCKD1_BYPASS);
1906
1907 spll_func_cntl_2 &= ~SCLK_MUX_SEL_MASK;
1908 spll_func_cntl_2 |= SCLK_MUX_SEL(4);
1909
1910 table->ACPIState.levels[0].mclk.vMPLL_AD_FUNC_CNTL = cpu_to_be32(mpll_ad_func_cntl);
1911 table->ACPIState.levels[0].mclk.vMPLL_AD_FUNC_CNTL_2 = cpu_to_be32(mpll_ad_func_cntl_2);
1912 table->ACPIState.levels[0].mclk.vMPLL_DQ_FUNC_CNTL = cpu_to_be32(mpll_dq_func_cntl);
1913 table->ACPIState.levels[0].mclk.vMPLL_DQ_FUNC_CNTL_2 = cpu_to_be32(mpll_dq_func_cntl_2);
1914 table->ACPIState.levels[0].mclk.vMCLK_PWRMGT_CNTL = cpu_to_be32(mclk_pwrmgt_cntl);
1915 table->ACPIState.levels[0].mclk.vDLL_CNTL = cpu_to_be32(dll_cntl);
1916
1917 table->ACPIState.levels[0].mclk.mclk_value = 0;
1918
1919 table->ACPIState.levels[0].sclk.vCG_SPLL_FUNC_CNTL = cpu_to_be32(spll_func_cntl);
1920 table->ACPIState.levels[0].sclk.vCG_SPLL_FUNC_CNTL_2 = cpu_to_be32(spll_func_cntl_2);
1921 table->ACPIState.levels[0].sclk.vCG_SPLL_FUNC_CNTL_3 = cpu_to_be32(spll_func_cntl_3);
1922 table->ACPIState.levels[0].sclk.vCG_SPLL_FUNC_CNTL_4 = cpu_to_be32(spll_func_cntl_4);
1923
1924 table->ACPIState.levels[0].sclk.sclk_value = 0;
1925
1926 ni_populate_mvdd_value(rdev, 0, &table->ACPIState.levels[0].mvdd);
1927
1928 if (eg_pi->dynamic_ac_timing)
1929 table->ACPIState.levels[0].ACIndex = 1;
1930
1931 table->ACPIState.levels[0].dpm2.MaxPS = 0;
1932 table->ACPIState.levels[0].dpm2.NearTDPDec = 0;
1933 table->ACPIState.levels[0].dpm2.AboveSafeInc = 0;
1934 table->ACPIState.levels[0].dpm2.BelowSafeInc = 0;
1935
1936 reg = MIN_POWER_MASK | MAX_POWER_MASK;
1937 table->ACPIState.levels[0].SQPowerThrottle = cpu_to_be32(reg);
1938
1939 reg = MAX_POWER_DELTA_MASK | STI_SIZE_MASK | LTI_RATIO_MASK;
1940 table->ACPIState.levels[0].SQPowerThrottle_2 = cpu_to_be32(reg);
1941
1942 return 0;
1943 }
1944
1945 static int ni_init_smc_table(struct radeon_device *rdev)
1946 {
1947 struct rv7xx_power_info *pi = rv770_get_pi(rdev);
1948 struct ni_power_info *ni_pi = ni_get_pi(rdev);
1949 int ret;
1950 struct radeon_ps *radeon_boot_state = rdev->pm.dpm.boot_ps;
1951 NISLANDS_SMC_STATETABLE *table = &ni_pi->smc_statetable;
1952
1953 memset(table, 0, sizeof(NISLANDS_SMC_STATETABLE));
1954
1955 ni_populate_smc_voltage_tables(rdev, table);
1956
1957 switch (rdev->pm.int_thermal_type) {
1958 case THERMAL_TYPE_NI:
1959 case THERMAL_TYPE_EMC2103_WITH_INTERNAL:
1960 table->thermalProtectType = PPSMC_THERMAL_PROTECT_TYPE_INTERNAL;
1961 break;
1962 case THERMAL_TYPE_NONE:
1963 table->thermalProtectType = PPSMC_THERMAL_PROTECT_TYPE_NONE;
1964 break;
1965 default:
1966 table->thermalProtectType = PPSMC_THERMAL_PROTECT_TYPE_EXTERNAL;
1967 break;
1968 }
1969
1970 if (rdev->pm.dpm.platform_caps & ATOM_PP_PLATFORM_CAP_HARDWAREDC)
1971 table->systemFlags |= PPSMC_SYSTEMFLAG_GPIO_DC;
1972
1973 if (rdev->pm.dpm.platform_caps & ATOM_PP_PLATFORM_CAP_REGULATOR_HOT)
1974 table->systemFlags |= PPSMC_SYSTEMFLAG_REGULATOR_HOT;
1975
1976 if (rdev->pm.dpm.platform_caps & ATOM_PP_PLATFORM_CAP_STEPVDDC)
1977 table->systemFlags |= PPSMC_SYSTEMFLAG_STEPVDDC;
1978
1979 if (pi->mem_gddr5)
1980 table->systemFlags |= PPSMC_SYSTEMFLAG_GDDR5;
1981
1982 ret = ni_populate_smc_initial_state(rdev, radeon_boot_state, table);
1983 if (ret)
1984 return ret;
1985
1986 ret = ni_populate_smc_acpi_state(rdev, table);
1987 if (ret)
1988 return ret;
1989
1990 table->driverState = table->initialState;
1991
1992 table->ULVState = table->initialState;
1993
1994 ret = ni_do_program_memory_timing_parameters(rdev, radeon_boot_state,
1995 NISLANDS_INITIAL_STATE_ARB_INDEX);
1996 if (ret)
1997 return ret;
1998
1999 return rv770_copy_bytes_to_smc(rdev, pi->state_table_start, (u8 *)table,
2000 sizeof(NISLANDS_SMC_STATETABLE), pi->sram_end);
2001 }
2002
2003 static int ni_calculate_sclk_params(struct radeon_device *rdev,
2004 u32 engine_clock,
2005 NISLANDS_SMC_SCLK_VALUE *sclk)
2006 {
2007 struct rv7xx_power_info *pi = rv770_get_pi(rdev);
2008 struct ni_power_info *ni_pi = ni_get_pi(rdev);
2009 struct atom_clock_dividers dividers;
2010 u32 spll_func_cntl = ni_pi->clock_registers.cg_spll_func_cntl;
2011 u32 spll_func_cntl_2 = ni_pi->clock_registers.cg_spll_func_cntl_2;
2012 u32 spll_func_cntl_3 = ni_pi->clock_registers.cg_spll_func_cntl_3;
2013 u32 spll_func_cntl_4 = ni_pi->clock_registers.cg_spll_func_cntl_4;
2014 u32 cg_spll_spread_spectrum = ni_pi->clock_registers.cg_spll_spread_spectrum;
2015 u32 cg_spll_spread_spectrum_2 = ni_pi->clock_registers.cg_spll_spread_spectrum_2;
2016 u64 tmp;
2017 u32 reference_clock = rdev->clock.spll.reference_freq;
2018 u32 reference_divider;
2019 u32 fbdiv;
2020 int ret;
2021
2022 ret = radeon_atom_get_clock_dividers(rdev, COMPUTE_ENGINE_PLL_PARAM,
2023 engine_clock, false, ÷rs);
2024 if (ret)
2025 return ret;
2026
2027 reference_divider = 1 + dividers.ref_div;
2028
2029
2030 tmp = (u64) engine_clock * reference_divider * dividers.post_div * 16834;
2031 do_div(tmp, reference_clock);
2032 fbdiv = (u32) tmp;
2033
2034 spll_func_cntl &= ~(SPLL_PDIV_A_MASK | SPLL_REF_DIV_MASK);
2035 spll_func_cntl |= SPLL_REF_DIV(dividers.ref_div);
2036 spll_func_cntl |= SPLL_PDIV_A(dividers.post_div);
2037
2038 spll_func_cntl_2 &= ~SCLK_MUX_SEL_MASK;
2039 spll_func_cntl_2 |= SCLK_MUX_SEL(2);
2040
2041 spll_func_cntl_3 &= ~SPLL_FB_DIV_MASK;
2042 spll_func_cntl_3 |= SPLL_FB_DIV(fbdiv);
2043 spll_func_cntl_3 |= SPLL_DITHEN;
2044
2045 if (pi->sclk_ss) {
2046 struct radeon_atom_ss ss;
2047 u32 vco_freq = engine_clock * dividers.post_div;
2048
2049 if (radeon_atombios_get_asic_ss_info(rdev, &ss,
2050 ASIC_INTERNAL_ENGINE_SS, vco_freq)) {
2051 u32 clk_s = reference_clock * 5 / (reference_divider * ss.rate);
2052 u32 clk_v = 4 * ss.percentage * fbdiv / (clk_s * 10000);
2053
2054 cg_spll_spread_spectrum &= ~CLK_S_MASK;
2055 cg_spll_spread_spectrum |= CLK_S(clk_s);
2056 cg_spll_spread_spectrum |= SSEN;
2057
2058 cg_spll_spread_spectrum_2 &= ~CLK_V_MASK;
2059 cg_spll_spread_spectrum_2 |= CLK_V(clk_v);
2060 }
2061 }
2062
2063 sclk->sclk_value = engine_clock;
2064 sclk->vCG_SPLL_FUNC_CNTL = spll_func_cntl;
2065 sclk->vCG_SPLL_FUNC_CNTL_2 = spll_func_cntl_2;
2066 sclk->vCG_SPLL_FUNC_CNTL_3 = spll_func_cntl_3;
2067 sclk->vCG_SPLL_FUNC_CNTL_4 = spll_func_cntl_4;
2068 sclk->vCG_SPLL_SPREAD_SPECTRUM = cg_spll_spread_spectrum;
2069 sclk->vCG_SPLL_SPREAD_SPECTRUM_2 = cg_spll_spread_spectrum_2;
2070
2071 return 0;
2072 }
2073
2074 static int ni_populate_sclk_value(struct radeon_device *rdev,
2075 u32 engine_clock,
2076 NISLANDS_SMC_SCLK_VALUE *sclk)
2077 {
2078 NISLANDS_SMC_SCLK_VALUE sclk_tmp;
2079 int ret;
2080
2081 ret = ni_calculate_sclk_params(rdev, engine_clock, &sclk_tmp);
2082 if (!ret) {
2083 sclk->sclk_value = cpu_to_be32(sclk_tmp.sclk_value);
2084 sclk->vCG_SPLL_FUNC_CNTL = cpu_to_be32(sclk_tmp.vCG_SPLL_FUNC_CNTL);
2085 sclk->vCG_SPLL_FUNC_CNTL_2 = cpu_to_be32(sclk_tmp.vCG_SPLL_FUNC_CNTL_2);
2086 sclk->vCG_SPLL_FUNC_CNTL_3 = cpu_to_be32(sclk_tmp.vCG_SPLL_FUNC_CNTL_3);
2087 sclk->vCG_SPLL_FUNC_CNTL_4 = cpu_to_be32(sclk_tmp.vCG_SPLL_FUNC_CNTL_4);
2088 sclk->vCG_SPLL_SPREAD_SPECTRUM = cpu_to_be32(sclk_tmp.vCG_SPLL_SPREAD_SPECTRUM);
2089 sclk->vCG_SPLL_SPREAD_SPECTRUM_2 = cpu_to_be32(sclk_tmp.vCG_SPLL_SPREAD_SPECTRUM_2);
2090 }
2091
2092 return ret;
2093 }
2094
2095 static int ni_init_smc_spll_table(struct radeon_device *rdev)
2096 {
2097 struct rv7xx_power_info *pi = rv770_get_pi(rdev);
2098 struct ni_power_info *ni_pi = ni_get_pi(rdev);
2099 SMC_NISLANDS_SPLL_DIV_TABLE *spll_table;
2100 NISLANDS_SMC_SCLK_VALUE sclk_params;
2101 u32 fb_div;
2102 u32 p_div;
2103 u32 clk_s;
2104 u32 clk_v;
2105 u32 sclk = 0;
2106 int i, ret;
2107 u32 tmp;
2108
2109 if (ni_pi->spll_table_start == 0)
2110 return -EINVAL;
2111
2112 spll_table = kzalloc(sizeof(SMC_NISLANDS_SPLL_DIV_TABLE), GFP_KERNEL);
2113 if (spll_table == NULL)
2114 return -ENOMEM;
2115
2116 for (i = 0; i < 256; i++) {
2117 ret = ni_calculate_sclk_params(rdev, sclk, &sclk_params);
2118 if (ret)
2119 break;
2120
2121 p_div = (sclk_params.vCG_SPLL_FUNC_CNTL & SPLL_PDIV_A_MASK) >> SPLL_PDIV_A_SHIFT;
2122 fb_div = (sclk_params.vCG_SPLL_FUNC_CNTL_3 & SPLL_FB_DIV_MASK) >> SPLL_FB_DIV_SHIFT;
2123 clk_s = (sclk_params.vCG_SPLL_SPREAD_SPECTRUM & CLK_S_MASK) >> CLK_S_SHIFT;
2124 clk_v = (sclk_params.vCG_SPLL_SPREAD_SPECTRUM_2 & CLK_V_MASK) >> CLK_V_SHIFT;
2125
2126 fb_div &= ~0x00001FFF;
2127 fb_div >>= 1;
2128 clk_v >>= 6;
2129
2130 if (p_div & ~(SMC_NISLANDS_SPLL_DIV_TABLE_PDIV_MASK >> SMC_NISLANDS_SPLL_DIV_TABLE_PDIV_SHIFT))
2131 ret = -EINVAL;
2132
2133 if (clk_s & ~(SMC_NISLANDS_SPLL_DIV_TABLE_CLKS_MASK >> SMC_NISLANDS_SPLL_DIV_TABLE_CLKS_SHIFT))
2134 ret = -EINVAL;
2135
2136 if (clk_s & ~(SMC_NISLANDS_SPLL_DIV_TABLE_CLKS_MASK >> SMC_NISLANDS_SPLL_DIV_TABLE_CLKS_SHIFT))
2137 ret = -EINVAL;
2138
2139 if (clk_v & ~(SMC_NISLANDS_SPLL_DIV_TABLE_CLKV_MASK >> SMC_NISLANDS_SPLL_DIV_TABLE_CLKV_SHIFT))
2140 ret = -EINVAL;
2141
2142 if (ret)
2143 break;
2144
2145 tmp = ((fb_div << SMC_NISLANDS_SPLL_DIV_TABLE_FBDIV_SHIFT) & SMC_NISLANDS_SPLL_DIV_TABLE_FBDIV_MASK) |
2146 ((p_div << SMC_NISLANDS_SPLL_DIV_TABLE_PDIV_SHIFT) & SMC_NISLANDS_SPLL_DIV_TABLE_PDIV_MASK);
2147 spll_table->freq[i] = cpu_to_be32(tmp);
2148
2149 tmp = ((clk_v << SMC_NISLANDS_SPLL_DIV_TABLE_CLKV_SHIFT) & SMC_NISLANDS_SPLL_DIV_TABLE_CLKV_MASK) |
2150 ((clk_s << SMC_NISLANDS_SPLL_DIV_TABLE_CLKS_SHIFT) & SMC_NISLANDS_SPLL_DIV_TABLE_CLKS_MASK);
2151 spll_table->ss[i] = cpu_to_be32(tmp);
2152
2153 sclk += 512;
2154 }
2155
2156 if (!ret)
2157 ret = rv770_copy_bytes_to_smc(rdev, ni_pi->spll_table_start, (u8 *)spll_table,
2158 sizeof(SMC_NISLANDS_SPLL_DIV_TABLE), pi->sram_end);
2159
2160 kfree(spll_table);
2161
2162 return ret;
2163 }
2164
2165 static int ni_populate_mclk_value(struct radeon_device *rdev,
2166 u32 engine_clock,
2167 u32 memory_clock,
2168 NISLANDS_SMC_MCLK_VALUE *mclk,
2169 bool strobe_mode,
2170 bool dll_state_on)
2171 {
2172 struct rv7xx_power_info *pi = rv770_get_pi(rdev);
2173 struct ni_power_info *ni_pi = ni_get_pi(rdev);
2174 u32 mpll_ad_func_cntl = ni_pi->clock_registers.mpll_ad_func_cntl;
2175 u32 mpll_ad_func_cntl_2 = ni_pi->clock_registers.mpll_ad_func_cntl_2;
2176 u32 mpll_dq_func_cntl = ni_pi->clock_registers.mpll_dq_func_cntl;
2177 u32 mpll_dq_func_cntl_2 = ni_pi->clock_registers.mpll_dq_func_cntl_2;
2178 u32 mclk_pwrmgt_cntl = ni_pi->clock_registers.mclk_pwrmgt_cntl;
2179 u32 dll_cntl = ni_pi->clock_registers.dll_cntl;
2180 u32 mpll_ss1 = ni_pi->clock_registers.mpll_ss1;
2181 u32 mpll_ss2 = ni_pi->clock_registers.mpll_ss2;
2182 struct atom_clock_dividers dividers;
2183 u32 ibias;
2184 u32 dll_speed;
2185 int ret;
2186 u32 mc_seq_misc7;
2187
2188 ret = radeon_atom_get_clock_dividers(rdev, COMPUTE_MEMORY_PLL_PARAM,
2189 memory_clock, strobe_mode, ÷rs);
2190 if (ret)
2191 return ret;
2192
2193 if (!strobe_mode) {
2194 mc_seq_misc7 = RREG32(MC_SEQ_MISC7);
2195
2196 if (mc_seq_misc7 & 0x8000000)
2197 dividers.post_div = 1;
2198 }
2199
2200 ibias = cypress_map_clkf_to_ibias(rdev, dividers.whole_fb_div);
2201
2202 mpll_ad_func_cntl &= ~(CLKR_MASK |
2203 YCLK_POST_DIV_MASK |
2204 CLKF_MASK |
2205 CLKFRAC_MASK |
2206 IBIAS_MASK);
2207 mpll_ad_func_cntl |= CLKR(dividers.ref_div);
2208 mpll_ad_func_cntl |= YCLK_POST_DIV(dividers.post_div);
2209 mpll_ad_func_cntl |= CLKF(dividers.whole_fb_div);
2210 mpll_ad_func_cntl |= CLKFRAC(dividers.frac_fb_div);
2211 mpll_ad_func_cntl |= IBIAS(ibias);
2212
2213 if (dividers.vco_mode)
2214 mpll_ad_func_cntl_2 |= VCO_MODE;
2215 else
2216 mpll_ad_func_cntl_2 &= ~VCO_MODE;
2217
2218 if (pi->mem_gddr5) {
2219 mpll_dq_func_cntl &= ~(CLKR_MASK |
2220 YCLK_POST_DIV_MASK |
2221 CLKF_MASK |
2222 CLKFRAC_MASK |
2223 IBIAS_MASK);
2224 mpll_dq_func_cntl |= CLKR(dividers.ref_div);
2225 mpll_dq_func_cntl |= YCLK_POST_DIV(dividers.post_div);
2226 mpll_dq_func_cntl |= CLKF(dividers.whole_fb_div);
2227 mpll_dq_func_cntl |= CLKFRAC(dividers.frac_fb_div);
2228 mpll_dq_func_cntl |= IBIAS(ibias);
2229
2230 if (strobe_mode)
2231 mpll_dq_func_cntl &= ~PDNB;
2232 else
2233 mpll_dq_func_cntl |= PDNB;
2234
2235 if (dividers.vco_mode)
2236 mpll_dq_func_cntl_2 |= VCO_MODE;
2237 else
2238 mpll_dq_func_cntl_2 &= ~VCO_MODE;
2239 }
2240
2241 if (pi->mclk_ss) {
2242 struct radeon_atom_ss ss;
2243 u32 vco_freq = memory_clock * dividers.post_div;
2244
2245 if (radeon_atombios_get_asic_ss_info(rdev, &ss,
2246 ASIC_INTERNAL_MEMORY_SS, vco_freq)) {
2247 u32 reference_clock = rdev->clock.mpll.reference_freq;
2248 u32 decoded_ref = rv740_get_decoded_reference_divider(dividers.ref_div);
2249 u32 clk_s = reference_clock * 5 / (decoded_ref * ss.rate);
2250 u32 clk_v = ss.percentage *
2251 (0x4000 * dividers.whole_fb_div + 0x800 * dividers.frac_fb_div) / (clk_s * 625);
2252
2253 mpll_ss1 &= ~CLKV_MASK;
2254 mpll_ss1 |= CLKV(clk_v);
2255
2256 mpll_ss2 &= ~CLKS_MASK;
2257 mpll_ss2 |= CLKS(clk_s);
2258 }
2259 }
2260
2261 dll_speed = rv740_get_dll_speed(pi->mem_gddr5,
2262 memory_clock);
2263
2264 mclk_pwrmgt_cntl &= ~DLL_SPEED_MASK;
2265 mclk_pwrmgt_cntl |= DLL_SPEED(dll_speed);
2266 if (dll_state_on)
2267 mclk_pwrmgt_cntl |= (MRDCKA0_PDNB |
2268 MRDCKA1_PDNB |
2269 MRDCKB0_PDNB |
2270 MRDCKB1_PDNB |
2271 MRDCKC0_PDNB |
2272 MRDCKC1_PDNB |
2273 MRDCKD0_PDNB |
2274 MRDCKD1_PDNB);
2275 else
2276 mclk_pwrmgt_cntl &= ~(MRDCKA0_PDNB |
2277 MRDCKA1_PDNB |
2278 MRDCKB0_PDNB |
2279 MRDCKB1_PDNB |
2280 MRDCKC0_PDNB |
2281 MRDCKC1_PDNB |
2282 MRDCKD0_PDNB |
2283 MRDCKD1_PDNB);
2284
2285
2286 mclk->mclk_value = cpu_to_be32(memory_clock);
2287 mclk->vMPLL_AD_FUNC_CNTL = cpu_to_be32(mpll_ad_func_cntl);
2288 mclk->vMPLL_AD_FUNC_CNTL_2 = cpu_to_be32(mpll_ad_func_cntl_2);
2289 mclk->vMPLL_DQ_FUNC_CNTL = cpu_to_be32(mpll_dq_func_cntl);
2290 mclk->vMPLL_DQ_FUNC_CNTL_2 = cpu_to_be32(mpll_dq_func_cntl_2);
2291 mclk->vMCLK_PWRMGT_CNTL = cpu_to_be32(mclk_pwrmgt_cntl);
2292 mclk->vDLL_CNTL = cpu_to_be32(dll_cntl);
2293 mclk->vMPLL_SS = cpu_to_be32(mpll_ss1);
2294 mclk->vMPLL_SS2 = cpu_to_be32(mpll_ss2);
2295
2296 return 0;
2297 }
2298
2299 static void ni_populate_smc_sp(struct radeon_device *rdev,
2300 struct radeon_ps *radeon_state,
2301 NISLANDS_SMC_SWSTATE *smc_state)
2302 {
2303 struct ni_ps *ps = ni_get_ps(radeon_state);
2304 struct rv7xx_power_info *pi = rv770_get_pi(rdev);
2305 int i;
2306
2307 for (i = 0; i < ps->performance_level_count - 1; i++)
2308 smc_state->levels[i].bSP = cpu_to_be32(pi->dsp);
2309
2310 smc_state->levels[ps->performance_level_count - 1].bSP =
2311 cpu_to_be32(pi->psp);
2312 }
2313
2314 static int ni_convert_power_level_to_smc(struct radeon_device *rdev,
2315 struct rv7xx_pl *pl,
2316 NISLANDS_SMC_HW_PERFORMANCE_LEVEL *level)
2317 {
2318 struct rv7xx_power_info *pi = rv770_get_pi(rdev);
2319 struct evergreen_power_info *eg_pi = evergreen_get_pi(rdev);
2320 struct ni_power_info *ni_pi = ni_get_pi(rdev);
2321 int ret;
2322 bool dll_state_on;
2323 u16 std_vddc;
2324 u32 tmp = RREG32(DC_STUTTER_CNTL);
2325
2326 level->gen2PCIE = pi->pcie_gen2 ?
2327 ((pl->flags & ATOM_PPLIB_R600_FLAGS_PCIEGEN2) ? 1 : 0) : 0;
2328
2329 ret = ni_populate_sclk_value(rdev, pl->sclk, &level->sclk);
2330 if (ret)
2331 return ret;
2332
2333 level->mcFlags = 0;
2334 if (pi->mclk_stutter_mode_threshold &&
2335 (pl->mclk <= pi->mclk_stutter_mode_threshold) &&
2336 !eg_pi->uvd_enabled &&
2337 (tmp & DC_STUTTER_ENABLE_A) &&
2338 (tmp & DC_STUTTER_ENABLE_B))
2339 level->mcFlags |= NISLANDS_SMC_MC_STUTTER_EN;
2340
2341 if (pi->mem_gddr5) {
2342 if (pl->mclk > pi->mclk_edc_enable_threshold)
2343 level->mcFlags |= NISLANDS_SMC_MC_EDC_RD_FLAG;
2344 if (pl->mclk > eg_pi->mclk_edc_wr_enable_threshold)
2345 level->mcFlags |= NISLANDS_SMC_MC_EDC_WR_FLAG;
2346
2347 level->strobeMode = cypress_get_strobe_mode_settings(rdev, pl->mclk);
2348
2349 if (level->strobeMode & NISLANDS_SMC_STROBE_ENABLE) {
2350 if (cypress_get_mclk_frequency_ratio(rdev, pl->mclk, true) >=
2351 ((RREG32(MC_SEQ_MISC7) >> 16) & 0xf))
2352 dll_state_on = ((RREG32(MC_SEQ_MISC5) >> 1) & 0x1) ? true : false;
2353 else
2354 dll_state_on = ((RREG32(MC_SEQ_MISC6) >> 1) & 0x1) ? true : false;
2355 } else {
2356 dll_state_on = false;
2357 if (pl->mclk > ni_pi->mclk_rtt_mode_threshold)
2358 level->mcFlags |= NISLANDS_SMC_MC_RTT_ENABLE;
2359 }
2360
2361 ret = ni_populate_mclk_value(rdev, pl->sclk, pl->mclk,
2362 &level->mclk,
2363 (level->strobeMode & NISLANDS_SMC_STROBE_ENABLE) != 0,
2364 dll_state_on);
2365 } else
2366 ret = ni_populate_mclk_value(rdev, pl->sclk, pl->mclk, &level->mclk, 1, 1);
2367
2368 if (ret)
2369 return ret;
2370
2371 ret = ni_populate_voltage_value(rdev, &eg_pi->vddc_voltage_table,
2372 pl->vddc, &level->vddc);
2373 if (ret)
2374 return ret;
2375
2376 ret = ni_get_std_voltage_value(rdev, &level->vddc, &std_vddc);
2377 if (ret)
2378 return ret;
2379
2380 ni_populate_std_voltage_value(rdev, std_vddc,
2381 level->vddc.index, &level->std_vddc);
2382
2383 if (eg_pi->vddci_control) {
2384 ret = ni_populate_voltage_value(rdev, &eg_pi->vddci_voltage_table,
2385 pl->vddci, &level->vddci);
2386 if (ret)
2387 return ret;
2388 }
2389
2390 ni_populate_mvdd_value(rdev, pl->mclk, &level->mvdd);
2391
2392 return ret;
2393 }
2394
2395 static int ni_populate_smc_t(struct radeon_device *rdev,
2396 struct radeon_ps *radeon_state,
2397 NISLANDS_SMC_SWSTATE *smc_state)
2398 {
2399 struct rv7xx_power_info *pi = rv770_get_pi(rdev);
2400 struct evergreen_power_info *eg_pi = evergreen_get_pi(rdev);
2401 struct ni_ps *state = ni_get_ps(radeon_state);
2402 u32 a_t;
2403 u32 t_l, t_h;
2404 u32 high_bsp;
2405 int i, ret;
2406
2407 if (state->performance_level_count >= 9)
2408 return -EINVAL;
2409
2410 if (state->performance_level_count < 2) {
2411 a_t = CG_R(0xffff) | CG_L(0);
2412 smc_state->levels[0].aT = cpu_to_be32(a_t);
2413 return 0;
2414 }
2415
2416 smc_state->levels[0].aT = cpu_to_be32(0);
2417
2418 for (i = 0; i <= state->performance_level_count - 2; i++) {
2419 if (eg_pi->uvd_enabled)
2420 ret = r600_calculate_at(
2421 1000 * (i * (eg_pi->smu_uvd_hs ? 2 : 8) + 2),
2422 100 * R600_AH_DFLT,
2423 state->performance_levels[i + 1].sclk,
2424 state->performance_levels[i].sclk,
2425 &t_l,
2426 &t_h);
2427 else
2428 ret = r600_calculate_at(
2429 1000 * (i + 1),
2430 100 * R600_AH_DFLT,
2431 state->performance_levels[i + 1].sclk,
2432 state->performance_levels[i].sclk,
2433 &t_l,
2434 &t_h);
2435
2436 if (ret) {
2437 t_h = (i + 1) * 1000 - 50 * R600_AH_DFLT;
2438 t_l = (i + 1) * 1000 + 50 * R600_AH_DFLT;
2439 }
2440
2441 a_t = be32_to_cpu(smc_state->levels[i].aT) & ~CG_R_MASK;
2442 a_t |= CG_R(t_l * pi->bsp / 20000);
2443 smc_state->levels[i].aT = cpu_to_be32(a_t);
2444
2445 high_bsp = (i == state->performance_level_count - 2) ?
2446 pi->pbsp : pi->bsp;
2447
2448 a_t = CG_R(0xffff) | CG_L(t_h * high_bsp / 20000);
2449 smc_state->levels[i + 1].aT = cpu_to_be32(a_t);
2450 }
2451
2452 return 0;
2453 }
2454
2455 static int ni_populate_power_containment_values(struct radeon_device *rdev,
2456 struct radeon_ps *radeon_state,
2457 NISLANDS_SMC_SWSTATE *smc_state)
2458 {
2459 struct rv7xx_power_info *pi = rv770_get_pi(rdev);
2460 struct evergreen_power_info *eg_pi = evergreen_get_pi(rdev);
2461 struct ni_power_info *ni_pi = ni_get_pi(rdev);
2462 struct ni_ps *state = ni_get_ps(radeon_state);
2463 u32 prev_sclk;
2464 u32 max_sclk;
2465 u32 min_sclk;
2466 int i, ret;
2467 u32 tdp_limit;
2468 u32 near_tdp_limit;
2469 u32 power_boost_limit;
2470 u8 max_ps_percent;
2471
2472 if (ni_pi->enable_power_containment == false)
2473 return 0;
2474
2475 if (state->performance_level_count == 0)
2476 return -EINVAL;
2477
2478 if (smc_state->levelCount != state->performance_level_count)
2479 return -EINVAL;
2480
2481 ret = ni_calculate_adjusted_tdp_limits(rdev,
2482 false, /* ??? */
2483 rdev->pm.dpm.tdp_adjustment,
2484 &tdp_limit,
2485 &near_tdp_limit);
2486 if (ret)
2487 return ret;
2488
2489 power_boost_limit = ni_calculate_power_boost_limit(rdev, radeon_state, near_tdp_limit);
2490
2491 ret = rv770_write_smc_sram_dword(rdev,
2492 pi->state_table_start +
2493 offsetof(NISLANDS_SMC_STATETABLE, dpm2Params) +
2494 offsetof(PP_NIslands_DPM2Parameters, PowerBoostLimit),
2495 ni_scale_power_for_smc(power_boost_limit, ni_get_smc_power_scaling_factor(rdev)),
2496 pi->sram_end);
2497 if (ret)
2498 power_boost_limit = 0;
2499
2500 smc_state->levels[0].dpm2.MaxPS = 0;
2501 smc_state->levels[0].dpm2.NearTDPDec = 0;
2502 smc_state->levels[0].dpm2.AboveSafeInc = 0;
2503 smc_state->levels[0].dpm2.BelowSafeInc = 0;
2504 smc_state->levels[0].stateFlags |= power_boost_limit ? PPSMC_STATEFLAG_POWERBOOST : 0;
2505
2506 for (i = 1; i < state->performance_level_count; i++) {
2507 prev_sclk = state->performance_levels[i-1].sclk;
2508 max_sclk = state->performance_levels[i].sclk;
2509 max_ps_percent = (i != (state->performance_level_count - 1)) ?
2510 NISLANDS_DPM2_MAXPS_PERCENT_M : NISLANDS_DPM2_MAXPS_PERCENT_H;
2511
2512 if (max_sclk < prev_sclk)
2513 return -EINVAL;
2514
2515 if ((max_ps_percent == 0) || (prev_sclk == max_sclk) || eg_pi->uvd_enabled)
2516 min_sclk = max_sclk;
2517 else if (1 == i)
2518 min_sclk = prev_sclk;
2519 else
2520 min_sclk = (prev_sclk * (u32)max_ps_percent) / 100;
2521
2522 if (min_sclk < state->performance_levels[0].sclk)
2523 min_sclk = state->performance_levels[0].sclk;
2524
2525 if (min_sclk == 0)
2526 return -EINVAL;
2527
2528 smc_state->levels[i].dpm2.MaxPS =
2529 (u8)((NISLANDS_DPM2_MAX_PULSE_SKIP * (max_sclk - min_sclk)) / max_sclk);
2530 smc_state->levels[i].dpm2.NearTDPDec = NISLANDS_DPM2_NEAR_TDP_DEC;
2531 smc_state->levels[i].dpm2.AboveSafeInc = NISLANDS_DPM2_ABOVE_SAFE_INC;
2532 smc_state->levels[i].dpm2.BelowSafeInc = NISLANDS_DPM2_BELOW_SAFE_INC;
2533 smc_state->levels[i].stateFlags |=
2534 ((i != (state->performance_level_count - 1)) && power_boost_limit) ?
2535 PPSMC_STATEFLAG_POWERBOOST : 0;
2536 }
2537
2538 return 0;
2539 }
2540
2541 static int ni_populate_sq_ramping_values(struct radeon_device *rdev,
2542 struct radeon_ps *radeon_state,
2543 NISLANDS_SMC_SWSTATE *smc_state)
2544 {
2545 struct ni_power_info *ni_pi = ni_get_pi(rdev);
2546 struct ni_ps *state = ni_get_ps(radeon_state);
2547 u32 sq_power_throttle;
2548 u32 sq_power_throttle2;
2549 bool enable_sq_ramping = ni_pi->enable_sq_ramping;
2550 int i;
2551
2552 if (state->performance_level_count == 0)
2553 return -EINVAL;
2554
2555 if (smc_state->levelCount != state->performance_level_count)
2556 return -EINVAL;
2557
2558 if (rdev->pm.dpm.sq_ramping_threshold == 0)
2559 return -EINVAL;
2560
2561 if (NISLANDS_DPM2_SQ_RAMP_MAX_POWER > (MAX_POWER_MASK >> MAX_POWER_SHIFT))
2562 enable_sq_ramping = false;
2563
2564 if (NISLANDS_DPM2_SQ_RAMP_MIN_POWER > (MIN_POWER_MASK >> MIN_POWER_SHIFT))
2565 enable_sq_ramping = false;
2566
2567 if (NISLANDS_DPM2_SQ_RAMP_MAX_POWER_DELTA > (MAX_POWER_DELTA_MASK >> MAX_POWER_DELTA_SHIFT))
2568 enable_sq_ramping = false;
2569
2570 if (NISLANDS_DPM2_SQ_RAMP_STI_SIZE > (STI_SIZE_MASK >> STI_SIZE_SHIFT))
2571 enable_sq_ramping = false;
2572
2573 if (NISLANDS_DPM2_SQ_RAMP_LTI_RATIO > (LTI_RATIO_MASK >> LTI_RATIO_SHIFT))
2574 enable_sq_ramping = false;
2575
2576 for (i = 0; i < state->performance_level_count; i++) {
2577 sq_power_throttle = 0;
2578 sq_power_throttle2 = 0;
2579
2580 if ((state->performance_levels[i].sclk >= rdev->pm.dpm.sq_ramping_threshold) &&
2581 enable_sq_ramping) {
2582 sq_power_throttle |= MAX_POWER(NISLANDS_DPM2_SQ_RAMP_MAX_POWER);
2583 sq_power_throttle |= MIN_POWER(NISLANDS_DPM2_SQ_RAMP_MIN_POWER);
2584 sq_power_throttle2 |= MAX_POWER_DELTA(NISLANDS_DPM2_SQ_RAMP_MAX_POWER_DELTA);
2585 sq_power_throttle2 |= STI_SIZE(NISLANDS_DPM2_SQ_RAMP_STI_SIZE);
2586 sq_power_throttle2 |= LTI_RATIO(NISLANDS_DPM2_SQ_RAMP_LTI_RATIO);
2587 } else {
2588 sq_power_throttle |= MAX_POWER_MASK | MIN_POWER_MASK;
2589 sq_power_throttle2 |= MAX_POWER_DELTA_MASK | STI_SIZE_MASK | LTI_RATIO_MASK;
2590 }
2591
2592 smc_state->levels[i].SQPowerThrottle = cpu_to_be32(sq_power_throttle);
2593 smc_state->levels[i].SQPowerThrottle_2 = cpu_to_be32(sq_power_throttle2);
2594 }
2595
2596 return 0;
2597 }
2598
2599 static int ni_enable_power_containment(struct radeon_device *rdev,
2600 struct radeon_ps *radeon_new_state,
2601 bool enable)
2602 {
2603 struct ni_power_info *ni_pi = ni_get_pi(rdev);
2604 PPSMC_Result smc_result;
2605 int ret = 0;
2606
2607 if (ni_pi->enable_power_containment) {
2608 if (enable) {
2609 if (!r600_is_uvd_state(radeon_new_state->class, radeon_new_state->class2)) {
2610 smc_result = rv770_send_msg_to_smc(rdev, PPSMC_TDPClampingActive);
2611 if (smc_result != PPSMC_Result_OK) {
2612 ret = -EINVAL;
2613 ni_pi->pc_enabled = false;
2614 } else {
2615 ni_pi->pc_enabled = true;
2616 }
2617 }
2618 } else {
2619 smc_result = rv770_send_msg_to_smc(rdev, PPSMC_TDPClampingInactive);
2620 if (smc_result != PPSMC_Result_OK)
2621 ret = -EINVAL;
2622 ni_pi->pc_enabled = false;
2623 }
2624 }
2625
2626 return ret;
2627 }
2628
2629 static int ni_convert_power_state_to_smc(struct radeon_device *rdev,
2630 struct radeon_ps *radeon_state,
2631 NISLANDS_SMC_SWSTATE *smc_state)
2632 {
2633 struct evergreen_power_info *eg_pi = evergreen_get_pi(rdev);
2634 struct ni_power_info *ni_pi = ni_get_pi(rdev);
2635 struct ni_ps *state = ni_get_ps(radeon_state);
2636 int i, ret;
2637 u32 threshold = state->performance_levels[state->performance_level_count - 1].sclk * 100 / 100;
2638
2639 if (!(radeon_state->caps & ATOM_PPLIB_DISALLOW_ON_DC))
2640 smc_state->flags |= PPSMC_SWSTATE_FLAG_DC;
2641
2642 smc_state->levelCount = 0;
2643
2644 if (state->performance_level_count > NISLANDS_MAX_SMC_PERFORMANCE_LEVELS_PER_SWSTATE)
2645 return -EINVAL;
2646
2647 for (i = 0; i < state->performance_level_count; i++) {
2648 ret = ni_convert_power_level_to_smc(rdev, &state->performance_levels[i],
2649 &smc_state->levels[i]);
2650 smc_state->levels[i].arbRefreshState =
2651 (u8)(NISLANDS_DRIVER_STATE_ARB_INDEX + i);
2652
2653 if (ret)
2654 return ret;
2655
2656 if (ni_pi->enable_power_containment)
2657 smc_state->levels[i].displayWatermark =
2658 (state->performance_levels[i].sclk < threshold) ?
2659 PPSMC_DISPLAY_WATERMARK_LOW : PPSMC_DISPLAY_WATERMARK_HIGH;
2660 else
2661 smc_state->levels[i].displayWatermark = (i < 2) ?
2662 PPSMC_DISPLAY_WATERMARK_LOW : PPSMC_DISPLAY_WATERMARK_HIGH;
2663
2664 if (eg_pi->dynamic_ac_timing)
2665 smc_state->levels[i].ACIndex = NISLANDS_MCREGISTERTABLE_FIRST_DRIVERSTATE_SLOT + i;
2666 else
2667 smc_state->levels[i].ACIndex = 0;
2668
2669 smc_state->levelCount++;
2670 }
2671
2672 rv770_write_smc_soft_register(rdev, NI_SMC_SOFT_REGISTER_watermark_threshold,
2673 cpu_to_be32(threshold / 512));
2674
2675 ni_populate_smc_sp(rdev, radeon_state, smc_state);
2676
2677 ret = ni_populate_power_containment_values(rdev, radeon_state, smc_state);
2678 if (ret)
2679 ni_pi->enable_power_containment = false;
2680
2681 ret = ni_populate_sq_ramping_values(rdev, radeon_state, smc_state);
2682 if (ret)
2683 ni_pi->enable_sq_ramping = false;
2684
2685 return ni_populate_smc_t(rdev, radeon_state, smc_state);
2686 }
2687
2688 static int ni_upload_sw_state(struct radeon_device *rdev,
2689 struct radeon_ps *radeon_new_state)
2690 {
2691 struct rv7xx_power_info *pi = rv770_get_pi(rdev);
2692 u16 address = pi->state_table_start +
2693 offsetof(NISLANDS_SMC_STATETABLE, driverState);
2694 u16 state_size = sizeof(NISLANDS_SMC_SWSTATE) +
2695 ((NISLANDS_MAX_SMC_PERFORMANCE_LEVELS_PER_SWSTATE - 1) * sizeof(NISLANDS_SMC_HW_PERFORMANCE_LEVEL));
2696 int ret;
2697 NISLANDS_SMC_SWSTATE *smc_state = kzalloc(state_size, GFP_KERNEL);
2698
2699 if (smc_state == NULL)
2700 return -ENOMEM;
2701
2702 ret = ni_convert_power_state_to_smc(rdev, radeon_new_state, smc_state);
2703 if (ret)
2704 goto done;
2705
2706 ret = rv770_copy_bytes_to_smc(rdev, address, (u8 *)smc_state, state_size, pi->sram_end);
2707
2708 done:
2709 kfree(smc_state);
2710
2711 return ret;
2712 }
2713
2714 static int ni_set_mc_special_registers(struct radeon_device *rdev,
2715 struct ni_mc_reg_table *table)
2716 {
2717 struct rv7xx_power_info *pi = rv770_get_pi(rdev);
2718 u8 i, j, k;
2719 u32 temp_reg;
2720
2721 for (i = 0, j = table->last; i < table->last; i++) {
2722 switch (table->mc_reg_address[i].s1) {
2723 case MC_SEQ_MISC1 >> 2:
2724 if (j >= SMC_NISLANDS_MC_REGISTER_ARRAY_SIZE)
2725 return -EINVAL;
2726 temp_reg = RREG32(MC_PMG_CMD_EMRS);
2727 table->mc_reg_address[j].s1 = MC_PMG_CMD_EMRS >> 2;
2728 table->mc_reg_address[j].s0 = MC_SEQ_PMG_CMD_EMRS_LP >> 2;
2729 for (k = 0; k < table->num_entries; k++)
2730 table->mc_reg_table_entry[k].mc_data[j] =
2731 ((temp_reg & 0xffff0000)) |
2732 ((table->mc_reg_table_entry[k].mc_data[i] & 0xffff0000) >> 16);
2733 j++;
2734 if (j >= SMC_NISLANDS_MC_REGISTER_ARRAY_SIZE)
2735 return -EINVAL;
2736
2737 temp_reg = RREG32(MC_PMG_CMD_MRS);
2738 table->mc_reg_address[j].s1 = MC_PMG_CMD_MRS >> 2;
2739 table->mc_reg_address[j].s0 = MC_SEQ_PMG_CMD_MRS_LP >> 2;
2740 for(k = 0; k < table->num_entries; k++) {
2741 table->mc_reg_table_entry[k].mc_data[j] =
2742 (temp_reg & 0xffff0000) |
2743 (table->mc_reg_table_entry[k].mc_data[i] & 0x0000ffff);
2744 if (!pi->mem_gddr5)
2745 table->mc_reg_table_entry[k].mc_data[j] |= 0x100;
2746 }
2747 j++;
2748 if (j > SMC_NISLANDS_MC_REGISTER_ARRAY_SIZE)
2749 return -EINVAL;
2750 break;
2751 case MC_SEQ_RESERVE_M >> 2:
2752 temp_reg = RREG32(MC_PMG_CMD_MRS1);
2753 table->mc_reg_address[j].s1 = MC_PMG_CMD_MRS1 >> 2;
2754 table->mc_reg_address[j].s0 = MC_SEQ_PMG_CMD_MRS1_LP >> 2;
2755 for (k = 0; k < table->num_entries; k++)
2756 table->mc_reg_table_entry[k].mc_data[j] =
2757 (temp_reg & 0xffff0000) |
2758 (table->mc_reg_table_entry[k].mc_data[i] & 0x0000ffff);
2759 j++;
2760 if (j > SMC_NISLANDS_MC_REGISTER_ARRAY_SIZE)
2761 return -EINVAL;
2762 break;
2763 default:
2764 break;
2765 }
2766 }
2767
2768 table->last = j;
2769
2770 return 0;
2771 }
2772
2773 static bool ni_check_s0_mc_reg_index(u16 in_reg, u16 *out_reg)
2774 {
2775 bool result = true;
2776
2777 switch (in_reg) {
2778 case MC_SEQ_RAS_TIMING >> 2:
2779 *out_reg = MC_SEQ_RAS_TIMING_LP >> 2;
2780 break;
2781 case MC_SEQ_CAS_TIMING >> 2:
2782 *out_reg = MC_SEQ_CAS_TIMING_LP >> 2;
2783 break;
2784 case MC_SEQ_MISC_TIMING >> 2:
2785 *out_reg = MC_SEQ_MISC_TIMING_LP >> 2;
2786 break;
2787 case MC_SEQ_MISC_TIMING2 >> 2:
2788 *out_reg = MC_SEQ_MISC_TIMING2_LP >> 2;
2789 break;
2790 case MC_SEQ_RD_CTL_D0 >> 2:
2791 *out_reg = MC_SEQ_RD_CTL_D0_LP >> 2;
2792 break;
2793 case MC_SEQ_RD_CTL_D1 >> 2:
2794 *out_reg = MC_SEQ_RD_CTL_D1_LP >> 2;
2795 break;
2796 case MC_SEQ_WR_CTL_D0 >> 2:
2797 *out_reg = MC_SEQ_WR_CTL_D0_LP >> 2;
2798 break;
2799 case MC_SEQ_WR_CTL_D1 >> 2:
2800 *out_reg = MC_SEQ_WR_CTL_D1_LP >> 2;
2801 break;
2802 case MC_PMG_CMD_EMRS >> 2:
2803 *out_reg = MC_SEQ_PMG_CMD_EMRS_LP >> 2;
2804 break;
2805 case MC_PMG_CMD_MRS >> 2:
2806 *out_reg = MC_SEQ_PMG_CMD_MRS_LP >> 2;
2807 break;
2808 case MC_PMG_CMD_MRS1 >> 2:
2809 *out_reg = MC_SEQ_PMG_CMD_MRS1_LP >> 2;
2810 break;
2811 case MC_SEQ_PMG_TIMING >> 2:
2812 *out_reg = MC_SEQ_PMG_TIMING_LP >> 2;
2813 break;
2814 case MC_PMG_CMD_MRS2 >> 2:
2815 *out_reg = MC_SEQ_PMG_CMD_MRS2_LP >> 2;
2816 break;
2817 default:
2818 result = false;
2819 break;
2820 }
2821
2822 return result;
2823 }
2824
2825 static void ni_set_valid_flag(struct ni_mc_reg_table *table)
2826 {
2827 u8 i, j;
2828
2829 for (i = 0; i < table->last; i++) {
2830 for (j = 1; j < table->num_entries; j++) {
2831 if (table->mc_reg_table_entry[j-1].mc_data[i] != table->mc_reg_table_entry[j].mc_data[i]) {
2832 table->valid_flag |= 1 << i;
2833 break;
2834 }
2835 }
2836 }
2837 }
2838
2839 static void ni_set_s0_mc_reg_index(struct ni_mc_reg_table *table)
2840 {
2841 u32 i;
2842 u16 address;
2843
2844 for (i = 0; i < table->last; i++)
2845 table->mc_reg_address[i].s0 =
2846 ni_check_s0_mc_reg_index(table->mc_reg_address[i].s1, &address) ?
2847 address : table->mc_reg_address[i].s1;
2848 }
2849
2850 static int ni_copy_vbios_mc_reg_table(struct atom_mc_reg_table *table,
2851 struct ni_mc_reg_table *ni_table)
2852 {
2853 u8 i, j;
2854
2855 if (table->last > SMC_NISLANDS_MC_REGISTER_ARRAY_SIZE)
2856 return -EINVAL;
2857 if (table->num_entries > MAX_AC_TIMING_ENTRIES)
2858 return -EINVAL;
2859
2860 for (i = 0; i < table->last; i++)
2861 ni_table->mc_reg_address[i].s1 = table->mc_reg_address[i].s1;
2862 ni_table->last = table->last;
2863
2864 for (i = 0; i < table->num_entries; i++) {
2865 ni_table->mc_reg_table_entry[i].mclk_max =
2866 table->mc_reg_table_entry[i].mclk_max;
2867 for (j = 0; j < table->last; j++)
2868 ni_table->mc_reg_table_entry[i].mc_data[j] =
2869 table->mc_reg_table_entry[i].mc_data[j];
2870 }
2871 ni_table->num_entries = table->num_entries;
2872
2873 return 0;
2874 }
2875
2876 static int ni_initialize_mc_reg_table(struct radeon_device *rdev)
2877 {
2878 struct ni_power_info *ni_pi = ni_get_pi(rdev);
2879 int ret;
2880 struct atom_mc_reg_table *table;
2881 struct ni_mc_reg_table *ni_table = &ni_pi->mc_reg_table;
2882 u8 module_index = rv770_get_memory_module_index(rdev);
2883
2884 table = kzalloc(sizeof(struct atom_mc_reg_table), GFP_KERNEL);
2885 if (!table)
2886 return -ENOMEM;
2887
2888 WREG32(MC_SEQ_RAS_TIMING_LP, RREG32(MC_SEQ_RAS_TIMING));
2889 WREG32(MC_SEQ_CAS_TIMING_LP, RREG32(MC_SEQ_CAS_TIMING));
2890 WREG32(MC_SEQ_MISC_TIMING_LP, RREG32(MC_SEQ_MISC_TIMING));
2891 WREG32(MC_SEQ_MISC_TIMING2_LP, RREG32(MC_SEQ_MISC_TIMING2));
2892 WREG32(MC_SEQ_PMG_CMD_EMRS_LP, RREG32(MC_PMG_CMD_EMRS));
2893 WREG32(MC_SEQ_PMG_CMD_MRS_LP, RREG32(MC_PMG_CMD_MRS));
2894 WREG32(MC_SEQ_PMG_CMD_MRS1_LP, RREG32(MC_PMG_CMD_MRS1));
2895 WREG32(MC_SEQ_WR_CTL_D0_LP, RREG32(MC_SEQ_WR_CTL_D0));
2896 WREG32(MC_SEQ_WR_CTL_D1_LP, RREG32(MC_SEQ_WR_CTL_D1));
2897 WREG32(MC_SEQ_RD_CTL_D0_LP, RREG32(MC_SEQ_RD_CTL_D0));
2898 WREG32(MC_SEQ_RD_CTL_D1_LP, RREG32(MC_SEQ_RD_CTL_D1));
2899 WREG32(MC_SEQ_PMG_TIMING_LP, RREG32(MC_SEQ_PMG_TIMING));
2900 WREG32(MC_SEQ_PMG_CMD_MRS2_LP, RREG32(MC_PMG_CMD_MRS2));
2901
2902 ret = radeon_atom_init_mc_reg_table(rdev, module_index, table);
2903
2904 if (ret)
2905 goto init_mc_done;
2906
2907 ret = ni_copy_vbios_mc_reg_table(table, ni_table);
2908
2909 if (ret)
2910 goto init_mc_done;
2911
2912 ni_set_s0_mc_reg_index(ni_table);
2913
2914 ret = ni_set_mc_special_registers(rdev, ni_table);
2915
2916 if (ret)
2917 goto init_mc_done;
2918
2919 ni_set_valid_flag(ni_table);
2920
2921 init_mc_done:
2922 kfree(table);
2923
2924 return ret;
2925 }
2926
2927 static void ni_populate_mc_reg_addresses(struct radeon_device *rdev,
2928 SMC_NIslands_MCRegisters *mc_reg_table)
2929 {
2930 struct ni_power_info *ni_pi = ni_get_pi(rdev);
2931 u32 i, j;
2932
2933 for (i = 0, j = 0; j < ni_pi->mc_reg_table.last; j++) {
2934 if (ni_pi->mc_reg_table.valid_flag & (1 << j)) {
2935 if (i >= SMC_NISLANDS_MC_REGISTER_ARRAY_SIZE)
2936 break;
2937 mc_reg_table->address[i].s0 =
2938 cpu_to_be16(ni_pi->mc_reg_table.mc_reg_address[j].s0);
2939 mc_reg_table->address[i].s1 =
2940 cpu_to_be16(ni_pi->mc_reg_table.mc_reg_address[j].s1);
2941 i++;
2942 }
2943 }
2944 mc_reg_table->last = (u8)i;
2945 }
2946
2947
2948 static void ni_convert_mc_registers(struct ni_mc_reg_entry *entry,
2949 SMC_NIslands_MCRegisterSet *data,
2950 u32 num_entries, u32 valid_flag)
2951 {
2952 u32 i, j;
2953
2954 for (i = 0, j = 0; j < num_entries; j++) {
2955 if (valid_flag & (1 << j)) {
2956 data->value[i] = cpu_to_be32(entry->mc_data[j]);
2957 i++;
2958 }
2959 }
2960 }
2961
2962 static void ni_convert_mc_reg_table_entry_to_smc(struct radeon_device *rdev,
2963 struct rv7xx_pl *pl,
2964 SMC_NIslands_MCRegisterSet *mc_reg_table_data)
2965 {
2966 struct ni_power_info *ni_pi = ni_get_pi(rdev);
2967 u32 i = 0;
2968
2969 for (i = 0; i < ni_pi->mc_reg_table.num_entries; i++) {
2970 if (pl->mclk <= ni_pi->mc_reg_table.mc_reg_table_entry[i].mclk_max)
2971 break;
2972 }
2973
2974 if ((i == ni_pi->mc_reg_table.num_entries) && (i > 0))
2975 --i;
2976
2977 ni_convert_mc_registers(&ni_pi->mc_reg_table.mc_reg_table_entry[i],
2978 mc_reg_table_data,
2979 ni_pi->mc_reg_table.last,
2980 ni_pi->mc_reg_table.valid_flag);
2981 }
2982
2983 static void ni_convert_mc_reg_table_to_smc(struct radeon_device *rdev,
2984 struct radeon_ps *radeon_state,
2985 SMC_NIslands_MCRegisters *mc_reg_table)
2986 {
2987 struct ni_ps *state = ni_get_ps(radeon_state);
2988 int i;
2989
2990 for (i = 0; i < state->performance_level_count; i++) {
2991 ni_convert_mc_reg_table_entry_to_smc(rdev,
2992 &state->performance_levels[i],
2993 &mc_reg_table->data[NISLANDS_MCREGISTERTABLE_FIRST_DRIVERSTATE_SLOT + i]);
2994 }
2995 }
2996
2997 static int ni_populate_mc_reg_table(struct radeon_device *rdev,
2998 struct radeon_ps *radeon_boot_state)
2999 {
3000 struct rv7xx_power_info *pi = rv770_get_pi(rdev);
3001 struct evergreen_power_info *eg_pi = evergreen_get_pi(rdev);
3002 struct ni_power_info *ni_pi = ni_get_pi(rdev);
3003 struct ni_ps *boot_state = ni_get_ps(radeon_boot_state);
3004 SMC_NIslands_MCRegisters *mc_reg_table = &ni_pi->smc_mc_reg_table;
3005
3006 memset(mc_reg_table, 0, sizeof(SMC_NIslands_MCRegisters));
3007
3008 rv770_write_smc_soft_register(rdev, NI_SMC_SOFT_REGISTER_seq_index, 1);
3009
3010 ni_populate_mc_reg_addresses(rdev, mc_reg_table);
3011
3012 ni_convert_mc_reg_table_entry_to_smc(rdev, &boot_state->performance_levels[0],
3013 &mc_reg_table->data[0]);
3014
3015 ni_convert_mc_registers(&ni_pi->mc_reg_table.mc_reg_table_entry[0],
3016 &mc_reg_table->data[1],
3017 ni_pi->mc_reg_table.last,
3018 ni_pi->mc_reg_table.valid_flag);
3019
3020 ni_convert_mc_reg_table_to_smc(rdev, radeon_boot_state, mc_reg_table);
3021
3022 return rv770_copy_bytes_to_smc(rdev, eg_pi->mc_reg_table_start,
3023 (u8 *)mc_reg_table,
3024 sizeof(SMC_NIslands_MCRegisters),
3025 pi->sram_end);
3026 }
3027
3028 static int ni_upload_mc_reg_table(struct radeon_device *rdev,
3029 struct radeon_ps *radeon_new_state)
3030 {
3031 struct rv7xx_power_info *pi = rv770_get_pi(rdev);
3032 struct evergreen_power_info *eg_pi = evergreen_get_pi(rdev);
3033 struct ni_power_info *ni_pi = ni_get_pi(rdev);
3034 struct ni_ps *ni_new_state = ni_get_ps(radeon_new_state);
3035 SMC_NIslands_MCRegisters *mc_reg_table = &ni_pi->smc_mc_reg_table;
3036 u16 address;
3037
3038 memset(mc_reg_table, 0, sizeof(SMC_NIslands_MCRegisters));
3039
3040 ni_convert_mc_reg_table_to_smc(rdev, radeon_new_state, mc_reg_table);
3041
3042 address = eg_pi->mc_reg_table_start +
3043 (u16)offsetof(SMC_NIslands_MCRegisters, data[NISLANDS_MCREGISTERTABLE_FIRST_DRIVERSTATE_SLOT]);
3044
3045 return rv770_copy_bytes_to_smc(rdev, address,
3046 (u8 *)&mc_reg_table->data[NISLANDS_MCREGISTERTABLE_FIRST_DRIVERSTATE_SLOT],
3047 sizeof(SMC_NIslands_MCRegisterSet) * ni_new_state->performance_level_count,
3048 pi->sram_end);
3049 }
3050
3051 static int ni_init_driver_calculated_leakage_table(struct radeon_device *rdev,
3052 PP_NIslands_CACTABLES *cac_tables)
3053 {
3054 struct ni_power_info *ni_pi = ni_get_pi(rdev);
3055 struct evergreen_power_info *eg_pi = evergreen_get_pi(rdev);
3056 u32 leakage = 0;
3057 unsigned int i, j, table_size;
3058 s32 t;
3059 u32 smc_leakage, max_leakage = 0;
3060 u32 scaling_factor;
3061
3062 table_size = eg_pi->vddc_voltage_table.count;
3063
3064 if (SMC_NISLANDS_LKGE_LUT_NUM_OF_VOLT_ENTRIES < table_size)
3065 table_size = SMC_NISLANDS_LKGE_LUT_NUM_OF_VOLT_ENTRIES;
3066
3067 scaling_factor = ni_get_smc_power_scaling_factor(rdev);
3068
3069 for (i = 0; i < SMC_NISLANDS_LKGE_LUT_NUM_OF_TEMP_ENTRIES; i++) {
3070 for (j = 0; j < table_size; j++) {
3071 t = (1000 * ((i + 1) * 8));
3072
3073 if (t < ni_pi->cac_data.leakage_minimum_temperature)
3074 t = ni_pi->cac_data.leakage_minimum_temperature;
3075
3076 ni_calculate_leakage_for_v_and_t(rdev,
3077 &ni_pi->cac_data.leakage_coefficients,
3078 eg_pi->vddc_voltage_table.entries[j].value,
3079 t,
3080 ni_pi->cac_data.i_leakage,
3081 &leakage);
3082
3083 smc_leakage = ni_scale_power_for_smc(leakage, scaling_factor) / 1000;
3084 if (smc_leakage > max_leakage)
3085 max_leakage = smc_leakage;
3086
3087 cac_tables->cac_lkge_lut[i][j] = cpu_to_be32(smc_leakage);
3088 }
3089 }
3090
3091 for (j = table_size; j < SMC_NISLANDS_LKGE_LUT_NUM_OF_VOLT_ENTRIES; j++) {
3092 for (i = 0; i < SMC_NISLANDS_LKGE_LUT_NUM_OF_TEMP_ENTRIES; i++)
3093 cac_tables->cac_lkge_lut[i][j] = cpu_to_be32(max_leakage);
3094 }
3095 return 0;
3096 }
3097
3098 static int ni_init_simplified_leakage_table(struct radeon_device *rdev,
3099 PP_NIslands_CACTABLES *cac_tables)
3100 {
3101 struct evergreen_power_info *eg_pi = evergreen_get_pi(rdev);
3102 struct radeon_cac_leakage_table *leakage_table =
3103 &rdev->pm.dpm.dyn_state.cac_leakage_table;
3104 u32 i, j, table_size;
3105 u32 smc_leakage, max_leakage = 0;
3106 u32 scaling_factor;
3107
3108 if (!leakage_table)
3109 return -EINVAL;
3110
3111 table_size = leakage_table->count;
3112
3113 if (eg_pi->vddc_voltage_table.count != table_size)
3114 table_size = (eg_pi->vddc_voltage_table.count < leakage_table->count) ?
3115 eg_pi->vddc_voltage_table.count : leakage_table->count;
3116
3117 if (SMC_NISLANDS_LKGE_LUT_NUM_OF_VOLT_ENTRIES < table_size)
3118 table_size = SMC_NISLANDS_LKGE_LUT_NUM_OF_VOLT_ENTRIES;
3119
3120 if (table_size == 0)
3121 return -EINVAL;
3122
3123 scaling_factor = ni_get_smc_power_scaling_factor(rdev);
3124
3125 for (j = 0; j < table_size; j++) {
3126 smc_leakage = leakage_table->entries[j].leakage;
3127
3128 if (smc_leakage > max_leakage)
3129 max_leakage = smc_leakage;
3130
3131 for (i = 0; i < SMC_NISLANDS_LKGE_LUT_NUM_OF_TEMP_ENTRIES; i++)
3132 cac_tables->cac_lkge_lut[i][j] =
3133 cpu_to_be32(ni_scale_power_for_smc(smc_leakage, scaling_factor));
3134 }
3135
3136 for (j = table_size; j < SMC_NISLANDS_LKGE_LUT_NUM_OF_VOLT_ENTRIES; j++) {
3137 for (i = 0; i < SMC_NISLANDS_LKGE_LUT_NUM_OF_TEMP_ENTRIES; i++)
3138 cac_tables->cac_lkge_lut[i][j] =
3139 cpu_to_be32(ni_scale_power_for_smc(max_leakage, scaling_factor));
3140 }
3141 return 0;
3142 }
3143
3144 static int ni_initialize_smc_cac_tables(struct radeon_device *rdev)
3145 {
3146 struct rv7xx_power_info *pi = rv770_get_pi(rdev);
3147 struct ni_power_info *ni_pi = ni_get_pi(rdev);
3148 PP_NIslands_CACTABLES *cac_tables = NULL;
3149 int i, ret;
3150 u32 reg;
3151
3152 if (ni_pi->enable_cac == false)
3153 return 0;
3154
3155 cac_tables = kzalloc(sizeof(PP_NIslands_CACTABLES), GFP_KERNEL);
3156 if (!cac_tables)
3157 return -ENOMEM;
3158
3159 reg = RREG32(CG_CAC_CTRL) & ~(TID_CNT_MASK | TID_UNIT_MASK);
3160 reg |= (TID_CNT(ni_pi->cac_weights->tid_cnt) |
3161 TID_UNIT(ni_pi->cac_weights->tid_unit));
3162 WREG32(CG_CAC_CTRL, reg);
3163
3164 for (i = 0; i < NISLANDS_DCCAC_MAX_LEVELS; i++)
3165 ni_pi->dc_cac_table[i] = ni_pi->cac_weights->dc_cac[i];
3166
3167 for (i = 0; i < SMC_NISLANDS_BIF_LUT_NUM_OF_ENTRIES; i++)
3168 cac_tables->cac_bif_lut[i] = ni_pi->cac_weights->pcie_cac[i];
3169
3170 ni_pi->cac_data.i_leakage = rdev->pm.dpm.cac_leakage;
3171 ni_pi->cac_data.pwr_const = 0;
3172 ni_pi->cac_data.dc_cac_value = ni_pi->dc_cac_table[NISLANDS_DCCAC_LEVEL_0];
3173 ni_pi->cac_data.bif_cac_value = 0;
3174 ni_pi->cac_data.mc_wr_weight = ni_pi->cac_weights->mc_write_weight;
3175 ni_pi->cac_data.mc_rd_weight = ni_pi->cac_weights->mc_read_weight;
3176 ni_pi->cac_data.allow_ovrflw = 0;
3177 ni_pi->cac_data.l2num_win_tdp = ni_pi->lta_window_size;
3178 ni_pi->cac_data.num_win_tdp = 0;
3179 ni_pi->cac_data.lts_truncate_n = ni_pi->lts_truncate;
3180
3181 if (ni_pi->driver_calculate_cac_leakage)
3182 ret = ni_init_driver_calculated_leakage_table(rdev, cac_tables);
3183 else
3184 ret = ni_init_simplified_leakage_table(rdev, cac_tables);
3185
3186 if (ret)
3187 goto done_free;
3188
3189 cac_tables->pwr_const = cpu_to_be32(ni_pi->cac_data.pwr_const);
3190 cac_tables->dc_cacValue = cpu_to_be32(ni_pi->cac_data.dc_cac_value);
3191 cac_tables->bif_cacValue = cpu_to_be32(ni_pi->cac_data.bif_cac_value);
3192 cac_tables->AllowOvrflw = ni_pi->cac_data.allow_ovrflw;
3193 cac_tables->MCWrWeight = ni_pi->cac_data.mc_wr_weight;
3194 cac_tables->MCRdWeight = ni_pi->cac_data.mc_rd_weight;
3195 cac_tables->numWin_TDP = ni_pi->cac_data.num_win_tdp;
3196 cac_tables->l2numWin_TDP = ni_pi->cac_data.l2num_win_tdp;
3197 cac_tables->lts_truncate_n = ni_pi->cac_data.lts_truncate_n;
3198
3199 ret = rv770_copy_bytes_to_smc(rdev, ni_pi->cac_table_start, (u8 *)cac_tables,
3200 sizeof(PP_NIslands_CACTABLES), pi->sram_end);
3201
3202 done_free:
3203 if (ret) {
3204 ni_pi->enable_cac = false;
3205 ni_pi->enable_power_containment = false;
3206 }
3207
3208 kfree(cac_tables);
3209
3210 return 0;
3211 }
3212
3213 static int ni_initialize_hardware_cac_manager(struct radeon_device *rdev)
3214 {
3215 struct ni_power_info *ni_pi = ni_get_pi(rdev);
3216 u32 reg;
3217
3218 if (!ni_pi->enable_cac ||
3219 !ni_pi->cac_configuration_required)
3220 return 0;
3221
3222 if (ni_pi->cac_weights == NULL)
3223 return -EINVAL;
3224
3225 reg = RREG32_CG(CG_CAC_REGION_1_WEIGHT_0) & ~(WEIGHT_TCP_SIG0_MASK |
3226 WEIGHT_TCP_SIG1_MASK |
3227 WEIGHT_TA_SIG_MASK);
3228 reg |= (WEIGHT_TCP_SIG0(ni_pi->cac_weights->weight_tcp_sig0) |
3229 WEIGHT_TCP_SIG1(ni_pi->cac_weights->weight_tcp_sig1) |
3230 WEIGHT_TA_SIG(ni_pi->cac_weights->weight_ta_sig));
3231 WREG32_CG(CG_CAC_REGION_1_WEIGHT_0, reg);
3232
3233 reg = RREG32_CG(CG_CAC_REGION_1_WEIGHT_1) & ~(WEIGHT_TCC_EN0_MASK |
3234 WEIGHT_TCC_EN1_MASK |
3235 WEIGHT_TCC_EN2_MASK);
3236 reg |= (WEIGHT_TCC_EN0(ni_pi->cac_weights->weight_tcc_en0) |
3237 WEIGHT_TCC_EN1(ni_pi->cac_weights->weight_tcc_en1) |
3238 WEIGHT_TCC_EN2(ni_pi->cac_weights->weight_tcc_en2));
3239 WREG32_CG(CG_CAC_REGION_1_WEIGHT_1, reg);
3240
3241 reg = RREG32_CG(CG_CAC_REGION_2_WEIGHT_0) & ~(WEIGHT_CB_EN0_MASK |
3242 WEIGHT_CB_EN1_MASK |
3243 WEIGHT_CB_EN2_MASK |
3244 WEIGHT_CB_EN3_MASK);
3245 reg |= (WEIGHT_CB_EN0(ni_pi->cac_weights->weight_cb_en0) |
3246 WEIGHT_CB_EN1(ni_pi->cac_weights->weight_cb_en1) |
3247 WEIGHT_CB_EN2(ni_pi->cac_weights->weight_cb_en2) |
3248 WEIGHT_CB_EN3(ni_pi->cac_weights->weight_cb_en3));
3249 WREG32_CG(CG_CAC_REGION_2_WEIGHT_0, reg);
3250
3251 reg = RREG32_CG(CG_CAC_REGION_2_WEIGHT_1) & ~(WEIGHT_DB_SIG0_MASK |
3252 WEIGHT_DB_SIG1_MASK |
3253 WEIGHT_DB_SIG2_MASK |
3254 WEIGHT_DB_SIG3_MASK);
3255 reg |= (WEIGHT_DB_SIG0(ni_pi->cac_weights->weight_db_sig0) |
3256 WEIGHT_DB_SIG1(ni_pi->cac_weights->weight_db_sig1) |
3257 WEIGHT_DB_SIG2(ni_pi->cac_weights->weight_db_sig2) |
3258 WEIGHT_DB_SIG3(ni_pi->cac_weights->weight_db_sig3));
3259 WREG32_CG(CG_CAC_REGION_2_WEIGHT_1, reg);
3260
3261 reg = RREG32_CG(CG_CAC_REGION_2_WEIGHT_2) & ~(WEIGHT_SXM_SIG0_MASK |
3262 WEIGHT_SXM_SIG1_MASK |
3263 WEIGHT_SXM_SIG2_MASK |
3264 WEIGHT_SXS_SIG0_MASK |
3265 WEIGHT_SXS_SIG1_MASK);
3266 reg |= (WEIGHT_SXM_SIG0(ni_pi->cac_weights->weight_sxm_sig0) |
3267 WEIGHT_SXM_SIG1(ni_pi->cac_weights->weight_sxm_sig1) |
3268 WEIGHT_SXM_SIG2(ni_pi->cac_weights->weight_sxm_sig2) |
3269 WEIGHT_SXS_SIG0(ni_pi->cac_weights->weight_sxs_sig0) |
3270 WEIGHT_SXS_SIG1(ni_pi->cac_weights->weight_sxs_sig1));
3271 WREG32_CG(CG_CAC_REGION_2_WEIGHT_2, reg);
3272
3273 reg = RREG32_CG(CG_CAC_REGION_3_WEIGHT_0) & ~(WEIGHT_XBR_0_MASK |
3274 WEIGHT_XBR_1_MASK |
3275 WEIGHT_XBR_2_MASK |
3276 WEIGHT_SPI_SIG0_MASK);
3277 reg |= (WEIGHT_XBR_0(ni_pi->cac_weights->weight_xbr_0) |
3278 WEIGHT_XBR_1(ni_pi->cac_weights->weight_xbr_1) |
3279 WEIGHT_XBR_2(ni_pi->cac_weights->weight_xbr_2) |
3280 WEIGHT_SPI_SIG0(ni_pi->cac_weights->weight_spi_sig0));
3281 WREG32_CG(CG_CAC_REGION_3_WEIGHT_0, reg);
3282
3283 reg = RREG32_CG(CG_CAC_REGION_3_WEIGHT_1) & ~(WEIGHT_SPI_SIG1_MASK |
3284 WEIGHT_SPI_SIG2_MASK |
3285 WEIGHT_SPI_SIG3_MASK |
3286 WEIGHT_SPI_SIG4_MASK |
3287 WEIGHT_SPI_SIG5_MASK);
3288 reg |= (WEIGHT_SPI_SIG1(ni_pi->cac_weights->weight_spi_sig1) |
3289 WEIGHT_SPI_SIG2(ni_pi->cac_weights->weight_spi_sig2) |
3290 WEIGHT_SPI_SIG3(ni_pi->cac_weights->weight_spi_sig3) |
3291 WEIGHT_SPI_SIG4(ni_pi->cac_weights->weight_spi_sig4) |
3292 WEIGHT_SPI_SIG5(ni_pi->cac_weights->weight_spi_sig5));
3293 WREG32_CG(CG_CAC_REGION_3_WEIGHT_1, reg);
3294
3295 reg = RREG32_CG(CG_CAC_REGION_4_WEIGHT_0) & ~(WEIGHT_LDS_SIG0_MASK |
3296 WEIGHT_LDS_SIG1_MASK |
3297 WEIGHT_SC_MASK);
3298 reg |= (WEIGHT_LDS_SIG0(ni_pi->cac_weights->weight_lds_sig0) |
3299 WEIGHT_LDS_SIG1(ni_pi->cac_weights->weight_lds_sig1) |
3300 WEIGHT_SC(ni_pi->cac_weights->weight_sc));
3301 WREG32_CG(CG_CAC_REGION_4_WEIGHT_0, reg);
3302
3303 reg = RREG32_CG(CG_CAC_REGION_4_WEIGHT_1) & ~(WEIGHT_BIF_MASK |
3304 WEIGHT_CP_MASK |
3305 WEIGHT_PA_SIG0_MASK |
3306 WEIGHT_PA_SIG1_MASK |
3307 WEIGHT_VGT_SIG0_MASK);
3308 reg |= (WEIGHT_BIF(ni_pi->cac_weights->weight_bif) |
3309 WEIGHT_CP(ni_pi->cac_weights->weight_cp) |
3310 WEIGHT_PA_SIG0(ni_pi->cac_weights->weight_pa_sig0) |
3311 WEIGHT_PA_SIG1(ni_pi->cac_weights->weight_pa_sig1) |
3312 WEIGHT_VGT_SIG0(ni_pi->cac_weights->weight_vgt_sig0));
3313 WREG32_CG(CG_CAC_REGION_4_WEIGHT_1, reg);
3314
3315 reg = RREG32_CG(CG_CAC_REGION_4_WEIGHT_2) & ~(WEIGHT_VGT_SIG1_MASK |
3316 WEIGHT_VGT_SIG2_MASK |
3317 WEIGHT_DC_SIG0_MASK |
3318 WEIGHT_DC_SIG1_MASK |
3319 WEIGHT_DC_SIG2_MASK);
3320 reg |= (WEIGHT_VGT_SIG1(ni_pi->cac_weights->weight_vgt_sig1) |
3321 WEIGHT_VGT_SIG2(ni_pi->cac_weights->weight_vgt_sig2) |
3322 WEIGHT_DC_SIG0(ni_pi->cac_weights->weight_dc_sig0) |
3323 WEIGHT_DC_SIG1(ni_pi->cac_weights->weight_dc_sig1) |
3324 WEIGHT_DC_SIG2(ni_pi->cac_weights->weight_dc_sig2));
3325 WREG32_CG(CG_CAC_REGION_4_WEIGHT_2, reg);
3326
3327 reg = RREG32_CG(CG_CAC_REGION_4_WEIGHT_3) & ~(WEIGHT_DC_SIG3_MASK |
3328 WEIGHT_UVD_SIG0_MASK |
3329 WEIGHT_UVD_SIG1_MASK |
3330 WEIGHT_SPARE0_MASK |
3331 WEIGHT_SPARE1_MASK);
3332 reg |= (WEIGHT_DC_SIG3(ni_pi->cac_weights->weight_dc_sig3) |
3333 WEIGHT_UVD_SIG0(ni_pi->cac_weights->weight_uvd_sig0) |
3334 WEIGHT_UVD_SIG1(ni_pi->cac_weights->weight_uvd_sig1) |
3335 WEIGHT_SPARE0(ni_pi->cac_weights->weight_spare0) |
3336 WEIGHT_SPARE1(ni_pi->cac_weights->weight_spare1));
3337 WREG32_CG(CG_CAC_REGION_4_WEIGHT_3, reg);
3338
3339 reg = RREG32_CG(CG_CAC_REGION_5_WEIGHT_0) & ~(WEIGHT_SQ_VSP_MASK |
3340 WEIGHT_SQ_VSP0_MASK);
3341 reg |= (WEIGHT_SQ_VSP(ni_pi->cac_weights->weight_sq_vsp) |
3342 WEIGHT_SQ_VSP0(ni_pi->cac_weights->weight_sq_vsp0));
3343 WREG32_CG(CG_CAC_REGION_5_WEIGHT_0, reg);
3344
3345 reg = RREG32_CG(CG_CAC_REGION_5_WEIGHT_1) & ~(WEIGHT_SQ_GPR_MASK);
3346 reg |= WEIGHT_SQ_GPR(ni_pi->cac_weights->weight_sq_gpr);
3347 WREG32_CG(CG_CAC_REGION_5_WEIGHT_1, reg);
3348
3349 reg = RREG32_CG(CG_CAC_REGION_4_OVERRIDE_4) & ~(OVR_MODE_SPARE_0_MASK |
3350 OVR_VAL_SPARE_0_MASK |
3351 OVR_MODE_SPARE_1_MASK |
3352 OVR_VAL_SPARE_1_MASK);
3353 reg |= (OVR_MODE_SPARE_0(ni_pi->cac_weights->ovr_mode_spare_0) |
3354 OVR_VAL_SPARE_0(ni_pi->cac_weights->ovr_val_spare_0) |
3355 OVR_MODE_SPARE_1(ni_pi->cac_weights->ovr_mode_spare_1) |
3356 OVR_VAL_SPARE_1(ni_pi->cac_weights->ovr_val_spare_1));
3357 WREG32_CG(CG_CAC_REGION_4_OVERRIDE_4, reg);
3358
3359 reg = RREG32(SQ_CAC_THRESHOLD) & ~(VSP_MASK |
3360 VSP0_MASK |
3361 GPR_MASK);
3362 reg |= (VSP(ni_pi->cac_weights->vsp) |
3363 VSP0(ni_pi->cac_weights->vsp0) |
3364 GPR(ni_pi->cac_weights->gpr));
3365 WREG32(SQ_CAC_THRESHOLD, reg);
3366
3367 reg = (MCDW_WR_ENABLE |
3368 MCDX_WR_ENABLE |
3369 MCDY_WR_ENABLE |
3370 MCDZ_WR_ENABLE |
3371 INDEX(0x09D4));
3372 WREG32(MC_CG_CONFIG, reg);
3373
3374 reg = (READ_WEIGHT(ni_pi->cac_weights->mc_read_weight) |
3375 WRITE_WEIGHT(ni_pi->cac_weights->mc_write_weight) |
3376 ALLOW_OVERFLOW);
3377 WREG32(MC_CG_DATAPORT, reg);
3378
3379 return 0;
3380 }
3381
3382 static int ni_enable_smc_cac(struct radeon_device *rdev,
3383 struct radeon_ps *radeon_new_state,
3384 bool enable)
3385 {
3386 struct ni_power_info *ni_pi = ni_get_pi(rdev);
3387 int ret = 0;
3388 PPSMC_Result smc_result;
3389
3390 if (ni_pi->enable_cac) {
3391 if (enable) {
3392 if (!r600_is_uvd_state(radeon_new_state->class, radeon_new_state->class2)) {
3393 smc_result = rv770_send_msg_to_smc(rdev, PPSMC_MSG_CollectCAC_PowerCorreln);
3394
3395 if (ni_pi->support_cac_long_term_average) {
3396 smc_result = rv770_send_msg_to_smc(rdev, PPSMC_CACLongTermAvgEnable);
3397 if (PPSMC_Result_OK != smc_result)
3398 ni_pi->support_cac_long_term_average = false;
3399 }
3400
3401 smc_result = rv770_send_msg_to_smc(rdev, PPSMC_MSG_EnableCac);
3402 if (PPSMC_Result_OK != smc_result)
3403 ret = -EINVAL;
3404
3405 ni_pi->cac_enabled = (PPSMC_Result_OK == smc_result) ? true : false;
3406 }
3407 } else if (ni_pi->cac_enabled) {
3408 smc_result = rv770_send_msg_to_smc(rdev, PPSMC_MSG_DisableCac);
3409
3410 ni_pi->cac_enabled = false;
3411
3412 if (ni_pi->support_cac_long_term_average) {
3413 smc_result = rv770_send_msg_to_smc(rdev, PPSMC_CACLongTermAvgDisable);
3414 if (PPSMC_Result_OK != smc_result)
3415 ni_pi->support_cac_long_term_average = false;
3416 }
3417 }
3418 }
3419
3420 return ret;
3421 }
3422
3423 static int ni_pcie_performance_request(struct radeon_device *rdev,
3424 u8 perf_req, bool advertise)
3425 {
3426 #if defined(CONFIG_ACPI)
3427 struct evergreen_power_info *eg_pi = evergreen_get_pi(rdev);
3428
3429 if ((perf_req == PCIE_PERF_REQ_PECI_GEN1) ||
3430 (perf_req == PCIE_PERF_REQ_PECI_GEN2)) {
3431 if (eg_pi->pcie_performance_request_registered == false)
3432 radeon_acpi_pcie_notify_device_ready(rdev);
3433 eg_pi->pcie_performance_request_registered = true;
3434 return radeon_acpi_pcie_performance_request(rdev, perf_req, advertise);
3435 } else if ((perf_req == PCIE_PERF_REQ_REMOVE_REGISTRY) &&
3436 eg_pi->pcie_performance_request_registered) {
3437 eg_pi->pcie_performance_request_registered = false;
3438 return radeon_acpi_pcie_performance_request(rdev, perf_req, advertise);
3439 }
3440 #endif
3441 return 0;
3442 }
3443
3444 static int ni_advertise_gen2_capability(struct radeon_device *rdev)
3445 {
3446 struct rv7xx_power_info *pi = rv770_get_pi(rdev);
3447 u32 tmp;
3448
3449 tmp = RREG32_PCIE_PORT(PCIE_LC_SPEED_CNTL);
3450
3451 if ((tmp & LC_OTHER_SIDE_EVER_SENT_GEN2) &&
3452 (tmp & LC_OTHER_SIDE_SUPPORTS_GEN2))
3453 pi->pcie_gen2 = true;
3454 else
3455 pi->pcie_gen2 = false;
3456
3457 if (!pi->pcie_gen2)
3458 ni_pcie_performance_request(rdev, PCIE_PERF_REQ_PECI_GEN2, true);
3459
3460 return 0;
3461 }
3462
3463 static void ni_enable_bif_dynamic_pcie_gen2(struct radeon_device *rdev,
3464 bool enable)
3465 {
3466 struct rv7xx_power_info *pi = rv770_get_pi(rdev);
3467 u32 tmp, bif;
3468
3469 tmp = RREG32_PCIE_PORT(PCIE_LC_SPEED_CNTL);
3470
3471 if ((tmp & LC_OTHER_SIDE_EVER_SENT_GEN2) &&
3472 (tmp & LC_OTHER_SIDE_SUPPORTS_GEN2)) {
3473 if (enable) {
3474 if (!pi->boot_in_gen2) {
3475 bif = RREG32(CG_BIF_REQ_AND_RSP) & ~CG_CLIENT_REQ_MASK;
3476 bif |= CG_CLIENT_REQ(0xd);
3477 WREG32(CG_BIF_REQ_AND_RSP, bif);
3478 }
3479 tmp &= ~LC_HW_VOLTAGE_IF_CONTROL_MASK;
3480 tmp |= LC_HW_VOLTAGE_IF_CONTROL(1);
3481 tmp |= LC_GEN2_EN_STRAP;
3482
3483 tmp |= LC_CLR_FAILED_SPD_CHANGE_CNT;
3484 WREG32_PCIE_PORT(PCIE_LC_SPEED_CNTL, tmp);
3485 udelay(10);
3486 tmp &= ~LC_CLR_FAILED_SPD_CHANGE_CNT;
3487 WREG32_PCIE_PORT(PCIE_LC_SPEED_CNTL, tmp);
3488 } else {
3489 if (!pi->boot_in_gen2) {
3490 bif = RREG32(CG_BIF_REQ_AND_RSP) & ~CG_CLIENT_REQ_MASK;
3491 bif |= CG_CLIENT_REQ(0xd);
3492 WREG32(CG_BIF_REQ_AND_RSP, bif);
3493
3494 tmp &= ~LC_HW_VOLTAGE_IF_CONTROL_MASK;
3495 tmp &= ~LC_GEN2_EN_STRAP;
3496 }
3497 WREG32_PCIE_PORT(PCIE_LC_SPEED_CNTL, tmp);
3498 }
3499 }
3500 }
3501
3502 static void ni_enable_dynamic_pcie_gen2(struct radeon_device *rdev,
3503 bool enable)
3504 {
3505 ni_enable_bif_dynamic_pcie_gen2(rdev, enable);
3506
3507 if (enable)
3508 WREG32_P(GENERAL_PWRMGT, ENABLE_GEN2PCIE, ~ENABLE_GEN2PCIE);
3509 else
3510 WREG32_P(GENERAL_PWRMGT, 0, ~ENABLE_GEN2PCIE);
3511 }
3512
3513 void ni_set_uvd_clock_before_set_eng_clock(struct radeon_device *rdev,
3514 struct radeon_ps *new_ps,
3515 struct radeon_ps *old_ps)
3516 {
3517 struct ni_ps *new_state = ni_get_ps(new_ps);
3518 struct ni_ps *current_state = ni_get_ps(old_ps);
3519
3520 if ((new_ps->vclk == old_ps->vclk) &&
3521 (new_ps->dclk == old_ps->dclk))
3522 return;
3523
3524 if (new_state->performance_levels[new_state->performance_level_count - 1].sclk >=
3525 current_state->performance_levels[current_state->performance_level_count - 1].sclk)
3526 return;
3527
3528 radeon_set_uvd_clocks(rdev, new_ps->vclk, new_ps->dclk);
3529 }
3530
3531 void ni_set_uvd_clock_after_set_eng_clock(struct radeon_device *rdev,
3532 struct radeon_ps *new_ps,
3533 struct radeon_ps *old_ps)
3534 {
3535 struct ni_ps *new_state = ni_get_ps(new_ps);
3536 struct ni_ps *current_state = ni_get_ps(old_ps);
3537
3538 if ((new_ps->vclk == old_ps->vclk) &&
3539 (new_ps->dclk == old_ps->dclk))
3540 return;
3541
3542 if (new_state->performance_levels[new_state->performance_level_count - 1].sclk <
3543 current_state->performance_levels[current_state->performance_level_count - 1].sclk)
3544 return;
3545
3546 radeon_set_uvd_clocks(rdev, new_ps->vclk, new_ps->dclk);
3547 }
3548
3549 void ni_dpm_setup_asic(struct radeon_device *rdev)
3550 {
3551 struct evergreen_power_info *eg_pi = evergreen_get_pi(rdev);
3552 int r;
3553
3554 r = ni_mc_load_microcode(rdev);
3555 if (r)
3556 DRM_ERROR("Failed to load MC firmware!\n");
3557 ni_read_clock_registers(rdev);
3558 btc_read_arb_registers(rdev);
3559 rv770_get_memory_type(rdev);
3560 if (eg_pi->pcie_performance_request)
3561 ni_advertise_gen2_capability(rdev);
3562 rv770_get_pcie_gen2_status(rdev);
3563 rv770_enable_acpi_pm(rdev);
3564 }
3565
3566 void ni_update_current_ps(struct radeon_device *rdev,
3567 struct radeon_ps *rps)
3568 {
3569 struct ni_ps *new_ps = ni_get_ps(rps);
3570 struct evergreen_power_info *eg_pi = evergreen_get_pi(rdev);
3571 struct ni_power_info *ni_pi = ni_get_pi(rdev);
3572
3573 eg_pi->current_rps = *rps;
3574 ni_pi->current_ps = *new_ps;
3575 eg_pi->current_rps.ps_priv = &ni_pi->current_ps;
3576 }
3577
3578 void ni_update_requested_ps(struct radeon_device *rdev,
3579 struct radeon_ps *rps)
3580 {
3581 struct ni_ps *new_ps = ni_get_ps(rps);
3582 struct evergreen_power_info *eg_pi = evergreen_get_pi(rdev);
3583 struct ni_power_info *ni_pi = ni_get_pi(rdev);
3584
3585 eg_pi->requested_rps = *rps;
3586 ni_pi->requested_ps = *new_ps;
3587 eg_pi->requested_rps.ps_priv = &ni_pi->requested_ps;
3588 }
3589
3590 int ni_dpm_enable(struct radeon_device *rdev)
3591 {
3592 struct rv7xx_power_info *pi = rv770_get_pi(rdev);
3593 struct evergreen_power_info *eg_pi = evergreen_get_pi(rdev);
3594 struct radeon_ps *boot_ps = rdev->pm.dpm.boot_ps;
3595 int ret;
3596
3597 if (pi->gfx_clock_gating)
3598 ni_cg_clockgating_default(rdev);
3599 if (btc_dpm_enabled(rdev))
3600 return -EINVAL;
3601 if (pi->mg_clock_gating)
3602 ni_mg_clockgating_default(rdev);
3603 if (eg_pi->ls_clock_gating)
3604 ni_ls_clockgating_default(rdev);
3605 if (pi->voltage_control) {
3606 rv770_enable_voltage_control(rdev, true);
3607 ret = cypress_construct_voltage_tables(rdev);
3608 if (ret) {
3609 DRM_ERROR("cypress_construct_voltage_tables failed\n");
3610 return ret;
3611 }
3612 }
3613 if (eg_pi->dynamic_ac_timing) {
3614 ret = ni_initialize_mc_reg_table(rdev);
3615 if (ret)
3616 eg_pi->dynamic_ac_timing = false;
3617 }
3618 if (pi->dynamic_ss)
3619 cypress_enable_spread_spectrum(rdev, true);
3620 if (pi->thermal_protection)
3621 rv770_enable_thermal_protection(rdev, true);
3622 rv770_setup_bsp(rdev);
3623 rv770_program_git(rdev);
3624 rv770_program_tp(rdev);
3625 rv770_program_tpp(rdev);
3626 rv770_program_sstp(rdev);
3627 cypress_enable_display_gap(rdev);
3628 rv770_program_vc(rdev);
3629 if (pi->dynamic_pcie_gen2)
3630 ni_enable_dynamic_pcie_gen2(rdev, true);
3631 ret = rv770_upload_firmware(rdev);
3632 if (ret) {
3633 DRM_ERROR("rv770_upload_firmware failed\n");
3634 return ret;
3635 }
3636 ret = ni_process_firmware_header(rdev);
3637 if (ret) {
3638 DRM_ERROR("ni_process_firmware_header failed\n");
3639 return ret;
3640 }
3641 ret = ni_initial_switch_from_arb_f0_to_f1(rdev);
3642 if (ret) {
3643 DRM_ERROR("ni_initial_switch_from_arb_f0_to_f1 failed\n");
3644 return ret;
3645 }
3646 ret = ni_init_smc_table(rdev);
3647 if (ret) {
3648 DRM_ERROR("ni_init_smc_table failed\n");
3649 return ret;
3650 }
3651 ret = ni_init_smc_spll_table(rdev);
3652 if (ret) {
3653 DRM_ERROR("ni_init_smc_spll_table failed\n");
3654 return ret;
3655 }
3656 ret = ni_init_arb_table_index(rdev);
3657 if (ret) {
3658 DRM_ERROR("ni_init_arb_table_index failed\n");
3659 return ret;
3660 }
3661 if (eg_pi->dynamic_ac_timing) {
3662 ret = ni_populate_mc_reg_table(rdev, boot_ps);
3663 if (ret) {
3664 DRM_ERROR("ni_populate_mc_reg_table failed\n");
3665 return ret;
3666 }
3667 }
3668 ret = ni_initialize_smc_cac_tables(rdev);
3669 if (ret) {
3670 DRM_ERROR("ni_initialize_smc_cac_tables failed\n");
3671 return ret;
3672 }
3673 ret = ni_initialize_hardware_cac_manager(rdev);
3674 if (ret) {
3675 DRM_ERROR("ni_initialize_hardware_cac_manager failed\n");
3676 return ret;
3677 }
3678 ret = ni_populate_smc_tdp_limits(rdev, boot_ps);
3679 if (ret) {
3680 DRM_ERROR("ni_populate_smc_tdp_limits failed\n");
3681 return ret;
3682 }
3683 ni_program_response_times(rdev);
3684 r7xx_start_smc(rdev);
3685 ret = cypress_notify_smc_display_change(rdev, false);
3686 if (ret) {
3687 DRM_ERROR("cypress_notify_smc_display_change failed\n");
3688 return ret;
3689 }
3690 cypress_enable_sclk_control(rdev, true);
3691 if (eg_pi->memory_transition)
3692 cypress_enable_mclk_control(rdev, true);
3693 cypress_start_dpm(rdev);
3694 if (pi->gfx_clock_gating)
3695 ni_gfx_clockgating_enable(rdev, true);
3696 if (pi->mg_clock_gating)
3697 ni_mg_clockgating_enable(rdev, true);
3698 if (eg_pi->ls_clock_gating)
3699 ni_ls_clockgating_enable(rdev, true);
3700
3701 rv770_enable_auto_throttle_source(rdev, RADEON_DPM_AUTO_THROTTLE_SRC_THERMAL, true);
3702
3703 ni_update_current_ps(rdev, boot_ps);
3704
3705 return 0;
3706 }
3707
3708 void ni_dpm_disable(struct radeon_device *rdev)
3709 {
3710 struct rv7xx_power_info *pi = rv770_get_pi(rdev);
3711 struct evergreen_power_info *eg_pi = evergreen_get_pi(rdev);
3712 struct radeon_ps *boot_ps = rdev->pm.dpm.boot_ps;
3713
3714 if (!btc_dpm_enabled(rdev))
3715 return;
3716 rv770_clear_vc(rdev);
3717 if (pi->thermal_protection)
3718 rv770_enable_thermal_protection(rdev, false);
3719 ni_enable_power_containment(rdev, boot_ps, false);
3720 ni_enable_smc_cac(rdev, boot_ps, false);
3721 cypress_enable_spread_spectrum(rdev, false);
3722 rv770_enable_auto_throttle_source(rdev, RADEON_DPM_AUTO_THROTTLE_SRC_THERMAL, false);
3723 if (pi->dynamic_pcie_gen2)
3724 ni_enable_dynamic_pcie_gen2(rdev, false);
3725
3726 if (rdev->irq.installed &&
3727 r600_is_internal_thermal_sensor(rdev->pm.int_thermal_type)) {
3728 rdev->irq.dpm_thermal = false;
3729 radeon_irq_set(rdev);
3730 }
3731
3732 if (pi->gfx_clock_gating)
3733 ni_gfx_clockgating_enable(rdev, false);
3734 if (pi->mg_clock_gating)
3735 ni_mg_clockgating_enable(rdev, false);
3736 if (eg_pi->ls_clock_gating)
3737 ni_ls_clockgating_enable(rdev, false);
3738 ni_stop_dpm(rdev);
3739 btc_reset_to_default(rdev);
3740 ni_stop_smc(rdev);
3741 ni_force_switch_to_arb_f0(rdev);
3742
3743 ni_update_current_ps(rdev, boot_ps);
3744 }
3745
3746 static int ni_power_control_set_level(struct radeon_device *rdev)
3747 {
3748 struct radeon_ps *new_ps = rdev->pm.dpm.requested_ps;
3749 int ret;
3750
3751 ret = ni_restrict_performance_levels_before_switch(rdev);
3752 if (ret)
3753 return ret;
3754 ret = rv770_halt_smc(rdev);
3755 if (ret)
3756 return ret;
3757 ret = ni_populate_smc_tdp_limits(rdev, new_ps);
3758 if (ret)
3759 return ret;
3760 ret = rv770_resume_smc(rdev);
3761 if (ret)
3762 return ret;
3763 ret = rv770_set_sw_state(rdev);
3764 if (ret)
3765 return ret;
3766
3767 return 0;
3768 }
3769
3770 int ni_dpm_pre_set_power_state(struct radeon_device *rdev)
3771 {
3772 struct evergreen_power_info *eg_pi = evergreen_get_pi(rdev);
3773 struct radeon_ps requested_ps = *rdev->pm.dpm.requested_ps;
3774 struct radeon_ps *new_ps = &requested_ps;
3775
3776 ni_update_requested_ps(rdev, new_ps);
3777
3778 ni_apply_state_adjust_rules(rdev, &eg_pi->requested_rps);
3779
3780 return 0;
3781 }
3782
3783 int ni_dpm_set_power_state(struct radeon_device *rdev)
3784 {
3785 struct evergreen_power_info *eg_pi = evergreen_get_pi(rdev);
3786 struct radeon_ps *new_ps = &eg_pi->requested_rps;
3787 struct radeon_ps *old_ps = &eg_pi->current_rps;
3788 int ret;
3789
3790 ret = ni_restrict_performance_levels_before_switch(rdev);
3791 if (ret) {
3792 DRM_ERROR("ni_restrict_performance_levels_before_switch failed\n");
3793 return ret;
3794 }
3795 ni_set_uvd_clock_before_set_eng_clock(rdev, new_ps, old_ps);
3796 ret = ni_enable_power_containment(rdev, new_ps, false);
3797 if (ret) {
3798 DRM_ERROR("ni_enable_power_containment failed\n");
3799 return ret;
3800 }
3801 ret = ni_enable_smc_cac(rdev, new_ps, false);
3802 if (ret) {
3803 DRM_ERROR("ni_enable_smc_cac failed\n");
3804 return ret;
3805 }
3806 ret = rv770_halt_smc(rdev);
3807 if (ret) {
3808 DRM_ERROR("rv770_halt_smc failed\n");
3809 return ret;
3810 }
3811 if (eg_pi->smu_uvd_hs)
3812 btc_notify_uvd_to_smc(rdev, new_ps);
3813 ret = ni_upload_sw_state(rdev, new_ps);
3814 if (ret) {
3815 DRM_ERROR("ni_upload_sw_state failed\n");
3816 return ret;
3817 }
3818 if (eg_pi->dynamic_ac_timing) {
3819 ret = ni_upload_mc_reg_table(rdev, new_ps);
3820 if (ret) {
3821 DRM_ERROR("ni_upload_mc_reg_table failed\n");
3822 return ret;
3823 }
3824 }
3825 ret = ni_program_memory_timing_parameters(rdev, new_ps);
3826 if (ret) {
3827 DRM_ERROR("ni_program_memory_timing_parameters failed\n");
3828 return ret;
3829 }
3830 ret = rv770_resume_smc(rdev);
3831 if (ret) {
3832 DRM_ERROR("rv770_resume_smc failed\n");
3833 return ret;
3834 }
3835 ret = rv770_set_sw_state(rdev);
3836 if (ret) {
3837 DRM_ERROR("rv770_set_sw_state failed\n");
3838 return ret;
3839 }
3840 ni_set_uvd_clock_after_set_eng_clock(rdev, new_ps, old_ps);
3841 ret = ni_enable_smc_cac(rdev, new_ps, true);
3842 if (ret) {
3843 DRM_ERROR("ni_enable_smc_cac failed\n");
3844 return ret;
3845 }
3846 ret = ni_enable_power_containment(rdev, new_ps, true);
3847 if (ret) {
3848 DRM_ERROR("ni_enable_power_containment failed\n");
3849 return ret;
3850 }
3851
3852 /* update tdp */
3853 ret = ni_power_control_set_level(rdev);
3854 if (ret) {
3855 DRM_ERROR("ni_power_control_set_level failed\n");
3856 return ret;
3857 }
3858
3859 return 0;
3860 }
3861
3862 void ni_dpm_post_set_power_state(struct radeon_device *rdev)
3863 {
3864 struct evergreen_power_info *eg_pi = evergreen_get_pi(rdev);
3865 struct radeon_ps *new_ps = &eg_pi->requested_rps;
3866
3867 ni_update_current_ps(rdev, new_ps);
3868 }
3869
3870 #if 0
3871 void ni_dpm_reset_asic(struct radeon_device *rdev)
3872 {
3873 ni_restrict_performance_levels_before_switch(rdev);
3874 rv770_set_boot_state(rdev);
3875 }
3876 #endif
3877
3878 union power_info {
3879 struct _ATOM_POWERPLAY_INFO info;
3880 struct _ATOM_POWERPLAY_INFO_V2 info_2;
3881 struct _ATOM_POWERPLAY_INFO_V3 info_3;
3882 struct _ATOM_PPLIB_POWERPLAYTABLE pplib;
3883 struct _ATOM_PPLIB_POWERPLAYTABLE2 pplib2;
3884 struct _ATOM_PPLIB_POWERPLAYTABLE3 pplib3;
3885 };
3886
3887 union pplib_clock_info {
3888 struct _ATOM_PPLIB_R600_CLOCK_INFO r600;
3889 struct _ATOM_PPLIB_RS780_CLOCK_INFO rs780;
3890 struct _ATOM_PPLIB_EVERGREEN_CLOCK_INFO evergreen;
3891 struct _ATOM_PPLIB_SUMO_CLOCK_INFO sumo;
3892 };
3893
3894 union pplib_power_state {
3895 struct _ATOM_PPLIB_STATE v1;
3896 struct _ATOM_PPLIB_STATE_V2 v2;
3897 };
3898
3899 static void ni_parse_pplib_non_clock_info(struct radeon_device *rdev,
3900 struct radeon_ps *rps,
3901 struct _ATOM_PPLIB_NONCLOCK_INFO *non_clock_info,
3902 u8 table_rev)
3903 {
3904 rps->caps = le32_to_cpu(non_clock_info->ulCapsAndSettings);
3905 rps->class = le16_to_cpu(non_clock_info->usClassification);
3906 rps->class2 = le16_to_cpu(non_clock_info->usClassification2);
3907
3908 if (ATOM_PPLIB_NONCLOCKINFO_VER1 < table_rev) {
3909 rps->vclk = le32_to_cpu(non_clock_info->ulVCLK);
3910 rps->dclk = le32_to_cpu(non_clock_info->ulDCLK);
3911 } else if (r600_is_uvd_state(rps->class, rps->class2)) {
3912 rps->vclk = RV770_DEFAULT_VCLK_FREQ;
3913 rps->dclk = RV770_DEFAULT_DCLK_FREQ;
3914 } else {
3915 rps->vclk = 0;
3916 rps->dclk = 0;
3917 }
3918
3919 if (rps->class & ATOM_PPLIB_CLASSIFICATION_BOOT)
3920 rdev->pm.dpm.boot_ps = rps;
3921 if (rps->class & ATOM_PPLIB_CLASSIFICATION_UVDSTATE)
3922 rdev->pm.dpm.uvd_ps = rps;
3923 }
3924
3925 static void ni_parse_pplib_clock_info(struct radeon_device *rdev,
3926 struct radeon_ps *rps, int index,
3927 union pplib_clock_info *clock_info)
3928 {
3929 struct rv7xx_power_info *pi = rv770_get_pi(rdev);
3930 struct evergreen_power_info *eg_pi = evergreen_get_pi(rdev);
3931 struct ni_ps *ps = ni_get_ps(rps);
3932 struct rv7xx_pl *pl = &ps->performance_levels[index];
3933
3934 ps->performance_level_count = index + 1;
3935
3936 pl->sclk = le16_to_cpu(clock_info->evergreen.usEngineClockLow);
3937 pl->sclk |= clock_info->evergreen.ucEngineClockHigh << 16;
3938 pl->mclk = le16_to_cpu(clock_info->evergreen.usMemoryClockLow);
3939 pl->mclk |= clock_info->evergreen.ucMemoryClockHigh << 16;
3940
3941 pl->vddc = le16_to_cpu(clock_info->evergreen.usVDDC);
3942 pl->vddci = le16_to_cpu(clock_info->evergreen.usVDDCI);
3943 pl->flags = le32_to_cpu(clock_info->evergreen.ulFlags);
3944
3945 /* patch up vddc if necessary */
3946 if (pl->vddc == 0xff01) {
3947 if (pi->max_vddc)
3948 pl->vddc = pi->max_vddc;
3949 }
3950
3951 if (rps->class & ATOM_PPLIB_CLASSIFICATION_ACPI) {
3952 pi->acpi_vddc = pl->vddc;
3953 eg_pi->acpi_vddci = pl->vddci;
3954 if (ps->performance_levels[0].flags & ATOM_PPLIB_R600_FLAGS_PCIEGEN2)
3955 pi->acpi_pcie_gen2 = true;
3956 else
3957 pi->acpi_pcie_gen2 = false;
3958 }
3959
3960 if (rps->class2 & ATOM_PPLIB_CLASSIFICATION2_ULV) {
3961 eg_pi->ulv.supported = true;
3962 eg_pi->ulv.pl = pl;
3963 }
3964
3965 if (pi->min_vddc_in_table > pl->vddc)
3966 pi->min_vddc_in_table = pl->vddc;
3967
3968 if (pi->max_vddc_in_table < pl->vddc)
3969 pi->max_vddc_in_table = pl->vddc;
3970
3971 /* patch up boot state */
3972 if (rps->class & ATOM_PPLIB_CLASSIFICATION_BOOT) {
3973 u16 vddc, vddci, mvdd;
3974 radeon_atombios_get_default_voltages(rdev, &vddc, &vddci, &mvdd);
3975 pl->mclk = rdev->clock.default_mclk;
3976 pl->sclk = rdev->clock.default_sclk;
3977 pl->vddc = vddc;
3978 pl->vddci = vddci;
3979 }
3980
3981 if ((rps->class & ATOM_PPLIB_CLASSIFICATION_UI_MASK) ==
3982 ATOM_PPLIB_CLASSIFICATION_UI_PERFORMANCE) {
3983 rdev->pm.dpm.dyn_state.max_clock_voltage_on_ac.sclk = pl->sclk;
3984 rdev->pm.dpm.dyn_state.max_clock_voltage_on_ac.mclk = pl->mclk;
3985 rdev->pm.dpm.dyn_state.max_clock_voltage_on_ac.vddc = pl->vddc;
3986 rdev->pm.dpm.dyn_state.max_clock_voltage_on_ac.vddci = pl->vddci;
3987 }
3988 }
3989
3990 static int ni_parse_power_table(struct radeon_device *rdev)
3991 {
3992 struct radeon_mode_info *mode_info = &rdev->mode_info;
3993 struct _ATOM_PPLIB_NONCLOCK_INFO *non_clock_info;
3994 union pplib_power_state *power_state;
3995 int i, j;
3996 union pplib_clock_info *clock_info;
3997 union power_info *power_info;
3998 int index = GetIndexIntoMasterTable(DATA, PowerPlayInfo);
3999 u16 data_offset;
4000 u8 frev, crev;
4001 struct ni_ps *ps;
4002
4003 if (!atom_parse_data_header(mode_info->atom_context, index, NULL,
4004 &frev, &crev, &data_offset))
4005 return -EINVAL;
4006 power_info = (union power_info *)(mode_info->atom_context->bios + data_offset);
4007
4008 rdev->pm.dpm.ps = kzalloc(sizeof(struct radeon_ps) *
4009 power_info->pplib.ucNumStates, GFP_KERNEL);
4010 if (!rdev->pm.dpm.ps)
4011 return -ENOMEM;
4012
4013 for (i = 0; i < power_info->pplib.ucNumStates; i++) {
4014 power_state = (union pplib_power_state *)
4015 (mode_info->atom_context->bios + data_offset +
4016 le16_to_cpu(power_info->pplib.usStateArrayOffset) +
4017 i * power_info->pplib.ucStateEntrySize);
4018 non_clock_info = (struct _ATOM_PPLIB_NONCLOCK_INFO *)
4019 (mode_info->atom_context->bios + data_offset +
4020 le16_to_cpu(power_info->pplib.usNonClockInfoArrayOffset) +
4021 (power_state->v1.ucNonClockStateIndex *
4022 power_info->pplib.ucNonClockSize));
4023 if (power_info->pplib.ucStateEntrySize - 1) {
4024 u8 *idx;
4025 ps = kzalloc(sizeof(struct ni_ps), GFP_KERNEL);
4026 if (ps == NULL) {
4027 kfree(rdev->pm.dpm.ps);
4028 return -ENOMEM;
4029 }
4030 rdev->pm.dpm.ps[i].ps_priv = ps;
4031 ni_parse_pplib_non_clock_info(rdev, &rdev->pm.dpm.ps[i],
4032 non_clock_info,
4033 power_info->pplib.ucNonClockSize);
4034 idx = (u8 *)&power_state->v1.ucClockStateIndices[0];
4035 for (j = 0; j < (power_info->pplib.ucStateEntrySize - 1); j++) {
4036 clock_info = (union pplib_clock_info *)
4037 (mode_info->atom_context->bios + data_offset +
4038 le16_to_cpu(power_info->pplib.usClockInfoArrayOffset) +
4039 (idx[j] * power_info->pplib.ucClockInfoSize));
4040 ni_parse_pplib_clock_info(rdev,
4041 &rdev->pm.dpm.ps[i], j,
4042 clock_info);
4043 }
4044 }
4045 }
4046 rdev->pm.dpm.num_ps = power_info->pplib.ucNumStates;
4047 return 0;
4048 }
4049
4050 int ni_dpm_init(struct radeon_device *rdev)
4051 {
4052 struct rv7xx_power_info *pi;
4053 struct evergreen_power_info *eg_pi;
4054 struct ni_power_info *ni_pi;
4055 struct atom_clock_dividers dividers;
4056 int ret;
4057
4058 ni_pi = kzalloc(sizeof(struct ni_power_info), GFP_KERNEL);
4059 if (ni_pi == NULL)
4060 return -ENOMEM;
4061 rdev->pm.dpm.priv = ni_pi;
4062 eg_pi = &ni_pi->eg;
4063 pi = &eg_pi->rv7xx;
4064
4065 rv770_get_max_vddc(rdev);
4066
4067 eg_pi->ulv.supported = false;
4068 pi->acpi_vddc = 0;
4069 eg_pi->acpi_vddci = 0;
4070 pi->min_vddc_in_table = 0;
4071 pi->max_vddc_in_table = 0;
4072
4073 ret = r600_get_platform_caps(rdev);
4074 if (ret)
4075 return ret;
4076
4077 ret = ni_parse_power_table(rdev);
4078 if (ret)
4079 return ret;
4080 ret = r600_parse_extended_power_table(rdev);
4081 if (ret)
4082 return ret;
4083
4084 rdev->pm.dpm.dyn_state.vddc_dependency_on_dispclk.entries =
4085 kzalloc(4 * sizeof(struct radeon_clock_voltage_dependency_entry), GFP_KERNEL);
4086 if (!rdev->pm.dpm.dyn_state.vddc_dependency_on_dispclk.entries) {
4087 r600_free_extended_power_table(rdev);
4088 return -ENOMEM;
4089 }
4090 rdev->pm.dpm.dyn_state.vddc_dependency_on_dispclk.count = 4;
4091 rdev->pm.dpm.dyn_state.vddc_dependency_on_dispclk.entries[0].clk = 0;
4092 rdev->pm.dpm.dyn_state.vddc_dependency_on_dispclk.entries[0].v = 0;
4093 rdev->pm.dpm.dyn_state.vddc_dependency_on_dispclk.entries[1].clk = 36000;
4094 rdev->pm.dpm.dyn_state.vddc_dependency_on_dispclk.entries[1].v = 720;
4095 rdev->pm.dpm.dyn_state.vddc_dependency_on_dispclk.entries[2].clk = 54000;
4096 rdev->pm.dpm.dyn_state.vddc_dependency_on_dispclk.entries[2].v = 810;
4097 rdev->pm.dpm.dyn_state.vddc_dependency_on_dispclk.entries[3].clk = 72000;
4098 rdev->pm.dpm.dyn_state.vddc_dependency_on_dispclk.entries[3].v = 900;
4099
4100 ni_patch_dependency_tables_based_on_leakage(rdev);
4101
4102 if (rdev->pm.dpm.voltage_response_time == 0)
4103 rdev->pm.dpm.voltage_response_time = R600_VOLTAGERESPONSETIME_DFLT;
4104 if (rdev->pm.dpm.backbias_response_time == 0)
4105 rdev->pm.dpm.backbias_response_time = R600_BACKBIASRESPONSETIME_DFLT;
4106
4107 ret = radeon_atom_get_clock_dividers(rdev, COMPUTE_ENGINE_PLL_PARAM,
4108 0, false, ÷rs);
4109 if (ret)
4110 pi->ref_div = dividers.ref_div + 1;
4111 else
4112 pi->ref_div = R600_REFERENCEDIVIDER_DFLT;
4113
4114 pi->rlp = RV770_RLP_DFLT;
4115 pi->rmp = RV770_RMP_DFLT;
4116 pi->lhp = RV770_LHP_DFLT;
4117 pi->lmp = RV770_LMP_DFLT;
4118
4119 eg_pi->ats[0].rlp = RV770_RLP_DFLT;
4120 eg_pi->ats[0].rmp = RV770_RMP_DFLT;
4121 eg_pi->ats[0].lhp = RV770_LHP_DFLT;
4122 eg_pi->ats[0].lmp = RV770_LMP_DFLT;
4123
4124 eg_pi->ats[1].rlp = BTC_RLP_UVD_DFLT;
4125 eg_pi->ats[1].rmp = BTC_RMP_UVD_DFLT;
4126 eg_pi->ats[1].lhp = BTC_LHP_UVD_DFLT;
4127 eg_pi->ats[1].lmp = BTC_LMP_UVD_DFLT;
4128
4129 eg_pi->smu_uvd_hs = true;
4130
4131 if (rdev->pdev->device == 0x6707) {
4132 pi->mclk_strobe_mode_threshold = 55000;
4133 pi->mclk_edc_enable_threshold = 55000;
4134 eg_pi->mclk_edc_wr_enable_threshold = 55000;
4135 } else {
4136 pi->mclk_strobe_mode_threshold = 40000;
4137 pi->mclk_edc_enable_threshold = 40000;
4138 eg_pi->mclk_edc_wr_enable_threshold = 40000;
4139 }
4140 ni_pi->mclk_rtt_mode_threshold = eg_pi->mclk_edc_wr_enable_threshold;
4141
4142 pi->voltage_control =
4143 radeon_atom_is_voltage_gpio(rdev, SET_VOLTAGE_TYPE_ASIC_VDDC, 0);
4144
4145 pi->mvdd_control =
4146 radeon_atom_is_voltage_gpio(rdev, SET_VOLTAGE_TYPE_ASIC_MVDDC, 0);
4147
4148 eg_pi->vddci_control =
4149 radeon_atom_is_voltage_gpio(rdev, SET_VOLTAGE_TYPE_ASIC_VDDCI, 0);
4150
4151 rv770_get_engine_memory_ss(rdev);
4152
4153 pi->asi = RV770_ASI_DFLT;
4154 pi->pasi = CYPRESS_HASI_DFLT;
4155 pi->vrc = CYPRESS_VRC_DFLT;
4156
4157 pi->power_gating = false;
4158
4159 pi->gfx_clock_gating = true;
4160
4161 pi->mg_clock_gating = true;
4162 pi->mgcgtssm = true;
4163 eg_pi->ls_clock_gating = false;
4164 eg_pi->sclk_deep_sleep = false;
4165
4166 pi->dynamic_pcie_gen2 = true;
4167
4168 if (rdev->pm.int_thermal_type != THERMAL_TYPE_NONE)
4169 pi->thermal_protection = true;
4170 else
4171 pi->thermal_protection = false;
4172
4173 pi->display_gap = true;
4174
4175 pi->dcodt = true;
4176
4177 pi->ulps = true;
4178
4179 eg_pi->dynamic_ac_timing = true;
4180 eg_pi->abm = true;
4181 eg_pi->mcls = true;
4182 eg_pi->light_sleep = true;
4183 eg_pi->memory_transition = true;
4184 #if defined(CONFIG_ACPI)
4185 eg_pi->pcie_performance_request =
4186 radeon_acpi_is_pcie_performance_request_supported(rdev);
4187 #else
4188 eg_pi->pcie_performance_request = false;
4189 #endif
4190
4191 eg_pi->dll_default_on = false;
4192
4193 eg_pi->sclk_deep_sleep = false;
4194
4195 pi->mclk_stutter_mode_threshold = 0;
4196
4197 pi->sram_end = SMC_RAM_END;
4198
4199 rdev->pm.dpm.dyn_state.mclk_sclk_ratio = 3;
4200 rdev->pm.dpm.dyn_state.vddc_vddci_delta = 200;
4201 rdev->pm.dpm.dyn_state.min_vddc_for_pcie_gen2 = 900;
4202 rdev->pm.dpm.dyn_state.valid_sclk_values.count = ARRAY_SIZE(btc_valid_sclk);
4203 rdev->pm.dpm.dyn_state.valid_sclk_values.values = btc_valid_sclk;
4204 rdev->pm.dpm.dyn_state.valid_mclk_values.count = 0;
4205 rdev->pm.dpm.dyn_state.valid_mclk_values.values = NULL;
4206 rdev->pm.dpm.dyn_state.sclk_mclk_delta = 12500;
4207
4208 ni_pi->cac_data.leakage_coefficients.at = 516;
4209 ni_pi->cac_data.leakage_coefficients.bt = 18;
4210 ni_pi->cac_data.leakage_coefficients.av = 51;
4211 ni_pi->cac_data.leakage_coefficients.bv = 2957;
4212
4213 switch (rdev->pdev->device) {
4214 case 0x6700:
4215 case 0x6701:
4216 case 0x6702:
4217 case 0x6703:
4218 case 0x6718:
4219 ni_pi->cac_weights = &cac_weights_cayman_xt;
4220 break;
4221 case 0x6705:
4222 case 0x6719:
4223 case 0x671D:
4224 case 0x671C:
4225 default:
4226 ni_pi->cac_weights = &cac_weights_cayman_pro;
4227 break;
4228 case 0x6704:
4229 case 0x6706:
4230 case 0x6707:
4231 case 0x6708:
4232 case 0x6709:
4233 ni_pi->cac_weights = &cac_weights_cayman_le;
4234 break;
4235 }
4236
4237 if (ni_pi->cac_weights->enable_power_containment_by_default) {
4238 ni_pi->enable_power_containment = true;
4239 ni_pi->enable_cac = true;
4240 ni_pi->enable_sq_ramping = true;
4241 } else {
4242 ni_pi->enable_power_containment = false;
4243 ni_pi->enable_cac = false;
4244 ni_pi->enable_sq_ramping = false;
4245 }
4246
4247 ni_pi->driver_calculate_cac_leakage = false;
4248 ni_pi->cac_configuration_required = true;
4249
4250 if (ni_pi->cac_configuration_required) {
4251 ni_pi->support_cac_long_term_average = true;
4252 ni_pi->lta_window_size = ni_pi->cac_weights->l2_lta_window_size;
4253 ni_pi->lts_truncate = ni_pi->cac_weights->lts_truncate;
4254 } else {
4255 ni_pi->support_cac_long_term_average = false;
4256 ni_pi->lta_window_size = 0;
4257 ni_pi->lts_truncate = 0;
4258 }
4259
4260 ni_pi->use_power_boost_limit = true;
4261
4262 /* make sure dc limits are valid */
4263 if ((rdev->pm.dpm.dyn_state.max_clock_voltage_on_dc.sclk == 0) ||
4264 (rdev->pm.dpm.dyn_state.max_clock_voltage_on_dc.mclk == 0))
4265 rdev->pm.dpm.dyn_state.max_clock_voltage_on_dc =
4266 rdev->pm.dpm.dyn_state.max_clock_voltage_on_ac;
4267
4268 return 0;
4269 }
4270
4271 void ni_dpm_fini(struct radeon_device *rdev)
4272 {
4273 int i;
4274
4275 for (i = 0; i < rdev->pm.dpm.num_ps; i++) {
4276 kfree(rdev->pm.dpm.ps[i].ps_priv);
4277 }
4278 kfree(rdev->pm.dpm.ps);
4279 kfree(rdev->pm.dpm.priv);
4280 kfree(rdev->pm.dpm.dyn_state.vddc_dependency_on_dispclk.entries);
4281 r600_free_extended_power_table(rdev);
4282 }
4283
4284 void ni_dpm_print_power_state(struct radeon_device *rdev,
4285 struct radeon_ps *rps)
4286 {
4287 struct ni_ps *ps = ni_get_ps(rps);
4288 struct rv7xx_pl *pl;
4289 int i;
4290
4291 r600_dpm_print_class_info(rps->class, rps->class2);
4292 r600_dpm_print_cap_info(rps->caps);
4293 printk("\tuvd vclk: %d dclk: %d\n", rps->vclk, rps->dclk);
4294 for (i = 0; i < ps->performance_level_count; i++) {
4295 pl = &ps->performance_levels[i];
4296 if (rdev->family >= CHIP_TAHITI)
4297 printk("\t\tpower level %d sclk: %u mclk: %u vddc: %u vddci: %u pcie gen: %u\n",
4298 i, pl->sclk, pl->mclk, pl->vddc, pl->vddci, pl->pcie_gen + 1);
4299 else
4300 printk("\t\tpower level %d sclk: %u mclk: %u vddc: %u vddci: %u\n",
4301 i, pl->sclk, pl->mclk, pl->vddc, pl->vddci);
4302 }
4303 r600_dpm_print_ps_status(rdev, rps);
4304 }
4305
4306 #ifdef CONFIG_DEBUG_FS
4307 void ni_dpm_debugfs_print_current_performance_level(struct radeon_device *rdev,
4308 struct seq_file *m)
4309 {
4310 struct evergreen_power_info *eg_pi = evergreen_get_pi(rdev);
4311 struct radeon_ps *rps = &eg_pi->current_rps;
4312 struct ni_ps *ps = ni_get_ps(rps);
4313 struct rv7xx_pl *pl;
4314 u32 current_index =
4315 (RREG32(TARGET_AND_CURRENT_PROFILE_INDEX) & CURRENT_STATE_INDEX_MASK) >>
4316 CURRENT_STATE_INDEX_SHIFT;
4317
4318 if (current_index >= ps->performance_level_count) {
4319 seq_printf(m, "invalid dpm profile %d\n", current_index);
4320 } else {
4321 pl = &ps->performance_levels[current_index];
4322 seq_printf(m, "uvd vclk: %d dclk: %d\n", rps->vclk, rps->dclk);
4323 seq_printf(m, "power level %d sclk: %u mclk: %u vddc: %u vddci: %u\n",
4324 current_index, pl->sclk, pl->mclk, pl->vddc, pl->vddci);
4325 }
4326 }
4327 #endif /* CONFIG_DEBUG_FS */
4328
4329 u32 ni_dpm_get_current_sclk(struct radeon_device *rdev)
4330 {
4331 struct evergreen_power_info *eg_pi = evergreen_get_pi(rdev);
4332 struct radeon_ps *rps = &eg_pi->current_rps;
4333 struct ni_ps *ps = ni_get_ps(rps);
4334 struct rv7xx_pl *pl;
4335 u32 current_index =
4336 (RREG32(TARGET_AND_CURRENT_PROFILE_INDEX) & CURRENT_STATE_INDEX_MASK) >>
4337 CURRENT_STATE_INDEX_SHIFT;
4338
4339 if (current_index >= ps->performance_level_count) {
4340 return 0;
4341 } else {
4342 pl = &ps->performance_levels[current_index];
4343 return pl->sclk;
4344 }
4345 }
4346
4347 u32 ni_dpm_get_current_mclk(struct radeon_device *rdev)
4348 {
4349 struct evergreen_power_info *eg_pi = evergreen_get_pi(rdev);
4350 struct radeon_ps *rps = &eg_pi->current_rps;
4351 struct ni_ps *ps = ni_get_ps(rps);
4352 struct rv7xx_pl *pl;
4353 u32 current_index =
4354 (RREG32(TARGET_AND_CURRENT_PROFILE_INDEX) & CURRENT_STATE_INDEX_MASK) >>
4355 CURRENT_STATE_INDEX_SHIFT;
4356
4357 if (current_index >= ps->performance_level_count) {
4358 return 0;
4359 } else {
4360 pl = &ps->performance_levels[current_index];
4361 return pl->mclk;
4362 }
4363 }
4364
4365 u32 ni_dpm_get_sclk(struct radeon_device *rdev, bool low)
4366 {
4367 struct evergreen_power_info *eg_pi = evergreen_get_pi(rdev);
4368 struct ni_ps *requested_state = ni_get_ps(&eg_pi->requested_rps);
4369
4370 if (low)
4371 return requested_state->performance_levels[0].sclk;
4372 else
4373 return requested_state->performance_levels[requested_state->performance_level_count - 1].sclk;
4374 }
4375
4376 u32 ni_dpm_get_mclk(struct radeon_device *rdev, bool low)
4377 {
4378 struct evergreen_power_info *eg_pi = evergreen_get_pi(rdev);
4379 struct ni_ps *requested_state = ni_get_ps(&eg_pi->requested_rps);
4380
4381 if (low)
4382 return requested_state->performance_levels[0].mclk;
4383 else
4384 return requested_state->performance_levels[requested_state->performance_level_count - 1].mclk;
4385 }
4386
4387