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