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