GNU Linux-libre 4.14.266-gnu1
[releases.git] / drivers / gpu / drm / radeon / evergreen.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 #include <linux/firmware.h>
25 #include <linux/slab.h>
26 #include <drm/drmP.h>
27 #include "radeon.h"
28 #include "radeon_asic.h"
29 #include "radeon_audio.h"
30 #include <drm/radeon_drm.h>
31 #include "evergreend.h"
32 #include "atom.h"
33 #include "avivod.h"
34 #include "evergreen_reg.h"
35 #include "evergreen_blit_shaders.h"
36 #include "radeon_ucode.h"
37
38 #define DC_HPDx_CONTROL(x)        (DC_HPD1_CONTROL     + (x * 0xc))
39 #define DC_HPDx_INT_CONTROL(x)    (DC_HPD1_INT_CONTROL + (x * 0xc))
40 #define DC_HPDx_INT_STATUS_REG(x) (DC_HPD1_INT_STATUS  + (x * 0xc))
41
42 /*
43  * Indirect registers accessor
44  */
45 u32 eg_cg_rreg(struct radeon_device *rdev, u32 reg)
46 {
47         unsigned long flags;
48         u32 r;
49
50         spin_lock_irqsave(&rdev->cg_idx_lock, flags);
51         WREG32(EVERGREEN_CG_IND_ADDR, ((reg) & 0xffff));
52         r = RREG32(EVERGREEN_CG_IND_DATA);
53         spin_unlock_irqrestore(&rdev->cg_idx_lock, flags);
54         return r;
55 }
56
57 void eg_cg_wreg(struct radeon_device *rdev, u32 reg, u32 v)
58 {
59         unsigned long flags;
60
61         spin_lock_irqsave(&rdev->cg_idx_lock, flags);
62         WREG32(EVERGREEN_CG_IND_ADDR, ((reg) & 0xffff));
63         WREG32(EVERGREEN_CG_IND_DATA, (v));
64         spin_unlock_irqrestore(&rdev->cg_idx_lock, flags);
65 }
66
67 u32 eg_pif_phy0_rreg(struct radeon_device *rdev, u32 reg)
68 {
69         unsigned long flags;
70         u32 r;
71
72         spin_lock_irqsave(&rdev->pif_idx_lock, flags);
73         WREG32(EVERGREEN_PIF_PHY0_INDEX, ((reg) & 0xffff));
74         r = RREG32(EVERGREEN_PIF_PHY0_DATA);
75         spin_unlock_irqrestore(&rdev->pif_idx_lock, flags);
76         return r;
77 }
78
79 void eg_pif_phy0_wreg(struct radeon_device *rdev, u32 reg, u32 v)
80 {
81         unsigned long flags;
82
83         spin_lock_irqsave(&rdev->pif_idx_lock, flags);
84         WREG32(EVERGREEN_PIF_PHY0_INDEX, ((reg) & 0xffff));
85         WREG32(EVERGREEN_PIF_PHY0_DATA, (v));
86         spin_unlock_irqrestore(&rdev->pif_idx_lock, flags);
87 }
88
89 u32 eg_pif_phy1_rreg(struct radeon_device *rdev, u32 reg)
90 {
91         unsigned long flags;
92         u32 r;
93
94         spin_lock_irqsave(&rdev->pif_idx_lock, flags);
95         WREG32(EVERGREEN_PIF_PHY1_INDEX, ((reg) & 0xffff));
96         r = RREG32(EVERGREEN_PIF_PHY1_DATA);
97         spin_unlock_irqrestore(&rdev->pif_idx_lock, flags);
98         return r;
99 }
100
101 void eg_pif_phy1_wreg(struct radeon_device *rdev, u32 reg, u32 v)
102 {
103         unsigned long flags;
104
105         spin_lock_irqsave(&rdev->pif_idx_lock, flags);
106         WREG32(EVERGREEN_PIF_PHY1_INDEX, ((reg) & 0xffff));
107         WREG32(EVERGREEN_PIF_PHY1_DATA, (v));
108         spin_unlock_irqrestore(&rdev->pif_idx_lock, flags);
109 }
110
111 static const u32 crtc_offsets[6] =
112 {
113         EVERGREEN_CRTC0_REGISTER_OFFSET,
114         EVERGREEN_CRTC1_REGISTER_OFFSET,
115         EVERGREEN_CRTC2_REGISTER_OFFSET,
116         EVERGREEN_CRTC3_REGISTER_OFFSET,
117         EVERGREEN_CRTC4_REGISTER_OFFSET,
118         EVERGREEN_CRTC5_REGISTER_OFFSET
119 };
120
121 #include "clearstate_evergreen.h"
122
123 static const u32 sumo_rlc_save_restore_register_list[] =
124 {
125         0x98fc,
126         0x9830,
127         0x9834,
128         0x9838,
129         0x9870,
130         0x9874,
131         0x8a14,
132         0x8b24,
133         0x8bcc,
134         0x8b10,
135         0x8d00,
136         0x8d04,
137         0x8c00,
138         0x8c04,
139         0x8c08,
140         0x8c0c,
141         0x8d8c,
142         0x8c20,
143         0x8c24,
144         0x8c28,
145         0x8c18,
146         0x8c1c,
147         0x8cf0,
148         0x8e2c,
149         0x8e38,
150         0x8c30,
151         0x9508,
152         0x9688,
153         0x9608,
154         0x960c,
155         0x9610,
156         0x9614,
157         0x88c4,
158         0x88d4,
159         0xa008,
160         0x900c,
161         0x9100,
162         0x913c,
163         0x98f8,
164         0x98f4,
165         0x9b7c,
166         0x3f8c,
167         0x8950,
168         0x8954,
169         0x8a18,
170         0x8b28,
171         0x9144,
172         0x9148,
173         0x914c,
174         0x3f90,
175         0x3f94,
176         0x915c,
177         0x9160,
178         0x9178,
179         0x917c,
180         0x9180,
181         0x918c,
182         0x9190,
183         0x9194,
184         0x9198,
185         0x919c,
186         0x91a8,
187         0x91ac,
188         0x91b0,
189         0x91b4,
190         0x91b8,
191         0x91c4,
192         0x91c8,
193         0x91cc,
194         0x91d0,
195         0x91d4,
196         0x91e0,
197         0x91e4,
198         0x91ec,
199         0x91f0,
200         0x91f4,
201         0x9200,
202         0x9204,
203         0x929c,
204         0x9150,
205         0x802c,
206 };
207
208 static void evergreen_gpu_init(struct radeon_device *rdev);
209 void evergreen_fini(struct radeon_device *rdev);
210 void evergreen_pcie_gen2_enable(struct radeon_device *rdev);
211 void evergreen_program_aspm(struct radeon_device *rdev);
212 extern void cayman_cp_int_cntl_setup(struct radeon_device *rdev,
213                                      int ring, u32 cp_int_cntl);
214 extern void cayman_vm_decode_fault(struct radeon_device *rdev,
215                                    u32 status, u32 addr);
216 void cik_init_cp_pg_table(struct radeon_device *rdev);
217
218 extern u32 si_get_csb_size(struct radeon_device *rdev);
219 extern void si_get_csb_buffer(struct radeon_device *rdev, volatile u32 *buffer);
220 extern u32 cik_get_csb_size(struct radeon_device *rdev);
221 extern void cik_get_csb_buffer(struct radeon_device *rdev, volatile u32 *buffer);
222 extern void rv770_set_clk_bypass_mode(struct radeon_device *rdev);
223
224 static const u32 evergreen_golden_registers[] =
225 {
226         0x3f90, 0xffff0000, 0xff000000,
227         0x9148, 0xffff0000, 0xff000000,
228         0x3f94, 0xffff0000, 0xff000000,
229         0x914c, 0xffff0000, 0xff000000,
230         0x9b7c, 0xffffffff, 0x00000000,
231         0x8a14, 0xffffffff, 0x00000007,
232         0x8b10, 0xffffffff, 0x00000000,
233         0x960c, 0xffffffff, 0x54763210,
234         0x88c4, 0xffffffff, 0x000000c2,
235         0x88d4, 0xffffffff, 0x00000010,
236         0x8974, 0xffffffff, 0x00000000,
237         0xc78, 0x00000080, 0x00000080,
238         0x5eb4, 0xffffffff, 0x00000002,
239         0x5e78, 0xffffffff, 0x001000f0,
240         0x6104, 0x01000300, 0x00000000,
241         0x5bc0, 0x00300000, 0x00000000,
242         0x7030, 0xffffffff, 0x00000011,
243         0x7c30, 0xffffffff, 0x00000011,
244         0x10830, 0xffffffff, 0x00000011,
245         0x11430, 0xffffffff, 0x00000011,
246         0x12030, 0xffffffff, 0x00000011,
247         0x12c30, 0xffffffff, 0x00000011,
248         0xd02c, 0xffffffff, 0x08421000,
249         0x240c, 0xffffffff, 0x00000380,
250         0x8b24, 0xffffffff, 0x00ff0fff,
251         0x28a4c, 0x06000000, 0x06000000,
252         0x10c, 0x00000001, 0x00000001,
253         0x8d00, 0xffffffff, 0x100e4848,
254         0x8d04, 0xffffffff, 0x00164745,
255         0x8c00, 0xffffffff, 0xe4000003,
256         0x8c04, 0xffffffff, 0x40600060,
257         0x8c08, 0xffffffff, 0x001c001c,
258         0x8cf0, 0xffffffff, 0x08e00620,
259         0x8c20, 0xffffffff, 0x00800080,
260         0x8c24, 0xffffffff, 0x00800080,
261         0x8c18, 0xffffffff, 0x20202078,
262         0x8c1c, 0xffffffff, 0x00001010,
263         0x28350, 0xffffffff, 0x00000000,
264         0xa008, 0xffffffff, 0x00010000,
265         0x5c4, 0xffffffff, 0x00000001,
266         0x9508, 0xffffffff, 0x00000002,
267         0x913c, 0x0000000f, 0x0000000a
268 };
269
270 static const u32 evergreen_golden_registers2[] =
271 {
272         0x2f4c, 0xffffffff, 0x00000000,
273         0x54f4, 0xffffffff, 0x00000000,
274         0x54f0, 0xffffffff, 0x00000000,
275         0x5498, 0xffffffff, 0x00000000,
276         0x549c, 0xffffffff, 0x00000000,
277         0x5494, 0xffffffff, 0x00000000,
278         0x53cc, 0xffffffff, 0x00000000,
279         0x53c8, 0xffffffff, 0x00000000,
280         0x53c4, 0xffffffff, 0x00000000,
281         0x53c0, 0xffffffff, 0x00000000,
282         0x53bc, 0xffffffff, 0x00000000,
283         0x53b8, 0xffffffff, 0x00000000,
284         0x53b4, 0xffffffff, 0x00000000,
285         0x53b0, 0xffffffff, 0x00000000
286 };
287
288 static const u32 cypress_mgcg_init[] =
289 {
290         0x802c, 0xffffffff, 0xc0000000,
291         0x5448, 0xffffffff, 0x00000100,
292         0x55e4, 0xffffffff, 0x00000100,
293         0x160c, 0xffffffff, 0x00000100,
294         0x5644, 0xffffffff, 0x00000100,
295         0xc164, 0xffffffff, 0x00000100,
296         0x8a18, 0xffffffff, 0x00000100,
297         0x897c, 0xffffffff, 0x06000100,
298         0x8b28, 0xffffffff, 0x00000100,
299         0x9144, 0xffffffff, 0x00000100,
300         0x9a60, 0xffffffff, 0x00000100,
301         0x9868, 0xffffffff, 0x00000100,
302         0x8d58, 0xffffffff, 0x00000100,
303         0x9510, 0xffffffff, 0x00000100,
304         0x949c, 0xffffffff, 0x00000100,
305         0x9654, 0xffffffff, 0x00000100,
306         0x9030, 0xffffffff, 0x00000100,
307         0x9034, 0xffffffff, 0x00000100,
308         0x9038, 0xffffffff, 0x00000100,
309         0x903c, 0xffffffff, 0x00000100,
310         0x9040, 0xffffffff, 0x00000100,
311         0xa200, 0xffffffff, 0x00000100,
312         0xa204, 0xffffffff, 0x00000100,
313         0xa208, 0xffffffff, 0x00000100,
314         0xa20c, 0xffffffff, 0x00000100,
315         0x971c, 0xffffffff, 0x00000100,
316         0x977c, 0xffffffff, 0x00000100,
317         0x3f80, 0xffffffff, 0x00000100,
318         0xa210, 0xffffffff, 0x00000100,
319         0xa214, 0xffffffff, 0x00000100,
320         0x4d8, 0xffffffff, 0x00000100,
321         0x9784, 0xffffffff, 0x00000100,
322         0x9698, 0xffffffff, 0x00000100,
323         0x4d4, 0xffffffff, 0x00000200,
324         0x30cc, 0xffffffff, 0x00000100,
325         0xd0c0, 0xffffffff, 0xff000100,
326         0x802c, 0xffffffff, 0x40000000,
327         0x915c, 0xffffffff, 0x00010000,
328         0x9160, 0xffffffff, 0x00030002,
329         0x9178, 0xffffffff, 0x00070000,
330         0x917c, 0xffffffff, 0x00030002,
331         0x9180, 0xffffffff, 0x00050004,
332         0x918c, 0xffffffff, 0x00010006,
333         0x9190, 0xffffffff, 0x00090008,
334         0x9194, 0xffffffff, 0x00070000,
335         0x9198, 0xffffffff, 0x00030002,
336         0x919c, 0xffffffff, 0x00050004,
337         0x91a8, 0xffffffff, 0x00010006,
338         0x91ac, 0xffffffff, 0x00090008,
339         0x91b0, 0xffffffff, 0x00070000,
340         0x91b4, 0xffffffff, 0x00030002,
341         0x91b8, 0xffffffff, 0x00050004,
342         0x91c4, 0xffffffff, 0x00010006,
343         0x91c8, 0xffffffff, 0x00090008,
344         0x91cc, 0xffffffff, 0x00070000,
345         0x91d0, 0xffffffff, 0x00030002,
346         0x91d4, 0xffffffff, 0x00050004,
347         0x91e0, 0xffffffff, 0x00010006,
348         0x91e4, 0xffffffff, 0x00090008,
349         0x91e8, 0xffffffff, 0x00000000,
350         0x91ec, 0xffffffff, 0x00070000,
351         0x91f0, 0xffffffff, 0x00030002,
352         0x91f4, 0xffffffff, 0x00050004,
353         0x9200, 0xffffffff, 0x00010006,
354         0x9204, 0xffffffff, 0x00090008,
355         0x9208, 0xffffffff, 0x00070000,
356         0x920c, 0xffffffff, 0x00030002,
357         0x9210, 0xffffffff, 0x00050004,
358         0x921c, 0xffffffff, 0x00010006,
359         0x9220, 0xffffffff, 0x00090008,
360         0x9224, 0xffffffff, 0x00070000,
361         0x9228, 0xffffffff, 0x00030002,
362         0x922c, 0xffffffff, 0x00050004,
363         0x9238, 0xffffffff, 0x00010006,
364         0x923c, 0xffffffff, 0x00090008,
365         0x9240, 0xffffffff, 0x00070000,
366         0x9244, 0xffffffff, 0x00030002,
367         0x9248, 0xffffffff, 0x00050004,
368         0x9254, 0xffffffff, 0x00010006,
369         0x9258, 0xffffffff, 0x00090008,
370         0x925c, 0xffffffff, 0x00070000,
371         0x9260, 0xffffffff, 0x00030002,
372         0x9264, 0xffffffff, 0x00050004,
373         0x9270, 0xffffffff, 0x00010006,
374         0x9274, 0xffffffff, 0x00090008,
375         0x9278, 0xffffffff, 0x00070000,
376         0x927c, 0xffffffff, 0x00030002,
377         0x9280, 0xffffffff, 0x00050004,
378         0x928c, 0xffffffff, 0x00010006,
379         0x9290, 0xffffffff, 0x00090008,
380         0x9294, 0xffffffff, 0x00000000,
381         0x929c, 0xffffffff, 0x00000001,
382         0x802c, 0xffffffff, 0x40010000,
383         0x915c, 0xffffffff, 0x00010000,
384         0x9160, 0xffffffff, 0x00030002,
385         0x9178, 0xffffffff, 0x00070000,
386         0x917c, 0xffffffff, 0x00030002,
387         0x9180, 0xffffffff, 0x00050004,
388         0x918c, 0xffffffff, 0x00010006,
389         0x9190, 0xffffffff, 0x00090008,
390         0x9194, 0xffffffff, 0x00070000,
391         0x9198, 0xffffffff, 0x00030002,
392         0x919c, 0xffffffff, 0x00050004,
393         0x91a8, 0xffffffff, 0x00010006,
394         0x91ac, 0xffffffff, 0x00090008,
395         0x91b0, 0xffffffff, 0x00070000,
396         0x91b4, 0xffffffff, 0x00030002,
397         0x91b8, 0xffffffff, 0x00050004,
398         0x91c4, 0xffffffff, 0x00010006,
399         0x91c8, 0xffffffff, 0x00090008,
400         0x91cc, 0xffffffff, 0x00070000,
401         0x91d0, 0xffffffff, 0x00030002,
402         0x91d4, 0xffffffff, 0x00050004,
403         0x91e0, 0xffffffff, 0x00010006,
404         0x91e4, 0xffffffff, 0x00090008,
405         0x91e8, 0xffffffff, 0x00000000,
406         0x91ec, 0xffffffff, 0x00070000,
407         0x91f0, 0xffffffff, 0x00030002,
408         0x91f4, 0xffffffff, 0x00050004,
409         0x9200, 0xffffffff, 0x00010006,
410         0x9204, 0xffffffff, 0x00090008,
411         0x9208, 0xffffffff, 0x00070000,
412         0x920c, 0xffffffff, 0x00030002,
413         0x9210, 0xffffffff, 0x00050004,
414         0x921c, 0xffffffff, 0x00010006,
415         0x9220, 0xffffffff, 0x00090008,
416         0x9224, 0xffffffff, 0x00070000,
417         0x9228, 0xffffffff, 0x00030002,
418         0x922c, 0xffffffff, 0x00050004,
419         0x9238, 0xffffffff, 0x00010006,
420         0x923c, 0xffffffff, 0x00090008,
421         0x9240, 0xffffffff, 0x00070000,
422         0x9244, 0xffffffff, 0x00030002,
423         0x9248, 0xffffffff, 0x00050004,
424         0x9254, 0xffffffff, 0x00010006,
425         0x9258, 0xffffffff, 0x00090008,
426         0x925c, 0xffffffff, 0x00070000,
427         0x9260, 0xffffffff, 0x00030002,
428         0x9264, 0xffffffff, 0x00050004,
429         0x9270, 0xffffffff, 0x00010006,
430         0x9274, 0xffffffff, 0x00090008,
431         0x9278, 0xffffffff, 0x00070000,
432         0x927c, 0xffffffff, 0x00030002,
433         0x9280, 0xffffffff, 0x00050004,
434         0x928c, 0xffffffff, 0x00010006,
435         0x9290, 0xffffffff, 0x00090008,
436         0x9294, 0xffffffff, 0x00000000,
437         0x929c, 0xffffffff, 0x00000001,
438         0x802c, 0xffffffff, 0xc0000000
439 };
440
441 static const u32 redwood_mgcg_init[] =
442 {
443         0x802c, 0xffffffff, 0xc0000000,
444         0x5448, 0xffffffff, 0x00000100,
445         0x55e4, 0xffffffff, 0x00000100,
446         0x160c, 0xffffffff, 0x00000100,
447         0x5644, 0xffffffff, 0x00000100,
448         0xc164, 0xffffffff, 0x00000100,
449         0x8a18, 0xffffffff, 0x00000100,
450         0x897c, 0xffffffff, 0x06000100,
451         0x8b28, 0xffffffff, 0x00000100,
452         0x9144, 0xffffffff, 0x00000100,
453         0x9a60, 0xffffffff, 0x00000100,
454         0x9868, 0xffffffff, 0x00000100,
455         0x8d58, 0xffffffff, 0x00000100,
456         0x9510, 0xffffffff, 0x00000100,
457         0x949c, 0xffffffff, 0x00000100,
458         0x9654, 0xffffffff, 0x00000100,
459         0x9030, 0xffffffff, 0x00000100,
460         0x9034, 0xffffffff, 0x00000100,
461         0x9038, 0xffffffff, 0x00000100,
462         0x903c, 0xffffffff, 0x00000100,
463         0x9040, 0xffffffff, 0x00000100,
464         0xa200, 0xffffffff, 0x00000100,
465         0xa204, 0xffffffff, 0x00000100,
466         0xa208, 0xffffffff, 0x00000100,
467         0xa20c, 0xffffffff, 0x00000100,
468         0x971c, 0xffffffff, 0x00000100,
469         0x977c, 0xffffffff, 0x00000100,
470         0x3f80, 0xffffffff, 0x00000100,
471         0xa210, 0xffffffff, 0x00000100,
472         0xa214, 0xffffffff, 0x00000100,
473         0x4d8, 0xffffffff, 0x00000100,
474         0x9784, 0xffffffff, 0x00000100,
475         0x9698, 0xffffffff, 0x00000100,
476         0x4d4, 0xffffffff, 0x00000200,
477         0x30cc, 0xffffffff, 0x00000100,
478         0xd0c0, 0xffffffff, 0xff000100,
479         0x802c, 0xffffffff, 0x40000000,
480         0x915c, 0xffffffff, 0x00010000,
481         0x9160, 0xffffffff, 0x00030002,
482         0x9178, 0xffffffff, 0x00070000,
483         0x917c, 0xffffffff, 0x00030002,
484         0x9180, 0xffffffff, 0x00050004,
485         0x918c, 0xffffffff, 0x00010006,
486         0x9190, 0xffffffff, 0x00090008,
487         0x9194, 0xffffffff, 0x00070000,
488         0x9198, 0xffffffff, 0x00030002,
489         0x919c, 0xffffffff, 0x00050004,
490         0x91a8, 0xffffffff, 0x00010006,
491         0x91ac, 0xffffffff, 0x00090008,
492         0x91b0, 0xffffffff, 0x00070000,
493         0x91b4, 0xffffffff, 0x00030002,
494         0x91b8, 0xffffffff, 0x00050004,
495         0x91c4, 0xffffffff, 0x00010006,
496         0x91c8, 0xffffffff, 0x00090008,
497         0x91cc, 0xffffffff, 0x00070000,
498         0x91d0, 0xffffffff, 0x00030002,
499         0x91d4, 0xffffffff, 0x00050004,
500         0x91e0, 0xffffffff, 0x00010006,
501         0x91e4, 0xffffffff, 0x00090008,
502         0x91e8, 0xffffffff, 0x00000000,
503         0x91ec, 0xffffffff, 0x00070000,
504         0x91f0, 0xffffffff, 0x00030002,
505         0x91f4, 0xffffffff, 0x00050004,
506         0x9200, 0xffffffff, 0x00010006,
507         0x9204, 0xffffffff, 0x00090008,
508         0x9294, 0xffffffff, 0x00000000,
509         0x929c, 0xffffffff, 0x00000001,
510         0x802c, 0xffffffff, 0xc0000000
511 };
512
513 static const u32 cedar_golden_registers[] =
514 {
515         0x3f90, 0xffff0000, 0xff000000,
516         0x9148, 0xffff0000, 0xff000000,
517         0x3f94, 0xffff0000, 0xff000000,
518         0x914c, 0xffff0000, 0xff000000,
519         0x9b7c, 0xffffffff, 0x00000000,
520         0x8a14, 0xffffffff, 0x00000007,
521         0x8b10, 0xffffffff, 0x00000000,
522         0x960c, 0xffffffff, 0x54763210,
523         0x88c4, 0xffffffff, 0x000000c2,
524         0x88d4, 0xffffffff, 0x00000000,
525         0x8974, 0xffffffff, 0x00000000,
526         0xc78, 0x00000080, 0x00000080,
527         0x5eb4, 0xffffffff, 0x00000002,
528         0x5e78, 0xffffffff, 0x001000f0,
529         0x6104, 0x01000300, 0x00000000,
530         0x5bc0, 0x00300000, 0x00000000,
531         0x7030, 0xffffffff, 0x00000011,
532         0x7c30, 0xffffffff, 0x00000011,
533         0x10830, 0xffffffff, 0x00000011,
534         0x11430, 0xffffffff, 0x00000011,
535         0xd02c, 0xffffffff, 0x08421000,
536         0x240c, 0xffffffff, 0x00000380,
537         0x8b24, 0xffffffff, 0x00ff0fff,
538         0x28a4c, 0x06000000, 0x06000000,
539         0x10c, 0x00000001, 0x00000001,
540         0x8d00, 0xffffffff, 0x100e4848,
541         0x8d04, 0xffffffff, 0x00164745,
542         0x8c00, 0xffffffff, 0xe4000003,
543         0x8c04, 0xffffffff, 0x40600060,
544         0x8c08, 0xffffffff, 0x001c001c,
545         0x8cf0, 0xffffffff, 0x08e00410,
546         0x8c20, 0xffffffff, 0x00800080,
547         0x8c24, 0xffffffff, 0x00800080,
548         0x8c18, 0xffffffff, 0x20202078,
549         0x8c1c, 0xffffffff, 0x00001010,
550         0x28350, 0xffffffff, 0x00000000,
551         0xa008, 0xffffffff, 0x00010000,
552         0x5c4, 0xffffffff, 0x00000001,
553         0x9508, 0xffffffff, 0x00000002
554 };
555
556 static const u32 cedar_mgcg_init[] =
557 {
558         0x802c, 0xffffffff, 0xc0000000,
559         0x5448, 0xffffffff, 0x00000100,
560         0x55e4, 0xffffffff, 0x00000100,
561         0x160c, 0xffffffff, 0x00000100,
562         0x5644, 0xffffffff, 0x00000100,
563         0xc164, 0xffffffff, 0x00000100,
564         0x8a18, 0xffffffff, 0x00000100,
565         0x897c, 0xffffffff, 0x06000100,
566         0x8b28, 0xffffffff, 0x00000100,
567         0x9144, 0xffffffff, 0x00000100,
568         0x9a60, 0xffffffff, 0x00000100,
569         0x9868, 0xffffffff, 0x00000100,
570         0x8d58, 0xffffffff, 0x00000100,
571         0x9510, 0xffffffff, 0x00000100,
572         0x949c, 0xffffffff, 0x00000100,
573         0x9654, 0xffffffff, 0x00000100,
574         0x9030, 0xffffffff, 0x00000100,
575         0x9034, 0xffffffff, 0x00000100,
576         0x9038, 0xffffffff, 0x00000100,
577         0x903c, 0xffffffff, 0x00000100,
578         0x9040, 0xffffffff, 0x00000100,
579         0xa200, 0xffffffff, 0x00000100,
580         0xa204, 0xffffffff, 0x00000100,
581         0xa208, 0xffffffff, 0x00000100,
582         0xa20c, 0xffffffff, 0x00000100,
583         0x971c, 0xffffffff, 0x00000100,
584         0x977c, 0xffffffff, 0x00000100,
585         0x3f80, 0xffffffff, 0x00000100,
586         0xa210, 0xffffffff, 0x00000100,
587         0xa214, 0xffffffff, 0x00000100,
588         0x4d8, 0xffffffff, 0x00000100,
589         0x9784, 0xffffffff, 0x00000100,
590         0x9698, 0xffffffff, 0x00000100,
591         0x4d4, 0xffffffff, 0x00000200,
592         0x30cc, 0xffffffff, 0x00000100,
593         0xd0c0, 0xffffffff, 0xff000100,
594         0x802c, 0xffffffff, 0x40000000,
595         0x915c, 0xffffffff, 0x00010000,
596         0x9178, 0xffffffff, 0x00050000,
597         0x917c, 0xffffffff, 0x00030002,
598         0x918c, 0xffffffff, 0x00010004,
599         0x9190, 0xffffffff, 0x00070006,
600         0x9194, 0xffffffff, 0x00050000,
601         0x9198, 0xffffffff, 0x00030002,
602         0x91a8, 0xffffffff, 0x00010004,
603         0x91ac, 0xffffffff, 0x00070006,
604         0x91e8, 0xffffffff, 0x00000000,
605         0x9294, 0xffffffff, 0x00000000,
606         0x929c, 0xffffffff, 0x00000001,
607         0x802c, 0xffffffff, 0xc0000000
608 };
609
610 static const u32 juniper_mgcg_init[] =
611 {
612         0x802c, 0xffffffff, 0xc0000000,
613         0x5448, 0xffffffff, 0x00000100,
614         0x55e4, 0xffffffff, 0x00000100,
615         0x160c, 0xffffffff, 0x00000100,
616         0x5644, 0xffffffff, 0x00000100,
617         0xc164, 0xffffffff, 0x00000100,
618         0x8a18, 0xffffffff, 0x00000100,
619         0x897c, 0xffffffff, 0x06000100,
620         0x8b28, 0xffffffff, 0x00000100,
621         0x9144, 0xffffffff, 0x00000100,
622         0x9a60, 0xffffffff, 0x00000100,
623         0x9868, 0xffffffff, 0x00000100,
624         0x8d58, 0xffffffff, 0x00000100,
625         0x9510, 0xffffffff, 0x00000100,
626         0x949c, 0xffffffff, 0x00000100,
627         0x9654, 0xffffffff, 0x00000100,
628         0x9030, 0xffffffff, 0x00000100,
629         0x9034, 0xffffffff, 0x00000100,
630         0x9038, 0xffffffff, 0x00000100,
631         0x903c, 0xffffffff, 0x00000100,
632         0x9040, 0xffffffff, 0x00000100,
633         0xa200, 0xffffffff, 0x00000100,
634         0xa204, 0xffffffff, 0x00000100,
635         0xa208, 0xffffffff, 0x00000100,
636         0xa20c, 0xffffffff, 0x00000100,
637         0x971c, 0xffffffff, 0x00000100,
638         0xd0c0, 0xffffffff, 0xff000100,
639         0x802c, 0xffffffff, 0x40000000,
640         0x915c, 0xffffffff, 0x00010000,
641         0x9160, 0xffffffff, 0x00030002,
642         0x9178, 0xffffffff, 0x00070000,
643         0x917c, 0xffffffff, 0x00030002,
644         0x9180, 0xffffffff, 0x00050004,
645         0x918c, 0xffffffff, 0x00010006,
646         0x9190, 0xffffffff, 0x00090008,
647         0x9194, 0xffffffff, 0x00070000,
648         0x9198, 0xffffffff, 0x00030002,
649         0x919c, 0xffffffff, 0x00050004,
650         0x91a8, 0xffffffff, 0x00010006,
651         0x91ac, 0xffffffff, 0x00090008,
652         0x91b0, 0xffffffff, 0x00070000,
653         0x91b4, 0xffffffff, 0x00030002,
654         0x91b8, 0xffffffff, 0x00050004,
655         0x91c4, 0xffffffff, 0x00010006,
656         0x91c8, 0xffffffff, 0x00090008,
657         0x91cc, 0xffffffff, 0x00070000,
658         0x91d0, 0xffffffff, 0x00030002,
659         0x91d4, 0xffffffff, 0x00050004,
660         0x91e0, 0xffffffff, 0x00010006,
661         0x91e4, 0xffffffff, 0x00090008,
662         0x91e8, 0xffffffff, 0x00000000,
663         0x91ec, 0xffffffff, 0x00070000,
664         0x91f0, 0xffffffff, 0x00030002,
665         0x91f4, 0xffffffff, 0x00050004,
666         0x9200, 0xffffffff, 0x00010006,
667         0x9204, 0xffffffff, 0x00090008,
668         0x9208, 0xffffffff, 0x00070000,
669         0x920c, 0xffffffff, 0x00030002,
670         0x9210, 0xffffffff, 0x00050004,
671         0x921c, 0xffffffff, 0x00010006,
672         0x9220, 0xffffffff, 0x00090008,
673         0x9224, 0xffffffff, 0x00070000,
674         0x9228, 0xffffffff, 0x00030002,
675         0x922c, 0xffffffff, 0x00050004,
676         0x9238, 0xffffffff, 0x00010006,
677         0x923c, 0xffffffff, 0x00090008,
678         0x9240, 0xffffffff, 0x00070000,
679         0x9244, 0xffffffff, 0x00030002,
680         0x9248, 0xffffffff, 0x00050004,
681         0x9254, 0xffffffff, 0x00010006,
682         0x9258, 0xffffffff, 0x00090008,
683         0x925c, 0xffffffff, 0x00070000,
684         0x9260, 0xffffffff, 0x00030002,
685         0x9264, 0xffffffff, 0x00050004,
686         0x9270, 0xffffffff, 0x00010006,
687         0x9274, 0xffffffff, 0x00090008,
688         0x9278, 0xffffffff, 0x00070000,
689         0x927c, 0xffffffff, 0x00030002,
690         0x9280, 0xffffffff, 0x00050004,
691         0x928c, 0xffffffff, 0x00010006,
692         0x9290, 0xffffffff, 0x00090008,
693         0x9294, 0xffffffff, 0x00000000,
694         0x929c, 0xffffffff, 0x00000001,
695         0x802c, 0xffffffff, 0xc0000000,
696         0x977c, 0xffffffff, 0x00000100,
697         0x3f80, 0xffffffff, 0x00000100,
698         0xa210, 0xffffffff, 0x00000100,
699         0xa214, 0xffffffff, 0x00000100,
700         0x4d8, 0xffffffff, 0x00000100,
701         0x9784, 0xffffffff, 0x00000100,
702         0x9698, 0xffffffff, 0x00000100,
703         0x4d4, 0xffffffff, 0x00000200,
704         0x30cc, 0xffffffff, 0x00000100,
705         0x802c, 0xffffffff, 0xc0000000
706 };
707
708 static const u32 supersumo_golden_registers[] =
709 {
710         0x5eb4, 0xffffffff, 0x00000002,
711         0x5c4, 0xffffffff, 0x00000001,
712         0x7030, 0xffffffff, 0x00000011,
713         0x7c30, 0xffffffff, 0x00000011,
714         0x6104, 0x01000300, 0x00000000,
715         0x5bc0, 0x00300000, 0x00000000,
716         0x8c04, 0xffffffff, 0x40600060,
717         0x8c08, 0xffffffff, 0x001c001c,
718         0x8c20, 0xffffffff, 0x00800080,
719         0x8c24, 0xffffffff, 0x00800080,
720         0x8c18, 0xffffffff, 0x20202078,
721         0x8c1c, 0xffffffff, 0x00001010,
722         0x918c, 0xffffffff, 0x00010006,
723         0x91a8, 0xffffffff, 0x00010006,
724         0x91c4, 0xffffffff, 0x00010006,
725         0x91e0, 0xffffffff, 0x00010006,
726         0x9200, 0xffffffff, 0x00010006,
727         0x9150, 0xffffffff, 0x6e944040,
728         0x917c, 0xffffffff, 0x00030002,
729         0x9180, 0xffffffff, 0x00050004,
730         0x9198, 0xffffffff, 0x00030002,
731         0x919c, 0xffffffff, 0x00050004,
732         0x91b4, 0xffffffff, 0x00030002,
733         0x91b8, 0xffffffff, 0x00050004,
734         0x91d0, 0xffffffff, 0x00030002,
735         0x91d4, 0xffffffff, 0x00050004,
736         0x91f0, 0xffffffff, 0x00030002,
737         0x91f4, 0xffffffff, 0x00050004,
738         0x915c, 0xffffffff, 0x00010000,
739         0x9160, 0xffffffff, 0x00030002,
740         0x3f90, 0xffff0000, 0xff000000,
741         0x9178, 0xffffffff, 0x00070000,
742         0x9194, 0xffffffff, 0x00070000,
743         0x91b0, 0xffffffff, 0x00070000,
744         0x91cc, 0xffffffff, 0x00070000,
745         0x91ec, 0xffffffff, 0x00070000,
746         0x9148, 0xffff0000, 0xff000000,
747         0x9190, 0xffffffff, 0x00090008,
748         0x91ac, 0xffffffff, 0x00090008,
749         0x91c8, 0xffffffff, 0x00090008,
750         0x91e4, 0xffffffff, 0x00090008,
751         0x9204, 0xffffffff, 0x00090008,
752         0x3f94, 0xffff0000, 0xff000000,
753         0x914c, 0xffff0000, 0xff000000,
754         0x929c, 0xffffffff, 0x00000001,
755         0x8a18, 0xffffffff, 0x00000100,
756         0x8b28, 0xffffffff, 0x00000100,
757         0x9144, 0xffffffff, 0x00000100,
758         0x5644, 0xffffffff, 0x00000100,
759         0x9b7c, 0xffffffff, 0x00000000,
760         0x8030, 0xffffffff, 0x0000100a,
761         0x8a14, 0xffffffff, 0x00000007,
762         0x8b24, 0xffffffff, 0x00ff0fff,
763         0x8b10, 0xffffffff, 0x00000000,
764         0x28a4c, 0x06000000, 0x06000000,
765         0x4d8, 0xffffffff, 0x00000100,
766         0x913c, 0xffff000f, 0x0100000a,
767         0x960c, 0xffffffff, 0x54763210,
768         0x88c4, 0xffffffff, 0x000000c2,
769         0x88d4, 0xffffffff, 0x00000010,
770         0x8974, 0xffffffff, 0x00000000,
771         0xc78, 0x00000080, 0x00000080,
772         0x5e78, 0xffffffff, 0x001000f0,
773         0xd02c, 0xffffffff, 0x08421000,
774         0xa008, 0xffffffff, 0x00010000,
775         0x8d00, 0xffffffff, 0x100e4848,
776         0x8d04, 0xffffffff, 0x00164745,
777         0x8c00, 0xffffffff, 0xe4000003,
778         0x8cf0, 0x1fffffff, 0x08e00620,
779         0x28350, 0xffffffff, 0x00000000,
780         0x9508, 0xffffffff, 0x00000002
781 };
782
783 static const u32 sumo_golden_registers[] =
784 {
785         0x900c, 0x00ffffff, 0x0017071f,
786         0x8c18, 0xffffffff, 0x10101060,
787         0x8c1c, 0xffffffff, 0x00001010,
788         0x8c30, 0x0000000f, 0x00000005,
789         0x9688, 0x0000000f, 0x00000007
790 };
791
792 static const u32 wrestler_golden_registers[] =
793 {
794         0x5eb4, 0xffffffff, 0x00000002,
795         0x5c4, 0xffffffff, 0x00000001,
796         0x7030, 0xffffffff, 0x00000011,
797         0x7c30, 0xffffffff, 0x00000011,
798         0x6104, 0x01000300, 0x00000000,
799         0x5bc0, 0x00300000, 0x00000000,
800         0x918c, 0xffffffff, 0x00010006,
801         0x91a8, 0xffffffff, 0x00010006,
802         0x9150, 0xffffffff, 0x6e944040,
803         0x917c, 0xffffffff, 0x00030002,
804         0x9198, 0xffffffff, 0x00030002,
805         0x915c, 0xffffffff, 0x00010000,
806         0x3f90, 0xffff0000, 0xff000000,
807         0x9178, 0xffffffff, 0x00070000,
808         0x9194, 0xffffffff, 0x00070000,
809         0x9148, 0xffff0000, 0xff000000,
810         0x9190, 0xffffffff, 0x00090008,
811         0x91ac, 0xffffffff, 0x00090008,
812         0x3f94, 0xffff0000, 0xff000000,
813         0x914c, 0xffff0000, 0xff000000,
814         0x929c, 0xffffffff, 0x00000001,
815         0x8a18, 0xffffffff, 0x00000100,
816         0x8b28, 0xffffffff, 0x00000100,
817         0x9144, 0xffffffff, 0x00000100,
818         0x9b7c, 0xffffffff, 0x00000000,
819         0x8030, 0xffffffff, 0x0000100a,
820         0x8a14, 0xffffffff, 0x00000001,
821         0x8b24, 0xffffffff, 0x00ff0fff,
822         0x8b10, 0xffffffff, 0x00000000,
823         0x28a4c, 0x06000000, 0x06000000,
824         0x4d8, 0xffffffff, 0x00000100,
825         0x913c, 0xffff000f, 0x0100000a,
826         0x960c, 0xffffffff, 0x54763210,
827         0x88c4, 0xffffffff, 0x000000c2,
828         0x88d4, 0xffffffff, 0x00000010,
829         0x8974, 0xffffffff, 0x00000000,
830         0xc78, 0x00000080, 0x00000080,
831         0x5e78, 0xffffffff, 0x001000f0,
832         0xd02c, 0xffffffff, 0x08421000,
833         0xa008, 0xffffffff, 0x00010000,
834         0x8d00, 0xffffffff, 0x100e4848,
835         0x8d04, 0xffffffff, 0x00164745,
836         0x8c00, 0xffffffff, 0xe4000003,
837         0x8cf0, 0x1fffffff, 0x08e00410,
838         0x28350, 0xffffffff, 0x00000000,
839         0x9508, 0xffffffff, 0x00000002,
840         0x900c, 0xffffffff, 0x0017071f,
841         0x8c18, 0xffffffff, 0x10101060,
842         0x8c1c, 0xffffffff, 0x00001010
843 };
844
845 static const u32 barts_golden_registers[] =
846 {
847         0x5eb4, 0xffffffff, 0x00000002,
848         0x5e78, 0x8f311ff1, 0x001000f0,
849         0x3f90, 0xffff0000, 0xff000000,
850         0x9148, 0xffff0000, 0xff000000,
851         0x3f94, 0xffff0000, 0xff000000,
852         0x914c, 0xffff0000, 0xff000000,
853         0xc78, 0x00000080, 0x00000080,
854         0xbd4, 0x70073777, 0x00010001,
855         0xd02c, 0xbfffff1f, 0x08421000,
856         0xd0b8, 0x03773777, 0x02011003,
857         0x5bc0, 0x00200000, 0x50100000,
858         0x98f8, 0x33773777, 0x02011003,
859         0x98fc, 0xffffffff, 0x76543210,
860         0x7030, 0x31000311, 0x00000011,
861         0x2f48, 0x00000007, 0x02011003,
862         0x6b28, 0x00000010, 0x00000012,
863         0x7728, 0x00000010, 0x00000012,
864         0x10328, 0x00000010, 0x00000012,
865         0x10f28, 0x00000010, 0x00000012,
866         0x11b28, 0x00000010, 0x00000012,
867         0x12728, 0x00000010, 0x00000012,
868         0x240c, 0x000007ff, 0x00000380,
869         0x8a14, 0xf000001f, 0x00000007,
870         0x8b24, 0x3fff3fff, 0x00ff0fff,
871         0x8b10, 0x0000ff0f, 0x00000000,
872         0x28a4c, 0x07ffffff, 0x06000000,
873         0x10c, 0x00000001, 0x00010003,
874         0xa02c, 0xffffffff, 0x0000009b,
875         0x913c, 0x0000000f, 0x0100000a,
876         0x8d00, 0xffff7f7f, 0x100e4848,
877         0x8d04, 0x00ffffff, 0x00164745,
878         0x8c00, 0xfffc0003, 0xe4000003,
879         0x8c04, 0xf8ff00ff, 0x40600060,
880         0x8c08, 0x00ff00ff, 0x001c001c,
881         0x8cf0, 0x1fff1fff, 0x08e00620,
882         0x8c20, 0x0fff0fff, 0x00800080,
883         0x8c24, 0x0fff0fff, 0x00800080,
884         0x8c18, 0xffffffff, 0x20202078,
885         0x8c1c, 0x0000ffff, 0x00001010,
886         0x28350, 0x00000f01, 0x00000000,
887         0x9508, 0x3700001f, 0x00000002,
888         0x960c, 0xffffffff, 0x54763210,
889         0x88c4, 0x001f3ae3, 0x000000c2,
890         0x88d4, 0x0000001f, 0x00000010,
891         0x8974, 0xffffffff, 0x00000000
892 };
893
894 static const u32 turks_golden_registers[] =
895 {
896         0x5eb4, 0xffffffff, 0x00000002,
897         0x5e78, 0x8f311ff1, 0x001000f0,
898         0x8c8, 0x00003000, 0x00001070,
899         0x8cc, 0x000fffff, 0x00040035,
900         0x3f90, 0xffff0000, 0xfff00000,
901         0x9148, 0xffff0000, 0xfff00000,
902         0x3f94, 0xffff0000, 0xfff00000,
903         0x914c, 0xffff0000, 0xfff00000,
904         0xc78, 0x00000080, 0x00000080,
905         0xbd4, 0x00073007, 0x00010002,
906         0xd02c, 0xbfffff1f, 0x08421000,
907         0xd0b8, 0x03773777, 0x02010002,
908         0x5bc0, 0x00200000, 0x50100000,
909         0x98f8, 0x33773777, 0x00010002,
910         0x98fc, 0xffffffff, 0x33221100,
911         0x7030, 0x31000311, 0x00000011,
912         0x2f48, 0x33773777, 0x00010002,
913         0x6b28, 0x00000010, 0x00000012,
914         0x7728, 0x00000010, 0x00000012,
915         0x10328, 0x00000010, 0x00000012,
916         0x10f28, 0x00000010, 0x00000012,
917         0x11b28, 0x00000010, 0x00000012,
918         0x12728, 0x00000010, 0x00000012,
919         0x240c, 0x000007ff, 0x00000380,
920         0x8a14, 0xf000001f, 0x00000007,
921         0x8b24, 0x3fff3fff, 0x00ff0fff,
922         0x8b10, 0x0000ff0f, 0x00000000,
923         0x28a4c, 0x07ffffff, 0x06000000,
924         0x10c, 0x00000001, 0x00010003,
925         0xa02c, 0xffffffff, 0x0000009b,
926         0x913c, 0x0000000f, 0x0100000a,
927         0x8d00, 0xffff7f7f, 0x100e4848,
928         0x8d04, 0x00ffffff, 0x00164745,
929         0x8c00, 0xfffc0003, 0xe4000003,
930         0x8c04, 0xf8ff00ff, 0x40600060,
931         0x8c08, 0x00ff00ff, 0x001c001c,
932         0x8cf0, 0x1fff1fff, 0x08e00410,
933         0x8c20, 0x0fff0fff, 0x00800080,
934         0x8c24, 0x0fff0fff, 0x00800080,
935         0x8c18, 0xffffffff, 0x20202078,
936         0x8c1c, 0x0000ffff, 0x00001010,
937         0x28350, 0x00000f01, 0x00000000,
938         0x9508, 0x3700001f, 0x00000002,
939         0x960c, 0xffffffff, 0x54763210,
940         0x88c4, 0x001f3ae3, 0x000000c2,
941         0x88d4, 0x0000001f, 0x00000010,
942         0x8974, 0xffffffff, 0x00000000
943 };
944
945 static const u32 caicos_golden_registers[] =
946 {
947         0x5eb4, 0xffffffff, 0x00000002,
948         0x5e78, 0x8f311ff1, 0x001000f0,
949         0x8c8, 0x00003420, 0x00001450,
950         0x8cc, 0x000fffff, 0x00040035,
951         0x3f90, 0xffff0000, 0xfffc0000,
952         0x9148, 0xffff0000, 0xfffc0000,
953         0x3f94, 0xffff0000, 0xfffc0000,
954         0x914c, 0xffff0000, 0xfffc0000,
955         0xc78, 0x00000080, 0x00000080,
956         0xbd4, 0x00073007, 0x00010001,
957         0xd02c, 0xbfffff1f, 0x08421000,
958         0xd0b8, 0x03773777, 0x02010001,
959         0x5bc0, 0x00200000, 0x50100000,
960         0x98f8, 0x33773777, 0x02010001,
961         0x98fc, 0xffffffff, 0x33221100,
962         0x7030, 0x31000311, 0x00000011,
963         0x2f48, 0x33773777, 0x02010001,
964         0x6b28, 0x00000010, 0x00000012,
965         0x7728, 0x00000010, 0x00000012,
966         0x10328, 0x00000010, 0x00000012,
967         0x10f28, 0x00000010, 0x00000012,
968         0x11b28, 0x00000010, 0x00000012,
969         0x12728, 0x00000010, 0x00000012,
970         0x240c, 0x000007ff, 0x00000380,
971         0x8a14, 0xf000001f, 0x00000001,
972         0x8b24, 0x3fff3fff, 0x00ff0fff,
973         0x8b10, 0x0000ff0f, 0x00000000,
974         0x28a4c, 0x07ffffff, 0x06000000,
975         0x10c, 0x00000001, 0x00010003,
976         0xa02c, 0xffffffff, 0x0000009b,
977         0x913c, 0x0000000f, 0x0100000a,
978         0x8d00, 0xffff7f7f, 0x100e4848,
979         0x8d04, 0x00ffffff, 0x00164745,
980         0x8c00, 0xfffc0003, 0xe4000003,
981         0x8c04, 0xf8ff00ff, 0x40600060,
982         0x8c08, 0x00ff00ff, 0x001c001c,
983         0x8cf0, 0x1fff1fff, 0x08e00410,
984         0x8c20, 0x0fff0fff, 0x00800080,
985         0x8c24, 0x0fff0fff, 0x00800080,
986         0x8c18, 0xffffffff, 0x20202078,
987         0x8c1c, 0x0000ffff, 0x00001010,
988         0x28350, 0x00000f01, 0x00000000,
989         0x9508, 0x3700001f, 0x00000002,
990         0x960c, 0xffffffff, 0x54763210,
991         0x88c4, 0x001f3ae3, 0x000000c2,
992         0x88d4, 0x0000001f, 0x00000010,
993         0x8974, 0xffffffff, 0x00000000
994 };
995
996 static void evergreen_init_golden_registers(struct radeon_device *rdev)
997 {
998         switch (rdev->family) {
999         case CHIP_CYPRESS:
1000         case CHIP_HEMLOCK:
1001                 radeon_program_register_sequence(rdev,
1002                                                  evergreen_golden_registers,
1003                                                  (const u32)ARRAY_SIZE(evergreen_golden_registers));
1004                 radeon_program_register_sequence(rdev,
1005                                                  evergreen_golden_registers2,
1006                                                  (const u32)ARRAY_SIZE(evergreen_golden_registers2));
1007                 radeon_program_register_sequence(rdev,
1008                                                  cypress_mgcg_init,
1009                                                  (const u32)ARRAY_SIZE(cypress_mgcg_init));
1010                 break;
1011         case CHIP_JUNIPER:
1012                 radeon_program_register_sequence(rdev,
1013                                                  evergreen_golden_registers,
1014                                                  (const u32)ARRAY_SIZE(evergreen_golden_registers));
1015                 radeon_program_register_sequence(rdev,
1016                                                  evergreen_golden_registers2,
1017                                                  (const u32)ARRAY_SIZE(evergreen_golden_registers2));
1018                 radeon_program_register_sequence(rdev,
1019                                                  juniper_mgcg_init,
1020                                                  (const u32)ARRAY_SIZE(juniper_mgcg_init));
1021                 break;
1022         case CHIP_REDWOOD:
1023                 radeon_program_register_sequence(rdev,
1024                                                  evergreen_golden_registers,
1025                                                  (const u32)ARRAY_SIZE(evergreen_golden_registers));
1026                 radeon_program_register_sequence(rdev,
1027                                                  evergreen_golden_registers2,
1028                                                  (const u32)ARRAY_SIZE(evergreen_golden_registers2));
1029                 radeon_program_register_sequence(rdev,
1030                                                  redwood_mgcg_init,
1031                                                  (const u32)ARRAY_SIZE(redwood_mgcg_init));
1032                 break;
1033         case CHIP_CEDAR:
1034                 radeon_program_register_sequence(rdev,
1035                                                  cedar_golden_registers,
1036                                                  (const u32)ARRAY_SIZE(cedar_golden_registers));
1037                 radeon_program_register_sequence(rdev,
1038                                                  evergreen_golden_registers2,
1039                                                  (const u32)ARRAY_SIZE(evergreen_golden_registers2));
1040                 radeon_program_register_sequence(rdev,
1041                                                  cedar_mgcg_init,
1042                                                  (const u32)ARRAY_SIZE(cedar_mgcg_init));
1043                 break;
1044         case CHIP_PALM:
1045                 radeon_program_register_sequence(rdev,
1046                                                  wrestler_golden_registers,
1047                                                  (const u32)ARRAY_SIZE(wrestler_golden_registers));
1048                 break;
1049         case CHIP_SUMO:
1050                 radeon_program_register_sequence(rdev,
1051                                                  supersumo_golden_registers,
1052                                                  (const u32)ARRAY_SIZE(supersumo_golden_registers));
1053                 break;
1054         case CHIP_SUMO2:
1055                 radeon_program_register_sequence(rdev,
1056                                                  supersumo_golden_registers,
1057                                                  (const u32)ARRAY_SIZE(supersumo_golden_registers));
1058                 radeon_program_register_sequence(rdev,
1059                                                  sumo_golden_registers,
1060                                                  (const u32)ARRAY_SIZE(sumo_golden_registers));
1061                 break;
1062         case CHIP_BARTS:
1063                 radeon_program_register_sequence(rdev,
1064                                                  barts_golden_registers,
1065                                                  (const u32)ARRAY_SIZE(barts_golden_registers));
1066                 break;
1067         case CHIP_TURKS:
1068                 radeon_program_register_sequence(rdev,
1069                                                  turks_golden_registers,
1070                                                  (const u32)ARRAY_SIZE(turks_golden_registers));
1071                 break;
1072         case CHIP_CAICOS:
1073                 radeon_program_register_sequence(rdev,
1074                                                  caicos_golden_registers,
1075                                                  (const u32)ARRAY_SIZE(caicos_golden_registers));
1076                 break;
1077         default:
1078                 break;
1079         }
1080 }
1081
1082 /**
1083  * evergreen_get_allowed_info_register - fetch the register for the info ioctl
1084  *
1085  * @rdev: radeon_device pointer
1086  * @reg: register offset in bytes
1087  * @val: register value
1088  *
1089  * Returns 0 for success or -EINVAL for an invalid register
1090  *
1091  */
1092 int evergreen_get_allowed_info_register(struct radeon_device *rdev,
1093                                         u32 reg, u32 *val)
1094 {
1095         switch (reg) {
1096         case GRBM_STATUS:
1097         case GRBM_STATUS_SE0:
1098         case GRBM_STATUS_SE1:
1099         case SRBM_STATUS:
1100         case SRBM_STATUS2:
1101         case DMA_STATUS_REG:
1102         case UVD_STATUS:
1103                 *val = RREG32(reg);
1104                 return 0;
1105         default:
1106                 return -EINVAL;
1107         }
1108 }
1109
1110 void evergreen_tiling_fields(unsigned tiling_flags, unsigned *bankw,
1111                              unsigned *bankh, unsigned *mtaspect,
1112                              unsigned *tile_split)
1113 {
1114         *bankw = (tiling_flags >> RADEON_TILING_EG_BANKW_SHIFT) & RADEON_TILING_EG_BANKW_MASK;
1115         *bankh = (tiling_flags >> RADEON_TILING_EG_BANKH_SHIFT) & RADEON_TILING_EG_BANKH_MASK;
1116         *mtaspect = (tiling_flags >> RADEON_TILING_EG_MACRO_TILE_ASPECT_SHIFT) & RADEON_TILING_EG_MACRO_TILE_ASPECT_MASK;
1117         *tile_split = (tiling_flags >> RADEON_TILING_EG_TILE_SPLIT_SHIFT) & RADEON_TILING_EG_TILE_SPLIT_MASK;
1118         switch (*bankw) {
1119         default:
1120         case 1: *bankw = EVERGREEN_ADDR_SURF_BANK_WIDTH_1; break;
1121         case 2: *bankw = EVERGREEN_ADDR_SURF_BANK_WIDTH_2; break;
1122         case 4: *bankw = EVERGREEN_ADDR_SURF_BANK_WIDTH_4; break;
1123         case 8: *bankw = EVERGREEN_ADDR_SURF_BANK_WIDTH_8; break;
1124         }
1125         switch (*bankh) {
1126         default:
1127         case 1: *bankh = EVERGREEN_ADDR_SURF_BANK_HEIGHT_1; break;
1128         case 2: *bankh = EVERGREEN_ADDR_SURF_BANK_HEIGHT_2; break;
1129         case 4: *bankh = EVERGREEN_ADDR_SURF_BANK_HEIGHT_4; break;
1130         case 8: *bankh = EVERGREEN_ADDR_SURF_BANK_HEIGHT_8; break;
1131         }
1132         switch (*mtaspect) {
1133         default:
1134         case 1: *mtaspect = EVERGREEN_ADDR_SURF_MACRO_TILE_ASPECT_1; break;
1135         case 2: *mtaspect = EVERGREEN_ADDR_SURF_MACRO_TILE_ASPECT_2; break;
1136         case 4: *mtaspect = EVERGREEN_ADDR_SURF_MACRO_TILE_ASPECT_4; break;
1137         case 8: *mtaspect = EVERGREEN_ADDR_SURF_MACRO_TILE_ASPECT_8; break;
1138         }
1139 }
1140
1141 static int sumo_set_uvd_clock(struct radeon_device *rdev, u32 clock,
1142                               u32 cntl_reg, u32 status_reg)
1143 {
1144         int r, i;
1145         struct atom_clock_dividers dividers;
1146
1147         r = radeon_atom_get_clock_dividers(rdev, COMPUTE_ENGINE_PLL_PARAM,
1148                                            clock, false, &dividers);
1149         if (r)
1150                 return r;
1151
1152         WREG32_P(cntl_reg, dividers.post_div, ~(DCLK_DIR_CNTL_EN|DCLK_DIVIDER_MASK));
1153
1154         for (i = 0; i < 100; i++) {
1155                 if (RREG32(status_reg) & DCLK_STATUS)
1156                         break;
1157                 mdelay(10);
1158         }
1159         if (i == 100)
1160                 return -ETIMEDOUT;
1161
1162         return 0;
1163 }
1164
1165 int sumo_set_uvd_clocks(struct radeon_device *rdev, u32 vclk, u32 dclk)
1166 {
1167         int r = 0;
1168         u32 cg_scratch = RREG32(CG_SCRATCH1);
1169
1170         r = sumo_set_uvd_clock(rdev, vclk, CG_VCLK_CNTL, CG_VCLK_STATUS);
1171         if (r)
1172                 goto done;
1173         cg_scratch &= 0xffff0000;
1174         cg_scratch |= vclk / 100; /* Mhz */
1175
1176         r = sumo_set_uvd_clock(rdev, dclk, CG_DCLK_CNTL, CG_DCLK_STATUS);
1177         if (r)
1178                 goto done;
1179         cg_scratch &= 0x0000ffff;
1180         cg_scratch |= (dclk / 100) << 16; /* Mhz */
1181
1182 done:
1183         WREG32(CG_SCRATCH1, cg_scratch);
1184
1185         return r;
1186 }
1187
1188 int evergreen_set_uvd_clocks(struct radeon_device *rdev, u32 vclk, u32 dclk)
1189 {
1190         /* start off with something large */
1191         unsigned fb_div = 0, vclk_div = 0, dclk_div = 0;
1192         int r;
1193
1194         /* bypass vclk and dclk with bclk */
1195         WREG32_P(CG_UPLL_FUNC_CNTL_2,
1196                 VCLK_SRC_SEL(1) | DCLK_SRC_SEL(1),
1197                 ~(VCLK_SRC_SEL_MASK | DCLK_SRC_SEL_MASK));
1198
1199         /* put PLL in bypass mode */
1200         WREG32_P(CG_UPLL_FUNC_CNTL, UPLL_BYPASS_EN_MASK, ~UPLL_BYPASS_EN_MASK);
1201
1202         if (!vclk || !dclk) {
1203                 /* keep the Bypass mode, put PLL to sleep */
1204                 WREG32_P(CG_UPLL_FUNC_CNTL, UPLL_SLEEP_MASK, ~UPLL_SLEEP_MASK);
1205                 return 0;
1206         }
1207
1208         r = radeon_uvd_calc_upll_dividers(rdev, vclk, dclk, 125000, 250000,
1209                                           16384, 0x03FFFFFF, 0, 128, 5,
1210                                           &fb_div, &vclk_div, &dclk_div);
1211         if (r)
1212                 return r;
1213
1214         /* set VCO_MODE to 1 */
1215         WREG32_P(CG_UPLL_FUNC_CNTL, UPLL_VCO_MODE_MASK, ~UPLL_VCO_MODE_MASK);
1216
1217         /* toggle UPLL_SLEEP to 1 then back to 0 */
1218         WREG32_P(CG_UPLL_FUNC_CNTL, UPLL_SLEEP_MASK, ~UPLL_SLEEP_MASK);
1219         WREG32_P(CG_UPLL_FUNC_CNTL, 0, ~UPLL_SLEEP_MASK);
1220
1221         /* deassert UPLL_RESET */
1222         WREG32_P(CG_UPLL_FUNC_CNTL, 0, ~UPLL_RESET_MASK);
1223
1224         mdelay(1);
1225
1226         r = radeon_uvd_send_upll_ctlreq(rdev, CG_UPLL_FUNC_CNTL);
1227         if (r)
1228                 return r;
1229
1230         /* assert UPLL_RESET again */
1231         WREG32_P(CG_UPLL_FUNC_CNTL, UPLL_RESET_MASK, ~UPLL_RESET_MASK);
1232
1233         /* disable spread spectrum. */
1234         WREG32_P(CG_UPLL_SPREAD_SPECTRUM, 0, ~SSEN_MASK);
1235
1236         /* set feedback divider */
1237         WREG32_P(CG_UPLL_FUNC_CNTL_3, UPLL_FB_DIV(fb_div), ~UPLL_FB_DIV_MASK);
1238
1239         /* set ref divider to 0 */
1240         WREG32_P(CG_UPLL_FUNC_CNTL, 0, ~UPLL_REF_DIV_MASK);
1241
1242         if (fb_div < 307200)
1243                 WREG32_P(CG_UPLL_FUNC_CNTL_4, 0, ~UPLL_SPARE_ISPARE9);
1244         else
1245                 WREG32_P(CG_UPLL_FUNC_CNTL_4, UPLL_SPARE_ISPARE9, ~UPLL_SPARE_ISPARE9);
1246
1247         /* set PDIV_A and PDIV_B */
1248         WREG32_P(CG_UPLL_FUNC_CNTL_2,
1249                 UPLL_PDIV_A(vclk_div) | UPLL_PDIV_B(dclk_div),
1250                 ~(UPLL_PDIV_A_MASK | UPLL_PDIV_B_MASK));
1251
1252         /* give the PLL some time to settle */
1253         mdelay(15);
1254
1255         /* deassert PLL_RESET */
1256         WREG32_P(CG_UPLL_FUNC_CNTL, 0, ~UPLL_RESET_MASK);
1257
1258         mdelay(15);
1259
1260         /* switch from bypass mode to normal mode */
1261         WREG32_P(CG_UPLL_FUNC_CNTL, 0, ~UPLL_BYPASS_EN_MASK);
1262
1263         r = radeon_uvd_send_upll_ctlreq(rdev, CG_UPLL_FUNC_CNTL);
1264         if (r)
1265                 return r;
1266
1267         /* switch VCLK and DCLK selection */
1268         WREG32_P(CG_UPLL_FUNC_CNTL_2,
1269                 VCLK_SRC_SEL(2) | DCLK_SRC_SEL(2),
1270                 ~(VCLK_SRC_SEL_MASK | DCLK_SRC_SEL_MASK));
1271
1272         mdelay(100);
1273
1274         return 0;
1275 }
1276
1277 void evergreen_fix_pci_max_read_req_size(struct radeon_device *rdev)
1278 {
1279         int readrq;
1280         u16 v;
1281
1282         readrq = pcie_get_readrq(rdev->pdev);
1283         v = ffs(readrq) - 8;
1284         /* if bios or OS sets MAX_READ_REQUEST_SIZE to an invalid value, fix it
1285          * to avoid hangs or perfomance issues
1286          */
1287         if ((v == 0) || (v == 6) || (v == 7))
1288                 pcie_set_readrq(rdev->pdev, 512);
1289 }
1290
1291 void dce4_program_fmt(struct drm_encoder *encoder)
1292 {
1293         struct drm_device *dev = encoder->dev;
1294         struct radeon_device *rdev = dev->dev_private;
1295         struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder);
1296         struct radeon_crtc *radeon_crtc = to_radeon_crtc(encoder->crtc);
1297         struct drm_connector *connector = radeon_get_connector_for_encoder(encoder);
1298         int bpc = 0;
1299         u32 tmp = 0;
1300         enum radeon_connector_dither dither = RADEON_FMT_DITHER_DISABLE;
1301
1302         if (connector) {
1303                 struct radeon_connector *radeon_connector = to_radeon_connector(connector);
1304                 bpc = radeon_get_monitor_bpc(connector);
1305                 dither = radeon_connector->dither;
1306         }
1307
1308         /* LVDS/eDP FMT is set up by atom */
1309         if (radeon_encoder->devices & ATOM_DEVICE_LCD_SUPPORT)
1310                 return;
1311
1312         /* not needed for analog */
1313         if ((radeon_encoder->encoder_id == ENCODER_OBJECT_ID_INTERNAL_KLDSCP_DAC1) ||
1314             (radeon_encoder->encoder_id == ENCODER_OBJECT_ID_INTERNAL_KLDSCP_DAC2))
1315                 return;
1316
1317         if (bpc == 0)
1318                 return;
1319
1320         switch (bpc) {
1321         case 6:
1322                 if (dither == RADEON_FMT_DITHER_ENABLE)
1323                         /* XXX sort out optimal dither settings */
1324                         tmp |= (FMT_FRAME_RANDOM_ENABLE | FMT_HIGHPASS_RANDOM_ENABLE |
1325                                 FMT_SPATIAL_DITHER_EN);
1326                 else
1327                         tmp |= FMT_TRUNCATE_EN;
1328                 break;
1329         case 8:
1330                 if (dither == RADEON_FMT_DITHER_ENABLE)
1331                         /* XXX sort out optimal dither settings */
1332                         tmp |= (FMT_FRAME_RANDOM_ENABLE | FMT_HIGHPASS_RANDOM_ENABLE |
1333                                 FMT_RGB_RANDOM_ENABLE |
1334                                 FMT_SPATIAL_DITHER_EN | FMT_SPATIAL_DITHER_DEPTH);
1335                 else
1336                         tmp |= (FMT_TRUNCATE_EN | FMT_TRUNCATE_DEPTH);
1337                 break;
1338         case 10:
1339         default:
1340                 /* not needed */
1341                 break;
1342         }
1343
1344         WREG32(FMT_BIT_DEPTH_CONTROL + radeon_crtc->crtc_offset, tmp);
1345 }
1346
1347 static bool dce4_is_in_vblank(struct radeon_device *rdev, int crtc)
1348 {
1349         if (RREG32(EVERGREEN_CRTC_STATUS + crtc_offsets[crtc]) & EVERGREEN_CRTC_V_BLANK)
1350                 return true;
1351         else
1352                 return false;
1353 }
1354
1355 static bool dce4_is_counter_moving(struct radeon_device *rdev, int crtc)
1356 {
1357         u32 pos1, pos2;
1358
1359         pos1 = RREG32(EVERGREEN_CRTC_STATUS_POSITION + crtc_offsets[crtc]);
1360         pos2 = RREG32(EVERGREEN_CRTC_STATUS_POSITION + crtc_offsets[crtc]);
1361
1362         if (pos1 != pos2)
1363                 return true;
1364         else
1365                 return false;
1366 }
1367
1368 /**
1369  * dce4_wait_for_vblank - vblank wait asic callback.
1370  *
1371  * @rdev: radeon_device pointer
1372  * @crtc: crtc to wait for vblank on
1373  *
1374  * Wait for vblank on the requested crtc (evergreen+).
1375  */
1376 void dce4_wait_for_vblank(struct radeon_device *rdev, int crtc)
1377 {
1378         unsigned i = 0;
1379
1380         if (crtc >= rdev->num_crtc)
1381                 return;
1382
1383         if (!(RREG32(EVERGREEN_CRTC_CONTROL + crtc_offsets[crtc]) & EVERGREEN_CRTC_MASTER_EN))
1384                 return;
1385
1386         /* depending on when we hit vblank, we may be close to active; if so,
1387          * wait for another frame.
1388          */
1389         while (dce4_is_in_vblank(rdev, crtc)) {
1390                 if (i++ % 100 == 0) {
1391                         if (!dce4_is_counter_moving(rdev, crtc))
1392                                 break;
1393                 }
1394         }
1395
1396         while (!dce4_is_in_vblank(rdev, crtc)) {
1397                 if (i++ % 100 == 0) {
1398                         if (!dce4_is_counter_moving(rdev, crtc))
1399                                 break;
1400                 }
1401         }
1402 }
1403
1404 /**
1405  * evergreen_page_flip - pageflip callback.
1406  *
1407  * @rdev: radeon_device pointer
1408  * @crtc_id: crtc to cleanup pageflip on
1409  * @crtc_base: new address of the crtc (GPU MC address)
1410  *
1411  * Triggers the actual pageflip by updating the primary
1412  * surface base address (evergreen+).
1413  */
1414 void evergreen_page_flip(struct radeon_device *rdev, int crtc_id, u64 crtc_base,
1415                          bool async)
1416 {
1417         struct radeon_crtc *radeon_crtc = rdev->mode_info.crtcs[crtc_id];
1418
1419         /* update the scanout addresses */
1420         WREG32(EVERGREEN_GRPH_FLIP_CONTROL + radeon_crtc->crtc_offset,
1421                async ? EVERGREEN_GRPH_SURFACE_UPDATE_H_RETRACE_EN : 0);
1422         WREG32(EVERGREEN_GRPH_PRIMARY_SURFACE_ADDRESS_HIGH + radeon_crtc->crtc_offset,
1423                upper_32_bits(crtc_base));
1424         WREG32(EVERGREEN_GRPH_PRIMARY_SURFACE_ADDRESS + radeon_crtc->crtc_offset,
1425                (u32)crtc_base);
1426         /* post the write */
1427         RREG32(EVERGREEN_GRPH_PRIMARY_SURFACE_ADDRESS + radeon_crtc->crtc_offset);
1428 }
1429
1430 /**
1431  * evergreen_page_flip_pending - check if page flip is still pending
1432  *
1433  * @rdev: radeon_device pointer
1434  * @crtc_id: crtc to check
1435  *
1436  * Returns the current update pending status.
1437  */
1438 bool evergreen_page_flip_pending(struct radeon_device *rdev, int crtc_id)
1439 {
1440         struct radeon_crtc *radeon_crtc = rdev->mode_info.crtcs[crtc_id];
1441
1442         /* Return current update_pending status: */
1443         return !!(RREG32(EVERGREEN_GRPH_UPDATE + radeon_crtc->crtc_offset) &
1444                 EVERGREEN_GRPH_SURFACE_UPDATE_PENDING);
1445 }
1446
1447 /* get temperature in millidegrees */
1448 int evergreen_get_temp(struct radeon_device *rdev)
1449 {
1450         u32 temp, toffset;
1451         int actual_temp = 0;
1452
1453         if (rdev->family == CHIP_JUNIPER) {
1454                 toffset = (RREG32(CG_THERMAL_CTRL) & TOFFSET_MASK) >>
1455                         TOFFSET_SHIFT;
1456                 temp = (RREG32(CG_TS0_STATUS) & TS0_ADC_DOUT_MASK) >>
1457                         TS0_ADC_DOUT_SHIFT;
1458
1459                 if (toffset & 0x100)
1460                         actual_temp = temp / 2 - (0x200 - toffset);
1461                 else
1462                         actual_temp = temp / 2 + toffset;
1463
1464                 actual_temp = actual_temp * 1000;
1465
1466         } else {
1467                 temp = (RREG32(CG_MULT_THERMAL_STATUS) & ASIC_T_MASK) >>
1468                         ASIC_T_SHIFT;
1469
1470                 if (temp & 0x400)
1471                         actual_temp = -256;
1472                 else if (temp & 0x200)
1473                         actual_temp = 255;
1474                 else if (temp & 0x100) {
1475                         actual_temp = temp & 0x1ff;
1476                         actual_temp |= ~0x1ff;
1477                 } else
1478                         actual_temp = temp & 0xff;
1479
1480                 actual_temp = (actual_temp * 1000) / 2;
1481         }
1482
1483         return actual_temp;
1484 }
1485
1486 int sumo_get_temp(struct radeon_device *rdev)
1487 {
1488         u32 temp = RREG32(CG_THERMAL_STATUS) & 0xff;
1489         int actual_temp = temp - 49;
1490
1491         return actual_temp * 1000;
1492 }
1493
1494 /**
1495  * sumo_pm_init_profile - Initialize power profiles callback.
1496  *
1497  * @rdev: radeon_device pointer
1498  *
1499  * Initialize the power states used in profile mode
1500  * (sumo, trinity, SI).
1501  * Used for profile mode only.
1502  */
1503 void sumo_pm_init_profile(struct radeon_device *rdev)
1504 {
1505         int idx;
1506
1507         /* default */
1508         rdev->pm.profiles[PM_PROFILE_DEFAULT_IDX].dpms_off_ps_idx = rdev->pm.default_power_state_index;
1509         rdev->pm.profiles[PM_PROFILE_DEFAULT_IDX].dpms_on_ps_idx = rdev->pm.default_power_state_index;
1510         rdev->pm.profiles[PM_PROFILE_DEFAULT_IDX].dpms_off_cm_idx = 0;
1511         rdev->pm.profiles[PM_PROFILE_DEFAULT_IDX].dpms_on_cm_idx = 0;
1512
1513         /* low,mid sh/mh */
1514         if (rdev->flags & RADEON_IS_MOBILITY)
1515                 idx = radeon_pm_get_type_index(rdev, POWER_STATE_TYPE_BATTERY, 0);
1516         else
1517                 idx = radeon_pm_get_type_index(rdev, POWER_STATE_TYPE_PERFORMANCE, 0);
1518
1519         rdev->pm.profiles[PM_PROFILE_LOW_SH_IDX].dpms_off_ps_idx = idx;
1520         rdev->pm.profiles[PM_PROFILE_LOW_SH_IDX].dpms_on_ps_idx = idx;
1521         rdev->pm.profiles[PM_PROFILE_LOW_SH_IDX].dpms_off_cm_idx = 0;
1522         rdev->pm.profiles[PM_PROFILE_LOW_SH_IDX].dpms_on_cm_idx = 0;
1523
1524         rdev->pm.profiles[PM_PROFILE_LOW_MH_IDX].dpms_off_ps_idx = idx;
1525         rdev->pm.profiles[PM_PROFILE_LOW_MH_IDX].dpms_on_ps_idx = idx;
1526         rdev->pm.profiles[PM_PROFILE_LOW_MH_IDX].dpms_off_cm_idx = 0;
1527         rdev->pm.profiles[PM_PROFILE_LOW_MH_IDX].dpms_on_cm_idx = 0;
1528
1529         rdev->pm.profiles[PM_PROFILE_MID_SH_IDX].dpms_off_ps_idx = idx;
1530         rdev->pm.profiles[PM_PROFILE_MID_SH_IDX].dpms_on_ps_idx = idx;
1531         rdev->pm.profiles[PM_PROFILE_MID_SH_IDX].dpms_off_cm_idx = 0;
1532         rdev->pm.profiles[PM_PROFILE_MID_SH_IDX].dpms_on_cm_idx = 0;
1533
1534         rdev->pm.profiles[PM_PROFILE_MID_MH_IDX].dpms_off_ps_idx = idx;
1535         rdev->pm.profiles[PM_PROFILE_MID_MH_IDX].dpms_on_ps_idx = idx;
1536         rdev->pm.profiles[PM_PROFILE_MID_MH_IDX].dpms_off_cm_idx = 0;
1537         rdev->pm.profiles[PM_PROFILE_MID_MH_IDX].dpms_on_cm_idx = 0;
1538
1539         /* high sh/mh */
1540         idx = radeon_pm_get_type_index(rdev, POWER_STATE_TYPE_PERFORMANCE, 0);
1541         rdev->pm.profiles[PM_PROFILE_HIGH_SH_IDX].dpms_off_ps_idx = idx;
1542         rdev->pm.profiles[PM_PROFILE_HIGH_SH_IDX].dpms_on_ps_idx = idx;
1543         rdev->pm.profiles[PM_PROFILE_HIGH_SH_IDX].dpms_off_cm_idx = 0;
1544         rdev->pm.profiles[PM_PROFILE_HIGH_SH_IDX].dpms_on_cm_idx =
1545                 rdev->pm.power_state[idx].num_clock_modes - 1;
1546
1547         rdev->pm.profiles[PM_PROFILE_HIGH_MH_IDX].dpms_off_ps_idx = idx;
1548         rdev->pm.profiles[PM_PROFILE_HIGH_MH_IDX].dpms_on_ps_idx = idx;
1549         rdev->pm.profiles[PM_PROFILE_HIGH_MH_IDX].dpms_off_cm_idx = 0;
1550         rdev->pm.profiles[PM_PROFILE_HIGH_MH_IDX].dpms_on_cm_idx =
1551                 rdev->pm.power_state[idx].num_clock_modes - 1;
1552 }
1553
1554 /**
1555  * btc_pm_init_profile - Initialize power profiles callback.
1556  *
1557  * @rdev: radeon_device pointer
1558  *
1559  * Initialize the power states used in profile mode
1560  * (BTC, cayman).
1561  * Used for profile mode only.
1562  */
1563 void btc_pm_init_profile(struct radeon_device *rdev)
1564 {
1565         int idx;
1566
1567         /* default */
1568         rdev->pm.profiles[PM_PROFILE_DEFAULT_IDX].dpms_off_ps_idx = rdev->pm.default_power_state_index;
1569         rdev->pm.profiles[PM_PROFILE_DEFAULT_IDX].dpms_on_ps_idx = rdev->pm.default_power_state_index;
1570         rdev->pm.profiles[PM_PROFILE_DEFAULT_IDX].dpms_off_cm_idx = 0;
1571         rdev->pm.profiles[PM_PROFILE_DEFAULT_IDX].dpms_on_cm_idx = 2;
1572         /* starting with BTC, there is one state that is used for both
1573          * MH and SH.  Difference is that we always use the high clock index for
1574          * mclk.
1575          */
1576         if (rdev->flags & RADEON_IS_MOBILITY)
1577                 idx = radeon_pm_get_type_index(rdev, POWER_STATE_TYPE_BATTERY, 0);
1578         else
1579                 idx = radeon_pm_get_type_index(rdev, POWER_STATE_TYPE_PERFORMANCE, 0);
1580         /* low sh */
1581         rdev->pm.profiles[PM_PROFILE_LOW_SH_IDX].dpms_off_ps_idx = idx;
1582         rdev->pm.profiles[PM_PROFILE_LOW_SH_IDX].dpms_on_ps_idx = idx;
1583         rdev->pm.profiles[PM_PROFILE_LOW_SH_IDX].dpms_off_cm_idx = 0;
1584         rdev->pm.profiles[PM_PROFILE_LOW_SH_IDX].dpms_on_cm_idx = 0;
1585         /* mid sh */
1586         rdev->pm.profiles[PM_PROFILE_MID_SH_IDX].dpms_off_ps_idx = idx;
1587         rdev->pm.profiles[PM_PROFILE_MID_SH_IDX].dpms_on_ps_idx = idx;
1588         rdev->pm.profiles[PM_PROFILE_MID_SH_IDX].dpms_off_cm_idx = 0;
1589         rdev->pm.profiles[PM_PROFILE_MID_SH_IDX].dpms_on_cm_idx = 1;
1590         /* high sh */
1591         rdev->pm.profiles[PM_PROFILE_HIGH_SH_IDX].dpms_off_ps_idx = idx;
1592         rdev->pm.profiles[PM_PROFILE_HIGH_SH_IDX].dpms_on_ps_idx = idx;
1593         rdev->pm.profiles[PM_PROFILE_HIGH_SH_IDX].dpms_off_cm_idx = 0;
1594         rdev->pm.profiles[PM_PROFILE_HIGH_SH_IDX].dpms_on_cm_idx = 2;
1595         /* low mh */
1596         rdev->pm.profiles[PM_PROFILE_LOW_MH_IDX].dpms_off_ps_idx = idx;
1597         rdev->pm.profiles[PM_PROFILE_LOW_MH_IDX].dpms_on_ps_idx = idx;
1598         rdev->pm.profiles[PM_PROFILE_LOW_MH_IDX].dpms_off_cm_idx = 0;
1599         rdev->pm.profiles[PM_PROFILE_LOW_MH_IDX].dpms_on_cm_idx = 0;
1600         /* mid mh */
1601         rdev->pm.profiles[PM_PROFILE_MID_MH_IDX].dpms_off_ps_idx = idx;
1602         rdev->pm.profiles[PM_PROFILE_MID_MH_IDX].dpms_on_ps_idx = idx;
1603         rdev->pm.profiles[PM_PROFILE_MID_MH_IDX].dpms_off_cm_idx = 0;
1604         rdev->pm.profiles[PM_PROFILE_MID_MH_IDX].dpms_on_cm_idx = 1;
1605         /* high mh */
1606         rdev->pm.profiles[PM_PROFILE_HIGH_MH_IDX].dpms_off_ps_idx = idx;
1607         rdev->pm.profiles[PM_PROFILE_HIGH_MH_IDX].dpms_on_ps_idx = idx;
1608         rdev->pm.profiles[PM_PROFILE_HIGH_MH_IDX].dpms_off_cm_idx = 0;
1609         rdev->pm.profiles[PM_PROFILE_HIGH_MH_IDX].dpms_on_cm_idx = 2;
1610 }
1611
1612 /**
1613  * evergreen_pm_misc - set additional pm hw parameters callback.
1614  *
1615  * @rdev: radeon_device pointer
1616  *
1617  * Set non-clock parameters associated with a power state
1618  * (voltage, etc.) (evergreen+).
1619  */
1620 void evergreen_pm_misc(struct radeon_device *rdev)
1621 {
1622         int req_ps_idx = rdev->pm.requested_power_state_index;
1623         int req_cm_idx = rdev->pm.requested_clock_mode_index;
1624         struct radeon_power_state *ps = &rdev->pm.power_state[req_ps_idx];
1625         struct radeon_voltage *voltage = &ps->clock_info[req_cm_idx].voltage;
1626
1627         if (voltage->type == VOLTAGE_SW) {
1628                 /* 0xff0x are flags rather then an actual voltage */
1629                 if ((voltage->voltage & 0xff00) == 0xff00)
1630                         return;
1631                 if (voltage->voltage && (voltage->voltage != rdev->pm.current_vddc)) {
1632                         radeon_atom_set_voltage(rdev, voltage->voltage, SET_VOLTAGE_TYPE_ASIC_VDDC);
1633                         rdev->pm.current_vddc = voltage->voltage;
1634                         DRM_DEBUG("Setting: vddc: %d\n", voltage->voltage);
1635                 }
1636
1637                 /* starting with BTC, there is one state that is used for both
1638                  * MH and SH.  Difference is that we always use the high clock index for
1639                  * mclk and vddci.
1640                  */
1641                 if ((rdev->pm.pm_method == PM_METHOD_PROFILE) &&
1642                     (rdev->family >= CHIP_BARTS) &&
1643                     rdev->pm.active_crtc_count &&
1644                     ((rdev->pm.profile_index == PM_PROFILE_MID_MH_IDX) ||
1645                      (rdev->pm.profile_index == PM_PROFILE_LOW_MH_IDX)))
1646                         voltage = &rdev->pm.power_state[req_ps_idx].
1647                                 clock_info[rdev->pm.profiles[PM_PROFILE_HIGH_MH_IDX].dpms_on_cm_idx].voltage;
1648
1649                 /* 0xff0x are flags rather then an actual voltage */
1650                 if ((voltage->vddci & 0xff00) == 0xff00)
1651                         return;
1652                 if (voltage->vddci && (voltage->vddci != rdev->pm.current_vddci)) {
1653                         radeon_atom_set_voltage(rdev, voltage->vddci, SET_VOLTAGE_TYPE_ASIC_VDDCI);
1654                         rdev->pm.current_vddci = voltage->vddci;
1655                         DRM_DEBUG("Setting: vddci: %d\n", voltage->vddci);
1656                 }
1657         }
1658 }
1659
1660 /**
1661  * evergreen_pm_prepare - pre-power state change callback.
1662  *
1663  * @rdev: radeon_device pointer
1664  *
1665  * Prepare for a power state change (evergreen+).
1666  */
1667 void evergreen_pm_prepare(struct radeon_device *rdev)
1668 {
1669         struct drm_device *ddev = rdev->ddev;
1670         struct drm_crtc *crtc;
1671         struct radeon_crtc *radeon_crtc;
1672         u32 tmp;
1673
1674         /* disable any active CRTCs */
1675         list_for_each_entry(crtc, &ddev->mode_config.crtc_list, head) {
1676                 radeon_crtc = to_radeon_crtc(crtc);
1677                 if (radeon_crtc->enabled) {
1678                         tmp = RREG32(EVERGREEN_CRTC_CONTROL + radeon_crtc->crtc_offset);
1679                         tmp |= EVERGREEN_CRTC_DISP_READ_REQUEST_DISABLE;
1680                         WREG32(EVERGREEN_CRTC_CONTROL + radeon_crtc->crtc_offset, tmp);
1681                 }
1682         }
1683 }
1684
1685 /**
1686  * evergreen_pm_finish - post-power state change callback.
1687  *
1688  * @rdev: radeon_device pointer
1689  *
1690  * Clean up after a power state change (evergreen+).
1691  */
1692 void evergreen_pm_finish(struct radeon_device *rdev)
1693 {
1694         struct drm_device *ddev = rdev->ddev;
1695         struct drm_crtc *crtc;
1696         struct radeon_crtc *radeon_crtc;
1697         u32 tmp;
1698
1699         /* enable any active CRTCs */
1700         list_for_each_entry(crtc, &ddev->mode_config.crtc_list, head) {
1701                 radeon_crtc = to_radeon_crtc(crtc);
1702                 if (radeon_crtc->enabled) {
1703                         tmp = RREG32(EVERGREEN_CRTC_CONTROL + radeon_crtc->crtc_offset);
1704                         tmp &= ~EVERGREEN_CRTC_DISP_READ_REQUEST_DISABLE;
1705                         WREG32(EVERGREEN_CRTC_CONTROL + radeon_crtc->crtc_offset, tmp);
1706                 }
1707         }
1708 }
1709
1710 /**
1711  * evergreen_hpd_sense - hpd sense callback.
1712  *
1713  * @rdev: radeon_device pointer
1714  * @hpd: hpd (hotplug detect) pin
1715  *
1716  * Checks if a digital monitor is connected (evergreen+).
1717  * Returns true if connected, false if not connected.
1718  */
1719 bool evergreen_hpd_sense(struct radeon_device *rdev, enum radeon_hpd_id hpd)
1720 {
1721         if (hpd == RADEON_HPD_NONE)
1722                 return false;
1723
1724         return !!(RREG32(DC_HPDx_INT_STATUS_REG(hpd)) & DC_HPDx_SENSE);
1725 }
1726
1727 /**
1728  * evergreen_hpd_set_polarity - hpd set polarity callback.
1729  *
1730  * @rdev: radeon_device pointer
1731  * @hpd: hpd (hotplug detect) pin
1732  *
1733  * Set the polarity of the hpd pin (evergreen+).
1734  */
1735 void evergreen_hpd_set_polarity(struct radeon_device *rdev,
1736                                 enum radeon_hpd_id hpd)
1737 {
1738         bool connected = evergreen_hpd_sense(rdev, hpd);
1739
1740         if (hpd == RADEON_HPD_NONE)
1741                 return;
1742
1743         if (connected)
1744                 WREG32_AND(DC_HPDx_INT_CONTROL(hpd), ~DC_HPDx_INT_POLARITY);
1745         else
1746                 WREG32_OR(DC_HPDx_INT_CONTROL(hpd), DC_HPDx_INT_POLARITY);
1747 }
1748
1749 /**
1750  * evergreen_hpd_init - hpd setup callback.
1751  *
1752  * @rdev: radeon_device pointer
1753  *
1754  * Setup the hpd pins used by the card (evergreen+).
1755  * Enable the pin, set the polarity, and enable the hpd interrupts.
1756  */
1757 void evergreen_hpd_init(struct radeon_device *rdev)
1758 {
1759         struct drm_device *dev = rdev->ddev;
1760         struct drm_connector *connector;
1761         unsigned enabled = 0;
1762         u32 tmp = DC_HPDx_CONNECTION_TIMER(0x9c4) |
1763                 DC_HPDx_RX_INT_TIMER(0xfa) | DC_HPDx_EN;
1764
1765         list_for_each_entry(connector, &dev->mode_config.connector_list, head) {
1766                 enum radeon_hpd_id hpd =
1767                         to_radeon_connector(connector)->hpd.hpd;
1768
1769                 if (connector->connector_type == DRM_MODE_CONNECTOR_eDP ||
1770                     connector->connector_type == DRM_MODE_CONNECTOR_LVDS) {
1771                         /* don't try to enable hpd on eDP or LVDS avoid breaking the
1772                          * aux dp channel on imac and help (but not completely fix)
1773                          * https://bugzilla.redhat.com/show_bug.cgi?id=726143
1774                          * also avoid interrupt storms during dpms.
1775                          */
1776                         continue;
1777                 }
1778
1779                 if (hpd == RADEON_HPD_NONE)
1780                         continue;
1781
1782                 WREG32(DC_HPDx_CONTROL(hpd), tmp);
1783                 enabled |= 1 << hpd;
1784
1785                 radeon_hpd_set_polarity(rdev, hpd);
1786         }
1787         radeon_irq_kms_enable_hpd(rdev, enabled);
1788 }
1789
1790 /**
1791  * evergreen_hpd_fini - hpd tear down callback.
1792  *
1793  * @rdev: radeon_device pointer
1794  *
1795  * Tear down the hpd pins used by the card (evergreen+).
1796  * Disable the hpd interrupts.
1797  */
1798 void evergreen_hpd_fini(struct radeon_device *rdev)
1799 {
1800         struct drm_device *dev = rdev->ddev;
1801         struct drm_connector *connector;
1802         unsigned disabled = 0;
1803
1804         list_for_each_entry(connector, &dev->mode_config.connector_list, head) {
1805                 enum radeon_hpd_id hpd =
1806                         to_radeon_connector(connector)->hpd.hpd;
1807
1808                 if (hpd == RADEON_HPD_NONE)
1809                         continue;
1810
1811                 WREG32(DC_HPDx_CONTROL(hpd), 0);
1812                 disabled |= 1 << hpd;
1813         }
1814         radeon_irq_kms_disable_hpd(rdev, disabled);
1815 }
1816
1817 /* watermark setup */
1818
1819 static u32 evergreen_line_buffer_adjust(struct radeon_device *rdev,
1820                                         struct radeon_crtc *radeon_crtc,
1821                                         struct drm_display_mode *mode,
1822                                         struct drm_display_mode *other_mode)
1823 {
1824         u32 tmp, buffer_alloc, i;
1825         u32 pipe_offset = radeon_crtc->crtc_id * 0x20;
1826         /*
1827          * Line Buffer Setup
1828          * There are 3 line buffers, each one shared by 2 display controllers.
1829          * DC_LB_MEMORY_SPLIT controls how that line buffer is shared between
1830          * the display controllers.  The paritioning is done via one of four
1831          * preset allocations specified in bits 2:0:
1832          * first display controller
1833          *  0 - first half of lb (3840 * 2)
1834          *  1 - first 3/4 of lb (5760 * 2)
1835          *  2 - whole lb (7680 * 2), other crtc must be disabled
1836          *  3 - first 1/4 of lb (1920 * 2)
1837          * second display controller
1838          *  4 - second half of lb (3840 * 2)
1839          *  5 - second 3/4 of lb (5760 * 2)
1840          *  6 - whole lb (7680 * 2), other crtc must be disabled
1841          *  7 - last 1/4 of lb (1920 * 2)
1842          */
1843         /* this can get tricky if we have two large displays on a paired group
1844          * of crtcs.  Ideally for multiple large displays we'd assign them to
1845          * non-linked crtcs for maximum line buffer allocation.
1846          */
1847         if (radeon_crtc->base.enabled && mode) {
1848                 if (other_mode) {
1849                         tmp = 0; /* 1/2 */
1850                         buffer_alloc = 1;
1851                 } else {
1852                         tmp = 2; /* whole */
1853                         buffer_alloc = 2;
1854                 }
1855         } else {
1856                 tmp = 0;
1857                 buffer_alloc = 0;
1858         }
1859
1860         /* second controller of the pair uses second half of the lb */
1861         if (radeon_crtc->crtc_id % 2)
1862                 tmp += 4;
1863         WREG32(DC_LB_MEMORY_SPLIT + radeon_crtc->crtc_offset, tmp);
1864
1865         if (ASIC_IS_DCE41(rdev) || ASIC_IS_DCE5(rdev)) {
1866                 WREG32(PIPE0_DMIF_BUFFER_CONTROL + pipe_offset,
1867                        DMIF_BUFFERS_ALLOCATED(buffer_alloc));
1868                 for (i = 0; i < rdev->usec_timeout; i++) {
1869                         if (RREG32(PIPE0_DMIF_BUFFER_CONTROL + pipe_offset) &
1870                             DMIF_BUFFERS_ALLOCATED_COMPLETED)
1871                                 break;
1872                         udelay(1);
1873                 }
1874         }
1875
1876         if (radeon_crtc->base.enabled && mode) {
1877                 switch (tmp) {
1878                 case 0:
1879                 case 4:
1880                 default:
1881                         if (ASIC_IS_DCE5(rdev))
1882                                 return 4096 * 2;
1883                         else
1884                                 return 3840 * 2;
1885                 case 1:
1886                 case 5:
1887                         if (ASIC_IS_DCE5(rdev))
1888                                 return 6144 * 2;
1889                         else
1890                                 return 5760 * 2;
1891                 case 2:
1892                 case 6:
1893                         if (ASIC_IS_DCE5(rdev))
1894                                 return 8192 * 2;
1895                         else
1896                                 return 7680 * 2;
1897                 case 3:
1898                 case 7:
1899                         if (ASIC_IS_DCE5(rdev))
1900                                 return 2048 * 2;
1901                         else
1902                                 return 1920 * 2;
1903                 }
1904         }
1905
1906         /* controller not enabled, so no lb used */
1907         return 0;
1908 }
1909
1910 u32 evergreen_get_number_of_dram_channels(struct radeon_device *rdev)
1911 {
1912         u32 tmp = RREG32(MC_SHARED_CHMAP);
1913
1914         switch ((tmp & NOOFCHAN_MASK) >> NOOFCHAN_SHIFT) {
1915         case 0:
1916         default:
1917                 return 1;
1918         case 1:
1919                 return 2;
1920         case 2:
1921                 return 4;
1922         case 3:
1923                 return 8;
1924         }
1925 }
1926
1927 struct evergreen_wm_params {
1928         u32 dram_channels; /* number of dram channels */
1929         u32 yclk;          /* bandwidth per dram data pin in kHz */
1930         u32 sclk;          /* engine clock in kHz */
1931         u32 disp_clk;      /* display clock in kHz */
1932         u32 src_width;     /* viewport width */
1933         u32 active_time;   /* active display time in ns */
1934         u32 blank_time;    /* blank time in ns */
1935         bool interlaced;    /* mode is interlaced */
1936         fixed20_12 vsc;    /* vertical scale ratio */
1937         u32 num_heads;     /* number of active crtcs */
1938         u32 bytes_per_pixel; /* bytes per pixel display + overlay */
1939         u32 lb_size;       /* line buffer allocated to pipe */
1940         u32 vtaps;         /* vertical scaler taps */
1941 };
1942
1943 static u32 evergreen_dram_bandwidth(struct evergreen_wm_params *wm)
1944 {
1945         /* Calculate DRAM Bandwidth and the part allocated to display. */
1946         fixed20_12 dram_efficiency; /* 0.7 */
1947         fixed20_12 yclk, dram_channels, bandwidth;
1948         fixed20_12 a;
1949
1950         a.full = dfixed_const(1000);
1951         yclk.full = dfixed_const(wm->yclk);
1952         yclk.full = dfixed_div(yclk, a);
1953         dram_channels.full = dfixed_const(wm->dram_channels * 4);
1954         a.full = dfixed_const(10);
1955         dram_efficiency.full = dfixed_const(7);
1956         dram_efficiency.full = dfixed_div(dram_efficiency, a);
1957         bandwidth.full = dfixed_mul(dram_channels, yclk);
1958         bandwidth.full = dfixed_mul(bandwidth, dram_efficiency);
1959
1960         return dfixed_trunc(bandwidth);
1961 }
1962
1963 static u32 evergreen_dram_bandwidth_for_display(struct evergreen_wm_params *wm)
1964 {
1965         /* Calculate DRAM Bandwidth and the part allocated to display. */
1966         fixed20_12 disp_dram_allocation; /* 0.3 to 0.7 */
1967         fixed20_12 yclk, dram_channels, bandwidth;
1968         fixed20_12 a;
1969
1970         a.full = dfixed_const(1000);
1971         yclk.full = dfixed_const(wm->yclk);
1972         yclk.full = dfixed_div(yclk, a);
1973         dram_channels.full = dfixed_const(wm->dram_channels * 4);
1974         a.full = dfixed_const(10);
1975         disp_dram_allocation.full = dfixed_const(3); /* XXX worse case value 0.3 */
1976         disp_dram_allocation.full = dfixed_div(disp_dram_allocation, a);
1977         bandwidth.full = dfixed_mul(dram_channels, yclk);
1978         bandwidth.full = dfixed_mul(bandwidth, disp_dram_allocation);
1979
1980         return dfixed_trunc(bandwidth);
1981 }
1982
1983 static u32 evergreen_data_return_bandwidth(struct evergreen_wm_params *wm)
1984 {
1985         /* Calculate the display Data return Bandwidth */
1986         fixed20_12 return_efficiency; /* 0.8 */
1987         fixed20_12 sclk, bandwidth;
1988         fixed20_12 a;
1989
1990         a.full = dfixed_const(1000);
1991         sclk.full = dfixed_const(wm->sclk);
1992         sclk.full = dfixed_div(sclk, a);
1993         a.full = dfixed_const(10);
1994         return_efficiency.full = dfixed_const(8);
1995         return_efficiency.full = dfixed_div(return_efficiency, a);
1996         a.full = dfixed_const(32);
1997         bandwidth.full = dfixed_mul(a, sclk);
1998         bandwidth.full = dfixed_mul(bandwidth, return_efficiency);
1999
2000         return dfixed_trunc(bandwidth);
2001 }
2002
2003 static u32 evergreen_dmif_request_bandwidth(struct evergreen_wm_params *wm)
2004 {
2005         /* Calculate the DMIF Request Bandwidth */
2006         fixed20_12 disp_clk_request_efficiency; /* 0.8 */
2007         fixed20_12 disp_clk, bandwidth;
2008         fixed20_12 a;
2009
2010         a.full = dfixed_const(1000);
2011         disp_clk.full = dfixed_const(wm->disp_clk);
2012         disp_clk.full = dfixed_div(disp_clk, a);
2013         a.full = dfixed_const(10);
2014         disp_clk_request_efficiency.full = dfixed_const(8);
2015         disp_clk_request_efficiency.full = dfixed_div(disp_clk_request_efficiency, a);
2016         a.full = dfixed_const(32);
2017         bandwidth.full = dfixed_mul(a, disp_clk);
2018         bandwidth.full = dfixed_mul(bandwidth, disp_clk_request_efficiency);
2019
2020         return dfixed_trunc(bandwidth);
2021 }
2022
2023 static u32 evergreen_available_bandwidth(struct evergreen_wm_params *wm)
2024 {
2025         /* Calculate the Available bandwidth. Display can use this temporarily but not in average. */
2026         u32 dram_bandwidth = evergreen_dram_bandwidth(wm);
2027         u32 data_return_bandwidth = evergreen_data_return_bandwidth(wm);
2028         u32 dmif_req_bandwidth = evergreen_dmif_request_bandwidth(wm);
2029
2030         return min(dram_bandwidth, min(data_return_bandwidth, dmif_req_bandwidth));
2031 }
2032
2033 static u32 evergreen_average_bandwidth(struct evergreen_wm_params *wm)
2034 {
2035         /* Calculate the display mode Average Bandwidth
2036          * DisplayMode should contain the source and destination dimensions,
2037          * timing, etc.
2038          */
2039         fixed20_12 bpp;
2040         fixed20_12 line_time;
2041         fixed20_12 src_width;
2042         fixed20_12 bandwidth;
2043         fixed20_12 a;
2044
2045         a.full = dfixed_const(1000);
2046         line_time.full = dfixed_const(wm->active_time + wm->blank_time);
2047         line_time.full = dfixed_div(line_time, a);
2048         bpp.full = dfixed_const(wm->bytes_per_pixel);
2049         src_width.full = dfixed_const(wm->src_width);
2050         bandwidth.full = dfixed_mul(src_width, bpp);
2051         bandwidth.full = dfixed_mul(bandwidth, wm->vsc);
2052         bandwidth.full = dfixed_div(bandwidth, line_time);
2053
2054         return dfixed_trunc(bandwidth);
2055 }
2056
2057 static u32 evergreen_latency_watermark(struct evergreen_wm_params *wm)
2058 {
2059         /* First calcualte the latency in ns */
2060         u32 mc_latency = 2000; /* 2000 ns. */
2061         u32 available_bandwidth = evergreen_available_bandwidth(wm);
2062         u32 worst_chunk_return_time = (512 * 8 * 1000) / available_bandwidth;
2063         u32 cursor_line_pair_return_time = (128 * 4 * 1000) / available_bandwidth;
2064         u32 dc_latency = 40000000 / wm->disp_clk; /* dc pipe latency */
2065         u32 other_heads_data_return_time = ((wm->num_heads + 1) * worst_chunk_return_time) +
2066                 (wm->num_heads * cursor_line_pair_return_time);
2067         u32 latency = mc_latency + other_heads_data_return_time + dc_latency;
2068         u32 max_src_lines_per_dst_line, lb_fill_bw, line_fill_time;
2069         fixed20_12 a, b, c;
2070
2071         if (wm->num_heads == 0)
2072                 return 0;
2073
2074         a.full = dfixed_const(2);
2075         b.full = dfixed_const(1);
2076         if ((wm->vsc.full > a.full) ||
2077             ((wm->vsc.full > b.full) && (wm->vtaps >= 3)) ||
2078             (wm->vtaps >= 5) ||
2079             ((wm->vsc.full >= a.full) && wm->interlaced))
2080                 max_src_lines_per_dst_line = 4;
2081         else
2082                 max_src_lines_per_dst_line = 2;
2083
2084         a.full = dfixed_const(available_bandwidth);
2085         b.full = dfixed_const(wm->num_heads);
2086         a.full = dfixed_div(a, b);
2087
2088         lb_fill_bw = min(dfixed_trunc(a), wm->disp_clk * wm->bytes_per_pixel / 1000);
2089
2090         a.full = dfixed_const(max_src_lines_per_dst_line * wm->src_width * wm->bytes_per_pixel);
2091         b.full = dfixed_const(1000);
2092         c.full = dfixed_const(lb_fill_bw);
2093         b.full = dfixed_div(c, b);
2094         a.full = dfixed_div(a, b);
2095         line_fill_time = dfixed_trunc(a);
2096
2097         if (line_fill_time < wm->active_time)
2098                 return latency;
2099         else
2100                 return latency + (line_fill_time - wm->active_time);
2101
2102 }
2103
2104 static bool evergreen_average_bandwidth_vs_dram_bandwidth_for_display(struct evergreen_wm_params *wm)
2105 {
2106         if (evergreen_average_bandwidth(wm) <=
2107             (evergreen_dram_bandwidth_for_display(wm) / wm->num_heads))
2108                 return true;
2109         else
2110                 return false;
2111 };
2112
2113 static bool evergreen_average_bandwidth_vs_available_bandwidth(struct evergreen_wm_params *wm)
2114 {
2115         if (evergreen_average_bandwidth(wm) <=
2116             (evergreen_available_bandwidth(wm) / wm->num_heads))
2117                 return true;
2118         else
2119                 return false;
2120 };
2121
2122 static bool evergreen_check_latency_hiding(struct evergreen_wm_params *wm)
2123 {
2124         u32 lb_partitions = wm->lb_size / wm->src_width;
2125         u32 line_time = wm->active_time + wm->blank_time;
2126         u32 latency_tolerant_lines;
2127         u32 latency_hiding;
2128         fixed20_12 a;
2129
2130         a.full = dfixed_const(1);
2131         if (wm->vsc.full > a.full)
2132                 latency_tolerant_lines = 1;
2133         else {
2134                 if (lb_partitions <= (wm->vtaps + 1))
2135                         latency_tolerant_lines = 1;
2136                 else
2137                         latency_tolerant_lines = 2;
2138         }
2139
2140         latency_hiding = (latency_tolerant_lines * line_time + wm->blank_time);
2141
2142         if (evergreen_latency_watermark(wm) <= latency_hiding)
2143                 return true;
2144         else
2145                 return false;
2146 }
2147
2148 static void evergreen_program_watermarks(struct radeon_device *rdev,
2149                                          struct radeon_crtc *radeon_crtc,
2150                                          u32 lb_size, u32 num_heads)
2151 {
2152         struct drm_display_mode *mode = &radeon_crtc->base.mode;
2153         struct evergreen_wm_params wm_low, wm_high;
2154         u32 dram_channels;
2155         u32 active_time;
2156         u32 line_time = 0;
2157         u32 latency_watermark_a = 0, latency_watermark_b = 0;
2158         u32 priority_a_mark = 0, priority_b_mark = 0;
2159         u32 priority_a_cnt = PRIORITY_OFF;
2160         u32 priority_b_cnt = PRIORITY_OFF;
2161         u32 pipe_offset = radeon_crtc->crtc_id * 16;
2162         u32 tmp, arb_control3;
2163         fixed20_12 a, b, c;
2164
2165         if (radeon_crtc->base.enabled && num_heads && mode) {
2166                 active_time = (u32) div_u64((u64)mode->crtc_hdisplay * 1000000,
2167                                             (u32)mode->clock);
2168                 line_time = (u32) div_u64((u64)mode->crtc_htotal * 1000000,
2169                                           (u32)mode->clock);
2170                 line_time = min(line_time, (u32)65535);
2171                 priority_a_cnt = 0;
2172                 priority_b_cnt = 0;
2173                 dram_channels = evergreen_get_number_of_dram_channels(rdev);
2174
2175                 /* watermark for high clocks */
2176                 if ((rdev->pm.pm_method == PM_METHOD_DPM) && rdev->pm.dpm_enabled) {
2177                         wm_high.yclk =
2178                                 radeon_dpm_get_mclk(rdev, false) * 10;
2179                         wm_high.sclk =
2180                                 radeon_dpm_get_sclk(rdev, false) * 10;
2181                 } else {
2182                         wm_high.yclk = rdev->pm.current_mclk * 10;
2183                         wm_high.sclk = rdev->pm.current_sclk * 10;
2184                 }
2185
2186                 wm_high.disp_clk = mode->clock;
2187                 wm_high.src_width = mode->crtc_hdisplay;
2188                 wm_high.active_time = active_time;
2189                 wm_high.blank_time = line_time - wm_high.active_time;
2190                 wm_high.interlaced = false;
2191                 if (mode->flags & DRM_MODE_FLAG_INTERLACE)
2192                         wm_high.interlaced = true;
2193                 wm_high.vsc = radeon_crtc->vsc;
2194                 wm_high.vtaps = 1;
2195                 if (radeon_crtc->rmx_type != RMX_OFF)
2196                         wm_high.vtaps = 2;
2197                 wm_high.bytes_per_pixel = 4; /* XXX: get this from fb config */
2198                 wm_high.lb_size = lb_size;
2199                 wm_high.dram_channels = dram_channels;
2200                 wm_high.num_heads = num_heads;
2201
2202                 /* watermark for low clocks */
2203                 if ((rdev->pm.pm_method == PM_METHOD_DPM) && rdev->pm.dpm_enabled) {
2204                         wm_low.yclk =
2205                                 radeon_dpm_get_mclk(rdev, true) * 10;
2206                         wm_low.sclk =
2207                                 radeon_dpm_get_sclk(rdev, true) * 10;
2208                 } else {
2209                         wm_low.yclk = rdev->pm.current_mclk * 10;
2210                         wm_low.sclk = rdev->pm.current_sclk * 10;
2211                 }
2212
2213                 wm_low.disp_clk = mode->clock;
2214                 wm_low.src_width = mode->crtc_hdisplay;
2215                 wm_low.active_time = active_time;
2216                 wm_low.blank_time = line_time - wm_low.active_time;
2217                 wm_low.interlaced = false;
2218                 if (mode->flags & DRM_MODE_FLAG_INTERLACE)
2219                         wm_low.interlaced = true;
2220                 wm_low.vsc = radeon_crtc->vsc;
2221                 wm_low.vtaps = 1;
2222                 if (radeon_crtc->rmx_type != RMX_OFF)
2223                         wm_low.vtaps = 2;
2224                 wm_low.bytes_per_pixel = 4; /* XXX: get this from fb config */
2225                 wm_low.lb_size = lb_size;
2226                 wm_low.dram_channels = dram_channels;
2227                 wm_low.num_heads = num_heads;
2228
2229                 /* set for high clocks */
2230                 latency_watermark_a = min(evergreen_latency_watermark(&wm_high), (u32)65535);
2231                 /* set for low clocks */
2232                 latency_watermark_b = min(evergreen_latency_watermark(&wm_low), (u32)65535);
2233
2234                 /* possibly force display priority to high */
2235                 /* should really do this at mode validation time... */
2236                 if (!evergreen_average_bandwidth_vs_dram_bandwidth_for_display(&wm_high) ||
2237                     !evergreen_average_bandwidth_vs_available_bandwidth(&wm_high) ||
2238                     !evergreen_check_latency_hiding(&wm_high) ||
2239                     (rdev->disp_priority == 2)) {
2240                         DRM_DEBUG_KMS("force priority a to high\n");
2241                         priority_a_cnt |= PRIORITY_ALWAYS_ON;
2242                 }
2243                 if (!evergreen_average_bandwidth_vs_dram_bandwidth_for_display(&wm_low) ||
2244                     !evergreen_average_bandwidth_vs_available_bandwidth(&wm_low) ||
2245                     !evergreen_check_latency_hiding(&wm_low) ||
2246                     (rdev->disp_priority == 2)) {
2247                         DRM_DEBUG_KMS("force priority b to high\n");
2248                         priority_b_cnt |= PRIORITY_ALWAYS_ON;
2249                 }
2250
2251                 a.full = dfixed_const(1000);
2252                 b.full = dfixed_const(mode->clock);
2253                 b.full = dfixed_div(b, a);
2254                 c.full = dfixed_const(latency_watermark_a);
2255                 c.full = dfixed_mul(c, b);
2256                 c.full = dfixed_mul(c, radeon_crtc->hsc);
2257                 c.full = dfixed_div(c, a);
2258                 a.full = dfixed_const(16);
2259                 c.full = dfixed_div(c, a);
2260                 priority_a_mark = dfixed_trunc(c);
2261                 priority_a_cnt |= priority_a_mark & PRIORITY_MARK_MASK;
2262
2263                 a.full = dfixed_const(1000);
2264                 b.full = dfixed_const(mode->clock);
2265                 b.full = dfixed_div(b, a);
2266                 c.full = dfixed_const(latency_watermark_b);
2267                 c.full = dfixed_mul(c, b);
2268                 c.full = dfixed_mul(c, radeon_crtc->hsc);
2269                 c.full = dfixed_div(c, a);
2270                 a.full = dfixed_const(16);
2271                 c.full = dfixed_div(c, a);
2272                 priority_b_mark = dfixed_trunc(c);
2273                 priority_b_cnt |= priority_b_mark & PRIORITY_MARK_MASK;
2274
2275                 /* Save number of lines the linebuffer leads before the scanout */
2276                 radeon_crtc->lb_vblank_lead_lines = DIV_ROUND_UP(lb_size, mode->crtc_hdisplay);
2277         }
2278
2279         /* select wm A */
2280         arb_control3 = RREG32(PIPE0_ARBITRATION_CONTROL3 + pipe_offset);
2281         tmp = arb_control3;
2282         tmp &= ~LATENCY_WATERMARK_MASK(3);
2283         tmp |= LATENCY_WATERMARK_MASK(1);
2284         WREG32(PIPE0_ARBITRATION_CONTROL3 + pipe_offset, tmp);
2285         WREG32(PIPE0_LATENCY_CONTROL + pipe_offset,
2286                (LATENCY_LOW_WATERMARK(latency_watermark_a) |
2287                 LATENCY_HIGH_WATERMARK(line_time)));
2288         /* select wm B */
2289         tmp = RREG32(PIPE0_ARBITRATION_CONTROL3 + pipe_offset);
2290         tmp &= ~LATENCY_WATERMARK_MASK(3);
2291         tmp |= LATENCY_WATERMARK_MASK(2);
2292         WREG32(PIPE0_ARBITRATION_CONTROL3 + pipe_offset, tmp);
2293         WREG32(PIPE0_LATENCY_CONTROL + pipe_offset,
2294                (LATENCY_LOW_WATERMARK(latency_watermark_b) |
2295                 LATENCY_HIGH_WATERMARK(line_time)));
2296         /* restore original selection */
2297         WREG32(PIPE0_ARBITRATION_CONTROL3 + pipe_offset, arb_control3);
2298
2299         /* write the priority marks */
2300         WREG32(PRIORITY_A_CNT + radeon_crtc->crtc_offset, priority_a_cnt);
2301         WREG32(PRIORITY_B_CNT + radeon_crtc->crtc_offset, priority_b_cnt);
2302
2303         /* save values for DPM */
2304         radeon_crtc->line_time = line_time;
2305         radeon_crtc->wm_high = latency_watermark_a;
2306         radeon_crtc->wm_low = latency_watermark_b;
2307 }
2308
2309 /**
2310  * evergreen_bandwidth_update - update display watermarks callback.
2311  *
2312  * @rdev: radeon_device pointer
2313  *
2314  * Update the display watermarks based on the requested mode(s)
2315  * (evergreen+).
2316  */
2317 void evergreen_bandwidth_update(struct radeon_device *rdev)
2318 {
2319         struct drm_display_mode *mode0 = NULL;
2320         struct drm_display_mode *mode1 = NULL;
2321         u32 num_heads = 0, lb_size;
2322         int i;
2323
2324         if (!rdev->mode_info.mode_config_initialized)
2325                 return;
2326
2327         radeon_update_display_priority(rdev);
2328
2329         for (i = 0; i < rdev->num_crtc; i++) {
2330                 if (rdev->mode_info.crtcs[i]->base.enabled)
2331                         num_heads++;
2332         }
2333         for (i = 0; i < rdev->num_crtc; i += 2) {
2334                 mode0 = &rdev->mode_info.crtcs[i]->base.mode;
2335                 mode1 = &rdev->mode_info.crtcs[i+1]->base.mode;
2336                 lb_size = evergreen_line_buffer_adjust(rdev, rdev->mode_info.crtcs[i], mode0, mode1);
2337                 evergreen_program_watermarks(rdev, rdev->mode_info.crtcs[i], lb_size, num_heads);
2338                 lb_size = evergreen_line_buffer_adjust(rdev, rdev->mode_info.crtcs[i+1], mode1, mode0);
2339                 evergreen_program_watermarks(rdev, rdev->mode_info.crtcs[i+1], lb_size, num_heads);
2340         }
2341 }
2342
2343 /**
2344  * evergreen_mc_wait_for_idle - wait for MC idle callback.
2345  *
2346  * @rdev: radeon_device pointer
2347  *
2348  * Wait for the MC (memory controller) to be idle.
2349  * (evergreen+).
2350  * Returns 0 if the MC is idle, -1 if not.
2351  */
2352 int evergreen_mc_wait_for_idle(struct radeon_device *rdev)
2353 {
2354         unsigned i;
2355         u32 tmp;
2356
2357         for (i = 0; i < rdev->usec_timeout; i++) {
2358                 /* read MC_STATUS */
2359                 tmp = RREG32(SRBM_STATUS) & 0x1F00;
2360                 if (!tmp)
2361                         return 0;
2362                 udelay(1);
2363         }
2364         return -1;
2365 }
2366
2367 /*
2368  * GART
2369  */
2370 void evergreen_pcie_gart_tlb_flush(struct radeon_device *rdev)
2371 {
2372         unsigned i;
2373         u32 tmp;
2374
2375         WREG32(HDP_MEM_COHERENCY_FLUSH_CNTL, 0x1);
2376
2377         WREG32(VM_CONTEXT0_REQUEST_RESPONSE, REQUEST_TYPE(1));
2378         for (i = 0; i < rdev->usec_timeout; i++) {
2379                 /* read MC_STATUS */
2380                 tmp = RREG32(VM_CONTEXT0_REQUEST_RESPONSE);
2381                 tmp = (tmp & RESPONSE_TYPE_MASK) >> RESPONSE_TYPE_SHIFT;
2382                 if (tmp == 2) {
2383                         pr_warn("[drm] r600 flush TLB failed\n");
2384                         return;
2385                 }
2386                 if (tmp) {
2387                         return;
2388                 }
2389                 udelay(1);
2390         }
2391 }
2392
2393 static int evergreen_pcie_gart_enable(struct radeon_device *rdev)
2394 {
2395         u32 tmp;
2396         int r;
2397
2398         if (rdev->gart.robj == NULL) {
2399                 dev_err(rdev->dev, "No VRAM object for PCIE GART.\n");
2400                 return -EINVAL;
2401         }
2402         r = radeon_gart_table_vram_pin(rdev);
2403         if (r)
2404                 return r;
2405         /* Setup L2 cache */
2406         WREG32(VM_L2_CNTL, ENABLE_L2_CACHE | ENABLE_L2_FRAGMENT_PROCESSING |
2407                                 ENABLE_L2_PTE_CACHE_LRU_UPDATE_BY_WRITE |
2408                                 EFFECTIVE_L2_QUEUE_SIZE(7));
2409         WREG32(VM_L2_CNTL2, 0);
2410         WREG32(VM_L2_CNTL3, BANK_SELECT(0) | CACHE_UPDATE_MODE(2));
2411         /* Setup TLB control */
2412         tmp = ENABLE_L1_TLB | ENABLE_L1_FRAGMENT_PROCESSING |
2413                 SYSTEM_ACCESS_MODE_NOT_IN_SYS |
2414                 SYSTEM_APERTURE_UNMAPPED_ACCESS_PASS_THRU |
2415                 EFFECTIVE_L1_TLB_SIZE(5) | EFFECTIVE_L1_QUEUE_SIZE(5);
2416         if (rdev->flags & RADEON_IS_IGP) {
2417                 WREG32(FUS_MC_VM_MD_L1_TLB0_CNTL, tmp);
2418                 WREG32(FUS_MC_VM_MD_L1_TLB1_CNTL, tmp);
2419                 WREG32(FUS_MC_VM_MD_L1_TLB2_CNTL, tmp);
2420         } else {
2421                 WREG32(MC_VM_MD_L1_TLB0_CNTL, tmp);
2422                 WREG32(MC_VM_MD_L1_TLB1_CNTL, tmp);
2423                 WREG32(MC_VM_MD_L1_TLB2_CNTL, tmp);
2424                 if ((rdev->family == CHIP_JUNIPER) ||
2425                     (rdev->family == CHIP_CYPRESS) ||
2426                     (rdev->family == CHIP_HEMLOCK) ||
2427                     (rdev->family == CHIP_BARTS))
2428                         WREG32(MC_VM_MD_L1_TLB3_CNTL, tmp);
2429         }
2430         WREG32(MC_VM_MB_L1_TLB0_CNTL, tmp);
2431         WREG32(MC_VM_MB_L1_TLB1_CNTL, tmp);
2432         WREG32(MC_VM_MB_L1_TLB2_CNTL, tmp);
2433         WREG32(MC_VM_MB_L1_TLB3_CNTL, tmp);
2434         WREG32(VM_CONTEXT0_PAGE_TABLE_START_ADDR, rdev->mc.gtt_start >> 12);
2435         WREG32(VM_CONTEXT0_PAGE_TABLE_END_ADDR, rdev->mc.gtt_end >> 12);
2436         WREG32(VM_CONTEXT0_PAGE_TABLE_BASE_ADDR, rdev->gart.table_addr >> 12);
2437         WREG32(VM_CONTEXT0_CNTL, ENABLE_CONTEXT | PAGE_TABLE_DEPTH(0) |
2438                                 RANGE_PROTECTION_FAULT_ENABLE_DEFAULT);
2439         WREG32(VM_CONTEXT0_PROTECTION_FAULT_DEFAULT_ADDR,
2440                         (u32)(rdev->dummy_page.addr >> 12));
2441         WREG32(VM_CONTEXT1_CNTL, 0);
2442
2443         evergreen_pcie_gart_tlb_flush(rdev);
2444         DRM_INFO("PCIE GART of %uM enabled (table at 0x%016llX).\n",
2445                  (unsigned)(rdev->mc.gtt_size >> 20),
2446                  (unsigned long long)rdev->gart.table_addr);
2447         rdev->gart.ready = true;
2448         return 0;
2449 }
2450
2451 static void evergreen_pcie_gart_disable(struct radeon_device *rdev)
2452 {
2453         u32 tmp;
2454
2455         /* Disable all tables */
2456         WREG32(VM_CONTEXT0_CNTL, 0);
2457         WREG32(VM_CONTEXT1_CNTL, 0);
2458
2459         /* Setup L2 cache */
2460         WREG32(VM_L2_CNTL, ENABLE_L2_FRAGMENT_PROCESSING |
2461                                 EFFECTIVE_L2_QUEUE_SIZE(7));
2462         WREG32(VM_L2_CNTL2, 0);
2463         WREG32(VM_L2_CNTL3, BANK_SELECT(0) | CACHE_UPDATE_MODE(2));
2464         /* Setup TLB control */
2465         tmp = EFFECTIVE_L1_TLB_SIZE(5) | EFFECTIVE_L1_QUEUE_SIZE(5);
2466         WREG32(MC_VM_MD_L1_TLB0_CNTL, tmp);
2467         WREG32(MC_VM_MD_L1_TLB1_CNTL, tmp);
2468         WREG32(MC_VM_MD_L1_TLB2_CNTL, tmp);
2469         WREG32(MC_VM_MB_L1_TLB0_CNTL, tmp);
2470         WREG32(MC_VM_MB_L1_TLB1_CNTL, tmp);
2471         WREG32(MC_VM_MB_L1_TLB2_CNTL, tmp);
2472         WREG32(MC_VM_MB_L1_TLB3_CNTL, tmp);
2473         radeon_gart_table_vram_unpin(rdev);
2474 }
2475
2476 static void evergreen_pcie_gart_fini(struct radeon_device *rdev)
2477 {
2478         evergreen_pcie_gart_disable(rdev);
2479         radeon_gart_table_vram_free(rdev);
2480         radeon_gart_fini(rdev);
2481 }
2482
2483
2484 static void evergreen_agp_enable(struct radeon_device *rdev)
2485 {
2486         u32 tmp;
2487
2488         /* Setup L2 cache */
2489         WREG32(VM_L2_CNTL, ENABLE_L2_CACHE | ENABLE_L2_FRAGMENT_PROCESSING |
2490                                 ENABLE_L2_PTE_CACHE_LRU_UPDATE_BY_WRITE |
2491                                 EFFECTIVE_L2_QUEUE_SIZE(7));
2492         WREG32(VM_L2_CNTL2, 0);
2493         WREG32(VM_L2_CNTL3, BANK_SELECT(0) | CACHE_UPDATE_MODE(2));
2494         /* Setup TLB control */
2495         tmp = ENABLE_L1_TLB | ENABLE_L1_FRAGMENT_PROCESSING |
2496                 SYSTEM_ACCESS_MODE_NOT_IN_SYS |
2497                 SYSTEM_APERTURE_UNMAPPED_ACCESS_PASS_THRU |
2498                 EFFECTIVE_L1_TLB_SIZE(5) | EFFECTIVE_L1_QUEUE_SIZE(5);
2499         WREG32(MC_VM_MD_L1_TLB0_CNTL, tmp);
2500         WREG32(MC_VM_MD_L1_TLB1_CNTL, tmp);
2501         WREG32(MC_VM_MD_L1_TLB2_CNTL, tmp);
2502         WREG32(MC_VM_MB_L1_TLB0_CNTL, tmp);
2503         WREG32(MC_VM_MB_L1_TLB1_CNTL, tmp);
2504         WREG32(MC_VM_MB_L1_TLB2_CNTL, tmp);
2505         WREG32(MC_VM_MB_L1_TLB3_CNTL, tmp);
2506         WREG32(VM_CONTEXT0_CNTL, 0);
2507         WREG32(VM_CONTEXT1_CNTL, 0);
2508 }
2509
2510 static const unsigned ni_dig_offsets[] =
2511 {
2512         NI_DIG0_REGISTER_OFFSET,
2513         NI_DIG1_REGISTER_OFFSET,
2514         NI_DIG2_REGISTER_OFFSET,
2515         NI_DIG3_REGISTER_OFFSET,
2516         NI_DIG4_REGISTER_OFFSET,
2517         NI_DIG5_REGISTER_OFFSET
2518 };
2519
2520 static const unsigned ni_tx_offsets[] =
2521 {
2522         NI_DCIO_UNIPHY0_UNIPHY_TX_CONTROL1,
2523         NI_DCIO_UNIPHY1_UNIPHY_TX_CONTROL1,
2524         NI_DCIO_UNIPHY2_UNIPHY_TX_CONTROL1,
2525         NI_DCIO_UNIPHY3_UNIPHY_TX_CONTROL1,
2526         NI_DCIO_UNIPHY4_UNIPHY_TX_CONTROL1,
2527         NI_DCIO_UNIPHY5_UNIPHY_TX_CONTROL1
2528 };
2529
2530 static const unsigned evergreen_dp_offsets[] =
2531 {
2532         EVERGREEN_DP0_REGISTER_OFFSET,
2533         EVERGREEN_DP1_REGISTER_OFFSET,
2534         EVERGREEN_DP2_REGISTER_OFFSET,
2535         EVERGREEN_DP3_REGISTER_OFFSET,
2536         EVERGREEN_DP4_REGISTER_OFFSET,
2537         EVERGREEN_DP5_REGISTER_OFFSET
2538 };
2539
2540 static const unsigned evergreen_disp_int_status[] =
2541 {
2542         DISP_INTERRUPT_STATUS,
2543         DISP_INTERRUPT_STATUS_CONTINUE,
2544         DISP_INTERRUPT_STATUS_CONTINUE2,
2545         DISP_INTERRUPT_STATUS_CONTINUE3,
2546         DISP_INTERRUPT_STATUS_CONTINUE4,
2547         DISP_INTERRUPT_STATUS_CONTINUE5
2548 };
2549
2550 /*
2551  * Assumption is that EVERGREEN_CRTC_MASTER_EN enable for requested crtc
2552  * We go from crtc to connector and it is not relible  since it
2553  * should be an opposite direction .If crtc is enable then
2554  * find the dig_fe which selects this crtc and insure that it enable.
2555  * if such dig_fe is found then find dig_be which selects found dig_be and
2556  * insure that it enable and in DP_SST mode.
2557  * if UNIPHY_PLL_CONTROL1.enable then we should disconnect timing
2558  * from dp symbols clocks .
2559  */
2560 static bool evergreen_is_dp_sst_stream_enabled(struct radeon_device *rdev,
2561                                                unsigned crtc_id, unsigned *ret_dig_fe)
2562 {
2563         unsigned i;
2564         unsigned dig_fe;
2565         unsigned dig_be;
2566         unsigned dig_en_be;
2567         unsigned uniphy_pll;
2568         unsigned digs_fe_selected;
2569         unsigned dig_be_mode;
2570         unsigned dig_fe_mask;
2571         bool is_enabled = false;
2572         bool found_crtc = false;
2573
2574         /* loop through all running dig_fe to find selected crtc */
2575         for (i = 0; i < ARRAY_SIZE(ni_dig_offsets); i++) {
2576                 dig_fe = RREG32(NI_DIG_FE_CNTL + ni_dig_offsets[i]);
2577                 if (dig_fe & NI_DIG_FE_CNTL_SYMCLK_FE_ON &&
2578                     crtc_id == NI_DIG_FE_CNTL_SOURCE_SELECT(dig_fe)) {
2579                         /* found running pipe */
2580                         found_crtc = true;
2581                         dig_fe_mask = 1 << i;
2582                         dig_fe = i;
2583                         break;
2584                 }
2585         }
2586
2587         if (found_crtc) {
2588                 /* loop through all running dig_be to find selected dig_fe */
2589                 for (i = 0; i < ARRAY_SIZE(ni_dig_offsets); i++) {
2590                         dig_be = RREG32(NI_DIG_BE_CNTL + ni_dig_offsets[i]);
2591                         /* if dig_fe_selected by dig_be? */
2592                         digs_fe_selected = NI_DIG_BE_CNTL_FE_SOURCE_SELECT(dig_be);
2593                         dig_be_mode = NI_DIG_FE_CNTL_MODE(dig_be);
2594                         if (dig_fe_mask &  digs_fe_selected &&
2595                             /* if dig_be in sst mode? */
2596                             dig_be_mode == NI_DIG_BE_DPSST) {
2597                                 dig_en_be = RREG32(NI_DIG_BE_EN_CNTL +
2598                                                    ni_dig_offsets[i]);
2599                                 uniphy_pll = RREG32(NI_DCIO_UNIPHY0_PLL_CONTROL1 +
2600                                                     ni_tx_offsets[i]);
2601                                 /* dig_be enable and tx is running */
2602                                 if (dig_en_be & NI_DIG_BE_EN_CNTL_ENABLE &&
2603                                     dig_en_be & NI_DIG_BE_EN_CNTL_SYMBCLK_ON &&
2604                                     uniphy_pll & NI_DCIO_UNIPHY0_PLL_CONTROL1_ENABLE) {
2605                                         is_enabled = true;
2606                                         *ret_dig_fe = dig_fe;
2607                                         break;
2608                                 }
2609                         }
2610                 }
2611         }
2612
2613         return is_enabled;
2614 }
2615
2616 /*
2617  * Blank dig when in dp sst mode
2618  * Dig ignores crtc timing
2619  */
2620 static void evergreen_blank_dp_output(struct radeon_device *rdev,
2621                                       unsigned dig_fe)
2622 {
2623         unsigned stream_ctrl;
2624         unsigned fifo_ctrl;
2625         unsigned counter = 0;
2626
2627         if (dig_fe >= ARRAY_SIZE(evergreen_dp_offsets)) {
2628                 DRM_ERROR("invalid dig_fe %d\n", dig_fe);
2629                 return;
2630         }
2631
2632         stream_ctrl = RREG32(EVERGREEN_DP_VID_STREAM_CNTL +
2633                              evergreen_dp_offsets[dig_fe]);
2634         if (!(stream_ctrl & EVERGREEN_DP_VID_STREAM_CNTL_ENABLE)) {
2635                 DRM_ERROR("dig %d , should be enable\n", dig_fe);
2636                 return;
2637         }
2638
2639         stream_ctrl &=~EVERGREEN_DP_VID_STREAM_CNTL_ENABLE;
2640         WREG32(EVERGREEN_DP_VID_STREAM_CNTL +
2641                evergreen_dp_offsets[dig_fe], stream_ctrl);
2642
2643         stream_ctrl = RREG32(EVERGREEN_DP_VID_STREAM_CNTL +
2644                              evergreen_dp_offsets[dig_fe]);
2645         while (counter < 32 && stream_ctrl & EVERGREEN_DP_VID_STREAM_STATUS) {
2646                 msleep(1);
2647                 counter++;
2648                 stream_ctrl = RREG32(EVERGREEN_DP_VID_STREAM_CNTL +
2649                                      evergreen_dp_offsets[dig_fe]);
2650         }
2651         if (counter >= 32 )
2652                 DRM_ERROR("counter exceeds %d\n", counter);
2653
2654         fifo_ctrl = RREG32(EVERGREEN_DP_STEER_FIFO + evergreen_dp_offsets[dig_fe]);
2655         fifo_ctrl |= EVERGREEN_DP_STEER_FIFO_RESET;
2656         WREG32(EVERGREEN_DP_STEER_FIFO + evergreen_dp_offsets[dig_fe], fifo_ctrl);
2657
2658 }
2659
2660 void evergreen_mc_stop(struct radeon_device *rdev, struct evergreen_mc_save *save)
2661 {
2662         u32 crtc_enabled, tmp, frame_count, blackout;
2663         int i, j;
2664         unsigned dig_fe;
2665
2666         if (!ASIC_IS_NODCE(rdev)) {
2667                 save->vga_render_control = RREG32(VGA_RENDER_CONTROL);
2668                 save->vga_hdp_control = RREG32(VGA_HDP_CONTROL);
2669
2670                 /* disable VGA render */
2671                 WREG32(VGA_RENDER_CONTROL, 0);
2672         }
2673         /* blank the display controllers */
2674         for (i = 0; i < rdev->num_crtc; i++) {
2675                 crtc_enabled = RREG32(EVERGREEN_CRTC_CONTROL + crtc_offsets[i]) & EVERGREEN_CRTC_MASTER_EN;
2676                 if (crtc_enabled) {
2677                         save->crtc_enabled[i] = true;
2678                         if (ASIC_IS_DCE6(rdev)) {
2679                                 tmp = RREG32(EVERGREEN_CRTC_BLANK_CONTROL + crtc_offsets[i]);
2680                                 if (!(tmp & EVERGREEN_CRTC_BLANK_DATA_EN)) {
2681                                         radeon_wait_for_vblank(rdev, i);
2682                                         WREG32(EVERGREEN_CRTC_UPDATE_LOCK + crtc_offsets[i], 1);
2683                                         tmp |= EVERGREEN_CRTC_BLANK_DATA_EN;
2684                                         WREG32(EVERGREEN_CRTC_BLANK_CONTROL + crtc_offsets[i], tmp);
2685                                         WREG32(EVERGREEN_CRTC_UPDATE_LOCK + crtc_offsets[i], 0);
2686                                 }
2687                         } else {
2688                                 tmp = RREG32(EVERGREEN_CRTC_CONTROL + crtc_offsets[i]);
2689                                 if (!(tmp & EVERGREEN_CRTC_DISP_READ_REQUEST_DISABLE)) {
2690                                         radeon_wait_for_vblank(rdev, i);
2691                                         WREG32(EVERGREEN_CRTC_UPDATE_LOCK + crtc_offsets[i], 1);
2692                                         tmp |= EVERGREEN_CRTC_DISP_READ_REQUEST_DISABLE;
2693                                         WREG32(EVERGREEN_CRTC_CONTROL + crtc_offsets[i], tmp);
2694                                         WREG32(EVERGREEN_CRTC_UPDATE_LOCK + crtc_offsets[i], 0);
2695                                 }
2696                         }
2697                         /* wait for the next frame */
2698                         frame_count = radeon_get_vblank_counter(rdev, i);
2699                         for (j = 0; j < rdev->usec_timeout; j++) {
2700                                 if (radeon_get_vblank_counter(rdev, i) != frame_count)
2701                                         break;
2702                                 udelay(1);
2703                         }
2704                         /*we should disable dig if it drives dp sst*/
2705                         /*but we are in radeon_device_init and the topology is unknown*/
2706                         /*and it is available after radeon_modeset_init*/
2707                         /*the following method radeon_atom_encoder_dpms_dig*/
2708                         /*does the job if we initialize it properly*/
2709                         /*for now we do it this manually*/
2710                         /**/
2711                         if (ASIC_IS_DCE5(rdev) &&
2712                             evergreen_is_dp_sst_stream_enabled(rdev, i ,&dig_fe))
2713                                 evergreen_blank_dp_output(rdev, dig_fe);
2714                         /*we could remove 6 lines below*/
2715                         /* XXX this is a hack to avoid strange behavior with EFI on certain systems */
2716                         WREG32(EVERGREEN_CRTC_UPDATE_LOCK + crtc_offsets[i], 1);
2717                         tmp = RREG32(EVERGREEN_CRTC_CONTROL + crtc_offsets[i]);
2718                         tmp &= ~EVERGREEN_CRTC_MASTER_EN;
2719                         WREG32(EVERGREEN_CRTC_CONTROL + crtc_offsets[i], tmp);
2720                         WREG32(EVERGREEN_CRTC_UPDATE_LOCK + crtc_offsets[i], 0);
2721                         save->crtc_enabled[i] = false;
2722                         /* ***** */
2723                 } else {
2724                         save->crtc_enabled[i] = false;
2725                 }
2726         }
2727
2728         radeon_mc_wait_for_idle(rdev);
2729
2730         blackout = RREG32(MC_SHARED_BLACKOUT_CNTL);
2731         if ((blackout & BLACKOUT_MODE_MASK) != 1) {
2732                 /* Block CPU access */
2733                 WREG32(BIF_FB_EN, 0);
2734                 /* blackout the MC */
2735                 blackout &= ~BLACKOUT_MODE_MASK;
2736                 WREG32(MC_SHARED_BLACKOUT_CNTL, blackout | 1);
2737         }
2738         /* wait for the MC to settle */
2739         udelay(100);
2740
2741         /* lock double buffered regs */
2742         for (i = 0; i < rdev->num_crtc; i++) {
2743                 if (save->crtc_enabled[i]) {
2744                         tmp = RREG32(EVERGREEN_GRPH_UPDATE + crtc_offsets[i]);
2745                         if (!(tmp & EVERGREEN_GRPH_UPDATE_LOCK)) {
2746                                 tmp |= EVERGREEN_GRPH_UPDATE_LOCK;
2747                                 WREG32(EVERGREEN_GRPH_UPDATE + crtc_offsets[i], tmp);
2748                         }
2749                         tmp = RREG32(EVERGREEN_MASTER_UPDATE_LOCK + crtc_offsets[i]);
2750                         if (!(tmp & 1)) {
2751                                 tmp |= 1;
2752                                 WREG32(EVERGREEN_MASTER_UPDATE_LOCK + crtc_offsets[i], tmp);
2753                         }
2754                 }
2755         }
2756 }
2757
2758 void evergreen_mc_resume(struct radeon_device *rdev, struct evergreen_mc_save *save)
2759 {
2760         u32 tmp, frame_count;
2761         int i, j;
2762
2763         /* update crtc base addresses */
2764         for (i = 0; i < rdev->num_crtc; i++) {
2765                 WREG32(EVERGREEN_GRPH_PRIMARY_SURFACE_ADDRESS_HIGH + crtc_offsets[i],
2766                        upper_32_bits(rdev->mc.vram_start));
2767                 WREG32(EVERGREEN_GRPH_SECONDARY_SURFACE_ADDRESS_HIGH + crtc_offsets[i],
2768                        upper_32_bits(rdev->mc.vram_start));
2769                 WREG32(EVERGREEN_GRPH_PRIMARY_SURFACE_ADDRESS + crtc_offsets[i],
2770                        (u32)rdev->mc.vram_start);
2771                 WREG32(EVERGREEN_GRPH_SECONDARY_SURFACE_ADDRESS + crtc_offsets[i],
2772                        (u32)rdev->mc.vram_start);
2773         }
2774
2775         if (!ASIC_IS_NODCE(rdev)) {
2776                 WREG32(EVERGREEN_VGA_MEMORY_BASE_ADDRESS_HIGH, upper_32_bits(rdev->mc.vram_start));
2777                 WREG32(EVERGREEN_VGA_MEMORY_BASE_ADDRESS, (u32)rdev->mc.vram_start);
2778         }
2779
2780         /* unlock regs and wait for update */
2781         for (i = 0; i < rdev->num_crtc; i++) {
2782                 if (save->crtc_enabled[i]) {
2783                         tmp = RREG32(EVERGREEN_MASTER_UPDATE_MODE + crtc_offsets[i]);
2784                         if ((tmp & 0x7) != 0) {
2785                                 tmp &= ~0x7;
2786                                 WREG32(EVERGREEN_MASTER_UPDATE_MODE + crtc_offsets[i], tmp);
2787                         }
2788                         tmp = RREG32(EVERGREEN_GRPH_UPDATE + crtc_offsets[i]);
2789                         if (tmp & EVERGREEN_GRPH_UPDATE_LOCK) {
2790                                 tmp &= ~EVERGREEN_GRPH_UPDATE_LOCK;
2791                                 WREG32(EVERGREEN_GRPH_UPDATE + crtc_offsets[i], tmp);
2792                         }
2793                         tmp = RREG32(EVERGREEN_MASTER_UPDATE_LOCK + crtc_offsets[i]);
2794                         if (tmp & 1) {
2795                                 tmp &= ~1;
2796                                 WREG32(EVERGREEN_MASTER_UPDATE_LOCK + crtc_offsets[i], tmp);
2797                         }
2798                         for (j = 0; j < rdev->usec_timeout; j++) {
2799                                 tmp = RREG32(EVERGREEN_GRPH_UPDATE + crtc_offsets[i]);
2800                                 if ((tmp & EVERGREEN_GRPH_SURFACE_UPDATE_PENDING) == 0)
2801                                         break;
2802                                 udelay(1);
2803                         }
2804                 }
2805         }
2806
2807         /* unblackout the MC */
2808         tmp = RREG32(MC_SHARED_BLACKOUT_CNTL);
2809         tmp &= ~BLACKOUT_MODE_MASK;
2810         WREG32(MC_SHARED_BLACKOUT_CNTL, tmp);
2811         /* allow CPU access */
2812         WREG32(BIF_FB_EN, FB_READ_EN | FB_WRITE_EN);
2813
2814         for (i = 0; i < rdev->num_crtc; i++) {
2815                 if (save->crtc_enabled[i]) {
2816                         if (ASIC_IS_DCE6(rdev)) {
2817                                 tmp = RREG32(EVERGREEN_CRTC_BLANK_CONTROL + crtc_offsets[i]);
2818                                 tmp &= ~EVERGREEN_CRTC_BLANK_DATA_EN;
2819                                 WREG32(EVERGREEN_CRTC_UPDATE_LOCK + crtc_offsets[i], 1);
2820                                 WREG32(EVERGREEN_CRTC_BLANK_CONTROL + crtc_offsets[i], tmp);
2821                                 WREG32(EVERGREEN_CRTC_UPDATE_LOCK + crtc_offsets[i], 0);
2822                         } else {
2823                                 tmp = RREG32(EVERGREEN_CRTC_CONTROL + crtc_offsets[i]);
2824                                 tmp &= ~EVERGREEN_CRTC_DISP_READ_REQUEST_DISABLE;
2825                                 WREG32(EVERGREEN_CRTC_UPDATE_LOCK + crtc_offsets[i], 1);
2826                                 WREG32(EVERGREEN_CRTC_CONTROL + crtc_offsets[i], tmp);
2827                                 WREG32(EVERGREEN_CRTC_UPDATE_LOCK + crtc_offsets[i], 0);
2828                         }
2829                         /* wait for the next frame */
2830                         frame_count = radeon_get_vblank_counter(rdev, i);
2831                         for (j = 0; j < rdev->usec_timeout; j++) {
2832                                 if (radeon_get_vblank_counter(rdev, i) != frame_count)
2833                                         break;
2834                                 udelay(1);
2835                         }
2836                 }
2837         }
2838         if (!ASIC_IS_NODCE(rdev)) {
2839                 /* Unlock vga access */
2840                 WREG32(VGA_HDP_CONTROL, save->vga_hdp_control);
2841                 mdelay(1);
2842                 WREG32(VGA_RENDER_CONTROL, save->vga_render_control);
2843         }
2844 }
2845
2846 void evergreen_mc_program(struct radeon_device *rdev)
2847 {
2848         struct evergreen_mc_save save;
2849         u32 tmp;
2850         int i, j;
2851
2852         /* Initialize HDP */
2853         for (i = 0, j = 0; i < 32; i++, j += 0x18) {
2854                 WREG32((0x2c14 + j), 0x00000000);
2855                 WREG32((0x2c18 + j), 0x00000000);
2856                 WREG32((0x2c1c + j), 0x00000000);
2857                 WREG32((0x2c20 + j), 0x00000000);
2858                 WREG32((0x2c24 + j), 0x00000000);
2859         }
2860         WREG32(HDP_REG_COHERENCY_FLUSH_CNTL, 0);
2861
2862         evergreen_mc_stop(rdev, &save);
2863         if (evergreen_mc_wait_for_idle(rdev)) {
2864                 dev_warn(rdev->dev, "Wait for MC idle timedout !\n");
2865         }
2866         /* Lockout access through VGA aperture*/
2867         WREG32(VGA_HDP_CONTROL, VGA_MEMORY_DISABLE);
2868         /* Update configuration */
2869         if (rdev->flags & RADEON_IS_AGP) {
2870                 if (rdev->mc.vram_start < rdev->mc.gtt_start) {
2871                         /* VRAM before AGP */
2872                         WREG32(MC_VM_SYSTEM_APERTURE_LOW_ADDR,
2873                                 rdev->mc.vram_start >> 12);
2874                         WREG32(MC_VM_SYSTEM_APERTURE_HIGH_ADDR,
2875                                 rdev->mc.gtt_end >> 12);
2876                 } else {
2877                         /* VRAM after AGP */
2878                         WREG32(MC_VM_SYSTEM_APERTURE_LOW_ADDR,
2879                                 rdev->mc.gtt_start >> 12);
2880                         WREG32(MC_VM_SYSTEM_APERTURE_HIGH_ADDR,
2881                                 rdev->mc.vram_end >> 12);
2882                 }
2883         } else {
2884                 WREG32(MC_VM_SYSTEM_APERTURE_LOW_ADDR,
2885                         rdev->mc.vram_start >> 12);
2886                 WREG32(MC_VM_SYSTEM_APERTURE_HIGH_ADDR,
2887                         rdev->mc.vram_end >> 12);
2888         }
2889         WREG32(MC_VM_SYSTEM_APERTURE_DEFAULT_ADDR, rdev->vram_scratch.gpu_addr >> 12);
2890         /* llano/ontario only */
2891         if ((rdev->family == CHIP_PALM) ||
2892             (rdev->family == CHIP_SUMO) ||
2893             (rdev->family == CHIP_SUMO2)) {
2894                 tmp = RREG32(MC_FUS_VM_FB_OFFSET) & 0x000FFFFF;
2895                 tmp |= ((rdev->mc.vram_end >> 20) & 0xF) << 24;
2896                 tmp |= ((rdev->mc.vram_start >> 20) & 0xF) << 20;
2897                 WREG32(MC_FUS_VM_FB_OFFSET, tmp);
2898         }
2899         tmp = ((rdev->mc.vram_end >> 24) & 0xFFFF) << 16;
2900         tmp |= ((rdev->mc.vram_start >> 24) & 0xFFFF);
2901         WREG32(MC_VM_FB_LOCATION, tmp);
2902         WREG32(HDP_NONSURFACE_BASE, (rdev->mc.vram_start >> 8));
2903         WREG32(HDP_NONSURFACE_INFO, (2 << 7) | (1 << 30));
2904         WREG32(HDP_NONSURFACE_SIZE, 0x3FFFFFFF);
2905         if (rdev->flags & RADEON_IS_AGP) {
2906                 WREG32(MC_VM_AGP_TOP, rdev->mc.gtt_end >> 16);
2907                 WREG32(MC_VM_AGP_BOT, rdev->mc.gtt_start >> 16);
2908                 WREG32(MC_VM_AGP_BASE, rdev->mc.agp_base >> 22);
2909         } else {
2910                 WREG32(MC_VM_AGP_BASE, 0);
2911                 WREG32(MC_VM_AGP_TOP, 0x0FFFFFFF);
2912                 WREG32(MC_VM_AGP_BOT, 0x0FFFFFFF);
2913         }
2914         if (evergreen_mc_wait_for_idle(rdev)) {
2915                 dev_warn(rdev->dev, "Wait for MC idle timedout !\n");
2916         }
2917         evergreen_mc_resume(rdev, &save);
2918         /* we need to own VRAM, so turn off the VGA renderer here
2919          * to stop it overwriting our objects */
2920         rv515_vga_render_disable(rdev);
2921 }
2922
2923 /*
2924  * CP.
2925  */
2926 void evergreen_ring_ib_execute(struct radeon_device *rdev, struct radeon_ib *ib)
2927 {
2928         struct radeon_ring *ring = &rdev->ring[ib->ring];
2929         u32 next_rptr;
2930
2931         /* set to DX10/11 mode */
2932         radeon_ring_write(ring, PACKET3(PACKET3_MODE_CONTROL, 0));
2933         radeon_ring_write(ring, 1);
2934
2935         if (ring->rptr_save_reg) {
2936                 next_rptr = ring->wptr + 3 + 4;
2937                 radeon_ring_write(ring, PACKET3(PACKET3_SET_CONFIG_REG, 1));
2938                 radeon_ring_write(ring, ((ring->rptr_save_reg - 
2939                                           PACKET3_SET_CONFIG_REG_START) >> 2));
2940                 radeon_ring_write(ring, next_rptr);
2941         } else if (rdev->wb.enabled) {
2942                 next_rptr = ring->wptr + 5 + 4;
2943                 radeon_ring_write(ring, PACKET3(PACKET3_MEM_WRITE, 3));
2944                 radeon_ring_write(ring, ring->next_rptr_gpu_addr & 0xfffffffc);
2945                 radeon_ring_write(ring, (upper_32_bits(ring->next_rptr_gpu_addr) & 0xff) | (1 << 18));
2946                 radeon_ring_write(ring, next_rptr);
2947                 radeon_ring_write(ring, 0);
2948         }
2949
2950         radeon_ring_write(ring, PACKET3(PACKET3_INDIRECT_BUFFER, 2));
2951         radeon_ring_write(ring,
2952 #ifdef __BIG_ENDIAN
2953                           (2 << 0) |
2954 #endif
2955                           (ib->gpu_addr & 0xFFFFFFFC));
2956         radeon_ring_write(ring, upper_32_bits(ib->gpu_addr) & 0xFF);
2957         radeon_ring_write(ring, ib->length_dw);
2958 }
2959
2960
2961 static int evergreen_cp_load_microcode(struct radeon_device *rdev)
2962 {
2963         const __be32 *fw_data;
2964         int i;
2965
2966         if (!rdev->me_fw || !rdev->pfp_fw)
2967                 return -EINVAL;
2968
2969         r700_cp_stop(rdev);
2970         WREG32(CP_RB_CNTL,
2971 #ifdef __BIG_ENDIAN
2972                BUF_SWAP_32BIT |
2973 #endif
2974                RB_NO_UPDATE | RB_BLKSZ(15) | RB_BUFSZ(3));
2975
2976         fw_data = (const __be32 *)rdev->pfp_fw->data;
2977         WREG32(CP_PFP_UCODE_ADDR, 0);
2978         for (i = 0; i < EVERGREEN_PFP_UCODE_SIZE; i++)
2979                 WREG32(CP_PFP_UCODE_DATA, be32_to_cpup(fw_data++));
2980         WREG32(CP_PFP_UCODE_ADDR, 0);
2981
2982         fw_data = (const __be32 *)rdev->me_fw->data;
2983         WREG32(CP_ME_RAM_WADDR, 0);
2984         for (i = 0; i < EVERGREEN_PM4_UCODE_SIZE; i++)
2985                 WREG32(CP_ME_RAM_DATA, be32_to_cpup(fw_data++));
2986
2987         WREG32(CP_PFP_UCODE_ADDR, 0);
2988         WREG32(CP_ME_RAM_WADDR, 0);
2989         WREG32(CP_ME_RAM_RADDR, 0);
2990         return 0;
2991 }
2992
2993 static int evergreen_cp_start(struct radeon_device *rdev)
2994 {
2995         struct radeon_ring *ring = &rdev->ring[RADEON_RING_TYPE_GFX_INDEX];
2996         int r, i;
2997         uint32_t cp_me;
2998
2999         r = radeon_ring_lock(rdev, ring, 7);
3000         if (r) {
3001                 DRM_ERROR("radeon: cp failed to lock ring (%d).\n", r);
3002                 return r;
3003         }
3004         radeon_ring_write(ring, PACKET3(PACKET3_ME_INITIALIZE, 5));
3005         radeon_ring_write(ring, 0x1);
3006         radeon_ring_write(ring, 0x0);
3007         radeon_ring_write(ring, rdev->config.evergreen.max_hw_contexts - 1);
3008         radeon_ring_write(ring, PACKET3_ME_INITIALIZE_DEVICE_ID(1));
3009         radeon_ring_write(ring, 0);
3010         radeon_ring_write(ring, 0);
3011         radeon_ring_unlock_commit(rdev, ring, false);
3012
3013         cp_me = 0xff;
3014         WREG32(CP_ME_CNTL, cp_me);
3015
3016         r = radeon_ring_lock(rdev, ring, evergreen_default_size + 19);
3017         if (r) {
3018                 DRM_ERROR("radeon: cp failed to lock ring (%d).\n", r);
3019                 return r;
3020         }
3021
3022         /* setup clear context state */
3023         radeon_ring_write(ring, PACKET3(PACKET3_PREAMBLE_CNTL, 0));
3024         radeon_ring_write(ring, PACKET3_PREAMBLE_BEGIN_CLEAR_STATE);
3025
3026         for (i = 0; i < evergreen_default_size; i++)
3027                 radeon_ring_write(ring, evergreen_default_state[i]);
3028
3029         radeon_ring_write(ring, PACKET3(PACKET3_PREAMBLE_CNTL, 0));
3030         radeon_ring_write(ring, PACKET3_PREAMBLE_END_CLEAR_STATE);
3031
3032         /* set clear context state */
3033         radeon_ring_write(ring, PACKET3(PACKET3_CLEAR_STATE, 0));
3034         radeon_ring_write(ring, 0);
3035
3036         /* SQ_VTX_BASE_VTX_LOC */
3037         radeon_ring_write(ring, 0xc0026f00);
3038         radeon_ring_write(ring, 0x00000000);
3039         radeon_ring_write(ring, 0x00000000);
3040         radeon_ring_write(ring, 0x00000000);
3041
3042         /* Clear consts */
3043         radeon_ring_write(ring, 0xc0036f00);
3044         radeon_ring_write(ring, 0x00000bc4);
3045         radeon_ring_write(ring, 0xffffffff);
3046         radeon_ring_write(ring, 0xffffffff);
3047         radeon_ring_write(ring, 0xffffffff);
3048
3049         radeon_ring_write(ring, 0xc0026900);
3050         radeon_ring_write(ring, 0x00000316);
3051         radeon_ring_write(ring, 0x0000000e); /* VGT_VERTEX_REUSE_BLOCK_CNTL */
3052         radeon_ring_write(ring, 0x00000010); /*  */
3053
3054         radeon_ring_unlock_commit(rdev, ring, false);
3055
3056         return 0;
3057 }
3058
3059 static int evergreen_cp_resume(struct radeon_device *rdev)
3060 {
3061         struct radeon_ring *ring = &rdev->ring[RADEON_RING_TYPE_GFX_INDEX];
3062         u32 tmp;
3063         u32 rb_bufsz;
3064         int r;
3065
3066         /* Reset cp; if cp is reset, then PA, SH, VGT also need to be reset */
3067         WREG32(GRBM_SOFT_RESET, (SOFT_RESET_CP |
3068                                  SOFT_RESET_PA |
3069                                  SOFT_RESET_SH |
3070                                  SOFT_RESET_VGT |
3071                                  SOFT_RESET_SPI |
3072                                  SOFT_RESET_SX));
3073         RREG32(GRBM_SOFT_RESET);
3074         mdelay(15);
3075         WREG32(GRBM_SOFT_RESET, 0);
3076         RREG32(GRBM_SOFT_RESET);
3077
3078         /* Set ring buffer size */
3079         rb_bufsz = order_base_2(ring->ring_size / 8);
3080         tmp = (order_base_2(RADEON_GPU_PAGE_SIZE/8) << 8) | rb_bufsz;
3081 #ifdef __BIG_ENDIAN
3082         tmp |= BUF_SWAP_32BIT;
3083 #endif
3084         WREG32(CP_RB_CNTL, tmp);
3085         WREG32(CP_SEM_WAIT_TIMER, 0x0);
3086         WREG32(CP_SEM_INCOMPLETE_TIMER_CNTL, 0x0);
3087
3088         /* Set the write pointer delay */
3089         WREG32(CP_RB_WPTR_DELAY, 0);
3090
3091         /* Initialize the ring buffer's read and write pointers */
3092         WREG32(CP_RB_CNTL, tmp | RB_RPTR_WR_ENA);
3093         WREG32(CP_RB_RPTR_WR, 0);
3094         ring->wptr = 0;
3095         WREG32(CP_RB_WPTR, ring->wptr);
3096
3097         /* set the wb address whether it's enabled or not */
3098         WREG32(CP_RB_RPTR_ADDR,
3099                ((rdev->wb.gpu_addr + RADEON_WB_CP_RPTR_OFFSET) & 0xFFFFFFFC));
3100         WREG32(CP_RB_RPTR_ADDR_HI, upper_32_bits(rdev->wb.gpu_addr + RADEON_WB_CP_RPTR_OFFSET) & 0xFF);
3101         WREG32(SCRATCH_ADDR, ((rdev->wb.gpu_addr + RADEON_WB_SCRATCH_OFFSET) >> 8) & 0xFFFFFFFF);
3102
3103         if (rdev->wb.enabled)
3104                 WREG32(SCRATCH_UMSK, 0xff);
3105         else {
3106                 tmp |= RB_NO_UPDATE;
3107                 WREG32(SCRATCH_UMSK, 0);
3108         }
3109
3110         mdelay(1);
3111         WREG32(CP_RB_CNTL, tmp);
3112
3113         WREG32(CP_RB_BASE, ring->gpu_addr >> 8);
3114         WREG32(CP_DEBUG, (1 << 27) | (1 << 28));
3115
3116         evergreen_cp_start(rdev);
3117         ring->ready = true;
3118         r = radeon_ring_test(rdev, RADEON_RING_TYPE_GFX_INDEX, ring);
3119         if (r) {
3120                 ring->ready = false;
3121                 return r;
3122         }
3123         return 0;
3124 }
3125
3126 /*
3127  * Core functions
3128  */
3129 static void evergreen_gpu_init(struct radeon_device *rdev)
3130 {
3131         u32 gb_addr_config;
3132         u32 mc_shared_chmap, mc_arb_ramcfg;
3133         u32 sx_debug_1;
3134         u32 smx_dc_ctl0;
3135         u32 sq_config;
3136         u32 sq_lds_resource_mgmt;
3137         u32 sq_gpr_resource_mgmt_1;
3138         u32 sq_gpr_resource_mgmt_2;
3139         u32 sq_gpr_resource_mgmt_3;
3140         u32 sq_thread_resource_mgmt;
3141         u32 sq_thread_resource_mgmt_2;
3142         u32 sq_stack_resource_mgmt_1;
3143         u32 sq_stack_resource_mgmt_2;
3144         u32 sq_stack_resource_mgmt_3;
3145         u32 vgt_cache_invalidation;
3146         u32 hdp_host_path_cntl, tmp;
3147         u32 disabled_rb_mask;
3148         int i, j, ps_thread_count;
3149
3150         switch (rdev->family) {
3151         case CHIP_CYPRESS:
3152         case CHIP_HEMLOCK:
3153                 rdev->config.evergreen.num_ses = 2;
3154                 rdev->config.evergreen.max_pipes = 4;
3155                 rdev->config.evergreen.max_tile_pipes = 8;
3156                 rdev->config.evergreen.max_simds = 10;
3157                 rdev->config.evergreen.max_backends = 4 * rdev->config.evergreen.num_ses;
3158                 rdev->config.evergreen.max_gprs = 256;
3159                 rdev->config.evergreen.max_threads = 248;
3160                 rdev->config.evergreen.max_gs_threads = 32;
3161                 rdev->config.evergreen.max_stack_entries = 512;
3162                 rdev->config.evergreen.sx_num_of_sets = 4;
3163                 rdev->config.evergreen.sx_max_export_size = 256;
3164                 rdev->config.evergreen.sx_max_export_pos_size = 64;
3165                 rdev->config.evergreen.sx_max_export_smx_size = 192;
3166                 rdev->config.evergreen.max_hw_contexts = 8;
3167                 rdev->config.evergreen.sq_num_cf_insts = 2;
3168
3169                 rdev->config.evergreen.sc_prim_fifo_size = 0x100;
3170                 rdev->config.evergreen.sc_hiz_tile_fifo_size = 0x30;
3171                 rdev->config.evergreen.sc_earlyz_tile_fifo_size = 0x130;
3172                 gb_addr_config = CYPRESS_GB_ADDR_CONFIG_GOLDEN;
3173                 break;
3174         case CHIP_JUNIPER:
3175                 rdev->config.evergreen.num_ses = 1;
3176                 rdev->config.evergreen.max_pipes = 4;
3177                 rdev->config.evergreen.max_tile_pipes = 4;
3178                 rdev->config.evergreen.max_simds = 10;
3179                 rdev->config.evergreen.max_backends = 4 * rdev->config.evergreen.num_ses;
3180                 rdev->config.evergreen.max_gprs = 256;
3181                 rdev->config.evergreen.max_threads = 248;
3182                 rdev->config.evergreen.max_gs_threads = 32;
3183                 rdev->config.evergreen.max_stack_entries = 512;
3184                 rdev->config.evergreen.sx_num_of_sets = 4;
3185                 rdev->config.evergreen.sx_max_export_size = 256;
3186                 rdev->config.evergreen.sx_max_export_pos_size = 64;
3187                 rdev->config.evergreen.sx_max_export_smx_size = 192;
3188                 rdev->config.evergreen.max_hw_contexts = 8;
3189                 rdev->config.evergreen.sq_num_cf_insts = 2;
3190
3191                 rdev->config.evergreen.sc_prim_fifo_size = 0x100;
3192                 rdev->config.evergreen.sc_hiz_tile_fifo_size = 0x30;
3193                 rdev->config.evergreen.sc_earlyz_tile_fifo_size = 0x130;
3194                 gb_addr_config = JUNIPER_GB_ADDR_CONFIG_GOLDEN;
3195                 break;
3196         case CHIP_REDWOOD:
3197                 rdev->config.evergreen.num_ses = 1;
3198                 rdev->config.evergreen.max_pipes = 4;
3199                 rdev->config.evergreen.max_tile_pipes = 4;
3200                 rdev->config.evergreen.max_simds = 5;
3201                 rdev->config.evergreen.max_backends = 2 * rdev->config.evergreen.num_ses;
3202                 rdev->config.evergreen.max_gprs = 256;
3203                 rdev->config.evergreen.max_threads = 248;
3204                 rdev->config.evergreen.max_gs_threads = 32;
3205                 rdev->config.evergreen.max_stack_entries = 256;
3206                 rdev->config.evergreen.sx_num_of_sets = 4;
3207                 rdev->config.evergreen.sx_max_export_size = 256;
3208                 rdev->config.evergreen.sx_max_export_pos_size = 64;
3209                 rdev->config.evergreen.sx_max_export_smx_size = 192;
3210                 rdev->config.evergreen.max_hw_contexts = 8;
3211                 rdev->config.evergreen.sq_num_cf_insts = 2;
3212
3213                 rdev->config.evergreen.sc_prim_fifo_size = 0x100;
3214                 rdev->config.evergreen.sc_hiz_tile_fifo_size = 0x30;
3215                 rdev->config.evergreen.sc_earlyz_tile_fifo_size = 0x130;
3216                 gb_addr_config = REDWOOD_GB_ADDR_CONFIG_GOLDEN;
3217                 break;
3218         case CHIP_CEDAR:
3219         default:
3220                 rdev->config.evergreen.num_ses = 1;
3221                 rdev->config.evergreen.max_pipes = 2;
3222                 rdev->config.evergreen.max_tile_pipes = 2;
3223                 rdev->config.evergreen.max_simds = 2;
3224                 rdev->config.evergreen.max_backends = 1 * rdev->config.evergreen.num_ses;
3225                 rdev->config.evergreen.max_gprs = 256;
3226                 rdev->config.evergreen.max_threads = 192;
3227                 rdev->config.evergreen.max_gs_threads = 16;
3228                 rdev->config.evergreen.max_stack_entries = 256;
3229                 rdev->config.evergreen.sx_num_of_sets = 4;
3230                 rdev->config.evergreen.sx_max_export_size = 128;
3231                 rdev->config.evergreen.sx_max_export_pos_size = 32;
3232                 rdev->config.evergreen.sx_max_export_smx_size = 96;
3233                 rdev->config.evergreen.max_hw_contexts = 4;
3234                 rdev->config.evergreen.sq_num_cf_insts = 1;
3235
3236                 rdev->config.evergreen.sc_prim_fifo_size = 0x40;
3237                 rdev->config.evergreen.sc_hiz_tile_fifo_size = 0x30;
3238                 rdev->config.evergreen.sc_earlyz_tile_fifo_size = 0x130;
3239                 gb_addr_config = CEDAR_GB_ADDR_CONFIG_GOLDEN;
3240                 break;
3241         case CHIP_PALM:
3242                 rdev->config.evergreen.num_ses = 1;
3243                 rdev->config.evergreen.max_pipes = 2;
3244                 rdev->config.evergreen.max_tile_pipes = 2;
3245                 rdev->config.evergreen.max_simds = 2;
3246                 rdev->config.evergreen.max_backends = 1 * rdev->config.evergreen.num_ses;
3247                 rdev->config.evergreen.max_gprs = 256;
3248                 rdev->config.evergreen.max_threads = 192;
3249                 rdev->config.evergreen.max_gs_threads = 16;
3250                 rdev->config.evergreen.max_stack_entries = 256;
3251                 rdev->config.evergreen.sx_num_of_sets = 4;
3252                 rdev->config.evergreen.sx_max_export_size = 128;
3253                 rdev->config.evergreen.sx_max_export_pos_size = 32;
3254                 rdev->config.evergreen.sx_max_export_smx_size = 96;
3255                 rdev->config.evergreen.max_hw_contexts = 4;
3256                 rdev->config.evergreen.sq_num_cf_insts = 1;
3257
3258                 rdev->config.evergreen.sc_prim_fifo_size = 0x40;
3259                 rdev->config.evergreen.sc_hiz_tile_fifo_size = 0x30;
3260                 rdev->config.evergreen.sc_earlyz_tile_fifo_size = 0x130;
3261                 gb_addr_config = CEDAR_GB_ADDR_CONFIG_GOLDEN;
3262                 break;
3263         case CHIP_SUMO:
3264                 rdev->config.evergreen.num_ses = 1;
3265                 rdev->config.evergreen.max_pipes = 4;
3266                 rdev->config.evergreen.max_tile_pipes = 4;
3267                 if (rdev->pdev->device == 0x9648)
3268                         rdev->config.evergreen.max_simds = 3;
3269                 else if ((rdev->pdev->device == 0x9647) ||
3270                          (rdev->pdev->device == 0x964a))
3271                         rdev->config.evergreen.max_simds = 4;
3272                 else
3273                         rdev->config.evergreen.max_simds = 5;
3274                 rdev->config.evergreen.max_backends = 2 * rdev->config.evergreen.num_ses;
3275                 rdev->config.evergreen.max_gprs = 256;
3276                 rdev->config.evergreen.max_threads = 248;
3277                 rdev->config.evergreen.max_gs_threads = 32;
3278                 rdev->config.evergreen.max_stack_entries = 256;
3279                 rdev->config.evergreen.sx_num_of_sets = 4;
3280                 rdev->config.evergreen.sx_max_export_size = 256;
3281                 rdev->config.evergreen.sx_max_export_pos_size = 64;
3282                 rdev->config.evergreen.sx_max_export_smx_size = 192;
3283                 rdev->config.evergreen.max_hw_contexts = 8;
3284                 rdev->config.evergreen.sq_num_cf_insts = 2;
3285
3286                 rdev->config.evergreen.sc_prim_fifo_size = 0x40;
3287                 rdev->config.evergreen.sc_hiz_tile_fifo_size = 0x30;
3288                 rdev->config.evergreen.sc_earlyz_tile_fifo_size = 0x130;
3289                 gb_addr_config = SUMO_GB_ADDR_CONFIG_GOLDEN;
3290                 break;
3291         case CHIP_SUMO2:
3292                 rdev->config.evergreen.num_ses = 1;
3293                 rdev->config.evergreen.max_pipes = 4;
3294                 rdev->config.evergreen.max_tile_pipes = 4;
3295                 rdev->config.evergreen.max_simds = 2;
3296                 rdev->config.evergreen.max_backends = 1 * rdev->config.evergreen.num_ses;
3297                 rdev->config.evergreen.max_gprs = 256;
3298                 rdev->config.evergreen.max_threads = 248;
3299                 rdev->config.evergreen.max_gs_threads = 32;
3300                 rdev->config.evergreen.max_stack_entries = 512;
3301                 rdev->config.evergreen.sx_num_of_sets = 4;
3302                 rdev->config.evergreen.sx_max_export_size = 256;
3303                 rdev->config.evergreen.sx_max_export_pos_size = 64;
3304                 rdev->config.evergreen.sx_max_export_smx_size = 192;
3305                 rdev->config.evergreen.max_hw_contexts = 4;
3306                 rdev->config.evergreen.sq_num_cf_insts = 2;
3307
3308                 rdev->config.evergreen.sc_prim_fifo_size = 0x40;
3309                 rdev->config.evergreen.sc_hiz_tile_fifo_size = 0x30;
3310                 rdev->config.evergreen.sc_earlyz_tile_fifo_size = 0x130;
3311                 gb_addr_config = SUMO2_GB_ADDR_CONFIG_GOLDEN;
3312                 break;
3313         case CHIP_BARTS:
3314                 rdev->config.evergreen.num_ses = 2;
3315                 rdev->config.evergreen.max_pipes = 4;
3316                 rdev->config.evergreen.max_tile_pipes = 8;
3317                 rdev->config.evergreen.max_simds = 7;
3318                 rdev->config.evergreen.max_backends = 4 * rdev->config.evergreen.num_ses;
3319                 rdev->config.evergreen.max_gprs = 256;
3320                 rdev->config.evergreen.max_threads = 248;
3321                 rdev->config.evergreen.max_gs_threads = 32;
3322                 rdev->config.evergreen.max_stack_entries = 512;
3323                 rdev->config.evergreen.sx_num_of_sets = 4;
3324                 rdev->config.evergreen.sx_max_export_size = 256;
3325                 rdev->config.evergreen.sx_max_export_pos_size = 64;
3326                 rdev->config.evergreen.sx_max_export_smx_size = 192;
3327                 rdev->config.evergreen.max_hw_contexts = 8;
3328                 rdev->config.evergreen.sq_num_cf_insts = 2;
3329
3330                 rdev->config.evergreen.sc_prim_fifo_size = 0x100;
3331                 rdev->config.evergreen.sc_hiz_tile_fifo_size = 0x30;
3332                 rdev->config.evergreen.sc_earlyz_tile_fifo_size = 0x130;
3333                 gb_addr_config = BARTS_GB_ADDR_CONFIG_GOLDEN;
3334                 break;
3335         case CHIP_TURKS:
3336                 rdev->config.evergreen.num_ses = 1;
3337                 rdev->config.evergreen.max_pipes = 4;
3338                 rdev->config.evergreen.max_tile_pipes = 4;
3339                 rdev->config.evergreen.max_simds = 6;
3340                 rdev->config.evergreen.max_backends = 2 * rdev->config.evergreen.num_ses;
3341                 rdev->config.evergreen.max_gprs = 256;
3342                 rdev->config.evergreen.max_threads = 248;
3343                 rdev->config.evergreen.max_gs_threads = 32;
3344                 rdev->config.evergreen.max_stack_entries = 256;
3345                 rdev->config.evergreen.sx_num_of_sets = 4;
3346                 rdev->config.evergreen.sx_max_export_size = 256;
3347                 rdev->config.evergreen.sx_max_export_pos_size = 64;
3348                 rdev->config.evergreen.sx_max_export_smx_size = 192;
3349                 rdev->config.evergreen.max_hw_contexts = 8;
3350                 rdev->config.evergreen.sq_num_cf_insts = 2;
3351
3352                 rdev->config.evergreen.sc_prim_fifo_size = 0x100;
3353                 rdev->config.evergreen.sc_hiz_tile_fifo_size = 0x30;
3354                 rdev->config.evergreen.sc_earlyz_tile_fifo_size = 0x130;
3355                 gb_addr_config = TURKS_GB_ADDR_CONFIG_GOLDEN;
3356                 break;
3357         case CHIP_CAICOS:
3358                 rdev->config.evergreen.num_ses = 1;
3359                 rdev->config.evergreen.max_pipes = 2;
3360                 rdev->config.evergreen.max_tile_pipes = 2;
3361                 rdev->config.evergreen.max_simds = 2;
3362                 rdev->config.evergreen.max_backends = 1 * rdev->config.evergreen.num_ses;
3363                 rdev->config.evergreen.max_gprs = 256;
3364                 rdev->config.evergreen.max_threads = 192;
3365                 rdev->config.evergreen.max_gs_threads = 16;
3366                 rdev->config.evergreen.max_stack_entries = 256;
3367                 rdev->config.evergreen.sx_num_of_sets = 4;
3368                 rdev->config.evergreen.sx_max_export_size = 128;
3369                 rdev->config.evergreen.sx_max_export_pos_size = 32;
3370                 rdev->config.evergreen.sx_max_export_smx_size = 96;
3371                 rdev->config.evergreen.max_hw_contexts = 4;
3372                 rdev->config.evergreen.sq_num_cf_insts = 1;
3373
3374                 rdev->config.evergreen.sc_prim_fifo_size = 0x40;
3375                 rdev->config.evergreen.sc_hiz_tile_fifo_size = 0x30;
3376                 rdev->config.evergreen.sc_earlyz_tile_fifo_size = 0x130;
3377                 gb_addr_config = CAICOS_GB_ADDR_CONFIG_GOLDEN;
3378                 break;
3379         }
3380
3381         /* Initialize HDP */
3382         for (i = 0, j = 0; i < 32; i++, j += 0x18) {
3383                 WREG32((0x2c14 + j), 0x00000000);
3384                 WREG32((0x2c18 + j), 0x00000000);
3385                 WREG32((0x2c1c + j), 0x00000000);
3386                 WREG32((0x2c20 + j), 0x00000000);
3387                 WREG32((0x2c24 + j), 0x00000000);
3388         }
3389
3390         WREG32(GRBM_CNTL, GRBM_READ_TIMEOUT(0xff));
3391         WREG32(SRBM_INT_CNTL, 0x1);
3392         WREG32(SRBM_INT_ACK, 0x1);
3393
3394         evergreen_fix_pci_max_read_req_size(rdev);
3395
3396         mc_shared_chmap = RREG32(MC_SHARED_CHMAP);
3397         if ((rdev->family == CHIP_PALM) ||
3398             (rdev->family == CHIP_SUMO) ||
3399             (rdev->family == CHIP_SUMO2))
3400                 mc_arb_ramcfg = RREG32(FUS_MC_ARB_RAMCFG);
3401         else
3402                 mc_arb_ramcfg = RREG32(MC_ARB_RAMCFG);
3403
3404         /* setup tiling info dword.  gb_addr_config is not adequate since it does
3405          * not have bank info, so create a custom tiling dword.
3406          * bits 3:0   num_pipes
3407          * bits 7:4   num_banks
3408          * bits 11:8  group_size
3409          * bits 15:12 row_size
3410          */
3411         rdev->config.evergreen.tile_config = 0;
3412         switch (rdev->config.evergreen.max_tile_pipes) {
3413         case 1:
3414         default:
3415                 rdev->config.evergreen.tile_config |= (0 << 0);
3416                 break;
3417         case 2:
3418                 rdev->config.evergreen.tile_config |= (1 << 0);
3419                 break;
3420         case 4:
3421                 rdev->config.evergreen.tile_config |= (2 << 0);
3422                 break;
3423         case 8:
3424                 rdev->config.evergreen.tile_config |= (3 << 0);
3425                 break;
3426         }
3427         /* num banks is 8 on all fusion asics. 0 = 4, 1 = 8, 2 = 16 */
3428         if (rdev->flags & RADEON_IS_IGP)
3429                 rdev->config.evergreen.tile_config |= 1 << 4;
3430         else {
3431                 switch ((mc_arb_ramcfg & NOOFBANK_MASK) >> NOOFBANK_SHIFT) {
3432                 case 0: /* four banks */
3433                         rdev->config.evergreen.tile_config |= 0 << 4;
3434                         break;
3435                 case 1: /* eight banks */
3436                         rdev->config.evergreen.tile_config |= 1 << 4;
3437                         break;
3438                 case 2: /* sixteen banks */
3439                 default:
3440                         rdev->config.evergreen.tile_config |= 2 << 4;
3441                         break;
3442                 }
3443         }
3444         rdev->config.evergreen.tile_config |= 0 << 8;
3445         rdev->config.evergreen.tile_config |=
3446                 ((gb_addr_config & 0x30000000) >> 28) << 12;
3447
3448         if ((rdev->family >= CHIP_CEDAR) && (rdev->family <= CHIP_HEMLOCK)) {
3449                 u32 efuse_straps_4;
3450                 u32 efuse_straps_3;
3451
3452                 efuse_straps_4 = RREG32_RCU(0x204);
3453                 efuse_straps_3 = RREG32_RCU(0x203);
3454                 tmp = (((efuse_straps_4 & 0xf) << 4) |
3455                       ((efuse_straps_3 & 0xf0000000) >> 28));
3456         } else {
3457                 tmp = 0;
3458                 for (i = (rdev->config.evergreen.num_ses - 1); i >= 0; i--) {
3459                         u32 rb_disable_bitmap;
3460
3461                         WREG32(GRBM_GFX_INDEX, INSTANCE_BROADCAST_WRITES | SE_INDEX(i));
3462                         WREG32(RLC_GFX_INDEX, INSTANCE_BROADCAST_WRITES | SE_INDEX(i));
3463                         rb_disable_bitmap = (RREG32(CC_RB_BACKEND_DISABLE) & 0x00ff0000) >> 16;
3464                         tmp <<= 4;
3465                         tmp |= rb_disable_bitmap;
3466                 }
3467         }
3468         /* enabled rb are just the one not disabled :) */
3469         disabled_rb_mask = tmp;
3470         tmp = 0;
3471         for (i = 0; i < rdev->config.evergreen.max_backends; i++)
3472                 tmp |= (1 << i);
3473         /* if all the backends are disabled, fix it up here */
3474         if ((disabled_rb_mask & tmp) == tmp) {
3475                 for (i = 0; i < rdev->config.evergreen.max_backends; i++)
3476                         disabled_rb_mask &= ~(1 << i);
3477         }
3478
3479         for (i = 0; i < rdev->config.evergreen.num_ses; i++) {
3480                 u32 simd_disable_bitmap;
3481
3482                 WREG32(GRBM_GFX_INDEX, INSTANCE_BROADCAST_WRITES | SE_INDEX(i));
3483                 WREG32(RLC_GFX_INDEX, INSTANCE_BROADCAST_WRITES | SE_INDEX(i));
3484                 simd_disable_bitmap = (RREG32(CC_GC_SHADER_PIPE_CONFIG) & 0xffff0000) >> 16;
3485                 simd_disable_bitmap |= 0xffffffff << rdev->config.evergreen.max_simds;
3486                 tmp <<= 16;
3487                 tmp |= simd_disable_bitmap;
3488         }
3489         rdev->config.evergreen.active_simds = hweight32(~tmp);
3490
3491         WREG32(GRBM_GFX_INDEX, INSTANCE_BROADCAST_WRITES | SE_BROADCAST_WRITES);
3492         WREG32(RLC_GFX_INDEX, INSTANCE_BROADCAST_WRITES | SE_BROADCAST_WRITES);
3493
3494         WREG32(GB_ADDR_CONFIG, gb_addr_config);
3495         WREG32(DMIF_ADDR_CONFIG, gb_addr_config);
3496         WREG32(HDP_ADDR_CONFIG, gb_addr_config);
3497         WREG32(DMA_TILING_CONFIG, gb_addr_config);
3498         WREG32(UVD_UDEC_ADDR_CONFIG, gb_addr_config);
3499         WREG32(UVD_UDEC_DB_ADDR_CONFIG, gb_addr_config);
3500         WREG32(UVD_UDEC_DBW_ADDR_CONFIG, gb_addr_config);
3501
3502         if ((rdev->config.evergreen.max_backends == 1) &&
3503             (rdev->flags & RADEON_IS_IGP)) {
3504                 if ((disabled_rb_mask & 3) == 1) {
3505                         /* RB0 disabled, RB1 enabled */
3506                         tmp = 0x11111111;
3507                 } else {
3508                         /* RB1 disabled, RB0 enabled */
3509                         tmp = 0x00000000;
3510                 }
3511         } else {
3512                 tmp = gb_addr_config & NUM_PIPES_MASK;
3513                 tmp = r6xx_remap_render_backend(rdev, tmp, rdev->config.evergreen.max_backends,
3514                                                 EVERGREEN_MAX_BACKENDS, disabled_rb_mask);
3515         }
3516         WREG32(GB_BACKEND_MAP, tmp);
3517
3518         WREG32(CGTS_SYS_TCC_DISABLE, 0);
3519         WREG32(CGTS_TCC_DISABLE, 0);
3520         WREG32(CGTS_USER_SYS_TCC_DISABLE, 0);
3521         WREG32(CGTS_USER_TCC_DISABLE, 0);
3522
3523         /* set HW defaults for 3D engine */
3524         WREG32(CP_QUEUE_THRESHOLDS, (ROQ_IB1_START(0x16) |
3525                                      ROQ_IB2_START(0x2b)));
3526
3527         WREG32(CP_MEQ_THRESHOLDS, STQ_SPLIT(0x30));
3528
3529         WREG32(TA_CNTL_AUX, (DISABLE_CUBE_ANISO |
3530                              SYNC_GRADIENT |
3531                              SYNC_WALKER |
3532                              SYNC_ALIGNER));
3533
3534         sx_debug_1 = RREG32(SX_DEBUG_1);
3535         sx_debug_1 |= ENABLE_NEW_SMX_ADDRESS;
3536         WREG32(SX_DEBUG_1, sx_debug_1);
3537
3538
3539         smx_dc_ctl0 = RREG32(SMX_DC_CTL0);
3540         smx_dc_ctl0 &= ~NUMBER_OF_SETS(0x1ff);
3541         smx_dc_ctl0 |= NUMBER_OF_SETS(rdev->config.evergreen.sx_num_of_sets);
3542         WREG32(SMX_DC_CTL0, smx_dc_ctl0);
3543
3544         if (rdev->family <= CHIP_SUMO2)
3545                 WREG32(SMX_SAR_CTL0, 0x00010000);
3546
3547         WREG32(SX_EXPORT_BUFFER_SIZES, (COLOR_BUFFER_SIZE((rdev->config.evergreen.sx_max_export_size / 4) - 1) |
3548                                         POSITION_BUFFER_SIZE((rdev->config.evergreen.sx_max_export_pos_size / 4) - 1) |
3549                                         SMX_BUFFER_SIZE((rdev->config.evergreen.sx_max_export_smx_size / 4) - 1)));
3550
3551         WREG32(PA_SC_FIFO_SIZE, (SC_PRIM_FIFO_SIZE(rdev->config.evergreen.sc_prim_fifo_size) |
3552                                  SC_HIZ_TILE_FIFO_SIZE(rdev->config.evergreen.sc_hiz_tile_fifo_size) |
3553                                  SC_EARLYZ_TILE_FIFO_SIZE(rdev->config.evergreen.sc_earlyz_tile_fifo_size)));
3554
3555         WREG32(VGT_NUM_INSTANCES, 1);
3556         WREG32(SPI_CONFIG_CNTL, 0);
3557         WREG32(SPI_CONFIG_CNTL_1, VTX_DONE_DELAY(4));
3558         WREG32(CP_PERFMON_CNTL, 0);
3559
3560         WREG32(SQ_MS_FIFO_SIZES, (CACHE_FIFO_SIZE(16 * rdev->config.evergreen.sq_num_cf_insts) |
3561                                   FETCH_FIFO_HIWATER(0x4) |
3562                                   DONE_FIFO_HIWATER(0xe0) |
3563                                   ALU_UPDATE_FIFO_HIWATER(0x8)));
3564
3565         sq_config = RREG32(SQ_CONFIG);
3566         sq_config &= ~(PS_PRIO(3) |
3567                        VS_PRIO(3) |
3568                        GS_PRIO(3) |
3569                        ES_PRIO(3));
3570         sq_config |= (VC_ENABLE |
3571                       EXPORT_SRC_C |
3572                       PS_PRIO(0) |
3573                       VS_PRIO(1) |
3574                       GS_PRIO(2) |
3575                       ES_PRIO(3));
3576
3577         switch (rdev->family) {
3578         case CHIP_CEDAR:
3579         case CHIP_PALM:
3580         case CHIP_SUMO:
3581         case CHIP_SUMO2:
3582         case CHIP_CAICOS:
3583                 /* no vertex cache */
3584                 sq_config &= ~VC_ENABLE;
3585                 break;
3586         default:
3587                 break;
3588         }
3589
3590         sq_lds_resource_mgmt = RREG32(SQ_LDS_RESOURCE_MGMT);
3591
3592         sq_gpr_resource_mgmt_1 = NUM_PS_GPRS((rdev->config.evergreen.max_gprs - (4 * 2))* 12 / 32);
3593         sq_gpr_resource_mgmt_1 |= NUM_VS_GPRS((rdev->config.evergreen.max_gprs - (4 * 2)) * 6 / 32);
3594         sq_gpr_resource_mgmt_1 |= NUM_CLAUSE_TEMP_GPRS(4);
3595         sq_gpr_resource_mgmt_2 = NUM_GS_GPRS((rdev->config.evergreen.max_gprs - (4 * 2)) * 4 / 32);
3596         sq_gpr_resource_mgmt_2 |= NUM_ES_GPRS((rdev->config.evergreen.max_gprs - (4 * 2)) * 4 / 32);
3597         sq_gpr_resource_mgmt_3 = NUM_HS_GPRS((rdev->config.evergreen.max_gprs - (4 * 2)) * 3 / 32);
3598         sq_gpr_resource_mgmt_3 |= NUM_LS_GPRS((rdev->config.evergreen.max_gprs - (4 * 2)) * 3 / 32);
3599
3600         switch (rdev->family) {
3601         case CHIP_CEDAR:
3602         case CHIP_PALM:
3603         case CHIP_SUMO:
3604         case CHIP_SUMO2:
3605                 ps_thread_count = 96;
3606                 break;
3607         default:
3608                 ps_thread_count = 128;
3609                 break;
3610         }
3611
3612         sq_thread_resource_mgmt = NUM_PS_THREADS(ps_thread_count);
3613         sq_thread_resource_mgmt |= NUM_VS_THREADS((((rdev->config.evergreen.max_threads - ps_thread_count) / 6) / 8) * 8);
3614         sq_thread_resource_mgmt |= NUM_GS_THREADS((((rdev->config.evergreen.max_threads - ps_thread_count) / 6) / 8) * 8);
3615         sq_thread_resource_mgmt |= NUM_ES_THREADS((((rdev->config.evergreen.max_threads - ps_thread_count) / 6) / 8) * 8);
3616         sq_thread_resource_mgmt_2 = NUM_HS_THREADS((((rdev->config.evergreen.max_threads - ps_thread_count) / 6) / 8) * 8);
3617         sq_thread_resource_mgmt_2 |= NUM_LS_THREADS((((rdev->config.evergreen.max_threads - ps_thread_count) / 6) / 8) * 8);
3618
3619         sq_stack_resource_mgmt_1 = NUM_PS_STACK_ENTRIES((rdev->config.evergreen.max_stack_entries * 1) / 6);
3620         sq_stack_resource_mgmt_1 |= NUM_VS_STACK_ENTRIES((rdev->config.evergreen.max_stack_entries * 1) / 6);
3621         sq_stack_resource_mgmt_2 = NUM_GS_STACK_ENTRIES((rdev->config.evergreen.max_stack_entries * 1) / 6);
3622         sq_stack_resource_mgmt_2 |= NUM_ES_STACK_ENTRIES((rdev->config.evergreen.max_stack_entries * 1) / 6);
3623         sq_stack_resource_mgmt_3 = NUM_HS_STACK_ENTRIES((rdev->config.evergreen.max_stack_entries * 1) / 6);
3624         sq_stack_resource_mgmt_3 |= NUM_LS_STACK_ENTRIES((rdev->config.evergreen.max_stack_entries * 1) / 6);
3625
3626         WREG32(SQ_CONFIG, sq_config);
3627         WREG32(SQ_GPR_RESOURCE_MGMT_1, sq_gpr_resource_mgmt_1);
3628         WREG32(SQ_GPR_RESOURCE_MGMT_2, sq_gpr_resource_mgmt_2);
3629         WREG32(SQ_GPR_RESOURCE_MGMT_3, sq_gpr_resource_mgmt_3);
3630         WREG32(SQ_THREAD_RESOURCE_MGMT, sq_thread_resource_mgmt);
3631         WREG32(SQ_THREAD_RESOURCE_MGMT_2, sq_thread_resource_mgmt_2);
3632         WREG32(SQ_STACK_RESOURCE_MGMT_1, sq_stack_resource_mgmt_1);
3633         WREG32(SQ_STACK_RESOURCE_MGMT_2, sq_stack_resource_mgmt_2);
3634         WREG32(SQ_STACK_RESOURCE_MGMT_3, sq_stack_resource_mgmt_3);
3635         WREG32(SQ_DYN_GPR_CNTL_PS_FLUSH_REQ, 0);
3636         WREG32(SQ_LDS_RESOURCE_MGMT, sq_lds_resource_mgmt);
3637
3638         WREG32(PA_SC_FORCE_EOV_MAX_CNTS, (FORCE_EOV_MAX_CLK_CNT(4095) |
3639                                           FORCE_EOV_MAX_REZ_CNT(255)));
3640
3641         switch (rdev->family) {
3642         case CHIP_CEDAR:
3643         case CHIP_PALM:
3644         case CHIP_SUMO:
3645         case CHIP_SUMO2:
3646         case CHIP_CAICOS:
3647                 vgt_cache_invalidation = CACHE_INVALIDATION(TC_ONLY);
3648                 break;
3649         default:
3650                 vgt_cache_invalidation = CACHE_INVALIDATION(VC_AND_TC);
3651                 break;
3652         }
3653         vgt_cache_invalidation |= AUTO_INVLD_EN(ES_AND_GS_AUTO);
3654         WREG32(VGT_CACHE_INVALIDATION, vgt_cache_invalidation);
3655
3656         WREG32(VGT_GS_VERTEX_REUSE, 16);
3657         WREG32(PA_SU_LINE_STIPPLE_VALUE, 0);
3658         WREG32(PA_SC_LINE_STIPPLE_STATE, 0);
3659
3660         WREG32(VGT_VERTEX_REUSE_BLOCK_CNTL, 14);
3661         WREG32(VGT_OUT_DEALLOC_CNTL, 16);
3662
3663         WREG32(CB_PERF_CTR0_SEL_0, 0);
3664         WREG32(CB_PERF_CTR0_SEL_1, 0);
3665         WREG32(CB_PERF_CTR1_SEL_0, 0);
3666         WREG32(CB_PERF_CTR1_SEL_1, 0);
3667         WREG32(CB_PERF_CTR2_SEL_0, 0);
3668         WREG32(CB_PERF_CTR2_SEL_1, 0);
3669         WREG32(CB_PERF_CTR3_SEL_0, 0);
3670         WREG32(CB_PERF_CTR3_SEL_1, 0);
3671
3672         /* clear render buffer base addresses */
3673         WREG32(CB_COLOR0_BASE, 0);
3674         WREG32(CB_COLOR1_BASE, 0);
3675         WREG32(CB_COLOR2_BASE, 0);
3676         WREG32(CB_COLOR3_BASE, 0);
3677         WREG32(CB_COLOR4_BASE, 0);
3678         WREG32(CB_COLOR5_BASE, 0);
3679         WREG32(CB_COLOR6_BASE, 0);
3680         WREG32(CB_COLOR7_BASE, 0);
3681         WREG32(CB_COLOR8_BASE, 0);
3682         WREG32(CB_COLOR9_BASE, 0);
3683         WREG32(CB_COLOR10_BASE, 0);
3684         WREG32(CB_COLOR11_BASE, 0);
3685
3686         /* set the shader const cache sizes to 0 */
3687         for (i = SQ_ALU_CONST_BUFFER_SIZE_PS_0; i < 0x28200; i += 4)
3688                 WREG32(i, 0);
3689         for (i = SQ_ALU_CONST_BUFFER_SIZE_HS_0; i < 0x29000; i += 4)
3690                 WREG32(i, 0);
3691
3692         tmp = RREG32(HDP_MISC_CNTL);
3693         tmp |= HDP_FLUSH_INVALIDATE_CACHE;
3694         WREG32(HDP_MISC_CNTL, tmp);
3695
3696         hdp_host_path_cntl = RREG32(HDP_HOST_PATH_CNTL);
3697         WREG32(HDP_HOST_PATH_CNTL, hdp_host_path_cntl);
3698
3699         WREG32(PA_CL_ENHANCE, CLIP_VTX_REORDER_ENA | NUM_CLIP_SEQ(3));
3700
3701         udelay(50);
3702
3703 }
3704
3705 int evergreen_mc_init(struct radeon_device *rdev)
3706 {
3707         u32 tmp;
3708         int chansize, numchan;
3709
3710         /* Get VRAM informations */
3711         rdev->mc.vram_is_ddr = true;
3712         if ((rdev->family == CHIP_PALM) ||
3713             (rdev->family == CHIP_SUMO) ||
3714             (rdev->family == CHIP_SUMO2))
3715                 tmp = RREG32(FUS_MC_ARB_RAMCFG);
3716         else
3717                 tmp = RREG32(MC_ARB_RAMCFG);
3718         if (tmp & CHANSIZE_OVERRIDE) {
3719                 chansize = 16;
3720         } else if (tmp & CHANSIZE_MASK) {
3721                 chansize = 64;
3722         } else {
3723                 chansize = 32;
3724         }
3725         tmp = RREG32(MC_SHARED_CHMAP);
3726         switch ((tmp & NOOFCHAN_MASK) >> NOOFCHAN_SHIFT) {
3727         case 0:
3728         default:
3729                 numchan = 1;
3730                 break;
3731         case 1:
3732                 numchan = 2;
3733                 break;
3734         case 2:
3735                 numchan = 4;
3736                 break;
3737         case 3:
3738                 numchan = 8;
3739                 break;
3740         }
3741         rdev->mc.vram_width = numchan * chansize;
3742         /* Could aper size report 0 ? */
3743         rdev->mc.aper_base = pci_resource_start(rdev->pdev, 0);
3744         rdev->mc.aper_size = pci_resource_len(rdev->pdev, 0);
3745         /* Setup GPU memory space */
3746         if ((rdev->family == CHIP_PALM) ||
3747             (rdev->family == CHIP_SUMO) ||
3748             (rdev->family == CHIP_SUMO2)) {
3749                 /* size in bytes on fusion */
3750                 rdev->mc.mc_vram_size = RREG32(CONFIG_MEMSIZE);
3751                 rdev->mc.real_vram_size = RREG32(CONFIG_MEMSIZE);
3752         } else {
3753                 /* size in MB on evergreen/cayman/tn */
3754                 rdev->mc.mc_vram_size = RREG32(CONFIG_MEMSIZE) * 1024ULL * 1024ULL;
3755                 rdev->mc.real_vram_size = RREG32(CONFIG_MEMSIZE) * 1024ULL * 1024ULL;
3756         }
3757         rdev->mc.visible_vram_size = rdev->mc.aper_size;
3758         r700_vram_gtt_location(rdev, &rdev->mc);
3759         radeon_update_bandwidth_info(rdev);
3760
3761         return 0;
3762 }
3763
3764 void evergreen_print_gpu_status_regs(struct radeon_device *rdev)
3765 {
3766         dev_info(rdev->dev, "  GRBM_STATUS               = 0x%08X\n",
3767                 RREG32(GRBM_STATUS));
3768         dev_info(rdev->dev, "  GRBM_STATUS_SE0           = 0x%08X\n",
3769                 RREG32(GRBM_STATUS_SE0));
3770         dev_info(rdev->dev, "  GRBM_STATUS_SE1           = 0x%08X\n",
3771                 RREG32(GRBM_STATUS_SE1));
3772         dev_info(rdev->dev, "  SRBM_STATUS               = 0x%08X\n",
3773                 RREG32(SRBM_STATUS));
3774         dev_info(rdev->dev, "  SRBM_STATUS2              = 0x%08X\n",
3775                 RREG32(SRBM_STATUS2));
3776         dev_info(rdev->dev, "  R_008674_CP_STALLED_STAT1 = 0x%08X\n",
3777                 RREG32(CP_STALLED_STAT1));
3778         dev_info(rdev->dev, "  R_008678_CP_STALLED_STAT2 = 0x%08X\n",
3779                 RREG32(CP_STALLED_STAT2));
3780         dev_info(rdev->dev, "  R_00867C_CP_BUSY_STAT     = 0x%08X\n",
3781                 RREG32(CP_BUSY_STAT));
3782         dev_info(rdev->dev, "  R_008680_CP_STAT          = 0x%08X\n",
3783                 RREG32(CP_STAT));
3784         dev_info(rdev->dev, "  R_00D034_DMA_STATUS_REG   = 0x%08X\n",
3785                 RREG32(DMA_STATUS_REG));
3786         if (rdev->family >= CHIP_CAYMAN) {
3787                 dev_info(rdev->dev, "  R_00D834_DMA_STATUS_REG   = 0x%08X\n",
3788                          RREG32(DMA_STATUS_REG + 0x800));
3789         }
3790 }
3791
3792 bool evergreen_is_display_hung(struct radeon_device *rdev)
3793 {
3794         u32 crtc_hung = 0;
3795         u32 crtc_status[6];
3796         u32 i, j, tmp;
3797
3798         for (i = 0; i < rdev->num_crtc; i++) {
3799                 if (RREG32(EVERGREEN_CRTC_CONTROL + crtc_offsets[i]) & EVERGREEN_CRTC_MASTER_EN) {
3800                         crtc_status[i] = RREG32(EVERGREEN_CRTC_STATUS_HV_COUNT + crtc_offsets[i]);
3801                         crtc_hung |= (1 << i);
3802                 }
3803         }
3804
3805         for (j = 0; j < 10; j++) {
3806                 for (i = 0; i < rdev->num_crtc; i++) {
3807                         if (crtc_hung & (1 << i)) {
3808                                 tmp = RREG32(EVERGREEN_CRTC_STATUS_HV_COUNT + crtc_offsets[i]);
3809                                 if (tmp != crtc_status[i])
3810                                         crtc_hung &= ~(1 << i);
3811                         }
3812                 }
3813                 if (crtc_hung == 0)
3814                         return false;
3815                 udelay(100);
3816         }
3817
3818         return true;
3819 }
3820
3821 u32 evergreen_gpu_check_soft_reset(struct radeon_device *rdev)
3822 {
3823         u32 reset_mask = 0;
3824         u32 tmp;
3825
3826         /* GRBM_STATUS */
3827         tmp = RREG32(GRBM_STATUS);
3828         if (tmp & (PA_BUSY | SC_BUSY |
3829                    SH_BUSY | SX_BUSY |
3830                    TA_BUSY | VGT_BUSY |
3831                    DB_BUSY | CB_BUSY |
3832                    SPI_BUSY | VGT_BUSY_NO_DMA))
3833                 reset_mask |= RADEON_RESET_GFX;
3834
3835         if (tmp & (CF_RQ_PENDING | PF_RQ_PENDING |
3836                    CP_BUSY | CP_COHERENCY_BUSY))
3837                 reset_mask |= RADEON_RESET_CP;
3838
3839         if (tmp & GRBM_EE_BUSY)
3840                 reset_mask |= RADEON_RESET_GRBM | RADEON_RESET_GFX | RADEON_RESET_CP;
3841
3842         /* DMA_STATUS_REG */
3843         tmp = RREG32(DMA_STATUS_REG);
3844         if (!(tmp & DMA_IDLE))
3845                 reset_mask |= RADEON_RESET_DMA;
3846
3847         /* SRBM_STATUS2 */
3848         tmp = RREG32(SRBM_STATUS2);
3849         if (tmp & DMA_BUSY)
3850                 reset_mask |= RADEON_RESET_DMA;
3851
3852         /* SRBM_STATUS */
3853         tmp = RREG32(SRBM_STATUS);
3854         if (tmp & (RLC_RQ_PENDING | RLC_BUSY))
3855                 reset_mask |= RADEON_RESET_RLC;
3856
3857         if (tmp & IH_BUSY)
3858                 reset_mask |= RADEON_RESET_IH;
3859
3860         if (tmp & SEM_BUSY)
3861                 reset_mask |= RADEON_RESET_SEM;
3862
3863         if (tmp & GRBM_RQ_PENDING)
3864                 reset_mask |= RADEON_RESET_GRBM;
3865
3866         if (tmp & VMC_BUSY)
3867                 reset_mask |= RADEON_RESET_VMC;
3868
3869         if (tmp & (MCB_BUSY | MCB_NON_DISPLAY_BUSY |
3870                    MCC_BUSY | MCD_BUSY))
3871                 reset_mask |= RADEON_RESET_MC;
3872
3873         if (evergreen_is_display_hung(rdev))
3874                 reset_mask |= RADEON_RESET_DISPLAY;
3875
3876         /* VM_L2_STATUS */
3877         tmp = RREG32(VM_L2_STATUS);
3878         if (tmp & L2_BUSY)
3879                 reset_mask |= RADEON_RESET_VMC;
3880
3881         /* Skip MC reset as it's mostly likely not hung, just busy */
3882         if (reset_mask & RADEON_RESET_MC) {
3883                 DRM_DEBUG("MC busy: 0x%08X, clearing.\n", reset_mask);
3884                 reset_mask &= ~RADEON_RESET_MC;
3885         }
3886
3887         return reset_mask;
3888 }
3889
3890 static void evergreen_gpu_soft_reset(struct radeon_device *rdev, u32 reset_mask)
3891 {
3892         struct evergreen_mc_save save;
3893         u32 grbm_soft_reset = 0, srbm_soft_reset = 0;
3894         u32 tmp;
3895
3896         if (reset_mask == 0)
3897                 return;
3898
3899         dev_info(rdev->dev, "GPU softreset: 0x%08X\n", reset_mask);
3900
3901         evergreen_print_gpu_status_regs(rdev);
3902
3903         /* Disable CP parsing/prefetching */
3904         WREG32(CP_ME_CNTL, CP_ME_HALT | CP_PFP_HALT);
3905
3906         if (reset_mask & RADEON_RESET_DMA) {
3907                 /* Disable DMA */
3908                 tmp = RREG32(DMA_RB_CNTL);
3909                 tmp &= ~DMA_RB_ENABLE;
3910                 WREG32(DMA_RB_CNTL, tmp);
3911         }
3912
3913         udelay(50);
3914
3915         evergreen_mc_stop(rdev, &save);
3916         if (evergreen_mc_wait_for_idle(rdev)) {
3917                 dev_warn(rdev->dev, "Wait for MC idle timedout !\n");
3918         }
3919
3920         if (reset_mask & (RADEON_RESET_GFX | RADEON_RESET_COMPUTE)) {
3921                 grbm_soft_reset |= SOFT_RESET_DB |
3922                         SOFT_RESET_CB |
3923                         SOFT_RESET_PA |
3924                         SOFT_RESET_SC |
3925                         SOFT_RESET_SPI |
3926                         SOFT_RESET_SX |
3927                         SOFT_RESET_SH |
3928                         SOFT_RESET_TC |
3929                         SOFT_RESET_TA |
3930                         SOFT_RESET_VC |
3931                         SOFT_RESET_VGT;
3932         }
3933
3934         if (reset_mask & RADEON_RESET_CP) {
3935                 grbm_soft_reset |= SOFT_RESET_CP |
3936                         SOFT_RESET_VGT;
3937
3938                 srbm_soft_reset |= SOFT_RESET_GRBM;
3939         }
3940
3941         if (reset_mask & RADEON_RESET_DMA)
3942                 srbm_soft_reset |= SOFT_RESET_DMA;
3943
3944         if (reset_mask & RADEON_RESET_DISPLAY)
3945                 srbm_soft_reset |= SOFT_RESET_DC;
3946
3947         if (reset_mask & RADEON_RESET_RLC)
3948                 srbm_soft_reset |= SOFT_RESET_RLC;
3949
3950         if (reset_mask & RADEON_RESET_SEM)
3951                 srbm_soft_reset |= SOFT_RESET_SEM;
3952
3953         if (reset_mask & RADEON_RESET_IH)
3954                 srbm_soft_reset |= SOFT_RESET_IH;
3955
3956         if (reset_mask & RADEON_RESET_GRBM)
3957                 srbm_soft_reset |= SOFT_RESET_GRBM;
3958
3959         if (reset_mask & RADEON_RESET_VMC)
3960                 srbm_soft_reset |= SOFT_RESET_VMC;
3961
3962         if (!(rdev->flags & RADEON_IS_IGP)) {
3963                 if (reset_mask & RADEON_RESET_MC)
3964                         srbm_soft_reset |= SOFT_RESET_MC;
3965         }
3966
3967         if (grbm_soft_reset) {
3968                 tmp = RREG32(GRBM_SOFT_RESET);
3969                 tmp |= grbm_soft_reset;
3970                 dev_info(rdev->dev, "GRBM_SOFT_RESET=0x%08X\n", tmp);
3971                 WREG32(GRBM_SOFT_RESET, tmp);
3972                 tmp = RREG32(GRBM_SOFT_RESET);
3973
3974                 udelay(50);
3975
3976                 tmp &= ~grbm_soft_reset;
3977                 WREG32(GRBM_SOFT_RESET, tmp);
3978                 tmp = RREG32(GRBM_SOFT_RESET);
3979         }
3980
3981         if (srbm_soft_reset) {
3982                 tmp = RREG32(SRBM_SOFT_RESET);
3983                 tmp |= srbm_soft_reset;
3984                 dev_info(rdev->dev, "SRBM_SOFT_RESET=0x%08X\n", tmp);
3985                 WREG32(SRBM_SOFT_RESET, tmp);
3986                 tmp = RREG32(SRBM_SOFT_RESET);
3987
3988                 udelay(50);
3989
3990                 tmp &= ~srbm_soft_reset;
3991                 WREG32(SRBM_SOFT_RESET, tmp);
3992                 tmp = RREG32(SRBM_SOFT_RESET);
3993         }
3994
3995         /* Wait a little for things to settle down */
3996         udelay(50);
3997
3998         evergreen_mc_resume(rdev, &save);
3999         udelay(50);
4000
4001         evergreen_print_gpu_status_regs(rdev);
4002 }
4003
4004 void evergreen_gpu_pci_config_reset(struct radeon_device *rdev)
4005 {
4006         struct evergreen_mc_save save;
4007         u32 tmp, i;
4008
4009         dev_info(rdev->dev, "GPU pci config reset\n");
4010
4011         /* disable dpm? */
4012
4013         /* Disable CP parsing/prefetching */
4014         WREG32(CP_ME_CNTL, CP_ME_HALT | CP_PFP_HALT);
4015         udelay(50);
4016         /* Disable DMA */
4017         tmp = RREG32(DMA_RB_CNTL);
4018         tmp &= ~DMA_RB_ENABLE;
4019         WREG32(DMA_RB_CNTL, tmp);
4020         /* XXX other engines? */
4021
4022         /* halt the rlc */
4023         r600_rlc_stop(rdev);
4024
4025         udelay(50);
4026
4027         /* set mclk/sclk to bypass */
4028         rv770_set_clk_bypass_mode(rdev);
4029         /* disable BM */
4030         pci_clear_master(rdev->pdev);
4031         /* disable mem access */
4032         evergreen_mc_stop(rdev, &save);
4033         if (evergreen_mc_wait_for_idle(rdev)) {
4034                 dev_warn(rdev->dev, "Wait for MC idle timed out !\n");
4035         }
4036         /* reset */
4037         radeon_pci_config_reset(rdev);
4038         /* wait for asic to come out of reset */
4039         for (i = 0; i < rdev->usec_timeout; i++) {
4040                 if (RREG32(CONFIG_MEMSIZE) != 0xffffffff)
4041                         break;
4042                 udelay(1);
4043         }
4044 }
4045
4046 int evergreen_asic_reset(struct radeon_device *rdev, bool hard)
4047 {
4048         u32 reset_mask;
4049
4050         if (hard) {
4051                 evergreen_gpu_pci_config_reset(rdev);
4052                 return 0;
4053         }
4054
4055         reset_mask = evergreen_gpu_check_soft_reset(rdev);
4056
4057         if (reset_mask)
4058                 r600_set_bios_scratch_engine_hung(rdev, true);
4059
4060         /* try soft reset */
4061         evergreen_gpu_soft_reset(rdev, reset_mask);
4062
4063         reset_mask = evergreen_gpu_check_soft_reset(rdev);
4064
4065         /* try pci config reset */
4066         if (reset_mask && radeon_hard_reset)
4067                 evergreen_gpu_pci_config_reset(rdev);
4068
4069         reset_mask = evergreen_gpu_check_soft_reset(rdev);
4070
4071         if (!reset_mask)
4072                 r600_set_bios_scratch_engine_hung(rdev, false);
4073
4074         return 0;
4075 }
4076
4077 /**
4078  * evergreen_gfx_is_lockup - Check if the GFX engine is locked up
4079  *
4080  * @rdev: radeon_device pointer
4081  * @ring: radeon_ring structure holding ring information
4082  *
4083  * Check if the GFX engine is locked up.
4084  * Returns true if the engine appears to be locked up, false if not.
4085  */
4086 bool evergreen_gfx_is_lockup(struct radeon_device *rdev, struct radeon_ring *ring)
4087 {
4088         u32 reset_mask = evergreen_gpu_check_soft_reset(rdev);
4089
4090         if (!(reset_mask & (RADEON_RESET_GFX |
4091                             RADEON_RESET_COMPUTE |
4092                             RADEON_RESET_CP))) {
4093                 radeon_ring_lockup_update(rdev, ring);
4094                 return false;
4095         }
4096         return radeon_ring_test_lockup(rdev, ring);
4097 }
4098
4099 /*
4100  * RLC
4101  */
4102 #define RLC_SAVE_RESTORE_LIST_END_MARKER    0x00000000
4103 #define RLC_CLEAR_STATE_END_MARKER          0x00000001
4104
4105 void sumo_rlc_fini(struct radeon_device *rdev)
4106 {
4107         int r;
4108
4109         /* save restore block */
4110         if (rdev->rlc.save_restore_obj) {
4111                 r = radeon_bo_reserve(rdev->rlc.save_restore_obj, false);
4112                 if (unlikely(r != 0))
4113                         dev_warn(rdev->dev, "(%d) reserve RLC sr bo failed\n", r);
4114                 radeon_bo_unpin(rdev->rlc.save_restore_obj);
4115                 radeon_bo_unreserve(rdev->rlc.save_restore_obj);
4116
4117                 radeon_bo_unref(&rdev->rlc.save_restore_obj);
4118                 rdev->rlc.save_restore_obj = NULL;
4119         }
4120
4121         /* clear state block */
4122         if (rdev->rlc.clear_state_obj) {
4123                 r = radeon_bo_reserve(rdev->rlc.clear_state_obj, false);
4124                 if (unlikely(r != 0))
4125                         dev_warn(rdev->dev, "(%d) reserve RLC c bo failed\n", r);
4126                 radeon_bo_unpin(rdev->rlc.clear_state_obj);
4127                 radeon_bo_unreserve(rdev->rlc.clear_state_obj);
4128
4129                 radeon_bo_unref(&rdev->rlc.clear_state_obj);
4130                 rdev->rlc.clear_state_obj = NULL;
4131         }
4132
4133         /* clear state block */
4134         if (rdev->rlc.cp_table_obj) {
4135                 r = radeon_bo_reserve(rdev->rlc.cp_table_obj, false);
4136                 if (unlikely(r != 0))
4137                         dev_warn(rdev->dev, "(%d) reserve RLC cp table bo failed\n", r);
4138                 radeon_bo_unpin(rdev->rlc.cp_table_obj);
4139                 radeon_bo_unreserve(rdev->rlc.cp_table_obj);
4140
4141                 radeon_bo_unref(&rdev->rlc.cp_table_obj);
4142                 rdev->rlc.cp_table_obj = NULL;
4143         }
4144 }
4145
4146 #define CP_ME_TABLE_SIZE    96
4147
4148 int sumo_rlc_init(struct radeon_device *rdev)
4149 {
4150         const u32 *src_ptr;
4151         volatile u32 *dst_ptr;
4152         u32 dws, data, i, j, k, reg_num;
4153         u32 reg_list_num, reg_list_hdr_blk_index, reg_list_blk_index = 0;
4154         u64 reg_list_mc_addr;
4155         const struct cs_section_def *cs_data;
4156         int r;
4157
4158         src_ptr = rdev->rlc.reg_list;
4159         dws = rdev->rlc.reg_list_size;
4160         if (rdev->family >= CHIP_BONAIRE) {
4161                 dws += (5 * 16) + 48 + 48 + 64;
4162         }
4163         cs_data = rdev->rlc.cs_data;
4164
4165         if (src_ptr) {
4166                 /* save restore block */
4167                 if (rdev->rlc.save_restore_obj == NULL) {
4168                         r = radeon_bo_create(rdev, dws * 4, PAGE_SIZE, true,
4169                                              RADEON_GEM_DOMAIN_VRAM, 0, NULL,
4170                                              NULL, &rdev->rlc.save_restore_obj);
4171                         if (r) {
4172                                 dev_warn(rdev->dev, "(%d) create RLC sr bo failed\n", r);
4173                                 return r;
4174                         }
4175                 }
4176
4177                 r = radeon_bo_reserve(rdev->rlc.save_restore_obj, false);
4178                 if (unlikely(r != 0)) {
4179                         sumo_rlc_fini(rdev);
4180                         return r;
4181                 }
4182                 r = radeon_bo_pin(rdev->rlc.save_restore_obj, RADEON_GEM_DOMAIN_VRAM,
4183                                   &rdev->rlc.save_restore_gpu_addr);
4184                 if (r) {
4185                         radeon_bo_unreserve(rdev->rlc.save_restore_obj);
4186                         dev_warn(rdev->dev, "(%d) pin RLC sr bo failed\n", r);
4187                         sumo_rlc_fini(rdev);
4188                         return r;
4189                 }
4190
4191                 r = radeon_bo_kmap(rdev->rlc.save_restore_obj, (void **)&rdev->rlc.sr_ptr);
4192                 if (r) {
4193                         dev_warn(rdev->dev, "(%d) map RLC sr bo failed\n", r);
4194                         sumo_rlc_fini(rdev);
4195                         return r;
4196                 }
4197                 /* write the sr buffer */
4198                 dst_ptr = rdev->rlc.sr_ptr;
4199                 if (rdev->family >= CHIP_TAHITI) {
4200                         /* SI */
4201                         for (i = 0; i < rdev->rlc.reg_list_size; i++)
4202                                 dst_ptr[i] = cpu_to_le32(src_ptr[i]);
4203                 } else {
4204                         /* ON/LN/TN */
4205                         /* format:
4206                          * dw0: (reg2 << 16) | reg1
4207                          * dw1: reg1 save space
4208                          * dw2: reg2 save space
4209                          */
4210                         for (i = 0; i < dws; i++) {
4211                                 data = src_ptr[i] >> 2;
4212                                 i++;
4213                                 if (i < dws)
4214                                         data |= (src_ptr[i] >> 2) << 16;
4215                                 j = (((i - 1) * 3) / 2);
4216                                 dst_ptr[j] = cpu_to_le32(data);
4217                         }
4218                         j = ((i * 3) / 2);
4219                         dst_ptr[j] = cpu_to_le32(RLC_SAVE_RESTORE_LIST_END_MARKER);
4220                 }
4221                 radeon_bo_kunmap(rdev->rlc.save_restore_obj);
4222                 radeon_bo_unreserve(rdev->rlc.save_restore_obj);
4223         }
4224
4225         if (cs_data) {
4226                 /* clear state block */
4227                 if (rdev->family >= CHIP_BONAIRE) {
4228                         rdev->rlc.clear_state_size = dws = cik_get_csb_size(rdev);
4229                 } else if (rdev->family >= CHIP_TAHITI) {
4230                         rdev->rlc.clear_state_size = si_get_csb_size(rdev);
4231                         dws = rdev->rlc.clear_state_size + (256 / 4);
4232                 } else {
4233                         reg_list_num = 0;
4234                         dws = 0;
4235                         for (i = 0; cs_data[i].section != NULL; i++) {
4236                                 for (j = 0; cs_data[i].section[j].extent != NULL; j++) {
4237                                         reg_list_num++;
4238                                         dws += cs_data[i].section[j].reg_count;
4239                                 }
4240                         }
4241                         reg_list_blk_index = (3 * reg_list_num + 2);
4242                         dws += reg_list_blk_index;
4243                         rdev->rlc.clear_state_size = dws;
4244                 }
4245
4246                 if (rdev->rlc.clear_state_obj == NULL) {
4247                         r = radeon_bo_create(rdev, dws * 4, PAGE_SIZE, true,
4248                                              RADEON_GEM_DOMAIN_VRAM, 0, NULL,
4249                                              NULL, &rdev->rlc.clear_state_obj);
4250                         if (r) {
4251                                 dev_warn(rdev->dev, "(%d) create RLC c bo failed\n", r);
4252                                 sumo_rlc_fini(rdev);
4253                                 return r;
4254                         }
4255                 }
4256                 r = radeon_bo_reserve(rdev->rlc.clear_state_obj, false);
4257                 if (unlikely(r != 0)) {
4258                         sumo_rlc_fini(rdev);
4259                         return r;
4260                 }
4261                 r = radeon_bo_pin(rdev->rlc.clear_state_obj, RADEON_GEM_DOMAIN_VRAM,
4262                                   &rdev->rlc.clear_state_gpu_addr);
4263                 if (r) {
4264                         radeon_bo_unreserve(rdev->rlc.clear_state_obj);
4265                         dev_warn(rdev->dev, "(%d) pin RLC c bo failed\n", r);
4266                         sumo_rlc_fini(rdev);
4267                         return r;
4268                 }
4269
4270                 r = radeon_bo_kmap(rdev->rlc.clear_state_obj, (void **)&rdev->rlc.cs_ptr);
4271                 if (r) {
4272                         dev_warn(rdev->dev, "(%d) map RLC c bo failed\n", r);
4273                         sumo_rlc_fini(rdev);
4274                         return r;
4275                 }
4276                 /* set up the cs buffer */
4277                 dst_ptr = rdev->rlc.cs_ptr;
4278                 if (rdev->family >= CHIP_BONAIRE) {
4279                         cik_get_csb_buffer(rdev, dst_ptr);
4280                 } else if (rdev->family >= CHIP_TAHITI) {
4281                         reg_list_mc_addr = rdev->rlc.clear_state_gpu_addr + 256;
4282                         dst_ptr[0] = cpu_to_le32(upper_32_bits(reg_list_mc_addr));
4283                         dst_ptr[1] = cpu_to_le32(lower_32_bits(reg_list_mc_addr));
4284                         dst_ptr[2] = cpu_to_le32(rdev->rlc.clear_state_size);
4285                         si_get_csb_buffer(rdev, &dst_ptr[(256/4)]);
4286                 } else {
4287                         reg_list_hdr_blk_index = 0;
4288                         reg_list_mc_addr = rdev->rlc.clear_state_gpu_addr + (reg_list_blk_index * 4);
4289                         data = upper_32_bits(reg_list_mc_addr);
4290                         dst_ptr[reg_list_hdr_blk_index] = cpu_to_le32(data);
4291                         reg_list_hdr_blk_index++;
4292                         for (i = 0; cs_data[i].section != NULL; i++) {
4293                                 for (j = 0; cs_data[i].section[j].extent != NULL; j++) {
4294                                         reg_num = cs_data[i].section[j].reg_count;
4295                                         data = reg_list_mc_addr & 0xffffffff;
4296                                         dst_ptr[reg_list_hdr_blk_index] = cpu_to_le32(data);
4297                                         reg_list_hdr_blk_index++;
4298
4299                                         data = (cs_data[i].section[j].reg_index * 4) & 0xffffffff;
4300                                         dst_ptr[reg_list_hdr_blk_index] = cpu_to_le32(data);
4301                                         reg_list_hdr_blk_index++;
4302
4303                                         data = 0x08000000 | (reg_num * 4);
4304                                         dst_ptr[reg_list_hdr_blk_index] = cpu_to_le32(data);
4305                                         reg_list_hdr_blk_index++;
4306
4307                                         for (k = 0; k < reg_num; k++) {
4308                                                 data = cs_data[i].section[j].extent[k];
4309                                                 dst_ptr[reg_list_blk_index + k] = cpu_to_le32(data);
4310                                         }
4311                                         reg_list_mc_addr += reg_num * 4;
4312                                         reg_list_blk_index += reg_num;
4313                                 }
4314                         }
4315                         dst_ptr[reg_list_hdr_blk_index] = cpu_to_le32(RLC_CLEAR_STATE_END_MARKER);
4316                 }
4317                 radeon_bo_kunmap(rdev->rlc.clear_state_obj);
4318                 radeon_bo_unreserve(rdev->rlc.clear_state_obj);
4319         }
4320
4321         if (rdev->rlc.cp_table_size) {
4322                 if (rdev->rlc.cp_table_obj == NULL) {
4323                         r = radeon_bo_create(rdev, rdev->rlc.cp_table_size,
4324                                              PAGE_SIZE, true,
4325                                              RADEON_GEM_DOMAIN_VRAM, 0, NULL,
4326                                              NULL, &rdev->rlc.cp_table_obj);
4327                         if (r) {
4328                                 dev_warn(rdev->dev, "(%d) create RLC cp table bo failed\n", r);
4329                                 sumo_rlc_fini(rdev);
4330                                 return r;
4331                         }
4332                 }
4333
4334                 r = radeon_bo_reserve(rdev->rlc.cp_table_obj, false);
4335                 if (unlikely(r != 0)) {
4336                         dev_warn(rdev->dev, "(%d) reserve RLC cp table bo failed\n", r);
4337                         sumo_rlc_fini(rdev);
4338                         return r;
4339                 }
4340                 r = radeon_bo_pin(rdev->rlc.cp_table_obj, RADEON_GEM_DOMAIN_VRAM,
4341                                   &rdev->rlc.cp_table_gpu_addr);
4342                 if (r) {
4343                         radeon_bo_unreserve(rdev->rlc.cp_table_obj);
4344                         dev_warn(rdev->dev, "(%d) pin RLC cp_table bo failed\n", r);
4345                         sumo_rlc_fini(rdev);
4346                         return r;
4347                 }
4348                 r = radeon_bo_kmap(rdev->rlc.cp_table_obj, (void **)&rdev->rlc.cp_table_ptr);
4349                 if (r) {
4350                         dev_warn(rdev->dev, "(%d) map RLC cp table bo failed\n", r);
4351                         sumo_rlc_fini(rdev);
4352                         return r;
4353                 }
4354
4355                 cik_init_cp_pg_table(rdev);
4356
4357                 radeon_bo_kunmap(rdev->rlc.cp_table_obj);
4358                 radeon_bo_unreserve(rdev->rlc.cp_table_obj);
4359
4360         }
4361
4362         return 0;
4363 }
4364
4365 static void evergreen_rlc_start(struct radeon_device *rdev)
4366 {
4367         u32 mask = RLC_ENABLE;
4368
4369         if (rdev->flags & RADEON_IS_IGP) {
4370                 mask |= GFX_POWER_GATING_ENABLE | GFX_POWER_GATING_SRC;
4371         }
4372
4373         WREG32(RLC_CNTL, mask);
4374 }
4375
4376 int evergreen_rlc_resume(struct radeon_device *rdev)
4377 {
4378         u32 i;
4379         const __be32 *fw_data;
4380
4381         if (!rdev->rlc_fw)
4382                 return -EINVAL;
4383
4384         r600_rlc_stop(rdev);
4385
4386         WREG32(RLC_HB_CNTL, 0);
4387
4388         if (rdev->flags & RADEON_IS_IGP) {
4389                 if (rdev->family == CHIP_ARUBA) {
4390                         u32 always_on_bitmap =
4391                                 3 | (3 << (16 * rdev->config.cayman.max_shader_engines));
4392                         /* find out the number of active simds */
4393                         u32 tmp = (RREG32(CC_GC_SHADER_PIPE_CONFIG) & 0xffff0000) >> 16;
4394                         tmp |= 0xffffffff << rdev->config.cayman.max_simds_per_se;
4395                         tmp = hweight32(~tmp);
4396                         if (tmp == rdev->config.cayman.max_simds_per_se) {
4397                                 WREG32(TN_RLC_LB_ALWAYS_ACTIVE_SIMD_MASK, always_on_bitmap);
4398                                 WREG32(TN_RLC_LB_PARAMS, 0x00601004);
4399                                 WREG32(TN_RLC_LB_INIT_SIMD_MASK, 0xffffffff);
4400                                 WREG32(TN_RLC_LB_CNTR_INIT, 0x00000000);
4401                                 WREG32(TN_RLC_LB_CNTR_MAX, 0x00002000);
4402                         }
4403                 } else {
4404                         WREG32(RLC_HB_WPTR_LSB_ADDR, 0);
4405                         WREG32(RLC_HB_WPTR_MSB_ADDR, 0);
4406                 }
4407                 WREG32(TN_RLC_SAVE_AND_RESTORE_BASE, rdev->rlc.save_restore_gpu_addr >> 8);
4408                 WREG32(TN_RLC_CLEAR_STATE_RESTORE_BASE, rdev->rlc.clear_state_gpu_addr >> 8);
4409         } else {
4410                 WREG32(RLC_HB_BASE, 0);
4411                 WREG32(RLC_HB_RPTR, 0);
4412                 WREG32(RLC_HB_WPTR, 0);
4413                 WREG32(RLC_HB_WPTR_LSB_ADDR, 0);
4414                 WREG32(RLC_HB_WPTR_MSB_ADDR, 0);
4415         }
4416         WREG32(RLC_MC_CNTL, 0);
4417         WREG32(RLC_UCODE_CNTL, 0);
4418
4419         fw_data = (const __be32 *)rdev->rlc_fw->data;
4420         if (rdev->family >= CHIP_ARUBA) {
4421                 for (i = 0; i < ARUBA_RLC_UCODE_SIZE; i++) {
4422                         WREG32(RLC_UCODE_ADDR, i);
4423                         WREG32(RLC_UCODE_DATA, be32_to_cpup(fw_data++));
4424                 }
4425         } else if (rdev->family >= CHIP_CAYMAN) {
4426                 for (i = 0; i < CAYMAN_RLC_UCODE_SIZE; i++) {
4427                         WREG32(RLC_UCODE_ADDR, i);
4428                         WREG32(RLC_UCODE_DATA, be32_to_cpup(fw_data++));
4429                 }
4430         } else {
4431                 for (i = 0; i < EVERGREEN_RLC_UCODE_SIZE; i++) {
4432                         WREG32(RLC_UCODE_ADDR, i);
4433                         WREG32(RLC_UCODE_DATA, be32_to_cpup(fw_data++));
4434                 }
4435         }
4436         WREG32(RLC_UCODE_ADDR, 0);
4437
4438         evergreen_rlc_start(rdev);
4439
4440         return 0;
4441 }
4442
4443 /* Interrupts */
4444
4445 u32 evergreen_get_vblank_counter(struct radeon_device *rdev, int crtc)
4446 {
4447         if (crtc >= rdev->num_crtc)
4448                 return 0;
4449         else
4450                 return RREG32(CRTC_STATUS_FRAME_COUNT + crtc_offsets[crtc]);
4451 }
4452
4453 void evergreen_disable_interrupt_state(struct radeon_device *rdev)
4454 {
4455         int i;
4456         u32 tmp;
4457
4458         if (rdev->family >= CHIP_CAYMAN) {
4459                 cayman_cp_int_cntl_setup(rdev, 0,
4460                                          CNTX_BUSY_INT_ENABLE | CNTX_EMPTY_INT_ENABLE);
4461                 cayman_cp_int_cntl_setup(rdev, 1, 0);
4462                 cayman_cp_int_cntl_setup(rdev, 2, 0);
4463                 tmp = RREG32(CAYMAN_DMA1_CNTL) & ~TRAP_ENABLE;
4464                 WREG32(CAYMAN_DMA1_CNTL, tmp);
4465         } else
4466                 WREG32(CP_INT_CNTL, CNTX_BUSY_INT_ENABLE | CNTX_EMPTY_INT_ENABLE);
4467         tmp = RREG32(DMA_CNTL) & ~TRAP_ENABLE;
4468         WREG32(DMA_CNTL, tmp);
4469         WREG32(GRBM_INT_CNTL, 0);
4470         WREG32(SRBM_INT_CNTL, 0);
4471         for (i = 0; i < rdev->num_crtc; i++)
4472                 WREG32(INT_MASK + crtc_offsets[i], 0);
4473         for (i = 0; i < rdev->num_crtc; i++)
4474                 WREG32(GRPH_INT_CONTROL + crtc_offsets[i], 0);
4475
4476         /* only one DAC on DCE5 */
4477         if (!ASIC_IS_DCE5(rdev))
4478                 WREG32(DACA_AUTODETECT_INT_CONTROL, 0);
4479         WREG32(DACB_AUTODETECT_INT_CONTROL, 0);
4480
4481         for (i = 0; i < 6; i++)
4482                 WREG32_AND(DC_HPDx_INT_CONTROL(i), DC_HPDx_INT_POLARITY);
4483 }
4484
4485 /* Note that the order we write back regs here is important */
4486 int evergreen_irq_set(struct radeon_device *rdev)
4487 {
4488         int i;
4489         u32 cp_int_cntl = CNTX_BUSY_INT_ENABLE | CNTX_EMPTY_INT_ENABLE;
4490         u32 cp_int_cntl1 = 0, cp_int_cntl2 = 0;
4491         u32 grbm_int_cntl = 0;
4492         u32 dma_cntl, dma_cntl1 = 0;
4493         u32 thermal_int = 0;
4494
4495         if (!rdev->irq.installed) {
4496                 WARN(1, "Can't enable IRQ/MSI because no handler is installed\n");
4497                 return -EINVAL;
4498         }
4499         /* don't enable anything if the ih is disabled */
4500         if (!rdev->ih.enabled) {
4501                 r600_disable_interrupts(rdev);
4502                 /* force the active interrupt state to all disabled */
4503                 evergreen_disable_interrupt_state(rdev);
4504                 return 0;
4505         }
4506
4507         if (rdev->family == CHIP_ARUBA)
4508                 thermal_int = RREG32(TN_CG_THERMAL_INT_CTRL) &
4509                         ~(THERM_INT_MASK_HIGH | THERM_INT_MASK_LOW);
4510         else
4511                 thermal_int = RREG32(CG_THERMAL_INT) &
4512                         ~(THERM_INT_MASK_HIGH | THERM_INT_MASK_LOW);
4513
4514         dma_cntl = RREG32(DMA_CNTL) & ~TRAP_ENABLE;
4515
4516         if (rdev->family >= CHIP_CAYMAN) {
4517                 /* enable CP interrupts on all rings */
4518                 if (atomic_read(&rdev->irq.ring_int[RADEON_RING_TYPE_GFX_INDEX])) {
4519                         DRM_DEBUG("evergreen_irq_set: sw int gfx\n");
4520                         cp_int_cntl |= TIME_STAMP_INT_ENABLE;
4521                 }
4522                 if (atomic_read(&rdev->irq.ring_int[CAYMAN_RING_TYPE_CP1_INDEX])) {
4523                         DRM_DEBUG("evergreen_irq_set: sw int cp1\n");
4524                         cp_int_cntl1 |= TIME_STAMP_INT_ENABLE;
4525                 }
4526                 if (atomic_read(&rdev->irq.ring_int[CAYMAN_RING_TYPE_CP2_INDEX])) {
4527                         DRM_DEBUG("evergreen_irq_set: sw int cp2\n");
4528                         cp_int_cntl2 |= TIME_STAMP_INT_ENABLE;
4529                 }
4530         } else {
4531                 if (atomic_read(&rdev->irq.ring_int[RADEON_RING_TYPE_GFX_INDEX])) {
4532                         DRM_DEBUG("evergreen_irq_set: sw int gfx\n");
4533                         cp_int_cntl |= RB_INT_ENABLE;
4534                         cp_int_cntl |= TIME_STAMP_INT_ENABLE;
4535                 }
4536         }
4537
4538         if (atomic_read(&rdev->irq.ring_int[R600_RING_TYPE_DMA_INDEX])) {
4539                 DRM_DEBUG("r600_irq_set: sw int dma\n");
4540                 dma_cntl |= TRAP_ENABLE;
4541         }
4542
4543         if (rdev->family >= CHIP_CAYMAN) {
4544                 dma_cntl1 = RREG32(CAYMAN_DMA1_CNTL) & ~TRAP_ENABLE;
4545                 if (atomic_read(&rdev->irq.ring_int[CAYMAN_RING_TYPE_DMA1_INDEX])) {
4546                         DRM_DEBUG("r600_irq_set: sw int dma1\n");
4547                         dma_cntl1 |= TRAP_ENABLE;
4548                 }
4549         }
4550
4551         if (rdev->irq.dpm_thermal) {
4552                 DRM_DEBUG("dpm thermal\n");
4553                 thermal_int |= THERM_INT_MASK_HIGH | THERM_INT_MASK_LOW;
4554         }
4555
4556         if (rdev->family >= CHIP_CAYMAN) {
4557                 cayman_cp_int_cntl_setup(rdev, 0, cp_int_cntl);
4558                 cayman_cp_int_cntl_setup(rdev, 1, cp_int_cntl1);
4559                 cayman_cp_int_cntl_setup(rdev, 2, cp_int_cntl2);
4560         } else
4561                 WREG32(CP_INT_CNTL, cp_int_cntl);
4562
4563         WREG32(DMA_CNTL, dma_cntl);
4564
4565         if (rdev->family >= CHIP_CAYMAN)
4566                 WREG32(CAYMAN_DMA1_CNTL, dma_cntl1);
4567
4568         WREG32(GRBM_INT_CNTL, grbm_int_cntl);
4569
4570         for (i = 0; i < rdev->num_crtc; i++) {
4571                 radeon_irq_kms_set_irq_n_enabled(
4572                     rdev, INT_MASK + crtc_offsets[i],
4573                     VBLANK_INT_MASK,
4574                     rdev->irq.crtc_vblank_int[i] ||
4575                     atomic_read(&rdev->irq.pflip[i]), "vblank", i);
4576         }
4577
4578         for (i = 0; i < rdev->num_crtc; i++)
4579                 WREG32(GRPH_INT_CONTROL + crtc_offsets[i], GRPH_PFLIP_INT_MASK);
4580
4581         for (i = 0; i < 6; i++) {
4582                 radeon_irq_kms_set_irq_n_enabled(
4583                     rdev, DC_HPDx_INT_CONTROL(i),
4584                     DC_HPDx_INT_EN | DC_HPDx_RX_INT_EN,
4585                     rdev->irq.hpd[i], "HPD", i);
4586         }
4587
4588         if (rdev->family == CHIP_ARUBA)
4589                 WREG32(TN_CG_THERMAL_INT_CTRL, thermal_int);
4590         else
4591                 WREG32(CG_THERMAL_INT, thermal_int);
4592
4593         for (i = 0; i < 6; i++) {
4594                 radeon_irq_kms_set_irq_n_enabled(
4595                     rdev, AFMT_AUDIO_PACKET_CONTROL + crtc_offsets[i],
4596                     AFMT_AZ_FORMAT_WTRIG_MASK,
4597                     rdev->irq.afmt[i], "HDMI", i);
4598         }
4599
4600         /* posting read */
4601         RREG32(SRBM_STATUS);
4602
4603         return 0;
4604 }
4605
4606 /* Note that the order we write back regs here is important */
4607 static void evergreen_irq_ack(struct radeon_device *rdev)
4608 {
4609         int i, j;
4610         u32 *grph_int = rdev->irq.stat_regs.evergreen.grph_int;
4611         u32 *disp_int = rdev->irq.stat_regs.evergreen.disp_int;
4612         u32 *afmt_status = rdev->irq.stat_regs.evergreen.afmt_status;
4613
4614         for (i = 0; i < 6; i++) {
4615                 disp_int[i] = RREG32(evergreen_disp_int_status[i]);
4616                 afmt_status[i] = RREG32(AFMT_STATUS + crtc_offsets[i]);
4617                 if (i < rdev->num_crtc)
4618                         grph_int[i] = RREG32(GRPH_INT_STATUS + crtc_offsets[i]);
4619         }
4620
4621         /* We write back each interrupt register in pairs of two */
4622         for (i = 0; i < rdev->num_crtc; i += 2) {
4623                 for (j = i; j < (i + 2); j++) {
4624                         if (grph_int[j] & GRPH_PFLIP_INT_OCCURRED)
4625                                 WREG32(GRPH_INT_STATUS + crtc_offsets[j],
4626                                        GRPH_PFLIP_INT_CLEAR);
4627                 }
4628
4629                 for (j = i; j < (i + 2); j++) {
4630                         if (disp_int[j] & LB_D1_VBLANK_INTERRUPT)
4631                                 WREG32(VBLANK_STATUS + crtc_offsets[j],
4632                                        VBLANK_ACK);
4633                         if (disp_int[j] & LB_D1_VLINE_INTERRUPT)
4634                                 WREG32(VLINE_STATUS + crtc_offsets[j],
4635                                        VLINE_ACK);
4636                 }
4637         }
4638
4639         for (i = 0; i < 6; i++) {
4640                 if (disp_int[i] & DC_HPD1_INTERRUPT)
4641                         WREG32_OR(DC_HPDx_INT_CONTROL(i), DC_HPDx_INT_ACK);
4642         }
4643
4644         for (i = 0; i < 6; i++) {
4645                 if (disp_int[i] & DC_HPD1_RX_INTERRUPT)
4646                         WREG32_OR(DC_HPDx_INT_CONTROL(i), DC_HPDx_RX_INT_ACK);
4647         }
4648
4649         for (i = 0; i < 6; i++) {
4650                 if (afmt_status[i] & AFMT_AZ_FORMAT_WTRIG)
4651                         WREG32_OR(AFMT_AUDIO_PACKET_CONTROL + crtc_offsets[i],
4652                                   AFMT_AZ_FORMAT_WTRIG_ACK);
4653         }
4654 }
4655
4656 static void evergreen_irq_disable(struct radeon_device *rdev)
4657 {
4658         r600_disable_interrupts(rdev);
4659         /* Wait and acknowledge irq */
4660         mdelay(1);
4661         evergreen_irq_ack(rdev);
4662         evergreen_disable_interrupt_state(rdev);
4663 }
4664
4665 void evergreen_irq_suspend(struct radeon_device *rdev)
4666 {
4667         evergreen_irq_disable(rdev);
4668         r600_rlc_stop(rdev);
4669 }
4670
4671 static u32 evergreen_get_ih_wptr(struct radeon_device *rdev)
4672 {
4673         u32 wptr, tmp;
4674
4675         if (rdev->wb.enabled)
4676                 wptr = le32_to_cpu(rdev->wb.wb[R600_WB_IH_WPTR_OFFSET/4]);
4677         else
4678                 wptr = RREG32(IH_RB_WPTR);
4679
4680         if (wptr & RB_OVERFLOW) {
4681                 wptr &= ~RB_OVERFLOW;
4682                 /* When a ring buffer overflow happen start parsing interrupt
4683                  * from the last not overwritten vector (wptr + 16). Hopefully
4684                  * this should allow us to catchup.
4685                  */
4686                 dev_warn(rdev->dev, "IH ring buffer overflow (0x%08X, 0x%08X, 0x%08X)\n",
4687                          wptr, rdev->ih.rptr, (wptr + 16) & rdev->ih.ptr_mask);
4688                 rdev->ih.rptr = (wptr + 16) & rdev->ih.ptr_mask;
4689                 tmp = RREG32(IH_RB_CNTL);
4690                 tmp |= IH_WPTR_OVERFLOW_CLEAR;
4691                 WREG32(IH_RB_CNTL, tmp);
4692         }
4693         return (wptr & rdev->ih.ptr_mask);
4694 }
4695
4696 int evergreen_irq_process(struct radeon_device *rdev)
4697 {
4698         u32 *disp_int = rdev->irq.stat_regs.evergreen.disp_int;
4699         u32 *afmt_status = rdev->irq.stat_regs.evergreen.afmt_status;
4700         u32 crtc_idx, hpd_idx, afmt_idx;
4701         u32 mask;
4702         u32 wptr;
4703         u32 rptr;
4704         u32 src_id, src_data;
4705         u32 ring_index;
4706         bool queue_hotplug = false;
4707         bool queue_hdmi = false;
4708         bool queue_dp = false;
4709         bool queue_thermal = false;
4710         u32 status, addr;
4711         const char *event_name;
4712
4713         if (!rdev->ih.enabled || rdev->shutdown)
4714                 return IRQ_NONE;
4715
4716         wptr = evergreen_get_ih_wptr(rdev);
4717
4718 restart_ih:
4719         /* is somebody else already processing irqs? */
4720         if (atomic_xchg(&rdev->ih.lock, 1))
4721                 return IRQ_NONE;
4722
4723         rptr = rdev->ih.rptr;
4724         DRM_DEBUG("evergreen_irq_process start: rptr %d, wptr %d\n", rptr, wptr);
4725
4726         /* Order reading of wptr vs. reading of IH ring data */
4727         rmb();
4728
4729         /* display interrupts */
4730         evergreen_irq_ack(rdev);
4731
4732         while (rptr != wptr) {
4733                 /* wptr/rptr are in bytes! */
4734                 ring_index = rptr / 4;
4735                 src_id =  le32_to_cpu(rdev->ih.ring[ring_index]) & 0xff;
4736                 src_data = le32_to_cpu(rdev->ih.ring[ring_index + 1]) & 0xfffffff;
4737
4738                 switch (src_id) {
4739                 case 1: /* D1 vblank/vline */
4740                 case 2: /* D2 vblank/vline */
4741                 case 3: /* D3 vblank/vline */
4742                 case 4: /* D4 vblank/vline */
4743                 case 5: /* D5 vblank/vline */
4744                 case 6: /* D6 vblank/vline */
4745                         crtc_idx = src_id - 1;
4746
4747                         if (src_data == 0) { /* vblank */
4748                                 mask = LB_D1_VBLANK_INTERRUPT;
4749                                 event_name = "vblank";
4750
4751                                 if (rdev->irq.crtc_vblank_int[crtc_idx]) {
4752                                         drm_handle_vblank(rdev->ddev, crtc_idx);
4753                                         rdev->pm.vblank_sync = true;
4754                                         wake_up(&rdev->irq.vblank_queue);
4755                                 }
4756                                 if (atomic_read(&rdev->irq.pflip[crtc_idx])) {
4757                                         radeon_crtc_handle_vblank(rdev,
4758                                                                   crtc_idx);
4759                                 }
4760
4761                         } else if (src_data == 1) { /* vline */
4762                                 mask = LB_D1_VLINE_INTERRUPT;
4763                                 event_name = "vline";
4764                         } else {
4765                                 DRM_DEBUG("Unhandled interrupt: %d %d\n",
4766                                           src_id, src_data);
4767                                 break;
4768                         }
4769
4770                         if (!(disp_int[crtc_idx] & mask)) {
4771                                 DRM_DEBUG("IH: D%d %s - IH event w/o asserted irq bit?\n",
4772                                           crtc_idx + 1, event_name);
4773                         }
4774
4775                         disp_int[crtc_idx] &= ~mask;
4776                         DRM_DEBUG("IH: D%d %s\n", crtc_idx + 1, event_name);
4777
4778                         break;
4779                 case 8: /* D1 page flip */
4780                 case 10: /* D2 page flip */
4781                 case 12: /* D3 page flip */
4782                 case 14: /* D4 page flip */
4783                 case 16: /* D5 page flip */
4784                 case 18: /* D6 page flip */
4785                         DRM_DEBUG("IH: D%d flip\n", ((src_id - 8) >> 1) + 1);
4786                         if (radeon_use_pflipirq > 0)
4787                                 radeon_crtc_handle_flip(rdev, (src_id - 8) >> 1);
4788                         break;
4789                 case 42: /* HPD hotplug */
4790                         if (src_data <= 5) {
4791                                 hpd_idx = src_data;
4792                                 mask = DC_HPD1_INTERRUPT;
4793                                 queue_hotplug = true;
4794                                 event_name = "HPD";
4795
4796                         } else if (src_data <= 11) {
4797                                 hpd_idx = src_data - 6;
4798                                 mask = DC_HPD1_RX_INTERRUPT;
4799                                 queue_dp = true;
4800                                 event_name = "HPD_RX";
4801
4802                         } else {
4803                                 DRM_DEBUG("Unhandled interrupt: %d %d\n",
4804                                           src_id, src_data);
4805                                 break;
4806                         }
4807
4808                         if (!(disp_int[hpd_idx] & mask))
4809                                 DRM_DEBUG("IH: IH event w/o asserted irq bit?\n");
4810
4811                         disp_int[hpd_idx] &= ~mask;
4812                         DRM_DEBUG("IH: %s%d\n", event_name, hpd_idx + 1);
4813
4814                         break;
4815                 case 44: /* hdmi */
4816                         afmt_idx = src_data;
4817                         if (!(afmt_status[afmt_idx] & AFMT_AZ_FORMAT_WTRIG))
4818                                 DRM_DEBUG("IH: IH event w/o asserted irq bit?\n");
4819
4820                         if (afmt_idx > 5) {
4821                                 DRM_ERROR("Unhandled interrupt: %d %d\n",
4822                                           src_id, src_data);
4823                                 break;
4824                         }
4825                         afmt_status[afmt_idx] &= ~AFMT_AZ_FORMAT_WTRIG;
4826                         queue_hdmi = true;
4827                         DRM_DEBUG("IH: HDMI%d\n", afmt_idx + 1);
4828                         break;
4829                 case 96:
4830                         DRM_ERROR("SRBM_READ_ERROR: 0x%x\n", RREG32(SRBM_READ_ERROR));
4831                         WREG32(SRBM_INT_ACK, 0x1);
4832                         break;
4833                 case 124: /* UVD */
4834                         DRM_DEBUG("IH: UVD int: 0x%08x\n", src_data);
4835                         radeon_fence_process(rdev, R600_RING_TYPE_UVD_INDEX);
4836                         break;
4837                 case 146:
4838                 case 147:
4839                         addr = RREG32(VM_CONTEXT1_PROTECTION_FAULT_ADDR);
4840                         status = RREG32(VM_CONTEXT1_PROTECTION_FAULT_STATUS);
4841                         /* reset addr and status */
4842                         WREG32_P(VM_CONTEXT1_CNTL2, 1, ~1);
4843                         if (addr == 0x0 && status == 0x0)
4844                                 break;
4845                         dev_err(rdev->dev, "GPU fault detected: %d 0x%08x\n", src_id, src_data);
4846                         dev_err(rdev->dev, "  VM_CONTEXT1_PROTECTION_FAULT_ADDR   0x%08X\n",
4847                                 addr);
4848                         dev_err(rdev->dev, "  VM_CONTEXT1_PROTECTION_FAULT_STATUS 0x%08X\n",
4849                                 status);
4850                         cayman_vm_decode_fault(rdev, status, addr);
4851                         break;
4852                 case 176: /* CP_INT in ring buffer */
4853                 case 177: /* CP_INT in IB1 */
4854                 case 178: /* CP_INT in IB2 */
4855                         DRM_DEBUG("IH: CP int: 0x%08x\n", src_data);
4856                         radeon_fence_process(rdev, RADEON_RING_TYPE_GFX_INDEX);
4857                         break;
4858                 case 181: /* CP EOP event */
4859                         DRM_DEBUG("IH: CP EOP\n");
4860                         if (rdev->family >= CHIP_CAYMAN) {
4861                                 switch (src_data) {
4862                                 case 0:
4863                                         radeon_fence_process(rdev, RADEON_RING_TYPE_GFX_INDEX);
4864                                         break;
4865                                 case 1:
4866                                         radeon_fence_process(rdev, CAYMAN_RING_TYPE_CP1_INDEX);
4867                                         break;
4868                                 case 2:
4869                                         radeon_fence_process(rdev, CAYMAN_RING_TYPE_CP2_INDEX);
4870                                         break;
4871                                 }
4872                         } else
4873                                 radeon_fence_process(rdev, RADEON_RING_TYPE_GFX_INDEX);
4874                         break;
4875                 case 224: /* DMA trap event */
4876                         DRM_DEBUG("IH: DMA trap\n");
4877                         radeon_fence_process(rdev, R600_RING_TYPE_DMA_INDEX);
4878                         break;
4879                 case 230: /* thermal low to high */
4880                         DRM_DEBUG("IH: thermal low to high\n");
4881                         rdev->pm.dpm.thermal.high_to_low = false;
4882                         queue_thermal = true;
4883                         break;
4884                 case 231: /* thermal high to low */
4885                         DRM_DEBUG("IH: thermal high to low\n");
4886                         rdev->pm.dpm.thermal.high_to_low = true;
4887                         queue_thermal = true;
4888                         break;
4889                 case 233: /* GUI IDLE */
4890                         DRM_DEBUG("IH: GUI idle\n");
4891                         break;
4892                 case 244: /* DMA trap event */
4893                         if (rdev->family >= CHIP_CAYMAN) {
4894                                 DRM_DEBUG("IH: DMA1 trap\n");
4895                                 radeon_fence_process(rdev, CAYMAN_RING_TYPE_DMA1_INDEX);
4896                         }
4897                         break;
4898                 default:
4899                         DRM_DEBUG("Unhandled interrupt: %d %d\n", src_id, src_data);
4900                         break;
4901                 }
4902
4903                 /* wptr/rptr are in bytes! */
4904                 rptr += 16;
4905                 rptr &= rdev->ih.ptr_mask;
4906                 WREG32(IH_RB_RPTR, rptr);
4907         }
4908         if (queue_dp)
4909                 schedule_work(&rdev->dp_work);
4910         if (queue_hotplug)
4911                 schedule_delayed_work(&rdev->hotplug_work, 0);
4912         if (queue_hdmi)
4913                 schedule_work(&rdev->audio_work);
4914         if (queue_thermal && rdev->pm.dpm_enabled)
4915                 schedule_work(&rdev->pm.dpm.thermal.work);
4916         rdev->ih.rptr = rptr;
4917         atomic_set(&rdev->ih.lock, 0);
4918
4919         /* make sure wptr hasn't changed while processing */
4920         wptr = evergreen_get_ih_wptr(rdev);
4921         if (wptr != rptr)
4922                 goto restart_ih;
4923
4924         return IRQ_HANDLED;
4925 }
4926
4927 static void evergreen_uvd_init(struct radeon_device *rdev)
4928 {
4929         int r;
4930
4931         if (!rdev->has_uvd)
4932                 return;
4933
4934         r = radeon_uvd_init(rdev);
4935         if (r) {
4936                 dev_err(rdev->dev, "failed UVD (%d) init.\n", r);
4937                 /*
4938                  * At this point rdev->uvd.vcpu_bo is NULL which trickles down
4939                  * to early fails uvd_v2_2_resume() and thus nothing happens
4940                  * there. So it is pointless to try to go through that code
4941                  * hence why we disable uvd here.
4942                  */
4943                 rdev->has_uvd = 0;
4944                 return;
4945         }
4946         rdev->ring[R600_RING_TYPE_UVD_INDEX].ring_obj = NULL;
4947         r600_ring_init(rdev, &rdev->ring[R600_RING_TYPE_UVD_INDEX], 4096);
4948 }
4949
4950 static void evergreen_uvd_start(struct radeon_device *rdev)
4951 {
4952         int r;
4953
4954         if (!rdev->has_uvd)
4955                 return;
4956
4957         r = uvd_v2_2_resume(rdev);
4958         if (r) {
4959                 dev_err(rdev->dev, "failed UVD resume (%d).\n", r);
4960                 goto error;
4961         }
4962         r = radeon_fence_driver_start_ring(rdev, R600_RING_TYPE_UVD_INDEX);
4963         if (r) {
4964                 dev_err(rdev->dev, "failed initializing UVD fences (%d).\n", r);
4965                 goto error;
4966         }
4967         return;
4968
4969 error:
4970         rdev->ring[R600_RING_TYPE_UVD_INDEX].ring_size = 0;
4971 }
4972
4973 static void evergreen_uvd_resume(struct radeon_device *rdev)
4974 {
4975         struct radeon_ring *ring;
4976         int r;
4977
4978         if (!rdev->has_uvd || !rdev->ring[R600_RING_TYPE_UVD_INDEX].ring_size)
4979                 return;
4980
4981         ring = &rdev->ring[R600_RING_TYPE_UVD_INDEX];
4982         r = radeon_ring_init(rdev, ring, ring->ring_size, 0, PACKET0(UVD_NO_OP, 0));
4983         if (r) {
4984                 dev_err(rdev->dev, "failed initializing UVD ring (%d).\n", r);
4985                 return;
4986         }
4987         r = uvd_v1_0_init(rdev);
4988         if (r) {
4989                 dev_err(rdev->dev, "failed initializing UVD (%d).\n", r);
4990                 return;
4991         }
4992 }
4993
4994 static int evergreen_startup(struct radeon_device *rdev)
4995 {
4996         struct radeon_ring *ring;
4997         int r;
4998
4999         /* enable pcie gen2 link */
5000         evergreen_pcie_gen2_enable(rdev);
5001         /* enable aspm */
5002         evergreen_program_aspm(rdev);
5003
5004         /* scratch needs to be initialized before MC */
5005         r = r600_vram_scratch_init(rdev);
5006         if (r)
5007                 return r;
5008
5009         evergreen_mc_program(rdev);
5010
5011         if (ASIC_IS_DCE5(rdev) && !rdev->pm.dpm_enabled) {
5012                 r = ni_mc_load_microcode(rdev);
5013                 if (r) {
5014                         DRM_ERROR("Failed to load MC firmware!\n");
5015                         return r;
5016                 }
5017         }
5018
5019         if (rdev->flags & RADEON_IS_AGP) {
5020                 evergreen_agp_enable(rdev);
5021         } else {
5022                 r = evergreen_pcie_gart_enable(rdev);
5023                 if (r)
5024                         return r;
5025         }
5026         evergreen_gpu_init(rdev);
5027
5028         /* allocate rlc buffers */
5029         if (rdev->flags & RADEON_IS_IGP) {
5030                 rdev->rlc.reg_list = sumo_rlc_save_restore_register_list;
5031                 rdev->rlc.reg_list_size =
5032                         (u32)ARRAY_SIZE(sumo_rlc_save_restore_register_list);
5033                 rdev->rlc.cs_data = evergreen_cs_data;
5034                 r = sumo_rlc_init(rdev);
5035                 if (r) {
5036                         DRM_ERROR("Failed to init rlc BOs!\n");
5037                         return r;
5038                 }
5039         }
5040
5041         /* allocate wb buffer */
5042         r = radeon_wb_init(rdev);
5043         if (r)
5044                 return r;
5045
5046         r = radeon_fence_driver_start_ring(rdev, RADEON_RING_TYPE_GFX_INDEX);
5047         if (r) {
5048                 dev_err(rdev->dev, "failed initializing CP fences (%d).\n", r);
5049                 return r;
5050         }
5051
5052         r = radeon_fence_driver_start_ring(rdev, R600_RING_TYPE_DMA_INDEX);
5053         if (r) {
5054                 dev_err(rdev->dev, "failed initializing DMA fences (%d).\n", r);
5055                 return r;
5056         }
5057
5058         evergreen_uvd_start(rdev);
5059
5060         /* Enable IRQ */
5061         if (!rdev->irq.installed) {
5062                 r = radeon_irq_kms_init(rdev);
5063                 if (r)
5064                         return r;
5065         }
5066
5067         r = r600_irq_init(rdev);
5068         if (r) {
5069                 DRM_ERROR("radeon: IH init failed (%d).\n", r);
5070                 radeon_irq_kms_fini(rdev);
5071                 return r;
5072         }
5073         evergreen_irq_set(rdev);
5074
5075         ring = &rdev->ring[RADEON_RING_TYPE_GFX_INDEX];
5076         r = radeon_ring_init(rdev, ring, ring->ring_size, RADEON_WB_CP_RPTR_OFFSET,
5077                              RADEON_CP_PACKET2);
5078         if (r)
5079                 return r;
5080
5081         ring = &rdev->ring[R600_RING_TYPE_DMA_INDEX];
5082         r = radeon_ring_init(rdev, ring, ring->ring_size, R600_WB_DMA_RPTR_OFFSET,
5083                              DMA_PACKET(DMA_PACKET_NOP, 0, 0));
5084         if (r)
5085                 return r;
5086
5087         r = evergreen_cp_load_microcode(rdev);
5088         if (r)
5089                 return r;
5090         r = evergreen_cp_resume(rdev);
5091         if (r)
5092                 return r;
5093         r = r600_dma_resume(rdev);
5094         if (r)
5095                 return r;
5096
5097         evergreen_uvd_resume(rdev);
5098
5099         r = radeon_ib_pool_init(rdev);
5100         if (r) {
5101                 dev_err(rdev->dev, "IB initialization failed (%d).\n", r);
5102                 return r;
5103         }
5104
5105         r = radeon_audio_init(rdev);
5106         if (r) {
5107                 DRM_ERROR("radeon: audio init failed\n");
5108                 return r;
5109         }
5110
5111         return 0;
5112 }
5113
5114 int evergreen_resume(struct radeon_device *rdev)
5115 {
5116         int r;
5117
5118         /* reset the asic, the gfx blocks are often in a bad state
5119          * after the driver is unloaded or after a resume
5120          */
5121         if (radeon_asic_reset(rdev))
5122                 dev_warn(rdev->dev, "GPU reset failed !\n");
5123         /* Do not reset GPU before posting, on rv770 hw unlike on r500 hw,
5124          * posting will perform necessary task to bring back GPU into good
5125          * shape.
5126          */
5127         /* post card */
5128         atom_asic_init(rdev->mode_info.atom_context);
5129
5130         /* init golden registers */
5131         evergreen_init_golden_registers(rdev);
5132
5133         if (rdev->pm.pm_method == PM_METHOD_DPM)
5134                 radeon_pm_resume(rdev);
5135
5136         rdev->accel_working = true;
5137         r = evergreen_startup(rdev);
5138         if (r) {
5139                 DRM_ERROR("evergreen startup failed on resume\n");
5140                 rdev->accel_working = false;
5141                 return r;
5142         }
5143
5144         return r;
5145
5146 }
5147
5148 int evergreen_suspend(struct radeon_device *rdev)
5149 {
5150         radeon_pm_suspend(rdev);
5151         radeon_audio_fini(rdev);
5152         if (rdev->has_uvd) {
5153                 uvd_v1_0_fini(rdev);
5154                 radeon_uvd_suspend(rdev);
5155         }
5156         r700_cp_stop(rdev);
5157         r600_dma_stop(rdev);
5158         evergreen_irq_suspend(rdev);
5159         radeon_wb_disable(rdev);
5160         evergreen_pcie_gart_disable(rdev);
5161
5162         return 0;
5163 }
5164
5165 /* Plan is to move initialization in that function and use
5166  * helper function so that radeon_device_init pretty much
5167  * do nothing more than calling asic specific function. This
5168  * should also allow to remove a bunch of callback function
5169  * like vram_info.
5170  */
5171 int evergreen_init(struct radeon_device *rdev)
5172 {
5173         int r;
5174
5175         /* Read BIOS */
5176         if (!radeon_get_bios(rdev)) {
5177                 if (ASIC_IS_AVIVO(rdev))
5178                         return -EINVAL;
5179         }
5180         /* Must be an ATOMBIOS */
5181         if (!rdev->is_atom_bios) {
5182                 dev_err(rdev->dev, "Expecting atombios for evergreen GPU\n");
5183                 return -EINVAL;
5184         }
5185         r = radeon_atombios_init(rdev);
5186         if (r)
5187                 return r;
5188         /* reset the asic, the gfx blocks are often in a bad state
5189          * after the driver is unloaded or after a resume
5190          */
5191         if (radeon_asic_reset(rdev))
5192                 dev_warn(rdev->dev, "GPU reset failed !\n");
5193         /* Post card if necessary */
5194         if (!radeon_card_posted(rdev)) {
5195                 if (!rdev->bios) {
5196                         dev_err(rdev->dev, "Card not posted and no BIOS - ignoring\n");
5197                         return -EINVAL;
5198                 }
5199                 DRM_INFO("GPU not posted. posting now...\n");
5200                 atom_asic_init(rdev->mode_info.atom_context);
5201         }
5202         /* init golden registers */
5203         evergreen_init_golden_registers(rdev);
5204         /* Initialize scratch registers */
5205         r600_scratch_init(rdev);
5206         /* Initialize surface registers */
5207         radeon_surface_init(rdev);
5208         /* Initialize clocks */
5209         radeon_get_clock_info(rdev->ddev);
5210         /* Fence driver */
5211         r = radeon_fence_driver_init(rdev);
5212         if (r)
5213                 return r;
5214         /* initialize AGP */
5215         if (rdev->flags & RADEON_IS_AGP) {
5216                 r = radeon_agp_init(rdev);
5217                 if (r)
5218                         radeon_agp_disable(rdev);
5219         }
5220         /* initialize memory controller */
5221         r = evergreen_mc_init(rdev);
5222         if (r)
5223                 return r;
5224         /* Memory manager */
5225         r = radeon_bo_init(rdev);
5226         if (r)
5227                 return r;
5228
5229         if (ASIC_IS_DCE5(rdev)) {
5230                 if (!rdev->me_fw || !rdev->pfp_fw || !rdev->rlc_fw || !rdev->mc_fw) {
5231                         r = ni_init_microcode(rdev);
5232                         if (r) {
5233                                 DRM_ERROR("Failed to load firmware!\n");
5234                                 return r;
5235                         }
5236                 }
5237         } else {
5238                 if (!rdev->me_fw || !rdev->pfp_fw || !rdev->rlc_fw) {
5239                         r = r600_init_microcode(rdev);
5240                         if (r) {
5241                                 DRM_ERROR("Failed to load firmware!\n");
5242                                 /*(DEBLOBBED)*/
5243                         }
5244                 }
5245         }
5246
5247         /* Initialize power management */
5248         radeon_pm_init(rdev);
5249
5250         rdev->ring[RADEON_RING_TYPE_GFX_INDEX].ring_obj = NULL;
5251         r600_ring_init(rdev, &rdev->ring[RADEON_RING_TYPE_GFX_INDEX], 1024 * 1024);
5252
5253         rdev->ring[R600_RING_TYPE_DMA_INDEX].ring_obj = NULL;
5254         r600_ring_init(rdev, &rdev->ring[R600_RING_TYPE_DMA_INDEX], 64 * 1024);
5255
5256         evergreen_uvd_init(rdev);
5257
5258         rdev->ih.ring_obj = NULL;
5259         r600_ih_ring_init(rdev, 64 * 1024);
5260
5261         r = r600_pcie_gart_init(rdev);
5262         if (r)
5263                 return r;
5264
5265         rdev->accel_working = true;
5266         r = evergreen_startup(rdev);
5267         if (r) {
5268                 dev_err(rdev->dev, "disabling GPU acceleration\n");
5269                 r700_cp_fini(rdev);
5270                 r600_dma_fini(rdev);
5271                 r600_irq_fini(rdev);
5272                 if (rdev->flags & RADEON_IS_IGP)
5273                         sumo_rlc_fini(rdev);
5274                 radeon_wb_fini(rdev);
5275                 radeon_ib_pool_fini(rdev);
5276                 radeon_irq_kms_fini(rdev);
5277                 evergreen_pcie_gart_fini(rdev);
5278                 rdev->accel_working = false;
5279         }
5280
5281         /* Don't start up if the MC ucode is missing on BTC parts.
5282          * The default clocks and voltages before the MC ucode
5283          * is loaded are not suffient for advanced operations.
5284          */
5285         if (ASIC_IS_DCE5(rdev)) {
5286                 if (!rdev->mc_fw && !(rdev->flags & RADEON_IS_IGP)) {
5287                         DRM_ERROR("radeon: MC ucode required for NI+.\n");
5288                         return -EINVAL;
5289                 }
5290         }
5291
5292         return 0;
5293 }
5294
5295 void evergreen_fini(struct radeon_device *rdev)
5296 {
5297         radeon_pm_fini(rdev);
5298         radeon_audio_fini(rdev);
5299         r700_cp_fini(rdev);
5300         r600_dma_fini(rdev);
5301         r600_irq_fini(rdev);
5302         if (rdev->flags & RADEON_IS_IGP)
5303                 sumo_rlc_fini(rdev);
5304         radeon_wb_fini(rdev);
5305         radeon_ib_pool_fini(rdev);
5306         radeon_irq_kms_fini(rdev);
5307         uvd_v1_0_fini(rdev);
5308         radeon_uvd_fini(rdev);
5309         evergreen_pcie_gart_fini(rdev);
5310         r600_vram_scratch_fini(rdev);
5311         radeon_gem_fini(rdev);
5312         radeon_fence_driver_fini(rdev);
5313         radeon_agp_fini(rdev);
5314         radeon_bo_fini(rdev);
5315         radeon_atombios_fini(rdev);
5316         kfree(rdev->bios);
5317         rdev->bios = NULL;
5318 }
5319
5320 void evergreen_pcie_gen2_enable(struct radeon_device *rdev)
5321 {
5322         u32 link_width_cntl, speed_cntl;
5323
5324         if (radeon_pcie_gen2 == 0)
5325                 return;
5326
5327         if (rdev->flags & RADEON_IS_IGP)
5328                 return;
5329
5330         if (!(rdev->flags & RADEON_IS_PCIE))
5331                 return;
5332
5333         /* x2 cards have a special sequence */
5334         if (ASIC_IS_X2(rdev))
5335                 return;
5336
5337         if ((rdev->pdev->bus->max_bus_speed != PCIE_SPEED_5_0GT) &&
5338                 (rdev->pdev->bus->max_bus_speed != PCIE_SPEED_8_0GT))
5339                 return;
5340
5341         speed_cntl = RREG32_PCIE_PORT(PCIE_LC_SPEED_CNTL);
5342         if (speed_cntl & LC_CURRENT_DATA_RATE) {
5343                 DRM_INFO("PCIE gen 2 link speeds already enabled\n");
5344                 return;
5345         }
5346
5347         DRM_INFO("enabling PCIE gen 2 link speeds, disable with radeon.pcie_gen2=0\n");
5348
5349         if ((speed_cntl & LC_OTHER_SIDE_EVER_SENT_GEN2) ||
5350             (speed_cntl & LC_OTHER_SIDE_SUPPORTS_GEN2)) {
5351
5352                 link_width_cntl = RREG32_PCIE_PORT(PCIE_LC_LINK_WIDTH_CNTL);
5353                 link_width_cntl &= ~LC_UPCONFIGURE_DIS;
5354                 WREG32_PCIE_PORT(PCIE_LC_LINK_WIDTH_CNTL, link_width_cntl);
5355
5356                 speed_cntl = RREG32_PCIE_PORT(PCIE_LC_SPEED_CNTL);
5357                 speed_cntl &= ~LC_TARGET_LINK_SPEED_OVERRIDE_EN;
5358                 WREG32_PCIE_PORT(PCIE_LC_SPEED_CNTL, speed_cntl);
5359
5360                 speed_cntl = RREG32_PCIE_PORT(PCIE_LC_SPEED_CNTL);
5361                 speed_cntl |= LC_CLR_FAILED_SPD_CHANGE_CNT;
5362                 WREG32_PCIE_PORT(PCIE_LC_SPEED_CNTL, speed_cntl);
5363
5364                 speed_cntl = RREG32_PCIE_PORT(PCIE_LC_SPEED_CNTL);
5365                 speed_cntl &= ~LC_CLR_FAILED_SPD_CHANGE_CNT;
5366                 WREG32_PCIE_PORT(PCIE_LC_SPEED_CNTL, speed_cntl);
5367
5368                 speed_cntl = RREG32_PCIE_PORT(PCIE_LC_SPEED_CNTL);
5369                 speed_cntl |= LC_GEN2_EN_STRAP;
5370                 WREG32_PCIE_PORT(PCIE_LC_SPEED_CNTL, speed_cntl);
5371
5372         } else {
5373                 link_width_cntl = RREG32_PCIE_PORT(PCIE_LC_LINK_WIDTH_CNTL);
5374                 /* XXX: only disable it if gen1 bridge vendor == 0x111d or 0x1106 */
5375                 if (1)
5376                         link_width_cntl |= LC_UPCONFIGURE_DIS;
5377                 else
5378                         link_width_cntl &= ~LC_UPCONFIGURE_DIS;
5379                 WREG32_PCIE_PORT(PCIE_LC_LINK_WIDTH_CNTL, link_width_cntl);
5380         }
5381 }
5382
5383 void evergreen_program_aspm(struct radeon_device *rdev)
5384 {
5385         u32 data, orig;
5386         u32 pcie_lc_cntl, pcie_lc_cntl_old;
5387         bool disable_l0s, disable_l1 = false, disable_plloff_in_l1 = false;
5388         /* fusion_platform = true
5389          * if the system is a fusion system
5390          * (APU or DGPU in a fusion system).
5391          * todo: check if the system is a fusion platform.
5392          */
5393         bool fusion_platform = false;
5394
5395         if (radeon_aspm == 0)
5396                 return;
5397
5398         if (!(rdev->flags & RADEON_IS_PCIE))
5399                 return;
5400
5401         switch (rdev->family) {
5402         case CHIP_CYPRESS:
5403         case CHIP_HEMLOCK:
5404         case CHIP_JUNIPER:
5405         case CHIP_REDWOOD:
5406         case CHIP_CEDAR:
5407         case CHIP_SUMO:
5408         case CHIP_SUMO2:
5409         case CHIP_PALM:
5410         case CHIP_ARUBA:
5411                 disable_l0s = true;
5412                 break;
5413         default:
5414                 disable_l0s = false;
5415                 break;
5416         }
5417
5418         if (rdev->flags & RADEON_IS_IGP)
5419                 fusion_platform = true; /* XXX also dGPUs in a fusion system */
5420
5421         data = orig = RREG32_PIF_PHY0(PB0_PIF_PAIRING);
5422         if (fusion_platform)
5423                 data &= ~MULTI_PIF;
5424         else
5425                 data |= MULTI_PIF;
5426         if (data != orig)
5427                 WREG32_PIF_PHY0(PB0_PIF_PAIRING, data);
5428
5429         data = orig = RREG32_PIF_PHY1(PB1_PIF_PAIRING);
5430         if (fusion_platform)
5431                 data &= ~MULTI_PIF;
5432         else
5433                 data |= MULTI_PIF;
5434         if (data != orig)
5435                 WREG32_PIF_PHY1(PB1_PIF_PAIRING, data);
5436
5437         pcie_lc_cntl = pcie_lc_cntl_old = RREG32_PCIE_PORT(PCIE_LC_CNTL);
5438         pcie_lc_cntl &= ~(LC_L0S_INACTIVITY_MASK | LC_L1_INACTIVITY_MASK);
5439         if (!disable_l0s) {
5440                 if (rdev->family >= CHIP_BARTS)
5441                         pcie_lc_cntl |= LC_L0S_INACTIVITY(7);
5442                 else
5443                         pcie_lc_cntl |= LC_L0S_INACTIVITY(3);
5444         }
5445
5446         if (!disable_l1) {
5447                 if (rdev->family >= CHIP_BARTS)
5448                         pcie_lc_cntl |= LC_L1_INACTIVITY(7);
5449                 else
5450                         pcie_lc_cntl |= LC_L1_INACTIVITY(8);
5451
5452                 if (!disable_plloff_in_l1) {
5453                         data = orig = RREG32_PIF_PHY0(PB0_PIF_PWRDOWN_0);
5454                         data &= ~(PLL_POWER_STATE_IN_OFF_0_MASK | PLL_POWER_STATE_IN_TXS2_0_MASK);
5455                         data |= PLL_POWER_STATE_IN_OFF_0(7) | PLL_POWER_STATE_IN_TXS2_0(7);
5456                         if (data != orig)
5457                                 WREG32_PIF_PHY0(PB0_PIF_PWRDOWN_0, data);
5458
5459                         data = orig = RREG32_PIF_PHY0(PB0_PIF_PWRDOWN_1);
5460                         data &= ~(PLL_POWER_STATE_IN_OFF_1_MASK | PLL_POWER_STATE_IN_TXS2_1_MASK);
5461                         data |= PLL_POWER_STATE_IN_OFF_1(7) | PLL_POWER_STATE_IN_TXS2_1(7);
5462                         if (data != orig)
5463                                 WREG32_PIF_PHY0(PB0_PIF_PWRDOWN_1, data);
5464
5465                         data = orig = RREG32_PIF_PHY1(PB1_PIF_PWRDOWN_0);
5466                         data &= ~(PLL_POWER_STATE_IN_OFF_0_MASK | PLL_POWER_STATE_IN_TXS2_0_MASK);
5467                         data |= PLL_POWER_STATE_IN_OFF_0(7) | PLL_POWER_STATE_IN_TXS2_0(7);
5468                         if (data != orig)
5469                                 WREG32_PIF_PHY1(PB1_PIF_PWRDOWN_0, data);
5470
5471                         data = orig = RREG32_PIF_PHY1(PB1_PIF_PWRDOWN_1);
5472                         data &= ~(PLL_POWER_STATE_IN_OFF_1_MASK | PLL_POWER_STATE_IN_TXS2_1_MASK);
5473                         data |= PLL_POWER_STATE_IN_OFF_1(7) | PLL_POWER_STATE_IN_TXS2_1(7);
5474                         if (data != orig)
5475                                 WREG32_PIF_PHY1(PB1_PIF_PWRDOWN_1, data);
5476
5477                         if (rdev->family >= CHIP_BARTS) {
5478                                 data = orig = RREG32_PIF_PHY0(PB0_PIF_PWRDOWN_0);
5479                                 data &= ~PLL_RAMP_UP_TIME_0_MASK;
5480                                 data |= PLL_RAMP_UP_TIME_0(4);
5481                                 if (data != orig)
5482                                         WREG32_PIF_PHY0(PB0_PIF_PWRDOWN_0, data);
5483
5484                                 data = orig = RREG32_PIF_PHY0(PB0_PIF_PWRDOWN_1);
5485                                 data &= ~PLL_RAMP_UP_TIME_1_MASK;
5486                                 data |= PLL_RAMP_UP_TIME_1(4);
5487                                 if (data != orig)
5488                                         WREG32_PIF_PHY0(PB0_PIF_PWRDOWN_1, data);
5489
5490                                 data = orig = RREG32_PIF_PHY1(PB1_PIF_PWRDOWN_0);
5491                                 data &= ~PLL_RAMP_UP_TIME_0_MASK;
5492                                 data |= PLL_RAMP_UP_TIME_0(4);
5493                                 if (data != orig)
5494                                         WREG32_PIF_PHY1(PB1_PIF_PWRDOWN_0, data);
5495
5496                                 data = orig = RREG32_PIF_PHY1(PB1_PIF_PWRDOWN_1);
5497                                 data &= ~PLL_RAMP_UP_TIME_1_MASK;
5498                                 data |= PLL_RAMP_UP_TIME_1(4);
5499                                 if (data != orig)
5500                                         WREG32_PIF_PHY1(PB1_PIF_PWRDOWN_1, data);
5501                         }
5502
5503                         data = orig = RREG32_PCIE_PORT(PCIE_LC_LINK_WIDTH_CNTL);
5504                         data &= ~LC_DYN_LANES_PWR_STATE_MASK;
5505                         data |= LC_DYN_LANES_PWR_STATE(3);
5506                         if (data != orig)
5507                                 WREG32_PCIE_PORT(PCIE_LC_LINK_WIDTH_CNTL, data);
5508
5509                         if (rdev->family >= CHIP_BARTS) {
5510                                 data = orig = RREG32_PIF_PHY0(PB0_PIF_CNTL);
5511                                 data &= ~LS2_EXIT_TIME_MASK;
5512                                 data |= LS2_EXIT_TIME(1);
5513                                 if (data != orig)
5514                                         WREG32_PIF_PHY0(PB0_PIF_CNTL, data);
5515
5516                                 data = orig = RREG32_PIF_PHY1(PB1_PIF_CNTL);
5517                                 data &= ~LS2_EXIT_TIME_MASK;
5518                                 data |= LS2_EXIT_TIME(1);
5519                                 if (data != orig)
5520                                         WREG32_PIF_PHY1(PB1_PIF_CNTL, data);
5521                         }
5522                 }
5523         }
5524
5525         /* evergreen parts only */
5526         if (rdev->family < CHIP_BARTS)
5527                 pcie_lc_cntl |= LC_PMI_TO_L1_DIS;
5528
5529         if (pcie_lc_cntl != pcie_lc_cntl_old)
5530                 WREG32_PCIE_PORT(PCIE_LC_CNTL, pcie_lc_cntl);
5531 }