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