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