]> git.proxmox.com Git - mirror_ubuntu-jammy-kernel.git/blob - drivers/gpu/drm/radeon/si.c
Merge tag 'for-v3.13-fixes' of git://git.infradead.org/battery-2.6
[mirror_ubuntu-jammy-kernel.git] / drivers / gpu / drm / radeon / si.c
1 /*
2 * Copyright 2011 Advanced Micro Devices, Inc.
3 *
4 * Permission is hereby granted, free of charge, to any person obtaining a
5 * copy of this software and associated documentation files (the "Software"),
6 * to deal in the Software without restriction, including without limitation
7 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
8 * and/or sell copies of the Software, and to permit persons to whom the
9 * Software is furnished to do so, subject to the following conditions:
10 *
11 * The above copyright notice and this permission notice shall be included in
12 * all copies or substantial portions of the Software.
13 *
14 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
15 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
16 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
17 * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
18 * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
19 * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
20 * OTHER DEALINGS IN THE SOFTWARE.
21 *
22 * Authors: Alex Deucher
23 */
24 #include <linux/firmware.h>
25 #include <linux/slab.h>
26 #include <linux/module.h>
27 #include <drm/drmP.h>
28 #include "radeon.h"
29 #include "radeon_asic.h"
30 #include <drm/radeon_drm.h>
31 #include "sid.h"
32 #include "atom.h"
33 #include "si_blit_shaders.h"
34 #include "clearstate_si.h"
35 #include "radeon_ucode.h"
36
37
38 MODULE_FIRMWARE("radeon/TAHITI_pfp.bin");
39 MODULE_FIRMWARE("radeon/TAHITI_me.bin");
40 MODULE_FIRMWARE("radeon/TAHITI_ce.bin");
41 MODULE_FIRMWARE("radeon/TAHITI_mc.bin");
42 MODULE_FIRMWARE("radeon/TAHITI_rlc.bin");
43 MODULE_FIRMWARE("radeon/TAHITI_smc.bin");
44 MODULE_FIRMWARE("radeon/PITCAIRN_pfp.bin");
45 MODULE_FIRMWARE("radeon/PITCAIRN_me.bin");
46 MODULE_FIRMWARE("radeon/PITCAIRN_ce.bin");
47 MODULE_FIRMWARE("radeon/PITCAIRN_mc.bin");
48 MODULE_FIRMWARE("radeon/PITCAIRN_rlc.bin");
49 MODULE_FIRMWARE("radeon/PITCAIRN_smc.bin");
50 MODULE_FIRMWARE("radeon/VERDE_pfp.bin");
51 MODULE_FIRMWARE("radeon/VERDE_me.bin");
52 MODULE_FIRMWARE("radeon/VERDE_ce.bin");
53 MODULE_FIRMWARE("radeon/VERDE_mc.bin");
54 MODULE_FIRMWARE("radeon/VERDE_rlc.bin");
55 MODULE_FIRMWARE("radeon/VERDE_smc.bin");
56 MODULE_FIRMWARE("radeon/OLAND_pfp.bin");
57 MODULE_FIRMWARE("radeon/OLAND_me.bin");
58 MODULE_FIRMWARE("radeon/OLAND_ce.bin");
59 MODULE_FIRMWARE("radeon/OLAND_mc.bin");
60 MODULE_FIRMWARE("radeon/OLAND_rlc.bin");
61 MODULE_FIRMWARE("radeon/OLAND_smc.bin");
62 MODULE_FIRMWARE("radeon/HAINAN_pfp.bin");
63 MODULE_FIRMWARE("radeon/HAINAN_me.bin");
64 MODULE_FIRMWARE("radeon/HAINAN_ce.bin");
65 MODULE_FIRMWARE("radeon/HAINAN_mc.bin");
66 MODULE_FIRMWARE("radeon/HAINAN_rlc.bin");
67 MODULE_FIRMWARE("radeon/HAINAN_smc.bin");
68
69 static void si_pcie_gen3_enable(struct radeon_device *rdev);
70 static void si_program_aspm(struct radeon_device *rdev);
71 extern void sumo_rlc_fini(struct radeon_device *rdev);
72 extern int sumo_rlc_init(struct radeon_device *rdev);
73 extern int r600_ih_ring_alloc(struct radeon_device *rdev);
74 extern void r600_ih_ring_fini(struct radeon_device *rdev);
75 extern void evergreen_fix_pci_max_read_req_size(struct radeon_device *rdev);
76 extern void evergreen_mc_stop(struct radeon_device *rdev, struct evergreen_mc_save *save);
77 extern void evergreen_mc_resume(struct radeon_device *rdev, struct evergreen_mc_save *save);
78 extern u32 evergreen_get_number_of_dram_channels(struct radeon_device *rdev);
79 extern void evergreen_print_gpu_status_regs(struct radeon_device *rdev);
80 extern bool evergreen_is_display_hung(struct radeon_device *rdev);
81 static void si_enable_gui_idle_interrupt(struct radeon_device *rdev,
82 bool enable);
83 static void si_fini_pg(struct radeon_device *rdev);
84 static void si_fini_cg(struct radeon_device *rdev);
85 static void si_rlc_stop(struct radeon_device *rdev);
86
87 static const u32 verde_rlc_save_restore_register_list[] =
88 {
89 (0x8000 << 16) | (0x98f4 >> 2),
90 0x00000000,
91 (0x8040 << 16) | (0x98f4 >> 2),
92 0x00000000,
93 (0x8000 << 16) | (0xe80 >> 2),
94 0x00000000,
95 (0x8040 << 16) | (0xe80 >> 2),
96 0x00000000,
97 (0x8000 << 16) | (0x89bc >> 2),
98 0x00000000,
99 (0x8040 << 16) | (0x89bc >> 2),
100 0x00000000,
101 (0x8000 << 16) | (0x8c1c >> 2),
102 0x00000000,
103 (0x8040 << 16) | (0x8c1c >> 2),
104 0x00000000,
105 (0x9c00 << 16) | (0x98f0 >> 2),
106 0x00000000,
107 (0x9c00 << 16) | (0xe7c >> 2),
108 0x00000000,
109 (0x8000 << 16) | (0x9148 >> 2),
110 0x00000000,
111 (0x8040 << 16) | (0x9148 >> 2),
112 0x00000000,
113 (0x9c00 << 16) | (0x9150 >> 2),
114 0x00000000,
115 (0x9c00 << 16) | (0x897c >> 2),
116 0x00000000,
117 (0x9c00 << 16) | (0x8d8c >> 2),
118 0x00000000,
119 (0x9c00 << 16) | (0xac54 >> 2),
120 0X00000000,
121 0x3,
122 (0x9c00 << 16) | (0x98f8 >> 2),
123 0x00000000,
124 (0x9c00 << 16) | (0x9910 >> 2),
125 0x00000000,
126 (0x9c00 << 16) | (0x9914 >> 2),
127 0x00000000,
128 (0x9c00 << 16) | (0x9918 >> 2),
129 0x00000000,
130 (0x9c00 << 16) | (0x991c >> 2),
131 0x00000000,
132 (0x9c00 << 16) | (0x9920 >> 2),
133 0x00000000,
134 (0x9c00 << 16) | (0x9924 >> 2),
135 0x00000000,
136 (0x9c00 << 16) | (0x9928 >> 2),
137 0x00000000,
138 (0x9c00 << 16) | (0x992c >> 2),
139 0x00000000,
140 (0x9c00 << 16) | (0x9930 >> 2),
141 0x00000000,
142 (0x9c00 << 16) | (0x9934 >> 2),
143 0x00000000,
144 (0x9c00 << 16) | (0x9938 >> 2),
145 0x00000000,
146 (0x9c00 << 16) | (0x993c >> 2),
147 0x00000000,
148 (0x9c00 << 16) | (0x9940 >> 2),
149 0x00000000,
150 (0x9c00 << 16) | (0x9944 >> 2),
151 0x00000000,
152 (0x9c00 << 16) | (0x9948 >> 2),
153 0x00000000,
154 (0x9c00 << 16) | (0x994c >> 2),
155 0x00000000,
156 (0x9c00 << 16) | (0x9950 >> 2),
157 0x00000000,
158 (0x9c00 << 16) | (0x9954 >> 2),
159 0x00000000,
160 (0x9c00 << 16) | (0x9958 >> 2),
161 0x00000000,
162 (0x9c00 << 16) | (0x995c >> 2),
163 0x00000000,
164 (0x9c00 << 16) | (0x9960 >> 2),
165 0x00000000,
166 (0x9c00 << 16) | (0x9964 >> 2),
167 0x00000000,
168 (0x9c00 << 16) | (0x9968 >> 2),
169 0x00000000,
170 (0x9c00 << 16) | (0x996c >> 2),
171 0x00000000,
172 (0x9c00 << 16) | (0x9970 >> 2),
173 0x00000000,
174 (0x9c00 << 16) | (0x9974 >> 2),
175 0x00000000,
176 (0x9c00 << 16) | (0x9978 >> 2),
177 0x00000000,
178 (0x9c00 << 16) | (0x997c >> 2),
179 0x00000000,
180 (0x9c00 << 16) | (0x9980 >> 2),
181 0x00000000,
182 (0x9c00 << 16) | (0x9984 >> 2),
183 0x00000000,
184 (0x9c00 << 16) | (0x9988 >> 2),
185 0x00000000,
186 (0x9c00 << 16) | (0x998c >> 2),
187 0x00000000,
188 (0x9c00 << 16) | (0x8c00 >> 2),
189 0x00000000,
190 (0x9c00 << 16) | (0x8c14 >> 2),
191 0x00000000,
192 (0x9c00 << 16) | (0x8c04 >> 2),
193 0x00000000,
194 (0x9c00 << 16) | (0x8c08 >> 2),
195 0x00000000,
196 (0x8000 << 16) | (0x9b7c >> 2),
197 0x00000000,
198 (0x8040 << 16) | (0x9b7c >> 2),
199 0x00000000,
200 (0x8000 << 16) | (0xe84 >> 2),
201 0x00000000,
202 (0x8040 << 16) | (0xe84 >> 2),
203 0x00000000,
204 (0x8000 << 16) | (0x89c0 >> 2),
205 0x00000000,
206 (0x8040 << 16) | (0x89c0 >> 2),
207 0x00000000,
208 (0x8000 << 16) | (0x914c >> 2),
209 0x00000000,
210 (0x8040 << 16) | (0x914c >> 2),
211 0x00000000,
212 (0x8000 << 16) | (0x8c20 >> 2),
213 0x00000000,
214 (0x8040 << 16) | (0x8c20 >> 2),
215 0x00000000,
216 (0x8000 << 16) | (0x9354 >> 2),
217 0x00000000,
218 (0x8040 << 16) | (0x9354 >> 2),
219 0x00000000,
220 (0x9c00 << 16) | (0x9060 >> 2),
221 0x00000000,
222 (0x9c00 << 16) | (0x9364 >> 2),
223 0x00000000,
224 (0x9c00 << 16) | (0x9100 >> 2),
225 0x00000000,
226 (0x9c00 << 16) | (0x913c >> 2),
227 0x00000000,
228 (0x8000 << 16) | (0x90e0 >> 2),
229 0x00000000,
230 (0x8000 << 16) | (0x90e4 >> 2),
231 0x00000000,
232 (0x8000 << 16) | (0x90e8 >> 2),
233 0x00000000,
234 (0x8040 << 16) | (0x90e0 >> 2),
235 0x00000000,
236 (0x8040 << 16) | (0x90e4 >> 2),
237 0x00000000,
238 (0x8040 << 16) | (0x90e8 >> 2),
239 0x00000000,
240 (0x9c00 << 16) | (0x8bcc >> 2),
241 0x00000000,
242 (0x9c00 << 16) | (0x8b24 >> 2),
243 0x00000000,
244 (0x9c00 << 16) | (0x88c4 >> 2),
245 0x00000000,
246 (0x9c00 << 16) | (0x8e50 >> 2),
247 0x00000000,
248 (0x9c00 << 16) | (0x8c0c >> 2),
249 0x00000000,
250 (0x9c00 << 16) | (0x8e58 >> 2),
251 0x00000000,
252 (0x9c00 << 16) | (0x8e5c >> 2),
253 0x00000000,
254 (0x9c00 << 16) | (0x9508 >> 2),
255 0x00000000,
256 (0x9c00 << 16) | (0x950c >> 2),
257 0x00000000,
258 (0x9c00 << 16) | (0x9494 >> 2),
259 0x00000000,
260 (0x9c00 << 16) | (0xac0c >> 2),
261 0x00000000,
262 (0x9c00 << 16) | (0xac10 >> 2),
263 0x00000000,
264 (0x9c00 << 16) | (0xac14 >> 2),
265 0x00000000,
266 (0x9c00 << 16) | (0xae00 >> 2),
267 0x00000000,
268 (0x9c00 << 16) | (0xac08 >> 2),
269 0x00000000,
270 (0x9c00 << 16) | (0x88d4 >> 2),
271 0x00000000,
272 (0x9c00 << 16) | (0x88c8 >> 2),
273 0x00000000,
274 (0x9c00 << 16) | (0x88cc >> 2),
275 0x00000000,
276 (0x9c00 << 16) | (0x89b0 >> 2),
277 0x00000000,
278 (0x9c00 << 16) | (0x8b10 >> 2),
279 0x00000000,
280 (0x9c00 << 16) | (0x8a14 >> 2),
281 0x00000000,
282 (0x9c00 << 16) | (0x9830 >> 2),
283 0x00000000,
284 (0x9c00 << 16) | (0x9834 >> 2),
285 0x00000000,
286 (0x9c00 << 16) | (0x9838 >> 2),
287 0x00000000,
288 (0x9c00 << 16) | (0x9a10 >> 2),
289 0x00000000,
290 (0x8000 << 16) | (0x9870 >> 2),
291 0x00000000,
292 (0x8000 << 16) | (0x9874 >> 2),
293 0x00000000,
294 (0x8001 << 16) | (0x9870 >> 2),
295 0x00000000,
296 (0x8001 << 16) | (0x9874 >> 2),
297 0x00000000,
298 (0x8040 << 16) | (0x9870 >> 2),
299 0x00000000,
300 (0x8040 << 16) | (0x9874 >> 2),
301 0x00000000,
302 (0x8041 << 16) | (0x9870 >> 2),
303 0x00000000,
304 (0x8041 << 16) | (0x9874 >> 2),
305 0x00000000,
306 0x00000000
307 };
308
309 static const u32 tahiti_golden_rlc_registers[] =
310 {
311 0xc424, 0xffffffff, 0x00601005,
312 0xc47c, 0xffffffff, 0x10104040,
313 0xc488, 0xffffffff, 0x0100000a,
314 0xc314, 0xffffffff, 0x00000800,
315 0xc30c, 0xffffffff, 0x800000f4,
316 0xf4a8, 0xffffffff, 0x00000000
317 };
318
319 static const u32 tahiti_golden_registers[] =
320 {
321 0x9a10, 0x00010000, 0x00018208,
322 0x9830, 0xffffffff, 0x00000000,
323 0x9834, 0xf00fffff, 0x00000400,
324 0x9838, 0x0002021c, 0x00020200,
325 0xc78, 0x00000080, 0x00000000,
326 0xd030, 0x000300c0, 0x00800040,
327 0xd830, 0x000300c0, 0x00800040,
328 0x5bb0, 0x000000f0, 0x00000070,
329 0x5bc0, 0x00200000, 0x50100000,
330 0x7030, 0x31000311, 0x00000011,
331 0x277c, 0x00000003, 0x000007ff,
332 0x240c, 0x000007ff, 0x00000000,
333 0x8a14, 0xf000001f, 0x00000007,
334 0x8b24, 0xffffffff, 0x00ffffff,
335 0x8b10, 0x0000ff0f, 0x00000000,
336 0x28a4c, 0x07ffffff, 0x4e000000,
337 0x28350, 0x3f3f3fff, 0x2a00126a,
338 0x30, 0x000000ff, 0x0040,
339 0x34, 0x00000040, 0x00004040,
340 0x9100, 0x07ffffff, 0x03000000,
341 0x8e88, 0x01ff1f3f, 0x00000000,
342 0x8e84, 0x01ff1f3f, 0x00000000,
343 0x9060, 0x0000007f, 0x00000020,
344 0x9508, 0x00010000, 0x00010000,
345 0xac14, 0x00000200, 0x000002fb,
346 0xac10, 0xffffffff, 0x0000543b,
347 0xac0c, 0xffffffff, 0xa9210876,
348 0x88d0, 0xffffffff, 0x000fff40,
349 0x88d4, 0x0000001f, 0x00000010,
350 0x1410, 0x20000000, 0x20fffed8,
351 0x15c0, 0x000c0fc0, 0x000c0400
352 };
353
354 static const u32 tahiti_golden_registers2[] =
355 {
356 0xc64, 0x00000001, 0x00000001
357 };
358
359 static const u32 pitcairn_golden_rlc_registers[] =
360 {
361 0xc424, 0xffffffff, 0x00601004,
362 0xc47c, 0xffffffff, 0x10102020,
363 0xc488, 0xffffffff, 0x01000020,
364 0xc314, 0xffffffff, 0x00000800,
365 0xc30c, 0xffffffff, 0x800000a4
366 };
367
368 static const u32 pitcairn_golden_registers[] =
369 {
370 0x9a10, 0x00010000, 0x00018208,
371 0x9830, 0xffffffff, 0x00000000,
372 0x9834, 0xf00fffff, 0x00000400,
373 0x9838, 0x0002021c, 0x00020200,
374 0xc78, 0x00000080, 0x00000000,
375 0xd030, 0x000300c0, 0x00800040,
376 0xd830, 0x000300c0, 0x00800040,
377 0x5bb0, 0x000000f0, 0x00000070,
378 0x5bc0, 0x00200000, 0x50100000,
379 0x7030, 0x31000311, 0x00000011,
380 0x2ae4, 0x00073ffe, 0x000022a2,
381 0x240c, 0x000007ff, 0x00000000,
382 0x8a14, 0xf000001f, 0x00000007,
383 0x8b24, 0xffffffff, 0x00ffffff,
384 0x8b10, 0x0000ff0f, 0x00000000,
385 0x28a4c, 0x07ffffff, 0x4e000000,
386 0x28350, 0x3f3f3fff, 0x2a00126a,
387 0x30, 0x000000ff, 0x0040,
388 0x34, 0x00000040, 0x00004040,
389 0x9100, 0x07ffffff, 0x03000000,
390 0x9060, 0x0000007f, 0x00000020,
391 0x9508, 0x00010000, 0x00010000,
392 0xac14, 0x000003ff, 0x000000f7,
393 0xac10, 0xffffffff, 0x00000000,
394 0xac0c, 0xffffffff, 0x32761054,
395 0x88d4, 0x0000001f, 0x00000010,
396 0x15c0, 0x000c0fc0, 0x000c0400
397 };
398
399 static const u32 verde_golden_rlc_registers[] =
400 {
401 0xc424, 0xffffffff, 0x033f1005,
402 0xc47c, 0xffffffff, 0x10808020,
403 0xc488, 0xffffffff, 0x00800008,
404 0xc314, 0xffffffff, 0x00001000,
405 0xc30c, 0xffffffff, 0x80010014
406 };
407
408 static const u32 verde_golden_registers[] =
409 {
410 0x9a10, 0x00010000, 0x00018208,
411 0x9830, 0xffffffff, 0x00000000,
412 0x9834, 0xf00fffff, 0x00000400,
413 0x9838, 0x0002021c, 0x00020200,
414 0xc78, 0x00000080, 0x00000000,
415 0xd030, 0x000300c0, 0x00800040,
416 0xd030, 0x000300c0, 0x00800040,
417 0xd830, 0x000300c0, 0x00800040,
418 0xd830, 0x000300c0, 0x00800040,
419 0x5bb0, 0x000000f0, 0x00000070,
420 0x5bc0, 0x00200000, 0x50100000,
421 0x7030, 0x31000311, 0x00000011,
422 0x2ae4, 0x00073ffe, 0x000022a2,
423 0x2ae4, 0x00073ffe, 0x000022a2,
424 0x2ae4, 0x00073ffe, 0x000022a2,
425 0x240c, 0x000007ff, 0x00000000,
426 0x240c, 0x000007ff, 0x00000000,
427 0x240c, 0x000007ff, 0x00000000,
428 0x8a14, 0xf000001f, 0x00000007,
429 0x8a14, 0xf000001f, 0x00000007,
430 0x8a14, 0xf000001f, 0x00000007,
431 0x8b24, 0xffffffff, 0x00ffffff,
432 0x8b10, 0x0000ff0f, 0x00000000,
433 0x28a4c, 0x07ffffff, 0x4e000000,
434 0x28350, 0x3f3f3fff, 0x0000124a,
435 0x28350, 0x3f3f3fff, 0x0000124a,
436 0x28350, 0x3f3f3fff, 0x0000124a,
437 0x30, 0x000000ff, 0x0040,
438 0x34, 0x00000040, 0x00004040,
439 0x9100, 0x07ffffff, 0x03000000,
440 0x9100, 0x07ffffff, 0x03000000,
441 0x8e88, 0x01ff1f3f, 0x00000000,
442 0x8e88, 0x01ff1f3f, 0x00000000,
443 0x8e88, 0x01ff1f3f, 0x00000000,
444 0x8e84, 0x01ff1f3f, 0x00000000,
445 0x8e84, 0x01ff1f3f, 0x00000000,
446 0x8e84, 0x01ff1f3f, 0x00000000,
447 0x9060, 0x0000007f, 0x00000020,
448 0x9508, 0x00010000, 0x00010000,
449 0xac14, 0x000003ff, 0x00000003,
450 0xac14, 0x000003ff, 0x00000003,
451 0xac14, 0x000003ff, 0x00000003,
452 0xac10, 0xffffffff, 0x00000000,
453 0xac10, 0xffffffff, 0x00000000,
454 0xac10, 0xffffffff, 0x00000000,
455 0xac0c, 0xffffffff, 0x00001032,
456 0xac0c, 0xffffffff, 0x00001032,
457 0xac0c, 0xffffffff, 0x00001032,
458 0x88d4, 0x0000001f, 0x00000010,
459 0x88d4, 0x0000001f, 0x00000010,
460 0x88d4, 0x0000001f, 0x00000010,
461 0x15c0, 0x000c0fc0, 0x000c0400
462 };
463
464 static const u32 oland_golden_rlc_registers[] =
465 {
466 0xc424, 0xffffffff, 0x00601005,
467 0xc47c, 0xffffffff, 0x10104040,
468 0xc488, 0xffffffff, 0x0100000a,
469 0xc314, 0xffffffff, 0x00000800,
470 0xc30c, 0xffffffff, 0x800000f4
471 };
472
473 static const u32 oland_golden_registers[] =
474 {
475 0x9a10, 0x00010000, 0x00018208,
476 0x9830, 0xffffffff, 0x00000000,
477 0x9834, 0xf00fffff, 0x00000400,
478 0x9838, 0x0002021c, 0x00020200,
479 0xc78, 0x00000080, 0x00000000,
480 0xd030, 0x000300c0, 0x00800040,
481 0xd830, 0x000300c0, 0x00800040,
482 0x5bb0, 0x000000f0, 0x00000070,
483 0x5bc0, 0x00200000, 0x50100000,
484 0x7030, 0x31000311, 0x00000011,
485 0x2ae4, 0x00073ffe, 0x000022a2,
486 0x240c, 0x000007ff, 0x00000000,
487 0x8a14, 0xf000001f, 0x00000007,
488 0x8b24, 0xffffffff, 0x00ffffff,
489 0x8b10, 0x0000ff0f, 0x00000000,
490 0x28a4c, 0x07ffffff, 0x4e000000,
491 0x28350, 0x3f3f3fff, 0x00000082,
492 0x30, 0x000000ff, 0x0040,
493 0x34, 0x00000040, 0x00004040,
494 0x9100, 0x07ffffff, 0x03000000,
495 0x9060, 0x0000007f, 0x00000020,
496 0x9508, 0x00010000, 0x00010000,
497 0xac14, 0x000003ff, 0x000000f3,
498 0xac10, 0xffffffff, 0x00000000,
499 0xac0c, 0xffffffff, 0x00003210,
500 0x88d4, 0x0000001f, 0x00000010,
501 0x15c0, 0x000c0fc0, 0x000c0400
502 };
503
504 static const u32 hainan_golden_registers[] =
505 {
506 0x9a10, 0x00010000, 0x00018208,
507 0x9830, 0xffffffff, 0x00000000,
508 0x9834, 0xf00fffff, 0x00000400,
509 0x9838, 0x0002021c, 0x00020200,
510 0xd0c0, 0xff000fff, 0x00000100,
511 0xd030, 0x000300c0, 0x00800040,
512 0xd8c0, 0xff000fff, 0x00000100,
513 0xd830, 0x000300c0, 0x00800040,
514 0x2ae4, 0x00073ffe, 0x000022a2,
515 0x240c, 0x000007ff, 0x00000000,
516 0x8a14, 0xf000001f, 0x00000007,
517 0x8b24, 0xffffffff, 0x00ffffff,
518 0x8b10, 0x0000ff0f, 0x00000000,
519 0x28a4c, 0x07ffffff, 0x4e000000,
520 0x28350, 0x3f3f3fff, 0x00000000,
521 0x30, 0x000000ff, 0x0040,
522 0x34, 0x00000040, 0x00004040,
523 0x9100, 0x03e00000, 0x03600000,
524 0x9060, 0x0000007f, 0x00000020,
525 0x9508, 0x00010000, 0x00010000,
526 0xac14, 0x000003ff, 0x000000f1,
527 0xac10, 0xffffffff, 0x00000000,
528 0xac0c, 0xffffffff, 0x00003210,
529 0x88d4, 0x0000001f, 0x00000010,
530 0x15c0, 0x000c0fc0, 0x000c0400
531 };
532
533 static const u32 hainan_golden_registers2[] =
534 {
535 0x98f8, 0xffffffff, 0x02010001
536 };
537
538 static const u32 tahiti_mgcg_cgcg_init[] =
539 {
540 0xc400, 0xffffffff, 0xfffffffc,
541 0x802c, 0xffffffff, 0xe0000000,
542 0x9a60, 0xffffffff, 0x00000100,
543 0x92a4, 0xffffffff, 0x00000100,
544 0xc164, 0xffffffff, 0x00000100,
545 0x9774, 0xffffffff, 0x00000100,
546 0x8984, 0xffffffff, 0x06000100,
547 0x8a18, 0xffffffff, 0x00000100,
548 0x92a0, 0xffffffff, 0x00000100,
549 0xc380, 0xffffffff, 0x00000100,
550 0x8b28, 0xffffffff, 0x00000100,
551 0x9144, 0xffffffff, 0x00000100,
552 0x8d88, 0xffffffff, 0x00000100,
553 0x8d8c, 0xffffffff, 0x00000100,
554 0x9030, 0xffffffff, 0x00000100,
555 0x9034, 0xffffffff, 0x00000100,
556 0x9038, 0xffffffff, 0x00000100,
557 0x903c, 0xffffffff, 0x00000100,
558 0xad80, 0xffffffff, 0x00000100,
559 0xac54, 0xffffffff, 0x00000100,
560 0x897c, 0xffffffff, 0x06000100,
561 0x9868, 0xffffffff, 0x00000100,
562 0x9510, 0xffffffff, 0x00000100,
563 0xaf04, 0xffffffff, 0x00000100,
564 0xae04, 0xffffffff, 0x00000100,
565 0x949c, 0xffffffff, 0x00000100,
566 0x802c, 0xffffffff, 0xe0000000,
567 0x9160, 0xffffffff, 0x00010000,
568 0x9164, 0xffffffff, 0x00030002,
569 0x9168, 0xffffffff, 0x00040007,
570 0x916c, 0xffffffff, 0x00060005,
571 0x9170, 0xffffffff, 0x00090008,
572 0x9174, 0xffffffff, 0x00020001,
573 0x9178, 0xffffffff, 0x00040003,
574 0x917c, 0xffffffff, 0x00000007,
575 0x9180, 0xffffffff, 0x00060005,
576 0x9184, 0xffffffff, 0x00090008,
577 0x9188, 0xffffffff, 0x00030002,
578 0x918c, 0xffffffff, 0x00050004,
579 0x9190, 0xffffffff, 0x00000008,
580 0x9194, 0xffffffff, 0x00070006,
581 0x9198, 0xffffffff, 0x000a0009,
582 0x919c, 0xffffffff, 0x00040003,
583 0x91a0, 0xffffffff, 0x00060005,
584 0x91a4, 0xffffffff, 0x00000009,
585 0x91a8, 0xffffffff, 0x00080007,
586 0x91ac, 0xffffffff, 0x000b000a,
587 0x91b0, 0xffffffff, 0x00050004,
588 0x91b4, 0xffffffff, 0x00070006,
589 0x91b8, 0xffffffff, 0x0008000b,
590 0x91bc, 0xffffffff, 0x000a0009,
591 0x91c0, 0xffffffff, 0x000d000c,
592 0x91c4, 0xffffffff, 0x00060005,
593 0x91c8, 0xffffffff, 0x00080007,
594 0x91cc, 0xffffffff, 0x0000000b,
595 0x91d0, 0xffffffff, 0x000a0009,
596 0x91d4, 0xffffffff, 0x000d000c,
597 0x91d8, 0xffffffff, 0x00070006,
598 0x91dc, 0xffffffff, 0x00090008,
599 0x91e0, 0xffffffff, 0x0000000c,
600 0x91e4, 0xffffffff, 0x000b000a,
601 0x91e8, 0xffffffff, 0x000e000d,
602 0x91ec, 0xffffffff, 0x00080007,
603 0x91f0, 0xffffffff, 0x000a0009,
604 0x91f4, 0xffffffff, 0x0000000d,
605 0x91f8, 0xffffffff, 0x000c000b,
606 0x91fc, 0xffffffff, 0x000f000e,
607 0x9200, 0xffffffff, 0x00090008,
608 0x9204, 0xffffffff, 0x000b000a,
609 0x9208, 0xffffffff, 0x000c000f,
610 0x920c, 0xffffffff, 0x000e000d,
611 0x9210, 0xffffffff, 0x00110010,
612 0x9214, 0xffffffff, 0x000a0009,
613 0x9218, 0xffffffff, 0x000c000b,
614 0x921c, 0xffffffff, 0x0000000f,
615 0x9220, 0xffffffff, 0x000e000d,
616 0x9224, 0xffffffff, 0x00110010,
617 0x9228, 0xffffffff, 0x000b000a,
618 0x922c, 0xffffffff, 0x000d000c,
619 0x9230, 0xffffffff, 0x00000010,
620 0x9234, 0xffffffff, 0x000f000e,
621 0x9238, 0xffffffff, 0x00120011,
622 0x923c, 0xffffffff, 0x000c000b,
623 0x9240, 0xffffffff, 0x000e000d,
624 0x9244, 0xffffffff, 0x00000011,
625 0x9248, 0xffffffff, 0x0010000f,
626 0x924c, 0xffffffff, 0x00130012,
627 0x9250, 0xffffffff, 0x000d000c,
628 0x9254, 0xffffffff, 0x000f000e,
629 0x9258, 0xffffffff, 0x00100013,
630 0x925c, 0xffffffff, 0x00120011,
631 0x9260, 0xffffffff, 0x00150014,
632 0x9264, 0xffffffff, 0x000e000d,
633 0x9268, 0xffffffff, 0x0010000f,
634 0x926c, 0xffffffff, 0x00000013,
635 0x9270, 0xffffffff, 0x00120011,
636 0x9274, 0xffffffff, 0x00150014,
637 0x9278, 0xffffffff, 0x000f000e,
638 0x927c, 0xffffffff, 0x00110010,
639 0x9280, 0xffffffff, 0x00000014,
640 0x9284, 0xffffffff, 0x00130012,
641 0x9288, 0xffffffff, 0x00160015,
642 0x928c, 0xffffffff, 0x0010000f,
643 0x9290, 0xffffffff, 0x00120011,
644 0x9294, 0xffffffff, 0x00000015,
645 0x9298, 0xffffffff, 0x00140013,
646 0x929c, 0xffffffff, 0x00170016,
647 0x9150, 0xffffffff, 0x96940200,
648 0x8708, 0xffffffff, 0x00900100,
649 0xc478, 0xffffffff, 0x00000080,
650 0xc404, 0xffffffff, 0x0020003f,
651 0x30, 0xffffffff, 0x0000001c,
652 0x34, 0x000f0000, 0x000f0000,
653 0x160c, 0xffffffff, 0x00000100,
654 0x1024, 0xffffffff, 0x00000100,
655 0x102c, 0x00000101, 0x00000000,
656 0x20a8, 0xffffffff, 0x00000104,
657 0x264c, 0x000c0000, 0x000c0000,
658 0x2648, 0x000c0000, 0x000c0000,
659 0x55e4, 0xff000fff, 0x00000100,
660 0x55e8, 0x00000001, 0x00000001,
661 0x2f50, 0x00000001, 0x00000001,
662 0x30cc, 0xc0000fff, 0x00000104,
663 0xc1e4, 0x00000001, 0x00000001,
664 0xd0c0, 0xfffffff0, 0x00000100,
665 0xd8c0, 0xfffffff0, 0x00000100
666 };
667
668 static const u32 pitcairn_mgcg_cgcg_init[] =
669 {
670 0xc400, 0xffffffff, 0xfffffffc,
671 0x802c, 0xffffffff, 0xe0000000,
672 0x9a60, 0xffffffff, 0x00000100,
673 0x92a4, 0xffffffff, 0x00000100,
674 0xc164, 0xffffffff, 0x00000100,
675 0x9774, 0xffffffff, 0x00000100,
676 0x8984, 0xffffffff, 0x06000100,
677 0x8a18, 0xffffffff, 0x00000100,
678 0x92a0, 0xffffffff, 0x00000100,
679 0xc380, 0xffffffff, 0x00000100,
680 0x8b28, 0xffffffff, 0x00000100,
681 0x9144, 0xffffffff, 0x00000100,
682 0x8d88, 0xffffffff, 0x00000100,
683 0x8d8c, 0xffffffff, 0x00000100,
684 0x9030, 0xffffffff, 0x00000100,
685 0x9034, 0xffffffff, 0x00000100,
686 0x9038, 0xffffffff, 0x00000100,
687 0x903c, 0xffffffff, 0x00000100,
688 0xad80, 0xffffffff, 0x00000100,
689 0xac54, 0xffffffff, 0x00000100,
690 0x897c, 0xffffffff, 0x06000100,
691 0x9868, 0xffffffff, 0x00000100,
692 0x9510, 0xffffffff, 0x00000100,
693 0xaf04, 0xffffffff, 0x00000100,
694 0xae04, 0xffffffff, 0x00000100,
695 0x949c, 0xffffffff, 0x00000100,
696 0x802c, 0xffffffff, 0xe0000000,
697 0x9160, 0xffffffff, 0x00010000,
698 0x9164, 0xffffffff, 0x00030002,
699 0x9168, 0xffffffff, 0x00040007,
700 0x916c, 0xffffffff, 0x00060005,
701 0x9170, 0xffffffff, 0x00090008,
702 0x9174, 0xffffffff, 0x00020001,
703 0x9178, 0xffffffff, 0x00040003,
704 0x917c, 0xffffffff, 0x00000007,
705 0x9180, 0xffffffff, 0x00060005,
706 0x9184, 0xffffffff, 0x00090008,
707 0x9188, 0xffffffff, 0x00030002,
708 0x918c, 0xffffffff, 0x00050004,
709 0x9190, 0xffffffff, 0x00000008,
710 0x9194, 0xffffffff, 0x00070006,
711 0x9198, 0xffffffff, 0x000a0009,
712 0x919c, 0xffffffff, 0x00040003,
713 0x91a0, 0xffffffff, 0x00060005,
714 0x91a4, 0xffffffff, 0x00000009,
715 0x91a8, 0xffffffff, 0x00080007,
716 0x91ac, 0xffffffff, 0x000b000a,
717 0x91b0, 0xffffffff, 0x00050004,
718 0x91b4, 0xffffffff, 0x00070006,
719 0x91b8, 0xffffffff, 0x0008000b,
720 0x91bc, 0xffffffff, 0x000a0009,
721 0x91c0, 0xffffffff, 0x000d000c,
722 0x9200, 0xffffffff, 0x00090008,
723 0x9204, 0xffffffff, 0x000b000a,
724 0x9208, 0xffffffff, 0x000c000f,
725 0x920c, 0xffffffff, 0x000e000d,
726 0x9210, 0xffffffff, 0x00110010,
727 0x9214, 0xffffffff, 0x000a0009,
728 0x9218, 0xffffffff, 0x000c000b,
729 0x921c, 0xffffffff, 0x0000000f,
730 0x9220, 0xffffffff, 0x000e000d,
731 0x9224, 0xffffffff, 0x00110010,
732 0x9228, 0xffffffff, 0x000b000a,
733 0x922c, 0xffffffff, 0x000d000c,
734 0x9230, 0xffffffff, 0x00000010,
735 0x9234, 0xffffffff, 0x000f000e,
736 0x9238, 0xffffffff, 0x00120011,
737 0x923c, 0xffffffff, 0x000c000b,
738 0x9240, 0xffffffff, 0x000e000d,
739 0x9244, 0xffffffff, 0x00000011,
740 0x9248, 0xffffffff, 0x0010000f,
741 0x924c, 0xffffffff, 0x00130012,
742 0x9250, 0xffffffff, 0x000d000c,
743 0x9254, 0xffffffff, 0x000f000e,
744 0x9258, 0xffffffff, 0x00100013,
745 0x925c, 0xffffffff, 0x00120011,
746 0x9260, 0xffffffff, 0x00150014,
747 0x9150, 0xffffffff, 0x96940200,
748 0x8708, 0xffffffff, 0x00900100,
749 0xc478, 0xffffffff, 0x00000080,
750 0xc404, 0xffffffff, 0x0020003f,
751 0x30, 0xffffffff, 0x0000001c,
752 0x34, 0x000f0000, 0x000f0000,
753 0x160c, 0xffffffff, 0x00000100,
754 0x1024, 0xffffffff, 0x00000100,
755 0x102c, 0x00000101, 0x00000000,
756 0x20a8, 0xffffffff, 0x00000104,
757 0x55e4, 0xff000fff, 0x00000100,
758 0x55e8, 0x00000001, 0x00000001,
759 0x2f50, 0x00000001, 0x00000001,
760 0x30cc, 0xc0000fff, 0x00000104,
761 0xc1e4, 0x00000001, 0x00000001,
762 0xd0c0, 0xfffffff0, 0x00000100,
763 0xd8c0, 0xfffffff0, 0x00000100
764 };
765
766 static const u32 verde_mgcg_cgcg_init[] =
767 {
768 0xc400, 0xffffffff, 0xfffffffc,
769 0x802c, 0xffffffff, 0xe0000000,
770 0x9a60, 0xffffffff, 0x00000100,
771 0x92a4, 0xffffffff, 0x00000100,
772 0xc164, 0xffffffff, 0x00000100,
773 0x9774, 0xffffffff, 0x00000100,
774 0x8984, 0xffffffff, 0x06000100,
775 0x8a18, 0xffffffff, 0x00000100,
776 0x92a0, 0xffffffff, 0x00000100,
777 0xc380, 0xffffffff, 0x00000100,
778 0x8b28, 0xffffffff, 0x00000100,
779 0x9144, 0xffffffff, 0x00000100,
780 0x8d88, 0xffffffff, 0x00000100,
781 0x8d8c, 0xffffffff, 0x00000100,
782 0x9030, 0xffffffff, 0x00000100,
783 0x9034, 0xffffffff, 0x00000100,
784 0x9038, 0xffffffff, 0x00000100,
785 0x903c, 0xffffffff, 0x00000100,
786 0xad80, 0xffffffff, 0x00000100,
787 0xac54, 0xffffffff, 0x00000100,
788 0x897c, 0xffffffff, 0x06000100,
789 0x9868, 0xffffffff, 0x00000100,
790 0x9510, 0xffffffff, 0x00000100,
791 0xaf04, 0xffffffff, 0x00000100,
792 0xae04, 0xffffffff, 0x00000100,
793 0x949c, 0xffffffff, 0x00000100,
794 0x802c, 0xffffffff, 0xe0000000,
795 0x9160, 0xffffffff, 0x00010000,
796 0x9164, 0xffffffff, 0x00030002,
797 0x9168, 0xffffffff, 0x00040007,
798 0x916c, 0xffffffff, 0x00060005,
799 0x9170, 0xffffffff, 0x00090008,
800 0x9174, 0xffffffff, 0x00020001,
801 0x9178, 0xffffffff, 0x00040003,
802 0x917c, 0xffffffff, 0x00000007,
803 0x9180, 0xffffffff, 0x00060005,
804 0x9184, 0xffffffff, 0x00090008,
805 0x9188, 0xffffffff, 0x00030002,
806 0x918c, 0xffffffff, 0x00050004,
807 0x9190, 0xffffffff, 0x00000008,
808 0x9194, 0xffffffff, 0x00070006,
809 0x9198, 0xffffffff, 0x000a0009,
810 0x919c, 0xffffffff, 0x00040003,
811 0x91a0, 0xffffffff, 0x00060005,
812 0x91a4, 0xffffffff, 0x00000009,
813 0x91a8, 0xffffffff, 0x00080007,
814 0x91ac, 0xffffffff, 0x000b000a,
815 0x91b0, 0xffffffff, 0x00050004,
816 0x91b4, 0xffffffff, 0x00070006,
817 0x91b8, 0xffffffff, 0x0008000b,
818 0x91bc, 0xffffffff, 0x000a0009,
819 0x91c0, 0xffffffff, 0x000d000c,
820 0x9200, 0xffffffff, 0x00090008,
821 0x9204, 0xffffffff, 0x000b000a,
822 0x9208, 0xffffffff, 0x000c000f,
823 0x920c, 0xffffffff, 0x000e000d,
824 0x9210, 0xffffffff, 0x00110010,
825 0x9214, 0xffffffff, 0x000a0009,
826 0x9218, 0xffffffff, 0x000c000b,
827 0x921c, 0xffffffff, 0x0000000f,
828 0x9220, 0xffffffff, 0x000e000d,
829 0x9224, 0xffffffff, 0x00110010,
830 0x9228, 0xffffffff, 0x000b000a,
831 0x922c, 0xffffffff, 0x000d000c,
832 0x9230, 0xffffffff, 0x00000010,
833 0x9234, 0xffffffff, 0x000f000e,
834 0x9238, 0xffffffff, 0x00120011,
835 0x923c, 0xffffffff, 0x000c000b,
836 0x9240, 0xffffffff, 0x000e000d,
837 0x9244, 0xffffffff, 0x00000011,
838 0x9248, 0xffffffff, 0x0010000f,
839 0x924c, 0xffffffff, 0x00130012,
840 0x9250, 0xffffffff, 0x000d000c,
841 0x9254, 0xffffffff, 0x000f000e,
842 0x9258, 0xffffffff, 0x00100013,
843 0x925c, 0xffffffff, 0x00120011,
844 0x9260, 0xffffffff, 0x00150014,
845 0x9150, 0xffffffff, 0x96940200,
846 0x8708, 0xffffffff, 0x00900100,
847 0xc478, 0xffffffff, 0x00000080,
848 0xc404, 0xffffffff, 0x0020003f,
849 0x30, 0xffffffff, 0x0000001c,
850 0x34, 0x000f0000, 0x000f0000,
851 0x160c, 0xffffffff, 0x00000100,
852 0x1024, 0xffffffff, 0x00000100,
853 0x102c, 0x00000101, 0x00000000,
854 0x20a8, 0xffffffff, 0x00000104,
855 0x264c, 0x000c0000, 0x000c0000,
856 0x2648, 0x000c0000, 0x000c0000,
857 0x55e4, 0xff000fff, 0x00000100,
858 0x55e8, 0x00000001, 0x00000001,
859 0x2f50, 0x00000001, 0x00000001,
860 0x30cc, 0xc0000fff, 0x00000104,
861 0xc1e4, 0x00000001, 0x00000001,
862 0xd0c0, 0xfffffff0, 0x00000100,
863 0xd8c0, 0xfffffff0, 0x00000100
864 };
865
866 static const u32 oland_mgcg_cgcg_init[] =
867 {
868 0xc400, 0xffffffff, 0xfffffffc,
869 0x802c, 0xffffffff, 0xe0000000,
870 0x9a60, 0xffffffff, 0x00000100,
871 0x92a4, 0xffffffff, 0x00000100,
872 0xc164, 0xffffffff, 0x00000100,
873 0x9774, 0xffffffff, 0x00000100,
874 0x8984, 0xffffffff, 0x06000100,
875 0x8a18, 0xffffffff, 0x00000100,
876 0x92a0, 0xffffffff, 0x00000100,
877 0xc380, 0xffffffff, 0x00000100,
878 0x8b28, 0xffffffff, 0x00000100,
879 0x9144, 0xffffffff, 0x00000100,
880 0x8d88, 0xffffffff, 0x00000100,
881 0x8d8c, 0xffffffff, 0x00000100,
882 0x9030, 0xffffffff, 0x00000100,
883 0x9034, 0xffffffff, 0x00000100,
884 0x9038, 0xffffffff, 0x00000100,
885 0x903c, 0xffffffff, 0x00000100,
886 0xad80, 0xffffffff, 0x00000100,
887 0xac54, 0xffffffff, 0x00000100,
888 0x897c, 0xffffffff, 0x06000100,
889 0x9868, 0xffffffff, 0x00000100,
890 0x9510, 0xffffffff, 0x00000100,
891 0xaf04, 0xffffffff, 0x00000100,
892 0xae04, 0xffffffff, 0x00000100,
893 0x949c, 0xffffffff, 0x00000100,
894 0x802c, 0xffffffff, 0xe0000000,
895 0x9160, 0xffffffff, 0x00010000,
896 0x9164, 0xffffffff, 0x00030002,
897 0x9168, 0xffffffff, 0x00040007,
898 0x916c, 0xffffffff, 0x00060005,
899 0x9170, 0xffffffff, 0x00090008,
900 0x9174, 0xffffffff, 0x00020001,
901 0x9178, 0xffffffff, 0x00040003,
902 0x917c, 0xffffffff, 0x00000007,
903 0x9180, 0xffffffff, 0x00060005,
904 0x9184, 0xffffffff, 0x00090008,
905 0x9188, 0xffffffff, 0x00030002,
906 0x918c, 0xffffffff, 0x00050004,
907 0x9190, 0xffffffff, 0x00000008,
908 0x9194, 0xffffffff, 0x00070006,
909 0x9198, 0xffffffff, 0x000a0009,
910 0x919c, 0xffffffff, 0x00040003,
911 0x91a0, 0xffffffff, 0x00060005,
912 0x91a4, 0xffffffff, 0x00000009,
913 0x91a8, 0xffffffff, 0x00080007,
914 0x91ac, 0xffffffff, 0x000b000a,
915 0x91b0, 0xffffffff, 0x00050004,
916 0x91b4, 0xffffffff, 0x00070006,
917 0x91b8, 0xffffffff, 0x0008000b,
918 0x91bc, 0xffffffff, 0x000a0009,
919 0x91c0, 0xffffffff, 0x000d000c,
920 0x91c4, 0xffffffff, 0x00060005,
921 0x91c8, 0xffffffff, 0x00080007,
922 0x91cc, 0xffffffff, 0x0000000b,
923 0x91d0, 0xffffffff, 0x000a0009,
924 0x91d4, 0xffffffff, 0x000d000c,
925 0x9150, 0xffffffff, 0x96940200,
926 0x8708, 0xffffffff, 0x00900100,
927 0xc478, 0xffffffff, 0x00000080,
928 0xc404, 0xffffffff, 0x0020003f,
929 0x30, 0xffffffff, 0x0000001c,
930 0x34, 0x000f0000, 0x000f0000,
931 0x160c, 0xffffffff, 0x00000100,
932 0x1024, 0xffffffff, 0x00000100,
933 0x102c, 0x00000101, 0x00000000,
934 0x20a8, 0xffffffff, 0x00000104,
935 0x264c, 0x000c0000, 0x000c0000,
936 0x2648, 0x000c0000, 0x000c0000,
937 0x55e4, 0xff000fff, 0x00000100,
938 0x55e8, 0x00000001, 0x00000001,
939 0x2f50, 0x00000001, 0x00000001,
940 0x30cc, 0xc0000fff, 0x00000104,
941 0xc1e4, 0x00000001, 0x00000001,
942 0xd0c0, 0xfffffff0, 0x00000100,
943 0xd8c0, 0xfffffff0, 0x00000100
944 };
945
946 static const u32 hainan_mgcg_cgcg_init[] =
947 {
948 0xc400, 0xffffffff, 0xfffffffc,
949 0x802c, 0xffffffff, 0xe0000000,
950 0x9a60, 0xffffffff, 0x00000100,
951 0x92a4, 0xffffffff, 0x00000100,
952 0xc164, 0xffffffff, 0x00000100,
953 0x9774, 0xffffffff, 0x00000100,
954 0x8984, 0xffffffff, 0x06000100,
955 0x8a18, 0xffffffff, 0x00000100,
956 0x92a0, 0xffffffff, 0x00000100,
957 0xc380, 0xffffffff, 0x00000100,
958 0x8b28, 0xffffffff, 0x00000100,
959 0x9144, 0xffffffff, 0x00000100,
960 0x8d88, 0xffffffff, 0x00000100,
961 0x8d8c, 0xffffffff, 0x00000100,
962 0x9030, 0xffffffff, 0x00000100,
963 0x9034, 0xffffffff, 0x00000100,
964 0x9038, 0xffffffff, 0x00000100,
965 0x903c, 0xffffffff, 0x00000100,
966 0xad80, 0xffffffff, 0x00000100,
967 0xac54, 0xffffffff, 0x00000100,
968 0x897c, 0xffffffff, 0x06000100,
969 0x9868, 0xffffffff, 0x00000100,
970 0x9510, 0xffffffff, 0x00000100,
971 0xaf04, 0xffffffff, 0x00000100,
972 0xae04, 0xffffffff, 0x00000100,
973 0x949c, 0xffffffff, 0x00000100,
974 0x802c, 0xffffffff, 0xe0000000,
975 0x9160, 0xffffffff, 0x00010000,
976 0x9164, 0xffffffff, 0x00030002,
977 0x9168, 0xffffffff, 0x00040007,
978 0x916c, 0xffffffff, 0x00060005,
979 0x9170, 0xffffffff, 0x00090008,
980 0x9174, 0xffffffff, 0x00020001,
981 0x9178, 0xffffffff, 0x00040003,
982 0x917c, 0xffffffff, 0x00000007,
983 0x9180, 0xffffffff, 0x00060005,
984 0x9184, 0xffffffff, 0x00090008,
985 0x9188, 0xffffffff, 0x00030002,
986 0x918c, 0xffffffff, 0x00050004,
987 0x9190, 0xffffffff, 0x00000008,
988 0x9194, 0xffffffff, 0x00070006,
989 0x9198, 0xffffffff, 0x000a0009,
990 0x919c, 0xffffffff, 0x00040003,
991 0x91a0, 0xffffffff, 0x00060005,
992 0x91a4, 0xffffffff, 0x00000009,
993 0x91a8, 0xffffffff, 0x00080007,
994 0x91ac, 0xffffffff, 0x000b000a,
995 0x91b0, 0xffffffff, 0x00050004,
996 0x91b4, 0xffffffff, 0x00070006,
997 0x91b8, 0xffffffff, 0x0008000b,
998 0x91bc, 0xffffffff, 0x000a0009,
999 0x91c0, 0xffffffff, 0x000d000c,
1000 0x91c4, 0xffffffff, 0x00060005,
1001 0x91c8, 0xffffffff, 0x00080007,
1002 0x91cc, 0xffffffff, 0x0000000b,
1003 0x91d0, 0xffffffff, 0x000a0009,
1004 0x91d4, 0xffffffff, 0x000d000c,
1005 0x9150, 0xffffffff, 0x96940200,
1006 0x8708, 0xffffffff, 0x00900100,
1007 0xc478, 0xffffffff, 0x00000080,
1008 0xc404, 0xffffffff, 0x0020003f,
1009 0x30, 0xffffffff, 0x0000001c,
1010 0x34, 0x000f0000, 0x000f0000,
1011 0x160c, 0xffffffff, 0x00000100,
1012 0x1024, 0xffffffff, 0x00000100,
1013 0x20a8, 0xffffffff, 0x00000104,
1014 0x264c, 0x000c0000, 0x000c0000,
1015 0x2648, 0x000c0000, 0x000c0000,
1016 0x2f50, 0x00000001, 0x00000001,
1017 0x30cc, 0xc0000fff, 0x00000104,
1018 0xc1e4, 0x00000001, 0x00000001,
1019 0xd0c0, 0xfffffff0, 0x00000100,
1020 0xd8c0, 0xfffffff0, 0x00000100
1021 };
1022
1023 static u32 verde_pg_init[] =
1024 {
1025 0x353c, 0xffffffff, 0x40000,
1026 0x3538, 0xffffffff, 0x200010ff,
1027 0x353c, 0xffffffff, 0x0,
1028 0x353c, 0xffffffff, 0x0,
1029 0x353c, 0xffffffff, 0x0,
1030 0x353c, 0xffffffff, 0x0,
1031 0x353c, 0xffffffff, 0x0,
1032 0x353c, 0xffffffff, 0x7007,
1033 0x3538, 0xffffffff, 0x300010ff,
1034 0x353c, 0xffffffff, 0x0,
1035 0x353c, 0xffffffff, 0x0,
1036 0x353c, 0xffffffff, 0x0,
1037 0x353c, 0xffffffff, 0x0,
1038 0x353c, 0xffffffff, 0x0,
1039 0x353c, 0xffffffff, 0x400000,
1040 0x3538, 0xffffffff, 0x100010ff,
1041 0x353c, 0xffffffff, 0x0,
1042 0x353c, 0xffffffff, 0x0,
1043 0x353c, 0xffffffff, 0x0,
1044 0x353c, 0xffffffff, 0x0,
1045 0x353c, 0xffffffff, 0x0,
1046 0x353c, 0xffffffff, 0x120200,
1047 0x3538, 0xffffffff, 0x500010ff,
1048 0x353c, 0xffffffff, 0x0,
1049 0x353c, 0xffffffff, 0x0,
1050 0x353c, 0xffffffff, 0x0,
1051 0x353c, 0xffffffff, 0x0,
1052 0x353c, 0xffffffff, 0x0,
1053 0x353c, 0xffffffff, 0x1e1e16,
1054 0x3538, 0xffffffff, 0x600010ff,
1055 0x353c, 0xffffffff, 0x0,
1056 0x353c, 0xffffffff, 0x0,
1057 0x353c, 0xffffffff, 0x0,
1058 0x353c, 0xffffffff, 0x0,
1059 0x353c, 0xffffffff, 0x0,
1060 0x353c, 0xffffffff, 0x171f1e,
1061 0x3538, 0xffffffff, 0x700010ff,
1062 0x353c, 0xffffffff, 0x0,
1063 0x353c, 0xffffffff, 0x0,
1064 0x353c, 0xffffffff, 0x0,
1065 0x353c, 0xffffffff, 0x0,
1066 0x353c, 0xffffffff, 0x0,
1067 0x353c, 0xffffffff, 0x0,
1068 0x3538, 0xffffffff, 0x9ff,
1069 0x3500, 0xffffffff, 0x0,
1070 0x3504, 0xffffffff, 0x10000800,
1071 0x3504, 0xffffffff, 0xf,
1072 0x3504, 0xffffffff, 0xf,
1073 0x3500, 0xffffffff, 0x4,
1074 0x3504, 0xffffffff, 0x1000051e,
1075 0x3504, 0xffffffff, 0xffff,
1076 0x3504, 0xffffffff, 0xffff,
1077 0x3500, 0xffffffff, 0x8,
1078 0x3504, 0xffffffff, 0x80500,
1079 0x3500, 0xffffffff, 0x12,
1080 0x3504, 0xffffffff, 0x9050c,
1081 0x3500, 0xffffffff, 0x1d,
1082 0x3504, 0xffffffff, 0xb052c,
1083 0x3500, 0xffffffff, 0x2a,
1084 0x3504, 0xffffffff, 0x1053e,
1085 0x3500, 0xffffffff, 0x2d,
1086 0x3504, 0xffffffff, 0x10546,
1087 0x3500, 0xffffffff, 0x30,
1088 0x3504, 0xffffffff, 0xa054e,
1089 0x3500, 0xffffffff, 0x3c,
1090 0x3504, 0xffffffff, 0x1055f,
1091 0x3500, 0xffffffff, 0x3f,
1092 0x3504, 0xffffffff, 0x10567,
1093 0x3500, 0xffffffff, 0x42,
1094 0x3504, 0xffffffff, 0x1056f,
1095 0x3500, 0xffffffff, 0x45,
1096 0x3504, 0xffffffff, 0x10572,
1097 0x3500, 0xffffffff, 0x48,
1098 0x3504, 0xffffffff, 0x20575,
1099 0x3500, 0xffffffff, 0x4c,
1100 0x3504, 0xffffffff, 0x190801,
1101 0x3500, 0xffffffff, 0x67,
1102 0x3504, 0xffffffff, 0x1082a,
1103 0x3500, 0xffffffff, 0x6a,
1104 0x3504, 0xffffffff, 0x1b082d,
1105 0x3500, 0xffffffff, 0x87,
1106 0x3504, 0xffffffff, 0x310851,
1107 0x3500, 0xffffffff, 0xba,
1108 0x3504, 0xffffffff, 0x891,
1109 0x3500, 0xffffffff, 0xbc,
1110 0x3504, 0xffffffff, 0x893,
1111 0x3500, 0xffffffff, 0xbe,
1112 0x3504, 0xffffffff, 0x20895,
1113 0x3500, 0xffffffff, 0xc2,
1114 0x3504, 0xffffffff, 0x20899,
1115 0x3500, 0xffffffff, 0xc6,
1116 0x3504, 0xffffffff, 0x2089d,
1117 0x3500, 0xffffffff, 0xca,
1118 0x3504, 0xffffffff, 0x8a1,
1119 0x3500, 0xffffffff, 0xcc,
1120 0x3504, 0xffffffff, 0x8a3,
1121 0x3500, 0xffffffff, 0xce,
1122 0x3504, 0xffffffff, 0x308a5,
1123 0x3500, 0xffffffff, 0xd3,
1124 0x3504, 0xffffffff, 0x6d08cd,
1125 0x3500, 0xffffffff, 0x142,
1126 0x3504, 0xffffffff, 0x2000095a,
1127 0x3504, 0xffffffff, 0x1,
1128 0x3500, 0xffffffff, 0x144,
1129 0x3504, 0xffffffff, 0x301f095b,
1130 0x3500, 0xffffffff, 0x165,
1131 0x3504, 0xffffffff, 0xc094d,
1132 0x3500, 0xffffffff, 0x173,
1133 0x3504, 0xffffffff, 0xf096d,
1134 0x3500, 0xffffffff, 0x184,
1135 0x3504, 0xffffffff, 0x15097f,
1136 0x3500, 0xffffffff, 0x19b,
1137 0x3504, 0xffffffff, 0xc0998,
1138 0x3500, 0xffffffff, 0x1a9,
1139 0x3504, 0xffffffff, 0x409a7,
1140 0x3500, 0xffffffff, 0x1af,
1141 0x3504, 0xffffffff, 0xcdc,
1142 0x3500, 0xffffffff, 0x1b1,
1143 0x3504, 0xffffffff, 0x800,
1144 0x3508, 0xffffffff, 0x6c9b2000,
1145 0x3510, 0xfc00, 0x2000,
1146 0x3544, 0xffffffff, 0xfc0,
1147 0x28d4, 0x00000100, 0x100
1148 };
1149
1150 static void si_init_golden_registers(struct radeon_device *rdev)
1151 {
1152 switch (rdev->family) {
1153 case CHIP_TAHITI:
1154 radeon_program_register_sequence(rdev,
1155 tahiti_golden_registers,
1156 (const u32)ARRAY_SIZE(tahiti_golden_registers));
1157 radeon_program_register_sequence(rdev,
1158 tahiti_golden_rlc_registers,
1159 (const u32)ARRAY_SIZE(tahiti_golden_rlc_registers));
1160 radeon_program_register_sequence(rdev,
1161 tahiti_mgcg_cgcg_init,
1162 (const u32)ARRAY_SIZE(tahiti_mgcg_cgcg_init));
1163 radeon_program_register_sequence(rdev,
1164 tahiti_golden_registers2,
1165 (const u32)ARRAY_SIZE(tahiti_golden_registers2));
1166 break;
1167 case CHIP_PITCAIRN:
1168 radeon_program_register_sequence(rdev,
1169 pitcairn_golden_registers,
1170 (const u32)ARRAY_SIZE(pitcairn_golden_registers));
1171 radeon_program_register_sequence(rdev,
1172 pitcairn_golden_rlc_registers,
1173 (const u32)ARRAY_SIZE(pitcairn_golden_rlc_registers));
1174 radeon_program_register_sequence(rdev,
1175 pitcairn_mgcg_cgcg_init,
1176 (const u32)ARRAY_SIZE(pitcairn_mgcg_cgcg_init));
1177 break;
1178 case CHIP_VERDE:
1179 radeon_program_register_sequence(rdev,
1180 verde_golden_registers,
1181 (const u32)ARRAY_SIZE(verde_golden_registers));
1182 radeon_program_register_sequence(rdev,
1183 verde_golden_rlc_registers,
1184 (const u32)ARRAY_SIZE(verde_golden_rlc_registers));
1185 radeon_program_register_sequence(rdev,
1186 verde_mgcg_cgcg_init,
1187 (const u32)ARRAY_SIZE(verde_mgcg_cgcg_init));
1188 radeon_program_register_sequence(rdev,
1189 verde_pg_init,
1190 (const u32)ARRAY_SIZE(verde_pg_init));
1191 break;
1192 case CHIP_OLAND:
1193 radeon_program_register_sequence(rdev,
1194 oland_golden_registers,
1195 (const u32)ARRAY_SIZE(oland_golden_registers));
1196 radeon_program_register_sequence(rdev,
1197 oland_golden_rlc_registers,
1198 (const u32)ARRAY_SIZE(oland_golden_rlc_registers));
1199 radeon_program_register_sequence(rdev,
1200 oland_mgcg_cgcg_init,
1201 (const u32)ARRAY_SIZE(oland_mgcg_cgcg_init));
1202 break;
1203 case CHIP_HAINAN:
1204 radeon_program_register_sequence(rdev,
1205 hainan_golden_registers,
1206 (const u32)ARRAY_SIZE(hainan_golden_registers));
1207 radeon_program_register_sequence(rdev,
1208 hainan_golden_registers2,
1209 (const u32)ARRAY_SIZE(hainan_golden_registers2));
1210 radeon_program_register_sequence(rdev,
1211 hainan_mgcg_cgcg_init,
1212 (const u32)ARRAY_SIZE(hainan_mgcg_cgcg_init));
1213 break;
1214 default:
1215 break;
1216 }
1217 }
1218
1219 #define PCIE_BUS_CLK 10000
1220 #define TCLK (PCIE_BUS_CLK / 10)
1221
1222 /**
1223 * si_get_xclk - get the xclk
1224 *
1225 * @rdev: radeon_device pointer
1226 *
1227 * Returns the reference clock used by the gfx engine
1228 * (SI).
1229 */
1230 u32 si_get_xclk(struct radeon_device *rdev)
1231 {
1232 u32 reference_clock = rdev->clock.spll.reference_freq;
1233 u32 tmp;
1234
1235 tmp = RREG32(CG_CLKPIN_CNTL_2);
1236 if (tmp & MUX_TCLK_TO_XCLK)
1237 return TCLK;
1238
1239 tmp = RREG32(CG_CLKPIN_CNTL);
1240 if (tmp & XTALIN_DIVIDE)
1241 return reference_clock / 4;
1242
1243 return reference_clock;
1244 }
1245
1246 /* get temperature in millidegrees */
1247 int si_get_temp(struct radeon_device *rdev)
1248 {
1249 u32 temp;
1250 int actual_temp = 0;
1251
1252 temp = (RREG32(CG_MULT_THERMAL_STATUS) & CTF_TEMP_MASK) >>
1253 CTF_TEMP_SHIFT;
1254
1255 if (temp & 0x200)
1256 actual_temp = 255;
1257 else
1258 actual_temp = temp & 0x1ff;
1259
1260 actual_temp = (actual_temp * 1000);
1261
1262 return actual_temp;
1263 }
1264
1265 #define TAHITI_IO_MC_REGS_SIZE 36
1266
1267 static const u32 tahiti_io_mc_regs[TAHITI_IO_MC_REGS_SIZE][2] = {
1268 {0x0000006f, 0x03044000},
1269 {0x00000070, 0x0480c018},
1270 {0x00000071, 0x00000040},
1271 {0x00000072, 0x01000000},
1272 {0x00000074, 0x000000ff},
1273 {0x00000075, 0x00143400},
1274 {0x00000076, 0x08ec0800},
1275 {0x00000077, 0x040000cc},
1276 {0x00000079, 0x00000000},
1277 {0x0000007a, 0x21000409},
1278 {0x0000007c, 0x00000000},
1279 {0x0000007d, 0xe8000000},
1280 {0x0000007e, 0x044408a8},
1281 {0x0000007f, 0x00000003},
1282 {0x00000080, 0x00000000},
1283 {0x00000081, 0x01000000},
1284 {0x00000082, 0x02000000},
1285 {0x00000083, 0x00000000},
1286 {0x00000084, 0xe3f3e4f4},
1287 {0x00000085, 0x00052024},
1288 {0x00000087, 0x00000000},
1289 {0x00000088, 0x66036603},
1290 {0x00000089, 0x01000000},
1291 {0x0000008b, 0x1c0a0000},
1292 {0x0000008c, 0xff010000},
1293 {0x0000008e, 0xffffefff},
1294 {0x0000008f, 0xfff3efff},
1295 {0x00000090, 0xfff3efbf},
1296 {0x00000094, 0x00101101},
1297 {0x00000095, 0x00000fff},
1298 {0x00000096, 0x00116fff},
1299 {0x00000097, 0x60010000},
1300 {0x00000098, 0x10010000},
1301 {0x00000099, 0x00006000},
1302 {0x0000009a, 0x00001000},
1303 {0x0000009f, 0x00a77400}
1304 };
1305
1306 static const u32 pitcairn_io_mc_regs[TAHITI_IO_MC_REGS_SIZE][2] = {
1307 {0x0000006f, 0x03044000},
1308 {0x00000070, 0x0480c018},
1309 {0x00000071, 0x00000040},
1310 {0x00000072, 0x01000000},
1311 {0x00000074, 0x000000ff},
1312 {0x00000075, 0x00143400},
1313 {0x00000076, 0x08ec0800},
1314 {0x00000077, 0x040000cc},
1315 {0x00000079, 0x00000000},
1316 {0x0000007a, 0x21000409},
1317 {0x0000007c, 0x00000000},
1318 {0x0000007d, 0xe8000000},
1319 {0x0000007e, 0x044408a8},
1320 {0x0000007f, 0x00000003},
1321 {0x00000080, 0x00000000},
1322 {0x00000081, 0x01000000},
1323 {0x00000082, 0x02000000},
1324 {0x00000083, 0x00000000},
1325 {0x00000084, 0xe3f3e4f4},
1326 {0x00000085, 0x00052024},
1327 {0x00000087, 0x00000000},
1328 {0x00000088, 0x66036603},
1329 {0x00000089, 0x01000000},
1330 {0x0000008b, 0x1c0a0000},
1331 {0x0000008c, 0xff010000},
1332 {0x0000008e, 0xffffefff},
1333 {0x0000008f, 0xfff3efff},
1334 {0x00000090, 0xfff3efbf},
1335 {0x00000094, 0x00101101},
1336 {0x00000095, 0x00000fff},
1337 {0x00000096, 0x00116fff},
1338 {0x00000097, 0x60010000},
1339 {0x00000098, 0x10010000},
1340 {0x00000099, 0x00006000},
1341 {0x0000009a, 0x00001000},
1342 {0x0000009f, 0x00a47400}
1343 };
1344
1345 static const u32 verde_io_mc_regs[TAHITI_IO_MC_REGS_SIZE][2] = {
1346 {0x0000006f, 0x03044000},
1347 {0x00000070, 0x0480c018},
1348 {0x00000071, 0x00000040},
1349 {0x00000072, 0x01000000},
1350 {0x00000074, 0x000000ff},
1351 {0x00000075, 0x00143400},
1352 {0x00000076, 0x08ec0800},
1353 {0x00000077, 0x040000cc},
1354 {0x00000079, 0x00000000},
1355 {0x0000007a, 0x21000409},
1356 {0x0000007c, 0x00000000},
1357 {0x0000007d, 0xe8000000},
1358 {0x0000007e, 0x044408a8},
1359 {0x0000007f, 0x00000003},
1360 {0x00000080, 0x00000000},
1361 {0x00000081, 0x01000000},
1362 {0x00000082, 0x02000000},
1363 {0x00000083, 0x00000000},
1364 {0x00000084, 0xe3f3e4f4},
1365 {0x00000085, 0x00052024},
1366 {0x00000087, 0x00000000},
1367 {0x00000088, 0x66036603},
1368 {0x00000089, 0x01000000},
1369 {0x0000008b, 0x1c0a0000},
1370 {0x0000008c, 0xff010000},
1371 {0x0000008e, 0xffffefff},
1372 {0x0000008f, 0xfff3efff},
1373 {0x00000090, 0xfff3efbf},
1374 {0x00000094, 0x00101101},
1375 {0x00000095, 0x00000fff},
1376 {0x00000096, 0x00116fff},
1377 {0x00000097, 0x60010000},
1378 {0x00000098, 0x10010000},
1379 {0x00000099, 0x00006000},
1380 {0x0000009a, 0x00001000},
1381 {0x0000009f, 0x00a37400}
1382 };
1383
1384 static const u32 oland_io_mc_regs[TAHITI_IO_MC_REGS_SIZE][2] = {
1385 {0x0000006f, 0x03044000},
1386 {0x00000070, 0x0480c018},
1387 {0x00000071, 0x00000040},
1388 {0x00000072, 0x01000000},
1389 {0x00000074, 0x000000ff},
1390 {0x00000075, 0x00143400},
1391 {0x00000076, 0x08ec0800},
1392 {0x00000077, 0x040000cc},
1393 {0x00000079, 0x00000000},
1394 {0x0000007a, 0x21000409},
1395 {0x0000007c, 0x00000000},
1396 {0x0000007d, 0xe8000000},
1397 {0x0000007e, 0x044408a8},
1398 {0x0000007f, 0x00000003},
1399 {0x00000080, 0x00000000},
1400 {0x00000081, 0x01000000},
1401 {0x00000082, 0x02000000},
1402 {0x00000083, 0x00000000},
1403 {0x00000084, 0xe3f3e4f4},
1404 {0x00000085, 0x00052024},
1405 {0x00000087, 0x00000000},
1406 {0x00000088, 0x66036603},
1407 {0x00000089, 0x01000000},
1408 {0x0000008b, 0x1c0a0000},
1409 {0x0000008c, 0xff010000},
1410 {0x0000008e, 0xffffefff},
1411 {0x0000008f, 0xfff3efff},
1412 {0x00000090, 0xfff3efbf},
1413 {0x00000094, 0x00101101},
1414 {0x00000095, 0x00000fff},
1415 {0x00000096, 0x00116fff},
1416 {0x00000097, 0x60010000},
1417 {0x00000098, 0x10010000},
1418 {0x00000099, 0x00006000},
1419 {0x0000009a, 0x00001000},
1420 {0x0000009f, 0x00a17730}
1421 };
1422
1423 static const u32 hainan_io_mc_regs[TAHITI_IO_MC_REGS_SIZE][2] = {
1424 {0x0000006f, 0x03044000},
1425 {0x00000070, 0x0480c018},
1426 {0x00000071, 0x00000040},
1427 {0x00000072, 0x01000000},
1428 {0x00000074, 0x000000ff},
1429 {0x00000075, 0x00143400},
1430 {0x00000076, 0x08ec0800},
1431 {0x00000077, 0x040000cc},
1432 {0x00000079, 0x00000000},
1433 {0x0000007a, 0x21000409},
1434 {0x0000007c, 0x00000000},
1435 {0x0000007d, 0xe8000000},
1436 {0x0000007e, 0x044408a8},
1437 {0x0000007f, 0x00000003},
1438 {0x00000080, 0x00000000},
1439 {0x00000081, 0x01000000},
1440 {0x00000082, 0x02000000},
1441 {0x00000083, 0x00000000},
1442 {0x00000084, 0xe3f3e4f4},
1443 {0x00000085, 0x00052024},
1444 {0x00000087, 0x00000000},
1445 {0x00000088, 0x66036603},
1446 {0x00000089, 0x01000000},
1447 {0x0000008b, 0x1c0a0000},
1448 {0x0000008c, 0xff010000},
1449 {0x0000008e, 0xffffefff},
1450 {0x0000008f, 0xfff3efff},
1451 {0x00000090, 0xfff3efbf},
1452 {0x00000094, 0x00101101},
1453 {0x00000095, 0x00000fff},
1454 {0x00000096, 0x00116fff},
1455 {0x00000097, 0x60010000},
1456 {0x00000098, 0x10010000},
1457 {0x00000099, 0x00006000},
1458 {0x0000009a, 0x00001000},
1459 {0x0000009f, 0x00a07730}
1460 };
1461
1462 /* ucode loading */
1463 static int si_mc_load_microcode(struct radeon_device *rdev)
1464 {
1465 const __be32 *fw_data;
1466 u32 running, blackout = 0;
1467 u32 *io_mc_regs;
1468 int i, ucode_size, regs_size;
1469
1470 if (!rdev->mc_fw)
1471 return -EINVAL;
1472
1473 switch (rdev->family) {
1474 case CHIP_TAHITI:
1475 io_mc_regs = (u32 *)&tahiti_io_mc_regs;
1476 ucode_size = SI_MC_UCODE_SIZE;
1477 regs_size = TAHITI_IO_MC_REGS_SIZE;
1478 break;
1479 case CHIP_PITCAIRN:
1480 io_mc_regs = (u32 *)&pitcairn_io_mc_regs;
1481 ucode_size = SI_MC_UCODE_SIZE;
1482 regs_size = TAHITI_IO_MC_REGS_SIZE;
1483 break;
1484 case CHIP_VERDE:
1485 default:
1486 io_mc_regs = (u32 *)&verde_io_mc_regs;
1487 ucode_size = SI_MC_UCODE_SIZE;
1488 regs_size = TAHITI_IO_MC_REGS_SIZE;
1489 break;
1490 case CHIP_OLAND:
1491 io_mc_regs = (u32 *)&oland_io_mc_regs;
1492 ucode_size = OLAND_MC_UCODE_SIZE;
1493 regs_size = TAHITI_IO_MC_REGS_SIZE;
1494 break;
1495 case CHIP_HAINAN:
1496 io_mc_regs = (u32 *)&hainan_io_mc_regs;
1497 ucode_size = OLAND_MC_UCODE_SIZE;
1498 regs_size = TAHITI_IO_MC_REGS_SIZE;
1499 break;
1500 }
1501
1502 running = RREG32(MC_SEQ_SUP_CNTL) & RUN_MASK;
1503
1504 if (running == 0) {
1505 if (running) {
1506 blackout = RREG32(MC_SHARED_BLACKOUT_CNTL);
1507 WREG32(MC_SHARED_BLACKOUT_CNTL, blackout | 1);
1508 }
1509
1510 /* reset the engine and set to writable */
1511 WREG32(MC_SEQ_SUP_CNTL, 0x00000008);
1512 WREG32(MC_SEQ_SUP_CNTL, 0x00000010);
1513
1514 /* load mc io regs */
1515 for (i = 0; i < regs_size; i++) {
1516 WREG32(MC_SEQ_IO_DEBUG_INDEX, io_mc_regs[(i << 1)]);
1517 WREG32(MC_SEQ_IO_DEBUG_DATA, io_mc_regs[(i << 1) + 1]);
1518 }
1519 /* load the MC ucode */
1520 fw_data = (const __be32 *)rdev->mc_fw->data;
1521 for (i = 0; i < ucode_size; i++)
1522 WREG32(MC_SEQ_SUP_PGM, be32_to_cpup(fw_data++));
1523
1524 /* put the engine back into the active state */
1525 WREG32(MC_SEQ_SUP_CNTL, 0x00000008);
1526 WREG32(MC_SEQ_SUP_CNTL, 0x00000004);
1527 WREG32(MC_SEQ_SUP_CNTL, 0x00000001);
1528
1529 /* wait for training to complete */
1530 for (i = 0; i < rdev->usec_timeout; i++) {
1531 if (RREG32(MC_SEQ_TRAIN_WAKEUP_CNTL) & TRAIN_DONE_D0)
1532 break;
1533 udelay(1);
1534 }
1535 for (i = 0; i < rdev->usec_timeout; i++) {
1536 if (RREG32(MC_SEQ_TRAIN_WAKEUP_CNTL) & TRAIN_DONE_D1)
1537 break;
1538 udelay(1);
1539 }
1540
1541 if (running)
1542 WREG32(MC_SHARED_BLACKOUT_CNTL, blackout);
1543 }
1544
1545 return 0;
1546 }
1547
1548 static int si_init_microcode(struct radeon_device *rdev)
1549 {
1550 const char *chip_name;
1551 const char *rlc_chip_name;
1552 size_t pfp_req_size, me_req_size, ce_req_size, rlc_req_size, mc_req_size;
1553 size_t smc_req_size;
1554 char fw_name[30];
1555 int err;
1556
1557 DRM_DEBUG("\n");
1558
1559 switch (rdev->family) {
1560 case CHIP_TAHITI:
1561 chip_name = "TAHITI";
1562 rlc_chip_name = "TAHITI";
1563 pfp_req_size = SI_PFP_UCODE_SIZE * 4;
1564 me_req_size = SI_PM4_UCODE_SIZE * 4;
1565 ce_req_size = SI_CE_UCODE_SIZE * 4;
1566 rlc_req_size = SI_RLC_UCODE_SIZE * 4;
1567 mc_req_size = SI_MC_UCODE_SIZE * 4;
1568 smc_req_size = ALIGN(TAHITI_SMC_UCODE_SIZE, 4);
1569 break;
1570 case CHIP_PITCAIRN:
1571 chip_name = "PITCAIRN";
1572 rlc_chip_name = "PITCAIRN";
1573 pfp_req_size = SI_PFP_UCODE_SIZE * 4;
1574 me_req_size = SI_PM4_UCODE_SIZE * 4;
1575 ce_req_size = SI_CE_UCODE_SIZE * 4;
1576 rlc_req_size = SI_RLC_UCODE_SIZE * 4;
1577 mc_req_size = SI_MC_UCODE_SIZE * 4;
1578 smc_req_size = ALIGN(PITCAIRN_SMC_UCODE_SIZE, 4);
1579 break;
1580 case CHIP_VERDE:
1581 chip_name = "VERDE";
1582 rlc_chip_name = "VERDE";
1583 pfp_req_size = SI_PFP_UCODE_SIZE * 4;
1584 me_req_size = SI_PM4_UCODE_SIZE * 4;
1585 ce_req_size = SI_CE_UCODE_SIZE * 4;
1586 rlc_req_size = SI_RLC_UCODE_SIZE * 4;
1587 mc_req_size = SI_MC_UCODE_SIZE * 4;
1588 smc_req_size = ALIGN(VERDE_SMC_UCODE_SIZE, 4);
1589 break;
1590 case CHIP_OLAND:
1591 chip_name = "OLAND";
1592 rlc_chip_name = "OLAND";
1593 pfp_req_size = SI_PFP_UCODE_SIZE * 4;
1594 me_req_size = SI_PM4_UCODE_SIZE * 4;
1595 ce_req_size = SI_CE_UCODE_SIZE * 4;
1596 rlc_req_size = SI_RLC_UCODE_SIZE * 4;
1597 mc_req_size = OLAND_MC_UCODE_SIZE * 4;
1598 smc_req_size = ALIGN(OLAND_SMC_UCODE_SIZE, 4);
1599 break;
1600 case CHIP_HAINAN:
1601 chip_name = "HAINAN";
1602 rlc_chip_name = "HAINAN";
1603 pfp_req_size = SI_PFP_UCODE_SIZE * 4;
1604 me_req_size = SI_PM4_UCODE_SIZE * 4;
1605 ce_req_size = SI_CE_UCODE_SIZE * 4;
1606 rlc_req_size = SI_RLC_UCODE_SIZE * 4;
1607 mc_req_size = OLAND_MC_UCODE_SIZE * 4;
1608 smc_req_size = ALIGN(HAINAN_SMC_UCODE_SIZE, 4);
1609 break;
1610 default: BUG();
1611 }
1612
1613 DRM_INFO("Loading %s Microcode\n", chip_name);
1614
1615 snprintf(fw_name, sizeof(fw_name), "radeon/%s_pfp.bin", chip_name);
1616 err = request_firmware(&rdev->pfp_fw, fw_name, rdev->dev);
1617 if (err)
1618 goto out;
1619 if (rdev->pfp_fw->size != pfp_req_size) {
1620 printk(KERN_ERR
1621 "si_cp: Bogus length %zu in firmware \"%s\"\n",
1622 rdev->pfp_fw->size, fw_name);
1623 err = -EINVAL;
1624 goto out;
1625 }
1626
1627 snprintf(fw_name, sizeof(fw_name), "radeon/%s_me.bin", chip_name);
1628 err = request_firmware(&rdev->me_fw, fw_name, rdev->dev);
1629 if (err)
1630 goto out;
1631 if (rdev->me_fw->size != me_req_size) {
1632 printk(KERN_ERR
1633 "si_cp: Bogus length %zu in firmware \"%s\"\n",
1634 rdev->me_fw->size, fw_name);
1635 err = -EINVAL;
1636 }
1637
1638 snprintf(fw_name, sizeof(fw_name), "radeon/%s_ce.bin", chip_name);
1639 err = request_firmware(&rdev->ce_fw, fw_name, rdev->dev);
1640 if (err)
1641 goto out;
1642 if (rdev->ce_fw->size != ce_req_size) {
1643 printk(KERN_ERR
1644 "si_cp: Bogus length %zu in firmware \"%s\"\n",
1645 rdev->ce_fw->size, fw_name);
1646 err = -EINVAL;
1647 }
1648
1649 snprintf(fw_name, sizeof(fw_name), "radeon/%s_rlc.bin", rlc_chip_name);
1650 err = request_firmware(&rdev->rlc_fw, fw_name, rdev->dev);
1651 if (err)
1652 goto out;
1653 if (rdev->rlc_fw->size != rlc_req_size) {
1654 printk(KERN_ERR
1655 "si_rlc: Bogus length %zu in firmware \"%s\"\n",
1656 rdev->rlc_fw->size, fw_name);
1657 err = -EINVAL;
1658 }
1659
1660 snprintf(fw_name, sizeof(fw_name), "radeon/%s_mc.bin", chip_name);
1661 err = request_firmware(&rdev->mc_fw, fw_name, rdev->dev);
1662 if (err)
1663 goto out;
1664 if (rdev->mc_fw->size != mc_req_size) {
1665 printk(KERN_ERR
1666 "si_mc: Bogus length %zu in firmware \"%s\"\n",
1667 rdev->mc_fw->size, fw_name);
1668 err = -EINVAL;
1669 }
1670
1671 snprintf(fw_name, sizeof(fw_name), "radeon/%s_smc.bin", chip_name);
1672 err = request_firmware(&rdev->smc_fw, fw_name, rdev->dev);
1673 if (err) {
1674 printk(KERN_ERR
1675 "smc: error loading firmware \"%s\"\n",
1676 fw_name);
1677 release_firmware(rdev->smc_fw);
1678 rdev->smc_fw = NULL;
1679 err = 0;
1680 } else if (rdev->smc_fw->size != smc_req_size) {
1681 printk(KERN_ERR
1682 "si_smc: Bogus length %zu in firmware \"%s\"\n",
1683 rdev->smc_fw->size, fw_name);
1684 err = -EINVAL;
1685 }
1686
1687 out:
1688 if (err) {
1689 if (err != -EINVAL)
1690 printk(KERN_ERR
1691 "si_cp: Failed to load firmware \"%s\"\n",
1692 fw_name);
1693 release_firmware(rdev->pfp_fw);
1694 rdev->pfp_fw = NULL;
1695 release_firmware(rdev->me_fw);
1696 rdev->me_fw = NULL;
1697 release_firmware(rdev->ce_fw);
1698 rdev->ce_fw = NULL;
1699 release_firmware(rdev->rlc_fw);
1700 rdev->rlc_fw = NULL;
1701 release_firmware(rdev->mc_fw);
1702 rdev->mc_fw = NULL;
1703 release_firmware(rdev->smc_fw);
1704 rdev->smc_fw = NULL;
1705 }
1706 return err;
1707 }
1708
1709 /* watermark setup */
1710 static u32 dce6_line_buffer_adjust(struct radeon_device *rdev,
1711 struct radeon_crtc *radeon_crtc,
1712 struct drm_display_mode *mode,
1713 struct drm_display_mode *other_mode)
1714 {
1715 u32 tmp, buffer_alloc, i;
1716 u32 pipe_offset = radeon_crtc->crtc_id * 0x20;
1717 /*
1718 * Line Buffer Setup
1719 * There are 3 line buffers, each one shared by 2 display controllers.
1720 * DC_LB_MEMORY_SPLIT controls how that line buffer is shared between
1721 * the display controllers. The paritioning is done via one of four
1722 * preset allocations specified in bits 21:20:
1723 * 0 - half lb
1724 * 2 - whole lb, other crtc must be disabled
1725 */
1726 /* this can get tricky if we have two large displays on a paired group
1727 * of crtcs. Ideally for multiple large displays we'd assign them to
1728 * non-linked crtcs for maximum line buffer allocation.
1729 */
1730 if (radeon_crtc->base.enabled && mode) {
1731 if (other_mode) {
1732 tmp = 0; /* 1/2 */
1733 buffer_alloc = 1;
1734 } else {
1735 tmp = 2; /* whole */
1736 buffer_alloc = 2;
1737 }
1738 } else {
1739 tmp = 0;
1740 buffer_alloc = 0;
1741 }
1742
1743 WREG32(DC_LB_MEMORY_SPLIT + radeon_crtc->crtc_offset,
1744 DC_LB_MEMORY_CONFIG(tmp));
1745
1746 WREG32(PIPE0_DMIF_BUFFER_CONTROL + pipe_offset,
1747 DMIF_BUFFERS_ALLOCATED(buffer_alloc));
1748 for (i = 0; i < rdev->usec_timeout; i++) {
1749 if (RREG32(PIPE0_DMIF_BUFFER_CONTROL + pipe_offset) &
1750 DMIF_BUFFERS_ALLOCATED_COMPLETED)
1751 break;
1752 udelay(1);
1753 }
1754
1755 if (radeon_crtc->base.enabled && mode) {
1756 switch (tmp) {
1757 case 0:
1758 default:
1759 return 4096 * 2;
1760 case 2:
1761 return 8192 * 2;
1762 }
1763 }
1764
1765 /* controller not enabled, so no lb used */
1766 return 0;
1767 }
1768
1769 static u32 si_get_number_of_dram_channels(struct radeon_device *rdev)
1770 {
1771 u32 tmp = RREG32(MC_SHARED_CHMAP);
1772
1773 switch ((tmp & NOOFCHAN_MASK) >> NOOFCHAN_SHIFT) {
1774 case 0:
1775 default:
1776 return 1;
1777 case 1:
1778 return 2;
1779 case 2:
1780 return 4;
1781 case 3:
1782 return 8;
1783 case 4:
1784 return 3;
1785 case 5:
1786 return 6;
1787 case 6:
1788 return 10;
1789 case 7:
1790 return 12;
1791 case 8:
1792 return 16;
1793 }
1794 }
1795
1796 struct dce6_wm_params {
1797 u32 dram_channels; /* number of dram channels */
1798 u32 yclk; /* bandwidth per dram data pin in kHz */
1799 u32 sclk; /* engine clock in kHz */
1800 u32 disp_clk; /* display clock in kHz */
1801 u32 src_width; /* viewport width */
1802 u32 active_time; /* active display time in ns */
1803 u32 blank_time; /* blank time in ns */
1804 bool interlaced; /* mode is interlaced */
1805 fixed20_12 vsc; /* vertical scale ratio */
1806 u32 num_heads; /* number of active crtcs */
1807 u32 bytes_per_pixel; /* bytes per pixel display + overlay */
1808 u32 lb_size; /* line buffer allocated to pipe */
1809 u32 vtaps; /* vertical scaler taps */
1810 };
1811
1812 static u32 dce6_dram_bandwidth(struct dce6_wm_params *wm)
1813 {
1814 /* Calculate raw DRAM Bandwidth */
1815 fixed20_12 dram_efficiency; /* 0.7 */
1816 fixed20_12 yclk, dram_channels, bandwidth;
1817 fixed20_12 a;
1818
1819 a.full = dfixed_const(1000);
1820 yclk.full = dfixed_const(wm->yclk);
1821 yclk.full = dfixed_div(yclk, a);
1822 dram_channels.full = dfixed_const(wm->dram_channels * 4);
1823 a.full = dfixed_const(10);
1824 dram_efficiency.full = dfixed_const(7);
1825 dram_efficiency.full = dfixed_div(dram_efficiency, a);
1826 bandwidth.full = dfixed_mul(dram_channels, yclk);
1827 bandwidth.full = dfixed_mul(bandwidth, dram_efficiency);
1828
1829 return dfixed_trunc(bandwidth);
1830 }
1831
1832 static u32 dce6_dram_bandwidth_for_display(struct dce6_wm_params *wm)
1833 {
1834 /* Calculate DRAM Bandwidth and the part allocated to display. */
1835 fixed20_12 disp_dram_allocation; /* 0.3 to 0.7 */
1836 fixed20_12 yclk, dram_channels, bandwidth;
1837 fixed20_12 a;
1838
1839 a.full = dfixed_const(1000);
1840 yclk.full = dfixed_const(wm->yclk);
1841 yclk.full = dfixed_div(yclk, a);
1842 dram_channels.full = dfixed_const(wm->dram_channels * 4);
1843 a.full = dfixed_const(10);
1844 disp_dram_allocation.full = dfixed_const(3); /* XXX worse case value 0.3 */
1845 disp_dram_allocation.full = dfixed_div(disp_dram_allocation, a);
1846 bandwidth.full = dfixed_mul(dram_channels, yclk);
1847 bandwidth.full = dfixed_mul(bandwidth, disp_dram_allocation);
1848
1849 return dfixed_trunc(bandwidth);
1850 }
1851
1852 static u32 dce6_data_return_bandwidth(struct dce6_wm_params *wm)
1853 {
1854 /* Calculate the display Data return Bandwidth */
1855 fixed20_12 return_efficiency; /* 0.8 */
1856 fixed20_12 sclk, bandwidth;
1857 fixed20_12 a;
1858
1859 a.full = dfixed_const(1000);
1860 sclk.full = dfixed_const(wm->sclk);
1861 sclk.full = dfixed_div(sclk, a);
1862 a.full = dfixed_const(10);
1863 return_efficiency.full = dfixed_const(8);
1864 return_efficiency.full = dfixed_div(return_efficiency, a);
1865 a.full = dfixed_const(32);
1866 bandwidth.full = dfixed_mul(a, sclk);
1867 bandwidth.full = dfixed_mul(bandwidth, return_efficiency);
1868
1869 return dfixed_trunc(bandwidth);
1870 }
1871
1872 static u32 dce6_get_dmif_bytes_per_request(struct dce6_wm_params *wm)
1873 {
1874 return 32;
1875 }
1876
1877 static u32 dce6_dmif_request_bandwidth(struct dce6_wm_params *wm)
1878 {
1879 /* Calculate the DMIF Request Bandwidth */
1880 fixed20_12 disp_clk_request_efficiency; /* 0.8 */
1881 fixed20_12 disp_clk, sclk, bandwidth;
1882 fixed20_12 a, b1, b2;
1883 u32 min_bandwidth;
1884
1885 a.full = dfixed_const(1000);
1886 disp_clk.full = dfixed_const(wm->disp_clk);
1887 disp_clk.full = dfixed_div(disp_clk, a);
1888 a.full = dfixed_const(dce6_get_dmif_bytes_per_request(wm) / 2);
1889 b1.full = dfixed_mul(a, disp_clk);
1890
1891 a.full = dfixed_const(1000);
1892 sclk.full = dfixed_const(wm->sclk);
1893 sclk.full = dfixed_div(sclk, a);
1894 a.full = dfixed_const(dce6_get_dmif_bytes_per_request(wm));
1895 b2.full = dfixed_mul(a, sclk);
1896
1897 a.full = dfixed_const(10);
1898 disp_clk_request_efficiency.full = dfixed_const(8);
1899 disp_clk_request_efficiency.full = dfixed_div(disp_clk_request_efficiency, a);
1900
1901 min_bandwidth = min(dfixed_trunc(b1), dfixed_trunc(b2));
1902
1903 a.full = dfixed_const(min_bandwidth);
1904 bandwidth.full = dfixed_mul(a, disp_clk_request_efficiency);
1905
1906 return dfixed_trunc(bandwidth);
1907 }
1908
1909 static u32 dce6_available_bandwidth(struct dce6_wm_params *wm)
1910 {
1911 /* Calculate the Available bandwidth. Display can use this temporarily but not in average. */
1912 u32 dram_bandwidth = dce6_dram_bandwidth(wm);
1913 u32 data_return_bandwidth = dce6_data_return_bandwidth(wm);
1914 u32 dmif_req_bandwidth = dce6_dmif_request_bandwidth(wm);
1915
1916 return min(dram_bandwidth, min(data_return_bandwidth, dmif_req_bandwidth));
1917 }
1918
1919 static u32 dce6_average_bandwidth(struct dce6_wm_params *wm)
1920 {
1921 /* Calculate the display mode Average Bandwidth
1922 * DisplayMode should contain the source and destination dimensions,
1923 * timing, etc.
1924 */
1925 fixed20_12 bpp;
1926 fixed20_12 line_time;
1927 fixed20_12 src_width;
1928 fixed20_12 bandwidth;
1929 fixed20_12 a;
1930
1931 a.full = dfixed_const(1000);
1932 line_time.full = dfixed_const(wm->active_time + wm->blank_time);
1933 line_time.full = dfixed_div(line_time, a);
1934 bpp.full = dfixed_const(wm->bytes_per_pixel);
1935 src_width.full = dfixed_const(wm->src_width);
1936 bandwidth.full = dfixed_mul(src_width, bpp);
1937 bandwidth.full = dfixed_mul(bandwidth, wm->vsc);
1938 bandwidth.full = dfixed_div(bandwidth, line_time);
1939
1940 return dfixed_trunc(bandwidth);
1941 }
1942
1943 static u32 dce6_latency_watermark(struct dce6_wm_params *wm)
1944 {
1945 /* First calcualte the latency in ns */
1946 u32 mc_latency = 2000; /* 2000 ns. */
1947 u32 available_bandwidth = dce6_available_bandwidth(wm);
1948 u32 worst_chunk_return_time = (512 * 8 * 1000) / available_bandwidth;
1949 u32 cursor_line_pair_return_time = (128 * 4 * 1000) / available_bandwidth;
1950 u32 dc_latency = 40000000 / wm->disp_clk; /* dc pipe latency */
1951 u32 other_heads_data_return_time = ((wm->num_heads + 1) * worst_chunk_return_time) +
1952 (wm->num_heads * cursor_line_pair_return_time);
1953 u32 latency = mc_latency + other_heads_data_return_time + dc_latency;
1954 u32 max_src_lines_per_dst_line, lb_fill_bw, line_fill_time;
1955 u32 tmp, dmif_size = 12288;
1956 fixed20_12 a, b, c;
1957
1958 if (wm->num_heads == 0)
1959 return 0;
1960
1961 a.full = dfixed_const(2);
1962 b.full = dfixed_const(1);
1963 if ((wm->vsc.full > a.full) ||
1964 ((wm->vsc.full > b.full) && (wm->vtaps >= 3)) ||
1965 (wm->vtaps >= 5) ||
1966 ((wm->vsc.full >= a.full) && wm->interlaced))
1967 max_src_lines_per_dst_line = 4;
1968 else
1969 max_src_lines_per_dst_line = 2;
1970
1971 a.full = dfixed_const(available_bandwidth);
1972 b.full = dfixed_const(wm->num_heads);
1973 a.full = dfixed_div(a, b);
1974
1975 b.full = dfixed_const(mc_latency + 512);
1976 c.full = dfixed_const(wm->disp_clk);
1977 b.full = dfixed_div(b, c);
1978
1979 c.full = dfixed_const(dmif_size);
1980 b.full = dfixed_div(c, b);
1981
1982 tmp = min(dfixed_trunc(a), dfixed_trunc(b));
1983
1984 b.full = dfixed_const(1000);
1985 c.full = dfixed_const(wm->disp_clk);
1986 b.full = dfixed_div(c, b);
1987 c.full = dfixed_const(wm->bytes_per_pixel);
1988 b.full = dfixed_mul(b, c);
1989
1990 lb_fill_bw = min(tmp, dfixed_trunc(b));
1991
1992 a.full = dfixed_const(max_src_lines_per_dst_line * wm->src_width * wm->bytes_per_pixel);
1993 b.full = dfixed_const(1000);
1994 c.full = dfixed_const(lb_fill_bw);
1995 b.full = dfixed_div(c, b);
1996 a.full = dfixed_div(a, b);
1997 line_fill_time = dfixed_trunc(a);
1998
1999 if (line_fill_time < wm->active_time)
2000 return latency;
2001 else
2002 return latency + (line_fill_time - wm->active_time);
2003
2004 }
2005
2006 static bool dce6_average_bandwidth_vs_dram_bandwidth_for_display(struct dce6_wm_params *wm)
2007 {
2008 if (dce6_average_bandwidth(wm) <=
2009 (dce6_dram_bandwidth_for_display(wm) / wm->num_heads))
2010 return true;
2011 else
2012 return false;
2013 };
2014
2015 static bool dce6_average_bandwidth_vs_available_bandwidth(struct dce6_wm_params *wm)
2016 {
2017 if (dce6_average_bandwidth(wm) <=
2018 (dce6_available_bandwidth(wm) / wm->num_heads))
2019 return true;
2020 else
2021 return false;
2022 };
2023
2024 static bool dce6_check_latency_hiding(struct dce6_wm_params *wm)
2025 {
2026 u32 lb_partitions = wm->lb_size / wm->src_width;
2027 u32 line_time = wm->active_time + wm->blank_time;
2028 u32 latency_tolerant_lines;
2029 u32 latency_hiding;
2030 fixed20_12 a;
2031
2032 a.full = dfixed_const(1);
2033 if (wm->vsc.full > a.full)
2034 latency_tolerant_lines = 1;
2035 else {
2036 if (lb_partitions <= (wm->vtaps + 1))
2037 latency_tolerant_lines = 1;
2038 else
2039 latency_tolerant_lines = 2;
2040 }
2041
2042 latency_hiding = (latency_tolerant_lines * line_time + wm->blank_time);
2043
2044 if (dce6_latency_watermark(wm) <= latency_hiding)
2045 return true;
2046 else
2047 return false;
2048 }
2049
2050 static void dce6_program_watermarks(struct radeon_device *rdev,
2051 struct radeon_crtc *radeon_crtc,
2052 u32 lb_size, u32 num_heads)
2053 {
2054 struct drm_display_mode *mode = &radeon_crtc->base.mode;
2055 struct dce6_wm_params wm_low, wm_high;
2056 u32 dram_channels;
2057 u32 pixel_period;
2058 u32 line_time = 0;
2059 u32 latency_watermark_a = 0, latency_watermark_b = 0;
2060 u32 priority_a_mark = 0, priority_b_mark = 0;
2061 u32 priority_a_cnt = PRIORITY_OFF;
2062 u32 priority_b_cnt = PRIORITY_OFF;
2063 u32 tmp, arb_control3;
2064 fixed20_12 a, b, c;
2065
2066 if (radeon_crtc->base.enabled && num_heads && mode) {
2067 pixel_period = 1000000 / (u32)mode->clock;
2068 line_time = min((u32)mode->crtc_htotal * pixel_period, (u32)65535);
2069 priority_a_cnt = 0;
2070 priority_b_cnt = 0;
2071
2072 if (rdev->family == CHIP_ARUBA)
2073 dram_channels = evergreen_get_number_of_dram_channels(rdev);
2074 else
2075 dram_channels = si_get_number_of_dram_channels(rdev);
2076
2077 /* watermark for high clocks */
2078 if ((rdev->pm.pm_method == PM_METHOD_DPM) && rdev->pm.dpm_enabled) {
2079 wm_high.yclk =
2080 radeon_dpm_get_mclk(rdev, false) * 10;
2081 wm_high.sclk =
2082 radeon_dpm_get_sclk(rdev, false) * 10;
2083 } else {
2084 wm_high.yclk = rdev->pm.current_mclk * 10;
2085 wm_high.sclk = rdev->pm.current_sclk * 10;
2086 }
2087
2088 wm_high.disp_clk = mode->clock;
2089 wm_high.src_width = mode->crtc_hdisplay;
2090 wm_high.active_time = mode->crtc_hdisplay * pixel_period;
2091 wm_high.blank_time = line_time - wm_high.active_time;
2092 wm_high.interlaced = false;
2093 if (mode->flags & DRM_MODE_FLAG_INTERLACE)
2094 wm_high.interlaced = true;
2095 wm_high.vsc = radeon_crtc->vsc;
2096 wm_high.vtaps = 1;
2097 if (radeon_crtc->rmx_type != RMX_OFF)
2098 wm_high.vtaps = 2;
2099 wm_high.bytes_per_pixel = 4; /* XXX: get this from fb config */
2100 wm_high.lb_size = lb_size;
2101 wm_high.dram_channels = dram_channels;
2102 wm_high.num_heads = num_heads;
2103
2104 /* watermark for low clocks */
2105 if ((rdev->pm.pm_method == PM_METHOD_DPM) && rdev->pm.dpm_enabled) {
2106 wm_low.yclk =
2107 radeon_dpm_get_mclk(rdev, true) * 10;
2108 wm_low.sclk =
2109 radeon_dpm_get_sclk(rdev, true) * 10;
2110 } else {
2111 wm_low.yclk = rdev->pm.current_mclk * 10;
2112 wm_low.sclk = rdev->pm.current_sclk * 10;
2113 }
2114
2115 wm_low.disp_clk = mode->clock;
2116 wm_low.src_width = mode->crtc_hdisplay;
2117 wm_low.active_time = mode->crtc_hdisplay * pixel_period;
2118 wm_low.blank_time = line_time - wm_low.active_time;
2119 wm_low.interlaced = false;
2120 if (mode->flags & DRM_MODE_FLAG_INTERLACE)
2121 wm_low.interlaced = true;
2122 wm_low.vsc = radeon_crtc->vsc;
2123 wm_low.vtaps = 1;
2124 if (radeon_crtc->rmx_type != RMX_OFF)
2125 wm_low.vtaps = 2;
2126 wm_low.bytes_per_pixel = 4; /* XXX: get this from fb config */
2127 wm_low.lb_size = lb_size;
2128 wm_low.dram_channels = dram_channels;
2129 wm_low.num_heads = num_heads;
2130
2131 /* set for high clocks */
2132 latency_watermark_a = min(dce6_latency_watermark(&wm_high), (u32)65535);
2133 /* set for low clocks */
2134 latency_watermark_b = min(dce6_latency_watermark(&wm_low), (u32)65535);
2135
2136 /* possibly force display priority to high */
2137 /* should really do this at mode validation time... */
2138 if (!dce6_average_bandwidth_vs_dram_bandwidth_for_display(&wm_high) ||
2139 !dce6_average_bandwidth_vs_available_bandwidth(&wm_high) ||
2140 !dce6_check_latency_hiding(&wm_high) ||
2141 (rdev->disp_priority == 2)) {
2142 DRM_DEBUG_KMS("force priority to high\n");
2143 priority_a_cnt |= PRIORITY_ALWAYS_ON;
2144 priority_b_cnt |= PRIORITY_ALWAYS_ON;
2145 }
2146 if (!dce6_average_bandwidth_vs_dram_bandwidth_for_display(&wm_low) ||
2147 !dce6_average_bandwidth_vs_available_bandwidth(&wm_low) ||
2148 !dce6_check_latency_hiding(&wm_low) ||
2149 (rdev->disp_priority == 2)) {
2150 DRM_DEBUG_KMS("force priority to high\n");
2151 priority_a_cnt |= PRIORITY_ALWAYS_ON;
2152 priority_b_cnt |= PRIORITY_ALWAYS_ON;
2153 }
2154
2155 a.full = dfixed_const(1000);
2156 b.full = dfixed_const(mode->clock);
2157 b.full = dfixed_div(b, a);
2158 c.full = dfixed_const(latency_watermark_a);
2159 c.full = dfixed_mul(c, b);
2160 c.full = dfixed_mul(c, radeon_crtc->hsc);
2161 c.full = dfixed_div(c, a);
2162 a.full = dfixed_const(16);
2163 c.full = dfixed_div(c, a);
2164 priority_a_mark = dfixed_trunc(c);
2165 priority_a_cnt |= priority_a_mark & PRIORITY_MARK_MASK;
2166
2167 a.full = dfixed_const(1000);
2168 b.full = dfixed_const(mode->clock);
2169 b.full = dfixed_div(b, a);
2170 c.full = dfixed_const(latency_watermark_b);
2171 c.full = dfixed_mul(c, b);
2172 c.full = dfixed_mul(c, radeon_crtc->hsc);
2173 c.full = dfixed_div(c, a);
2174 a.full = dfixed_const(16);
2175 c.full = dfixed_div(c, a);
2176 priority_b_mark = dfixed_trunc(c);
2177 priority_b_cnt |= priority_b_mark & PRIORITY_MARK_MASK;
2178 }
2179
2180 /* select wm A */
2181 arb_control3 = RREG32(DPG_PIPE_ARBITRATION_CONTROL3 + radeon_crtc->crtc_offset);
2182 tmp = arb_control3;
2183 tmp &= ~LATENCY_WATERMARK_MASK(3);
2184 tmp |= LATENCY_WATERMARK_MASK(1);
2185 WREG32(DPG_PIPE_ARBITRATION_CONTROL3 + radeon_crtc->crtc_offset, tmp);
2186 WREG32(DPG_PIPE_LATENCY_CONTROL + radeon_crtc->crtc_offset,
2187 (LATENCY_LOW_WATERMARK(latency_watermark_a) |
2188 LATENCY_HIGH_WATERMARK(line_time)));
2189 /* select wm B */
2190 tmp = RREG32(DPG_PIPE_ARBITRATION_CONTROL3 + radeon_crtc->crtc_offset);
2191 tmp &= ~LATENCY_WATERMARK_MASK(3);
2192 tmp |= LATENCY_WATERMARK_MASK(2);
2193 WREG32(DPG_PIPE_ARBITRATION_CONTROL3 + radeon_crtc->crtc_offset, tmp);
2194 WREG32(DPG_PIPE_LATENCY_CONTROL + radeon_crtc->crtc_offset,
2195 (LATENCY_LOW_WATERMARK(latency_watermark_b) |
2196 LATENCY_HIGH_WATERMARK(line_time)));
2197 /* restore original selection */
2198 WREG32(DPG_PIPE_ARBITRATION_CONTROL3 + radeon_crtc->crtc_offset, arb_control3);
2199
2200 /* write the priority marks */
2201 WREG32(PRIORITY_A_CNT + radeon_crtc->crtc_offset, priority_a_cnt);
2202 WREG32(PRIORITY_B_CNT + radeon_crtc->crtc_offset, priority_b_cnt);
2203
2204 /* save values for DPM */
2205 radeon_crtc->line_time = line_time;
2206 radeon_crtc->wm_high = latency_watermark_a;
2207 radeon_crtc->wm_low = latency_watermark_b;
2208 }
2209
2210 void dce6_bandwidth_update(struct radeon_device *rdev)
2211 {
2212 struct drm_display_mode *mode0 = NULL;
2213 struct drm_display_mode *mode1 = NULL;
2214 u32 num_heads = 0, lb_size;
2215 int i;
2216
2217 radeon_update_display_priority(rdev);
2218
2219 for (i = 0; i < rdev->num_crtc; i++) {
2220 if (rdev->mode_info.crtcs[i]->base.enabled)
2221 num_heads++;
2222 }
2223 for (i = 0; i < rdev->num_crtc; i += 2) {
2224 mode0 = &rdev->mode_info.crtcs[i]->base.mode;
2225 mode1 = &rdev->mode_info.crtcs[i+1]->base.mode;
2226 lb_size = dce6_line_buffer_adjust(rdev, rdev->mode_info.crtcs[i], mode0, mode1);
2227 dce6_program_watermarks(rdev, rdev->mode_info.crtcs[i], lb_size, num_heads);
2228 lb_size = dce6_line_buffer_adjust(rdev, rdev->mode_info.crtcs[i+1], mode1, mode0);
2229 dce6_program_watermarks(rdev, rdev->mode_info.crtcs[i+1], lb_size, num_heads);
2230 }
2231 }
2232
2233 /*
2234 * Core functions
2235 */
2236 static void si_tiling_mode_table_init(struct radeon_device *rdev)
2237 {
2238 const u32 num_tile_mode_states = 32;
2239 u32 reg_offset, gb_tile_moden, split_equal_to_row_size;
2240
2241 switch (rdev->config.si.mem_row_size_in_kb) {
2242 case 1:
2243 split_equal_to_row_size = ADDR_SURF_TILE_SPLIT_1KB;
2244 break;
2245 case 2:
2246 default:
2247 split_equal_to_row_size = ADDR_SURF_TILE_SPLIT_2KB;
2248 break;
2249 case 4:
2250 split_equal_to_row_size = ADDR_SURF_TILE_SPLIT_4KB;
2251 break;
2252 }
2253
2254 if ((rdev->family == CHIP_TAHITI) ||
2255 (rdev->family == CHIP_PITCAIRN)) {
2256 for (reg_offset = 0; reg_offset < num_tile_mode_states; reg_offset++) {
2257 switch (reg_offset) {
2258 case 0: /* non-AA compressed depth or any compressed stencil */
2259 gb_tile_moden = (ARRAY_MODE(ARRAY_2D_TILED_THIN1) |
2260 MICRO_TILE_MODE(ADDR_SURF_DEPTH_MICRO_TILING) |
2261 PIPE_CONFIG(ADDR_SURF_P8_32x32_8x16) |
2262 TILE_SPLIT(ADDR_SURF_TILE_SPLIT_64B) |
2263 NUM_BANKS(ADDR_SURF_16_BANK) |
2264 BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
2265 BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_4) |
2266 MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_2));
2267 break;
2268 case 1: /* 2xAA/4xAA compressed depth only */
2269 gb_tile_moden = (ARRAY_MODE(ARRAY_2D_TILED_THIN1) |
2270 MICRO_TILE_MODE(ADDR_SURF_DEPTH_MICRO_TILING) |
2271 PIPE_CONFIG(ADDR_SURF_P8_32x32_8x16) |
2272 TILE_SPLIT(ADDR_SURF_TILE_SPLIT_128B) |
2273 NUM_BANKS(ADDR_SURF_16_BANK) |
2274 BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
2275 BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_4) |
2276 MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_2));
2277 break;
2278 case 2: /* 8xAA compressed depth only */
2279 gb_tile_moden = (ARRAY_MODE(ARRAY_2D_TILED_THIN1) |
2280 MICRO_TILE_MODE(ADDR_SURF_DEPTH_MICRO_TILING) |
2281 PIPE_CONFIG(ADDR_SURF_P8_32x32_8x16) |
2282 TILE_SPLIT(ADDR_SURF_TILE_SPLIT_256B) |
2283 NUM_BANKS(ADDR_SURF_16_BANK) |
2284 BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
2285 BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_4) |
2286 MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_2));
2287 break;
2288 case 3: /* 2xAA/4xAA compressed depth with stencil (for depth buffer) */
2289 gb_tile_moden = (ARRAY_MODE(ARRAY_2D_TILED_THIN1) |
2290 MICRO_TILE_MODE(ADDR_SURF_DEPTH_MICRO_TILING) |
2291 PIPE_CONFIG(ADDR_SURF_P8_32x32_8x16) |
2292 TILE_SPLIT(ADDR_SURF_TILE_SPLIT_128B) |
2293 NUM_BANKS(ADDR_SURF_16_BANK) |
2294 BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
2295 BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_4) |
2296 MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_2));
2297 break;
2298 case 4: /* Maps w/ a dimension less than the 2D macro-tile dimensions (for mipmapped depth textures) */
2299 gb_tile_moden = (ARRAY_MODE(ARRAY_1D_TILED_THIN1) |
2300 MICRO_TILE_MODE(ADDR_SURF_DEPTH_MICRO_TILING) |
2301 PIPE_CONFIG(ADDR_SURF_P8_32x32_8x16) |
2302 TILE_SPLIT(ADDR_SURF_TILE_SPLIT_64B) |
2303 NUM_BANKS(ADDR_SURF_16_BANK) |
2304 BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
2305 BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_2) |
2306 MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_2));
2307 break;
2308 case 5: /* Uncompressed 16bpp depth - and stencil buffer allocated with it */
2309 gb_tile_moden = (ARRAY_MODE(ARRAY_2D_TILED_THIN1) |
2310 MICRO_TILE_MODE(ADDR_SURF_DEPTH_MICRO_TILING) |
2311 PIPE_CONFIG(ADDR_SURF_P8_32x32_8x16) |
2312 TILE_SPLIT(split_equal_to_row_size) |
2313 NUM_BANKS(ADDR_SURF_16_BANK) |
2314 BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
2315 BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_2) |
2316 MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_2));
2317 break;
2318 case 6: /* Uncompressed 32bpp depth - and stencil buffer allocated with it */
2319 gb_tile_moden = (ARRAY_MODE(ARRAY_2D_TILED_THIN1) |
2320 MICRO_TILE_MODE(ADDR_SURF_DEPTH_MICRO_TILING) |
2321 PIPE_CONFIG(ADDR_SURF_P8_32x32_8x16) |
2322 TILE_SPLIT(split_equal_to_row_size) |
2323 NUM_BANKS(ADDR_SURF_16_BANK) |
2324 BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
2325 BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_1) |
2326 MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_1));
2327 break;
2328 case 7: /* Uncompressed 8bpp stencil without depth (drivers typically do not use) */
2329 gb_tile_moden = (ARRAY_MODE(ARRAY_2D_TILED_THIN1) |
2330 MICRO_TILE_MODE(ADDR_SURF_DEPTH_MICRO_TILING) |
2331 PIPE_CONFIG(ADDR_SURF_P8_32x32_8x16) |
2332 TILE_SPLIT(split_equal_to_row_size) |
2333 NUM_BANKS(ADDR_SURF_16_BANK) |
2334 BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
2335 BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_4) |
2336 MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_2));
2337 break;
2338 case 8: /* 1D and 1D Array Surfaces */
2339 gb_tile_moden = (ARRAY_MODE(ARRAY_LINEAR_ALIGNED) |
2340 MICRO_TILE_MODE(ADDR_SURF_DISPLAY_MICRO_TILING) |
2341 PIPE_CONFIG(ADDR_SURF_P8_32x32_8x16) |
2342 TILE_SPLIT(ADDR_SURF_TILE_SPLIT_64B) |
2343 NUM_BANKS(ADDR_SURF_16_BANK) |
2344 BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
2345 BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_2) |
2346 MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_2));
2347 break;
2348 case 9: /* Displayable maps. */
2349 gb_tile_moden = (ARRAY_MODE(ARRAY_1D_TILED_THIN1) |
2350 MICRO_TILE_MODE(ADDR_SURF_DISPLAY_MICRO_TILING) |
2351 PIPE_CONFIG(ADDR_SURF_P8_32x32_8x16) |
2352 TILE_SPLIT(ADDR_SURF_TILE_SPLIT_64B) |
2353 NUM_BANKS(ADDR_SURF_16_BANK) |
2354 BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
2355 BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_2) |
2356 MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_2));
2357 break;
2358 case 10: /* Display 8bpp. */
2359 gb_tile_moden = (ARRAY_MODE(ARRAY_2D_TILED_THIN1) |
2360 MICRO_TILE_MODE(ADDR_SURF_DISPLAY_MICRO_TILING) |
2361 PIPE_CONFIG(ADDR_SURF_P8_32x32_8x16) |
2362 TILE_SPLIT(ADDR_SURF_TILE_SPLIT_256B) |
2363 NUM_BANKS(ADDR_SURF_16_BANK) |
2364 BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
2365 BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_4) |
2366 MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_2));
2367 break;
2368 case 11: /* Display 16bpp. */
2369 gb_tile_moden = (ARRAY_MODE(ARRAY_2D_TILED_THIN1) |
2370 MICRO_TILE_MODE(ADDR_SURF_DISPLAY_MICRO_TILING) |
2371 PIPE_CONFIG(ADDR_SURF_P8_32x32_8x16) |
2372 TILE_SPLIT(ADDR_SURF_TILE_SPLIT_256B) |
2373 NUM_BANKS(ADDR_SURF_16_BANK) |
2374 BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
2375 BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_2) |
2376 MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_2));
2377 break;
2378 case 12: /* Display 32bpp. */
2379 gb_tile_moden = (ARRAY_MODE(ARRAY_2D_TILED_THIN1) |
2380 MICRO_TILE_MODE(ADDR_SURF_DISPLAY_MICRO_TILING) |
2381 PIPE_CONFIG(ADDR_SURF_P8_32x32_8x16) |
2382 TILE_SPLIT(ADDR_SURF_TILE_SPLIT_512B) |
2383 NUM_BANKS(ADDR_SURF_16_BANK) |
2384 BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
2385 BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_1) |
2386 MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_1));
2387 break;
2388 case 13: /* Thin. */
2389 gb_tile_moden = (ARRAY_MODE(ARRAY_1D_TILED_THIN1) |
2390 MICRO_TILE_MODE(ADDR_SURF_THIN_MICRO_TILING) |
2391 PIPE_CONFIG(ADDR_SURF_P8_32x32_8x16) |
2392 TILE_SPLIT(ADDR_SURF_TILE_SPLIT_64B) |
2393 NUM_BANKS(ADDR_SURF_16_BANK) |
2394 BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
2395 BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_2) |
2396 MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_2));
2397 break;
2398 case 14: /* Thin 8 bpp. */
2399 gb_tile_moden = (ARRAY_MODE(ARRAY_2D_TILED_THIN1) |
2400 MICRO_TILE_MODE(ADDR_SURF_THIN_MICRO_TILING) |
2401 PIPE_CONFIG(ADDR_SURF_P8_32x32_8x16) |
2402 TILE_SPLIT(ADDR_SURF_TILE_SPLIT_256B) |
2403 NUM_BANKS(ADDR_SURF_16_BANK) |
2404 BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
2405 BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_4) |
2406 MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_1));
2407 break;
2408 case 15: /* Thin 16 bpp. */
2409 gb_tile_moden = (ARRAY_MODE(ARRAY_2D_TILED_THIN1) |
2410 MICRO_TILE_MODE(ADDR_SURF_THIN_MICRO_TILING) |
2411 PIPE_CONFIG(ADDR_SURF_P8_32x32_8x16) |
2412 TILE_SPLIT(ADDR_SURF_TILE_SPLIT_256B) |
2413 NUM_BANKS(ADDR_SURF_16_BANK) |
2414 BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
2415 BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_2) |
2416 MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_1));
2417 break;
2418 case 16: /* Thin 32 bpp. */
2419 gb_tile_moden = (ARRAY_MODE(ARRAY_2D_TILED_THIN1) |
2420 MICRO_TILE_MODE(ADDR_SURF_THIN_MICRO_TILING) |
2421 PIPE_CONFIG(ADDR_SURF_P8_32x32_8x16) |
2422 TILE_SPLIT(ADDR_SURF_TILE_SPLIT_512B) |
2423 NUM_BANKS(ADDR_SURF_16_BANK) |
2424 BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
2425 BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_1) |
2426 MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_1));
2427 break;
2428 case 17: /* Thin 64 bpp. */
2429 gb_tile_moden = (ARRAY_MODE(ARRAY_2D_TILED_THIN1) |
2430 MICRO_TILE_MODE(ADDR_SURF_THIN_MICRO_TILING) |
2431 PIPE_CONFIG(ADDR_SURF_P8_32x32_8x16) |
2432 TILE_SPLIT(split_equal_to_row_size) |
2433 NUM_BANKS(ADDR_SURF_16_BANK) |
2434 BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
2435 BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_1) |
2436 MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_1));
2437 break;
2438 case 21: /* 8 bpp PRT. */
2439 gb_tile_moden = (ARRAY_MODE(ARRAY_2D_TILED_THIN1) |
2440 MICRO_TILE_MODE(ADDR_SURF_THIN_MICRO_TILING) |
2441 PIPE_CONFIG(ADDR_SURF_P8_32x32_8x16) |
2442 TILE_SPLIT(ADDR_SURF_TILE_SPLIT_256B) |
2443 NUM_BANKS(ADDR_SURF_16_BANK) |
2444 BANK_WIDTH(ADDR_SURF_BANK_WIDTH_2) |
2445 BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_4) |
2446 MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_2));
2447 break;
2448 case 22: /* 16 bpp PRT */
2449 gb_tile_moden = (ARRAY_MODE(ARRAY_2D_TILED_THIN1) |
2450 MICRO_TILE_MODE(ADDR_SURF_THIN_MICRO_TILING) |
2451 PIPE_CONFIG(ADDR_SURF_P8_32x32_8x16) |
2452 TILE_SPLIT(ADDR_SURF_TILE_SPLIT_256B) |
2453 NUM_BANKS(ADDR_SURF_16_BANK) |
2454 BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
2455 BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_4) |
2456 MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_4));
2457 break;
2458 case 23: /* 32 bpp PRT */
2459 gb_tile_moden = (ARRAY_MODE(ARRAY_2D_TILED_THIN1) |
2460 MICRO_TILE_MODE(ADDR_SURF_THIN_MICRO_TILING) |
2461 PIPE_CONFIG(ADDR_SURF_P8_32x32_8x16) |
2462 TILE_SPLIT(ADDR_SURF_TILE_SPLIT_256B) |
2463 NUM_BANKS(ADDR_SURF_16_BANK) |
2464 BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
2465 BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_2) |
2466 MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_2));
2467 break;
2468 case 24: /* 64 bpp PRT */
2469 gb_tile_moden = (ARRAY_MODE(ARRAY_2D_TILED_THIN1) |
2470 MICRO_TILE_MODE(ADDR_SURF_THIN_MICRO_TILING) |
2471 PIPE_CONFIG(ADDR_SURF_P8_32x32_8x16) |
2472 TILE_SPLIT(ADDR_SURF_TILE_SPLIT_512B) |
2473 NUM_BANKS(ADDR_SURF_16_BANK) |
2474 BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
2475 BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_1) |
2476 MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_2));
2477 break;
2478 case 25: /* 128 bpp PRT */
2479 gb_tile_moden = (ARRAY_MODE(ARRAY_2D_TILED_THIN1) |
2480 MICRO_TILE_MODE(ADDR_SURF_THIN_MICRO_TILING) |
2481 PIPE_CONFIG(ADDR_SURF_P8_32x32_8x16) |
2482 TILE_SPLIT(ADDR_SURF_TILE_SPLIT_1KB) |
2483 NUM_BANKS(ADDR_SURF_8_BANK) |
2484 BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
2485 BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_1) |
2486 MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_1));
2487 break;
2488 default:
2489 gb_tile_moden = 0;
2490 break;
2491 }
2492 rdev->config.si.tile_mode_array[reg_offset] = gb_tile_moden;
2493 WREG32(GB_TILE_MODE0 + (reg_offset * 4), gb_tile_moden);
2494 }
2495 } else if ((rdev->family == CHIP_VERDE) ||
2496 (rdev->family == CHIP_OLAND) ||
2497 (rdev->family == CHIP_HAINAN)) {
2498 for (reg_offset = 0; reg_offset < num_tile_mode_states; reg_offset++) {
2499 switch (reg_offset) {
2500 case 0: /* non-AA compressed depth or any compressed stencil */
2501 gb_tile_moden = (ARRAY_MODE(ARRAY_2D_TILED_THIN1) |
2502 MICRO_TILE_MODE(ADDR_SURF_DEPTH_MICRO_TILING) |
2503 PIPE_CONFIG(ADDR_SURF_P4_8x16) |
2504 TILE_SPLIT(ADDR_SURF_TILE_SPLIT_64B) |
2505 NUM_BANKS(ADDR_SURF_16_BANK) |
2506 BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
2507 BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_4) |
2508 MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_4));
2509 break;
2510 case 1: /* 2xAA/4xAA compressed depth only */
2511 gb_tile_moden = (ARRAY_MODE(ARRAY_2D_TILED_THIN1) |
2512 MICRO_TILE_MODE(ADDR_SURF_DEPTH_MICRO_TILING) |
2513 PIPE_CONFIG(ADDR_SURF_P4_8x16) |
2514 TILE_SPLIT(ADDR_SURF_TILE_SPLIT_128B) |
2515 NUM_BANKS(ADDR_SURF_16_BANK) |
2516 BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
2517 BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_4) |
2518 MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_4));
2519 break;
2520 case 2: /* 8xAA compressed depth only */
2521 gb_tile_moden = (ARRAY_MODE(ARRAY_2D_TILED_THIN1) |
2522 MICRO_TILE_MODE(ADDR_SURF_DEPTH_MICRO_TILING) |
2523 PIPE_CONFIG(ADDR_SURF_P4_8x16) |
2524 TILE_SPLIT(ADDR_SURF_TILE_SPLIT_256B) |
2525 NUM_BANKS(ADDR_SURF_16_BANK) |
2526 BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
2527 BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_4) |
2528 MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_4));
2529 break;
2530 case 3: /* 2xAA/4xAA compressed depth with stencil (for depth buffer) */
2531 gb_tile_moden = (ARRAY_MODE(ARRAY_2D_TILED_THIN1) |
2532 MICRO_TILE_MODE(ADDR_SURF_DEPTH_MICRO_TILING) |
2533 PIPE_CONFIG(ADDR_SURF_P4_8x16) |
2534 TILE_SPLIT(ADDR_SURF_TILE_SPLIT_128B) |
2535 NUM_BANKS(ADDR_SURF_16_BANK) |
2536 BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
2537 BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_4) |
2538 MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_4));
2539 break;
2540 case 4: /* Maps w/ a dimension less than the 2D macro-tile dimensions (for mipmapped depth textures) */
2541 gb_tile_moden = (ARRAY_MODE(ARRAY_1D_TILED_THIN1) |
2542 MICRO_TILE_MODE(ADDR_SURF_DEPTH_MICRO_TILING) |
2543 PIPE_CONFIG(ADDR_SURF_P4_8x16) |
2544 TILE_SPLIT(ADDR_SURF_TILE_SPLIT_64B) |
2545 NUM_BANKS(ADDR_SURF_16_BANK) |
2546 BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
2547 BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_2) |
2548 MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_2));
2549 break;
2550 case 5: /* Uncompressed 16bpp depth - and stencil buffer allocated with it */
2551 gb_tile_moden = (ARRAY_MODE(ARRAY_2D_TILED_THIN1) |
2552 MICRO_TILE_MODE(ADDR_SURF_DEPTH_MICRO_TILING) |
2553 PIPE_CONFIG(ADDR_SURF_P4_8x16) |
2554 TILE_SPLIT(split_equal_to_row_size) |
2555 NUM_BANKS(ADDR_SURF_16_BANK) |
2556 BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
2557 BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_2) |
2558 MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_2));
2559 break;
2560 case 6: /* Uncompressed 32bpp depth - and stencil buffer allocated with it */
2561 gb_tile_moden = (ARRAY_MODE(ARRAY_2D_TILED_THIN1) |
2562 MICRO_TILE_MODE(ADDR_SURF_DEPTH_MICRO_TILING) |
2563 PIPE_CONFIG(ADDR_SURF_P4_8x16) |
2564 TILE_SPLIT(split_equal_to_row_size) |
2565 NUM_BANKS(ADDR_SURF_16_BANK) |
2566 BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
2567 BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_1) |
2568 MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_2));
2569 break;
2570 case 7: /* Uncompressed 8bpp stencil without depth (drivers typically do not use) */
2571 gb_tile_moden = (ARRAY_MODE(ARRAY_2D_TILED_THIN1) |
2572 MICRO_TILE_MODE(ADDR_SURF_DEPTH_MICRO_TILING) |
2573 PIPE_CONFIG(ADDR_SURF_P4_8x16) |
2574 TILE_SPLIT(split_equal_to_row_size) |
2575 NUM_BANKS(ADDR_SURF_16_BANK) |
2576 BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
2577 BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_4) |
2578 MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_4));
2579 break;
2580 case 8: /* 1D and 1D Array Surfaces */
2581 gb_tile_moden = (ARRAY_MODE(ARRAY_LINEAR_ALIGNED) |
2582 MICRO_TILE_MODE(ADDR_SURF_DISPLAY_MICRO_TILING) |
2583 PIPE_CONFIG(ADDR_SURF_P4_8x16) |
2584 TILE_SPLIT(ADDR_SURF_TILE_SPLIT_64B) |
2585 NUM_BANKS(ADDR_SURF_16_BANK) |
2586 BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
2587 BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_2) |
2588 MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_2));
2589 break;
2590 case 9: /* Displayable maps. */
2591 gb_tile_moden = (ARRAY_MODE(ARRAY_1D_TILED_THIN1) |
2592 MICRO_TILE_MODE(ADDR_SURF_DISPLAY_MICRO_TILING) |
2593 PIPE_CONFIG(ADDR_SURF_P4_8x16) |
2594 TILE_SPLIT(ADDR_SURF_TILE_SPLIT_64B) |
2595 NUM_BANKS(ADDR_SURF_16_BANK) |
2596 BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
2597 BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_2) |
2598 MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_2));
2599 break;
2600 case 10: /* Display 8bpp. */
2601 gb_tile_moden = (ARRAY_MODE(ARRAY_2D_TILED_THIN1) |
2602 MICRO_TILE_MODE(ADDR_SURF_DISPLAY_MICRO_TILING) |
2603 PIPE_CONFIG(ADDR_SURF_P4_8x16) |
2604 TILE_SPLIT(ADDR_SURF_TILE_SPLIT_256B) |
2605 NUM_BANKS(ADDR_SURF_16_BANK) |
2606 BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
2607 BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_4) |
2608 MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_4));
2609 break;
2610 case 11: /* Display 16bpp. */
2611 gb_tile_moden = (ARRAY_MODE(ARRAY_2D_TILED_THIN1) |
2612 MICRO_TILE_MODE(ADDR_SURF_DISPLAY_MICRO_TILING) |
2613 PIPE_CONFIG(ADDR_SURF_P4_8x16) |
2614 TILE_SPLIT(ADDR_SURF_TILE_SPLIT_256B) |
2615 NUM_BANKS(ADDR_SURF_16_BANK) |
2616 BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
2617 BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_2) |
2618 MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_2));
2619 break;
2620 case 12: /* Display 32bpp. */
2621 gb_tile_moden = (ARRAY_MODE(ARRAY_2D_TILED_THIN1) |
2622 MICRO_TILE_MODE(ADDR_SURF_DISPLAY_MICRO_TILING) |
2623 PIPE_CONFIG(ADDR_SURF_P4_8x16) |
2624 TILE_SPLIT(ADDR_SURF_TILE_SPLIT_512B) |
2625 NUM_BANKS(ADDR_SURF_16_BANK) |
2626 BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
2627 BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_1) |
2628 MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_2));
2629 break;
2630 case 13: /* Thin. */
2631 gb_tile_moden = (ARRAY_MODE(ARRAY_1D_TILED_THIN1) |
2632 MICRO_TILE_MODE(ADDR_SURF_THIN_MICRO_TILING) |
2633 PIPE_CONFIG(ADDR_SURF_P4_8x16) |
2634 TILE_SPLIT(ADDR_SURF_TILE_SPLIT_64B) |
2635 NUM_BANKS(ADDR_SURF_16_BANK) |
2636 BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
2637 BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_2) |
2638 MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_2));
2639 break;
2640 case 14: /* Thin 8 bpp. */
2641 gb_tile_moden = (ARRAY_MODE(ARRAY_2D_TILED_THIN1) |
2642 MICRO_TILE_MODE(ADDR_SURF_THIN_MICRO_TILING) |
2643 PIPE_CONFIG(ADDR_SURF_P4_8x16) |
2644 TILE_SPLIT(ADDR_SURF_TILE_SPLIT_256B) |
2645 NUM_BANKS(ADDR_SURF_16_BANK) |
2646 BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
2647 BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_4) |
2648 MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_2));
2649 break;
2650 case 15: /* Thin 16 bpp. */
2651 gb_tile_moden = (ARRAY_MODE(ARRAY_2D_TILED_THIN1) |
2652 MICRO_TILE_MODE(ADDR_SURF_THIN_MICRO_TILING) |
2653 PIPE_CONFIG(ADDR_SURF_P4_8x16) |
2654 TILE_SPLIT(ADDR_SURF_TILE_SPLIT_256B) |
2655 NUM_BANKS(ADDR_SURF_16_BANK) |
2656 BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
2657 BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_2) |
2658 MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_2));
2659 break;
2660 case 16: /* Thin 32 bpp. */
2661 gb_tile_moden = (ARRAY_MODE(ARRAY_2D_TILED_THIN1) |
2662 MICRO_TILE_MODE(ADDR_SURF_THIN_MICRO_TILING) |
2663 PIPE_CONFIG(ADDR_SURF_P4_8x16) |
2664 TILE_SPLIT(ADDR_SURF_TILE_SPLIT_512B) |
2665 NUM_BANKS(ADDR_SURF_16_BANK) |
2666 BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
2667 BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_1) |
2668 MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_2));
2669 break;
2670 case 17: /* Thin 64 bpp. */
2671 gb_tile_moden = (ARRAY_MODE(ARRAY_2D_TILED_THIN1) |
2672 MICRO_TILE_MODE(ADDR_SURF_THIN_MICRO_TILING) |
2673 PIPE_CONFIG(ADDR_SURF_P4_8x16) |
2674 TILE_SPLIT(split_equal_to_row_size) |
2675 NUM_BANKS(ADDR_SURF_16_BANK) |
2676 BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
2677 BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_1) |
2678 MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_2));
2679 break;
2680 case 21: /* 8 bpp PRT. */
2681 gb_tile_moden = (ARRAY_MODE(ARRAY_2D_TILED_THIN1) |
2682 MICRO_TILE_MODE(ADDR_SURF_THIN_MICRO_TILING) |
2683 PIPE_CONFIG(ADDR_SURF_P8_32x32_8x16) |
2684 TILE_SPLIT(ADDR_SURF_TILE_SPLIT_256B) |
2685 NUM_BANKS(ADDR_SURF_16_BANK) |
2686 BANK_WIDTH(ADDR_SURF_BANK_WIDTH_2) |
2687 BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_4) |
2688 MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_2));
2689 break;
2690 case 22: /* 16 bpp PRT */
2691 gb_tile_moden = (ARRAY_MODE(ARRAY_2D_TILED_THIN1) |
2692 MICRO_TILE_MODE(ADDR_SURF_THIN_MICRO_TILING) |
2693 PIPE_CONFIG(ADDR_SURF_P8_32x32_8x16) |
2694 TILE_SPLIT(ADDR_SURF_TILE_SPLIT_256B) |
2695 NUM_BANKS(ADDR_SURF_16_BANK) |
2696 BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
2697 BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_4) |
2698 MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_4));
2699 break;
2700 case 23: /* 32 bpp PRT */
2701 gb_tile_moden = (ARRAY_MODE(ARRAY_2D_TILED_THIN1) |
2702 MICRO_TILE_MODE(ADDR_SURF_THIN_MICRO_TILING) |
2703 PIPE_CONFIG(ADDR_SURF_P8_32x32_8x16) |
2704 TILE_SPLIT(ADDR_SURF_TILE_SPLIT_256B) |
2705 NUM_BANKS(ADDR_SURF_16_BANK) |
2706 BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
2707 BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_2) |
2708 MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_2));
2709 break;
2710 case 24: /* 64 bpp PRT */
2711 gb_tile_moden = (ARRAY_MODE(ARRAY_2D_TILED_THIN1) |
2712 MICRO_TILE_MODE(ADDR_SURF_THIN_MICRO_TILING) |
2713 PIPE_CONFIG(ADDR_SURF_P8_32x32_8x16) |
2714 TILE_SPLIT(ADDR_SURF_TILE_SPLIT_512B) |
2715 NUM_BANKS(ADDR_SURF_16_BANK) |
2716 BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
2717 BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_1) |
2718 MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_2));
2719 break;
2720 case 25: /* 128 bpp PRT */
2721 gb_tile_moden = (ARRAY_MODE(ARRAY_2D_TILED_THIN1) |
2722 MICRO_TILE_MODE(ADDR_SURF_THIN_MICRO_TILING) |
2723 PIPE_CONFIG(ADDR_SURF_P8_32x32_8x16) |
2724 TILE_SPLIT(ADDR_SURF_TILE_SPLIT_1KB) |
2725 NUM_BANKS(ADDR_SURF_8_BANK) |
2726 BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
2727 BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_1) |
2728 MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_1));
2729 break;
2730 default:
2731 gb_tile_moden = 0;
2732 break;
2733 }
2734 rdev->config.si.tile_mode_array[reg_offset] = gb_tile_moden;
2735 WREG32(GB_TILE_MODE0 + (reg_offset * 4), gb_tile_moden);
2736 }
2737 } else
2738 DRM_ERROR("unknown asic: 0x%x\n", rdev->family);
2739 }
2740
2741 static void si_select_se_sh(struct radeon_device *rdev,
2742 u32 se_num, u32 sh_num)
2743 {
2744 u32 data = INSTANCE_BROADCAST_WRITES;
2745
2746 if ((se_num == 0xffffffff) && (sh_num == 0xffffffff))
2747 data |= SH_BROADCAST_WRITES | SE_BROADCAST_WRITES;
2748 else if (se_num == 0xffffffff)
2749 data |= SE_BROADCAST_WRITES | SH_INDEX(sh_num);
2750 else if (sh_num == 0xffffffff)
2751 data |= SH_BROADCAST_WRITES | SE_INDEX(se_num);
2752 else
2753 data |= SH_INDEX(sh_num) | SE_INDEX(se_num);
2754 WREG32(GRBM_GFX_INDEX, data);
2755 }
2756
2757 static u32 si_create_bitmask(u32 bit_width)
2758 {
2759 u32 i, mask = 0;
2760
2761 for (i = 0; i < bit_width; i++) {
2762 mask <<= 1;
2763 mask |= 1;
2764 }
2765 return mask;
2766 }
2767
2768 static u32 si_get_cu_enabled(struct radeon_device *rdev, u32 cu_per_sh)
2769 {
2770 u32 data, mask;
2771
2772 data = RREG32(CC_GC_SHADER_ARRAY_CONFIG);
2773 if (data & 1)
2774 data &= INACTIVE_CUS_MASK;
2775 else
2776 data = 0;
2777 data |= RREG32(GC_USER_SHADER_ARRAY_CONFIG);
2778
2779 data >>= INACTIVE_CUS_SHIFT;
2780
2781 mask = si_create_bitmask(cu_per_sh);
2782
2783 return ~data & mask;
2784 }
2785
2786 static void si_setup_spi(struct radeon_device *rdev,
2787 u32 se_num, u32 sh_per_se,
2788 u32 cu_per_sh)
2789 {
2790 int i, j, k;
2791 u32 data, mask, active_cu;
2792
2793 for (i = 0; i < se_num; i++) {
2794 for (j = 0; j < sh_per_se; j++) {
2795 si_select_se_sh(rdev, i, j);
2796 data = RREG32(SPI_STATIC_THREAD_MGMT_3);
2797 active_cu = si_get_cu_enabled(rdev, cu_per_sh);
2798
2799 mask = 1;
2800 for (k = 0; k < 16; k++) {
2801 mask <<= k;
2802 if (active_cu & mask) {
2803 data &= ~mask;
2804 WREG32(SPI_STATIC_THREAD_MGMT_3, data);
2805 break;
2806 }
2807 }
2808 }
2809 }
2810 si_select_se_sh(rdev, 0xffffffff, 0xffffffff);
2811 }
2812
2813 static u32 si_get_rb_disabled(struct radeon_device *rdev,
2814 u32 max_rb_num_per_se,
2815 u32 sh_per_se)
2816 {
2817 u32 data, mask;
2818
2819 data = RREG32(CC_RB_BACKEND_DISABLE);
2820 if (data & 1)
2821 data &= BACKEND_DISABLE_MASK;
2822 else
2823 data = 0;
2824 data |= RREG32(GC_USER_RB_BACKEND_DISABLE);
2825
2826 data >>= BACKEND_DISABLE_SHIFT;
2827
2828 mask = si_create_bitmask(max_rb_num_per_se / sh_per_se);
2829
2830 return data & mask;
2831 }
2832
2833 static void si_setup_rb(struct radeon_device *rdev,
2834 u32 se_num, u32 sh_per_se,
2835 u32 max_rb_num_per_se)
2836 {
2837 int i, j;
2838 u32 data, mask;
2839 u32 disabled_rbs = 0;
2840 u32 enabled_rbs = 0;
2841
2842 for (i = 0; i < se_num; i++) {
2843 for (j = 0; j < sh_per_se; j++) {
2844 si_select_se_sh(rdev, i, j);
2845 data = si_get_rb_disabled(rdev, max_rb_num_per_se, sh_per_se);
2846 disabled_rbs |= data << ((i * sh_per_se + j) * TAHITI_RB_BITMAP_WIDTH_PER_SH);
2847 }
2848 }
2849 si_select_se_sh(rdev, 0xffffffff, 0xffffffff);
2850
2851 mask = 1;
2852 for (i = 0; i < max_rb_num_per_se * se_num; i++) {
2853 if (!(disabled_rbs & mask))
2854 enabled_rbs |= mask;
2855 mask <<= 1;
2856 }
2857
2858 rdev->config.si.backend_enable_mask = enabled_rbs;
2859
2860 for (i = 0; i < se_num; i++) {
2861 si_select_se_sh(rdev, i, 0xffffffff);
2862 data = 0;
2863 for (j = 0; j < sh_per_se; j++) {
2864 switch (enabled_rbs & 3) {
2865 case 1:
2866 data |= (RASTER_CONFIG_RB_MAP_0 << (i * sh_per_se + j) * 2);
2867 break;
2868 case 2:
2869 data |= (RASTER_CONFIG_RB_MAP_3 << (i * sh_per_se + j) * 2);
2870 break;
2871 case 3:
2872 default:
2873 data |= (RASTER_CONFIG_RB_MAP_2 << (i * sh_per_se + j) * 2);
2874 break;
2875 }
2876 enabled_rbs >>= 2;
2877 }
2878 WREG32(PA_SC_RASTER_CONFIG, data);
2879 }
2880 si_select_se_sh(rdev, 0xffffffff, 0xffffffff);
2881 }
2882
2883 static void si_gpu_init(struct radeon_device *rdev)
2884 {
2885 u32 gb_addr_config = 0;
2886 u32 mc_shared_chmap, mc_arb_ramcfg;
2887 u32 sx_debug_1;
2888 u32 hdp_host_path_cntl;
2889 u32 tmp;
2890 int i, j;
2891
2892 switch (rdev->family) {
2893 case CHIP_TAHITI:
2894 rdev->config.si.max_shader_engines = 2;
2895 rdev->config.si.max_tile_pipes = 12;
2896 rdev->config.si.max_cu_per_sh = 8;
2897 rdev->config.si.max_sh_per_se = 2;
2898 rdev->config.si.max_backends_per_se = 4;
2899 rdev->config.si.max_texture_channel_caches = 12;
2900 rdev->config.si.max_gprs = 256;
2901 rdev->config.si.max_gs_threads = 32;
2902 rdev->config.si.max_hw_contexts = 8;
2903
2904 rdev->config.si.sc_prim_fifo_size_frontend = 0x20;
2905 rdev->config.si.sc_prim_fifo_size_backend = 0x100;
2906 rdev->config.si.sc_hiz_tile_fifo_size = 0x30;
2907 rdev->config.si.sc_earlyz_tile_fifo_size = 0x130;
2908 gb_addr_config = TAHITI_GB_ADDR_CONFIG_GOLDEN;
2909 break;
2910 case CHIP_PITCAIRN:
2911 rdev->config.si.max_shader_engines = 2;
2912 rdev->config.si.max_tile_pipes = 8;
2913 rdev->config.si.max_cu_per_sh = 5;
2914 rdev->config.si.max_sh_per_se = 2;
2915 rdev->config.si.max_backends_per_se = 4;
2916 rdev->config.si.max_texture_channel_caches = 8;
2917 rdev->config.si.max_gprs = 256;
2918 rdev->config.si.max_gs_threads = 32;
2919 rdev->config.si.max_hw_contexts = 8;
2920
2921 rdev->config.si.sc_prim_fifo_size_frontend = 0x20;
2922 rdev->config.si.sc_prim_fifo_size_backend = 0x100;
2923 rdev->config.si.sc_hiz_tile_fifo_size = 0x30;
2924 rdev->config.si.sc_earlyz_tile_fifo_size = 0x130;
2925 gb_addr_config = TAHITI_GB_ADDR_CONFIG_GOLDEN;
2926 break;
2927 case CHIP_VERDE:
2928 default:
2929 rdev->config.si.max_shader_engines = 1;
2930 rdev->config.si.max_tile_pipes = 4;
2931 rdev->config.si.max_cu_per_sh = 5;
2932 rdev->config.si.max_sh_per_se = 2;
2933 rdev->config.si.max_backends_per_se = 4;
2934 rdev->config.si.max_texture_channel_caches = 4;
2935 rdev->config.si.max_gprs = 256;
2936 rdev->config.si.max_gs_threads = 32;
2937 rdev->config.si.max_hw_contexts = 8;
2938
2939 rdev->config.si.sc_prim_fifo_size_frontend = 0x20;
2940 rdev->config.si.sc_prim_fifo_size_backend = 0x40;
2941 rdev->config.si.sc_hiz_tile_fifo_size = 0x30;
2942 rdev->config.si.sc_earlyz_tile_fifo_size = 0x130;
2943 gb_addr_config = VERDE_GB_ADDR_CONFIG_GOLDEN;
2944 break;
2945 case CHIP_OLAND:
2946 rdev->config.si.max_shader_engines = 1;
2947 rdev->config.si.max_tile_pipes = 4;
2948 rdev->config.si.max_cu_per_sh = 6;
2949 rdev->config.si.max_sh_per_se = 1;
2950 rdev->config.si.max_backends_per_se = 2;
2951 rdev->config.si.max_texture_channel_caches = 4;
2952 rdev->config.si.max_gprs = 256;
2953 rdev->config.si.max_gs_threads = 16;
2954 rdev->config.si.max_hw_contexts = 8;
2955
2956 rdev->config.si.sc_prim_fifo_size_frontend = 0x20;
2957 rdev->config.si.sc_prim_fifo_size_backend = 0x40;
2958 rdev->config.si.sc_hiz_tile_fifo_size = 0x30;
2959 rdev->config.si.sc_earlyz_tile_fifo_size = 0x130;
2960 gb_addr_config = VERDE_GB_ADDR_CONFIG_GOLDEN;
2961 break;
2962 case CHIP_HAINAN:
2963 rdev->config.si.max_shader_engines = 1;
2964 rdev->config.si.max_tile_pipes = 4;
2965 rdev->config.si.max_cu_per_sh = 5;
2966 rdev->config.si.max_sh_per_se = 1;
2967 rdev->config.si.max_backends_per_se = 1;
2968 rdev->config.si.max_texture_channel_caches = 2;
2969 rdev->config.si.max_gprs = 256;
2970 rdev->config.si.max_gs_threads = 16;
2971 rdev->config.si.max_hw_contexts = 8;
2972
2973 rdev->config.si.sc_prim_fifo_size_frontend = 0x20;
2974 rdev->config.si.sc_prim_fifo_size_backend = 0x40;
2975 rdev->config.si.sc_hiz_tile_fifo_size = 0x30;
2976 rdev->config.si.sc_earlyz_tile_fifo_size = 0x130;
2977 gb_addr_config = HAINAN_GB_ADDR_CONFIG_GOLDEN;
2978 break;
2979 }
2980
2981 /* Initialize HDP */
2982 for (i = 0, j = 0; i < 32; i++, j += 0x18) {
2983 WREG32((0x2c14 + j), 0x00000000);
2984 WREG32((0x2c18 + j), 0x00000000);
2985 WREG32((0x2c1c + j), 0x00000000);
2986 WREG32((0x2c20 + j), 0x00000000);
2987 WREG32((0x2c24 + j), 0x00000000);
2988 }
2989
2990 WREG32(GRBM_CNTL, GRBM_READ_TIMEOUT(0xff));
2991
2992 evergreen_fix_pci_max_read_req_size(rdev);
2993
2994 WREG32(BIF_FB_EN, FB_READ_EN | FB_WRITE_EN);
2995
2996 mc_shared_chmap = RREG32(MC_SHARED_CHMAP);
2997 mc_arb_ramcfg = RREG32(MC_ARB_RAMCFG);
2998
2999 rdev->config.si.num_tile_pipes = rdev->config.si.max_tile_pipes;
3000 rdev->config.si.mem_max_burst_length_bytes = 256;
3001 tmp = (mc_arb_ramcfg & NOOFCOLS_MASK) >> NOOFCOLS_SHIFT;
3002 rdev->config.si.mem_row_size_in_kb = (4 * (1 << (8 + tmp))) / 1024;
3003 if (rdev->config.si.mem_row_size_in_kb > 4)
3004 rdev->config.si.mem_row_size_in_kb = 4;
3005 /* XXX use MC settings? */
3006 rdev->config.si.shader_engine_tile_size = 32;
3007 rdev->config.si.num_gpus = 1;
3008 rdev->config.si.multi_gpu_tile_size = 64;
3009
3010 /* fix up row size */
3011 gb_addr_config &= ~ROW_SIZE_MASK;
3012 switch (rdev->config.si.mem_row_size_in_kb) {
3013 case 1:
3014 default:
3015 gb_addr_config |= ROW_SIZE(0);
3016 break;
3017 case 2:
3018 gb_addr_config |= ROW_SIZE(1);
3019 break;
3020 case 4:
3021 gb_addr_config |= ROW_SIZE(2);
3022 break;
3023 }
3024
3025 /* setup tiling info dword. gb_addr_config is not adequate since it does
3026 * not have bank info, so create a custom tiling dword.
3027 * bits 3:0 num_pipes
3028 * bits 7:4 num_banks
3029 * bits 11:8 group_size
3030 * bits 15:12 row_size
3031 */
3032 rdev->config.si.tile_config = 0;
3033 switch (rdev->config.si.num_tile_pipes) {
3034 case 1:
3035 rdev->config.si.tile_config |= (0 << 0);
3036 break;
3037 case 2:
3038 rdev->config.si.tile_config |= (1 << 0);
3039 break;
3040 case 4:
3041 rdev->config.si.tile_config |= (2 << 0);
3042 break;
3043 case 8:
3044 default:
3045 /* XXX what about 12? */
3046 rdev->config.si.tile_config |= (3 << 0);
3047 break;
3048 }
3049 switch ((mc_arb_ramcfg & NOOFBANK_MASK) >> NOOFBANK_SHIFT) {
3050 case 0: /* four banks */
3051 rdev->config.si.tile_config |= 0 << 4;
3052 break;
3053 case 1: /* eight banks */
3054 rdev->config.si.tile_config |= 1 << 4;
3055 break;
3056 case 2: /* sixteen banks */
3057 default:
3058 rdev->config.si.tile_config |= 2 << 4;
3059 break;
3060 }
3061 rdev->config.si.tile_config |=
3062 ((gb_addr_config & PIPE_INTERLEAVE_SIZE_MASK) >> PIPE_INTERLEAVE_SIZE_SHIFT) << 8;
3063 rdev->config.si.tile_config |=
3064 ((gb_addr_config & ROW_SIZE_MASK) >> ROW_SIZE_SHIFT) << 12;
3065
3066 WREG32(GB_ADDR_CONFIG, gb_addr_config);
3067 WREG32(DMIF_ADDR_CONFIG, gb_addr_config);
3068 WREG32(DMIF_ADDR_CALC, gb_addr_config);
3069 WREG32(HDP_ADDR_CONFIG, gb_addr_config);
3070 WREG32(DMA_TILING_CONFIG + DMA0_REGISTER_OFFSET, gb_addr_config);
3071 WREG32(DMA_TILING_CONFIG + DMA1_REGISTER_OFFSET, gb_addr_config);
3072 if (rdev->has_uvd) {
3073 WREG32(UVD_UDEC_ADDR_CONFIG, gb_addr_config);
3074 WREG32(UVD_UDEC_DB_ADDR_CONFIG, gb_addr_config);
3075 WREG32(UVD_UDEC_DBW_ADDR_CONFIG, gb_addr_config);
3076 }
3077
3078 si_tiling_mode_table_init(rdev);
3079
3080 si_setup_rb(rdev, rdev->config.si.max_shader_engines,
3081 rdev->config.si.max_sh_per_se,
3082 rdev->config.si.max_backends_per_se);
3083
3084 si_setup_spi(rdev, rdev->config.si.max_shader_engines,
3085 rdev->config.si.max_sh_per_se,
3086 rdev->config.si.max_cu_per_sh);
3087
3088
3089 /* set HW defaults for 3D engine */
3090 WREG32(CP_QUEUE_THRESHOLDS, (ROQ_IB1_START(0x16) |
3091 ROQ_IB2_START(0x2b)));
3092 WREG32(CP_MEQ_THRESHOLDS, MEQ1_START(0x30) | MEQ2_START(0x60));
3093
3094 sx_debug_1 = RREG32(SX_DEBUG_1);
3095 WREG32(SX_DEBUG_1, sx_debug_1);
3096
3097 WREG32(SPI_CONFIG_CNTL_1, VTX_DONE_DELAY(4));
3098
3099 WREG32(PA_SC_FIFO_SIZE, (SC_FRONTEND_PRIM_FIFO_SIZE(rdev->config.si.sc_prim_fifo_size_frontend) |
3100 SC_BACKEND_PRIM_FIFO_SIZE(rdev->config.si.sc_prim_fifo_size_backend) |
3101 SC_HIZ_TILE_FIFO_SIZE(rdev->config.si.sc_hiz_tile_fifo_size) |
3102 SC_EARLYZ_TILE_FIFO_SIZE(rdev->config.si.sc_earlyz_tile_fifo_size)));
3103
3104 WREG32(VGT_NUM_INSTANCES, 1);
3105
3106 WREG32(CP_PERFMON_CNTL, 0);
3107
3108 WREG32(SQ_CONFIG, 0);
3109
3110 WREG32(PA_SC_FORCE_EOV_MAX_CNTS, (FORCE_EOV_MAX_CLK_CNT(4095) |
3111 FORCE_EOV_MAX_REZ_CNT(255)));
3112
3113 WREG32(VGT_CACHE_INVALIDATION, CACHE_INVALIDATION(VC_AND_TC) |
3114 AUTO_INVLD_EN(ES_AND_GS_AUTO));
3115
3116 WREG32(VGT_GS_VERTEX_REUSE, 16);
3117 WREG32(PA_SC_LINE_STIPPLE_STATE, 0);
3118
3119 WREG32(CB_PERFCOUNTER0_SELECT0, 0);
3120 WREG32(CB_PERFCOUNTER0_SELECT1, 0);
3121 WREG32(CB_PERFCOUNTER1_SELECT0, 0);
3122 WREG32(CB_PERFCOUNTER1_SELECT1, 0);
3123 WREG32(CB_PERFCOUNTER2_SELECT0, 0);
3124 WREG32(CB_PERFCOUNTER2_SELECT1, 0);
3125 WREG32(CB_PERFCOUNTER3_SELECT0, 0);
3126 WREG32(CB_PERFCOUNTER3_SELECT1, 0);
3127
3128 tmp = RREG32(HDP_MISC_CNTL);
3129 tmp |= HDP_FLUSH_INVALIDATE_CACHE;
3130 WREG32(HDP_MISC_CNTL, tmp);
3131
3132 hdp_host_path_cntl = RREG32(HDP_HOST_PATH_CNTL);
3133 WREG32(HDP_HOST_PATH_CNTL, hdp_host_path_cntl);
3134
3135 WREG32(PA_CL_ENHANCE, CLIP_VTX_REORDER_ENA | NUM_CLIP_SEQ(3));
3136
3137 udelay(50);
3138 }
3139
3140 /*
3141 * GPU scratch registers helpers function.
3142 */
3143 static void si_scratch_init(struct radeon_device *rdev)
3144 {
3145 int i;
3146
3147 rdev->scratch.num_reg = 7;
3148 rdev->scratch.reg_base = SCRATCH_REG0;
3149 for (i = 0; i < rdev->scratch.num_reg; i++) {
3150 rdev->scratch.free[i] = true;
3151 rdev->scratch.reg[i] = rdev->scratch.reg_base + (i * 4);
3152 }
3153 }
3154
3155 void si_fence_ring_emit(struct radeon_device *rdev,
3156 struct radeon_fence *fence)
3157 {
3158 struct radeon_ring *ring = &rdev->ring[fence->ring];
3159 u64 addr = rdev->fence_drv[fence->ring].gpu_addr;
3160
3161 /* flush read cache over gart */
3162 radeon_ring_write(ring, PACKET3(PACKET3_SET_CONFIG_REG, 1));
3163 radeon_ring_write(ring, (CP_COHER_CNTL2 - PACKET3_SET_CONFIG_REG_START) >> 2);
3164 radeon_ring_write(ring, 0);
3165 radeon_ring_write(ring, PACKET3(PACKET3_SURFACE_SYNC, 3));
3166 radeon_ring_write(ring, PACKET3_TCL1_ACTION_ENA |
3167 PACKET3_TC_ACTION_ENA |
3168 PACKET3_SH_KCACHE_ACTION_ENA |
3169 PACKET3_SH_ICACHE_ACTION_ENA);
3170 radeon_ring_write(ring, 0xFFFFFFFF);
3171 radeon_ring_write(ring, 0);
3172 radeon_ring_write(ring, 10); /* poll interval */
3173 /* EVENT_WRITE_EOP - flush caches, send int */
3174 radeon_ring_write(ring, PACKET3(PACKET3_EVENT_WRITE_EOP, 4));
3175 radeon_ring_write(ring, EVENT_TYPE(CACHE_FLUSH_AND_INV_TS_EVENT) | EVENT_INDEX(5));
3176 radeon_ring_write(ring, addr & 0xffffffff);
3177 radeon_ring_write(ring, (upper_32_bits(addr) & 0xff) | DATA_SEL(1) | INT_SEL(2));
3178 radeon_ring_write(ring, fence->seq);
3179 radeon_ring_write(ring, 0);
3180 }
3181
3182 /*
3183 * IB stuff
3184 */
3185 void si_ring_ib_execute(struct radeon_device *rdev, struct radeon_ib *ib)
3186 {
3187 struct radeon_ring *ring = &rdev->ring[ib->ring];
3188 u32 header;
3189
3190 if (ib->is_const_ib) {
3191 /* set switch buffer packet before const IB */
3192 radeon_ring_write(ring, PACKET3(PACKET3_SWITCH_BUFFER, 0));
3193 radeon_ring_write(ring, 0);
3194
3195 header = PACKET3(PACKET3_INDIRECT_BUFFER_CONST, 2);
3196 } else {
3197 u32 next_rptr;
3198 if (ring->rptr_save_reg) {
3199 next_rptr = ring->wptr + 3 + 4 + 8;
3200 radeon_ring_write(ring, PACKET3(PACKET3_SET_CONFIG_REG, 1));
3201 radeon_ring_write(ring, ((ring->rptr_save_reg -
3202 PACKET3_SET_CONFIG_REG_START) >> 2));
3203 radeon_ring_write(ring, next_rptr);
3204 } else if (rdev->wb.enabled) {
3205 next_rptr = ring->wptr + 5 + 4 + 8;
3206 radeon_ring_write(ring, PACKET3(PACKET3_WRITE_DATA, 3));
3207 radeon_ring_write(ring, (1 << 8));
3208 radeon_ring_write(ring, ring->next_rptr_gpu_addr & 0xfffffffc);
3209 radeon_ring_write(ring, upper_32_bits(ring->next_rptr_gpu_addr) & 0xffffffff);
3210 radeon_ring_write(ring, next_rptr);
3211 }
3212
3213 header = PACKET3(PACKET3_INDIRECT_BUFFER, 2);
3214 }
3215
3216 radeon_ring_write(ring, header);
3217 radeon_ring_write(ring,
3218 #ifdef __BIG_ENDIAN
3219 (2 << 0) |
3220 #endif
3221 (ib->gpu_addr & 0xFFFFFFFC));
3222 radeon_ring_write(ring, upper_32_bits(ib->gpu_addr) & 0xFFFF);
3223 radeon_ring_write(ring, ib->length_dw |
3224 (ib->vm ? (ib->vm->id << 24) : 0));
3225
3226 if (!ib->is_const_ib) {
3227 /* flush read cache over gart for this vmid */
3228 radeon_ring_write(ring, PACKET3(PACKET3_SET_CONFIG_REG, 1));
3229 radeon_ring_write(ring, (CP_COHER_CNTL2 - PACKET3_SET_CONFIG_REG_START) >> 2);
3230 radeon_ring_write(ring, ib->vm ? ib->vm->id : 0);
3231 radeon_ring_write(ring, PACKET3(PACKET3_SURFACE_SYNC, 3));
3232 radeon_ring_write(ring, PACKET3_TCL1_ACTION_ENA |
3233 PACKET3_TC_ACTION_ENA |
3234 PACKET3_SH_KCACHE_ACTION_ENA |
3235 PACKET3_SH_ICACHE_ACTION_ENA);
3236 radeon_ring_write(ring, 0xFFFFFFFF);
3237 radeon_ring_write(ring, 0);
3238 radeon_ring_write(ring, 10); /* poll interval */
3239 }
3240 }
3241
3242 /*
3243 * CP.
3244 */
3245 static void si_cp_enable(struct radeon_device *rdev, bool enable)
3246 {
3247 if (enable)
3248 WREG32(CP_ME_CNTL, 0);
3249 else {
3250 radeon_ttm_set_active_vram_size(rdev, rdev->mc.visible_vram_size);
3251 WREG32(CP_ME_CNTL, (CP_ME_HALT | CP_PFP_HALT | CP_CE_HALT));
3252 WREG32(SCRATCH_UMSK, 0);
3253 rdev->ring[RADEON_RING_TYPE_GFX_INDEX].ready = false;
3254 rdev->ring[CAYMAN_RING_TYPE_CP1_INDEX].ready = false;
3255 rdev->ring[CAYMAN_RING_TYPE_CP2_INDEX].ready = false;
3256 }
3257 udelay(50);
3258 }
3259
3260 static int si_cp_load_microcode(struct radeon_device *rdev)
3261 {
3262 const __be32 *fw_data;
3263 int i;
3264
3265 if (!rdev->me_fw || !rdev->pfp_fw)
3266 return -EINVAL;
3267
3268 si_cp_enable(rdev, false);
3269
3270 /* PFP */
3271 fw_data = (const __be32 *)rdev->pfp_fw->data;
3272 WREG32(CP_PFP_UCODE_ADDR, 0);
3273 for (i = 0; i < SI_PFP_UCODE_SIZE; i++)
3274 WREG32(CP_PFP_UCODE_DATA, be32_to_cpup(fw_data++));
3275 WREG32(CP_PFP_UCODE_ADDR, 0);
3276
3277 /* CE */
3278 fw_data = (const __be32 *)rdev->ce_fw->data;
3279 WREG32(CP_CE_UCODE_ADDR, 0);
3280 for (i = 0; i < SI_CE_UCODE_SIZE; i++)
3281 WREG32(CP_CE_UCODE_DATA, be32_to_cpup(fw_data++));
3282 WREG32(CP_CE_UCODE_ADDR, 0);
3283
3284 /* ME */
3285 fw_data = (const __be32 *)rdev->me_fw->data;
3286 WREG32(CP_ME_RAM_WADDR, 0);
3287 for (i = 0; i < SI_PM4_UCODE_SIZE; i++)
3288 WREG32(CP_ME_RAM_DATA, be32_to_cpup(fw_data++));
3289 WREG32(CP_ME_RAM_WADDR, 0);
3290
3291 WREG32(CP_PFP_UCODE_ADDR, 0);
3292 WREG32(CP_CE_UCODE_ADDR, 0);
3293 WREG32(CP_ME_RAM_WADDR, 0);
3294 WREG32(CP_ME_RAM_RADDR, 0);
3295 return 0;
3296 }
3297
3298 static int si_cp_start(struct radeon_device *rdev)
3299 {
3300 struct radeon_ring *ring = &rdev->ring[RADEON_RING_TYPE_GFX_INDEX];
3301 int r, i;
3302
3303 r = radeon_ring_lock(rdev, ring, 7 + 4);
3304 if (r) {
3305 DRM_ERROR("radeon: cp failed to lock ring (%d).\n", r);
3306 return r;
3307 }
3308 /* init the CP */
3309 radeon_ring_write(ring, PACKET3(PACKET3_ME_INITIALIZE, 5));
3310 radeon_ring_write(ring, 0x1);
3311 radeon_ring_write(ring, 0x0);
3312 radeon_ring_write(ring, rdev->config.si.max_hw_contexts - 1);
3313 radeon_ring_write(ring, PACKET3_ME_INITIALIZE_DEVICE_ID(1));
3314 radeon_ring_write(ring, 0);
3315 radeon_ring_write(ring, 0);
3316
3317 /* init the CE partitions */
3318 radeon_ring_write(ring, PACKET3(PACKET3_SET_BASE, 2));
3319 radeon_ring_write(ring, PACKET3_BASE_INDEX(CE_PARTITION_BASE));
3320 radeon_ring_write(ring, 0xc000);
3321 radeon_ring_write(ring, 0xe000);
3322 radeon_ring_unlock_commit(rdev, ring);
3323
3324 si_cp_enable(rdev, true);
3325
3326 r = radeon_ring_lock(rdev, ring, si_default_size + 10);
3327 if (r) {
3328 DRM_ERROR("radeon: cp failed to lock ring (%d).\n", r);
3329 return r;
3330 }
3331
3332 /* setup clear context state */
3333 radeon_ring_write(ring, PACKET3(PACKET3_PREAMBLE_CNTL, 0));
3334 radeon_ring_write(ring, PACKET3_PREAMBLE_BEGIN_CLEAR_STATE);
3335
3336 for (i = 0; i < si_default_size; i++)
3337 radeon_ring_write(ring, si_default_state[i]);
3338
3339 radeon_ring_write(ring, PACKET3(PACKET3_PREAMBLE_CNTL, 0));
3340 radeon_ring_write(ring, PACKET3_PREAMBLE_END_CLEAR_STATE);
3341
3342 /* set clear context state */
3343 radeon_ring_write(ring, PACKET3(PACKET3_CLEAR_STATE, 0));
3344 radeon_ring_write(ring, 0);
3345
3346 radeon_ring_write(ring, PACKET3(PACKET3_SET_CONTEXT_REG, 2));
3347 radeon_ring_write(ring, 0x00000316);
3348 radeon_ring_write(ring, 0x0000000e); /* VGT_VERTEX_REUSE_BLOCK_CNTL */
3349 radeon_ring_write(ring, 0x00000010); /* VGT_OUT_DEALLOC_CNTL */
3350
3351 radeon_ring_unlock_commit(rdev, ring);
3352
3353 for (i = RADEON_RING_TYPE_GFX_INDEX; i <= CAYMAN_RING_TYPE_CP2_INDEX; ++i) {
3354 ring = &rdev->ring[i];
3355 r = radeon_ring_lock(rdev, ring, 2);
3356
3357 /* clear the compute context state */
3358 radeon_ring_write(ring, PACKET3_COMPUTE(PACKET3_CLEAR_STATE, 0));
3359 radeon_ring_write(ring, 0);
3360
3361 radeon_ring_unlock_commit(rdev, ring);
3362 }
3363
3364 return 0;
3365 }
3366
3367 static void si_cp_fini(struct radeon_device *rdev)
3368 {
3369 struct radeon_ring *ring;
3370 si_cp_enable(rdev, false);
3371
3372 ring = &rdev->ring[RADEON_RING_TYPE_GFX_INDEX];
3373 radeon_ring_fini(rdev, ring);
3374 radeon_scratch_free(rdev, ring->rptr_save_reg);
3375
3376 ring = &rdev->ring[CAYMAN_RING_TYPE_CP1_INDEX];
3377 radeon_ring_fini(rdev, ring);
3378 radeon_scratch_free(rdev, ring->rptr_save_reg);
3379
3380 ring = &rdev->ring[CAYMAN_RING_TYPE_CP2_INDEX];
3381 radeon_ring_fini(rdev, ring);
3382 radeon_scratch_free(rdev, ring->rptr_save_reg);
3383 }
3384
3385 static int si_cp_resume(struct radeon_device *rdev)
3386 {
3387 struct radeon_ring *ring;
3388 u32 tmp;
3389 u32 rb_bufsz;
3390 int r;
3391
3392 si_enable_gui_idle_interrupt(rdev, false);
3393
3394 WREG32(CP_SEM_WAIT_TIMER, 0x0);
3395 WREG32(CP_SEM_INCOMPLETE_TIMER_CNTL, 0x0);
3396
3397 /* Set the write pointer delay */
3398 WREG32(CP_RB_WPTR_DELAY, 0);
3399
3400 WREG32(CP_DEBUG, 0);
3401 WREG32(SCRATCH_ADDR, ((rdev->wb.gpu_addr + RADEON_WB_SCRATCH_OFFSET) >> 8) & 0xFFFFFFFF);
3402
3403 /* ring 0 - compute and gfx */
3404 /* Set ring buffer size */
3405 ring = &rdev->ring[RADEON_RING_TYPE_GFX_INDEX];
3406 rb_bufsz = order_base_2(ring->ring_size / 8);
3407 tmp = (order_base_2(RADEON_GPU_PAGE_SIZE/8) << 8) | rb_bufsz;
3408 #ifdef __BIG_ENDIAN
3409 tmp |= BUF_SWAP_32BIT;
3410 #endif
3411 WREG32(CP_RB0_CNTL, tmp);
3412
3413 /* Initialize the ring buffer's read and write pointers */
3414 WREG32(CP_RB0_CNTL, tmp | RB_RPTR_WR_ENA);
3415 ring->wptr = 0;
3416 WREG32(CP_RB0_WPTR, ring->wptr);
3417
3418 /* set the wb address whether it's enabled or not */
3419 WREG32(CP_RB0_RPTR_ADDR, (rdev->wb.gpu_addr + RADEON_WB_CP_RPTR_OFFSET) & 0xFFFFFFFC);
3420 WREG32(CP_RB0_RPTR_ADDR_HI, upper_32_bits(rdev->wb.gpu_addr + RADEON_WB_CP_RPTR_OFFSET) & 0xFF);
3421
3422 if (rdev->wb.enabled)
3423 WREG32(SCRATCH_UMSK, 0xff);
3424 else {
3425 tmp |= RB_NO_UPDATE;
3426 WREG32(SCRATCH_UMSK, 0);
3427 }
3428
3429 mdelay(1);
3430 WREG32(CP_RB0_CNTL, tmp);
3431
3432 WREG32(CP_RB0_BASE, ring->gpu_addr >> 8);
3433
3434 ring->rptr = RREG32(CP_RB0_RPTR);
3435
3436 /* ring1 - compute only */
3437 /* Set ring buffer size */
3438 ring = &rdev->ring[CAYMAN_RING_TYPE_CP1_INDEX];
3439 rb_bufsz = order_base_2(ring->ring_size / 8);
3440 tmp = (order_base_2(RADEON_GPU_PAGE_SIZE/8) << 8) | rb_bufsz;
3441 #ifdef __BIG_ENDIAN
3442 tmp |= BUF_SWAP_32BIT;
3443 #endif
3444 WREG32(CP_RB1_CNTL, tmp);
3445
3446 /* Initialize the ring buffer's read and write pointers */
3447 WREG32(CP_RB1_CNTL, tmp | RB_RPTR_WR_ENA);
3448 ring->wptr = 0;
3449 WREG32(CP_RB1_WPTR, ring->wptr);
3450
3451 /* set the wb address whether it's enabled or not */
3452 WREG32(CP_RB1_RPTR_ADDR, (rdev->wb.gpu_addr + RADEON_WB_CP1_RPTR_OFFSET) & 0xFFFFFFFC);
3453 WREG32(CP_RB1_RPTR_ADDR_HI, upper_32_bits(rdev->wb.gpu_addr + RADEON_WB_CP1_RPTR_OFFSET) & 0xFF);
3454
3455 mdelay(1);
3456 WREG32(CP_RB1_CNTL, tmp);
3457
3458 WREG32(CP_RB1_BASE, ring->gpu_addr >> 8);
3459
3460 ring->rptr = RREG32(CP_RB1_RPTR);
3461
3462 /* ring2 - compute only */
3463 /* Set ring buffer size */
3464 ring = &rdev->ring[CAYMAN_RING_TYPE_CP2_INDEX];
3465 rb_bufsz = order_base_2(ring->ring_size / 8);
3466 tmp = (order_base_2(RADEON_GPU_PAGE_SIZE/8) << 8) | rb_bufsz;
3467 #ifdef __BIG_ENDIAN
3468 tmp |= BUF_SWAP_32BIT;
3469 #endif
3470 WREG32(CP_RB2_CNTL, tmp);
3471
3472 /* Initialize the ring buffer's read and write pointers */
3473 WREG32(CP_RB2_CNTL, tmp | RB_RPTR_WR_ENA);
3474 ring->wptr = 0;
3475 WREG32(CP_RB2_WPTR, ring->wptr);
3476
3477 /* set the wb address whether it's enabled or not */
3478 WREG32(CP_RB2_RPTR_ADDR, (rdev->wb.gpu_addr + RADEON_WB_CP2_RPTR_OFFSET) & 0xFFFFFFFC);
3479 WREG32(CP_RB2_RPTR_ADDR_HI, upper_32_bits(rdev->wb.gpu_addr + RADEON_WB_CP2_RPTR_OFFSET) & 0xFF);
3480
3481 mdelay(1);
3482 WREG32(CP_RB2_CNTL, tmp);
3483
3484 WREG32(CP_RB2_BASE, ring->gpu_addr >> 8);
3485
3486 ring->rptr = RREG32(CP_RB2_RPTR);
3487
3488 /* start the rings */
3489 si_cp_start(rdev);
3490 rdev->ring[RADEON_RING_TYPE_GFX_INDEX].ready = true;
3491 rdev->ring[CAYMAN_RING_TYPE_CP1_INDEX].ready = true;
3492 rdev->ring[CAYMAN_RING_TYPE_CP2_INDEX].ready = true;
3493 r = radeon_ring_test(rdev, RADEON_RING_TYPE_GFX_INDEX, &rdev->ring[RADEON_RING_TYPE_GFX_INDEX]);
3494 if (r) {
3495 rdev->ring[RADEON_RING_TYPE_GFX_INDEX].ready = false;
3496 rdev->ring[CAYMAN_RING_TYPE_CP1_INDEX].ready = false;
3497 rdev->ring[CAYMAN_RING_TYPE_CP2_INDEX].ready = false;
3498 return r;
3499 }
3500 r = radeon_ring_test(rdev, CAYMAN_RING_TYPE_CP1_INDEX, &rdev->ring[CAYMAN_RING_TYPE_CP1_INDEX]);
3501 if (r) {
3502 rdev->ring[CAYMAN_RING_TYPE_CP1_INDEX].ready = false;
3503 }
3504 r = radeon_ring_test(rdev, CAYMAN_RING_TYPE_CP2_INDEX, &rdev->ring[CAYMAN_RING_TYPE_CP2_INDEX]);
3505 if (r) {
3506 rdev->ring[CAYMAN_RING_TYPE_CP2_INDEX].ready = false;
3507 }
3508
3509 si_enable_gui_idle_interrupt(rdev, true);
3510
3511 return 0;
3512 }
3513
3514 u32 si_gpu_check_soft_reset(struct radeon_device *rdev)
3515 {
3516 u32 reset_mask = 0;
3517 u32 tmp;
3518
3519 /* GRBM_STATUS */
3520 tmp = RREG32(GRBM_STATUS);
3521 if (tmp & (PA_BUSY | SC_BUSY |
3522 BCI_BUSY | SX_BUSY |
3523 TA_BUSY | VGT_BUSY |
3524 DB_BUSY | CB_BUSY |
3525 GDS_BUSY | SPI_BUSY |
3526 IA_BUSY | IA_BUSY_NO_DMA))
3527 reset_mask |= RADEON_RESET_GFX;
3528
3529 if (tmp & (CF_RQ_PENDING | PF_RQ_PENDING |
3530 CP_BUSY | CP_COHERENCY_BUSY))
3531 reset_mask |= RADEON_RESET_CP;
3532
3533 if (tmp & GRBM_EE_BUSY)
3534 reset_mask |= RADEON_RESET_GRBM | RADEON_RESET_GFX | RADEON_RESET_CP;
3535
3536 /* GRBM_STATUS2 */
3537 tmp = RREG32(GRBM_STATUS2);
3538 if (tmp & (RLC_RQ_PENDING | RLC_BUSY))
3539 reset_mask |= RADEON_RESET_RLC;
3540
3541 /* DMA_STATUS_REG 0 */
3542 tmp = RREG32(DMA_STATUS_REG + DMA0_REGISTER_OFFSET);
3543 if (!(tmp & DMA_IDLE))
3544 reset_mask |= RADEON_RESET_DMA;
3545
3546 /* DMA_STATUS_REG 1 */
3547 tmp = RREG32(DMA_STATUS_REG + DMA1_REGISTER_OFFSET);
3548 if (!(tmp & DMA_IDLE))
3549 reset_mask |= RADEON_RESET_DMA1;
3550
3551 /* SRBM_STATUS2 */
3552 tmp = RREG32(SRBM_STATUS2);
3553 if (tmp & DMA_BUSY)
3554 reset_mask |= RADEON_RESET_DMA;
3555
3556 if (tmp & DMA1_BUSY)
3557 reset_mask |= RADEON_RESET_DMA1;
3558
3559 /* SRBM_STATUS */
3560 tmp = RREG32(SRBM_STATUS);
3561
3562 if (tmp & IH_BUSY)
3563 reset_mask |= RADEON_RESET_IH;
3564
3565 if (tmp & SEM_BUSY)
3566 reset_mask |= RADEON_RESET_SEM;
3567
3568 if (tmp & GRBM_RQ_PENDING)
3569 reset_mask |= RADEON_RESET_GRBM;
3570
3571 if (tmp & VMC_BUSY)
3572 reset_mask |= RADEON_RESET_VMC;
3573
3574 if (tmp & (MCB_BUSY | MCB_NON_DISPLAY_BUSY |
3575 MCC_BUSY | MCD_BUSY))
3576 reset_mask |= RADEON_RESET_MC;
3577
3578 if (evergreen_is_display_hung(rdev))
3579 reset_mask |= RADEON_RESET_DISPLAY;
3580
3581 /* VM_L2_STATUS */
3582 tmp = RREG32(VM_L2_STATUS);
3583 if (tmp & L2_BUSY)
3584 reset_mask |= RADEON_RESET_VMC;
3585
3586 /* Skip MC reset as it's mostly likely not hung, just busy */
3587 if (reset_mask & RADEON_RESET_MC) {
3588 DRM_DEBUG("MC busy: 0x%08X, clearing.\n", reset_mask);
3589 reset_mask &= ~RADEON_RESET_MC;
3590 }
3591
3592 return reset_mask;
3593 }
3594
3595 static void si_gpu_soft_reset(struct radeon_device *rdev, u32 reset_mask)
3596 {
3597 struct evergreen_mc_save save;
3598 u32 grbm_soft_reset = 0, srbm_soft_reset = 0;
3599 u32 tmp;
3600
3601 if (reset_mask == 0)
3602 return;
3603
3604 dev_info(rdev->dev, "GPU softreset: 0x%08X\n", reset_mask);
3605
3606 evergreen_print_gpu_status_regs(rdev);
3607 dev_info(rdev->dev, " VM_CONTEXT1_PROTECTION_FAULT_ADDR 0x%08X\n",
3608 RREG32(VM_CONTEXT1_PROTECTION_FAULT_ADDR));
3609 dev_info(rdev->dev, " VM_CONTEXT1_PROTECTION_FAULT_STATUS 0x%08X\n",
3610 RREG32(VM_CONTEXT1_PROTECTION_FAULT_STATUS));
3611
3612 /* disable PG/CG */
3613 si_fini_pg(rdev);
3614 si_fini_cg(rdev);
3615
3616 /* stop the rlc */
3617 si_rlc_stop(rdev);
3618
3619 /* Disable CP parsing/prefetching */
3620 WREG32(CP_ME_CNTL, CP_ME_HALT | CP_PFP_HALT | CP_CE_HALT);
3621
3622 if (reset_mask & RADEON_RESET_DMA) {
3623 /* dma0 */
3624 tmp = RREG32(DMA_RB_CNTL + DMA0_REGISTER_OFFSET);
3625 tmp &= ~DMA_RB_ENABLE;
3626 WREG32(DMA_RB_CNTL + DMA0_REGISTER_OFFSET, tmp);
3627 }
3628 if (reset_mask & RADEON_RESET_DMA1) {
3629 /* dma1 */
3630 tmp = RREG32(DMA_RB_CNTL + DMA1_REGISTER_OFFSET);
3631 tmp &= ~DMA_RB_ENABLE;
3632 WREG32(DMA_RB_CNTL + DMA1_REGISTER_OFFSET, tmp);
3633 }
3634
3635 udelay(50);
3636
3637 evergreen_mc_stop(rdev, &save);
3638 if (evergreen_mc_wait_for_idle(rdev)) {
3639 dev_warn(rdev->dev, "Wait for MC idle timedout !\n");
3640 }
3641
3642 if (reset_mask & (RADEON_RESET_GFX | RADEON_RESET_COMPUTE | RADEON_RESET_CP)) {
3643 grbm_soft_reset = SOFT_RESET_CB |
3644 SOFT_RESET_DB |
3645 SOFT_RESET_GDS |
3646 SOFT_RESET_PA |
3647 SOFT_RESET_SC |
3648 SOFT_RESET_BCI |
3649 SOFT_RESET_SPI |
3650 SOFT_RESET_SX |
3651 SOFT_RESET_TC |
3652 SOFT_RESET_TA |
3653 SOFT_RESET_VGT |
3654 SOFT_RESET_IA;
3655 }
3656
3657 if (reset_mask & RADEON_RESET_CP) {
3658 grbm_soft_reset |= SOFT_RESET_CP | SOFT_RESET_VGT;
3659
3660 srbm_soft_reset |= SOFT_RESET_GRBM;
3661 }
3662
3663 if (reset_mask & RADEON_RESET_DMA)
3664 srbm_soft_reset |= SOFT_RESET_DMA;
3665
3666 if (reset_mask & RADEON_RESET_DMA1)
3667 srbm_soft_reset |= SOFT_RESET_DMA1;
3668
3669 if (reset_mask & RADEON_RESET_DISPLAY)
3670 srbm_soft_reset |= SOFT_RESET_DC;
3671
3672 if (reset_mask & RADEON_RESET_RLC)
3673 grbm_soft_reset |= SOFT_RESET_RLC;
3674
3675 if (reset_mask & RADEON_RESET_SEM)
3676 srbm_soft_reset |= SOFT_RESET_SEM;
3677
3678 if (reset_mask & RADEON_RESET_IH)
3679 srbm_soft_reset |= SOFT_RESET_IH;
3680
3681 if (reset_mask & RADEON_RESET_GRBM)
3682 srbm_soft_reset |= SOFT_RESET_GRBM;
3683
3684 if (reset_mask & RADEON_RESET_VMC)
3685 srbm_soft_reset |= SOFT_RESET_VMC;
3686
3687 if (reset_mask & RADEON_RESET_MC)
3688 srbm_soft_reset |= SOFT_RESET_MC;
3689
3690 if (grbm_soft_reset) {
3691 tmp = RREG32(GRBM_SOFT_RESET);
3692 tmp |= grbm_soft_reset;
3693 dev_info(rdev->dev, "GRBM_SOFT_RESET=0x%08X\n", tmp);
3694 WREG32(GRBM_SOFT_RESET, tmp);
3695 tmp = RREG32(GRBM_SOFT_RESET);
3696
3697 udelay(50);
3698
3699 tmp &= ~grbm_soft_reset;
3700 WREG32(GRBM_SOFT_RESET, tmp);
3701 tmp = RREG32(GRBM_SOFT_RESET);
3702 }
3703
3704 if (srbm_soft_reset) {
3705 tmp = RREG32(SRBM_SOFT_RESET);
3706 tmp |= srbm_soft_reset;
3707 dev_info(rdev->dev, "SRBM_SOFT_RESET=0x%08X\n", tmp);
3708 WREG32(SRBM_SOFT_RESET, tmp);
3709 tmp = RREG32(SRBM_SOFT_RESET);
3710
3711 udelay(50);
3712
3713 tmp &= ~srbm_soft_reset;
3714 WREG32(SRBM_SOFT_RESET, tmp);
3715 tmp = RREG32(SRBM_SOFT_RESET);
3716 }
3717
3718 /* Wait a little for things to settle down */
3719 udelay(50);
3720
3721 evergreen_mc_resume(rdev, &save);
3722 udelay(50);
3723
3724 evergreen_print_gpu_status_regs(rdev);
3725 }
3726
3727 int si_asic_reset(struct radeon_device *rdev)
3728 {
3729 u32 reset_mask;
3730
3731 reset_mask = si_gpu_check_soft_reset(rdev);
3732
3733 if (reset_mask)
3734 r600_set_bios_scratch_engine_hung(rdev, true);
3735
3736 si_gpu_soft_reset(rdev, reset_mask);
3737
3738 reset_mask = si_gpu_check_soft_reset(rdev);
3739
3740 if (!reset_mask)
3741 r600_set_bios_scratch_engine_hung(rdev, false);
3742
3743 return 0;
3744 }
3745
3746 /**
3747 * si_gfx_is_lockup - Check if the GFX engine is locked up
3748 *
3749 * @rdev: radeon_device pointer
3750 * @ring: radeon_ring structure holding ring information
3751 *
3752 * Check if the GFX engine is locked up.
3753 * Returns true if the engine appears to be locked up, false if not.
3754 */
3755 bool si_gfx_is_lockup(struct radeon_device *rdev, struct radeon_ring *ring)
3756 {
3757 u32 reset_mask = si_gpu_check_soft_reset(rdev);
3758
3759 if (!(reset_mask & (RADEON_RESET_GFX |
3760 RADEON_RESET_COMPUTE |
3761 RADEON_RESET_CP))) {
3762 radeon_ring_lockup_update(ring);
3763 return false;
3764 }
3765 /* force CP activities */
3766 radeon_ring_force_activity(rdev, ring);
3767 return radeon_ring_test_lockup(rdev, ring);
3768 }
3769
3770 /* MC */
3771 static void si_mc_program(struct radeon_device *rdev)
3772 {
3773 struct evergreen_mc_save save;
3774 u32 tmp;
3775 int i, j;
3776
3777 /* Initialize HDP */
3778 for (i = 0, j = 0; i < 32; i++, j += 0x18) {
3779 WREG32((0x2c14 + j), 0x00000000);
3780 WREG32((0x2c18 + j), 0x00000000);
3781 WREG32((0x2c1c + j), 0x00000000);
3782 WREG32((0x2c20 + j), 0x00000000);
3783 WREG32((0x2c24 + j), 0x00000000);
3784 }
3785 WREG32(HDP_REG_COHERENCY_FLUSH_CNTL, 0);
3786
3787 evergreen_mc_stop(rdev, &save);
3788 if (radeon_mc_wait_for_idle(rdev)) {
3789 dev_warn(rdev->dev, "Wait for MC idle timedout !\n");
3790 }
3791 if (!ASIC_IS_NODCE(rdev))
3792 /* Lockout access through VGA aperture*/
3793 WREG32(VGA_HDP_CONTROL, VGA_MEMORY_DISABLE);
3794 /* Update configuration */
3795 WREG32(MC_VM_SYSTEM_APERTURE_LOW_ADDR,
3796 rdev->mc.vram_start >> 12);
3797 WREG32(MC_VM_SYSTEM_APERTURE_HIGH_ADDR,
3798 rdev->mc.vram_end >> 12);
3799 WREG32(MC_VM_SYSTEM_APERTURE_DEFAULT_ADDR,
3800 rdev->vram_scratch.gpu_addr >> 12);
3801 tmp = ((rdev->mc.vram_end >> 24) & 0xFFFF) << 16;
3802 tmp |= ((rdev->mc.vram_start >> 24) & 0xFFFF);
3803 WREG32(MC_VM_FB_LOCATION, tmp);
3804 /* XXX double check these! */
3805 WREG32(HDP_NONSURFACE_BASE, (rdev->mc.vram_start >> 8));
3806 WREG32(HDP_NONSURFACE_INFO, (2 << 7) | (1 << 30));
3807 WREG32(HDP_NONSURFACE_SIZE, 0x3FFFFFFF);
3808 WREG32(MC_VM_AGP_BASE, 0);
3809 WREG32(MC_VM_AGP_TOP, 0x0FFFFFFF);
3810 WREG32(MC_VM_AGP_BOT, 0x0FFFFFFF);
3811 if (radeon_mc_wait_for_idle(rdev)) {
3812 dev_warn(rdev->dev, "Wait for MC idle timedout !\n");
3813 }
3814 evergreen_mc_resume(rdev, &save);
3815 if (!ASIC_IS_NODCE(rdev)) {
3816 /* we need to own VRAM, so turn off the VGA renderer here
3817 * to stop it overwriting our objects */
3818 rv515_vga_render_disable(rdev);
3819 }
3820 }
3821
3822 void si_vram_gtt_location(struct radeon_device *rdev,
3823 struct radeon_mc *mc)
3824 {
3825 if (mc->mc_vram_size > 0xFFC0000000ULL) {
3826 /* leave room for at least 1024M GTT */
3827 dev_warn(rdev->dev, "limiting VRAM\n");
3828 mc->real_vram_size = 0xFFC0000000ULL;
3829 mc->mc_vram_size = 0xFFC0000000ULL;
3830 }
3831 radeon_vram_location(rdev, &rdev->mc, 0);
3832 rdev->mc.gtt_base_align = 0;
3833 radeon_gtt_location(rdev, mc);
3834 }
3835
3836 static int si_mc_init(struct radeon_device *rdev)
3837 {
3838 u32 tmp;
3839 int chansize, numchan;
3840
3841 /* Get VRAM informations */
3842 rdev->mc.vram_is_ddr = true;
3843 tmp = RREG32(MC_ARB_RAMCFG);
3844 if (tmp & CHANSIZE_OVERRIDE) {
3845 chansize = 16;
3846 } else if (tmp & CHANSIZE_MASK) {
3847 chansize = 64;
3848 } else {
3849 chansize = 32;
3850 }
3851 tmp = RREG32(MC_SHARED_CHMAP);
3852 switch ((tmp & NOOFCHAN_MASK) >> NOOFCHAN_SHIFT) {
3853 case 0:
3854 default:
3855 numchan = 1;
3856 break;
3857 case 1:
3858 numchan = 2;
3859 break;
3860 case 2:
3861 numchan = 4;
3862 break;
3863 case 3:
3864 numchan = 8;
3865 break;
3866 case 4:
3867 numchan = 3;
3868 break;
3869 case 5:
3870 numchan = 6;
3871 break;
3872 case 6:
3873 numchan = 10;
3874 break;
3875 case 7:
3876 numchan = 12;
3877 break;
3878 case 8:
3879 numchan = 16;
3880 break;
3881 }
3882 rdev->mc.vram_width = numchan * chansize;
3883 /* Could aper size report 0 ? */
3884 rdev->mc.aper_base = pci_resource_start(rdev->pdev, 0);
3885 rdev->mc.aper_size = pci_resource_len(rdev->pdev, 0);
3886 /* size in MB on si */
3887 tmp = RREG32(CONFIG_MEMSIZE);
3888 /* some boards may have garbage in the upper 16 bits */
3889 if (tmp & 0xffff0000) {
3890 DRM_INFO("Probable bad vram size: 0x%08x\n", tmp);
3891 if (tmp & 0xffff)
3892 tmp &= 0xffff;
3893 }
3894 rdev->mc.mc_vram_size = tmp * 1024ULL * 1024ULL;
3895 rdev->mc.real_vram_size = rdev->mc.mc_vram_size;
3896 rdev->mc.visible_vram_size = rdev->mc.aper_size;
3897 si_vram_gtt_location(rdev, &rdev->mc);
3898 radeon_update_bandwidth_info(rdev);
3899
3900 return 0;
3901 }
3902
3903 /*
3904 * GART
3905 */
3906 void si_pcie_gart_tlb_flush(struct radeon_device *rdev)
3907 {
3908 /* flush hdp cache */
3909 WREG32(HDP_MEM_COHERENCY_FLUSH_CNTL, 0x1);
3910
3911 /* bits 0-15 are the VM contexts0-15 */
3912 WREG32(VM_INVALIDATE_REQUEST, 1);
3913 }
3914
3915 static int si_pcie_gart_enable(struct radeon_device *rdev)
3916 {
3917 int r, i;
3918
3919 if (rdev->gart.robj == NULL) {
3920 dev_err(rdev->dev, "No VRAM object for PCIE GART.\n");
3921 return -EINVAL;
3922 }
3923 r = radeon_gart_table_vram_pin(rdev);
3924 if (r)
3925 return r;
3926 radeon_gart_restore(rdev);
3927 /* Setup TLB control */
3928 WREG32(MC_VM_MX_L1_TLB_CNTL,
3929 (0xA << 7) |
3930 ENABLE_L1_TLB |
3931 SYSTEM_ACCESS_MODE_NOT_IN_SYS |
3932 ENABLE_ADVANCED_DRIVER_MODEL |
3933 SYSTEM_APERTURE_UNMAPPED_ACCESS_PASS_THRU);
3934 /* Setup L2 cache */
3935 WREG32(VM_L2_CNTL, ENABLE_L2_CACHE |
3936 ENABLE_L2_PTE_CACHE_LRU_UPDATE_BY_WRITE |
3937 ENABLE_L2_PDE0_CACHE_LRU_UPDATE_BY_WRITE |
3938 EFFECTIVE_L2_QUEUE_SIZE(7) |
3939 CONTEXT1_IDENTITY_ACCESS_MODE(1));
3940 WREG32(VM_L2_CNTL2, INVALIDATE_ALL_L1_TLBS | INVALIDATE_L2_CACHE);
3941 WREG32(VM_L2_CNTL3, L2_CACHE_BIGK_ASSOCIATIVITY |
3942 L2_CACHE_BIGK_FRAGMENT_SIZE(0));
3943 /* setup context0 */
3944 WREG32(VM_CONTEXT0_PAGE_TABLE_START_ADDR, rdev->mc.gtt_start >> 12);
3945 WREG32(VM_CONTEXT0_PAGE_TABLE_END_ADDR, rdev->mc.gtt_end >> 12);
3946 WREG32(VM_CONTEXT0_PAGE_TABLE_BASE_ADDR, rdev->gart.table_addr >> 12);
3947 WREG32(VM_CONTEXT0_PROTECTION_FAULT_DEFAULT_ADDR,
3948 (u32)(rdev->dummy_page.addr >> 12));
3949 WREG32(VM_CONTEXT0_CNTL2, 0);
3950 WREG32(VM_CONTEXT0_CNTL, (ENABLE_CONTEXT | PAGE_TABLE_DEPTH(0) |
3951 RANGE_PROTECTION_FAULT_ENABLE_DEFAULT));
3952
3953 WREG32(0x15D4, 0);
3954 WREG32(0x15D8, 0);
3955 WREG32(0x15DC, 0);
3956
3957 /* empty context1-15 */
3958 /* set vm size, must be a multiple of 4 */
3959 WREG32(VM_CONTEXT1_PAGE_TABLE_START_ADDR, 0);
3960 WREG32(VM_CONTEXT1_PAGE_TABLE_END_ADDR, rdev->vm_manager.max_pfn);
3961 /* Assign the pt base to something valid for now; the pts used for
3962 * the VMs are determined by the application and setup and assigned
3963 * on the fly in the vm part of radeon_gart.c
3964 */
3965 for (i = 1; i < 16; i++) {
3966 if (i < 8)
3967 WREG32(VM_CONTEXT0_PAGE_TABLE_BASE_ADDR + (i << 2),
3968 rdev->gart.table_addr >> 12);
3969 else
3970 WREG32(VM_CONTEXT8_PAGE_TABLE_BASE_ADDR + ((i - 8) << 2),
3971 rdev->gart.table_addr >> 12);
3972 }
3973
3974 /* enable context1-15 */
3975 WREG32(VM_CONTEXT1_PROTECTION_FAULT_DEFAULT_ADDR,
3976 (u32)(rdev->dummy_page.addr >> 12));
3977 WREG32(VM_CONTEXT1_CNTL2, 4);
3978 WREG32(VM_CONTEXT1_CNTL, ENABLE_CONTEXT | PAGE_TABLE_DEPTH(1) |
3979 RANGE_PROTECTION_FAULT_ENABLE_INTERRUPT |
3980 RANGE_PROTECTION_FAULT_ENABLE_DEFAULT |
3981 DUMMY_PAGE_PROTECTION_FAULT_ENABLE_INTERRUPT |
3982 DUMMY_PAGE_PROTECTION_FAULT_ENABLE_DEFAULT |
3983 PDE0_PROTECTION_FAULT_ENABLE_INTERRUPT |
3984 PDE0_PROTECTION_FAULT_ENABLE_DEFAULT |
3985 VALID_PROTECTION_FAULT_ENABLE_INTERRUPT |
3986 VALID_PROTECTION_FAULT_ENABLE_DEFAULT |
3987 READ_PROTECTION_FAULT_ENABLE_INTERRUPT |
3988 READ_PROTECTION_FAULT_ENABLE_DEFAULT |
3989 WRITE_PROTECTION_FAULT_ENABLE_INTERRUPT |
3990 WRITE_PROTECTION_FAULT_ENABLE_DEFAULT);
3991
3992 si_pcie_gart_tlb_flush(rdev);
3993 DRM_INFO("PCIE GART of %uM enabled (table at 0x%016llX).\n",
3994 (unsigned)(rdev->mc.gtt_size >> 20),
3995 (unsigned long long)rdev->gart.table_addr);
3996 rdev->gart.ready = true;
3997 return 0;
3998 }
3999
4000 static void si_pcie_gart_disable(struct radeon_device *rdev)
4001 {
4002 /* Disable all tables */
4003 WREG32(VM_CONTEXT0_CNTL, 0);
4004 WREG32(VM_CONTEXT1_CNTL, 0);
4005 /* Setup TLB control */
4006 WREG32(MC_VM_MX_L1_TLB_CNTL, SYSTEM_ACCESS_MODE_NOT_IN_SYS |
4007 SYSTEM_APERTURE_UNMAPPED_ACCESS_PASS_THRU);
4008 /* Setup L2 cache */
4009 WREG32(VM_L2_CNTL, ENABLE_L2_PTE_CACHE_LRU_UPDATE_BY_WRITE |
4010 ENABLE_L2_PDE0_CACHE_LRU_UPDATE_BY_WRITE |
4011 EFFECTIVE_L2_QUEUE_SIZE(7) |
4012 CONTEXT1_IDENTITY_ACCESS_MODE(1));
4013 WREG32(VM_L2_CNTL2, 0);
4014 WREG32(VM_L2_CNTL3, L2_CACHE_BIGK_ASSOCIATIVITY |
4015 L2_CACHE_BIGK_FRAGMENT_SIZE(0));
4016 radeon_gart_table_vram_unpin(rdev);
4017 }
4018
4019 static void si_pcie_gart_fini(struct radeon_device *rdev)
4020 {
4021 si_pcie_gart_disable(rdev);
4022 radeon_gart_table_vram_free(rdev);
4023 radeon_gart_fini(rdev);
4024 }
4025
4026 /* vm parser */
4027 static bool si_vm_reg_valid(u32 reg)
4028 {
4029 /* context regs are fine */
4030 if (reg >= 0x28000)
4031 return true;
4032
4033 /* check config regs */
4034 switch (reg) {
4035 case GRBM_GFX_INDEX:
4036 case CP_STRMOUT_CNTL:
4037 case VGT_VTX_VECT_EJECT_REG:
4038 case VGT_CACHE_INVALIDATION:
4039 case VGT_ESGS_RING_SIZE:
4040 case VGT_GSVS_RING_SIZE:
4041 case VGT_GS_VERTEX_REUSE:
4042 case VGT_PRIMITIVE_TYPE:
4043 case VGT_INDEX_TYPE:
4044 case VGT_NUM_INDICES:
4045 case VGT_NUM_INSTANCES:
4046 case VGT_TF_RING_SIZE:
4047 case VGT_HS_OFFCHIP_PARAM:
4048 case VGT_TF_MEMORY_BASE:
4049 case PA_CL_ENHANCE:
4050 case PA_SU_LINE_STIPPLE_VALUE:
4051 case PA_SC_LINE_STIPPLE_STATE:
4052 case PA_SC_ENHANCE:
4053 case SQC_CACHES:
4054 case SPI_STATIC_THREAD_MGMT_1:
4055 case SPI_STATIC_THREAD_MGMT_2:
4056 case SPI_STATIC_THREAD_MGMT_3:
4057 case SPI_PS_MAX_WAVE_ID:
4058 case SPI_CONFIG_CNTL:
4059 case SPI_CONFIG_CNTL_1:
4060 case TA_CNTL_AUX:
4061 return true;
4062 default:
4063 DRM_ERROR("Invalid register 0x%x in CS\n", reg);
4064 return false;
4065 }
4066 }
4067
4068 static int si_vm_packet3_ce_check(struct radeon_device *rdev,
4069 u32 *ib, struct radeon_cs_packet *pkt)
4070 {
4071 switch (pkt->opcode) {
4072 case PACKET3_NOP:
4073 case PACKET3_SET_BASE:
4074 case PACKET3_SET_CE_DE_COUNTERS:
4075 case PACKET3_LOAD_CONST_RAM:
4076 case PACKET3_WRITE_CONST_RAM:
4077 case PACKET3_WRITE_CONST_RAM_OFFSET:
4078 case PACKET3_DUMP_CONST_RAM:
4079 case PACKET3_INCREMENT_CE_COUNTER:
4080 case PACKET3_WAIT_ON_DE_COUNTER:
4081 case PACKET3_CE_WRITE:
4082 break;
4083 default:
4084 DRM_ERROR("Invalid CE packet3: 0x%x\n", pkt->opcode);
4085 return -EINVAL;
4086 }
4087 return 0;
4088 }
4089
4090 static int si_vm_packet3_cp_dma_check(u32 *ib, u32 idx)
4091 {
4092 u32 start_reg, reg, i;
4093 u32 command = ib[idx + 4];
4094 u32 info = ib[idx + 1];
4095 u32 idx_value = ib[idx];
4096 if (command & PACKET3_CP_DMA_CMD_SAS) {
4097 /* src address space is register */
4098 if (((info & 0x60000000) >> 29) == 0) {
4099 start_reg = idx_value << 2;
4100 if (command & PACKET3_CP_DMA_CMD_SAIC) {
4101 reg = start_reg;
4102 if (!si_vm_reg_valid(reg)) {
4103 DRM_ERROR("CP DMA Bad SRC register\n");
4104 return -EINVAL;
4105 }
4106 } else {
4107 for (i = 0; i < (command & 0x1fffff); i++) {
4108 reg = start_reg + (4 * i);
4109 if (!si_vm_reg_valid(reg)) {
4110 DRM_ERROR("CP DMA Bad SRC register\n");
4111 return -EINVAL;
4112 }
4113 }
4114 }
4115 }
4116 }
4117 if (command & PACKET3_CP_DMA_CMD_DAS) {
4118 /* dst address space is register */
4119 if (((info & 0x00300000) >> 20) == 0) {
4120 start_reg = ib[idx + 2];
4121 if (command & PACKET3_CP_DMA_CMD_DAIC) {
4122 reg = start_reg;
4123 if (!si_vm_reg_valid(reg)) {
4124 DRM_ERROR("CP DMA Bad DST register\n");
4125 return -EINVAL;
4126 }
4127 } else {
4128 for (i = 0; i < (command & 0x1fffff); i++) {
4129 reg = start_reg + (4 * i);
4130 if (!si_vm_reg_valid(reg)) {
4131 DRM_ERROR("CP DMA Bad DST register\n");
4132 return -EINVAL;
4133 }
4134 }
4135 }
4136 }
4137 }
4138 return 0;
4139 }
4140
4141 static int si_vm_packet3_gfx_check(struct radeon_device *rdev,
4142 u32 *ib, struct radeon_cs_packet *pkt)
4143 {
4144 int r;
4145 u32 idx = pkt->idx + 1;
4146 u32 idx_value = ib[idx];
4147 u32 start_reg, end_reg, reg, i;
4148
4149 switch (pkt->opcode) {
4150 case PACKET3_NOP:
4151 case PACKET3_SET_BASE:
4152 case PACKET3_CLEAR_STATE:
4153 case PACKET3_INDEX_BUFFER_SIZE:
4154 case PACKET3_DISPATCH_DIRECT:
4155 case PACKET3_DISPATCH_INDIRECT:
4156 case PACKET3_ALLOC_GDS:
4157 case PACKET3_WRITE_GDS_RAM:
4158 case PACKET3_ATOMIC_GDS:
4159 case PACKET3_ATOMIC:
4160 case PACKET3_OCCLUSION_QUERY:
4161 case PACKET3_SET_PREDICATION:
4162 case PACKET3_COND_EXEC:
4163 case PACKET3_PRED_EXEC:
4164 case PACKET3_DRAW_INDIRECT:
4165 case PACKET3_DRAW_INDEX_INDIRECT:
4166 case PACKET3_INDEX_BASE:
4167 case PACKET3_DRAW_INDEX_2:
4168 case PACKET3_CONTEXT_CONTROL:
4169 case PACKET3_INDEX_TYPE:
4170 case PACKET3_DRAW_INDIRECT_MULTI:
4171 case PACKET3_DRAW_INDEX_AUTO:
4172 case PACKET3_DRAW_INDEX_IMMD:
4173 case PACKET3_NUM_INSTANCES:
4174 case PACKET3_DRAW_INDEX_MULTI_AUTO:
4175 case PACKET3_STRMOUT_BUFFER_UPDATE:
4176 case PACKET3_DRAW_INDEX_OFFSET_2:
4177 case PACKET3_DRAW_INDEX_MULTI_ELEMENT:
4178 case PACKET3_DRAW_INDEX_INDIRECT_MULTI:
4179 case PACKET3_MPEG_INDEX:
4180 case PACKET3_WAIT_REG_MEM:
4181 case PACKET3_MEM_WRITE:
4182 case PACKET3_PFP_SYNC_ME:
4183 case PACKET3_SURFACE_SYNC:
4184 case PACKET3_EVENT_WRITE:
4185 case PACKET3_EVENT_WRITE_EOP:
4186 case PACKET3_EVENT_WRITE_EOS:
4187 case PACKET3_SET_CONTEXT_REG:
4188 case PACKET3_SET_CONTEXT_REG_INDIRECT:
4189 case PACKET3_SET_SH_REG:
4190 case PACKET3_SET_SH_REG_OFFSET:
4191 case PACKET3_INCREMENT_DE_COUNTER:
4192 case PACKET3_WAIT_ON_CE_COUNTER:
4193 case PACKET3_WAIT_ON_AVAIL_BUFFER:
4194 case PACKET3_ME_WRITE:
4195 break;
4196 case PACKET3_COPY_DATA:
4197 if ((idx_value & 0xf00) == 0) {
4198 reg = ib[idx + 3] * 4;
4199 if (!si_vm_reg_valid(reg))
4200 return -EINVAL;
4201 }
4202 break;
4203 case PACKET3_WRITE_DATA:
4204 if ((idx_value & 0xf00) == 0) {
4205 start_reg = ib[idx + 1] * 4;
4206 if (idx_value & 0x10000) {
4207 if (!si_vm_reg_valid(start_reg))
4208 return -EINVAL;
4209 } else {
4210 for (i = 0; i < (pkt->count - 2); i++) {
4211 reg = start_reg + (4 * i);
4212 if (!si_vm_reg_valid(reg))
4213 return -EINVAL;
4214 }
4215 }
4216 }
4217 break;
4218 case PACKET3_COND_WRITE:
4219 if (idx_value & 0x100) {
4220 reg = ib[idx + 5] * 4;
4221 if (!si_vm_reg_valid(reg))
4222 return -EINVAL;
4223 }
4224 break;
4225 case PACKET3_COPY_DW:
4226 if (idx_value & 0x2) {
4227 reg = ib[idx + 3] * 4;
4228 if (!si_vm_reg_valid(reg))
4229 return -EINVAL;
4230 }
4231 break;
4232 case PACKET3_SET_CONFIG_REG:
4233 start_reg = (idx_value << 2) + PACKET3_SET_CONFIG_REG_START;
4234 end_reg = 4 * pkt->count + start_reg - 4;
4235 if ((start_reg < PACKET3_SET_CONFIG_REG_START) ||
4236 (start_reg >= PACKET3_SET_CONFIG_REG_END) ||
4237 (end_reg >= PACKET3_SET_CONFIG_REG_END)) {
4238 DRM_ERROR("bad PACKET3_SET_CONFIG_REG\n");
4239 return -EINVAL;
4240 }
4241 for (i = 0; i < pkt->count; i++) {
4242 reg = start_reg + (4 * i);
4243 if (!si_vm_reg_valid(reg))
4244 return -EINVAL;
4245 }
4246 break;
4247 case PACKET3_CP_DMA:
4248 r = si_vm_packet3_cp_dma_check(ib, idx);
4249 if (r)
4250 return r;
4251 break;
4252 default:
4253 DRM_ERROR("Invalid GFX packet3: 0x%x\n", pkt->opcode);
4254 return -EINVAL;
4255 }
4256 return 0;
4257 }
4258
4259 static int si_vm_packet3_compute_check(struct radeon_device *rdev,
4260 u32 *ib, struct radeon_cs_packet *pkt)
4261 {
4262 int r;
4263 u32 idx = pkt->idx + 1;
4264 u32 idx_value = ib[idx];
4265 u32 start_reg, reg, i;
4266
4267 switch (pkt->opcode) {
4268 case PACKET3_NOP:
4269 case PACKET3_SET_BASE:
4270 case PACKET3_CLEAR_STATE:
4271 case PACKET3_DISPATCH_DIRECT:
4272 case PACKET3_DISPATCH_INDIRECT:
4273 case PACKET3_ALLOC_GDS:
4274 case PACKET3_WRITE_GDS_RAM:
4275 case PACKET3_ATOMIC_GDS:
4276 case PACKET3_ATOMIC:
4277 case PACKET3_OCCLUSION_QUERY:
4278 case PACKET3_SET_PREDICATION:
4279 case PACKET3_COND_EXEC:
4280 case PACKET3_PRED_EXEC:
4281 case PACKET3_CONTEXT_CONTROL:
4282 case PACKET3_STRMOUT_BUFFER_UPDATE:
4283 case PACKET3_WAIT_REG_MEM:
4284 case PACKET3_MEM_WRITE:
4285 case PACKET3_PFP_SYNC_ME:
4286 case PACKET3_SURFACE_SYNC:
4287 case PACKET3_EVENT_WRITE:
4288 case PACKET3_EVENT_WRITE_EOP:
4289 case PACKET3_EVENT_WRITE_EOS:
4290 case PACKET3_SET_CONTEXT_REG:
4291 case PACKET3_SET_CONTEXT_REG_INDIRECT:
4292 case PACKET3_SET_SH_REG:
4293 case PACKET3_SET_SH_REG_OFFSET:
4294 case PACKET3_INCREMENT_DE_COUNTER:
4295 case PACKET3_WAIT_ON_CE_COUNTER:
4296 case PACKET3_WAIT_ON_AVAIL_BUFFER:
4297 case PACKET3_ME_WRITE:
4298 break;
4299 case PACKET3_COPY_DATA:
4300 if ((idx_value & 0xf00) == 0) {
4301 reg = ib[idx + 3] * 4;
4302 if (!si_vm_reg_valid(reg))
4303 return -EINVAL;
4304 }
4305 break;
4306 case PACKET3_WRITE_DATA:
4307 if ((idx_value & 0xf00) == 0) {
4308 start_reg = ib[idx + 1] * 4;
4309 if (idx_value & 0x10000) {
4310 if (!si_vm_reg_valid(start_reg))
4311 return -EINVAL;
4312 } else {
4313 for (i = 0; i < (pkt->count - 2); i++) {
4314 reg = start_reg + (4 * i);
4315 if (!si_vm_reg_valid(reg))
4316 return -EINVAL;
4317 }
4318 }
4319 }
4320 break;
4321 case PACKET3_COND_WRITE:
4322 if (idx_value & 0x100) {
4323 reg = ib[idx + 5] * 4;
4324 if (!si_vm_reg_valid(reg))
4325 return -EINVAL;
4326 }
4327 break;
4328 case PACKET3_COPY_DW:
4329 if (idx_value & 0x2) {
4330 reg = ib[idx + 3] * 4;
4331 if (!si_vm_reg_valid(reg))
4332 return -EINVAL;
4333 }
4334 break;
4335 case PACKET3_CP_DMA:
4336 r = si_vm_packet3_cp_dma_check(ib, idx);
4337 if (r)
4338 return r;
4339 break;
4340 default:
4341 DRM_ERROR("Invalid Compute packet3: 0x%x\n", pkt->opcode);
4342 return -EINVAL;
4343 }
4344 return 0;
4345 }
4346
4347 int si_ib_parse(struct radeon_device *rdev, struct radeon_ib *ib)
4348 {
4349 int ret = 0;
4350 u32 idx = 0;
4351 struct radeon_cs_packet pkt;
4352
4353 do {
4354 pkt.idx = idx;
4355 pkt.type = RADEON_CP_PACKET_GET_TYPE(ib->ptr[idx]);
4356 pkt.count = RADEON_CP_PACKET_GET_COUNT(ib->ptr[idx]);
4357 pkt.one_reg_wr = 0;
4358 switch (pkt.type) {
4359 case RADEON_PACKET_TYPE0:
4360 dev_err(rdev->dev, "Packet0 not allowed!\n");
4361 ret = -EINVAL;
4362 break;
4363 case RADEON_PACKET_TYPE2:
4364 idx += 1;
4365 break;
4366 case RADEON_PACKET_TYPE3:
4367 pkt.opcode = RADEON_CP_PACKET3_GET_OPCODE(ib->ptr[idx]);
4368 if (ib->is_const_ib)
4369 ret = si_vm_packet3_ce_check(rdev, ib->ptr, &pkt);
4370 else {
4371 switch (ib->ring) {
4372 case RADEON_RING_TYPE_GFX_INDEX:
4373 ret = si_vm_packet3_gfx_check(rdev, ib->ptr, &pkt);
4374 break;
4375 case CAYMAN_RING_TYPE_CP1_INDEX:
4376 case CAYMAN_RING_TYPE_CP2_INDEX:
4377 ret = si_vm_packet3_compute_check(rdev, ib->ptr, &pkt);
4378 break;
4379 default:
4380 dev_err(rdev->dev, "Non-PM4 ring %d !\n", ib->ring);
4381 ret = -EINVAL;
4382 break;
4383 }
4384 }
4385 idx += pkt.count + 2;
4386 break;
4387 default:
4388 dev_err(rdev->dev, "Unknown packet type %d !\n", pkt.type);
4389 ret = -EINVAL;
4390 break;
4391 }
4392 if (ret)
4393 break;
4394 } while (idx < ib->length_dw);
4395
4396 return ret;
4397 }
4398
4399 /*
4400 * vm
4401 */
4402 int si_vm_init(struct radeon_device *rdev)
4403 {
4404 /* number of VMs */
4405 rdev->vm_manager.nvm = 16;
4406 /* base offset of vram pages */
4407 rdev->vm_manager.vram_base_offset = 0;
4408
4409 return 0;
4410 }
4411
4412 void si_vm_fini(struct radeon_device *rdev)
4413 {
4414 }
4415
4416 /**
4417 * si_vm_decode_fault - print human readable fault info
4418 *
4419 * @rdev: radeon_device pointer
4420 * @status: VM_CONTEXT1_PROTECTION_FAULT_STATUS register value
4421 * @addr: VM_CONTEXT1_PROTECTION_FAULT_ADDR register value
4422 *
4423 * Print human readable fault information (SI).
4424 */
4425 static void si_vm_decode_fault(struct radeon_device *rdev,
4426 u32 status, u32 addr)
4427 {
4428 u32 mc_id = (status & MEMORY_CLIENT_ID_MASK) >> MEMORY_CLIENT_ID_SHIFT;
4429 u32 vmid = (status & FAULT_VMID_MASK) >> FAULT_VMID_SHIFT;
4430 u32 protections = (status & PROTECTIONS_MASK) >> PROTECTIONS_SHIFT;
4431 char *block;
4432
4433 if (rdev->family == CHIP_TAHITI) {
4434 switch (mc_id) {
4435 case 160:
4436 case 144:
4437 case 96:
4438 case 80:
4439 case 224:
4440 case 208:
4441 case 32:
4442 case 16:
4443 block = "CB";
4444 break;
4445 case 161:
4446 case 145:
4447 case 97:
4448 case 81:
4449 case 225:
4450 case 209:
4451 case 33:
4452 case 17:
4453 block = "CB_FMASK";
4454 break;
4455 case 162:
4456 case 146:
4457 case 98:
4458 case 82:
4459 case 226:
4460 case 210:
4461 case 34:
4462 case 18:
4463 block = "CB_CMASK";
4464 break;
4465 case 163:
4466 case 147:
4467 case 99:
4468 case 83:
4469 case 227:
4470 case 211:
4471 case 35:
4472 case 19:
4473 block = "CB_IMMED";
4474 break;
4475 case 164:
4476 case 148:
4477 case 100:
4478 case 84:
4479 case 228:
4480 case 212:
4481 case 36:
4482 case 20:
4483 block = "DB";
4484 break;
4485 case 165:
4486 case 149:
4487 case 101:
4488 case 85:
4489 case 229:
4490 case 213:
4491 case 37:
4492 case 21:
4493 block = "DB_HTILE";
4494 break;
4495 case 167:
4496 case 151:
4497 case 103:
4498 case 87:
4499 case 231:
4500 case 215:
4501 case 39:
4502 case 23:
4503 block = "DB_STEN";
4504 break;
4505 case 72:
4506 case 68:
4507 case 64:
4508 case 8:
4509 case 4:
4510 case 0:
4511 case 136:
4512 case 132:
4513 case 128:
4514 case 200:
4515 case 196:
4516 case 192:
4517 block = "TC";
4518 break;
4519 case 112:
4520 case 48:
4521 block = "CP";
4522 break;
4523 case 49:
4524 case 177:
4525 case 50:
4526 case 178:
4527 block = "SH";
4528 break;
4529 case 53:
4530 case 190:
4531 block = "VGT";
4532 break;
4533 case 117:
4534 block = "IH";
4535 break;
4536 case 51:
4537 case 115:
4538 block = "RLC";
4539 break;
4540 case 119:
4541 case 183:
4542 block = "DMA0";
4543 break;
4544 case 61:
4545 block = "DMA1";
4546 break;
4547 case 248:
4548 case 120:
4549 block = "HDP";
4550 break;
4551 default:
4552 block = "unknown";
4553 break;
4554 }
4555 } else {
4556 switch (mc_id) {
4557 case 32:
4558 case 16:
4559 case 96:
4560 case 80:
4561 case 160:
4562 case 144:
4563 case 224:
4564 case 208:
4565 block = "CB";
4566 break;
4567 case 33:
4568 case 17:
4569 case 97:
4570 case 81:
4571 case 161:
4572 case 145:
4573 case 225:
4574 case 209:
4575 block = "CB_FMASK";
4576 break;
4577 case 34:
4578 case 18:
4579 case 98:
4580 case 82:
4581 case 162:
4582 case 146:
4583 case 226:
4584 case 210:
4585 block = "CB_CMASK";
4586 break;
4587 case 35:
4588 case 19:
4589 case 99:
4590 case 83:
4591 case 163:
4592 case 147:
4593 case 227:
4594 case 211:
4595 block = "CB_IMMED";
4596 break;
4597 case 36:
4598 case 20:
4599 case 100:
4600 case 84:
4601 case 164:
4602 case 148:
4603 case 228:
4604 case 212:
4605 block = "DB";
4606 break;
4607 case 37:
4608 case 21:
4609 case 101:
4610 case 85:
4611 case 165:
4612 case 149:
4613 case 229:
4614 case 213:
4615 block = "DB_HTILE";
4616 break;
4617 case 39:
4618 case 23:
4619 case 103:
4620 case 87:
4621 case 167:
4622 case 151:
4623 case 231:
4624 case 215:
4625 block = "DB_STEN";
4626 break;
4627 case 72:
4628 case 68:
4629 case 8:
4630 case 4:
4631 case 136:
4632 case 132:
4633 case 200:
4634 case 196:
4635 block = "TC";
4636 break;
4637 case 112:
4638 case 48:
4639 block = "CP";
4640 break;
4641 case 49:
4642 case 177:
4643 case 50:
4644 case 178:
4645 block = "SH";
4646 break;
4647 case 53:
4648 block = "VGT";
4649 break;
4650 case 117:
4651 block = "IH";
4652 break;
4653 case 51:
4654 case 115:
4655 block = "RLC";
4656 break;
4657 case 119:
4658 case 183:
4659 block = "DMA0";
4660 break;
4661 case 61:
4662 block = "DMA1";
4663 break;
4664 case 248:
4665 case 120:
4666 block = "HDP";
4667 break;
4668 default:
4669 block = "unknown";
4670 break;
4671 }
4672 }
4673
4674 printk("VM fault (0x%02x, vmid %d) at page %u, %s from %s (%d)\n",
4675 protections, vmid, addr,
4676 (status & MEMORY_CLIENT_RW_MASK) ? "write" : "read",
4677 block, mc_id);
4678 }
4679
4680 void si_vm_flush(struct radeon_device *rdev, int ridx, struct radeon_vm *vm)
4681 {
4682 struct radeon_ring *ring = &rdev->ring[ridx];
4683
4684 if (vm == NULL)
4685 return;
4686
4687 /* write new base address */
4688 radeon_ring_write(ring, PACKET3(PACKET3_WRITE_DATA, 3));
4689 radeon_ring_write(ring, (WRITE_DATA_ENGINE_SEL(0) |
4690 WRITE_DATA_DST_SEL(0)));
4691
4692 if (vm->id < 8) {
4693 radeon_ring_write(ring,
4694 (VM_CONTEXT0_PAGE_TABLE_BASE_ADDR + (vm->id << 2)) >> 2);
4695 } else {
4696 radeon_ring_write(ring,
4697 (VM_CONTEXT8_PAGE_TABLE_BASE_ADDR + ((vm->id - 8) << 2)) >> 2);
4698 }
4699 radeon_ring_write(ring, 0);
4700 radeon_ring_write(ring, vm->pd_gpu_addr >> 12);
4701
4702 /* flush hdp cache */
4703 radeon_ring_write(ring, PACKET3(PACKET3_WRITE_DATA, 3));
4704 radeon_ring_write(ring, (WRITE_DATA_ENGINE_SEL(0) |
4705 WRITE_DATA_DST_SEL(0)));
4706 radeon_ring_write(ring, HDP_MEM_COHERENCY_FLUSH_CNTL >> 2);
4707 radeon_ring_write(ring, 0);
4708 radeon_ring_write(ring, 0x1);
4709
4710 /* bits 0-15 are the VM contexts0-15 */
4711 radeon_ring_write(ring, PACKET3(PACKET3_WRITE_DATA, 3));
4712 radeon_ring_write(ring, (WRITE_DATA_ENGINE_SEL(0) |
4713 WRITE_DATA_DST_SEL(0)));
4714 radeon_ring_write(ring, VM_INVALIDATE_REQUEST >> 2);
4715 radeon_ring_write(ring, 0);
4716 radeon_ring_write(ring, 1 << vm->id);
4717
4718 /* sync PFP to ME, otherwise we might get invalid PFP reads */
4719 radeon_ring_write(ring, PACKET3(PACKET3_PFP_SYNC_ME, 0));
4720 radeon_ring_write(ring, 0x0);
4721 }
4722
4723 /*
4724 * Power and clock gating
4725 */
4726 static void si_wait_for_rlc_serdes(struct radeon_device *rdev)
4727 {
4728 int i;
4729
4730 for (i = 0; i < rdev->usec_timeout; i++) {
4731 if (RREG32(RLC_SERDES_MASTER_BUSY_0) == 0)
4732 break;
4733 udelay(1);
4734 }
4735
4736 for (i = 0; i < rdev->usec_timeout; i++) {
4737 if (RREG32(RLC_SERDES_MASTER_BUSY_1) == 0)
4738 break;
4739 udelay(1);
4740 }
4741 }
4742
4743 static void si_enable_gui_idle_interrupt(struct radeon_device *rdev,
4744 bool enable)
4745 {
4746 u32 tmp = RREG32(CP_INT_CNTL_RING0);
4747 u32 mask;
4748 int i;
4749
4750 if (enable)
4751 tmp |= (CNTX_BUSY_INT_ENABLE | CNTX_EMPTY_INT_ENABLE);
4752 else
4753 tmp &= ~(CNTX_BUSY_INT_ENABLE | CNTX_EMPTY_INT_ENABLE);
4754 WREG32(CP_INT_CNTL_RING0, tmp);
4755
4756 if (!enable) {
4757 /* read a gfx register */
4758 tmp = RREG32(DB_DEPTH_INFO);
4759
4760 mask = RLC_BUSY_STATUS | GFX_POWER_STATUS | GFX_CLOCK_STATUS | GFX_LS_STATUS;
4761 for (i = 0; i < rdev->usec_timeout; i++) {
4762 if ((RREG32(RLC_STAT) & mask) == (GFX_CLOCK_STATUS | GFX_POWER_STATUS))
4763 break;
4764 udelay(1);
4765 }
4766 }
4767 }
4768
4769 static void si_set_uvd_dcm(struct radeon_device *rdev,
4770 bool sw_mode)
4771 {
4772 u32 tmp, tmp2;
4773
4774 tmp = RREG32(UVD_CGC_CTRL);
4775 tmp &= ~(CLK_OD_MASK | CG_DT_MASK);
4776 tmp |= DCM | CG_DT(1) | CLK_OD(4);
4777
4778 if (sw_mode) {
4779 tmp &= ~0x7ffff800;
4780 tmp2 = DYN_OR_EN | DYN_RR_EN | G_DIV_ID(7);
4781 } else {
4782 tmp |= 0x7ffff800;
4783 tmp2 = 0;
4784 }
4785
4786 WREG32(UVD_CGC_CTRL, tmp);
4787 WREG32_UVD_CTX(UVD_CGC_CTRL2, tmp2);
4788 }
4789
4790 void si_init_uvd_internal_cg(struct radeon_device *rdev)
4791 {
4792 bool hw_mode = true;
4793
4794 if (hw_mode) {
4795 si_set_uvd_dcm(rdev, false);
4796 } else {
4797 u32 tmp = RREG32(UVD_CGC_CTRL);
4798 tmp &= ~DCM;
4799 WREG32(UVD_CGC_CTRL, tmp);
4800 }
4801 }
4802
4803 static u32 si_halt_rlc(struct radeon_device *rdev)
4804 {
4805 u32 data, orig;
4806
4807 orig = data = RREG32(RLC_CNTL);
4808
4809 if (data & RLC_ENABLE) {
4810 data &= ~RLC_ENABLE;
4811 WREG32(RLC_CNTL, data);
4812
4813 si_wait_for_rlc_serdes(rdev);
4814 }
4815
4816 return orig;
4817 }
4818
4819 static void si_update_rlc(struct radeon_device *rdev, u32 rlc)
4820 {
4821 u32 tmp;
4822
4823 tmp = RREG32(RLC_CNTL);
4824 if (tmp != rlc)
4825 WREG32(RLC_CNTL, rlc);
4826 }
4827
4828 static void si_enable_dma_pg(struct radeon_device *rdev, bool enable)
4829 {
4830 u32 data, orig;
4831
4832 orig = data = RREG32(DMA_PG);
4833 if (enable && (rdev->pg_flags & RADEON_PG_SUPPORT_SDMA))
4834 data |= PG_CNTL_ENABLE;
4835 else
4836 data &= ~PG_CNTL_ENABLE;
4837 if (orig != data)
4838 WREG32(DMA_PG, data);
4839 }
4840
4841 static void si_init_dma_pg(struct radeon_device *rdev)
4842 {
4843 u32 tmp;
4844
4845 WREG32(DMA_PGFSM_WRITE, 0x00002000);
4846 WREG32(DMA_PGFSM_CONFIG, 0x100010ff);
4847
4848 for (tmp = 0; tmp < 5; tmp++)
4849 WREG32(DMA_PGFSM_WRITE, 0);
4850 }
4851
4852 static void si_enable_gfx_cgpg(struct radeon_device *rdev,
4853 bool enable)
4854 {
4855 u32 tmp;
4856
4857 if (enable && (rdev->pg_flags & RADEON_PG_SUPPORT_GFX_PG)) {
4858 tmp = RLC_PUD(0x10) | RLC_PDD(0x10) | RLC_TTPD(0x10) | RLC_MSD(0x10);
4859 WREG32(RLC_TTOP_D, tmp);
4860
4861 tmp = RREG32(RLC_PG_CNTL);
4862 tmp |= GFX_PG_ENABLE;
4863 WREG32(RLC_PG_CNTL, tmp);
4864
4865 tmp = RREG32(RLC_AUTO_PG_CTRL);
4866 tmp |= AUTO_PG_EN;
4867 WREG32(RLC_AUTO_PG_CTRL, tmp);
4868 } else {
4869 tmp = RREG32(RLC_AUTO_PG_CTRL);
4870 tmp &= ~AUTO_PG_EN;
4871 WREG32(RLC_AUTO_PG_CTRL, tmp);
4872
4873 tmp = RREG32(DB_RENDER_CONTROL);
4874 }
4875 }
4876
4877 static void si_init_gfx_cgpg(struct radeon_device *rdev)
4878 {
4879 u32 tmp;
4880
4881 WREG32(RLC_SAVE_AND_RESTORE_BASE, rdev->rlc.save_restore_gpu_addr >> 8);
4882
4883 tmp = RREG32(RLC_PG_CNTL);
4884 tmp |= GFX_PG_SRC;
4885 WREG32(RLC_PG_CNTL, tmp);
4886
4887 WREG32(RLC_CLEAR_STATE_RESTORE_BASE, rdev->rlc.clear_state_gpu_addr >> 8);
4888
4889 tmp = RREG32(RLC_AUTO_PG_CTRL);
4890
4891 tmp &= ~GRBM_REG_SGIT_MASK;
4892 tmp |= GRBM_REG_SGIT(0x700);
4893 tmp &= ~PG_AFTER_GRBM_REG_ST_MASK;
4894 WREG32(RLC_AUTO_PG_CTRL, tmp);
4895 }
4896
4897 static u32 si_get_cu_active_bitmap(struct radeon_device *rdev, u32 se, u32 sh)
4898 {
4899 u32 mask = 0, tmp, tmp1;
4900 int i;
4901
4902 si_select_se_sh(rdev, se, sh);
4903 tmp = RREG32(CC_GC_SHADER_ARRAY_CONFIG);
4904 tmp1 = RREG32(GC_USER_SHADER_ARRAY_CONFIG);
4905 si_select_se_sh(rdev, 0xffffffff, 0xffffffff);
4906
4907 tmp &= 0xffff0000;
4908
4909 tmp |= tmp1;
4910 tmp >>= 16;
4911
4912 for (i = 0; i < rdev->config.si.max_cu_per_sh; i ++) {
4913 mask <<= 1;
4914 mask |= 1;
4915 }
4916
4917 return (~tmp) & mask;
4918 }
4919
4920 static void si_init_ao_cu_mask(struct radeon_device *rdev)
4921 {
4922 u32 i, j, k, active_cu_number = 0;
4923 u32 mask, counter, cu_bitmap;
4924 u32 tmp = 0;
4925
4926 for (i = 0; i < rdev->config.si.max_shader_engines; i++) {
4927 for (j = 0; j < rdev->config.si.max_sh_per_se; j++) {
4928 mask = 1;
4929 cu_bitmap = 0;
4930 counter = 0;
4931 for (k = 0; k < rdev->config.si.max_cu_per_sh; k++) {
4932 if (si_get_cu_active_bitmap(rdev, i, j) & mask) {
4933 if (counter < 2)
4934 cu_bitmap |= mask;
4935 counter++;
4936 }
4937 mask <<= 1;
4938 }
4939
4940 active_cu_number += counter;
4941 tmp |= (cu_bitmap << (i * 16 + j * 8));
4942 }
4943 }
4944
4945 WREG32(RLC_PG_AO_CU_MASK, tmp);
4946
4947 tmp = RREG32(RLC_MAX_PG_CU);
4948 tmp &= ~MAX_PU_CU_MASK;
4949 tmp |= MAX_PU_CU(active_cu_number);
4950 WREG32(RLC_MAX_PG_CU, tmp);
4951 }
4952
4953 static void si_enable_cgcg(struct radeon_device *rdev,
4954 bool enable)
4955 {
4956 u32 data, orig, tmp;
4957
4958 orig = data = RREG32(RLC_CGCG_CGLS_CTRL);
4959
4960 if (enable && (rdev->cg_flags & RADEON_CG_SUPPORT_GFX_CGCG)) {
4961 si_enable_gui_idle_interrupt(rdev, true);
4962
4963 WREG32(RLC_GCPM_GENERAL_3, 0x00000080);
4964
4965 tmp = si_halt_rlc(rdev);
4966
4967 WREG32(RLC_SERDES_WR_MASTER_MASK_0, 0xffffffff);
4968 WREG32(RLC_SERDES_WR_MASTER_MASK_1, 0xffffffff);
4969 WREG32(RLC_SERDES_WR_CTRL, 0x00b000ff);
4970
4971 si_wait_for_rlc_serdes(rdev);
4972
4973 si_update_rlc(rdev, tmp);
4974
4975 WREG32(RLC_SERDES_WR_CTRL, 0x007000ff);
4976
4977 data |= CGCG_EN | CGLS_EN;
4978 } else {
4979 si_enable_gui_idle_interrupt(rdev, false);
4980
4981 RREG32(CB_CGTT_SCLK_CTRL);
4982 RREG32(CB_CGTT_SCLK_CTRL);
4983 RREG32(CB_CGTT_SCLK_CTRL);
4984 RREG32(CB_CGTT_SCLK_CTRL);
4985
4986 data &= ~(CGCG_EN | CGLS_EN);
4987 }
4988
4989 if (orig != data)
4990 WREG32(RLC_CGCG_CGLS_CTRL, data);
4991 }
4992
4993 static void si_enable_mgcg(struct radeon_device *rdev,
4994 bool enable)
4995 {
4996 u32 data, orig, tmp = 0;
4997
4998 if (enable && (rdev->cg_flags & RADEON_CG_SUPPORT_GFX_MGCG)) {
4999 orig = data = RREG32(CGTS_SM_CTRL_REG);
5000 data = 0x96940200;
5001 if (orig != data)
5002 WREG32(CGTS_SM_CTRL_REG, data);
5003
5004 if (rdev->cg_flags & RADEON_CG_SUPPORT_GFX_CP_LS) {
5005 orig = data = RREG32(CP_MEM_SLP_CNTL);
5006 data |= CP_MEM_LS_EN;
5007 if (orig != data)
5008 WREG32(CP_MEM_SLP_CNTL, data);
5009 }
5010
5011 orig = data = RREG32(RLC_CGTT_MGCG_OVERRIDE);
5012 data &= 0xffffffc0;
5013 if (orig != data)
5014 WREG32(RLC_CGTT_MGCG_OVERRIDE, data);
5015
5016 tmp = si_halt_rlc(rdev);
5017
5018 WREG32(RLC_SERDES_WR_MASTER_MASK_0, 0xffffffff);
5019 WREG32(RLC_SERDES_WR_MASTER_MASK_1, 0xffffffff);
5020 WREG32(RLC_SERDES_WR_CTRL, 0x00d000ff);
5021
5022 si_update_rlc(rdev, tmp);
5023 } else {
5024 orig = data = RREG32(RLC_CGTT_MGCG_OVERRIDE);
5025 data |= 0x00000003;
5026 if (orig != data)
5027 WREG32(RLC_CGTT_MGCG_OVERRIDE, data);
5028
5029 data = RREG32(CP_MEM_SLP_CNTL);
5030 if (data & CP_MEM_LS_EN) {
5031 data &= ~CP_MEM_LS_EN;
5032 WREG32(CP_MEM_SLP_CNTL, data);
5033 }
5034 orig = data = RREG32(CGTS_SM_CTRL_REG);
5035 data |= LS_OVERRIDE | OVERRIDE;
5036 if (orig != data)
5037 WREG32(CGTS_SM_CTRL_REG, data);
5038
5039 tmp = si_halt_rlc(rdev);
5040
5041 WREG32(RLC_SERDES_WR_MASTER_MASK_0, 0xffffffff);
5042 WREG32(RLC_SERDES_WR_MASTER_MASK_1, 0xffffffff);
5043 WREG32(RLC_SERDES_WR_CTRL, 0x00e000ff);
5044
5045 si_update_rlc(rdev, tmp);
5046 }
5047 }
5048
5049 static void si_enable_uvd_mgcg(struct radeon_device *rdev,
5050 bool enable)
5051 {
5052 u32 orig, data, tmp;
5053
5054 if (enable && (rdev->cg_flags & RADEON_CG_SUPPORT_UVD_MGCG)) {
5055 tmp = RREG32_UVD_CTX(UVD_CGC_MEM_CTRL);
5056 tmp |= 0x3fff;
5057 WREG32_UVD_CTX(UVD_CGC_MEM_CTRL, tmp);
5058
5059 orig = data = RREG32(UVD_CGC_CTRL);
5060 data |= DCM;
5061 if (orig != data)
5062 WREG32(UVD_CGC_CTRL, data);
5063
5064 WREG32_SMC(SMC_CG_IND_START + CG_CGTT_LOCAL_0, 0);
5065 WREG32_SMC(SMC_CG_IND_START + CG_CGTT_LOCAL_1, 0);
5066 } else {
5067 tmp = RREG32_UVD_CTX(UVD_CGC_MEM_CTRL);
5068 tmp &= ~0x3fff;
5069 WREG32_UVD_CTX(UVD_CGC_MEM_CTRL, tmp);
5070
5071 orig = data = RREG32(UVD_CGC_CTRL);
5072 data &= ~DCM;
5073 if (orig != data)
5074 WREG32(UVD_CGC_CTRL, data);
5075
5076 WREG32_SMC(SMC_CG_IND_START + CG_CGTT_LOCAL_0, 0xffffffff);
5077 WREG32_SMC(SMC_CG_IND_START + CG_CGTT_LOCAL_1, 0xffffffff);
5078 }
5079 }
5080
5081 static const u32 mc_cg_registers[] =
5082 {
5083 MC_HUB_MISC_HUB_CG,
5084 MC_HUB_MISC_SIP_CG,
5085 MC_HUB_MISC_VM_CG,
5086 MC_XPB_CLK_GAT,
5087 ATC_MISC_CG,
5088 MC_CITF_MISC_WR_CG,
5089 MC_CITF_MISC_RD_CG,
5090 MC_CITF_MISC_VM_CG,
5091 VM_L2_CG,
5092 };
5093
5094 static void si_enable_mc_ls(struct radeon_device *rdev,
5095 bool enable)
5096 {
5097 int i;
5098 u32 orig, data;
5099
5100 for (i = 0; i < ARRAY_SIZE(mc_cg_registers); i++) {
5101 orig = data = RREG32(mc_cg_registers[i]);
5102 if (enable && (rdev->cg_flags & RADEON_CG_SUPPORT_MC_LS))
5103 data |= MC_LS_ENABLE;
5104 else
5105 data &= ~MC_LS_ENABLE;
5106 if (data != orig)
5107 WREG32(mc_cg_registers[i], data);
5108 }
5109 }
5110
5111 static void si_enable_mc_mgcg(struct radeon_device *rdev,
5112 bool enable)
5113 {
5114 int i;
5115 u32 orig, data;
5116
5117 for (i = 0; i < ARRAY_SIZE(mc_cg_registers); i++) {
5118 orig = data = RREG32(mc_cg_registers[i]);
5119 if (enable && (rdev->cg_flags & RADEON_CG_SUPPORT_MC_MGCG))
5120 data |= MC_CG_ENABLE;
5121 else
5122 data &= ~MC_CG_ENABLE;
5123 if (data != orig)
5124 WREG32(mc_cg_registers[i], data);
5125 }
5126 }
5127
5128 static void si_enable_dma_mgcg(struct radeon_device *rdev,
5129 bool enable)
5130 {
5131 u32 orig, data, offset;
5132 int i;
5133
5134 if (enable && (rdev->cg_flags & RADEON_CG_SUPPORT_SDMA_MGCG)) {
5135 for (i = 0; i < 2; i++) {
5136 if (i == 0)
5137 offset = DMA0_REGISTER_OFFSET;
5138 else
5139 offset = DMA1_REGISTER_OFFSET;
5140 orig = data = RREG32(DMA_POWER_CNTL + offset);
5141 data &= ~MEM_POWER_OVERRIDE;
5142 if (data != orig)
5143 WREG32(DMA_POWER_CNTL + offset, data);
5144 WREG32(DMA_CLK_CTRL + offset, 0x00000100);
5145 }
5146 } else {
5147 for (i = 0; i < 2; i++) {
5148 if (i == 0)
5149 offset = DMA0_REGISTER_OFFSET;
5150 else
5151 offset = DMA1_REGISTER_OFFSET;
5152 orig = data = RREG32(DMA_POWER_CNTL + offset);
5153 data |= MEM_POWER_OVERRIDE;
5154 if (data != orig)
5155 WREG32(DMA_POWER_CNTL + offset, data);
5156
5157 orig = data = RREG32(DMA_CLK_CTRL + offset);
5158 data = 0xff000000;
5159 if (data != orig)
5160 WREG32(DMA_CLK_CTRL + offset, data);
5161 }
5162 }
5163 }
5164
5165 static void si_enable_bif_mgls(struct radeon_device *rdev,
5166 bool enable)
5167 {
5168 u32 orig, data;
5169
5170 orig = data = RREG32_PCIE(PCIE_CNTL2);
5171
5172 if (enable && (rdev->cg_flags & RADEON_CG_SUPPORT_BIF_LS))
5173 data |= SLV_MEM_LS_EN | MST_MEM_LS_EN |
5174 REPLAY_MEM_LS_EN | SLV_MEM_AGGRESSIVE_LS_EN;
5175 else
5176 data &= ~(SLV_MEM_LS_EN | MST_MEM_LS_EN |
5177 REPLAY_MEM_LS_EN | SLV_MEM_AGGRESSIVE_LS_EN);
5178
5179 if (orig != data)
5180 WREG32_PCIE(PCIE_CNTL2, data);
5181 }
5182
5183 static void si_enable_hdp_mgcg(struct radeon_device *rdev,
5184 bool enable)
5185 {
5186 u32 orig, data;
5187
5188 orig = data = RREG32(HDP_HOST_PATH_CNTL);
5189
5190 if (enable && (rdev->cg_flags & RADEON_CG_SUPPORT_HDP_MGCG))
5191 data &= ~CLOCK_GATING_DIS;
5192 else
5193 data |= CLOCK_GATING_DIS;
5194
5195 if (orig != data)
5196 WREG32(HDP_HOST_PATH_CNTL, data);
5197 }
5198
5199 static void si_enable_hdp_ls(struct radeon_device *rdev,
5200 bool enable)
5201 {
5202 u32 orig, data;
5203
5204 orig = data = RREG32(HDP_MEM_POWER_LS);
5205
5206 if (enable && (rdev->cg_flags & RADEON_CG_SUPPORT_HDP_LS))
5207 data |= HDP_LS_ENABLE;
5208 else
5209 data &= ~HDP_LS_ENABLE;
5210
5211 if (orig != data)
5212 WREG32(HDP_MEM_POWER_LS, data);
5213 }
5214
5215 void si_update_cg(struct radeon_device *rdev,
5216 u32 block, bool enable)
5217 {
5218 if (block & RADEON_CG_BLOCK_GFX) {
5219 si_enable_gui_idle_interrupt(rdev, false);
5220 /* order matters! */
5221 if (enable) {
5222 si_enable_mgcg(rdev, true);
5223 si_enable_cgcg(rdev, true);
5224 } else {
5225 si_enable_cgcg(rdev, false);
5226 si_enable_mgcg(rdev, false);
5227 }
5228 si_enable_gui_idle_interrupt(rdev, true);
5229 }
5230
5231 if (block & RADEON_CG_BLOCK_MC) {
5232 si_enable_mc_mgcg(rdev, enable);
5233 si_enable_mc_ls(rdev, enable);
5234 }
5235
5236 if (block & RADEON_CG_BLOCK_SDMA) {
5237 si_enable_dma_mgcg(rdev, enable);
5238 }
5239
5240 if (block & RADEON_CG_BLOCK_BIF) {
5241 si_enable_bif_mgls(rdev, enable);
5242 }
5243
5244 if (block & RADEON_CG_BLOCK_UVD) {
5245 if (rdev->has_uvd) {
5246 si_enable_uvd_mgcg(rdev, enable);
5247 }
5248 }
5249
5250 if (block & RADEON_CG_BLOCK_HDP) {
5251 si_enable_hdp_mgcg(rdev, enable);
5252 si_enable_hdp_ls(rdev, enable);
5253 }
5254 }
5255
5256 static void si_init_cg(struct radeon_device *rdev)
5257 {
5258 si_update_cg(rdev, (RADEON_CG_BLOCK_GFX |
5259 RADEON_CG_BLOCK_MC |
5260 RADEON_CG_BLOCK_SDMA |
5261 RADEON_CG_BLOCK_BIF |
5262 RADEON_CG_BLOCK_HDP), true);
5263 if (rdev->has_uvd) {
5264 si_update_cg(rdev, RADEON_CG_BLOCK_UVD, true);
5265 si_init_uvd_internal_cg(rdev);
5266 }
5267 }
5268
5269 static void si_fini_cg(struct radeon_device *rdev)
5270 {
5271 if (rdev->has_uvd) {
5272 si_update_cg(rdev, RADEON_CG_BLOCK_UVD, false);
5273 }
5274 si_update_cg(rdev, (RADEON_CG_BLOCK_GFX |
5275 RADEON_CG_BLOCK_MC |
5276 RADEON_CG_BLOCK_SDMA |
5277 RADEON_CG_BLOCK_BIF |
5278 RADEON_CG_BLOCK_HDP), false);
5279 }
5280
5281 u32 si_get_csb_size(struct radeon_device *rdev)
5282 {
5283 u32 count = 0;
5284 const struct cs_section_def *sect = NULL;
5285 const struct cs_extent_def *ext = NULL;
5286
5287 if (rdev->rlc.cs_data == NULL)
5288 return 0;
5289
5290 /* begin clear state */
5291 count += 2;
5292 /* context control state */
5293 count += 3;
5294
5295 for (sect = rdev->rlc.cs_data; sect->section != NULL; ++sect) {
5296 for (ext = sect->section; ext->extent != NULL; ++ext) {
5297 if (sect->id == SECT_CONTEXT)
5298 count += 2 + ext->reg_count;
5299 else
5300 return 0;
5301 }
5302 }
5303 /* pa_sc_raster_config */
5304 count += 3;
5305 /* end clear state */
5306 count += 2;
5307 /* clear state */
5308 count += 2;
5309
5310 return count;
5311 }
5312
5313 void si_get_csb_buffer(struct radeon_device *rdev, volatile u32 *buffer)
5314 {
5315 u32 count = 0, i;
5316 const struct cs_section_def *sect = NULL;
5317 const struct cs_extent_def *ext = NULL;
5318
5319 if (rdev->rlc.cs_data == NULL)
5320 return;
5321 if (buffer == NULL)
5322 return;
5323
5324 buffer[count++] = cpu_to_le32(PACKET3(PACKET3_PREAMBLE_CNTL, 0));
5325 buffer[count++] = cpu_to_le32(PACKET3_PREAMBLE_BEGIN_CLEAR_STATE);
5326
5327 buffer[count++] = cpu_to_le32(PACKET3(PACKET3_CONTEXT_CONTROL, 1));
5328 buffer[count++] = cpu_to_le32(0x80000000);
5329 buffer[count++] = cpu_to_le32(0x80000000);
5330
5331 for (sect = rdev->rlc.cs_data; sect->section != NULL; ++sect) {
5332 for (ext = sect->section; ext->extent != NULL; ++ext) {
5333 if (sect->id == SECT_CONTEXT) {
5334 buffer[count++] =
5335 cpu_to_le32(PACKET3(PACKET3_SET_CONTEXT_REG, ext->reg_count));
5336 buffer[count++] = cpu_to_le32(ext->reg_index - 0xa000);
5337 for (i = 0; i < ext->reg_count; i++)
5338 buffer[count++] = cpu_to_le32(ext->extent[i]);
5339 } else {
5340 return;
5341 }
5342 }
5343 }
5344
5345 buffer[count++] = cpu_to_le32(PACKET3(PACKET3_SET_CONTEXT_REG, 1));
5346 buffer[count++] = cpu_to_le32(PA_SC_RASTER_CONFIG - PACKET3_SET_CONTEXT_REG_START);
5347 switch (rdev->family) {
5348 case CHIP_TAHITI:
5349 case CHIP_PITCAIRN:
5350 buffer[count++] = cpu_to_le32(0x2a00126a);
5351 break;
5352 case CHIP_VERDE:
5353 buffer[count++] = cpu_to_le32(0x0000124a);
5354 break;
5355 case CHIP_OLAND:
5356 buffer[count++] = cpu_to_le32(0x00000082);
5357 break;
5358 case CHIP_HAINAN:
5359 buffer[count++] = cpu_to_le32(0x00000000);
5360 break;
5361 default:
5362 buffer[count++] = cpu_to_le32(0x00000000);
5363 break;
5364 }
5365
5366 buffer[count++] = cpu_to_le32(PACKET3(PACKET3_PREAMBLE_CNTL, 0));
5367 buffer[count++] = cpu_to_le32(PACKET3_PREAMBLE_END_CLEAR_STATE);
5368
5369 buffer[count++] = cpu_to_le32(PACKET3(PACKET3_CLEAR_STATE, 0));
5370 buffer[count++] = cpu_to_le32(0);
5371 }
5372
5373 static void si_init_pg(struct radeon_device *rdev)
5374 {
5375 if (rdev->pg_flags) {
5376 if (rdev->pg_flags & RADEON_PG_SUPPORT_SDMA) {
5377 si_init_dma_pg(rdev);
5378 }
5379 si_init_ao_cu_mask(rdev);
5380 if (rdev->pg_flags & RADEON_PG_SUPPORT_GFX_PG) {
5381 si_init_gfx_cgpg(rdev);
5382 }
5383 si_enable_dma_pg(rdev, true);
5384 si_enable_gfx_cgpg(rdev, true);
5385 } else {
5386 WREG32(RLC_SAVE_AND_RESTORE_BASE, rdev->rlc.save_restore_gpu_addr >> 8);
5387 WREG32(RLC_CLEAR_STATE_RESTORE_BASE, rdev->rlc.clear_state_gpu_addr >> 8);
5388 }
5389 }
5390
5391 static void si_fini_pg(struct radeon_device *rdev)
5392 {
5393 if (rdev->pg_flags) {
5394 si_enable_dma_pg(rdev, false);
5395 si_enable_gfx_cgpg(rdev, false);
5396 }
5397 }
5398
5399 /*
5400 * RLC
5401 */
5402 void si_rlc_reset(struct radeon_device *rdev)
5403 {
5404 u32 tmp = RREG32(GRBM_SOFT_RESET);
5405
5406 tmp |= SOFT_RESET_RLC;
5407 WREG32(GRBM_SOFT_RESET, tmp);
5408 udelay(50);
5409 tmp &= ~SOFT_RESET_RLC;
5410 WREG32(GRBM_SOFT_RESET, tmp);
5411 udelay(50);
5412 }
5413
5414 static void si_rlc_stop(struct radeon_device *rdev)
5415 {
5416 WREG32(RLC_CNTL, 0);
5417
5418 si_enable_gui_idle_interrupt(rdev, false);
5419
5420 si_wait_for_rlc_serdes(rdev);
5421 }
5422
5423 static void si_rlc_start(struct radeon_device *rdev)
5424 {
5425 WREG32(RLC_CNTL, RLC_ENABLE);
5426
5427 si_enable_gui_idle_interrupt(rdev, true);
5428
5429 udelay(50);
5430 }
5431
5432 static bool si_lbpw_supported(struct radeon_device *rdev)
5433 {
5434 u32 tmp;
5435
5436 /* Enable LBPW only for DDR3 */
5437 tmp = RREG32(MC_SEQ_MISC0);
5438 if ((tmp & 0xF0000000) == 0xB0000000)
5439 return true;
5440 return false;
5441 }
5442
5443 static void si_enable_lbpw(struct radeon_device *rdev, bool enable)
5444 {
5445 u32 tmp;
5446
5447 tmp = RREG32(RLC_LB_CNTL);
5448 if (enable)
5449 tmp |= LOAD_BALANCE_ENABLE;
5450 else
5451 tmp &= ~LOAD_BALANCE_ENABLE;
5452 WREG32(RLC_LB_CNTL, tmp);
5453
5454 if (!enable) {
5455 si_select_se_sh(rdev, 0xffffffff, 0xffffffff);
5456 WREG32(SPI_LB_CU_MASK, 0x00ff);
5457 }
5458 }
5459
5460 static int si_rlc_resume(struct radeon_device *rdev)
5461 {
5462 u32 i;
5463 const __be32 *fw_data;
5464
5465 if (!rdev->rlc_fw)
5466 return -EINVAL;
5467
5468 si_rlc_stop(rdev);
5469
5470 si_rlc_reset(rdev);
5471
5472 si_init_pg(rdev);
5473
5474 si_init_cg(rdev);
5475
5476 WREG32(RLC_RL_BASE, 0);
5477 WREG32(RLC_RL_SIZE, 0);
5478 WREG32(RLC_LB_CNTL, 0);
5479 WREG32(RLC_LB_CNTR_MAX, 0xffffffff);
5480 WREG32(RLC_LB_CNTR_INIT, 0);
5481 WREG32(RLC_LB_INIT_CU_MASK, 0xffffffff);
5482
5483 WREG32(RLC_MC_CNTL, 0);
5484 WREG32(RLC_UCODE_CNTL, 0);
5485
5486 fw_data = (const __be32 *)rdev->rlc_fw->data;
5487 for (i = 0; i < SI_RLC_UCODE_SIZE; i++) {
5488 WREG32(RLC_UCODE_ADDR, i);
5489 WREG32(RLC_UCODE_DATA, be32_to_cpup(fw_data++));
5490 }
5491 WREG32(RLC_UCODE_ADDR, 0);
5492
5493 si_enable_lbpw(rdev, si_lbpw_supported(rdev));
5494
5495 si_rlc_start(rdev);
5496
5497 return 0;
5498 }
5499
5500 static void si_enable_interrupts(struct radeon_device *rdev)
5501 {
5502 u32 ih_cntl = RREG32(IH_CNTL);
5503 u32 ih_rb_cntl = RREG32(IH_RB_CNTL);
5504
5505 ih_cntl |= ENABLE_INTR;
5506 ih_rb_cntl |= IH_RB_ENABLE;
5507 WREG32(IH_CNTL, ih_cntl);
5508 WREG32(IH_RB_CNTL, ih_rb_cntl);
5509 rdev->ih.enabled = true;
5510 }
5511
5512 static void si_disable_interrupts(struct radeon_device *rdev)
5513 {
5514 u32 ih_rb_cntl = RREG32(IH_RB_CNTL);
5515 u32 ih_cntl = RREG32(IH_CNTL);
5516
5517 ih_rb_cntl &= ~IH_RB_ENABLE;
5518 ih_cntl &= ~ENABLE_INTR;
5519 WREG32(IH_RB_CNTL, ih_rb_cntl);
5520 WREG32(IH_CNTL, ih_cntl);
5521 /* set rptr, wptr to 0 */
5522 WREG32(IH_RB_RPTR, 0);
5523 WREG32(IH_RB_WPTR, 0);
5524 rdev->ih.enabled = false;
5525 rdev->ih.rptr = 0;
5526 }
5527
5528 static void si_disable_interrupt_state(struct radeon_device *rdev)
5529 {
5530 u32 tmp;
5531
5532 tmp = RREG32(CP_INT_CNTL_RING0) &
5533 (CNTX_BUSY_INT_ENABLE | CNTX_EMPTY_INT_ENABLE);
5534 WREG32(CP_INT_CNTL_RING0, tmp);
5535 WREG32(CP_INT_CNTL_RING1, 0);
5536 WREG32(CP_INT_CNTL_RING2, 0);
5537 tmp = RREG32(DMA_CNTL + DMA0_REGISTER_OFFSET) & ~TRAP_ENABLE;
5538 WREG32(DMA_CNTL + DMA0_REGISTER_OFFSET, tmp);
5539 tmp = RREG32(DMA_CNTL + DMA1_REGISTER_OFFSET) & ~TRAP_ENABLE;
5540 WREG32(DMA_CNTL + DMA1_REGISTER_OFFSET, tmp);
5541 WREG32(GRBM_INT_CNTL, 0);
5542 if (rdev->num_crtc >= 2) {
5543 WREG32(INT_MASK + EVERGREEN_CRTC0_REGISTER_OFFSET, 0);
5544 WREG32(INT_MASK + EVERGREEN_CRTC1_REGISTER_OFFSET, 0);
5545 }
5546 if (rdev->num_crtc >= 4) {
5547 WREG32(INT_MASK + EVERGREEN_CRTC2_REGISTER_OFFSET, 0);
5548 WREG32(INT_MASK + EVERGREEN_CRTC3_REGISTER_OFFSET, 0);
5549 }
5550 if (rdev->num_crtc >= 6) {
5551 WREG32(INT_MASK + EVERGREEN_CRTC4_REGISTER_OFFSET, 0);
5552 WREG32(INT_MASK + EVERGREEN_CRTC5_REGISTER_OFFSET, 0);
5553 }
5554
5555 if (rdev->num_crtc >= 2) {
5556 WREG32(GRPH_INT_CONTROL + EVERGREEN_CRTC0_REGISTER_OFFSET, 0);
5557 WREG32(GRPH_INT_CONTROL + EVERGREEN_CRTC1_REGISTER_OFFSET, 0);
5558 }
5559 if (rdev->num_crtc >= 4) {
5560 WREG32(GRPH_INT_CONTROL + EVERGREEN_CRTC2_REGISTER_OFFSET, 0);
5561 WREG32(GRPH_INT_CONTROL + EVERGREEN_CRTC3_REGISTER_OFFSET, 0);
5562 }
5563 if (rdev->num_crtc >= 6) {
5564 WREG32(GRPH_INT_CONTROL + EVERGREEN_CRTC4_REGISTER_OFFSET, 0);
5565 WREG32(GRPH_INT_CONTROL + EVERGREEN_CRTC5_REGISTER_OFFSET, 0);
5566 }
5567
5568 if (!ASIC_IS_NODCE(rdev)) {
5569 WREG32(DACA_AUTODETECT_INT_CONTROL, 0);
5570
5571 tmp = RREG32(DC_HPD1_INT_CONTROL) & DC_HPDx_INT_POLARITY;
5572 WREG32(DC_HPD1_INT_CONTROL, tmp);
5573 tmp = RREG32(DC_HPD2_INT_CONTROL) & DC_HPDx_INT_POLARITY;
5574 WREG32(DC_HPD2_INT_CONTROL, tmp);
5575 tmp = RREG32(DC_HPD3_INT_CONTROL) & DC_HPDx_INT_POLARITY;
5576 WREG32(DC_HPD3_INT_CONTROL, tmp);
5577 tmp = RREG32(DC_HPD4_INT_CONTROL) & DC_HPDx_INT_POLARITY;
5578 WREG32(DC_HPD4_INT_CONTROL, tmp);
5579 tmp = RREG32(DC_HPD5_INT_CONTROL) & DC_HPDx_INT_POLARITY;
5580 WREG32(DC_HPD5_INT_CONTROL, tmp);
5581 tmp = RREG32(DC_HPD6_INT_CONTROL) & DC_HPDx_INT_POLARITY;
5582 WREG32(DC_HPD6_INT_CONTROL, tmp);
5583 }
5584 }
5585
5586 static int si_irq_init(struct radeon_device *rdev)
5587 {
5588 int ret = 0;
5589 int rb_bufsz;
5590 u32 interrupt_cntl, ih_cntl, ih_rb_cntl;
5591
5592 /* allocate ring */
5593 ret = r600_ih_ring_alloc(rdev);
5594 if (ret)
5595 return ret;
5596
5597 /* disable irqs */
5598 si_disable_interrupts(rdev);
5599
5600 /* init rlc */
5601 ret = si_rlc_resume(rdev);
5602 if (ret) {
5603 r600_ih_ring_fini(rdev);
5604 return ret;
5605 }
5606
5607 /* setup interrupt control */
5608 /* set dummy read address to ring address */
5609 WREG32(INTERRUPT_CNTL2, rdev->ih.gpu_addr >> 8);
5610 interrupt_cntl = RREG32(INTERRUPT_CNTL);
5611 /* IH_DUMMY_RD_OVERRIDE=0 - dummy read disabled with msi, enabled without msi
5612 * IH_DUMMY_RD_OVERRIDE=1 - dummy read controlled by IH_DUMMY_RD_EN
5613 */
5614 interrupt_cntl &= ~IH_DUMMY_RD_OVERRIDE;
5615 /* IH_REQ_NONSNOOP_EN=1 if ring is in non-cacheable memory, e.g., vram */
5616 interrupt_cntl &= ~IH_REQ_NONSNOOP_EN;
5617 WREG32(INTERRUPT_CNTL, interrupt_cntl);
5618
5619 WREG32(IH_RB_BASE, rdev->ih.gpu_addr >> 8);
5620 rb_bufsz = order_base_2(rdev->ih.ring_size / 4);
5621
5622 ih_rb_cntl = (IH_WPTR_OVERFLOW_ENABLE |
5623 IH_WPTR_OVERFLOW_CLEAR |
5624 (rb_bufsz << 1));
5625
5626 if (rdev->wb.enabled)
5627 ih_rb_cntl |= IH_WPTR_WRITEBACK_ENABLE;
5628
5629 /* set the writeback address whether it's enabled or not */
5630 WREG32(IH_RB_WPTR_ADDR_LO, (rdev->wb.gpu_addr + R600_WB_IH_WPTR_OFFSET) & 0xFFFFFFFC);
5631 WREG32(IH_RB_WPTR_ADDR_HI, upper_32_bits(rdev->wb.gpu_addr + R600_WB_IH_WPTR_OFFSET) & 0xFF);
5632
5633 WREG32(IH_RB_CNTL, ih_rb_cntl);
5634
5635 /* set rptr, wptr to 0 */
5636 WREG32(IH_RB_RPTR, 0);
5637 WREG32(IH_RB_WPTR, 0);
5638
5639 /* Default settings for IH_CNTL (disabled at first) */
5640 ih_cntl = MC_WRREQ_CREDIT(0x10) | MC_WR_CLEAN_CNT(0x10) | MC_VMID(0);
5641 /* RPTR_REARM only works if msi's are enabled */
5642 if (rdev->msi_enabled)
5643 ih_cntl |= RPTR_REARM;
5644 WREG32(IH_CNTL, ih_cntl);
5645
5646 /* force the active interrupt state to all disabled */
5647 si_disable_interrupt_state(rdev);
5648
5649 pci_set_master(rdev->pdev);
5650
5651 /* enable irqs */
5652 si_enable_interrupts(rdev);
5653
5654 return ret;
5655 }
5656
5657 int si_irq_set(struct radeon_device *rdev)
5658 {
5659 u32 cp_int_cntl;
5660 u32 cp_int_cntl1 = 0, cp_int_cntl2 = 0;
5661 u32 crtc1 = 0, crtc2 = 0, crtc3 = 0, crtc4 = 0, crtc5 = 0, crtc6 = 0;
5662 u32 hpd1 = 0, hpd2 = 0, hpd3 = 0, hpd4 = 0, hpd5 = 0, hpd6 = 0;
5663 u32 grbm_int_cntl = 0;
5664 u32 grph1 = 0, grph2 = 0, grph3 = 0, grph4 = 0, grph5 = 0, grph6 = 0;
5665 u32 dma_cntl, dma_cntl1;
5666 u32 thermal_int = 0;
5667
5668 if (!rdev->irq.installed) {
5669 WARN(1, "Can't enable IRQ/MSI because no handler is installed\n");
5670 return -EINVAL;
5671 }
5672 /* don't enable anything if the ih is disabled */
5673 if (!rdev->ih.enabled) {
5674 si_disable_interrupts(rdev);
5675 /* force the active interrupt state to all disabled */
5676 si_disable_interrupt_state(rdev);
5677 return 0;
5678 }
5679
5680 cp_int_cntl = RREG32(CP_INT_CNTL_RING0) &
5681 (CNTX_BUSY_INT_ENABLE | CNTX_EMPTY_INT_ENABLE);
5682
5683 if (!ASIC_IS_NODCE(rdev)) {
5684 hpd1 = RREG32(DC_HPD1_INT_CONTROL) & ~DC_HPDx_INT_EN;
5685 hpd2 = RREG32(DC_HPD2_INT_CONTROL) & ~DC_HPDx_INT_EN;
5686 hpd3 = RREG32(DC_HPD3_INT_CONTROL) & ~DC_HPDx_INT_EN;
5687 hpd4 = RREG32(DC_HPD4_INT_CONTROL) & ~DC_HPDx_INT_EN;
5688 hpd5 = RREG32(DC_HPD5_INT_CONTROL) & ~DC_HPDx_INT_EN;
5689 hpd6 = RREG32(DC_HPD6_INT_CONTROL) & ~DC_HPDx_INT_EN;
5690 }
5691
5692 dma_cntl = RREG32(DMA_CNTL + DMA0_REGISTER_OFFSET) & ~TRAP_ENABLE;
5693 dma_cntl1 = RREG32(DMA_CNTL + DMA1_REGISTER_OFFSET) & ~TRAP_ENABLE;
5694
5695 thermal_int = RREG32(CG_THERMAL_INT) &
5696 ~(THERM_INT_MASK_HIGH | THERM_INT_MASK_LOW);
5697
5698 /* enable CP interrupts on all rings */
5699 if (atomic_read(&rdev->irq.ring_int[RADEON_RING_TYPE_GFX_INDEX])) {
5700 DRM_DEBUG("si_irq_set: sw int gfx\n");
5701 cp_int_cntl |= TIME_STAMP_INT_ENABLE;
5702 }
5703 if (atomic_read(&rdev->irq.ring_int[CAYMAN_RING_TYPE_CP1_INDEX])) {
5704 DRM_DEBUG("si_irq_set: sw int cp1\n");
5705 cp_int_cntl1 |= TIME_STAMP_INT_ENABLE;
5706 }
5707 if (atomic_read(&rdev->irq.ring_int[CAYMAN_RING_TYPE_CP2_INDEX])) {
5708 DRM_DEBUG("si_irq_set: sw int cp2\n");
5709 cp_int_cntl2 |= TIME_STAMP_INT_ENABLE;
5710 }
5711 if (atomic_read(&rdev->irq.ring_int[R600_RING_TYPE_DMA_INDEX])) {
5712 DRM_DEBUG("si_irq_set: sw int dma\n");
5713 dma_cntl |= TRAP_ENABLE;
5714 }
5715
5716 if (atomic_read(&rdev->irq.ring_int[CAYMAN_RING_TYPE_DMA1_INDEX])) {
5717 DRM_DEBUG("si_irq_set: sw int dma1\n");
5718 dma_cntl1 |= TRAP_ENABLE;
5719 }
5720 if (rdev->irq.crtc_vblank_int[0] ||
5721 atomic_read(&rdev->irq.pflip[0])) {
5722 DRM_DEBUG("si_irq_set: vblank 0\n");
5723 crtc1 |= VBLANK_INT_MASK;
5724 }
5725 if (rdev->irq.crtc_vblank_int[1] ||
5726 atomic_read(&rdev->irq.pflip[1])) {
5727 DRM_DEBUG("si_irq_set: vblank 1\n");
5728 crtc2 |= VBLANK_INT_MASK;
5729 }
5730 if (rdev->irq.crtc_vblank_int[2] ||
5731 atomic_read(&rdev->irq.pflip[2])) {
5732 DRM_DEBUG("si_irq_set: vblank 2\n");
5733 crtc3 |= VBLANK_INT_MASK;
5734 }
5735 if (rdev->irq.crtc_vblank_int[3] ||
5736 atomic_read(&rdev->irq.pflip[3])) {
5737 DRM_DEBUG("si_irq_set: vblank 3\n");
5738 crtc4 |= VBLANK_INT_MASK;
5739 }
5740 if (rdev->irq.crtc_vblank_int[4] ||
5741 atomic_read(&rdev->irq.pflip[4])) {
5742 DRM_DEBUG("si_irq_set: vblank 4\n");
5743 crtc5 |= VBLANK_INT_MASK;
5744 }
5745 if (rdev->irq.crtc_vblank_int[5] ||
5746 atomic_read(&rdev->irq.pflip[5])) {
5747 DRM_DEBUG("si_irq_set: vblank 5\n");
5748 crtc6 |= VBLANK_INT_MASK;
5749 }
5750 if (rdev->irq.hpd[0]) {
5751 DRM_DEBUG("si_irq_set: hpd 1\n");
5752 hpd1 |= DC_HPDx_INT_EN;
5753 }
5754 if (rdev->irq.hpd[1]) {
5755 DRM_DEBUG("si_irq_set: hpd 2\n");
5756 hpd2 |= DC_HPDx_INT_EN;
5757 }
5758 if (rdev->irq.hpd[2]) {
5759 DRM_DEBUG("si_irq_set: hpd 3\n");
5760 hpd3 |= DC_HPDx_INT_EN;
5761 }
5762 if (rdev->irq.hpd[3]) {
5763 DRM_DEBUG("si_irq_set: hpd 4\n");
5764 hpd4 |= DC_HPDx_INT_EN;
5765 }
5766 if (rdev->irq.hpd[4]) {
5767 DRM_DEBUG("si_irq_set: hpd 5\n");
5768 hpd5 |= DC_HPDx_INT_EN;
5769 }
5770 if (rdev->irq.hpd[5]) {
5771 DRM_DEBUG("si_irq_set: hpd 6\n");
5772 hpd6 |= DC_HPDx_INT_EN;
5773 }
5774
5775 WREG32(CP_INT_CNTL_RING0, cp_int_cntl);
5776 WREG32(CP_INT_CNTL_RING1, cp_int_cntl1);
5777 WREG32(CP_INT_CNTL_RING2, cp_int_cntl2);
5778
5779 WREG32(DMA_CNTL + DMA0_REGISTER_OFFSET, dma_cntl);
5780 WREG32(DMA_CNTL + DMA1_REGISTER_OFFSET, dma_cntl1);
5781
5782 WREG32(GRBM_INT_CNTL, grbm_int_cntl);
5783
5784 if (rdev->irq.dpm_thermal) {
5785 DRM_DEBUG("dpm thermal\n");
5786 thermal_int |= THERM_INT_MASK_HIGH | THERM_INT_MASK_LOW;
5787 }
5788
5789 if (rdev->num_crtc >= 2) {
5790 WREG32(INT_MASK + EVERGREEN_CRTC0_REGISTER_OFFSET, crtc1);
5791 WREG32(INT_MASK + EVERGREEN_CRTC1_REGISTER_OFFSET, crtc2);
5792 }
5793 if (rdev->num_crtc >= 4) {
5794 WREG32(INT_MASK + EVERGREEN_CRTC2_REGISTER_OFFSET, crtc3);
5795 WREG32(INT_MASK + EVERGREEN_CRTC3_REGISTER_OFFSET, crtc4);
5796 }
5797 if (rdev->num_crtc >= 6) {
5798 WREG32(INT_MASK + EVERGREEN_CRTC4_REGISTER_OFFSET, crtc5);
5799 WREG32(INT_MASK + EVERGREEN_CRTC5_REGISTER_OFFSET, crtc6);
5800 }
5801
5802 if (rdev->num_crtc >= 2) {
5803 WREG32(GRPH_INT_CONTROL + EVERGREEN_CRTC0_REGISTER_OFFSET, grph1);
5804 WREG32(GRPH_INT_CONTROL + EVERGREEN_CRTC1_REGISTER_OFFSET, grph2);
5805 }
5806 if (rdev->num_crtc >= 4) {
5807 WREG32(GRPH_INT_CONTROL + EVERGREEN_CRTC2_REGISTER_OFFSET, grph3);
5808 WREG32(GRPH_INT_CONTROL + EVERGREEN_CRTC3_REGISTER_OFFSET, grph4);
5809 }
5810 if (rdev->num_crtc >= 6) {
5811 WREG32(GRPH_INT_CONTROL + EVERGREEN_CRTC4_REGISTER_OFFSET, grph5);
5812 WREG32(GRPH_INT_CONTROL + EVERGREEN_CRTC5_REGISTER_OFFSET, grph6);
5813 }
5814
5815 if (!ASIC_IS_NODCE(rdev)) {
5816 WREG32(DC_HPD1_INT_CONTROL, hpd1);
5817 WREG32(DC_HPD2_INT_CONTROL, hpd2);
5818 WREG32(DC_HPD3_INT_CONTROL, hpd3);
5819 WREG32(DC_HPD4_INT_CONTROL, hpd4);
5820 WREG32(DC_HPD5_INT_CONTROL, hpd5);
5821 WREG32(DC_HPD6_INT_CONTROL, hpd6);
5822 }
5823
5824 WREG32(CG_THERMAL_INT, thermal_int);
5825
5826 return 0;
5827 }
5828
5829 static inline void si_irq_ack(struct radeon_device *rdev)
5830 {
5831 u32 tmp;
5832
5833 if (ASIC_IS_NODCE(rdev))
5834 return;
5835
5836 rdev->irq.stat_regs.evergreen.disp_int = RREG32(DISP_INTERRUPT_STATUS);
5837 rdev->irq.stat_regs.evergreen.disp_int_cont = RREG32(DISP_INTERRUPT_STATUS_CONTINUE);
5838 rdev->irq.stat_regs.evergreen.disp_int_cont2 = RREG32(DISP_INTERRUPT_STATUS_CONTINUE2);
5839 rdev->irq.stat_regs.evergreen.disp_int_cont3 = RREG32(DISP_INTERRUPT_STATUS_CONTINUE3);
5840 rdev->irq.stat_regs.evergreen.disp_int_cont4 = RREG32(DISP_INTERRUPT_STATUS_CONTINUE4);
5841 rdev->irq.stat_regs.evergreen.disp_int_cont5 = RREG32(DISP_INTERRUPT_STATUS_CONTINUE5);
5842 rdev->irq.stat_regs.evergreen.d1grph_int = RREG32(GRPH_INT_STATUS + EVERGREEN_CRTC0_REGISTER_OFFSET);
5843 rdev->irq.stat_regs.evergreen.d2grph_int = RREG32(GRPH_INT_STATUS + EVERGREEN_CRTC1_REGISTER_OFFSET);
5844 if (rdev->num_crtc >= 4) {
5845 rdev->irq.stat_regs.evergreen.d3grph_int = RREG32(GRPH_INT_STATUS + EVERGREEN_CRTC2_REGISTER_OFFSET);
5846 rdev->irq.stat_regs.evergreen.d4grph_int = RREG32(GRPH_INT_STATUS + EVERGREEN_CRTC3_REGISTER_OFFSET);
5847 }
5848 if (rdev->num_crtc >= 6) {
5849 rdev->irq.stat_regs.evergreen.d5grph_int = RREG32(GRPH_INT_STATUS + EVERGREEN_CRTC4_REGISTER_OFFSET);
5850 rdev->irq.stat_regs.evergreen.d6grph_int = RREG32(GRPH_INT_STATUS + EVERGREEN_CRTC5_REGISTER_OFFSET);
5851 }
5852
5853 if (rdev->irq.stat_regs.evergreen.d1grph_int & GRPH_PFLIP_INT_OCCURRED)
5854 WREG32(GRPH_INT_STATUS + EVERGREEN_CRTC0_REGISTER_OFFSET, GRPH_PFLIP_INT_CLEAR);
5855 if (rdev->irq.stat_regs.evergreen.d2grph_int & GRPH_PFLIP_INT_OCCURRED)
5856 WREG32(GRPH_INT_STATUS + EVERGREEN_CRTC1_REGISTER_OFFSET, GRPH_PFLIP_INT_CLEAR);
5857 if (rdev->irq.stat_regs.evergreen.disp_int & LB_D1_VBLANK_INTERRUPT)
5858 WREG32(VBLANK_STATUS + EVERGREEN_CRTC0_REGISTER_OFFSET, VBLANK_ACK);
5859 if (rdev->irq.stat_regs.evergreen.disp_int & LB_D1_VLINE_INTERRUPT)
5860 WREG32(VLINE_STATUS + EVERGREEN_CRTC0_REGISTER_OFFSET, VLINE_ACK);
5861 if (rdev->irq.stat_regs.evergreen.disp_int_cont & LB_D2_VBLANK_INTERRUPT)
5862 WREG32(VBLANK_STATUS + EVERGREEN_CRTC1_REGISTER_OFFSET, VBLANK_ACK);
5863 if (rdev->irq.stat_regs.evergreen.disp_int_cont & LB_D2_VLINE_INTERRUPT)
5864 WREG32(VLINE_STATUS + EVERGREEN_CRTC1_REGISTER_OFFSET, VLINE_ACK);
5865
5866 if (rdev->num_crtc >= 4) {
5867 if (rdev->irq.stat_regs.evergreen.d3grph_int & GRPH_PFLIP_INT_OCCURRED)
5868 WREG32(GRPH_INT_STATUS + EVERGREEN_CRTC2_REGISTER_OFFSET, GRPH_PFLIP_INT_CLEAR);
5869 if (rdev->irq.stat_regs.evergreen.d4grph_int & GRPH_PFLIP_INT_OCCURRED)
5870 WREG32(GRPH_INT_STATUS + EVERGREEN_CRTC3_REGISTER_OFFSET, GRPH_PFLIP_INT_CLEAR);
5871 if (rdev->irq.stat_regs.evergreen.disp_int_cont2 & LB_D3_VBLANK_INTERRUPT)
5872 WREG32(VBLANK_STATUS + EVERGREEN_CRTC2_REGISTER_OFFSET, VBLANK_ACK);
5873 if (rdev->irq.stat_regs.evergreen.disp_int_cont2 & LB_D3_VLINE_INTERRUPT)
5874 WREG32(VLINE_STATUS + EVERGREEN_CRTC2_REGISTER_OFFSET, VLINE_ACK);
5875 if (rdev->irq.stat_regs.evergreen.disp_int_cont3 & LB_D4_VBLANK_INTERRUPT)
5876 WREG32(VBLANK_STATUS + EVERGREEN_CRTC3_REGISTER_OFFSET, VBLANK_ACK);
5877 if (rdev->irq.stat_regs.evergreen.disp_int_cont3 & LB_D4_VLINE_INTERRUPT)
5878 WREG32(VLINE_STATUS + EVERGREEN_CRTC3_REGISTER_OFFSET, VLINE_ACK);
5879 }
5880
5881 if (rdev->num_crtc >= 6) {
5882 if (rdev->irq.stat_regs.evergreen.d5grph_int & GRPH_PFLIP_INT_OCCURRED)
5883 WREG32(GRPH_INT_STATUS + EVERGREEN_CRTC4_REGISTER_OFFSET, GRPH_PFLIP_INT_CLEAR);
5884 if (rdev->irq.stat_regs.evergreen.d6grph_int & GRPH_PFLIP_INT_OCCURRED)
5885 WREG32(GRPH_INT_STATUS + EVERGREEN_CRTC5_REGISTER_OFFSET, GRPH_PFLIP_INT_CLEAR);
5886 if (rdev->irq.stat_regs.evergreen.disp_int_cont4 & LB_D5_VBLANK_INTERRUPT)
5887 WREG32(VBLANK_STATUS + EVERGREEN_CRTC4_REGISTER_OFFSET, VBLANK_ACK);
5888 if (rdev->irq.stat_regs.evergreen.disp_int_cont4 & LB_D5_VLINE_INTERRUPT)
5889 WREG32(VLINE_STATUS + EVERGREEN_CRTC4_REGISTER_OFFSET, VLINE_ACK);
5890 if (rdev->irq.stat_regs.evergreen.disp_int_cont5 & LB_D6_VBLANK_INTERRUPT)
5891 WREG32(VBLANK_STATUS + EVERGREEN_CRTC5_REGISTER_OFFSET, VBLANK_ACK);
5892 if (rdev->irq.stat_regs.evergreen.disp_int_cont5 & LB_D6_VLINE_INTERRUPT)
5893 WREG32(VLINE_STATUS + EVERGREEN_CRTC5_REGISTER_OFFSET, VLINE_ACK);
5894 }
5895
5896 if (rdev->irq.stat_regs.evergreen.disp_int & DC_HPD1_INTERRUPT) {
5897 tmp = RREG32(DC_HPD1_INT_CONTROL);
5898 tmp |= DC_HPDx_INT_ACK;
5899 WREG32(DC_HPD1_INT_CONTROL, tmp);
5900 }
5901 if (rdev->irq.stat_regs.evergreen.disp_int_cont & DC_HPD2_INTERRUPT) {
5902 tmp = RREG32(DC_HPD2_INT_CONTROL);
5903 tmp |= DC_HPDx_INT_ACK;
5904 WREG32(DC_HPD2_INT_CONTROL, tmp);
5905 }
5906 if (rdev->irq.stat_regs.evergreen.disp_int_cont2 & DC_HPD3_INTERRUPT) {
5907 tmp = RREG32(DC_HPD3_INT_CONTROL);
5908 tmp |= DC_HPDx_INT_ACK;
5909 WREG32(DC_HPD3_INT_CONTROL, tmp);
5910 }
5911 if (rdev->irq.stat_regs.evergreen.disp_int_cont3 & DC_HPD4_INTERRUPT) {
5912 tmp = RREG32(DC_HPD4_INT_CONTROL);
5913 tmp |= DC_HPDx_INT_ACK;
5914 WREG32(DC_HPD4_INT_CONTROL, tmp);
5915 }
5916 if (rdev->irq.stat_regs.evergreen.disp_int_cont4 & DC_HPD5_INTERRUPT) {
5917 tmp = RREG32(DC_HPD5_INT_CONTROL);
5918 tmp |= DC_HPDx_INT_ACK;
5919 WREG32(DC_HPD5_INT_CONTROL, tmp);
5920 }
5921 if (rdev->irq.stat_regs.evergreen.disp_int_cont5 & DC_HPD6_INTERRUPT) {
5922 tmp = RREG32(DC_HPD5_INT_CONTROL);
5923 tmp |= DC_HPDx_INT_ACK;
5924 WREG32(DC_HPD6_INT_CONTROL, tmp);
5925 }
5926 }
5927
5928 static void si_irq_disable(struct radeon_device *rdev)
5929 {
5930 si_disable_interrupts(rdev);
5931 /* Wait and acknowledge irq */
5932 mdelay(1);
5933 si_irq_ack(rdev);
5934 si_disable_interrupt_state(rdev);
5935 }
5936
5937 static void si_irq_suspend(struct radeon_device *rdev)
5938 {
5939 si_irq_disable(rdev);
5940 si_rlc_stop(rdev);
5941 }
5942
5943 static void si_irq_fini(struct radeon_device *rdev)
5944 {
5945 si_irq_suspend(rdev);
5946 r600_ih_ring_fini(rdev);
5947 }
5948
5949 static inline u32 si_get_ih_wptr(struct radeon_device *rdev)
5950 {
5951 u32 wptr, tmp;
5952
5953 if (rdev->wb.enabled)
5954 wptr = le32_to_cpu(rdev->wb.wb[R600_WB_IH_WPTR_OFFSET/4]);
5955 else
5956 wptr = RREG32(IH_RB_WPTR);
5957
5958 if (wptr & RB_OVERFLOW) {
5959 /* When a ring buffer overflow happen start parsing interrupt
5960 * from the last not overwritten vector (wptr + 16). Hopefully
5961 * this should allow us to catchup.
5962 */
5963 dev_warn(rdev->dev, "IH ring buffer overflow (0x%08X, %d, %d)\n",
5964 wptr, rdev->ih.rptr, (wptr + 16) + rdev->ih.ptr_mask);
5965 rdev->ih.rptr = (wptr + 16) & rdev->ih.ptr_mask;
5966 tmp = RREG32(IH_RB_CNTL);
5967 tmp |= IH_WPTR_OVERFLOW_CLEAR;
5968 WREG32(IH_RB_CNTL, tmp);
5969 }
5970 return (wptr & rdev->ih.ptr_mask);
5971 }
5972
5973 /* SI IV Ring
5974 * Each IV ring entry is 128 bits:
5975 * [7:0] - interrupt source id
5976 * [31:8] - reserved
5977 * [59:32] - interrupt source data
5978 * [63:60] - reserved
5979 * [71:64] - RINGID
5980 * [79:72] - VMID
5981 * [127:80] - reserved
5982 */
5983 int si_irq_process(struct radeon_device *rdev)
5984 {
5985 u32 wptr;
5986 u32 rptr;
5987 u32 src_id, src_data, ring_id;
5988 u32 ring_index;
5989 bool queue_hotplug = false;
5990 bool queue_thermal = false;
5991 u32 status, addr;
5992
5993 if (!rdev->ih.enabled || rdev->shutdown)
5994 return IRQ_NONE;
5995
5996 wptr = si_get_ih_wptr(rdev);
5997
5998 restart_ih:
5999 /* is somebody else already processing irqs? */
6000 if (atomic_xchg(&rdev->ih.lock, 1))
6001 return IRQ_NONE;
6002
6003 rptr = rdev->ih.rptr;
6004 DRM_DEBUG("si_irq_process start: rptr %d, wptr %d\n", rptr, wptr);
6005
6006 /* Order reading of wptr vs. reading of IH ring data */
6007 rmb();
6008
6009 /* display interrupts */
6010 si_irq_ack(rdev);
6011
6012 while (rptr != wptr) {
6013 /* wptr/rptr are in bytes! */
6014 ring_index = rptr / 4;
6015 src_id = le32_to_cpu(rdev->ih.ring[ring_index]) & 0xff;
6016 src_data = le32_to_cpu(rdev->ih.ring[ring_index + 1]) & 0xfffffff;
6017 ring_id = le32_to_cpu(rdev->ih.ring[ring_index + 2]) & 0xff;
6018
6019 switch (src_id) {
6020 case 1: /* D1 vblank/vline */
6021 switch (src_data) {
6022 case 0: /* D1 vblank */
6023 if (rdev->irq.stat_regs.evergreen.disp_int & LB_D1_VBLANK_INTERRUPT) {
6024 if (rdev->irq.crtc_vblank_int[0]) {
6025 drm_handle_vblank(rdev->ddev, 0);
6026 rdev->pm.vblank_sync = true;
6027 wake_up(&rdev->irq.vblank_queue);
6028 }
6029 if (atomic_read(&rdev->irq.pflip[0]))
6030 radeon_crtc_handle_flip(rdev, 0);
6031 rdev->irq.stat_regs.evergreen.disp_int &= ~LB_D1_VBLANK_INTERRUPT;
6032 DRM_DEBUG("IH: D1 vblank\n");
6033 }
6034 break;
6035 case 1: /* D1 vline */
6036 if (rdev->irq.stat_regs.evergreen.disp_int & LB_D1_VLINE_INTERRUPT) {
6037 rdev->irq.stat_regs.evergreen.disp_int &= ~LB_D1_VLINE_INTERRUPT;
6038 DRM_DEBUG("IH: D1 vline\n");
6039 }
6040 break;
6041 default:
6042 DRM_DEBUG("Unhandled interrupt: %d %d\n", src_id, src_data);
6043 break;
6044 }
6045 break;
6046 case 2: /* D2 vblank/vline */
6047 switch (src_data) {
6048 case 0: /* D2 vblank */
6049 if (rdev->irq.stat_regs.evergreen.disp_int_cont & LB_D2_VBLANK_INTERRUPT) {
6050 if (rdev->irq.crtc_vblank_int[1]) {
6051 drm_handle_vblank(rdev->ddev, 1);
6052 rdev->pm.vblank_sync = true;
6053 wake_up(&rdev->irq.vblank_queue);
6054 }
6055 if (atomic_read(&rdev->irq.pflip[1]))
6056 radeon_crtc_handle_flip(rdev, 1);
6057 rdev->irq.stat_regs.evergreen.disp_int_cont &= ~LB_D2_VBLANK_INTERRUPT;
6058 DRM_DEBUG("IH: D2 vblank\n");
6059 }
6060 break;
6061 case 1: /* D2 vline */
6062 if (rdev->irq.stat_regs.evergreen.disp_int_cont & LB_D2_VLINE_INTERRUPT) {
6063 rdev->irq.stat_regs.evergreen.disp_int_cont &= ~LB_D2_VLINE_INTERRUPT;
6064 DRM_DEBUG("IH: D2 vline\n");
6065 }
6066 break;
6067 default:
6068 DRM_DEBUG("Unhandled interrupt: %d %d\n", src_id, src_data);
6069 break;
6070 }
6071 break;
6072 case 3: /* D3 vblank/vline */
6073 switch (src_data) {
6074 case 0: /* D3 vblank */
6075 if (rdev->irq.stat_regs.evergreen.disp_int_cont2 & LB_D3_VBLANK_INTERRUPT) {
6076 if (rdev->irq.crtc_vblank_int[2]) {
6077 drm_handle_vblank(rdev->ddev, 2);
6078 rdev->pm.vblank_sync = true;
6079 wake_up(&rdev->irq.vblank_queue);
6080 }
6081 if (atomic_read(&rdev->irq.pflip[2]))
6082 radeon_crtc_handle_flip(rdev, 2);
6083 rdev->irq.stat_regs.evergreen.disp_int_cont2 &= ~LB_D3_VBLANK_INTERRUPT;
6084 DRM_DEBUG("IH: D3 vblank\n");
6085 }
6086 break;
6087 case 1: /* D3 vline */
6088 if (rdev->irq.stat_regs.evergreen.disp_int_cont2 & LB_D3_VLINE_INTERRUPT) {
6089 rdev->irq.stat_regs.evergreen.disp_int_cont2 &= ~LB_D3_VLINE_INTERRUPT;
6090 DRM_DEBUG("IH: D3 vline\n");
6091 }
6092 break;
6093 default:
6094 DRM_DEBUG("Unhandled interrupt: %d %d\n", src_id, src_data);
6095 break;
6096 }
6097 break;
6098 case 4: /* D4 vblank/vline */
6099 switch (src_data) {
6100 case 0: /* D4 vblank */
6101 if (rdev->irq.stat_regs.evergreen.disp_int_cont3 & LB_D4_VBLANK_INTERRUPT) {
6102 if (rdev->irq.crtc_vblank_int[3]) {
6103 drm_handle_vblank(rdev->ddev, 3);
6104 rdev->pm.vblank_sync = true;
6105 wake_up(&rdev->irq.vblank_queue);
6106 }
6107 if (atomic_read(&rdev->irq.pflip[3]))
6108 radeon_crtc_handle_flip(rdev, 3);
6109 rdev->irq.stat_regs.evergreen.disp_int_cont3 &= ~LB_D4_VBLANK_INTERRUPT;
6110 DRM_DEBUG("IH: D4 vblank\n");
6111 }
6112 break;
6113 case 1: /* D4 vline */
6114 if (rdev->irq.stat_regs.evergreen.disp_int_cont3 & LB_D4_VLINE_INTERRUPT) {
6115 rdev->irq.stat_regs.evergreen.disp_int_cont3 &= ~LB_D4_VLINE_INTERRUPT;
6116 DRM_DEBUG("IH: D4 vline\n");
6117 }
6118 break;
6119 default:
6120 DRM_DEBUG("Unhandled interrupt: %d %d\n", src_id, src_data);
6121 break;
6122 }
6123 break;
6124 case 5: /* D5 vblank/vline */
6125 switch (src_data) {
6126 case 0: /* D5 vblank */
6127 if (rdev->irq.stat_regs.evergreen.disp_int_cont4 & LB_D5_VBLANK_INTERRUPT) {
6128 if (rdev->irq.crtc_vblank_int[4]) {
6129 drm_handle_vblank(rdev->ddev, 4);
6130 rdev->pm.vblank_sync = true;
6131 wake_up(&rdev->irq.vblank_queue);
6132 }
6133 if (atomic_read(&rdev->irq.pflip[4]))
6134 radeon_crtc_handle_flip(rdev, 4);
6135 rdev->irq.stat_regs.evergreen.disp_int_cont4 &= ~LB_D5_VBLANK_INTERRUPT;
6136 DRM_DEBUG("IH: D5 vblank\n");
6137 }
6138 break;
6139 case 1: /* D5 vline */
6140 if (rdev->irq.stat_regs.evergreen.disp_int_cont4 & LB_D5_VLINE_INTERRUPT) {
6141 rdev->irq.stat_regs.evergreen.disp_int_cont4 &= ~LB_D5_VLINE_INTERRUPT;
6142 DRM_DEBUG("IH: D5 vline\n");
6143 }
6144 break;
6145 default:
6146 DRM_DEBUG("Unhandled interrupt: %d %d\n", src_id, src_data);
6147 break;
6148 }
6149 break;
6150 case 6: /* D6 vblank/vline */
6151 switch (src_data) {
6152 case 0: /* D6 vblank */
6153 if (rdev->irq.stat_regs.evergreen.disp_int_cont5 & LB_D6_VBLANK_INTERRUPT) {
6154 if (rdev->irq.crtc_vblank_int[5]) {
6155 drm_handle_vblank(rdev->ddev, 5);
6156 rdev->pm.vblank_sync = true;
6157 wake_up(&rdev->irq.vblank_queue);
6158 }
6159 if (atomic_read(&rdev->irq.pflip[5]))
6160 radeon_crtc_handle_flip(rdev, 5);
6161 rdev->irq.stat_regs.evergreen.disp_int_cont5 &= ~LB_D6_VBLANK_INTERRUPT;
6162 DRM_DEBUG("IH: D6 vblank\n");
6163 }
6164 break;
6165 case 1: /* D6 vline */
6166 if (rdev->irq.stat_regs.evergreen.disp_int_cont5 & LB_D6_VLINE_INTERRUPT) {
6167 rdev->irq.stat_regs.evergreen.disp_int_cont5 &= ~LB_D6_VLINE_INTERRUPT;
6168 DRM_DEBUG("IH: D6 vline\n");
6169 }
6170 break;
6171 default:
6172 DRM_DEBUG("Unhandled interrupt: %d %d\n", src_id, src_data);
6173 break;
6174 }
6175 break;
6176 case 42: /* HPD hotplug */
6177 switch (src_data) {
6178 case 0:
6179 if (rdev->irq.stat_regs.evergreen.disp_int & DC_HPD1_INTERRUPT) {
6180 rdev->irq.stat_regs.evergreen.disp_int &= ~DC_HPD1_INTERRUPT;
6181 queue_hotplug = true;
6182 DRM_DEBUG("IH: HPD1\n");
6183 }
6184 break;
6185 case 1:
6186 if (rdev->irq.stat_regs.evergreen.disp_int_cont & DC_HPD2_INTERRUPT) {
6187 rdev->irq.stat_regs.evergreen.disp_int_cont &= ~DC_HPD2_INTERRUPT;
6188 queue_hotplug = true;
6189 DRM_DEBUG("IH: HPD2\n");
6190 }
6191 break;
6192 case 2:
6193 if (rdev->irq.stat_regs.evergreen.disp_int_cont2 & DC_HPD3_INTERRUPT) {
6194 rdev->irq.stat_regs.evergreen.disp_int_cont2 &= ~DC_HPD3_INTERRUPT;
6195 queue_hotplug = true;
6196 DRM_DEBUG("IH: HPD3\n");
6197 }
6198 break;
6199 case 3:
6200 if (rdev->irq.stat_regs.evergreen.disp_int_cont3 & DC_HPD4_INTERRUPT) {
6201 rdev->irq.stat_regs.evergreen.disp_int_cont3 &= ~DC_HPD4_INTERRUPT;
6202 queue_hotplug = true;
6203 DRM_DEBUG("IH: HPD4\n");
6204 }
6205 break;
6206 case 4:
6207 if (rdev->irq.stat_regs.evergreen.disp_int_cont4 & DC_HPD5_INTERRUPT) {
6208 rdev->irq.stat_regs.evergreen.disp_int_cont4 &= ~DC_HPD5_INTERRUPT;
6209 queue_hotplug = true;
6210 DRM_DEBUG("IH: HPD5\n");
6211 }
6212 break;
6213 case 5:
6214 if (rdev->irq.stat_regs.evergreen.disp_int_cont5 & DC_HPD6_INTERRUPT) {
6215 rdev->irq.stat_regs.evergreen.disp_int_cont5 &= ~DC_HPD6_INTERRUPT;
6216 queue_hotplug = true;
6217 DRM_DEBUG("IH: HPD6\n");
6218 }
6219 break;
6220 default:
6221 DRM_DEBUG("Unhandled interrupt: %d %d\n", src_id, src_data);
6222 break;
6223 }
6224 break;
6225 case 146:
6226 case 147:
6227 addr = RREG32(VM_CONTEXT1_PROTECTION_FAULT_ADDR);
6228 status = RREG32(VM_CONTEXT1_PROTECTION_FAULT_STATUS);
6229 dev_err(rdev->dev, "GPU fault detected: %d 0x%08x\n", src_id, src_data);
6230 dev_err(rdev->dev, " VM_CONTEXT1_PROTECTION_FAULT_ADDR 0x%08X\n",
6231 addr);
6232 dev_err(rdev->dev, " VM_CONTEXT1_PROTECTION_FAULT_STATUS 0x%08X\n",
6233 status);
6234 si_vm_decode_fault(rdev, status, addr);
6235 /* reset addr and status */
6236 WREG32_P(VM_CONTEXT1_CNTL2, 1, ~1);
6237 break;
6238 case 176: /* RINGID0 CP_INT */
6239 radeon_fence_process(rdev, RADEON_RING_TYPE_GFX_INDEX);
6240 break;
6241 case 177: /* RINGID1 CP_INT */
6242 radeon_fence_process(rdev, CAYMAN_RING_TYPE_CP1_INDEX);
6243 break;
6244 case 178: /* RINGID2 CP_INT */
6245 radeon_fence_process(rdev, CAYMAN_RING_TYPE_CP2_INDEX);
6246 break;
6247 case 181: /* CP EOP event */
6248 DRM_DEBUG("IH: CP EOP\n");
6249 switch (ring_id) {
6250 case 0:
6251 radeon_fence_process(rdev, RADEON_RING_TYPE_GFX_INDEX);
6252 break;
6253 case 1:
6254 radeon_fence_process(rdev, CAYMAN_RING_TYPE_CP1_INDEX);
6255 break;
6256 case 2:
6257 radeon_fence_process(rdev, CAYMAN_RING_TYPE_CP2_INDEX);
6258 break;
6259 }
6260 break;
6261 case 224: /* DMA trap event */
6262 DRM_DEBUG("IH: DMA trap\n");
6263 radeon_fence_process(rdev, R600_RING_TYPE_DMA_INDEX);
6264 break;
6265 case 230: /* thermal low to high */
6266 DRM_DEBUG("IH: thermal low to high\n");
6267 rdev->pm.dpm.thermal.high_to_low = false;
6268 queue_thermal = true;
6269 break;
6270 case 231: /* thermal high to low */
6271 DRM_DEBUG("IH: thermal high to low\n");
6272 rdev->pm.dpm.thermal.high_to_low = true;
6273 queue_thermal = true;
6274 break;
6275 case 233: /* GUI IDLE */
6276 DRM_DEBUG("IH: GUI idle\n");
6277 break;
6278 case 244: /* DMA trap event */
6279 DRM_DEBUG("IH: DMA1 trap\n");
6280 radeon_fence_process(rdev, CAYMAN_RING_TYPE_DMA1_INDEX);
6281 break;
6282 default:
6283 DRM_DEBUG("Unhandled interrupt: %d %d\n", src_id, src_data);
6284 break;
6285 }
6286
6287 /* wptr/rptr are in bytes! */
6288 rptr += 16;
6289 rptr &= rdev->ih.ptr_mask;
6290 }
6291 if (queue_hotplug)
6292 schedule_work(&rdev->hotplug_work);
6293 if (queue_thermal && rdev->pm.dpm_enabled)
6294 schedule_work(&rdev->pm.dpm.thermal.work);
6295 rdev->ih.rptr = rptr;
6296 WREG32(IH_RB_RPTR, rdev->ih.rptr);
6297 atomic_set(&rdev->ih.lock, 0);
6298
6299 /* make sure wptr hasn't changed while processing */
6300 wptr = si_get_ih_wptr(rdev);
6301 if (wptr != rptr)
6302 goto restart_ih;
6303
6304 return IRQ_HANDLED;
6305 }
6306
6307 /*
6308 * startup/shutdown callbacks
6309 */
6310 static int si_startup(struct radeon_device *rdev)
6311 {
6312 struct radeon_ring *ring;
6313 int r;
6314
6315 /* enable pcie gen2/3 link */
6316 si_pcie_gen3_enable(rdev);
6317 /* enable aspm */
6318 si_program_aspm(rdev);
6319
6320 /* scratch needs to be initialized before MC */
6321 r = r600_vram_scratch_init(rdev);
6322 if (r)
6323 return r;
6324
6325 si_mc_program(rdev);
6326
6327 if (!rdev->me_fw || !rdev->pfp_fw || !rdev->ce_fw ||
6328 !rdev->rlc_fw || !rdev->mc_fw) {
6329 r = si_init_microcode(rdev);
6330 if (r) {
6331 DRM_ERROR("Failed to load firmware!\n");
6332 return r;
6333 }
6334 }
6335
6336 r = si_mc_load_microcode(rdev);
6337 if (r) {
6338 DRM_ERROR("Failed to load MC firmware!\n");
6339 return r;
6340 }
6341
6342 r = si_pcie_gart_enable(rdev);
6343 if (r)
6344 return r;
6345 si_gpu_init(rdev);
6346
6347 /* allocate rlc buffers */
6348 if (rdev->family == CHIP_VERDE) {
6349 rdev->rlc.reg_list = verde_rlc_save_restore_register_list;
6350 rdev->rlc.reg_list_size =
6351 (u32)ARRAY_SIZE(verde_rlc_save_restore_register_list);
6352 }
6353 rdev->rlc.cs_data = si_cs_data;
6354 r = sumo_rlc_init(rdev);
6355 if (r) {
6356 DRM_ERROR("Failed to init rlc BOs!\n");
6357 return r;
6358 }
6359
6360 /* allocate wb buffer */
6361 r = radeon_wb_init(rdev);
6362 if (r)
6363 return r;
6364
6365 r = radeon_fence_driver_start_ring(rdev, RADEON_RING_TYPE_GFX_INDEX);
6366 if (r) {
6367 dev_err(rdev->dev, "failed initializing CP fences (%d).\n", r);
6368 return r;
6369 }
6370
6371 r = radeon_fence_driver_start_ring(rdev, CAYMAN_RING_TYPE_CP1_INDEX);
6372 if (r) {
6373 dev_err(rdev->dev, "failed initializing CP fences (%d).\n", r);
6374 return r;
6375 }
6376
6377 r = radeon_fence_driver_start_ring(rdev, CAYMAN_RING_TYPE_CP2_INDEX);
6378 if (r) {
6379 dev_err(rdev->dev, "failed initializing CP fences (%d).\n", r);
6380 return r;
6381 }
6382
6383 r = radeon_fence_driver_start_ring(rdev, R600_RING_TYPE_DMA_INDEX);
6384 if (r) {
6385 dev_err(rdev->dev, "failed initializing DMA fences (%d).\n", r);
6386 return r;
6387 }
6388
6389 r = radeon_fence_driver_start_ring(rdev, CAYMAN_RING_TYPE_DMA1_INDEX);
6390 if (r) {
6391 dev_err(rdev->dev, "failed initializing DMA fences (%d).\n", r);
6392 return r;
6393 }
6394
6395 if (rdev->has_uvd) {
6396 r = uvd_v2_2_resume(rdev);
6397 if (!r) {
6398 r = radeon_fence_driver_start_ring(rdev,
6399 R600_RING_TYPE_UVD_INDEX);
6400 if (r)
6401 dev_err(rdev->dev, "UVD fences init error (%d).\n", r);
6402 }
6403 if (r)
6404 rdev->ring[R600_RING_TYPE_UVD_INDEX].ring_size = 0;
6405 }
6406
6407 /* Enable IRQ */
6408 if (!rdev->irq.installed) {
6409 r = radeon_irq_kms_init(rdev);
6410 if (r)
6411 return r;
6412 }
6413
6414 r = si_irq_init(rdev);
6415 if (r) {
6416 DRM_ERROR("radeon: IH init failed (%d).\n", r);
6417 radeon_irq_kms_fini(rdev);
6418 return r;
6419 }
6420 si_irq_set(rdev);
6421
6422 ring = &rdev->ring[RADEON_RING_TYPE_GFX_INDEX];
6423 r = radeon_ring_init(rdev, ring, ring->ring_size, RADEON_WB_CP_RPTR_OFFSET,
6424 CP_RB0_RPTR, CP_RB0_WPTR,
6425 RADEON_CP_PACKET2);
6426 if (r)
6427 return r;
6428
6429 ring = &rdev->ring[CAYMAN_RING_TYPE_CP1_INDEX];
6430 r = radeon_ring_init(rdev, ring, ring->ring_size, RADEON_WB_CP1_RPTR_OFFSET,
6431 CP_RB1_RPTR, CP_RB1_WPTR,
6432 RADEON_CP_PACKET2);
6433 if (r)
6434 return r;
6435
6436 ring = &rdev->ring[CAYMAN_RING_TYPE_CP2_INDEX];
6437 r = radeon_ring_init(rdev, ring, ring->ring_size, RADEON_WB_CP2_RPTR_OFFSET,
6438 CP_RB2_RPTR, CP_RB2_WPTR,
6439 RADEON_CP_PACKET2);
6440 if (r)
6441 return r;
6442
6443 ring = &rdev->ring[R600_RING_TYPE_DMA_INDEX];
6444 r = radeon_ring_init(rdev, ring, ring->ring_size, R600_WB_DMA_RPTR_OFFSET,
6445 DMA_RB_RPTR + DMA0_REGISTER_OFFSET,
6446 DMA_RB_WPTR + DMA0_REGISTER_OFFSET,
6447 DMA_PACKET(DMA_PACKET_NOP, 0, 0, 0, 0));
6448 if (r)
6449 return r;
6450
6451 ring = &rdev->ring[CAYMAN_RING_TYPE_DMA1_INDEX];
6452 r = radeon_ring_init(rdev, ring, ring->ring_size, CAYMAN_WB_DMA1_RPTR_OFFSET,
6453 DMA_RB_RPTR + DMA1_REGISTER_OFFSET,
6454 DMA_RB_WPTR + DMA1_REGISTER_OFFSET,
6455 DMA_PACKET(DMA_PACKET_NOP, 0, 0, 0, 0));
6456 if (r)
6457 return r;
6458
6459 r = si_cp_load_microcode(rdev);
6460 if (r)
6461 return r;
6462 r = si_cp_resume(rdev);
6463 if (r)
6464 return r;
6465
6466 r = cayman_dma_resume(rdev);
6467 if (r)
6468 return r;
6469
6470 if (rdev->has_uvd) {
6471 ring = &rdev->ring[R600_RING_TYPE_UVD_INDEX];
6472 if (ring->ring_size) {
6473 r = radeon_ring_init(rdev, ring, ring->ring_size, 0,
6474 UVD_RBC_RB_RPTR, UVD_RBC_RB_WPTR,
6475 RADEON_CP_PACKET2);
6476 if (!r)
6477 r = uvd_v1_0_init(rdev);
6478 if (r)
6479 DRM_ERROR("radeon: failed initializing UVD (%d).\n", r);
6480 }
6481 }
6482
6483 r = radeon_ib_pool_init(rdev);
6484 if (r) {
6485 dev_err(rdev->dev, "IB initialization failed (%d).\n", r);
6486 return r;
6487 }
6488
6489 r = radeon_vm_manager_init(rdev);
6490 if (r) {
6491 dev_err(rdev->dev, "vm manager initialization failed (%d).\n", r);
6492 return r;
6493 }
6494
6495 r = dce6_audio_init(rdev);
6496 if (r)
6497 return r;
6498
6499 return 0;
6500 }
6501
6502 int si_resume(struct radeon_device *rdev)
6503 {
6504 int r;
6505
6506 /* Do not reset GPU before posting, on rv770 hw unlike on r500 hw,
6507 * posting will perform necessary task to bring back GPU into good
6508 * shape.
6509 */
6510 /* post card */
6511 atom_asic_init(rdev->mode_info.atom_context);
6512
6513 /* init golden registers */
6514 si_init_golden_registers(rdev);
6515
6516 rdev->accel_working = true;
6517 r = si_startup(rdev);
6518 if (r) {
6519 DRM_ERROR("si startup failed on resume\n");
6520 rdev->accel_working = false;
6521 return r;
6522 }
6523
6524 return r;
6525
6526 }
6527
6528 int si_suspend(struct radeon_device *rdev)
6529 {
6530 dce6_audio_fini(rdev);
6531 radeon_vm_manager_fini(rdev);
6532 si_cp_enable(rdev, false);
6533 cayman_dma_stop(rdev);
6534 if (rdev->has_uvd) {
6535 uvd_v1_0_fini(rdev);
6536 radeon_uvd_suspend(rdev);
6537 }
6538 si_fini_pg(rdev);
6539 si_fini_cg(rdev);
6540 si_irq_suspend(rdev);
6541 radeon_wb_disable(rdev);
6542 si_pcie_gart_disable(rdev);
6543 return 0;
6544 }
6545
6546 /* Plan is to move initialization in that function and use
6547 * helper function so that radeon_device_init pretty much
6548 * do nothing more than calling asic specific function. This
6549 * should also allow to remove a bunch of callback function
6550 * like vram_info.
6551 */
6552 int si_init(struct radeon_device *rdev)
6553 {
6554 struct radeon_ring *ring = &rdev->ring[RADEON_RING_TYPE_GFX_INDEX];
6555 int r;
6556
6557 /* Read BIOS */
6558 if (!radeon_get_bios(rdev)) {
6559 if (ASIC_IS_AVIVO(rdev))
6560 return -EINVAL;
6561 }
6562 /* Must be an ATOMBIOS */
6563 if (!rdev->is_atom_bios) {
6564 dev_err(rdev->dev, "Expecting atombios for cayman GPU\n");
6565 return -EINVAL;
6566 }
6567 r = radeon_atombios_init(rdev);
6568 if (r)
6569 return r;
6570
6571 /* Post card if necessary */
6572 if (!radeon_card_posted(rdev)) {
6573 if (!rdev->bios) {
6574 dev_err(rdev->dev, "Card not posted and no BIOS - ignoring\n");
6575 return -EINVAL;
6576 }
6577 DRM_INFO("GPU not posted. posting now...\n");
6578 atom_asic_init(rdev->mode_info.atom_context);
6579 }
6580 /* init golden registers */
6581 si_init_golden_registers(rdev);
6582 /* Initialize scratch registers */
6583 si_scratch_init(rdev);
6584 /* Initialize surface registers */
6585 radeon_surface_init(rdev);
6586 /* Initialize clocks */
6587 radeon_get_clock_info(rdev->ddev);
6588
6589 /* Fence driver */
6590 r = radeon_fence_driver_init(rdev);
6591 if (r)
6592 return r;
6593
6594 /* initialize memory controller */
6595 r = si_mc_init(rdev);
6596 if (r)
6597 return r;
6598 /* Memory manager */
6599 r = radeon_bo_init(rdev);
6600 if (r)
6601 return r;
6602
6603 ring = &rdev->ring[RADEON_RING_TYPE_GFX_INDEX];
6604 ring->ring_obj = NULL;
6605 r600_ring_init(rdev, ring, 1024 * 1024);
6606
6607 ring = &rdev->ring[CAYMAN_RING_TYPE_CP1_INDEX];
6608 ring->ring_obj = NULL;
6609 r600_ring_init(rdev, ring, 1024 * 1024);
6610
6611 ring = &rdev->ring[CAYMAN_RING_TYPE_CP2_INDEX];
6612 ring->ring_obj = NULL;
6613 r600_ring_init(rdev, ring, 1024 * 1024);
6614
6615 ring = &rdev->ring[R600_RING_TYPE_DMA_INDEX];
6616 ring->ring_obj = NULL;
6617 r600_ring_init(rdev, ring, 64 * 1024);
6618
6619 ring = &rdev->ring[CAYMAN_RING_TYPE_DMA1_INDEX];
6620 ring->ring_obj = NULL;
6621 r600_ring_init(rdev, ring, 64 * 1024);
6622
6623 if (rdev->has_uvd) {
6624 r = radeon_uvd_init(rdev);
6625 if (!r) {
6626 ring = &rdev->ring[R600_RING_TYPE_UVD_INDEX];
6627 ring->ring_obj = NULL;
6628 r600_ring_init(rdev, ring, 4096);
6629 }
6630 }
6631
6632 rdev->ih.ring_obj = NULL;
6633 r600_ih_ring_init(rdev, 64 * 1024);
6634
6635 r = r600_pcie_gart_init(rdev);
6636 if (r)
6637 return r;
6638
6639 rdev->accel_working = true;
6640 r = si_startup(rdev);
6641 if (r) {
6642 dev_err(rdev->dev, "disabling GPU acceleration\n");
6643 si_cp_fini(rdev);
6644 cayman_dma_fini(rdev);
6645 si_irq_fini(rdev);
6646 sumo_rlc_fini(rdev);
6647 radeon_wb_fini(rdev);
6648 radeon_ib_pool_fini(rdev);
6649 radeon_vm_manager_fini(rdev);
6650 radeon_irq_kms_fini(rdev);
6651 si_pcie_gart_fini(rdev);
6652 rdev->accel_working = false;
6653 }
6654
6655 /* Don't start up if the MC ucode is missing.
6656 * The default clocks and voltages before the MC ucode
6657 * is loaded are not suffient for advanced operations.
6658 */
6659 if (!rdev->mc_fw) {
6660 DRM_ERROR("radeon: MC ucode required for NI+.\n");
6661 return -EINVAL;
6662 }
6663
6664 return 0;
6665 }
6666
6667 void si_fini(struct radeon_device *rdev)
6668 {
6669 si_cp_fini(rdev);
6670 cayman_dma_fini(rdev);
6671 si_fini_pg(rdev);
6672 si_fini_cg(rdev);
6673 si_irq_fini(rdev);
6674 sumo_rlc_fini(rdev);
6675 radeon_wb_fini(rdev);
6676 radeon_vm_manager_fini(rdev);
6677 radeon_ib_pool_fini(rdev);
6678 radeon_irq_kms_fini(rdev);
6679 if (rdev->has_uvd) {
6680 uvd_v1_0_fini(rdev);
6681 radeon_uvd_fini(rdev);
6682 }
6683 si_pcie_gart_fini(rdev);
6684 r600_vram_scratch_fini(rdev);
6685 radeon_gem_fini(rdev);
6686 radeon_fence_driver_fini(rdev);
6687 radeon_bo_fini(rdev);
6688 radeon_atombios_fini(rdev);
6689 kfree(rdev->bios);
6690 rdev->bios = NULL;
6691 }
6692
6693 /**
6694 * si_get_gpu_clock_counter - return GPU clock counter snapshot
6695 *
6696 * @rdev: radeon_device pointer
6697 *
6698 * Fetches a GPU clock counter snapshot (SI).
6699 * Returns the 64 bit clock counter snapshot.
6700 */
6701 uint64_t si_get_gpu_clock_counter(struct radeon_device *rdev)
6702 {
6703 uint64_t clock;
6704
6705 mutex_lock(&rdev->gpu_clock_mutex);
6706 WREG32(RLC_CAPTURE_GPU_CLOCK_COUNT, 1);
6707 clock = (uint64_t)RREG32(RLC_GPU_CLOCK_COUNT_LSB) |
6708 ((uint64_t)RREG32(RLC_GPU_CLOCK_COUNT_MSB) << 32ULL);
6709 mutex_unlock(&rdev->gpu_clock_mutex);
6710 return clock;
6711 }
6712
6713 int si_set_uvd_clocks(struct radeon_device *rdev, u32 vclk, u32 dclk)
6714 {
6715 unsigned fb_div = 0, vclk_div = 0, dclk_div = 0;
6716 int r;
6717
6718 /* bypass vclk and dclk with bclk */
6719 WREG32_P(CG_UPLL_FUNC_CNTL_2,
6720 VCLK_SRC_SEL(1) | DCLK_SRC_SEL(1),
6721 ~(VCLK_SRC_SEL_MASK | DCLK_SRC_SEL_MASK));
6722
6723 /* put PLL in bypass mode */
6724 WREG32_P(CG_UPLL_FUNC_CNTL, UPLL_BYPASS_EN_MASK, ~UPLL_BYPASS_EN_MASK);
6725
6726 if (!vclk || !dclk) {
6727 /* keep the Bypass mode, put PLL to sleep */
6728 WREG32_P(CG_UPLL_FUNC_CNTL, UPLL_SLEEP_MASK, ~UPLL_SLEEP_MASK);
6729 return 0;
6730 }
6731
6732 r = radeon_uvd_calc_upll_dividers(rdev, vclk, dclk, 125000, 250000,
6733 16384, 0x03FFFFFF, 0, 128, 5,
6734 &fb_div, &vclk_div, &dclk_div);
6735 if (r)
6736 return r;
6737
6738 /* set RESET_ANTI_MUX to 0 */
6739 WREG32_P(CG_UPLL_FUNC_CNTL_5, 0, ~RESET_ANTI_MUX_MASK);
6740
6741 /* set VCO_MODE to 1 */
6742 WREG32_P(CG_UPLL_FUNC_CNTL, UPLL_VCO_MODE_MASK, ~UPLL_VCO_MODE_MASK);
6743
6744 /* toggle UPLL_SLEEP to 1 then back to 0 */
6745 WREG32_P(CG_UPLL_FUNC_CNTL, UPLL_SLEEP_MASK, ~UPLL_SLEEP_MASK);
6746 WREG32_P(CG_UPLL_FUNC_CNTL, 0, ~UPLL_SLEEP_MASK);
6747
6748 /* deassert UPLL_RESET */
6749 WREG32_P(CG_UPLL_FUNC_CNTL, 0, ~UPLL_RESET_MASK);
6750
6751 mdelay(1);
6752
6753 r = radeon_uvd_send_upll_ctlreq(rdev, CG_UPLL_FUNC_CNTL);
6754 if (r)
6755 return r;
6756
6757 /* assert UPLL_RESET again */
6758 WREG32_P(CG_UPLL_FUNC_CNTL, UPLL_RESET_MASK, ~UPLL_RESET_MASK);
6759
6760 /* disable spread spectrum. */
6761 WREG32_P(CG_UPLL_SPREAD_SPECTRUM, 0, ~SSEN_MASK);
6762
6763 /* set feedback divider */
6764 WREG32_P(CG_UPLL_FUNC_CNTL_3, UPLL_FB_DIV(fb_div), ~UPLL_FB_DIV_MASK);
6765
6766 /* set ref divider to 0 */
6767 WREG32_P(CG_UPLL_FUNC_CNTL, 0, ~UPLL_REF_DIV_MASK);
6768
6769 if (fb_div < 307200)
6770 WREG32_P(CG_UPLL_FUNC_CNTL_4, 0, ~UPLL_SPARE_ISPARE9);
6771 else
6772 WREG32_P(CG_UPLL_FUNC_CNTL_4, UPLL_SPARE_ISPARE9, ~UPLL_SPARE_ISPARE9);
6773
6774 /* set PDIV_A and PDIV_B */
6775 WREG32_P(CG_UPLL_FUNC_CNTL_2,
6776 UPLL_PDIV_A(vclk_div) | UPLL_PDIV_B(dclk_div),
6777 ~(UPLL_PDIV_A_MASK | UPLL_PDIV_B_MASK));
6778
6779 /* give the PLL some time to settle */
6780 mdelay(15);
6781
6782 /* deassert PLL_RESET */
6783 WREG32_P(CG_UPLL_FUNC_CNTL, 0, ~UPLL_RESET_MASK);
6784
6785 mdelay(15);
6786
6787 /* switch from bypass mode to normal mode */
6788 WREG32_P(CG_UPLL_FUNC_CNTL, 0, ~UPLL_BYPASS_EN_MASK);
6789
6790 r = radeon_uvd_send_upll_ctlreq(rdev, CG_UPLL_FUNC_CNTL);
6791 if (r)
6792 return r;
6793
6794 /* switch VCLK and DCLK selection */
6795 WREG32_P(CG_UPLL_FUNC_CNTL_2,
6796 VCLK_SRC_SEL(2) | DCLK_SRC_SEL(2),
6797 ~(VCLK_SRC_SEL_MASK | DCLK_SRC_SEL_MASK));
6798
6799 mdelay(100);
6800
6801 return 0;
6802 }
6803
6804 static void si_pcie_gen3_enable(struct radeon_device *rdev)
6805 {
6806 struct pci_dev *root = rdev->pdev->bus->self;
6807 int bridge_pos, gpu_pos;
6808 u32 speed_cntl, mask, current_data_rate;
6809 int ret, i;
6810 u16 tmp16;
6811
6812 if (radeon_pcie_gen2 == 0)
6813 return;
6814
6815 if (rdev->flags & RADEON_IS_IGP)
6816 return;
6817
6818 if (!(rdev->flags & RADEON_IS_PCIE))
6819 return;
6820
6821 ret = drm_pcie_get_speed_cap_mask(rdev->ddev, &mask);
6822 if (ret != 0)
6823 return;
6824
6825 if (!(mask & (DRM_PCIE_SPEED_50 | DRM_PCIE_SPEED_80)))
6826 return;
6827
6828 speed_cntl = RREG32_PCIE_PORT(PCIE_LC_SPEED_CNTL);
6829 current_data_rate = (speed_cntl & LC_CURRENT_DATA_RATE_MASK) >>
6830 LC_CURRENT_DATA_RATE_SHIFT;
6831 if (mask & DRM_PCIE_SPEED_80) {
6832 if (current_data_rate == 2) {
6833 DRM_INFO("PCIE gen 3 link speeds already enabled\n");
6834 return;
6835 }
6836 DRM_INFO("enabling PCIE gen 3 link speeds, disable with radeon.pcie_gen2=0\n");
6837 } else if (mask & DRM_PCIE_SPEED_50) {
6838 if (current_data_rate == 1) {
6839 DRM_INFO("PCIE gen 2 link speeds already enabled\n");
6840 return;
6841 }
6842 DRM_INFO("enabling PCIE gen 2 link speeds, disable with radeon.pcie_gen2=0\n");
6843 }
6844
6845 bridge_pos = pci_pcie_cap(root);
6846 if (!bridge_pos)
6847 return;
6848
6849 gpu_pos = pci_pcie_cap(rdev->pdev);
6850 if (!gpu_pos)
6851 return;
6852
6853 if (mask & DRM_PCIE_SPEED_80) {
6854 /* re-try equalization if gen3 is not already enabled */
6855 if (current_data_rate != 2) {
6856 u16 bridge_cfg, gpu_cfg;
6857 u16 bridge_cfg2, gpu_cfg2;
6858 u32 max_lw, current_lw, tmp;
6859
6860 pci_read_config_word(root, bridge_pos + PCI_EXP_LNKCTL, &bridge_cfg);
6861 pci_read_config_word(rdev->pdev, gpu_pos + PCI_EXP_LNKCTL, &gpu_cfg);
6862
6863 tmp16 = bridge_cfg | PCI_EXP_LNKCTL_HAWD;
6864 pci_write_config_word(root, bridge_pos + PCI_EXP_LNKCTL, tmp16);
6865
6866 tmp16 = gpu_cfg | PCI_EXP_LNKCTL_HAWD;
6867 pci_write_config_word(rdev->pdev, gpu_pos + PCI_EXP_LNKCTL, tmp16);
6868
6869 tmp = RREG32_PCIE(PCIE_LC_STATUS1);
6870 max_lw = (tmp & LC_DETECTED_LINK_WIDTH_MASK) >> LC_DETECTED_LINK_WIDTH_SHIFT;
6871 current_lw = (tmp & LC_OPERATING_LINK_WIDTH_MASK) >> LC_OPERATING_LINK_WIDTH_SHIFT;
6872
6873 if (current_lw < max_lw) {
6874 tmp = RREG32_PCIE_PORT(PCIE_LC_LINK_WIDTH_CNTL);
6875 if (tmp & LC_RENEGOTIATION_SUPPORT) {
6876 tmp &= ~(LC_LINK_WIDTH_MASK | LC_UPCONFIGURE_DIS);
6877 tmp |= (max_lw << LC_LINK_WIDTH_SHIFT);
6878 tmp |= LC_UPCONFIGURE_SUPPORT | LC_RENEGOTIATE_EN | LC_RECONFIG_NOW;
6879 WREG32_PCIE_PORT(PCIE_LC_LINK_WIDTH_CNTL, tmp);
6880 }
6881 }
6882
6883 for (i = 0; i < 10; i++) {
6884 /* check status */
6885 pci_read_config_word(rdev->pdev, gpu_pos + PCI_EXP_DEVSTA, &tmp16);
6886 if (tmp16 & PCI_EXP_DEVSTA_TRPND)
6887 break;
6888
6889 pci_read_config_word(root, bridge_pos + PCI_EXP_LNKCTL, &bridge_cfg);
6890 pci_read_config_word(rdev->pdev, gpu_pos + PCI_EXP_LNKCTL, &gpu_cfg);
6891
6892 pci_read_config_word(root, bridge_pos + PCI_EXP_LNKCTL2, &bridge_cfg2);
6893 pci_read_config_word(rdev->pdev, gpu_pos + PCI_EXP_LNKCTL2, &gpu_cfg2);
6894
6895 tmp = RREG32_PCIE_PORT(PCIE_LC_CNTL4);
6896 tmp |= LC_SET_QUIESCE;
6897 WREG32_PCIE_PORT(PCIE_LC_CNTL4, tmp);
6898
6899 tmp = RREG32_PCIE_PORT(PCIE_LC_CNTL4);
6900 tmp |= LC_REDO_EQ;
6901 WREG32_PCIE_PORT(PCIE_LC_CNTL4, tmp);
6902
6903 mdelay(100);
6904
6905 /* linkctl */
6906 pci_read_config_word(root, bridge_pos + PCI_EXP_LNKCTL, &tmp16);
6907 tmp16 &= ~PCI_EXP_LNKCTL_HAWD;
6908 tmp16 |= (bridge_cfg & PCI_EXP_LNKCTL_HAWD);
6909 pci_write_config_word(root, bridge_pos + PCI_EXP_LNKCTL, tmp16);
6910
6911 pci_read_config_word(rdev->pdev, gpu_pos + PCI_EXP_LNKCTL, &tmp16);
6912 tmp16 &= ~PCI_EXP_LNKCTL_HAWD;
6913 tmp16 |= (gpu_cfg & PCI_EXP_LNKCTL_HAWD);
6914 pci_write_config_word(rdev->pdev, gpu_pos + PCI_EXP_LNKCTL, tmp16);
6915
6916 /* linkctl2 */
6917 pci_read_config_word(root, bridge_pos + PCI_EXP_LNKCTL2, &tmp16);
6918 tmp16 &= ~((1 << 4) | (7 << 9));
6919 tmp16 |= (bridge_cfg2 & ((1 << 4) | (7 << 9)));
6920 pci_write_config_word(root, bridge_pos + PCI_EXP_LNKCTL2, tmp16);
6921
6922 pci_read_config_word(rdev->pdev, gpu_pos + PCI_EXP_LNKCTL2, &tmp16);
6923 tmp16 &= ~((1 << 4) | (7 << 9));
6924 tmp16 |= (gpu_cfg2 & ((1 << 4) | (7 << 9)));
6925 pci_write_config_word(rdev->pdev, gpu_pos + PCI_EXP_LNKCTL2, tmp16);
6926
6927 tmp = RREG32_PCIE_PORT(PCIE_LC_CNTL4);
6928 tmp &= ~LC_SET_QUIESCE;
6929 WREG32_PCIE_PORT(PCIE_LC_CNTL4, tmp);
6930 }
6931 }
6932 }
6933
6934 /* set the link speed */
6935 speed_cntl |= LC_FORCE_EN_SW_SPEED_CHANGE | LC_FORCE_DIS_HW_SPEED_CHANGE;
6936 speed_cntl &= ~LC_FORCE_DIS_SW_SPEED_CHANGE;
6937 WREG32_PCIE_PORT(PCIE_LC_SPEED_CNTL, speed_cntl);
6938
6939 pci_read_config_word(rdev->pdev, gpu_pos + PCI_EXP_LNKCTL2, &tmp16);
6940 tmp16 &= ~0xf;
6941 if (mask & DRM_PCIE_SPEED_80)
6942 tmp16 |= 3; /* gen3 */
6943 else if (mask & DRM_PCIE_SPEED_50)
6944 tmp16 |= 2; /* gen2 */
6945 else
6946 tmp16 |= 1; /* gen1 */
6947 pci_write_config_word(rdev->pdev, gpu_pos + PCI_EXP_LNKCTL2, tmp16);
6948
6949 speed_cntl = RREG32_PCIE_PORT(PCIE_LC_SPEED_CNTL);
6950 speed_cntl |= LC_INITIATE_LINK_SPEED_CHANGE;
6951 WREG32_PCIE_PORT(PCIE_LC_SPEED_CNTL, speed_cntl);
6952
6953 for (i = 0; i < rdev->usec_timeout; i++) {
6954 speed_cntl = RREG32_PCIE_PORT(PCIE_LC_SPEED_CNTL);
6955 if ((speed_cntl & LC_INITIATE_LINK_SPEED_CHANGE) == 0)
6956 break;
6957 udelay(1);
6958 }
6959 }
6960
6961 static void si_program_aspm(struct radeon_device *rdev)
6962 {
6963 u32 data, orig;
6964 bool disable_l0s = false, disable_l1 = false, disable_plloff_in_l1 = false;
6965 bool disable_clkreq = false;
6966
6967 if (radeon_aspm == 0)
6968 return;
6969
6970 if (!(rdev->flags & RADEON_IS_PCIE))
6971 return;
6972
6973 orig = data = RREG32_PCIE_PORT(PCIE_LC_N_FTS_CNTL);
6974 data &= ~LC_XMIT_N_FTS_MASK;
6975 data |= LC_XMIT_N_FTS(0x24) | LC_XMIT_N_FTS_OVERRIDE_EN;
6976 if (orig != data)
6977 WREG32_PCIE_PORT(PCIE_LC_N_FTS_CNTL, data);
6978
6979 orig = data = RREG32_PCIE_PORT(PCIE_LC_CNTL3);
6980 data |= LC_GO_TO_RECOVERY;
6981 if (orig != data)
6982 WREG32_PCIE_PORT(PCIE_LC_CNTL3, data);
6983
6984 orig = data = RREG32_PCIE(PCIE_P_CNTL);
6985 data |= P_IGNORE_EDB_ERR;
6986 if (orig != data)
6987 WREG32_PCIE(PCIE_P_CNTL, data);
6988
6989 orig = data = RREG32_PCIE_PORT(PCIE_LC_CNTL);
6990 data &= ~(LC_L0S_INACTIVITY_MASK | LC_L1_INACTIVITY_MASK);
6991 data |= LC_PMI_TO_L1_DIS;
6992 if (!disable_l0s)
6993 data |= LC_L0S_INACTIVITY(7);
6994
6995 if (!disable_l1) {
6996 data |= LC_L1_INACTIVITY(7);
6997 data &= ~LC_PMI_TO_L1_DIS;
6998 if (orig != data)
6999 WREG32_PCIE_PORT(PCIE_LC_CNTL, data);
7000
7001 if (!disable_plloff_in_l1) {
7002 bool clk_req_support;
7003
7004 orig = data = RREG32_PIF_PHY0(PB0_PIF_PWRDOWN_0);
7005 data &= ~(PLL_POWER_STATE_IN_OFF_0_MASK | PLL_POWER_STATE_IN_TXS2_0_MASK);
7006 data |= PLL_POWER_STATE_IN_OFF_0(7) | PLL_POWER_STATE_IN_TXS2_0(7);
7007 if (orig != data)
7008 WREG32_PIF_PHY0(PB0_PIF_PWRDOWN_0, data);
7009
7010 orig = data = RREG32_PIF_PHY0(PB0_PIF_PWRDOWN_1);
7011 data &= ~(PLL_POWER_STATE_IN_OFF_1_MASK | PLL_POWER_STATE_IN_TXS2_1_MASK);
7012 data |= PLL_POWER_STATE_IN_OFF_1(7) | PLL_POWER_STATE_IN_TXS2_1(7);
7013 if (orig != data)
7014 WREG32_PIF_PHY0(PB0_PIF_PWRDOWN_1, data);
7015
7016 orig = data = RREG32_PIF_PHY1(PB1_PIF_PWRDOWN_0);
7017 data &= ~(PLL_POWER_STATE_IN_OFF_0_MASK | PLL_POWER_STATE_IN_TXS2_0_MASK);
7018 data |= PLL_POWER_STATE_IN_OFF_0(7) | PLL_POWER_STATE_IN_TXS2_0(7);
7019 if (orig != data)
7020 WREG32_PIF_PHY1(PB1_PIF_PWRDOWN_0, data);
7021
7022 orig = data = RREG32_PIF_PHY1(PB1_PIF_PWRDOWN_1);
7023 data &= ~(PLL_POWER_STATE_IN_OFF_1_MASK | PLL_POWER_STATE_IN_TXS2_1_MASK);
7024 data |= PLL_POWER_STATE_IN_OFF_1(7) | PLL_POWER_STATE_IN_TXS2_1(7);
7025 if (orig != data)
7026 WREG32_PIF_PHY1(PB1_PIF_PWRDOWN_1, data);
7027
7028 if ((rdev->family != CHIP_OLAND) && (rdev->family != CHIP_HAINAN)) {
7029 orig = data = RREG32_PIF_PHY0(PB0_PIF_PWRDOWN_0);
7030 data &= ~PLL_RAMP_UP_TIME_0_MASK;
7031 if (orig != data)
7032 WREG32_PIF_PHY0(PB0_PIF_PWRDOWN_0, data);
7033
7034 orig = data = RREG32_PIF_PHY0(PB0_PIF_PWRDOWN_1);
7035 data &= ~PLL_RAMP_UP_TIME_1_MASK;
7036 if (orig != data)
7037 WREG32_PIF_PHY0(PB0_PIF_PWRDOWN_1, data);
7038
7039 orig = data = RREG32_PIF_PHY0(PB0_PIF_PWRDOWN_2);
7040 data &= ~PLL_RAMP_UP_TIME_2_MASK;
7041 if (orig != data)
7042 WREG32_PIF_PHY0(PB0_PIF_PWRDOWN_2, data);
7043
7044 orig = data = RREG32_PIF_PHY0(PB0_PIF_PWRDOWN_3);
7045 data &= ~PLL_RAMP_UP_TIME_3_MASK;
7046 if (orig != data)
7047 WREG32_PIF_PHY0(PB0_PIF_PWRDOWN_3, data);
7048
7049 orig = data = RREG32_PIF_PHY1(PB1_PIF_PWRDOWN_0);
7050 data &= ~PLL_RAMP_UP_TIME_0_MASK;
7051 if (orig != data)
7052 WREG32_PIF_PHY1(PB1_PIF_PWRDOWN_0, data);
7053
7054 orig = data = RREG32_PIF_PHY1(PB1_PIF_PWRDOWN_1);
7055 data &= ~PLL_RAMP_UP_TIME_1_MASK;
7056 if (orig != data)
7057 WREG32_PIF_PHY1(PB1_PIF_PWRDOWN_1, data);
7058
7059 orig = data = RREG32_PIF_PHY1(PB1_PIF_PWRDOWN_2);
7060 data &= ~PLL_RAMP_UP_TIME_2_MASK;
7061 if (orig != data)
7062 WREG32_PIF_PHY1(PB1_PIF_PWRDOWN_2, data);
7063
7064 orig = data = RREG32_PIF_PHY1(PB1_PIF_PWRDOWN_3);
7065 data &= ~PLL_RAMP_UP_TIME_3_MASK;
7066 if (orig != data)
7067 WREG32_PIF_PHY1(PB1_PIF_PWRDOWN_3, data);
7068 }
7069 orig = data = RREG32_PCIE_PORT(PCIE_LC_LINK_WIDTH_CNTL);
7070 data &= ~LC_DYN_LANES_PWR_STATE_MASK;
7071 data |= LC_DYN_LANES_PWR_STATE(3);
7072 if (orig != data)
7073 WREG32_PCIE_PORT(PCIE_LC_LINK_WIDTH_CNTL, data);
7074
7075 orig = data = RREG32_PIF_PHY0(PB0_PIF_CNTL);
7076 data &= ~LS2_EXIT_TIME_MASK;
7077 if ((rdev->family == CHIP_OLAND) || (rdev->family == CHIP_HAINAN))
7078 data |= LS2_EXIT_TIME(5);
7079 if (orig != data)
7080 WREG32_PIF_PHY0(PB0_PIF_CNTL, data);
7081
7082 orig = data = RREG32_PIF_PHY1(PB1_PIF_CNTL);
7083 data &= ~LS2_EXIT_TIME_MASK;
7084 if ((rdev->family == CHIP_OLAND) || (rdev->family == CHIP_HAINAN))
7085 data |= LS2_EXIT_TIME(5);
7086 if (orig != data)
7087 WREG32_PIF_PHY1(PB1_PIF_CNTL, data);
7088
7089 if (!disable_clkreq) {
7090 struct pci_dev *root = rdev->pdev->bus->self;
7091 u32 lnkcap;
7092
7093 clk_req_support = false;
7094 pcie_capability_read_dword(root, PCI_EXP_LNKCAP, &lnkcap);
7095 if (lnkcap & PCI_EXP_LNKCAP_CLKPM)
7096 clk_req_support = true;
7097 } else {
7098 clk_req_support = false;
7099 }
7100
7101 if (clk_req_support) {
7102 orig = data = RREG32_PCIE_PORT(PCIE_LC_CNTL2);
7103 data |= LC_ALLOW_PDWN_IN_L1 | LC_ALLOW_PDWN_IN_L23;
7104 if (orig != data)
7105 WREG32_PCIE_PORT(PCIE_LC_CNTL2, data);
7106
7107 orig = data = RREG32(THM_CLK_CNTL);
7108 data &= ~(CMON_CLK_SEL_MASK | TMON_CLK_SEL_MASK);
7109 data |= CMON_CLK_SEL(1) | TMON_CLK_SEL(1);
7110 if (orig != data)
7111 WREG32(THM_CLK_CNTL, data);
7112
7113 orig = data = RREG32(MISC_CLK_CNTL);
7114 data &= ~(DEEP_SLEEP_CLK_SEL_MASK | ZCLK_SEL_MASK);
7115 data |= DEEP_SLEEP_CLK_SEL(1) | ZCLK_SEL(1);
7116 if (orig != data)
7117 WREG32(MISC_CLK_CNTL, data);
7118
7119 orig = data = RREG32(CG_CLKPIN_CNTL);
7120 data &= ~BCLK_AS_XCLK;
7121 if (orig != data)
7122 WREG32(CG_CLKPIN_CNTL, data);
7123
7124 orig = data = RREG32(CG_CLKPIN_CNTL_2);
7125 data &= ~FORCE_BIF_REFCLK_EN;
7126 if (orig != data)
7127 WREG32(CG_CLKPIN_CNTL_2, data);
7128
7129 orig = data = RREG32(MPLL_BYPASSCLK_SEL);
7130 data &= ~MPLL_CLKOUT_SEL_MASK;
7131 data |= MPLL_CLKOUT_SEL(4);
7132 if (orig != data)
7133 WREG32(MPLL_BYPASSCLK_SEL, data);
7134
7135 orig = data = RREG32(SPLL_CNTL_MODE);
7136 data &= ~SPLL_REFCLK_SEL_MASK;
7137 if (orig != data)
7138 WREG32(SPLL_CNTL_MODE, data);
7139 }
7140 }
7141 } else {
7142 if (orig != data)
7143 WREG32_PCIE_PORT(PCIE_LC_CNTL, data);
7144 }
7145
7146 orig = data = RREG32_PCIE(PCIE_CNTL2);
7147 data |= SLV_MEM_LS_EN | MST_MEM_LS_EN | REPLAY_MEM_LS_EN;
7148 if (orig != data)
7149 WREG32_PCIE(PCIE_CNTL2, data);
7150
7151 if (!disable_l0s) {
7152 data = RREG32_PCIE_PORT(PCIE_LC_N_FTS_CNTL);
7153 if((data & LC_N_FTS_MASK) == LC_N_FTS_MASK) {
7154 data = RREG32_PCIE(PCIE_LC_STATUS1);
7155 if ((data & LC_REVERSE_XMIT) && (data & LC_REVERSE_RCVR)) {
7156 orig = data = RREG32_PCIE_PORT(PCIE_LC_CNTL);
7157 data &= ~LC_L0S_INACTIVITY_MASK;
7158 if (orig != data)
7159 WREG32_PCIE_PORT(PCIE_LC_CNTL, data);
7160 }
7161 }
7162 }
7163 }