xref: /dragonfly/sys/dev/drm/radeon/ni.c (revision a85cb24f18e3804e75ab8bcda7692564d0563317)
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  */
tn_smc_rreg(struct radeon_device * rdev,u32 reg)41 u32 tn_smc_rreg(struct radeon_device *rdev, u32 reg)
42 {
43           u32 r;
44 
45           lockmgr(&rdev->smc_idx_lock, LK_EXCLUSIVE);
46           WREG32(TN_SMC_IND_INDEX_0, (reg));
47           r = RREG32(TN_SMC_IND_DATA_0);
48           lockmgr(&rdev->smc_idx_lock, LK_RELEASE);
49           return r;
50 }
51 
tn_smc_wreg(struct radeon_device * rdev,u32 reg,u32 v)52 void tn_smc_wreg(struct radeon_device *rdev, u32 reg, u32 v)
53 {
54           lockmgr(&rdev->smc_idx_lock, LK_EXCLUSIVE);
55           WREG32(TN_SMC_IND_INDEX_0, (reg));
56           WREG32(TN_SMC_IND_DATA_0, (v));
57           lockmgr(&rdev->smc_idx_lock, LK_RELEASE);
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 
ni_init_golden_registers(struct radeon_device * rdev)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 
ni_mc_load_microcode(struct radeon_device * rdev)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 
ni_init_microcode(struct radeon_device * rdev)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                               pr_err("ni_cp: Failed to load firmware \"%s\"\n",
824                                      fw_name);
825                     release_firmware(rdev->pfp_fw);
826                     rdev->pfp_fw = NULL;
827                     release_firmware(rdev->me_fw);
828                     rdev->me_fw = NULL;
829                     release_firmware(rdev->rlc_fw);
830                     rdev->rlc_fw = NULL;
831                     release_firmware(rdev->mc_fw);
832                     rdev->mc_fw = NULL;
833                     release_firmware(rdev->smc_fw);
834                     rdev->smc_fw = NULL;
835           }
836           return err;
837 }
838 
839 /**
840  * ni_fini_microcode - drop the firmwares image references
841  *
842  * @rdev: radeon_device pointer
843  *
844  * Drop the pfp, me, mc and rlc firmwares image references.
845  * Called at driver shutdown.
846  */
ni_fini_microcode(struct radeon_device * rdev)847 void ni_fini_microcode(struct radeon_device *rdev)
848 {
849           release_firmware(rdev->pfp_fw);
850           rdev->pfp_fw = NULL;
851           release_firmware(rdev->me_fw);
852           rdev->me_fw = NULL;
853           release_firmware(rdev->rlc_fw);
854           rdev->rlc_fw = NULL;
855           release_firmware(rdev->mc_fw);
856           rdev->mc_fw = NULL;
857           release_firmware(rdev->smc_fw);
858           rdev->smc_fw = NULL;
859 }
860 
861 /**
862  * cayman_get_allowed_info_register - fetch the register for the info ioctl
863  *
864  * @rdev: radeon_device pointer
865  * @reg: register offset in bytes
866  * @val: register value
867  *
868  * Returns 0 for success or -EINVAL for an invalid register
869  *
870  */
cayman_get_allowed_info_register(struct radeon_device * rdev,u32 reg,u32 * val)871 int cayman_get_allowed_info_register(struct radeon_device *rdev,
872                                              u32 reg, u32 *val)
873 {
874           switch (reg) {
875           case GRBM_STATUS:
876           case GRBM_STATUS_SE0:
877           case GRBM_STATUS_SE1:
878           case SRBM_STATUS:
879           case SRBM_STATUS2:
880           case (DMA_STATUS_REG + DMA0_REGISTER_OFFSET):
881           case (DMA_STATUS_REG + DMA1_REGISTER_OFFSET):
882           case UVD_STATUS:
883                     *val = RREG32(reg);
884                     return 0;
885           default:
886                     return -EINVAL;
887           }
888 }
889 
tn_get_temp(struct radeon_device * rdev)890 int tn_get_temp(struct radeon_device *rdev)
891 {
892           u32 temp = RREG32_SMC(TN_CURRENT_GNB_TEMP) & 0x7ff;
893           int actual_temp = (temp / 8) - 49;
894 
895           return actual_temp * 1000;
896 }
897 
898 /*
899  * Core functions
900  */
cayman_gpu_init(struct radeon_device * rdev)901 static void cayman_gpu_init(struct radeon_device *rdev)
902 {
903           u32 gb_addr_config = 0;
904           u32 mc_shared_chmap, mc_arb_ramcfg;
905           u32 cgts_tcc_disable;
906           u32 sx_debug_1;
907           u32 smx_dc_ctl0;
908           u32 cgts_sm_ctrl_reg;
909           u32 hdp_host_path_cntl;
910           u32 tmp;
911           u32 disabled_rb_mask;
912           int i, j;
913 
914           switch (rdev->family) {
915           case CHIP_CAYMAN:
916                     rdev->config.cayman.max_shader_engines = 2;
917                     rdev->config.cayman.max_pipes_per_simd = 4;
918                     rdev->config.cayman.max_tile_pipes = 8;
919                     rdev->config.cayman.max_simds_per_se = 12;
920                     rdev->config.cayman.max_backends_per_se = 4;
921                     rdev->config.cayman.max_texture_channel_caches = 8;
922                     rdev->config.cayman.max_gprs = 256;
923                     rdev->config.cayman.max_threads = 256;
924                     rdev->config.cayman.max_gs_threads = 32;
925                     rdev->config.cayman.max_stack_entries = 512;
926                     rdev->config.cayman.sx_num_of_sets = 8;
927                     rdev->config.cayman.sx_max_export_size = 256;
928                     rdev->config.cayman.sx_max_export_pos_size = 64;
929                     rdev->config.cayman.sx_max_export_smx_size = 192;
930                     rdev->config.cayman.max_hw_contexts = 8;
931                     rdev->config.cayman.sq_num_cf_insts = 2;
932 
933                     rdev->config.cayman.sc_prim_fifo_size = 0x100;
934                     rdev->config.cayman.sc_hiz_tile_fifo_size = 0x30;
935                     rdev->config.cayman.sc_earlyz_tile_fifo_size = 0x130;
936                     gb_addr_config = CAYMAN_GB_ADDR_CONFIG_GOLDEN;
937                     break;
938           case CHIP_ARUBA:
939           default:
940                     rdev->config.cayman.max_shader_engines = 1;
941                     rdev->config.cayman.max_pipes_per_simd = 4;
942                     rdev->config.cayman.max_tile_pipes = 2;
943                     if ((rdev->pdev->device == 0x9900) ||
944                         (rdev->pdev->device == 0x9901) ||
945                         (rdev->pdev->device == 0x9905) ||
946                         (rdev->pdev->device == 0x9906) ||
947                         (rdev->pdev->device == 0x9907) ||
948                         (rdev->pdev->device == 0x9908) ||
949                         (rdev->pdev->device == 0x9909) ||
950                         (rdev->pdev->device == 0x990B) ||
951                         (rdev->pdev->device == 0x990C) ||
952                         (rdev->pdev->device == 0x990F) ||
953                         (rdev->pdev->device == 0x9910) ||
954                         (rdev->pdev->device == 0x9917) ||
955                         (rdev->pdev->device == 0x9999) ||
956                         (rdev->pdev->device == 0x999C)) {
957                               rdev->config.cayman.max_simds_per_se = 6;
958                               rdev->config.cayman.max_backends_per_se = 2;
959                               rdev->config.cayman.max_hw_contexts = 8;
960                               rdev->config.cayman.sx_max_export_size = 256;
961                               rdev->config.cayman.sx_max_export_pos_size = 64;
962                               rdev->config.cayman.sx_max_export_smx_size = 192;
963                     } else if ((rdev->pdev->device == 0x9903) ||
964                                  (rdev->pdev->device == 0x9904) ||
965                                  (rdev->pdev->device == 0x990A) ||
966                                  (rdev->pdev->device == 0x990D) ||
967                                  (rdev->pdev->device == 0x990E) ||
968                                  (rdev->pdev->device == 0x9913) ||
969                                  (rdev->pdev->device == 0x9918) ||
970                                  (rdev->pdev->device == 0x999D)) {
971                               rdev->config.cayman.max_simds_per_se = 4;
972                               rdev->config.cayman.max_backends_per_se = 2;
973                               rdev->config.cayman.max_hw_contexts = 8;
974                               rdev->config.cayman.sx_max_export_size = 256;
975                               rdev->config.cayman.sx_max_export_pos_size = 64;
976                               rdev->config.cayman.sx_max_export_smx_size = 192;
977                     } else if ((rdev->pdev->device == 0x9919) ||
978                                  (rdev->pdev->device == 0x9990) ||
979                                  (rdev->pdev->device == 0x9991) ||
980                                  (rdev->pdev->device == 0x9994) ||
981                                  (rdev->pdev->device == 0x9995) ||
982                                  (rdev->pdev->device == 0x9996) ||
983                                  (rdev->pdev->device == 0x999A) ||
984                                  (rdev->pdev->device == 0x99A0)) {
985                               rdev->config.cayman.max_simds_per_se = 3;
986                               rdev->config.cayman.max_backends_per_se = 1;
987                               rdev->config.cayman.max_hw_contexts = 4;
988                               rdev->config.cayman.sx_max_export_size = 128;
989                               rdev->config.cayman.sx_max_export_pos_size = 32;
990                               rdev->config.cayman.sx_max_export_smx_size = 96;
991                     } else {
992                               rdev->config.cayman.max_simds_per_se = 2;
993                               rdev->config.cayman.max_backends_per_se = 1;
994                               rdev->config.cayman.max_hw_contexts = 4;
995                               rdev->config.cayman.sx_max_export_size = 128;
996                               rdev->config.cayman.sx_max_export_pos_size = 32;
997                               rdev->config.cayman.sx_max_export_smx_size = 96;
998                     }
999                     rdev->config.cayman.max_texture_channel_caches = 2;
1000                     rdev->config.cayman.max_gprs = 256;
1001                     rdev->config.cayman.max_threads = 256;
1002                     rdev->config.cayman.max_gs_threads = 32;
1003                     rdev->config.cayman.max_stack_entries = 512;
1004                     rdev->config.cayman.sx_num_of_sets = 8;
1005                     rdev->config.cayman.sq_num_cf_insts = 2;
1006 
1007                     rdev->config.cayman.sc_prim_fifo_size = 0x40;
1008                     rdev->config.cayman.sc_hiz_tile_fifo_size = 0x30;
1009                     rdev->config.cayman.sc_earlyz_tile_fifo_size = 0x130;
1010                     gb_addr_config = ARUBA_GB_ADDR_CONFIG_GOLDEN;
1011                     break;
1012           }
1013 
1014           /* Initialize HDP */
1015           for (i = 0, j = 0; i < 32; i++, j += 0x18) {
1016                     WREG32((0x2c14 + j), 0x00000000);
1017                     WREG32((0x2c18 + j), 0x00000000);
1018                     WREG32((0x2c1c + j), 0x00000000);
1019                     WREG32((0x2c20 + j), 0x00000000);
1020                     WREG32((0x2c24 + j), 0x00000000);
1021           }
1022 
1023           WREG32(GRBM_CNTL, GRBM_READ_TIMEOUT(0xff));
1024           WREG32(SRBM_INT_CNTL, 0x1);
1025           WREG32(SRBM_INT_ACK, 0x1);
1026 
1027           evergreen_fix_pci_max_read_req_size(rdev);
1028 
1029           mc_shared_chmap = RREG32(MC_SHARED_CHMAP);
1030           mc_arb_ramcfg = RREG32(MC_ARB_RAMCFG);
1031 
1032           tmp = (mc_arb_ramcfg & NOOFCOLS_MASK) >> NOOFCOLS_SHIFT;
1033           rdev->config.cayman.mem_row_size_in_kb = (4 * (1 << (8 + tmp))) / 1024;
1034           if (rdev->config.cayman.mem_row_size_in_kb > 4)
1035                     rdev->config.cayman.mem_row_size_in_kb = 4;
1036           /* XXX use MC settings? */
1037           rdev->config.cayman.shader_engine_tile_size = 32;
1038           rdev->config.cayman.num_gpus = 1;
1039           rdev->config.cayman.multi_gpu_tile_size = 64;
1040 
1041           tmp = (gb_addr_config & NUM_PIPES_MASK) >> NUM_PIPES_SHIFT;
1042           rdev->config.cayman.num_tile_pipes = (1 << tmp);
1043           tmp = (gb_addr_config & PIPE_INTERLEAVE_SIZE_MASK) >> PIPE_INTERLEAVE_SIZE_SHIFT;
1044           rdev->config.cayman.mem_max_burst_length_bytes = (tmp + 1) * 256;
1045           tmp = (gb_addr_config & NUM_SHADER_ENGINES_MASK) >> NUM_SHADER_ENGINES_SHIFT;
1046           rdev->config.cayman.num_shader_engines = tmp + 1;
1047           tmp = (gb_addr_config & NUM_GPUS_MASK) >> NUM_GPUS_SHIFT;
1048           rdev->config.cayman.num_gpus = tmp + 1;
1049           tmp = (gb_addr_config & MULTI_GPU_TILE_SIZE_MASK) >> MULTI_GPU_TILE_SIZE_SHIFT;
1050           rdev->config.cayman.multi_gpu_tile_size = 1 << tmp;
1051           tmp = (gb_addr_config & ROW_SIZE_MASK) >> ROW_SIZE_SHIFT;
1052           rdev->config.cayman.mem_row_size_in_kb = 1 << tmp;
1053 
1054 
1055           /* setup tiling info dword.  gb_addr_config is not adequate since it does
1056            * not have bank info, so create a custom tiling dword.
1057            * bits 3:0   num_pipes
1058            * bits 7:4   num_banks
1059            * bits 11:8  group_size
1060            * bits 15:12 row_size
1061            */
1062           rdev->config.cayman.tile_config = 0;
1063           switch (rdev->config.cayman.num_tile_pipes) {
1064           case 1:
1065           default:
1066                     rdev->config.cayman.tile_config |= (0 << 0);
1067                     break;
1068           case 2:
1069                     rdev->config.cayman.tile_config |= (1 << 0);
1070                     break;
1071           case 4:
1072                     rdev->config.cayman.tile_config |= (2 << 0);
1073                     break;
1074           case 8:
1075                     rdev->config.cayman.tile_config |= (3 << 0);
1076                     break;
1077           }
1078 
1079           /* num banks is 8 on all fusion asics. 0 = 4, 1 = 8, 2 = 16 */
1080           if (rdev->flags & RADEON_IS_IGP)
1081                     rdev->config.cayman.tile_config |= 1 << 4;
1082           else {
1083                     switch ((mc_arb_ramcfg & NOOFBANK_MASK) >> NOOFBANK_SHIFT) {
1084                     case 0: /* four banks */
1085                               rdev->config.cayman.tile_config |= 0 << 4;
1086                               break;
1087                     case 1: /* eight banks */
1088                               rdev->config.cayman.tile_config |= 1 << 4;
1089                               break;
1090                     case 2: /* sixteen banks */
1091                     default:
1092                               rdev->config.cayman.tile_config |= 2 << 4;
1093                               break;
1094                     }
1095           }
1096           rdev->config.cayman.tile_config |=
1097                     ((gb_addr_config & PIPE_INTERLEAVE_SIZE_MASK) >> PIPE_INTERLEAVE_SIZE_SHIFT) << 8;
1098           rdev->config.cayman.tile_config |=
1099                     ((gb_addr_config & ROW_SIZE_MASK) >> ROW_SIZE_SHIFT) << 12;
1100 
1101           tmp = 0;
1102           for (i = (rdev->config.cayman.max_shader_engines - 1); i >= 0; i--) {
1103                     u32 rb_disable_bitmap;
1104 
1105                     WREG32(GRBM_GFX_INDEX, INSTANCE_BROADCAST_WRITES | SE_INDEX(i));
1106                     WREG32(RLC_GFX_INDEX, INSTANCE_BROADCAST_WRITES | SE_INDEX(i));
1107                     rb_disable_bitmap = (RREG32(CC_RB_BACKEND_DISABLE) & 0x00ff0000) >> 16;
1108                     tmp <<= 4;
1109                     tmp |= rb_disable_bitmap;
1110           }
1111           /* enabled rb are just the one not disabled :) */
1112           disabled_rb_mask = tmp;
1113           tmp = 0;
1114           for (i = 0; i < (rdev->config.cayman.max_backends_per_se * rdev->config.cayman.max_shader_engines); i++)
1115                     tmp |= (1 << i);
1116           /* if all the backends are disabled, fix it up here */
1117           if ((disabled_rb_mask & tmp) == tmp) {
1118                     for (i = 0; i < (rdev->config.cayman.max_backends_per_se * rdev->config.cayman.max_shader_engines); i++)
1119                               disabled_rb_mask &= ~(1 << i);
1120           }
1121 
1122           for (i = 0; i < rdev->config.cayman.max_shader_engines; i++) {
1123                     u32 simd_disable_bitmap;
1124 
1125                     WREG32(GRBM_GFX_INDEX, INSTANCE_BROADCAST_WRITES | SE_INDEX(i));
1126                     WREG32(RLC_GFX_INDEX, INSTANCE_BROADCAST_WRITES | SE_INDEX(i));
1127                     simd_disable_bitmap = (RREG32(CC_GC_SHADER_PIPE_CONFIG) & 0xffff0000) >> 16;
1128                     simd_disable_bitmap |= 0xffffffff << rdev->config.cayman.max_simds_per_se;
1129                     tmp <<= 16;
1130                     tmp |= simd_disable_bitmap;
1131           }
1132           rdev->config.cayman.active_simds = hweight32(~tmp);
1133 
1134           WREG32(GRBM_GFX_INDEX, INSTANCE_BROADCAST_WRITES | SE_BROADCAST_WRITES);
1135           WREG32(RLC_GFX_INDEX, INSTANCE_BROADCAST_WRITES | SE_BROADCAST_WRITES);
1136 
1137           WREG32(GB_ADDR_CONFIG, gb_addr_config);
1138           WREG32(DMIF_ADDR_CONFIG, gb_addr_config);
1139           if (ASIC_IS_DCE6(rdev))
1140                     WREG32(DMIF_ADDR_CALC, gb_addr_config);
1141           WREG32(HDP_ADDR_CONFIG, gb_addr_config);
1142           WREG32(DMA_TILING_CONFIG + DMA0_REGISTER_OFFSET, gb_addr_config);
1143           WREG32(DMA_TILING_CONFIG + DMA1_REGISTER_OFFSET, gb_addr_config);
1144           WREG32(UVD_UDEC_ADDR_CONFIG, gb_addr_config);
1145           WREG32(UVD_UDEC_DB_ADDR_CONFIG, gb_addr_config);
1146           WREG32(UVD_UDEC_DBW_ADDR_CONFIG, gb_addr_config);
1147 
1148           if ((rdev->config.cayman.max_backends_per_se == 1) &&
1149               (rdev->flags & RADEON_IS_IGP)) {
1150                     if ((disabled_rb_mask & 3) == 2) {
1151                               /* RB1 disabled, RB0 enabled */
1152                               tmp = 0x00000000;
1153                     } else {
1154                               /* RB0 disabled, RB1 enabled */
1155                               tmp = 0x11111111;
1156                     }
1157           } else {
1158                     tmp = gb_addr_config & NUM_PIPES_MASK;
1159                     tmp = r6xx_remap_render_backend(rdev, tmp,
1160                                                             rdev->config.cayman.max_backends_per_se *
1161                                                             rdev->config.cayman.max_shader_engines,
1162                                                             CAYMAN_MAX_BACKENDS, disabled_rb_mask);
1163           }
1164           WREG32(GB_BACKEND_MAP, tmp);
1165 
1166           cgts_tcc_disable = 0xffff0000;
1167           for (i = 0; i < rdev->config.cayman.max_texture_channel_caches; i++)
1168                     cgts_tcc_disable &= ~(1 << (16 + i));
1169           WREG32(CGTS_TCC_DISABLE, cgts_tcc_disable);
1170           WREG32(CGTS_SYS_TCC_DISABLE, cgts_tcc_disable);
1171           WREG32(CGTS_USER_SYS_TCC_DISABLE, cgts_tcc_disable);
1172           WREG32(CGTS_USER_TCC_DISABLE, cgts_tcc_disable);
1173 
1174           /* reprogram the shader complex */
1175           cgts_sm_ctrl_reg = RREG32(CGTS_SM_CTRL_REG);
1176           for (i = 0; i < 16; i++)
1177                     WREG32(CGTS_SM_CTRL_REG, OVERRIDE);
1178           WREG32(CGTS_SM_CTRL_REG, cgts_sm_ctrl_reg);
1179 
1180           /* set HW defaults for 3D engine */
1181           WREG32(CP_MEQ_THRESHOLDS, MEQ1_START(0x30) | MEQ2_START(0x60));
1182 
1183           sx_debug_1 = RREG32(SX_DEBUG_1);
1184           sx_debug_1 |= ENABLE_NEW_SMX_ADDRESS;
1185           WREG32(SX_DEBUG_1, sx_debug_1);
1186 
1187           smx_dc_ctl0 = RREG32(SMX_DC_CTL0);
1188           smx_dc_ctl0 &= ~NUMBER_OF_SETS(0x1ff);
1189           smx_dc_ctl0 |= NUMBER_OF_SETS(rdev->config.cayman.sx_num_of_sets);
1190           WREG32(SMX_DC_CTL0, smx_dc_ctl0);
1191 
1192           WREG32(SPI_CONFIG_CNTL_1, VTX_DONE_DELAY(4) | CRC_SIMD_ID_WADDR_DISABLE);
1193 
1194           /* need to be explicitly zero-ed */
1195           WREG32(VGT_OFFCHIP_LDS_BASE, 0);
1196           WREG32(SQ_LSTMP_RING_BASE, 0);
1197           WREG32(SQ_HSTMP_RING_BASE, 0);
1198           WREG32(SQ_ESTMP_RING_BASE, 0);
1199           WREG32(SQ_GSTMP_RING_BASE, 0);
1200           WREG32(SQ_VSTMP_RING_BASE, 0);
1201           WREG32(SQ_PSTMP_RING_BASE, 0);
1202 
1203           WREG32(TA_CNTL_AUX, DISABLE_CUBE_ANISO);
1204 
1205           WREG32(SX_EXPORT_BUFFER_SIZES, (COLOR_BUFFER_SIZE((rdev->config.cayman.sx_max_export_size / 4) - 1) |
1206                                                   POSITION_BUFFER_SIZE((rdev->config.cayman.sx_max_export_pos_size / 4) - 1) |
1207                                                   SMX_BUFFER_SIZE((rdev->config.cayman.sx_max_export_smx_size / 4) - 1)));
1208 
1209           WREG32(PA_SC_FIFO_SIZE, (SC_PRIM_FIFO_SIZE(rdev->config.cayman.sc_prim_fifo_size) |
1210                                          SC_HIZ_TILE_FIFO_SIZE(rdev->config.cayman.sc_hiz_tile_fifo_size) |
1211                                          SC_EARLYZ_TILE_FIFO_SIZE(rdev->config.cayman.sc_earlyz_tile_fifo_size)));
1212 
1213 
1214           WREG32(VGT_NUM_INSTANCES, 1);
1215 
1216           WREG32(CP_PERFMON_CNTL, 0);
1217 
1218           WREG32(SQ_MS_FIFO_SIZES, (CACHE_FIFO_SIZE(16 * rdev->config.cayman.sq_num_cf_insts) |
1219                                           FETCH_FIFO_HIWATER(0x4) |
1220                                           DONE_FIFO_HIWATER(0xe0) |
1221                                           ALU_UPDATE_FIFO_HIWATER(0x8)));
1222 
1223           WREG32(SQ_GPR_RESOURCE_MGMT_1, NUM_CLAUSE_TEMP_GPRS(4));
1224           WREG32(SQ_CONFIG, (VC_ENABLE |
1225                                  EXPORT_SRC_C |
1226                                  GFX_PRIO(0) |
1227                                  CS1_PRIO(0) |
1228                                  CS2_PRIO(1)));
1229           WREG32(SQ_DYN_GPR_CNTL_PS_FLUSH_REQ, DYN_GPR_ENABLE);
1230 
1231           WREG32(PA_SC_FORCE_EOV_MAX_CNTS, (FORCE_EOV_MAX_CLK_CNT(4095) |
1232                                                     FORCE_EOV_MAX_REZ_CNT(255)));
1233 
1234           WREG32(VGT_CACHE_INVALIDATION, CACHE_INVALIDATION(VC_AND_TC) |
1235                  AUTO_INVLD_EN(ES_AND_GS_AUTO));
1236 
1237           WREG32(VGT_GS_VERTEX_REUSE, 16);
1238           WREG32(PA_SC_LINE_STIPPLE_STATE, 0);
1239 
1240           WREG32(CB_PERF_CTR0_SEL_0, 0);
1241           WREG32(CB_PERF_CTR0_SEL_1, 0);
1242           WREG32(CB_PERF_CTR1_SEL_0, 0);
1243           WREG32(CB_PERF_CTR1_SEL_1, 0);
1244           WREG32(CB_PERF_CTR2_SEL_0, 0);
1245           WREG32(CB_PERF_CTR2_SEL_1, 0);
1246           WREG32(CB_PERF_CTR3_SEL_0, 0);
1247           WREG32(CB_PERF_CTR3_SEL_1, 0);
1248 
1249           tmp = RREG32(HDP_MISC_CNTL);
1250           tmp |= HDP_FLUSH_INVALIDATE_CACHE;
1251           WREG32(HDP_MISC_CNTL, tmp);
1252 
1253           hdp_host_path_cntl = RREG32(HDP_HOST_PATH_CNTL);
1254           WREG32(HDP_HOST_PATH_CNTL, hdp_host_path_cntl);
1255 
1256           WREG32(PA_CL_ENHANCE, CLIP_VTX_REORDER_ENA | NUM_CLIP_SEQ(3));
1257 
1258           udelay(50);
1259 
1260           /* set clockgating golden values on TN */
1261           if (rdev->family == CHIP_ARUBA) {
1262                     tmp = RREG32_CG(CG_CGTT_LOCAL_0);
1263                     tmp &= ~0x00380000;
1264                     WREG32_CG(CG_CGTT_LOCAL_0, tmp);
1265                     tmp = RREG32_CG(CG_CGTT_LOCAL_1);
1266                     tmp &= ~0x0e000000;
1267                     WREG32_CG(CG_CGTT_LOCAL_1, tmp);
1268           }
1269 }
1270 
1271 /*
1272  * GART
1273  */
cayman_pcie_gart_tlb_flush(struct radeon_device * rdev)1274 void cayman_pcie_gart_tlb_flush(struct radeon_device *rdev)
1275 {
1276           /* flush hdp cache */
1277           WREG32(HDP_MEM_COHERENCY_FLUSH_CNTL, 0x1);
1278 
1279           /* bits 0-7 are the VM contexts0-7 */
1280           WREG32(VM_INVALIDATE_REQUEST, 1);
1281 }
1282 
cayman_pcie_gart_enable(struct radeon_device * rdev)1283 static int cayman_pcie_gart_enable(struct radeon_device *rdev)
1284 {
1285           int i, r;
1286 
1287           if (rdev->gart.robj == NULL) {
1288                     dev_err(rdev->dev, "No VRAM object for PCIE GART.\n");
1289                     return -EINVAL;
1290           }
1291           r = radeon_gart_table_vram_pin(rdev);
1292           if (r)
1293                     return r;
1294           /* Setup TLB control */
1295           WREG32(MC_VM_MX_L1_TLB_CNTL,
1296                  (0xA << 7) |
1297                  ENABLE_L1_TLB |
1298                  ENABLE_L1_FRAGMENT_PROCESSING |
1299                  SYSTEM_ACCESS_MODE_NOT_IN_SYS |
1300                  ENABLE_ADVANCED_DRIVER_MODEL |
1301                  SYSTEM_APERTURE_UNMAPPED_ACCESS_PASS_THRU);
1302           /* Setup L2 cache */
1303           WREG32(VM_L2_CNTL, ENABLE_L2_CACHE |
1304                  ENABLE_L2_FRAGMENT_PROCESSING |
1305                  ENABLE_L2_PTE_CACHE_LRU_UPDATE_BY_WRITE |
1306                  ENABLE_L2_PDE0_CACHE_LRU_UPDATE_BY_WRITE |
1307                  EFFECTIVE_L2_QUEUE_SIZE(7) |
1308                  CONTEXT1_IDENTITY_ACCESS_MODE(1));
1309           WREG32(VM_L2_CNTL2, INVALIDATE_ALL_L1_TLBS | INVALIDATE_L2_CACHE);
1310           WREG32(VM_L2_CNTL3, L2_CACHE_BIGK_ASSOCIATIVITY |
1311                  BANK_SELECT(6) |
1312                  L2_CACHE_BIGK_FRAGMENT_SIZE(6));
1313           /* setup context0 */
1314           WREG32(VM_CONTEXT0_PAGE_TABLE_START_ADDR, rdev->mc.gtt_start >> 12);
1315           WREG32(VM_CONTEXT0_PAGE_TABLE_END_ADDR, rdev->mc.gtt_end >> 12);
1316           WREG32(VM_CONTEXT0_PAGE_TABLE_BASE_ADDR, rdev->gart.table_addr >> 12);
1317           WREG32(VM_CONTEXT0_PROTECTION_FAULT_DEFAULT_ADDR,
1318                               (u32)(rdev->dummy_page.addr >> 12));
1319           WREG32(VM_CONTEXT0_CNTL2, 0);
1320           WREG32(VM_CONTEXT0_CNTL, ENABLE_CONTEXT | PAGE_TABLE_DEPTH(0) |
1321                                         RANGE_PROTECTION_FAULT_ENABLE_DEFAULT);
1322 
1323           WREG32(0x15D4, 0);
1324           WREG32(0x15D8, 0);
1325           WREG32(0x15DC, 0);
1326 
1327           /* empty context1-7 */
1328           /* Assign the pt base to something valid for now; the pts used for
1329            * the VMs are determined by the application and setup and assigned
1330            * on the fly in the vm part of radeon_gart.c
1331            */
1332           for (i = 1; i < 8; i++) {
1333                     WREG32(VM_CONTEXT0_PAGE_TABLE_START_ADDR + (i << 2), 0);
1334                     WREG32(VM_CONTEXT0_PAGE_TABLE_END_ADDR + (i << 2),
1335                               rdev->vm_manager.max_pfn - 1);
1336                     WREG32(VM_CONTEXT0_PAGE_TABLE_BASE_ADDR + (i << 2),
1337                            rdev->vm_manager.saved_table_addr[i]);
1338           }
1339 
1340           /* enable context1-7 */
1341           WREG32(VM_CONTEXT1_PROTECTION_FAULT_DEFAULT_ADDR,
1342                  (u32)(rdev->dummy_page.addr >> 12));
1343           WREG32(VM_CONTEXT1_CNTL2, 4);
1344           WREG32(VM_CONTEXT1_CNTL, ENABLE_CONTEXT | PAGE_TABLE_DEPTH(1) |
1345                                         PAGE_TABLE_BLOCK_SIZE(radeon_vm_block_size - 9) |
1346                                         RANGE_PROTECTION_FAULT_ENABLE_INTERRUPT |
1347                                         RANGE_PROTECTION_FAULT_ENABLE_DEFAULT |
1348                                         DUMMY_PAGE_PROTECTION_FAULT_ENABLE_INTERRUPT |
1349                                         DUMMY_PAGE_PROTECTION_FAULT_ENABLE_DEFAULT |
1350                                         PDE0_PROTECTION_FAULT_ENABLE_INTERRUPT |
1351                                         PDE0_PROTECTION_FAULT_ENABLE_DEFAULT |
1352                                         VALID_PROTECTION_FAULT_ENABLE_INTERRUPT |
1353                                         VALID_PROTECTION_FAULT_ENABLE_DEFAULT |
1354                                         READ_PROTECTION_FAULT_ENABLE_INTERRUPT |
1355                                         READ_PROTECTION_FAULT_ENABLE_DEFAULT |
1356                                         WRITE_PROTECTION_FAULT_ENABLE_INTERRUPT |
1357                                         WRITE_PROTECTION_FAULT_ENABLE_DEFAULT);
1358 
1359           cayman_pcie_gart_tlb_flush(rdev);
1360           DRM_INFO("PCIE GART of %uM enabled (table at 0x%016llX).\n",
1361                      (unsigned)(rdev->mc.gtt_size >> 20),
1362                      (unsigned long long)rdev->gart.table_addr);
1363           rdev->gart.ready = true;
1364           return 0;
1365 }
1366 
cayman_pcie_gart_disable(struct radeon_device * rdev)1367 static void cayman_pcie_gart_disable(struct radeon_device *rdev)
1368 {
1369           unsigned i;
1370 
1371           for (i = 1; i < 8; ++i) {
1372                     rdev->vm_manager.saved_table_addr[i] = RREG32(
1373                               VM_CONTEXT0_PAGE_TABLE_BASE_ADDR + (i << 2));
1374           }
1375 
1376           /* Disable all tables */
1377           WREG32(VM_CONTEXT0_CNTL, 0);
1378           WREG32(VM_CONTEXT1_CNTL, 0);
1379           /* Setup TLB control */
1380           WREG32(MC_VM_MX_L1_TLB_CNTL, ENABLE_L1_FRAGMENT_PROCESSING |
1381                  SYSTEM_ACCESS_MODE_NOT_IN_SYS |
1382                  SYSTEM_APERTURE_UNMAPPED_ACCESS_PASS_THRU);
1383           /* Setup L2 cache */
1384           WREG32(VM_L2_CNTL, ENABLE_L2_PTE_CACHE_LRU_UPDATE_BY_WRITE |
1385                  ENABLE_L2_PDE0_CACHE_LRU_UPDATE_BY_WRITE |
1386                  EFFECTIVE_L2_QUEUE_SIZE(7) |
1387                  CONTEXT1_IDENTITY_ACCESS_MODE(1));
1388           WREG32(VM_L2_CNTL2, 0);
1389           WREG32(VM_L2_CNTL3, L2_CACHE_BIGK_ASSOCIATIVITY |
1390                  L2_CACHE_BIGK_FRAGMENT_SIZE(6));
1391           radeon_gart_table_vram_unpin(rdev);
1392 }
1393 
cayman_pcie_gart_fini(struct radeon_device * rdev)1394 static void cayman_pcie_gart_fini(struct radeon_device *rdev)
1395 {
1396           cayman_pcie_gart_disable(rdev);
1397           radeon_gart_table_vram_free(rdev);
1398           radeon_gart_fini(rdev);
1399 }
1400 
cayman_cp_int_cntl_setup(struct radeon_device * rdev,int ring,u32 cp_int_cntl)1401 void cayman_cp_int_cntl_setup(struct radeon_device *rdev,
1402                                     int ring, u32 cp_int_cntl)
1403 {
1404           WREG32(SRBM_GFX_CNTL, RINGID(ring));
1405           WREG32(CP_INT_CNTL, cp_int_cntl);
1406 }
1407 
1408 /*
1409  * CP.
1410  */
cayman_fence_ring_emit(struct radeon_device * rdev,struct radeon_fence * fence)1411 void cayman_fence_ring_emit(struct radeon_device *rdev,
1412                                   struct radeon_fence *fence)
1413 {
1414           struct radeon_ring *ring = &rdev->ring[fence->ring];
1415           u64 addr = rdev->fence_drv[fence->ring].gpu_addr;
1416           u32 cp_coher_cntl = PACKET3_FULL_CACHE_ENA | PACKET3_TC_ACTION_ENA |
1417                     PACKET3_SH_ACTION_ENA;
1418 
1419           /* flush read cache over gart for this vmid */
1420           radeon_ring_write(ring, PACKET3(PACKET3_SURFACE_SYNC, 3));
1421           radeon_ring_write(ring, PACKET3_ENGINE_ME | cp_coher_cntl);
1422           radeon_ring_write(ring, 0xFFFFFFFF);
1423           radeon_ring_write(ring, 0);
1424           radeon_ring_write(ring, 10); /* poll interval */
1425           /* EVENT_WRITE_EOP - flush caches, send int */
1426           radeon_ring_write(ring, PACKET3(PACKET3_EVENT_WRITE_EOP, 4));
1427           radeon_ring_write(ring, EVENT_TYPE(CACHE_FLUSH_AND_INV_EVENT_TS) | EVENT_INDEX(5));
1428           radeon_ring_write(ring, lower_32_bits(addr));
1429           radeon_ring_write(ring, (upper_32_bits(addr) & 0xff) | DATA_SEL(1) | INT_SEL(2));
1430           radeon_ring_write(ring, fence->seq);
1431           radeon_ring_write(ring, 0);
1432 }
1433 
cayman_ring_ib_execute(struct radeon_device * rdev,struct radeon_ib * ib)1434 void cayman_ring_ib_execute(struct radeon_device *rdev, struct radeon_ib *ib)
1435 {
1436           struct radeon_ring *ring = &rdev->ring[ib->ring];
1437           unsigned vm_id = ib->vm ? ib->vm->ids[ib->ring].id : 0;
1438           u32 cp_coher_cntl = PACKET3_FULL_CACHE_ENA | PACKET3_TC_ACTION_ENA |
1439                     PACKET3_SH_ACTION_ENA;
1440 
1441           /* set to DX10/11 mode */
1442           radeon_ring_write(ring, PACKET3(PACKET3_MODE_CONTROL, 0));
1443           radeon_ring_write(ring, 1);
1444 
1445           if (ring->rptr_save_reg) {
1446                     uint32_t next_rptr = ring->wptr + 3 + 4 + 8;
1447                     radeon_ring_write(ring, PACKET3(PACKET3_SET_CONFIG_REG, 1));
1448                     radeon_ring_write(ring, ((ring->rptr_save_reg -
1449                                                     PACKET3_SET_CONFIG_REG_START) >> 2));
1450                     radeon_ring_write(ring, next_rptr);
1451           }
1452 
1453           radeon_ring_write(ring, PACKET3(PACKET3_INDIRECT_BUFFER, 2));
1454           radeon_ring_write(ring,
1455 #ifdef __BIG_ENDIAN
1456                                 (2 << 0) |
1457 #endif
1458                                 (ib->gpu_addr & 0xFFFFFFFC));
1459           radeon_ring_write(ring, upper_32_bits(ib->gpu_addr) & 0xFF);
1460           radeon_ring_write(ring, ib->length_dw | (vm_id << 24));
1461 
1462           /* flush read cache over gart for this vmid */
1463           radeon_ring_write(ring, PACKET3(PACKET3_SURFACE_SYNC, 3));
1464           radeon_ring_write(ring, PACKET3_ENGINE_ME | cp_coher_cntl);
1465           radeon_ring_write(ring, 0xFFFFFFFF);
1466           radeon_ring_write(ring, 0);
1467           radeon_ring_write(ring, (vm_id << 24) | 10); /* poll interval */
1468 }
1469 
cayman_cp_enable(struct radeon_device * rdev,bool enable)1470 static void cayman_cp_enable(struct radeon_device *rdev, bool enable)
1471 {
1472           if (enable)
1473                     WREG32(CP_ME_CNTL, 0);
1474           else {
1475                     if (rdev->asic->copy.copy_ring_index == RADEON_RING_TYPE_GFX_INDEX)
1476                               radeon_ttm_set_active_vram_size(rdev, rdev->mc.visible_vram_size);
1477                     WREG32(CP_ME_CNTL, (CP_ME_HALT | CP_PFP_HALT));
1478                     WREG32(SCRATCH_UMSK, 0);
1479                     rdev->ring[RADEON_RING_TYPE_GFX_INDEX].ready = false;
1480           }
1481 }
1482 
cayman_gfx_get_rptr(struct radeon_device * rdev,struct radeon_ring * ring)1483 u32 cayman_gfx_get_rptr(struct radeon_device *rdev,
1484                               struct radeon_ring *ring)
1485 {
1486           u32 rptr;
1487 
1488           if (rdev->wb.enabled)
1489                     rptr = rdev->wb.wb[ring->rptr_offs/4];
1490           else {
1491                     if (ring->idx == RADEON_RING_TYPE_GFX_INDEX)
1492                               rptr = RREG32(CP_RB0_RPTR);
1493                     else if (ring->idx == CAYMAN_RING_TYPE_CP1_INDEX)
1494                               rptr = RREG32(CP_RB1_RPTR);
1495                     else
1496                               rptr = RREG32(CP_RB2_RPTR);
1497           }
1498 
1499           return rptr;
1500 }
1501 
cayman_gfx_get_wptr(struct radeon_device * rdev,struct radeon_ring * ring)1502 u32 cayman_gfx_get_wptr(struct radeon_device *rdev,
1503                               struct radeon_ring *ring)
1504 {
1505           u32 wptr;
1506 
1507           if (ring->idx == RADEON_RING_TYPE_GFX_INDEX)
1508                     wptr = RREG32(CP_RB0_WPTR);
1509           else if (ring->idx == CAYMAN_RING_TYPE_CP1_INDEX)
1510                     wptr = RREG32(CP_RB1_WPTR);
1511           else
1512                     wptr = RREG32(CP_RB2_WPTR);
1513 
1514           return wptr;
1515 }
1516 
cayman_gfx_set_wptr(struct radeon_device * rdev,struct radeon_ring * ring)1517 void cayman_gfx_set_wptr(struct radeon_device *rdev,
1518                                struct radeon_ring *ring)
1519 {
1520           if (ring->idx == RADEON_RING_TYPE_GFX_INDEX) {
1521                     WREG32(CP_RB0_WPTR, ring->wptr);
1522                     (void)RREG32(CP_RB0_WPTR);
1523           } else if (ring->idx == CAYMAN_RING_TYPE_CP1_INDEX) {
1524                     WREG32(CP_RB1_WPTR, ring->wptr);
1525                     (void)RREG32(CP_RB1_WPTR);
1526           } else {
1527                     WREG32(CP_RB2_WPTR, ring->wptr);
1528                     (void)RREG32(CP_RB2_WPTR);
1529           }
1530 }
1531 
cayman_cp_load_microcode(struct radeon_device * rdev)1532 static int cayman_cp_load_microcode(struct radeon_device *rdev)
1533 {
1534           const __be32 *fw_data;
1535           int i;
1536 
1537           if (!rdev->me_fw || !rdev->pfp_fw)
1538                     return -EINVAL;
1539 
1540           cayman_cp_enable(rdev, false);
1541 
1542           fw_data = (const __be32 *)rdev->pfp_fw->data;
1543           WREG32(CP_PFP_UCODE_ADDR, 0);
1544           for (i = 0; i < CAYMAN_PFP_UCODE_SIZE; i++)
1545                     WREG32(CP_PFP_UCODE_DATA, be32_to_cpup(fw_data++));
1546           WREG32(CP_PFP_UCODE_ADDR, 0);
1547 
1548           fw_data = (const __be32 *)rdev->me_fw->data;
1549           WREG32(CP_ME_RAM_WADDR, 0);
1550           for (i = 0; i < CAYMAN_PM4_UCODE_SIZE; i++)
1551                     WREG32(CP_ME_RAM_DATA, be32_to_cpup(fw_data++));
1552 
1553           WREG32(CP_PFP_UCODE_ADDR, 0);
1554           WREG32(CP_ME_RAM_WADDR, 0);
1555           WREG32(CP_ME_RAM_RADDR, 0);
1556           return 0;
1557 }
1558 
cayman_cp_start(struct radeon_device * rdev)1559 static int cayman_cp_start(struct radeon_device *rdev)
1560 {
1561           struct radeon_ring *ring = &rdev->ring[RADEON_RING_TYPE_GFX_INDEX];
1562           int r, i;
1563 
1564           r = radeon_ring_lock(rdev, ring, 7);
1565           if (r) {
1566                     DRM_ERROR("radeon: cp failed to lock ring (%d).\n", r);
1567                     return r;
1568           }
1569           radeon_ring_write(ring, PACKET3(PACKET3_ME_INITIALIZE, 5));
1570           radeon_ring_write(ring, 0x1);
1571           radeon_ring_write(ring, 0x0);
1572           radeon_ring_write(ring, rdev->config.cayman.max_hw_contexts - 1);
1573           radeon_ring_write(ring, PACKET3_ME_INITIALIZE_DEVICE_ID(1));
1574           radeon_ring_write(ring, 0);
1575           radeon_ring_write(ring, 0);
1576           radeon_ring_unlock_commit(rdev, ring, false);
1577 
1578           cayman_cp_enable(rdev, true);
1579 
1580           r = radeon_ring_lock(rdev, ring, cayman_default_size + 19);
1581           if (r) {
1582                     DRM_ERROR("radeon: cp failed to lock ring (%d).\n", r);
1583                     return r;
1584           }
1585 
1586           /* setup clear context state */
1587           radeon_ring_write(ring, PACKET3(PACKET3_PREAMBLE_CNTL, 0));
1588           radeon_ring_write(ring, PACKET3_PREAMBLE_BEGIN_CLEAR_STATE);
1589 
1590           for (i = 0; i < cayman_default_size; i++)
1591                     radeon_ring_write(ring, cayman_default_state[i]);
1592 
1593           radeon_ring_write(ring, PACKET3(PACKET3_PREAMBLE_CNTL, 0));
1594           radeon_ring_write(ring, PACKET3_PREAMBLE_END_CLEAR_STATE);
1595 
1596           /* set clear context state */
1597           radeon_ring_write(ring, PACKET3(PACKET3_CLEAR_STATE, 0));
1598           radeon_ring_write(ring, 0);
1599 
1600           /* SQ_VTX_BASE_VTX_LOC */
1601           radeon_ring_write(ring, 0xc0026f00);
1602           radeon_ring_write(ring, 0x00000000);
1603           radeon_ring_write(ring, 0x00000000);
1604           radeon_ring_write(ring, 0x00000000);
1605 
1606           /* Clear consts */
1607           radeon_ring_write(ring, 0xc0036f00);
1608           radeon_ring_write(ring, 0x00000bc4);
1609           radeon_ring_write(ring, 0xffffffff);
1610           radeon_ring_write(ring, 0xffffffff);
1611           radeon_ring_write(ring, 0xffffffff);
1612 
1613           radeon_ring_write(ring, 0xc0026900);
1614           radeon_ring_write(ring, 0x00000316);
1615           radeon_ring_write(ring, 0x0000000e); /* VGT_VERTEX_REUSE_BLOCK_CNTL */
1616           radeon_ring_write(ring, 0x00000010); /*  */
1617 
1618           radeon_ring_unlock_commit(rdev, ring, false);
1619 
1620           /* XXX init other rings */
1621 
1622           return 0;
1623 }
1624 
cayman_cp_fini(struct radeon_device * rdev)1625 static void cayman_cp_fini(struct radeon_device *rdev)
1626 {
1627           struct radeon_ring *ring = &rdev->ring[RADEON_RING_TYPE_GFX_INDEX];
1628           cayman_cp_enable(rdev, false);
1629           radeon_ring_fini(rdev, ring);
1630           radeon_scratch_free(rdev, ring->rptr_save_reg);
1631 }
1632 
cayman_cp_resume(struct radeon_device * rdev)1633 static int cayman_cp_resume(struct radeon_device *rdev)
1634 {
1635           static const int ridx[] = {
1636                     RADEON_RING_TYPE_GFX_INDEX,
1637                     CAYMAN_RING_TYPE_CP1_INDEX,
1638                     CAYMAN_RING_TYPE_CP2_INDEX
1639           };
1640           static const unsigned cp_rb_cntl[] = {
1641                     CP_RB0_CNTL,
1642                     CP_RB1_CNTL,
1643                     CP_RB2_CNTL,
1644           };
1645           static const unsigned cp_rb_rptr_addr[] = {
1646                     CP_RB0_RPTR_ADDR,
1647                     CP_RB1_RPTR_ADDR,
1648                     CP_RB2_RPTR_ADDR
1649           };
1650           static const unsigned cp_rb_rptr_addr_hi[] = {
1651                     CP_RB0_RPTR_ADDR_HI,
1652                     CP_RB1_RPTR_ADDR_HI,
1653                     CP_RB2_RPTR_ADDR_HI
1654           };
1655           static const unsigned cp_rb_base[] = {
1656                     CP_RB0_BASE,
1657                     CP_RB1_BASE,
1658                     CP_RB2_BASE
1659           };
1660           static const unsigned cp_rb_rptr[] = {
1661                     CP_RB0_RPTR,
1662                     CP_RB1_RPTR,
1663                     CP_RB2_RPTR
1664           };
1665           static const unsigned cp_rb_wptr[] = {
1666                     CP_RB0_WPTR,
1667                     CP_RB1_WPTR,
1668                     CP_RB2_WPTR
1669           };
1670           struct radeon_ring *ring;
1671           int i, r;
1672 
1673           /* Reset cp; if cp is reset, then PA, SH, VGT also need to be reset */
1674           WREG32(GRBM_SOFT_RESET, (SOFT_RESET_CP |
1675                                          SOFT_RESET_PA |
1676                                          SOFT_RESET_SH |
1677                                          SOFT_RESET_VGT |
1678                                          SOFT_RESET_SPI |
1679                                          SOFT_RESET_SX));
1680           RREG32(GRBM_SOFT_RESET);
1681           mdelay(15);
1682           WREG32(GRBM_SOFT_RESET, 0);
1683           RREG32(GRBM_SOFT_RESET);
1684 
1685           WREG32(CP_SEM_WAIT_TIMER, 0x0);
1686           WREG32(CP_SEM_INCOMPLETE_TIMER_CNTL, 0x0);
1687 
1688           /* Set the write pointer delay */
1689           WREG32(CP_RB_WPTR_DELAY, 0);
1690 
1691           WREG32(CP_DEBUG, (1 << 27));
1692 
1693           /* set the wb address whether it's enabled or not */
1694           WREG32(SCRATCH_ADDR, ((rdev->wb.gpu_addr + RADEON_WB_SCRATCH_OFFSET) >> 8) & 0xFFFFFFFF);
1695           WREG32(SCRATCH_UMSK, 0xff);
1696 
1697           for (i = 0; i < 3; ++i) {
1698                     uint32_t rb_cntl;
1699                     uint64_t addr;
1700 
1701                     /* Set ring buffer size */
1702                     ring = &rdev->ring[ridx[i]];
1703                     rb_cntl = order_base_2(ring->ring_size / 8);
1704                     rb_cntl |= order_base_2(RADEON_GPU_PAGE_SIZE/8) << 8;
1705 #ifdef __BIG_ENDIAN
1706                     rb_cntl |= BUF_SWAP_32BIT;
1707 #endif
1708                     WREG32(cp_rb_cntl[i], rb_cntl);
1709 
1710                     /* set the wb address whether it's enabled or not */
1711                     addr = rdev->wb.gpu_addr + RADEON_WB_CP_RPTR_OFFSET;
1712                     WREG32(cp_rb_rptr_addr[i], addr & 0xFFFFFFFC);
1713                     WREG32(cp_rb_rptr_addr_hi[i], upper_32_bits(addr) & 0xFF);
1714           }
1715 
1716           /* set the rb base addr, this causes an internal reset of ALL rings */
1717           for (i = 0; i < 3; ++i) {
1718                     ring = &rdev->ring[ridx[i]];
1719                     WREG32(cp_rb_base[i], ring->gpu_addr >> 8);
1720           }
1721 
1722           for (i = 0; i < 3; ++i) {
1723                     /* Initialize the ring buffer's read and write pointers */
1724                     ring = &rdev->ring[ridx[i]];
1725                     WREG32_P(cp_rb_cntl[i], RB_RPTR_WR_ENA, ~RB_RPTR_WR_ENA);
1726 
1727                     ring->wptr = 0;
1728                     WREG32(cp_rb_rptr[i], 0);
1729                     WREG32(cp_rb_wptr[i], ring->wptr);
1730 
1731                     mdelay(1);
1732                     WREG32_P(cp_rb_cntl[i], 0, ~RB_RPTR_WR_ENA);
1733           }
1734 
1735           /* start the rings */
1736           cayman_cp_start(rdev);
1737           rdev->ring[RADEON_RING_TYPE_GFX_INDEX].ready = true;
1738           rdev->ring[CAYMAN_RING_TYPE_CP1_INDEX].ready = false;
1739           rdev->ring[CAYMAN_RING_TYPE_CP2_INDEX].ready = false;
1740           /* this only test cp0 */
1741           r = radeon_ring_test(rdev, RADEON_RING_TYPE_GFX_INDEX, &rdev->ring[RADEON_RING_TYPE_GFX_INDEX]);
1742           if (r) {
1743                     rdev->ring[RADEON_RING_TYPE_GFX_INDEX].ready = false;
1744                     rdev->ring[CAYMAN_RING_TYPE_CP1_INDEX].ready = false;
1745                     rdev->ring[CAYMAN_RING_TYPE_CP2_INDEX].ready = false;
1746                     return r;
1747           }
1748 
1749           if (rdev->asic->copy.copy_ring_index == RADEON_RING_TYPE_GFX_INDEX)
1750                     radeon_ttm_set_active_vram_size(rdev, rdev->mc.real_vram_size);
1751 
1752           return 0;
1753 }
1754 
cayman_gpu_check_soft_reset(struct radeon_device * rdev)1755 u32 cayman_gpu_check_soft_reset(struct radeon_device *rdev)
1756 {
1757           u32 reset_mask = 0;
1758           u32 tmp;
1759 
1760           /* GRBM_STATUS */
1761           tmp = RREG32(GRBM_STATUS);
1762           if (tmp & (PA_BUSY | SC_BUSY |
1763                        SH_BUSY | SX_BUSY |
1764                        TA_BUSY | VGT_BUSY |
1765                        DB_BUSY | CB_BUSY |
1766                        GDS_BUSY | SPI_BUSY |
1767                        IA_BUSY | IA_BUSY_NO_DMA))
1768                     reset_mask |= RADEON_RESET_GFX;
1769 
1770           if (tmp & (CF_RQ_PENDING | PF_RQ_PENDING |
1771                        CP_BUSY | CP_COHERENCY_BUSY))
1772                     reset_mask |= RADEON_RESET_CP;
1773 
1774           if (tmp & GRBM_EE_BUSY)
1775                     reset_mask |= RADEON_RESET_GRBM | RADEON_RESET_GFX | RADEON_RESET_CP;
1776 
1777           /* DMA_STATUS_REG 0 */
1778           tmp = RREG32(DMA_STATUS_REG + DMA0_REGISTER_OFFSET);
1779           if (!(tmp & DMA_IDLE))
1780                     reset_mask |= RADEON_RESET_DMA;
1781 
1782           /* DMA_STATUS_REG 1 */
1783           tmp = RREG32(DMA_STATUS_REG + DMA1_REGISTER_OFFSET);
1784           if (!(tmp & DMA_IDLE))
1785                     reset_mask |= RADEON_RESET_DMA1;
1786 
1787           /* SRBM_STATUS2 */
1788           tmp = RREG32(SRBM_STATUS2);
1789           if (tmp & DMA_BUSY)
1790                     reset_mask |= RADEON_RESET_DMA;
1791 
1792           if (tmp & DMA1_BUSY)
1793                     reset_mask |= RADEON_RESET_DMA1;
1794 
1795           /* SRBM_STATUS */
1796           tmp = RREG32(SRBM_STATUS);
1797           if (tmp & (RLC_RQ_PENDING | RLC_BUSY))
1798                     reset_mask |= RADEON_RESET_RLC;
1799 
1800           if (tmp & IH_BUSY)
1801                     reset_mask |= RADEON_RESET_IH;
1802 
1803           if (tmp & SEM_BUSY)
1804                     reset_mask |= RADEON_RESET_SEM;
1805 
1806           if (tmp & GRBM_RQ_PENDING)
1807                     reset_mask |= RADEON_RESET_GRBM;
1808 
1809           if (tmp & VMC_BUSY)
1810                     reset_mask |= RADEON_RESET_VMC;
1811 
1812           if (tmp & (MCB_BUSY | MCB_NON_DISPLAY_BUSY |
1813                        MCC_BUSY | MCD_BUSY))
1814                     reset_mask |= RADEON_RESET_MC;
1815 
1816           if (evergreen_is_display_hung(rdev))
1817                     reset_mask |= RADEON_RESET_DISPLAY;
1818 
1819           /* VM_L2_STATUS */
1820           tmp = RREG32(VM_L2_STATUS);
1821           if (tmp & L2_BUSY)
1822                     reset_mask |= RADEON_RESET_VMC;
1823 
1824           /* Skip MC reset as it's mostly likely not hung, just busy */
1825           if (reset_mask & RADEON_RESET_MC) {
1826                     DRM_DEBUG("MC busy: 0x%08X, clearing.\n", reset_mask);
1827                     reset_mask &= ~RADEON_RESET_MC;
1828           }
1829 
1830           return reset_mask;
1831 }
1832 
cayman_gpu_soft_reset(struct radeon_device * rdev,u32 reset_mask)1833 static void cayman_gpu_soft_reset(struct radeon_device *rdev, u32 reset_mask)
1834 {
1835           struct evergreen_mc_save save;
1836           u32 grbm_soft_reset = 0, srbm_soft_reset = 0;
1837           u32 tmp;
1838 
1839           if (reset_mask == 0)
1840                     return;
1841 
1842           dev_info(rdev->dev, "GPU softreset: 0x%08X\n", reset_mask);
1843 
1844           evergreen_print_gpu_status_regs(rdev);
1845           dev_info(rdev->dev, "  VM_CONTEXT0_PROTECTION_FAULT_ADDR   0x%08X\n",
1846                      RREG32(0x14F8));
1847           dev_info(rdev->dev, "  VM_CONTEXT0_PROTECTION_FAULT_STATUS 0x%08X\n",
1848                      RREG32(0x14D8));
1849           dev_info(rdev->dev, "  VM_CONTEXT1_PROTECTION_FAULT_ADDR   0x%08X\n",
1850                      RREG32(0x14FC));
1851           dev_info(rdev->dev, "  VM_CONTEXT1_PROTECTION_FAULT_STATUS 0x%08X\n",
1852                      RREG32(0x14DC));
1853 
1854           /* Disable CP parsing/prefetching */
1855           WREG32(CP_ME_CNTL, CP_ME_HALT | CP_PFP_HALT);
1856 
1857           if (reset_mask & RADEON_RESET_DMA) {
1858                     /* dma0 */
1859                     tmp = RREG32(DMA_RB_CNTL + DMA0_REGISTER_OFFSET);
1860                     tmp &= ~DMA_RB_ENABLE;
1861                     WREG32(DMA_RB_CNTL + DMA0_REGISTER_OFFSET, tmp);
1862           }
1863 
1864           if (reset_mask & RADEON_RESET_DMA1) {
1865                     /* dma1 */
1866                     tmp = RREG32(DMA_RB_CNTL + DMA1_REGISTER_OFFSET);
1867                     tmp &= ~DMA_RB_ENABLE;
1868                     WREG32(DMA_RB_CNTL + DMA1_REGISTER_OFFSET, tmp);
1869           }
1870 
1871           udelay(50);
1872 
1873           evergreen_mc_stop(rdev, &save);
1874           if (evergreen_mc_wait_for_idle(rdev)) {
1875                     dev_warn(rdev->dev, "Wait for MC idle timedout !\n");
1876           }
1877 
1878           if (reset_mask & (RADEON_RESET_GFX | RADEON_RESET_COMPUTE)) {
1879                     grbm_soft_reset = SOFT_RESET_CB |
1880                               SOFT_RESET_DB |
1881                               SOFT_RESET_GDS |
1882                               SOFT_RESET_PA |
1883                               SOFT_RESET_SC |
1884                               SOFT_RESET_SPI |
1885                               SOFT_RESET_SH |
1886                               SOFT_RESET_SX |
1887                               SOFT_RESET_TC |
1888                               SOFT_RESET_TA |
1889                               SOFT_RESET_VGT |
1890                               SOFT_RESET_IA;
1891           }
1892 
1893           if (reset_mask & RADEON_RESET_CP) {
1894                     grbm_soft_reset |= SOFT_RESET_CP | SOFT_RESET_VGT;
1895 
1896                     srbm_soft_reset |= SOFT_RESET_GRBM;
1897           }
1898 
1899           if (reset_mask & RADEON_RESET_DMA)
1900                     srbm_soft_reset |= SOFT_RESET_DMA;
1901 
1902           if (reset_mask & RADEON_RESET_DMA1)
1903                     srbm_soft_reset |= SOFT_RESET_DMA1;
1904 
1905           if (reset_mask & RADEON_RESET_DISPLAY)
1906                     srbm_soft_reset |= SOFT_RESET_DC;
1907 
1908           if (reset_mask & RADEON_RESET_RLC)
1909                     srbm_soft_reset |= SOFT_RESET_RLC;
1910 
1911           if (reset_mask & RADEON_RESET_SEM)
1912                     srbm_soft_reset |= SOFT_RESET_SEM;
1913 
1914           if (reset_mask & RADEON_RESET_IH)
1915                     srbm_soft_reset |= SOFT_RESET_IH;
1916 
1917           if (reset_mask & RADEON_RESET_GRBM)
1918                     srbm_soft_reset |= SOFT_RESET_GRBM;
1919 
1920           if (reset_mask & RADEON_RESET_VMC)
1921                     srbm_soft_reset |= SOFT_RESET_VMC;
1922 
1923           if (!(rdev->flags & RADEON_IS_IGP)) {
1924                     if (reset_mask & RADEON_RESET_MC)
1925                               srbm_soft_reset |= SOFT_RESET_MC;
1926           }
1927 
1928           if (grbm_soft_reset) {
1929                     tmp = RREG32(GRBM_SOFT_RESET);
1930                     tmp |= grbm_soft_reset;
1931                     dev_info(rdev->dev, "GRBM_SOFT_RESET=0x%08X\n", tmp);
1932                     WREG32(GRBM_SOFT_RESET, tmp);
1933                     tmp = RREG32(GRBM_SOFT_RESET);
1934 
1935                     udelay(50);
1936 
1937                     tmp &= ~grbm_soft_reset;
1938                     WREG32(GRBM_SOFT_RESET, tmp);
1939                     tmp = RREG32(GRBM_SOFT_RESET);
1940           }
1941 
1942           if (srbm_soft_reset) {
1943                     tmp = RREG32(SRBM_SOFT_RESET);
1944                     tmp |= srbm_soft_reset;
1945                     dev_info(rdev->dev, "SRBM_SOFT_RESET=0x%08X\n", tmp);
1946                     WREG32(SRBM_SOFT_RESET, tmp);
1947                     tmp = RREG32(SRBM_SOFT_RESET);
1948 
1949                     udelay(50);
1950 
1951                     tmp &= ~srbm_soft_reset;
1952                     WREG32(SRBM_SOFT_RESET, tmp);
1953                     tmp = RREG32(SRBM_SOFT_RESET);
1954           }
1955 
1956           /* Wait a little for things to settle down */
1957           udelay(50);
1958 
1959           evergreen_mc_resume(rdev, &save);
1960           udelay(50);
1961 
1962           evergreen_print_gpu_status_regs(rdev);
1963 }
1964 
cayman_asic_reset(struct radeon_device * rdev,bool hard)1965 int cayman_asic_reset(struct radeon_device *rdev, bool hard)
1966 {
1967           u32 reset_mask;
1968 
1969           if (hard) {
1970                     evergreen_gpu_pci_config_reset(rdev);
1971                     return 0;
1972           }
1973 
1974           reset_mask = cayman_gpu_check_soft_reset(rdev);
1975 
1976           if (reset_mask)
1977                     r600_set_bios_scratch_engine_hung(rdev, true);
1978 
1979           cayman_gpu_soft_reset(rdev, reset_mask);
1980 
1981           reset_mask = cayman_gpu_check_soft_reset(rdev);
1982 
1983           if (reset_mask)
1984                     evergreen_gpu_pci_config_reset(rdev);
1985 
1986           r600_set_bios_scratch_engine_hung(rdev, false);
1987 
1988           return 0;
1989 }
1990 
1991 /**
1992  * cayman_gfx_is_lockup - Check if the GFX engine is locked up
1993  *
1994  * @rdev: radeon_device pointer
1995  * @ring: radeon_ring structure holding ring information
1996  *
1997  * Check if the GFX engine is locked up.
1998  * Returns true if the engine appears to be locked up, false if not.
1999  */
cayman_gfx_is_lockup(struct radeon_device * rdev,struct radeon_ring * ring)2000 bool cayman_gfx_is_lockup(struct radeon_device *rdev, struct radeon_ring *ring)
2001 {
2002           u32 reset_mask = cayman_gpu_check_soft_reset(rdev);
2003 
2004           if (!(reset_mask & (RADEON_RESET_GFX |
2005                                   RADEON_RESET_COMPUTE |
2006                                   RADEON_RESET_CP))) {
2007                     radeon_ring_lockup_update(rdev, ring);
2008                     return false;
2009           }
2010           return radeon_ring_test_lockup(rdev, ring);
2011 }
2012 
cayman_uvd_init(struct radeon_device * rdev)2013 static void cayman_uvd_init(struct radeon_device *rdev)
2014 {
2015           int r;
2016 
2017           if (!rdev->has_uvd)
2018                     return;
2019 
2020           r = radeon_uvd_init(rdev);
2021           if (r) {
2022                     dev_err(rdev->dev, "failed UVD (%d) init.\n", r);
2023                     /*
2024                      * At this point rdev->uvd.vcpu_bo is NULL which trickles down
2025                      * to early fails uvd_v2_2_resume() and thus nothing happens
2026                      * there. So it is pointless to try to go through that code
2027                      * hence why we disable uvd here.
2028                      */
2029                     rdev->has_uvd = 0;
2030                     return;
2031           }
2032           rdev->ring[R600_RING_TYPE_UVD_INDEX].ring_obj = NULL;
2033           r600_ring_init(rdev, &rdev->ring[R600_RING_TYPE_UVD_INDEX], 4096);
2034 }
2035 
cayman_uvd_start(struct radeon_device * rdev)2036 static void cayman_uvd_start(struct radeon_device *rdev)
2037 {
2038           int r;
2039 
2040           if (!rdev->has_uvd)
2041                     return;
2042 
2043           r = uvd_v2_2_resume(rdev);
2044           if (r) {
2045                     dev_err(rdev->dev, "failed UVD resume (%d).\n", r);
2046                     goto error;
2047           }
2048           r = radeon_fence_driver_start_ring(rdev, R600_RING_TYPE_UVD_INDEX);
2049           if (r) {
2050                     dev_err(rdev->dev, "failed initializing UVD fences (%d).\n", r);
2051                     goto error;
2052           }
2053           return;
2054 
2055 error:
2056           rdev->ring[R600_RING_TYPE_UVD_INDEX].ring_size = 0;
2057 }
2058 
cayman_uvd_resume(struct radeon_device * rdev)2059 static void cayman_uvd_resume(struct radeon_device *rdev)
2060 {
2061           struct radeon_ring *ring;
2062           int r;
2063 
2064           if (!rdev->has_uvd || !rdev->ring[R600_RING_TYPE_UVD_INDEX].ring_size)
2065                     return;
2066 
2067           ring = &rdev->ring[R600_RING_TYPE_UVD_INDEX];
2068           r = radeon_ring_init(rdev, ring, ring->ring_size, 0, PACKET0(UVD_NO_OP, 0));
2069           if (r) {
2070                     dev_err(rdev->dev, "failed initializing UVD ring (%d).\n", r);
2071                     return;
2072           }
2073           r = uvd_v1_0_init(rdev);
2074           if (r) {
2075                     dev_err(rdev->dev, "failed initializing UVD (%d).\n", r);
2076                     return;
2077           }
2078 }
2079 
cayman_vce_init(struct radeon_device * rdev)2080 static void cayman_vce_init(struct radeon_device *rdev)
2081 {
2082           int r;
2083 
2084           /* Only set for CHIP_ARUBA */
2085           if (!rdev->has_vce)
2086                     return;
2087 
2088           r = radeon_vce_init(rdev);
2089           if (r) {
2090                     dev_err(rdev->dev, "failed VCE (%d) init.\n", r);
2091                     /*
2092                      * At this point rdev->vce.vcpu_bo is NULL which trickles down
2093                      * to early fails cayman_vce_start() and thus nothing happens
2094                      * there. So it is pointless to try to go through that code
2095                      * hence why we disable vce here.
2096                      */
2097                     rdev->has_vce = 0;
2098                     return;
2099           }
2100           rdev->ring[TN_RING_TYPE_VCE1_INDEX].ring_obj = NULL;
2101           r600_ring_init(rdev, &rdev->ring[TN_RING_TYPE_VCE1_INDEX], 4096);
2102           rdev->ring[TN_RING_TYPE_VCE2_INDEX].ring_obj = NULL;
2103           r600_ring_init(rdev, &rdev->ring[TN_RING_TYPE_VCE2_INDEX], 4096);
2104 }
2105 
cayman_vce_start(struct radeon_device * rdev)2106 static void cayman_vce_start(struct radeon_device *rdev)
2107 {
2108           int r;
2109 
2110           if (!rdev->has_vce)
2111                     return;
2112 
2113           r = radeon_vce_resume(rdev);
2114           if (r) {
2115                     dev_err(rdev->dev, "failed VCE resume (%d).\n", r);
2116                     goto error;
2117           }
2118           r = vce_v1_0_resume(rdev);
2119           if (r) {
2120                     dev_err(rdev->dev, "failed VCE resume (%d).\n", r);
2121                     goto error;
2122           }
2123           r = radeon_fence_driver_start_ring(rdev, TN_RING_TYPE_VCE1_INDEX);
2124           if (r) {
2125                     dev_err(rdev->dev, "failed initializing VCE1 fences (%d).\n", r);
2126                     goto error;
2127           }
2128           r = radeon_fence_driver_start_ring(rdev, TN_RING_TYPE_VCE2_INDEX);
2129           if (r) {
2130                     dev_err(rdev->dev, "failed initializing VCE2 fences (%d).\n", r);
2131                     goto error;
2132           }
2133           return;
2134 
2135 error:
2136           rdev->ring[TN_RING_TYPE_VCE1_INDEX].ring_size = 0;
2137           rdev->ring[TN_RING_TYPE_VCE2_INDEX].ring_size = 0;
2138 }
2139 
cayman_vce_resume(struct radeon_device * rdev)2140 static void cayman_vce_resume(struct radeon_device *rdev)
2141 {
2142           struct radeon_ring *ring;
2143           int r;
2144 
2145           if (!rdev->has_vce || !rdev->ring[TN_RING_TYPE_VCE1_INDEX].ring_size)
2146                     return;
2147 
2148           ring = &rdev->ring[TN_RING_TYPE_VCE1_INDEX];
2149           r = radeon_ring_init(rdev, ring, ring->ring_size, 0, 0x0);
2150           if (r) {
2151                     dev_err(rdev->dev, "failed initializing VCE1 ring (%d).\n", r);
2152                     return;
2153           }
2154           ring = &rdev->ring[TN_RING_TYPE_VCE2_INDEX];
2155           r = radeon_ring_init(rdev, ring, ring->ring_size, 0, 0x0);
2156           if (r) {
2157                     dev_err(rdev->dev, "failed initializing VCE1 ring (%d).\n", r);
2158                     return;
2159           }
2160           r = vce_v1_0_init(rdev);
2161           if (r) {
2162                     dev_err(rdev->dev, "failed initializing VCE (%d).\n", r);
2163                     return;
2164           }
2165 }
2166 
cayman_startup(struct radeon_device * rdev)2167 static int cayman_startup(struct radeon_device *rdev)
2168 {
2169           struct radeon_ring *ring = &rdev->ring[RADEON_RING_TYPE_GFX_INDEX];
2170           int r;
2171 
2172           /* enable pcie gen2 link */
2173           evergreen_pcie_gen2_enable(rdev);
2174           /* enable aspm */
2175           evergreen_program_aspm(rdev);
2176 
2177           /* scratch needs to be initialized before MC */
2178           r = r600_vram_scratch_init(rdev);
2179           if (r)
2180                     return r;
2181 
2182           evergreen_mc_program(rdev);
2183 
2184           if (!(rdev->flags & RADEON_IS_IGP) && !rdev->pm.dpm_enabled) {
2185                     r = ni_mc_load_microcode(rdev);
2186                     if (r) {
2187                               DRM_ERROR("Failed to load MC firmware!\n");
2188                               return r;
2189                     }
2190           }
2191 
2192           r = cayman_pcie_gart_enable(rdev);
2193           if (r)
2194                     return r;
2195           cayman_gpu_init(rdev);
2196 
2197           /* allocate rlc buffers */
2198           if (rdev->flags & RADEON_IS_IGP) {
2199                     rdev->rlc.reg_list = tn_rlc_save_restore_register_list;
2200                     rdev->rlc.reg_list_size =
2201                               (u32)ARRAY_SIZE(tn_rlc_save_restore_register_list);
2202                     rdev->rlc.cs_data = cayman_cs_data;
2203                     r = sumo_rlc_init(rdev);
2204                     if (r) {
2205                               DRM_ERROR("Failed to init rlc BOs!\n");
2206                               return r;
2207                     }
2208           }
2209 
2210           /* allocate wb buffer */
2211           r = radeon_wb_init(rdev);
2212           if (r)
2213                     return r;
2214 
2215           r = radeon_fence_driver_start_ring(rdev, RADEON_RING_TYPE_GFX_INDEX);
2216           if (r) {
2217                     dev_err(rdev->dev, "failed initializing CP fences (%d).\n", r);
2218                     return r;
2219           }
2220 
2221           cayman_uvd_start(rdev);
2222           cayman_vce_start(rdev);
2223 
2224           r = radeon_fence_driver_start_ring(rdev, CAYMAN_RING_TYPE_CP1_INDEX);
2225           if (r) {
2226                     dev_err(rdev->dev, "failed initializing CP fences (%d).\n", r);
2227                     return r;
2228           }
2229 
2230           r = radeon_fence_driver_start_ring(rdev, CAYMAN_RING_TYPE_CP2_INDEX);
2231           if (r) {
2232                     dev_err(rdev->dev, "failed initializing CP fences (%d).\n", r);
2233                     return r;
2234           }
2235 
2236           r = radeon_fence_driver_start_ring(rdev, R600_RING_TYPE_DMA_INDEX);
2237           if (r) {
2238                     dev_err(rdev->dev, "failed initializing DMA fences (%d).\n", r);
2239                     return r;
2240           }
2241 
2242           r = radeon_fence_driver_start_ring(rdev, CAYMAN_RING_TYPE_DMA1_INDEX);
2243           if (r) {
2244                     dev_err(rdev->dev, "failed initializing DMA fences (%d).\n", r);
2245                     return r;
2246           }
2247 
2248           /* Enable IRQ */
2249           if (!rdev->irq.installed) {
2250                     r = radeon_irq_kms_init(rdev);
2251                     if (r)
2252                               return r;
2253           }
2254 
2255           r = r600_irq_init(rdev);
2256           if (r) {
2257                     DRM_ERROR("radeon: IH init failed (%d).\n", r);
2258                     radeon_irq_kms_fini(rdev);
2259                     return r;
2260           }
2261           evergreen_irq_set(rdev);
2262 
2263           r = radeon_ring_init(rdev, ring, ring->ring_size, RADEON_WB_CP_RPTR_OFFSET,
2264                                    RADEON_CP_PACKET2);
2265           if (r)
2266                     return r;
2267 
2268           ring = &rdev->ring[R600_RING_TYPE_DMA_INDEX];
2269           r = radeon_ring_init(rdev, ring, ring->ring_size, R600_WB_DMA_RPTR_OFFSET,
2270                                    DMA_PACKET(DMA_PACKET_NOP, 0, 0, 0));
2271           if (r)
2272                     return r;
2273 
2274           ring = &rdev->ring[CAYMAN_RING_TYPE_DMA1_INDEX];
2275           r = radeon_ring_init(rdev, ring, ring->ring_size, CAYMAN_WB_DMA1_RPTR_OFFSET,
2276                                    DMA_PACKET(DMA_PACKET_NOP, 0, 0, 0));
2277           if (r)
2278                     return r;
2279 
2280           r = cayman_cp_load_microcode(rdev);
2281           if (r)
2282                     return r;
2283           r = cayman_cp_resume(rdev);
2284           if (r)
2285                     return r;
2286 
2287           r = cayman_dma_resume(rdev);
2288           if (r)
2289                     return r;
2290 
2291           cayman_uvd_resume(rdev);
2292           cayman_vce_resume(rdev);
2293 
2294           r = radeon_ib_pool_init(rdev);
2295           if (r) {
2296                     dev_err(rdev->dev, "IB initialization failed (%d).\n", r);
2297                     return r;
2298           }
2299 
2300           r = radeon_vm_manager_init(rdev);
2301           if (r) {
2302                     dev_err(rdev->dev, "vm manager initialization failed (%d).\n", r);
2303                     return r;
2304           }
2305 
2306           r = radeon_audio_init(rdev);
2307           if (r)
2308                     return r;
2309 
2310           return 0;
2311 }
2312 
cayman_resume(struct radeon_device * rdev)2313 int cayman_resume(struct radeon_device *rdev)
2314 {
2315           int r;
2316 
2317           /* Do not reset GPU before posting, on rv770 hw unlike on r500 hw,
2318            * posting will perform necessary task to bring back GPU into good
2319            * shape.
2320            */
2321           /* post card */
2322           atom_asic_init(rdev->mode_info.atom_context);
2323 
2324           /* init golden registers */
2325           ni_init_golden_registers(rdev);
2326 
2327           if (rdev->pm.pm_method == PM_METHOD_DPM)
2328                     radeon_pm_resume(rdev);
2329 
2330           rdev->accel_working = true;
2331           r = cayman_startup(rdev);
2332           if (r) {
2333                     DRM_ERROR("cayman startup failed on resume\n");
2334                     rdev->accel_working = false;
2335                     return r;
2336           }
2337           return r;
2338 }
2339 
cayman_suspend(struct radeon_device * rdev)2340 int cayman_suspend(struct radeon_device *rdev)
2341 {
2342           radeon_pm_suspend(rdev);
2343           radeon_audio_fini(rdev);
2344           radeon_vm_manager_fini(rdev);
2345           cayman_cp_enable(rdev, false);
2346           cayman_dma_stop(rdev);
2347           if (rdev->has_uvd) {
2348                     uvd_v1_0_fini(rdev);
2349                     radeon_uvd_suspend(rdev);
2350           }
2351           evergreen_irq_suspend(rdev);
2352           radeon_wb_disable(rdev);
2353           cayman_pcie_gart_disable(rdev);
2354           return 0;
2355 }
2356 
2357 /* Plan is to move initialization in that function and use
2358  * helper function so that radeon_device_init pretty much
2359  * do nothing more than calling asic specific function. This
2360  * should also allow to remove a bunch of callback function
2361  * like vram_info.
2362  */
cayman_init(struct radeon_device * rdev)2363 int cayman_init(struct radeon_device *rdev)
2364 {
2365           struct radeon_ring *ring = &rdev->ring[RADEON_RING_TYPE_GFX_INDEX];
2366           int r;
2367 
2368           /* Read BIOS */
2369           if (!radeon_get_bios(rdev)) {
2370                     if (ASIC_IS_AVIVO(rdev))
2371                               return -EINVAL;
2372           }
2373           /* Must be an ATOMBIOS */
2374           if (!rdev->is_atom_bios) {
2375                     dev_err(rdev->dev, "Expecting atombios for cayman GPU\n");
2376                     return -EINVAL;
2377           }
2378           r = radeon_atombios_init(rdev);
2379           if (r)
2380                     return r;
2381 
2382           /* Post card if necessary */
2383           if (!radeon_card_posted(rdev)) {
2384                     if (!rdev->bios) {
2385                               dev_err(rdev->dev, "Card not posted and no BIOS - ignoring\n");
2386                               return -EINVAL;
2387                     }
2388                     DRM_INFO("GPU not posted. posting now...\n");
2389                     atom_asic_init(rdev->mode_info.atom_context);
2390           }
2391           /* init golden registers */
2392           ni_init_golden_registers(rdev);
2393           /* Initialize scratch registers */
2394           r600_scratch_init(rdev);
2395           /* Initialize surface registers */
2396           radeon_surface_init(rdev);
2397           /* Initialize clocks */
2398           radeon_get_clock_info(rdev->ddev);
2399           /* Fence driver */
2400           r = radeon_fence_driver_init(rdev);
2401           if (r)
2402                     return r;
2403           /* initialize memory controller */
2404           r = evergreen_mc_init(rdev);
2405           if (r)
2406                     return r;
2407           /* Memory manager */
2408           r = radeon_bo_init(rdev);
2409           if (r)
2410                     return r;
2411 
2412           if (rdev->flags & RADEON_IS_IGP) {
2413                     if (!rdev->me_fw || !rdev->pfp_fw || !rdev->rlc_fw) {
2414                               r = ni_init_microcode(rdev);
2415                               if (r) {
2416                                         DRM_ERROR("Failed to load firmware!\n");
2417                                         return r;
2418                               }
2419                     }
2420           } else {
2421                     if (!rdev->me_fw || !rdev->pfp_fw || !rdev->rlc_fw || !rdev->mc_fw) {
2422                               r = ni_init_microcode(rdev);
2423                               if (r) {
2424                                         DRM_ERROR("Failed to load firmware!\n");
2425                                         return r;
2426                               }
2427                     }
2428           }
2429 
2430           /* Initialize power management */
2431           radeon_pm_init(rdev);
2432 
2433           ring->ring_obj = NULL;
2434           r600_ring_init(rdev, ring, 1024 * 1024);
2435 
2436           ring = &rdev->ring[R600_RING_TYPE_DMA_INDEX];
2437           ring->ring_obj = NULL;
2438           r600_ring_init(rdev, ring, 64 * 1024);
2439 
2440           ring = &rdev->ring[CAYMAN_RING_TYPE_DMA1_INDEX];
2441           ring->ring_obj = NULL;
2442           r600_ring_init(rdev, ring, 64 * 1024);
2443 
2444           cayman_uvd_init(rdev);
2445           cayman_vce_init(rdev);
2446 
2447           rdev->ih.ring_obj = NULL;
2448           r600_ih_ring_init(rdev, 64 * 1024);
2449 
2450           r = r600_pcie_gart_init(rdev);
2451           if (r)
2452                     return r;
2453 
2454           rdev->accel_working = true;
2455           r = cayman_startup(rdev);
2456           if (r) {
2457                     dev_err(rdev->dev, "disabling GPU acceleration\n");
2458                     cayman_cp_fini(rdev);
2459                     cayman_dma_fini(rdev);
2460                     r600_irq_fini(rdev);
2461                     if (rdev->flags & RADEON_IS_IGP)
2462                               sumo_rlc_fini(rdev);
2463                     radeon_wb_fini(rdev);
2464                     radeon_ib_pool_fini(rdev);
2465                     radeon_vm_manager_fini(rdev);
2466                     radeon_irq_kms_fini(rdev);
2467                     cayman_pcie_gart_fini(rdev);
2468                     rdev->accel_working = false;
2469           }
2470 
2471           /* Don't start up if the MC ucode is missing.
2472            * The default clocks and voltages before the MC ucode
2473            * is loaded are not suffient for advanced operations.
2474            *
2475            * We can skip this check for TN, because there is no MC
2476            * ucode.
2477            */
2478           if (!rdev->mc_fw && !(rdev->flags & RADEON_IS_IGP)) {
2479                     DRM_ERROR("radeon: MC ucode required for NI+.\n");
2480                     return -EINVAL;
2481           }
2482 
2483           return 0;
2484 }
2485 
cayman_fini(struct radeon_device * rdev)2486 void cayman_fini(struct radeon_device *rdev)
2487 {
2488           radeon_pm_fini(rdev);
2489           cayman_cp_fini(rdev);
2490           cayman_dma_fini(rdev);
2491           r600_irq_fini(rdev);
2492           if (rdev->flags & RADEON_IS_IGP)
2493                     sumo_rlc_fini(rdev);
2494           radeon_wb_fini(rdev);
2495           radeon_vm_manager_fini(rdev);
2496           radeon_ib_pool_fini(rdev);
2497           radeon_irq_kms_fini(rdev);
2498           uvd_v1_0_fini(rdev);
2499           radeon_uvd_fini(rdev);
2500           if (rdev->has_vce)
2501                     radeon_vce_fini(rdev);
2502           cayman_pcie_gart_fini(rdev);
2503           r600_vram_scratch_fini(rdev);
2504           radeon_gem_fini(rdev);
2505           radeon_fence_driver_fini(rdev);
2506           radeon_bo_fini(rdev);
2507           radeon_atombios_fini(rdev);
2508           ni_fini_microcode(rdev);
2509           kfree(rdev->bios);
2510           rdev->bios = NULL;
2511 }
2512 
2513 /*
2514  * vm
2515  */
cayman_vm_init(struct radeon_device * rdev)2516 int cayman_vm_init(struct radeon_device *rdev)
2517 {
2518           /* number of VMs */
2519           rdev->vm_manager.nvm = 8;
2520           /* base offset of vram pages */
2521           if (rdev->flags & RADEON_IS_IGP) {
2522                     u64 tmp = RREG32(FUS_MC_VM_FB_OFFSET);
2523                     tmp <<= 22;
2524                     rdev->vm_manager.vram_base_offset = tmp;
2525           } else
2526                     rdev->vm_manager.vram_base_offset = 0;
2527           return 0;
2528 }
2529 
cayman_vm_fini(struct radeon_device * rdev)2530 void cayman_vm_fini(struct radeon_device *rdev)
2531 {
2532 }
2533 
2534 /**
2535  * cayman_vm_decode_fault - print human readable fault info
2536  *
2537  * @rdev: radeon_device pointer
2538  * @status: VM_CONTEXT1_PROTECTION_FAULT_STATUS register value
2539  * @addr: VM_CONTEXT1_PROTECTION_FAULT_ADDR register value
2540  *
2541  * Print human readable fault information (cayman/TN).
2542  */
cayman_vm_decode_fault(struct radeon_device * rdev,u32 status,u32 addr)2543 void cayman_vm_decode_fault(struct radeon_device *rdev,
2544                                   u32 status, u32 addr)
2545 {
2546           u32 mc_id = (status & MEMORY_CLIENT_ID_MASK) >> MEMORY_CLIENT_ID_SHIFT;
2547           u32 vmid = (status & FAULT_VMID_MASK) >> FAULT_VMID_SHIFT;
2548           u32 protections = (status & PROTECTIONS_MASK) >> PROTECTIONS_SHIFT;
2549           char *block;
2550 
2551           switch (mc_id) {
2552           case 32:
2553           case 16:
2554           case 96:
2555           case 80:
2556           case 160:
2557           case 144:
2558           case 224:
2559           case 208:
2560                     block = "CB";
2561                     break;
2562           case 33:
2563           case 17:
2564           case 97:
2565           case 81:
2566           case 161:
2567           case 145:
2568           case 225:
2569           case 209:
2570                     block = "CB_FMASK";
2571                     break;
2572           case 34:
2573           case 18:
2574           case 98:
2575           case 82:
2576           case 162:
2577           case 146:
2578           case 226:
2579           case 210:
2580                     block = "CB_CMASK";
2581                     break;
2582           case 35:
2583           case 19:
2584           case 99:
2585           case 83:
2586           case 163:
2587           case 147:
2588           case 227:
2589           case 211:
2590                     block = "CB_IMMED";
2591                     break;
2592           case 36:
2593           case 20:
2594           case 100:
2595           case 84:
2596           case 164:
2597           case 148:
2598           case 228:
2599           case 212:
2600                     block = "DB";
2601                     break;
2602           case 37:
2603           case 21:
2604           case 101:
2605           case 85:
2606           case 165:
2607           case 149:
2608           case 229:
2609           case 213:
2610                     block = "DB_HTILE";
2611                     break;
2612           case 38:
2613           case 22:
2614           case 102:
2615           case 86:
2616           case 166:
2617           case 150:
2618           case 230:
2619           case 214:
2620                     block = "SX";
2621                     break;
2622           case 39:
2623           case 23:
2624           case 103:
2625           case 87:
2626           case 167:
2627           case 151:
2628           case 231:
2629           case 215:
2630                     block = "DB_STEN";
2631                     break;
2632           case 40:
2633           case 24:
2634           case 104:
2635           case 88:
2636           case 232:
2637           case 216:
2638           case 168:
2639           case 152:
2640                     block = "TC_TFETCH";
2641                     break;
2642           case 41:
2643           case 25:
2644           case 105:
2645           case 89:
2646           case 233:
2647           case 217:
2648           case 169:
2649           case 153:
2650                     block = "TC_VFETCH";
2651                     break;
2652           case 42:
2653           case 26:
2654           case 106:
2655           case 90:
2656           case 234:
2657           case 218:
2658           case 170:
2659           case 154:
2660                     block = "VC";
2661                     break;
2662           case 112:
2663                     block = "CP";
2664                     break;
2665           case 113:
2666           case 114:
2667                     block = "SH";
2668                     break;
2669           case 115:
2670                     block = "VGT";
2671                     break;
2672           case 178:
2673                     block = "IH";
2674                     break;
2675           case 51:
2676                     block = "RLC";
2677                     break;
2678           case 55:
2679                     block = "DMA";
2680                     break;
2681           case 56:
2682                     block = "HDP";
2683                     break;
2684           default:
2685                     block = "unknown";
2686                     break;
2687           }
2688 
2689           printk("VM fault (0x%02x, vmid %d) at page %u, %s from %s (%d)\n",
2690                  protections, vmid, addr,
2691                  (status & MEMORY_CLIENT_RW_MASK) ? "write" : "read",
2692                  block, mc_id);
2693 }
2694 
2695 /**
2696  * cayman_vm_flush - vm flush using the CP
2697  *
2698  * @rdev: radeon_device pointer
2699  *
2700  * Update the page table base and flush the VM TLB
2701  * using the CP (cayman-si).
2702  */
cayman_vm_flush(struct radeon_device * rdev,struct radeon_ring * ring,unsigned vm_id,uint64_t pd_addr)2703 void cayman_vm_flush(struct radeon_device *rdev, struct radeon_ring *ring,
2704                          unsigned vm_id, uint64_t pd_addr)
2705 {
2706           radeon_ring_write(ring, PACKET0(VM_CONTEXT0_PAGE_TABLE_BASE_ADDR + (vm_id << 2), 0));
2707           radeon_ring_write(ring, pd_addr >> 12);
2708 
2709           /* flush hdp cache */
2710           radeon_ring_write(ring, PACKET0(HDP_MEM_COHERENCY_FLUSH_CNTL, 0));
2711           radeon_ring_write(ring, 0x1);
2712 
2713           /* bits 0-7 are the VM contexts0-7 */
2714           radeon_ring_write(ring, PACKET0(VM_INVALIDATE_REQUEST, 0));
2715           radeon_ring_write(ring, 1 << vm_id);
2716 
2717           /* wait for the invalidate to complete */
2718           radeon_ring_write(ring, PACKET3(PACKET3_WAIT_REG_MEM, 5));
2719           radeon_ring_write(ring, (WAIT_REG_MEM_FUNCTION(0) |  /* always */
2720                                          WAIT_REG_MEM_ENGINE(0))); /* me */
2721           radeon_ring_write(ring, VM_INVALIDATE_REQUEST >> 2);
2722           radeon_ring_write(ring, 0);
2723           radeon_ring_write(ring, 0); /* ref */
2724           radeon_ring_write(ring, 0); /* mask */
2725           radeon_ring_write(ring, 0x20); /* poll interval */
2726 
2727           /* sync PFP to ME, otherwise we might get invalid PFP reads */
2728           radeon_ring_write(ring, PACKET3(PACKET3_PFP_SYNC_ME, 0));
2729           radeon_ring_write(ring, 0x0);
2730 }
2731 
tn_set_vce_clocks(struct radeon_device * rdev,u32 evclk,u32 ecclk)2732 int tn_set_vce_clocks(struct radeon_device *rdev, u32 evclk, u32 ecclk)
2733 {
2734           struct atom_clock_dividers dividers;
2735           int r, i;
2736 
2737           r = radeon_atom_get_clock_dividers(rdev, COMPUTE_ENGINE_PLL_PARAM,
2738                                                      ecclk, false, &dividers);
2739           if (r)
2740                     return r;
2741 
2742           for (i = 0; i < 100; i++) {
2743                     if (RREG32(CG_ECLK_STATUS) & ECLK_STATUS)
2744                               break;
2745                     mdelay(10);
2746           }
2747           if (i == 100)
2748                     return -ETIMEDOUT;
2749 
2750           WREG32_P(CG_ECLK_CNTL, dividers.post_div, ~(ECLK_DIR_CNTL_EN|ECLK_DIVIDER_MASK));
2751 
2752           for (i = 0; i < 100; i++) {
2753                     if (RREG32(CG_ECLK_STATUS) & ECLK_STATUS)
2754                               break;
2755                     mdelay(10);
2756           }
2757           if (i == 100)
2758                     return -ETIMEDOUT;
2759 
2760           return 0;
2761 }
2762