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