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