xref: /dragonfly/sys/dev/drm/radeon/cik.c (revision 0de090e1)
1 /*
2  * Copyright 2012 Advanced Micro Devices, Inc.
3  *
4  * Permission is hereby granted, free of charge, to any person obtaining a
5  * copy of this software and associated documentation files (the "Software"),
6  * to deal in the Software without restriction, including without limitation
7  * the rights to use, copy, modify, merge, publish, distribute, sublicense,
8  * and/or sell copies of the Software, and to permit persons to whom the
9  * Software is furnished to do so, subject to the following conditions:
10  *
11  * The above copyright notice and this permission notice shall be included in
12  * all copies or substantial portions of the Software.
13  *
14  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
15  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
16  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
17  * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
18  * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
19  * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
20  * OTHER DEALINGS IN THE SOFTWARE.
21  *
22  * Authors: Alex Deucher
23  */
24 #include <linux/firmware.h>
25 #include <linux/module.h>
26 #include <drm/drmP.h>
27 #include "radeon.h"
28 #include "radeon_asic.h"
29 #include "cikd.h"
30 #include "atom.h"
31 #include "cik_blit_shaders.h"
32 #include "radeon_ucode.h"
33 #include "clearstate_ci.h"
34 
35 MODULE_FIRMWARE("radeon/BONAIRE_pfp.bin");
36 MODULE_FIRMWARE("radeon/BONAIRE_me.bin");
37 MODULE_FIRMWARE("radeon/BONAIRE_ce.bin");
38 MODULE_FIRMWARE("radeon/BONAIRE_mec.bin");
39 MODULE_FIRMWARE("radeon/BONAIRE_mc.bin");
40 MODULE_FIRMWARE("radeon/BONAIRE_mc2.bin");
41 MODULE_FIRMWARE("radeon/BONAIRE_rlc.bin");
42 MODULE_FIRMWARE("radeon/BONAIRE_sdma.bin");
43 MODULE_FIRMWARE("radeon/BONAIRE_smc.bin");
44 
45 MODULE_FIRMWARE("radeon/bonaire_pfp.bin");
46 MODULE_FIRMWARE("radeon/bonaire_me.bin");
47 MODULE_FIRMWARE("radeon/bonaire_ce.bin");
48 MODULE_FIRMWARE("radeon/bonaire_mec.bin");
49 MODULE_FIRMWARE("radeon/bonaire_mc.bin");
50 MODULE_FIRMWARE("radeon/bonaire_rlc.bin");
51 MODULE_FIRMWARE("radeon/bonaire_sdma.bin");
52 MODULE_FIRMWARE("radeon/bonaire_smc.bin");
53 
54 MODULE_FIRMWARE("radeon/HAWAII_pfp.bin");
55 MODULE_FIRMWARE("radeon/HAWAII_me.bin");
56 MODULE_FIRMWARE("radeon/HAWAII_ce.bin");
57 MODULE_FIRMWARE("radeon/HAWAII_mec.bin");
58 MODULE_FIRMWARE("radeon/HAWAII_mc.bin");
59 MODULE_FIRMWARE("radeon/HAWAII_mc2.bin");
60 MODULE_FIRMWARE("radeon/HAWAII_rlc.bin");
61 MODULE_FIRMWARE("radeon/HAWAII_sdma.bin");
62 MODULE_FIRMWARE("radeon/HAWAII_smc.bin");
63 
64 MODULE_FIRMWARE("radeon/hawaii_pfp.bin");
65 MODULE_FIRMWARE("radeon/hawaii_me.bin");
66 MODULE_FIRMWARE("radeon/hawaii_ce.bin");
67 MODULE_FIRMWARE("radeon/hawaii_mec.bin");
68 MODULE_FIRMWARE("radeon/hawaii_mc.bin");
69 MODULE_FIRMWARE("radeon/hawaii_rlc.bin");
70 MODULE_FIRMWARE("radeon/hawaii_sdma.bin");
71 MODULE_FIRMWARE("radeon/hawaii_smc.bin");
72 
73 MODULE_FIRMWARE("radeon/KAVERI_pfp.bin");
74 MODULE_FIRMWARE("radeon/KAVERI_me.bin");
75 MODULE_FIRMWARE("radeon/KAVERI_ce.bin");
76 MODULE_FIRMWARE("radeon/KAVERI_mec.bin");
77 MODULE_FIRMWARE("radeon/KAVERI_rlc.bin");
78 MODULE_FIRMWARE("radeon/KAVERI_sdma.bin");
79 
80 MODULE_FIRMWARE("radeon/kaveri_pfp.bin");
81 MODULE_FIRMWARE("radeon/kaveri_me.bin");
82 MODULE_FIRMWARE("radeon/kaveri_ce.bin");
83 MODULE_FIRMWARE("radeon/kaveri_mec.bin");
84 MODULE_FIRMWARE("radeon/kaveri_mec2.bin");
85 MODULE_FIRMWARE("radeon/kaveri_rlc.bin");
86 MODULE_FIRMWARE("radeon/kaveri_sdma.bin");
87 
88 MODULE_FIRMWARE("radeon/KABINI_pfp.bin");
89 MODULE_FIRMWARE("radeon/KABINI_me.bin");
90 MODULE_FIRMWARE("radeon/KABINI_ce.bin");
91 MODULE_FIRMWARE("radeon/KABINI_mec.bin");
92 MODULE_FIRMWARE("radeon/KABINI_rlc.bin");
93 MODULE_FIRMWARE("radeon/KABINI_sdma.bin");
94 
95 MODULE_FIRMWARE("radeon/kabini_pfp.bin");
96 MODULE_FIRMWARE("radeon/kabini_me.bin");
97 MODULE_FIRMWARE("radeon/kabini_ce.bin");
98 MODULE_FIRMWARE("radeon/kabini_mec.bin");
99 MODULE_FIRMWARE("radeon/kabini_rlc.bin");
100 MODULE_FIRMWARE("radeon/kabini_sdma.bin");
101 
102 MODULE_FIRMWARE("radeon/MULLINS_pfp.bin");
103 MODULE_FIRMWARE("radeon/MULLINS_me.bin");
104 MODULE_FIRMWARE("radeon/MULLINS_ce.bin");
105 MODULE_FIRMWARE("radeon/MULLINS_mec.bin");
106 MODULE_FIRMWARE("radeon/MULLINS_rlc.bin");
107 MODULE_FIRMWARE("radeon/MULLINS_sdma.bin");
108 
109 MODULE_FIRMWARE("radeon/mullins_pfp.bin");
110 MODULE_FIRMWARE("radeon/mullins_me.bin");
111 MODULE_FIRMWARE("radeon/mullins_ce.bin");
112 MODULE_FIRMWARE("radeon/mullins_mec.bin");
113 MODULE_FIRMWARE("radeon/mullins_rlc.bin");
114 MODULE_FIRMWARE("radeon/mullins_sdma.bin");
115 
116 static u32 cik_get_cu_active_bitmap(struct radeon_device *rdev, u32 se, u32 sh);
117 static void cik_rlc_stop(struct radeon_device *rdev);
118 static void cik_pcie_gen3_enable(struct radeon_device *rdev);
119 static void cik_program_aspm(struct radeon_device *rdev);
120 static void cik_init_pg(struct radeon_device *rdev);
121 static void cik_init_cg(struct radeon_device *rdev);
122 static void cik_fini_pg(struct radeon_device *rdev);
123 static void cik_fini_cg(struct radeon_device *rdev);
124 static void cik_enable_gui_idle_interrupt(struct radeon_device *rdev,
125 					  bool enable);
126 
127 /* get temperature in millidegrees */
128 int ci_get_temp(struct radeon_device *rdev)
129 {
130 	u32 temp;
131 	int actual_temp = 0;
132 
133 	temp = (RREG32_SMC(CG_MULT_THERMAL_STATUS) & CTF_TEMP_MASK) >>
134 		CTF_TEMP_SHIFT;
135 
136 	if (temp & 0x200)
137 		actual_temp = 255;
138 	else
139 		actual_temp = temp & 0x1ff;
140 
141 	actual_temp = actual_temp * 1000;
142 
143 	return actual_temp;
144 }
145 
146 /* get temperature in millidegrees */
147 int kv_get_temp(struct radeon_device *rdev)
148 {
149 	u32 temp;
150 	int actual_temp = 0;
151 
152 	temp = RREG32_SMC(0xC0300E0C);
153 
154 	if (temp)
155 		actual_temp = (temp / 8) - 49;
156 	else
157 		actual_temp = 0;
158 
159 	actual_temp = actual_temp * 1000;
160 
161 	return actual_temp;
162 }
163 
164 /*
165  * Indirect registers accessor
166  */
167 u32 cik_pciep_rreg(struct radeon_device *rdev, u32 reg)
168 {
169 	u32 r;
170 
171 	spin_lock(&rdev->pciep_idx_lock);
172 	WREG32(PCIE_INDEX, reg);
173 	(void)RREG32(PCIE_INDEX);
174 	r = RREG32(PCIE_DATA);
175 	spin_unlock(&rdev->pciep_idx_lock);
176 	return r;
177 }
178 
179 void cik_pciep_wreg(struct radeon_device *rdev, u32 reg, u32 v)
180 {
181 	spin_lock(&rdev->pciep_idx_lock);
182 	WREG32(PCIE_INDEX, reg);
183 	(void)RREG32(PCIE_INDEX);
184 	WREG32(PCIE_DATA, v);
185 	(void)RREG32(PCIE_DATA);
186 	spin_unlock(&rdev->pciep_idx_lock);
187 }
188 
189 static const u32 spectre_rlc_save_restore_register_list[] =
190 {
191 	(0x0e00 << 16) | (0xc12c >> 2),
192 	0x00000000,
193 	(0x0e00 << 16) | (0xc140 >> 2),
194 	0x00000000,
195 	(0x0e00 << 16) | (0xc150 >> 2),
196 	0x00000000,
197 	(0x0e00 << 16) | (0xc15c >> 2),
198 	0x00000000,
199 	(0x0e00 << 16) | (0xc168 >> 2),
200 	0x00000000,
201 	(0x0e00 << 16) | (0xc170 >> 2),
202 	0x00000000,
203 	(0x0e00 << 16) | (0xc178 >> 2),
204 	0x00000000,
205 	(0x0e00 << 16) | (0xc204 >> 2),
206 	0x00000000,
207 	(0x0e00 << 16) | (0xc2b4 >> 2),
208 	0x00000000,
209 	(0x0e00 << 16) | (0xc2b8 >> 2),
210 	0x00000000,
211 	(0x0e00 << 16) | (0xc2bc >> 2),
212 	0x00000000,
213 	(0x0e00 << 16) | (0xc2c0 >> 2),
214 	0x00000000,
215 	(0x0e00 << 16) | (0x8228 >> 2),
216 	0x00000000,
217 	(0x0e00 << 16) | (0x829c >> 2),
218 	0x00000000,
219 	(0x0e00 << 16) | (0x869c >> 2),
220 	0x00000000,
221 	(0x0600 << 16) | (0x98f4 >> 2),
222 	0x00000000,
223 	(0x0e00 << 16) | (0x98f8 >> 2),
224 	0x00000000,
225 	(0x0e00 << 16) | (0x9900 >> 2),
226 	0x00000000,
227 	(0x0e00 << 16) | (0xc260 >> 2),
228 	0x00000000,
229 	(0x0e00 << 16) | (0x90e8 >> 2),
230 	0x00000000,
231 	(0x0e00 << 16) | (0x3c000 >> 2),
232 	0x00000000,
233 	(0x0e00 << 16) | (0x3c00c >> 2),
234 	0x00000000,
235 	(0x0e00 << 16) | (0x8c1c >> 2),
236 	0x00000000,
237 	(0x0e00 << 16) | (0x9700 >> 2),
238 	0x00000000,
239 	(0x0e00 << 16) | (0xcd20 >> 2),
240 	0x00000000,
241 	(0x4e00 << 16) | (0xcd20 >> 2),
242 	0x00000000,
243 	(0x5e00 << 16) | (0xcd20 >> 2),
244 	0x00000000,
245 	(0x6e00 << 16) | (0xcd20 >> 2),
246 	0x00000000,
247 	(0x7e00 << 16) | (0xcd20 >> 2),
248 	0x00000000,
249 	(0x8e00 << 16) | (0xcd20 >> 2),
250 	0x00000000,
251 	(0x9e00 << 16) | (0xcd20 >> 2),
252 	0x00000000,
253 	(0xae00 << 16) | (0xcd20 >> 2),
254 	0x00000000,
255 	(0xbe00 << 16) | (0xcd20 >> 2),
256 	0x00000000,
257 	(0x0e00 << 16) | (0x89bc >> 2),
258 	0x00000000,
259 	(0x0e00 << 16) | (0x8900 >> 2),
260 	0x00000000,
261 	0x3,
262 	(0x0e00 << 16) | (0xc130 >> 2),
263 	0x00000000,
264 	(0x0e00 << 16) | (0xc134 >> 2),
265 	0x00000000,
266 	(0x0e00 << 16) | (0xc1fc >> 2),
267 	0x00000000,
268 	(0x0e00 << 16) | (0xc208 >> 2),
269 	0x00000000,
270 	(0x0e00 << 16) | (0xc264 >> 2),
271 	0x00000000,
272 	(0x0e00 << 16) | (0xc268 >> 2),
273 	0x00000000,
274 	(0x0e00 << 16) | (0xc26c >> 2),
275 	0x00000000,
276 	(0x0e00 << 16) | (0xc270 >> 2),
277 	0x00000000,
278 	(0x0e00 << 16) | (0xc274 >> 2),
279 	0x00000000,
280 	(0x0e00 << 16) | (0xc278 >> 2),
281 	0x00000000,
282 	(0x0e00 << 16) | (0xc27c >> 2),
283 	0x00000000,
284 	(0x0e00 << 16) | (0xc280 >> 2),
285 	0x00000000,
286 	(0x0e00 << 16) | (0xc284 >> 2),
287 	0x00000000,
288 	(0x0e00 << 16) | (0xc288 >> 2),
289 	0x00000000,
290 	(0x0e00 << 16) | (0xc28c >> 2),
291 	0x00000000,
292 	(0x0e00 << 16) | (0xc290 >> 2),
293 	0x00000000,
294 	(0x0e00 << 16) | (0xc294 >> 2),
295 	0x00000000,
296 	(0x0e00 << 16) | (0xc298 >> 2),
297 	0x00000000,
298 	(0x0e00 << 16) | (0xc29c >> 2),
299 	0x00000000,
300 	(0x0e00 << 16) | (0xc2a0 >> 2),
301 	0x00000000,
302 	(0x0e00 << 16) | (0xc2a4 >> 2),
303 	0x00000000,
304 	(0x0e00 << 16) | (0xc2a8 >> 2),
305 	0x00000000,
306 	(0x0e00 << 16) | (0xc2ac  >> 2),
307 	0x00000000,
308 	(0x0e00 << 16) | (0xc2b0 >> 2),
309 	0x00000000,
310 	(0x0e00 << 16) | (0x301d0 >> 2),
311 	0x00000000,
312 	(0x0e00 << 16) | (0x30238 >> 2),
313 	0x00000000,
314 	(0x0e00 << 16) | (0x30250 >> 2),
315 	0x00000000,
316 	(0x0e00 << 16) | (0x30254 >> 2),
317 	0x00000000,
318 	(0x0e00 << 16) | (0x30258 >> 2),
319 	0x00000000,
320 	(0x0e00 << 16) | (0x3025c >> 2),
321 	0x00000000,
322 	(0x4e00 << 16) | (0xc900 >> 2),
323 	0x00000000,
324 	(0x5e00 << 16) | (0xc900 >> 2),
325 	0x00000000,
326 	(0x6e00 << 16) | (0xc900 >> 2),
327 	0x00000000,
328 	(0x7e00 << 16) | (0xc900 >> 2),
329 	0x00000000,
330 	(0x8e00 << 16) | (0xc900 >> 2),
331 	0x00000000,
332 	(0x9e00 << 16) | (0xc900 >> 2),
333 	0x00000000,
334 	(0xae00 << 16) | (0xc900 >> 2),
335 	0x00000000,
336 	(0xbe00 << 16) | (0xc900 >> 2),
337 	0x00000000,
338 	(0x4e00 << 16) | (0xc904 >> 2),
339 	0x00000000,
340 	(0x5e00 << 16) | (0xc904 >> 2),
341 	0x00000000,
342 	(0x6e00 << 16) | (0xc904 >> 2),
343 	0x00000000,
344 	(0x7e00 << 16) | (0xc904 >> 2),
345 	0x00000000,
346 	(0x8e00 << 16) | (0xc904 >> 2),
347 	0x00000000,
348 	(0x9e00 << 16) | (0xc904 >> 2),
349 	0x00000000,
350 	(0xae00 << 16) | (0xc904 >> 2),
351 	0x00000000,
352 	(0xbe00 << 16) | (0xc904 >> 2),
353 	0x00000000,
354 	(0x4e00 << 16) | (0xc908 >> 2),
355 	0x00000000,
356 	(0x5e00 << 16) | (0xc908 >> 2),
357 	0x00000000,
358 	(0x6e00 << 16) | (0xc908 >> 2),
359 	0x00000000,
360 	(0x7e00 << 16) | (0xc908 >> 2),
361 	0x00000000,
362 	(0x8e00 << 16) | (0xc908 >> 2),
363 	0x00000000,
364 	(0x9e00 << 16) | (0xc908 >> 2),
365 	0x00000000,
366 	(0xae00 << 16) | (0xc908 >> 2),
367 	0x00000000,
368 	(0xbe00 << 16) | (0xc908 >> 2),
369 	0x00000000,
370 	(0x4e00 << 16) | (0xc90c >> 2),
371 	0x00000000,
372 	(0x5e00 << 16) | (0xc90c >> 2),
373 	0x00000000,
374 	(0x6e00 << 16) | (0xc90c >> 2),
375 	0x00000000,
376 	(0x7e00 << 16) | (0xc90c >> 2),
377 	0x00000000,
378 	(0x8e00 << 16) | (0xc90c >> 2),
379 	0x00000000,
380 	(0x9e00 << 16) | (0xc90c >> 2),
381 	0x00000000,
382 	(0xae00 << 16) | (0xc90c >> 2),
383 	0x00000000,
384 	(0xbe00 << 16) | (0xc90c >> 2),
385 	0x00000000,
386 	(0x4e00 << 16) | (0xc910 >> 2),
387 	0x00000000,
388 	(0x5e00 << 16) | (0xc910 >> 2),
389 	0x00000000,
390 	(0x6e00 << 16) | (0xc910 >> 2),
391 	0x00000000,
392 	(0x7e00 << 16) | (0xc910 >> 2),
393 	0x00000000,
394 	(0x8e00 << 16) | (0xc910 >> 2),
395 	0x00000000,
396 	(0x9e00 << 16) | (0xc910 >> 2),
397 	0x00000000,
398 	(0xae00 << 16) | (0xc910 >> 2),
399 	0x00000000,
400 	(0xbe00 << 16) | (0xc910 >> 2),
401 	0x00000000,
402 	(0x0e00 << 16) | (0xc99c >> 2),
403 	0x00000000,
404 	(0x0e00 << 16) | (0x9834 >> 2),
405 	0x00000000,
406 	(0x0000 << 16) | (0x30f00 >> 2),
407 	0x00000000,
408 	(0x0001 << 16) | (0x30f00 >> 2),
409 	0x00000000,
410 	(0x0000 << 16) | (0x30f04 >> 2),
411 	0x00000000,
412 	(0x0001 << 16) | (0x30f04 >> 2),
413 	0x00000000,
414 	(0x0000 << 16) | (0x30f08 >> 2),
415 	0x00000000,
416 	(0x0001 << 16) | (0x30f08 >> 2),
417 	0x00000000,
418 	(0x0000 << 16) | (0x30f0c >> 2),
419 	0x00000000,
420 	(0x0001 << 16) | (0x30f0c >> 2),
421 	0x00000000,
422 	(0x0600 << 16) | (0x9b7c >> 2),
423 	0x00000000,
424 	(0x0e00 << 16) | (0x8a14 >> 2),
425 	0x00000000,
426 	(0x0e00 << 16) | (0x8a18 >> 2),
427 	0x00000000,
428 	(0x0600 << 16) | (0x30a00 >> 2),
429 	0x00000000,
430 	(0x0e00 << 16) | (0x8bf0 >> 2),
431 	0x00000000,
432 	(0x0e00 << 16) | (0x8bcc >> 2),
433 	0x00000000,
434 	(0x0e00 << 16) | (0x8b24 >> 2),
435 	0x00000000,
436 	(0x0e00 << 16) | (0x30a04 >> 2),
437 	0x00000000,
438 	(0x0600 << 16) | (0x30a10 >> 2),
439 	0x00000000,
440 	(0x0600 << 16) | (0x30a14 >> 2),
441 	0x00000000,
442 	(0x0600 << 16) | (0x30a18 >> 2),
443 	0x00000000,
444 	(0x0600 << 16) | (0x30a2c >> 2),
445 	0x00000000,
446 	(0x0e00 << 16) | (0xc700 >> 2),
447 	0x00000000,
448 	(0x0e00 << 16) | (0xc704 >> 2),
449 	0x00000000,
450 	(0x0e00 << 16) | (0xc708 >> 2),
451 	0x00000000,
452 	(0x0e00 << 16) | (0xc768 >> 2),
453 	0x00000000,
454 	(0x0400 << 16) | (0xc770 >> 2),
455 	0x00000000,
456 	(0x0400 << 16) | (0xc774 >> 2),
457 	0x00000000,
458 	(0x0400 << 16) | (0xc778 >> 2),
459 	0x00000000,
460 	(0x0400 << 16) | (0xc77c >> 2),
461 	0x00000000,
462 	(0x0400 << 16) | (0xc780 >> 2),
463 	0x00000000,
464 	(0x0400 << 16) | (0xc784 >> 2),
465 	0x00000000,
466 	(0x0400 << 16) | (0xc788 >> 2),
467 	0x00000000,
468 	(0x0400 << 16) | (0xc78c >> 2),
469 	0x00000000,
470 	(0x0400 << 16) | (0xc798 >> 2),
471 	0x00000000,
472 	(0x0400 << 16) | (0xc79c >> 2),
473 	0x00000000,
474 	(0x0400 << 16) | (0xc7a0 >> 2),
475 	0x00000000,
476 	(0x0400 << 16) | (0xc7a4 >> 2),
477 	0x00000000,
478 	(0x0400 << 16) | (0xc7a8 >> 2),
479 	0x00000000,
480 	(0x0400 << 16) | (0xc7ac >> 2),
481 	0x00000000,
482 	(0x0400 << 16) | (0xc7b0 >> 2),
483 	0x00000000,
484 	(0x0400 << 16) | (0xc7b4 >> 2),
485 	0x00000000,
486 	(0x0e00 << 16) | (0x9100 >> 2),
487 	0x00000000,
488 	(0x0e00 << 16) | (0x3c010 >> 2),
489 	0x00000000,
490 	(0x0e00 << 16) | (0x92a8 >> 2),
491 	0x00000000,
492 	(0x0e00 << 16) | (0x92ac >> 2),
493 	0x00000000,
494 	(0x0e00 << 16) | (0x92b4 >> 2),
495 	0x00000000,
496 	(0x0e00 << 16) | (0x92b8 >> 2),
497 	0x00000000,
498 	(0x0e00 << 16) | (0x92bc >> 2),
499 	0x00000000,
500 	(0x0e00 << 16) | (0x92c0 >> 2),
501 	0x00000000,
502 	(0x0e00 << 16) | (0x92c4 >> 2),
503 	0x00000000,
504 	(0x0e00 << 16) | (0x92c8 >> 2),
505 	0x00000000,
506 	(0x0e00 << 16) | (0x92cc >> 2),
507 	0x00000000,
508 	(0x0e00 << 16) | (0x92d0 >> 2),
509 	0x00000000,
510 	(0x0e00 << 16) | (0x8c00 >> 2),
511 	0x00000000,
512 	(0x0e00 << 16) | (0x8c04 >> 2),
513 	0x00000000,
514 	(0x0e00 << 16) | (0x8c20 >> 2),
515 	0x00000000,
516 	(0x0e00 << 16) | (0x8c38 >> 2),
517 	0x00000000,
518 	(0x0e00 << 16) | (0x8c3c >> 2),
519 	0x00000000,
520 	(0x0e00 << 16) | (0xae00 >> 2),
521 	0x00000000,
522 	(0x0e00 << 16) | (0x9604 >> 2),
523 	0x00000000,
524 	(0x0e00 << 16) | (0xac08 >> 2),
525 	0x00000000,
526 	(0x0e00 << 16) | (0xac0c >> 2),
527 	0x00000000,
528 	(0x0e00 << 16) | (0xac10 >> 2),
529 	0x00000000,
530 	(0x0e00 << 16) | (0xac14 >> 2),
531 	0x00000000,
532 	(0x0e00 << 16) | (0xac58 >> 2),
533 	0x00000000,
534 	(0x0e00 << 16) | (0xac68 >> 2),
535 	0x00000000,
536 	(0x0e00 << 16) | (0xac6c >> 2),
537 	0x00000000,
538 	(0x0e00 << 16) | (0xac70 >> 2),
539 	0x00000000,
540 	(0x0e00 << 16) | (0xac74 >> 2),
541 	0x00000000,
542 	(0x0e00 << 16) | (0xac78 >> 2),
543 	0x00000000,
544 	(0x0e00 << 16) | (0xac7c >> 2),
545 	0x00000000,
546 	(0x0e00 << 16) | (0xac80 >> 2),
547 	0x00000000,
548 	(0x0e00 << 16) | (0xac84 >> 2),
549 	0x00000000,
550 	(0x0e00 << 16) | (0xac88 >> 2),
551 	0x00000000,
552 	(0x0e00 << 16) | (0xac8c >> 2),
553 	0x00000000,
554 	(0x0e00 << 16) | (0x970c >> 2),
555 	0x00000000,
556 	(0x0e00 << 16) | (0x9714 >> 2),
557 	0x00000000,
558 	(0x0e00 << 16) | (0x9718 >> 2),
559 	0x00000000,
560 	(0x0e00 << 16) | (0x971c >> 2),
561 	0x00000000,
562 	(0x0e00 << 16) | (0x31068 >> 2),
563 	0x00000000,
564 	(0x4e00 << 16) | (0x31068 >> 2),
565 	0x00000000,
566 	(0x5e00 << 16) | (0x31068 >> 2),
567 	0x00000000,
568 	(0x6e00 << 16) | (0x31068 >> 2),
569 	0x00000000,
570 	(0x7e00 << 16) | (0x31068 >> 2),
571 	0x00000000,
572 	(0x8e00 << 16) | (0x31068 >> 2),
573 	0x00000000,
574 	(0x9e00 << 16) | (0x31068 >> 2),
575 	0x00000000,
576 	(0xae00 << 16) | (0x31068 >> 2),
577 	0x00000000,
578 	(0xbe00 << 16) | (0x31068 >> 2),
579 	0x00000000,
580 	(0x0e00 << 16) | (0xcd10 >> 2),
581 	0x00000000,
582 	(0x0e00 << 16) | (0xcd14 >> 2),
583 	0x00000000,
584 	(0x0e00 << 16) | (0x88b0 >> 2),
585 	0x00000000,
586 	(0x0e00 << 16) | (0x88b4 >> 2),
587 	0x00000000,
588 	(0x0e00 << 16) | (0x88b8 >> 2),
589 	0x00000000,
590 	(0x0e00 << 16) | (0x88bc >> 2),
591 	0x00000000,
592 	(0x0400 << 16) | (0x89c0 >> 2),
593 	0x00000000,
594 	(0x0e00 << 16) | (0x88c4 >> 2),
595 	0x00000000,
596 	(0x0e00 << 16) | (0x88c8 >> 2),
597 	0x00000000,
598 	(0x0e00 << 16) | (0x88d0 >> 2),
599 	0x00000000,
600 	(0x0e00 << 16) | (0x88d4 >> 2),
601 	0x00000000,
602 	(0x0e00 << 16) | (0x88d8 >> 2),
603 	0x00000000,
604 	(0x0e00 << 16) | (0x8980 >> 2),
605 	0x00000000,
606 	(0x0e00 << 16) | (0x30938 >> 2),
607 	0x00000000,
608 	(0x0e00 << 16) | (0x3093c >> 2),
609 	0x00000000,
610 	(0x0e00 << 16) | (0x30940 >> 2),
611 	0x00000000,
612 	(0x0e00 << 16) | (0x89a0 >> 2),
613 	0x00000000,
614 	(0x0e00 << 16) | (0x30900 >> 2),
615 	0x00000000,
616 	(0x0e00 << 16) | (0x30904 >> 2),
617 	0x00000000,
618 	(0x0e00 << 16) | (0x89b4 >> 2),
619 	0x00000000,
620 	(0x0e00 << 16) | (0x3c210 >> 2),
621 	0x00000000,
622 	(0x0e00 << 16) | (0x3c214 >> 2),
623 	0x00000000,
624 	(0x0e00 << 16) | (0x3c218 >> 2),
625 	0x00000000,
626 	(0x0e00 << 16) | (0x8904 >> 2),
627 	0x00000000,
628 	0x5,
629 	(0x0e00 << 16) | (0x8c28 >> 2),
630 	(0x0e00 << 16) | (0x8c2c >> 2),
631 	(0x0e00 << 16) | (0x8c30 >> 2),
632 	(0x0e00 << 16) | (0x8c34 >> 2),
633 	(0x0e00 << 16) | (0x9600 >> 2),
634 };
635 
636 static const u32 kalindi_rlc_save_restore_register_list[] =
637 {
638 	(0x0e00 << 16) | (0xc12c >> 2),
639 	0x00000000,
640 	(0x0e00 << 16) | (0xc140 >> 2),
641 	0x00000000,
642 	(0x0e00 << 16) | (0xc150 >> 2),
643 	0x00000000,
644 	(0x0e00 << 16) | (0xc15c >> 2),
645 	0x00000000,
646 	(0x0e00 << 16) | (0xc168 >> 2),
647 	0x00000000,
648 	(0x0e00 << 16) | (0xc170 >> 2),
649 	0x00000000,
650 	(0x0e00 << 16) | (0xc204 >> 2),
651 	0x00000000,
652 	(0x0e00 << 16) | (0xc2b4 >> 2),
653 	0x00000000,
654 	(0x0e00 << 16) | (0xc2b8 >> 2),
655 	0x00000000,
656 	(0x0e00 << 16) | (0xc2bc >> 2),
657 	0x00000000,
658 	(0x0e00 << 16) | (0xc2c0 >> 2),
659 	0x00000000,
660 	(0x0e00 << 16) | (0x8228 >> 2),
661 	0x00000000,
662 	(0x0e00 << 16) | (0x829c >> 2),
663 	0x00000000,
664 	(0x0e00 << 16) | (0x869c >> 2),
665 	0x00000000,
666 	(0x0600 << 16) | (0x98f4 >> 2),
667 	0x00000000,
668 	(0x0e00 << 16) | (0x98f8 >> 2),
669 	0x00000000,
670 	(0x0e00 << 16) | (0x9900 >> 2),
671 	0x00000000,
672 	(0x0e00 << 16) | (0xc260 >> 2),
673 	0x00000000,
674 	(0x0e00 << 16) | (0x90e8 >> 2),
675 	0x00000000,
676 	(0x0e00 << 16) | (0x3c000 >> 2),
677 	0x00000000,
678 	(0x0e00 << 16) | (0x3c00c >> 2),
679 	0x00000000,
680 	(0x0e00 << 16) | (0x8c1c >> 2),
681 	0x00000000,
682 	(0x0e00 << 16) | (0x9700 >> 2),
683 	0x00000000,
684 	(0x0e00 << 16) | (0xcd20 >> 2),
685 	0x00000000,
686 	(0x4e00 << 16) | (0xcd20 >> 2),
687 	0x00000000,
688 	(0x5e00 << 16) | (0xcd20 >> 2),
689 	0x00000000,
690 	(0x6e00 << 16) | (0xcd20 >> 2),
691 	0x00000000,
692 	(0x7e00 << 16) | (0xcd20 >> 2),
693 	0x00000000,
694 	(0x0e00 << 16) | (0x89bc >> 2),
695 	0x00000000,
696 	(0x0e00 << 16) | (0x8900 >> 2),
697 	0x00000000,
698 	0x3,
699 	(0x0e00 << 16) | (0xc130 >> 2),
700 	0x00000000,
701 	(0x0e00 << 16) | (0xc134 >> 2),
702 	0x00000000,
703 	(0x0e00 << 16) | (0xc1fc >> 2),
704 	0x00000000,
705 	(0x0e00 << 16) | (0xc208 >> 2),
706 	0x00000000,
707 	(0x0e00 << 16) | (0xc264 >> 2),
708 	0x00000000,
709 	(0x0e00 << 16) | (0xc268 >> 2),
710 	0x00000000,
711 	(0x0e00 << 16) | (0xc26c >> 2),
712 	0x00000000,
713 	(0x0e00 << 16) | (0xc270 >> 2),
714 	0x00000000,
715 	(0x0e00 << 16) | (0xc274 >> 2),
716 	0x00000000,
717 	(0x0e00 << 16) | (0xc28c >> 2),
718 	0x00000000,
719 	(0x0e00 << 16) | (0xc290 >> 2),
720 	0x00000000,
721 	(0x0e00 << 16) | (0xc294 >> 2),
722 	0x00000000,
723 	(0x0e00 << 16) | (0xc298 >> 2),
724 	0x00000000,
725 	(0x0e00 << 16) | (0xc2a0 >> 2),
726 	0x00000000,
727 	(0x0e00 << 16) | (0xc2a4 >> 2),
728 	0x00000000,
729 	(0x0e00 << 16) | (0xc2a8 >> 2),
730 	0x00000000,
731 	(0x0e00 << 16) | (0xc2ac >> 2),
732 	0x00000000,
733 	(0x0e00 << 16) | (0x301d0 >> 2),
734 	0x00000000,
735 	(0x0e00 << 16) | (0x30238 >> 2),
736 	0x00000000,
737 	(0x0e00 << 16) | (0x30250 >> 2),
738 	0x00000000,
739 	(0x0e00 << 16) | (0x30254 >> 2),
740 	0x00000000,
741 	(0x0e00 << 16) | (0x30258 >> 2),
742 	0x00000000,
743 	(0x0e00 << 16) | (0x3025c >> 2),
744 	0x00000000,
745 	(0x4e00 << 16) | (0xc900 >> 2),
746 	0x00000000,
747 	(0x5e00 << 16) | (0xc900 >> 2),
748 	0x00000000,
749 	(0x6e00 << 16) | (0xc900 >> 2),
750 	0x00000000,
751 	(0x7e00 << 16) | (0xc900 >> 2),
752 	0x00000000,
753 	(0x4e00 << 16) | (0xc904 >> 2),
754 	0x00000000,
755 	(0x5e00 << 16) | (0xc904 >> 2),
756 	0x00000000,
757 	(0x6e00 << 16) | (0xc904 >> 2),
758 	0x00000000,
759 	(0x7e00 << 16) | (0xc904 >> 2),
760 	0x00000000,
761 	(0x4e00 << 16) | (0xc908 >> 2),
762 	0x00000000,
763 	(0x5e00 << 16) | (0xc908 >> 2),
764 	0x00000000,
765 	(0x6e00 << 16) | (0xc908 >> 2),
766 	0x00000000,
767 	(0x7e00 << 16) | (0xc908 >> 2),
768 	0x00000000,
769 	(0x4e00 << 16) | (0xc90c >> 2),
770 	0x00000000,
771 	(0x5e00 << 16) | (0xc90c >> 2),
772 	0x00000000,
773 	(0x6e00 << 16) | (0xc90c >> 2),
774 	0x00000000,
775 	(0x7e00 << 16) | (0xc90c >> 2),
776 	0x00000000,
777 	(0x4e00 << 16) | (0xc910 >> 2),
778 	0x00000000,
779 	(0x5e00 << 16) | (0xc910 >> 2),
780 	0x00000000,
781 	(0x6e00 << 16) | (0xc910 >> 2),
782 	0x00000000,
783 	(0x7e00 << 16) | (0xc910 >> 2),
784 	0x00000000,
785 	(0x0e00 << 16) | (0xc99c >> 2),
786 	0x00000000,
787 	(0x0e00 << 16) | (0x9834 >> 2),
788 	0x00000000,
789 	(0x0000 << 16) | (0x30f00 >> 2),
790 	0x00000000,
791 	(0x0000 << 16) | (0x30f04 >> 2),
792 	0x00000000,
793 	(0x0000 << 16) | (0x30f08 >> 2),
794 	0x00000000,
795 	(0x0000 << 16) | (0x30f0c >> 2),
796 	0x00000000,
797 	(0x0600 << 16) | (0x9b7c >> 2),
798 	0x00000000,
799 	(0x0e00 << 16) | (0x8a14 >> 2),
800 	0x00000000,
801 	(0x0e00 << 16) | (0x8a18 >> 2),
802 	0x00000000,
803 	(0x0600 << 16) | (0x30a00 >> 2),
804 	0x00000000,
805 	(0x0e00 << 16) | (0x8bf0 >> 2),
806 	0x00000000,
807 	(0x0e00 << 16) | (0x8bcc >> 2),
808 	0x00000000,
809 	(0x0e00 << 16) | (0x8b24 >> 2),
810 	0x00000000,
811 	(0x0e00 << 16) | (0x30a04 >> 2),
812 	0x00000000,
813 	(0x0600 << 16) | (0x30a10 >> 2),
814 	0x00000000,
815 	(0x0600 << 16) | (0x30a14 >> 2),
816 	0x00000000,
817 	(0x0600 << 16) | (0x30a18 >> 2),
818 	0x00000000,
819 	(0x0600 << 16) | (0x30a2c >> 2),
820 	0x00000000,
821 	(0x0e00 << 16) | (0xc700 >> 2),
822 	0x00000000,
823 	(0x0e00 << 16) | (0xc704 >> 2),
824 	0x00000000,
825 	(0x0e00 << 16) | (0xc708 >> 2),
826 	0x00000000,
827 	(0x0e00 << 16) | (0xc768 >> 2),
828 	0x00000000,
829 	(0x0400 << 16) | (0xc770 >> 2),
830 	0x00000000,
831 	(0x0400 << 16) | (0xc774 >> 2),
832 	0x00000000,
833 	(0x0400 << 16) | (0xc798 >> 2),
834 	0x00000000,
835 	(0x0400 << 16) | (0xc79c >> 2),
836 	0x00000000,
837 	(0x0e00 << 16) | (0x9100 >> 2),
838 	0x00000000,
839 	(0x0e00 << 16) | (0x3c010 >> 2),
840 	0x00000000,
841 	(0x0e00 << 16) | (0x8c00 >> 2),
842 	0x00000000,
843 	(0x0e00 << 16) | (0x8c04 >> 2),
844 	0x00000000,
845 	(0x0e00 << 16) | (0x8c20 >> 2),
846 	0x00000000,
847 	(0x0e00 << 16) | (0x8c38 >> 2),
848 	0x00000000,
849 	(0x0e00 << 16) | (0x8c3c >> 2),
850 	0x00000000,
851 	(0x0e00 << 16) | (0xae00 >> 2),
852 	0x00000000,
853 	(0x0e00 << 16) | (0x9604 >> 2),
854 	0x00000000,
855 	(0x0e00 << 16) | (0xac08 >> 2),
856 	0x00000000,
857 	(0x0e00 << 16) | (0xac0c >> 2),
858 	0x00000000,
859 	(0x0e00 << 16) | (0xac10 >> 2),
860 	0x00000000,
861 	(0x0e00 << 16) | (0xac14 >> 2),
862 	0x00000000,
863 	(0x0e00 << 16) | (0xac58 >> 2),
864 	0x00000000,
865 	(0x0e00 << 16) | (0xac68 >> 2),
866 	0x00000000,
867 	(0x0e00 << 16) | (0xac6c >> 2),
868 	0x00000000,
869 	(0x0e00 << 16) | (0xac70 >> 2),
870 	0x00000000,
871 	(0x0e00 << 16) | (0xac74 >> 2),
872 	0x00000000,
873 	(0x0e00 << 16) | (0xac78 >> 2),
874 	0x00000000,
875 	(0x0e00 << 16) | (0xac7c >> 2),
876 	0x00000000,
877 	(0x0e00 << 16) | (0xac80 >> 2),
878 	0x00000000,
879 	(0x0e00 << 16) | (0xac84 >> 2),
880 	0x00000000,
881 	(0x0e00 << 16) | (0xac88 >> 2),
882 	0x00000000,
883 	(0x0e00 << 16) | (0xac8c >> 2),
884 	0x00000000,
885 	(0x0e00 << 16) | (0x970c >> 2),
886 	0x00000000,
887 	(0x0e00 << 16) | (0x9714 >> 2),
888 	0x00000000,
889 	(0x0e00 << 16) | (0x9718 >> 2),
890 	0x00000000,
891 	(0x0e00 << 16) | (0x971c >> 2),
892 	0x00000000,
893 	(0x0e00 << 16) | (0x31068 >> 2),
894 	0x00000000,
895 	(0x4e00 << 16) | (0x31068 >> 2),
896 	0x00000000,
897 	(0x5e00 << 16) | (0x31068 >> 2),
898 	0x00000000,
899 	(0x6e00 << 16) | (0x31068 >> 2),
900 	0x00000000,
901 	(0x7e00 << 16) | (0x31068 >> 2),
902 	0x00000000,
903 	(0x0e00 << 16) | (0xcd10 >> 2),
904 	0x00000000,
905 	(0x0e00 << 16) | (0xcd14 >> 2),
906 	0x00000000,
907 	(0x0e00 << 16) | (0x88b0 >> 2),
908 	0x00000000,
909 	(0x0e00 << 16) | (0x88b4 >> 2),
910 	0x00000000,
911 	(0x0e00 << 16) | (0x88b8 >> 2),
912 	0x00000000,
913 	(0x0e00 << 16) | (0x88bc >> 2),
914 	0x00000000,
915 	(0x0400 << 16) | (0x89c0 >> 2),
916 	0x00000000,
917 	(0x0e00 << 16) | (0x88c4 >> 2),
918 	0x00000000,
919 	(0x0e00 << 16) | (0x88c8 >> 2),
920 	0x00000000,
921 	(0x0e00 << 16) | (0x88d0 >> 2),
922 	0x00000000,
923 	(0x0e00 << 16) | (0x88d4 >> 2),
924 	0x00000000,
925 	(0x0e00 << 16) | (0x88d8 >> 2),
926 	0x00000000,
927 	(0x0e00 << 16) | (0x8980 >> 2),
928 	0x00000000,
929 	(0x0e00 << 16) | (0x30938 >> 2),
930 	0x00000000,
931 	(0x0e00 << 16) | (0x3093c >> 2),
932 	0x00000000,
933 	(0x0e00 << 16) | (0x30940 >> 2),
934 	0x00000000,
935 	(0x0e00 << 16) | (0x89a0 >> 2),
936 	0x00000000,
937 	(0x0e00 << 16) | (0x30900 >> 2),
938 	0x00000000,
939 	(0x0e00 << 16) | (0x30904 >> 2),
940 	0x00000000,
941 	(0x0e00 << 16) | (0x89b4 >> 2),
942 	0x00000000,
943 	(0x0e00 << 16) | (0x3e1fc >> 2),
944 	0x00000000,
945 	(0x0e00 << 16) | (0x3c210 >> 2),
946 	0x00000000,
947 	(0x0e00 << 16) | (0x3c214 >> 2),
948 	0x00000000,
949 	(0x0e00 << 16) | (0x3c218 >> 2),
950 	0x00000000,
951 	(0x0e00 << 16) | (0x8904 >> 2),
952 	0x00000000,
953 	0x5,
954 	(0x0e00 << 16) | (0x8c28 >> 2),
955 	(0x0e00 << 16) | (0x8c2c >> 2),
956 	(0x0e00 << 16) | (0x8c30 >> 2),
957 	(0x0e00 << 16) | (0x8c34 >> 2),
958 	(0x0e00 << 16) | (0x9600 >> 2),
959 };
960 
961 static const u32 bonaire_golden_spm_registers[] =
962 {
963 	0x30800, 0xe0ffffff, 0xe0000000
964 };
965 
966 static const u32 bonaire_golden_common_registers[] =
967 {
968 	0xc770, 0xffffffff, 0x00000800,
969 	0xc774, 0xffffffff, 0x00000800,
970 	0xc798, 0xffffffff, 0x00007fbf,
971 	0xc79c, 0xffffffff, 0x00007faf
972 };
973 
974 static const u32 bonaire_golden_registers[] =
975 {
976 	0x3354, 0x00000333, 0x00000333,
977 	0x3350, 0x000c0fc0, 0x00040200,
978 	0x9a10, 0x00010000, 0x00058208,
979 	0x3c000, 0xffff1fff, 0x00140000,
980 	0x3c200, 0xfdfc0fff, 0x00000100,
981 	0x3c234, 0x40000000, 0x40000200,
982 	0x9830, 0xffffffff, 0x00000000,
983 	0x9834, 0xf00fffff, 0x00000400,
984 	0x9838, 0x0002021c, 0x00020200,
985 	0xc78, 0x00000080, 0x00000000,
986 	0x5bb0, 0x000000f0, 0x00000070,
987 	0x5bc0, 0xf0311fff, 0x80300000,
988 	0x98f8, 0x73773777, 0x12010001,
989 	0x350c, 0x00810000, 0x408af000,
990 	0x7030, 0x31000111, 0x00000011,
991 	0x2f48, 0x73773777, 0x12010001,
992 	0x220c, 0x00007fb6, 0x0021a1b1,
993 	0x2210, 0x00007fb6, 0x002021b1,
994 	0x2180, 0x00007fb6, 0x00002191,
995 	0x2218, 0x00007fb6, 0x002121b1,
996 	0x221c, 0x00007fb6, 0x002021b1,
997 	0x21dc, 0x00007fb6, 0x00002191,
998 	0x21e0, 0x00007fb6, 0x00002191,
999 	0x3628, 0x0000003f, 0x0000000a,
1000 	0x362c, 0x0000003f, 0x0000000a,
1001 	0x2ae4, 0x00073ffe, 0x000022a2,
1002 	0x240c, 0x000007ff, 0x00000000,
1003 	0x8a14, 0xf000003f, 0x00000007,
1004 	0x8bf0, 0x00002001, 0x00000001,
1005 	0x8b24, 0xffffffff, 0x00ffffff,
1006 	0x30a04, 0x0000ff0f, 0x00000000,
1007 	0x28a4c, 0x07ffffff, 0x06000000,
1008 	0x4d8, 0x00000fff, 0x00000100,
1009 	0x3e78, 0x00000001, 0x00000002,
1010 	0x9100, 0x03000000, 0x0362c688,
1011 	0x8c00, 0x000000ff, 0x00000001,
1012 	0xe40, 0x00001fff, 0x00001fff,
1013 	0x9060, 0x0000007f, 0x00000020,
1014 	0x9508, 0x00010000, 0x00010000,
1015 	0xac14, 0x000003ff, 0x000000f3,
1016 	0xac0c, 0xffffffff, 0x00001032
1017 };
1018 
1019 static const u32 bonaire_mgcg_cgcg_init[] =
1020 {
1021 	0xc420, 0xffffffff, 0xfffffffc,
1022 	0x30800, 0xffffffff, 0xe0000000,
1023 	0x3c2a0, 0xffffffff, 0x00000100,
1024 	0x3c208, 0xffffffff, 0x00000100,
1025 	0x3c2c0, 0xffffffff, 0xc0000100,
1026 	0x3c2c8, 0xffffffff, 0xc0000100,
1027 	0x3c2c4, 0xffffffff, 0xc0000100,
1028 	0x55e4, 0xffffffff, 0x00600100,
1029 	0x3c280, 0xffffffff, 0x00000100,
1030 	0x3c214, 0xffffffff, 0x06000100,
1031 	0x3c220, 0xffffffff, 0x00000100,
1032 	0x3c218, 0xffffffff, 0x06000100,
1033 	0x3c204, 0xffffffff, 0x00000100,
1034 	0x3c2e0, 0xffffffff, 0x00000100,
1035 	0x3c224, 0xffffffff, 0x00000100,
1036 	0x3c200, 0xffffffff, 0x00000100,
1037 	0x3c230, 0xffffffff, 0x00000100,
1038 	0x3c234, 0xffffffff, 0x00000100,
1039 	0x3c250, 0xffffffff, 0x00000100,
1040 	0x3c254, 0xffffffff, 0x00000100,
1041 	0x3c258, 0xffffffff, 0x00000100,
1042 	0x3c25c, 0xffffffff, 0x00000100,
1043 	0x3c260, 0xffffffff, 0x00000100,
1044 	0x3c27c, 0xffffffff, 0x00000100,
1045 	0x3c278, 0xffffffff, 0x00000100,
1046 	0x3c210, 0xffffffff, 0x06000100,
1047 	0x3c290, 0xffffffff, 0x00000100,
1048 	0x3c274, 0xffffffff, 0x00000100,
1049 	0x3c2b4, 0xffffffff, 0x00000100,
1050 	0x3c2b0, 0xffffffff, 0x00000100,
1051 	0x3c270, 0xffffffff, 0x00000100,
1052 	0x30800, 0xffffffff, 0xe0000000,
1053 	0x3c020, 0xffffffff, 0x00010000,
1054 	0x3c024, 0xffffffff, 0x00030002,
1055 	0x3c028, 0xffffffff, 0x00040007,
1056 	0x3c02c, 0xffffffff, 0x00060005,
1057 	0x3c030, 0xffffffff, 0x00090008,
1058 	0x3c034, 0xffffffff, 0x00010000,
1059 	0x3c038, 0xffffffff, 0x00030002,
1060 	0x3c03c, 0xffffffff, 0x00040007,
1061 	0x3c040, 0xffffffff, 0x00060005,
1062 	0x3c044, 0xffffffff, 0x00090008,
1063 	0x3c048, 0xffffffff, 0x00010000,
1064 	0x3c04c, 0xffffffff, 0x00030002,
1065 	0x3c050, 0xffffffff, 0x00040007,
1066 	0x3c054, 0xffffffff, 0x00060005,
1067 	0x3c058, 0xffffffff, 0x00090008,
1068 	0x3c05c, 0xffffffff, 0x00010000,
1069 	0x3c060, 0xffffffff, 0x00030002,
1070 	0x3c064, 0xffffffff, 0x00040007,
1071 	0x3c068, 0xffffffff, 0x00060005,
1072 	0x3c06c, 0xffffffff, 0x00090008,
1073 	0x3c070, 0xffffffff, 0x00010000,
1074 	0x3c074, 0xffffffff, 0x00030002,
1075 	0x3c078, 0xffffffff, 0x00040007,
1076 	0x3c07c, 0xffffffff, 0x00060005,
1077 	0x3c080, 0xffffffff, 0x00090008,
1078 	0x3c084, 0xffffffff, 0x00010000,
1079 	0x3c088, 0xffffffff, 0x00030002,
1080 	0x3c08c, 0xffffffff, 0x00040007,
1081 	0x3c090, 0xffffffff, 0x00060005,
1082 	0x3c094, 0xffffffff, 0x00090008,
1083 	0x3c098, 0xffffffff, 0x00010000,
1084 	0x3c09c, 0xffffffff, 0x00030002,
1085 	0x3c0a0, 0xffffffff, 0x00040007,
1086 	0x3c0a4, 0xffffffff, 0x00060005,
1087 	0x3c0a8, 0xffffffff, 0x00090008,
1088 	0x3c000, 0xffffffff, 0x96e00200,
1089 	0x8708, 0xffffffff, 0x00900100,
1090 	0xc424, 0xffffffff, 0x0020003f,
1091 	0x38, 0xffffffff, 0x0140001c,
1092 	0x3c, 0x000f0000, 0x000f0000,
1093 	0x220, 0xffffffff, 0xC060000C,
1094 	0x224, 0xc0000fff, 0x00000100,
1095 	0xf90, 0xffffffff, 0x00000100,
1096 	0xf98, 0x00000101, 0x00000000,
1097 	0x20a8, 0xffffffff, 0x00000104,
1098 	0x55e4, 0xff000fff, 0x00000100,
1099 	0x30cc, 0xc0000fff, 0x00000104,
1100 	0xc1e4, 0x00000001, 0x00000001,
1101 	0xd00c, 0xff000ff0, 0x00000100,
1102 	0xd80c, 0xff000ff0, 0x00000100
1103 };
1104 
1105 static const u32 spectre_golden_spm_registers[] =
1106 {
1107 	0x30800, 0xe0ffffff, 0xe0000000
1108 };
1109 
1110 static const u32 spectre_golden_common_registers[] =
1111 {
1112 	0xc770, 0xffffffff, 0x00000800,
1113 	0xc774, 0xffffffff, 0x00000800,
1114 	0xc798, 0xffffffff, 0x00007fbf,
1115 	0xc79c, 0xffffffff, 0x00007faf
1116 };
1117 
1118 static const u32 spectre_golden_registers[] =
1119 {
1120 	0x3c000, 0xffff1fff, 0x96940200,
1121 	0x3c00c, 0xffff0001, 0xff000000,
1122 	0x3c200, 0xfffc0fff, 0x00000100,
1123 	0x6ed8, 0x00010101, 0x00010000,
1124 	0x9834, 0xf00fffff, 0x00000400,
1125 	0x9838, 0xfffffffc, 0x00020200,
1126 	0x5bb0, 0x000000f0, 0x00000070,
1127 	0x5bc0, 0xf0311fff, 0x80300000,
1128 	0x98f8, 0x73773777, 0x12010001,
1129 	0x9b7c, 0x00ff0000, 0x00fc0000,
1130 	0x2f48, 0x73773777, 0x12010001,
1131 	0x8a14, 0xf000003f, 0x00000007,
1132 	0x8b24, 0xffffffff, 0x00ffffff,
1133 	0x28350, 0x3f3f3fff, 0x00000082,
1134 	0x28354, 0x0000003f, 0x00000000,
1135 	0x3e78, 0x00000001, 0x00000002,
1136 	0x913c, 0xffff03df, 0x00000004,
1137 	0xc768, 0x00000008, 0x00000008,
1138 	0x8c00, 0x000008ff, 0x00000800,
1139 	0x9508, 0x00010000, 0x00010000,
1140 	0xac0c, 0xffffffff, 0x54763210,
1141 	0x214f8, 0x01ff01ff, 0x00000002,
1142 	0x21498, 0x007ff800, 0x00200000,
1143 	0x2015c, 0xffffffff, 0x00000f40,
1144 	0x30934, 0xffffffff, 0x00000001
1145 };
1146 
1147 static const u32 spectre_mgcg_cgcg_init[] =
1148 {
1149 	0xc420, 0xffffffff, 0xfffffffc,
1150 	0x30800, 0xffffffff, 0xe0000000,
1151 	0x3c2a0, 0xffffffff, 0x00000100,
1152 	0x3c208, 0xffffffff, 0x00000100,
1153 	0x3c2c0, 0xffffffff, 0x00000100,
1154 	0x3c2c8, 0xffffffff, 0x00000100,
1155 	0x3c2c4, 0xffffffff, 0x00000100,
1156 	0x55e4, 0xffffffff, 0x00600100,
1157 	0x3c280, 0xffffffff, 0x00000100,
1158 	0x3c214, 0xffffffff, 0x06000100,
1159 	0x3c220, 0xffffffff, 0x00000100,
1160 	0x3c218, 0xffffffff, 0x06000100,
1161 	0x3c204, 0xffffffff, 0x00000100,
1162 	0x3c2e0, 0xffffffff, 0x00000100,
1163 	0x3c224, 0xffffffff, 0x00000100,
1164 	0x3c200, 0xffffffff, 0x00000100,
1165 	0x3c230, 0xffffffff, 0x00000100,
1166 	0x3c234, 0xffffffff, 0x00000100,
1167 	0x3c250, 0xffffffff, 0x00000100,
1168 	0x3c254, 0xffffffff, 0x00000100,
1169 	0x3c258, 0xffffffff, 0x00000100,
1170 	0x3c25c, 0xffffffff, 0x00000100,
1171 	0x3c260, 0xffffffff, 0x00000100,
1172 	0x3c27c, 0xffffffff, 0x00000100,
1173 	0x3c278, 0xffffffff, 0x00000100,
1174 	0x3c210, 0xffffffff, 0x06000100,
1175 	0x3c290, 0xffffffff, 0x00000100,
1176 	0x3c274, 0xffffffff, 0x00000100,
1177 	0x3c2b4, 0xffffffff, 0x00000100,
1178 	0x3c2b0, 0xffffffff, 0x00000100,
1179 	0x3c270, 0xffffffff, 0x00000100,
1180 	0x30800, 0xffffffff, 0xe0000000,
1181 	0x3c020, 0xffffffff, 0x00010000,
1182 	0x3c024, 0xffffffff, 0x00030002,
1183 	0x3c028, 0xffffffff, 0x00040007,
1184 	0x3c02c, 0xffffffff, 0x00060005,
1185 	0x3c030, 0xffffffff, 0x00090008,
1186 	0x3c034, 0xffffffff, 0x00010000,
1187 	0x3c038, 0xffffffff, 0x00030002,
1188 	0x3c03c, 0xffffffff, 0x00040007,
1189 	0x3c040, 0xffffffff, 0x00060005,
1190 	0x3c044, 0xffffffff, 0x00090008,
1191 	0x3c048, 0xffffffff, 0x00010000,
1192 	0x3c04c, 0xffffffff, 0x00030002,
1193 	0x3c050, 0xffffffff, 0x00040007,
1194 	0x3c054, 0xffffffff, 0x00060005,
1195 	0x3c058, 0xffffffff, 0x00090008,
1196 	0x3c05c, 0xffffffff, 0x00010000,
1197 	0x3c060, 0xffffffff, 0x00030002,
1198 	0x3c064, 0xffffffff, 0x00040007,
1199 	0x3c068, 0xffffffff, 0x00060005,
1200 	0x3c06c, 0xffffffff, 0x00090008,
1201 	0x3c070, 0xffffffff, 0x00010000,
1202 	0x3c074, 0xffffffff, 0x00030002,
1203 	0x3c078, 0xffffffff, 0x00040007,
1204 	0x3c07c, 0xffffffff, 0x00060005,
1205 	0x3c080, 0xffffffff, 0x00090008,
1206 	0x3c084, 0xffffffff, 0x00010000,
1207 	0x3c088, 0xffffffff, 0x00030002,
1208 	0x3c08c, 0xffffffff, 0x00040007,
1209 	0x3c090, 0xffffffff, 0x00060005,
1210 	0x3c094, 0xffffffff, 0x00090008,
1211 	0x3c098, 0xffffffff, 0x00010000,
1212 	0x3c09c, 0xffffffff, 0x00030002,
1213 	0x3c0a0, 0xffffffff, 0x00040007,
1214 	0x3c0a4, 0xffffffff, 0x00060005,
1215 	0x3c0a8, 0xffffffff, 0x00090008,
1216 	0x3c0ac, 0xffffffff, 0x00010000,
1217 	0x3c0b0, 0xffffffff, 0x00030002,
1218 	0x3c0b4, 0xffffffff, 0x00040007,
1219 	0x3c0b8, 0xffffffff, 0x00060005,
1220 	0x3c0bc, 0xffffffff, 0x00090008,
1221 	0x3c000, 0xffffffff, 0x96e00200,
1222 	0x8708, 0xffffffff, 0x00900100,
1223 	0xc424, 0xffffffff, 0x0020003f,
1224 	0x38, 0xffffffff, 0x0140001c,
1225 	0x3c, 0x000f0000, 0x000f0000,
1226 	0x220, 0xffffffff, 0xC060000C,
1227 	0x224, 0xc0000fff, 0x00000100,
1228 	0xf90, 0xffffffff, 0x00000100,
1229 	0xf98, 0x00000101, 0x00000000,
1230 	0x20a8, 0xffffffff, 0x00000104,
1231 	0x55e4, 0xff000fff, 0x00000100,
1232 	0x30cc, 0xc0000fff, 0x00000104,
1233 	0xc1e4, 0x00000001, 0x00000001,
1234 	0xd00c, 0xff000ff0, 0x00000100,
1235 	0xd80c, 0xff000ff0, 0x00000100
1236 };
1237 
1238 static const u32 kalindi_golden_spm_registers[] =
1239 {
1240 	0x30800, 0xe0ffffff, 0xe0000000
1241 };
1242 
1243 static const u32 kalindi_golden_common_registers[] =
1244 {
1245 	0xc770, 0xffffffff, 0x00000800,
1246 	0xc774, 0xffffffff, 0x00000800,
1247 	0xc798, 0xffffffff, 0x00007fbf,
1248 	0xc79c, 0xffffffff, 0x00007faf
1249 };
1250 
1251 static const u32 kalindi_golden_registers[] =
1252 {
1253 	0x3c000, 0xffffdfff, 0x6e944040,
1254 	0x55e4, 0xff607fff, 0xfc000100,
1255 	0x3c220, 0xff000fff, 0x00000100,
1256 	0x3c224, 0xff000fff, 0x00000100,
1257 	0x3c200, 0xfffc0fff, 0x00000100,
1258 	0x6ed8, 0x00010101, 0x00010000,
1259 	0x9830, 0xffffffff, 0x00000000,
1260 	0x9834, 0xf00fffff, 0x00000400,
1261 	0x5bb0, 0x000000f0, 0x00000070,
1262 	0x5bc0, 0xf0311fff, 0x80300000,
1263 	0x98f8, 0x73773777, 0x12010001,
1264 	0x98fc, 0xffffffff, 0x00000010,
1265 	0x9b7c, 0x00ff0000, 0x00fc0000,
1266 	0x8030, 0x00001f0f, 0x0000100a,
1267 	0x2f48, 0x73773777, 0x12010001,
1268 	0x2408, 0x000fffff, 0x000c007f,
1269 	0x8a14, 0xf000003f, 0x00000007,
1270 	0x8b24, 0x3fff3fff, 0x00ffcfff,
1271 	0x30a04, 0x0000ff0f, 0x00000000,
1272 	0x28a4c, 0x07ffffff, 0x06000000,
1273 	0x4d8, 0x00000fff, 0x00000100,
1274 	0x3e78, 0x00000001, 0x00000002,
1275 	0xc768, 0x00000008, 0x00000008,
1276 	0x8c00, 0x000000ff, 0x00000003,
1277 	0x214f8, 0x01ff01ff, 0x00000002,
1278 	0x21498, 0x007ff800, 0x00200000,
1279 	0x2015c, 0xffffffff, 0x00000f40,
1280 	0x88c4, 0x001f3ae3, 0x00000082,
1281 	0x88d4, 0x0000001f, 0x00000010,
1282 	0x30934, 0xffffffff, 0x00000000
1283 };
1284 
1285 static const u32 kalindi_mgcg_cgcg_init[] =
1286 {
1287 	0xc420, 0xffffffff, 0xfffffffc,
1288 	0x30800, 0xffffffff, 0xe0000000,
1289 	0x3c2a0, 0xffffffff, 0x00000100,
1290 	0x3c208, 0xffffffff, 0x00000100,
1291 	0x3c2c0, 0xffffffff, 0x00000100,
1292 	0x3c2c8, 0xffffffff, 0x00000100,
1293 	0x3c2c4, 0xffffffff, 0x00000100,
1294 	0x55e4, 0xffffffff, 0x00600100,
1295 	0x3c280, 0xffffffff, 0x00000100,
1296 	0x3c214, 0xffffffff, 0x06000100,
1297 	0x3c220, 0xffffffff, 0x00000100,
1298 	0x3c218, 0xffffffff, 0x06000100,
1299 	0x3c204, 0xffffffff, 0x00000100,
1300 	0x3c2e0, 0xffffffff, 0x00000100,
1301 	0x3c224, 0xffffffff, 0x00000100,
1302 	0x3c200, 0xffffffff, 0x00000100,
1303 	0x3c230, 0xffffffff, 0x00000100,
1304 	0x3c234, 0xffffffff, 0x00000100,
1305 	0x3c250, 0xffffffff, 0x00000100,
1306 	0x3c254, 0xffffffff, 0x00000100,
1307 	0x3c258, 0xffffffff, 0x00000100,
1308 	0x3c25c, 0xffffffff, 0x00000100,
1309 	0x3c260, 0xffffffff, 0x00000100,
1310 	0x3c27c, 0xffffffff, 0x00000100,
1311 	0x3c278, 0xffffffff, 0x00000100,
1312 	0x3c210, 0xffffffff, 0x06000100,
1313 	0x3c290, 0xffffffff, 0x00000100,
1314 	0x3c274, 0xffffffff, 0x00000100,
1315 	0x3c2b4, 0xffffffff, 0x00000100,
1316 	0x3c2b0, 0xffffffff, 0x00000100,
1317 	0x3c270, 0xffffffff, 0x00000100,
1318 	0x30800, 0xffffffff, 0xe0000000,
1319 	0x3c020, 0xffffffff, 0x00010000,
1320 	0x3c024, 0xffffffff, 0x00030002,
1321 	0x3c028, 0xffffffff, 0x00040007,
1322 	0x3c02c, 0xffffffff, 0x00060005,
1323 	0x3c030, 0xffffffff, 0x00090008,
1324 	0x3c034, 0xffffffff, 0x00010000,
1325 	0x3c038, 0xffffffff, 0x00030002,
1326 	0x3c03c, 0xffffffff, 0x00040007,
1327 	0x3c040, 0xffffffff, 0x00060005,
1328 	0x3c044, 0xffffffff, 0x00090008,
1329 	0x3c000, 0xffffffff, 0x96e00200,
1330 	0x8708, 0xffffffff, 0x00900100,
1331 	0xc424, 0xffffffff, 0x0020003f,
1332 	0x38, 0xffffffff, 0x0140001c,
1333 	0x3c, 0x000f0000, 0x000f0000,
1334 	0x220, 0xffffffff, 0xC060000C,
1335 	0x224, 0xc0000fff, 0x00000100,
1336 	0x20a8, 0xffffffff, 0x00000104,
1337 	0x55e4, 0xff000fff, 0x00000100,
1338 	0x30cc, 0xc0000fff, 0x00000104,
1339 	0xc1e4, 0x00000001, 0x00000001,
1340 	0xd00c, 0xff000ff0, 0x00000100,
1341 	0xd80c, 0xff000ff0, 0x00000100
1342 };
1343 
1344 static const u32 hawaii_golden_spm_registers[] =
1345 {
1346 	0x30800, 0xe0ffffff, 0xe0000000
1347 };
1348 
1349 static const u32 hawaii_golden_common_registers[] =
1350 {
1351 	0x30800, 0xffffffff, 0xe0000000,
1352 	0x28350, 0xffffffff, 0x3a00161a,
1353 	0x28354, 0xffffffff, 0x0000002e,
1354 	0x9a10, 0xffffffff, 0x00018208,
1355 	0x98f8, 0xffffffff, 0x12011003
1356 };
1357 
1358 static const u32 hawaii_golden_registers[] =
1359 {
1360 	0x3354, 0x00000333, 0x00000333,
1361 	0x9a10, 0x00010000, 0x00058208,
1362 	0x9830, 0xffffffff, 0x00000000,
1363 	0x9834, 0xf00fffff, 0x00000400,
1364 	0x9838, 0x0002021c, 0x00020200,
1365 	0xc78, 0x00000080, 0x00000000,
1366 	0x5bb0, 0x000000f0, 0x00000070,
1367 	0x5bc0, 0xf0311fff, 0x80300000,
1368 	0x350c, 0x00810000, 0x408af000,
1369 	0x7030, 0x31000111, 0x00000011,
1370 	0x2f48, 0x73773777, 0x12010001,
1371 	0x2120, 0x0000007f, 0x0000001b,
1372 	0x21dc, 0x00007fb6, 0x00002191,
1373 	0x3628, 0x0000003f, 0x0000000a,
1374 	0x362c, 0x0000003f, 0x0000000a,
1375 	0x2ae4, 0x00073ffe, 0x000022a2,
1376 	0x240c, 0x000007ff, 0x00000000,
1377 	0x8bf0, 0x00002001, 0x00000001,
1378 	0x8b24, 0xffffffff, 0x00ffffff,
1379 	0x30a04, 0x0000ff0f, 0x00000000,
1380 	0x28a4c, 0x07ffffff, 0x06000000,
1381 	0x3e78, 0x00000001, 0x00000002,
1382 	0xc768, 0x00000008, 0x00000008,
1383 	0xc770, 0x00000f00, 0x00000800,
1384 	0xc774, 0x00000f00, 0x00000800,
1385 	0xc798, 0x00ffffff, 0x00ff7fbf,
1386 	0xc79c, 0x00ffffff, 0x00ff7faf,
1387 	0x8c00, 0x000000ff, 0x00000800,
1388 	0xe40, 0x00001fff, 0x00001fff,
1389 	0x9060, 0x0000007f, 0x00000020,
1390 	0x9508, 0x00010000, 0x00010000,
1391 	0xae00, 0x00100000, 0x000ff07c,
1392 	0xac14, 0x000003ff, 0x0000000f,
1393 	0xac10, 0xffffffff, 0x7564fdec,
1394 	0xac0c, 0xffffffff, 0x3120b9a8,
1395 	0xac08, 0x20000000, 0x0f9c0000
1396 };
1397 
1398 static const u32 hawaii_mgcg_cgcg_init[] =
1399 {
1400 	0xc420, 0xffffffff, 0xfffffffd,
1401 	0x30800, 0xffffffff, 0xe0000000,
1402 	0x3c2a0, 0xffffffff, 0x00000100,
1403 	0x3c208, 0xffffffff, 0x00000100,
1404 	0x3c2c0, 0xffffffff, 0x00000100,
1405 	0x3c2c8, 0xffffffff, 0x00000100,
1406 	0x3c2c4, 0xffffffff, 0x00000100,
1407 	0x55e4, 0xffffffff, 0x00200100,
1408 	0x3c280, 0xffffffff, 0x00000100,
1409 	0x3c214, 0xffffffff, 0x06000100,
1410 	0x3c220, 0xffffffff, 0x00000100,
1411 	0x3c218, 0xffffffff, 0x06000100,
1412 	0x3c204, 0xffffffff, 0x00000100,
1413 	0x3c2e0, 0xffffffff, 0x00000100,
1414 	0x3c224, 0xffffffff, 0x00000100,
1415 	0x3c200, 0xffffffff, 0x00000100,
1416 	0x3c230, 0xffffffff, 0x00000100,
1417 	0x3c234, 0xffffffff, 0x00000100,
1418 	0x3c250, 0xffffffff, 0x00000100,
1419 	0x3c254, 0xffffffff, 0x00000100,
1420 	0x3c258, 0xffffffff, 0x00000100,
1421 	0x3c25c, 0xffffffff, 0x00000100,
1422 	0x3c260, 0xffffffff, 0x00000100,
1423 	0x3c27c, 0xffffffff, 0x00000100,
1424 	0x3c278, 0xffffffff, 0x00000100,
1425 	0x3c210, 0xffffffff, 0x06000100,
1426 	0x3c290, 0xffffffff, 0x00000100,
1427 	0x3c274, 0xffffffff, 0x00000100,
1428 	0x3c2b4, 0xffffffff, 0x00000100,
1429 	0x3c2b0, 0xffffffff, 0x00000100,
1430 	0x3c270, 0xffffffff, 0x00000100,
1431 	0x30800, 0xffffffff, 0xe0000000,
1432 	0x3c020, 0xffffffff, 0x00010000,
1433 	0x3c024, 0xffffffff, 0x00030002,
1434 	0x3c028, 0xffffffff, 0x00040007,
1435 	0x3c02c, 0xffffffff, 0x00060005,
1436 	0x3c030, 0xffffffff, 0x00090008,
1437 	0x3c034, 0xffffffff, 0x00010000,
1438 	0x3c038, 0xffffffff, 0x00030002,
1439 	0x3c03c, 0xffffffff, 0x00040007,
1440 	0x3c040, 0xffffffff, 0x00060005,
1441 	0x3c044, 0xffffffff, 0x00090008,
1442 	0x3c048, 0xffffffff, 0x00010000,
1443 	0x3c04c, 0xffffffff, 0x00030002,
1444 	0x3c050, 0xffffffff, 0x00040007,
1445 	0x3c054, 0xffffffff, 0x00060005,
1446 	0x3c058, 0xffffffff, 0x00090008,
1447 	0x3c05c, 0xffffffff, 0x00010000,
1448 	0x3c060, 0xffffffff, 0x00030002,
1449 	0x3c064, 0xffffffff, 0x00040007,
1450 	0x3c068, 0xffffffff, 0x00060005,
1451 	0x3c06c, 0xffffffff, 0x00090008,
1452 	0x3c070, 0xffffffff, 0x00010000,
1453 	0x3c074, 0xffffffff, 0x00030002,
1454 	0x3c078, 0xffffffff, 0x00040007,
1455 	0x3c07c, 0xffffffff, 0x00060005,
1456 	0x3c080, 0xffffffff, 0x00090008,
1457 	0x3c084, 0xffffffff, 0x00010000,
1458 	0x3c088, 0xffffffff, 0x00030002,
1459 	0x3c08c, 0xffffffff, 0x00040007,
1460 	0x3c090, 0xffffffff, 0x00060005,
1461 	0x3c094, 0xffffffff, 0x00090008,
1462 	0x3c098, 0xffffffff, 0x00010000,
1463 	0x3c09c, 0xffffffff, 0x00030002,
1464 	0x3c0a0, 0xffffffff, 0x00040007,
1465 	0x3c0a4, 0xffffffff, 0x00060005,
1466 	0x3c0a8, 0xffffffff, 0x00090008,
1467 	0x3c0ac, 0xffffffff, 0x00010000,
1468 	0x3c0b0, 0xffffffff, 0x00030002,
1469 	0x3c0b4, 0xffffffff, 0x00040007,
1470 	0x3c0b8, 0xffffffff, 0x00060005,
1471 	0x3c0bc, 0xffffffff, 0x00090008,
1472 	0x3c0c0, 0xffffffff, 0x00010000,
1473 	0x3c0c4, 0xffffffff, 0x00030002,
1474 	0x3c0c8, 0xffffffff, 0x00040007,
1475 	0x3c0cc, 0xffffffff, 0x00060005,
1476 	0x3c0d0, 0xffffffff, 0x00090008,
1477 	0x3c0d4, 0xffffffff, 0x00010000,
1478 	0x3c0d8, 0xffffffff, 0x00030002,
1479 	0x3c0dc, 0xffffffff, 0x00040007,
1480 	0x3c0e0, 0xffffffff, 0x00060005,
1481 	0x3c0e4, 0xffffffff, 0x00090008,
1482 	0x3c0e8, 0xffffffff, 0x00010000,
1483 	0x3c0ec, 0xffffffff, 0x00030002,
1484 	0x3c0f0, 0xffffffff, 0x00040007,
1485 	0x3c0f4, 0xffffffff, 0x00060005,
1486 	0x3c0f8, 0xffffffff, 0x00090008,
1487 	0xc318, 0xffffffff, 0x00020200,
1488 	0x3350, 0xffffffff, 0x00000200,
1489 	0x15c0, 0xffffffff, 0x00000400,
1490 	0x55e8, 0xffffffff, 0x00000000,
1491 	0x2f50, 0xffffffff, 0x00000902,
1492 	0x3c000, 0xffffffff, 0x96940200,
1493 	0x8708, 0xffffffff, 0x00900100,
1494 	0xc424, 0xffffffff, 0x0020003f,
1495 	0x38, 0xffffffff, 0x0140001c,
1496 	0x3c, 0x000f0000, 0x000f0000,
1497 	0x220, 0xffffffff, 0xc060000c,
1498 	0x224, 0xc0000fff, 0x00000100,
1499 	0xf90, 0xffffffff, 0x00000100,
1500 	0xf98, 0x00000101, 0x00000000,
1501 	0x20a8, 0xffffffff, 0x00000104,
1502 	0x55e4, 0xff000fff, 0x00000100,
1503 	0x30cc, 0xc0000fff, 0x00000104,
1504 	0xc1e4, 0x00000001, 0x00000001,
1505 	0xd00c, 0xff000ff0, 0x00000100,
1506 	0xd80c, 0xff000ff0, 0x00000100
1507 };
1508 
1509 static const u32 godavari_golden_registers[] =
1510 {
1511 	0x55e4, 0xff607fff, 0xfc000100,
1512 	0x6ed8, 0x00010101, 0x00010000,
1513 	0x9830, 0xffffffff, 0x00000000,
1514 	0x98302, 0xf00fffff, 0x00000400,
1515 	0x6130, 0xffffffff, 0x00010000,
1516 	0x5bb0, 0x000000f0, 0x00000070,
1517 	0x5bc0, 0xf0311fff, 0x80300000,
1518 	0x98f8, 0x73773777, 0x12010001,
1519 	0x98fc, 0xffffffff, 0x00000010,
1520 	0x8030, 0x00001f0f, 0x0000100a,
1521 	0x2f48, 0x73773777, 0x12010001,
1522 	0x2408, 0x000fffff, 0x000c007f,
1523 	0x8a14, 0xf000003f, 0x00000007,
1524 	0x8b24, 0xffffffff, 0x00ff0fff,
1525 	0x30a04, 0x0000ff0f, 0x00000000,
1526 	0x28a4c, 0x07ffffff, 0x06000000,
1527 	0x4d8, 0x00000fff, 0x00000100,
1528 	0xd014, 0x00010000, 0x00810001,
1529 	0xd814, 0x00010000, 0x00810001,
1530 	0x3e78, 0x00000001, 0x00000002,
1531 	0xc768, 0x00000008, 0x00000008,
1532 	0xc770, 0x00000f00, 0x00000800,
1533 	0xc774, 0x00000f00, 0x00000800,
1534 	0xc798, 0x00ffffff, 0x00ff7fbf,
1535 	0xc79c, 0x00ffffff, 0x00ff7faf,
1536 	0x8c00, 0x000000ff, 0x00000001,
1537 	0x214f8, 0x01ff01ff, 0x00000002,
1538 	0x21498, 0x007ff800, 0x00200000,
1539 	0x2015c, 0xffffffff, 0x00000f40,
1540 	0x88c4, 0x001f3ae3, 0x00000082,
1541 	0x88d4, 0x0000001f, 0x00000010,
1542 	0x30934, 0xffffffff, 0x00000000
1543 };
1544 
1545 
1546 static void cik_init_golden_registers(struct radeon_device *rdev)
1547 {
1548 	switch (rdev->family) {
1549 	case CHIP_BONAIRE:
1550 		radeon_program_register_sequence(rdev,
1551 						 bonaire_mgcg_cgcg_init,
1552 						 (const u32)ARRAY_SIZE(bonaire_mgcg_cgcg_init));
1553 		radeon_program_register_sequence(rdev,
1554 						 bonaire_golden_registers,
1555 						 (const u32)ARRAY_SIZE(bonaire_golden_registers));
1556 		radeon_program_register_sequence(rdev,
1557 						 bonaire_golden_common_registers,
1558 						 (const u32)ARRAY_SIZE(bonaire_golden_common_registers));
1559 		radeon_program_register_sequence(rdev,
1560 						 bonaire_golden_spm_registers,
1561 						 (const u32)ARRAY_SIZE(bonaire_golden_spm_registers));
1562 		break;
1563 	case CHIP_KABINI:
1564 		radeon_program_register_sequence(rdev,
1565 						 kalindi_mgcg_cgcg_init,
1566 						 (const u32)ARRAY_SIZE(kalindi_mgcg_cgcg_init));
1567 		radeon_program_register_sequence(rdev,
1568 						 kalindi_golden_registers,
1569 						 (const u32)ARRAY_SIZE(kalindi_golden_registers));
1570 		radeon_program_register_sequence(rdev,
1571 						 kalindi_golden_common_registers,
1572 						 (const u32)ARRAY_SIZE(kalindi_golden_common_registers));
1573 		radeon_program_register_sequence(rdev,
1574 						 kalindi_golden_spm_registers,
1575 						 (const u32)ARRAY_SIZE(kalindi_golden_spm_registers));
1576 		break;
1577 	case CHIP_MULLINS:
1578 		radeon_program_register_sequence(rdev,
1579 						 kalindi_mgcg_cgcg_init,
1580 						 (const u32)ARRAY_SIZE(kalindi_mgcg_cgcg_init));
1581 		radeon_program_register_sequence(rdev,
1582 						 godavari_golden_registers,
1583 						 (const u32)ARRAY_SIZE(godavari_golden_registers));
1584 		radeon_program_register_sequence(rdev,
1585 						 kalindi_golden_common_registers,
1586 						 (const u32)ARRAY_SIZE(kalindi_golden_common_registers));
1587 		radeon_program_register_sequence(rdev,
1588 						 kalindi_golden_spm_registers,
1589 						 (const u32)ARRAY_SIZE(kalindi_golden_spm_registers));
1590 		break;
1591 	case CHIP_KAVERI:
1592 		radeon_program_register_sequence(rdev,
1593 						 spectre_mgcg_cgcg_init,
1594 						 (const u32)ARRAY_SIZE(spectre_mgcg_cgcg_init));
1595 		radeon_program_register_sequence(rdev,
1596 						 spectre_golden_registers,
1597 						 (const u32)ARRAY_SIZE(spectre_golden_registers));
1598 		radeon_program_register_sequence(rdev,
1599 						 spectre_golden_common_registers,
1600 						 (const u32)ARRAY_SIZE(spectre_golden_common_registers));
1601 		radeon_program_register_sequence(rdev,
1602 						 spectre_golden_spm_registers,
1603 						 (const u32)ARRAY_SIZE(spectre_golden_spm_registers));
1604 		break;
1605 	case CHIP_HAWAII:
1606 		radeon_program_register_sequence(rdev,
1607 						 hawaii_mgcg_cgcg_init,
1608 						 (const u32)ARRAY_SIZE(hawaii_mgcg_cgcg_init));
1609 		radeon_program_register_sequence(rdev,
1610 						 hawaii_golden_registers,
1611 						 (const u32)ARRAY_SIZE(hawaii_golden_registers));
1612 		radeon_program_register_sequence(rdev,
1613 						 hawaii_golden_common_registers,
1614 						 (const u32)ARRAY_SIZE(hawaii_golden_common_registers));
1615 		radeon_program_register_sequence(rdev,
1616 						 hawaii_golden_spm_registers,
1617 						 (const u32)ARRAY_SIZE(hawaii_golden_spm_registers));
1618 		break;
1619 	default:
1620 		break;
1621 	}
1622 }
1623 
1624 /**
1625  * cik_get_xclk - get the xclk
1626  *
1627  * @rdev: radeon_device pointer
1628  *
1629  * Returns the reference clock used by the gfx engine
1630  * (CIK).
1631  */
1632 u32 cik_get_xclk(struct radeon_device *rdev)
1633 {
1634         u32 reference_clock = rdev->clock.spll.reference_freq;
1635 
1636 	if (rdev->flags & RADEON_IS_IGP) {
1637 		if (RREG32_SMC(GENERAL_PWRMGT) & GPU_COUNTER_CLK)
1638 			return reference_clock / 2;
1639 	} else {
1640 		if (RREG32_SMC(CG_CLKPIN_CNTL) & XTALIN_DIVIDE)
1641 			return reference_clock / 4;
1642 	}
1643 	return reference_clock;
1644 }
1645 
1646 /**
1647  * cik_mm_rdoorbell - read a doorbell dword
1648  *
1649  * @rdev: radeon_device pointer
1650  * @index: doorbell index
1651  *
1652  * Returns the value in the doorbell aperture at the
1653  * requested doorbell index (CIK).
1654  */
1655 u32 cik_mm_rdoorbell(struct radeon_device *rdev, u32 index)
1656 {
1657 	if (index < rdev->doorbell.num_doorbells) {
1658 		return readl(rdev->doorbell.ptr + index);
1659 	} else {
1660 		DRM_ERROR("reading beyond doorbell aperture: 0x%08x!\n", index);
1661 		return 0;
1662 	}
1663 }
1664 
1665 /**
1666  * cik_mm_wdoorbell - write a doorbell dword
1667  *
1668  * @rdev: radeon_device pointer
1669  * @index: doorbell index
1670  * @v: value to write
1671  *
1672  * Writes @v to the doorbell aperture at the
1673  * requested doorbell index (CIK).
1674  */
1675 void cik_mm_wdoorbell(struct radeon_device *rdev, u32 index, u32 v)
1676 {
1677 	if (index < rdev->doorbell.num_doorbells) {
1678 		writel(v, rdev->doorbell.ptr + index);
1679 	} else {
1680 		DRM_ERROR("writing beyond doorbell aperture: 0x%08x!\n", index);
1681 	}
1682 }
1683 
1684 #define BONAIRE_IO_MC_REGS_SIZE 36
1685 
1686 static const u32 bonaire_io_mc_regs[BONAIRE_IO_MC_REGS_SIZE][2] =
1687 {
1688 	{0x00000070, 0x04400000},
1689 	{0x00000071, 0x80c01803},
1690 	{0x00000072, 0x00004004},
1691 	{0x00000073, 0x00000100},
1692 	{0x00000074, 0x00ff0000},
1693 	{0x00000075, 0x34000000},
1694 	{0x00000076, 0x08000014},
1695 	{0x00000077, 0x00cc08ec},
1696 	{0x00000078, 0x00000400},
1697 	{0x00000079, 0x00000000},
1698 	{0x0000007a, 0x04090000},
1699 	{0x0000007c, 0x00000000},
1700 	{0x0000007e, 0x4408a8e8},
1701 	{0x0000007f, 0x00000304},
1702 	{0x00000080, 0x00000000},
1703 	{0x00000082, 0x00000001},
1704 	{0x00000083, 0x00000002},
1705 	{0x00000084, 0xf3e4f400},
1706 	{0x00000085, 0x052024e3},
1707 	{0x00000087, 0x00000000},
1708 	{0x00000088, 0x01000000},
1709 	{0x0000008a, 0x1c0a0000},
1710 	{0x0000008b, 0xff010000},
1711 	{0x0000008d, 0xffffefff},
1712 	{0x0000008e, 0xfff3efff},
1713 	{0x0000008f, 0xfff3efbf},
1714 	{0x00000092, 0xf7ffffff},
1715 	{0x00000093, 0xffffff7f},
1716 	{0x00000095, 0x00101101},
1717 	{0x00000096, 0x00000fff},
1718 	{0x00000097, 0x00116fff},
1719 	{0x00000098, 0x60010000},
1720 	{0x00000099, 0x10010000},
1721 	{0x0000009a, 0x00006000},
1722 	{0x0000009b, 0x00001000},
1723 	{0x0000009f, 0x00b48000}
1724 };
1725 
1726 #define HAWAII_IO_MC_REGS_SIZE 22
1727 
1728 static const u32 hawaii_io_mc_regs[HAWAII_IO_MC_REGS_SIZE][2] =
1729 {
1730 	{0x0000007d, 0x40000000},
1731 	{0x0000007e, 0x40180304},
1732 	{0x0000007f, 0x0000ff00},
1733 	{0x00000081, 0x00000000},
1734 	{0x00000083, 0x00000800},
1735 	{0x00000086, 0x00000000},
1736 	{0x00000087, 0x00000100},
1737 	{0x00000088, 0x00020100},
1738 	{0x00000089, 0x00000000},
1739 	{0x0000008b, 0x00040000},
1740 	{0x0000008c, 0x00000100},
1741 	{0x0000008e, 0xff010000},
1742 	{0x00000090, 0xffffefff},
1743 	{0x00000091, 0xfff3efff},
1744 	{0x00000092, 0xfff3efbf},
1745 	{0x00000093, 0xf7ffffff},
1746 	{0x00000094, 0xffffff7f},
1747 	{0x00000095, 0x00000fff},
1748 	{0x00000096, 0x00116fff},
1749 	{0x00000097, 0x60010000},
1750 	{0x00000098, 0x10010000},
1751 	{0x0000009f, 0x00c79000}
1752 };
1753 
1754 
1755 /**
1756  * cik_srbm_select - select specific register instances
1757  *
1758  * @rdev: radeon_device pointer
1759  * @me: selected ME (micro engine)
1760  * @pipe: pipe
1761  * @queue: queue
1762  * @vmid: VMID
1763  *
1764  * Switches the currently active registers instances.  Some
1765  * registers are instanced per VMID, others are instanced per
1766  * me/pipe/queue combination.
1767  */
1768 static void cik_srbm_select(struct radeon_device *rdev,
1769 			    u32 me, u32 pipe, u32 queue, u32 vmid)
1770 {
1771 	u32 srbm_gfx_cntl = (PIPEID(pipe & 0x3) |
1772 			     MEID(me & 0x3) |
1773 			     VMID(vmid & 0xf) |
1774 			     QUEUEID(queue & 0x7));
1775 	WREG32(SRBM_GFX_CNTL, srbm_gfx_cntl);
1776 }
1777 
1778 /* ucode loading */
1779 /**
1780  * ci_mc_load_microcode - load MC ucode into the hw
1781  *
1782  * @rdev: radeon_device pointer
1783  *
1784  * Load the GDDR MC ucode into the hw (CIK).
1785  * Returns 0 on success, error on failure.
1786  */
1787 int ci_mc_load_microcode(struct radeon_device *rdev)
1788 {
1789 	const __be32 *fw_data = NULL;
1790 	const __le32 *new_fw_data = NULL;
1791 	u32 running, blackout = 0;
1792 	u32 *io_mc_regs = NULL;
1793 	const __le32 *new_io_mc_regs = NULL;
1794 	int i, regs_size, ucode_size;
1795 
1796 	if (!rdev->mc_fw)
1797 		return -EINVAL;
1798 
1799 	if (rdev->new_fw) {
1800 		const struct mc_firmware_header_v1_0 *hdr =
1801 			(const struct mc_firmware_header_v1_0 *)rdev->mc_fw->data;
1802 
1803 		radeon_ucode_print_mc_hdr(&hdr->header);
1804 
1805 		regs_size = le32_to_cpu(hdr->io_debug_size_bytes) / (4 * 2);
1806 		new_io_mc_regs = (const __le32 *)
1807 			((const char *)rdev->mc_fw->data + le32_to_cpu(hdr->io_debug_array_offset_bytes));
1808 		ucode_size = le32_to_cpu(hdr->header.ucode_size_bytes) / 4;
1809 		new_fw_data = (const __le32 *)
1810 			((const char *)rdev->mc_fw->data + le32_to_cpu(hdr->header.ucode_array_offset_bytes));
1811 	} else {
1812 		ucode_size = rdev->mc_fw->datasize / 4;
1813 
1814 		switch (rdev->family) {
1815 		case CHIP_BONAIRE:
1816 			io_mc_regs = (u32 *)&bonaire_io_mc_regs;
1817 			regs_size = BONAIRE_IO_MC_REGS_SIZE;
1818 			break;
1819 		case CHIP_HAWAII:
1820 			io_mc_regs = (u32 *)&hawaii_io_mc_regs;
1821 			regs_size = HAWAII_IO_MC_REGS_SIZE;
1822 			break;
1823 		default:
1824 			return -EINVAL;
1825 		}
1826 		fw_data = (const __be32 *)rdev->mc_fw->data;
1827 	}
1828 
1829 	running = RREG32(MC_SEQ_SUP_CNTL) & RUN_MASK;
1830 
1831 	if (running == 0) {
1832 		if (running) {
1833 			blackout = RREG32(MC_SHARED_BLACKOUT_CNTL);
1834 			WREG32(MC_SHARED_BLACKOUT_CNTL, blackout | 1);
1835 		}
1836 
1837 		/* reset the engine and set to writable */
1838 		WREG32(MC_SEQ_SUP_CNTL, 0x00000008);
1839 		WREG32(MC_SEQ_SUP_CNTL, 0x00000010);
1840 
1841 		/* load mc io regs */
1842 		for (i = 0; i < regs_size; i++) {
1843 			if (rdev->new_fw) {
1844 				WREG32(MC_SEQ_IO_DEBUG_INDEX, le32_to_cpup(new_io_mc_regs++));
1845 				WREG32(MC_SEQ_IO_DEBUG_DATA, le32_to_cpup(new_io_mc_regs++));
1846 			} else {
1847 				WREG32(MC_SEQ_IO_DEBUG_INDEX, io_mc_regs[(i << 1)]);
1848 				WREG32(MC_SEQ_IO_DEBUG_DATA, io_mc_regs[(i << 1) + 1]);
1849 			}
1850 		}
1851 		/* load the MC ucode */
1852 		for (i = 0; i < ucode_size; i++) {
1853 			if (rdev->new_fw)
1854 				WREG32(MC_SEQ_SUP_PGM, le32_to_cpup(new_fw_data++));
1855 			else
1856 				WREG32(MC_SEQ_SUP_PGM, be32_to_cpup(fw_data++));
1857 		}
1858 
1859 		/* put the engine back into the active state */
1860 		WREG32(MC_SEQ_SUP_CNTL, 0x00000008);
1861 		WREG32(MC_SEQ_SUP_CNTL, 0x00000004);
1862 		WREG32(MC_SEQ_SUP_CNTL, 0x00000001);
1863 
1864 		/* wait for training to complete */
1865 		for (i = 0; i < rdev->usec_timeout; i++) {
1866 			if (RREG32(MC_SEQ_TRAIN_WAKEUP_CNTL) & TRAIN_DONE_D0)
1867 				break;
1868 			udelay(1);
1869 		}
1870 		for (i = 0; i < rdev->usec_timeout; i++) {
1871 			if (RREG32(MC_SEQ_TRAIN_WAKEUP_CNTL) & TRAIN_DONE_D1)
1872 				break;
1873 			udelay(1);
1874 		}
1875 
1876 		if (running)
1877 			WREG32(MC_SHARED_BLACKOUT_CNTL, blackout);
1878 	}
1879 
1880 	return 0;
1881 }
1882 
1883 /**
1884  * cik_init_microcode - load ucode images from disk
1885  *
1886  * @rdev: radeon_device pointer
1887  *
1888  * Use the firmware interface to load the ucode images into
1889  * the driver (not loaded into hw).
1890  * Returns 0 on success, error on failure.
1891  */
1892 static int cik_init_microcode(struct radeon_device *rdev)
1893 {
1894 	const char *chip_name;
1895 	const char *new_chip_name;
1896 	size_t pfp_req_size, me_req_size, ce_req_size,
1897 		mec_req_size, rlc_req_size, mc_req_size = 0,
1898 		sdma_req_size, smc_req_size = 0, mc2_req_size = 0;
1899 	char fw_name[30];
1900 	int new_fw = 0;
1901 	int err;
1902 	int num_fw;
1903 
1904 	DRM_DEBUG("\n");
1905 
1906 	switch (rdev->family) {
1907 	case CHIP_BONAIRE:
1908 		chip_name = "BONAIRE";
1909 		new_chip_name = "bonaire";
1910 		pfp_req_size = CIK_PFP_UCODE_SIZE * 4;
1911 		me_req_size = CIK_ME_UCODE_SIZE * 4;
1912 		ce_req_size = CIK_CE_UCODE_SIZE * 4;
1913 		mec_req_size = CIK_MEC_UCODE_SIZE * 4;
1914 		rlc_req_size = BONAIRE_RLC_UCODE_SIZE * 4;
1915 		mc_req_size = BONAIRE_MC_UCODE_SIZE * 4;
1916 		mc2_req_size = BONAIRE_MC2_UCODE_SIZE * 4;
1917 		sdma_req_size = CIK_SDMA_UCODE_SIZE * 4;
1918 		smc_req_size = ALIGN(BONAIRE_SMC_UCODE_SIZE, 4);
1919 		num_fw = 8;
1920 		break;
1921 	case CHIP_HAWAII:
1922 		chip_name = "HAWAII";
1923 		new_chip_name = "hawaii";
1924 		pfp_req_size = CIK_PFP_UCODE_SIZE * 4;
1925 		me_req_size = CIK_ME_UCODE_SIZE * 4;
1926 		ce_req_size = CIK_CE_UCODE_SIZE * 4;
1927 		mec_req_size = CIK_MEC_UCODE_SIZE * 4;
1928 		rlc_req_size = BONAIRE_RLC_UCODE_SIZE * 4;
1929 		mc_req_size = HAWAII_MC_UCODE_SIZE * 4;
1930 		mc2_req_size = HAWAII_MC2_UCODE_SIZE * 4;
1931 		sdma_req_size = CIK_SDMA_UCODE_SIZE * 4;
1932 		smc_req_size = ALIGN(HAWAII_SMC_UCODE_SIZE, 4);
1933 		num_fw = 8;
1934 		break;
1935 	case CHIP_KAVERI:
1936 		chip_name = "KAVERI";
1937 		new_chip_name = "kaveri";
1938 		pfp_req_size = CIK_PFP_UCODE_SIZE * 4;
1939 		me_req_size = CIK_ME_UCODE_SIZE * 4;
1940 		ce_req_size = CIK_CE_UCODE_SIZE * 4;
1941 		mec_req_size = CIK_MEC_UCODE_SIZE * 4;
1942 		rlc_req_size = KV_RLC_UCODE_SIZE * 4;
1943 		sdma_req_size = CIK_SDMA_UCODE_SIZE * 4;
1944 		num_fw = 7;
1945 		break;
1946 	case CHIP_KABINI:
1947 		chip_name = "KABINI";
1948 		new_chip_name = "kabini";
1949 		pfp_req_size = CIK_PFP_UCODE_SIZE * 4;
1950 		me_req_size = CIK_ME_UCODE_SIZE * 4;
1951 		ce_req_size = CIK_CE_UCODE_SIZE * 4;
1952 		mec_req_size = CIK_MEC_UCODE_SIZE * 4;
1953 		rlc_req_size = KB_RLC_UCODE_SIZE * 4;
1954 		sdma_req_size = CIK_SDMA_UCODE_SIZE * 4;
1955 		num_fw = 6;
1956 		break;
1957 	case CHIP_MULLINS:
1958 		chip_name = "MULLINS";
1959 		new_chip_name = "mullins";
1960 		pfp_req_size = CIK_PFP_UCODE_SIZE * 4;
1961 		me_req_size = CIK_ME_UCODE_SIZE * 4;
1962 		ce_req_size = CIK_CE_UCODE_SIZE * 4;
1963 		mec_req_size = CIK_MEC_UCODE_SIZE * 4;
1964 		rlc_req_size = ML_RLC_UCODE_SIZE * 4;
1965 		sdma_req_size = CIK_SDMA_UCODE_SIZE * 4;
1966 		num_fw = 6;
1967 		break;
1968 	default: BUG();
1969 	}
1970 
1971 	DRM_INFO("Loading %s Microcode\n", new_chip_name);
1972 
1973 	ksnprintf(fw_name, sizeof(fw_name), "radeonkmsfw_%s_pfp", new_chip_name);
1974 	err = request_firmware(&rdev->pfp_fw, fw_name, rdev->dev);
1975 	if (err) {
1976 		ksnprintf(fw_name, sizeof(fw_name), "radeonkmsfw_%s_pfp", chip_name);
1977 		err = request_firmware(&rdev->pfp_fw, fw_name, rdev->dev);
1978 		if (err)
1979 			goto out;
1980 		if (rdev->pfp_fw->datasize != pfp_req_size) {
1981 			printk(KERN_ERR
1982 			       "cik_cp: Bogus length %zu in firmware \"%s\"\n",
1983 			       rdev->pfp_fw->datasize, fw_name);
1984 			err = -EINVAL;
1985 			goto out;
1986 		}
1987 	} else {
1988 		err = radeon_ucode_validate(rdev->pfp_fw);
1989 		if (err) {
1990 			printk(KERN_ERR
1991 			       "cik_fw: validation failed for firmware \"%s\"\n",
1992 			       fw_name);
1993 			goto out;
1994 		} else {
1995 			new_fw++;
1996 		}
1997 	}
1998 
1999 	ksnprintf(fw_name, sizeof(fw_name), "radeonkmsfw_%s_me", new_chip_name);
2000 	err = request_firmware(&rdev->me_fw, fw_name, rdev->dev);
2001 	if (err) {
2002 		ksnprintf(fw_name, sizeof(fw_name), "radeonkmsfw_%s_me", chip_name);
2003 		err = request_firmware(&rdev->me_fw, fw_name, rdev->dev);
2004 		if (err)
2005 			goto out;
2006 		if (rdev->me_fw->datasize != me_req_size) {
2007 			printk(KERN_ERR
2008 			       "cik_cp: Bogus length %zu in firmware \"%s\"\n",
2009 			       rdev->me_fw->datasize, fw_name);
2010 			err = -EINVAL;
2011 		}
2012 	} else {
2013 		err = radeon_ucode_validate(rdev->me_fw);
2014 		if (err) {
2015 			printk(KERN_ERR
2016 			       "cik_fw: validation failed for firmware \"%s\"\n",
2017 			       fw_name);
2018 			goto out;
2019 		} else {
2020 			new_fw++;
2021 		}
2022 	}
2023 
2024 	ksnprintf(fw_name, sizeof(fw_name), "radeonkmsfw_%s_ce", new_chip_name);
2025 	err = request_firmware(&rdev->ce_fw, fw_name, rdev->dev);
2026 	if (err) {
2027 		ksnprintf(fw_name, sizeof(fw_name), "radeonkmsfw_%s_ce", chip_name);
2028 		err = request_firmware(&rdev->ce_fw, fw_name, rdev->dev);
2029 		if (err)
2030 			goto out;
2031 		if (rdev->ce_fw->datasize != ce_req_size) {
2032 			printk(KERN_ERR
2033 			       "cik_cp: Bogus length %zu in firmware \"%s\"\n",
2034 			       rdev->ce_fw->datasize, fw_name);
2035 			err = -EINVAL;
2036 		}
2037 	} else {
2038 		err = radeon_ucode_validate(rdev->ce_fw);
2039 		if (err) {
2040 			printk(KERN_ERR
2041 			       "cik_fw: validation failed for firmware \"%s\"\n",
2042 			       fw_name);
2043 			goto out;
2044 		} else {
2045 			new_fw++;
2046 		}
2047 	}
2048 
2049 	ksnprintf(fw_name, sizeof(fw_name), "radeonkmsfw_%s_mec", new_chip_name);
2050 	err = request_firmware(&rdev->mec_fw, fw_name, rdev->dev);
2051 	if (err) {
2052 		ksnprintf(fw_name, sizeof(fw_name), "radeonkmsfw_%s_mec", chip_name);
2053 		err = request_firmware(&rdev->mec_fw, fw_name, rdev->dev);
2054 		if (err)
2055 			goto out;
2056 		if (rdev->mec_fw->datasize != mec_req_size) {
2057 			printk(KERN_ERR
2058 			       "cik_cp: Bogus length %zu in firmware \"%s\"\n",
2059 			       rdev->mec_fw->datasize, fw_name);
2060 			err = -EINVAL;
2061 		}
2062 	} else {
2063 		err = radeon_ucode_validate(rdev->mec_fw);
2064 		if (err) {
2065 			printk(KERN_ERR
2066 			       "cik_fw: validation failed for firmware \"%s\"\n",
2067 			       fw_name);
2068 			goto out;
2069 		} else {
2070 			new_fw++;
2071 		}
2072 	}
2073 
2074 	if (rdev->family == CHIP_KAVERI) {
2075 		ksnprintf(fw_name, sizeof(fw_name), "radeonkmsfw_%s_mec2", new_chip_name);
2076 		err = request_firmware(&rdev->mec2_fw, fw_name, rdev->dev);
2077 		if (err) {
2078 			goto out;
2079 		} else {
2080 			err = radeon_ucode_validate(rdev->mec2_fw);
2081 			if (err) {
2082 				goto out;
2083 			} else {
2084 				new_fw++;
2085 			}
2086 		}
2087 	}
2088 
2089 	ksnprintf(fw_name, sizeof(fw_name), "radeonkmsfw_%s_rlc", new_chip_name);
2090 	err = request_firmware(&rdev->rlc_fw, fw_name, rdev->dev);
2091 	if (err) {
2092 		ksnprintf(fw_name, sizeof(fw_name), "radeonkmsfw_%s_rlc", chip_name);
2093 		err = request_firmware(&rdev->rlc_fw, fw_name, rdev->dev);
2094 		if (err)
2095 			goto out;
2096 		if (rdev->rlc_fw->datasize != rlc_req_size) {
2097 			printk(KERN_ERR
2098 			       "cik_rlc: Bogus length %zu in firmware \"%s\"\n",
2099 			       rdev->rlc_fw->datasize, fw_name);
2100 			err = -EINVAL;
2101 		}
2102 	} else {
2103 		err = radeon_ucode_validate(rdev->rlc_fw);
2104 		if (err) {
2105 			printk(KERN_ERR
2106 			       "cik_fw: validation failed for firmware \"%s\"\n",
2107 			       fw_name);
2108 			goto out;
2109 		} else {
2110 			new_fw++;
2111 		}
2112 	}
2113 
2114 	ksnprintf(fw_name, sizeof(fw_name), "radeonkmsfw_%s_sdma", new_chip_name);
2115 	err = request_firmware(&rdev->sdma_fw, fw_name, rdev->dev);
2116 	if (err) {
2117 		ksnprintf(fw_name, sizeof(fw_name), "radeonkmsfw_%s_sdma", chip_name);
2118 		err = request_firmware(&rdev->sdma_fw, fw_name, rdev->dev);
2119 		if (err)
2120 			goto out;
2121 		if (rdev->sdma_fw->datasize != sdma_req_size) {
2122 			printk(KERN_ERR
2123 			       "cik_sdma: Bogus length %zu in firmware \"%s\"\n",
2124 			       rdev->sdma_fw->datasize, fw_name);
2125 			err = -EINVAL;
2126 		}
2127 	} else {
2128 		err = radeon_ucode_validate(rdev->sdma_fw);
2129 		if (err) {
2130 			printk(KERN_ERR
2131 			       "cik_fw: validation failed for firmware \"%s\"\n",
2132 			       fw_name);
2133 			goto out;
2134 		} else {
2135 			new_fw++;
2136 		}
2137 	}
2138 
2139 	/* No SMC, MC ucode on APUs */
2140 	if (!(rdev->flags & RADEON_IS_IGP)) {
2141 		ksnprintf(fw_name, sizeof(fw_name), "radeonkmsfw_%s_mc", new_chip_name);
2142 		err = request_firmware(&rdev->mc_fw, fw_name, rdev->dev);
2143 		if (err) {
2144 			ksnprintf(fw_name, sizeof(fw_name), "radeonkmsfw_%s_mc2", chip_name);
2145 			err = request_firmware(&rdev->mc_fw, fw_name, rdev->dev);
2146 			if (err) {
2147 				ksnprintf(fw_name, sizeof(fw_name), "radeonkmsfw_%s_mc", chip_name);
2148 				err = request_firmware(&rdev->mc_fw, fw_name, rdev->dev);
2149 				if (err)
2150 					goto out;
2151 			}
2152 			if ((rdev->mc_fw->datasize != mc_req_size) &&
2153 			    (rdev->mc_fw->datasize != mc2_req_size)){
2154 				printk(KERN_ERR
2155 				       "cik_mc: Bogus length %zu in firmware \"%s\"\n",
2156 				       rdev->mc_fw->datasize, fw_name);
2157 				err = -EINVAL;
2158 			}
2159 			DRM_INFO("%s: %zu bytes\n", fw_name, rdev->mc_fw->datasize);
2160 		} else {
2161 			err = radeon_ucode_validate(rdev->mc_fw);
2162 			if (err) {
2163 				printk(KERN_ERR
2164 				       "cik_fw: validation failed for firmware \"%s\"\n",
2165 				       fw_name);
2166 				goto out;
2167 			} else {
2168 				new_fw++;
2169 			}
2170 		}
2171 
2172 		ksnprintf(fw_name, sizeof(fw_name), "radeonkmsfw_%s_smc", new_chip_name);
2173 		err = request_firmware(&rdev->smc_fw, fw_name, rdev->dev);
2174 		if (err) {
2175 			ksnprintf(fw_name, sizeof(fw_name), "radeonkmsfw_%s_smc", chip_name);
2176 			err = request_firmware(&rdev->smc_fw, fw_name, rdev->dev);
2177 			if (err) {
2178 				printk(KERN_ERR
2179 				       "smc: error loading firmware \"%s\"\n",
2180 				       fw_name);
2181 				release_firmware(rdev->smc_fw);
2182 				rdev->smc_fw = NULL;
2183 				err = 0;
2184 			} else if (rdev->smc_fw->datasize != smc_req_size) {
2185 				printk(KERN_ERR
2186 				       "cik_smc: Bogus length %zu in firmware \"%s\"\n",
2187 				       rdev->smc_fw->datasize, fw_name);
2188 				err = -EINVAL;
2189 			}
2190 		} else {
2191 			err = radeon_ucode_validate(rdev->smc_fw);
2192 			if (err) {
2193 				printk(KERN_ERR
2194 				       "cik_fw: validation failed for firmware \"%s\"\n",
2195 				       fw_name);
2196 				goto out;
2197 			} else {
2198 				new_fw++;
2199 			}
2200 		}
2201 	}
2202 
2203 	if (new_fw == 0) {
2204 		rdev->new_fw = false;
2205 	} else if (new_fw < num_fw) {
2206 		printk(KERN_ERR "ci_fw: mixing new and old firmware!\n");
2207 		err = -EINVAL;
2208 	} else {
2209 		rdev->new_fw = true;
2210 	}
2211 
2212 out:
2213 	if (err) {
2214 		if (err != -EINVAL)
2215 			printk(KERN_ERR
2216 			       "cik_cp: Failed to load firmware \"%s\"\n",
2217 			       fw_name);
2218 		release_firmware(rdev->pfp_fw);
2219 		rdev->pfp_fw = NULL;
2220 		release_firmware(rdev->me_fw);
2221 		rdev->me_fw = NULL;
2222 		release_firmware(rdev->ce_fw);
2223 		rdev->ce_fw = NULL;
2224 		release_firmware(rdev->mec_fw);
2225 		rdev->mec_fw = NULL;
2226 		release_firmware(rdev->mec2_fw);
2227 		rdev->mec2_fw = NULL;
2228 		release_firmware(rdev->rlc_fw);
2229 		rdev->rlc_fw = NULL;
2230 		release_firmware(rdev->sdma_fw);
2231 		rdev->sdma_fw = NULL;
2232 		release_firmware(rdev->mc_fw);
2233 		rdev->mc_fw = NULL;
2234 		release_firmware(rdev->smc_fw);
2235 		rdev->smc_fw = NULL;
2236 	}
2237 	return err;
2238 }
2239 
2240 /**
2241  * cik_fini_microcode - drop the firmwares image references
2242  *
2243  * @rdev: radeon_device pointer
2244  *
2245  * Drop the pfp, me, mec, mec2, rlc, sdma, mc, smc and ce firmware image references.
2246  * Called at driver shutdown.
2247  */
2248 static void cik_fini_microcode(struct radeon_device *rdev)
2249 {
2250 	release_firmware(rdev->pfp_fw);
2251 	rdev->pfp_fw = NULL;
2252 	release_firmware(rdev->me_fw);
2253 	rdev->me_fw = NULL;
2254 	release_firmware(rdev->ce_fw);
2255 	rdev->ce_fw = NULL;
2256 	release_firmware(rdev->mec_fw);
2257 	rdev->mec_fw = NULL;
2258 	release_firmware(rdev->mec2_fw);
2259 	rdev->mec2_fw = NULL;
2260 	release_firmware(rdev->rlc_fw);
2261 	rdev->rlc_fw = NULL;
2262 	release_firmware(rdev->sdma_fw);
2263 	rdev->sdma_fw = NULL;
2264 	release_firmware(rdev->mc_fw);
2265 	rdev->mc_fw = NULL;
2266 	release_firmware(rdev->smc_fw);
2267 	rdev->smc_fw = NULL;
2268 }
2269 
2270 /*
2271  * Core functions
2272  */
2273 /**
2274  * cik_tiling_mode_table_init - init the hw tiling table
2275  *
2276  * @rdev: radeon_device pointer
2277  *
2278  * Starting with SI, the tiling setup is done globally in a
2279  * set of 32 tiling modes.  Rather than selecting each set of
2280  * parameters per surface as on older asics, we just select
2281  * which index in the tiling table we want to use, and the
2282  * surface uses those parameters (CIK).
2283  */
2284 static void cik_tiling_mode_table_init(struct radeon_device *rdev)
2285 {
2286 	const u32 num_tile_mode_states = 32;
2287 	const u32 num_secondary_tile_mode_states = 16;
2288 	u32 reg_offset, gb_tile_moden, split_equal_to_row_size;
2289 	u32 num_pipe_configs;
2290 	u32 num_rbs = rdev->config.cik.max_backends_per_se *
2291 		rdev->config.cik.max_shader_engines;
2292 
2293 	switch (rdev->config.cik.mem_row_size_in_kb) {
2294 	case 1:
2295 		split_equal_to_row_size = ADDR_SURF_TILE_SPLIT_1KB;
2296 		break;
2297 	case 2:
2298 	default:
2299 		split_equal_to_row_size = ADDR_SURF_TILE_SPLIT_2KB;
2300 		break;
2301 	case 4:
2302 		split_equal_to_row_size = ADDR_SURF_TILE_SPLIT_4KB;
2303 		break;
2304 	}
2305 
2306 	num_pipe_configs = rdev->config.cik.max_tile_pipes;
2307 	if (num_pipe_configs > 8)
2308 		num_pipe_configs = 16;
2309 
2310 	if (num_pipe_configs == 16) {
2311 		for (reg_offset = 0; reg_offset < num_tile_mode_states; reg_offset++) {
2312 			switch (reg_offset) {
2313 			case 0:
2314 				gb_tile_moden = (ARRAY_MODE(ARRAY_2D_TILED_THIN1) |
2315 						 MICRO_TILE_MODE_NEW(ADDR_SURF_DEPTH_MICRO_TILING) |
2316 						 PIPE_CONFIG(ADDR_SURF_P16_32x32_16x16) |
2317 						 TILE_SPLIT(ADDR_SURF_TILE_SPLIT_64B));
2318 				break;
2319 			case 1:
2320 				gb_tile_moden = (ARRAY_MODE(ARRAY_2D_TILED_THIN1) |
2321 						 MICRO_TILE_MODE_NEW(ADDR_SURF_DEPTH_MICRO_TILING) |
2322 						 PIPE_CONFIG(ADDR_SURF_P16_32x32_16x16) |
2323 						 TILE_SPLIT(ADDR_SURF_TILE_SPLIT_128B));
2324 				break;
2325 			case 2:
2326 				gb_tile_moden = (ARRAY_MODE(ARRAY_2D_TILED_THIN1) |
2327 						 MICRO_TILE_MODE_NEW(ADDR_SURF_DEPTH_MICRO_TILING) |
2328 						 PIPE_CONFIG(ADDR_SURF_P16_32x32_16x16) |
2329 						 TILE_SPLIT(ADDR_SURF_TILE_SPLIT_256B));
2330 				break;
2331 			case 3:
2332 				gb_tile_moden = (ARRAY_MODE(ARRAY_2D_TILED_THIN1) |
2333 						 MICRO_TILE_MODE_NEW(ADDR_SURF_DEPTH_MICRO_TILING) |
2334 						 PIPE_CONFIG(ADDR_SURF_P16_32x32_16x16) |
2335 						 TILE_SPLIT(ADDR_SURF_TILE_SPLIT_512B));
2336 				break;
2337 			case 4:
2338 				gb_tile_moden = (ARRAY_MODE(ARRAY_2D_TILED_THIN1) |
2339 						 MICRO_TILE_MODE_NEW(ADDR_SURF_DEPTH_MICRO_TILING) |
2340 						 PIPE_CONFIG(ADDR_SURF_P16_32x32_16x16) |
2341 						 TILE_SPLIT(split_equal_to_row_size));
2342 				break;
2343 			case 5:
2344 				gb_tile_moden = (ARRAY_MODE(ARRAY_1D_TILED_THIN1) |
2345 						 PIPE_CONFIG(ADDR_SURF_P16_32x32_16x16) |
2346 						 MICRO_TILE_MODE_NEW(ADDR_SURF_DEPTH_MICRO_TILING));
2347 				break;
2348 			case 6:
2349 				gb_tile_moden = (ARRAY_MODE(ARRAY_PRT_2D_TILED_THIN1) |
2350 						 MICRO_TILE_MODE_NEW(ADDR_SURF_DEPTH_MICRO_TILING) |
2351 						 PIPE_CONFIG(ADDR_SURF_P16_32x32_16x16) |
2352 						 TILE_SPLIT(ADDR_SURF_TILE_SPLIT_256B));
2353 				break;
2354 			case 7:
2355 				gb_tile_moden = (ARRAY_MODE(ARRAY_PRT_2D_TILED_THIN1) |
2356 						 MICRO_TILE_MODE_NEW(ADDR_SURF_DEPTH_MICRO_TILING) |
2357 						 PIPE_CONFIG(ADDR_SURF_P16_32x32_16x16) |
2358 						 TILE_SPLIT(split_equal_to_row_size));
2359 				break;
2360 			case 8:
2361 				gb_tile_moden = (ARRAY_MODE(ARRAY_LINEAR_ALIGNED) |
2362 						 PIPE_CONFIG(ADDR_SURF_P16_32x32_16x16));
2363 				break;
2364 			case 9:
2365 				gb_tile_moden = (ARRAY_MODE(ARRAY_1D_TILED_THIN1) |
2366 						 PIPE_CONFIG(ADDR_SURF_P16_32x32_16x16) |
2367 						 MICRO_TILE_MODE_NEW(ADDR_SURF_DISPLAY_MICRO_TILING));
2368 				break;
2369 			case 10:
2370 				gb_tile_moden = (ARRAY_MODE(ARRAY_2D_TILED_THIN1) |
2371 						 MICRO_TILE_MODE_NEW(ADDR_SURF_DISPLAY_MICRO_TILING) |
2372 						 PIPE_CONFIG(ADDR_SURF_P16_32x32_16x16) |
2373 						 SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_2));
2374 				break;
2375 			case 11:
2376 				gb_tile_moden = (ARRAY_MODE(ARRAY_PRT_TILED_THIN1) |
2377 						 MICRO_TILE_MODE_NEW(ADDR_SURF_DISPLAY_MICRO_TILING) |
2378 						 PIPE_CONFIG(ADDR_SURF_P16_32x32_8x16) |
2379 						 SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_2));
2380 				break;
2381 			case 12:
2382 				gb_tile_moden = (ARRAY_MODE(ARRAY_PRT_2D_TILED_THIN1) |
2383 						 MICRO_TILE_MODE_NEW(ADDR_SURF_DISPLAY_MICRO_TILING) |
2384 						 PIPE_CONFIG(ADDR_SURF_P16_32x32_16x16) |
2385 						 SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_2));
2386 				break;
2387 			case 13:
2388 				gb_tile_moden = (ARRAY_MODE(ARRAY_1D_TILED_THIN1) |
2389 						 PIPE_CONFIG(ADDR_SURF_P16_32x32_16x16) |
2390 						 MICRO_TILE_MODE_NEW(ADDR_SURF_THIN_MICRO_TILING));
2391 				break;
2392 			case 14:
2393 				gb_tile_moden = (ARRAY_MODE(ARRAY_2D_TILED_THIN1) |
2394 						 MICRO_TILE_MODE_NEW(ADDR_SURF_THIN_MICRO_TILING) |
2395 						 PIPE_CONFIG(ADDR_SURF_P16_32x32_16x16) |
2396 						 SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_2));
2397 				break;
2398 			case 16:
2399 				gb_tile_moden = (ARRAY_MODE(ARRAY_PRT_TILED_THIN1) |
2400 						 MICRO_TILE_MODE_NEW(ADDR_SURF_THIN_MICRO_TILING) |
2401 						 PIPE_CONFIG(ADDR_SURF_P16_32x32_8x16) |
2402 						 SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_2));
2403 				break;
2404 			case 17:
2405 				gb_tile_moden = (ARRAY_MODE(ARRAY_PRT_2D_TILED_THIN1) |
2406 						 MICRO_TILE_MODE_NEW(ADDR_SURF_THIN_MICRO_TILING) |
2407 						 PIPE_CONFIG(ADDR_SURF_P16_32x32_16x16) |
2408 						 SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_2));
2409 				break;
2410 			case 27:
2411 				gb_tile_moden = (ARRAY_MODE(ARRAY_1D_TILED_THIN1) |
2412 						 PIPE_CONFIG(ADDR_SURF_P16_32x32_16x16) |
2413 						 MICRO_TILE_MODE_NEW(ADDR_SURF_ROTATED_MICRO_TILING));
2414 				break;
2415 			case 28:
2416 				gb_tile_moden = (ARRAY_MODE(ARRAY_2D_TILED_THIN1) |
2417 						 MICRO_TILE_MODE_NEW(ADDR_SURF_ROTATED_MICRO_TILING) |
2418 						 PIPE_CONFIG(ADDR_SURF_P16_32x32_16x16) |
2419 						 SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_2));
2420 				break;
2421 			case 29:
2422 				gb_tile_moden = (ARRAY_MODE(ARRAY_PRT_TILED_THIN1) |
2423 						 MICRO_TILE_MODE_NEW(ADDR_SURF_ROTATED_MICRO_TILING) |
2424 						 PIPE_CONFIG(ADDR_SURF_P16_32x32_8x16) |
2425 						 SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_2));
2426 				break;
2427 			case 30:
2428 				gb_tile_moden = (ARRAY_MODE(ARRAY_PRT_2D_TILED_THIN1) |
2429 						 MICRO_TILE_MODE_NEW(ADDR_SURF_ROTATED_MICRO_TILING) |
2430 						 PIPE_CONFIG(ADDR_SURF_P16_32x32_16x16) |
2431 						 SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_2));
2432 				break;
2433 			default:
2434 				gb_tile_moden = 0;
2435 				break;
2436 			}
2437 			rdev->config.cik.tile_mode_array[reg_offset] = gb_tile_moden;
2438 			WREG32(GB_TILE_MODE0 + (reg_offset * 4), gb_tile_moden);
2439 		}
2440 		for (reg_offset = 0; reg_offset < num_secondary_tile_mode_states; reg_offset++) {
2441 			switch (reg_offset) {
2442 			case 0:
2443 				gb_tile_moden = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
2444 						 BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_4) |
2445 						 MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_2) |
2446 						 NUM_BANKS(ADDR_SURF_16_BANK));
2447 				break;
2448 			case 1:
2449 				gb_tile_moden = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
2450 						 BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_2) |
2451 						 MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_2) |
2452 						 NUM_BANKS(ADDR_SURF_16_BANK));
2453 				break;
2454 			case 2:
2455 				gb_tile_moden = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
2456 						 BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_1) |
2457 						 MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_1) |
2458 						 NUM_BANKS(ADDR_SURF_16_BANK));
2459 				break;
2460 			case 3:
2461 				gb_tile_moden = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
2462 						 BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_1) |
2463 						 MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_1) |
2464 						 NUM_BANKS(ADDR_SURF_16_BANK));
2465 				break;
2466 			case 4:
2467 				gb_tile_moden = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
2468 						 BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_1) |
2469 						 MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_1) |
2470 						 NUM_BANKS(ADDR_SURF_8_BANK));
2471 				break;
2472 			case 5:
2473 				gb_tile_moden = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
2474 						 BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_1) |
2475 						 MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_1) |
2476 						 NUM_BANKS(ADDR_SURF_4_BANK));
2477 				break;
2478 			case 6:
2479 				gb_tile_moden = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
2480 						 BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_1) |
2481 						 MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_1) |
2482 						 NUM_BANKS(ADDR_SURF_2_BANK));
2483 				break;
2484 			case 8:
2485 				gb_tile_moden = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
2486 						 BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_4) |
2487 						 MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_2) |
2488 						 NUM_BANKS(ADDR_SURF_16_BANK));
2489 				break;
2490 			case 9:
2491 				gb_tile_moden = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
2492 						 BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_2) |
2493 						 MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_2) |
2494 						 NUM_BANKS(ADDR_SURF_16_BANK));
2495 				break;
2496 			case 10:
2497 				gb_tile_moden = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
2498 						 BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_1) |
2499 						 MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_1) |
2500 						 NUM_BANKS(ADDR_SURF_16_BANK));
2501 				break;
2502 			case 11:
2503 				gb_tile_moden = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
2504 						 BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_1) |
2505 						 MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_1) |
2506 						 NUM_BANKS(ADDR_SURF_8_BANK));
2507 				break;
2508 			case 12:
2509 				gb_tile_moden = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
2510 						 BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_1) |
2511 						 MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_1) |
2512 						 NUM_BANKS(ADDR_SURF_4_BANK));
2513 				break;
2514 			case 13:
2515 				gb_tile_moden = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
2516 						 BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_1) |
2517 						 MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_1) |
2518 						 NUM_BANKS(ADDR_SURF_2_BANK));
2519 				break;
2520 			case 14:
2521 				gb_tile_moden = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
2522 						 BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_1) |
2523 						 MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_1) |
2524 						 NUM_BANKS(ADDR_SURF_2_BANK));
2525 				break;
2526 			default:
2527 				gb_tile_moden = 0;
2528 				break;
2529 			}
2530 			rdev->config.cik.macrotile_mode_array[reg_offset] = gb_tile_moden;
2531 			WREG32(GB_MACROTILE_MODE0 + (reg_offset * 4), gb_tile_moden);
2532 		}
2533 	} else if (num_pipe_configs == 8) {
2534 		for (reg_offset = 0; reg_offset < num_tile_mode_states; reg_offset++) {
2535 			switch (reg_offset) {
2536 			case 0:
2537 				gb_tile_moden = (ARRAY_MODE(ARRAY_2D_TILED_THIN1) |
2538 						 MICRO_TILE_MODE_NEW(ADDR_SURF_DEPTH_MICRO_TILING) |
2539 						 PIPE_CONFIG(ADDR_SURF_P8_32x32_16x16) |
2540 						 TILE_SPLIT(ADDR_SURF_TILE_SPLIT_64B));
2541 				break;
2542 			case 1:
2543 				gb_tile_moden = (ARRAY_MODE(ARRAY_2D_TILED_THIN1) |
2544 						 MICRO_TILE_MODE_NEW(ADDR_SURF_DEPTH_MICRO_TILING) |
2545 						 PIPE_CONFIG(ADDR_SURF_P8_32x32_16x16) |
2546 						 TILE_SPLIT(ADDR_SURF_TILE_SPLIT_128B));
2547 				break;
2548 			case 2:
2549 				gb_tile_moden = (ARRAY_MODE(ARRAY_2D_TILED_THIN1) |
2550 						 MICRO_TILE_MODE_NEW(ADDR_SURF_DEPTH_MICRO_TILING) |
2551 						 PIPE_CONFIG(ADDR_SURF_P8_32x32_16x16) |
2552 						 TILE_SPLIT(ADDR_SURF_TILE_SPLIT_256B));
2553 				break;
2554 			case 3:
2555 				gb_tile_moden = (ARRAY_MODE(ARRAY_2D_TILED_THIN1) |
2556 						 MICRO_TILE_MODE_NEW(ADDR_SURF_DEPTH_MICRO_TILING) |
2557 						 PIPE_CONFIG(ADDR_SURF_P8_32x32_16x16) |
2558 						 TILE_SPLIT(ADDR_SURF_TILE_SPLIT_512B));
2559 				break;
2560 			case 4:
2561 				gb_tile_moden = (ARRAY_MODE(ARRAY_2D_TILED_THIN1) |
2562 						 MICRO_TILE_MODE_NEW(ADDR_SURF_DEPTH_MICRO_TILING) |
2563 						 PIPE_CONFIG(ADDR_SURF_P8_32x32_16x16) |
2564 						 TILE_SPLIT(split_equal_to_row_size));
2565 				break;
2566 			case 5:
2567 				gb_tile_moden = (ARRAY_MODE(ARRAY_1D_TILED_THIN1) |
2568 						 PIPE_CONFIG(ADDR_SURF_P8_32x32_16x16) |
2569 						 MICRO_TILE_MODE_NEW(ADDR_SURF_DEPTH_MICRO_TILING));
2570 				break;
2571 			case 6:
2572 				gb_tile_moden = (ARRAY_MODE(ARRAY_PRT_2D_TILED_THIN1) |
2573 						 MICRO_TILE_MODE_NEW(ADDR_SURF_DEPTH_MICRO_TILING) |
2574 						 PIPE_CONFIG(ADDR_SURF_P8_32x32_16x16) |
2575 						 TILE_SPLIT(ADDR_SURF_TILE_SPLIT_256B));
2576 				break;
2577 			case 7:
2578 				gb_tile_moden = (ARRAY_MODE(ARRAY_PRT_2D_TILED_THIN1) |
2579 						 MICRO_TILE_MODE_NEW(ADDR_SURF_DEPTH_MICRO_TILING) |
2580 						 PIPE_CONFIG(ADDR_SURF_P8_32x32_16x16) |
2581 						 TILE_SPLIT(split_equal_to_row_size));
2582 				break;
2583 			case 8:
2584 				gb_tile_moden = (ARRAY_MODE(ARRAY_LINEAR_ALIGNED) |
2585 						 PIPE_CONFIG(ADDR_SURF_P8_32x32_16x16));
2586 				break;
2587 			case 9:
2588 				gb_tile_moden = (ARRAY_MODE(ARRAY_1D_TILED_THIN1) |
2589 						 PIPE_CONFIG(ADDR_SURF_P8_32x32_16x16) |
2590 						 MICRO_TILE_MODE_NEW(ADDR_SURF_DISPLAY_MICRO_TILING));
2591 				break;
2592 			case 10:
2593 				gb_tile_moden = (ARRAY_MODE(ARRAY_2D_TILED_THIN1) |
2594 						 MICRO_TILE_MODE_NEW(ADDR_SURF_DISPLAY_MICRO_TILING) |
2595 						 PIPE_CONFIG(ADDR_SURF_P8_32x32_16x16) |
2596 						 SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_2));
2597 				break;
2598 			case 11:
2599 				gb_tile_moden = (ARRAY_MODE(ARRAY_PRT_TILED_THIN1) |
2600 						 MICRO_TILE_MODE_NEW(ADDR_SURF_DISPLAY_MICRO_TILING) |
2601 						 PIPE_CONFIG(ADDR_SURF_P8_32x32_8x16) |
2602 						 SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_2));
2603 				break;
2604 			case 12:
2605 				gb_tile_moden = (ARRAY_MODE(ARRAY_PRT_2D_TILED_THIN1) |
2606 						 MICRO_TILE_MODE_NEW(ADDR_SURF_DISPLAY_MICRO_TILING) |
2607 						 PIPE_CONFIG(ADDR_SURF_P8_32x32_16x16) |
2608 						 SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_2));
2609 				break;
2610 			case 13:
2611 				gb_tile_moden = (ARRAY_MODE(ARRAY_1D_TILED_THIN1) |
2612 						 PIPE_CONFIG(ADDR_SURF_P8_32x32_16x16) |
2613 						 MICRO_TILE_MODE_NEW(ADDR_SURF_THIN_MICRO_TILING));
2614 				break;
2615 			case 14:
2616 				gb_tile_moden = (ARRAY_MODE(ARRAY_2D_TILED_THIN1) |
2617 						 MICRO_TILE_MODE_NEW(ADDR_SURF_THIN_MICRO_TILING) |
2618 						 PIPE_CONFIG(ADDR_SURF_P8_32x32_16x16) |
2619 						 SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_2));
2620 				break;
2621 			case 16:
2622 				gb_tile_moden = (ARRAY_MODE(ARRAY_PRT_TILED_THIN1) |
2623 						 MICRO_TILE_MODE_NEW(ADDR_SURF_THIN_MICRO_TILING) |
2624 						 PIPE_CONFIG(ADDR_SURF_P8_32x32_8x16) |
2625 						 SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_2));
2626 				break;
2627 			case 17:
2628 				gb_tile_moden = (ARRAY_MODE(ARRAY_PRT_2D_TILED_THIN1) |
2629 						 MICRO_TILE_MODE_NEW(ADDR_SURF_THIN_MICRO_TILING) |
2630 						 PIPE_CONFIG(ADDR_SURF_P8_32x32_16x16) |
2631 						 SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_2));
2632 				break;
2633 			case 27:
2634 				gb_tile_moden = (ARRAY_MODE(ARRAY_1D_TILED_THIN1) |
2635 						 PIPE_CONFIG(ADDR_SURF_P8_32x32_16x16) |
2636 						 MICRO_TILE_MODE_NEW(ADDR_SURF_ROTATED_MICRO_TILING));
2637 				break;
2638 			case 28:
2639 				gb_tile_moden = (ARRAY_MODE(ARRAY_2D_TILED_THIN1) |
2640 						 MICRO_TILE_MODE_NEW(ADDR_SURF_ROTATED_MICRO_TILING) |
2641 						 PIPE_CONFIG(ADDR_SURF_P8_32x32_16x16) |
2642 						 SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_2));
2643 				break;
2644 			case 29:
2645 				gb_tile_moden = (ARRAY_MODE(ARRAY_PRT_TILED_THIN1) |
2646 						 MICRO_TILE_MODE_NEW(ADDR_SURF_ROTATED_MICRO_TILING) |
2647 						 PIPE_CONFIG(ADDR_SURF_P8_32x32_8x16) |
2648 						 SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_2));
2649 				break;
2650 			case 30:
2651 				gb_tile_moden = (ARRAY_MODE(ARRAY_PRT_2D_TILED_THIN1) |
2652 						 MICRO_TILE_MODE_NEW(ADDR_SURF_ROTATED_MICRO_TILING) |
2653 						 PIPE_CONFIG(ADDR_SURF_P8_32x32_16x16) |
2654 						 SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_2));
2655 				break;
2656 			default:
2657 				gb_tile_moden = 0;
2658 				break;
2659 			}
2660 			rdev->config.cik.tile_mode_array[reg_offset] = gb_tile_moden;
2661 			WREG32(GB_TILE_MODE0 + (reg_offset * 4), gb_tile_moden);
2662 		}
2663 		for (reg_offset = 0; reg_offset < num_secondary_tile_mode_states; reg_offset++) {
2664 			switch (reg_offset) {
2665 			case 0:
2666 				gb_tile_moden = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
2667 						 BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_4) |
2668 						 MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_4) |
2669 						 NUM_BANKS(ADDR_SURF_16_BANK));
2670 				break;
2671 			case 1:
2672 				gb_tile_moden = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
2673 						 BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_2) |
2674 						 MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_2) |
2675 						 NUM_BANKS(ADDR_SURF_16_BANK));
2676 				break;
2677 			case 2:
2678 				gb_tile_moden = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
2679 						 BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_1) |
2680 						 MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_2) |
2681 						 NUM_BANKS(ADDR_SURF_16_BANK));
2682 				break;
2683 			case 3:
2684 				gb_tile_moden = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
2685 						 BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_1) |
2686 						 MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_2) |
2687 						 NUM_BANKS(ADDR_SURF_16_BANK));
2688 				break;
2689 			case 4:
2690 				gb_tile_moden = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
2691 						 BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_1) |
2692 						 MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_1) |
2693 						 NUM_BANKS(ADDR_SURF_8_BANK));
2694 				break;
2695 			case 5:
2696 				gb_tile_moden = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
2697 						 BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_1) |
2698 						 MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_1) |
2699 						 NUM_BANKS(ADDR_SURF_4_BANK));
2700 				break;
2701 			case 6:
2702 				gb_tile_moden = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
2703 						 BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_1) |
2704 						 MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_1) |
2705 						 NUM_BANKS(ADDR_SURF_2_BANK));
2706 				break;
2707 			case 8:
2708 				gb_tile_moden = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
2709 						 BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_8) |
2710 						 MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_4) |
2711 						 NUM_BANKS(ADDR_SURF_16_BANK));
2712 				break;
2713 			case 9:
2714 				gb_tile_moden = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
2715 						 BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_4) |
2716 						 MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_4) |
2717 						 NUM_BANKS(ADDR_SURF_16_BANK));
2718 				break;
2719 			case 10:
2720 				gb_tile_moden = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
2721 						 BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_2) |
2722 						 MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_2) |
2723 						 NUM_BANKS(ADDR_SURF_16_BANK));
2724 				break;
2725 			case 11:
2726 				gb_tile_moden = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
2727 						 BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_1) |
2728 						 MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_2) |
2729 						 NUM_BANKS(ADDR_SURF_16_BANK));
2730 				break;
2731 			case 12:
2732 				gb_tile_moden = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
2733 						 BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_1) |
2734 						 MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_1) |
2735 						 NUM_BANKS(ADDR_SURF_8_BANK));
2736 				break;
2737 			case 13:
2738 				gb_tile_moden = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
2739 						 BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_1) |
2740 						 MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_1) |
2741 						 NUM_BANKS(ADDR_SURF_4_BANK));
2742 				break;
2743 			case 14:
2744 				gb_tile_moden = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
2745 						 BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_1) |
2746 						 MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_1) |
2747 						 NUM_BANKS(ADDR_SURF_2_BANK));
2748 				break;
2749 			default:
2750 				gb_tile_moden = 0;
2751 				break;
2752 			}
2753 			rdev->config.cik.macrotile_mode_array[reg_offset] = gb_tile_moden;
2754 			WREG32(GB_MACROTILE_MODE0 + (reg_offset * 4), gb_tile_moden);
2755 		}
2756 	} else if (num_pipe_configs == 4) {
2757 		if (num_rbs == 4) {
2758 			for (reg_offset = 0; reg_offset < num_tile_mode_states; reg_offset++) {
2759 				switch (reg_offset) {
2760 				case 0:
2761 					gb_tile_moden = (ARRAY_MODE(ARRAY_2D_TILED_THIN1) |
2762 							 MICRO_TILE_MODE_NEW(ADDR_SURF_DEPTH_MICRO_TILING) |
2763 							 PIPE_CONFIG(ADDR_SURF_P4_16x16) |
2764 							 TILE_SPLIT(ADDR_SURF_TILE_SPLIT_64B));
2765 					break;
2766 				case 1:
2767 					gb_tile_moden = (ARRAY_MODE(ARRAY_2D_TILED_THIN1) |
2768 							 MICRO_TILE_MODE_NEW(ADDR_SURF_DEPTH_MICRO_TILING) |
2769 							 PIPE_CONFIG(ADDR_SURF_P4_16x16) |
2770 							 TILE_SPLIT(ADDR_SURF_TILE_SPLIT_128B));
2771 					break;
2772 				case 2:
2773 					gb_tile_moden = (ARRAY_MODE(ARRAY_2D_TILED_THIN1) |
2774 							 MICRO_TILE_MODE_NEW(ADDR_SURF_DEPTH_MICRO_TILING) |
2775 							 PIPE_CONFIG(ADDR_SURF_P4_16x16) |
2776 							 TILE_SPLIT(ADDR_SURF_TILE_SPLIT_256B));
2777 					break;
2778 				case 3:
2779 					gb_tile_moden = (ARRAY_MODE(ARRAY_2D_TILED_THIN1) |
2780 							 MICRO_TILE_MODE_NEW(ADDR_SURF_DEPTH_MICRO_TILING) |
2781 							 PIPE_CONFIG(ADDR_SURF_P4_16x16) |
2782 							 TILE_SPLIT(ADDR_SURF_TILE_SPLIT_512B));
2783 					break;
2784 				case 4:
2785 					gb_tile_moden = (ARRAY_MODE(ARRAY_2D_TILED_THIN1) |
2786 							 MICRO_TILE_MODE_NEW(ADDR_SURF_DEPTH_MICRO_TILING) |
2787 							 PIPE_CONFIG(ADDR_SURF_P4_16x16) |
2788 							 TILE_SPLIT(split_equal_to_row_size));
2789 					break;
2790 				case 5:
2791 					gb_tile_moden = (ARRAY_MODE(ARRAY_1D_TILED_THIN1) |
2792 							 PIPE_CONFIG(ADDR_SURF_P4_16x16) |
2793 							 MICRO_TILE_MODE_NEW(ADDR_SURF_DEPTH_MICRO_TILING));
2794 					break;
2795 				case 6:
2796 					gb_tile_moden = (ARRAY_MODE(ARRAY_PRT_2D_TILED_THIN1) |
2797 							 MICRO_TILE_MODE_NEW(ADDR_SURF_DEPTH_MICRO_TILING) |
2798 							 PIPE_CONFIG(ADDR_SURF_P4_16x16) |
2799 							 TILE_SPLIT(ADDR_SURF_TILE_SPLIT_256B));
2800 					break;
2801 				case 7:
2802 					gb_tile_moden = (ARRAY_MODE(ARRAY_PRT_2D_TILED_THIN1) |
2803 							 MICRO_TILE_MODE_NEW(ADDR_SURF_DEPTH_MICRO_TILING) |
2804 							 PIPE_CONFIG(ADDR_SURF_P4_16x16) |
2805 							 TILE_SPLIT(split_equal_to_row_size));
2806 					break;
2807 				case 8:
2808 					gb_tile_moden = (ARRAY_MODE(ARRAY_LINEAR_ALIGNED) |
2809 							 PIPE_CONFIG(ADDR_SURF_P4_16x16));
2810 					break;
2811 				case 9:
2812 					gb_tile_moden = (ARRAY_MODE(ARRAY_1D_TILED_THIN1) |
2813 							 PIPE_CONFIG(ADDR_SURF_P4_16x16) |
2814 							 MICRO_TILE_MODE_NEW(ADDR_SURF_DISPLAY_MICRO_TILING));
2815 					break;
2816 				case 10:
2817 					gb_tile_moden = (ARRAY_MODE(ARRAY_2D_TILED_THIN1) |
2818 							 MICRO_TILE_MODE_NEW(ADDR_SURF_DISPLAY_MICRO_TILING) |
2819 							 PIPE_CONFIG(ADDR_SURF_P4_16x16) |
2820 							 SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_2));
2821 					break;
2822 				case 11:
2823 					gb_tile_moden = (ARRAY_MODE(ARRAY_PRT_TILED_THIN1) |
2824 							 MICRO_TILE_MODE_NEW(ADDR_SURF_DISPLAY_MICRO_TILING) |
2825 							 PIPE_CONFIG(ADDR_SURF_P4_8x16) |
2826 							 SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_2));
2827 					break;
2828 				case 12:
2829 					gb_tile_moden = (ARRAY_MODE(ARRAY_PRT_2D_TILED_THIN1) |
2830 							 MICRO_TILE_MODE_NEW(ADDR_SURF_DISPLAY_MICRO_TILING) |
2831 							 PIPE_CONFIG(ADDR_SURF_P4_16x16) |
2832 							 SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_2));
2833 					break;
2834 				case 13:
2835 					gb_tile_moden = (ARRAY_MODE(ARRAY_1D_TILED_THIN1) |
2836 							 PIPE_CONFIG(ADDR_SURF_P4_16x16) |
2837 							 MICRO_TILE_MODE_NEW(ADDR_SURF_THIN_MICRO_TILING));
2838 					break;
2839 				case 14:
2840 					gb_tile_moden = (ARRAY_MODE(ARRAY_2D_TILED_THIN1) |
2841 							 MICRO_TILE_MODE_NEW(ADDR_SURF_THIN_MICRO_TILING) |
2842 							 PIPE_CONFIG(ADDR_SURF_P4_16x16) |
2843 							 SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_2));
2844 					break;
2845 				case 16:
2846 					gb_tile_moden = (ARRAY_MODE(ARRAY_PRT_TILED_THIN1) |
2847 							 MICRO_TILE_MODE_NEW(ADDR_SURF_THIN_MICRO_TILING) |
2848 							 PIPE_CONFIG(ADDR_SURF_P4_8x16) |
2849 							 SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_2));
2850 					break;
2851 				case 17:
2852 					gb_tile_moden = (ARRAY_MODE(ARRAY_PRT_2D_TILED_THIN1) |
2853 							 MICRO_TILE_MODE_NEW(ADDR_SURF_THIN_MICRO_TILING) |
2854 							 PIPE_CONFIG(ADDR_SURF_P4_16x16) |
2855 							 SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_2));
2856 					break;
2857 				case 27:
2858 					gb_tile_moden = (ARRAY_MODE(ARRAY_1D_TILED_THIN1) |
2859 							 PIPE_CONFIG(ADDR_SURF_P4_16x16) |
2860 							 MICRO_TILE_MODE_NEW(ADDR_SURF_ROTATED_MICRO_TILING));
2861 					break;
2862 				case 28:
2863 					gb_tile_moden = (ARRAY_MODE(ARRAY_PRT_2D_TILED_THIN1) |
2864 							 MICRO_TILE_MODE_NEW(ADDR_SURF_ROTATED_MICRO_TILING) |
2865 							 PIPE_CONFIG(ADDR_SURF_P4_16x16) |
2866 							 SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_2));
2867 					break;
2868 				case 29:
2869 					gb_tile_moden = (ARRAY_MODE(ARRAY_PRT_TILED_THIN1) |
2870 							 MICRO_TILE_MODE_NEW(ADDR_SURF_ROTATED_MICRO_TILING) |
2871 							 PIPE_CONFIG(ADDR_SURF_P4_8x16) |
2872 							 SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_2));
2873 					break;
2874 				case 30:
2875 					gb_tile_moden = (ARRAY_MODE(ARRAY_PRT_2D_TILED_THIN1) |
2876 							 MICRO_TILE_MODE_NEW(ADDR_SURF_ROTATED_MICRO_TILING) |
2877 							 PIPE_CONFIG(ADDR_SURF_P4_16x16) |
2878 							 SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_2));
2879 					break;
2880 				default:
2881 					gb_tile_moden = 0;
2882 					break;
2883 				}
2884 				rdev->config.cik.tile_mode_array[reg_offset] = gb_tile_moden;
2885 				WREG32(GB_TILE_MODE0 + (reg_offset * 4), gb_tile_moden);
2886 			}
2887 		} else if (num_rbs < 4) {
2888 			for (reg_offset = 0; reg_offset < num_tile_mode_states; reg_offset++) {
2889 				switch (reg_offset) {
2890 				case 0:
2891 					gb_tile_moden = (ARRAY_MODE(ARRAY_2D_TILED_THIN1) |
2892 							 MICRO_TILE_MODE_NEW(ADDR_SURF_DEPTH_MICRO_TILING) |
2893 							 PIPE_CONFIG(ADDR_SURF_P4_8x16) |
2894 							 TILE_SPLIT(ADDR_SURF_TILE_SPLIT_64B));
2895 					break;
2896 				case 1:
2897 					gb_tile_moden = (ARRAY_MODE(ARRAY_2D_TILED_THIN1) |
2898 							 MICRO_TILE_MODE_NEW(ADDR_SURF_DEPTH_MICRO_TILING) |
2899 							 PIPE_CONFIG(ADDR_SURF_P4_8x16) |
2900 							 TILE_SPLIT(ADDR_SURF_TILE_SPLIT_128B));
2901 					break;
2902 				case 2:
2903 					gb_tile_moden = (ARRAY_MODE(ARRAY_2D_TILED_THIN1) |
2904 							 MICRO_TILE_MODE_NEW(ADDR_SURF_DEPTH_MICRO_TILING) |
2905 							 PIPE_CONFIG(ADDR_SURF_P4_8x16) |
2906 							 TILE_SPLIT(ADDR_SURF_TILE_SPLIT_256B));
2907 					break;
2908 				case 3:
2909 					gb_tile_moden = (ARRAY_MODE(ARRAY_2D_TILED_THIN1) |
2910 							 MICRO_TILE_MODE_NEW(ADDR_SURF_DEPTH_MICRO_TILING) |
2911 							 PIPE_CONFIG(ADDR_SURF_P4_8x16) |
2912 							 TILE_SPLIT(ADDR_SURF_TILE_SPLIT_512B));
2913 					break;
2914 				case 4:
2915 					gb_tile_moden = (ARRAY_MODE(ARRAY_2D_TILED_THIN1) |
2916 							 MICRO_TILE_MODE_NEW(ADDR_SURF_DEPTH_MICRO_TILING) |
2917 							 PIPE_CONFIG(ADDR_SURF_P4_8x16) |
2918 							 TILE_SPLIT(split_equal_to_row_size));
2919 					break;
2920 				case 5:
2921 					gb_tile_moden = (ARRAY_MODE(ARRAY_1D_TILED_THIN1) |
2922 							 PIPE_CONFIG(ADDR_SURF_P4_8x16) |
2923 							 MICRO_TILE_MODE_NEW(ADDR_SURF_DEPTH_MICRO_TILING));
2924 					break;
2925 				case 6:
2926 					gb_tile_moden = (ARRAY_MODE(ARRAY_PRT_2D_TILED_THIN1) |
2927 							 MICRO_TILE_MODE_NEW(ADDR_SURF_DEPTH_MICRO_TILING) |
2928 							 PIPE_CONFIG(ADDR_SURF_P4_8x16) |
2929 							 TILE_SPLIT(ADDR_SURF_TILE_SPLIT_256B));
2930 					break;
2931 				case 7:
2932 					gb_tile_moden = (ARRAY_MODE(ARRAY_PRT_2D_TILED_THIN1) |
2933 							 MICRO_TILE_MODE_NEW(ADDR_SURF_DEPTH_MICRO_TILING) |
2934 							 PIPE_CONFIG(ADDR_SURF_P4_8x16) |
2935 							 TILE_SPLIT(split_equal_to_row_size));
2936 					break;
2937 				case 8:
2938 					gb_tile_moden = (ARRAY_MODE(ARRAY_LINEAR_ALIGNED) |
2939 						 PIPE_CONFIG(ADDR_SURF_P4_8x16));
2940 					break;
2941 				case 9:
2942 					gb_tile_moden = (ARRAY_MODE(ARRAY_1D_TILED_THIN1) |
2943 							 PIPE_CONFIG(ADDR_SURF_P4_8x16) |
2944 							 MICRO_TILE_MODE_NEW(ADDR_SURF_DISPLAY_MICRO_TILING));
2945 					break;
2946 				case 10:
2947 					gb_tile_moden = (ARRAY_MODE(ARRAY_2D_TILED_THIN1) |
2948 							 MICRO_TILE_MODE_NEW(ADDR_SURF_DISPLAY_MICRO_TILING) |
2949 							 PIPE_CONFIG(ADDR_SURF_P4_8x16) |
2950 							 SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_2));
2951 					break;
2952 				case 11:
2953 					gb_tile_moden = (ARRAY_MODE(ARRAY_PRT_TILED_THIN1) |
2954 							 MICRO_TILE_MODE_NEW(ADDR_SURF_DISPLAY_MICRO_TILING) |
2955 							 PIPE_CONFIG(ADDR_SURF_P4_8x16) |
2956 							 SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_2));
2957 					break;
2958 				case 12:
2959 					gb_tile_moden = (ARRAY_MODE(ARRAY_PRT_2D_TILED_THIN1) |
2960 							 MICRO_TILE_MODE_NEW(ADDR_SURF_DISPLAY_MICRO_TILING) |
2961 							 PIPE_CONFIG(ADDR_SURF_P4_8x16) |
2962 							 SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_2));
2963 					break;
2964 				case 13:
2965 					gb_tile_moden = (ARRAY_MODE(ARRAY_1D_TILED_THIN1) |
2966 							 PIPE_CONFIG(ADDR_SURF_P4_8x16) |
2967 							 MICRO_TILE_MODE_NEW(ADDR_SURF_THIN_MICRO_TILING));
2968 					break;
2969 				case 14:
2970 					gb_tile_moden = (ARRAY_MODE(ARRAY_2D_TILED_THIN1) |
2971 							 MICRO_TILE_MODE_NEW(ADDR_SURF_THIN_MICRO_TILING) |
2972 							 PIPE_CONFIG(ADDR_SURF_P4_8x16) |
2973 							 SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_2));
2974 					break;
2975 				case 16:
2976 					gb_tile_moden = (ARRAY_MODE(ARRAY_PRT_TILED_THIN1) |
2977 							 MICRO_TILE_MODE_NEW(ADDR_SURF_THIN_MICRO_TILING) |
2978 							 PIPE_CONFIG(ADDR_SURF_P4_8x16) |
2979 							 SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_2));
2980 					break;
2981 				case 17:
2982 					gb_tile_moden = (ARRAY_MODE(ARRAY_PRT_2D_TILED_THIN1) |
2983 							 MICRO_TILE_MODE_NEW(ADDR_SURF_THIN_MICRO_TILING) |
2984 							 PIPE_CONFIG(ADDR_SURF_P4_8x16) |
2985 							 SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_2));
2986 					break;
2987 				case 27:
2988 					gb_tile_moden = (ARRAY_MODE(ARRAY_1D_TILED_THIN1) |
2989 							 PIPE_CONFIG(ADDR_SURF_P4_8x16) |
2990 							 MICRO_TILE_MODE_NEW(ADDR_SURF_ROTATED_MICRO_TILING));
2991 					break;
2992 				case 28:
2993 					gb_tile_moden = (ARRAY_MODE(ARRAY_PRT_2D_TILED_THIN1) |
2994 							 MICRO_TILE_MODE_NEW(ADDR_SURF_ROTATED_MICRO_TILING) |
2995 							 PIPE_CONFIG(ADDR_SURF_P4_8x16) |
2996 							 SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_2));
2997 					break;
2998 				case 29:
2999 					gb_tile_moden = (ARRAY_MODE(ARRAY_PRT_TILED_THIN1) |
3000 							 MICRO_TILE_MODE_NEW(ADDR_SURF_ROTATED_MICRO_TILING) |
3001 							 PIPE_CONFIG(ADDR_SURF_P4_8x16) |
3002 							 SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_2));
3003 					break;
3004 				case 30:
3005 					gb_tile_moden = (ARRAY_MODE(ARRAY_PRT_2D_TILED_THIN1) |
3006 							 MICRO_TILE_MODE_NEW(ADDR_SURF_ROTATED_MICRO_TILING) |
3007 							 PIPE_CONFIG(ADDR_SURF_P4_8x16) |
3008 							 SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_2));
3009 					break;
3010 				default:
3011 					gb_tile_moden = 0;
3012 					break;
3013 				}
3014 				rdev->config.cik.tile_mode_array[reg_offset] = gb_tile_moden;
3015 				WREG32(GB_TILE_MODE0 + (reg_offset * 4), gb_tile_moden);
3016 			}
3017 		}
3018 		for (reg_offset = 0; reg_offset < num_secondary_tile_mode_states; reg_offset++) {
3019 			switch (reg_offset) {
3020 			case 0:
3021 				gb_tile_moden = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
3022 						 BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_4) |
3023 						 MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_4) |
3024 						 NUM_BANKS(ADDR_SURF_16_BANK));
3025 				break;
3026 			case 1:
3027 				gb_tile_moden = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
3028 						 BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_2) |
3029 						 MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_4) |
3030 						 NUM_BANKS(ADDR_SURF_16_BANK));
3031 				break;
3032 			case 2:
3033 				gb_tile_moden = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
3034 						 BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_1) |
3035 						 MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_2) |
3036 						 NUM_BANKS(ADDR_SURF_16_BANK));
3037 				break;
3038 			case 3:
3039 				gb_tile_moden = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
3040 						 BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_1) |
3041 						 MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_2) |
3042 						 NUM_BANKS(ADDR_SURF_16_BANK));
3043 				break;
3044 			case 4:
3045 				gb_tile_moden = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
3046 						 BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_1) |
3047 						 MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_2) |
3048 						 NUM_BANKS(ADDR_SURF_16_BANK));
3049 				break;
3050 			case 5:
3051 				gb_tile_moden = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
3052 						 BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_1) |
3053 						 MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_2) |
3054 						 NUM_BANKS(ADDR_SURF_8_BANK));
3055 				break;
3056 			case 6:
3057 				gb_tile_moden = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
3058 						 BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_1) |
3059 						 MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_1) |
3060 						 NUM_BANKS(ADDR_SURF_4_BANK));
3061 				break;
3062 			case 8:
3063 				gb_tile_moden = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_2) |
3064 						 BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_8) |
3065 						 MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_4) |
3066 						 NUM_BANKS(ADDR_SURF_16_BANK));
3067 				break;
3068 			case 9:
3069 				gb_tile_moden = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_2) |
3070 						 BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_4) |
3071 						 MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_4) |
3072 						 NUM_BANKS(ADDR_SURF_16_BANK));
3073 				break;
3074 			case 10:
3075 				gb_tile_moden = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
3076 						 BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_4) |
3077 						 MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_4) |
3078 						 NUM_BANKS(ADDR_SURF_16_BANK));
3079 				break;
3080 			case 11:
3081 				gb_tile_moden = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
3082 						 BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_2) |
3083 						 MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_4) |
3084 						 NUM_BANKS(ADDR_SURF_16_BANK));
3085 				break;
3086 			case 12:
3087 				gb_tile_moden = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
3088 						 BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_1) |
3089 						 MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_2) |
3090 						 NUM_BANKS(ADDR_SURF_16_BANK));
3091 				break;
3092 			case 13:
3093 				gb_tile_moden = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
3094 						 BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_1) |
3095 						 MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_2) |
3096 						 NUM_BANKS(ADDR_SURF_8_BANK));
3097 				break;
3098 			case 14:
3099 				gb_tile_moden = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
3100 						 BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_1) |
3101 						 MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_1) |
3102 						 NUM_BANKS(ADDR_SURF_4_BANK));
3103 				break;
3104 			default:
3105 				gb_tile_moden = 0;
3106 				break;
3107 			}
3108 			rdev->config.cik.macrotile_mode_array[reg_offset] = gb_tile_moden;
3109 			WREG32(GB_MACROTILE_MODE0 + (reg_offset * 4), gb_tile_moden);
3110 		}
3111 	} else if (num_pipe_configs == 2) {
3112 		for (reg_offset = 0; reg_offset < num_tile_mode_states; reg_offset++) {
3113 			switch (reg_offset) {
3114 			case 0:
3115 				gb_tile_moden = (ARRAY_MODE(ARRAY_2D_TILED_THIN1) |
3116 						 MICRO_TILE_MODE_NEW(ADDR_SURF_DEPTH_MICRO_TILING) |
3117 						 PIPE_CONFIG(ADDR_SURF_P2) |
3118 						 TILE_SPLIT(ADDR_SURF_TILE_SPLIT_64B));
3119 				break;
3120 			case 1:
3121 				gb_tile_moden = (ARRAY_MODE(ARRAY_2D_TILED_THIN1) |
3122 						 MICRO_TILE_MODE_NEW(ADDR_SURF_DEPTH_MICRO_TILING) |
3123 						 PIPE_CONFIG(ADDR_SURF_P2) |
3124 						 TILE_SPLIT(ADDR_SURF_TILE_SPLIT_128B));
3125 				break;
3126 			case 2:
3127 				gb_tile_moden = (ARRAY_MODE(ARRAY_2D_TILED_THIN1) |
3128 						 MICRO_TILE_MODE_NEW(ADDR_SURF_DEPTH_MICRO_TILING) |
3129 						 PIPE_CONFIG(ADDR_SURF_P2) |
3130 						 TILE_SPLIT(ADDR_SURF_TILE_SPLIT_256B));
3131 				break;
3132 			case 3:
3133 				gb_tile_moden = (ARRAY_MODE(ARRAY_2D_TILED_THIN1) |
3134 						 MICRO_TILE_MODE_NEW(ADDR_SURF_DEPTH_MICRO_TILING) |
3135 						 PIPE_CONFIG(ADDR_SURF_P2) |
3136 						 TILE_SPLIT(ADDR_SURF_TILE_SPLIT_512B));
3137 				break;
3138 			case 4:
3139 				gb_tile_moden = (ARRAY_MODE(ARRAY_2D_TILED_THIN1) |
3140 						 MICRO_TILE_MODE_NEW(ADDR_SURF_DEPTH_MICRO_TILING) |
3141 						 PIPE_CONFIG(ADDR_SURF_P2) |
3142 						 TILE_SPLIT(split_equal_to_row_size));
3143 				break;
3144 			case 5:
3145 				gb_tile_moden = (ARRAY_MODE(ARRAY_1D_TILED_THIN1) |
3146 						 PIPE_CONFIG(ADDR_SURF_P2) |
3147 						 MICRO_TILE_MODE_NEW(ADDR_SURF_DEPTH_MICRO_TILING));
3148 				break;
3149 			case 6:
3150 				gb_tile_moden = (ARRAY_MODE(ARRAY_PRT_2D_TILED_THIN1) |
3151 						 MICRO_TILE_MODE_NEW(ADDR_SURF_DEPTH_MICRO_TILING) |
3152 						 PIPE_CONFIG(ADDR_SURF_P2) |
3153 						 TILE_SPLIT(ADDR_SURF_TILE_SPLIT_256B));
3154 				break;
3155 			case 7:
3156 				gb_tile_moden = (ARRAY_MODE(ARRAY_PRT_2D_TILED_THIN1) |
3157 						 MICRO_TILE_MODE_NEW(ADDR_SURF_DEPTH_MICRO_TILING) |
3158 						 PIPE_CONFIG(ADDR_SURF_P2) |
3159 						 TILE_SPLIT(split_equal_to_row_size));
3160 				break;
3161 			case 8:
3162 				gb_tile_moden = ARRAY_MODE(ARRAY_LINEAR_ALIGNED) |
3163 						PIPE_CONFIG(ADDR_SURF_P2);
3164 				break;
3165 			case 9:
3166 				gb_tile_moden = (ARRAY_MODE(ARRAY_1D_TILED_THIN1) |
3167 						 MICRO_TILE_MODE_NEW(ADDR_SURF_DISPLAY_MICRO_TILING) |
3168 						 PIPE_CONFIG(ADDR_SURF_P2));
3169 				break;
3170 			case 10:
3171 				gb_tile_moden = (ARRAY_MODE(ARRAY_2D_TILED_THIN1) |
3172 						 MICRO_TILE_MODE_NEW(ADDR_SURF_DISPLAY_MICRO_TILING) |
3173 						 PIPE_CONFIG(ADDR_SURF_P2) |
3174 						 SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_2));
3175 				break;
3176 			case 11:
3177 				gb_tile_moden = (ARRAY_MODE(ARRAY_PRT_TILED_THIN1) |
3178 						 MICRO_TILE_MODE_NEW(ADDR_SURF_DISPLAY_MICRO_TILING) |
3179 						 PIPE_CONFIG(ADDR_SURF_P2) |
3180 						 SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_2));
3181 				break;
3182 			case 12:
3183 				gb_tile_moden = (ARRAY_MODE(ARRAY_PRT_2D_TILED_THIN1) |
3184 						 MICRO_TILE_MODE_NEW(ADDR_SURF_DISPLAY_MICRO_TILING) |
3185 						 PIPE_CONFIG(ADDR_SURF_P2) |
3186 						 SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_2));
3187 				break;
3188 			case 13:
3189 				gb_tile_moden = (ARRAY_MODE(ARRAY_1D_TILED_THIN1) |
3190 						 PIPE_CONFIG(ADDR_SURF_P2) |
3191 						 MICRO_TILE_MODE_NEW(ADDR_SURF_THIN_MICRO_TILING));
3192 				break;
3193 			case 14:
3194 				gb_tile_moden = (ARRAY_MODE(ARRAY_2D_TILED_THIN1) |
3195 						 MICRO_TILE_MODE_NEW(ADDR_SURF_THIN_MICRO_TILING) |
3196 						 PIPE_CONFIG(ADDR_SURF_P2) |
3197 						 SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_2));
3198 				break;
3199 			case 16:
3200 				gb_tile_moden = (ARRAY_MODE(ARRAY_PRT_TILED_THIN1) |
3201 						 MICRO_TILE_MODE_NEW(ADDR_SURF_THIN_MICRO_TILING) |
3202 						 PIPE_CONFIG(ADDR_SURF_P2) |
3203 						 SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_2));
3204 				break;
3205 			case 17:
3206 				gb_tile_moden = (ARRAY_MODE(ARRAY_PRT_2D_TILED_THIN1) |
3207 						 MICRO_TILE_MODE_NEW(ADDR_SURF_THIN_MICRO_TILING) |
3208 						 PIPE_CONFIG(ADDR_SURF_P2) |
3209 						 SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_2));
3210 				break;
3211 			case 27:
3212 				gb_tile_moden = (ARRAY_MODE(ARRAY_1D_TILED_THIN1) |
3213 						 MICRO_TILE_MODE_NEW(ADDR_SURF_ROTATED_MICRO_TILING) |
3214 						 PIPE_CONFIG(ADDR_SURF_P2));
3215 				break;
3216 			case 28:
3217 				gb_tile_moden = (ARRAY_MODE(ARRAY_PRT_2D_TILED_THIN1) |
3218 						 MICRO_TILE_MODE_NEW(ADDR_SURF_ROTATED_MICRO_TILING) |
3219 						 PIPE_CONFIG(ADDR_SURF_P2) |
3220 						 SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_2));
3221 				break;
3222 			case 29:
3223 				gb_tile_moden = (ARRAY_MODE(ARRAY_PRT_TILED_THIN1) |
3224 						 MICRO_TILE_MODE_NEW(ADDR_SURF_ROTATED_MICRO_TILING) |
3225 						 PIPE_CONFIG(ADDR_SURF_P2) |
3226 						 SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_2));
3227 				break;
3228 			case 30:
3229 				gb_tile_moden = (ARRAY_MODE(ARRAY_PRT_2D_TILED_THIN1) |
3230 						 MICRO_TILE_MODE_NEW(ADDR_SURF_ROTATED_MICRO_TILING) |
3231 						 PIPE_CONFIG(ADDR_SURF_P2) |
3232 						 SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_2));
3233 				break;
3234 			default:
3235 				gb_tile_moden = 0;
3236 				break;
3237 			}
3238 			rdev->config.cik.tile_mode_array[reg_offset] = gb_tile_moden;
3239 			WREG32(GB_TILE_MODE0 + (reg_offset * 4), gb_tile_moden);
3240 		}
3241 		for (reg_offset = 0; reg_offset < num_secondary_tile_mode_states; reg_offset++) {
3242 			switch (reg_offset) {
3243 			case 0:
3244 				gb_tile_moden = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_2) |
3245 						 BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_4) |
3246 						 MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_4) |
3247 						 NUM_BANKS(ADDR_SURF_16_BANK));
3248 				break;
3249 			case 1:
3250 				gb_tile_moden = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_2) |
3251 						 BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_2) |
3252 						 MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_4) |
3253 						 NUM_BANKS(ADDR_SURF_16_BANK));
3254 				break;
3255 			case 2:
3256 				gb_tile_moden = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
3257 						 BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_2) |
3258 						 MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_4) |
3259 						 NUM_BANKS(ADDR_SURF_16_BANK));
3260 				break;
3261 			case 3:
3262 				gb_tile_moden = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
3263 						 BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_1) |
3264 						 MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_4) |
3265 						 NUM_BANKS(ADDR_SURF_16_BANK));
3266 				break;
3267 			case 4:
3268 				gb_tile_moden = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
3269 						 BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_1) |
3270 						 MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_4) |
3271 						 NUM_BANKS(ADDR_SURF_16_BANK));
3272 				break;
3273 			case 5:
3274 				gb_tile_moden = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
3275 						 BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_1) |
3276 						 MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_4) |
3277 						 NUM_BANKS(ADDR_SURF_16_BANK));
3278 				break;
3279 			case 6:
3280 				gb_tile_moden = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
3281 						 BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_1) |
3282 						 MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_2) |
3283 						 NUM_BANKS(ADDR_SURF_8_BANK));
3284 				break;
3285 			case 8:
3286 				gb_tile_moden = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_4) |
3287 						 BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_8) |
3288 						 MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_4) |
3289 						 NUM_BANKS(ADDR_SURF_16_BANK));
3290 				break;
3291 			case 9:
3292 				gb_tile_moden = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_4) |
3293 						 BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_4) |
3294 						 MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_4) |
3295 						 NUM_BANKS(ADDR_SURF_16_BANK));
3296 				break;
3297 			case 10:
3298 				gb_tile_moden = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_2) |
3299 						 BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_4) |
3300 						 MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_4) |
3301 						 NUM_BANKS(ADDR_SURF_16_BANK));
3302 				break;
3303 			case 11:
3304 				gb_tile_moden = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_2) |
3305 						 BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_2) |
3306 						 MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_4) |
3307 						 NUM_BANKS(ADDR_SURF_16_BANK));
3308 				break;
3309 			case 12:
3310 				gb_tile_moden = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
3311 						 BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_2) |
3312 						 MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_4) |
3313 						 NUM_BANKS(ADDR_SURF_16_BANK));
3314 				break;
3315 			case 13:
3316 				gb_tile_moden = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
3317 						 BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_1) |
3318 						 MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_4) |
3319 						 NUM_BANKS(ADDR_SURF_16_BANK));
3320 				break;
3321 			case 14:
3322 				gb_tile_moden = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
3323 						 BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_1) |
3324 						 MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_2) |
3325 						 NUM_BANKS(ADDR_SURF_8_BANK));
3326 				break;
3327 			default:
3328 				gb_tile_moden = 0;
3329 				break;
3330 			}
3331 			rdev->config.cik.macrotile_mode_array[reg_offset] = gb_tile_moden;
3332 			WREG32(GB_MACROTILE_MODE0 + (reg_offset * 4), gb_tile_moden);
3333 		}
3334 	} else
3335 		DRM_ERROR("unknown num pipe config: 0x%x\n", num_pipe_configs);
3336 }
3337 
3338 /**
3339  * cik_select_se_sh - select which SE, SH to address
3340  *
3341  * @rdev: radeon_device pointer
3342  * @se_num: shader engine to address
3343  * @sh_num: sh block to address
3344  *
3345  * Select which SE, SH combinations to address. Certain
3346  * registers are instanced per SE or SH.  0xffffffff means
3347  * broadcast to all SEs or SHs (CIK).
3348  */
3349 static void cik_select_se_sh(struct radeon_device *rdev,
3350 			     u32 se_num, u32 sh_num)
3351 {
3352 	u32 data = INSTANCE_BROADCAST_WRITES;
3353 
3354 	if ((se_num == 0xffffffff) && (sh_num == 0xffffffff))
3355 		data |= SH_BROADCAST_WRITES | SE_BROADCAST_WRITES;
3356 	else if (se_num == 0xffffffff)
3357 		data |= SE_BROADCAST_WRITES | SH_INDEX(sh_num);
3358 	else if (sh_num == 0xffffffff)
3359 		data |= SH_BROADCAST_WRITES | SE_INDEX(se_num);
3360 	else
3361 		data |= SH_INDEX(sh_num) | SE_INDEX(se_num);
3362 	WREG32(GRBM_GFX_INDEX, data);
3363 }
3364 
3365 /**
3366  * cik_create_bitmask - create a bitmask
3367  *
3368  * @bit_width: length of the mask
3369  *
3370  * create a variable length bit mask (CIK).
3371  * Returns the bitmask.
3372  */
3373 static u32 cik_create_bitmask(u32 bit_width)
3374 {
3375 	u32 i, mask = 0;
3376 
3377 	for (i = 0; i < bit_width; i++) {
3378 		mask <<= 1;
3379 		mask |= 1;
3380 	}
3381 	return mask;
3382 }
3383 
3384 /**
3385  * cik_get_rb_disabled - computes the mask of disabled RBs
3386  *
3387  * @rdev: radeon_device pointer
3388  * @max_rb_num: max RBs (render backends) for the asic
3389  * @se_num: number of SEs (shader engines) for the asic
3390  * @sh_per_se: number of SH blocks per SE for the asic
3391  *
3392  * Calculates the bitmask of disabled RBs (CIK).
3393  * Returns the disabled RB bitmask.
3394  */
3395 static u32 cik_get_rb_disabled(struct radeon_device *rdev,
3396 			      u32 max_rb_num_per_se,
3397 			      u32 sh_per_se)
3398 {
3399 	u32 data, mask;
3400 
3401 	data = RREG32(CC_RB_BACKEND_DISABLE);
3402 	if (data & 1)
3403 		data &= BACKEND_DISABLE_MASK;
3404 	else
3405 		data = 0;
3406 	data |= RREG32(GC_USER_RB_BACKEND_DISABLE);
3407 
3408 	data >>= BACKEND_DISABLE_SHIFT;
3409 
3410 	mask = cik_create_bitmask(max_rb_num_per_se / sh_per_se);
3411 
3412 	return data & mask;
3413 }
3414 
3415 /**
3416  * cik_setup_rb - setup the RBs on the asic
3417  *
3418  * @rdev: radeon_device pointer
3419  * @se_num: number of SEs (shader engines) for the asic
3420  * @sh_per_se: number of SH blocks per SE for the asic
3421  * @max_rb_num: max RBs (render backends) for the asic
3422  *
3423  * Configures per-SE/SH RB registers (CIK).
3424  */
3425 static void cik_setup_rb(struct radeon_device *rdev,
3426 			 u32 se_num, u32 sh_per_se,
3427 			 u32 max_rb_num_per_se)
3428 {
3429 	int i, j;
3430 	u32 data, mask;
3431 	u32 disabled_rbs = 0;
3432 	u32 enabled_rbs = 0;
3433 
3434 	for (i = 0; i < se_num; i++) {
3435 		for (j = 0; j < sh_per_se; j++) {
3436 			cik_select_se_sh(rdev, i, j);
3437 			data = cik_get_rb_disabled(rdev, max_rb_num_per_se, sh_per_se);
3438 			if (rdev->family == CHIP_HAWAII)
3439 				disabled_rbs |= data << ((i * sh_per_se + j) * HAWAII_RB_BITMAP_WIDTH_PER_SH);
3440 			else
3441 				disabled_rbs |= data << ((i * sh_per_se + j) * CIK_RB_BITMAP_WIDTH_PER_SH);
3442 		}
3443 	}
3444 	cik_select_se_sh(rdev, 0xffffffff, 0xffffffff);
3445 
3446 	mask = 1;
3447 	for (i = 0; i < max_rb_num_per_se * se_num; i++) {
3448 		if (!(disabled_rbs & mask))
3449 			enabled_rbs |= mask;
3450 		mask <<= 1;
3451 	}
3452 
3453 	rdev->config.cik.backend_enable_mask = enabled_rbs;
3454 
3455 	for (i = 0; i < se_num; i++) {
3456 		cik_select_se_sh(rdev, i, 0xffffffff);
3457 		data = 0;
3458 		for (j = 0; j < sh_per_se; j++) {
3459 			switch (enabled_rbs & 3) {
3460 			case 0:
3461 				if (j == 0)
3462 					data |= PKR_MAP(RASTER_CONFIG_RB_MAP_3);
3463 				else
3464 					data |= PKR_MAP(RASTER_CONFIG_RB_MAP_0);
3465 				break;
3466 			case 1:
3467 				data |= (RASTER_CONFIG_RB_MAP_0 << (i * sh_per_se + j) * 2);
3468 				break;
3469 			case 2:
3470 				data |= (RASTER_CONFIG_RB_MAP_3 << (i * sh_per_se + j) * 2);
3471 				break;
3472 			case 3:
3473 			default:
3474 				data |= (RASTER_CONFIG_RB_MAP_2 << (i * sh_per_se + j) * 2);
3475 				break;
3476 			}
3477 			enabled_rbs >>= 2;
3478 		}
3479 		WREG32(PA_SC_RASTER_CONFIG, data);
3480 	}
3481 	cik_select_se_sh(rdev, 0xffffffff, 0xffffffff);
3482 }
3483 
3484 /**
3485  * cik_gpu_init - setup the 3D engine
3486  *
3487  * @rdev: radeon_device pointer
3488  *
3489  * Configures the 3D engine and tiling configuration
3490  * registers so that the 3D engine is usable.
3491  */
3492 static void cik_gpu_init(struct radeon_device *rdev)
3493 {
3494 	u32 gb_addr_config = RREG32(GB_ADDR_CONFIG);
3495 	u32 mc_shared_chmap, mc_arb_ramcfg;
3496 	u32 hdp_host_path_cntl;
3497 	u32 tmp;
3498 	int i, j;
3499 
3500 	switch (rdev->family) {
3501 	case CHIP_BONAIRE:
3502 		rdev->config.cik.max_shader_engines = 2;
3503 		rdev->config.cik.max_tile_pipes = 4;
3504 		rdev->config.cik.max_cu_per_sh = 7;
3505 		rdev->config.cik.max_sh_per_se = 1;
3506 		rdev->config.cik.max_backends_per_se = 2;
3507 		rdev->config.cik.max_texture_channel_caches = 4;
3508 		rdev->config.cik.max_gprs = 256;
3509 		rdev->config.cik.max_gs_threads = 32;
3510 		rdev->config.cik.max_hw_contexts = 8;
3511 
3512 		rdev->config.cik.sc_prim_fifo_size_frontend = 0x20;
3513 		rdev->config.cik.sc_prim_fifo_size_backend = 0x100;
3514 		rdev->config.cik.sc_hiz_tile_fifo_size = 0x30;
3515 		rdev->config.cik.sc_earlyz_tile_fifo_size = 0x130;
3516 		gb_addr_config = BONAIRE_GB_ADDR_CONFIG_GOLDEN;
3517 		break;
3518 	case CHIP_HAWAII:
3519 		rdev->config.cik.max_shader_engines = 4;
3520 		rdev->config.cik.max_tile_pipes = 16;
3521 		rdev->config.cik.max_cu_per_sh = 11;
3522 		rdev->config.cik.max_sh_per_se = 1;
3523 		rdev->config.cik.max_backends_per_se = 4;
3524 		rdev->config.cik.max_texture_channel_caches = 16;
3525 		rdev->config.cik.max_gprs = 256;
3526 		rdev->config.cik.max_gs_threads = 32;
3527 		rdev->config.cik.max_hw_contexts = 8;
3528 
3529 		rdev->config.cik.sc_prim_fifo_size_frontend = 0x20;
3530 		rdev->config.cik.sc_prim_fifo_size_backend = 0x100;
3531 		rdev->config.cik.sc_hiz_tile_fifo_size = 0x30;
3532 		rdev->config.cik.sc_earlyz_tile_fifo_size = 0x130;
3533 		gb_addr_config = HAWAII_GB_ADDR_CONFIG_GOLDEN;
3534 		break;
3535 	case CHIP_KAVERI:
3536 		rdev->config.cik.max_shader_engines = 1;
3537 		rdev->config.cik.max_tile_pipes = 4;
3538 		if ((rdev->pdev->device == 0x1304) ||
3539 		    (rdev->pdev->device == 0x1305) ||
3540 		    (rdev->pdev->device == 0x130C) ||
3541 		    (rdev->pdev->device == 0x130F) ||
3542 		    (rdev->pdev->device == 0x1310) ||
3543 		    (rdev->pdev->device == 0x1311) ||
3544 		    (rdev->pdev->device == 0x131C)) {
3545 			rdev->config.cik.max_cu_per_sh = 8;
3546 			rdev->config.cik.max_backends_per_se = 2;
3547 		} else if ((rdev->pdev->device == 0x1309) ||
3548 			   (rdev->pdev->device == 0x130A) ||
3549 			   (rdev->pdev->device == 0x130D) ||
3550 			   (rdev->pdev->device == 0x1313) ||
3551 			   (rdev->pdev->device == 0x131D)) {
3552 			rdev->config.cik.max_cu_per_sh = 6;
3553 			rdev->config.cik.max_backends_per_se = 2;
3554 		} else if ((rdev->pdev->device == 0x1306) ||
3555 			   (rdev->pdev->device == 0x1307) ||
3556 			   (rdev->pdev->device == 0x130B) ||
3557 			   (rdev->pdev->device == 0x130E) ||
3558 			   (rdev->pdev->device == 0x1315) ||
3559 			   (rdev->pdev->device == 0x1318) ||
3560 			   (rdev->pdev->device == 0x131B)) {
3561 			rdev->config.cik.max_cu_per_sh = 4;
3562 			rdev->config.cik.max_backends_per_se = 1;
3563 		} else {
3564 			rdev->config.cik.max_cu_per_sh = 3;
3565 			rdev->config.cik.max_backends_per_se = 1;
3566 		}
3567 		rdev->config.cik.max_sh_per_se = 1;
3568 		rdev->config.cik.max_texture_channel_caches = 4;
3569 		rdev->config.cik.max_gprs = 256;
3570 		rdev->config.cik.max_gs_threads = 16;
3571 		rdev->config.cik.max_hw_contexts = 8;
3572 
3573 		rdev->config.cik.sc_prim_fifo_size_frontend = 0x20;
3574 		rdev->config.cik.sc_prim_fifo_size_backend = 0x100;
3575 		rdev->config.cik.sc_hiz_tile_fifo_size = 0x30;
3576 		rdev->config.cik.sc_earlyz_tile_fifo_size = 0x130;
3577 		gb_addr_config = BONAIRE_GB_ADDR_CONFIG_GOLDEN;
3578 		break;
3579 	case CHIP_KABINI:
3580 	case CHIP_MULLINS:
3581 	default:
3582 		rdev->config.cik.max_shader_engines = 1;
3583 		rdev->config.cik.max_tile_pipes = 2;
3584 		rdev->config.cik.max_cu_per_sh = 2;
3585 		rdev->config.cik.max_sh_per_se = 1;
3586 		rdev->config.cik.max_backends_per_se = 1;
3587 		rdev->config.cik.max_texture_channel_caches = 2;
3588 		rdev->config.cik.max_gprs = 256;
3589 		rdev->config.cik.max_gs_threads = 16;
3590 		rdev->config.cik.max_hw_contexts = 8;
3591 
3592 		rdev->config.cik.sc_prim_fifo_size_frontend = 0x20;
3593 		rdev->config.cik.sc_prim_fifo_size_backend = 0x100;
3594 		rdev->config.cik.sc_hiz_tile_fifo_size = 0x30;
3595 		rdev->config.cik.sc_earlyz_tile_fifo_size = 0x130;
3596 		gb_addr_config = BONAIRE_GB_ADDR_CONFIG_GOLDEN;
3597 		break;
3598 	}
3599 
3600 	/* Initialize HDP */
3601 	for (i = 0, j = 0; i < 32; i++, j += 0x18) {
3602 		WREG32((0x2c14 + j), 0x00000000);
3603 		WREG32((0x2c18 + j), 0x00000000);
3604 		WREG32((0x2c1c + j), 0x00000000);
3605 		WREG32((0x2c20 + j), 0x00000000);
3606 		WREG32((0x2c24 + j), 0x00000000);
3607 	}
3608 
3609 	WREG32(GRBM_CNTL, GRBM_READ_TIMEOUT(0xff));
3610 
3611 	WREG32(BIF_FB_EN, FB_READ_EN | FB_WRITE_EN);
3612 
3613 	mc_shared_chmap = RREG32(MC_SHARED_CHMAP);
3614 	mc_arb_ramcfg = RREG32(MC_ARB_RAMCFG);
3615 
3616 	rdev->config.cik.num_tile_pipes = rdev->config.cik.max_tile_pipes;
3617 	rdev->config.cik.mem_max_burst_length_bytes = 256;
3618 	tmp = (mc_arb_ramcfg & NOOFCOLS_MASK) >> NOOFCOLS_SHIFT;
3619 	rdev->config.cik.mem_row_size_in_kb = (4 * (1 << (8 + tmp))) / 1024;
3620 	if (rdev->config.cik.mem_row_size_in_kb > 4)
3621 		rdev->config.cik.mem_row_size_in_kb = 4;
3622 	/* XXX use MC settings? */
3623 	rdev->config.cik.shader_engine_tile_size = 32;
3624 	rdev->config.cik.num_gpus = 1;
3625 	rdev->config.cik.multi_gpu_tile_size = 64;
3626 
3627 	/* fix up row size */
3628 	gb_addr_config &= ~ROW_SIZE_MASK;
3629 	switch (rdev->config.cik.mem_row_size_in_kb) {
3630 	case 1:
3631 	default:
3632 		gb_addr_config |= ROW_SIZE(0);
3633 		break;
3634 	case 2:
3635 		gb_addr_config |= ROW_SIZE(1);
3636 		break;
3637 	case 4:
3638 		gb_addr_config |= ROW_SIZE(2);
3639 		break;
3640 	}
3641 
3642 	/* setup tiling info dword.  gb_addr_config is not adequate since it does
3643 	 * not have bank info, so create a custom tiling dword.
3644 	 * bits 3:0   num_pipes
3645 	 * bits 7:4   num_banks
3646 	 * bits 11:8  group_size
3647 	 * bits 15:12 row_size
3648 	 */
3649 	rdev->config.cik.tile_config = 0;
3650 	switch (rdev->config.cik.num_tile_pipes) {
3651 	case 1:
3652 		rdev->config.cik.tile_config |= (0 << 0);
3653 		break;
3654 	case 2:
3655 		rdev->config.cik.tile_config |= (1 << 0);
3656 		break;
3657 	case 4:
3658 		rdev->config.cik.tile_config |= (2 << 0);
3659 		break;
3660 	case 8:
3661 	default:
3662 		/* XXX what about 12? */
3663 		rdev->config.cik.tile_config |= (3 << 0);
3664 		break;
3665 	}
3666 	rdev->config.cik.tile_config |=
3667 		((mc_arb_ramcfg & NOOFBANK_MASK) >> NOOFBANK_SHIFT) << 4;
3668 	rdev->config.cik.tile_config |=
3669 		((gb_addr_config & PIPE_INTERLEAVE_SIZE_MASK) >> PIPE_INTERLEAVE_SIZE_SHIFT) << 8;
3670 	rdev->config.cik.tile_config |=
3671 		((gb_addr_config & ROW_SIZE_MASK) >> ROW_SIZE_SHIFT) << 12;
3672 
3673 	WREG32(GB_ADDR_CONFIG, gb_addr_config);
3674 	WREG32(HDP_ADDR_CONFIG, gb_addr_config);
3675 	WREG32(DMIF_ADDR_CALC, gb_addr_config);
3676 	WREG32(SDMA0_TILING_CONFIG + SDMA0_REGISTER_OFFSET, gb_addr_config & 0x70);
3677 	WREG32(SDMA0_TILING_CONFIG + SDMA1_REGISTER_OFFSET, gb_addr_config & 0x70);
3678 	WREG32(UVD_UDEC_ADDR_CONFIG, gb_addr_config);
3679 	WREG32(UVD_UDEC_DB_ADDR_CONFIG, gb_addr_config);
3680 	WREG32(UVD_UDEC_DBW_ADDR_CONFIG, gb_addr_config);
3681 
3682 	cik_tiling_mode_table_init(rdev);
3683 
3684 	cik_setup_rb(rdev, rdev->config.cik.max_shader_engines,
3685 		     rdev->config.cik.max_sh_per_se,
3686 		     rdev->config.cik.max_backends_per_se);
3687 
3688 	rdev->config.cik.active_cus = 0;
3689 	for (i = 0; i < rdev->config.cik.max_shader_engines; i++) {
3690 		for (j = 0; j < rdev->config.cik.max_sh_per_se; j++) {
3691 			rdev->config.cik.active_cus +=
3692 				hweight32(cik_get_cu_active_bitmap(rdev, i, j));
3693 		}
3694 	}
3695 
3696 	/* set HW defaults for 3D engine */
3697 	WREG32(CP_MEQ_THRESHOLDS, MEQ1_START(0x30) | MEQ2_START(0x60));
3698 
3699 	WREG32(SX_DEBUG_1, 0x20);
3700 
3701 	WREG32(TA_CNTL_AUX, 0x00010000);
3702 
3703 	tmp = RREG32(SPI_CONFIG_CNTL);
3704 	tmp |= 0x03000000;
3705 	WREG32(SPI_CONFIG_CNTL, tmp);
3706 
3707 	WREG32(SQ_CONFIG, 1);
3708 
3709 	WREG32(DB_DEBUG, 0);
3710 
3711 	tmp = RREG32(DB_DEBUG2) & ~0xf00fffff;
3712 	tmp |= 0x00000400;
3713 	WREG32(DB_DEBUG2, tmp);
3714 
3715 	tmp = RREG32(DB_DEBUG3) & ~0x0002021c;
3716 	tmp |= 0x00020200;
3717 	WREG32(DB_DEBUG3, tmp);
3718 
3719 	tmp = RREG32(CB_HW_CONTROL) & ~0x00010000;
3720 	tmp |= 0x00018208;
3721 	WREG32(CB_HW_CONTROL, tmp);
3722 
3723 	WREG32(SPI_CONFIG_CNTL_1, VTX_DONE_DELAY(4));
3724 
3725 	WREG32(PA_SC_FIFO_SIZE, (SC_FRONTEND_PRIM_FIFO_SIZE(rdev->config.cik.sc_prim_fifo_size_frontend) |
3726 				 SC_BACKEND_PRIM_FIFO_SIZE(rdev->config.cik.sc_prim_fifo_size_backend) |
3727 				 SC_HIZ_TILE_FIFO_SIZE(rdev->config.cik.sc_hiz_tile_fifo_size) |
3728 				 SC_EARLYZ_TILE_FIFO_SIZE(rdev->config.cik.sc_earlyz_tile_fifo_size)));
3729 
3730 	WREG32(VGT_NUM_INSTANCES, 1);
3731 
3732 	WREG32(CP_PERFMON_CNTL, 0);
3733 
3734 	WREG32(SQ_CONFIG, 0);
3735 
3736 	WREG32(PA_SC_FORCE_EOV_MAX_CNTS, (FORCE_EOV_MAX_CLK_CNT(4095) |
3737 					  FORCE_EOV_MAX_REZ_CNT(255)));
3738 
3739 	WREG32(VGT_CACHE_INVALIDATION, CACHE_INVALIDATION(VC_AND_TC) |
3740 	       AUTO_INVLD_EN(ES_AND_GS_AUTO));
3741 
3742 	WREG32(VGT_GS_VERTEX_REUSE, 16);
3743 	WREG32(PA_SC_LINE_STIPPLE_STATE, 0);
3744 
3745 	tmp = RREG32(HDP_MISC_CNTL);
3746 	tmp |= HDP_FLUSH_INVALIDATE_CACHE;
3747 	WREG32(HDP_MISC_CNTL, tmp);
3748 
3749 	hdp_host_path_cntl = RREG32(HDP_HOST_PATH_CNTL);
3750 	WREG32(HDP_HOST_PATH_CNTL, hdp_host_path_cntl);
3751 
3752 	WREG32(PA_CL_ENHANCE, CLIP_VTX_REORDER_ENA | NUM_CLIP_SEQ(3));
3753 	WREG32(PA_SC_ENHANCE, ENABLE_PA_SC_OUT_OF_ORDER);
3754 
3755 	udelay(50);
3756 }
3757 
3758 /*
3759  * GPU scratch registers helpers function.
3760  */
3761 /**
3762  * cik_scratch_init - setup driver info for CP scratch regs
3763  *
3764  * @rdev: radeon_device pointer
3765  *
3766  * Set up the number and offset of the CP scratch registers.
3767  * NOTE: use of CP scratch registers is a legacy inferface and
3768  * is not used by default on newer asics (r6xx+).  On newer asics,
3769  * memory buffers are used for fences rather than scratch regs.
3770  */
3771 static void cik_scratch_init(struct radeon_device *rdev)
3772 {
3773 	int i;
3774 
3775 	rdev->scratch.num_reg = 7;
3776 	rdev->scratch.reg_base = SCRATCH_REG0;
3777 	for (i = 0; i < rdev->scratch.num_reg; i++) {
3778 		rdev->scratch.free[i] = true;
3779 		rdev->scratch.reg[i] = rdev->scratch.reg_base + (i * 4);
3780 	}
3781 }
3782 
3783 /**
3784  * cik_ring_test - basic gfx ring test
3785  *
3786  * @rdev: radeon_device pointer
3787  * @ring: radeon_ring structure holding ring information
3788  *
3789  * Allocate a scratch register and write to it using the gfx ring (CIK).
3790  * Provides a basic gfx ring test to verify that the ring is working.
3791  * Used by cik_cp_gfx_resume();
3792  * Returns 0 on success, error on failure.
3793  */
3794 int cik_ring_test(struct radeon_device *rdev, struct radeon_ring *ring)
3795 {
3796 	uint32_t scratch;
3797 	uint32_t tmp = 0;
3798 	unsigned i;
3799 	int r;
3800 
3801 	r = radeon_scratch_get(rdev, &scratch);
3802 	if (r) {
3803 		DRM_ERROR("radeon: cp failed to get scratch reg (%d).\n", r);
3804 		return r;
3805 	}
3806 	WREG32(scratch, 0xCAFEDEAD);
3807 	r = radeon_ring_lock(rdev, ring, 3);
3808 	if (r) {
3809 		DRM_ERROR("radeon: cp failed to lock ring %d (%d).\n", ring->idx, r);
3810 		radeon_scratch_free(rdev, scratch);
3811 		return r;
3812 	}
3813 	radeon_ring_write(ring, PACKET3(PACKET3_SET_UCONFIG_REG, 1));
3814 	radeon_ring_write(ring, ((scratch - PACKET3_SET_UCONFIG_REG_START) >> 2));
3815 	radeon_ring_write(ring, 0xDEADBEEF);
3816 	radeon_ring_unlock_commit(rdev, ring, false);
3817 
3818 	for (i = 0; i < rdev->usec_timeout; i++) {
3819 		tmp = RREG32(scratch);
3820 		if (tmp == 0xDEADBEEF)
3821 			break;
3822 		DRM_UDELAY(1);
3823 	}
3824 	if (i < rdev->usec_timeout) {
3825 		DRM_INFO("ring test on %d succeeded in %d usecs\n", ring->idx, i);
3826 	} else {
3827 		DRM_ERROR("radeon: ring %d test failed (scratch(0x%04X)=0x%08X)\n",
3828 			  ring->idx, scratch, tmp);
3829 		r = -EINVAL;
3830 	}
3831 	radeon_scratch_free(rdev, scratch);
3832 	return r;
3833 }
3834 
3835 /**
3836  * cik_hdp_flush_cp_ring_emit - emit an hdp flush on the cp
3837  *
3838  * @rdev: radeon_device pointer
3839  * @ridx: radeon ring index
3840  *
3841  * Emits an hdp flush on the cp.
3842  */
3843 static void cik_hdp_flush_cp_ring_emit(struct radeon_device *rdev,
3844 				       int ridx)
3845 {
3846 	struct radeon_ring *ring = &rdev->ring[ridx];
3847 	u32 ref_and_mask;
3848 
3849 	switch (ring->idx) {
3850 	case CAYMAN_RING_TYPE_CP1_INDEX:
3851 	case CAYMAN_RING_TYPE_CP2_INDEX:
3852 	default:
3853 		switch (ring->me) {
3854 		case 0:
3855 			ref_and_mask = CP2 << ring->pipe;
3856 			break;
3857 		case 1:
3858 			ref_and_mask = CP6 << ring->pipe;
3859 			break;
3860 		default:
3861 			return;
3862 		}
3863 		break;
3864 	case RADEON_RING_TYPE_GFX_INDEX:
3865 		ref_and_mask = CP0;
3866 		break;
3867 	}
3868 
3869 	radeon_ring_write(ring, PACKET3(PACKET3_WAIT_REG_MEM, 5));
3870 	radeon_ring_write(ring, (WAIT_REG_MEM_OPERATION(1) | /* write, wait, write */
3871 				 WAIT_REG_MEM_FUNCTION(3) |  /* == */
3872 				 WAIT_REG_MEM_ENGINE(1)));   /* pfp */
3873 	radeon_ring_write(ring, GPU_HDP_FLUSH_REQ >> 2);
3874 	radeon_ring_write(ring, GPU_HDP_FLUSH_DONE >> 2);
3875 	radeon_ring_write(ring, ref_and_mask);
3876 	radeon_ring_write(ring, ref_and_mask);
3877 	radeon_ring_write(ring, 0x20); /* poll interval */
3878 }
3879 
3880 /**
3881  * cik_fence_gfx_ring_emit - emit a fence on the gfx ring
3882  *
3883  * @rdev: radeon_device pointer
3884  * @fence: radeon fence object
3885  *
3886  * Emits a fence sequnce number on the gfx ring and flushes
3887  * GPU caches.
3888  */
3889 void cik_fence_gfx_ring_emit(struct radeon_device *rdev,
3890 			     struct radeon_fence *fence)
3891 {
3892 	struct radeon_ring *ring = &rdev->ring[fence->ring];
3893 	u64 addr = rdev->fence_drv[fence->ring].gpu_addr;
3894 
3895 	/* EVENT_WRITE_EOP - flush caches, send int */
3896 	radeon_ring_write(ring, PACKET3(PACKET3_EVENT_WRITE_EOP, 4));
3897 	radeon_ring_write(ring, (EOP_TCL1_ACTION_EN |
3898 				 EOP_TC_ACTION_EN |
3899 				 EVENT_TYPE(CACHE_FLUSH_AND_INV_TS_EVENT) |
3900 				 EVENT_INDEX(5)));
3901 	radeon_ring_write(ring, addr & 0xfffffffc);
3902 	radeon_ring_write(ring, (upper_32_bits(addr) & 0xffff) | DATA_SEL(1) | INT_SEL(2));
3903 	radeon_ring_write(ring, fence->seq);
3904 	radeon_ring_write(ring, 0);
3905 }
3906 
3907 /**
3908  * cik_fence_compute_ring_emit - emit a fence on the compute ring
3909  *
3910  * @rdev: radeon_device pointer
3911  * @fence: radeon fence object
3912  *
3913  * Emits a fence sequnce number on the compute ring and flushes
3914  * GPU caches.
3915  */
3916 void cik_fence_compute_ring_emit(struct radeon_device *rdev,
3917 				 struct radeon_fence *fence)
3918 {
3919 	struct radeon_ring *ring = &rdev->ring[fence->ring];
3920 	u64 addr = rdev->fence_drv[fence->ring].gpu_addr;
3921 
3922 	/* RELEASE_MEM - flush caches, send int */
3923 	radeon_ring_write(ring, PACKET3(PACKET3_RELEASE_MEM, 5));
3924 	radeon_ring_write(ring, (EOP_TCL1_ACTION_EN |
3925 				 EOP_TC_ACTION_EN |
3926 				 EVENT_TYPE(CACHE_FLUSH_AND_INV_TS_EVENT) |
3927 				 EVENT_INDEX(5)));
3928 	radeon_ring_write(ring, DATA_SEL(1) | INT_SEL(2));
3929 	radeon_ring_write(ring, addr & 0xfffffffc);
3930 	radeon_ring_write(ring, upper_32_bits(addr));
3931 	radeon_ring_write(ring, fence->seq);
3932 	radeon_ring_write(ring, 0);
3933 }
3934 
3935 /**
3936  * cik_semaphore_ring_emit - emit a semaphore on the CP ring
3937  *
3938  * @rdev: radeon_device pointer
3939  * @ring: radeon ring buffer object
3940  * @semaphore: radeon semaphore object
3941  * @emit_wait: Is this a sempahore wait?
3942  *
3943  * Emits a semaphore signal/wait packet to the CP ring and prevents the PFP
3944  * from running ahead of semaphore waits.
3945  */
3946 bool cik_semaphore_ring_emit(struct radeon_device *rdev,
3947 			     struct radeon_ring *ring,
3948 			     struct radeon_semaphore *semaphore,
3949 			     bool emit_wait)
3950 {
3951 	uint64_t addr = semaphore->gpu_addr;
3952 	unsigned sel = emit_wait ? PACKET3_SEM_SEL_WAIT : PACKET3_SEM_SEL_SIGNAL;
3953 
3954 	radeon_ring_write(ring, PACKET3(PACKET3_MEM_SEMAPHORE, 1));
3955 	radeon_ring_write(ring, lower_32_bits(addr));
3956 	radeon_ring_write(ring, (upper_32_bits(addr) & 0xffff) | sel);
3957 
3958 	if (emit_wait && ring->idx == RADEON_RING_TYPE_GFX_INDEX) {
3959 		/* Prevent the PFP from running ahead of the semaphore wait */
3960 		radeon_ring_write(ring, PACKET3(PACKET3_PFP_SYNC_ME, 0));
3961 		radeon_ring_write(ring, 0x0);
3962 	}
3963 
3964 	return true;
3965 }
3966 
3967 /**
3968  * cik_copy_cpdma - copy pages using the CP DMA engine
3969  *
3970  * @rdev: radeon_device pointer
3971  * @src_offset: src GPU address
3972  * @dst_offset: dst GPU address
3973  * @num_gpu_pages: number of GPU pages to xfer
3974  * @fence: radeon fence object
3975  *
3976  * Copy GPU paging using the CP DMA engine (CIK+).
3977  * Used by the radeon ttm implementation to move pages if
3978  * registered as the asic copy callback.
3979  */
3980 int cik_copy_cpdma(struct radeon_device *rdev,
3981 		   uint64_t src_offset, uint64_t dst_offset,
3982 		   unsigned num_gpu_pages,
3983 		   struct radeon_fence **fence)
3984 {
3985 	struct radeon_semaphore *sem = NULL;
3986 	int ring_index = rdev->asic->copy.blit_ring_index;
3987 	struct radeon_ring *ring = &rdev->ring[ring_index];
3988 	u32 size_in_bytes, cur_size_in_bytes, control;
3989 	int i, num_loops;
3990 	int r = 0;
3991 
3992 	r = radeon_semaphore_create(rdev, &sem);
3993 	if (r) {
3994 		DRM_ERROR("radeon: moving bo (%d).\n", r);
3995 		return r;
3996 	}
3997 
3998 	size_in_bytes = (num_gpu_pages << RADEON_GPU_PAGE_SHIFT);
3999 	num_loops = DIV_ROUND_UP(size_in_bytes, 0x1fffff);
4000 	r = radeon_ring_lock(rdev, ring, num_loops * 7 + 18);
4001 	if (r) {
4002 		DRM_ERROR("radeon: moving bo (%d).\n", r);
4003 		radeon_semaphore_free(rdev, &sem, NULL);
4004 		return r;
4005 	}
4006 
4007 	radeon_semaphore_sync_to(sem, *fence);
4008 	radeon_semaphore_sync_rings(rdev, sem, ring->idx);
4009 
4010 	for (i = 0; i < num_loops; i++) {
4011 		cur_size_in_bytes = size_in_bytes;
4012 		if (cur_size_in_bytes > 0x1fffff)
4013 			cur_size_in_bytes = 0x1fffff;
4014 		size_in_bytes -= cur_size_in_bytes;
4015 		control = 0;
4016 		if (size_in_bytes == 0)
4017 			control |= PACKET3_DMA_DATA_CP_SYNC;
4018 		radeon_ring_write(ring, PACKET3(PACKET3_DMA_DATA, 5));
4019 		radeon_ring_write(ring, control);
4020 		radeon_ring_write(ring, lower_32_bits(src_offset));
4021 		radeon_ring_write(ring, upper_32_bits(src_offset));
4022 		radeon_ring_write(ring, lower_32_bits(dst_offset));
4023 		radeon_ring_write(ring, upper_32_bits(dst_offset));
4024 		radeon_ring_write(ring, cur_size_in_bytes);
4025 		src_offset += cur_size_in_bytes;
4026 		dst_offset += cur_size_in_bytes;
4027 	}
4028 
4029 	r = radeon_fence_emit(rdev, fence, ring->idx);
4030 	if (r) {
4031 		radeon_ring_unlock_undo(rdev, ring);
4032 		radeon_semaphore_free(rdev, &sem, NULL);
4033 		return r;
4034 	}
4035 
4036 	radeon_ring_unlock_commit(rdev, ring, false);
4037 	radeon_semaphore_free(rdev, &sem, *fence);
4038 
4039 	return r;
4040 }
4041 
4042 /*
4043  * IB stuff
4044  */
4045 /**
4046  * cik_ring_ib_execute - emit an IB (Indirect Buffer) on the gfx ring
4047  *
4048  * @rdev: radeon_device pointer
4049  * @ib: radeon indirect buffer object
4050  *
4051  * Emits an DE (drawing engine) or CE (constant engine) IB
4052  * on the gfx ring.  IBs are usually generated by userspace
4053  * acceleration drivers and submitted to the kernel for
4054  * sheduling on the ring.  This function schedules the IB
4055  * on the gfx ring for execution by the GPU.
4056  */
4057 void cik_ring_ib_execute(struct radeon_device *rdev, struct radeon_ib *ib)
4058 {
4059 	struct radeon_ring *ring = &rdev->ring[ib->ring];
4060 	u32 header, control = INDIRECT_BUFFER_VALID;
4061 
4062 	if (ib->is_const_ib) {
4063 		/* set switch buffer packet before const IB */
4064 		radeon_ring_write(ring, PACKET3(PACKET3_SWITCH_BUFFER, 0));
4065 		radeon_ring_write(ring, 0);
4066 
4067 		header = PACKET3(PACKET3_INDIRECT_BUFFER_CONST, 2);
4068 	} else {
4069 		u32 next_rptr;
4070 		if (ring->rptr_save_reg) {
4071 			next_rptr = ring->wptr + 3 + 4;
4072 			radeon_ring_write(ring, PACKET3(PACKET3_SET_UCONFIG_REG, 1));
4073 			radeon_ring_write(ring, ((ring->rptr_save_reg -
4074 						  PACKET3_SET_UCONFIG_REG_START) >> 2));
4075 			radeon_ring_write(ring, next_rptr);
4076 		} else if (rdev->wb.enabled) {
4077 			next_rptr = ring->wptr + 5 + 4;
4078 			radeon_ring_write(ring, PACKET3(PACKET3_WRITE_DATA, 3));
4079 			radeon_ring_write(ring, WRITE_DATA_DST_SEL(1));
4080 			radeon_ring_write(ring, ring->next_rptr_gpu_addr & 0xfffffffc);
4081 			radeon_ring_write(ring, upper_32_bits(ring->next_rptr_gpu_addr));
4082 			radeon_ring_write(ring, next_rptr);
4083 		}
4084 
4085 		header = PACKET3(PACKET3_INDIRECT_BUFFER, 2);
4086 	}
4087 
4088 	control |= ib->length_dw |
4089 		(ib->vm ? (ib->vm->id << 24) : 0);
4090 
4091 	radeon_ring_write(ring, header);
4092 	radeon_ring_write(ring,
4093 #ifdef __BIG_ENDIAN
4094 			  (2 << 0) |
4095 #endif
4096 			  (ib->gpu_addr & 0xFFFFFFFC));
4097 	radeon_ring_write(ring, upper_32_bits(ib->gpu_addr) & 0xFFFF);
4098 	radeon_ring_write(ring, control);
4099 }
4100 
4101 /**
4102  * cik_ib_test - basic gfx ring IB test
4103  *
4104  * @rdev: radeon_device pointer
4105  * @ring: radeon_ring structure holding ring information
4106  *
4107  * Allocate an IB and execute it on the gfx ring (CIK).
4108  * Provides a basic gfx ring test to verify that IBs are working.
4109  * Returns 0 on success, error on failure.
4110  */
4111 int cik_ib_test(struct radeon_device *rdev, struct radeon_ring *ring)
4112 {
4113 	struct radeon_ib ib;
4114 	uint32_t scratch;
4115 	uint32_t tmp = 0;
4116 	unsigned i;
4117 	int r;
4118 
4119 	r = radeon_scratch_get(rdev, &scratch);
4120 	if (r) {
4121 		DRM_ERROR("radeon: failed to get scratch reg (%d).\n", r);
4122 		return r;
4123 	}
4124 	WREG32(scratch, 0xCAFEDEAD);
4125 	r = radeon_ib_get(rdev, ring->idx, &ib, NULL, 256);
4126 	if (r) {
4127 		DRM_ERROR("radeon: failed to get ib (%d).\n", r);
4128 		radeon_scratch_free(rdev, scratch);
4129 		return r;
4130 	}
4131 	ib.ptr[0] = PACKET3(PACKET3_SET_UCONFIG_REG, 1);
4132 	ib.ptr[1] = ((scratch - PACKET3_SET_UCONFIG_REG_START) >> 2);
4133 	ib.ptr[2] = 0xDEADBEEF;
4134 	ib.length_dw = 3;
4135 	r = radeon_ib_schedule(rdev, &ib, NULL, false);
4136 	if (r) {
4137 		radeon_scratch_free(rdev, scratch);
4138 		radeon_ib_free(rdev, &ib);
4139 		DRM_ERROR("radeon: failed to schedule ib (%d).\n", r);
4140 		return r;
4141 	}
4142 	r = radeon_fence_wait(ib.fence, false);
4143 	if (r) {
4144 		DRM_ERROR("radeon: fence wait failed (%d).\n", r);
4145 		radeon_scratch_free(rdev, scratch);
4146 		radeon_ib_free(rdev, &ib);
4147 		return r;
4148 	}
4149 	for (i = 0; i < rdev->usec_timeout; i++) {
4150 		tmp = RREG32(scratch);
4151 		if (tmp == 0xDEADBEEF)
4152 			break;
4153 		DRM_UDELAY(1);
4154 	}
4155 	if (i < rdev->usec_timeout) {
4156 		DRM_INFO("ib test on ring %d succeeded in %u usecs\n", ib.fence->ring, i);
4157 	} else {
4158 		DRM_ERROR("radeon: ib test failed (scratch(0x%04X)=0x%08X)\n",
4159 			  scratch, tmp);
4160 		r = -EINVAL;
4161 	}
4162 	radeon_scratch_free(rdev, scratch);
4163 	radeon_ib_free(rdev, &ib);
4164 	return r;
4165 }
4166 
4167 /*
4168  * CP.
4169  * On CIK, gfx and compute now have independant command processors.
4170  *
4171  * GFX
4172  * Gfx consists of a single ring and can process both gfx jobs and
4173  * compute jobs.  The gfx CP consists of three microengines (ME):
4174  * PFP - Pre-Fetch Parser
4175  * ME - Micro Engine
4176  * CE - Constant Engine
4177  * The PFP and ME make up what is considered the Drawing Engine (DE).
4178  * The CE is an asynchronous engine used for updating buffer desciptors
4179  * used by the DE so that they can be loaded into cache in parallel
4180  * while the DE is processing state update packets.
4181  *
4182  * Compute
4183  * The compute CP consists of two microengines (ME):
4184  * MEC1 - Compute MicroEngine 1
4185  * MEC2 - Compute MicroEngine 2
4186  * Each MEC supports 4 compute pipes and each pipe supports 8 queues.
4187  * The queues are exposed to userspace and are programmed directly
4188  * by the compute runtime.
4189  */
4190 /**
4191  * cik_cp_gfx_enable - enable/disable the gfx CP MEs
4192  *
4193  * @rdev: radeon_device pointer
4194  * @enable: enable or disable the MEs
4195  *
4196  * Halts or unhalts the gfx MEs.
4197  */
4198 static void cik_cp_gfx_enable(struct radeon_device *rdev, bool enable)
4199 {
4200 	if (enable)
4201 		WREG32(CP_ME_CNTL, 0);
4202 	else {
4203 		if (rdev->asic->copy.copy_ring_index == RADEON_RING_TYPE_GFX_INDEX)
4204 			radeon_ttm_set_active_vram_size(rdev, rdev->mc.visible_vram_size);
4205 		WREG32(CP_ME_CNTL, (CP_ME_HALT | CP_PFP_HALT | CP_CE_HALT));
4206 		rdev->ring[RADEON_RING_TYPE_GFX_INDEX].ready = false;
4207 	}
4208 	udelay(50);
4209 }
4210 
4211 /**
4212  * cik_cp_gfx_load_microcode - load the gfx CP ME ucode
4213  *
4214  * @rdev: radeon_device pointer
4215  *
4216  * Loads the gfx PFP, ME, and CE ucode.
4217  * Returns 0 for success, -EINVAL if the ucode is not available.
4218  */
4219 static int cik_cp_gfx_load_microcode(struct radeon_device *rdev)
4220 {
4221 	int i;
4222 
4223 	if (!rdev->me_fw || !rdev->pfp_fw || !rdev->ce_fw)
4224 		return -EINVAL;
4225 
4226 	cik_cp_gfx_enable(rdev, false);
4227 
4228 	if (rdev->new_fw) {
4229 		const struct gfx_firmware_header_v1_0 *pfp_hdr =
4230 			(const struct gfx_firmware_header_v1_0 *)rdev->pfp_fw->data;
4231 		const struct gfx_firmware_header_v1_0 *ce_hdr =
4232 			(const struct gfx_firmware_header_v1_0 *)rdev->ce_fw->data;
4233 		const struct gfx_firmware_header_v1_0 *me_hdr =
4234 			(const struct gfx_firmware_header_v1_0 *)rdev->me_fw->data;
4235 		const __le32 *fw_data;
4236 		u32 fw_size;
4237 
4238 		radeon_ucode_print_gfx_hdr(&pfp_hdr->header);
4239 		radeon_ucode_print_gfx_hdr(&ce_hdr->header);
4240 		radeon_ucode_print_gfx_hdr(&me_hdr->header);
4241 
4242 		/* PFP */
4243 		fw_data = (const __le32 *)
4244 			((const char *)rdev->pfp_fw->data + le32_to_cpu(pfp_hdr->header.ucode_array_offset_bytes));
4245 		fw_size = le32_to_cpu(pfp_hdr->header.ucode_size_bytes) / 4;
4246 		WREG32(CP_PFP_UCODE_ADDR, 0);
4247 		for (i = 0; i < fw_size; i++)
4248 			WREG32(CP_PFP_UCODE_DATA, le32_to_cpup(fw_data++));
4249 		WREG32(CP_PFP_UCODE_ADDR, le32_to_cpu(pfp_hdr->header.ucode_version));
4250 
4251 		/* CE */
4252 		fw_data = (const __le32 *)
4253 			((const char *)rdev->ce_fw->data + le32_to_cpu(ce_hdr->header.ucode_array_offset_bytes));
4254 		fw_size = le32_to_cpu(ce_hdr->header.ucode_size_bytes) / 4;
4255 		WREG32(CP_CE_UCODE_ADDR, 0);
4256 		for (i = 0; i < fw_size; i++)
4257 			WREG32(CP_CE_UCODE_DATA, le32_to_cpup(fw_data++));
4258 		WREG32(CP_CE_UCODE_ADDR, le32_to_cpu(ce_hdr->header.ucode_version));
4259 
4260 		/* ME */
4261 		fw_data = (const __be32 *)
4262 			((const char *)rdev->me_fw->data + le32_to_cpu(me_hdr->header.ucode_array_offset_bytes));
4263 		fw_size = le32_to_cpu(me_hdr->header.ucode_size_bytes) / 4;
4264 		WREG32(CP_ME_RAM_WADDR, 0);
4265 		for (i = 0; i < fw_size; i++)
4266 			WREG32(CP_ME_RAM_DATA, le32_to_cpup(fw_data++));
4267 		WREG32(CP_ME_RAM_WADDR, le32_to_cpu(me_hdr->header.ucode_version));
4268 		WREG32(CP_ME_RAM_RADDR, le32_to_cpu(me_hdr->header.ucode_version));
4269 	} else {
4270 		const __be32 *fw_data;
4271 
4272 		/* PFP */
4273 		fw_data = (const __be32 *)rdev->pfp_fw->data;
4274 		WREG32(CP_PFP_UCODE_ADDR, 0);
4275 		for (i = 0; i < CIK_PFP_UCODE_SIZE; i++)
4276 			WREG32(CP_PFP_UCODE_DATA, be32_to_cpup(fw_data++));
4277 		WREG32(CP_PFP_UCODE_ADDR, 0);
4278 
4279 		/* CE */
4280 		fw_data = (const __be32 *)rdev->ce_fw->data;
4281 		WREG32(CP_CE_UCODE_ADDR, 0);
4282 		for (i = 0; i < CIK_CE_UCODE_SIZE; i++)
4283 			WREG32(CP_CE_UCODE_DATA, be32_to_cpup(fw_data++));
4284 		WREG32(CP_CE_UCODE_ADDR, 0);
4285 
4286 		/* ME */
4287 		fw_data = (const __be32 *)rdev->me_fw->data;
4288 		WREG32(CP_ME_RAM_WADDR, 0);
4289 		for (i = 0; i < CIK_ME_UCODE_SIZE; i++)
4290 			WREG32(CP_ME_RAM_DATA, be32_to_cpup(fw_data++));
4291 		WREG32(CP_ME_RAM_WADDR, 0);
4292 	}
4293 
4294 	return 0;
4295 }
4296 
4297 /**
4298  * cik_cp_gfx_start - start the gfx ring
4299  *
4300  * @rdev: radeon_device pointer
4301  *
4302  * Enables the ring and loads the clear state context and other
4303  * packets required to init the ring.
4304  * Returns 0 for success, error for failure.
4305  */
4306 static int cik_cp_gfx_start(struct radeon_device *rdev)
4307 {
4308 	struct radeon_ring *ring = &rdev->ring[RADEON_RING_TYPE_GFX_INDEX];
4309 	int r, i;
4310 
4311 	/* init the CP */
4312 	WREG32(CP_MAX_CONTEXT, rdev->config.cik.max_hw_contexts - 1);
4313 	WREG32(CP_ENDIAN_SWAP, 0);
4314 	WREG32(CP_DEVICE_ID, 1);
4315 
4316 	cik_cp_gfx_enable(rdev, true);
4317 
4318 	r = radeon_ring_lock(rdev, ring, cik_default_size + 17);
4319 	if (r) {
4320 		DRM_ERROR("radeon: cp failed to lock ring (%d).\n", r);
4321 		return r;
4322 	}
4323 
4324 	/* init the CE partitions.  CE only used for gfx on CIK */
4325 	radeon_ring_write(ring, PACKET3(PACKET3_SET_BASE, 2));
4326 	radeon_ring_write(ring, PACKET3_BASE_INDEX(CE_PARTITION_BASE));
4327 	radeon_ring_write(ring, 0x8000);
4328 	radeon_ring_write(ring, 0x8000);
4329 
4330 	/* setup clear context state */
4331 	radeon_ring_write(ring, PACKET3(PACKET3_PREAMBLE_CNTL, 0));
4332 	radeon_ring_write(ring, PACKET3_PREAMBLE_BEGIN_CLEAR_STATE);
4333 
4334 	radeon_ring_write(ring, PACKET3(PACKET3_CONTEXT_CONTROL, 1));
4335 	radeon_ring_write(ring, 0x80000000);
4336 	radeon_ring_write(ring, 0x80000000);
4337 
4338 	for (i = 0; i < cik_default_size; i++)
4339 		radeon_ring_write(ring, cik_default_state[i]);
4340 
4341 	radeon_ring_write(ring, PACKET3(PACKET3_PREAMBLE_CNTL, 0));
4342 	radeon_ring_write(ring, PACKET3_PREAMBLE_END_CLEAR_STATE);
4343 
4344 	/* set clear context state */
4345 	radeon_ring_write(ring, PACKET3(PACKET3_CLEAR_STATE, 0));
4346 	radeon_ring_write(ring, 0);
4347 
4348 	radeon_ring_write(ring, PACKET3(PACKET3_SET_CONTEXT_REG, 2));
4349 	radeon_ring_write(ring, 0x00000316);
4350 	radeon_ring_write(ring, 0x0000000e); /* VGT_VERTEX_REUSE_BLOCK_CNTL */
4351 	radeon_ring_write(ring, 0x00000010); /* VGT_OUT_DEALLOC_CNTL */
4352 
4353 	radeon_ring_unlock_commit(rdev, ring, false);
4354 
4355 	return 0;
4356 }
4357 
4358 /**
4359  * cik_cp_gfx_fini - stop the gfx ring
4360  *
4361  * @rdev: radeon_device pointer
4362  *
4363  * Stop the gfx ring and tear down the driver ring
4364  * info.
4365  */
4366 static void cik_cp_gfx_fini(struct radeon_device *rdev)
4367 {
4368 	cik_cp_gfx_enable(rdev, false);
4369 	radeon_ring_fini(rdev, &rdev->ring[RADEON_RING_TYPE_GFX_INDEX]);
4370 }
4371 
4372 /**
4373  * cik_cp_gfx_resume - setup the gfx ring buffer registers
4374  *
4375  * @rdev: radeon_device pointer
4376  *
4377  * Program the location and size of the gfx ring buffer
4378  * and test it to make sure it's working.
4379  * Returns 0 for success, error for failure.
4380  */
4381 static int cik_cp_gfx_resume(struct radeon_device *rdev)
4382 {
4383 	struct radeon_ring *ring;
4384 	u32 tmp;
4385 	u32 rb_bufsz;
4386 	u64 rb_addr;
4387 	int r;
4388 
4389 	WREG32(CP_SEM_WAIT_TIMER, 0x0);
4390 	if (rdev->family != CHIP_HAWAII)
4391 		WREG32(CP_SEM_INCOMPLETE_TIMER_CNTL, 0x0);
4392 
4393 	/* Set the write pointer delay */
4394 	WREG32(CP_RB_WPTR_DELAY, 0);
4395 
4396 	/* set the RB to use vmid 0 */
4397 	WREG32(CP_RB_VMID, 0);
4398 
4399 	WREG32(SCRATCH_ADDR, ((rdev->wb.gpu_addr + RADEON_WB_SCRATCH_OFFSET) >> 8) & 0xFFFFFFFF);
4400 
4401 	/* ring 0 - compute and gfx */
4402 	/* Set ring buffer size */
4403 	ring = &rdev->ring[RADEON_RING_TYPE_GFX_INDEX];
4404 	rb_bufsz = order_base_2(ring->ring_size / 8);
4405 	tmp = (order_base_2(RADEON_GPU_PAGE_SIZE/8) << 8) | rb_bufsz;
4406 #ifdef __BIG_ENDIAN
4407 	tmp |= BUF_SWAP_32BIT;
4408 #endif
4409 	WREG32(CP_RB0_CNTL, tmp);
4410 
4411 	/* Initialize the ring buffer's read and write pointers */
4412 	WREG32(CP_RB0_CNTL, tmp | RB_RPTR_WR_ENA);
4413 	ring->wptr = 0;
4414 	WREG32(CP_RB0_WPTR, ring->wptr);
4415 
4416 	/* set the wb address wether it's enabled or not */
4417 	WREG32(CP_RB0_RPTR_ADDR, (rdev->wb.gpu_addr + RADEON_WB_CP_RPTR_OFFSET) & 0xFFFFFFFC);
4418 	WREG32(CP_RB0_RPTR_ADDR_HI, upper_32_bits(rdev->wb.gpu_addr + RADEON_WB_CP_RPTR_OFFSET) & 0xFF);
4419 
4420 	/* scratch register shadowing is no longer supported */
4421 	WREG32(SCRATCH_UMSK, 0);
4422 
4423 	if (!rdev->wb.enabled)
4424 		tmp |= RB_NO_UPDATE;
4425 
4426 	mdelay(1);
4427 	WREG32(CP_RB0_CNTL, tmp);
4428 
4429 	rb_addr = ring->gpu_addr >> 8;
4430 	WREG32(CP_RB0_BASE, rb_addr);
4431 	WREG32(CP_RB0_BASE_HI, upper_32_bits(rb_addr));
4432 
4433 	/* start the ring */
4434 	cik_cp_gfx_start(rdev);
4435 	rdev->ring[RADEON_RING_TYPE_GFX_INDEX].ready = true;
4436 	r = radeon_ring_test(rdev, RADEON_RING_TYPE_GFX_INDEX, &rdev->ring[RADEON_RING_TYPE_GFX_INDEX]);
4437 	if (r) {
4438 		rdev->ring[RADEON_RING_TYPE_GFX_INDEX].ready = false;
4439 		return r;
4440 	}
4441 
4442 	if (rdev->asic->copy.copy_ring_index == RADEON_RING_TYPE_GFX_INDEX)
4443 		radeon_ttm_set_active_vram_size(rdev, rdev->mc.real_vram_size);
4444 
4445 	return 0;
4446 }
4447 
4448 u32 cik_gfx_get_rptr(struct radeon_device *rdev,
4449 		     struct radeon_ring *ring)
4450 {
4451 	u32 rptr;
4452 
4453 	if (rdev->wb.enabled)
4454 		rptr = rdev->wb.wb[ring->rptr_offs/4];
4455 	else
4456 		rptr = RREG32(CP_RB0_RPTR);
4457 
4458 	return rptr;
4459 }
4460 
4461 u32 cik_gfx_get_wptr(struct radeon_device *rdev,
4462 		     struct radeon_ring *ring)
4463 {
4464 	u32 wptr;
4465 
4466 	wptr = RREG32(CP_RB0_WPTR);
4467 
4468 	return wptr;
4469 }
4470 
4471 void cik_gfx_set_wptr(struct radeon_device *rdev,
4472 		      struct radeon_ring *ring)
4473 {
4474 	WREG32(CP_RB0_WPTR, ring->wptr);
4475 	(void)RREG32(CP_RB0_WPTR);
4476 }
4477 
4478 u32 cik_compute_get_rptr(struct radeon_device *rdev,
4479 			 struct radeon_ring *ring)
4480 {
4481 	u32 rptr;
4482 
4483 	if (rdev->wb.enabled) {
4484 		rptr = rdev->wb.wb[ring->rptr_offs/4];
4485 	} else {
4486 		spin_lock(&rdev->srbm_mutex);
4487 		cik_srbm_select(rdev, ring->me, ring->pipe, ring->queue, 0);
4488 		rptr = RREG32(CP_HQD_PQ_RPTR);
4489 		cik_srbm_select(rdev, 0, 0, 0, 0);
4490 		spin_unlock(&rdev->srbm_mutex);
4491 	}
4492 
4493 	return rptr;
4494 }
4495 
4496 u32 cik_compute_get_wptr(struct radeon_device *rdev,
4497 			 struct radeon_ring *ring)
4498 {
4499 	u32 wptr;
4500 
4501 	if (rdev->wb.enabled) {
4502 		/* XXX check if swapping is necessary on BE */
4503 		wptr = rdev->wb.wb[ring->wptr_offs/4];
4504 	} else {
4505 		spin_lock(&rdev->srbm_mutex);
4506 		cik_srbm_select(rdev, ring->me, ring->pipe, ring->queue, 0);
4507 		wptr = RREG32(CP_HQD_PQ_WPTR);
4508 		cik_srbm_select(rdev, 0, 0, 0, 0);
4509 		spin_unlock(&rdev->srbm_mutex);
4510 	}
4511 
4512 	return wptr;
4513 }
4514 
4515 void cik_compute_set_wptr(struct radeon_device *rdev,
4516 			  struct radeon_ring *ring)
4517 {
4518 	/* XXX check if swapping is necessary on BE */
4519 	rdev->wb.wb[ring->wptr_offs/4] = ring->wptr;
4520 	WDOORBELL32(ring->doorbell_index, ring->wptr);
4521 }
4522 
4523 /**
4524  * cik_cp_compute_enable - enable/disable the compute CP MEs
4525  *
4526  * @rdev: radeon_device pointer
4527  * @enable: enable or disable the MEs
4528  *
4529  * Halts or unhalts the compute MEs.
4530  */
4531 static void cik_cp_compute_enable(struct radeon_device *rdev, bool enable)
4532 {
4533 	if (enable)
4534 		WREG32(CP_MEC_CNTL, 0);
4535 	else {
4536 		WREG32(CP_MEC_CNTL, (MEC_ME1_HALT | MEC_ME2_HALT));
4537 		rdev->ring[CAYMAN_RING_TYPE_CP1_INDEX].ready = false;
4538 		rdev->ring[CAYMAN_RING_TYPE_CP2_INDEX].ready = false;
4539 	}
4540 	udelay(50);
4541 }
4542 
4543 /**
4544  * cik_cp_compute_load_microcode - load the compute CP ME ucode
4545  *
4546  * @rdev: radeon_device pointer
4547  *
4548  * Loads the compute MEC1&2 ucode.
4549  * Returns 0 for success, -EINVAL if the ucode is not available.
4550  */
4551 static int cik_cp_compute_load_microcode(struct radeon_device *rdev)
4552 {
4553 	int i;
4554 
4555 	if (!rdev->mec_fw)
4556 		return -EINVAL;
4557 
4558 	cik_cp_compute_enable(rdev, false);
4559 
4560 	if (rdev->new_fw) {
4561 		const struct gfx_firmware_header_v1_0 *mec_hdr =
4562 			(const struct gfx_firmware_header_v1_0 *)rdev->mec_fw->data;
4563 		const __le32 *fw_data;
4564 		u32 fw_size;
4565 
4566 		radeon_ucode_print_gfx_hdr(&mec_hdr->header);
4567 
4568 		/* MEC1 */
4569 		fw_data = (const __le32 *)
4570 			((const char *)rdev->mec_fw->data + le32_to_cpu(mec_hdr->header.ucode_array_offset_bytes));
4571 		fw_size = le32_to_cpu(mec_hdr->header.ucode_size_bytes) / 4;
4572 		WREG32(CP_MEC_ME1_UCODE_ADDR, 0);
4573 		for (i = 0; i < fw_size; i++)
4574 			WREG32(CP_MEC_ME1_UCODE_DATA, le32_to_cpup(fw_data++));
4575 		WREG32(CP_MEC_ME1_UCODE_ADDR, le32_to_cpu(mec_hdr->header.ucode_version));
4576 
4577 		/* MEC2 */
4578 		if (rdev->family == CHIP_KAVERI) {
4579 			const struct gfx_firmware_header_v1_0 *mec2_hdr =
4580 				(const struct gfx_firmware_header_v1_0 *)rdev->mec2_fw->data;
4581 
4582 			fw_data = (const __le32 *)
4583 				((const char *)rdev->mec2_fw->data +
4584 				 le32_to_cpu(mec2_hdr->header.ucode_array_offset_bytes));
4585 			fw_size = le32_to_cpu(mec2_hdr->header.ucode_size_bytes) / 4;
4586 			WREG32(CP_MEC_ME2_UCODE_ADDR, 0);
4587 			for (i = 0; i < fw_size; i++)
4588 				WREG32(CP_MEC_ME2_UCODE_DATA, le32_to_cpup(fw_data++));
4589 			WREG32(CP_MEC_ME2_UCODE_ADDR, le32_to_cpu(mec2_hdr->header.ucode_version));
4590 		}
4591 	} else {
4592 		const __be32 *fw_data;
4593 
4594 		/* MEC1 */
4595 		fw_data = (const __be32 *)rdev->mec_fw->data;
4596 		WREG32(CP_MEC_ME1_UCODE_ADDR, 0);
4597 		for (i = 0; i < CIK_MEC_UCODE_SIZE; i++)
4598 			WREG32(CP_MEC_ME1_UCODE_DATA, be32_to_cpup(fw_data++));
4599 		WREG32(CP_MEC_ME1_UCODE_ADDR, 0);
4600 
4601 		if (rdev->family == CHIP_KAVERI) {
4602 			/* MEC2 */
4603 			fw_data = (const __be32 *)rdev->mec_fw->data;
4604 			WREG32(CP_MEC_ME2_UCODE_ADDR, 0);
4605 			for (i = 0; i < CIK_MEC_UCODE_SIZE; i++)
4606 				WREG32(CP_MEC_ME2_UCODE_DATA, be32_to_cpup(fw_data++));
4607 			WREG32(CP_MEC_ME2_UCODE_ADDR, 0);
4608 		}
4609 	}
4610 
4611 	return 0;
4612 }
4613 
4614 /**
4615  * cik_cp_compute_start - start the compute queues
4616  *
4617  * @rdev: radeon_device pointer
4618  *
4619  * Enable the compute queues.
4620  * Returns 0 for success, error for failure.
4621  */
4622 static int cik_cp_compute_start(struct radeon_device *rdev)
4623 {
4624 	cik_cp_compute_enable(rdev, true);
4625 
4626 	return 0;
4627 }
4628 
4629 /**
4630  * cik_cp_compute_fini - stop the compute queues
4631  *
4632  * @rdev: radeon_device pointer
4633  *
4634  * Stop the compute queues and tear down the driver queue
4635  * info.
4636  */
4637 static void cik_cp_compute_fini(struct radeon_device *rdev)
4638 {
4639 	int i, idx, r;
4640 
4641 	cik_cp_compute_enable(rdev, false);
4642 
4643 	for (i = 0; i < 2; i++) {
4644 		if (i == 0)
4645 			idx = CAYMAN_RING_TYPE_CP1_INDEX;
4646 		else
4647 			idx = CAYMAN_RING_TYPE_CP2_INDEX;
4648 
4649 		if (rdev->ring[idx].mqd_obj) {
4650 			r = radeon_bo_reserve(rdev->ring[idx].mqd_obj, false);
4651 			if (unlikely(r != 0))
4652 				dev_warn(rdev->dev, "(%d) reserve MQD bo failed\n", r);
4653 
4654 			radeon_bo_unpin(rdev->ring[idx].mqd_obj);
4655 			radeon_bo_unreserve(rdev->ring[idx].mqd_obj);
4656 
4657 			radeon_bo_unref(&rdev->ring[idx].mqd_obj);
4658 			rdev->ring[idx].mqd_obj = NULL;
4659 		}
4660 	}
4661 }
4662 
4663 static void cik_mec_fini(struct radeon_device *rdev)
4664 {
4665 	int r;
4666 
4667 	if (rdev->mec.hpd_eop_obj) {
4668 		r = radeon_bo_reserve(rdev->mec.hpd_eop_obj, false);
4669 		if (unlikely(r != 0))
4670 			dev_warn(rdev->dev, "(%d) reserve HPD EOP bo failed\n", r);
4671 		radeon_bo_unpin(rdev->mec.hpd_eop_obj);
4672 		radeon_bo_unreserve(rdev->mec.hpd_eop_obj);
4673 
4674 		radeon_bo_unref(&rdev->mec.hpd_eop_obj);
4675 		rdev->mec.hpd_eop_obj = NULL;
4676 	}
4677 }
4678 
4679 #define MEC_HPD_SIZE 2048
4680 
4681 static int cik_mec_init(struct radeon_device *rdev)
4682 {
4683 	int r;
4684 	u32 *hpd;
4685 
4686 	/*
4687 	 * KV:    2 MEC, 4 Pipes/MEC, 8 Queues/Pipe - 64 Queues total
4688 	 * CI/KB: 1 MEC, 4 Pipes/MEC, 8 Queues/Pipe - 32 Queues total
4689 	 */
4690 	if (rdev->family == CHIP_KAVERI)
4691 		rdev->mec.num_mec = 2;
4692 	else
4693 		rdev->mec.num_mec = 1;
4694 	rdev->mec.num_pipe = 4;
4695 	rdev->mec.num_queue = rdev->mec.num_mec * rdev->mec.num_pipe * 8;
4696 
4697 	if (rdev->mec.hpd_eop_obj == NULL) {
4698 		r = radeon_bo_create(rdev,
4699 				     rdev->mec.num_mec *rdev->mec.num_pipe * MEC_HPD_SIZE * 2,
4700 				     PAGE_SIZE, true,
4701 				     RADEON_GEM_DOMAIN_GTT, 0, NULL,
4702 				     &rdev->mec.hpd_eop_obj);
4703 		if (r) {
4704 			dev_warn(rdev->dev, "(%d) create HDP EOP bo failed\n", r);
4705 			return r;
4706 		}
4707 	}
4708 
4709 	r = radeon_bo_reserve(rdev->mec.hpd_eop_obj, false);
4710 	if (unlikely(r != 0)) {
4711 		cik_mec_fini(rdev);
4712 		return r;
4713 	}
4714 	r = radeon_bo_pin(rdev->mec.hpd_eop_obj, RADEON_GEM_DOMAIN_GTT,
4715 			  &rdev->mec.hpd_eop_gpu_addr);
4716 	if (r) {
4717 		dev_warn(rdev->dev, "(%d) pin HDP EOP bo failed\n", r);
4718 		cik_mec_fini(rdev);
4719 		return r;
4720 	}
4721 	r = radeon_bo_kmap(rdev->mec.hpd_eop_obj, (void **)&hpd);
4722 	if (r) {
4723 		dev_warn(rdev->dev, "(%d) map HDP EOP bo failed\n", r);
4724 		cik_mec_fini(rdev);
4725 		return r;
4726 	}
4727 
4728 	/* clear memory.  Not sure if this is required or not */
4729 	memset(hpd, 0, rdev->mec.num_mec *rdev->mec.num_pipe * MEC_HPD_SIZE * 2);
4730 
4731 	radeon_bo_kunmap(rdev->mec.hpd_eop_obj);
4732 	radeon_bo_unreserve(rdev->mec.hpd_eop_obj);
4733 
4734 	return 0;
4735 }
4736 
4737 struct hqd_registers
4738 {
4739 	u32 cp_mqd_base_addr;
4740 	u32 cp_mqd_base_addr_hi;
4741 	u32 cp_hqd_active;
4742 	u32 cp_hqd_vmid;
4743 	u32 cp_hqd_persistent_state;
4744 	u32 cp_hqd_pipe_priority;
4745 	u32 cp_hqd_queue_priority;
4746 	u32 cp_hqd_quantum;
4747 	u32 cp_hqd_pq_base;
4748 	u32 cp_hqd_pq_base_hi;
4749 	u32 cp_hqd_pq_rptr;
4750 	u32 cp_hqd_pq_rptr_report_addr;
4751 	u32 cp_hqd_pq_rptr_report_addr_hi;
4752 	u32 cp_hqd_pq_wptr_poll_addr;
4753 	u32 cp_hqd_pq_wptr_poll_addr_hi;
4754 	u32 cp_hqd_pq_doorbell_control;
4755 	u32 cp_hqd_pq_wptr;
4756 	u32 cp_hqd_pq_control;
4757 	u32 cp_hqd_ib_base_addr;
4758 	u32 cp_hqd_ib_base_addr_hi;
4759 	u32 cp_hqd_ib_rptr;
4760 	u32 cp_hqd_ib_control;
4761 	u32 cp_hqd_iq_timer;
4762 	u32 cp_hqd_iq_rptr;
4763 	u32 cp_hqd_dequeue_request;
4764 	u32 cp_hqd_dma_offload;
4765 	u32 cp_hqd_sema_cmd;
4766 	u32 cp_hqd_msg_type;
4767 	u32 cp_hqd_atomic0_preop_lo;
4768 	u32 cp_hqd_atomic0_preop_hi;
4769 	u32 cp_hqd_atomic1_preop_lo;
4770 	u32 cp_hqd_atomic1_preop_hi;
4771 	u32 cp_hqd_hq_scheduler0;
4772 	u32 cp_hqd_hq_scheduler1;
4773 	u32 cp_mqd_control;
4774 };
4775 
4776 struct bonaire_mqd
4777 {
4778 	u32 header;
4779 	u32 dispatch_initiator;
4780 	u32 dimensions[3];
4781 	u32 start_idx[3];
4782 	u32 num_threads[3];
4783 	u32 pipeline_stat_enable;
4784 	u32 perf_counter_enable;
4785 	u32 pgm[2];
4786 	u32 tba[2];
4787 	u32 tma[2];
4788 	u32 pgm_rsrc[2];
4789 	u32 vmid;
4790 	u32 resource_limits;
4791 	u32 static_thread_mgmt01[2];
4792 	u32 tmp_ring_size;
4793 	u32 static_thread_mgmt23[2];
4794 	u32 restart[3];
4795 	u32 thread_trace_enable;
4796 	u32 reserved1;
4797 	u32 user_data[16];
4798 	u32 vgtcs_invoke_count[2];
4799 	struct hqd_registers queue_state;
4800 	u32 dequeue_cntr;
4801 	u32 interrupt_queue[64];
4802 };
4803 
4804 /**
4805  * cik_cp_compute_resume - setup the compute queue registers
4806  *
4807  * @rdev: radeon_device pointer
4808  *
4809  * Program the compute queues and test them to make sure they
4810  * are working.
4811  * Returns 0 for success, error for failure.
4812  */
4813 static int cik_cp_compute_resume(struct radeon_device *rdev)
4814 {
4815 	int r, i, j, idx;
4816 	u32 tmp;
4817 	bool use_doorbell = true;
4818 	u64 hqd_gpu_addr;
4819 	u64 mqd_gpu_addr;
4820 	u64 eop_gpu_addr;
4821 	u64 wb_gpu_addr;
4822 	u32 *buf;
4823 	struct bonaire_mqd *mqd;
4824 
4825 	r = cik_cp_compute_start(rdev);
4826 	if (r)
4827 		return r;
4828 
4829 	/* fix up chicken bits */
4830 	tmp = RREG32(CP_CPF_DEBUG);
4831 	tmp |= (1 << 23);
4832 	WREG32(CP_CPF_DEBUG, tmp);
4833 
4834 	/* init the pipes */
4835 	spin_lock(&rdev->srbm_mutex);
4836 	for (i = 0; i < (rdev->mec.num_pipe * rdev->mec.num_mec); i++) {
4837 		int me = (i < 4) ? 1 : 2;
4838 		int pipe = (i < 4) ? i : (i - 4);
4839 
4840 		eop_gpu_addr = rdev->mec.hpd_eop_gpu_addr + (i * MEC_HPD_SIZE * 2);
4841 
4842 		cik_srbm_select(rdev, me, pipe, 0, 0);
4843 
4844 		/* write the EOP addr */
4845 		WREG32(CP_HPD_EOP_BASE_ADDR, eop_gpu_addr >> 8);
4846 		WREG32(CP_HPD_EOP_BASE_ADDR_HI, upper_32_bits(eop_gpu_addr) >> 8);
4847 
4848 		/* set the VMID assigned */
4849 		WREG32(CP_HPD_EOP_VMID, 0);
4850 
4851 		/* set the EOP size, register value is 2^(EOP_SIZE+1) dwords */
4852 		tmp = RREG32(CP_HPD_EOP_CONTROL);
4853 		tmp &= ~EOP_SIZE_MASK;
4854 		tmp |= order_base_2(MEC_HPD_SIZE / 8);
4855 		WREG32(CP_HPD_EOP_CONTROL, tmp);
4856 	}
4857 	cik_srbm_select(rdev, 0, 0, 0, 0);
4858 	spin_unlock(&rdev->srbm_mutex);
4859 
4860 	/* init the queues.  Just two for now. */
4861 	for (i = 0; i < 2; i++) {
4862 		if (i == 0)
4863 			idx = CAYMAN_RING_TYPE_CP1_INDEX;
4864 		else
4865 			idx = CAYMAN_RING_TYPE_CP2_INDEX;
4866 
4867 		if (rdev->ring[idx].mqd_obj == NULL) {
4868 			r = radeon_bo_create(rdev,
4869 					     sizeof(struct bonaire_mqd),
4870 					     PAGE_SIZE, true,
4871 					     RADEON_GEM_DOMAIN_GTT, 0, NULL,
4872 					     &rdev->ring[idx].mqd_obj);
4873 			if (r) {
4874 				dev_warn(rdev->dev, "(%d) create MQD bo failed\n", r);
4875 				return r;
4876 			}
4877 		}
4878 
4879 		r = radeon_bo_reserve(rdev->ring[idx].mqd_obj, false);
4880 		if (unlikely(r != 0)) {
4881 			cik_cp_compute_fini(rdev);
4882 			return r;
4883 		}
4884 		r = radeon_bo_pin(rdev->ring[idx].mqd_obj, RADEON_GEM_DOMAIN_GTT,
4885 				  &mqd_gpu_addr);
4886 		if (r) {
4887 			dev_warn(rdev->dev, "(%d) pin MQD bo failed\n", r);
4888 			cik_cp_compute_fini(rdev);
4889 			return r;
4890 		}
4891 		r = radeon_bo_kmap(rdev->ring[idx].mqd_obj, (void **)&buf);
4892 		if (r) {
4893 			dev_warn(rdev->dev, "(%d) map MQD bo failed\n", r);
4894 			cik_cp_compute_fini(rdev);
4895 			return r;
4896 		}
4897 
4898 		/* init the mqd struct */
4899 		memset(buf, 0, sizeof(struct bonaire_mqd));
4900 
4901 		mqd = (struct bonaire_mqd *)buf;
4902 		mqd->header = 0xC0310800;
4903 		mqd->static_thread_mgmt01[0] = 0xffffffff;
4904 		mqd->static_thread_mgmt01[1] = 0xffffffff;
4905 		mqd->static_thread_mgmt23[0] = 0xffffffff;
4906 		mqd->static_thread_mgmt23[1] = 0xffffffff;
4907 
4908 		spin_lock(&rdev->srbm_mutex);
4909 		cik_srbm_select(rdev, rdev->ring[idx].me,
4910 				rdev->ring[idx].pipe,
4911 				rdev->ring[idx].queue, 0);
4912 
4913 		/* disable wptr polling */
4914 		tmp = RREG32(CP_PQ_WPTR_POLL_CNTL);
4915 		tmp &= ~WPTR_POLL_EN;
4916 		WREG32(CP_PQ_WPTR_POLL_CNTL, tmp);
4917 
4918 		/* enable doorbell? */
4919 		mqd->queue_state.cp_hqd_pq_doorbell_control =
4920 			RREG32(CP_HQD_PQ_DOORBELL_CONTROL);
4921 		if (use_doorbell)
4922 			mqd->queue_state.cp_hqd_pq_doorbell_control |= DOORBELL_EN;
4923 		else
4924 			mqd->queue_state.cp_hqd_pq_doorbell_control &= ~DOORBELL_EN;
4925 		WREG32(CP_HQD_PQ_DOORBELL_CONTROL,
4926 		       mqd->queue_state.cp_hqd_pq_doorbell_control);
4927 
4928 		/* disable the queue if it's active */
4929 		mqd->queue_state.cp_hqd_dequeue_request = 0;
4930 		mqd->queue_state.cp_hqd_pq_rptr = 0;
4931 		mqd->queue_state.cp_hqd_pq_wptr= 0;
4932 		if (RREG32(CP_HQD_ACTIVE) & 1) {
4933 			WREG32(CP_HQD_DEQUEUE_REQUEST, 1);
4934 			for (j = 0; j < rdev->usec_timeout; j++) {
4935 				if (!(RREG32(CP_HQD_ACTIVE) & 1))
4936 					break;
4937 				udelay(1);
4938 			}
4939 			WREG32(CP_HQD_DEQUEUE_REQUEST, mqd->queue_state.cp_hqd_dequeue_request);
4940 			WREG32(CP_HQD_PQ_RPTR, mqd->queue_state.cp_hqd_pq_rptr);
4941 			WREG32(CP_HQD_PQ_WPTR, mqd->queue_state.cp_hqd_pq_wptr);
4942 		}
4943 
4944 		/* set the pointer to the MQD */
4945 		mqd->queue_state.cp_mqd_base_addr = mqd_gpu_addr & 0xfffffffc;
4946 		mqd->queue_state.cp_mqd_base_addr_hi = upper_32_bits(mqd_gpu_addr);
4947 		WREG32(CP_MQD_BASE_ADDR, mqd->queue_state.cp_mqd_base_addr);
4948 		WREG32(CP_MQD_BASE_ADDR_HI, mqd->queue_state.cp_mqd_base_addr_hi);
4949 		/* set MQD vmid to 0 */
4950 		mqd->queue_state.cp_mqd_control = RREG32(CP_MQD_CONTROL);
4951 		mqd->queue_state.cp_mqd_control &= ~MQD_VMID_MASK;
4952 		WREG32(CP_MQD_CONTROL, mqd->queue_state.cp_mqd_control);
4953 
4954 		/* set the pointer to the HQD, this is similar CP_RB0_BASE/_HI */
4955 		hqd_gpu_addr = rdev->ring[idx].gpu_addr >> 8;
4956 		mqd->queue_state.cp_hqd_pq_base = hqd_gpu_addr;
4957 		mqd->queue_state.cp_hqd_pq_base_hi = upper_32_bits(hqd_gpu_addr);
4958 		WREG32(CP_HQD_PQ_BASE, mqd->queue_state.cp_hqd_pq_base);
4959 		WREG32(CP_HQD_PQ_BASE_HI, mqd->queue_state.cp_hqd_pq_base_hi);
4960 
4961 		/* set up the HQD, this is similar to CP_RB0_CNTL */
4962 		mqd->queue_state.cp_hqd_pq_control = RREG32(CP_HQD_PQ_CONTROL);
4963 		mqd->queue_state.cp_hqd_pq_control &=
4964 			~(QUEUE_SIZE_MASK | RPTR_BLOCK_SIZE_MASK);
4965 
4966 		mqd->queue_state.cp_hqd_pq_control |=
4967 			order_base_2(rdev->ring[idx].ring_size / 8);
4968 		mqd->queue_state.cp_hqd_pq_control |=
4969 			(order_base_2(RADEON_GPU_PAGE_SIZE/8) << 8);
4970 #ifdef __BIG_ENDIAN
4971 		mqd->queue_state.cp_hqd_pq_control |= BUF_SWAP_32BIT;
4972 #endif
4973 		mqd->queue_state.cp_hqd_pq_control &=
4974 			~(UNORD_DISPATCH | ROQ_PQ_IB_FLIP | PQ_VOLATILE);
4975 		mqd->queue_state.cp_hqd_pq_control |=
4976 			PRIV_STATE | KMD_QUEUE; /* assuming kernel queue control */
4977 		WREG32(CP_HQD_PQ_CONTROL, mqd->queue_state.cp_hqd_pq_control);
4978 
4979 		/* only used if CP_PQ_WPTR_POLL_CNTL.WPTR_POLL_EN=1 */
4980 		if (i == 0)
4981 			wb_gpu_addr = rdev->wb.gpu_addr + CIK_WB_CP1_WPTR_OFFSET;
4982 		else
4983 			wb_gpu_addr = rdev->wb.gpu_addr + CIK_WB_CP2_WPTR_OFFSET;
4984 		mqd->queue_state.cp_hqd_pq_wptr_poll_addr = wb_gpu_addr & 0xfffffffc;
4985 		mqd->queue_state.cp_hqd_pq_wptr_poll_addr_hi = upper_32_bits(wb_gpu_addr) & 0xffff;
4986 		WREG32(CP_HQD_PQ_WPTR_POLL_ADDR, mqd->queue_state.cp_hqd_pq_wptr_poll_addr);
4987 		WREG32(CP_HQD_PQ_WPTR_POLL_ADDR_HI,
4988 		       mqd->queue_state.cp_hqd_pq_wptr_poll_addr_hi);
4989 
4990 		/* set the wb address wether it's enabled or not */
4991 		if (i == 0)
4992 			wb_gpu_addr = rdev->wb.gpu_addr + RADEON_WB_CP1_RPTR_OFFSET;
4993 		else
4994 			wb_gpu_addr = rdev->wb.gpu_addr + RADEON_WB_CP2_RPTR_OFFSET;
4995 		mqd->queue_state.cp_hqd_pq_rptr_report_addr = wb_gpu_addr & 0xfffffffc;
4996 		mqd->queue_state.cp_hqd_pq_rptr_report_addr_hi =
4997 			upper_32_bits(wb_gpu_addr) & 0xffff;
4998 		WREG32(CP_HQD_PQ_RPTR_REPORT_ADDR,
4999 		       mqd->queue_state.cp_hqd_pq_rptr_report_addr);
5000 		WREG32(CP_HQD_PQ_RPTR_REPORT_ADDR_HI,
5001 		       mqd->queue_state.cp_hqd_pq_rptr_report_addr_hi);
5002 
5003 		/* enable the doorbell if requested */
5004 		if (use_doorbell) {
5005 			mqd->queue_state.cp_hqd_pq_doorbell_control =
5006 				RREG32(CP_HQD_PQ_DOORBELL_CONTROL);
5007 			mqd->queue_state.cp_hqd_pq_doorbell_control &= ~DOORBELL_OFFSET_MASK;
5008 			mqd->queue_state.cp_hqd_pq_doorbell_control |=
5009 				DOORBELL_OFFSET(rdev->ring[idx].doorbell_index);
5010 			mqd->queue_state.cp_hqd_pq_doorbell_control |= DOORBELL_EN;
5011 			mqd->queue_state.cp_hqd_pq_doorbell_control &=
5012 				~(DOORBELL_SOURCE | DOORBELL_HIT);
5013 
5014 		} else {
5015 			mqd->queue_state.cp_hqd_pq_doorbell_control = 0;
5016 		}
5017 		WREG32(CP_HQD_PQ_DOORBELL_CONTROL,
5018 		       mqd->queue_state.cp_hqd_pq_doorbell_control);
5019 
5020 		/* read and write pointers, similar to CP_RB0_WPTR/_RPTR */
5021 		rdev->ring[idx].wptr = 0;
5022 		mqd->queue_state.cp_hqd_pq_wptr = rdev->ring[idx].wptr;
5023 		WREG32(CP_HQD_PQ_WPTR, mqd->queue_state.cp_hqd_pq_wptr);
5024 		mqd->queue_state.cp_hqd_pq_rptr = RREG32(CP_HQD_PQ_RPTR);
5025 
5026 		/* set the vmid for the queue */
5027 		mqd->queue_state.cp_hqd_vmid = 0;
5028 		WREG32(CP_HQD_VMID, mqd->queue_state.cp_hqd_vmid);
5029 
5030 		/* activate the queue */
5031 		mqd->queue_state.cp_hqd_active = 1;
5032 		WREG32(CP_HQD_ACTIVE, mqd->queue_state.cp_hqd_active);
5033 
5034 		cik_srbm_select(rdev, 0, 0, 0, 0);
5035 		spin_unlock(&rdev->srbm_mutex);
5036 
5037 		radeon_bo_kunmap(rdev->ring[idx].mqd_obj);
5038 		radeon_bo_unreserve(rdev->ring[idx].mqd_obj);
5039 
5040 		rdev->ring[idx].ready = true;
5041 		r = radeon_ring_test(rdev, idx, &rdev->ring[idx]);
5042 		if (r)
5043 			rdev->ring[idx].ready = false;
5044 	}
5045 
5046 	return 0;
5047 }
5048 
5049 static void cik_cp_enable(struct radeon_device *rdev, bool enable)
5050 {
5051 	cik_cp_gfx_enable(rdev, enable);
5052 	cik_cp_compute_enable(rdev, enable);
5053 }
5054 
5055 static int cik_cp_load_microcode(struct radeon_device *rdev)
5056 {
5057 	int r;
5058 
5059 	r = cik_cp_gfx_load_microcode(rdev);
5060 	if (r)
5061 		return r;
5062 	r = cik_cp_compute_load_microcode(rdev);
5063 	if (r)
5064 		return r;
5065 
5066 	return 0;
5067 }
5068 
5069 static void cik_cp_fini(struct radeon_device *rdev)
5070 {
5071 	cik_cp_gfx_fini(rdev);
5072 	cik_cp_compute_fini(rdev);
5073 }
5074 
5075 static int cik_cp_resume(struct radeon_device *rdev)
5076 {
5077 	int r;
5078 
5079 	cik_enable_gui_idle_interrupt(rdev, false);
5080 
5081 	r = cik_cp_load_microcode(rdev);
5082 	if (r)
5083 		return r;
5084 
5085 	r = cik_cp_gfx_resume(rdev);
5086 	if (r)
5087 		return r;
5088 	r = cik_cp_compute_resume(rdev);
5089 	if (r)
5090 		return r;
5091 
5092 	cik_enable_gui_idle_interrupt(rdev, true);
5093 
5094 	return 0;
5095 }
5096 
5097 static void cik_print_gpu_status_regs(struct radeon_device *rdev)
5098 {
5099 	dev_info(rdev->dev, "  GRBM_STATUS=0x%08X\n",
5100 		RREG32(GRBM_STATUS));
5101 	dev_info(rdev->dev, "  GRBM_STATUS2=0x%08X\n",
5102 		RREG32(GRBM_STATUS2));
5103 	dev_info(rdev->dev, "  GRBM_STATUS_SE0=0x%08X\n",
5104 		RREG32(GRBM_STATUS_SE0));
5105 	dev_info(rdev->dev, "  GRBM_STATUS_SE1=0x%08X\n",
5106 		RREG32(GRBM_STATUS_SE1));
5107 	dev_info(rdev->dev, "  GRBM_STATUS_SE2=0x%08X\n",
5108 		RREG32(GRBM_STATUS_SE2));
5109 	dev_info(rdev->dev, "  GRBM_STATUS_SE3=0x%08X\n",
5110 		RREG32(GRBM_STATUS_SE3));
5111 	dev_info(rdev->dev, "  SRBM_STATUS=0x%08X\n",
5112 		RREG32(SRBM_STATUS));
5113 	dev_info(rdev->dev, "  SRBM_STATUS2=0x%08X\n",
5114 		RREG32(SRBM_STATUS2));
5115 	dev_info(rdev->dev, "  SDMA0_STATUS_REG   = 0x%08X\n",
5116 		RREG32(SDMA0_STATUS_REG + SDMA0_REGISTER_OFFSET));
5117 	dev_info(rdev->dev, "  SDMA1_STATUS_REG   = 0x%08X\n",
5118 		 RREG32(SDMA0_STATUS_REG + SDMA1_REGISTER_OFFSET));
5119 	dev_info(rdev->dev, "  CP_STAT = 0x%08x\n", RREG32(CP_STAT));
5120 	dev_info(rdev->dev, "  CP_STALLED_STAT1 = 0x%08x\n",
5121 		 RREG32(CP_STALLED_STAT1));
5122 	dev_info(rdev->dev, "  CP_STALLED_STAT2 = 0x%08x\n",
5123 		 RREG32(CP_STALLED_STAT2));
5124 	dev_info(rdev->dev, "  CP_STALLED_STAT3 = 0x%08x\n",
5125 		 RREG32(CP_STALLED_STAT3));
5126 	dev_info(rdev->dev, "  CP_CPF_BUSY_STAT = 0x%08x\n",
5127 		 RREG32(CP_CPF_BUSY_STAT));
5128 	dev_info(rdev->dev, "  CP_CPF_STALLED_STAT1 = 0x%08x\n",
5129 		 RREG32(CP_CPF_STALLED_STAT1));
5130 	dev_info(rdev->dev, "  CP_CPF_STATUS = 0x%08x\n", RREG32(CP_CPF_STATUS));
5131 	dev_info(rdev->dev, "  CP_CPC_BUSY_STAT = 0x%08x\n", RREG32(CP_CPC_BUSY_STAT));
5132 	dev_info(rdev->dev, "  CP_CPC_STALLED_STAT1 = 0x%08x\n",
5133 		 RREG32(CP_CPC_STALLED_STAT1));
5134 	dev_info(rdev->dev, "  CP_CPC_STATUS = 0x%08x\n", RREG32(CP_CPC_STATUS));
5135 }
5136 
5137 /**
5138  * cik_gpu_check_soft_reset - check which blocks are busy
5139  *
5140  * @rdev: radeon_device pointer
5141  *
5142  * Check which blocks are busy and return the relevant reset
5143  * mask to be used by cik_gpu_soft_reset().
5144  * Returns a mask of the blocks to be reset.
5145  */
5146 u32 cik_gpu_check_soft_reset(struct radeon_device *rdev)
5147 {
5148 	u32 reset_mask = 0;
5149 	u32 tmp;
5150 
5151 	/* GRBM_STATUS */
5152 	tmp = RREG32(GRBM_STATUS);
5153 	if (tmp & (PA_BUSY | SC_BUSY |
5154 		   BCI_BUSY | SX_BUSY |
5155 		   TA_BUSY | VGT_BUSY |
5156 		   DB_BUSY | CB_BUSY |
5157 		   GDS_BUSY | SPI_BUSY |
5158 		   IA_BUSY | IA_BUSY_NO_DMA))
5159 		reset_mask |= RADEON_RESET_GFX;
5160 
5161 	if (tmp & (CP_BUSY | CP_COHERENCY_BUSY))
5162 		reset_mask |= RADEON_RESET_CP;
5163 
5164 	/* GRBM_STATUS2 */
5165 	tmp = RREG32(GRBM_STATUS2);
5166 	if (tmp & RLC_BUSY)
5167 		reset_mask |= RADEON_RESET_RLC;
5168 
5169 	/* SDMA0_STATUS_REG */
5170 	tmp = RREG32(SDMA0_STATUS_REG + SDMA0_REGISTER_OFFSET);
5171 	if (!(tmp & SDMA_IDLE))
5172 		reset_mask |= RADEON_RESET_DMA;
5173 
5174 	/* SDMA1_STATUS_REG */
5175 	tmp = RREG32(SDMA0_STATUS_REG + SDMA1_REGISTER_OFFSET);
5176 	if (!(tmp & SDMA_IDLE))
5177 		reset_mask |= RADEON_RESET_DMA1;
5178 
5179 	/* SRBM_STATUS2 */
5180 	tmp = RREG32(SRBM_STATUS2);
5181 	if (tmp & SDMA_BUSY)
5182 		reset_mask |= RADEON_RESET_DMA;
5183 
5184 	if (tmp & SDMA1_BUSY)
5185 		reset_mask |= RADEON_RESET_DMA1;
5186 
5187 	/* SRBM_STATUS */
5188 	tmp = RREG32(SRBM_STATUS);
5189 
5190 	if (tmp & IH_BUSY)
5191 		reset_mask |= RADEON_RESET_IH;
5192 
5193 	if (tmp & SEM_BUSY)
5194 		reset_mask |= RADEON_RESET_SEM;
5195 
5196 	if (tmp & GRBM_RQ_PENDING)
5197 		reset_mask |= RADEON_RESET_GRBM;
5198 
5199 	if (tmp & VMC_BUSY)
5200 		reset_mask |= RADEON_RESET_VMC;
5201 
5202 	if (tmp & (MCB_BUSY | MCB_NON_DISPLAY_BUSY |
5203 		   MCC_BUSY | MCD_BUSY))
5204 		reset_mask |= RADEON_RESET_MC;
5205 
5206 	if (evergreen_is_display_hung(rdev))
5207 		reset_mask |= RADEON_RESET_DISPLAY;
5208 
5209 	/* Skip MC reset as it's mostly likely not hung, just busy */
5210 	if (reset_mask & RADEON_RESET_MC) {
5211 		DRM_DEBUG("MC busy: 0x%08X, clearing.\n", reset_mask);
5212 		reset_mask &= ~RADEON_RESET_MC;
5213 	}
5214 
5215 	return reset_mask;
5216 }
5217 
5218 /**
5219  * cik_gpu_soft_reset - soft reset GPU
5220  *
5221  * @rdev: radeon_device pointer
5222  * @reset_mask: mask of which blocks to reset
5223  *
5224  * Soft reset the blocks specified in @reset_mask.
5225  */
5226 static void cik_gpu_soft_reset(struct radeon_device *rdev, u32 reset_mask)
5227 {
5228 	struct evergreen_mc_save save;
5229 	u32 grbm_soft_reset = 0, srbm_soft_reset = 0;
5230 	u32 tmp;
5231 
5232 	if (reset_mask == 0)
5233 		return;
5234 
5235 	dev_info(rdev->dev, "GPU softreset: 0x%08X\n", reset_mask);
5236 
5237 	cik_print_gpu_status_regs(rdev);
5238 	dev_info(rdev->dev, "  VM_CONTEXT1_PROTECTION_FAULT_ADDR   0x%08X\n",
5239 		 RREG32(VM_CONTEXT1_PROTECTION_FAULT_ADDR));
5240 	dev_info(rdev->dev, "  VM_CONTEXT1_PROTECTION_FAULT_STATUS 0x%08X\n",
5241 		 RREG32(VM_CONTEXT1_PROTECTION_FAULT_STATUS));
5242 
5243 	/* disable CG/PG */
5244 	cik_fini_pg(rdev);
5245 	cik_fini_cg(rdev);
5246 
5247 	/* stop the rlc */
5248 	cik_rlc_stop(rdev);
5249 
5250 	/* Disable GFX parsing/prefetching */
5251 	WREG32(CP_ME_CNTL, CP_ME_HALT | CP_PFP_HALT | CP_CE_HALT);
5252 
5253 	/* Disable MEC parsing/prefetching */
5254 	WREG32(CP_MEC_CNTL, MEC_ME1_HALT | MEC_ME2_HALT);
5255 
5256 	if (reset_mask & RADEON_RESET_DMA) {
5257 		/* sdma0 */
5258 		tmp = RREG32(SDMA0_ME_CNTL + SDMA0_REGISTER_OFFSET);
5259 		tmp |= SDMA_HALT;
5260 		WREG32(SDMA0_ME_CNTL + SDMA0_REGISTER_OFFSET, tmp);
5261 	}
5262 	if (reset_mask & RADEON_RESET_DMA1) {
5263 		/* sdma1 */
5264 		tmp = RREG32(SDMA0_ME_CNTL + SDMA1_REGISTER_OFFSET);
5265 		tmp |= SDMA_HALT;
5266 		WREG32(SDMA0_ME_CNTL + SDMA1_REGISTER_OFFSET, tmp);
5267 	}
5268 
5269 	evergreen_mc_stop(rdev, &save);
5270 	if (evergreen_mc_wait_for_idle(rdev)) {
5271 		dev_warn(rdev->dev, "Wait for MC idle timedout !\n");
5272 	}
5273 
5274 	if (reset_mask & (RADEON_RESET_GFX | RADEON_RESET_COMPUTE | RADEON_RESET_CP))
5275 		grbm_soft_reset = SOFT_RESET_CP | SOFT_RESET_GFX;
5276 
5277 	if (reset_mask & RADEON_RESET_CP) {
5278 		grbm_soft_reset |= SOFT_RESET_CP;
5279 
5280 		srbm_soft_reset |= SOFT_RESET_GRBM;
5281 	}
5282 
5283 	if (reset_mask & RADEON_RESET_DMA)
5284 		srbm_soft_reset |= SOFT_RESET_SDMA;
5285 
5286 	if (reset_mask & RADEON_RESET_DMA1)
5287 		srbm_soft_reset |= SOFT_RESET_SDMA1;
5288 
5289 	if (reset_mask & RADEON_RESET_DISPLAY)
5290 		srbm_soft_reset |= SOFT_RESET_DC;
5291 
5292 	if (reset_mask & RADEON_RESET_RLC)
5293 		grbm_soft_reset |= SOFT_RESET_RLC;
5294 
5295 	if (reset_mask & RADEON_RESET_SEM)
5296 		srbm_soft_reset |= SOFT_RESET_SEM;
5297 
5298 	if (reset_mask & RADEON_RESET_IH)
5299 		srbm_soft_reset |= SOFT_RESET_IH;
5300 
5301 	if (reset_mask & RADEON_RESET_GRBM)
5302 		srbm_soft_reset |= SOFT_RESET_GRBM;
5303 
5304 	if (reset_mask & RADEON_RESET_VMC)
5305 		srbm_soft_reset |= SOFT_RESET_VMC;
5306 
5307 	if (!(rdev->flags & RADEON_IS_IGP)) {
5308 		if (reset_mask & RADEON_RESET_MC)
5309 			srbm_soft_reset |= SOFT_RESET_MC;
5310 	}
5311 
5312 	if (grbm_soft_reset) {
5313 		tmp = RREG32(GRBM_SOFT_RESET);
5314 		tmp |= grbm_soft_reset;
5315 		dev_info(rdev->dev, "GRBM_SOFT_RESET=0x%08X\n", tmp);
5316 		WREG32(GRBM_SOFT_RESET, tmp);
5317 		tmp = RREG32(GRBM_SOFT_RESET);
5318 
5319 		udelay(50);
5320 
5321 		tmp &= ~grbm_soft_reset;
5322 		WREG32(GRBM_SOFT_RESET, tmp);
5323 		tmp = RREG32(GRBM_SOFT_RESET);
5324 	}
5325 
5326 	if (srbm_soft_reset) {
5327 		tmp = RREG32(SRBM_SOFT_RESET);
5328 		tmp |= srbm_soft_reset;
5329 		dev_info(rdev->dev, "SRBM_SOFT_RESET=0x%08X\n", tmp);
5330 		WREG32(SRBM_SOFT_RESET, tmp);
5331 		tmp = RREG32(SRBM_SOFT_RESET);
5332 
5333 		udelay(50);
5334 
5335 		tmp &= ~srbm_soft_reset;
5336 		WREG32(SRBM_SOFT_RESET, tmp);
5337 		tmp = RREG32(SRBM_SOFT_RESET);
5338 	}
5339 
5340 	/* Wait a little for things to settle down */
5341 	udelay(50);
5342 
5343 	evergreen_mc_resume(rdev, &save);
5344 	udelay(50);
5345 
5346 	cik_print_gpu_status_regs(rdev);
5347 }
5348 
5349 struct kv_reset_save_regs {
5350 	u32 gmcon_reng_execute;
5351 	u32 gmcon_misc;
5352 	u32 gmcon_misc3;
5353 };
5354 
5355 static void kv_save_regs_for_reset(struct radeon_device *rdev,
5356 				   struct kv_reset_save_regs *save)
5357 {
5358 	save->gmcon_reng_execute = RREG32(GMCON_RENG_EXECUTE);
5359 	save->gmcon_misc = RREG32(GMCON_MISC);
5360 	save->gmcon_misc3 = RREG32(GMCON_MISC3);
5361 
5362 	WREG32(GMCON_RENG_EXECUTE, save->gmcon_reng_execute & ~RENG_EXECUTE_ON_PWR_UP);
5363 	WREG32(GMCON_MISC, save->gmcon_misc & ~(RENG_EXECUTE_ON_REG_UPDATE |
5364 						STCTRL_STUTTER_EN));
5365 }
5366 
5367 static void kv_restore_regs_for_reset(struct radeon_device *rdev,
5368 				      struct kv_reset_save_regs *save)
5369 {
5370 	int i;
5371 
5372 	WREG32(GMCON_PGFSM_WRITE, 0);
5373 	WREG32(GMCON_PGFSM_CONFIG, 0x200010ff);
5374 
5375 	for (i = 0; i < 5; i++)
5376 		WREG32(GMCON_PGFSM_WRITE, 0);
5377 
5378 	WREG32(GMCON_PGFSM_WRITE, 0);
5379 	WREG32(GMCON_PGFSM_CONFIG, 0x300010ff);
5380 
5381 	for (i = 0; i < 5; i++)
5382 		WREG32(GMCON_PGFSM_WRITE, 0);
5383 
5384 	WREG32(GMCON_PGFSM_WRITE, 0x210000);
5385 	WREG32(GMCON_PGFSM_CONFIG, 0xa00010ff);
5386 
5387 	for (i = 0; i < 5; i++)
5388 		WREG32(GMCON_PGFSM_WRITE, 0);
5389 
5390 	WREG32(GMCON_PGFSM_WRITE, 0x21003);
5391 	WREG32(GMCON_PGFSM_CONFIG, 0xb00010ff);
5392 
5393 	for (i = 0; i < 5; i++)
5394 		WREG32(GMCON_PGFSM_WRITE, 0);
5395 
5396 	WREG32(GMCON_PGFSM_WRITE, 0x2b00);
5397 	WREG32(GMCON_PGFSM_CONFIG, 0xc00010ff);
5398 
5399 	for (i = 0; i < 5; i++)
5400 		WREG32(GMCON_PGFSM_WRITE, 0);
5401 
5402 	WREG32(GMCON_PGFSM_WRITE, 0);
5403 	WREG32(GMCON_PGFSM_CONFIG, 0xd00010ff);
5404 
5405 	for (i = 0; i < 5; i++)
5406 		WREG32(GMCON_PGFSM_WRITE, 0);
5407 
5408 	WREG32(GMCON_PGFSM_WRITE, 0x420000);
5409 	WREG32(GMCON_PGFSM_CONFIG, 0x100010ff);
5410 
5411 	for (i = 0; i < 5; i++)
5412 		WREG32(GMCON_PGFSM_WRITE, 0);
5413 
5414 	WREG32(GMCON_PGFSM_WRITE, 0x120202);
5415 	WREG32(GMCON_PGFSM_CONFIG, 0x500010ff);
5416 
5417 	for (i = 0; i < 5; i++)
5418 		WREG32(GMCON_PGFSM_WRITE, 0);
5419 
5420 	WREG32(GMCON_PGFSM_WRITE, 0x3e3e36);
5421 	WREG32(GMCON_PGFSM_CONFIG, 0x600010ff);
5422 
5423 	for (i = 0; i < 5; i++)
5424 		WREG32(GMCON_PGFSM_WRITE, 0);
5425 
5426 	WREG32(GMCON_PGFSM_WRITE, 0x373f3e);
5427 	WREG32(GMCON_PGFSM_CONFIG, 0x700010ff);
5428 
5429 	for (i = 0; i < 5; i++)
5430 		WREG32(GMCON_PGFSM_WRITE, 0);
5431 
5432 	WREG32(GMCON_PGFSM_WRITE, 0x3e1332);
5433 	WREG32(GMCON_PGFSM_CONFIG, 0xe00010ff);
5434 
5435 	WREG32(GMCON_MISC3, save->gmcon_misc3);
5436 	WREG32(GMCON_MISC, save->gmcon_misc);
5437 	WREG32(GMCON_RENG_EXECUTE, save->gmcon_reng_execute);
5438 }
5439 
5440 static void cik_gpu_pci_config_reset(struct radeon_device *rdev)
5441 {
5442 	struct evergreen_mc_save save;
5443 	struct kv_reset_save_regs kv_save = { 0 };
5444 	u32 tmp, i;
5445 
5446 	dev_info(rdev->dev, "GPU pci config reset\n");
5447 
5448 	/* disable dpm? */
5449 
5450 	/* disable cg/pg */
5451 	cik_fini_pg(rdev);
5452 	cik_fini_cg(rdev);
5453 
5454 	/* Disable GFX parsing/prefetching */
5455 	WREG32(CP_ME_CNTL, CP_ME_HALT | CP_PFP_HALT | CP_CE_HALT);
5456 
5457 	/* Disable MEC parsing/prefetching */
5458 	WREG32(CP_MEC_CNTL, MEC_ME1_HALT | MEC_ME2_HALT);
5459 
5460 	/* sdma0 */
5461 	tmp = RREG32(SDMA0_ME_CNTL + SDMA0_REGISTER_OFFSET);
5462 	tmp |= SDMA_HALT;
5463 	WREG32(SDMA0_ME_CNTL + SDMA0_REGISTER_OFFSET, tmp);
5464 	/* sdma1 */
5465 	tmp = RREG32(SDMA0_ME_CNTL + SDMA1_REGISTER_OFFSET);
5466 	tmp |= SDMA_HALT;
5467 	WREG32(SDMA0_ME_CNTL + SDMA1_REGISTER_OFFSET, tmp);
5468 	/* XXX other engines? */
5469 
5470 	/* halt the rlc, disable cp internal ints */
5471 	cik_rlc_stop(rdev);
5472 
5473 	udelay(50);
5474 
5475 	/* disable mem access */
5476 	evergreen_mc_stop(rdev, &save);
5477 	if (evergreen_mc_wait_for_idle(rdev)) {
5478 		dev_warn(rdev->dev, "Wait for MC idle timed out !\n");
5479 	}
5480 
5481 	if (rdev->flags & RADEON_IS_IGP)
5482 		kv_save_regs_for_reset(rdev, &kv_save);
5483 
5484 	/* disable BM */
5485 	pci_disable_busmaster(rdev->pdev->dev);
5486 	/* reset */
5487 	radeon_pci_config_reset(rdev);
5488 
5489 	udelay(100);
5490 
5491 	/* wait for asic to come out of reset */
5492 	for (i = 0; i < rdev->usec_timeout; i++) {
5493 		if (RREG32(CONFIG_MEMSIZE) != 0xffffffff)
5494 			break;
5495 		udelay(1);
5496 	}
5497 
5498 	/* does asic init need to be run first??? */
5499 	if (rdev->flags & RADEON_IS_IGP)
5500 		kv_restore_regs_for_reset(rdev, &kv_save);
5501 }
5502 
5503 /**
5504  * cik_asic_reset - soft reset GPU
5505  *
5506  * @rdev: radeon_device pointer
5507  *
5508  * Look up which blocks are hung and attempt
5509  * to reset them.
5510  * Returns 0 for success.
5511  */
5512 int cik_asic_reset(struct radeon_device *rdev)
5513 {
5514 	u32 reset_mask;
5515 
5516 	reset_mask = cik_gpu_check_soft_reset(rdev);
5517 
5518 	if (reset_mask)
5519 		r600_set_bios_scratch_engine_hung(rdev, true);
5520 
5521 	/* try soft reset */
5522 	cik_gpu_soft_reset(rdev, reset_mask);
5523 
5524 	reset_mask = cik_gpu_check_soft_reset(rdev);
5525 
5526 	/* try pci config reset */
5527 	if (reset_mask && radeon_hard_reset)
5528 		cik_gpu_pci_config_reset(rdev);
5529 
5530 	reset_mask = cik_gpu_check_soft_reset(rdev);
5531 
5532 	if (!reset_mask)
5533 		r600_set_bios_scratch_engine_hung(rdev, false);
5534 
5535 	return 0;
5536 }
5537 
5538 /**
5539  * cik_gfx_is_lockup - check if the 3D engine is locked up
5540  *
5541  * @rdev: radeon_device pointer
5542  * @ring: radeon_ring structure holding ring information
5543  *
5544  * Check if the 3D engine is locked up (CIK).
5545  * Returns true if the engine is locked, false if not.
5546  */
5547 bool cik_gfx_is_lockup(struct radeon_device *rdev, struct radeon_ring *ring)
5548 {
5549 	u32 reset_mask = cik_gpu_check_soft_reset(rdev);
5550 
5551 	if (!(reset_mask & (RADEON_RESET_GFX |
5552 			    RADEON_RESET_COMPUTE |
5553 			    RADEON_RESET_CP))) {
5554 		radeon_ring_lockup_update(rdev, ring);
5555 		return false;
5556 	}
5557 	return radeon_ring_test_lockup(rdev, ring);
5558 }
5559 
5560 /* MC */
5561 /**
5562  * cik_mc_program - program the GPU memory controller
5563  *
5564  * @rdev: radeon_device pointer
5565  *
5566  * Set the location of vram, gart, and AGP in the GPU's
5567  * physical address space (CIK).
5568  */
5569 static void cik_mc_program(struct radeon_device *rdev)
5570 {
5571 	struct evergreen_mc_save save;
5572 	u32 tmp;
5573 	int i, j;
5574 
5575 	/* Initialize HDP */
5576 	for (i = 0, j = 0; i < 32; i++, j += 0x18) {
5577 		WREG32((0x2c14 + j), 0x00000000);
5578 		WREG32((0x2c18 + j), 0x00000000);
5579 		WREG32((0x2c1c + j), 0x00000000);
5580 		WREG32((0x2c20 + j), 0x00000000);
5581 		WREG32((0x2c24 + j), 0x00000000);
5582 	}
5583 	WREG32(HDP_REG_COHERENCY_FLUSH_CNTL, 0);
5584 
5585 	evergreen_mc_stop(rdev, &save);
5586 	if (radeon_mc_wait_for_idle(rdev)) {
5587 		dev_warn(rdev->dev, "Wait for MC idle timedout !\n");
5588 	}
5589 	/* Lockout access through VGA aperture*/
5590 	WREG32(VGA_HDP_CONTROL, VGA_MEMORY_DISABLE);
5591 	/* Update configuration */
5592 	WREG32(MC_VM_SYSTEM_APERTURE_LOW_ADDR,
5593 	       rdev->mc.vram_start >> 12);
5594 	WREG32(MC_VM_SYSTEM_APERTURE_HIGH_ADDR,
5595 	       rdev->mc.vram_end >> 12);
5596 	WREG32(MC_VM_SYSTEM_APERTURE_DEFAULT_ADDR,
5597 	       rdev->vram_scratch.gpu_addr >> 12);
5598 	tmp = ((rdev->mc.vram_end >> 24) & 0xFFFF) << 16;
5599 	tmp |= ((rdev->mc.vram_start >> 24) & 0xFFFF);
5600 	WREG32(MC_VM_FB_LOCATION, tmp);
5601 	/* XXX double check these! */
5602 	WREG32(HDP_NONSURFACE_BASE, (rdev->mc.vram_start >> 8));
5603 	WREG32(HDP_NONSURFACE_INFO, (2 << 7) | (1 << 30));
5604 	WREG32(HDP_NONSURFACE_SIZE, 0x3FFFFFFF);
5605 	WREG32(MC_VM_AGP_BASE, 0);
5606 	WREG32(MC_VM_AGP_TOP, 0x0FFFFFFF);
5607 	WREG32(MC_VM_AGP_BOT, 0x0FFFFFFF);
5608 	if (radeon_mc_wait_for_idle(rdev)) {
5609 		dev_warn(rdev->dev, "Wait for MC idle timedout !\n");
5610 	}
5611 	evergreen_mc_resume(rdev, &save);
5612 	/* we need to own VRAM, so turn off the VGA renderer here
5613 	 * to stop it overwriting our objects */
5614 	rv515_vga_render_disable(rdev);
5615 }
5616 
5617 /**
5618  * cik_mc_init - initialize the memory controller driver params
5619  *
5620  * @rdev: radeon_device pointer
5621  *
5622  * Look up the amount of vram, vram width, and decide how to place
5623  * vram and gart within the GPU's physical address space (CIK).
5624  * Returns 0 for success.
5625  */
5626 static int cik_mc_init(struct radeon_device *rdev)
5627 {
5628 	u32 tmp;
5629 	int chansize, numchan;
5630 
5631 	/* Get VRAM informations */
5632 	rdev->mc.vram_is_ddr = true;
5633 	tmp = RREG32(MC_ARB_RAMCFG);
5634 	if (tmp & CHANSIZE_MASK) {
5635 		chansize = 64;
5636 	} else {
5637 		chansize = 32;
5638 	}
5639 	tmp = RREG32(MC_SHARED_CHMAP);
5640 	switch ((tmp & NOOFCHAN_MASK) >> NOOFCHAN_SHIFT) {
5641 	case 0:
5642 	default:
5643 		numchan = 1;
5644 		break;
5645 	case 1:
5646 		numchan = 2;
5647 		break;
5648 	case 2:
5649 		numchan = 4;
5650 		break;
5651 	case 3:
5652 		numchan = 8;
5653 		break;
5654 	case 4:
5655 		numchan = 3;
5656 		break;
5657 	case 5:
5658 		numchan = 6;
5659 		break;
5660 	case 6:
5661 		numchan = 10;
5662 		break;
5663 	case 7:
5664 		numchan = 12;
5665 		break;
5666 	case 8:
5667 		numchan = 16;
5668 		break;
5669 	}
5670 	rdev->mc.vram_width = numchan * chansize;
5671 	/* Could aper size report 0 ? */
5672 	rdev->mc.aper_base = pci_resource_start(rdev->pdev, 0);
5673 	rdev->mc.aper_size = pci_resource_len(rdev->pdev, 0);
5674 	/* size in MB on si */
5675 	rdev->mc.mc_vram_size = RREG32(CONFIG_MEMSIZE) * 1024ULL * 1024ULL;
5676 	rdev->mc.real_vram_size = RREG32(CONFIG_MEMSIZE) * 1024ULL * 1024ULL;
5677 	rdev->mc.visible_vram_size = rdev->mc.aper_size;
5678 	si_vram_gtt_location(rdev, &rdev->mc);
5679 	radeon_update_bandwidth_info(rdev);
5680 
5681 	return 0;
5682 }
5683 
5684 /*
5685  * GART
5686  * VMID 0 is the physical GPU addresses as used by the kernel.
5687  * VMIDs 1-15 are used for userspace clients and are handled
5688  * by the radeon vm/hsa code.
5689  */
5690 /**
5691  * cik_pcie_gart_tlb_flush - gart tlb flush callback
5692  *
5693  * @rdev: radeon_device pointer
5694  *
5695  * Flush the TLB for the VMID 0 page table (CIK).
5696  */
5697 void cik_pcie_gart_tlb_flush(struct radeon_device *rdev)
5698 {
5699 	/* flush hdp cache */
5700 	WREG32(HDP_MEM_COHERENCY_FLUSH_CNTL, 0);
5701 
5702 	/* bits 0-15 are the VM contexts0-15 */
5703 	WREG32(VM_INVALIDATE_REQUEST, 0x1);
5704 }
5705 
5706 /**
5707  * cik_pcie_gart_enable - gart enable
5708  *
5709  * @rdev: radeon_device pointer
5710  *
5711  * This sets up the TLBs, programs the page tables for VMID0,
5712  * sets up the hw for VMIDs 1-15 which are allocated on
5713  * demand, and sets up the global locations for the LDS, GDS,
5714  * and GPUVM for FSA64 clients (CIK).
5715  * Returns 0 for success, errors for failure.
5716  */
5717 static int cik_pcie_gart_enable(struct radeon_device *rdev)
5718 {
5719 	int r, i;
5720 
5721 	if (rdev->gart.robj == NULL) {
5722 		dev_err(rdev->dev, "No VRAM object for PCIE GART.\n");
5723 		return -EINVAL;
5724 	}
5725 	r = radeon_gart_table_vram_pin(rdev);
5726 	if (r)
5727 		return r;
5728 	/* Setup TLB control */
5729 	WREG32(MC_VM_MX_L1_TLB_CNTL,
5730 	       (0xA << 7) |
5731 	       ENABLE_L1_TLB |
5732 	       ENABLE_L1_FRAGMENT_PROCESSING |
5733 	       SYSTEM_ACCESS_MODE_NOT_IN_SYS |
5734 	       ENABLE_ADVANCED_DRIVER_MODEL |
5735 	       SYSTEM_APERTURE_UNMAPPED_ACCESS_PASS_THRU);
5736 	/* Setup L2 cache */
5737 	WREG32(VM_L2_CNTL, ENABLE_L2_CACHE |
5738 	       ENABLE_L2_FRAGMENT_PROCESSING |
5739 	       ENABLE_L2_PTE_CACHE_LRU_UPDATE_BY_WRITE |
5740 	       ENABLE_L2_PDE0_CACHE_LRU_UPDATE_BY_WRITE |
5741 	       EFFECTIVE_L2_QUEUE_SIZE(7) |
5742 	       CONTEXT1_IDENTITY_ACCESS_MODE(1));
5743 	WREG32(VM_L2_CNTL2, INVALIDATE_ALL_L1_TLBS | INVALIDATE_L2_CACHE);
5744 	WREG32(VM_L2_CNTL3, L2_CACHE_BIGK_ASSOCIATIVITY |
5745 	       BANK_SELECT(4) |
5746 	       L2_CACHE_BIGK_FRAGMENT_SIZE(4));
5747 	/* setup context0 */
5748 	WREG32(VM_CONTEXT0_PAGE_TABLE_START_ADDR, rdev->mc.gtt_start >> 12);
5749 	WREG32(VM_CONTEXT0_PAGE_TABLE_END_ADDR, rdev->mc.gtt_end >> 12);
5750 	WREG32(VM_CONTEXT0_PAGE_TABLE_BASE_ADDR, rdev->gart.table_addr >> 12);
5751 	WREG32(VM_CONTEXT0_PROTECTION_FAULT_DEFAULT_ADDR,
5752 			(u32)(rdev->dummy_page.addr >> 12));
5753 	WREG32(VM_CONTEXT0_CNTL2, 0);
5754 	WREG32(VM_CONTEXT0_CNTL, (ENABLE_CONTEXT | PAGE_TABLE_DEPTH(0) |
5755 				  RANGE_PROTECTION_FAULT_ENABLE_DEFAULT));
5756 
5757 	WREG32(0x15D4, 0);
5758 	WREG32(0x15D8, 0);
5759 	WREG32(0x15DC, 0);
5760 
5761 	/* restore context1-15 */
5762 	/* set vm size, must be a multiple of 4 */
5763 	WREG32(VM_CONTEXT1_PAGE_TABLE_START_ADDR, 0);
5764 	WREG32(VM_CONTEXT1_PAGE_TABLE_END_ADDR, rdev->vm_manager.max_pfn);
5765 	for (i = 1; i < 16; i++) {
5766 		if (i < 8)
5767 			WREG32(VM_CONTEXT0_PAGE_TABLE_BASE_ADDR + (i << 2),
5768 			       rdev->vm_manager.saved_table_addr[i]);
5769 		else
5770 			WREG32(VM_CONTEXT8_PAGE_TABLE_BASE_ADDR + ((i - 8) << 2),
5771 			       rdev->vm_manager.saved_table_addr[i]);
5772 	}
5773 
5774 	/* enable context1-15 */
5775 	WREG32(VM_CONTEXT1_PROTECTION_FAULT_DEFAULT_ADDR,
5776 	       (u32)(rdev->dummy_page.addr >> 12));
5777 	WREG32(VM_CONTEXT1_CNTL2, 4);
5778 	WREG32(VM_CONTEXT1_CNTL, ENABLE_CONTEXT | PAGE_TABLE_DEPTH(1) |
5779 				PAGE_TABLE_BLOCK_SIZE(radeon_vm_block_size - 9) |
5780 				RANGE_PROTECTION_FAULT_ENABLE_INTERRUPT |
5781 				RANGE_PROTECTION_FAULT_ENABLE_DEFAULT |
5782 				DUMMY_PAGE_PROTECTION_FAULT_ENABLE_INTERRUPT |
5783 				DUMMY_PAGE_PROTECTION_FAULT_ENABLE_DEFAULT |
5784 				PDE0_PROTECTION_FAULT_ENABLE_INTERRUPT |
5785 				PDE0_PROTECTION_FAULT_ENABLE_DEFAULT |
5786 				VALID_PROTECTION_FAULT_ENABLE_INTERRUPT |
5787 				VALID_PROTECTION_FAULT_ENABLE_DEFAULT |
5788 				READ_PROTECTION_FAULT_ENABLE_INTERRUPT |
5789 				READ_PROTECTION_FAULT_ENABLE_DEFAULT |
5790 				WRITE_PROTECTION_FAULT_ENABLE_INTERRUPT |
5791 				WRITE_PROTECTION_FAULT_ENABLE_DEFAULT);
5792 
5793 	if (rdev->family == CHIP_KAVERI) {
5794 		u32 tmp = RREG32(CHUB_CONTROL);
5795 		tmp &= ~BYPASS_VM;
5796 		WREG32(CHUB_CONTROL, tmp);
5797 	}
5798 
5799 	/* XXX SH_MEM regs */
5800 	/* where to put LDS, scratch, GPUVM in FSA64 space */
5801 	spin_lock(&rdev->srbm_mutex);
5802 	for (i = 0; i < 16; i++) {
5803 		cik_srbm_select(rdev, 0, 0, 0, i);
5804 		/* CP and shaders */
5805 		WREG32(SH_MEM_CONFIG, 0);
5806 		WREG32(SH_MEM_APE1_BASE, 1);
5807 		WREG32(SH_MEM_APE1_LIMIT, 0);
5808 		WREG32(SH_MEM_BASES, 0);
5809 		/* SDMA GFX */
5810 		WREG32(SDMA0_GFX_VIRTUAL_ADDR + SDMA0_REGISTER_OFFSET, 0);
5811 		WREG32(SDMA0_GFX_APE1_CNTL + SDMA0_REGISTER_OFFSET, 0);
5812 		WREG32(SDMA0_GFX_VIRTUAL_ADDR + SDMA1_REGISTER_OFFSET, 0);
5813 		WREG32(SDMA0_GFX_APE1_CNTL + SDMA1_REGISTER_OFFSET, 0);
5814 		/* XXX SDMA RLC - todo */
5815 	}
5816 	cik_srbm_select(rdev, 0, 0, 0, 0);
5817 	spin_unlock(&rdev->srbm_mutex);
5818 
5819 	cik_pcie_gart_tlb_flush(rdev);
5820 	DRM_INFO("PCIE GART of %uM enabled (table at 0x%016llX).\n",
5821 		 (unsigned)(rdev->mc.gtt_size >> 20),
5822 		 (unsigned long long)rdev->gart.table_addr);
5823 	rdev->gart.ready = true;
5824 	return 0;
5825 }
5826 
5827 /**
5828  * cik_pcie_gart_disable - gart disable
5829  *
5830  * @rdev: radeon_device pointer
5831  *
5832  * This disables all VM page table (CIK).
5833  */
5834 static void cik_pcie_gart_disable(struct radeon_device *rdev)
5835 {
5836 	unsigned i;
5837 
5838 	for (i = 1; i < 16; ++i) {
5839 		uint32_t reg;
5840 		if (i < 8)
5841 			reg = VM_CONTEXT0_PAGE_TABLE_BASE_ADDR + (i << 2);
5842 		else
5843 			reg = VM_CONTEXT8_PAGE_TABLE_BASE_ADDR + ((i - 8) << 2);
5844 		rdev->vm_manager.saved_table_addr[i] = RREG32(reg);
5845 	}
5846 
5847 	/* Disable all tables */
5848 	WREG32(VM_CONTEXT0_CNTL, 0);
5849 	WREG32(VM_CONTEXT1_CNTL, 0);
5850 	/* Setup TLB control */
5851 	WREG32(MC_VM_MX_L1_TLB_CNTL, SYSTEM_ACCESS_MODE_NOT_IN_SYS |
5852 	       SYSTEM_APERTURE_UNMAPPED_ACCESS_PASS_THRU);
5853 	/* Setup L2 cache */
5854 	WREG32(VM_L2_CNTL,
5855 	       ENABLE_L2_FRAGMENT_PROCESSING |
5856 	       ENABLE_L2_PTE_CACHE_LRU_UPDATE_BY_WRITE |
5857 	       ENABLE_L2_PDE0_CACHE_LRU_UPDATE_BY_WRITE |
5858 	       EFFECTIVE_L2_QUEUE_SIZE(7) |
5859 	       CONTEXT1_IDENTITY_ACCESS_MODE(1));
5860 	WREG32(VM_L2_CNTL2, 0);
5861 	WREG32(VM_L2_CNTL3, L2_CACHE_BIGK_ASSOCIATIVITY |
5862 	       L2_CACHE_BIGK_FRAGMENT_SIZE(6));
5863 	radeon_gart_table_vram_unpin(rdev);
5864 }
5865 
5866 /**
5867  * cik_pcie_gart_fini - vm fini callback
5868  *
5869  * @rdev: radeon_device pointer
5870  *
5871  * Tears down the driver GART/VM setup (CIK).
5872  */
5873 static void cik_pcie_gart_fini(struct radeon_device *rdev)
5874 {
5875 	cik_pcie_gart_disable(rdev);
5876 	radeon_gart_table_vram_free(rdev);
5877 	radeon_gart_fini(rdev);
5878 }
5879 
5880 /* vm parser */
5881 /**
5882  * cik_ib_parse - vm ib_parse callback
5883  *
5884  * @rdev: radeon_device pointer
5885  * @ib: indirect buffer pointer
5886  *
5887  * CIK uses hw IB checking so this is a nop (CIK).
5888  */
5889 int cik_ib_parse(struct radeon_device *rdev, struct radeon_ib *ib)
5890 {
5891 	return 0;
5892 }
5893 
5894 /*
5895  * vm
5896  * VMID 0 is the physical GPU addresses as used by the kernel.
5897  * VMIDs 1-15 are used for userspace clients and are handled
5898  * by the radeon vm/hsa code.
5899  */
5900 /**
5901  * cik_vm_init - cik vm init callback
5902  *
5903  * @rdev: radeon_device pointer
5904  *
5905  * Inits cik specific vm parameters (number of VMs, base of vram for
5906  * VMIDs 1-15) (CIK).
5907  * Returns 0 for success.
5908  */
5909 int cik_vm_init(struct radeon_device *rdev)
5910 {
5911 	/* number of VMs */
5912 	rdev->vm_manager.nvm = 16;
5913 	/* base offset of vram pages */
5914 	if (rdev->flags & RADEON_IS_IGP) {
5915 		u64 tmp = RREG32(MC_VM_FB_OFFSET);
5916 		tmp <<= 22;
5917 		rdev->vm_manager.vram_base_offset = tmp;
5918 	} else
5919 		rdev->vm_manager.vram_base_offset = 0;
5920 
5921 	return 0;
5922 }
5923 
5924 /**
5925  * cik_vm_fini - cik vm fini callback
5926  *
5927  * @rdev: radeon_device pointer
5928  *
5929  * Tear down any asic specific VM setup (CIK).
5930  */
5931 void cik_vm_fini(struct radeon_device *rdev)
5932 {
5933 }
5934 
5935 /**
5936  * cik_vm_decode_fault - print human readable fault info
5937  *
5938  * @rdev: radeon_device pointer
5939  * @status: VM_CONTEXT1_PROTECTION_FAULT_STATUS register value
5940  * @addr: VM_CONTEXT1_PROTECTION_FAULT_ADDR register value
5941  *
5942  * Print human readable fault information (CIK).
5943  */
5944 static void cik_vm_decode_fault(struct radeon_device *rdev,
5945 				u32 status, u32 addr, u32 mc_client)
5946 {
5947 	u32 mc_id;
5948 	u32 vmid = (status & FAULT_VMID_MASK) >> FAULT_VMID_SHIFT;
5949 	u32 protections = (status & PROTECTIONS_MASK) >> PROTECTIONS_SHIFT;
5950 	char block[5] = { mc_client >> 24, (mc_client >> 16) & 0xff,
5951 		(mc_client >> 8) & 0xff, mc_client & 0xff, 0 };
5952 
5953 	if (rdev->family == CHIP_HAWAII)
5954 		mc_id = (status & HAWAII_MEMORY_CLIENT_ID_MASK) >> MEMORY_CLIENT_ID_SHIFT;
5955 	else
5956 		mc_id = (status & MEMORY_CLIENT_ID_MASK) >> MEMORY_CLIENT_ID_SHIFT;
5957 
5958 	printk("VM fault (0x%02x, vmid %d) at page %u, %s from '%s' (0x%08x) (%d)\n",
5959 	       protections, vmid, addr,
5960 	       (status & MEMORY_CLIENT_RW_MASK) ? "write" : "read",
5961 	       block, mc_client, mc_id);
5962 }
5963 
5964 /**
5965  * cik_vm_flush - cik vm flush using the CP
5966  *
5967  * @rdev: radeon_device pointer
5968  *
5969  * Update the page table base and flush the VM TLB
5970  * using the CP (CIK).
5971  */
5972 void cik_vm_flush(struct radeon_device *rdev, int ridx, struct radeon_vm *vm)
5973 {
5974 	struct radeon_ring *ring = &rdev->ring[ridx];
5975 	int usepfp = (ridx == RADEON_RING_TYPE_GFX_INDEX);
5976 
5977 	if (vm == NULL)
5978 		return;
5979 
5980 	radeon_ring_write(ring, PACKET3(PACKET3_WRITE_DATA, 3));
5981 	radeon_ring_write(ring, (WRITE_DATA_ENGINE_SEL(usepfp) |
5982 				 WRITE_DATA_DST_SEL(0)));
5983 	if (vm->id < 8) {
5984 		radeon_ring_write(ring,
5985 				  (VM_CONTEXT0_PAGE_TABLE_BASE_ADDR + (vm->id << 2)) >> 2);
5986 	} else {
5987 		radeon_ring_write(ring,
5988 				  (VM_CONTEXT8_PAGE_TABLE_BASE_ADDR + ((vm->id - 8) << 2)) >> 2);
5989 	}
5990 	radeon_ring_write(ring, 0);
5991 	radeon_ring_write(ring, vm->pd_gpu_addr >> 12);
5992 
5993 	/* update SH_MEM_* regs */
5994 	radeon_ring_write(ring, PACKET3(PACKET3_WRITE_DATA, 3));
5995 	radeon_ring_write(ring, (WRITE_DATA_ENGINE_SEL(usepfp) |
5996 				 WRITE_DATA_DST_SEL(0)));
5997 	radeon_ring_write(ring, SRBM_GFX_CNTL >> 2);
5998 	radeon_ring_write(ring, 0);
5999 	radeon_ring_write(ring, VMID(vm->id));
6000 
6001 	radeon_ring_write(ring, PACKET3(PACKET3_WRITE_DATA, 6));
6002 	radeon_ring_write(ring, (WRITE_DATA_ENGINE_SEL(usepfp) |
6003 				 WRITE_DATA_DST_SEL(0)));
6004 	radeon_ring_write(ring, SH_MEM_BASES >> 2);
6005 	radeon_ring_write(ring, 0);
6006 
6007 	radeon_ring_write(ring, 0); /* SH_MEM_BASES */
6008 	radeon_ring_write(ring, 0); /* SH_MEM_CONFIG */
6009 	radeon_ring_write(ring, 1); /* SH_MEM_APE1_BASE */
6010 	radeon_ring_write(ring, 0); /* SH_MEM_APE1_LIMIT */
6011 
6012 	radeon_ring_write(ring, PACKET3(PACKET3_WRITE_DATA, 3));
6013 	radeon_ring_write(ring, (WRITE_DATA_ENGINE_SEL(usepfp) |
6014 				 WRITE_DATA_DST_SEL(0)));
6015 	radeon_ring_write(ring, SRBM_GFX_CNTL >> 2);
6016 	radeon_ring_write(ring, 0);
6017 	radeon_ring_write(ring, VMID(0));
6018 
6019 	/* HDP flush */
6020 	cik_hdp_flush_cp_ring_emit(rdev, ridx);
6021 
6022 	/* bits 0-15 are the VM contexts0-15 */
6023 	radeon_ring_write(ring, PACKET3(PACKET3_WRITE_DATA, 3));
6024 	radeon_ring_write(ring, (WRITE_DATA_ENGINE_SEL(usepfp) |
6025 				 WRITE_DATA_DST_SEL(0)));
6026 	radeon_ring_write(ring, VM_INVALIDATE_REQUEST >> 2);
6027 	radeon_ring_write(ring, 0);
6028 	radeon_ring_write(ring, 1 << vm->id);
6029 
6030 	/* compute doesn't have PFP */
6031 	if (usepfp) {
6032 		/* sync PFP to ME, otherwise we might get invalid PFP reads */
6033 		radeon_ring_write(ring, PACKET3(PACKET3_PFP_SYNC_ME, 0));
6034 		radeon_ring_write(ring, 0x0);
6035 	}
6036 }
6037 
6038 /*
6039  * RLC
6040  * The RLC is a multi-purpose microengine that handles a
6041  * variety of functions, the most important of which is
6042  * the interrupt controller.
6043  */
6044 static void cik_enable_gui_idle_interrupt(struct radeon_device *rdev,
6045 					  bool enable)
6046 {
6047 	u32 tmp = RREG32(CP_INT_CNTL_RING0);
6048 
6049 	if (enable)
6050 		tmp |= (CNTX_BUSY_INT_ENABLE | CNTX_EMPTY_INT_ENABLE);
6051 	else
6052 		tmp &= ~(CNTX_BUSY_INT_ENABLE | CNTX_EMPTY_INT_ENABLE);
6053 	WREG32(CP_INT_CNTL_RING0, tmp);
6054 }
6055 
6056 static void cik_enable_lbpw(struct radeon_device *rdev, bool enable)
6057 {
6058 	u32 tmp;
6059 
6060 	tmp = RREG32(RLC_LB_CNTL);
6061 	if (enable)
6062 		tmp |= LOAD_BALANCE_ENABLE;
6063 	else
6064 		tmp &= ~LOAD_BALANCE_ENABLE;
6065 	WREG32(RLC_LB_CNTL, tmp);
6066 }
6067 
6068 static void cik_wait_for_rlc_serdes(struct radeon_device *rdev)
6069 {
6070 	u32 i, j, k;
6071 	u32 mask;
6072 
6073 	for (i = 0; i < rdev->config.cik.max_shader_engines; i++) {
6074 		for (j = 0; j < rdev->config.cik.max_sh_per_se; j++) {
6075 			cik_select_se_sh(rdev, i, j);
6076 			for (k = 0; k < rdev->usec_timeout; k++) {
6077 				if (RREG32(RLC_SERDES_CU_MASTER_BUSY) == 0)
6078 					break;
6079 				udelay(1);
6080 			}
6081 		}
6082 	}
6083 	cik_select_se_sh(rdev, 0xffffffff, 0xffffffff);
6084 
6085 	mask = SE_MASTER_BUSY_MASK | GC_MASTER_BUSY | TC0_MASTER_BUSY | TC1_MASTER_BUSY;
6086 	for (k = 0; k < rdev->usec_timeout; k++) {
6087 		if ((RREG32(RLC_SERDES_NONCU_MASTER_BUSY) & mask) == 0)
6088 			break;
6089 		udelay(1);
6090 	}
6091 }
6092 
6093 static void cik_update_rlc(struct radeon_device *rdev, u32 rlc)
6094 {
6095 	u32 tmp;
6096 
6097 	tmp = RREG32(RLC_CNTL);
6098 	if (tmp != rlc)
6099 		WREG32(RLC_CNTL, rlc);
6100 }
6101 
6102 static u32 cik_halt_rlc(struct radeon_device *rdev)
6103 {
6104 	u32 data, orig;
6105 
6106 	orig = data = RREG32(RLC_CNTL);
6107 
6108 	if (data & RLC_ENABLE) {
6109 		u32 i;
6110 
6111 		data &= ~RLC_ENABLE;
6112 		WREG32(RLC_CNTL, data);
6113 
6114 		for (i = 0; i < rdev->usec_timeout; i++) {
6115 			if ((RREG32(RLC_GPM_STAT) & RLC_GPM_BUSY) == 0)
6116 				break;
6117 			udelay(1);
6118 		}
6119 
6120 		cik_wait_for_rlc_serdes(rdev);
6121 	}
6122 
6123 	return orig;
6124 }
6125 
6126 void cik_enter_rlc_safe_mode(struct radeon_device *rdev)
6127 {
6128 	u32 tmp, i, mask;
6129 
6130 	tmp = REQ | MESSAGE(MSG_ENTER_RLC_SAFE_MODE);
6131 	WREG32(RLC_GPR_REG2, tmp);
6132 
6133 	mask = GFX_POWER_STATUS | GFX_CLOCK_STATUS;
6134 	for (i = 0; i < rdev->usec_timeout; i++) {
6135 		if ((RREG32(RLC_GPM_STAT) & mask) == mask)
6136 			break;
6137 		udelay(1);
6138 	}
6139 
6140 	for (i = 0; i < rdev->usec_timeout; i++) {
6141 		if ((RREG32(RLC_GPR_REG2) & REQ) == 0)
6142 			break;
6143 		udelay(1);
6144 	}
6145 }
6146 
6147 void cik_exit_rlc_safe_mode(struct radeon_device *rdev)
6148 {
6149 	u32 tmp;
6150 
6151 	tmp = REQ | MESSAGE(MSG_EXIT_RLC_SAFE_MODE);
6152 	WREG32(RLC_GPR_REG2, tmp);
6153 }
6154 
6155 /**
6156  * cik_rlc_stop - stop the RLC ME
6157  *
6158  * @rdev: radeon_device pointer
6159  *
6160  * Halt the RLC ME (MicroEngine) (CIK).
6161  */
6162 static void cik_rlc_stop(struct radeon_device *rdev)
6163 {
6164 	WREG32(RLC_CNTL, 0);
6165 
6166 	cik_enable_gui_idle_interrupt(rdev, false);
6167 
6168 	cik_wait_for_rlc_serdes(rdev);
6169 }
6170 
6171 /**
6172  * cik_rlc_start - start the RLC ME
6173  *
6174  * @rdev: radeon_device pointer
6175  *
6176  * Unhalt the RLC ME (MicroEngine) (CIK).
6177  */
6178 static void cik_rlc_start(struct radeon_device *rdev)
6179 {
6180 	WREG32(RLC_CNTL, RLC_ENABLE);
6181 
6182 	cik_enable_gui_idle_interrupt(rdev, true);
6183 
6184 	udelay(50);
6185 }
6186 
6187 /**
6188  * cik_rlc_resume - setup the RLC hw
6189  *
6190  * @rdev: radeon_device pointer
6191  *
6192  * Initialize the RLC registers, load the ucode,
6193  * and start the RLC (CIK).
6194  * Returns 0 for success, -EINVAL if the ucode is not available.
6195  */
6196 static int cik_rlc_resume(struct radeon_device *rdev)
6197 {
6198 	u32 i, size, tmp;
6199 
6200 	if (!rdev->rlc_fw)
6201 		return -EINVAL;
6202 
6203 	cik_rlc_stop(rdev);
6204 
6205 	/* disable CG */
6206 	tmp = RREG32(RLC_CGCG_CGLS_CTRL) & 0xfffffffc;
6207 	WREG32(RLC_CGCG_CGLS_CTRL, tmp);
6208 
6209 	si_rlc_reset(rdev);
6210 
6211 	cik_init_pg(rdev);
6212 
6213 	cik_init_cg(rdev);
6214 
6215 	WREG32(RLC_LB_CNTR_INIT, 0);
6216 	WREG32(RLC_LB_CNTR_MAX, 0x00008000);
6217 
6218 	cik_select_se_sh(rdev, 0xffffffff, 0xffffffff);
6219 	WREG32(RLC_LB_INIT_CU_MASK, 0xffffffff);
6220 	WREG32(RLC_LB_PARAMS, 0x00600408);
6221 	WREG32(RLC_LB_CNTL, 0x80000004);
6222 
6223 	WREG32(RLC_MC_CNTL, 0);
6224 	WREG32(RLC_UCODE_CNTL, 0);
6225 
6226 	if (rdev->new_fw) {
6227 		const struct rlc_firmware_header_v1_0 *hdr =
6228 			(const struct rlc_firmware_header_v1_0 *)rdev->rlc_fw->data;
6229 		const __le32 *fw_data = (const __le32 *)
6230 			((const char *)rdev->rlc_fw->data + le32_to_cpu(hdr->header.ucode_array_offset_bytes));
6231 
6232 		radeon_ucode_print_rlc_hdr(&hdr->header);
6233 
6234 		size = le32_to_cpu(hdr->header.ucode_size_bytes) / 4;
6235 		WREG32(RLC_GPM_UCODE_ADDR, 0);
6236 		for (i = 0; i < size; i++)
6237 			WREG32(RLC_GPM_UCODE_DATA, le32_to_cpup(fw_data++));
6238 		WREG32(RLC_GPM_UCODE_ADDR, le32_to_cpu(hdr->header.ucode_version));
6239 	} else {
6240 		const __be32 *fw_data;
6241 
6242 		switch (rdev->family) {
6243 		case CHIP_BONAIRE:
6244 		case CHIP_HAWAII:
6245 		default:
6246 			size = BONAIRE_RLC_UCODE_SIZE;
6247 			break;
6248 		case CHIP_KAVERI:
6249 			size = KV_RLC_UCODE_SIZE;
6250 			break;
6251 		case CHIP_KABINI:
6252 			size = KB_RLC_UCODE_SIZE;
6253 			break;
6254 		case CHIP_MULLINS:
6255 			size = ML_RLC_UCODE_SIZE;
6256 			break;
6257 		}
6258 
6259 		fw_data = (const __be32 *)rdev->rlc_fw->data;
6260 		WREG32(RLC_GPM_UCODE_ADDR, 0);
6261 		for (i = 0; i < size; i++)
6262 			WREG32(RLC_GPM_UCODE_DATA, be32_to_cpup(fw_data++));
6263 		WREG32(RLC_GPM_UCODE_ADDR, 0);
6264 	}
6265 
6266 	/* XXX - find out what chips support lbpw */
6267 	cik_enable_lbpw(rdev, false);
6268 
6269 	if (rdev->family == CHIP_BONAIRE)
6270 		WREG32(RLC_DRIVER_DMA_STATUS, 0);
6271 
6272 	cik_rlc_start(rdev);
6273 
6274 	return 0;
6275 }
6276 
6277 static void cik_enable_cgcg(struct radeon_device *rdev, bool enable)
6278 {
6279 	u32 data, orig, tmp, tmp2;
6280 
6281 	orig = data = RREG32(RLC_CGCG_CGLS_CTRL);
6282 
6283 	if (enable && (rdev->cg_flags & RADEON_CG_SUPPORT_GFX_CGCG)) {
6284 		cik_enable_gui_idle_interrupt(rdev, true);
6285 
6286 		tmp = cik_halt_rlc(rdev);
6287 
6288 		cik_select_se_sh(rdev, 0xffffffff, 0xffffffff);
6289 		WREG32(RLC_SERDES_WR_CU_MASTER_MASK, 0xffffffff);
6290 		WREG32(RLC_SERDES_WR_NONCU_MASTER_MASK, 0xffffffff);
6291 		tmp2 = BPM_ADDR_MASK | CGCG_OVERRIDE_0 | CGLS_ENABLE;
6292 		WREG32(RLC_SERDES_WR_CTRL, tmp2);
6293 
6294 		cik_update_rlc(rdev, tmp);
6295 
6296 		data |= CGCG_EN | CGLS_EN;
6297 	} else {
6298 		cik_enable_gui_idle_interrupt(rdev, false);
6299 
6300 		RREG32(CB_CGTT_SCLK_CTRL);
6301 		RREG32(CB_CGTT_SCLK_CTRL);
6302 		RREG32(CB_CGTT_SCLK_CTRL);
6303 		RREG32(CB_CGTT_SCLK_CTRL);
6304 
6305 		data &= ~(CGCG_EN | CGLS_EN);
6306 	}
6307 
6308 	if (orig != data)
6309 		WREG32(RLC_CGCG_CGLS_CTRL, data);
6310 
6311 }
6312 
6313 static void cik_enable_mgcg(struct radeon_device *rdev, bool enable)
6314 {
6315 	u32 data, orig, tmp = 0;
6316 
6317 	if (enable && (rdev->cg_flags & RADEON_CG_SUPPORT_GFX_MGCG)) {
6318 		if (rdev->cg_flags & RADEON_CG_SUPPORT_GFX_MGLS) {
6319 			if (rdev->cg_flags & RADEON_CG_SUPPORT_GFX_CP_LS) {
6320 				orig = data = RREG32(CP_MEM_SLP_CNTL);
6321 				data |= CP_MEM_LS_EN;
6322 				if (orig != data)
6323 					WREG32(CP_MEM_SLP_CNTL, data);
6324 			}
6325 		}
6326 
6327 		orig = data = RREG32(RLC_CGTT_MGCG_OVERRIDE);
6328 		data &= 0xfffffffd;
6329 		if (orig != data)
6330 			WREG32(RLC_CGTT_MGCG_OVERRIDE, data);
6331 
6332 		tmp = cik_halt_rlc(rdev);
6333 
6334 		cik_select_se_sh(rdev, 0xffffffff, 0xffffffff);
6335 		WREG32(RLC_SERDES_WR_CU_MASTER_MASK, 0xffffffff);
6336 		WREG32(RLC_SERDES_WR_NONCU_MASTER_MASK, 0xffffffff);
6337 		data = BPM_ADDR_MASK | MGCG_OVERRIDE_0;
6338 		WREG32(RLC_SERDES_WR_CTRL, data);
6339 
6340 		cik_update_rlc(rdev, tmp);
6341 
6342 		if (rdev->cg_flags & RADEON_CG_SUPPORT_GFX_CGTS) {
6343 			orig = data = RREG32(CGTS_SM_CTRL_REG);
6344 			data &= ~SM_MODE_MASK;
6345 			data |= SM_MODE(0x2);
6346 			data |= SM_MODE_ENABLE;
6347 			data &= ~CGTS_OVERRIDE;
6348 			if ((rdev->cg_flags & RADEON_CG_SUPPORT_GFX_MGLS) &&
6349 			    (rdev->cg_flags & RADEON_CG_SUPPORT_GFX_CGTS_LS))
6350 				data &= ~CGTS_LS_OVERRIDE;
6351 			data &= ~ON_MONITOR_ADD_MASK;
6352 			data |= ON_MONITOR_ADD_EN;
6353 			data |= ON_MONITOR_ADD(0x96);
6354 			if (orig != data)
6355 				WREG32(CGTS_SM_CTRL_REG, data);
6356 		}
6357 	} else {
6358 		orig = data = RREG32(RLC_CGTT_MGCG_OVERRIDE);
6359 		data |= 0x00000002;
6360 		if (orig != data)
6361 			WREG32(RLC_CGTT_MGCG_OVERRIDE, data);
6362 
6363 		data = RREG32(RLC_MEM_SLP_CNTL);
6364 		if (data & RLC_MEM_LS_EN) {
6365 			data &= ~RLC_MEM_LS_EN;
6366 			WREG32(RLC_MEM_SLP_CNTL, data);
6367 		}
6368 
6369 		data = RREG32(CP_MEM_SLP_CNTL);
6370 		if (data & CP_MEM_LS_EN) {
6371 			data &= ~CP_MEM_LS_EN;
6372 			WREG32(CP_MEM_SLP_CNTL, data);
6373 		}
6374 
6375 		orig = data = RREG32(CGTS_SM_CTRL_REG);
6376 		data |= CGTS_OVERRIDE | CGTS_LS_OVERRIDE;
6377 		if (orig != data)
6378 			WREG32(CGTS_SM_CTRL_REG, data);
6379 
6380 		tmp = cik_halt_rlc(rdev);
6381 
6382 		cik_select_se_sh(rdev, 0xffffffff, 0xffffffff);
6383 		WREG32(RLC_SERDES_WR_CU_MASTER_MASK, 0xffffffff);
6384 		WREG32(RLC_SERDES_WR_NONCU_MASTER_MASK, 0xffffffff);
6385 		data = BPM_ADDR_MASK | MGCG_OVERRIDE_1;
6386 		WREG32(RLC_SERDES_WR_CTRL, data);
6387 
6388 		cik_update_rlc(rdev, tmp);
6389 	}
6390 }
6391 
6392 static const u32 mc_cg_registers[] =
6393 {
6394 	MC_HUB_MISC_HUB_CG,
6395 	MC_HUB_MISC_SIP_CG,
6396 	MC_HUB_MISC_VM_CG,
6397 	MC_XPB_CLK_GAT,
6398 	ATC_MISC_CG,
6399 	MC_CITF_MISC_WR_CG,
6400 	MC_CITF_MISC_RD_CG,
6401 	MC_CITF_MISC_VM_CG,
6402 	VM_L2_CG,
6403 };
6404 
6405 static void cik_enable_mc_ls(struct radeon_device *rdev,
6406 			     bool enable)
6407 {
6408 	int i;
6409 	u32 orig, data;
6410 
6411 	for (i = 0; i < ARRAY_SIZE(mc_cg_registers); i++) {
6412 		orig = data = RREG32(mc_cg_registers[i]);
6413 		if (enable && (rdev->cg_flags & RADEON_CG_SUPPORT_MC_LS))
6414 			data |= MC_LS_ENABLE;
6415 		else
6416 			data &= ~MC_LS_ENABLE;
6417 		if (data != orig)
6418 			WREG32(mc_cg_registers[i], data);
6419 	}
6420 }
6421 
6422 static void cik_enable_mc_mgcg(struct radeon_device *rdev,
6423 			       bool enable)
6424 {
6425 	int i;
6426 	u32 orig, data;
6427 
6428 	for (i = 0; i < ARRAY_SIZE(mc_cg_registers); i++) {
6429 		orig = data = RREG32(mc_cg_registers[i]);
6430 		if (enable && (rdev->cg_flags & RADEON_CG_SUPPORT_MC_MGCG))
6431 			data |= MC_CG_ENABLE;
6432 		else
6433 			data &= ~MC_CG_ENABLE;
6434 		if (data != orig)
6435 			WREG32(mc_cg_registers[i], data);
6436 	}
6437 }
6438 
6439 static void cik_enable_sdma_mgcg(struct radeon_device *rdev,
6440 				 bool enable)
6441 {
6442 	u32 orig, data;
6443 
6444 	if (enable && (rdev->cg_flags & RADEON_CG_SUPPORT_SDMA_MGCG)) {
6445 		WREG32(SDMA0_CLK_CTRL + SDMA0_REGISTER_OFFSET, 0x00000100);
6446 		WREG32(SDMA0_CLK_CTRL + SDMA1_REGISTER_OFFSET, 0x00000100);
6447 	} else {
6448 		orig = data = RREG32(SDMA0_CLK_CTRL + SDMA0_REGISTER_OFFSET);
6449 		data |= 0xff000000;
6450 		if (data != orig)
6451 			WREG32(SDMA0_CLK_CTRL + SDMA0_REGISTER_OFFSET, data);
6452 
6453 		orig = data = RREG32(SDMA0_CLK_CTRL + SDMA1_REGISTER_OFFSET);
6454 		data |= 0xff000000;
6455 		if (data != orig)
6456 			WREG32(SDMA0_CLK_CTRL + SDMA1_REGISTER_OFFSET, data);
6457 	}
6458 }
6459 
6460 static void cik_enable_sdma_mgls(struct radeon_device *rdev,
6461 				 bool enable)
6462 {
6463 	u32 orig, data;
6464 
6465 	if (enable && (rdev->cg_flags & RADEON_CG_SUPPORT_SDMA_LS)) {
6466 		orig = data = RREG32(SDMA0_POWER_CNTL + SDMA0_REGISTER_OFFSET);
6467 		data |= 0x100;
6468 		if (orig != data)
6469 			WREG32(SDMA0_POWER_CNTL + SDMA0_REGISTER_OFFSET, data);
6470 
6471 		orig = data = RREG32(SDMA0_POWER_CNTL + SDMA1_REGISTER_OFFSET);
6472 		data |= 0x100;
6473 		if (orig != data)
6474 			WREG32(SDMA0_POWER_CNTL + SDMA1_REGISTER_OFFSET, data);
6475 	} else {
6476 		orig = data = RREG32(SDMA0_POWER_CNTL + SDMA0_REGISTER_OFFSET);
6477 		data &= ~0x100;
6478 		if (orig != data)
6479 			WREG32(SDMA0_POWER_CNTL + SDMA0_REGISTER_OFFSET, data);
6480 
6481 		orig = data = RREG32(SDMA0_POWER_CNTL + SDMA1_REGISTER_OFFSET);
6482 		data &= ~0x100;
6483 		if (orig != data)
6484 			WREG32(SDMA0_POWER_CNTL + SDMA1_REGISTER_OFFSET, data);
6485 	}
6486 }
6487 
6488 static void cik_enable_uvd_mgcg(struct radeon_device *rdev,
6489 				bool enable)
6490 {
6491 	u32 orig, data;
6492 
6493 	if (enable && (rdev->cg_flags & RADEON_CG_SUPPORT_UVD_MGCG)) {
6494 		data = RREG32_UVD_CTX(UVD_CGC_MEM_CTRL);
6495 		data = 0xfff;
6496 		WREG32_UVD_CTX(UVD_CGC_MEM_CTRL, data);
6497 
6498 		orig = data = RREG32(UVD_CGC_CTRL);
6499 		data |= DCM;
6500 		if (orig != data)
6501 			WREG32(UVD_CGC_CTRL, data);
6502 	} else {
6503 		data = RREG32_UVD_CTX(UVD_CGC_MEM_CTRL);
6504 		data &= ~0xfff;
6505 		WREG32_UVD_CTX(UVD_CGC_MEM_CTRL, data);
6506 
6507 		orig = data = RREG32(UVD_CGC_CTRL);
6508 		data &= ~DCM;
6509 		if (orig != data)
6510 			WREG32(UVD_CGC_CTRL, data);
6511 	}
6512 }
6513 
6514 static void cik_enable_bif_mgls(struct radeon_device *rdev,
6515 			       bool enable)
6516 {
6517 	u32 orig, data;
6518 
6519 	orig = data = RREG32_PCIE_PORT(PCIE_CNTL2);
6520 
6521 	if (enable && (rdev->cg_flags & RADEON_CG_SUPPORT_BIF_LS))
6522 		data |= SLV_MEM_LS_EN | MST_MEM_LS_EN |
6523 			REPLAY_MEM_LS_EN | SLV_MEM_AGGRESSIVE_LS_EN;
6524 	else
6525 		data &= ~(SLV_MEM_LS_EN | MST_MEM_LS_EN |
6526 			  REPLAY_MEM_LS_EN | SLV_MEM_AGGRESSIVE_LS_EN);
6527 
6528 	if (orig != data)
6529 		WREG32_PCIE_PORT(PCIE_CNTL2, data);
6530 }
6531 
6532 static void cik_enable_hdp_mgcg(struct radeon_device *rdev,
6533 				bool enable)
6534 {
6535 	u32 orig, data;
6536 
6537 	orig = data = RREG32(HDP_HOST_PATH_CNTL);
6538 
6539 	if (enable && (rdev->cg_flags & RADEON_CG_SUPPORT_HDP_MGCG))
6540 		data &= ~CLOCK_GATING_DIS;
6541 	else
6542 		data |= CLOCK_GATING_DIS;
6543 
6544 	if (orig != data)
6545 		WREG32(HDP_HOST_PATH_CNTL, data);
6546 }
6547 
6548 static void cik_enable_hdp_ls(struct radeon_device *rdev,
6549 			      bool enable)
6550 {
6551 	u32 orig, data;
6552 
6553 	orig = data = RREG32(HDP_MEM_POWER_LS);
6554 
6555 	if (enable && (rdev->cg_flags & RADEON_CG_SUPPORT_HDP_LS))
6556 		data |= HDP_LS_ENABLE;
6557 	else
6558 		data &= ~HDP_LS_ENABLE;
6559 
6560 	if (orig != data)
6561 		WREG32(HDP_MEM_POWER_LS, data);
6562 }
6563 
6564 void cik_update_cg(struct radeon_device *rdev,
6565 		   u32 block, bool enable)
6566 {
6567 
6568 	if (block & RADEON_CG_BLOCK_GFX) {
6569 		cik_enable_gui_idle_interrupt(rdev, false);
6570 		/* order matters! */
6571 		if (enable) {
6572 			cik_enable_mgcg(rdev, true);
6573 			cik_enable_cgcg(rdev, true);
6574 		} else {
6575 			cik_enable_cgcg(rdev, false);
6576 			cik_enable_mgcg(rdev, false);
6577 		}
6578 		cik_enable_gui_idle_interrupt(rdev, true);
6579 	}
6580 
6581 	if (block & RADEON_CG_BLOCK_MC) {
6582 		if (!(rdev->flags & RADEON_IS_IGP)) {
6583 			cik_enable_mc_mgcg(rdev, enable);
6584 			cik_enable_mc_ls(rdev, enable);
6585 		}
6586 	}
6587 
6588 	if (block & RADEON_CG_BLOCK_SDMA) {
6589 		cik_enable_sdma_mgcg(rdev, enable);
6590 		cik_enable_sdma_mgls(rdev, enable);
6591 	}
6592 
6593 	if (block & RADEON_CG_BLOCK_BIF) {
6594 		cik_enable_bif_mgls(rdev, enable);
6595 	}
6596 
6597 	if (block & RADEON_CG_BLOCK_UVD) {
6598 		if (rdev->has_uvd)
6599 			cik_enable_uvd_mgcg(rdev, enable);
6600 	}
6601 
6602 	if (block & RADEON_CG_BLOCK_HDP) {
6603 		cik_enable_hdp_mgcg(rdev, enable);
6604 		cik_enable_hdp_ls(rdev, enable);
6605 	}
6606 
6607 	if (block & RADEON_CG_BLOCK_VCE) {
6608 		vce_v2_0_enable_mgcg(rdev, enable);
6609 	}
6610 }
6611 
6612 static void cik_init_cg(struct radeon_device *rdev)
6613 {
6614 
6615 	cik_update_cg(rdev, RADEON_CG_BLOCK_GFX, true);
6616 
6617 	if (rdev->has_uvd)
6618 		si_init_uvd_internal_cg(rdev);
6619 
6620 	cik_update_cg(rdev, (RADEON_CG_BLOCK_MC |
6621 			     RADEON_CG_BLOCK_SDMA |
6622 			     RADEON_CG_BLOCK_BIF |
6623 			     RADEON_CG_BLOCK_UVD |
6624 			     RADEON_CG_BLOCK_HDP), true);
6625 }
6626 
6627 static void cik_fini_cg(struct radeon_device *rdev)
6628 {
6629 	cik_update_cg(rdev, (RADEON_CG_BLOCK_MC |
6630 			     RADEON_CG_BLOCK_SDMA |
6631 			     RADEON_CG_BLOCK_BIF |
6632 			     RADEON_CG_BLOCK_UVD |
6633 			     RADEON_CG_BLOCK_HDP), false);
6634 
6635 	cik_update_cg(rdev, RADEON_CG_BLOCK_GFX, false);
6636 }
6637 
6638 static void cik_enable_sck_slowdown_on_pu(struct radeon_device *rdev,
6639 					  bool enable)
6640 {
6641 	u32 data, orig;
6642 
6643 	orig = data = RREG32(RLC_PG_CNTL);
6644 	if (enable && (rdev->pg_flags & RADEON_PG_SUPPORT_RLC_SMU_HS))
6645 		data |= SMU_CLK_SLOWDOWN_ON_PU_ENABLE;
6646 	else
6647 		data &= ~SMU_CLK_SLOWDOWN_ON_PU_ENABLE;
6648 	if (orig != data)
6649 		WREG32(RLC_PG_CNTL, data);
6650 }
6651 
6652 static void cik_enable_sck_slowdown_on_pd(struct radeon_device *rdev,
6653 					  bool enable)
6654 {
6655 	u32 data, orig;
6656 
6657 	orig = data = RREG32(RLC_PG_CNTL);
6658 	if (enable && (rdev->pg_flags & RADEON_PG_SUPPORT_RLC_SMU_HS))
6659 		data |= SMU_CLK_SLOWDOWN_ON_PD_ENABLE;
6660 	else
6661 		data &= ~SMU_CLK_SLOWDOWN_ON_PD_ENABLE;
6662 	if (orig != data)
6663 		WREG32(RLC_PG_CNTL, data);
6664 }
6665 
6666 static void cik_enable_cp_pg(struct radeon_device *rdev, bool enable)
6667 {
6668 	u32 data, orig;
6669 
6670 	orig = data = RREG32(RLC_PG_CNTL);
6671 	if (enable && (rdev->pg_flags & RADEON_PG_SUPPORT_CP))
6672 		data &= ~DISABLE_CP_PG;
6673 	else
6674 		data |= DISABLE_CP_PG;
6675 	if (orig != data)
6676 		WREG32(RLC_PG_CNTL, data);
6677 }
6678 
6679 static void cik_enable_gds_pg(struct radeon_device *rdev, bool enable)
6680 {
6681 	u32 data, orig;
6682 
6683 	orig = data = RREG32(RLC_PG_CNTL);
6684 	if (enable && (rdev->pg_flags & RADEON_PG_SUPPORT_GDS))
6685 		data &= ~DISABLE_GDS_PG;
6686 	else
6687 		data |= DISABLE_GDS_PG;
6688 	if (orig != data)
6689 		WREG32(RLC_PG_CNTL, data);
6690 }
6691 
6692 #define CP_ME_TABLE_SIZE    96
6693 #define CP_ME_TABLE_OFFSET  2048
6694 #define CP_MEC_TABLE_OFFSET 4096
6695 
6696 void cik_init_cp_pg_table(struct radeon_device *rdev)
6697 {
6698 	volatile u32 *dst_ptr;
6699 	int me, i, max_me = 4;
6700 	u32 bo_offset = 0;
6701 	u32 table_offset, table_size;
6702 
6703 	if (rdev->family == CHIP_KAVERI)
6704 		max_me = 5;
6705 
6706 	if (rdev->rlc.cp_table_ptr == NULL)
6707 		return;
6708 
6709 	/* write the cp table buffer */
6710 	dst_ptr = rdev->rlc.cp_table_ptr;
6711 	for (me = 0; me < max_me; me++) {
6712 		if (rdev->new_fw) {
6713 			const __le32 *fw_data;
6714 			const struct gfx_firmware_header_v1_0 *hdr;
6715 
6716 			if (me == 0) {
6717 				hdr = (const struct gfx_firmware_header_v1_0 *)rdev->ce_fw->data;
6718 				fw_data = (const __le32 *)
6719 					((const char *)rdev->ce_fw->data + le32_to_cpu(hdr->header.ucode_array_offset_bytes));
6720 				table_offset = le32_to_cpu(hdr->jt_offset);
6721 				table_size = le32_to_cpu(hdr->jt_size);
6722 			} else if (me == 1) {
6723 				hdr = (const struct gfx_firmware_header_v1_0 *)rdev->pfp_fw->data;
6724 				fw_data = (const __le32 *)
6725 					((const char *)rdev->pfp_fw->data + le32_to_cpu(hdr->header.ucode_array_offset_bytes));
6726 				table_offset = le32_to_cpu(hdr->jt_offset);
6727 				table_size = le32_to_cpu(hdr->jt_size);
6728 			} else if (me == 2) {
6729 				hdr = (const struct gfx_firmware_header_v1_0 *)rdev->me_fw->data;
6730 				fw_data = (const __le32 *)
6731 					((const char *)rdev->me_fw->data + le32_to_cpu(hdr->header.ucode_array_offset_bytes));
6732 				table_offset = le32_to_cpu(hdr->jt_offset);
6733 				table_size = le32_to_cpu(hdr->jt_size);
6734 			} else if (me == 3) {
6735 				hdr = (const struct gfx_firmware_header_v1_0 *)rdev->mec_fw->data;
6736 				fw_data = (const __le32 *)
6737 					((const char *)rdev->mec_fw->data + le32_to_cpu(hdr->header.ucode_array_offset_bytes));
6738 				table_offset = le32_to_cpu(hdr->jt_offset);
6739 				table_size = le32_to_cpu(hdr->jt_size);
6740 			} else {
6741 				hdr = (const struct gfx_firmware_header_v1_0 *)rdev->mec2_fw->data;
6742 				fw_data = (const __le32 *)
6743 					((const char *)rdev->mec2_fw->data + le32_to_cpu(hdr->header.ucode_array_offset_bytes));
6744 				table_offset = le32_to_cpu(hdr->jt_offset);
6745 				table_size = le32_to_cpu(hdr->jt_size);
6746 			}
6747 
6748 			for (i = 0; i < table_size; i ++) {
6749 				dst_ptr[bo_offset + i] =
6750 					cpu_to_le32(le32_to_cpu(fw_data[table_offset + i]));
6751 			}
6752 			bo_offset += table_size;
6753 		} else {
6754 			const __be32 *fw_data;
6755 			table_size = CP_ME_TABLE_SIZE;
6756 
6757 			if (me == 0) {
6758 				fw_data = (const __be32 *)rdev->ce_fw->data;
6759 				table_offset = CP_ME_TABLE_OFFSET;
6760 			} else if (me == 1) {
6761 				fw_data = (const __be32 *)rdev->pfp_fw->data;
6762 				table_offset = CP_ME_TABLE_OFFSET;
6763 			} else if (me == 2) {
6764 				fw_data = (const __be32 *)rdev->me_fw->data;
6765 				table_offset = CP_ME_TABLE_OFFSET;
6766 			} else {
6767 				fw_data = (const __be32 *)rdev->mec_fw->data;
6768 				table_offset = CP_MEC_TABLE_OFFSET;
6769 			}
6770 
6771 			for (i = 0; i < table_size; i ++) {
6772 				dst_ptr[bo_offset + i] =
6773 					cpu_to_le32(be32_to_cpu(fw_data[table_offset + i]));
6774 			}
6775 			bo_offset += table_size;
6776 		}
6777 	}
6778 }
6779 
6780 static void cik_enable_gfx_cgpg(struct radeon_device *rdev,
6781 				bool enable)
6782 {
6783 	u32 data, orig;
6784 
6785 	if (enable && (rdev->pg_flags & RADEON_PG_SUPPORT_GFX_PG)) {
6786 		orig = data = RREG32(RLC_PG_CNTL);
6787 		data |= GFX_PG_ENABLE;
6788 		if (orig != data)
6789 			WREG32(RLC_PG_CNTL, data);
6790 
6791 		orig = data = RREG32(RLC_AUTO_PG_CTRL);
6792 		data |= AUTO_PG_EN;
6793 		if (orig != data)
6794 			WREG32(RLC_AUTO_PG_CTRL, data);
6795 	} else {
6796 		orig = data = RREG32(RLC_PG_CNTL);
6797 		data &= ~GFX_PG_ENABLE;
6798 		if (orig != data)
6799 			WREG32(RLC_PG_CNTL, data);
6800 
6801 		orig = data = RREG32(RLC_AUTO_PG_CTRL);
6802 		data &= ~AUTO_PG_EN;
6803 		if (orig != data)
6804 			WREG32(RLC_AUTO_PG_CTRL, data);
6805 
6806 		data = RREG32(DB_RENDER_CONTROL);
6807 	}
6808 }
6809 
6810 static u32 cik_get_cu_active_bitmap(struct radeon_device *rdev, u32 se, u32 sh)
6811 {
6812 	u32 mask = 0, tmp, tmp1;
6813 	int i;
6814 
6815 	cik_select_se_sh(rdev, se, sh);
6816 	tmp = RREG32(CC_GC_SHADER_ARRAY_CONFIG);
6817 	tmp1 = RREG32(GC_USER_SHADER_ARRAY_CONFIG);
6818 	cik_select_se_sh(rdev, 0xffffffff, 0xffffffff);
6819 
6820 	tmp &= 0xffff0000;
6821 
6822 	tmp |= tmp1;
6823 	tmp >>= 16;
6824 
6825 	for (i = 0; i < rdev->config.cik.max_cu_per_sh; i ++) {
6826 		mask <<= 1;
6827 		mask |= 1;
6828 	}
6829 
6830 	return (~tmp) & mask;
6831 }
6832 
6833 static void cik_init_ao_cu_mask(struct radeon_device *rdev)
6834 {
6835 	u32 i, j, k, active_cu_number = 0;
6836 	u32 mask, counter, cu_bitmap;
6837 	u32 tmp = 0;
6838 
6839 	for (i = 0; i < rdev->config.cik.max_shader_engines; i++) {
6840 		for (j = 0; j < rdev->config.cik.max_sh_per_se; j++) {
6841 			mask = 1;
6842 			cu_bitmap = 0;
6843 			counter = 0;
6844 			for (k = 0; k < rdev->config.cik.max_cu_per_sh; k ++) {
6845 				if (cik_get_cu_active_bitmap(rdev, i, j) & mask) {
6846 					if (counter < 2)
6847 						cu_bitmap |= mask;
6848 					counter ++;
6849 				}
6850 				mask <<= 1;
6851 			}
6852 
6853 			active_cu_number += counter;
6854 			tmp |= (cu_bitmap << (i * 16 + j * 8));
6855 		}
6856 	}
6857 
6858 	WREG32(RLC_PG_AO_CU_MASK, tmp);
6859 
6860 	tmp = RREG32(RLC_MAX_PG_CU);
6861 	tmp &= ~MAX_PU_CU_MASK;
6862 	tmp |= MAX_PU_CU(active_cu_number);
6863 	WREG32(RLC_MAX_PG_CU, tmp);
6864 }
6865 
6866 static void cik_enable_gfx_static_mgpg(struct radeon_device *rdev,
6867 				       bool enable)
6868 {
6869 	u32 data, orig;
6870 
6871 	orig = data = RREG32(RLC_PG_CNTL);
6872 	if (enable && (rdev->pg_flags & RADEON_PG_SUPPORT_GFX_SMG))
6873 		data |= STATIC_PER_CU_PG_ENABLE;
6874 	else
6875 		data &= ~STATIC_PER_CU_PG_ENABLE;
6876 	if (orig != data)
6877 		WREG32(RLC_PG_CNTL, data);
6878 }
6879 
6880 static void cik_enable_gfx_dynamic_mgpg(struct radeon_device *rdev,
6881 					bool enable)
6882 {
6883 	u32 data, orig;
6884 
6885 	orig = data = RREG32(RLC_PG_CNTL);
6886 	if (enable && (rdev->pg_flags & RADEON_PG_SUPPORT_GFX_DMG))
6887 		data |= DYN_PER_CU_PG_ENABLE;
6888 	else
6889 		data &= ~DYN_PER_CU_PG_ENABLE;
6890 	if (orig != data)
6891 		WREG32(RLC_PG_CNTL, data);
6892 }
6893 
6894 #define RLC_SAVE_AND_RESTORE_STARTING_OFFSET 0x90
6895 #define RLC_CLEAR_STATE_DESCRIPTOR_OFFSET    0x3D
6896 
6897 static void cik_init_gfx_cgpg(struct radeon_device *rdev)
6898 {
6899 	u32 data, orig;
6900 	u32 i;
6901 
6902 	if (rdev->rlc.cs_data) {
6903 		WREG32(RLC_GPM_SCRATCH_ADDR, RLC_CLEAR_STATE_DESCRIPTOR_OFFSET);
6904 		WREG32(RLC_GPM_SCRATCH_DATA, upper_32_bits(rdev->rlc.clear_state_gpu_addr));
6905 		WREG32(RLC_GPM_SCRATCH_DATA, lower_32_bits(rdev->rlc.clear_state_gpu_addr));
6906 		WREG32(RLC_GPM_SCRATCH_DATA, rdev->rlc.clear_state_size);
6907 	} else {
6908 		WREG32(RLC_GPM_SCRATCH_ADDR, RLC_CLEAR_STATE_DESCRIPTOR_OFFSET);
6909 		for (i = 0; i < 3; i++)
6910 			WREG32(RLC_GPM_SCRATCH_DATA, 0);
6911 	}
6912 	if (rdev->rlc.reg_list) {
6913 		WREG32(RLC_GPM_SCRATCH_ADDR, RLC_SAVE_AND_RESTORE_STARTING_OFFSET);
6914 		for (i = 0; i < rdev->rlc.reg_list_size; i++)
6915 			WREG32(RLC_GPM_SCRATCH_DATA, rdev->rlc.reg_list[i]);
6916 	}
6917 
6918 	orig = data = RREG32(RLC_PG_CNTL);
6919 	data |= GFX_PG_SRC;
6920 	if (orig != data)
6921 		WREG32(RLC_PG_CNTL, data);
6922 
6923 	WREG32(RLC_SAVE_AND_RESTORE_BASE, rdev->rlc.save_restore_gpu_addr >> 8);
6924 	WREG32(RLC_CP_TABLE_RESTORE, rdev->rlc.cp_table_gpu_addr >> 8);
6925 
6926 	data = RREG32(CP_RB_WPTR_POLL_CNTL);
6927 	data &= ~IDLE_POLL_COUNT_MASK;
6928 	data |= IDLE_POLL_COUNT(0x60);
6929 	WREG32(CP_RB_WPTR_POLL_CNTL, data);
6930 
6931 	data = 0x10101010;
6932 	WREG32(RLC_PG_DELAY, data);
6933 
6934 	data = RREG32(RLC_PG_DELAY_2);
6935 	data &= ~0xff;
6936 	data |= 0x3;
6937 	WREG32(RLC_PG_DELAY_2, data);
6938 
6939 	data = RREG32(RLC_AUTO_PG_CTRL);
6940 	data &= ~GRBM_REG_SGIT_MASK;
6941 	data |= GRBM_REG_SGIT(0x700);
6942 	WREG32(RLC_AUTO_PG_CTRL, data);
6943 
6944 }
6945 
6946 static void cik_update_gfx_pg(struct radeon_device *rdev, bool enable)
6947 {
6948 	cik_enable_gfx_cgpg(rdev, enable);
6949 	cik_enable_gfx_static_mgpg(rdev, enable);
6950 	cik_enable_gfx_dynamic_mgpg(rdev, enable);
6951 }
6952 
6953 u32 cik_get_csb_size(struct radeon_device *rdev)
6954 {
6955 	u32 count = 0;
6956 	const struct cs_section_def *sect = NULL;
6957 	const struct cs_extent_def *ext = NULL;
6958 
6959 	if (rdev->rlc.cs_data == NULL)
6960 		return 0;
6961 
6962 	/* begin clear state */
6963 	count += 2;
6964 	/* context control state */
6965 	count += 3;
6966 
6967 	for (sect = rdev->rlc.cs_data; sect->section != NULL; ++sect) {
6968 		for (ext = sect->section; ext->extent != NULL; ++ext) {
6969 			if (sect->id == SECT_CONTEXT)
6970 				count += 2 + ext->reg_count;
6971 			else
6972 				return 0;
6973 		}
6974 	}
6975 	/* pa_sc_raster_config/pa_sc_raster_config1 */
6976 	count += 4;
6977 	/* end clear state */
6978 	count += 2;
6979 	/* clear state */
6980 	count += 2;
6981 
6982 	return count;
6983 }
6984 
6985 void cik_get_csb_buffer(struct radeon_device *rdev, volatile u32 *buffer)
6986 {
6987 	u32 count = 0, i;
6988 	const struct cs_section_def *sect = NULL;
6989 	const struct cs_extent_def *ext = NULL;
6990 
6991 	if (rdev->rlc.cs_data == NULL)
6992 		return;
6993 	if (buffer == NULL)
6994 		return;
6995 
6996 	buffer[count++] = cpu_to_le32(PACKET3(PACKET3_PREAMBLE_CNTL, 0));
6997 	buffer[count++] = cpu_to_le32(PACKET3_PREAMBLE_BEGIN_CLEAR_STATE);
6998 
6999 	buffer[count++] = cpu_to_le32(PACKET3(PACKET3_CONTEXT_CONTROL, 1));
7000 	buffer[count++] = cpu_to_le32(0x80000000);
7001 	buffer[count++] = cpu_to_le32(0x80000000);
7002 
7003 	for (sect = rdev->rlc.cs_data; sect->section != NULL; ++sect) {
7004 		for (ext = sect->section; ext->extent != NULL; ++ext) {
7005 			if (sect->id == SECT_CONTEXT) {
7006 				buffer[count++] =
7007 					cpu_to_le32(PACKET3(PACKET3_SET_CONTEXT_REG, ext->reg_count));
7008 				buffer[count++] = cpu_to_le32(ext->reg_index - 0xa000);
7009 				for (i = 0; i < ext->reg_count; i++)
7010 					buffer[count++] = cpu_to_le32(ext->extent[i]);
7011 			} else {
7012 				return;
7013 			}
7014 		}
7015 	}
7016 
7017 	buffer[count++] = cpu_to_le32(PACKET3(PACKET3_SET_CONTEXT_REG, 2));
7018 	buffer[count++] = cpu_to_le32(PA_SC_RASTER_CONFIG - PACKET3_SET_CONTEXT_REG_START);
7019 	switch (rdev->family) {
7020 	case CHIP_BONAIRE:
7021 		buffer[count++] = cpu_to_le32(0x16000012);
7022 		buffer[count++] = cpu_to_le32(0x00000000);
7023 		break;
7024 	case CHIP_KAVERI:
7025 		buffer[count++] = cpu_to_le32(0x00000000); /* XXX */
7026 		buffer[count++] = cpu_to_le32(0x00000000);
7027 		break;
7028 	case CHIP_KABINI:
7029 	case CHIP_MULLINS:
7030 		buffer[count++] = cpu_to_le32(0x00000000); /* XXX */
7031 		buffer[count++] = cpu_to_le32(0x00000000);
7032 		break;
7033 	case CHIP_HAWAII:
7034 		buffer[count++] = cpu_to_le32(0x3a00161a);
7035 		buffer[count++] = cpu_to_le32(0x0000002e);
7036 		break;
7037 	default:
7038 		buffer[count++] = cpu_to_le32(0x00000000);
7039 		buffer[count++] = cpu_to_le32(0x00000000);
7040 		break;
7041 	}
7042 
7043 	buffer[count++] = cpu_to_le32(PACKET3(PACKET3_PREAMBLE_CNTL, 0));
7044 	buffer[count++] = cpu_to_le32(PACKET3_PREAMBLE_END_CLEAR_STATE);
7045 
7046 	buffer[count++] = cpu_to_le32(PACKET3(PACKET3_CLEAR_STATE, 0));
7047 	buffer[count++] = cpu_to_le32(0);
7048 }
7049 
7050 static void cik_init_pg(struct radeon_device *rdev)
7051 {
7052 	if (rdev->pg_flags) {
7053 		cik_enable_sck_slowdown_on_pu(rdev, true);
7054 		cik_enable_sck_slowdown_on_pd(rdev, true);
7055 		if (rdev->pg_flags & RADEON_PG_SUPPORT_GFX_PG) {
7056 			cik_init_gfx_cgpg(rdev);
7057 			cik_enable_cp_pg(rdev, true);
7058 			cik_enable_gds_pg(rdev, true);
7059 		}
7060 		cik_init_ao_cu_mask(rdev);
7061 		cik_update_gfx_pg(rdev, true);
7062 	}
7063 }
7064 
7065 static void cik_fini_pg(struct radeon_device *rdev)
7066 {
7067 	if (rdev->pg_flags) {
7068 		cik_update_gfx_pg(rdev, false);
7069 		if (rdev->pg_flags & RADEON_PG_SUPPORT_GFX_PG) {
7070 			cik_enable_cp_pg(rdev, false);
7071 			cik_enable_gds_pg(rdev, false);
7072 		}
7073 	}
7074 }
7075 
7076 /*
7077  * Interrupts
7078  * Starting with r6xx, interrupts are handled via a ring buffer.
7079  * Ring buffers are areas of GPU accessible memory that the GPU
7080  * writes interrupt vectors into and the host reads vectors out of.
7081  * There is a rptr (read pointer) that determines where the
7082  * host is currently reading, and a wptr (write pointer)
7083  * which determines where the GPU has written.  When the
7084  * pointers are equal, the ring is idle.  When the GPU
7085  * writes vectors to the ring buffer, it increments the
7086  * wptr.  When there is an interrupt, the host then starts
7087  * fetching commands and processing them until the pointers are
7088  * equal again at which point it updates the rptr.
7089  */
7090 
7091 /**
7092  * cik_enable_interrupts - Enable the interrupt ring buffer
7093  *
7094  * @rdev: radeon_device pointer
7095  *
7096  * Enable the interrupt ring buffer (CIK).
7097  */
7098 static void cik_enable_interrupts(struct radeon_device *rdev)
7099 {
7100 	u32 ih_cntl = RREG32(IH_CNTL);
7101 	u32 ih_rb_cntl = RREG32(IH_RB_CNTL);
7102 
7103 	ih_cntl |= ENABLE_INTR;
7104 	ih_rb_cntl |= IH_RB_ENABLE;
7105 	WREG32(IH_CNTL, ih_cntl);
7106 	WREG32(IH_RB_CNTL, ih_rb_cntl);
7107 	rdev->ih.enabled = true;
7108 }
7109 
7110 /**
7111  * cik_disable_interrupts - Disable the interrupt ring buffer
7112  *
7113  * @rdev: radeon_device pointer
7114  *
7115  * Disable the interrupt ring buffer (CIK).
7116  */
7117 static void cik_disable_interrupts(struct radeon_device *rdev)
7118 {
7119 	u32 ih_rb_cntl = RREG32(IH_RB_CNTL);
7120 	u32 ih_cntl = RREG32(IH_CNTL);
7121 
7122 	ih_rb_cntl &= ~IH_RB_ENABLE;
7123 	ih_cntl &= ~ENABLE_INTR;
7124 	WREG32(IH_RB_CNTL, ih_rb_cntl);
7125 	WREG32(IH_CNTL, ih_cntl);
7126 	/* set rptr, wptr to 0 */
7127 	WREG32(IH_RB_RPTR, 0);
7128 	WREG32(IH_RB_WPTR, 0);
7129 	rdev->ih.enabled = false;
7130 	rdev->ih.rptr = 0;
7131 }
7132 
7133 /**
7134  * cik_disable_interrupt_state - Disable all interrupt sources
7135  *
7136  * @rdev: radeon_device pointer
7137  *
7138  * Clear all interrupt enable bits used by the driver (CIK).
7139  */
7140 static void cik_disable_interrupt_state(struct radeon_device *rdev)
7141 {
7142 	u32 tmp;
7143 
7144 	/* gfx ring */
7145 	tmp = RREG32(CP_INT_CNTL_RING0) &
7146 		(CNTX_BUSY_INT_ENABLE | CNTX_EMPTY_INT_ENABLE);
7147 	WREG32(CP_INT_CNTL_RING0, tmp);
7148 	/* sdma */
7149 	tmp = RREG32(SDMA0_CNTL + SDMA0_REGISTER_OFFSET) & ~TRAP_ENABLE;
7150 	WREG32(SDMA0_CNTL + SDMA0_REGISTER_OFFSET, tmp);
7151 	tmp = RREG32(SDMA0_CNTL + SDMA1_REGISTER_OFFSET) & ~TRAP_ENABLE;
7152 	WREG32(SDMA0_CNTL + SDMA1_REGISTER_OFFSET, tmp);
7153 	/* compute queues */
7154 	WREG32(CP_ME1_PIPE0_INT_CNTL, 0);
7155 	WREG32(CP_ME1_PIPE1_INT_CNTL, 0);
7156 	WREG32(CP_ME1_PIPE2_INT_CNTL, 0);
7157 	WREG32(CP_ME1_PIPE3_INT_CNTL, 0);
7158 	WREG32(CP_ME2_PIPE0_INT_CNTL, 0);
7159 	WREG32(CP_ME2_PIPE1_INT_CNTL, 0);
7160 	WREG32(CP_ME2_PIPE2_INT_CNTL, 0);
7161 	WREG32(CP_ME2_PIPE3_INT_CNTL, 0);
7162 	/* grbm */
7163 	WREG32(GRBM_INT_CNTL, 0);
7164 	/* vline/vblank, etc. */
7165 	WREG32(LB_INTERRUPT_MASK + EVERGREEN_CRTC0_REGISTER_OFFSET, 0);
7166 	WREG32(LB_INTERRUPT_MASK + EVERGREEN_CRTC1_REGISTER_OFFSET, 0);
7167 	if (rdev->num_crtc >= 4) {
7168 		WREG32(LB_INTERRUPT_MASK + EVERGREEN_CRTC2_REGISTER_OFFSET, 0);
7169 		WREG32(LB_INTERRUPT_MASK + EVERGREEN_CRTC3_REGISTER_OFFSET, 0);
7170 	}
7171 	if (rdev->num_crtc >= 6) {
7172 		WREG32(LB_INTERRUPT_MASK + EVERGREEN_CRTC4_REGISTER_OFFSET, 0);
7173 		WREG32(LB_INTERRUPT_MASK + EVERGREEN_CRTC5_REGISTER_OFFSET, 0);
7174 	}
7175 	/* pflip */
7176 	if (rdev->num_crtc >= 2) {
7177 		WREG32(GRPH_INT_CONTROL + EVERGREEN_CRTC0_REGISTER_OFFSET, 0);
7178 		WREG32(GRPH_INT_CONTROL + EVERGREEN_CRTC1_REGISTER_OFFSET, 0);
7179 	}
7180 	if (rdev->num_crtc >= 4) {
7181 		WREG32(GRPH_INT_CONTROL + EVERGREEN_CRTC2_REGISTER_OFFSET, 0);
7182 		WREG32(GRPH_INT_CONTROL + EVERGREEN_CRTC3_REGISTER_OFFSET, 0);
7183 	}
7184 	if (rdev->num_crtc >= 6) {
7185 		WREG32(GRPH_INT_CONTROL + EVERGREEN_CRTC4_REGISTER_OFFSET, 0);
7186 		WREG32(GRPH_INT_CONTROL + EVERGREEN_CRTC5_REGISTER_OFFSET, 0);
7187 	}
7188 
7189 	/* dac hotplug */
7190 	WREG32(DAC_AUTODETECT_INT_CONTROL, 0);
7191 
7192 	/* digital hotplug */
7193 	tmp = RREG32(DC_HPD1_INT_CONTROL) & DC_HPDx_INT_POLARITY;
7194 	WREG32(DC_HPD1_INT_CONTROL, tmp);
7195 	tmp = RREG32(DC_HPD2_INT_CONTROL) & DC_HPDx_INT_POLARITY;
7196 	WREG32(DC_HPD2_INT_CONTROL, tmp);
7197 	tmp = RREG32(DC_HPD3_INT_CONTROL) & DC_HPDx_INT_POLARITY;
7198 	WREG32(DC_HPD3_INT_CONTROL, tmp);
7199 	tmp = RREG32(DC_HPD4_INT_CONTROL) & DC_HPDx_INT_POLARITY;
7200 	WREG32(DC_HPD4_INT_CONTROL, tmp);
7201 	tmp = RREG32(DC_HPD5_INT_CONTROL) & DC_HPDx_INT_POLARITY;
7202 	WREG32(DC_HPD5_INT_CONTROL, tmp);
7203 	tmp = RREG32(DC_HPD6_INT_CONTROL) & DC_HPDx_INT_POLARITY;
7204 	WREG32(DC_HPD6_INT_CONTROL, tmp);
7205 
7206 }
7207 
7208 /**
7209  * cik_irq_init - init and enable the interrupt ring
7210  *
7211  * @rdev: radeon_device pointer
7212  *
7213  * Allocate a ring buffer for the interrupt controller,
7214  * enable the RLC, disable interrupts, enable the IH
7215  * ring buffer and enable it (CIK).
7216  * Called at device load and reume.
7217  * Returns 0 for success, errors for failure.
7218  */
7219 static int cik_irq_init(struct radeon_device *rdev)
7220 {
7221 	int ret = 0;
7222 	int rb_bufsz;
7223 	u32 interrupt_cntl, ih_cntl, ih_rb_cntl;
7224 
7225 	/* allocate ring */
7226 	ret = r600_ih_ring_alloc(rdev);
7227 	if (ret)
7228 		return ret;
7229 
7230 	/* disable irqs */
7231 	cik_disable_interrupts(rdev);
7232 
7233 	/* init rlc */
7234 	ret = cik_rlc_resume(rdev);
7235 	if (ret) {
7236 		r600_ih_ring_fini(rdev);
7237 		return ret;
7238 	}
7239 
7240 	/* setup interrupt control */
7241 	/* XXX this should actually be a bus address, not an MC address. same on older asics */
7242 	WREG32(INTERRUPT_CNTL2, rdev->ih.gpu_addr >> 8);
7243 	interrupt_cntl = RREG32(INTERRUPT_CNTL);
7244 	/* IH_DUMMY_RD_OVERRIDE=0 - dummy read disabled with msi, enabled without msi
7245 	 * IH_DUMMY_RD_OVERRIDE=1 - dummy read controlled by IH_DUMMY_RD_EN
7246 	 */
7247 	interrupt_cntl &= ~IH_DUMMY_RD_OVERRIDE;
7248 	/* IH_REQ_NONSNOOP_EN=1 if ring is in non-cacheable memory, e.g., vram */
7249 	interrupt_cntl &= ~IH_REQ_NONSNOOP_EN;
7250 	WREG32(INTERRUPT_CNTL, interrupt_cntl);
7251 
7252 	WREG32(IH_RB_BASE, rdev->ih.gpu_addr >> 8);
7253 	rb_bufsz = order_base_2(rdev->ih.ring_size / 4);
7254 
7255 	ih_rb_cntl = (IH_WPTR_OVERFLOW_ENABLE |
7256 		      IH_WPTR_OVERFLOW_CLEAR |
7257 		      (rb_bufsz << 1));
7258 
7259 	if (rdev->wb.enabled)
7260 		ih_rb_cntl |= IH_WPTR_WRITEBACK_ENABLE;
7261 
7262 	/* set the writeback address whether it's enabled or not */
7263 	WREG32(IH_RB_WPTR_ADDR_LO, (rdev->wb.gpu_addr + R600_WB_IH_WPTR_OFFSET) & 0xFFFFFFFC);
7264 	WREG32(IH_RB_WPTR_ADDR_HI, upper_32_bits(rdev->wb.gpu_addr + R600_WB_IH_WPTR_OFFSET) & 0xFF);
7265 
7266 	WREG32(IH_RB_CNTL, ih_rb_cntl);
7267 
7268 	/* set rptr, wptr to 0 */
7269 	WREG32(IH_RB_RPTR, 0);
7270 	WREG32(IH_RB_WPTR, 0);
7271 
7272 	/* Default settings for IH_CNTL (disabled at first) */
7273 	ih_cntl = MC_WRREQ_CREDIT(0x10) | MC_WR_CLEAN_CNT(0x10) | MC_VMID(0);
7274 	/* RPTR_REARM only works if msi's are enabled */
7275 	if (rdev->msi_enabled)
7276 		ih_cntl |= RPTR_REARM;
7277 	WREG32(IH_CNTL, ih_cntl);
7278 
7279 	/* force the active interrupt state to all disabled */
7280 	cik_disable_interrupt_state(rdev);
7281 
7282 	pci_enable_busmaster(rdev->pdev->dev);
7283 
7284 	/* enable irqs */
7285 	cik_enable_interrupts(rdev);
7286 
7287 	return ret;
7288 }
7289 
7290 /**
7291  * cik_irq_set - enable/disable interrupt sources
7292  *
7293  * @rdev: radeon_device pointer
7294  *
7295  * Enable interrupt sources on the GPU (vblanks, hpd,
7296  * etc.) (CIK).
7297  * Returns 0 for success, errors for failure.
7298  */
7299 int cik_irq_set(struct radeon_device *rdev)
7300 {
7301 	u32 cp_int_cntl;
7302 	u32 cp_m1p0, cp_m1p1, cp_m1p2, cp_m1p3;
7303 	u32 cp_m2p0, cp_m2p1, cp_m2p2, cp_m2p3;
7304 	u32 crtc1 = 0, crtc2 = 0, crtc3 = 0, crtc4 = 0, crtc5 = 0, crtc6 = 0;
7305 	u32 hpd1, hpd2, hpd3, hpd4, hpd5, hpd6;
7306 	u32 grbm_int_cntl = 0;
7307 	u32 dma_cntl, dma_cntl1;
7308 	u32 thermal_int;
7309 
7310 	if (!rdev->irq.installed) {
7311 		WARN(1, "Can't enable IRQ/MSI because no handler is installed\n");
7312 		return -EINVAL;
7313 	}
7314 	/* don't enable anything if the ih is disabled */
7315 	if (!rdev->ih.enabled) {
7316 		cik_disable_interrupts(rdev);
7317 		/* force the active interrupt state to all disabled */
7318 		cik_disable_interrupt_state(rdev);
7319 		return 0;
7320 	}
7321 
7322 	cp_int_cntl = RREG32(CP_INT_CNTL_RING0) &
7323 		(CNTX_BUSY_INT_ENABLE | CNTX_EMPTY_INT_ENABLE);
7324 	cp_int_cntl |= PRIV_INSTR_INT_ENABLE | PRIV_REG_INT_ENABLE;
7325 
7326 	hpd1 = RREG32(DC_HPD1_INT_CONTROL) & ~DC_HPDx_INT_EN;
7327 	hpd2 = RREG32(DC_HPD2_INT_CONTROL) & ~DC_HPDx_INT_EN;
7328 	hpd3 = RREG32(DC_HPD3_INT_CONTROL) & ~DC_HPDx_INT_EN;
7329 	hpd4 = RREG32(DC_HPD4_INT_CONTROL) & ~DC_HPDx_INT_EN;
7330 	hpd5 = RREG32(DC_HPD5_INT_CONTROL) & ~DC_HPDx_INT_EN;
7331 	hpd6 = RREG32(DC_HPD6_INT_CONTROL) & ~DC_HPDx_INT_EN;
7332 
7333 	dma_cntl = RREG32(SDMA0_CNTL + SDMA0_REGISTER_OFFSET) & ~TRAP_ENABLE;
7334 	dma_cntl1 = RREG32(SDMA0_CNTL + SDMA1_REGISTER_OFFSET) & ~TRAP_ENABLE;
7335 
7336 	cp_m1p0 = RREG32(CP_ME1_PIPE0_INT_CNTL) & ~TIME_STAMP_INT_ENABLE;
7337 	cp_m1p1 = RREG32(CP_ME1_PIPE1_INT_CNTL) & ~TIME_STAMP_INT_ENABLE;
7338 	cp_m1p2 = RREG32(CP_ME1_PIPE2_INT_CNTL) & ~TIME_STAMP_INT_ENABLE;
7339 	cp_m1p3 = RREG32(CP_ME1_PIPE3_INT_CNTL) & ~TIME_STAMP_INT_ENABLE;
7340 	cp_m2p0 = RREG32(CP_ME2_PIPE0_INT_CNTL) & ~TIME_STAMP_INT_ENABLE;
7341 	cp_m2p1 = RREG32(CP_ME2_PIPE1_INT_CNTL) & ~TIME_STAMP_INT_ENABLE;
7342 	cp_m2p2 = RREG32(CP_ME2_PIPE2_INT_CNTL) & ~TIME_STAMP_INT_ENABLE;
7343 	cp_m2p3 = RREG32(CP_ME2_PIPE3_INT_CNTL) & ~TIME_STAMP_INT_ENABLE;
7344 
7345 	if (rdev->flags & RADEON_IS_IGP)
7346 		thermal_int = RREG32_SMC(CG_THERMAL_INT_CTRL) &
7347 			~(THERM_INTH_MASK | THERM_INTL_MASK);
7348 	else
7349 		thermal_int = RREG32_SMC(CG_THERMAL_INT) &
7350 			~(THERM_INT_MASK_HIGH | THERM_INT_MASK_LOW);
7351 
7352 	/* enable CP interrupts on all rings */
7353 	if (atomic_read(&rdev->irq.ring_int[RADEON_RING_TYPE_GFX_INDEX])) {
7354 		DRM_DEBUG("cik_irq_set: sw int gfx\n");
7355 		cp_int_cntl |= TIME_STAMP_INT_ENABLE;
7356 	}
7357 	if (atomic_read(&rdev->irq.ring_int[CAYMAN_RING_TYPE_CP1_INDEX])) {
7358 		struct radeon_ring *ring = &rdev->ring[CAYMAN_RING_TYPE_CP1_INDEX];
7359 		DRM_DEBUG("si_irq_set: sw int cp1\n");
7360 		if (ring->me == 1) {
7361 			switch (ring->pipe) {
7362 			case 0:
7363 				cp_m1p0 |= TIME_STAMP_INT_ENABLE;
7364 				break;
7365 			case 1:
7366 				cp_m1p1 |= TIME_STAMP_INT_ENABLE;
7367 				break;
7368 			case 2:
7369 				cp_m1p2 |= TIME_STAMP_INT_ENABLE;
7370 				break;
7371 			case 3:
7372 				cp_m1p2 |= TIME_STAMP_INT_ENABLE;
7373 				break;
7374 			default:
7375 				DRM_DEBUG("si_irq_set: sw int cp1 invalid pipe %d\n", ring->pipe);
7376 				break;
7377 			}
7378 		} else if (ring->me == 2) {
7379 			switch (ring->pipe) {
7380 			case 0:
7381 				cp_m2p0 |= TIME_STAMP_INT_ENABLE;
7382 				break;
7383 			case 1:
7384 				cp_m2p1 |= TIME_STAMP_INT_ENABLE;
7385 				break;
7386 			case 2:
7387 				cp_m2p2 |= TIME_STAMP_INT_ENABLE;
7388 				break;
7389 			case 3:
7390 				cp_m2p2 |= TIME_STAMP_INT_ENABLE;
7391 				break;
7392 			default:
7393 				DRM_DEBUG("si_irq_set: sw int cp1 invalid pipe %d\n", ring->pipe);
7394 				break;
7395 			}
7396 		} else {
7397 			DRM_DEBUG("si_irq_set: sw int cp1 invalid me %d\n", ring->me);
7398 		}
7399 	}
7400 	if (atomic_read(&rdev->irq.ring_int[CAYMAN_RING_TYPE_CP2_INDEX])) {
7401 		struct radeon_ring *ring = &rdev->ring[CAYMAN_RING_TYPE_CP2_INDEX];
7402 		DRM_DEBUG("si_irq_set: sw int cp2\n");
7403 		if (ring->me == 1) {
7404 			switch (ring->pipe) {
7405 			case 0:
7406 				cp_m1p0 |= TIME_STAMP_INT_ENABLE;
7407 				break;
7408 			case 1:
7409 				cp_m1p1 |= TIME_STAMP_INT_ENABLE;
7410 				break;
7411 			case 2:
7412 				cp_m1p2 |= TIME_STAMP_INT_ENABLE;
7413 				break;
7414 			case 3:
7415 				cp_m1p2 |= TIME_STAMP_INT_ENABLE;
7416 				break;
7417 			default:
7418 				DRM_DEBUG("si_irq_set: sw int cp2 invalid pipe %d\n", ring->pipe);
7419 				break;
7420 			}
7421 		} else if (ring->me == 2) {
7422 			switch (ring->pipe) {
7423 			case 0:
7424 				cp_m2p0 |= TIME_STAMP_INT_ENABLE;
7425 				break;
7426 			case 1:
7427 				cp_m2p1 |= TIME_STAMP_INT_ENABLE;
7428 				break;
7429 			case 2:
7430 				cp_m2p2 |= TIME_STAMP_INT_ENABLE;
7431 				break;
7432 			case 3:
7433 				cp_m2p2 |= TIME_STAMP_INT_ENABLE;
7434 				break;
7435 			default:
7436 				DRM_DEBUG("si_irq_set: sw int cp2 invalid pipe %d\n", ring->pipe);
7437 				break;
7438 			}
7439 		} else {
7440 			DRM_DEBUG("si_irq_set: sw int cp2 invalid me %d\n", ring->me);
7441 		}
7442 	}
7443 
7444 	if (atomic_read(&rdev->irq.ring_int[R600_RING_TYPE_DMA_INDEX])) {
7445 		DRM_DEBUG("cik_irq_set: sw int dma\n");
7446 		dma_cntl |= TRAP_ENABLE;
7447 	}
7448 
7449 	if (atomic_read(&rdev->irq.ring_int[CAYMAN_RING_TYPE_DMA1_INDEX])) {
7450 		DRM_DEBUG("cik_irq_set: sw int dma1\n");
7451 		dma_cntl1 |= TRAP_ENABLE;
7452 	}
7453 
7454 	if (rdev->irq.crtc_vblank_int[0] ||
7455 	    atomic_read(&rdev->irq.pflip[0])) {
7456 		DRM_DEBUG("cik_irq_set: vblank 0\n");
7457 		crtc1 |= VBLANK_INTERRUPT_MASK;
7458 	}
7459 	if (rdev->irq.crtc_vblank_int[1] ||
7460 	    atomic_read(&rdev->irq.pflip[1])) {
7461 		DRM_DEBUG("cik_irq_set: vblank 1\n");
7462 		crtc2 |= VBLANK_INTERRUPT_MASK;
7463 	}
7464 	if (rdev->irq.crtc_vblank_int[2] ||
7465 	    atomic_read(&rdev->irq.pflip[2])) {
7466 		DRM_DEBUG("cik_irq_set: vblank 2\n");
7467 		crtc3 |= VBLANK_INTERRUPT_MASK;
7468 	}
7469 	if (rdev->irq.crtc_vblank_int[3] ||
7470 	    atomic_read(&rdev->irq.pflip[3])) {
7471 		DRM_DEBUG("cik_irq_set: vblank 3\n");
7472 		crtc4 |= VBLANK_INTERRUPT_MASK;
7473 	}
7474 	if (rdev->irq.crtc_vblank_int[4] ||
7475 	    atomic_read(&rdev->irq.pflip[4])) {
7476 		DRM_DEBUG("cik_irq_set: vblank 4\n");
7477 		crtc5 |= VBLANK_INTERRUPT_MASK;
7478 	}
7479 	if (rdev->irq.crtc_vblank_int[5] ||
7480 	    atomic_read(&rdev->irq.pflip[5])) {
7481 		DRM_DEBUG("cik_irq_set: vblank 5\n");
7482 		crtc6 |= VBLANK_INTERRUPT_MASK;
7483 	}
7484 	if (rdev->irq.hpd[0]) {
7485 		DRM_DEBUG("cik_irq_set: hpd 1\n");
7486 		hpd1 |= DC_HPDx_INT_EN;
7487 	}
7488 	if (rdev->irq.hpd[1]) {
7489 		DRM_DEBUG("cik_irq_set: hpd 2\n");
7490 		hpd2 |= DC_HPDx_INT_EN;
7491 	}
7492 	if (rdev->irq.hpd[2]) {
7493 		DRM_DEBUG("cik_irq_set: hpd 3\n");
7494 		hpd3 |= DC_HPDx_INT_EN;
7495 	}
7496 	if (rdev->irq.hpd[3]) {
7497 		DRM_DEBUG("cik_irq_set: hpd 4\n");
7498 		hpd4 |= DC_HPDx_INT_EN;
7499 	}
7500 	if (rdev->irq.hpd[4]) {
7501 		DRM_DEBUG("cik_irq_set: hpd 5\n");
7502 		hpd5 |= DC_HPDx_INT_EN;
7503 	}
7504 	if (rdev->irq.hpd[5]) {
7505 		DRM_DEBUG("cik_irq_set: hpd 6\n");
7506 		hpd6 |= DC_HPDx_INT_EN;
7507 	}
7508 
7509 	if (rdev->irq.dpm_thermal) {
7510 		DRM_DEBUG("dpm thermal\n");
7511 		if (rdev->flags & RADEON_IS_IGP)
7512 			thermal_int |= THERM_INTH_MASK | THERM_INTL_MASK;
7513 		else
7514 			thermal_int |= THERM_INT_MASK_HIGH | THERM_INT_MASK_LOW;
7515 	}
7516 
7517 	WREG32(CP_INT_CNTL_RING0, cp_int_cntl);
7518 
7519 	WREG32(SDMA0_CNTL + SDMA0_REGISTER_OFFSET, dma_cntl);
7520 	WREG32(SDMA0_CNTL + SDMA1_REGISTER_OFFSET, dma_cntl1);
7521 
7522 	WREG32(CP_ME1_PIPE0_INT_CNTL, cp_m1p0);
7523 	WREG32(CP_ME1_PIPE1_INT_CNTL, cp_m1p1);
7524 	WREG32(CP_ME1_PIPE2_INT_CNTL, cp_m1p2);
7525 	WREG32(CP_ME1_PIPE3_INT_CNTL, cp_m1p3);
7526 	WREG32(CP_ME2_PIPE0_INT_CNTL, cp_m2p0);
7527 	WREG32(CP_ME2_PIPE1_INT_CNTL, cp_m2p1);
7528 	WREG32(CP_ME2_PIPE2_INT_CNTL, cp_m2p2);
7529 	WREG32(CP_ME2_PIPE3_INT_CNTL, cp_m2p3);
7530 
7531 	WREG32(GRBM_INT_CNTL, grbm_int_cntl);
7532 
7533 	WREG32(LB_INTERRUPT_MASK + EVERGREEN_CRTC0_REGISTER_OFFSET, crtc1);
7534 	WREG32(LB_INTERRUPT_MASK + EVERGREEN_CRTC1_REGISTER_OFFSET, crtc2);
7535 	if (rdev->num_crtc >= 4) {
7536 		WREG32(LB_INTERRUPT_MASK + EVERGREEN_CRTC2_REGISTER_OFFSET, crtc3);
7537 		WREG32(LB_INTERRUPT_MASK + EVERGREEN_CRTC3_REGISTER_OFFSET, crtc4);
7538 	}
7539 	if (rdev->num_crtc >= 6) {
7540 		WREG32(LB_INTERRUPT_MASK + EVERGREEN_CRTC4_REGISTER_OFFSET, crtc5);
7541 		WREG32(LB_INTERRUPT_MASK + EVERGREEN_CRTC5_REGISTER_OFFSET, crtc6);
7542 	}
7543 
7544 	if (rdev->num_crtc >= 2) {
7545 		WREG32(GRPH_INT_CONTROL + EVERGREEN_CRTC0_REGISTER_OFFSET,
7546 		       GRPH_PFLIP_INT_MASK);
7547 		WREG32(GRPH_INT_CONTROL + EVERGREEN_CRTC1_REGISTER_OFFSET,
7548 		       GRPH_PFLIP_INT_MASK);
7549 	}
7550 	if (rdev->num_crtc >= 4) {
7551 		WREG32(GRPH_INT_CONTROL + EVERGREEN_CRTC2_REGISTER_OFFSET,
7552 		       GRPH_PFLIP_INT_MASK);
7553 		WREG32(GRPH_INT_CONTROL + EVERGREEN_CRTC3_REGISTER_OFFSET,
7554 		       GRPH_PFLIP_INT_MASK);
7555 	}
7556 	if (rdev->num_crtc >= 6) {
7557 		WREG32(GRPH_INT_CONTROL + EVERGREEN_CRTC4_REGISTER_OFFSET,
7558 		       GRPH_PFLIP_INT_MASK);
7559 		WREG32(GRPH_INT_CONTROL + EVERGREEN_CRTC5_REGISTER_OFFSET,
7560 		       GRPH_PFLIP_INT_MASK);
7561 	}
7562 
7563 	WREG32(DC_HPD1_INT_CONTROL, hpd1);
7564 	WREG32(DC_HPD2_INT_CONTROL, hpd2);
7565 	WREG32(DC_HPD3_INT_CONTROL, hpd3);
7566 	WREG32(DC_HPD4_INT_CONTROL, hpd4);
7567 	WREG32(DC_HPD5_INT_CONTROL, hpd5);
7568 	WREG32(DC_HPD6_INT_CONTROL, hpd6);
7569 
7570 	if (rdev->flags & RADEON_IS_IGP)
7571 		WREG32_SMC(CG_THERMAL_INT_CTRL, thermal_int);
7572 	else
7573 		WREG32_SMC(CG_THERMAL_INT, thermal_int);
7574 
7575 	return 0;
7576 }
7577 
7578 /**
7579  * cik_irq_ack - ack interrupt sources
7580  *
7581  * @rdev: radeon_device pointer
7582  *
7583  * Ack interrupt sources on the GPU (vblanks, hpd,
7584  * etc.) (CIK).  Certain interrupts sources are sw
7585  * generated and do not require an explicit ack.
7586  */
7587 static inline void cik_irq_ack(struct radeon_device *rdev)
7588 {
7589 	u32 tmp;
7590 
7591 	rdev->irq.stat_regs.cik.disp_int = RREG32(DISP_INTERRUPT_STATUS);
7592 	rdev->irq.stat_regs.cik.disp_int_cont = RREG32(DISP_INTERRUPT_STATUS_CONTINUE);
7593 	rdev->irq.stat_regs.cik.disp_int_cont2 = RREG32(DISP_INTERRUPT_STATUS_CONTINUE2);
7594 	rdev->irq.stat_regs.cik.disp_int_cont3 = RREG32(DISP_INTERRUPT_STATUS_CONTINUE3);
7595 	rdev->irq.stat_regs.cik.disp_int_cont4 = RREG32(DISP_INTERRUPT_STATUS_CONTINUE4);
7596 	rdev->irq.stat_regs.cik.disp_int_cont5 = RREG32(DISP_INTERRUPT_STATUS_CONTINUE5);
7597 	rdev->irq.stat_regs.cik.disp_int_cont6 = RREG32(DISP_INTERRUPT_STATUS_CONTINUE6);
7598 
7599 	rdev->irq.stat_regs.cik.d1grph_int = RREG32(GRPH_INT_STATUS +
7600 		EVERGREEN_CRTC0_REGISTER_OFFSET);
7601 	rdev->irq.stat_regs.cik.d2grph_int = RREG32(GRPH_INT_STATUS +
7602 		EVERGREEN_CRTC1_REGISTER_OFFSET);
7603 	if (rdev->num_crtc >= 4) {
7604 		rdev->irq.stat_regs.cik.d3grph_int = RREG32(GRPH_INT_STATUS +
7605 			EVERGREEN_CRTC2_REGISTER_OFFSET);
7606 		rdev->irq.stat_regs.cik.d4grph_int = RREG32(GRPH_INT_STATUS +
7607 			EVERGREEN_CRTC3_REGISTER_OFFSET);
7608 	}
7609 	if (rdev->num_crtc >= 6) {
7610 		rdev->irq.stat_regs.cik.d5grph_int = RREG32(GRPH_INT_STATUS +
7611 			EVERGREEN_CRTC4_REGISTER_OFFSET);
7612 		rdev->irq.stat_regs.cik.d6grph_int = RREG32(GRPH_INT_STATUS +
7613 			EVERGREEN_CRTC5_REGISTER_OFFSET);
7614 	}
7615 
7616 	if (rdev->irq.stat_regs.cik.d1grph_int & GRPH_PFLIP_INT_OCCURRED)
7617 		WREG32(GRPH_INT_STATUS + EVERGREEN_CRTC0_REGISTER_OFFSET,
7618 		       GRPH_PFLIP_INT_CLEAR);
7619 	if (rdev->irq.stat_regs.cik.d2grph_int & GRPH_PFLIP_INT_OCCURRED)
7620 		WREG32(GRPH_INT_STATUS + EVERGREEN_CRTC1_REGISTER_OFFSET,
7621 		       GRPH_PFLIP_INT_CLEAR);
7622 	if (rdev->irq.stat_regs.cik.disp_int & LB_D1_VBLANK_INTERRUPT)
7623 		WREG32(LB_VBLANK_STATUS + EVERGREEN_CRTC0_REGISTER_OFFSET, VBLANK_ACK);
7624 	if (rdev->irq.stat_regs.cik.disp_int & LB_D1_VLINE_INTERRUPT)
7625 		WREG32(LB_VLINE_STATUS + EVERGREEN_CRTC0_REGISTER_OFFSET, VLINE_ACK);
7626 	if (rdev->irq.stat_regs.cik.disp_int_cont & LB_D2_VBLANK_INTERRUPT)
7627 		WREG32(LB_VBLANK_STATUS + EVERGREEN_CRTC1_REGISTER_OFFSET, VBLANK_ACK);
7628 	if (rdev->irq.stat_regs.cik.disp_int_cont & LB_D2_VLINE_INTERRUPT)
7629 		WREG32(LB_VLINE_STATUS + EVERGREEN_CRTC1_REGISTER_OFFSET, VLINE_ACK);
7630 
7631 	if (rdev->num_crtc >= 4) {
7632 		if (rdev->irq.stat_regs.cik.d3grph_int & GRPH_PFLIP_INT_OCCURRED)
7633 			WREG32(GRPH_INT_STATUS + EVERGREEN_CRTC2_REGISTER_OFFSET,
7634 			       GRPH_PFLIP_INT_CLEAR);
7635 		if (rdev->irq.stat_regs.cik.d4grph_int & GRPH_PFLIP_INT_OCCURRED)
7636 			WREG32(GRPH_INT_STATUS + EVERGREEN_CRTC3_REGISTER_OFFSET,
7637 			       GRPH_PFLIP_INT_CLEAR);
7638 		if (rdev->irq.stat_regs.cik.disp_int_cont2 & LB_D3_VBLANK_INTERRUPT)
7639 			WREG32(LB_VBLANK_STATUS + EVERGREEN_CRTC2_REGISTER_OFFSET, VBLANK_ACK);
7640 		if (rdev->irq.stat_regs.cik.disp_int_cont2 & LB_D3_VLINE_INTERRUPT)
7641 			WREG32(LB_VLINE_STATUS + EVERGREEN_CRTC2_REGISTER_OFFSET, VLINE_ACK);
7642 		if (rdev->irq.stat_regs.cik.disp_int_cont3 & LB_D4_VBLANK_INTERRUPT)
7643 			WREG32(LB_VBLANK_STATUS + EVERGREEN_CRTC3_REGISTER_OFFSET, VBLANK_ACK);
7644 		if (rdev->irq.stat_regs.cik.disp_int_cont3 & LB_D4_VLINE_INTERRUPT)
7645 			WREG32(LB_VLINE_STATUS + EVERGREEN_CRTC3_REGISTER_OFFSET, VLINE_ACK);
7646 	}
7647 
7648 	if (rdev->num_crtc >= 6) {
7649 		if (rdev->irq.stat_regs.cik.d5grph_int & GRPH_PFLIP_INT_OCCURRED)
7650 			WREG32(GRPH_INT_STATUS + EVERGREEN_CRTC4_REGISTER_OFFSET,
7651 			       GRPH_PFLIP_INT_CLEAR);
7652 		if (rdev->irq.stat_regs.cik.d6grph_int & GRPH_PFLIP_INT_OCCURRED)
7653 			WREG32(GRPH_INT_STATUS + EVERGREEN_CRTC5_REGISTER_OFFSET,
7654 			       GRPH_PFLIP_INT_CLEAR);
7655 		if (rdev->irq.stat_regs.cik.disp_int_cont4 & LB_D5_VBLANK_INTERRUPT)
7656 			WREG32(LB_VBLANK_STATUS + EVERGREEN_CRTC4_REGISTER_OFFSET, VBLANK_ACK);
7657 		if (rdev->irq.stat_regs.cik.disp_int_cont4 & LB_D5_VLINE_INTERRUPT)
7658 			WREG32(LB_VLINE_STATUS + EVERGREEN_CRTC4_REGISTER_OFFSET, VLINE_ACK);
7659 		if (rdev->irq.stat_regs.cik.disp_int_cont5 & LB_D6_VBLANK_INTERRUPT)
7660 			WREG32(LB_VBLANK_STATUS + EVERGREEN_CRTC5_REGISTER_OFFSET, VBLANK_ACK);
7661 		if (rdev->irq.stat_regs.cik.disp_int_cont5 & LB_D6_VLINE_INTERRUPT)
7662 			WREG32(LB_VLINE_STATUS + EVERGREEN_CRTC5_REGISTER_OFFSET, VLINE_ACK);
7663 	}
7664 
7665 	if (rdev->irq.stat_regs.cik.disp_int & DC_HPD1_INTERRUPT) {
7666 		tmp = RREG32(DC_HPD1_INT_CONTROL);
7667 		tmp |= DC_HPDx_INT_ACK;
7668 		WREG32(DC_HPD1_INT_CONTROL, tmp);
7669 	}
7670 	if (rdev->irq.stat_regs.cik.disp_int_cont & DC_HPD2_INTERRUPT) {
7671 		tmp = RREG32(DC_HPD2_INT_CONTROL);
7672 		tmp |= DC_HPDx_INT_ACK;
7673 		WREG32(DC_HPD2_INT_CONTROL, tmp);
7674 	}
7675 	if (rdev->irq.stat_regs.cik.disp_int_cont2 & DC_HPD3_INTERRUPT) {
7676 		tmp = RREG32(DC_HPD3_INT_CONTROL);
7677 		tmp |= DC_HPDx_INT_ACK;
7678 		WREG32(DC_HPD3_INT_CONTROL, tmp);
7679 	}
7680 	if (rdev->irq.stat_regs.cik.disp_int_cont3 & DC_HPD4_INTERRUPT) {
7681 		tmp = RREG32(DC_HPD4_INT_CONTROL);
7682 		tmp |= DC_HPDx_INT_ACK;
7683 		WREG32(DC_HPD4_INT_CONTROL, tmp);
7684 	}
7685 	if (rdev->irq.stat_regs.cik.disp_int_cont4 & DC_HPD5_INTERRUPT) {
7686 		tmp = RREG32(DC_HPD5_INT_CONTROL);
7687 		tmp |= DC_HPDx_INT_ACK;
7688 		WREG32(DC_HPD5_INT_CONTROL, tmp);
7689 	}
7690 	if (rdev->irq.stat_regs.cik.disp_int_cont5 & DC_HPD6_INTERRUPT) {
7691 		tmp = RREG32(DC_HPD5_INT_CONTROL);
7692 		tmp |= DC_HPDx_INT_ACK;
7693 		WREG32(DC_HPD6_INT_CONTROL, tmp);
7694 	}
7695 }
7696 
7697 /**
7698  * cik_irq_disable - disable interrupts
7699  *
7700  * @rdev: radeon_device pointer
7701  *
7702  * Disable interrupts on the hw (CIK).
7703  */
7704 static void cik_irq_disable(struct radeon_device *rdev)
7705 {
7706 	cik_disable_interrupts(rdev);
7707 	/* Wait and acknowledge irq */
7708 	mdelay(1);
7709 	cik_irq_ack(rdev);
7710 	cik_disable_interrupt_state(rdev);
7711 }
7712 
7713 /**
7714  * cik_irq_disable - disable interrupts for suspend
7715  *
7716  * @rdev: radeon_device pointer
7717  *
7718  * Disable interrupts and stop the RLC (CIK).
7719  * Used for suspend.
7720  */
7721 static void cik_irq_suspend(struct radeon_device *rdev)
7722 {
7723 	cik_irq_disable(rdev);
7724 	cik_rlc_stop(rdev);
7725 }
7726 
7727 /**
7728  * cik_irq_fini - tear down interrupt support
7729  *
7730  * @rdev: radeon_device pointer
7731  *
7732  * Disable interrupts on the hw and free the IH ring
7733  * buffer (CIK).
7734  * Used for driver unload.
7735  */
7736 static void cik_irq_fini(struct radeon_device *rdev)
7737 {
7738 	cik_irq_suspend(rdev);
7739 	r600_ih_ring_fini(rdev);
7740 }
7741 
7742 /**
7743  * cik_get_ih_wptr - get the IH ring buffer wptr
7744  *
7745  * @rdev: radeon_device pointer
7746  *
7747  * Get the IH ring buffer wptr from either the register
7748  * or the writeback memory buffer (CIK).  Also check for
7749  * ring buffer overflow and deal with it.
7750  * Used by cik_irq_process().
7751  * Returns the value of the wptr.
7752  */
7753 static inline u32 cik_get_ih_wptr(struct radeon_device *rdev)
7754 {
7755 	u32 wptr, tmp;
7756 
7757 	if (rdev->wb.enabled)
7758 		wptr = le32_to_cpu(rdev->wb.wb[R600_WB_IH_WPTR_OFFSET/4]);
7759 	else
7760 		wptr = RREG32(IH_RB_WPTR);
7761 
7762 	if (wptr & RB_OVERFLOW) {
7763 		wptr &= ~RB_OVERFLOW;
7764 		/* When a ring buffer overflow happen start parsing interrupt
7765 		 * from the last not overwritten vector (wptr + 16). Hopefully
7766 		 * this should allow us to catchup.
7767 		 */
7768 		dev_warn(rdev->dev, "IH ring buffer overflow (0x%08X, 0x%08X, 0x%08X)\n",
7769 			 wptr, rdev->ih.rptr, (wptr + 16) & rdev->ih.ptr_mask);
7770 		rdev->ih.rptr = (wptr + 16) & rdev->ih.ptr_mask;
7771 		tmp = RREG32(IH_RB_CNTL);
7772 		tmp |= IH_WPTR_OVERFLOW_CLEAR;
7773 		WREG32(IH_RB_CNTL, tmp);
7774 	}
7775 	return (wptr & rdev->ih.ptr_mask);
7776 }
7777 
7778 /*        CIK IV Ring
7779  * Each IV ring entry is 128 bits:
7780  * [7:0]    - interrupt source id
7781  * [31:8]   - reserved
7782  * [59:32]  - interrupt source data
7783  * [63:60]  - reserved
7784  * [71:64]  - RINGID
7785  *            CP:
7786  *            ME_ID [1:0], PIPE_ID[1:0], QUEUE_ID[2:0]
7787  *            QUEUE_ID - for compute, which of the 8 queues owned by the dispatcher
7788  *                     - for gfx, hw shader state (0=PS...5=LS, 6=CS)
7789  *            ME_ID - 0 = gfx, 1 = first 4 CS pipes, 2 = second 4 CS pipes
7790  *            PIPE_ID - ME0 0=3D
7791  *                    - ME1&2 compute dispatcher (4 pipes each)
7792  *            SDMA:
7793  *            INSTANCE_ID [1:0], QUEUE_ID[1:0]
7794  *            INSTANCE_ID - 0 = sdma0, 1 = sdma1
7795  *            QUEUE_ID - 0 = gfx, 1 = rlc0, 2 = rlc1
7796  * [79:72]  - VMID
7797  * [95:80]  - PASID
7798  * [127:96] - reserved
7799  */
7800 /**
7801  * cik_irq_process - interrupt handler
7802  *
7803  * @rdev: radeon_device pointer
7804  *
7805  * Interrupt hander (CIK).  Walk the IH ring,
7806  * ack interrupts and schedule work to handle
7807  * interrupt events.
7808  * Returns irq process return code.
7809  */
7810 irqreturn_t cik_irq_process(struct radeon_device *rdev)
7811 {
7812 	struct radeon_ring *cp1_ring = &rdev->ring[CAYMAN_RING_TYPE_CP1_INDEX];
7813 	struct radeon_ring *cp2_ring = &rdev->ring[CAYMAN_RING_TYPE_CP2_INDEX];
7814 	u32 wptr;
7815 	u32 rptr;
7816 	u32 src_id, src_data, ring_id;
7817 	u8 me_id, pipe_id, queue_id;
7818 	u32 ring_index;
7819 	bool queue_hotplug = false;
7820 	bool queue_reset = false;
7821 	u32 addr, status, mc_client;
7822 	bool queue_thermal = false;
7823 
7824 	if (!rdev->ih.enabled || rdev->shutdown)
7825 		return IRQ_NONE;
7826 
7827 	wptr = cik_get_ih_wptr(rdev);
7828 
7829 restart_ih:
7830 	/* is somebody else already processing irqs? */
7831 	if (atomic_xchg(&rdev->ih.lock, 1))
7832 		return IRQ_NONE;
7833 
7834 	rptr = rdev->ih.rptr;
7835 	DRM_DEBUG_VBLANK("cik_irq_process start: rptr %d, wptr %d\n", rptr, wptr);
7836 
7837 	/* Order reading of wptr vs. reading of IH ring data */
7838 	rmb();
7839 
7840 	/* display interrupts */
7841 	cik_irq_ack(rdev);
7842 
7843 	while (rptr != wptr) {
7844 		/* wptr/rptr are in bytes! */
7845 		ring_index = rptr / 4;
7846 		src_id =  le32_to_cpu(rdev->ih.ring[ring_index]) & 0xff;
7847 		src_data = le32_to_cpu(rdev->ih.ring[ring_index + 1]) & 0xfffffff;
7848 		ring_id = le32_to_cpu(rdev->ih.ring[ring_index + 2]) & 0xff;
7849 
7850 		switch (src_id) {
7851 		case 1: /* D1 vblank/vline */
7852 			switch (src_data) {
7853 			case 0: /* D1 vblank */
7854 				if (rdev->irq.stat_regs.cik.disp_int & LB_D1_VBLANK_INTERRUPT) {
7855 					if (rdev->irq.crtc_vblank_int[0]) {
7856 						drm_handle_vblank(rdev->ddev, 0);
7857 						rdev->pm.vblank_sync = true;
7858 						wake_up(&rdev->irq.vblank_queue);
7859 					}
7860 					if (atomic_read(&rdev->irq.pflip[0]))
7861 						radeon_crtc_handle_vblank(rdev, 0);
7862 					rdev->irq.stat_regs.cik.disp_int &= ~LB_D1_VBLANK_INTERRUPT;
7863 					DRM_DEBUG_VBLANK("IH: D1 vblank\n");
7864 				}
7865 				break;
7866 			case 1: /* D1 vline */
7867 				if (rdev->irq.stat_regs.cik.disp_int & LB_D1_VLINE_INTERRUPT) {
7868 					rdev->irq.stat_regs.cik.disp_int &= ~LB_D1_VLINE_INTERRUPT;
7869 					DRM_DEBUG_VBLANK("IH: D1 vline\n");
7870 				}
7871 				break;
7872 			default:
7873 				DRM_DEBUG("Unhandled interrupt: %d %d\n", src_id, src_data);
7874 				break;
7875 			}
7876 			break;
7877 		case 2: /* D2 vblank/vline */
7878 			switch (src_data) {
7879 			case 0: /* D2 vblank */
7880 				if (rdev->irq.stat_regs.cik.disp_int_cont & LB_D2_VBLANK_INTERRUPT) {
7881 					if (rdev->irq.crtc_vblank_int[1]) {
7882 						drm_handle_vblank(rdev->ddev, 1);
7883 						rdev->pm.vblank_sync = true;
7884 						wake_up(&rdev->irq.vblank_queue);
7885 					}
7886 					if (atomic_read(&rdev->irq.pflip[1]))
7887 						radeon_crtc_handle_vblank(rdev, 1);
7888 					rdev->irq.stat_regs.cik.disp_int_cont &= ~LB_D2_VBLANK_INTERRUPT;
7889 					DRM_DEBUG_VBLANK("IH: D2 vblank\n");
7890 				}
7891 				break;
7892 			case 1: /* D2 vline */
7893 				if (rdev->irq.stat_regs.cik.disp_int_cont & LB_D2_VLINE_INTERRUPT) {
7894 					rdev->irq.stat_regs.cik.disp_int_cont &= ~LB_D2_VLINE_INTERRUPT;
7895 					DRM_DEBUG_VBLANK("IH: D2 vline\n");
7896 				}
7897 				break;
7898 			default:
7899 				DRM_DEBUG("Unhandled interrupt: %d %d\n", src_id, src_data);
7900 				break;
7901 			}
7902 			break;
7903 		case 3: /* D3 vblank/vline */
7904 			switch (src_data) {
7905 			case 0: /* D3 vblank */
7906 				if (rdev->irq.stat_regs.cik.disp_int_cont2 & LB_D3_VBLANK_INTERRUPT) {
7907 					if (rdev->irq.crtc_vblank_int[2]) {
7908 						drm_handle_vblank(rdev->ddev, 2);
7909 						rdev->pm.vblank_sync = true;
7910 						wake_up(&rdev->irq.vblank_queue);
7911 					}
7912 					if (atomic_read(&rdev->irq.pflip[2]))
7913 						radeon_crtc_handle_vblank(rdev, 2);
7914 					rdev->irq.stat_regs.cik.disp_int_cont2 &= ~LB_D3_VBLANK_INTERRUPT;
7915 					DRM_DEBUG_VBLANK("IH: D3 vblank\n");
7916 				}
7917 				break;
7918 			case 1: /* D3 vline */
7919 				if (rdev->irq.stat_regs.cik.disp_int_cont2 & LB_D3_VLINE_INTERRUPT) {
7920 					rdev->irq.stat_regs.cik.disp_int_cont2 &= ~LB_D3_VLINE_INTERRUPT;
7921 					DRM_DEBUG_VBLANK("IH: D3 vline\n");
7922 				}
7923 				break;
7924 			default:
7925 				DRM_DEBUG("Unhandled interrupt: %d %d\n", src_id, src_data);
7926 				break;
7927 			}
7928 			break;
7929 		case 4: /* D4 vblank/vline */
7930 			switch (src_data) {
7931 			case 0: /* D4 vblank */
7932 				if (rdev->irq.stat_regs.cik.disp_int_cont3 & LB_D4_VBLANK_INTERRUPT) {
7933 					if (rdev->irq.crtc_vblank_int[3]) {
7934 						drm_handle_vblank(rdev->ddev, 3);
7935 						rdev->pm.vblank_sync = true;
7936 						wake_up(&rdev->irq.vblank_queue);
7937 					}
7938 					if (atomic_read(&rdev->irq.pflip[3]))
7939 						radeon_crtc_handle_vblank(rdev, 3);
7940 					rdev->irq.stat_regs.cik.disp_int_cont3 &= ~LB_D4_VBLANK_INTERRUPT;
7941 					DRM_DEBUG_VBLANK("IH: D4 vblank\n");
7942 				}
7943 				break;
7944 			case 1: /* D4 vline */
7945 				if (rdev->irq.stat_regs.cik.disp_int_cont3 & LB_D4_VLINE_INTERRUPT) {
7946 					rdev->irq.stat_regs.cik.disp_int_cont3 &= ~LB_D4_VLINE_INTERRUPT;
7947 					DRM_DEBUG_VBLANK("IH: D4 vline\n");
7948 				}
7949 				break;
7950 			default:
7951 				DRM_DEBUG("Unhandled interrupt: %d %d\n", src_id, src_data);
7952 				break;
7953 			}
7954 			break;
7955 		case 5: /* D5 vblank/vline */
7956 			switch (src_data) {
7957 			case 0: /* D5 vblank */
7958 				if (rdev->irq.stat_regs.cik.disp_int_cont4 & LB_D5_VBLANK_INTERRUPT) {
7959 					if (rdev->irq.crtc_vblank_int[4]) {
7960 						drm_handle_vblank(rdev->ddev, 4);
7961 						rdev->pm.vblank_sync = true;
7962 						wake_up(&rdev->irq.vblank_queue);
7963 					}
7964 					if (atomic_read(&rdev->irq.pflip[4]))
7965 						radeon_crtc_handle_vblank(rdev, 4);
7966 					rdev->irq.stat_regs.cik.disp_int_cont4 &= ~LB_D5_VBLANK_INTERRUPT;
7967 					DRM_DEBUG_VBLANK("IH: D5 vblank\n");
7968 				}
7969 				break;
7970 			case 1: /* D5 vline */
7971 				if (rdev->irq.stat_regs.cik.disp_int_cont4 & LB_D5_VLINE_INTERRUPT) {
7972 					rdev->irq.stat_regs.cik.disp_int_cont4 &= ~LB_D5_VLINE_INTERRUPT;
7973 					DRM_DEBUG_VBLANK("IH: D5 vline\n");
7974 				}
7975 				break;
7976 			default:
7977 				DRM_DEBUG("Unhandled interrupt: %d %d\n", src_id, src_data);
7978 				break;
7979 			}
7980 			break;
7981 		case 6: /* D6 vblank/vline */
7982 			switch (src_data) {
7983 			case 0: /* D6 vblank */
7984 				if (rdev->irq.stat_regs.cik.disp_int_cont5 & LB_D6_VBLANK_INTERRUPT) {
7985 					if (rdev->irq.crtc_vblank_int[5]) {
7986 						drm_handle_vblank(rdev->ddev, 5);
7987 						rdev->pm.vblank_sync = true;
7988 						wake_up(&rdev->irq.vblank_queue);
7989 					}
7990 					if (atomic_read(&rdev->irq.pflip[5]))
7991 						radeon_crtc_handle_vblank(rdev, 5);
7992 					rdev->irq.stat_regs.cik.disp_int_cont5 &= ~LB_D6_VBLANK_INTERRUPT;
7993 					DRM_DEBUG_VBLANK("IH: D6 vblank\n");
7994 				}
7995 				break;
7996 			case 1: /* D6 vline */
7997 				if (rdev->irq.stat_regs.cik.disp_int_cont5 & LB_D6_VLINE_INTERRUPT) {
7998 					rdev->irq.stat_regs.cik.disp_int_cont5 &= ~LB_D6_VLINE_INTERRUPT;
7999 					DRM_DEBUG_VBLANK("IH: D6 vline\n");
8000 				}
8001 				break;
8002 			default:
8003 				DRM_DEBUG("Unhandled interrupt: %d %d\n", src_id, src_data);
8004 				break;
8005 			}
8006 			break;
8007 		case 8: /* D1 page flip */
8008 		case 10: /* D2 page flip */
8009 		case 12: /* D3 page flip */
8010 		case 14: /* D4 page flip */
8011 		case 16: /* D5 page flip */
8012 		case 18: /* D6 page flip */
8013 			DRM_DEBUG_VBLANK("IH: D%d flip\n", ((src_id - 8) >> 1) + 1);
8014 			if (radeon_use_pflipirq > 0)
8015 				radeon_crtc_handle_flip(rdev, (src_id - 8) >> 1);
8016 			break;
8017 		case 42: /* HPD hotplug */
8018 			switch (src_data) {
8019 			case 0:
8020 				if (rdev->irq.stat_regs.cik.disp_int & DC_HPD1_INTERRUPT) {
8021 					rdev->irq.stat_regs.cik.disp_int &= ~DC_HPD1_INTERRUPT;
8022 					queue_hotplug = true;
8023 					DRM_DEBUG("IH: HPD1\n");
8024 				}
8025 				break;
8026 			case 1:
8027 				if (rdev->irq.stat_regs.cik.disp_int_cont & DC_HPD2_INTERRUPT) {
8028 					rdev->irq.stat_regs.cik.disp_int_cont &= ~DC_HPD2_INTERRUPT;
8029 					queue_hotplug = true;
8030 					DRM_DEBUG("IH: HPD2\n");
8031 				}
8032 				break;
8033 			case 2:
8034 				if (rdev->irq.stat_regs.cik.disp_int_cont2 & DC_HPD3_INTERRUPT) {
8035 					rdev->irq.stat_regs.cik.disp_int_cont2 &= ~DC_HPD3_INTERRUPT;
8036 					queue_hotplug = true;
8037 					DRM_DEBUG("IH: HPD3\n");
8038 				}
8039 				break;
8040 			case 3:
8041 				if (rdev->irq.stat_regs.cik.disp_int_cont3 & DC_HPD4_INTERRUPT) {
8042 					rdev->irq.stat_regs.cik.disp_int_cont3 &= ~DC_HPD4_INTERRUPT;
8043 					queue_hotplug = true;
8044 					DRM_DEBUG("IH: HPD4\n");
8045 				}
8046 				break;
8047 			case 4:
8048 				if (rdev->irq.stat_regs.cik.disp_int_cont4 & DC_HPD5_INTERRUPT) {
8049 					rdev->irq.stat_regs.cik.disp_int_cont4 &= ~DC_HPD5_INTERRUPT;
8050 					queue_hotplug = true;
8051 					DRM_DEBUG("IH: HPD5\n");
8052 				}
8053 				break;
8054 			case 5:
8055 				if (rdev->irq.stat_regs.cik.disp_int_cont5 & DC_HPD6_INTERRUPT) {
8056 					rdev->irq.stat_regs.cik.disp_int_cont5 &= ~DC_HPD6_INTERRUPT;
8057 					queue_hotplug = true;
8058 					DRM_DEBUG("IH: HPD6\n");
8059 				}
8060 				break;
8061 			default:
8062 				DRM_DEBUG("Unhandled interrupt: %d %d\n", src_id, src_data);
8063 				break;
8064 			}
8065 			break;
8066 		case 124: /* UVD */
8067 			DRM_DEBUG("IH: UVD int: 0x%08x\n", src_data);
8068 			radeon_fence_process(rdev, R600_RING_TYPE_UVD_INDEX);
8069 			break;
8070 		case 146:
8071 		case 147:
8072 			addr = RREG32(VM_CONTEXT1_PROTECTION_FAULT_ADDR);
8073 			status = RREG32(VM_CONTEXT1_PROTECTION_FAULT_STATUS);
8074 			mc_client = RREG32(VM_CONTEXT1_PROTECTION_FAULT_MCCLIENT);
8075 			/* reset addr and status */
8076 			WREG32_P(VM_CONTEXT1_CNTL2, 1, ~1);
8077 			if (addr == 0x0 && status == 0x0)
8078 				break;
8079 			dev_err(rdev->dev, "GPU fault detected: %d 0x%08x\n", src_id, src_data);
8080 			dev_err(rdev->dev, "  VM_CONTEXT1_PROTECTION_FAULT_ADDR   0x%08X\n",
8081 				addr);
8082 			dev_err(rdev->dev, "  VM_CONTEXT1_PROTECTION_FAULT_STATUS 0x%08X\n",
8083 				status);
8084 			cik_vm_decode_fault(rdev, status, addr, mc_client);
8085 			break;
8086 		case 167: /* VCE */
8087 			DRM_DEBUG("IH: VCE int: 0x%08x\n", src_data);
8088 			switch (src_data) {
8089 			case 0:
8090 				radeon_fence_process(rdev, TN_RING_TYPE_VCE1_INDEX);
8091 				break;
8092 			case 1:
8093 				radeon_fence_process(rdev, TN_RING_TYPE_VCE2_INDEX);
8094 				break;
8095 			default:
8096 				DRM_ERROR("Unhandled interrupt: %d %d\n", src_id, src_data);
8097 				break;
8098 			}
8099 			break;
8100 		case 176: /* GFX RB CP_INT */
8101 		case 177: /* GFX IB CP_INT */
8102 			radeon_fence_process(rdev, RADEON_RING_TYPE_GFX_INDEX);
8103 			break;
8104 		case 181: /* CP EOP event */
8105 			DRM_DEBUG("IH: CP EOP\n");
8106 			/* XXX check the bitfield order! */
8107 			me_id = (ring_id & 0x60) >> 5;
8108 			pipe_id = (ring_id & 0x18) >> 3;
8109 			queue_id = (ring_id & 0x7) >> 0;
8110 			switch (me_id) {
8111 			case 0:
8112 				radeon_fence_process(rdev, RADEON_RING_TYPE_GFX_INDEX);
8113 				break;
8114 			case 1:
8115 			case 2:
8116 				if ((cp1_ring->me == me_id) & (cp1_ring->pipe == pipe_id))
8117 					radeon_fence_process(rdev, CAYMAN_RING_TYPE_CP1_INDEX);
8118 				if ((cp2_ring->me == me_id) & (cp2_ring->pipe == pipe_id))
8119 					radeon_fence_process(rdev, CAYMAN_RING_TYPE_CP2_INDEX);
8120 				break;
8121 			}
8122 			break;
8123 		case 184: /* CP Privileged reg access */
8124 			DRM_ERROR("Illegal register access in command stream\n");
8125 			/* XXX check the bitfield order! */
8126 			me_id = (ring_id & 0x60) >> 5;
8127 			pipe_id = (ring_id & 0x18) >> 3;
8128 			queue_id = (ring_id & 0x7) >> 0;
8129 			switch (me_id) {
8130 			case 0:
8131 				/* This results in a full GPU reset, but all we need to do is soft
8132 				 * reset the CP for gfx
8133 				 */
8134 				queue_reset = true;
8135 				break;
8136 			case 1:
8137 				/* XXX compute */
8138 				queue_reset = true;
8139 				break;
8140 			case 2:
8141 				/* XXX compute */
8142 				queue_reset = true;
8143 				break;
8144 			}
8145 			break;
8146 		case 185: /* CP Privileged inst */
8147 			DRM_ERROR("Illegal instruction in command stream\n");
8148 			/* XXX check the bitfield order! */
8149 			me_id = (ring_id & 0x60) >> 5;
8150 			pipe_id = (ring_id & 0x18) >> 3;
8151 			queue_id = (ring_id & 0x7) >> 0;
8152 			switch (me_id) {
8153 			case 0:
8154 				/* This results in a full GPU reset, but all we need to do is soft
8155 				 * reset the CP for gfx
8156 				 */
8157 				queue_reset = true;
8158 				break;
8159 			case 1:
8160 				/* XXX compute */
8161 				queue_reset = true;
8162 				break;
8163 			case 2:
8164 				/* XXX compute */
8165 				queue_reset = true;
8166 				break;
8167 			}
8168 			break;
8169 		case 224: /* SDMA trap event */
8170 			/* XXX check the bitfield order! */
8171 			me_id = (ring_id & 0x3) >> 0;
8172 			queue_id = (ring_id & 0xc) >> 2;
8173 			DRM_DEBUG("IH: SDMA trap\n");
8174 			switch (me_id) {
8175 			case 0:
8176 				switch (queue_id) {
8177 				case 0:
8178 					radeon_fence_process(rdev, R600_RING_TYPE_DMA_INDEX);
8179 					break;
8180 				case 1:
8181 					/* XXX compute */
8182 					break;
8183 				case 2:
8184 					/* XXX compute */
8185 					break;
8186 				}
8187 				break;
8188 			case 1:
8189 				switch (queue_id) {
8190 				case 0:
8191 					radeon_fence_process(rdev, CAYMAN_RING_TYPE_DMA1_INDEX);
8192 					break;
8193 				case 1:
8194 					/* XXX compute */
8195 					break;
8196 				case 2:
8197 					/* XXX compute */
8198 					break;
8199 				}
8200 				break;
8201 			}
8202 			break;
8203 		case 230: /* thermal low to high */
8204 			DRM_DEBUG("IH: thermal low to high\n");
8205 			rdev->pm.dpm.thermal.high_to_low = false;
8206 			queue_thermal = true;
8207 			break;
8208 		case 231: /* thermal high to low */
8209 			DRM_DEBUG("IH: thermal high to low\n");
8210 			rdev->pm.dpm.thermal.high_to_low = true;
8211 			queue_thermal = true;
8212 			break;
8213 		case 233: /* GUI IDLE */
8214 			DRM_DEBUG("IH: GUI idle\n");
8215 			break;
8216 		case 241: /* SDMA Privileged inst */
8217 		case 247: /* SDMA Privileged inst */
8218 			DRM_ERROR("Illegal instruction in SDMA command stream\n");
8219 			/* XXX check the bitfield order! */
8220 			me_id = (ring_id & 0x3) >> 0;
8221 			queue_id = (ring_id & 0xc) >> 2;
8222 			switch (me_id) {
8223 			case 0:
8224 				switch (queue_id) {
8225 				case 0:
8226 					queue_reset = true;
8227 					break;
8228 				case 1:
8229 					/* XXX compute */
8230 					queue_reset = true;
8231 					break;
8232 				case 2:
8233 					/* XXX compute */
8234 					queue_reset = true;
8235 					break;
8236 				}
8237 				break;
8238 			case 1:
8239 				switch (queue_id) {
8240 				case 0:
8241 					queue_reset = true;
8242 					break;
8243 				case 1:
8244 					/* XXX compute */
8245 					queue_reset = true;
8246 					break;
8247 				case 2:
8248 					/* XXX compute */
8249 					queue_reset = true;
8250 					break;
8251 				}
8252 				break;
8253 			}
8254 			break;
8255 		default:
8256 			DRM_DEBUG("Unhandled interrupt: %d %d\n", src_id, src_data);
8257 			break;
8258 		}
8259 
8260 		/* wptr/rptr are in bytes! */
8261 		rptr += 16;
8262 		rptr &= rdev->ih.ptr_mask;
8263 		WREG32(IH_RB_RPTR, rptr);
8264 	}
8265 	if (queue_hotplug)
8266 		taskqueue_enqueue(rdev->tq, &rdev->hotplug_work);
8267 	if (queue_reset) {
8268 		rdev->needs_reset = true;
8269 		wake_up_all(&rdev->fence_queue);
8270 	}
8271 	if (queue_thermal)
8272 		taskqueue_enqueue(rdev->tq, &rdev->pm.dpm.thermal.work);
8273 	rdev->ih.rptr = rptr;
8274 	atomic_set(&rdev->ih.lock, 0);
8275 
8276 	/* make sure wptr hasn't changed while processing */
8277 	wptr = cik_get_ih_wptr(rdev);
8278 	if (wptr != rptr)
8279 		goto restart_ih;
8280 
8281 	return IRQ_HANDLED;
8282 }
8283 
8284 /*
8285  * startup/shutdown callbacks
8286  */
8287 /**
8288  * cik_startup - program the asic to a functional state
8289  *
8290  * @rdev: radeon_device pointer
8291  *
8292  * Programs the asic to a functional state (CIK).
8293  * Called by cik_init() and cik_resume().
8294  * Returns 0 for success, error for failure.
8295  */
8296 static int cik_startup(struct radeon_device *rdev)
8297 {
8298 	struct radeon_ring *ring;
8299 	u32 nop;
8300 	int r;
8301 
8302 	/* enable pcie gen2/3 link */
8303 	cik_pcie_gen3_enable(rdev);
8304 	/* enable aspm */
8305 	cik_program_aspm(rdev);
8306 
8307 	/* scratch needs to be initialized before MC */
8308 	r = r600_vram_scratch_init(rdev);
8309 	if (r)
8310 		return r;
8311 
8312 	cik_mc_program(rdev);
8313 
8314 	if (!(rdev->flags & RADEON_IS_IGP) && !rdev->pm.dpm_enabled) {
8315 		r = ci_mc_load_microcode(rdev);
8316 		if (r) {
8317 			DRM_ERROR("Failed to load MC firmware!\n");
8318 			return r;
8319 		}
8320 	}
8321 
8322 	r = cik_pcie_gart_enable(rdev);
8323 	if (r)
8324 		return r;
8325 	cik_gpu_init(rdev);
8326 
8327 	/* allocate rlc buffers */
8328 	if (rdev->flags & RADEON_IS_IGP) {
8329 		if (rdev->family == CHIP_KAVERI) {
8330 			rdev->rlc.reg_list = spectre_rlc_save_restore_register_list;
8331 			rdev->rlc.reg_list_size =
8332 				(u32)ARRAY_SIZE(spectre_rlc_save_restore_register_list);
8333 		} else {
8334 			rdev->rlc.reg_list = kalindi_rlc_save_restore_register_list;
8335 			rdev->rlc.reg_list_size =
8336 				(u32)ARRAY_SIZE(kalindi_rlc_save_restore_register_list);
8337 		}
8338 	}
8339 	rdev->rlc.cs_data = ci_cs_data;
8340 	rdev->rlc.cp_table_size = CP_ME_TABLE_SIZE * 5 * 4;
8341 	r = sumo_rlc_init(rdev);
8342 	if (r) {
8343 		DRM_ERROR("Failed to init rlc BOs!\n");
8344 		return r;
8345 	}
8346 
8347 	/* allocate wb buffer */
8348 	r = radeon_wb_init(rdev);
8349 	if (r)
8350 		return r;
8351 
8352 	/* allocate mec buffers */
8353 	r = cik_mec_init(rdev);
8354 	if (r) {
8355 		DRM_ERROR("Failed to init MEC BOs!\n");
8356 		return r;
8357 	}
8358 
8359 	r = radeon_fence_driver_start_ring(rdev, RADEON_RING_TYPE_GFX_INDEX);
8360 	if (r) {
8361 		dev_err(rdev->dev, "failed initializing CP fences (%d).\n", r);
8362 		return r;
8363 	}
8364 
8365 	r = radeon_fence_driver_start_ring(rdev, CAYMAN_RING_TYPE_CP1_INDEX);
8366 	if (r) {
8367 		dev_err(rdev->dev, "failed initializing CP fences (%d).\n", r);
8368 		return r;
8369 	}
8370 
8371 	r = radeon_fence_driver_start_ring(rdev, CAYMAN_RING_TYPE_CP2_INDEX);
8372 	if (r) {
8373 		dev_err(rdev->dev, "failed initializing CP fences (%d).\n", r);
8374 		return r;
8375 	}
8376 
8377 	r = radeon_fence_driver_start_ring(rdev, R600_RING_TYPE_DMA_INDEX);
8378 	if (r) {
8379 		dev_err(rdev->dev, "failed initializing DMA fences (%d).\n", r);
8380 		return r;
8381 	}
8382 
8383 	r = radeon_fence_driver_start_ring(rdev, CAYMAN_RING_TYPE_DMA1_INDEX);
8384 	if (r) {
8385 		dev_err(rdev->dev, "failed initializing DMA fences (%d).\n", r);
8386 		return r;
8387 	}
8388 
8389 	r = radeon_uvd_resume(rdev);
8390 	if (!r) {
8391 		r = uvd_v4_2_resume(rdev);
8392 		if (!r) {
8393 			r = radeon_fence_driver_start_ring(rdev,
8394 							   R600_RING_TYPE_UVD_INDEX);
8395 			if (r)
8396 				dev_err(rdev->dev, "UVD fences init error (%d).\n", r);
8397 		}
8398 	}
8399 	if (r)
8400 		rdev->ring[R600_RING_TYPE_UVD_INDEX].ring_size = 0;
8401 
8402 	r = radeon_vce_resume(rdev);
8403 	if (!r) {
8404 		r = vce_v2_0_resume(rdev);
8405 		if (!r)
8406 			r = radeon_fence_driver_start_ring(rdev,
8407 							   TN_RING_TYPE_VCE1_INDEX);
8408 		if (!r)
8409 			r = radeon_fence_driver_start_ring(rdev,
8410 							   TN_RING_TYPE_VCE2_INDEX);
8411 	}
8412 	if (r) {
8413 		dev_err(rdev->dev, "VCE init error (%d).\n", r);
8414 		rdev->ring[TN_RING_TYPE_VCE1_INDEX].ring_size = 0;
8415 		rdev->ring[TN_RING_TYPE_VCE2_INDEX].ring_size = 0;
8416 	}
8417 
8418 	/* Enable IRQ */
8419 	if (!rdev->irq.installed) {
8420 		r = radeon_irq_kms_init(rdev);
8421 		if (r)
8422 			return r;
8423 	}
8424 
8425 	r = cik_irq_init(rdev);
8426 	if (r) {
8427 		DRM_ERROR("radeon: IH init failed (%d).\n", r);
8428 		radeon_irq_kms_fini(rdev);
8429 		return r;
8430 	}
8431 	cik_irq_set(rdev);
8432 
8433 	if (rdev->family == CHIP_HAWAII) {
8434 		if (rdev->new_fw)
8435 			nop = PACKET3(PACKET3_NOP, 0x3FFF);
8436 		else
8437 			nop = RADEON_CP_PACKET2;
8438 	} else {
8439 		nop = PACKET3(PACKET3_NOP, 0x3FFF);
8440 	}
8441 
8442 	ring = &rdev->ring[RADEON_RING_TYPE_GFX_INDEX];
8443 	r = radeon_ring_init(rdev, ring, ring->ring_size, RADEON_WB_CP_RPTR_OFFSET,
8444 			     nop);
8445 	if (r)
8446 		return r;
8447 
8448 	/* set up the compute queues */
8449 	/* type-2 packets are deprecated on MEC, use type-3 instead */
8450 	ring = &rdev->ring[CAYMAN_RING_TYPE_CP1_INDEX];
8451 	r = radeon_ring_init(rdev, ring, ring->ring_size, RADEON_WB_CP1_RPTR_OFFSET,
8452 			     nop);
8453 	if (r)
8454 		return r;
8455 	ring->me = 1; /* first MEC */
8456 	ring->pipe = 0; /* first pipe */
8457 	ring->queue = 0; /* first queue */
8458 	ring->wptr_offs = CIK_WB_CP1_WPTR_OFFSET;
8459 
8460 	/* type-2 packets are deprecated on MEC, use type-3 instead */
8461 	ring = &rdev->ring[CAYMAN_RING_TYPE_CP2_INDEX];
8462 	r = radeon_ring_init(rdev, ring, ring->ring_size, RADEON_WB_CP2_RPTR_OFFSET,
8463 			     nop);
8464 	if (r)
8465 		return r;
8466 	/* dGPU only have 1 MEC */
8467 	ring->me = 1; /* first MEC */
8468 	ring->pipe = 0; /* first pipe */
8469 	ring->queue = 1; /* second queue */
8470 	ring->wptr_offs = CIK_WB_CP2_WPTR_OFFSET;
8471 
8472 	ring = &rdev->ring[R600_RING_TYPE_DMA_INDEX];
8473 	r = radeon_ring_init(rdev, ring, ring->ring_size, R600_WB_DMA_RPTR_OFFSET,
8474 			     SDMA_PACKET(SDMA_OPCODE_NOP, 0, 0));
8475 	if (r)
8476 		return r;
8477 
8478 	ring = &rdev->ring[CAYMAN_RING_TYPE_DMA1_INDEX];
8479 	r = radeon_ring_init(rdev, ring, ring->ring_size, CAYMAN_WB_DMA1_RPTR_OFFSET,
8480 			     SDMA_PACKET(SDMA_OPCODE_NOP, 0, 0));
8481 	if (r)
8482 		return r;
8483 
8484 	r = cik_cp_resume(rdev);
8485 	if (r)
8486 		return r;
8487 
8488 	r = cik_sdma_resume(rdev);
8489 	if (r)
8490 		return r;
8491 
8492 	ring = &rdev->ring[R600_RING_TYPE_UVD_INDEX];
8493 	if (ring->ring_size) {
8494 		r = radeon_ring_init(rdev, ring, ring->ring_size, 0,
8495 				     RADEON_CP_PACKET2);
8496 		if (!r)
8497 			r = uvd_v1_0_init(rdev);
8498 		if (r)
8499 			DRM_ERROR("radeon: failed initializing UVD (%d).\n", r);
8500 	}
8501 
8502 	r = -ENOENT;
8503 
8504 	ring = &rdev->ring[TN_RING_TYPE_VCE1_INDEX];
8505 	if (ring->ring_size)
8506 		r = radeon_ring_init(rdev, ring, ring->ring_size, 0,
8507 				     VCE_CMD_NO_OP);
8508 
8509 	ring = &rdev->ring[TN_RING_TYPE_VCE2_INDEX];
8510 	if (ring->ring_size)
8511 		r = radeon_ring_init(rdev, ring, ring->ring_size, 0,
8512 				     VCE_CMD_NO_OP);
8513 
8514 	if (!r)
8515 		r = vce_v1_0_init(rdev);
8516 	else if (r != -ENOENT)
8517 		DRM_ERROR("radeon: failed initializing VCE (%d).\n", r);
8518 
8519 	r = radeon_ib_pool_init(rdev);
8520 	if (r) {
8521 		dev_err(rdev->dev, "IB initialization failed (%d).\n", r);
8522 		return r;
8523 	}
8524 
8525 	r = radeon_vm_manager_init(rdev);
8526 	if (r) {
8527 		dev_err(rdev->dev, "vm manager initialization failed (%d).\n", r);
8528 		return r;
8529 	}
8530 
8531 	r = dce6_audio_init(rdev);
8532 	if (r)
8533 		return r;
8534 
8535 	return 0;
8536 }
8537 
8538 /**
8539  * cik_resume - resume the asic to a functional state
8540  *
8541  * @rdev: radeon_device pointer
8542  *
8543  * Programs the asic to a functional state (CIK).
8544  * Called at resume.
8545  * Returns 0 for success, error for failure.
8546  */
8547 int cik_resume(struct radeon_device *rdev)
8548 {
8549 	int r;
8550 
8551 	/* post card */
8552 	atom_asic_init(rdev->mode_info.atom_context);
8553 
8554 	/* init golden registers */
8555 	cik_init_golden_registers(rdev);
8556 
8557 	if (rdev->pm.pm_method == PM_METHOD_DPM)
8558 		radeon_pm_resume(rdev);
8559 
8560 	rdev->accel_working = true;
8561 	r = cik_startup(rdev);
8562 	if (r) {
8563 		DRM_ERROR("cik startup failed on resume\n");
8564 		rdev->accel_working = false;
8565 		return r;
8566 	}
8567 
8568 	return r;
8569 
8570 }
8571 
8572 /**
8573  * cik_suspend - suspend the asic
8574  *
8575  * @rdev: radeon_device pointer
8576  *
8577  * Bring the chip into a state suitable for suspend (CIK).
8578  * Called at suspend.
8579  * Returns 0 for success.
8580  */
8581 int cik_suspend(struct radeon_device *rdev)
8582 {
8583 	radeon_pm_suspend(rdev);
8584 	dce6_audio_fini(rdev);
8585 	radeon_vm_manager_fini(rdev);
8586 	cik_cp_enable(rdev, false);
8587 	cik_sdma_enable(rdev, false);
8588 	uvd_v1_0_fini(rdev);
8589 	radeon_uvd_suspend(rdev);
8590 	radeon_vce_suspend(rdev);
8591 	cik_fini_pg(rdev);
8592 	cik_fini_cg(rdev);
8593 	cik_irq_suspend(rdev);
8594 	radeon_wb_disable(rdev);
8595 	cik_pcie_gart_disable(rdev);
8596 	return 0;
8597 }
8598 
8599 /* Plan is to move initialization in that function and use
8600  * helper function so that radeon_device_init pretty much
8601  * do nothing more than calling asic specific function. This
8602  * should also allow to remove a bunch of callback function
8603  * like vram_info.
8604  */
8605 /**
8606  * cik_init - asic specific driver and hw init
8607  *
8608  * @rdev: radeon_device pointer
8609  *
8610  * Setup asic specific driver variables and program the hw
8611  * to a functional state (CIK).
8612  * Called at driver startup.
8613  * Returns 0 for success, errors for failure.
8614  */
8615 int cik_init(struct radeon_device *rdev)
8616 {
8617 	struct radeon_ring *ring;
8618 	int r;
8619 
8620 	/* Read BIOS */
8621 	if (!radeon_get_bios(rdev)) {
8622 		if (ASIC_IS_AVIVO(rdev))
8623 			return -EINVAL;
8624 	}
8625 	/* Must be an ATOMBIOS */
8626 	if (!rdev->is_atom_bios) {
8627 		dev_err(rdev->dev, "Expecting atombios for cayman GPU\n");
8628 		return -EINVAL;
8629 	}
8630 	r = radeon_atombios_init(rdev);
8631 	if (r)
8632 		return r;
8633 
8634 	/* Post card if necessary */
8635 	if (!radeon_card_posted(rdev)) {
8636 		if (!rdev->bios) {
8637 			dev_err(rdev->dev, "Card not posted and no BIOS - ignoring\n");
8638 			return -EINVAL;
8639 		}
8640 		DRM_INFO("GPU not posted. posting now...\n");
8641 		atom_asic_init(rdev->mode_info.atom_context);
8642 	}
8643 	/* init golden registers */
8644 	cik_init_golden_registers(rdev);
8645 	/* Initialize scratch registers */
8646 	cik_scratch_init(rdev);
8647 	/* Initialize surface registers */
8648 	radeon_surface_init(rdev);
8649 	/* Initialize clocks */
8650 	radeon_get_clock_info(rdev->ddev);
8651 
8652 	/* Fence driver */
8653 	r = radeon_fence_driver_init(rdev);
8654 	if (r)
8655 		return r;
8656 
8657 	/* initialize memory controller */
8658 	r = cik_mc_init(rdev);
8659 	if (r)
8660 		return r;
8661 	/* Memory manager */
8662 	r = radeon_bo_init(rdev);
8663 	if (r)
8664 		return r;
8665 
8666 	if (rdev->flags & RADEON_IS_IGP) {
8667 		if (!rdev->me_fw || !rdev->pfp_fw || !rdev->ce_fw ||
8668 		    !rdev->mec_fw || !rdev->sdma_fw || !rdev->rlc_fw) {
8669 			r = cik_init_microcode(rdev);
8670 			if (r) {
8671 				DRM_ERROR("Failed to load firmware!\n");
8672 				return r;
8673 			}
8674 		}
8675 	} else {
8676 		if (!rdev->me_fw || !rdev->pfp_fw || !rdev->ce_fw ||
8677 		    !rdev->mec_fw || !rdev->sdma_fw || !rdev->rlc_fw ||
8678 		    !rdev->mc_fw) {
8679 			r = cik_init_microcode(rdev);
8680 			if (r) {
8681 				DRM_ERROR("Failed to load firmware!\n");
8682 				return r;
8683 			}
8684 		}
8685 	}
8686 
8687 	/* Initialize power management */
8688 	radeon_pm_init(rdev);
8689 
8690 	ring = &rdev->ring[RADEON_RING_TYPE_GFX_INDEX];
8691 	ring->ring_obj = NULL;
8692 	r600_ring_init(rdev, ring, 1024 * 1024);
8693 
8694 	ring = &rdev->ring[CAYMAN_RING_TYPE_CP1_INDEX];
8695 	ring->ring_obj = NULL;
8696 	r600_ring_init(rdev, ring, 1024 * 1024);
8697 	r = radeon_doorbell_get(rdev, &ring->doorbell_index);
8698 	if (r)
8699 		return r;
8700 
8701 	ring = &rdev->ring[CAYMAN_RING_TYPE_CP2_INDEX];
8702 	ring->ring_obj = NULL;
8703 	r600_ring_init(rdev, ring, 1024 * 1024);
8704 	r = radeon_doorbell_get(rdev, &ring->doorbell_index);
8705 	if (r)
8706 		return r;
8707 
8708 	ring = &rdev->ring[R600_RING_TYPE_DMA_INDEX];
8709 	ring->ring_obj = NULL;
8710 	r600_ring_init(rdev, ring, 256 * 1024);
8711 
8712 	ring = &rdev->ring[CAYMAN_RING_TYPE_DMA1_INDEX];
8713 	ring->ring_obj = NULL;
8714 	r600_ring_init(rdev, ring, 256 * 1024);
8715 
8716 	r = radeon_uvd_init(rdev);
8717 	if (!r) {
8718 		ring = &rdev->ring[R600_RING_TYPE_UVD_INDEX];
8719 		ring->ring_obj = NULL;
8720 		r600_ring_init(rdev, ring, 4096);
8721 	}
8722 
8723 	r = radeon_vce_init(rdev);
8724 	if (!r) {
8725 		ring = &rdev->ring[TN_RING_TYPE_VCE1_INDEX];
8726 		ring->ring_obj = NULL;
8727 		r600_ring_init(rdev, ring, 4096);
8728 
8729 		ring = &rdev->ring[TN_RING_TYPE_VCE2_INDEX];
8730 		ring->ring_obj = NULL;
8731 		r600_ring_init(rdev, ring, 4096);
8732 	}
8733 
8734 	rdev->ih.ring_obj = NULL;
8735 	r600_ih_ring_init(rdev, 64 * 1024);
8736 
8737 	r = r600_pcie_gart_init(rdev);
8738 	if (r)
8739 		return r;
8740 
8741 	rdev->accel_working = true;
8742 	r = cik_startup(rdev);
8743 	if (r) {
8744 		dev_err(rdev->dev, "disabling GPU acceleration\n");
8745 		cik_cp_fini(rdev);
8746 		cik_sdma_fini(rdev);
8747 		cik_irq_fini(rdev);
8748 		sumo_rlc_fini(rdev);
8749 		cik_mec_fini(rdev);
8750 		radeon_wb_fini(rdev);
8751 		radeon_ib_pool_fini(rdev);
8752 		radeon_vm_manager_fini(rdev);
8753 		radeon_irq_kms_fini(rdev);
8754 		cik_pcie_gart_fini(rdev);
8755 		rdev->accel_working = false;
8756 	}
8757 
8758 	/* Don't start up if the MC ucode is missing.
8759 	 * The default clocks and voltages before the MC ucode
8760 	 * is loaded are not suffient for advanced operations.
8761 	 */
8762 	if (!rdev->mc_fw && !(rdev->flags & RADEON_IS_IGP)) {
8763 		DRM_ERROR("radeon: MC ucode required for NI+.\n");
8764 		return -EINVAL;
8765 	}
8766 
8767 	return 0;
8768 }
8769 
8770 /**
8771  * cik_fini - asic specific driver and hw fini
8772  *
8773  * @rdev: radeon_device pointer
8774  *
8775  * Tear down the asic specific driver variables and program the hw
8776  * to an idle state (CIK).
8777  * Called at driver unload.
8778  */
8779 void cik_fini(struct radeon_device *rdev)
8780 {
8781 	radeon_pm_fini(rdev);
8782 	cik_cp_fini(rdev);
8783 	cik_sdma_fini(rdev);
8784 	cik_fini_pg(rdev);
8785 	cik_fini_cg(rdev);
8786 	cik_irq_fini(rdev);
8787 	sumo_rlc_fini(rdev);
8788 	cik_mec_fini(rdev);
8789 	radeon_wb_fini(rdev);
8790 	radeon_vm_manager_fini(rdev);
8791 	radeon_ib_pool_fini(rdev);
8792 	radeon_irq_kms_fini(rdev);
8793 	uvd_v1_0_fini(rdev);
8794 	radeon_uvd_fini(rdev);
8795 	radeon_vce_fini(rdev);
8796 	cik_pcie_gart_fini(rdev);
8797 	r600_vram_scratch_fini(rdev);
8798 	radeon_gem_fini(rdev);
8799 	radeon_fence_driver_fini(rdev);
8800 	radeon_bo_fini(rdev);
8801 	radeon_atombios_fini(rdev);
8802 	cik_fini_microcode(rdev);
8803 	kfree(rdev->bios);
8804 	rdev->bios = NULL;
8805 }
8806 
8807 void dce8_program_fmt(struct drm_encoder *encoder)
8808 {
8809 	struct drm_device *dev = encoder->dev;
8810 	struct radeon_device *rdev = dev->dev_private;
8811 	struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder);
8812 	struct radeon_crtc *radeon_crtc = to_radeon_crtc(encoder->crtc);
8813 	struct drm_connector *connector = radeon_get_connector_for_encoder(encoder);
8814 	int bpc = 0;
8815 	u32 tmp = 0;
8816 	enum radeon_connector_dither dither = RADEON_FMT_DITHER_DISABLE;
8817 
8818 	if (connector) {
8819 		struct radeon_connector *radeon_connector = to_radeon_connector(connector);
8820 		bpc = radeon_get_monitor_bpc(connector);
8821 		dither = radeon_connector->dither;
8822 	}
8823 
8824 	/* LVDS/eDP FMT is set up by atom */
8825 	if (radeon_encoder->devices & ATOM_DEVICE_LCD_SUPPORT)
8826 		return;
8827 
8828 	/* not needed for analog */
8829 	if ((radeon_encoder->encoder_id == ENCODER_OBJECT_ID_INTERNAL_KLDSCP_DAC1) ||
8830 	    (radeon_encoder->encoder_id == ENCODER_OBJECT_ID_INTERNAL_KLDSCP_DAC2))
8831 		return;
8832 
8833 	if (bpc == 0)
8834 		return;
8835 
8836 	switch (bpc) {
8837 	case 6:
8838 		if (dither == RADEON_FMT_DITHER_ENABLE)
8839 			/* XXX sort out optimal dither settings */
8840 			tmp |= (FMT_FRAME_RANDOM_ENABLE | FMT_HIGHPASS_RANDOM_ENABLE |
8841 				FMT_SPATIAL_DITHER_EN | FMT_SPATIAL_DITHER_DEPTH(0));
8842 		else
8843 			tmp |= (FMT_TRUNCATE_EN | FMT_TRUNCATE_DEPTH(0));
8844 		break;
8845 	case 8:
8846 		if (dither == RADEON_FMT_DITHER_ENABLE)
8847 			/* XXX sort out optimal dither settings */
8848 			tmp |= (FMT_FRAME_RANDOM_ENABLE | FMT_HIGHPASS_RANDOM_ENABLE |
8849 				FMT_RGB_RANDOM_ENABLE |
8850 				FMT_SPATIAL_DITHER_EN | FMT_SPATIAL_DITHER_DEPTH(1));
8851 		else
8852 			tmp |= (FMT_TRUNCATE_EN | FMT_TRUNCATE_DEPTH(1));
8853 		break;
8854 	case 10:
8855 		if (dither == RADEON_FMT_DITHER_ENABLE)
8856 			/* XXX sort out optimal dither settings */
8857 			tmp |= (FMT_FRAME_RANDOM_ENABLE | FMT_HIGHPASS_RANDOM_ENABLE |
8858 				FMT_RGB_RANDOM_ENABLE |
8859 				FMT_SPATIAL_DITHER_EN | FMT_SPATIAL_DITHER_DEPTH(2));
8860 		else
8861 			tmp |= (FMT_TRUNCATE_EN | FMT_TRUNCATE_DEPTH(2));
8862 		break;
8863 	default:
8864 		/* not needed */
8865 		break;
8866 	}
8867 
8868 	WREG32(FMT_BIT_DEPTH_CONTROL + radeon_crtc->crtc_offset, tmp);
8869 }
8870 
8871 /* display watermark setup */
8872 /**
8873  * dce8_line_buffer_adjust - Set up the line buffer
8874  *
8875  * @rdev: radeon_device pointer
8876  * @radeon_crtc: the selected display controller
8877  * @mode: the current display mode on the selected display
8878  * controller
8879  *
8880  * Setup up the line buffer allocation for
8881  * the selected display controller (CIK).
8882  * Returns the line buffer size in pixels.
8883  */
8884 static u32 dce8_line_buffer_adjust(struct radeon_device *rdev,
8885 				   struct radeon_crtc *radeon_crtc,
8886 				   struct drm_display_mode *mode)
8887 {
8888 	u32 tmp, buffer_alloc, i;
8889 	u32 pipe_offset = radeon_crtc->crtc_id * 0x20;
8890 	/*
8891 	 * Line Buffer Setup
8892 	 * There are 6 line buffers, one for each display controllers.
8893 	 * There are 3 partitions per LB. Select the number of partitions
8894 	 * to enable based on the display width.  For display widths larger
8895 	 * than 4096, you need use to use 2 display controllers and combine
8896 	 * them using the stereo blender.
8897 	 */
8898 	if (radeon_crtc->base.enabled && mode) {
8899 		if (mode->crtc_hdisplay < 1920) {
8900 			tmp = 1;
8901 			buffer_alloc = 2;
8902 		} else if (mode->crtc_hdisplay < 2560) {
8903 			tmp = 2;
8904 			buffer_alloc = 2;
8905 		} else if (mode->crtc_hdisplay < 4096) {
8906 			tmp = 0;
8907 			buffer_alloc = (rdev->flags & RADEON_IS_IGP) ? 2 : 4;
8908 		} else {
8909 			DRM_DEBUG_KMS("Mode too big for LB!\n");
8910 			tmp = 0;
8911 			buffer_alloc = (rdev->flags & RADEON_IS_IGP) ? 2 : 4;
8912 		}
8913 	} else {
8914 		tmp = 1;
8915 		buffer_alloc = 0;
8916 	}
8917 
8918 	WREG32(LB_MEMORY_CTRL + radeon_crtc->crtc_offset,
8919 	       LB_MEMORY_CONFIG(tmp) | LB_MEMORY_SIZE(0x6B0));
8920 
8921 	WREG32(PIPE0_DMIF_BUFFER_CONTROL + pipe_offset,
8922 	       DMIF_BUFFERS_ALLOCATED(buffer_alloc));
8923 	for (i = 0; i < rdev->usec_timeout; i++) {
8924 		if (RREG32(PIPE0_DMIF_BUFFER_CONTROL + pipe_offset) &
8925 		    DMIF_BUFFERS_ALLOCATED_COMPLETED)
8926 			break;
8927 		udelay(1);
8928 	}
8929 
8930 	if (radeon_crtc->base.enabled && mode) {
8931 		switch (tmp) {
8932 		case 0:
8933 		default:
8934 			return 4096 * 2;
8935 		case 1:
8936 			return 1920 * 2;
8937 		case 2:
8938 			return 2560 * 2;
8939 		}
8940 	}
8941 
8942 	/* controller not enabled, so no lb used */
8943 	return 0;
8944 }
8945 
8946 /**
8947  * cik_get_number_of_dram_channels - get the number of dram channels
8948  *
8949  * @rdev: radeon_device pointer
8950  *
8951  * Look up the number of video ram channels (CIK).
8952  * Used for display watermark bandwidth calculations
8953  * Returns the number of dram channels
8954  */
8955 static u32 cik_get_number_of_dram_channels(struct radeon_device *rdev)
8956 {
8957 	u32 tmp = RREG32(MC_SHARED_CHMAP);
8958 
8959 	switch ((tmp & NOOFCHAN_MASK) >> NOOFCHAN_SHIFT) {
8960 	case 0:
8961 	default:
8962 		return 1;
8963 	case 1:
8964 		return 2;
8965 	case 2:
8966 		return 4;
8967 	case 3:
8968 		return 8;
8969 	case 4:
8970 		return 3;
8971 	case 5:
8972 		return 6;
8973 	case 6:
8974 		return 10;
8975 	case 7:
8976 		return 12;
8977 	case 8:
8978 		return 16;
8979 	}
8980 }
8981 
8982 struct dce8_wm_params {
8983 	u32 dram_channels; /* number of dram channels */
8984 	u32 yclk;          /* bandwidth per dram data pin in kHz */
8985 	u32 sclk;          /* engine clock in kHz */
8986 	u32 disp_clk;      /* display clock in kHz */
8987 	u32 src_width;     /* viewport width */
8988 	u32 active_time;   /* active display time in ns */
8989 	u32 blank_time;    /* blank time in ns */
8990 	bool interlaced;    /* mode is interlaced */
8991 	fixed20_12 vsc;    /* vertical scale ratio */
8992 	u32 num_heads;     /* number of active crtcs */
8993 	u32 bytes_per_pixel; /* bytes per pixel display + overlay */
8994 	u32 lb_size;       /* line buffer allocated to pipe */
8995 	u32 vtaps;         /* vertical scaler taps */
8996 };
8997 
8998 /**
8999  * dce8_dram_bandwidth - get the dram bandwidth
9000  *
9001  * @wm: watermark calculation data
9002  *
9003  * Calculate the raw dram bandwidth (CIK).
9004  * Used for display watermark bandwidth calculations
9005  * Returns the dram bandwidth in MBytes/s
9006  */
9007 static u32 dce8_dram_bandwidth(struct dce8_wm_params *wm)
9008 {
9009 	/* Calculate raw DRAM Bandwidth */
9010 	fixed20_12 dram_efficiency; /* 0.7 */
9011 	fixed20_12 yclk, dram_channels, bandwidth;
9012 	fixed20_12 a;
9013 
9014 	a.full = dfixed_const(1000);
9015 	yclk.full = dfixed_const(wm->yclk);
9016 	yclk.full = dfixed_div(yclk, a);
9017 	dram_channels.full = dfixed_const(wm->dram_channels * 4);
9018 	a.full = dfixed_const(10);
9019 	dram_efficiency.full = dfixed_const(7);
9020 	dram_efficiency.full = dfixed_div(dram_efficiency, a);
9021 	bandwidth.full = dfixed_mul(dram_channels, yclk);
9022 	bandwidth.full = dfixed_mul(bandwidth, dram_efficiency);
9023 
9024 	return dfixed_trunc(bandwidth);
9025 }
9026 
9027 /**
9028  * dce8_dram_bandwidth_for_display - get the dram bandwidth for display
9029  *
9030  * @wm: watermark calculation data
9031  *
9032  * Calculate the dram bandwidth used for display (CIK).
9033  * Used for display watermark bandwidth calculations
9034  * Returns the dram bandwidth for display in MBytes/s
9035  */
9036 static u32 dce8_dram_bandwidth_for_display(struct dce8_wm_params *wm)
9037 {
9038 	/* Calculate DRAM Bandwidth and the part allocated to display. */
9039 	fixed20_12 disp_dram_allocation; /* 0.3 to 0.7 */
9040 	fixed20_12 yclk, dram_channels, bandwidth;
9041 	fixed20_12 a;
9042 
9043 	a.full = dfixed_const(1000);
9044 	yclk.full = dfixed_const(wm->yclk);
9045 	yclk.full = dfixed_div(yclk, a);
9046 	dram_channels.full = dfixed_const(wm->dram_channels * 4);
9047 	a.full = dfixed_const(10);
9048 	disp_dram_allocation.full = dfixed_const(3); /* XXX worse case value 0.3 */
9049 	disp_dram_allocation.full = dfixed_div(disp_dram_allocation, a);
9050 	bandwidth.full = dfixed_mul(dram_channels, yclk);
9051 	bandwidth.full = dfixed_mul(bandwidth, disp_dram_allocation);
9052 
9053 	return dfixed_trunc(bandwidth);
9054 }
9055 
9056 /**
9057  * dce8_data_return_bandwidth - get the data return bandwidth
9058  *
9059  * @wm: watermark calculation data
9060  *
9061  * Calculate the data return bandwidth used for display (CIK).
9062  * Used for display watermark bandwidth calculations
9063  * Returns the data return bandwidth in MBytes/s
9064  */
9065 static u32 dce8_data_return_bandwidth(struct dce8_wm_params *wm)
9066 {
9067 	/* Calculate the display Data return Bandwidth */
9068 	fixed20_12 return_efficiency; /* 0.8 */
9069 	fixed20_12 sclk, bandwidth;
9070 	fixed20_12 a;
9071 
9072 	a.full = dfixed_const(1000);
9073 	sclk.full = dfixed_const(wm->sclk);
9074 	sclk.full = dfixed_div(sclk, a);
9075 	a.full = dfixed_const(10);
9076 	return_efficiency.full = dfixed_const(8);
9077 	return_efficiency.full = dfixed_div(return_efficiency, a);
9078 	a.full = dfixed_const(32);
9079 	bandwidth.full = dfixed_mul(a, sclk);
9080 	bandwidth.full = dfixed_mul(bandwidth, return_efficiency);
9081 
9082 	return dfixed_trunc(bandwidth);
9083 }
9084 
9085 /**
9086  * dce8_dmif_request_bandwidth - get the dmif bandwidth
9087  *
9088  * @wm: watermark calculation data
9089  *
9090  * Calculate the dmif bandwidth used for display (CIK).
9091  * Used for display watermark bandwidth calculations
9092  * Returns the dmif bandwidth in MBytes/s
9093  */
9094 static u32 dce8_dmif_request_bandwidth(struct dce8_wm_params *wm)
9095 {
9096 	/* Calculate the DMIF Request Bandwidth */
9097 	fixed20_12 disp_clk_request_efficiency; /* 0.8 */
9098 	fixed20_12 disp_clk, bandwidth;
9099 	fixed20_12 a, b;
9100 
9101 	a.full = dfixed_const(1000);
9102 	disp_clk.full = dfixed_const(wm->disp_clk);
9103 	disp_clk.full = dfixed_div(disp_clk, a);
9104 	a.full = dfixed_const(32);
9105 	b.full = dfixed_mul(a, disp_clk);
9106 
9107 	a.full = dfixed_const(10);
9108 	disp_clk_request_efficiency.full = dfixed_const(8);
9109 	disp_clk_request_efficiency.full = dfixed_div(disp_clk_request_efficiency, a);
9110 
9111 	bandwidth.full = dfixed_mul(b, disp_clk_request_efficiency);
9112 
9113 	return dfixed_trunc(bandwidth);
9114 }
9115 
9116 /**
9117  * dce8_available_bandwidth - get the min available bandwidth
9118  *
9119  * @wm: watermark calculation data
9120  *
9121  * Calculate the min available bandwidth used for display (CIK).
9122  * Used for display watermark bandwidth calculations
9123  * Returns the min available bandwidth in MBytes/s
9124  */
9125 static u32 dce8_available_bandwidth(struct dce8_wm_params *wm)
9126 {
9127 	/* Calculate the Available bandwidth. Display can use this temporarily but not in average. */
9128 	u32 dram_bandwidth = dce8_dram_bandwidth(wm);
9129 	u32 data_return_bandwidth = dce8_data_return_bandwidth(wm);
9130 	u32 dmif_req_bandwidth = dce8_dmif_request_bandwidth(wm);
9131 
9132 	return min(dram_bandwidth, min(data_return_bandwidth, dmif_req_bandwidth));
9133 }
9134 
9135 /**
9136  * dce8_average_bandwidth - get the average available bandwidth
9137  *
9138  * @wm: watermark calculation data
9139  *
9140  * Calculate the average available bandwidth used for display (CIK).
9141  * Used for display watermark bandwidth calculations
9142  * Returns the average available bandwidth in MBytes/s
9143  */
9144 static u32 dce8_average_bandwidth(struct dce8_wm_params *wm)
9145 {
9146 	/* Calculate the display mode Average Bandwidth
9147 	 * DisplayMode should contain the source and destination dimensions,
9148 	 * timing, etc.
9149 	 */
9150 	fixed20_12 bpp;
9151 	fixed20_12 line_time;
9152 	fixed20_12 src_width;
9153 	fixed20_12 bandwidth;
9154 	fixed20_12 a;
9155 
9156 	a.full = dfixed_const(1000);
9157 	line_time.full = dfixed_const(wm->active_time + wm->blank_time);
9158 	line_time.full = dfixed_div(line_time, a);
9159 	bpp.full = dfixed_const(wm->bytes_per_pixel);
9160 	src_width.full = dfixed_const(wm->src_width);
9161 	bandwidth.full = dfixed_mul(src_width, bpp);
9162 	bandwidth.full = dfixed_mul(bandwidth, wm->vsc);
9163 	bandwidth.full = dfixed_div(bandwidth, line_time);
9164 
9165 	return dfixed_trunc(bandwidth);
9166 }
9167 
9168 /**
9169  * dce8_latency_watermark - get the latency watermark
9170  *
9171  * @wm: watermark calculation data
9172  *
9173  * Calculate the latency watermark (CIK).
9174  * Used for display watermark bandwidth calculations
9175  * Returns the latency watermark in ns
9176  */
9177 static u32 dce8_latency_watermark(struct dce8_wm_params *wm)
9178 {
9179 	/* First calculate the latency in ns */
9180 	u32 mc_latency = 2000; /* 2000 ns. */
9181 	u32 available_bandwidth = dce8_available_bandwidth(wm);
9182 	u32 worst_chunk_return_time = (512 * 8 * 1000) / available_bandwidth;
9183 	u32 cursor_line_pair_return_time = (128 * 4 * 1000) / available_bandwidth;
9184 	u32 dc_latency = 40000000 / wm->disp_clk; /* dc pipe latency */
9185 	u32 other_heads_data_return_time = ((wm->num_heads + 1) * worst_chunk_return_time) +
9186 		(wm->num_heads * cursor_line_pair_return_time);
9187 	u32 latency = mc_latency + other_heads_data_return_time + dc_latency;
9188 	u32 max_src_lines_per_dst_line, lb_fill_bw, line_fill_time;
9189 	u32 tmp, dmif_size = 12288;
9190 	fixed20_12 a, b, c;
9191 
9192 	if (wm->num_heads == 0)
9193 		return 0;
9194 
9195 	a.full = dfixed_const(2);
9196 	b.full = dfixed_const(1);
9197 	if ((wm->vsc.full > a.full) ||
9198 	    ((wm->vsc.full > b.full) && (wm->vtaps >= 3)) ||
9199 	    (wm->vtaps >= 5) ||
9200 	    ((wm->vsc.full >= a.full) && wm->interlaced))
9201 		max_src_lines_per_dst_line = 4;
9202 	else
9203 		max_src_lines_per_dst_line = 2;
9204 
9205 	a.full = dfixed_const(available_bandwidth);
9206 	b.full = dfixed_const(wm->num_heads);
9207 	a.full = dfixed_div(a, b);
9208 
9209 	b.full = dfixed_const(mc_latency + 512);
9210 	c.full = dfixed_const(wm->disp_clk);
9211 	b.full = dfixed_div(b, c);
9212 
9213 	c.full = dfixed_const(dmif_size);
9214 	b.full = dfixed_div(c, b);
9215 
9216 	tmp = min(dfixed_trunc(a), dfixed_trunc(b));
9217 
9218 	b.full = dfixed_const(1000);
9219 	c.full = dfixed_const(wm->disp_clk);
9220 	b.full = dfixed_div(c, b);
9221 	c.full = dfixed_const(wm->bytes_per_pixel);
9222 	b.full = dfixed_mul(b, c);
9223 
9224 	lb_fill_bw = min(tmp, dfixed_trunc(b));
9225 
9226 	a.full = dfixed_const(max_src_lines_per_dst_line * wm->src_width * wm->bytes_per_pixel);
9227 	b.full = dfixed_const(1000);
9228 	c.full = dfixed_const(lb_fill_bw);
9229 	b.full = dfixed_div(c, b);
9230 	a.full = dfixed_div(a, b);
9231 	line_fill_time = dfixed_trunc(a);
9232 
9233 	if (line_fill_time < wm->active_time)
9234 		return latency;
9235 	else
9236 		return latency + (line_fill_time - wm->active_time);
9237 
9238 }
9239 
9240 /**
9241  * dce8_average_bandwidth_vs_dram_bandwidth_for_display - check
9242  * average and available dram bandwidth
9243  *
9244  * @wm: watermark calculation data
9245  *
9246  * Check if the display average bandwidth fits in the display
9247  * dram bandwidth (CIK).
9248  * Used for display watermark bandwidth calculations
9249  * Returns true if the display fits, false if not.
9250  */
9251 static bool dce8_average_bandwidth_vs_dram_bandwidth_for_display(struct dce8_wm_params *wm)
9252 {
9253 	if (dce8_average_bandwidth(wm) <=
9254 	    (dce8_dram_bandwidth_for_display(wm) / wm->num_heads))
9255 		return true;
9256 	else
9257 		return false;
9258 }
9259 
9260 /**
9261  * dce8_average_bandwidth_vs_available_bandwidth - check
9262  * average and available bandwidth
9263  *
9264  * @wm: watermark calculation data
9265  *
9266  * Check if the display average bandwidth fits in the display
9267  * available bandwidth (CIK).
9268  * Used for display watermark bandwidth calculations
9269  * Returns true if the display fits, false if not.
9270  */
9271 static bool dce8_average_bandwidth_vs_available_bandwidth(struct dce8_wm_params *wm)
9272 {
9273 	if (dce8_average_bandwidth(wm) <=
9274 	    (dce8_available_bandwidth(wm) / wm->num_heads))
9275 		return true;
9276 	else
9277 		return false;
9278 }
9279 
9280 /**
9281  * dce8_check_latency_hiding - check latency hiding
9282  *
9283  * @wm: watermark calculation data
9284  *
9285  * Check latency hiding (CIK).
9286  * Used for display watermark bandwidth calculations
9287  * Returns true if the display fits, false if not.
9288  */
9289 static bool dce8_check_latency_hiding(struct dce8_wm_params *wm)
9290 {
9291 	u32 lb_partitions = wm->lb_size / wm->src_width;
9292 	u32 line_time = wm->active_time + wm->blank_time;
9293 	u32 latency_tolerant_lines;
9294 	u32 latency_hiding;
9295 	fixed20_12 a;
9296 
9297 	a.full = dfixed_const(1);
9298 	if (wm->vsc.full > a.full)
9299 		latency_tolerant_lines = 1;
9300 	else {
9301 		if (lb_partitions <= (wm->vtaps + 1))
9302 			latency_tolerant_lines = 1;
9303 		else
9304 			latency_tolerant_lines = 2;
9305 	}
9306 
9307 	latency_hiding = (latency_tolerant_lines * line_time + wm->blank_time);
9308 
9309 	if (dce8_latency_watermark(wm) <= latency_hiding)
9310 		return true;
9311 	else
9312 		return false;
9313 }
9314 
9315 /**
9316  * dce8_program_watermarks - program display watermarks
9317  *
9318  * @rdev: radeon_device pointer
9319  * @radeon_crtc: the selected display controller
9320  * @lb_size: line buffer size
9321  * @num_heads: number of display controllers in use
9322  *
9323  * Calculate and program the display watermarks for the
9324  * selected display controller (CIK).
9325  */
9326 static void dce8_program_watermarks(struct radeon_device *rdev,
9327 				    struct radeon_crtc *radeon_crtc,
9328 				    u32 lb_size, u32 num_heads)
9329 {
9330 	struct drm_display_mode *mode = &radeon_crtc->base.mode;
9331 	struct dce8_wm_params wm_low, wm_high;
9332 	u32 pixel_period;
9333 	u32 line_time = 0;
9334 	u32 latency_watermark_a = 0, latency_watermark_b = 0;
9335 	u32 tmp, wm_mask;
9336 
9337 	if (radeon_crtc->base.enabled && num_heads && mode) {
9338 		pixel_period = 1000000 / (u32)mode->clock;
9339 		line_time = min((u32)mode->crtc_htotal * pixel_period, (u32)65535);
9340 
9341 		/* watermark for high clocks */
9342 		if ((rdev->pm.pm_method == PM_METHOD_DPM) &&
9343 		    rdev->pm.dpm_enabled) {
9344 			wm_high.yclk =
9345 				radeon_dpm_get_mclk(rdev, false) * 10;
9346 			wm_high.sclk =
9347 				radeon_dpm_get_sclk(rdev, false) * 10;
9348 		} else {
9349 			wm_high.yclk = rdev->pm.current_mclk * 10;
9350 			wm_high.sclk = rdev->pm.current_sclk * 10;
9351 		}
9352 
9353 		wm_high.disp_clk = mode->clock;
9354 		wm_high.src_width = mode->crtc_hdisplay;
9355 		wm_high.active_time = mode->crtc_hdisplay * pixel_period;
9356 		wm_high.blank_time = line_time - wm_high.active_time;
9357 		wm_high.interlaced = false;
9358 		if (mode->flags & DRM_MODE_FLAG_INTERLACE)
9359 			wm_high.interlaced = true;
9360 		wm_high.vsc = radeon_crtc->vsc;
9361 		wm_high.vtaps = 1;
9362 		if (radeon_crtc->rmx_type != RMX_OFF)
9363 			wm_high.vtaps = 2;
9364 		wm_high.bytes_per_pixel = 4; /* XXX: get this from fb config */
9365 		wm_high.lb_size = lb_size;
9366 		wm_high.dram_channels = cik_get_number_of_dram_channels(rdev);
9367 		wm_high.num_heads = num_heads;
9368 
9369 		/* set for high clocks */
9370 		latency_watermark_a = min(dce8_latency_watermark(&wm_high), (u32)65535);
9371 
9372 		/* possibly force display priority to high */
9373 		/* should really do this at mode validation time... */
9374 		if (!dce8_average_bandwidth_vs_dram_bandwidth_for_display(&wm_high) ||
9375 		    !dce8_average_bandwidth_vs_available_bandwidth(&wm_high) ||
9376 		    !dce8_check_latency_hiding(&wm_high) ||
9377 		    (rdev->disp_priority == 2)) {
9378 			DRM_DEBUG_KMS("force priority to high\n");
9379 		}
9380 
9381 		/* watermark for low clocks */
9382 		if ((rdev->pm.pm_method == PM_METHOD_DPM) &&
9383 		    rdev->pm.dpm_enabled) {
9384 			wm_low.yclk =
9385 				radeon_dpm_get_mclk(rdev, true) * 10;
9386 			wm_low.sclk =
9387 				radeon_dpm_get_sclk(rdev, true) * 10;
9388 		} else {
9389 			wm_low.yclk = rdev->pm.current_mclk * 10;
9390 			wm_low.sclk = rdev->pm.current_sclk * 10;
9391 		}
9392 
9393 		wm_low.disp_clk = mode->clock;
9394 		wm_low.src_width = mode->crtc_hdisplay;
9395 		wm_low.active_time = mode->crtc_hdisplay * pixel_period;
9396 		wm_low.blank_time = line_time - wm_low.active_time;
9397 		wm_low.interlaced = false;
9398 		if (mode->flags & DRM_MODE_FLAG_INTERLACE)
9399 			wm_low.interlaced = true;
9400 		wm_low.vsc = radeon_crtc->vsc;
9401 		wm_low.vtaps = 1;
9402 		if (radeon_crtc->rmx_type != RMX_OFF)
9403 			wm_low.vtaps = 2;
9404 		wm_low.bytes_per_pixel = 4; /* XXX: get this from fb config */
9405 		wm_low.lb_size = lb_size;
9406 		wm_low.dram_channels = cik_get_number_of_dram_channels(rdev);
9407 		wm_low.num_heads = num_heads;
9408 
9409 		/* set for low clocks */
9410 		latency_watermark_b = min(dce8_latency_watermark(&wm_low), (u32)65535);
9411 
9412 		/* possibly force display priority to high */
9413 		/* should really do this at mode validation time... */
9414 		if (!dce8_average_bandwidth_vs_dram_bandwidth_for_display(&wm_low) ||
9415 		    !dce8_average_bandwidth_vs_available_bandwidth(&wm_low) ||
9416 		    !dce8_check_latency_hiding(&wm_low) ||
9417 		    (rdev->disp_priority == 2)) {
9418 			DRM_DEBUG_KMS("force priority to high\n");
9419 		}
9420 	}
9421 
9422 	/* select wm A */
9423 	wm_mask = RREG32(DPG_WATERMARK_MASK_CONTROL + radeon_crtc->crtc_offset);
9424 	tmp = wm_mask;
9425 	tmp &= ~LATENCY_WATERMARK_MASK(3);
9426 	tmp |= LATENCY_WATERMARK_MASK(1);
9427 	WREG32(DPG_WATERMARK_MASK_CONTROL + radeon_crtc->crtc_offset, tmp);
9428 	WREG32(DPG_PIPE_LATENCY_CONTROL + radeon_crtc->crtc_offset,
9429 	       (LATENCY_LOW_WATERMARK(latency_watermark_a) |
9430 		LATENCY_HIGH_WATERMARK(line_time)));
9431 	/* select wm B */
9432 	tmp = RREG32(DPG_WATERMARK_MASK_CONTROL + radeon_crtc->crtc_offset);
9433 	tmp &= ~LATENCY_WATERMARK_MASK(3);
9434 	tmp |= LATENCY_WATERMARK_MASK(2);
9435 	WREG32(DPG_WATERMARK_MASK_CONTROL + radeon_crtc->crtc_offset, tmp);
9436 	WREG32(DPG_PIPE_LATENCY_CONTROL + radeon_crtc->crtc_offset,
9437 	       (LATENCY_LOW_WATERMARK(latency_watermark_b) |
9438 		LATENCY_HIGH_WATERMARK(line_time)));
9439 	/* restore original selection */
9440 	WREG32(DPG_WATERMARK_MASK_CONTROL + radeon_crtc->crtc_offset, wm_mask);
9441 
9442 	/* save values for DPM */
9443 	radeon_crtc->line_time = line_time;
9444 	radeon_crtc->wm_high = latency_watermark_a;
9445 	radeon_crtc->wm_low = latency_watermark_b;
9446 }
9447 
9448 /**
9449  * dce8_bandwidth_update - program display watermarks
9450  *
9451  * @rdev: radeon_device pointer
9452  *
9453  * Calculate and program the display watermarks and line
9454  * buffer allocation (CIK).
9455  */
9456 void dce8_bandwidth_update(struct radeon_device *rdev)
9457 {
9458 	struct drm_display_mode *mode = NULL;
9459 	u32 num_heads = 0, lb_size;
9460 	int i;
9461 
9462 	if (!rdev->mode_info.mode_config_initialized)
9463 		return;
9464 
9465 	radeon_update_display_priority(rdev);
9466 
9467 	for (i = 0; i < rdev->num_crtc; i++) {
9468 		if (rdev->mode_info.crtcs[i]->base.enabled)
9469 			num_heads++;
9470 	}
9471 	for (i = 0; i < rdev->num_crtc; i++) {
9472 		mode = &rdev->mode_info.crtcs[i]->base.mode;
9473 		lb_size = dce8_line_buffer_adjust(rdev, rdev->mode_info.crtcs[i], mode);
9474 		dce8_program_watermarks(rdev, rdev->mode_info.crtcs[i], lb_size, num_heads);
9475 	}
9476 }
9477 
9478 /**
9479  * cik_get_gpu_clock_counter - return GPU clock counter snapshot
9480  *
9481  * @rdev: radeon_device pointer
9482  *
9483  * Fetches a GPU clock counter snapshot (SI).
9484  * Returns the 64 bit clock counter snapshot.
9485  */
9486 uint64_t cik_get_gpu_clock_counter(struct radeon_device *rdev)
9487 {
9488 	uint64_t clock;
9489 
9490 	spin_lock(&rdev->gpu_clock_mutex);
9491 	WREG32(RLC_CAPTURE_GPU_CLOCK_COUNT, 1);
9492 	clock = (uint64_t)RREG32(RLC_GPU_CLOCK_COUNT_LSB) |
9493 	        ((uint64_t)RREG32(RLC_GPU_CLOCK_COUNT_MSB) << 32ULL);
9494 	spin_unlock(&rdev->gpu_clock_mutex);
9495 	return clock;
9496 }
9497 
9498 static int cik_set_uvd_clock(struct radeon_device *rdev, u32 clock,
9499                               u32 cntl_reg, u32 status_reg)
9500 {
9501 	int r, i;
9502 	struct atom_clock_dividers dividers;
9503 	uint32_t tmp;
9504 
9505 	r = radeon_atom_get_clock_dividers(rdev, COMPUTE_GPUCLK_INPUT_FLAG_DEFAULT_GPUCLK,
9506 					   clock, false, &dividers);
9507 	if (r)
9508 		return r;
9509 
9510 	tmp = RREG32_SMC(cntl_reg);
9511 	tmp &= ~(DCLK_DIR_CNTL_EN|DCLK_DIVIDER_MASK);
9512 	tmp |= dividers.post_divider;
9513 	WREG32_SMC(cntl_reg, tmp);
9514 
9515 	for (i = 0; i < 100; i++) {
9516 		if (RREG32_SMC(status_reg) & DCLK_STATUS)
9517 			break;
9518 		mdelay(10);
9519 	}
9520 	if (i == 100)
9521 		return -ETIMEDOUT;
9522 
9523 	return 0;
9524 }
9525 
9526 int cik_set_uvd_clocks(struct radeon_device *rdev, u32 vclk, u32 dclk)
9527 {
9528 	int r = 0;
9529 
9530 	r = cik_set_uvd_clock(rdev, vclk, CG_VCLK_CNTL, CG_VCLK_STATUS);
9531 	if (r)
9532 		return r;
9533 
9534 	r = cik_set_uvd_clock(rdev, dclk, CG_DCLK_CNTL, CG_DCLK_STATUS);
9535 	return r;
9536 }
9537 
9538 int cik_set_vce_clocks(struct radeon_device *rdev, u32 evclk, u32 ecclk)
9539 {
9540 	int r, i;
9541 	struct atom_clock_dividers dividers;
9542 	u32 tmp;
9543 
9544 	r = radeon_atom_get_clock_dividers(rdev, COMPUTE_GPUCLK_INPUT_FLAG_DEFAULT_GPUCLK,
9545 					   ecclk, false, &dividers);
9546 	if (r)
9547 		return r;
9548 
9549 	for (i = 0; i < 100; i++) {
9550 		if (RREG32_SMC(CG_ECLK_STATUS) & ECLK_STATUS)
9551 			break;
9552 		mdelay(10);
9553 	}
9554 	if (i == 100)
9555 		return -ETIMEDOUT;
9556 
9557 	tmp = RREG32_SMC(CG_ECLK_CNTL);
9558 	tmp &= ~(ECLK_DIR_CNTL_EN|ECLK_DIVIDER_MASK);
9559 	tmp |= dividers.post_divider;
9560 	WREG32_SMC(CG_ECLK_CNTL, tmp);
9561 
9562 	for (i = 0; i < 100; i++) {
9563 		if (RREG32_SMC(CG_ECLK_STATUS) & ECLK_STATUS)
9564 			break;
9565 		mdelay(10);
9566 	}
9567 	if (i == 100)
9568 		return -ETIMEDOUT;
9569 
9570 	return 0;
9571 }
9572 
9573 static void cik_pcie_gen3_enable(struct radeon_device *rdev)
9574 {
9575 	struct pci_dev *root = rdev->pdev->bus->self;
9576 	int bridge_pos, gpu_pos;
9577 	u32 speed_cntl, mask, current_data_rate;
9578 	int ret, i;
9579 	u16 tmp16;
9580 
9581 	if (radeon_pcie_gen2 == 0)
9582 		return;
9583 
9584 	if (rdev->flags & RADEON_IS_IGP)
9585 		return;
9586 
9587 	if (!(rdev->flags & RADEON_IS_PCIE))
9588 		return;
9589 
9590 	ret = drm_pcie_get_speed_cap_mask(rdev->ddev, &mask);
9591 	if (ret != 0)
9592 		return;
9593 
9594 	if (!(mask & (DRM_PCIE_SPEED_50 | DRM_PCIE_SPEED_80)))
9595 		return;
9596 
9597 	speed_cntl = RREG32_PCIE_PORT(PCIE_LC_SPEED_CNTL);
9598 	current_data_rate = (speed_cntl & LC_CURRENT_DATA_RATE_MASK) >>
9599 		LC_CURRENT_DATA_RATE_SHIFT;
9600 	if (mask & DRM_PCIE_SPEED_80) {
9601 		if (current_data_rate == 2) {
9602 			DRM_INFO("PCIE gen 3 link speeds already enabled\n");
9603 			return;
9604 		}
9605 		DRM_INFO("enabling PCIE gen 3 link speeds, disable with radeon.pcie_gen2=0\n");
9606 	} else if (mask & DRM_PCIE_SPEED_50) {
9607 		if (current_data_rate == 1) {
9608 			DRM_INFO("PCIE gen 2 link speeds already enabled\n");
9609 			return;
9610 		}
9611 		DRM_INFO("enabling PCIE gen 2 link speeds, disable with radeon.pcie_gen2=0\n");
9612 	}
9613 
9614 	bridge_pos = pci_get_pciecap_ptr(root->dev);
9615 	if (!bridge_pos)
9616 		return;
9617 
9618 	gpu_pos = pci_get_pciecap_ptr(rdev->pdev->dev);
9619 	if (!gpu_pos)
9620 		return;
9621 
9622 	if (mask & DRM_PCIE_SPEED_80) {
9623 		/* re-try equalization if gen3 is not already enabled */
9624 		if (current_data_rate != 2) {
9625 			u16 bridge_cfg, gpu_cfg;
9626 			u16 bridge_cfg2, gpu_cfg2;
9627 			u32 max_lw, current_lw, tmp;
9628 
9629 			pci_read_config_word(root, bridge_pos + PCI_EXP_LNKCTL, &bridge_cfg);
9630 			pci_read_config_word(rdev->pdev, gpu_pos + PCI_EXP_LNKCTL, &gpu_cfg);
9631 
9632 			tmp16 = bridge_cfg | PCI_EXP_LNKCTL_HAWD;
9633 			pci_write_config_word(root, bridge_pos + PCI_EXP_LNKCTL, tmp16);
9634 
9635 			tmp16 = gpu_cfg | PCI_EXP_LNKCTL_HAWD;
9636 			pci_write_config_word(rdev->pdev, gpu_pos + PCI_EXP_LNKCTL, tmp16);
9637 
9638 			tmp = RREG32_PCIE_PORT(PCIE_LC_STATUS1);
9639 			max_lw = (tmp & LC_DETECTED_LINK_WIDTH_MASK) >> LC_DETECTED_LINK_WIDTH_SHIFT;
9640 			current_lw = (tmp & LC_OPERATING_LINK_WIDTH_MASK) >> LC_OPERATING_LINK_WIDTH_SHIFT;
9641 
9642 			if (current_lw < max_lw) {
9643 				tmp = RREG32_PCIE_PORT(PCIE_LC_LINK_WIDTH_CNTL);
9644 				if (tmp & LC_RENEGOTIATION_SUPPORT) {
9645 					tmp &= ~(LC_LINK_WIDTH_MASK | LC_UPCONFIGURE_DIS);
9646 					tmp |= (max_lw << LC_LINK_WIDTH_SHIFT);
9647 					tmp |= LC_UPCONFIGURE_SUPPORT | LC_RENEGOTIATE_EN | LC_RECONFIG_NOW;
9648 					WREG32_PCIE_PORT(PCIE_LC_LINK_WIDTH_CNTL, tmp);
9649 				}
9650 			}
9651 
9652 			for (i = 0; i < 10; i++) {
9653 				/* check status */
9654 				pci_read_config_word(rdev->pdev, gpu_pos + PCI_EXP_DEVSTA, &tmp16);
9655 				if (tmp16 & PCI_EXP_DEVSTA_TRPND)
9656 					break;
9657 
9658 				pci_read_config_word(root, bridge_pos + PCI_EXP_LNKCTL, &bridge_cfg);
9659 				pci_read_config_word(rdev->pdev, gpu_pos + PCI_EXP_LNKCTL, &gpu_cfg);
9660 
9661 				pci_read_config_word(root, bridge_pos + PCI_EXP_LNKCTL2, &bridge_cfg2);
9662 				pci_read_config_word(rdev->pdev, gpu_pos + PCI_EXP_LNKCTL2, &gpu_cfg2);
9663 
9664 				tmp = RREG32_PCIE_PORT(PCIE_LC_CNTL4);
9665 				tmp |= LC_SET_QUIESCE;
9666 				WREG32_PCIE_PORT(PCIE_LC_CNTL4, tmp);
9667 
9668 				tmp = RREG32_PCIE_PORT(PCIE_LC_CNTL4);
9669 				tmp |= LC_REDO_EQ;
9670 				WREG32_PCIE_PORT(PCIE_LC_CNTL4, tmp);
9671 
9672 				mdelay(100);
9673 
9674 				/* linkctl */
9675 				pci_read_config_word(root, bridge_pos + PCI_EXP_LNKCTL, &tmp16);
9676 				tmp16 &= ~PCI_EXP_LNKCTL_HAWD;
9677 				tmp16 |= (bridge_cfg & PCI_EXP_LNKCTL_HAWD);
9678 				pci_write_config_word(root, bridge_pos + PCI_EXP_LNKCTL, tmp16);
9679 
9680 				pci_read_config_word(rdev->pdev, gpu_pos + PCI_EXP_LNKCTL, &tmp16);
9681 				tmp16 &= ~PCI_EXP_LNKCTL_HAWD;
9682 				tmp16 |= (gpu_cfg & PCI_EXP_LNKCTL_HAWD);
9683 				pci_write_config_word(rdev->pdev, gpu_pos + PCI_EXP_LNKCTL, tmp16);
9684 
9685 				/* linkctl2 */
9686 				pci_read_config_word(root, bridge_pos + PCI_EXP_LNKCTL2, &tmp16);
9687 				tmp16 &= ~((1 << 4) | (7 << 9));
9688 				tmp16 |= (bridge_cfg2 & ((1 << 4) | (7 << 9)));
9689 				pci_write_config_word(root, bridge_pos + PCI_EXP_LNKCTL2, tmp16);
9690 
9691 				pci_read_config_word(rdev->pdev, gpu_pos + PCI_EXP_LNKCTL2, &tmp16);
9692 				tmp16 &= ~((1 << 4) | (7 << 9));
9693 				tmp16 |= (gpu_cfg2 & ((1 << 4) | (7 << 9)));
9694 				pci_write_config_word(rdev->pdev, gpu_pos + PCI_EXP_LNKCTL2, tmp16);
9695 
9696 				tmp = RREG32_PCIE_PORT(PCIE_LC_CNTL4);
9697 				tmp &= ~LC_SET_QUIESCE;
9698 				WREG32_PCIE_PORT(PCIE_LC_CNTL4, tmp);
9699 			}
9700 		}
9701 	}
9702 
9703 	/* set the link speed */
9704 	speed_cntl |= LC_FORCE_EN_SW_SPEED_CHANGE | LC_FORCE_DIS_HW_SPEED_CHANGE;
9705 	speed_cntl &= ~LC_FORCE_DIS_SW_SPEED_CHANGE;
9706 	WREG32_PCIE_PORT(PCIE_LC_SPEED_CNTL, speed_cntl);
9707 
9708 	pci_read_config_word(rdev->pdev, gpu_pos + PCI_EXP_LNKCTL2, &tmp16);
9709 	tmp16 &= ~0xf;
9710 	if (mask & DRM_PCIE_SPEED_80)
9711 		tmp16 |= 3; /* gen3 */
9712 	else if (mask & DRM_PCIE_SPEED_50)
9713 		tmp16 |= 2; /* gen2 */
9714 	else
9715 		tmp16 |= 1; /* gen1 */
9716 	pci_write_config_word(rdev->pdev, gpu_pos + PCI_EXP_LNKCTL2, tmp16);
9717 
9718 	speed_cntl = RREG32_PCIE_PORT(PCIE_LC_SPEED_CNTL);
9719 	speed_cntl |= LC_INITIATE_LINK_SPEED_CHANGE;
9720 	WREG32_PCIE_PORT(PCIE_LC_SPEED_CNTL, speed_cntl);
9721 
9722 	for (i = 0; i < rdev->usec_timeout; i++) {
9723 		speed_cntl = RREG32_PCIE_PORT(PCIE_LC_SPEED_CNTL);
9724 		if ((speed_cntl & LC_INITIATE_LINK_SPEED_CHANGE) == 0)
9725 			break;
9726 		udelay(1);
9727 	}
9728 }
9729 
9730 static void cik_program_aspm(struct radeon_device *rdev)
9731 {
9732 	u32 data, orig;
9733 	bool disable_l0s = false, disable_l1 = false, disable_plloff_in_l1 = false;
9734 	bool disable_clkreq = false;
9735 
9736 	if (radeon_aspm == 0)
9737 		return;
9738 
9739 	/* XXX double check IGPs */
9740 	if (rdev->flags & RADEON_IS_IGP)
9741 		return;
9742 
9743 	if (!(rdev->flags & RADEON_IS_PCIE))
9744 		return;
9745 
9746 	orig = data = RREG32_PCIE_PORT(PCIE_LC_N_FTS_CNTL);
9747 	data &= ~LC_XMIT_N_FTS_MASK;
9748 	data |= LC_XMIT_N_FTS(0x24) | LC_XMIT_N_FTS_OVERRIDE_EN;
9749 	if (orig != data)
9750 		WREG32_PCIE_PORT(PCIE_LC_N_FTS_CNTL, data);
9751 
9752 	orig = data = RREG32_PCIE_PORT(PCIE_LC_CNTL3);
9753 	data |= LC_GO_TO_RECOVERY;
9754 	if (orig != data)
9755 		WREG32_PCIE_PORT(PCIE_LC_CNTL3, data);
9756 
9757 	orig = data = RREG32_PCIE_PORT(PCIE_P_CNTL);
9758 	data |= P_IGNORE_EDB_ERR;
9759 	if (orig != data)
9760 		WREG32_PCIE_PORT(PCIE_P_CNTL, data);
9761 
9762 	orig = data = RREG32_PCIE_PORT(PCIE_LC_CNTL);
9763 	data &= ~(LC_L0S_INACTIVITY_MASK | LC_L1_INACTIVITY_MASK);
9764 	data |= LC_PMI_TO_L1_DIS;
9765 	if (!disable_l0s)
9766 		data |= LC_L0S_INACTIVITY(7);
9767 
9768 	if (!disable_l1) {
9769 		data |= LC_L1_INACTIVITY(7);
9770 		data &= ~LC_PMI_TO_L1_DIS;
9771 		if (orig != data)
9772 			WREG32_PCIE_PORT(PCIE_LC_CNTL, data);
9773 
9774 		if (!disable_plloff_in_l1) {
9775 			bool clk_req_support;
9776 
9777 			orig = data = RREG32_PCIE_PORT(PB0_PIF_PWRDOWN_0);
9778 			data &= ~(PLL_POWER_STATE_IN_OFF_0_MASK | PLL_POWER_STATE_IN_TXS2_0_MASK);
9779 			data |= PLL_POWER_STATE_IN_OFF_0(7) | PLL_POWER_STATE_IN_TXS2_0(7);
9780 			if (orig != data)
9781 				WREG32_PCIE_PORT(PB0_PIF_PWRDOWN_0, data);
9782 
9783 			orig = data = RREG32_PCIE_PORT(PB0_PIF_PWRDOWN_1);
9784 			data &= ~(PLL_POWER_STATE_IN_OFF_1_MASK | PLL_POWER_STATE_IN_TXS2_1_MASK);
9785 			data |= PLL_POWER_STATE_IN_OFF_1(7) | PLL_POWER_STATE_IN_TXS2_1(7);
9786 			if (orig != data)
9787 				WREG32_PCIE_PORT(PB0_PIF_PWRDOWN_1, data);
9788 
9789 			orig = data = RREG32_PCIE_PORT(PB1_PIF_PWRDOWN_0);
9790 			data &= ~(PLL_POWER_STATE_IN_OFF_0_MASK | PLL_POWER_STATE_IN_TXS2_0_MASK);
9791 			data |= PLL_POWER_STATE_IN_OFF_0(7) | PLL_POWER_STATE_IN_TXS2_0(7);
9792 			if (orig != data)
9793 				WREG32_PCIE_PORT(PB1_PIF_PWRDOWN_0, data);
9794 
9795 			orig = data = RREG32_PCIE_PORT(PB1_PIF_PWRDOWN_1);
9796 			data &= ~(PLL_POWER_STATE_IN_OFF_1_MASK | PLL_POWER_STATE_IN_TXS2_1_MASK);
9797 			data |= PLL_POWER_STATE_IN_OFF_1(7) | PLL_POWER_STATE_IN_TXS2_1(7);
9798 			if (orig != data)
9799 				WREG32_PCIE_PORT(PB1_PIF_PWRDOWN_1, data);
9800 
9801 			orig = data = RREG32_PCIE_PORT(PCIE_LC_LINK_WIDTH_CNTL);
9802 			data &= ~LC_DYN_LANES_PWR_STATE_MASK;
9803 			data |= LC_DYN_LANES_PWR_STATE(3);
9804 			if (orig != data)
9805 				WREG32_PCIE_PORT(PCIE_LC_LINK_WIDTH_CNTL, data);
9806 
9807 			if (!disable_clkreq) {
9808 #ifdef zMN_TODO
9809 				struct pci_dev *root = rdev->pdev->bus->self;
9810 				u32 lnkcap;
9811 
9812 				clk_req_support = false;
9813 				pcie_capability_read_dword(root, PCI_EXP_LNKCAP, &lnkcap);
9814 				if (lnkcap & PCI_EXP_LNKCAP_CLKPM)
9815 					clk_req_support = true;
9816 #else
9817 				clk_req_support = false;
9818 #endif
9819 			} else {
9820 				clk_req_support = false;
9821 			}
9822 
9823 			if (clk_req_support) {
9824 				orig = data = RREG32_PCIE_PORT(PCIE_LC_CNTL2);
9825 				data |= LC_ALLOW_PDWN_IN_L1 | LC_ALLOW_PDWN_IN_L23;
9826 				if (orig != data)
9827 					WREG32_PCIE_PORT(PCIE_LC_CNTL2, data);
9828 
9829 				orig = data = RREG32_SMC(THM_CLK_CNTL);
9830 				data &= ~(CMON_CLK_SEL_MASK | TMON_CLK_SEL_MASK);
9831 				data |= CMON_CLK_SEL(1) | TMON_CLK_SEL(1);
9832 				if (orig != data)
9833 					WREG32_SMC(THM_CLK_CNTL, data);
9834 
9835 				orig = data = RREG32_SMC(MISC_CLK_CTRL);
9836 				data &= ~(DEEP_SLEEP_CLK_SEL_MASK | ZCLK_SEL_MASK);
9837 				data |= DEEP_SLEEP_CLK_SEL(1) | ZCLK_SEL(1);
9838 				if (orig != data)
9839 					WREG32_SMC(MISC_CLK_CTRL, data);
9840 
9841 				orig = data = RREG32_SMC(CG_CLKPIN_CNTL);
9842 				data &= ~BCLK_AS_XCLK;
9843 				if (orig != data)
9844 					WREG32_SMC(CG_CLKPIN_CNTL, data);
9845 
9846 				orig = data = RREG32_SMC(CG_CLKPIN_CNTL_2);
9847 				data &= ~FORCE_BIF_REFCLK_EN;
9848 				if (orig != data)
9849 					WREG32_SMC(CG_CLKPIN_CNTL_2, data);
9850 
9851 				orig = data = RREG32_SMC(MPLL_BYPASSCLK_SEL);
9852 				data &= ~MPLL_CLKOUT_SEL_MASK;
9853 				data |= MPLL_CLKOUT_SEL(4);
9854 				if (orig != data)
9855 					WREG32_SMC(MPLL_BYPASSCLK_SEL, data);
9856 			}
9857 		}
9858 	} else {
9859 		if (orig != data)
9860 			WREG32_PCIE_PORT(PCIE_LC_CNTL, data);
9861 	}
9862 
9863 	orig = data = RREG32_PCIE_PORT(PCIE_CNTL2);
9864 	data |= SLV_MEM_LS_EN | MST_MEM_LS_EN | REPLAY_MEM_LS_EN;
9865 	if (orig != data)
9866 		WREG32_PCIE_PORT(PCIE_CNTL2, data);
9867 
9868 	if (!disable_l0s) {
9869 		data = RREG32_PCIE_PORT(PCIE_LC_N_FTS_CNTL);
9870 		if((data & LC_N_FTS_MASK) == LC_N_FTS_MASK) {
9871 			data = RREG32_PCIE_PORT(PCIE_LC_STATUS1);
9872 			if ((data & LC_REVERSE_XMIT) && (data & LC_REVERSE_RCVR)) {
9873 				orig = data = RREG32_PCIE_PORT(PCIE_LC_CNTL);
9874 				data &= ~LC_L0S_INACTIVITY_MASK;
9875 				if (orig != data)
9876 					WREG32_PCIE_PORT(PCIE_LC_CNTL, data);
9877 			}
9878 		}
9879 	}
9880 }
9881