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