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