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