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