xref: /openbmc/linux/drivers/gpu/drm/radeon/ni.c (revision 31b90347)
1 /*
2  * Copyright 2010 Advanced Micro Devices, Inc.
3  *
4  * Permission is hereby granted, free of charge, to any person obtaining a
5  * copy of this software and associated documentation files (the "Software"),
6  * to deal in the Software without restriction, including without limitation
7  * the rights to use, copy, modify, merge, publish, distribute, sublicense,
8  * and/or sell copies of the Software, and to permit persons to whom the
9  * Software is furnished to do so, subject to the following conditions:
10  *
11  * The above copyright notice and this permission notice shall be included in
12  * all copies or substantial portions of the Software.
13  *
14  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
15  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
16  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
17  * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
18  * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
19  * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
20  * OTHER DEALINGS IN THE SOFTWARE.
21  *
22  * Authors: Alex Deucher
23  */
24 #include <linux/firmware.h>
25 #include <linux/slab.h>
26 #include <linux/module.h>
27 #include <drm/drmP.h>
28 #include "radeon.h"
29 #include "radeon_asic.h"
30 #include <drm/radeon_drm.h>
31 #include "nid.h"
32 #include "atom.h"
33 #include "ni_reg.h"
34 #include "cayman_blit_shaders.h"
35 #include "radeon_ucode.h"
36 #include "clearstate_cayman.h"
37 
38 static const u32 tn_rlc_save_restore_register_list[] =
39 {
40 	0x98fc,
41 	0x98f0,
42 	0x9834,
43 	0x9838,
44 	0x9870,
45 	0x9874,
46 	0x8a14,
47 	0x8b24,
48 	0x8bcc,
49 	0x8b10,
50 	0x8c30,
51 	0x8d00,
52 	0x8d04,
53 	0x8c00,
54 	0x8c04,
55 	0x8c10,
56 	0x8c14,
57 	0x8d8c,
58 	0x8cf0,
59 	0x8e38,
60 	0x9508,
61 	0x9688,
62 	0x9608,
63 	0x960c,
64 	0x9610,
65 	0x9614,
66 	0x88c4,
67 	0x8978,
68 	0x88d4,
69 	0x900c,
70 	0x9100,
71 	0x913c,
72 	0x90e8,
73 	0x9354,
74 	0xa008,
75 	0x98f8,
76 	0x9148,
77 	0x914c,
78 	0x3f94,
79 	0x98f4,
80 	0x9b7c,
81 	0x3f8c,
82 	0x8950,
83 	0x8954,
84 	0x8a18,
85 	0x8b28,
86 	0x9144,
87 	0x3f90,
88 	0x915c,
89 	0x9160,
90 	0x9178,
91 	0x917c,
92 	0x9180,
93 	0x918c,
94 	0x9190,
95 	0x9194,
96 	0x9198,
97 	0x919c,
98 	0x91a8,
99 	0x91ac,
100 	0x91b0,
101 	0x91b4,
102 	0x91b8,
103 	0x91c4,
104 	0x91c8,
105 	0x91cc,
106 	0x91d0,
107 	0x91d4,
108 	0x91e0,
109 	0x91e4,
110 	0x91ec,
111 	0x91f0,
112 	0x91f4,
113 	0x9200,
114 	0x9204,
115 	0x929c,
116 	0x8030,
117 	0x9150,
118 	0x9a60,
119 	0x920c,
120 	0x9210,
121 	0x9228,
122 	0x922c,
123 	0x9244,
124 	0x9248,
125 	0x91e8,
126 	0x9294,
127 	0x9208,
128 	0x9224,
129 	0x9240,
130 	0x9220,
131 	0x923c,
132 	0x9258,
133 	0x9744,
134 	0xa200,
135 	0xa204,
136 	0xa208,
137 	0xa20c,
138 	0x8d58,
139 	0x9030,
140 	0x9034,
141 	0x9038,
142 	0x903c,
143 	0x9040,
144 	0x9654,
145 	0x897c,
146 	0xa210,
147 	0xa214,
148 	0x9868,
149 	0xa02c,
150 	0x9664,
151 	0x9698,
152 	0x949c,
153 	0x8e10,
154 	0x8e18,
155 	0x8c50,
156 	0x8c58,
157 	0x8c60,
158 	0x8c68,
159 	0x89b4,
160 	0x9830,
161 	0x802c,
162 };
163 
164 extern bool evergreen_is_display_hung(struct radeon_device *rdev);
165 extern void evergreen_print_gpu_status_regs(struct radeon_device *rdev);
166 extern void evergreen_mc_stop(struct radeon_device *rdev, struct evergreen_mc_save *save);
167 extern void evergreen_mc_resume(struct radeon_device *rdev, struct evergreen_mc_save *save);
168 extern int evergreen_mc_wait_for_idle(struct radeon_device *rdev);
169 extern void evergreen_mc_program(struct radeon_device *rdev);
170 extern void evergreen_irq_suspend(struct radeon_device *rdev);
171 extern int evergreen_mc_init(struct radeon_device *rdev);
172 extern void evergreen_fix_pci_max_read_req_size(struct radeon_device *rdev);
173 extern void evergreen_pcie_gen2_enable(struct radeon_device *rdev);
174 extern void evergreen_program_aspm(struct radeon_device *rdev);
175 extern void sumo_rlc_fini(struct radeon_device *rdev);
176 extern int sumo_rlc_init(struct radeon_device *rdev);
177 
178 /* Firmware Names */
179 MODULE_FIRMWARE("radeon/BARTS_pfp.bin");
180 MODULE_FIRMWARE("radeon/BARTS_me.bin");
181 MODULE_FIRMWARE("radeon/BARTS_mc.bin");
182 MODULE_FIRMWARE("radeon/BARTS_smc.bin");
183 MODULE_FIRMWARE("radeon/BTC_rlc.bin");
184 MODULE_FIRMWARE("radeon/TURKS_pfp.bin");
185 MODULE_FIRMWARE("radeon/TURKS_me.bin");
186 MODULE_FIRMWARE("radeon/TURKS_mc.bin");
187 MODULE_FIRMWARE("radeon/TURKS_smc.bin");
188 MODULE_FIRMWARE("radeon/CAICOS_pfp.bin");
189 MODULE_FIRMWARE("radeon/CAICOS_me.bin");
190 MODULE_FIRMWARE("radeon/CAICOS_mc.bin");
191 MODULE_FIRMWARE("radeon/CAICOS_smc.bin");
192 MODULE_FIRMWARE("radeon/CAYMAN_pfp.bin");
193 MODULE_FIRMWARE("radeon/CAYMAN_me.bin");
194 MODULE_FIRMWARE("radeon/CAYMAN_mc.bin");
195 MODULE_FIRMWARE("radeon/CAYMAN_rlc.bin");
196 MODULE_FIRMWARE("radeon/CAYMAN_smc.bin");
197 MODULE_FIRMWARE("radeon/ARUBA_pfp.bin");
198 MODULE_FIRMWARE("radeon/ARUBA_me.bin");
199 MODULE_FIRMWARE("radeon/ARUBA_rlc.bin");
200 
201 
202 static const u32 cayman_golden_registers2[] =
203 {
204 	0x3e5c, 0xffffffff, 0x00000000,
205 	0x3e48, 0xffffffff, 0x00000000,
206 	0x3e4c, 0xffffffff, 0x00000000,
207 	0x3e64, 0xffffffff, 0x00000000,
208 	0x3e50, 0xffffffff, 0x00000000,
209 	0x3e60, 0xffffffff, 0x00000000
210 };
211 
212 static const u32 cayman_golden_registers[] =
213 {
214 	0x5eb4, 0xffffffff, 0x00000002,
215 	0x5e78, 0x8f311ff1, 0x001000f0,
216 	0x3f90, 0xffff0000, 0xff000000,
217 	0x9148, 0xffff0000, 0xff000000,
218 	0x3f94, 0xffff0000, 0xff000000,
219 	0x914c, 0xffff0000, 0xff000000,
220 	0xc78, 0x00000080, 0x00000080,
221 	0xbd4, 0x70073777, 0x00011003,
222 	0xd02c, 0xbfffff1f, 0x08421000,
223 	0xd0b8, 0x73773777, 0x02011003,
224 	0x5bc0, 0x00200000, 0x50100000,
225 	0x98f8, 0x33773777, 0x02011003,
226 	0x98fc, 0xffffffff, 0x76541032,
227 	0x7030, 0x31000311, 0x00000011,
228 	0x2f48, 0x33773777, 0x42010001,
229 	0x6b28, 0x00000010, 0x00000012,
230 	0x7728, 0x00000010, 0x00000012,
231 	0x10328, 0x00000010, 0x00000012,
232 	0x10f28, 0x00000010, 0x00000012,
233 	0x11b28, 0x00000010, 0x00000012,
234 	0x12728, 0x00000010, 0x00000012,
235 	0x240c, 0x000007ff, 0x00000000,
236 	0x8a14, 0xf000001f, 0x00000007,
237 	0x8b24, 0x3fff3fff, 0x00ff0fff,
238 	0x8b10, 0x0000ff0f, 0x00000000,
239 	0x28a4c, 0x07ffffff, 0x06000000,
240 	0x10c, 0x00000001, 0x00010003,
241 	0xa02c, 0xffffffff, 0x0000009b,
242 	0x913c, 0x0000010f, 0x01000100,
243 	0x8c04, 0xf8ff00ff, 0x40600060,
244 	0x28350, 0x00000f01, 0x00000000,
245 	0x9508, 0x3700001f, 0x00000002,
246 	0x960c, 0xffffffff, 0x54763210,
247 	0x88c4, 0x001f3ae3, 0x00000082,
248 	0x88d0, 0xffffffff, 0x0f40df40,
249 	0x88d4, 0x0000001f, 0x00000010,
250 	0x8974, 0xffffffff, 0x00000000
251 };
252 
253 static const u32 dvst_golden_registers2[] =
254 {
255 	0x8f8, 0xffffffff, 0,
256 	0x8fc, 0x00380000, 0,
257 	0x8f8, 0xffffffff, 1,
258 	0x8fc, 0x0e000000, 0
259 };
260 
261 static const u32 dvst_golden_registers[] =
262 {
263 	0x690, 0x3fff3fff, 0x20c00033,
264 	0x918c, 0x0fff0fff, 0x00010006,
265 	0x91a8, 0x0fff0fff, 0x00010006,
266 	0x9150, 0xffffdfff, 0x6e944040,
267 	0x917c, 0x0fff0fff, 0x00030002,
268 	0x9198, 0x0fff0fff, 0x00030002,
269 	0x915c, 0x0fff0fff, 0x00010000,
270 	0x3f90, 0xffff0001, 0xff000000,
271 	0x9178, 0x0fff0fff, 0x00070000,
272 	0x9194, 0x0fff0fff, 0x00070000,
273 	0x9148, 0xffff0001, 0xff000000,
274 	0x9190, 0x0fff0fff, 0x00090008,
275 	0x91ac, 0x0fff0fff, 0x00090008,
276 	0x3f94, 0xffff0000, 0xff000000,
277 	0x914c, 0xffff0000, 0xff000000,
278 	0x929c, 0x00000fff, 0x00000001,
279 	0x55e4, 0xff607fff, 0xfc000100,
280 	0x8a18, 0xff000fff, 0x00000100,
281 	0x8b28, 0xff000fff, 0x00000100,
282 	0x9144, 0xfffc0fff, 0x00000100,
283 	0x6ed8, 0x00010101, 0x00010000,
284 	0x9830, 0xffffffff, 0x00000000,
285 	0x9834, 0xf00fffff, 0x00000400,
286 	0x9838, 0xfffffffe, 0x00000000,
287 	0xd0c0, 0xff000fff, 0x00000100,
288 	0xd02c, 0xbfffff1f, 0x08421000,
289 	0xd0b8, 0x73773777, 0x12010001,
290 	0x5bb0, 0x000000f0, 0x00000070,
291 	0x98f8, 0x73773777, 0x12010001,
292 	0x98fc, 0xffffffff, 0x00000010,
293 	0x9b7c, 0x00ff0000, 0x00fc0000,
294 	0x8030, 0x00001f0f, 0x0000100a,
295 	0x2f48, 0x73773777, 0x12010001,
296 	0x2408, 0x00030000, 0x000c007f,
297 	0x8a14, 0xf000003f, 0x00000007,
298 	0x8b24, 0x3fff3fff, 0x00ff0fff,
299 	0x8b10, 0x0000ff0f, 0x00000000,
300 	0x28a4c, 0x07ffffff, 0x06000000,
301 	0x4d8, 0x00000fff, 0x00000100,
302 	0xa008, 0xffffffff, 0x00010000,
303 	0x913c, 0xffff03ff, 0x01000100,
304 	0x8c00, 0x000000ff, 0x00000003,
305 	0x8c04, 0xf8ff00ff, 0x40600060,
306 	0x8cf0, 0x1fff1fff, 0x08e00410,
307 	0x28350, 0x00000f01, 0x00000000,
308 	0x9508, 0xf700071f, 0x00000002,
309 	0x960c, 0xffffffff, 0x54763210,
310 	0x20ef8, 0x01ff01ff, 0x00000002,
311 	0x20e98, 0xfffffbff, 0x00200000,
312 	0x2015c, 0xffffffff, 0x00000f40,
313 	0x88c4, 0x001f3ae3, 0x00000082,
314 	0x8978, 0x3fffffff, 0x04050140,
315 	0x88d4, 0x0000001f, 0x00000010,
316 	0x8974, 0xffffffff, 0x00000000
317 };
318 
319 static const u32 scrapper_golden_registers[] =
320 {
321 	0x690, 0x3fff3fff, 0x20c00033,
322 	0x918c, 0x0fff0fff, 0x00010006,
323 	0x918c, 0x0fff0fff, 0x00010006,
324 	0x91a8, 0x0fff0fff, 0x00010006,
325 	0x91a8, 0x0fff0fff, 0x00010006,
326 	0x9150, 0xffffdfff, 0x6e944040,
327 	0x9150, 0xffffdfff, 0x6e944040,
328 	0x917c, 0x0fff0fff, 0x00030002,
329 	0x917c, 0x0fff0fff, 0x00030002,
330 	0x9198, 0x0fff0fff, 0x00030002,
331 	0x9198, 0x0fff0fff, 0x00030002,
332 	0x915c, 0x0fff0fff, 0x00010000,
333 	0x915c, 0x0fff0fff, 0x00010000,
334 	0x3f90, 0xffff0001, 0xff000000,
335 	0x3f90, 0xffff0001, 0xff000000,
336 	0x9178, 0x0fff0fff, 0x00070000,
337 	0x9178, 0x0fff0fff, 0x00070000,
338 	0x9194, 0x0fff0fff, 0x00070000,
339 	0x9194, 0x0fff0fff, 0x00070000,
340 	0x9148, 0xffff0001, 0xff000000,
341 	0x9148, 0xffff0001, 0xff000000,
342 	0x9190, 0x0fff0fff, 0x00090008,
343 	0x9190, 0x0fff0fff, 0x00090008,
344 	0x91ac, 0x0fff0fff, 0x00090008,
345 	0x91ac, 0x0fff0fff, 0x00090008,
346 	0x3f94, 0xffff0000, 0xff000000,
347 	0x3f94, 0xffff0000, 0xff000000,
348 	0x914c, 0xffff0000, 0xff000000,
349 	0x914c, 0xffff0000, 0xff000000,
350 	0x929c, 0x00000fff, 0x00000001,
351 	0x929c, 0x00000fff, 0x00000001,
352 	0x55e4, 0xff607fff, 0xfc000100,
353 	0x8a18, 0xff000fff, 0x00000100,
354 	0x8a18, 0xff000fff, 0x00000100,
355 	0x8b28, 0xff000fff, 0x00000100,
356 	0x8b28, 0xff000fff, 0x00000100,
357 	0x9144, 0xfffc0fff, 0x00000100,
358 	0x9144, 0xfffc0fff, 0x00000100,
359 	0x6ed8, 0x00010101, 0x00010000,
360 	0x9830, 0xffffffff, 0x00000000,
361 	0x9830, 0xffffffff, 0x00000000,
362 	0x9834, 0xf00fffff, 0x00000400,
363 	0x9834, 0xf00fffff, 0x00000400,
364 	0x9838, 0xfffffffe, 0x00000000,
365 	0x9838, 0xfffffffe, 0x00000000,
366 	0xd0c0, 0xff000fff, 0x00000100,
367 	0xd02c, 0xbfffff1f, 0x08421000,
368 	0xd02c, 0xbfffff1f, 0x08421000,
369 	0xd0b8, 0x73773777, 0x12010001,
370 	0xd0b8, 0x73773777, 0x12010001,
371 	0x5bb0, 0x000000f0, 0x00000070,
372 	0x98f8, 0x73773777, 0x12010001,
373 	0x98f8, 0x73773777, 0x12010001,
374 	0x98fc, 0xffffffff, 0x00000010,
375 	0x98fc, 0xffffffff, 0x00000010,
376 	0x9b7c, 0x00ff0000, 0x00fc0000,
377 	0x9b7c, 0x00ff0000, 0x00fc0000,
378 	0x8030, 0x00001f0f, 0x0000100a,
379 	0x8030, 0x00001f0f, 0x0000100a,
380 	0x2f48, 0x73773777, 0x12010001,
381 	0x2f48, 0x73773777, 0x12010001,
382 	0x2408, 0x00030000, 0x000c007f,
383 	0x8a14, 0xf000003f, 0x00000007,
384 	0x8a14, 0xf000003f, 0x00000007,
385 	0x8b24, 0x3fff3fff, 0x00ff0fff,
386 	0x8b24, 0x3fff3fff, 0x00ff0fff,
387 	0x8b10, 0x0000ff0f, 0x00000000,
388 	0x8b10, 0x0000ff0f, 0x00000000,
389 	0x28a4c, 0x07ffffff, 0x06000000,
390 	0x28a4c, 0x07ffffff, 0x06000000,
391 	0x4d8, 0x00000fff, 0x00000100,
392 	0x4d8, 0x00000fff, 0x00000100,
393 	0xa008, 0xffffffff, 0x00010000,
394 	0xa008, 0xffffffff, 0x00010000,
395 	0x913c, 0xffff03ff, 0x01000100,
396 	0x913c, 0xffff03ff, 0x01000100,
397 	0x90e8, 0x001fffff, 0x010400c0,
398 	0x8c00, 0x000000ff, 0x00000003,
399 	0x8c00, 0x000000ff, 0x00000003,
400 	0x8c04, 0xf8ff00ff, 0x40600060,
401 	0x8c04, 0xf8ff00ff, 0x40600060,
402 	0x8c30, 0x0000000f, 0x00040005,
403 	0x8cf0, 0x1fff1fff, 0x08e00410,
404 	0x8cf0, 0x1fff1fff, 0x08e00410,
405 	0x900c, 0x00ffffff, 0x0017071f,
406 	0x28350, 0x00000f01, 0x00000000,
407 	0x28350, 0x00000f01, 0x00000000,
408 	0x9508, 0xf700071f, 0x00000002,
409 	0x9508, 0xf700071f, 0x00000002,
410 	0x9688, 0x00300000, 0x0017000f,
411 	0x960c, 0xffffffff, 0x54763210,
412 	0x960c, 0xffffffff, 0x54763210,
413 	0x20ef8, 0x01ff01ff, 0x00000002,
414 	0x20e98, 0xfffffbff, 0x00200000,
415 	0x2015c, 0xffffffff, 0x00000f40,
416 	0x88c4, 0x001f3ae3, 0x00000082,
417 	0x88c4, 0x001f3ae3, 0x00000082,
418 	0x8978, 0x3fffffff, 0x04050140,
419 	0x8978, 0x3fffffff, 0x04050140,
420 	0x88d4, 0x0000001f, 0x00000010,
421 	0x88d4, 0x0000001f, 0x00000010,
422 	0x8974, 0xffffffff, 0x00000000,
423 	0x8974, 0xffffffff, 0x00000000
424 };
425 
426 static void ni_init_golden_registers(struct radeon_device *rdev)
427 {
428 	switch (rdev->family) {
429 	case CHIP_CAYMAN:
430 		radeon_program_register_sequence(rdev,
431 						 cayman_golden_registers,
432 						 (const u32)ARRAY_SIZE(cayman_golden_registers));
433 		radeon_program_register_sequence(rdev,
434 						 cayman_golden_registers2,
435 						 (const u32)ARRAY_SIZE(cayman_golden_registers2));
436 		break;
437 	case CHIP_ARUBA:
438 		if ((rdev->pdev->device == 0x9900) ||
439 		    (rdev->pdev->device == 0x9901) ||
440 		    (rdev->pdev->device == 0x9903) ||
441 		    (rdev->pdev->device == 0x9904) ||
442 		    (rdev->pdev->device == 0x9905) ||
443 		    (rdev->pdev->device == 0x9906) ||
444 		    (rdev->pdev->device == 0x9907) ||
445 		    (rdev->pdev->device == 0x9908) ||
446 		    (rdev->pdev->device == 0x9909) ||
447 		    (rdev->pdev->device == 0x990A) ||
448 		    (rdev->pdev->device == 0x990B) ||
449 		    (rdev->pdev->device == 0x990C) ||
450 		    (rdev->pdev->device == 0x990D) ||
451 		    (rdev->pdev->device == 0x990E) ||
452 		    (rdev->pdev->device == 0x990F) ||
453 		    (rdev->pdev->device == 0x9910) ||
454 		    (rdev->pdev->device == 0x9913) ||
455 		    (rdev->pdev->device == 0x9917) ||
456 		    (rdev->pdev->device == 0x9918)) {
457 			radeon_program_register_sequence(rdev,
458 							 dvst_golden_registers,
459 							 (const u32)ARRAY_SIZE(dvst_golden_registers));
460 			radeon_program_register_sequence(rdev,
461 							 dvst_golden_registers2,
462 							 (const u32)ARRAY_SIZE(dvst_golden_registers2));
463 		} else {
464 			radeon_program_register_sequence(rdev,
465 							 scrapper_golden_registers,
466 							 (const u32)ARRAY_SIZE(scrapper_golden_registers));
467 			radeon_program_register_sequence(rdev,
468 							 dvst_golden_registers2,
469 							 (const u32)ARRAY_SIZE(dvst_golden_registers2));
470 		}
471 		break;
472 	default:
473 		break;
474 	}
475 }
476 
477 #define BTC_IO_MC_REGS_SIZE 29
478 
479 static const u32 barts_io_mc_regs[BTC_IO_MC_REGS_SIZE][2] = {
480 	{0x00000077, 0xff010100},
481 	{0x00000078, 0x00000000},
482 	{0x00000079, 0x00001434},
483 	{0x0000007a, 0xcc08ec08},
484 	{0x0000007b, 0x00040000},
485 	{0x0000007c, 0x000080c0},
486 	{0x0000007d, 0x09000000},
487 	{0x0000007e, 0x00210404},
488 	{0x00000081, 0x08a8e800},
489 	{0x00000082, 0x00030444},
490 	{0x00000083, 0x00000000},
491 	{0x00000085, 0x00000001},
492 	{0x00000086, 0x00000002},
493 	{0x00000087, 0x48490000},
494 	{0x00000088, 0x20244647},
495 	{0x00000089, 0x00000005},
496 	{0x0000008b, 0x66030000},
497 	{0x0000008c, 0x00006603},
498 	{0x0000008d, 0x00000100},
499 	{0x0000008f, 0x00001c0a},
500 	{0x00000090, 0xff000001},
501 	{0x00000094, 0x00101101},
502 	{0x00000095, 0x00000fff},
503 	{0x00000096, 0x00116fff},
504 	{0x00000097, 0x60010000},
505 	{0x00000098, 0x10010000},
506 	{0x00000099, 0x00006000},
507 	{0x0000009a, 0x00001000},
508 	{0x0000009f, 0x00946a00}
509 };
510 
511 static const u32 turks_io_mc_regs[BTC_IO_MC_REGS_SIZE][2] = {
512 	{0x00000077, 0xff010100},
513 	{0x00000078, 0x00000000},
514 	{0x00000079, 0x00001434},
515 	{0x0000007a, 0xcc08ec08},
516 	{0x0000007b, 0x00040000},
517 	{0x0000007c, 0x000080c0},
518 	{0x0000007d, 0x09000000},
519 	{0x0000007e, 0x00210404},
520 	{0x00000081, 0x08a8e800},
521 	{0x00000082, 0x00030444},
522 	{0x00000083, 0x00000000},
523 	{0x00000085, 0x00000001},
524 	{0x00000086, 0x00000002},
525 	{0x00000087, 0x48490000},
526 	{0x00000088, 0x20244647},
527 	{0x00000089, 0x00000005},
528 	{0x0000008b, 0x66030000},
529 	{0x0000008c, 0x00006603},
530 	{0x0000008d, 0x00000100},
531 	{0x0000008f, 0x00001c0a},
532 	{0x00000090, 0xff000001},
533 	{0x00000094, 0x00101101},
534 	{0x00000095, 0x00000fff},
535 	{0x00000096, 0x00116fff},
536 	{0x00000097, 0x60010000},
537 	{0x00000098, 0x10010000},
538 	{0x00000099, 0x00006000},
539 	{0x0000009a, 0x00001000},
540 	{0x0000009f, 0x00936a00}
541 };
542 
543 static const u32 caicos_io_mc_regs[BTC_IO_MC_REGS_SIZE][2] = {
544 	{0x00000077, 0xff010100},
545 	{0x00000078, 0x00000000},
546 	{0x00000079, 0x00001434},
547 	{0x0000007a, 0xcc08ec08},
548 	{0x0000007b, 0x00040000},
549 	{0x0000007c, 0x000080c0},
550 	{0x0000007d, 0x09000000},
551 	{0x0000007e, 0x00210404},
552 	{0x00000081, 0x08a8e800},
553 	{0x00000082, 0x00030444},
554 	{0x00000083, 0x00000000},
555 	{0x00000085, 0x00000001},
556 	{0x00000086, 0x00000002},
557 	{0x00000087, 0x48490000},
558 	{0x00000088, 0x20244647},
559 	{0x00000089, 0x00000005},
560 	{0x0000008b, 0x66030000},
561 	{0x0000008c, 0x00006603},
562 	{0x0000008d, 0x00000100},
563 	{0x0000008f, 0x00001c0a},
564 	{0x00000090, 0xff000001},
565 	{0x00000094, 0x00101101},
566 	{0x00000095, 0x00000fff},
567 	{0x00000096, 0x00116fff},
568 	{0x00000097, 0x60010000},
569 	{0x00000098, 0x10010000},
570 	{0x00000099, 0x00006000},
571 	{0x0000009a, 0x00001000},
572 	{0x0000009f, 0x00916a00}
573 };
574 
575 static const u32 cayman_io_mc_regs[BTC_IO_MC_REGS_SIZE][2] = {
576 	{0x00000077, 0xff010100},
577 	{0x00000078, 0x00000000},
578 	{0x00000079, 0x00001434},
579 	{0x0000007a, 0xcc08ec08},
580 	{0x0000007b, 0x00040000},
581 	{0x0000007c, 0x000080c0},
582 	{0x0000007d, 0x09000000},
583 	{0x0000007e, 0x00210404},
584 	{0x00000081, 0x08a8e800},
585 	{0x00000082, 0x00030444},
586 	{0x00000083, 0x00000000},
587 	{0x00000085, 0x00000001},
588 	{0x00000086, 0x00000002},
589 	{0x00000087, 0x48490000},
590 	{0x00000088, 0x20244647},
591 	{0x00000089, 0x00000005},
592 	{0x0000008b, 0x66030000},
593 	{0x0000008c, 0x00006603},
594 	{0x0000008d, 0x00000100},
595 	{0x0000008f, 0x00001c0a},
596 	{0x00000090, 0xff000001},
597 	{0x00000094, 0x00101101},
598 	{0x00000095, 0x00000fff},
599 	{0x00000096, 0x00116fff},
600 	{0x00000097, 0x60010000},
601 	{0x00000098, 0x10010000},
602 	{0x00000099, 0x00006000},
603 	{0x0000009a, 0x00001000},
604 	{0x0000009f, 0x00976b00}
605 };
606 
607 int ni_mc_load_microcode(struct radeon_device *rdev)
608 {
609 	const __be32 *fw_data;
610 	u32 mem_type, running, blackout = 0;
611 	u32 *io_mc_regs;
612 	int i, ucode_size, regs_size;
613 
614 	if (!rdev->mc_fw)
615 		return -EINVAL;
616 
617 	switch (rdev->family) {
618 	case CHIP_BARTS:
619 		io_mc_regs = (u32 *)&barts_io_mc_regs;
620 		ucode_size = BTC_MC_UCODE_SIZE;
621 		regs_size = BTC_IO_MC_REGS_SIZE;
622 		break;
623 	case CHIP_TURKS:
624 		io_mc_regs = (u32 *)&turks_io_mc_regs;
625 		ucode_size = BTC_MC_UCODE_SIZE;
626 		regs_size = BTC_IO_MC_REGS_SIZE;
627 		break;
628 	case CHIP_CAICOS:
629 	default:
630 		io_mc_regs = (u32 *)&caicos_io_mc_regs;
631 		ucode_size = BTC_MC_UCODE_SIZE;
632 		regs_size = BTC_IO_MC_REGS_SIZE;
633 		break;
634 	case CHIP_CAYMAN:
635 		io_mc_regs = (u32 *)&cayman_io_mc_regs;
636 		ucode_size = CAYMAN_MC_UCODE_SIZE;
637 		regs_size = BTC_IO_MC_REGS_SIZE;
638 		break;
639 	}
640 
641 	mem_type = (RREG32(MC_SEQ_MISC0) & MC_SEQ_MISC0_GDDR5_MASK) >> MC_SEQ_MISC0_GDDR5_SHIFT;
642 	running = RREG32(MC_SEQ_SUP_CNTL) & RUN_MASK;
643 
644 	if ((mem_type == MC_SEQ_MISC0_GDDR5_VALUE) && (running == 0)) {
645 		if (running) {
646 			blackout = RREG32(MC_SHARED_BLACKOUT_CNTL);
647 			WREG32(MC_SHARED_BLACKOUT_CNTL, 1);
648 		}
649 
650 		/* reset the engine and set to writable */
651 		WREG32(MC_SEQ_SUP_CNTL, 0x00000008);
652 		WREG32(MC_SEQ_SUP_CNTL, 0x00000010);
653 
654 		/* load mc io regs */
655 		for (i = 0; i < regs_size; i++) {
656 			WREG32(MC_SEQ_IO_DEBUG_INDEX, io_mc_regs[(i << 1)]);
657 			WREG32(MC_SEQ_IO_DEBUG_DATA, io_mc_regs[(i << 1) + 1]);
658 		}
659 		/* load the MC ucode */
660 		fw_data = (const __be32 *)rdev->mc_fw->data;
661 		for (i = 0; i < ucode_size; i++)
662 			WREG32(MC_SEQ_SUP_PGM, be32_to_cpup(fw_data++));
663 
664 		/* put the engine back into the active state */
665 		WREG32(MC_SEQ_SUP_CNTL, 0x00000008);
666 		WREG32(MC_SEQ_SUP_CNTL, 0x00000004);
667 		WREG32(MC_SEQ_SUP_CNTL, 0x00000001);
668 
669 		/* wait for training to complete */
670 		for (i = 0; i < rdev->usec_timeout; i++) {
671 			if (RREG32(MC_IO_PAD_CNTL_D0) & MEM_FALL_OUT_CMD)
672 				break;
673 			udelay(1);
674 		}
675 
676 		if (running)
677 			WREG32(MC_SHARED_BLACKOUT_CNTL, blackout);
678 	}
679 
680 	return 0;
681 }
682 
683 int ni_init_microcode(struct radeon_device *rdev)
684 {
685 	const char *chip_name;
686 	const char *rlc_chip_name;
687 	size_t pfp_req_size, me_req_size, rlc_req_size, mc_req_size;
688 	size_t smc_req_size = 0;
689 	char fw_name[30];
690 	int err;
691 
692 	DRM_DEBUG("\n");
693 
694 	switch (rdev->family) {
695 	case CHIP_BARTS:
696 		chip_name = "BARTS";
697 		rlc_chip_name = "BTC";
698 		pfp_req_size = EVERGREEN_PFP_UCODE_SIZE * 4;
699 		me_req_size = EVERGREEN_PM4_UCODE_SIZE * 4;
700 		rlc_req_size = EVERGREEN_RLC_UCODE_SIZE * 4;
701 		mc_req_size = BTC_MC_UCODE_SIZE * 4;
702 		smc_req_size = ALIGN(BARTS_SMC_UCODE_SIZE, 4);
703 		break;
704 	case CHIP_TURKS:
705 		chip_name = "TURKS";
706 		rlc_chip_name = "BTC";
707 		pfp_req_size = EVERGREEN_PFP_UCODE_SIZE * 4;
708 		me_req_size = EVERGREEN_PM4_UCODE_SIZE * 4;
709 		rlc_req_size = EVERGREEN_RLC_UCODE_SIZE * 4;
710 		mc_req_size = BTC_MC_UCODE_SIZE * 4;
711 		smc_req_size = ALIGN(TURKS_SMC_UCODE_SIZE, 4);
712 		break;
713 	case CHIP_CAICOS:
714 		chip_name = "CAICOS";
715 		rlc_chip_name = "BTC";
716 		pfp_req_size = EVERGREEN_PFP_UCODE_SIZE * 4;
717 		me_req_size = EVERGREEN_PM4_UCODE_SIZE * 4;
718 		rlc_req_size = EVERGREEN_RLC_UCODE_SIZE * 4;
719 		mc_req_size = BTC_MC_UCODE_SIZE * 4;
720 		smc_req_size = ALIGN(CAICOS_SMC_UCODE_SIZE, 4);
721 		break;
722 	case CHIP_CAYMAN:
723 		chip_name = "CAYMAN";
724 		rlc_chip_name = "CAYMAN";
725 		pfp_req_size = CAYMAN_PFP_UCODE_SIZE * 4;
726 		me_req_size = CAYMAN_PM4_UCODE_SIZE * 4;
727 		rlc_req_size = CAYMAN_RLC_UCODE_SIZE * 4;
728 		mc_req_size = CAYMAN_MC_UCODE_SIZE * 4;
729 		smc_req_size = ALIGN(CAYMAN_SMC_UCODE_SIZE, 4);
730 		break;
731 	case CHIP_ARUBA:
732 		chip_name = "ARUBA";
733 		rlc_chip_name = "ARUBA";
734 		/* pfp/me same size as CAYMAN */
735 		pfp_req_size = CAYMAN_PFP_UCODE_SIZE * 4;
736 		me_req_size = CAYMAN_PM4_UCODE_SIZE * 4;
737 		rlc_req_size = ARUBA_RLC_UCODE_SIZE * 4;
738 		mc_req_size = 0;
739 		break;
740 	default: BUG();
741 	}
742 
743 	DRM_INFO("Loading %s Microcode\n", chip_name);
744 
745 	snprintf(fw_name, sizeof(fw_name), "radeon/%s_pfp.bin", chip_name);
746 	err = request_firmware(&rdev->pfp_fw, fw_name, rdev->dev);
747 	if (err)
748 		goto out;
749 	if (rdev->pfp_fw->size != pfp_req_size) {
750 		printk(KERN_ERR
751 		       "ni_cp: Bogus length %zu in firmware \"%s\"\n",
752 		       rdev->pfp_fw->size, fw_name);
753 		err = -EINVAL;
754 		goto out;
755 	}
756 
757 	snprintf(fw_name, sizeof(fw_name), "radeon/%s_me.bin", chip_name);
758 	err = request_firmware(&rdev->me_fw, fw_name, rdev->dev);
759 	if (err)
760 		goto out;
761 	if (rdev->me_fw->size != me_req_size) {
762 		printk(KERN_ERR
763 		       "ni_cp: Bogus length %zu in firmware \"%s\"\n",
764 		       rdev->me_fw->size, fw_name);
765 		err = -EINVAL;
766 	}
767 
768 	snprintf(fw_name, sizeof(fw_name), "radeon/%s_rlc.bin", rlc_chip_name);
769 	err = request_firmware(&rdev->rlc_fw, fw_name, rdev->dev);
770 	if (err)
771 		goto out;
772 	if (rdev->rlc_fw->size != rlc_req_size) {
773 		printk(KERN_ERR
774 		       "ni_rlc: Bogus length %zu in firmware \"%s\"\n",
775 		       rdev->rlc_fw->size, fw_name);
776 		err = -EINVAL;
777 	}
778 
779 	/* no MC ucode on TN */
780 	if (!(rdev->flags & RADEON_IS_IGP)) {
781 		snprintf(fw_name, sizeof(fw_name), "radeon/%s_mc.bin", chip_name);
782 		err = request_firmware(&rdev->mc_fw, fw_name, rdev->dev);
783 		if (err)
784 			goto out;
785 		if (rdev->mc_fw->size != mc_req_size) {
786 			printk(KERN_ERR
787 			       "ni_mc: Bogus length %zu in firmware \"%s\"\n",
788 			       rdev->mc_fw->size, fw_name);
789 			err = -EINVAL;
790 		}
791 	}
792 
793 	if ((rdev->family >= CHIP_BARTS) && (rdev->family <= CHIP_CAYMAN)) {
794 		snprintf(fw_name, sizeof(fw_name), "radeon/%s_smc.bin", chip_name);
795 		err = request_firmware(&rdev->smc_fw, fw_name, rdev->dev);
796 		if (err) {
797 			printk(KERN_ERR
798 			       "smc: error loading firmware \"%s\"\n",
799 			       fw_name);
800 			release_firmware(rdev->smc_fw);
801 			rdev->smc_fw = NULL;
802 			err = 0;
803 		} else if (rdev->smc_fw->size != smc_req_size) {
804 			printk(KERN_ERR
805 			       "ni_mc: Bogus length %zu in firmware \"%s\"\n",
806 			       rdev->mc_fw->size, fw_name);
807 			err = -EINVAL;
808 		}
809 	}
810 
811 out:
812 	if (err) {
813 		if (err != -EINVAL)
814 			printk(KERN_ERR
815 			       "ni_cp: Failed to load firmware \"%s\"\n",
816 			       fw_name);
817 		release_firmware(rdev->pfp_fw);
818 		rdev->pfp_fw = NULL;
819 		release_firmware(rdev->me_fw);
820 		rdev->me_fw = NULL;
821 		release_firmware(rdev->rlc_fw);
822 		rdev->rlc_fw = NULL;
823 		release_firmware(rdev->mc_fw);
824 		rdev->mc_fw = NULL;
825 	}
826 	return err;
827 }
828 
829 int tn_get_temp(struct radeon_device *rdev)
830 {
831 	u32 temp = RREG32_SMC(TN_CURRENT_GNB_TEMP) & 0x7ff;
832 	int actual_temp = (temp / 8) - 49;
833 
834 	return actual_temp * 1000;
835 }
836 
837 /*
838  * Core functions
839  */
840 static void cayman_gpu_init(struct radeon_device *rdev)
841 {
842 	u32 gb_addr_config = 0;
843 	u32 mc_shared_chmap, mc_arb_ramcfg;
844 	u32 cgts_tcc_disable;
845 	u32 sx_debug_1;
846 	u32 smx_dc_ctl0;
847 	u32 cgts_sm_ctrl_reg;
848 	u32 hdp_host_path_cntl;
849 	u32 tmp;
850 	u32 disabled_rb_mask;
851 	int i, j;
852 
853 	switch (rdev->family) {
854 	case CHIP_CAYMAN:
855 		rdev->config.cayman.max_shader_engines = 2;
856 		rdev->config.cayman.max_pipes_per_simd = 4;
857 		rdev->config.cayman.max_tile_pipes = 8;
858 		rdev->config.cayman.max_simds_per_se = 12;
859 		rdev->config.cayman.max_backends_per_se = 4;
860 		rdev->config.cayman.max_texture_channel_caches = 8;
861 		rdev->config.cayman.max_gprs = 256;
862 		rdev->config.cayman.max_threads = 256;
863 		rdev->config.cayman.max_gs_threads = 32;
864 		rdev->config.cayman.max_stack_entries = 512;
865 		rdev->config.cayman.sx_num_of_sets = 8;
866 		rdev->config.cayman.sx_max_export_size = 256;
867 		rdev->config.cayman.sx_max_export_pos_size = 64;
868 		rdev->config.cayman.sx_max_export_smx_size = 192;
869 		rdev->config.cayman.max_hw_contexts = 8;
870 		rdev->config.cayman.sq_num_cf_insts = 2;
871 
872 		rdev->config.cayman.sc_prim_fifo_size = 0x100;
873 		rdev->config.cayman.sc_hiz_tile_fifo_size = 0x30;
874 		rdev->config.cayman.sc_earlyz_tile_fifo_size = 0x130;
875 		gb_addr_config = CAYMAN_GB_ADDR_CONFIG_GOLDEN;
876 		break;
877 	case CHIP_ARUBA:
878 	default:
879 		rdev->config.cayman.max_shader_engines = 1;
880 		rdev->config.cayman.max_pipes_per_simd = 4;
881 		rdev->config.cayman.max_tile_pipes = 2;
882 		if ((rdev->pdev->device == 0x9900) ||
883 		    (rdev->pdev->device == 0x9901) ||
884 		    (rdev->pdev->device == 0x9905) ||
885 		    (rdev->pdev->device == 0x9906) ||
886 		    (rdev->pdev->device == 0x9907) ||
887 		    (rdev->pdev->device == 0x9908) ||
888 		    (rdev->pdev->device == 0x9909) ||
889 		    (rdev->pdev->device == 0x990B) ||
890 		    (rdev->pdev->device == 0x990C) ||
891 		    (rdev->pdev->device == 0x990F) ||
892 		    (rdev->pdev->device == 0x9910) ||
893 		    (rdev->pdev->device == 0x9917) ||
894 		    (rdev->pdev->device == 0x9999) ||
895 		    (rdev->pdev->device == 0x999C)) {
896 			rdev->config.cayman.max_simds_per_se = 6;
897 			rdev->config.cayman.max_backends_per_se = 2;
898 			rdev->config.cayman.max_hw_contexts = 8;
899 			rdev->config.cayman.sx_max_export_size = 256;
900 			rdev->config.cayman.sx_max_export_pos_size = 64;
901 			rdev->config.cayman.sx_max_export_smx_size = 192;
902 		} else if ((rdev->pdev->device == 0x9903) ||
903 			   (rdev->pdev->device == 0x9904) ||
904 			   (rdev->pdev->device == 0x990A) ||
905 			   (rdev->pdev->device == 0x990D) ||
906 			   (rdev->pdev->device == 0x990E) ||
907 			   (rdev->pdev->device == 0x9913) ||
908 			   (rdev->pdev->device == 0x9918) ||
909 			   (rdev->pdev->device == 0x999D)) {
910 			rdev->config.cayman.max_simds_per_se = 4;
911 			rdev->config.cayman.max_backends_per_se = 2;
912 			rdev->config.cayman.max_hw_contexts = 8;
913 			rdev->config.cayman.sx_max_export_size = 256;
914 			rdev->config.cayman.sx_max_export_pos_size = 64;
915 			rdev->config.cayman.sx_max_export_smx_size = 192;
916 		} else if ((rdev->pdev->device == 0x9919) ||
917 			   (rdev->pdev->device == 0x9990) ||
918 			   (rdev->pdev->device == 0x9991) ||
919 			   (rdev->pdev->device == 0x9994) ||
920 			   (rdev->pdev->device == 0x9995) ||
921 			   (rdev->pdev->device == 0x9996) ||
922 			   (rdev->pdev->device == 0x999A) ||
923 			   (rdev->pdev->device == 0x99A0)) {
924 			rdev->config.cayman.max_simds_per_se = 3;
925 			rdev->config.cayman.max_backends_per_se = 1;
926 			rdev->config.cayman.max_hw_contexts = 4;
927 			rdev->config.cayman.sx_max_export_size = 128;
928 			rdev->config.cayman.sx_max_export_pos_size = 32;
929 			rdev->config.cayman.sx_max_export_smx_size = 96;
930 		} else {
931 			rdev->config.cayman.max_simds_per_se = 2;
932 			rdev->config.cayman.max_backends_per_se = 1;
933 			rdev->config.cayman.max_hw_contexts = 4;
934 			rdev->config.cayman.sx_max_export_size = 128;
935 			rdev->config.cayman.sx_max_export_pos_size = 32;
936 			rdev->config.cayman.sx_max_export_smx_size = 96;
937 		}
938 		rdev->config.cayman.max_texture_channel_caches = 2;
939 		rdev->config.cayman.max_gprs = 256;
940 		rdev->config.cayman.max_threads = 256;
941 		rdev->config.cayman.max_gs_threads = 32;
942 		rdev->config.cayman.max_stack_entries = 512;
943 		rdev->config.cayman.sx_num_of_sets = 8;
944 		rdev->config.cayman.sq_num_cf_insts = 2;
945 
946 		rdev->config.cayman.sc_prim_fifo_size = 0x40;
947 		rdev->config.cayman.sc_hiz_tile_fifo_size = 0x30;
948 		rdev->config.cayman.sc_earlyz_tile_fifo_size = 0x130;
949 		gb_addr_config = ARUBA_GB_ADDR_CONFIG_GOLDEN;
950 		break;
951 	}
952 
953 	/* Initialize HDP */
954 	for (i = 0, j = 0; i < 32; i++, j += 0x18) {
955 		WREG32((0x2c14 + j), 0x00000000);
956 		WREG32((0x2c18 + j), 0x00000000);
957 		WREG32((0x2c1c + j), 0x00000000);
958 		WREG32((0x2c20 + j), 0x00000000);
959 		WREG32((0x2c24 + j), 0x00000000);
960 	}
961 
962 	WREG32(GRBM_CNTL, GRBM_READ_TIMEOUT(0xff));
963 
964 	evergreen_fix_pci_max_read_req_size(rdev);
965 
966 	mc_shared_chmap = RREG32(MC_SHARED_CHMAP);
967 	mc_arb_ramcfg = RREG32(MC_ARB_RAMCFG);
968 
969 	tmp = (mc_arb_ramcfg & NOOFCOLS_MASK) >> NOOFCOLS_SHIFT;
970 	rdev->config.cayman.mem_row_size_in_kb = (4 * (1 << (8 + tmp))) / 1024;
971 	if (rdev->config.cayman.mem_row_size_in_kb > 4)
972 		rdev->config.cayman.mem_row_size_in_kb = 4;
973 	/* XXX use MC settings? */
974 	rdev->config.cayman.shader_engine_tile_size = 32;
975 	rdev->config.cayman.num_gpus = 1;
976 	rdev->config.cayman.multi_gpu_tile_size = 64;
977 
978 	tmp = (gb_addr_config & NUM_PIPES_MASK) >> NUM_PIPES_SHIFT;
979 	rdev->config.cayman.num_tile_pipes = (1 << tmp);
980 	tmp = (gb_addr_config & PIPE_INTERLEAVE_SIZE_MASK) >> PIPE_INTERLEAVE_SIZE_SHIFT;
981 	rdev->config.cayman.mem_max_burst_length_bytes = (tmp + 1) * 256;
982 	tmp = (gb_addr_config & NUM_SHADER_ENGINES_MASK) >> NUM_SHADER_ENGINES_SHIFT;
983 	rdev->config.cayman.num_shader_engines = tmp + 1;
984 	tmp = (gb_addr_config & NUM_GPUS_MASK) >> NUM_GPUS_SHIFT;
985 	rdev->config.cayman.num_gpus = tmp + 1;
986 	tmp = (gb_addr_config & MULTI_GPU_TILE_SIZE_MASK) >> MULTI_GPU_TILE_SIZE_SHIFT;
987 	rdev->config.cayman.multi_gpu_tile_size = 1 << tmp;
988 	tmp = (gb_addr_config & ROW_SIZE_MASK) >> ROW_SIZE_SHIFT;
989 	rdev->config.cayman.mem_row_size_in_kb = 1 << tmp;
990 
991 
992 	/* setup tiling info dword.  gb_addr_config is not adequate since it does
993 	 * not have bank info, so create a custom tiling dword.
994 	 * bits 3:0   num_pipes
995 	 * bits 7:4   num_banks
996 	 * bits 11:8  group_size
997 	 * bits 15:12 row_size
998 	 */
999 	rdev->config.cayman.tile_config = 0;
1000 	switch (rdev->config.cayman.num_tile_pipes) {
1001 	case 1:
1002 	default:
1003 		rdev->config.cayman.tile_config |= (0 << 0);
1004 		break;
1005 	case 2:
1006 		rdev->config.cayman.tile_config |= (1 << 0);
1007 		break;
1008 	case 4:
1009 		rdev->config.cayman.tile_config |= (2 << 0);
1010 		break;
1011 	case 8:
1012 		rdev->config.cayman.tile_config |= (3 << 0);
1013 		break;
1014 	}
1015 
1016 	/* num banks is 8 on all fusion asics. 0 = 4, 1 = 8, 2 = 16 */
1017 	if (rdev->flags & RADEON_IS_IGP)
1018 		rdev->config.cayman.tile_config |= 1 << 4;
1019 	else {
1020 		switch ((mc_arb_ramcfg & NOOFBANK_MASK) >> NOOFBANK_SHIFT) {
1021 		case 0: /* four banks */
1022 			rdev->config.cayman.tile_config |= 0 << 4;
1023 			break;
1024 		case 1: /* eight banks */
1025 			rdev->config.cayman.tile_config |= 1 << 4;
1026 			break;
1027 		case 2: /* sixteen banks */
1028 		default:
1029 			rdev->config.cayman.tile_config |= 2 << 4;
1030 			break;
1031 		}
1032 	}
1033 	rdev->config.cayman.tile_config |=
1034 		((gb_addr_config & PIPE_INTERLEAVE_SIZE_MASK) >> PIPE_INTERLEAVE_SIZE_SHIFT) << 8;
1035 	rdev->config.cayman.tile_config |=
1036 		((gb_addr_config & ROW_SIZE_MASK) >> ROW_SIZE_SHIFT) << 12;
1037 
1038 	tmp = 0;
1039 	for (i = (rdev->config.cayman.max_shader_engines - 1); i >= 0; i--) {
1040 		u32 rb_disable_bitmap;
1041 
1042 		WREG32(GRBM_GFX_INDEX, INSTANCE_BROADCAST_WRITES | SE_INDEX(i));
1043 		WREG32(RLC_GFX_INDEX, INSTANCE_BROADCAST_WRITES | SE_INDEX(i));
1044 		rb_disable_bitmap = (RREG32(CC_RB_BACKEND_DISABLE) & 0x00ff0000) >> 16;
1045 		tmp <<= 4;
1046 		tmp |= rb_disable_bitmap;
1047 	}
1048 	/* enabled rb are just the one not disabled :) */
1049 	disabled_rb_mask = tmp;
1050 	tmp = 0;
1051 	for (i = 0; i < (rdev->config.cayman.max_backends_per_se * rdev->config.cayman.max_shader_engines); i++)
1052 		tmp |= (1 << i);
1053 	/* if all the backends are disabled, fix it up here */
1054 	if ((disabled_rb_mask & tmp) == tmp) {
1055 		for (i = 0; i < (rdev->config.cayman.max_backends_per_se * rdev->config.cayman.max_shader_engines); i++)
1056 			disabled_rb_mask &= ~(1 << i);
1057 	}
1058 
1059 	WREG32(GRBM_GFX_INDEX, INSTANCE_BROADCAST_WRITES | SE_BROADCAST_WRITES);
1060 	WREG32(RLC_GFX_INDEX, INSTANCE_BROADCAST_WRITES | SE_BROADCAST_WRITES);
1061 
1062 	WREG32(GB_ADDR_CONFIG, gb_addr_config);
1063 	WREG32(DMIF_ADDR_CONFIG, gb_addr_config);
1064 	if (ASIC_IS_DCE6(rdev))
1065 		WREG32(DMIF_ADDR_CALC, gb_addr_config);
1066 	WREG32(HDP_ADDR_CONFIG, gb_addr_config);
1067 	WREG32(DMA_TILING_CONFIG + DMA0_REGISTER_OFFSET, gb_addr_config);
1068 	WREG32(DMA_TILING_CONFIG + DMA1_REGISTER_OFFSET, gb_addr_config);
1069 	WREG32(UVD_UDEC_ADDR_CONFIG, gb_addr_config);
1070 	WREG32(UVD_UDEC_DB_ADDR_CONFIG, gb_addr_config);
1071 	WREG32(UVD_UDEC_DBW_ADDR_CONFIG, gb_addr_config);
1072 
1073 	if ((rdev->config.cayman.max_backends_per_se == 1) &&
1074 	    (rdev->flags & RADEON_IS_IGP)) {
1075 		if ((disabled_rb_mask & 3) == 1) {
1076 			/* RB0 disabled, RB1 enabled */
1077 			tmp = 0x11111111;
1078 		} else {
1079 			/* RB1 disabled, RB0 enabled */
1080 			tmp = 0x00000000;
1081 		}
1082 	} else {
1083 		tmp = gb_addr_config & NUM_PIPES_MASK;
1084 		tmp = r6xx_remap_render_backend(rdev, tmp,
1085 						rdev->config.cayman.max_backends_per_se *
1086 						rdev->config.cayman.max_shader_engines,
1087 						CAYMAN_MAX_BACKENDS, disabled_rb_mask);
1088 	}
1089 	WREG32(GB_BACKEND_MAP, tmp);
1090 
1091 	cgts_tcc_disable = 0xffff0000;
1092 	for (i = 0; i < rdev->config.cayman.max_texture_channel_caches; i++)
1093 		cgts_tcc_disable &= ~(1 << (16 + i));
1094 	WREG32(CGTS_TCC_DISABLE, cgts_tcc_disable);
1095 	WREG32(CGTS_SYS_TCC_DISABLE, cgts_tcc_disable);
1096 	WREG32(CGTS_USER_SYS_TCC_DISABLE, cgts_tcc_disable);
1097 	WREG32(CGTS_USER_TCC_DISABLE, cgts_tcc_disable);
1098 
1099 	/* reprogram the shader complex */
1100 	cgts_sm_ctrl_reg = RREG32(CGTS_SM_CTRL_REG);
1101 	for (i = 0; i < 16; i++)
1102 		WREG32(CGTS_SM_CTRL_REG, OVERRIDE);
1103 	WREG32(CGTS_SM_CTRL_REG, cgts_sm_ctrl_reg);
1104 
1105 	/* set HW defaults for 3D engine */
1106 	WREG32(CP_MEQ_THRESHOLDS, MEQ1_START(0x30) | MEQ2_START(0x60));
1107 
1108 	sx_debug_1 = RREG32(SX_DEBUG_1);
1109 	sx_debug_1 |= ENABLE_NEW_SMX_ADDRESS;
1110 	WREG32(SX_DEBUG_1, sx_debug_1);
1111 
1112 	smx_dc_ctl0 = RREG32(SMX_DC_CTL0);
1113 	smx_dc_ctl0 &= ~NUMBER_OF_SETS(0x1ff);
1114 	smx_dc_ctl0 |= NUMBER_OF_SETS(rdev->config.cayman.sx_num_of_sets);
1115 	WREG32(SMX_DC_CTL0, smx_dc_ctl0);
1116 
1117 	WREG32(SPI_CONFIG_CNTL_1, VTX_DONE_DELAY(4) | CRC_SIMD_ID_WADDR_DISABLE);
1118 
1119 	/* need to be explicitly zero-ed */
1120 	WREG32(VGT_OFFCHIP_LDS_BASE, 0);
1121 	WREG32(SQ_LSTMP_RING_BASE, 0);
1122 	WREG32(SQ_HSTMP_RING_BASE, 0);
1123 	WREG32(SQ_ESTMP_RING_BASE, 0);
1124 	WREG32(SQ_GSTMP_RING_BASE, 0);
1125 	WREG32(SQ_VSTMP_RING_BASE, 0);
1126 	WREG32(SQ_PSTMP_RING_BASE, 0);
1127 
1128 	WREG32(TA_CNTL_AUX, DISABLE_CUBE_ANISO);
1129 
1130 	WREG32(SX_EXPORT_BUFFER_SIZES, (COLOR_BUFFER_SIZE((rdev->config.cayman.sx_max_export_size / 4) - 1) |
1131 					POSITION_BUFFER_SIZE((rdev->config.cayman.sx_max_export_pos_size / 4) - 1) |
1132 					SMX_BUFFER_SIZE((rdev->config.cayman.sx_max_export_smx_size / 4) - 1)));
1133 
1134 	WREG32(PA_SC_FIFO_SIZE, (SC_PRIM_FIFO_SIZE(rdev->config.cayman.sc_prim_fifo_size) |
1135 				 SC_HIZ_TILE_FIFO_SIZE(rdev->config.cayman.sc_hiz_tile_fifo_size) |
1136 				 SC_EARLYZ_TILE_FIFO_SIZE(rdev->config.cayman.sc_earlyz_tile_fifo_size)));
1137 
1138 
1139 	WREG32(VGT_NUM_INSTANCES, 1);
1140 
1141 	WREG32(CP_PERFMON_CNTL, 0);
1142 
1143 	WREG32(SQ_MS_FIFO_SIZES, (CACHE_FIFO_SIZE(16 * rdev->config.cayman.sq_num_cf_insts) |
1144 				  FETCH_FIFO_HIWATER(0x4) |
1145 				  DONE_FIFO_HIWATER(0xe0) |
1146 				  ALU_UPDATE_FIFO_HIWATER(0x8)));
1147 
1148 	WREG32(SQ_GPR_RESOURCE_MGMT_1, NUM_CLAUSE_TEMP_GPRS(4));
1149 	WREG32(SQ_CONFIG, (VC_ENABLE |
1150 			   EXPORT_SRC_C |
1151 			   GFX_PRIO(0) |
1152 			   CS1_PRIO(0) |
1153 			   CS2_PRIO(1)));
1154 	WREG32(SQ_DYN_GPR_CNTL_PS_FLUSH_REQ, DYN_GPR_ENABLE);
1155 
1156 	WREG32(PA_SC_FORCE_EOV_MAX_CNTS, (FORCE_EOV_MAX_CLK_CNT(4095) |
1157 					  FORCE_EOV_MAX_REZ_CNT(255)));
1158 
1159 	WREG32(VGT_CACHE_INVALIDATION, CACHE_INVALIDATION(VC_AND_TC) |
1160 	       AUTO_INVLD_EN(ES_AND_GS_AUTO));
1161 
1162 	WREG32(VGT_GS_VERTEX_REUSE, 16);
1163 	WREG32(PA_SC_LINE_STIPPLE_STATE, 0);
1164 
1165 	WREG32(CB_PERF_CTR0_SEL_0, 0);
1166 	WREG32(CB_PERF_CTR0_SEL_1, 0);
1167 	WREG32(CB_PERF_CTR1_SEL_0, 0);
1168 	WREG32(CB_PERF_CTR1_SEL_1, 0);
1169 	WREG32(CB_PERF_CTR2_SEL_0, 0);
1170 	WREG32(CB_PERF_CTR2_SEL_1, 0);
1171 	WREG32(CB_PERF_CTR3_SEL_0, 0);
1172 	WREG32(CB_PERF_CTR3_SEL_1, 0);
1173 
1174 	tmp = RREG32(HDP_MISC_CNTL);
1175 	tmp |= HDP_FLUSH_INVALIDATE_CACHE;
1176 	WREG32(HDP_MISC_CNTL, tmp);
1177 
1178 	hdp_host_path_cntl = RREG32(HDP_HOST_PATH_CNTL);
1179 	WREG32(HDP_HOST_PATH_CNTL, hdp_host_path_cntl);
1180 
1181 	WREG32(PA_CL_ENHANCE, CLIP_VTX_REORDER_ENA | NUM_CLIP_SEQ(3));
1182 
1183 	udelay(50);
1184 
1185 	/* set clockgating golden values on TN */
1186 	if (rdev->family == CHIP_ARUBA) {
1187 		tmp = RREG32_CG(CG_CGTT_LOCAL_0);
1188 		tmp &= ~0x00380000;
1189 		WREG32_CG(CG_CGTT_LOCAL_0, tmp);
1190                 tmp = RREG32_CG(CG_CGTT_LOCAL_1);
1191 		tmp &= ~0x0e000000;
1192 		WREG32_CG(CG_CGTT_LOCAL_1, tmp);
1193 	}
1194 }
1195 
1196 /*
1197  * GART
1198  */
1199 void cayman_pcie_gart_tlb_flush(struct radeon_device *rdev)
1200 {
1201 	/* flush hdp cache */
1202 	WREG32(HDP_MEM_COHERENCY_FLUSH_CNTL, 0x1);
1203 
1204 	/* bits 0-7 are the VM contexts0-7 */
1205 	WREG32(VM_INVALIDATE_REQUEST, 1);
1206 }
1207 
1208 static int cayman_pcie_gart_enable(struct radeon_device *rdev)
1209 {
1210 	int i, r;
1211 
1212 	if (rdev->gart.robj == NULL) {
1213 		dev_err(rdev->dev, "No VRAM object for PCIE GART.\n");
1214 		return -EINVAL;
1215 	}
1216 	r = radeon_gart_table_vram_pin(rdev);
1217 	if (r)
1218 		return r;
1219 	radeon_gart_restore(rdev);
1220 	/* Setup TLB control */
1221 	WREG32(MC_VM_MX_L1_TLB_CNTL,
1222 	       (0xA << 7) |
1223 	       ENABLE_L1_TLB |
1224 	       ENABLE_L1_FRAGMENT_PROCESSING |
1225 	       SYSTEM_ACCESS_MODE_NOT_IN_SYS |
1226 	       ENABLE_ADVANCED_DRIVER_MODEL |
1227 	       SYSTEM_APERTURE_UNMAPPED_ACCESS_PASS_THRU);
1228 	/* Setup L2 cache */
1229 	WREG32(VM_L2_CNTL, ENABLE_L2_CACHE |
1230 	       ENABLE_L2_PTE_CACHE_LRU_UPDATE_BY_WRITE |
1231 	       ENABLE_L2_PDE0_CACHE_LRU_UPDATE_BY_WRITE |
1232 	       EFFECTIVE_L2_QUEUE_SIZE(7) |
1233 	       CONTEXT1_IDENTITY_ACCESS_MODE(1));
1234 	WREG32(VM_L2_CNTL2, INVALIDATE_ALL_L1_TLBS | INVALIDATE_L2_CACHE);
1235 	WREG32(VM_L2_CNTL3, L2_CACHE_BIGK_ASSOCIATIVITY |
1236 	       L2_CACHE_BIGK_FRAGMENT_SIZE(6));
1237 	/* setup context0 */
1238 	WREG32(VM_CONTEXT0_PAGE_TABLE_START_ADDR, rdev->mc.gtt_start >> 12);
1239 	WREG32(VM_CONTEXT0_PAGE_TABLE_END_ADDR, rdev->mc.gtt_end >> 12);
1240 	WREG32(VM_CONTEXT0_PAGE_TABLE_BASE_ADDR, rdev->gart.table_addr >> 12);
1241 	WREG32(VM_CONTEXT0_PROTECTION_FAULT_DEFAULT_ADDR,
1242 			(u32)(rdev->dummy_page.addr >> 12));
1243 	WREG32(VM_CONTEXT0_CNTL2, 0);
1244 	WREG32(VM_CONTEXT0_CNTL, ENABLE_CONTEXT | PAGE_TABLE_DEPTH(0) |
1245 				RANGE_PROTECTION_FAULT_ENABLE_DEFAULT);
1246 
1247 	WREG32(0x15D4, 0);
1248 	WREG32(0x15D8, 0);
1249 	WREG32(0x15DC, 0);
1250 
1251 	/* empty context1-7 */
1252 	/* Assign the pt base to something valid for now; the pts used for
1253 	 * the VMs are determined by the application and setup and assigned
1254 	 * on the fly in the vm part of radeon_gart.c
1255 	 */
1256 	for (i = 1; i < 8; i++) {
1257 		WREG32(VM_CONTEXT0_PAGE_TABLE_START_ADDR + (i << 2), 0);
1258 		WREG32(VM_CONTEXT0_PAGE_TABLE_END_ADDR + (i << 2), rdev->vm_manager.max_pfn);
1259 		WREG32(VM_CONTEXT0_PAGE_TABLE_BASE_ADDR + (i << 2),
1260 			rdev->gart.table_addr >> 12);
1261 	}
1262 
1263 	/* enable context1-7 */
1264 	WREG32(VM_CONTEXT1_PROTECTION_FAULT_DEFAULT_ADDR,
1265 	       (u32)(rdev->dummy_page.addr >> 12));
1266 	WREG32(VM_CONTEXT1_CNTL2, 4);
1267 	WREG32(VM_CONTEXT1_CNTL, ENABLE_CONTEXT | PAGE_TABLE_DEPTH(1) |
1268 				RANGE_PROTECTION_FAULT_ENABLE_INTERRUPT |
1269 				RANGE_PROTECTION_FAULT_ENABLE_DEFAULT |
1270 				DUMMY_PAGE_PROTECTION_FAULT_ENABLE_INTERRUPT |
1271 				DUMMY_PAGE_PROTECTION_FAULT_ENABLE_DEFAULT |
1272 				PDE0_PROTECTION_FAULT_ENABLE_INTERRUPT |
1273 				PDE0_PROTECTION_FAULT_ENABLE_DEFAULT |
1274 				VALID_PROTECTION_FAULT_ENABLE_INTERRUPT |
1275 				VALID_PROTECTION_FAULT_ENABLE_DEFAULT |
1276 				READ_PROTECTION_FAULT_ENABLE_INTERRUPT |
1277 				READ_PROTECTION_FAULT_ENABLE_DEFAULT |
1278 				WRITE_PROTECTION_FAULT_ENABLE_INTERRUPT |
1279 				WRITE_PROTECTION_FAULT_ENABLE_DEFAULT);
1280 
1281 	cayman_pcie_gart_tlb_flush(rdev);
1282 	DRM_INFO("PCIE GART of %uM enabled (table at 0x%016llX).\n",
1283 		 (unsigned)(rdev->mc.gtt_size >> 20),
1284 		 (unsigned long long)rdev->gart.table_addr);
1285 	rdev->gart.ready = true;
1286 	return 0;
1287 }
1288 
1289 static void cayman_pcie_gart_disable(struct radeon_device *rdev)
1290 {
1291 	/* Disable all tables */
1292 	WREG32(VM_CONTEXT0_CNTL, 0);
1293 	WREG32(VM_CONTEXT1_CNTL, 0);
1294 	/* Setup TLB control */
1295 	WREG32(MC_VM_MX_L1_TLB_CNTL, ENABLE_L1_FRAGMENT_PROCESSING |
1296 	       SYSTEM_ACCESS_MODE_NOT_IN_SYS |
1297 	       SYSTEM_APERTURE_UNMAPPED_ACCESS_PASS_THRU);
1298 	/* Setup L2 cache */
1299 	WREG32(VM_L2_CNTL, ENABLE_L2_PTE_CACHE_LRU_UPDATE_BY_WRITE |
1300 	       ENABLE_L2_PDE0_CACHE_LRU_UPDATE_BY_WRITE |
1301 	       EFFECTIVE_L2_QUEUE_SIZE(7) |
1302 	       CONTEXT1_IDENTITY_ACCESS_MODE(1));
1303 	WREG32(VM_L2_CNTL2, 0);
1304 	WREG32(VM_L2_CNTL3, L2_CACHE_BIGK_ASSOCIATIVITY |
1305 	       L2_CACHE_BIGK_FRAGMENT_SIZE(6));
1306 	radeon_gart_table_vram_unpin(rdev);
1307 }
1308 
1309 static void cayman_pcie_gart_fini(struct radeon_device *rdev)
1310 {
1311 	cayman_pcie_gart_disable(rdev);
1312 	radeon_gart_table_vram_free(rdev);
1313 	radeon_gart_fini(rdev);
1314 }
1315 
1316 void cayman_cp_int_cntl_setup(struct radeon_device *rdev,
1317 			      int ring, u32 cp_int_cntl)
1318 {
1319 	u32 srbm_gfx_cntl = RREG32(SRBM_GFX_CNTL) & ~3;
1320 
1321 	WREG32(SRBM_GFX_CNTL, srbm_gfx_cntl | (ring & 3));
1322 	WREG32(CP_INT_CNTL, cp_int_cntl);
1323 }
1324 
1325 /*
1326  * CP.
1327  */
1328 void cayman_fence_ring_emit(struct radeon_device *rdev,
1329 			    struct radeon_fence *fence)
1330 {
1331 	struct radeon_ring *ring = &rdev->ring[fence->ring];
1332 	u64 addr = rdev->fence_drv[fence->ring].gpu_addr;
1333 
1334 	/* flush read cache over gart for this vmid */
1335 	radeon_ring_write(ring, PACKET3(PACKET3_SET_CONFIG_REG, 1));
1336 	radeon_ring_write(ring, (CP_COHER_CNTL2 - PACKET3_SET_CONFIG_REG_START) >> 2);
1337 	radeon_ring_write(ring, 0);
1338 	radeon_ring_write(ring, PACKET3(PACKET3_SURFACE_SYNC, 3));
1339 	radeon_ring_write(ring, PACKET3_TC_ACTION_ENA | PACKET3_SH_ACTION_ENA);
1340 	radeon_ring_write(ring, 0xFFFFFFFF);
1341 	radeon_ring_write(ring, 0);
1342 	radeon_ring_write(ring, 10); /* poll interval */
1343 	/* EVENT_WRITE_EOP - flush caches, send int */
1344 	radeon_ring_write(ring, PACKET3(PACKET3_EVENT_WRITE_EOP, 4));
1345 	radeon_ring_write(ring, EVENT_TYPE(CACHE_FLUSH_AND_INV_EVENT_TS) | EVENT_INDEX(5));
1346 	radeon_ring_write(ring, addr & 0xffffffff);
1347 	radeon_ring_write(ring, (upper_32_bits(addr) & 0xff) | DATA_SEL(1) | INT_SEL(2));
1348 	radeon_ring_write(ring, fence->seq);
1349 	radeon_ring_write(ring, 0);
1350 }
1351 
1352 void cayman_ring_ib_execute(struct radeon_device *rdev, struct radeon_ib *ib)
1353 {
1354 	struct radeon_ring *ring = &rdev->ring[ib->ring];
1355 
1356 	/* set to DX10/11 mode */
1357 	radeon_ring_write(ring, PACKET3(PACKET3_MODE_CONTROL, 0));
1358 	radeon_ring_write(ring, 1);
1359 
1360 	if (ring->rptr_save_reg) {
1361 		uint32_t next_rptr = ring->wptr + 3 + 4 + 8;
1362 		radeon_ring_write(ring, PACKET3(PACKET3_SET_CONFIG_REG, 1));
1363 		radeon_ring_write(ring, ((ring->rptr_save_reg -
1364 					  PACKET3_SET_CONFIG_REG_START) >> 2));
1365 		radeon_ring_write(ring, next_rptr);
1366 	}
1367 
1368 	radeon_ring_write(ring, PACKET3(PACKET3_INDIRECT_BUFFER, 2));
1369 	radeon_ring_write(ring,
1370 #ifdef __BIG_ENDIAN
1371 			  (2 << 0) |
1372 #endif
1373 			  (ib->gpu_addr & 0xFFFFFFFC));
1374 	radeon_ring_write(ring, upper_32_bits(ib->gpu_addr) & 0xFF);
1375 	radeon_ring_write(ring, ib->length_dw |
1376 			  (ib->vm ? (ib->vm->id << 24) : 0));
1377 
1378 	/* flush read cache over gart for this vmid */
1379 	radeon_ring_write(ring, PACKET3(PACKET3_SET_CONFIG_REG, 1));
1380 	radeon_ring_write(ring, (CP_COHER_CNTL2 - PACKET3_SET_CONFIG_REG_START) >> 2);
1381 	radeon_ring_write(ring, ib->vm ? ib->vm->id : 0);
1382 	radeon_ring_write(ring, PACKET3(PACKET3_SURFACE_SYNC, 3));
1383 	radeon_ring_write(ring, PACKET3_TC_ACTION_ENA | PACKET3_SH_ACTION_ENA);
1384 	radeon_ring_write(ring, 0xFFFFFFFF);
1385 	radeon_ring_write(ring, 0);
1386 	radeon_ring_write(ring, 10); /* poll interval */
1387 }
1388 
1389 static void cayman_cp_enable(struct radeon_device *rdev, bool enable)
1390 {
1391 	if (enable)
1392 		WREG32(CP_ME_CNTL, 0);
1393 	else {
1394 		radeon_ttm_set_active_vram_size(rdev, rdev->mc.visible_vram_size);
1395 		WREG32(CP_ME_CNTL, (CP_ME_HALT | CP_PFP_HALT));
1396 		WREG32(SCRATCH_UMSK, 0);
1397 		rdev->ring[RADEON_RING_TYPE_GFX_INDEX].ready = false;
1398 	}
1399 }
1400 
1401 static int cayman_cp_load_microcode(struct radeon_device *rdev)
1402 {
1403 	const __be32 *fw_data;
1404 	int i;
1405 
1406 	if (!rdev->me_fw || !rdev->pfp_fw)
1407 		return -EINVAL;
1408 
1409 	cayman_cp_enable(rdev, false);
1410 
1411 	fw_data = (const __be32 *)rdev->pfp_fw->data;
1412 	WREG32(CP_PFP_UCODE_ADDR, 0);
1413 	for (i = 0; i < CAYMAN_PFP_UCODE_SIZE; i++)
1414 		WREG32(CP_PFP_UCODE_DATA, be32_to_cpup(fw_data++));
1415 	WREG32(CP_PFP_UCODE_ADDR, 0);
1416 
1417 	fw_data = (const __be32 *)rdev->me_fw->data;
1418 	WREG32(CP_ME_RAM_WADDR, 0);
1419 	for (i = 0; i < CAYMAN_PM4_UCODE_SIZE; i++)
1420 		WREG32(CP_ME_RAM_DATA, be32_to_cpup(fw_data++));
1421 
1422 	WREG32(CP_PFP_UCODE_ADDR, 0);
1423 	WREG32(CP_ME_RAM_WADDR, 0);
1424 	WREG32(CP_ME_RAM_RADDR, 0);
1425 	return 0;
1426 }
1427 
1428 static int cayman_cp_start(struct radeon_device *rdev)
1429 {
1430 	struct radeon_ring *ring = &rdev->ring[RADEON_RING_TYPE_GFX_INDEX];
1431 	int r, i;
1432 
1433 	r = radeon_ring_lock(rdev, ring, 7);
1434 	if (r) {
1435 		DRM_ERROR("radeon: cp failed to lock ring (%d).\n", r);
1436 		return r;
1437 	}
1438 	radeon_ring_write(ring, PACKET3(PACKET3_ME_INITIALIZE, 5));
1439 	radeon_ring_write(ring, 0x1);
1440 	radeon_ring_write(ring, 0x0);
1441 	radeon_ring_write(ring, rdev->config.cayman.max_hw_contexts - 1);
1442 	radeon_ring_write(ring, PACKET3_ME_INITIALIZE_DEVICE_ID(1));
1443 	radeon_ring_write(ring, 0);
1444 	radeon_ring_write(ring, 0);
1445 	radeon_ring_unlock_commit(rdev, ring);
1446 
1447 	cayman_cp_enable(rdev, true);
1448 
1449 	r = radeon_ring_lock(rdev, ring, cayman_default_size + 19);
1450 	if (r) {
1451 		DRM_ERROR("radeon: cp failed to lock ring (%d).\n", r);
1452 		return r;
1453 	}
1454 
1455 	/* setup clear context state */
1456 	radeon_ring_write(ring, PACKET3(PACKET3_PREAMBLE_CNTL, 0));
1457 	radeon_ring_write(ring, PACKET3_PREAMBLE_BEGIN_CLEAR_STATE);
1458 
1459 	for (i = 0; i < cayman_default_size; i++)
1460 		radeon_ring_write(ring, cayman_default_state[i]);
1461 
1462 	radeon_ring_write(ring, PACKET3(PACKET3_PREAMBLE_CNTL, 0));
1463 	radeon_ring_write(ring, PACKET3_PREAMBLE_END_CLEAR_STATE);
1464 
1465 	/* set clear context state */
1466 	radeon_ring_write(ring, PACKET3(PACKET3_CLEAR_STATE, 0));
1467 	radeon_ring_write(ring, 0);
1468 
1469 	/* SQ_VTX_BASE_VTX_LOC */
1470 	radeon_ring_write(ring, 0xc0026f00);
1471 	radeon_ring_write(ring, 0x00000000);
1472 	radeon_ring_write(ring, 0x00000000);
1473 	radeon_ring_write(ring, 0x00000000);
1474 
1475 	/* Clear consts */
1476 	radeon_ring_write(ring, 0xc0036f00);
1477 	radeon_ring_write(ring, 0x00000bc4);
1478 	radeon_ring_write(ring, 0xffffffff);
1479 	radeon_ring_write(ring, 0xffffffff);
1480 	radeon_ring_write(ring, 0xffffffff);
1481 
1482 	radeon_ring_write(ring, 0xc0026900);
1483 	radeon_ring_write(ring, 0x00000316);
1484 	radeon_ring_write(ring, 0x0000000e); /* VGT_VERTEX_REUSE_BLOCK_CNTL */
1485 	radeon_ring_write(ring, 0x00000010); /*  */
1486 
1487 	radeon_ring_unlock_commit(rdev, ring);
1488 
1489 	/* XXX init other rings */
1490 
1491 	return 0;
1492 }
1493 
1494 static void cayman_cp_fini(struct radeon_device *rdev)
1495 {
1496 	struct radeon_ring *ring = &rdev->ring[RADEON_RING_TYPE_GFX_INDEX];
1497 	cayman_cp_enable(rdev, false);
1498 	radeon_ring_fini(rdev, ring);
1499 	radeon_scratch_free(rdev, ring->rptr_save_reg);
1500 }
1501 
1502 static int cayman_cp_resume(struct radeon_device *rdev)
1503 {
1504 	static const int ridx[] = {
1505 		RADEON_RING_TYPE_GFX_INDEX,
1506 		CAYMAN_RING_TYPE_CP1_INDEX,
1507 		CAYMAN_RING_TYPE_CP2_INDEX
1508 	};
1509 	static const unsigned cp_rb_cntl[] = {
1510 		CP_RB0_CNTL,
1511 		CP_RB1_CNTL,
1512 		CP_RB2_CNTL,
1513 	};
1514 	static const unsigned cp_rb_rptr_addr[] = {
1515 		CP_RB0_RPTR_ADDR,
1516 		CP_RB1_RPTR_ADDR,
1517 		CP_RB2_RPTR_ADDR
1518 	};
1519 	static const unsigned cp_rb_rptr_addr_hi[] = {
1520 		CP_RB0_RPTR_ADDR_HI,
1521 		CP_RB1_RPTR_ADDR_HI,
1522 		CP_RB2_RPTR_ADDR_HI
1523 	};
1524 	static const unsigned cp_rb_base[] = {
1525 		CP_RB0_BASE,
1526 		CP_RB1_BASE,
1527 		CP_RB2_BASE
1528 	};
1529 	struct radeon_ring *ring;
1530 	int i, r;
1531 
1532 	/* Reset cp; if cp is reset, then PA, SH, VGT also need to be reset */
1533 	WREG32(GRBM_SOFT_RESET, (SOFT_RESET_CP |
1534 				 SOFT_RESET_PA |
1535 				 SOFT_RESET_SH |
1536 				 SOFT_RESET_VGT |
1537 				 SOFT_RESET_SPI |
1538 				 SOFT_RESET_SX));
1539 	RREG32(GRBM_SOFT_RESET);
1540 	mdelay(15);
1541 	WREG32(GRBM_SOFT_RESET, 0);
1542 	RREG32(GRBM_SOFT_RESET);
1543 
1544 	WREG32(CP_SEM_WAIT_TIMER, 0x0);
1545 	WREG32(CP_SEM_INCOMPLETE_TIMER_CNTL, 0x0);
1546 
1547 	/* Set the write pointer delay */
1548 	WREG32(CP_RB_WPTR_DELAY, 0);
1549 
1550 	WREG32(CP_DEBUG, (1 << 27));
1551 
1552 	/* set the wb address whether it's enabled or not */
1553 	WREG32(SCRATCH_ADDR, ((rdev->wb.gpu_addr + RADEON_WB_SCRATCH_OFFSET) >> 8) & 0xFFFFFFFF);
1554 	WREG32(SCRATCH_UMSK, 0xff);
1555 
1556 	for (i = 0; i < 3; ++i) {
1557 		uint32_t rb_cntl;
1558 		uint64_t addr;
1559 
1560 		/* Set ring buffer size */
1561 		ring = &rdev->ring[ridx[i]];
1562 		rb_cntl = order_base_2(ring->ring_size / 8);
1563 		rb_cntl |= order_base_2(RADEON_GPU_PAGE_SIZE/8) << 8;
1564 #ifdef __BIG_ENDIAN
1565 		rb_cntl |= BUF_SWAP_32BIT;
1566 #endif
1567 		WREG32(cp_rb_cntl[i], rb_cntl);
1568 
1569 		/* set the wb address whether it's enabled or not */
1570 		addr = rdev->wb.gpu_addr + RADEON_WB_CP_RPTR_OFFSET;
1571 		WREG32(cp_rb_rptr_addr[i], addr & 0xFFFFFFFC);
1572 		WREG32(cp_rb_rptr_addr_hi[i], upper_32_bits(addr) & 0xFF);
1573 	}
1574 
1575 	/* set the rb base addr, this causes an internal reset of ALL rings */
1576 	for (i = 0; i < 3; ++i) {
1577 		ring = &rdev->ring[ridx[i]];
1578 		WREG32(cp_rb_base[i], ring->gpu_addr >> 8);
1579 	}
1580 
1581 	for (i = 0; i < 3; ++i) {
1582 		/* Initialize the ring buffer's read and write pointers */
1583 		ring = &rdev->ring[ridx[i]];
1584 		WREG32_P(cp_rb_cntl[i], RB_RPTR_WR_ENA, ~RB_RPTR_WR_ENA);
1585 
1586 		ring->rptr = ring->wptr = 0;
1587 		WREG32(ring->rptr_reg, ring->rptr);
1588 		WREG32(ring->wptr_reg, ring->wptr);
1589 
1590 		mdelay(1);
1591 		WREG32_P(cp_rb_cntl[i], 0, ~RB_RPTR_WR_ENA);
1592 	}
1593 
1594 	/* start the rings */
1595 	cayman_cp_start(rdev);
1596 	rdev->ring[RADEON_RING_TYPE_GFX_INDEX].ready = true;
1597 	rdev->ring[CAYMAN_RING_TYPE_CP1_INDEX].ready = false;
1598 	rdev->ring[CAYMAN_RING_TYPE_CP2_INDEX].ready = false;
1599 	/* this only test cp0 */
1600 	r = radeon_ring_test(rdev, RADEON_RING_TYPE_GFX_INDEX, &rdev->ring[RADEON_RING_TYPE_GFX_INDEX]);
1601 	if (r) {
1602 		rdev->ring[RADEON_RING_TYPE_GFX_INDEX].ready = false;
1603 		rdev->ring[CAYMAN_RING_TYPE_CP1_INDEX].ready = false;
1604 		rdev->ring[CAYMAN_RING_TYPE_CP2_INDEX].ready = false;
1605 		return r;
1606 	}
1607 
1608 	return 0;
1609 }
1610 
1611 u32 cayman_gpu_check_soft_reset(struct radeon_device *rdev)
1612 {
1613 	u32 reset_mask = 0;
1614 	u32 tmp;
1615 
1616 	/* GRBM_STATUS */
1617 	tmp = RREG32(GRBM_STATUS);
1618 	if (tmp & (PA_BUSY | SC_BUSY |
1619 		   SH_BUSY | SX_BUSY |
1620 		   TA_BUSY | VGT_BUSY |
1621 		   DB_BUSY | CB_BUSY |
1622 		   GDS_BUSY | SPI_BUSY |
1623 		   IA_BUSY | IA_BUSY_NO_DMA))
1624 		reset_mask |= RADEON_RESET_GFX;
1625 
1626 	if (tmp & (CF_RQ_PENDING | PF_RQ_PENDING |
1627 		   CP_BUSY | CP_COHERENCY_BUSY))
1628 		reset_mask |= RADEON_RESET_CP;
1629 
1630 	if (tmp & GRBM_EE_BUSY)
1631 		reset_mask |= RADEON_RESET_GRBM | RADEON_RESET_GFX | RADEON_RESET_CP;
1632 
1633 	/* DMA_STATUS_REG 0 */
1634 	tmp = RREG32(DMA_STATUS_REG + DMA0_REGISTER_OFFSET);
1635 	if (!(tmp & DMA_IDLE))
1636 		reset_mask |= RADEON_RESET_DMA;
1637 
1638 	/* DMA_STATUS_REG 1 */
1639 	tmp = RREG32(DMA_STATUS_REG + DMA1_REGISTER_OFFSET);
1640 	if (!(tmp & DMA_IDLE))
1641 		reset_mask |= RADEON_RESET_DMA1;
1642 
1643 	/* SRBM_STATUS2 */
1644 	tmp = RREG32(SRBM_STATUS2);
1645 	if (tmp & DMA_BUSY)
1646 		reset_mask |= RADEON_RESET_DMA;
1647 
1648 	if (tmp & DMA1_BUSY)
1649 		reset_mask |= RADEON_RESET_DMA1;
1650 
1651 	/* SRBM_STATUS */
1652 	tmp = RREG32(SRBM_STATUS);
1653 	if (tmp & (RLC_RQ_PENDING | RLC_BUSY))
1654 		reset_mask |= RADEON_RESET_RLC;
1655 
1656 	if (tmp & IH_BUSY)
1657 		reset_mask |= RADEON_RESET_IH;
1658 
1659 	if (tmp & SEM_BUSY)
1660 		reset_mask |= RADEON_RESET_SEM;
1661 
1662 	if (tmp & GRBM_RQ_PENDING)
1663 		reset_mask |= RADEON_RESET_GRBM;
1664 
1665 	if (tmp & VMC_BUSY)
1666 		reset_mask |= RADEON_RESET_VMC;
1667 
1668 	if (tmp & (MCB_BUSY | MCB_NON_DISPLAY_BUSY |
1669 		   MCC_BUSY | MCD_BUSY))
1670 		reset_mask |= RADEON_RESET_MC;
1671 
1672 	if (evergreen_is_display_hung(rdev))
1673 		reset_mask |= RADEON_RESET_DISPLAY;
1674 
1675 	/* VM_L2_STATUS */
1676 	tmp = RREG32(VM_L2_STATUS);
1677 	if (tmp & L2_BUSY)
1678 		reset_mask |= RADEON_RESET_VMC;
1679 
1680 	/* Skip MC reset as it's mostly likely not hung, just busy */
1681 	if (reset_mask & RADEON_RESET_MC) {
1682 		DRM_DEBUG("MC busy: 0x%08X, clearing.\n", reset_mask);
1683 		reset_mask &= ~RADEON_RESET_MC;
1684 	}
1685 
1686 	return reset_mask;
1687 }
1688 
1689 static void cayman_gpu_soft_reset(struct radeon_device *rdev, u32 reset_mask)
1690 {
1691 	struct evergreen_mc_save save;
1692 	u32 grbm_soft_reset = 0, srbm_soft_reset = 0;
1693 	u32 tmp;
1694 
1695 	if (reset_mask == 0)
1696 		return;
1697 
1698 	dev_info(rdev->dev, "GPU softreset: 0x%08X\n", reset_mask);
1699 
1700 	evergreen_print_gpu_status_regs(rdev);
1701 	dev_info(rdev->dev, "  VM_CONTEXT0_PROTECTION_FAULT_ADDR   0x%08X\n",
1702 		 RREG32(0x14F8));
1703 	dev_info(rdev->dev, "  VM_CONTEXT0_PROTECTION_FAULT_STATUS 0x%08X\n",
1704 		 RREG32(0x14D8));
1705 	dev_info(rdev->dev, "  VM_CONTEXT1_PROTECTION_FAULT_ADDR   0x%08X\n",
1706 		 RREG32(0x14FC));
1707 	dev_info(rdev->dev, "  VM_CONTEXT1_PROTECTION_FAULT_STATUS 0x%08X\n",
1708 		 RREG32(0x14DC));
1709 
1710 	/* Disable CP parsing/prefetching */
1711 	WREG32(CP_ME_CNTL, CP_ME_HALT | CP_PFP_HALT);
1712 
1713 	if (reset_mask & RADEON_RESET_DMA) {
1714 		/* dma0 */
1715 		tmp = RREG32(DMA_RB_CNTL + DMA0_REGISTER_OFFSET);
1716 		tmp &= ~DMA_RB_ENABLE;
1717 		WREG32(DMA_RB_CNTL + DMA0_REGISTER_OFFSET, tmp);
1718 	}
1719 
1720 	if (reset_mask & RADEON_RESET_DMA1) {
1721 		/* dma1 */
1722 		tmp = RREG32(DMA_RB_CNTL + DMA1_REGISTER_OFFSET);
1723 		tmp &= ~DMA_RB_ENABLE;
1724 		WREG32(DMA_RB_CNTL + DMA1_REGISTER_OFFSET, tmp);
1725 	}
1726 
1727 	udelay(50);
1728 
1729 	evergreen_mc_stop(rdev, &save);
1730 	if (evergreen_mc_wait_for_idle(rdev)) {
1731 		dev_warn(rdev->dev, "Wait for MC idle timedout !\n");
1732 	}
1733 
1734 	if (reset_mask & (RADEON_RESET_GFX | RADEON_RESET_COMPUTE)) {
1735 		grbm_soft_reset = SOFT_RESET_CB |
1736 			SOFT_RESET_DB |
1737 			SOFT_RESET_GDS |
1738 			SOFT_RESET_PA |
1739 			SOFT_RESET_SC |
1740 			SOFT_RESET_SPI |
1741 			SOFT_RESET_SH |
1742 			SOFT_RESET_SX |
1743 			SOFT_RESET_TC |
1744 			SOFT_RESET_TA |
1745 			SOFT_RESET_VGT |
1746 			SOFT_RESET_IA;
1747 	}
1748 
1749 	if (reset_mask & RADEON_RESET_CP) {
1750 		grbm_soft_reset |= SOFT_RESET_CP | SOFT_RESET_VGT;
1751 
1752 		srbm_soft_reset |= SOFT_RESET_GRBM;
1753 	}
1754 
1755 	if (reset_mask & RADEON_RESET_DMA)
1756 		srbm_soft_reset |= SOFT_RESET_DMA;
1757 
1758 	if (reset_mask & RADEON_RESET_DMA1)
1759 		srbm_soft_reset |= SOFT_RESET_DMA1;
1760 
1761 	if (reset_mask & RADEON_RESET_DISPLAY)
1762 		srbm_soft_reset |= SOFT_RESET_DC;
1763 
1764 	if (reset_mask & RADEON_RESET_RLC)
1765 		srbm_soft_reset |= SOFT_RESET_RLC;
1766 
1767 	if (reset_mask & RADEON_RESET_SEM)
1768 		srbm_soft_reset |= SOFT_RESET_SEM;
1769 
1770 	if (reset_mask & RADEON_RESET_IH)
1771 		srbm_soft_reset |= SOFT_RESET_IH;
1772 
1773 	if (reset_mask & RADEON_RESET_GRBM)
1774 		srbm_soft_reset |= SOFT_RESET_GRBM;
1775 
1776 	if (reset_mask & RADEON_RESET_VMC)
1777 		srbm_soft_reset |= SOFT_RESET_VMC;
1778 
1779 	if (!(rdev->flags & RADEON_IS_IGP)) {
1780 		if (reset_mask & RADEON_RESET_MC)
1781 			srbm_soft_reset |= SOFT_RESET_MC;
1782 	}
1783 
1784 	if (grbm_soft_reset) {
1785 		tmp = RREG32(GRBM_SOFT_RESET);
1786 		tmp |= grbm_soft_reset;
1787 		dev_info(rdev->dev, "GRBM_SOFT_RESET=0x%08X\n", tmp);
1788 		WREG32(GRBM_SOFT_RESET, tmp);
1789 		tmp = RREG32(GRBM_SOFT_RESET);
1790 
1791 		udelay(50);
1792 
1793 		tmp &= ~grbm_soft_reset;
1794 		WREG32(GRBM_SOFT_RESET, tmp);
1795 		tmp = RREG32(GRBM_SOFT_RESET);
1796 	}
1797 
1798 	if (srbm_soft_reset) {
1799 		tmp = RREG32(SRBM_SOFT_RESET);
1800 		tmp |= srbm_soft_reset;
1801 		dev_info(rdev->dev, "SRBM_SOFT_RESET=0x%08X\n", tmp);
1802 		WREG32(SRBM_SOFT_RESET, tmp);
1803 		tmp = RREG32(SRBM_SOFT_RESET);
1804 
1805 		udelay(50);
1806 
1807 		tmp &= ~srbm_soft_reset;
1808 		WREG32(SRBM_SOFT_RESET, tmp);
1809 		tmp = RREG32(SRBM_SOFT_RESET);
1810 	}
1811 
1812 	/* Wait a little for things to settle down */
1813 	udelay(50);
1814 
1815 	evergreen_mc_resume(rdev, &save);
1816 	udelay(50);
1817 
1818 	evergreen_print_gpu_status_regs(rdev);
1819 }
1820 
1821 int cayman_asic_reset(struct radeon_device *rdev)
1822 {
1823 	u32 reset_mask;
1824 
1825 	reset_mask = cayman_gpu_check_soft_reset(rdev);
1826 
1827 	if (reset_mask)
1828 		r600_set_bios_scratch_engine_hung(rdev, true);
1829 
1830 	cayman_gpu_soft_reset(rdev, reset_mask);
1831 
1832 	reset_mask = cayman_gpu_check_soft_reset(rdev);
1833 
1834 	if (!reset_mask)
1835 		r600_set_bios_scratch_engine_hung(rdev, false);
1836 
1837 	return 0;
1838 }
1839 
1840 /**
1841  * cayman_gfx_is_lockup - Check if the GFX engine is locked up
1842  *
1843  * @rdev: radeon_device pointer
1844  * @ring: radeon_ring structure holding ring information
1845  *
1846  * Check if the GFX engine is locked up.
1847  * Returns true if the engine appears to be locked up, false if not.
1848  */
1849 bool cayman_gfx_is_lockup(struct radeon_device *rdev, struct radeon_ring *ring)
1850 {
1851 	u32 reset_mask = cayman_gpu_check_soft_reset(rdev);
1852 
1853 	if (!(reset_mask & (RADEON_RESET_GFX |
1854 			    RADEON_RESET_COMPUTE |
1855 			    RADEON_RESET_CP))) {
1856 		radeon_ring_lockup_update(ring);
1857 		return false;
1858 	}
1859 	/* force CP activities */
1860 	radeon_ring_force_activity(rdev, ring);
1861 	return radeon_ring_test_lockup(rdev, ring);
1862 }
1863 
1864 static int cayman_startup(struct radeon_device *rdev)
1865 {
1866 	struct radeon_ring *ring = &rdev->ring[RADEON_RING_TYPE_GFX_INDEX];
1867 	int r;
1868 
1869 	/* enable pcie gen2 link */
1870 	evergreen_pcie_gen2_enable(rdev);
1871 	/* enable aspm */
1872 	evergreen_program_aspm(rdev);
1873 
1874 	/* scratch needs to be initialized before MC */
1875 	r = r600_vram_scratch_init(rdev);
1876 	if (r)
1877 		return r;
1878 
1879 	evergreen_mc_program(rdev);
1880 
1881 	if (rdev->flags & RADEON_IS_IGP) {
1882 		if (!rdev->me_fw || !rdev->pfp_fw || !rdev->rlc_fw) {
1883 			r = ni_init_microcode(rdev);
1884 			if (r) {
1885 				DRM_ERROR("Failed to load firmware!\n");
1886 				return r;
1887 			}
1888 		}
1889 	} else {
1890 		if (!rdev->me_fw || !rdev->pfp_fw || !rdev->rlc_fw || !rdev->mc_fw) {
1891 			r = ni_init_microcode(rdev);
1892 			if (r) {
1893 				DRM_ERROR("Failed to load firmware!\n");
1894 				return r;
1895 			}
1896 		}
1897 
1898 		r = ni_mc_load_microcode(rdev);
1899 		if (r) {
1900 			DRM_ERROR("Failed to load MC firmware!\n");
1901 			return r;
1902 		}
1903 	}
1904 
1905 	r = cayman_pcie_gart_enable(rdev);
1906 	if (r)
1907 		return r;
1908 	cayman_gpu_init(rdev);
1909 
1910 	/* allocate rlc buffers */
1911 	if (rdev->flags & RADEON_IS_IGP) {
1912 		rdev->rlc.reg_list = tn_rlc_save_restore_register_list;
1913 		rdev->rlc.reg_list_size =
1914 			(u32)ARRAY_SIZE(tn_rlc_save_restore_register_list);
1915 		rdev->rlc.cs_data = cayman_cs_data;
1916 		r = sumo_rlc_init(rdev);
1917 		if (r) {
1918 			DRM_ERROR("Failed to init rlc BOs!\n");
1919 			return r;
1920 		}
1921 	}
1922 
1923 	/* allocate wb buffer */
1924 	r = radeon_wb_init(rdev);
1925 	if (r)
1926 		return r;
1927 
1928 	r = radeon_fence_driver_start_ring(rdev, RADEON_RING_TYPE_GFX_INDEX);
1929 	if (r) {
1930 		dev_err(rdev->dev, "failed initializing CP fences (%d).\n", r);
1931 		return r;
1932 	}
1933 
1934 	r = uvd_v2_2_resume(rdev);
1935 	if (!r) {
1936 		r = radeon_fence_driver_start_ring(rdev,
1937 						   R600_RING_TYPE_UVD_INDEX);
1938 		if (r)
1939 			dev_err(rdev->dev, "UVD fences init error (%d).\n", r);
1940 	}
1941 	if (r)
1942 		rdev->ring[R600_RING_TYPE_UVD_INDEX].ring_size = 0;
1943 
1944 	r = radeon_fence_driver_start_ring(rdev, CAYMAN_RING_TYPE_CP1_INDEX);
1945 	if (r) {
1946 		dev_err(rdev->dev, "failed initializing CP fences (%d).\n", r);
1947 		return r;
1948 	}
1949 
1950 	r = radeon_fence_driver_start_ring(rdev, CAYMAN_RING_TYPE_CP2_INDEX);
1951 	if (r) {
1952 		dev_err(rdev->dev, "failed initializing CP fences (%d).\n", r);
1953 		return r;
1954 	}
1955 
1956 	r = radeon_fence_driver_start_ring(rdev, R600_RING_TYPE_DMA_INDEX);
1957 	if (r) {
1958 		dev_err(rdev->dev, "failed initializing DMA fences (%d).\n", r);
1959 		return r;
1960 	}
1961 
1962 	r = radeon_fence_driver_start_ring(rdev, CAYMAN_RING_TYPE_DMA1_INDEX);
1963 	if (r) {
1964 		dev_err(rdev->dev, "failed initializing DMA fences (%d).\n", r);
1965 		return r;
1966 	}
1967 
1968 	/* Enable IRQ */
1969 	if (!rdev->irq.installed) {
1970 		r = radeon_irq_kms_init(rdev);
1971 		if (r)
1972 			return r;
1973 	}
1974 
1975 	r = r600_irq_init(rdev);
1976 	if (r) {
1977 		DRM_ERROR("radeon: IH init failed (%d).\n", r);
1978 		radeon_irq_kms_fini(rdev);
1979 		return r;
1980 	}
1981 	evergreen_irq_set(rdev);
1982 
1983 	r = radeon_ring_init(rdev, ring, ring->ring_size, RADEON_WB_CP_RPTR_OFFSET,
1984 			     CP_RB0_RPTR, CP_RB0_WPTR,
1985 			     RADEON_CP_PACKET2);
1986 	if (r)
1987 		return r;
1988 
1989 	ring = &rdev->ring[R600_RING_TYPE_DMA_INDEX];
1990 	r = radeon_ring_init(rdev, ring, ring->ring_size, R600_WB_DMA_RPTR_OFFSET,
1991 			     DMA_RB_RPTR + DMA0_REGISTER_OFFSET,
1992 			     DMA_RB_WPTR + DMA0_REGISTER_OFFSET,
1993 			     DMA_PACKET(DMA_PACKET_NOP, 0, 0, 0));
1994 	if (r)
1995 		return r;
1996 
1997 	ring = &rdev->ring[CAYMAN_RING_TYPE_DMA1_INDEX];
1998 	r = radeon_ring_init(rdev, ring, ring->ring_size, CAYMAN_WB_DMA1_RPTR_OFFSET,
1999 			     DMA_RB_RPTR + DMA1_REGISTER_OFFSET,
2000 			     DMA_RB_WPTR + DMA1_REGISTER_OFFSET,
2001 			     DMA_PACKET(DMA_PACKET_NOP, 0, 0, 0));
2002 	if (r)
2003 		return r;
2004 
2005 	r = cayman_cp_load_microcode(rdev);
2006 	if (r)
2007 		return r;
2008 	r = cayman_cp_resume(rdev);
2009 	if (r)
2010 		return r;
2011 
2012 	r = cayman_dma_resume(rdev);
2013 	if (r)
2014 		return r;
2015 
2016 	ring = &rdev->ring[R600_RING_TYPE_UVD_INDEX];
2017 	if (ring->ring_size) {
2018 		r = radeon_ring_init(rdev, ring, ring->ring_size, 0,
2019 				     UVD_RBC_RB_RPTR, UVD_RBC_RB_WPTR,
2020 				     RADEON_CP_PACKET2);
2021 		if (!r)
2022 			r = uvd_v1_0_init(rdev);
2023 		if (r)
2024 			DRM_ERROR("radeon: failed initializing UVD (%d).\n", r);
2025 	}
2026 
2027 	r = radeon_ib_pool_init(rdev);
2028 	if (r) {
2029 		dev_err(rdev->dev, "IB initialization failed (%d).\n", r);
2030 		return r;
2031 	}
2032 
2033 	r = radeon_vm_manager_init(rdev);
2034 	if (r) {
2035 		dev_err(rdev->dev, "vm manager initialization failed (%d).\n", r);
2036 		return r;
2037 	}
2038 
2039 	if (ASIC_IS_DCE6(rdev)) {
2040 		r = dce6_audio_init(rdev);
2041 		if (r)
2042 			return r;
2043 	} else {
2044 		r = r600_audio_init(rdev);
2045 		if (r)
2046 			return r;
2047 	}
2048 
2049 	return 0;
2050 }
2051 
2052 int cayman_resume(struct radeon_device *rdev)
2053 {
2054 	int r;
2055 
2056 	/* Do not reset GPU before posting, on rv770 hw unlike on r500 hw,
2057 	 * posting will perform necessary task to bring back GPU into good
2058 	 * shape.
2059 	 */
2060 	/* post card */
2061 	atom_asic_init(rdev->mode_info.atom_context);
2062 
2063 	/* init golden registers */
2064 	ni_init_golden_registers(rdev);
2065 
2066 	rdev->accel_working = true;
2067 	r = cayman_startup(rdev);
2068 	if (r) {
2069 		DRM_ERROR("cayman startup failed on resume\n");
2070 		rdev->accel_working = false;
2071 		return r;
2072 	}
2073 	return r;
2074 }
2075 
2076 int cayman_suspend(struct radeon_device *rdev)
2077 {
2078 	if (ASIC_IS_DCE6(rdev))
2079 		dce6_audio_fini(rdev);
2080 	else
2081 		r600_audio_fini(rdev);
2082 	radeon_vm_manager_fini(rdev);
2083 	cayman_cp_enable(rdev, false);
2084 	cayman_dma_stop(rdev);
2085 	uvd_v1_0_fini(rdev);
2086 	radeon_uvd_suspend(rdev);
2087 	evergreen_irq_suspend(rdev);
2088 	radeon_wb_disable(rdev);
2089 	cayman_pcie_gart_disable(rdev);
2090 	return 0;
2091 }
2092 
2093 /* Plan is to move initialization in that function and use
2094  * helper function so that radeon_device_init pretty much
2095  * do nothing more than calling asic specific function. This
2096  * should also allow to remove a bunch of callback function
2097  * like vram_info.
2098  */
2099 int cayman_init(struct radeon_device *rdev)
2100 {
2101 	struct radeon_ring *ring = &rdev->ring[RADEON_RING_TYPE_GFX_INDEX];
2102 	int r;
2103 
2104 	/* Read BIOS */
2105 	if (!radeon_get_bios(rdev)) {
2106 		if (ASIC_IS_AVIVO(rdev))
2107 			return -EINVAL;
2108 	}
2109 	/* Must be an ATOMBIOS */
2110 	if (!rdev->is_atom_bios) {
2111 		dev_err(rdev->dev, "Expecting atombios for cayman GPU\n");
2112 		return -EINVAL;
2113 	}
2114 	r = radeon_atombios_init(rdev);
2115 	if (r)
2116 		return r;
2117 
2118 	/* Post card if necessary */
2119 	if (!radeon_card_posted(rdev)) {
2120 		if (!rdev->bios) {
2121 			dev_err(rdev->dev, "Card not posted and no BIOS - ignoring\n");
2122 			return -EINVAL;
2123 		}
2124 		DRM_INFO("GPU not posted. posting now...\n");
2125 		atom_asic_init(rdev->mode_info.atom_context);
2126 	}
2127 	/* init golden registers */
2128 	ni_init_golden_registers(rdev);
2129 	/* Initialize scratch registers */
2130 	r600_scratch_init(rdev);
2131 	/* Initialize surface registers */
2132 	radeon_surface_init(rdev);
2133 	/* Initialize clocks */
2134 	radeon_get_clock_info(rdev->ddev);
2135 	/* Fence driver */
2136 	r = radeon_fence_driver_init(rdev);
2137 	if (r)
2138 		return r;
2139 	/* initialize memory controller */
2140 	r = evergreen_mc_init(rdev);
2141 	if (r)
2142 		return r;
2143 	/* Memory manager */
2144 	r = radeon_bo_init(rdev);
2145 	if (r)
2146 		return r;
2147 
2148 	ring->ring_obj = NULL;
2149 	r600_ring_init(rdev, ring, 1024 * 1024);
2150 
2151 	ring = &rdev->ring[R600_RING_TYPE_DMA_INDEX];
2152 	ring->ring_obj = NULL;
2153 	r600_ring_init(rdev, ring, 64 * 1024);
2154 
2155 	ring = &rdev->ring[CAYMAN_RING_TYPE_DMA1_INDEX];
2156 	ring->ring_obj = NULL;
2157 	r600_ring_init(rdev, ring, 64 * 1024);
2158 
2159 	r = radeon_uvd_init(rdev);
2160 	if (!r) {
2161 		ring = &rdev->ring[R600_RING_TYPE_UVD_INDEX];
2162 		ring->ring_obj = NULL;
2163 		r600_ring_init(rdev, ring, 4096);
2164 	}
2165 
2166 	rdev->ih.ring_obj = NULL;
2167 	r600_ih_ring_init(rdev, 64 * 1024);
2168 
2169 	r = r600_pcie_gart_init(rdev);
2170 	if (r)
2171 		return r;
2172 
2173 	rdev->accel_working = true;
2174 	r = cayman_startup(rdev);
2175 	if (r) {
2176 		dev_err(rdev->dev, "disabling GPU acceleration\n");
2177 		cayman_cp_fini(rdev);
2178 		cayman_dma_fini(rdev);
2179 		r600_irq_fini(rdev);
2180 		if (rdev->flags & RADEON_IS_IGP)
2181 			sumo_rlc_fini(rdev);
2182 		radeon_wb_fini(rdev);
2183 		radeon_ib_pool_fini(rdev);
2184 		radeon_vm_manager_fini(rdev);
2185 		radeon_irq_kms_fini(rdev);
2186 		cayman_pcie_gart_fini(rdev);
2187 		rdev->accel_working = false;
2188 	}
2189 
2190 	/* Don't start up if the MC ucode is missing.
2191 	 * The default clocks and voltages before the MC ucode
2192 	 * is loaded are not suffient for advanced operations.
2193 	 *
2194 	 * We can skip this check for TN, because there is no MC
2195 	 * ucode.
2196 	 */
2197 	if (!rdev->mc_fw && !(rdev->flags & RADEON_IS_IGP)) {
2198 		DRM_ERROR("radeon: MC ucode required for NI+.\n");
2199 		return -EINVAL;
2200 	}
2201 
2202 	return 0;
2203 }
2204 
2205 void cayman_fini(struct radeon_device *rdev)
2206 {
2207 	cayman_cp_fini(rdev);
2208 	cayman_dma_fini(rdev);
2209 	r600_irq_fini(rdev);
2210 	if (rdev->flags & RADEON_IS_IGP)
2211 		sumo_rlc_fini(rdev);
2212 	radeon_wb_fini(rdev);
2213 	radeon_vm_manager_fini(rdev);
2214 	radeon_ib_pool_fini(rdev);
2215 	radeon_irq_kms_fini(rdev);
2216 	uvd_v1_0_fini(rdev);
2217 	radeon_uvd_fini(rdev);
2218 	cayman_pcie_gart_fini(rdev);
2219 	r600_vram_scratch_fini(rdev);
2220 	radeon_gem_fini(rdev);
2221 	radeon_fence_driver_fini(rdev);
2222 	radeon_bo_fini(rdev);
2223 	radeon_atombios_fini(rdev);
2224 	kfree(rdev->bios);
2225 	rdev->bios = NULL;
2226 }
2227 
2228 /*
2229  * vm
2230  */
2231 int cayman_vm_init(struct radeon_device *rdev)
2232 {
2233 	/* number of VMs */
2234 	rdev->vm_manager.nvm = 8;
2235 	/* base offset of vram pages */
2236 	if (rdev->flags & RADEON_IS_IGP) {
2237 		u64 tmp = RREG32(FUS_MC_VM_FB_OFFSET);
2238 		tmp <<= 22;
2239 		rdev->vm_manager.vram_base_offset = tmp;
2240 	} else
2241 		rdev->vm_manager.vram_base_offset = 0;
2242 	return 0;
2243 }
2244 
2245 void cayman_vm_fini(struct radeon_device *rdev)
2246 {
2247 }
2248 
2249 /**
2250  * cayman_vm_decode_fault - print human readable fault info
2251  *
2252  * @rdev: radeon_device pointer
2253  * @status: VM_CONTEXT1_PROTECTION_FAULT_STATUS register value
2254  * @addr: VM_CONTEXT1_PROTECTION_FAULT_ADDR register value
2255  *
2256  * Print human readable fault information (cayman/TN).
2257  */
2258 void cayman_vm_decode_fault(struct radeon_device *rdev,
2259 			    u32 status, u32 addr)
2260 {
2261 	u32 mc_id = (status & MEMORY_CLIENT_ID_MASK) >> MEMORY_CLIENT_ID_SHIFT;
2262 	u32 vmid = (status & FAULT_VMID_MASK) >> FAULT_VMID_SHIFT;
2263 	u32 protections = (status & PROTECTIONS_MASK) >> PROTECTIONS_SHIFT;
2264 	char *block;
2265 
2266 	switch (mc_id) {
2267 	case 32:
2268 	case 16:
2269 	case 96:
2270 	case 80:
2271 	case 160:
2272 	case 144:
2273 	case 224:
2274 	case 208:
2275 		block = "CB";
2276 		break;
2277 	case 33:
2278 	case 17:
2279 	case 97:
2280 	case 81:
2281 	case 161:
2282 	case 145:
2283 	case 225:
2284 	case 209:
2285 		block = "CB_FMASK";
2286 		break;
2287 	case 34:
2288 	case 18:
2289 	case 98:
2290 	case 82:
2291 	case 162:
2292 	case 146:
2293 	case 226:
2294 	case 210:
2295 		block = "CB_CMASK";
2296 		break;
2297 	case 35:
2298 	case 19:
2299 	case 99:
2300 	case 83:
2301 	case 163:
2302 	case 147:
2303 	case 227:
2304 	case 211:
2305 		block = "CB_IMMED";
2306 		break;
2307 	case 36:
2308 	case 20:
2309 	case 100:
2310 	case 84:
2311 	case 164:
2312 	case 148:
2313 	case 228:
2314 	case 212:
2315 		block = "DB";
2316 		break;
2317 	case 37:
2318 	case 21:
2319 	case 101:
2320 	case 85:
2321 	case 165:
2322 	case 149:
2323 	case 229:
2324 	case 213:
2325 		block = "DB_HTILE";
2326 		break;
2327 	case 38:
2328 	case 22:
2329 	case 102:
2330 	case 86:
2331 	case 166:
2332 	case 150:
2333 	case 230:
2334 	case 214:
2335 		block = "SX";
2336 		break;
2337 	case 39:
2338 	case 23:
2339 	case 103:
2340 	case 87:
2341 	case 167:
2342 	case 151:
2343 	case 231:
2344 	case 215:
2345 		block = "DB_STEN";
2346 		break;
2347 	case 40:
2348 	case 24:
2349 	case 104:
2350 	case 88:
2351 	case 232:
2352 	case 216:
2353 	case 168:
2354 	case 152:
2355 		block = "TC_TFETCH";
2356 		break;
2357 	case 41:
2358 	case 25:
2359 	case 105:
2360 	case 89:
2361 	case 233:
2362 	case 217:
2363 	case 169:
2364 	case 153:
2365 		block = "TC_VFETCH";
2366 		break;
2367 	case 42:
2368 	case 26:
2369 	case 106:
2370 	case 90:
2371 	case 234:
2372 	case 218:
2373 	case 170:
2374 	case 154:
2375 		block = "VC";
2376 		break;
2377 	case 112:
2378 		block = "CP";
2379 		break;
2380 	case 113:
2381 	case 114:
2382 		block = "SH";
2383 		break;
2384 	case 115:
2385 		block = "VGT";
2386 		break;
2387 	case 178:
2388 		block = "IH";
2389 		break;
2390 	case 51:
2391 		block = "RLC";
2392 		break;
2393 	case 55:
2394 		block = "DMA";
2395 		break;
2396 	case 56:
2397 		block = "HDP";
2398 		break;
2399 	default:
2400 		block = "unknown";
2401 		break;
2402 	}
2403 
2404 	printk("VM fault (0x%02x, vmid %d) at page %u, %s from %s (%d)\n",
2405 	       protections, vmid, addr,
2406 	       (status & MEMORY_CLIENT_RW_MASK) ? "write" : "read",
2407 	       block, mc_id);
2408 }
2409 
2410 /**
2411  * cayman_vm_flush - vm flush using the CP
2412  *
2413  * @rdev: radeon_device pointer
2414  *
2415  * Update the page table base and flush the VM TLB
2416  * using the CP (cayman-si).
2417  */
2418 void cayman_vm_flush(struct radeon_device *rdev, int ridx, struct radeon_vm *vm)
2419 {
2420 	struct radeon_ring *ring = &rdev->ring[ridx];
2421 
2422 	if (vm == NULL)
2423 		return;
2424 
2425 	radeon_ring_write(ring, PACKET0(VM_CONTEXT0_PAGE_TABLE_BASE_ADDR + (vm->id << 2), 0));
2426 	radeon_ring_write(ring, vm->pd_gpu_addr >> 12);
2427 
2428 	/* flush hdp cache */
2429 	radeon_ring_write(ring, PACKET0(HDP_MEM_COHERENCY_FLUSH_CNTL, 0));
2430 	radeon_ring_write(ring, 0x1);
2431 
2432 	/* bits 0-7 are the VM contexts0-7 */
2433 	radeon_ring_write(ring, PACKET0(VM_INVALIDATE_REQUEST, 0));
2434 	radeon_ring_write(ring, 1 << vm->id);
2435 
2436 	/* sync PFP to ME, otherwise we might get invalid PFP reads */
2437 	radeon_ring_write(ring, PACKET3(PACKET3_PFP_SYNC_ME, 0));
2438 	radeon_ring_write(ring, 0x0);
2439 }
2440