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