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