xref: /linux/drivers/gpu/drm/radeon/rv770.c (revision 39f75da7bcc829ddc4d40bb60d0e95520de7898b)
1 /*
2  * Copyright 2008 Advanced Micro Devices, Inc.
3  * Copyright 2008 Red Hat Inc.
4  * Copyright 2009 Jerome Glisse.
5  *
6  * Permission is hereby granted, free of charge, to any person obtaining a
7  * copy of this software and associated documentation files (the "Software"),
8  * to deal in the Software without restriction, including without limitation
9  * the rights to use, copy, modify, merge, publish, distribute, sublicense,
10  * and/or sell copies of the Software, and to permit persons to whom the
11  * Software is furnished to do so, subject to the following conditions:
12  *
13  * The above copyright notice and this permission notice shall be included in
14  * all copies or substantial portions of the Software.
15  *
16  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
19  * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
20  * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
21  * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
22  * OTHER DEALINGS IN THE SOFTWARE.
23  *
24  * Authors: Dave Airlie
25  *          Alex Deucher
26  *          Jerome Glisse
27  */
28 
29 #include <linux/firmware.h>
30 #include <linux/pci.h>
31 #include <linux/slab.h>
32 
33 #include <drm/drm_device.h>
34 #include <drm/radeon_drm.h>
35 
36 #include "atom.h"
37 #include "avivod.h"
38 #include "radeon.h"
39 #include "radeon_asic.h"
40 #include "radeon_audio.h"
41 #include "rv770d.h"
42 #include "rv770.h"
43 
44 #define R700_PFP_UCODE_SIZE 848
45 #define R700_PM4_UCODE_SIZE 1360
46 
47 static void rv770_gpu_init(struct radeon_device *rdev);
48 void rv770_fini(struct radeon_device *rdev);
49 static void rv770_pcie_gen2_enable(struct radeon_device *rdev);
50 int evergreen_set_uvd_clocks(struct radeon_device *rdev, u32 vclk, u32 dclk);
51 
52 int rv770_set_uvd_clocks(struct radeon_device *rdev, u32 vclk, u32 dclk)
53 {
54 	unsigned fb_div = 0, vclk_div = 0, dclk_div = 0;
55 	int r;
56 
57 	/* RV740 uses evergreen uvd clk programming */
58 	if (rdev->family == CHIP_RV740)
59 		return evergreen_set_uvd_clocks(rdev, vclk, dclk);
60 
61 	/* bypass vclk and dclk with bclk */
62 	WREG32_P(CG_UPLL_FUNC_CNTL_2,
63 		 VCLK_SRC_SEL(1) | DCLK_SRC_SEL(1),
64 		 ~(VCLK_SRC_SEL_MASK | DCLK_SRC_SEL_MASK));
65 
66 	if (!vclk || !dclk) {
67 		/* keep the Bypass mode, put PLL to sleep */
68 		WREG32_P(CG_UPLL_FUNC_CNTL, UPLL_SLEEP_MASK, ~UPLL_SLEEP_MASK);
69 		return 0;
70 	}
71 
72 	r = radeon_uvd_calc_upll_dividers(rdev, vclk, dclk, 50000, 160000,
73 					  43663, 0x03FFFFFE, 1, 30, ~0,
74 					  &fb_div, &vclk_div, &dclk_div);
75 	if (r)
76 		return r;
77 
78 	fb_div |= 1;
79 	vclk_div -= 1;
80 	dclk_div -= 1;
81 
82 	/* set UPLL_FB_DIV to 0x50000 */
83 	WREG32_P(CG_UPLL_FUNC_CNTL_3, UPLL_FB_DIV(0x50000), ~UPLL_FB_DIV_MASK);
84 
85 	/* deassert UPLL_RESET and UPLL_SLEEP */
86 	WREG32_P(CG_UPLL_FUNC_CNTL, 0, ~(UPLL_RESET_MASK | UPLL_SLEEP_MASK));
87 
88 	/* assert BYPASS EN and FB_DIV[0] <- ??? why? */
89 	WREG32_P(CG_UPLL_FUNC_CNTL, UPLL_BYPASS_EN_MASK, ~UPLL_BYPASS_EN_MASK);
90 	WREG32_P(CG_UPLL_FUNC_CNTL_3, UPLL_FB_DIV(1), ~UPLL_FB_DIV(1));
91 
92 	r = radeon_uvd_send_upll_ctlreq(rdev, CG_UPLL_FUNC_CNTL);
93 	if (r)
94 		return r;
95 
96 	/* assert PLL_RESET */
97 	WREG32_P(CG_UPLL_FUNC_CNTL, UPLL_RESET_MASK, ~UPLL_RESET_MASK);
98 
99 	/* set the required FB_DIV, REF_DIV, Post divder values */
100 	WREG32_P(CG_UPLL_FUNC_CNTL, UPLL_REF_DIV(1), ~UPLL_REF_DIV_MASK);
101 	WREG32_P(CG_UPLL_FUNC_CNTL_2,
102 		 UPLL_SW_HILEN(vclk_div >> 1) |
103 		 UPLL_SW_LOLEN((vclk_div >> 1) + (vclk_div & 1)) |
104 		 UPLL_SW_HILEN2(dclk_div >> 1) |
105 		 UPLL_SW_LOLEN2((dclk_div >> 1) + (dclk_div & 1)),
106 		 ~UPLL_SW_MASK);
107 
108 	WREG32_P(CG_UPLL_FUNC_CNTL_3, UPLL_FB_DIV(fb_div),
109 		 ~UPLL_FB_DIV_MASK);
110 
111 	/* give the PLL some time to settle */
112 	mdelay(15);
113 
114 	/* deassert PLL_RESET */
115 	WREG32_P(CG_UPLL_FUNC_CNTL, 0, ~UPLL_RESET_MASK);
116 
117 	mdelay(15);
118 
119 	/* deassert BYPASS EN and FB_DIV[0] <- ??? why? */
120 	WREG32_P(CG_UPLL_FUNC_CNTL, 0, ~UPLL_BYPASS_EN_MASK);
121 	WREG32_P(CG_UPLL_FUNC_CNTL_3, 0, ~UPLL_FB_DIV(1));
122 
123 	r = radeon_uvd_send_upll_ctlreq(rdev, CG_UPLL_FUNC_CNTL);
124 	if (r)
125 		return r;
126 
127 	/* switch VCLK and DCLK selection */
128 	WREG32_P(CG_UPLL_FUNC_CNTL_2,
129 		 VCLK_SRC_SEL(2) | DCLK_SRC_SEL(2),
130 		 ~(VCLK_SRC_SEL_MASK | DCLK_SRC_SEL_MASK));
131 
132 	mdelay(100);
133 
134 	return 0;
135 }
136 
137 static const u32 r7xx_golden_registers[] =
138 {
139 	0x8d00, 0xffffffff, 0x0e0e0074,
140 	0x8d04, 0xffffffff, 0x013a2b34,
141 	0x9508, 0xffffffff, 0x00000002,
142 	0x8b20, 0xffffffff, 0,
143 	0x88c4, 0xffffffff, 0x000000c2,
144 	0x28350, 0xffffffff, 0,
145 	0x9058, 0xffffffff, 0x0fffc40f,
146 	0x240c, 0xffffffff, 0x00000380,
147 	0x733c, 0xffffffff, 0x00000002,
148 	0x2650, 0x00040000, 0,
149 	0x20bc, 0x00040000, 0,
150 	0x7300, 0xffffffff, 0x001000f0
151 };
152 
153 static const u32 r7xx_golden_dyn_gpr_registers[] =
154 {
155 	0x8db0, 0xffffffff, 0x98989898,
156 	0x8db4, 0xffffffff, 0x98989898,
157 	0x8db8, 0xffffffff, 0x98989898,
158 	0x8dbc, 0xffffffff, 0x98989898,
159 	0x8dc0, 0xffffffff, 0x98989898,
160 	0x8dc4, 0xffffffff, 0x98989898,
161 	0x8dc8, 0xffffffff, 0x98989898,
162 	0x8dcc, 0xffffffff, 0x98989898,
163 	0x88c4, 0xffffffff, 0x00000082
164 };
165 
166 static const u32 rv770_golden_registers[] =
167 {
168 	0x562c, 0xffffffff, 0,
169 	0x3f90, 0xffffffff, 0,
170 	0x9148, 0xffffffff, 0,
171 	0x3f94, 0xffffffff, 0,
172 	0x914c, 0xffffffff, 0,
173 	0x9698, 0x18000000, 0x18000000
174 };
175 
176 static const u32 rv770ce_golden_registers[] =
177 {
178 	0x562c, 0xffffffff, 0,
179 	0x3f90, 0xffffffff, 0x00cc0000,
180 	0x9148, 0xffffffff, 0x00cc0000,
181 	0x3f94, 0xffffffff, 0x00cc0000,
182 	0x914c, 0xffffffff, 0x00cc0000,
183 	0x9b7c, 0xffffffff, 0x00fa0000,
184 	0x3f8c, 0xffffffff, 0x00fa0000,
185 	0x9698, 0x18000000, 0x18000000
186 };
187 
188 static const u32 rv770_mgcg_init[] =
189 {
190 	0x8bcc, 0xffffffff, 0x130300f9,
191 	0x5448, 0xffffffff, 0x100,
192 	0x55e4, 0xffffffff, 0x100,
193 	0x160c, 0xffffffff, 0x100,
194 	0x5644, 0xffffffff, 0x100,
195 	0xc164, 0xffffffff, 0x100,
196 	0x8a18, 0xffffffff, 0x100,
197 	0x897c, 0xffffffff, 0x8000100,
198 	0x8b28, 0xffffffff, 0x3c000100,
199 	0x9144, 0xffffffff, 0x100,
200 	0x9a1c, 0xffffffff, 0x10000,
201 	0x9a50, 0xffffffff, 0x100,
202 	0x9a1c, 0xffffffff, 0x10001,
203 	0x9a50, 0xffffffff, 0x100,
204 	0x9a1c, 0xffffffff, 0x10002,
205 	0x9a50, 0xffffffff, 0x100,
206 	0x9a1c, 0xffffffff, 0x10003,
207 	0x9a50, 0xffffffff, 0x100,
208 	0x9a1c, 0xffffffff, 0x0,
209 	0x9870, 0xffffffff, 0x100,
210 	0x8d58, 0xffffffff, 0x100,
211 	0x9500, 0xffffffff, 0x0,
212 	0x9510, 0xffffffff, 0x100,
213 	0x9500, 0xffffffff, 0x1,
214 	0x9510, 0xffffffff, 0x100,
215 	0x9500, 0xffffffff, 0x2,
216 	0x9510, 0xffffffff, 0x100,
217 	0x9500, 0xffffffff, 0x3,
218 	0x9510, 0xffffffff, 0x100,
219 	0x9500, 0xffffffff, 0x4,
220 	0x9510, 0xffffffff, 0x100,
221 	0x9500, 0xffffffff, 0x5,
222 	0x9510, 0xffffffff, 0x100,
223 	0x9500, 0xffffffff, 0x6,
224 	0x9510, 0xffffffff, 0x100,
225 	0x9500, 0xffffffff, 0x7,
226 	0x9510, 0xffffffff, 0x100,
227 	0x9500, 0xffffffff, 0x8,
228 	0x9510, 0xffffffff, 0x100,
229 	0x9500, 0xffffffff, 0x9,
230 	0x9510, 0xffffffff, 0x100,
231 	0x9500, 0xffffffff, 0x8000,
232 	0x9490, 0xffffffff, 0x0,
233 	0x949c, 0xffffffff, 0x100,
234 	0x9490, 0xffffffff, 0x1,
235 	0x949c, 0xffffffff, 0x100,
236 	0x9490, 0xffffffff, 0x2,
237 	0x949c, 0xffffffff, 0x100,
238 	0x9490, 0xffffffff, 0x3,
239 	0x949c, 0xffffffff, 0x100,
240 	0x9490, 0xffffffff, 0x4,
241 	0x949c, 0xffffffff, 0x100,
242 	0x9490, 0xffffffff, 0x5,
243 	0x949c, 0xffffffff, 0x100,
244 	0x9490, 0xffffffff, 0x6,
245 	0x949c, 0xffffffff, 0x100,
246 	0x9490, 0xffffffff, 0x7,
247 	0x949c, 0xffffffff, 0x100,
248 	0x9490, 0xffffffff, 0x8,
249 	0x949c, 0xffffffff, 0x100,
250 	0x9490, 0xffffffff, 0x9,
251 	0x949c, 0xffffffff, 0x100,
252 	0x9490, 0xffffffff, 0x8000,
253 	0x9604, 0xffffffff, 0x0,
254 	0x9654, 0xffffffff, 0x100,
255 	0x9604, 0xffffffff, 0x1,
256 	0x9654, 0xffffffff, 0x100,
257 	0x9604, 0xffffffff, 0x2,
258 	0x9654, 0xffffffff, 0x100,
259 	0x9604, 0xffffffff, 0x3,
260 	0x9654, 0xffffffff, 0x100,
261 	0x9604, 0xffffffff, 0x4,
262 	0x9654, 0xffffffff, 0x100,
263 	0x9604, 0xffffffff, 0x5,
264 	0x9654, 0xffffffff, 0x100,
265 	0x9604, 0xffffffff, 0x6,
266 	0x9654, 0xffffffff, 0x100,
267 	0x9604, 0xffffffff, 0x7,
268 	0x9654, 0xffffffff, 0x100,
269 	0x9604, 0xffffffff, 0x8,
270 	0x9654, 0xffffffff, 0x100,
271 	0x9604, 0xffffffff, 0x9,
272 	0x9654, 0xffffffff, 0x100,
273 	0x9604, 0xffffffff, 0x80000000,
274 	0x9030, 0xffffffff, 0x100,
275 	0x9034, 0xffffffff, 0x100,
276 	0x9038, 0xffffffff, 0x100,
277 	0x903c, 0xffffffff, 0x100,
278 	0x9040, 0xffffffff, 0x100,
279 	0xa200, 0xffffffff, 0x100,
280 	0xa204, 0xffffffff, 0x100,
281 	0xa208, 0xffffffff, 0x100,
282 	0xa20c, 0xffffffff, 0x100,
283 	0x971c, 0xffffffff, 0x100,
284 	0x915c, 0xffffffff, 0x00020001,
285 	0x9160, 0xffffffff, 0x00040003,
286 	0x916c, 0xffffffff, 0x00060005,
287 	0x9170, 0xffffffff, 0x00080007,
288 	0x9174, 0xffffffff, 0x000a0009,
289 	0x9178, 0xffffffff, 0x000c000b,
290 	0x917c, 0xffffffff, 0x000e000d,
291 	0x9180, 0xffffffff, 0x0010000f,
292 	0x918c, 0xffffffff, 0x00120011,
293 	0x9190, 0xffffffff, 0x00140013,
294 	0x9194, 0xffffffff, 0x00020001,
295 	0x9198, 0xffffffff, 0x00040003,
296 	0x919c, 0xffffffff, 0x00060005,
297 	0x91a8, 0xffffffff, 0x00080007,
298 	0x91ac, 0xffffffff, 0x000a0009,
299 	0x91b0, 0xffffffff, 0x000c000b,
300 	0x91b4, 0xffffffff, 0x000e000d,
301 	0x91b8, 0xffffffff, 0x0010000f,
302 	0x91c4, 0xffffffff, 0x00120011,
303 	0x91c8, 0xffffffff, 0x00140013,
304 	0x91cc, 0xffffffff, 0x00020001,
305 	0x91d0, 0xffffffff, 0x00040003,
306 	0x91d4, 0xffffffff, 0x00060005,
307 	0x91e0, 0xffffffff, 0x00080007,
308 	0x91e4, 0xffffffff, 0x000a0009,
309 	0x91e8, 0xffffffff, 0x000c000b,
310 	0x91ec, 0xffffffff, 0x00020001,
311 	0x91f0, 0xffffffff, 0x00040003,
312 	0x91f4, 0xffffffff, 0x00060005,
313 	0x9200, 0xffffffff, 0x00080007,
314 	0x9204, 0xffffffff, 0x000a0009,
315 	0x9208, 0xffffffff, 0x000c000b,
316 	0x920c, 0xffffffff, 0x000e000d,
317 	0x9210, 0xffffffff, 0x0010000f,
318 	0x921c, 0xffffffff, 0x00120011,
319 	0x9220, 0xffffffff, 0x00140013,
320 	0x9224, 0xffffffff, 0x00020001,
321 	0x9228, 0xffffffff, 0x00040003,
322 	0x922c, 0xffffffff, 0x00060005,
323 	0x9238, 0xffffffff, 0x00080007,
324 	0x923c, 0xffffffff, 0x000a0009,
325 	0x9240, 0xffffffff, 0x000c000b,
326 	0x9244, 0xffffffff, 0x000e000d,
327 	0x9248, 0xffffffff, 0x0010000f,
328 	0x9254, 0xffffffff, 0x00120011,
329 	0x9258, 0xffffffff, 0x00140013,
330 	0x925c, 0xffffffff, 0x00020001,
331 	0x9260, 0xffffffff, 0x00040003,
332 	0x9264, 0xffffffff, 0x00060005,
333 	0x9270, 0xffffffff, 0x00080007,
334 	0x9274, 0xffffffff, 0x000a0009,
335 	0x9278, 0xffffffff, 0x000c000b,
336 	0x927c, 0xffffffff, 0x000e000d,
337 	0x9280, 0xffffffff, 0x0010000f,
338 	0x928c, 0xffffffff, 0x00120011,
339 	0x9290, 0xffffffff, 0x00140013,
340 	0x9294, 0xffffffff, 0x00020001,
341 	0x929c, 0xffffffff, 0x00040003,
342 	0x92a0, 0xffffffff, 0x00060005,
343 	0x92a4, 0xffffffff, 0x00080007
344 };
345 
346 static const u32 rv710_golden_registers[] =
347 {
348 	0x3f90, 0x00ff0000, 0x00fc0000,
349 	0x9148, 0x00ff0000, 0x00fc0000,
350 	0x3f94, 0x00ff0000, 0x00fc0000,
351 	0x914c, 0x00ff0000, 0x00fc0000,
352 	0xb4c, 0x00000020, 0x00000020,
353 	0xa180, 0xffffffff, 0x00003f3f
354 };
355 
356 static const u32 rv710_mgcg_init[] =
357 {
358 	0x8bcc, 0xffffffff, 0x13030040,
359 	0x5448, 0xffffffff, 0x100,
360 	0x55e4, 0xffffffff, 0x100,
361 	0x160c, 0xffffffff, 0x100,
362 	0x5644, 0xffffffff, 0x100,
363 	0xc164, 0xffffffff, 0x100,
364 	0x8a18, 0xffffffff, 0x100,
365 	0x897c, 0xffffffff, 0x8000100,
366 	0x8b28, 0xffffffff, 0x3c000100,
367 	0x9144, 0xffffffff, 0x100,
368 	0x9a1c, 0xffffffff, 0x10000,
369 	0x9a50, 0xffffffff, 0x100,
370 	0x9a1c, 0xffffffff, 0x0,
371 	0x9870, 0xffffffff, 0x100,
372 	0x8d58, 0xffffffff, 0x100,
373 	0x9500, 0xffffffff, 0x0,
374 	0x9510, 0xffffffff, 0x100,
375 	0x9500, 0xffffffff, 0x1,
376 	0x9510, 0xffffffff, 0x100,
377 	0x9500, 0xffffffff, 0x8000,
378 	0x9490, 0xffffffff, 0x0,
379 	0x949c, 0xffffffff, 0x100,
380 	0x9490, 0xffffffff, 0x1,
381 	0x949c, 0xffffffff, 0x100,
382 	0x9490, 0xffffffff, 0x8000,
383 	0x9604, 0xffffffff, 0x0,
384 	0x9654, 0xffffffff, 0x100,
385 	0x9604, 0xffffffff, 0x1,
386 	0x9654, 0xffffffff, 0x100,
387 	0x9604, 0xffffffff, 0x80000000,
388 	0x9030, 0xffffffff, 0x100,
389 	0x9034, 0xffffffff, 0x100,
390 	0x9038, 0xffffffff, 0x100,
391 	0x903c, 0xffffffff, 0x100,
392 	0x9040, 0xffffffff, 0x100,
393 	0xa200, 0xffffffff, 0x100,
394 	0xa204, 0xffffffff, 0x100,
395 	0xa208, 0xffffffff, 0x100,
396 	0xa20c, 0xffffffff, 0x100,
397 	0x971c, 0xffffffff, 0x100,
398 	0x915c, 0xffffffff, 0x00020001,
399 	0x9174, 0xffffffff, 0x00000003,
400 	0x9178, 0xffffffff, 0x00050001,
401 	0x917c, 0xffffffff, 0x00030002,
402 	0x918c, 0xffffffff, 0x00000004,
403 	0x9190, 0xffffffff, 0x00070006,
404 	0x9194, 0xffffffff, 0x00050001,
405 	0x9198, 0xffffffff, 0x00030002,
406 	0x91a8, 0xffffffff, 0x00000004,
407 	0x91ac, 0xffffffff, 0x00070006,
408 	0x91e8, 0xffffffff, 0x00000001,
409 	0x9294, 0xffffffff, 0x00000001,
410 	0x929c, 0xffffffff, 0x00000002,
411 	0x92a0, 0xffffffff, 0x00040003,
412 	0x9150, 0xffffffff, 0x4d940000
413 };
414 
415 static const u32 rv730_golden_registers[] =
416 {
417 	0x3f90, 0x00ff0000, 0x00f00000,
418 	0x9148, 0x00ff0000, 0x00f00000,
419 	0x3f94, 0x00ff0000, 0x00f00000,
420 	0x914c, 0x00ff0000, 0x00f00000,
421 	0x900c, 0xffffffff, 0x003b033f,
422 	0xb4c, 0x00000020, 0x00000020,
423 	0xa180, 0xffffffff, 0x00003f3f
424 };
425 
426 static const u32 rv730_mgcg_init[] =
427 {
428 	0x8bcc, 0xffffffff, 0x130300f9,
429 	0x5448, 0xffffffff, 0x100,
430 	0x55e4, 0xffffffff, 0x100,
431 	0x160c, 0xffffffff, 0x100,
432 	0x5644, 0xffffffff, 0x100,
433 	0xc164, 0xffffffff, 0x100,
434 	0x8a18, 0xffffffff, 0x100,
435 	0x897c, 0xffffffff, 0x8000100,
436 	0x8b28, 0xffffffff, 0x3c000100,
437 	0x9144, 0xffffffff, 0x100,
438 	0x9a1c, 0xffffffff, 0x10000,
439 	0x9a50, 0xffffffff, 0x100,
440 	0x9a1c, 0xffffffff, 0x10001,
441 	0x9a50, 0xffffffff, 0x100,
442 	0x9a1c, 0xffffffff, 0x0,
443 	0x9870, 0xffffffff, 0x100,
444 	0x8d58, 0xffffffff, 0x100,
445 	0x9500, 0xffffffff, 0x0,
446 	0x9510, 0xffffffff, 0x100,
447 	0x9500, 0xffffffff, 0x1,
448 	0x9510, 0xffffffff, 0x100,
449 	0x9500, 0xffffffff, 0x2,
450 	0x9510, 0xffffffff, 0x100,
451 	0x9500, 0xffffffff, 0x3,
452 	0x9510, 0xffffffff, 0x100,
453 	0x9500, 0xffffffff, 0x4,
454 	0x9510, 0xffffffff, 0x100,
455 	0x9500, 0xffffffff, 0x5,
456 	0x9510, 0xffffffff, 0x100,
457 	0x9500, 0xffffffff, 0x6,
458 	0x9510, 0xffffffff, 0x100,
459 	0x9500, 0xffffffff, 0x7,
460 	0x9510, 0xffffffff, 0x100,
461 	0x9500, 0xffffffff, 0x8000,
462 	0x9490, 0xffffffff, 0x0,
463 	0x949c, 0xffffffff, 0x100,
464 	0x9490, 0xffffffff, 0x1,
465 	0x949c, 0xffffffff, 0x100,
466 	0x9490, 0xffffffff, 0x2,
467 	0x949c, 0xffffffff, 0x100,
468 	0x9490, 0xffffffff, 0x3,
469 	0x949c, 0xffffffff, 0x100,
470 	0x9490, 0xffffffff, 0x4,
471 	0x949c, 0xffffffff, 0x100,
472 	0x9490, 0xffffffff, 0x5,
473 	0x949c, 0xffffffff, 0x100,
474 	0x9490, 0xffffffff, 0x6,
475 	0x949c, 0xffffffff, 0x100,
476 	0x9490, 0xffffffff, 0x7,
477 	0x949c, 0xffffffff, 0x100,
478 	0x9490, 0xffffffff, 0x8000,
479 	0x9604, 0xffffffff, 0x0,
480 	0x9654, 0xffffffff, 0x100,
481 	0x9604, 0xffffffff, 0x1,
482 	0x9654, 0xffffffff, 0x100,
483 	0x9604, 0xffffffff, 0x2,
484 	0x9654, 0xffffffff, 0x100,
485 	0x9604, 0xffffffff, 0x3,
486 	0x9654, 0xffffffff, 0x100,
487 	0x9604, 0xffffffff, 0x4,
488 	0x9654, 0xffffffff, 0x100,
489 	0x9604, 0xffffffff, 0x5,
490 	0x9654, 0xffffffff, 0x100,
491 	0x9604, 0xffffffff, 0x6,
492 	0x9654, 0xffffffff, 0x100,
493 	0x9604, 0xffffffff, 0x7,
494 	0x9654, 0xffffffff, 0x100,
495 	0x9604, 0xffffffff, 0x80000000,
496 	0x9030, 0xffffffff, 0x100,
497 	0x9034, 0xffffffff, 0x100,
498 	0x9038, 0xffffffff, 0x100,
499 	0x903c, 0xffffffff, 0x100,
500 	0x9040, 0xffffffff, 0x100,
501 	0xa200, 0xffffffff, 0x100,
502 	0xa204, 0xffffffff, 0x100,
503 	0xa208, 0xffffffff, 0x100,
504 	0xa20c, 0xffffffff, 0x100,
505 	0x971c, 0xffffffff, 0x100,
506 	0x915c, 0xffffffff, 0x00020001,
507 	0x916c, 0xffffffff, 0x00040003,
508 	0x9170, 0xffffffff, 0x00000005,
509 	0x9178, 0xffffffff, 0x00050001,
510 	0x917c, 0xffffffff, 0x00030002,
511 	0x918c, 0xffffffff, 0x00000004,
512 	0x9190, 0xffffffff, 0x00070006,
513 	0x9194, 0xffffffff, 0x00050001,
514 	0x9198, 0xffffffff, 0x00030002,
515 	0x91a8, 0xffffffff, 0x00000004,
516 	0x91ac, 0xffffffff, 0x00070006,
517 	0x91b0, 0xffffffff, 0x00050001,
518 	0x91b4, 0xffffffff, 0x00030002,
519 	0x91c4, 0xffffffff, 0x00000004,
520 	0x91c8, 0xffffffff, 0x00070006,
521 	0x91cc, 0xffffffff, 0x00050001,
522 	0x91d0, 0xffffffff, 0x00030002,
523 	0x91e0, 0xffffffff, 0x00000004,
524 	0x91e4, 0xffffffff, 0x00070006,
525 	0x91e8, 0xffffffff, 0x00000001,
526 	0x91ec, 0xffffffff, 0x00050001,
527 	0x91f0, 0xffffffff, 0x00030002,
528 	0x9200, 0xffffffff, 0x00000004,
529 	0x9204, 0xffffffff, 0x00070006,
530 	0x9208, 0xffffffff, 0x00050001,
531 	0x920c, 0xffffffff, 0x00030002,
532 	0x921c, 0xffffffff, 0x00000004,
533 	0x9220, 0xffffffff, 0x00070006,
534 	0x9224, 0xffffffff, 0x00050001,
535 	0x9228, 0xffffffff, 0x00030002,
536 	0x9238, 0xffffffff, 0x00000004,
537 	0x923c, 0xffffffff, 0x00070006,
538 	0x9240, 0xffffffff, 0x00050001,
539 	0x9244, 0xffffffff, 0x00030002,
540 	0x9254, 0xffffffff, 0x00000004,
541 	0x9258, 0xffffffff, 0x00070006,
542 	0x9294, 0xffffffff, 0x00000001,
543 	0x929c, 0xffffffff, 0x00000002,
544 	0x92a0, 0xffffffff, 0x00040003,
545 	0x92a4, 0xffffffff, 0x00000005
546 };
547 
548 static const u32 rv740_golden_registers[] =
549 {
550 	0x88c4, 0xffffffff, 0x00000082,
551 	0x28a50, 0xfffffffc, 0x00000004,
552 	0x2650, 0x00040000, 0,
553 	0x20bc, 0x00040000, 0,
554 	0x733c, 0xffffffff, 0x00000002,
555 	0x7300, 0xffffffff, 0x001000f0,
556 	0x3f90, 0x00ff0000, 0,
557 	0x9148, 0x00ff0000, 0,
558 	0x3f94, 0x00ff0000, 0,
559 	0x914c, 0x00ff0000, 0,
560 	0x240c, 0xffffffff, 0x00000380,
561 	0x8a14, 0x00000007, 0x00000007,
562 	0x8b24, 0xffffffff, 0x00ff0fff,
563 	0x28a4c, 0xffffffff, 0x00004000,
564 	0xa180, 0xffffffff, 0x00003f3f,
565 	0x8d00, 0xffffffff, 0x0e0e003a,
566 	0x8d04, 0xffffffff, 0x013a0e2a,
567 	0x8c00, 0xffffffff, 0xe400000f,
568 	0x8db0, 0xffffffff, 0x98989898,
569 	0x8db4, 0xffffffff, 0x98989898,
570 	0x8db8, 0xffffffff, 0x98989898,
571 	0x8dbc, 0xffffffff, 0x98989898,
572 	0x8dc0, 0xffffffff, 0x98989898,
573 	0x8dc4, 0xffffffff, 0x98989898,
574 	0x8dc8, 0xffffffff, 0x98989898,
575 	0x8dcc, 0xffffffff, 0x98989898,
576 	0x9058, 0xffffffff, 0x0fffc40f,
577 	0x900c, 0xffffffff, 0x003b033f,
578 	0x28350, 0xffffffff, 0,
579 	0x8cf0, 0x1fffffff, 0x08e00420,
580 	0x9508, 0xffffffff, 0x00000002,
581 	0x88c4, 0xffffffff, 0x000000c2,
582 	0x9698, 0x18000000, 0x18000000
583 };
584 
585 static const u32 rv740_mgcg_init[] =
586 {
587 	0x8bcc, 0xffffffff, 0x13030100,
588 	0x5448, 0xffffffff, 0x100,
589 	0x55e4, 0xffffffff, 0x100,
590 	0x160c, 0xffffffff, 0x100,
591 	0x5644, 0xffffffff, 0x100,
592 	0xc164, 0xffffffff, 0x100,
593 	0x8a18, 0xffffffff, 0x100,
594 	0x897c, 0xffffffff, 0x100,
595 	0x8b28, 0xffffffff, 0x100,
596 	0x9144, 0xffffffff, 0x100,
597 	0x9a1c, 0xffffffff, 0x10000,
598 	0x9a50, 0xffffffff, 0x100,
599 	0x9a1c, 0xffffffff, 0x10001,
600 	0x9a50, 0xffffffff, 0x100,
601 	0x9a1c, 0xffffffff, 0x10002,
602 	0x9a50, 0xffffffff, 0x100,
603 	0x9a1c, 0xffffffff, 0x10003,
604 	0x9a50, 0xffffffff, 0x100,
605 	0x9a1c, 0xffffffff, 0x0,
606 	0x9870, 0xffffffff, 0x100,
607 	0x8d58, 0xffffffff, 0x100,
608 	0x9500, 0xffffffff, 0x0,
609 	0x9510, 0xffffffff, 0x100,
610 	0x9500, 0xffffffff, 0x1,
611 	0x9510, 0xffffffff, 0x100,
612 	0x9500, 0xffffffff, 0x2,
613 	0x9510, 0xffffffff, 0x100,
614 	0x9500, 0xffffffff, 0x3,
615 	0x9510, 0xffffffff, 0x100,
616 	0x9500, 0xffffffff, 0x4,
617 	0x9510, 0xffffffff, 0x100,
618 	0x9500, 0xffffffff, 0x5,
619 	0x9510, 0xffffffff, 0x100,
620 	0x9500, 0xffffffff, 0x6,
621 	0x9510, 0xffffffff, 0x100,
622 	0x9500, 0xffffffff, 0x7,
623 	0x9510, 0xffffffff, 0x100,
624 	0x9500, 0xffffffff, 0x8000,
625 	0x9490, 0xffffffff, 0x0,
626 	0x949c, 0xffffffff, 0x100,
627 	0x9490, 0xffffffff, 0x1,
628 	0x949c, 0xffffffff, 0x100,
629 	0x9490, 0xffffffff, 0x2,
630 	0x949c, 0xffffffff, 0x100,
631 	0x9490, 0xffffffff, 0x3,
632 	0x949c, 0xffffffff, 0x100,
633 	0x9490, 0xffffffff, 0x4,
634 	0x949c, 0xffffffff, 0x100,
635 	0x9490, 0xffffffff, 0x5,
636 	0x949c, 0xffffffff, 0x100,
637 	0x9490, 0xffffffff, 0x6,
638 	0x949c, 0xffffffff, 0x100,
639 	0x9490, 0xffffffff, 0x7,
640 	0x949c, 0xffffffff, 0x100,
641 	0x9490, 0xffffffff, 0x8000,
642 	0x9604, 0xffffffff, 0x0,
643 	0x9654, 0xffffffff, 0x100,
644 	0x9604, 0xffffffff, 0x1,
645 	0x9654, 0xffffffff, 0x100,
646 	0x9604, 0xffffffff, 0x2,
647 	0x9654, 0xffffffff, 0x100,
648 	0x9604, 0xffffffff, 0x3,
649 	0x9654, 0xffffffff, 0x100,
650 	0x9604, 0xffffffff, 0x4,
651 	0x9654, 0xffffffff, 0x100,
652 	0x9604, 0xffffffff, 0x5,
653 	0x9654, 0xffffffff, 0x100,
654 	0x9604, 0xffffffff, 0x6,
655 	0x9654, 0xffffffff, 0x100,
656 	0x9604, 0xffffffff, 0x7,
657 	0x9654, 0xffffffff, 0x100,
658 	0x9604, 0xffffffff, 0x80000000,
659 	0x9030, 0xffffffff, 0x100,
660 	0x9034, 0xffffffff, 0x100,
661 	0x9038, 0xffffffff, 0x100,
662 	0x903c, 0xffffffff, 0x100,
663 	0x9040, 0xffffffff, 0x100,
664 	0xa200, 0xffffffff, 0x100,
665 	0xa204, 0xffffffff, 0x100,
666 	0xa208, 0xffffffff, 0x100,
667 	0xa20c, 0xffffffff, 0x100,
668 	0x971c, 0xffffffff, 0x100,
669 	0x915c, 0xffffffff, 0x00020001,
670 	0x9160, 0xffffffff, 0x00040003,
671 	0x916c, 0xffffffff, 0x00060005,
672 	0x9170, 0xffffffff, 0x00080007,
673 	0x9174, 0xffffffff, 0x000a0009,
674 	0x9178, 0xffffffff, 0x000c000b,
675 	0x917c, 0xffffffff, 0x000e000d,
676 	0x9180, 0xffffffff, 0x0010000f,
677 	0x918c, 0xffffffff, 0x00120011,
678 	0x9190, 0xffffffff, 0x00140013,
679 	0x9194, 0xffffffff, 0x00020001,
680 	0x9198, 0xffffffff, 0x00040003,
681 	0x919c, 0xffffffff, 0x00060005,
682 	0x91a8, 0xffffffff, 0x00080007,
683 	0x91ac, 0xffffffff, 0x000a0009,
684 	0x91b0, 0xffffffff, 0x000c000b,
685 	0x91b4, 0xffffffff, 0x000e000d,
686 	0x91b8, 0xffffffff, 0x0010000f,
687 	0x91c4, 0xffffffff, 0x00120011,
688 	0x91c8, 0xffffffff, 0x00140013,
689 	0x91cc, 0xffffffff, 0x00020001,
690 	0x91d0, 0xffffffff, 0x00040003,
691 	0x91d4, 0xffffffff, 0x00060005,
692 	0x91e0, 0xffffffff, 0x00080007,
693 	0x91e4, 0xffffffff, 0x000a0009,
694 	0x91e8, 0xffffffff, 0x000c000b,
695 	0x91ec, 0xffffffff, 0x00020001,
696 	0x91f0, 0xffffffff, 0x00040003,
697 	0x91f4, 0xffffffff, 0x00060005,
698 	0x9200, 0xffffffff, 0x00080007,
699 	0x9204, 0xffffffff, 0x000a0009,
700 	0x9208, 0xffffffff, 0x000c000b,
701 	0x920c, 0xffffffff, 0x000e000d,
702 	0x9210, 0xffffffff, 0x0010000f,
703 	0x921c, 0xffffffff, 0x00120011,
704 	0x9220, 0xffffffff, 0x00140013,
705 	0x9224, 0xffffffff, 0x00020001,
706 	0x9228, 0xffffffff, 0x00040003,
707 	0x922c, 0xffffffff, 0x00060005,
708 	0x9238, 0xffffffff, 0x00080007,
709 	0x923c, 0xffffffff, 0x000a0009,
710 	0x9240, 0xffffffff, 0x000c000b,
711 	0x9244, 0xffffffff, 0x000e000d,
712 	0x9248, 0xffffffff, 0x0010000f,
713 	0x9254, 0xffffffff, 0x00120011,
714 	0x9258, 0xffffffff, 0x00140013,
715 	0x9294, 0xffffffff, 0x00020001,
716 	0x929c, 0xffffffff, 0x00040003,
717 	0x92a0, 0xffffffff, 0x00060005,
718 	0x92a4, 0xffffffff, 0x00080007
719 };
720 
721 static void rv770_init_golden_registers(struct radeon_device *rdev)
722 {
723 	switch (rdev->family) {
724 	case CHIP_RV770:
725 		radeon_program_register_sequence(rdev,
726 						 r7xx_golden_registers,
727 						 (const u32)ARRAY_SIZE(r7xx_golden_registers));
728 		radeon_program_register_sequence(rdev,
729 						 r7xx_golden_dyn_gpr_registers,
730 						 (const u32)ARRAY_SIZE(r7xx_golden_dyn_gpr_registers));
731 		if (rdev->pdev->device == 0x994e)
732 			radeon_program_register_sequence(rdev,
733 							 rv770ce_golden_registers,
734 							 (const u32)ARRAY_SIZE(rv770ce_golden_registers));
735 		else
736 			radeon_program_register_sequence(rdev,
737 							 rv770_golden_registers,
738 							 (const u32)ARRAY_SIZE(rv770_golden_registers));
739 		radeon_program_register_sequence(rdev,
740 						 rv770_mgcg_init,
741 						 (const u32)ARRAY_SIZE(rv770_mgcg_init));
742 		break;
743 	case CHIP_RV730:
744 		radeon_program_register_sequence(rdev,
745 						 r7xx_golden_registers,
746 						 (const u32)ARRAY_SIZE(r7xx_golden_registers));
747 		radeon_program_register_sequence(rdev,
748 						 r7xx_golden_dyn_gpr_registers,
749 						 (const u32)ARRAY_SIZE(r7xx_golden_dyn_gpr_registers));
750 		radeon_program_register_sequence(rdev,
751 						 rv730_golden_registers,
752 						 (const u32)ARRAY_SIZE(rv730_golden_registers));
753 		radeon_program_register_sequence(rdev,
754 						 rv730_mgcg_init,
755 						 (const u32)ARRAY_SIZE(rv730_mgcg_init));
756 		break;
757 	case CHIP_RV710:
758 		radeon_program_register_sequence(rdev,
759 						 r7xx_golden_registers,
760 						 (const u32)ARRAY_SIZE(r7xx_golden_registers));
761 		radeon_program_register_sequence(rdev,
762 						 r7xx_golden_dyn_gpr_registers,
763 						 (const u32)ARRAY_SIZE(r7xx_golden_dyn_gpr_registers));
764 		radeon_program_register_sequence(rdev,
765 						 rv710_golden_registers,
766 						 (const u32)ARRAY_SIZE(rv710_golden_registers));
767 		radeon_program_register_sequence(rdev,
768 						 rv710_mgcg_init,
769 						 (const u32)ARRAY_SIZE(rv710_mgcg_init));
770 		break;
771 	case CHIP_RV740:
772 		radeon_program_register_sequence(rdev,
773 						 rv740_golden_registers,
774 						 (const u32)ARRAY_SIZE(rv740_golden_registers));
775 		radeon_program_register_sequence(rdev,
776 						 rv740_mgcg_init,
777 						 (const u32)ARRAY_SIZE(rv740_mgcg_init));
778 		break;
779 	default:
780 		break;
781 	}
782 }
783 
784 #define PCIE_BUS_CLK                10000
785 #define TCLK                        (PCIE_BUS_CLK / 10)
786 
787 /**
788  * rv770_get_xclk - get the xclk
789  *
790  * @rdev: radeon_device pointer
791  *
792  * Returns the reference clock used by the gfx engine
793  * (r7xx-cayman).
794  */
795 u32 rv770_get_xclk(struct radeon_device *rdev)
796 {
797 	u32 reference_clock = rdev->clock.spll.reference_freq;
798 	u32 tmp = RREG32(CG_CLKPIN_CNTL);
799 
800 	if (tmp & MUX_TCLK_TO_XCLK)
801 		return TCLK;
802 
803 	if (tmp & XTALIN_DIVIDE)
804 		return reference_clock / 4;
805 
806 	return reference_clock;
807 }
808 
809 void rv770_page_flip(struct radeon_device *rdev, int crtc_id, u64 crtc_base, bool async)
810 {
811 	struct radeon_crtc *radeon_crtc = rdev->mode_info.crtcs[crtc_id];
812 	u32 tmp = RREG32(AVIVO_D1GRPH_UPDATE + radeon_crtc->crtc_offset);
813 	int i;
814 
815 	/* Lock the graphics update lock */
816 	tmp |= AVIVO_D1GRPH_UPDATE_LOCK;
817 	WREG32(AVIVO_D1GRPH_UPDATE + radeon_crtc->crtc_offset, tmp);
818 
819 	/* update the scanout addresses */
820 	WREG32(AVIVO_D1GRPH_FLIP_CONTROL + radeon_crtc->crtc_offset,
821 	       async ? AVIVO_D1GRPH_SURFACE_UPDATE_H_RETRACE_EN : 0);
822 	if (radeon_crtc->crtc_id) {
823 		WREG32(D2GRPH_SECONDARY_SURFACE_ADDRESS_HIGH, upper_32_bits(crtc_base));
824 		WREG32(D2GRPH_PRIMARY_SURFACE_ADDRESS_HIGH, upper_32_bits(crtc_base));
825 	} else {
826 		WREG32(D1GRPH_SECONDARY_SURFACE_ADDRESS_HIGH, upper_32_bits(crtc_base));
827 		WREG32(D1GRPH_PRIMARY_SURFACE_ADDRESS_HIGH, upper_32_bits(crtc_base));
828 	}
829 	WREG32(D1GRPH_SECONDARY_SURFACE_ADDRESS + radeon_crtc->crtc_offset,
830 	       (u32)crtc_base);
831 	WREG32(D1GRPH_PRIMARY_SURFACE_ADDRESS + radeon_crtc->crtc_offset,
832 	       (u32)crtc_base);
833 
834 	/* Wait for update_pending to go high. */
835 	for (i = 0; i < rdev->usec_timeout; i++) {
836 		if (RREG32(AVIVO_D1GRPH_UPDATE + radeon_crtc->crtc_offset) & AVIVO_D1GRPH_SURFACE_UPDATE_PENDING)
837 			break;
838 		udelay(1);
839 	}
840 	DRM_DEBUG("Update pending now high. Unlocking vupdate_lock.\n");
841 
842 	/* Unlock the lock, so double-buffering can take place inside vblank */
843 	tmp &= ~AVIVO_D1GRPH_UPDATE_LOCK;
844 	WREG32(AVIVO_D1GRPH_UPDATE + radeon_crtc->crtc_offset, tmp);
845 }
846 
847 bool rv770_page_flip_pending(struct radeon_device *rdev, int crtc_id)
848 {
849 	struct radeon_crtc *radeon_crtc = rdev->mode_info.crtcs[crtc_id];
850 
851 	/* Return current update_pending status: */
852 	return !!(RREG32(AVIVO_D1GRPH_UPDATE + radeon_crtc->crtc_offset) &
853 		AVIVO_D1GRPH_SURFACE_UPDATE_PENDING);
854 }
855 
856 /* get temperature in millidegrees */
857 int rv770_get_temp(struct radeon_device *rdev)
858 {
859 	u32 temp = (RREG32(CG_MULT_THERMAL_STATUS) & ASIC_T_MASK) >>
860 		ASIC_T_SHIFT;
861 	int actual_temp;
862 
863 	if (temp & 0x400)
864 		actual_temp = -256;
865 	else if (temp & 0x200)
866 		actual_temp = 255;
867 	else if (temp & 0x100) {
868 		actual_temp = temp & 0x1ff;
869 		actual_temp |= ~0x1ff;
870 	} else
871 		actual_temp = temp & 0xff;
872 
873 	return (actual_temp * 1000) / 2;
874 }
875 
876 void rv770_pm_misc(struct radeon_device *rdev)
877 {
878 	int req_ps_idx = rdev->pm.requested_power_state_index;
879 	int req_cm_idx = rdev->pm.requested_clock_mode_index;
880 	struct radeon_power_state *ps = &rdev->pm.power_state[req_ps_idx];
881 	struct radeon_voltage *voltage = &ps->clock_info[req_cm_idx].voltage;
882 
883 	if ((voltage->type == VOLTAGE_SW) && voltage->voltage) {
884 		/* 0xff01 is a flag rather then an actual voltage */
885 		if (voltage->voltage == 0xff01)
886 			return;
887 		if (voltage->voltage != rdev->pm.current_vddc) {
888 			radeon_atom_set_voltage(rdev, voltage->voltage, SET_VOLTAGE_TYPE_ASIC_VDDC);
889 			rdev->pm.current_vddc = voltage->voltage;
890 			DRM_DEBUG("Setting: v: %d\n", voltage->voltage);
891 		}
892 	}
893 }
894 
895 /*
896  * GART
897  */
898 static int rv770_pcie_gart_enable(struct radeon_device *rdev)
899 {
900 	u32 tmp;
901 	int r, i;
902 
903 	if (rdev->gart.robj == NULL) {
904 		dev_err(rdev->dev, "No VRAM object for PCIE GART.\n");
905 		return -EINVAL;
906 	}
907 	r = radeon_gart_table_vram_pin(rdev);
908 	if (r)
909 		return r;
910 	/* Setup L2 cache */
911 	WREG32(VM_L2_CNTL, ENABLE_L2_CACHE | ENABLE_L2_FRAGMENT_PROCESSING |
912 				ENABLE_L2_PTE_CACHE_LRU_UPDATE_BY_WRITE |
913 				EFFECTIVE_L2_QUEUE_SIZE(7));
914 	WREG32(VM_L2_CNTL2, 0);
915 	WREG32(VM_L2_CNTL3, BANK_SELECT(0) | CACHE_UPDATE_MODE(2));
916 	/* Setup TLB control */
917 	tmp = ENABLE_L1_TLB | ENABLE_L1_FRAGMENT_PROCESSING |
918 		SYSTEM_ACCESS_MODE_NOT_IN_SYS |
919 		SYSTEM_APERTURE_UNMAPPED_ACCESS_PASS_THRU |
920 		EFFECTIVE_L1_TLB_SIZE(5) | EFFECTIVE_L1_QUEUE_SIZE(5);
921 	WREG32(MC_VM_MD_L1_TLB0_CNTL, tmp);
922 	WREG32(MC_VM_MD_L1_TLB1_CNTL, tmp);
923 	WREG32(MC_VM_MD_L1_TLB2_CNTL, tmp);
924 	if (rdev->family == CHIP_RV740)
925 		WREG32(MC_VM_MD_L1_TLB3_CNTL, tmp);
926 	WREG32(MC_VM_MB_L1_TLB0_CNTL, tmp);
927 	WREG32(MC_VM_MB_L1_TLB1_CNTL, tmp);
928 	WREG32(MC_VM_MB_L1_TLB2_CNTL, tmp);
929 	WREG32(MC_VM_MB_L1_TLB3_CNTL, tmp);
930 	WREG32(VM_CONTEXT0_PAGE_TABLE_START_ADDR, rdev->mc.gtt_start >> 12);
931 	WREG32(VM_CONTEXT0_PAGE_TABLE_END_ADDR, rdev->mc.gtt_end >> 12);
932 	WREG32(VM_CONTEXT0_PAGE_TABLE_BASE_ADDR, rdev->gart.table_addr >> 12);
933 	WREG32(VM_CONTEXT0_CNTL, ENABLE_CONTEXT | PAGE_TABLE_DEPTH(0) |
934 				RANGE_PROTECTION_FAULT_ENABLE_DEFAULT);
935 	WREG32(VM_CONTEXT0_PROTECTION_FAULT_DEFAULT_ADDR,
936 			(u32)(rdev->dummy_page.addr >> 12));
937 	for (i = 1; i < 7; i++)
938 		WREG32(VM_CONTEXT0_CNTL + (i * 4), 0);
939 
940 	r600_pcie_gart_tlb_flush(rdev);
941 	DRM_INFO("PCIE GART of %uM enabled (table at 0x%016llX).\n",
942 		 (unsigned)(rdev->mc.gtt_size >> 20),
943 		 (unsigned long long)rdev->gart.table_addr);
944 	rdev->gart.ready = true;
945 	return 0;
946 }
947 
948 static void rv770_pcie_gart_disable(struct radeon_device *rdev)
949 {
950 	u32 tmp;
951 	int i;
952 
953 	/* Disable all tables */
954 	for (i = 0; i < 7; i++)
955 		WREG32(VM_CONTEXT0_CNTL + (i * 4), 0);
956 
957 	/* Setup L2 cache */
958 	WREG32(VM_L2_CNTL, ENABLE_L2_FRAGMENT_PROCESSING |
959 				EFFECTIVE_L2_QUEUE_SIZE(7));
960 	WREG32(VM_L2_CNTL2, 0);
961 	WREG32(VM_L2_CNTL3, BANK_SELECT(0) | CACHE_UPDATE_MODE(2));
962 	/* Setup TLB control */
963 	tmp = EFFECTIVE_L1_TLB_SIZE(5) | EFFECTIVE_L1_QUEUE_SIZE(5);
964 	WREG32(MC_VM_MD_L1_TLB0_CNTL, tmp);
965 	WREG32(MC_VM_MD_L1_TLB1_CNTL, tmp);
966 	WREG32(MC_VM_MD_L1_TLB2_CNTL, tmp);
967 	WREG32(MC_VM_MB_L1_TLB0_CNTL, tmp);
968 	WREG32(MC_VM_MB_L1_TLB1_CNTL, tmp);
969 	WREG32(MC_VM_MB_L1_TLB2_CNTL, tmp);
970 	WREG32(MC_VM_MB_L1_TLB3_CNTL, tmp);
971 	radeon_gart_table_vram_unpin(rdev);
972 }
973 
974 static void rv770_pcie_gart_fini(struct radeon_device *rdev)
975 {
976 	radeon_gart_fini(rdev);
977 	rv770_pcie_gart_disable(rdev);
978 	radeon_gart_table_vram_free(rdev);
979 }
980 
981 
982 static void rv770_agp_enable(struct radeon_device *rdev)
983 {
984 	u32 tmp;
985 	int i;
986 
987 	/* Setup L2 cache */
988 	WREG32(VM_L2_CNTL, ENABLE_L2_CACHE | ENABLE_L2_FRAGMENT_PROCESSING |
989 				ENABLE_L2_PTE_CACHE_LRU_UPDATE_BY_WRITE |
990 				EFFECTIVE_L2_QUEUE_SIZE(7));
991 	WREG32(VM_L2_CNTL2, 0);
992 	WREG32(VM_L2_CNTL3, BANK_SELECT(0) | CACHE_UPDATE_MODE(2));
993 	/* Setup TLB control */
994 	tmp = ENABLE_L1_TLB | ENABLE_L1_FRAGMENT_PROCESSING |
995 		SYSTEM_ACCESS_MODE_NOT_IN_SYS |
996 		SYSTEM_APERTURE_UNMAPPED_ACCESS_PASS_THRU |
997 		EFFECTIVE_L1_TLB_SIZE(5) | EFFECTIVE_L1_QUEUE_SIZE(5);
998 	WREG32(MC_VM_MD_L1_TLB0_CNTL, tmp);
999 	WREG32(MC_VM_MD_L1_TLB1_CNTL, tmp);
1000 	WREG32(MC_VM_MD_L1_TLB2_CNTL, tmp);
1001 	WREG32(MC_VM_MB_L1_TLB0_CNTL, tmp);
1002 	WREG32(MC_VM_MB_L1_TLB1_CNTL, tmp);
1003 	WREG32(MC_VM_MB_L1_TLB2_CNTL, tmp);
1004 	WREG32(MC_VM_MB_L1_TLB3_CNTL, tmp);
1005 	for (i = 0; i < 7; i++)
1006 		WREG32(VM_CONTEXT0_CNTL + (i * 4), 0);
1007 }
1008 
1009 static void rv770_mc_program(struct radeon_device *rdev)
1010 {
1011 	struct rv515_mc_save save;
1012 	u32 tmp;
1013 	int i, j;
1014 
1015 	/* Initialize HDP */
1016 	for (i = 0, j = 0; i < 32; i++, j += 0x18) {
1017 		WREG32((0x2c14 + j), 0x00000000);
1018 		WREG32((0x2c18 + j), 0x00000000);
1019 		WREG32((0x2c1c + j), 0x00000000);
1020 		WREG32((0x2c20 + j), 0x00000000);
1021 		WREG32((0x2c24 + j), 0x00000000);
1022 	}
1023 	/* r7xx hw bug.  Read from HDP_DEBUG1 rather
1024 	 * than writing to HDP_REG_COHERENCY_FLUSH_CNTL
1025 	 */
1026 	tmp = RREG32(HDP_DEBUG1);
1027 
1028 	rv515_mc_stop(rdev, &save);
1029 	if (r600_mc_wait_for_idle(rdev)) {
1030 		dev_warn(rdev->dev, "Wait for MC idle timedout !\n");
1031 	}
1032 	/* Lockout access through VGA aperture*/
1033 	WREG32(VGA_HDP_CONTROL, VGA_MEMORY_DISABLE);
1034 	/* Update configuration */
1035 	if (rdev->flags & RADEON_IS_AGP) {
1036 		if (rdev->mc.vram_start < rdev->mc.gtt_start) {
1037 			/* VRAM before AGP */
1038 			WREG32(MC_VM_SYSTEM_APERTURE_LOW_ADDR,
1039 				rdev->mc.vram_start >> 12);
1040 			WREG32(MC_VM_SYSTEM_APERTURE_HIGH_ADDR,
1041 				rdev->mc.gtt_end >> 12);
1042 		} else {
1043 			/* VRAM after AGP */
1044 			WREG32(MC_VM_SYSTEM_APERTURE_LOW_ADDR,
1045 				rdev->mc.gtt_start >> 12);
1046 			WREG32(MC_VM_SYSTEM_APERTURE_HIGH_ADDR,
1047 				rdev->mc.vram_end >> 12);
1048 		}
1049 	} else {
1050 		WREG32(MC_VM_SYSTEM_APERTURE_LOW_ADDR,
1051 			rdev->mc.vram_start >> 12);
1052 		WREG32(MC_VM_SYSTEM_APERTURE_HIGH_ADDR,
1053 			rdev->mc.vram_end >> 12);
1054 	}
1055 	WREG32(MC_VM_SYSTEM_APERTURE_DEFAULT_ADDR, rdev->vram_scratch.gpu_addr >> 12);
1056 	tmp = ((rdev->mc.vram_end >> 24) & 0xFFFF) << 16;
1057 	tmp |= ((rdev->mc.vram_start >> 24) & 0xFFFF);
1058 	WREG32(MC_VM_FB_LOCATION, tmp);
1059 	WREG32(HDP_NONSURFACE_BASE, (rdev->mc.vram_start >> 8));
1060 	WREG32(HDP_NONSURFACE_INFO, (2 << 7));
1061 	WREG32(HDP_NONSURFACE_SIZE, 0x3FFFFFFF);
1062 	if (rdev->flags & RADEON_IS_AGP) {
1063 		WREG32(MC_VM_AGP_TOP, rdev->mc.gtt_end >> 16);
1064 		WREG32(MC_VM_AGP_BOT, rdev->mc.gtt_start >> 16);
1065 		WREG32(MC_VM_AGP_BASE, rdev->mc.agp_base >> 22);
1066 	} else {
1067 		WREG32(MC_VM_AGP_BASE, 0);
1068 		WREG32(MC_VM_AGP_TOP, 0x0FFFFFFF);
1069 		WREG32(MC_VM_AGP_BOT, 0x0FFFFFFF);
1070 	}
1071 	if (r600_mc_wait_for_idle(rdev)) {
1072 		dev_warn(rdev->dev, "Wait for MC idle timedout !\n");
1073 	}
1074 	rv515_mc_resume(rdev, &save);
1075 	/* we need to own VRAM, so turn off the VGA renderer here
1076 	 * to stop it overwriting our objects */
1077 	rv515_vga_render_disable(rdev);
1078 }
1079 
1080 
1081 /*
1082  * CP.
1083  */
1084 void r700_cp_stop(struct radeon_device *rdev)
1085 {
1086 	if (rdev->asic->copy.copy_ring_index == RADEON_RING_TYPE_GFX_INDEX)
1087 		radeon_ttm_set_active_vram_size(rdev, rdev->mc.visible_vram_size);
1088 	WREG32(CP_ME_CNTL, (CP_ME_HALT | CP_PFP_HALT));
1089 	WREG32(SCRATCH_UMSK, 0);
1090 	rdev->ring[RADEON_RING_TYPE_GFX_INDEX].ready = false;
1091 }
1092 
1093 static int rv770_cp_load_microcode(struct radeon_device *rdev)
1094 {
1095 	const __be32 *fw_data;
1096 	int i;
1097 
1098 	if (!rdev->me_fw || !rdev->pfp_fw)
1099 		return -EINVAL;
1100 
1101 	r700_cp_stop(rdev);
1102 	WREG32(CP_RB_CNTL,
1103 #ifdef __BIG_ENDIAN
1104 	       BUF_SWAP_32BIT |
1105 #endif
1106 	       RB_NO_UPDATE | RB_BLKSZ(15) | RB_BUFSZ(3));
1107 
1108 	/* Reset cp */
1109 	WREG32(GRBM_SOFT_RESET, SOFT_RESET_CP);
1110 	RREG32(GRBM_SOFT_RESET);
1111 	mdelay(15);
1112 	WREG32(GRBM_SOFT_RESET, 0);
1113 
1114 	fw_data = (const __be32 *)rdev->pfp_fw->data;
1115 	WREG32(CP_PFP_UCODE_ADDR, 0);
1116 	for (i = 0; i < R700_PFP_UCODE_SIZE; i++)
1117 		WREG32(CP_PFP_UCODE_DATA, be32_to_cpup(fw_data++));
1118 	WREG32(CP_PFP_UCODE_ADDR, 0);
1119 
1120 	fw_data = (const __be32 *)rdev->me_fw->data;
1121 	WREG32(CP_ME_RAM_WADDR, 0);
1122 	for (i = 0; i < R700_PM4_UCODE_SIZE; i++)
1123 		WREG32(CP_ME_RAM_DATA, be32_to_cpup(fw_data++));
1124 
1125 	WREG32(CP_PFP_UCODE_ADDR, 0);
1126 	WREG32(CP_ME_RAM_WADDR, 0);
1127 	WREG32(CP_ME_RAM_RADDR, 0);
1128 	return 0;
1129 }
1130 
1131 void r700_cp_fini(struct radeon_device *rdev)
1132 {
1133 	struct radeon_ring *ring = &rdev->ring[RADEON_RING_TYPE_GFX_INDEX];
1134 	r700_cp_stop(rdev);
1135 	radeon_ring_fini(rdev, ring);
1136 	radeon_scratch_free(rdev, ring->rptr_save_reg);
1137 }
1138 
1139 void rv770_set_clk_bypass_mode(struct radeon_device *rdev)
1140 {
1141 	u32 tmp, i;
1142 
1143 	if (rdev->flags & RADEON_IS_IGP)
1144 		return;
1145 
1146 	tmp = RREG32(CG_SPLL_FUNC_CNTL_2);
1147 	tmp &= SCLK_MUX_SEL_MASK;
1148 	tmp |= SCLK_MUX_SEL(1) | SCLK_MUX_UPDATE;
1149 	WREG32(CG_SPLL_FUNC_CNTL_2, tmp);
1150 
1151 	for (i = 0; i < rdev->usec_timeout; i++) {
1152 		if (RREG32(CG_SPLL_STATUS) & SPLL_CHG_STATUS)
1153 			break;
1154 		udelay(1);
1155 	}
1156 
1157 	tmp &= ~SCLK_MUX_UPDATE;
1158 	WREG32(CG_SPLL_FUNC_CNTL_2, tmp);
1159 
1160 	tmp = RREG32(MPLL_CNTL_MODE);
1161 	if ((rdev->family == CHIP_RV710) || (rdev->family == CHIP_RV730))
1162 		tmp &= ~RV730_MPLL_MCLK_SEL;
1163 	else
1164 		tmp &= ~MPLL_MCLK_SEL;
1165 	WREG32(MPLL_CNTL_MODE, tmp);
1166 }
1167 
1168 /*
1169  * Core functions
1170  */
1171 static void rv770_gpu_init(struct radeon_device *rdev)
1172 {
1173 	int i, j, num_qd_pipes;
1174 	u32 ta_aux_cntl;
1175 	u32 sx_debug_1;
1176 	u32 smx_dc_ctl0;
1177 	u32 db_debug3;
1178 	u32 num_gs_verts_per_thread;
1179 	u32 vgt_gs_per_es;
1180 	u32 gs_prim_buffer_depth = 0;
1181 	u32 sq_ms_fifo_sizes;
1182 	u32 sq_config;
1183 	u32 sq_thread_resource_mgmt;
1184 	u32 hdp_host_path_cntl;
1185 	u32 sq_dyn_gpr_size_simd_ab_0;
1186 	u32 gb_tiling_config = 0;
1187 	u32 cc_gc_shader_pipe_config = 0;
1188 	u32 mc_arb_ramcfg;
1189 	u32 db_debug4, tmp;
1190 	u32 inactive_pipes, shader_pipe_config;
1191 	u32 disabled_rb_mask;
1192 	unsigned active_number;
1193 
1194 	/* setup chip specs */
1195 	rdev->config.rv770.tiling_group_size = 256;
1196 	switch (rdev->family) {
1197 	case CHIP_RV770:
1198 		rdev->config.rv770.max_pipes = 4;
1199 		rdev->config.rv770.max_tile_pipes = 8;
1200 		rdev->config.rv770.max_simds = 10;
1201 		rdev->config.rv770.max_backends = 4;
1202 		rdev->config.rv770.max_gprs = 256;
1203 		rdev->config.rv770.max_threads = 248;
1204 		rdev->config.rv770.max_stack_entries = 512;
1205 		rdev->config.rv770.max_hw_contexts = 8;
1206 		rdev->config.rv770.max_gs_threads = 16 * 2;
1207 		rdev->config.rv770.sx_max_export_size = 128;
1208 		rdev->config.rv770.sx_max_export_pos_size = 16;
1209 		rdev->config.rv770.sx_max_export_smx_size = 112;
1210 		rdev->config.rv770.sq_num_cf_insts = 2;
1211 
1212 		rdev->config.rv770.sx_num_of_sets = 7;
1213 		rdev->config.rv770.sc_prim_fifo_size = 0xF9;
1214 		rdev->config.rv770.sc_hiz_tile_fifo_size = 0x30;
1215 		rdev->config.rv770.sc_earlyz_tile_fifo_fize = 0x130;
1216 		break;
1217 	case CHIP_RV730:
1218 		rdev->config.rv770.max_pipes = 2;
1219 		rdev->config.rv770.max_tile_pipes = 4;
1220 		rdev->config.rv770.max_simds = 8;
1221 		rdev->config.rv770.max_backends = 2;
1222 		rdev->config.rv770.max_gprs = 128;
1223 		rdev->config.rv770.max_threads = 248;
1224 		rdev->config.rv770.max_stack_entries = 256;
1225 		rdev->config.rv770.max_hw_contexts = 8;
1226 		rdev->config.rv770.max_gs_threads = 16 * 2;
1227 		rdev->config.rv770.sx_max_export_size = 256;
1228 		rdev->config.rv770.sx_max_export_pos_size = 32;
1229 		rdev->config.rv770.sx_max_export_smx_size = 224;
1230 		rdev->config.rv770.sq_num_cf_insts = 2;
1231 
1232 		rdev->config.rv770.sx_num_of_sets = 7;
1233 		rdev->config.rv770.sc_prim_fifo_size = 0xf9;
1234 		rdev->config.rv770.sc_hiz_tile_fifo_size = 0x30;
1235 		rdev->config.rv770.sc_earlyz_tile_fifo_fize = 0x130;
1236 		if (rdev->config.rv770.sx_max_export_pos_size > 16) {
1237 			rdev->config.rv770.sx_max_export_pos_size -= 16;
1238 			rdev->config.rv770.sx_max_export_smx_size += 16;
1239 		}
1240 		break;
1241 	case CHIP_RV710:
1242 		rdev->config.rv770.max_pipes = 2;
1243 		rdev->config.rv770.max_tile_pipes = 2;
1244 		rdev->config.rv770.max_simds = 2;
1245 		rdev->config.rv770.max_backends = 1;
1246 		rdev->config.rv770.max_gprs = 256;
1247 		rdev->config.rv770.max_threads = 192;
1248 		rdev->config.rv770.max_stack_entries = 256;
1249 		rdev->config.rv770.max_hw_contexts = 4;
1250 		rdev->config.rv770.max_gs_threads = 8 * 2;
1251 		rdev->config.rv770.sx_max_export_size = 128;
1252 		rdev->config.rv770.sx_max_export_pos_size = 16;
1253 		rdev->config.rv770.sx_max_export_smx_size = 112;
1254 		rdev->config.rv770.sq_num_cf_insts = 1;
1255 
1256 		rdev->config.rv770.sx_num_of_sets = 7;
1257 		rdev->config.rv770.sc_prim_fifo_size = 0x40;
1258 		rdev->config.rv770.sc_hiz_tile_fifo_size = 0x30;
1259 		rdev->config.rv770.sc_earlyz_tile_fifo_fize = 0x130;
1260 		break;
1261 	case CHIP_RV740:
1262 		rdev->config.rv770.max_pipes = 4;
1263 		rdev->config.rv770.max_tile_pipes = 4;
1264 		rdev->config.rv770.max_simds = 8;
1265 		rdev->config.rv770.max_backends = 4;
1266 		rdev->config.rv770.max_gprs = 256;
1267 		rdev->config.rv770.max_threads = 248;
1268 		rdev->config.rv770.max_stack_entries = 512;
1269 		rdev->config.rv770.max_hw_contexts = 8;
1270 		rdev->config.rv770.max_gs_threads = 16 * 2;
1271 		rdev->config.rv770.sx_max_export_size = 256;
1272 		rdev->config.rv770.sx_max_export_pos_size = 32;
1273 		rdev->config.rv770.sx_max_export_smx_size = 224;
1274 		rdev->config.rv770.sq_num_cf_insts = 2;
1275 
1276 		rdev->config.rv770.sx_num_of_sets = 7;
1277 		rdev->config.rv770.sc_prim_fifo_size = 0x100;
1278 		rdev->config.rv770.sc_hiz_tile_fifo_size = 0x30;
1279 		rdev->config.rv770.sc_earlyz_tile_fifo_fize = 0x130;
1280 
1281 		if (rdev->config.rv770.sx_max_export_pos_size > 16) {
1282 			rdev->config.rv770.sx_max_export_pos_size -= 16;
1283 			rdev->config.rv770.sx_max_export_smx_size += 16;
1284 		}
1285 		break;
1286 	default:
1287 		break;
1288 	}
1289 
1290 	/* Initialize HDP */
1291 	j = 0;
1292 	for (i = 0; i < 32; i++) {
1293 		WREG32((0x2c14 + j), 0x00000000);
1294 		WREG32((0x2c18 + j), 0x00000000);
1295 		WREG32((0x2c1c + j), 0x00000000);
1296 		WREG32((0x2c20 + j), 0x00000000);
1297 		WREG32((0x2c24 + j), 0x00000000);
1298 		j += 0x18;
1299 	}
1300 
1301 	WREG32(GRBM_CNTL, GRBM_READ_TIMEOUT(0xff));
1302 
1303 	/* setup tiling, simd, pipe config */
1304 	mc_arb_ramcfg = RREG32(MC_ARB_RAMCFG);
1305 
1306 	shader_pipe_config = RREG32(CC_GC_SHADER_PIPE_CONFIG);
1307 	inactive_pipes = (shader_pipe_config & INACTIVE_QD_PIPES_MASK) >> INACTIVE_QD_PIPES_SHIFT;
1308 	for (i = 0, tmp = 1, active_number = 0; i < R7XX_MAX_PIPES; i++) {
1309 		if (!(inactive_pipes & tmp)) {
1310 			active_number++;
1311 		}
1312 		tmp <<= 1;
1313 	}
1314 	if (active_number == 1) {
1315 		WREG32(SPI_CONFIG_CNTL, DISABLE_INTERP_1);
1316 	} else {
1317 		WREG32(SPI_CONFIG_CNTL, 0);
1318 	}
1319 
1320 	cc_gc_shader_pipe_config = RREG32(CC_GC_SHADER_PIPE_CONFIG) & 0xffffff00;
1321 	tmp = rdev->config.rv770.max_simds -
1322 		r600_count_pipe_bits((cc_gc_shader_pipe_config >> 16) & R7XX_MAX_SIMDS_MASK);
1323 	rdev->config.rv770.active_simds = tmp;
1324 
1325 	switch (rdev->config.rv770.max_tile_pipes) {
1326 	case 1:
1327 	default:
1328 		gb_tiling_config = PIPE_TILING(0);
1329 		break;
1330 	case 2:
1331 		gb_tiling_config = PIPE_TILING(1);
1332 		break;
1333 	case 4:
1334 		gb_tiling_config = PIPE_TILING(2);
1335 		break;
1336 	case 8:
1337 		gb_tiling_config = PIPE_TILING(3);
1338 		break;
1339 	}
1340 	rdev->config.rv770.tiling_npipes = rdev->config.rv770.max_tile_pipes;
1341 
1342 	disabled_rb_mask = (RREG32(CC_RB_BACKEND_DISABLE) >> 16) & R7XX_MAX_BACKENDS_MASK;
1343 	tmp = 0;
1344 	for (i = 0; i < rdev->config.rv770.max_backends; i++)
1345 		tmp |= (1 << i);
1346 	/* if all the backends are disabled, fix it up here */
1347 	if ((disabled_rb_mask & tmp) == tmp) {
1348 		for (i = 0; i < rdev->config.rv770.max_backends; i++)
1349 			disabled_rb_mask &= ~(1 << i);
1350 	}
1351 	tmp = (gb_tiling_config & PIPE_TILING__MASK) >> PIPE_TILING__SHIFT;
1352 	tmp = r6xx_remap_render_backend(rdev, tmp, rdev->config.rv770.max_backends,
1353 					R7XX_MAX_BACKENDS, disabled_rb_mask);
1354 	gb_tiling_config |= tmp << 16;
1355 	rdev->config.rv770.backend_map = tmp;
1356 
1357 	if (rdev->family == CHIP_RV770)
1358 		gb_tiling_config |= BANK_TILING(1);
1359 	else {
1360 		if ((mc_arb_ramcfg & NOOFBANK_MASK) >> NOOFBANK_SHIFT)
1361 			gb_tiling_config |= BANK_TILING(1);
1362 		else
1363 			gb_tiling_config |= BANK_TILING(0);
1364 	}
1365 	rdev->config.rv770.tiling_nbanks = 4 << ((gb_tiling_config >> 4) & 0x3);
1366 	gb_tiling_config |= GROUP_SIZE((mc_arb_ramcfg & BURSTLENGTH_MASK) >> BURSTLENGTH_SHIFT);
1367 	if (((mc_arb_ramcfg & NOOFROWS_MASK) >> NOOFROWS_SHIFT) > 3) {
1368 		gb_tiling_config |= ROW_TILING(3);
1369 		gb_tiling_config |= SAMPLE_SPLIT(3);
1370 	} else {
1371 		gb_tiling_config |=
1372 			ROW_TILING(((mc_arb_ramcfg & NOOFROWS_MASK) >> NOOFROWS_SHIFT));
1373 		gb_tiling_config |=
1374 			SAMPLE_SPLIT(((mc_arb_ramcfg & NOOFROWS_MASK) >> NOOFROWS_SHIFT));
1375 	}
1376 
1377 	gb_tiling_config |= BANK_SWAPS(1);
1378 	rdev->config.rv770.tile_config = gb_tiling_config;
1379 
1380 	WREG32(GB_TILING_CONFIG, gb_tiling_config);
1381 	WREG32(DCP_TILING_CONFIG, (gb_tiling_config & 0xffff));
1382 	WREG32(HDP_TILING_CONFIG, (gb_tiling_config & 0xffff));
1383 	WREG32(DMA_TILING_CONFIG, (gb_tiling_config & 0xffff));
1384 	WREG32(DMA_TILING_CONFIG2, (gb_tiling_config & 0xffff));
1385 	if (rdev->family == CHIP_RV730) {
1386 		WREG32(UVD_UDEC_DB_TILING_CONFIG, (gb_tiling_config & 0xffff));
1387 		WREG32(UVD_UDEC_DBW_TILING_CONFIG, (gb_tiling_config & 0xffff));
1388 		WREG32(UVD_UDEC_TILING_CONFIG, (gb_tiling_config & 0xffff));
1389 	}
1390 
1391 	WREG32(CGTS_SYS_TCC_DISABLE, 0);
1392 	WREG32(CGTS_TCC_DISABLE, 0);
1393 	WREG32(CGTS_USER_SYS_TCC_DISABLE, 0);
1394 	WREG32(CGTS_USER_TCC_DISABLE, 0);
1395 
1396 
1397 	num_qd_pipes = R7XX_MAX_PIPES - r600_count_pipe_bits((cc_gc_shader_pipe_config & INACTIVE_QD_PIPES_MASK) >> 8);
1398 	WREG32(VGT_OUT_DEALLOC_CNTL, (num_qd_pipes * 4) & DEALLOC_DIST_MASK);
1399 	WREG32(VGT_VERTEX_REUSE_BLOCK_CNTL, ((num_qd_pipes * 4) - 2) & VTX_REUSE_DEPTH_MASK);
1400 
1401 	/* set HW defaults for 3D engine */
1402 	WREG32(CP_QUEUE_THRESHOLDS, (ROQ_IB1_START(0x16) |
1403 				     ROQ_IB2_START(0x2b)));
1404 
1405 	WREG32(CP_MEQ_THRESHOLDS, STQ_SPLIT(0x30));
1406 
1407 	ta_aux_cntl = RREG32(TA_CNTL_AUX);
1408 	WREG32(TA_CNTL_AUX, ta_aux_cntl | DISABLE_CUBE_ANISO);
1409 
1410 	sx_debug_1 = RREG32(SX_DEBUG_1);
1411 	sx_debug_1 |= ENABLE_NEW_SMX_ADDRESS;
1412 	WREG32(SX_DEBUG_1, sx_debug_1);
1413 
1414 	smx_dc_ctl0 = RREG32(SMX_DC_CTL0);
1415 	smx_dc_ctl0 &= ~CACHE_DEPTH(0x1ff);
1416 	smx_dc_ctl0 |= CACHE_DEPTH((rdev->config.rv770.sx_num_of_sets * 64) - 1);
1417 	WREG32(SMX_DC_CTL0, smx_dc_ctl0);
1418 
1419 	if (rdev->family != CHIP_RV740)
1420 		WREG32(SMX_EVENT_CTL, (ES_FLUSH_CTL(4) |
1421 				       GS_FLUSH_CTL(4) |
1422 				       ACK_FLUSH_CTL(3) |
1423 				       SYNC_FLUSH_CTL));
1424 
1425 	if (rdev->family != CHIP_RV770)
1426 		WREG32(SMX_SAR_CTL0, 0x00003f3f);
1427 
1428 	db_debug3 = RREG32(DB_DEBUG3);
1429 	db_debug3 &= ~DB_CLK_OFF_DELAY(0x1f);
1430 	switch (rdev->family) {
1431 	case CHIP_RV770:
1432 	case CHIP_RV740:
1433 		db_debug3 |= DB_CLK_OFF_DELAY(0x1f);
1434 		break;
1435 	case CHIP_RV710:
1436 	case CHIP_RV730:
1437 	default:
1438 		db_debug3 |= DB_CLK_OFF_DELAY(2);
1439 		break;
1440 	}
1441 	WREG32(DB_DEBUG3, db_debug3);
1442 
1443 	if (rdev->family != CHIP_RV770) {
1444 		db_debug4 = RREG32(DB_DEBUG4);
1445 		db_debug4 |= DISABLE_TILE_COVERED_FOR_PS_ITER;
1446 		WREG32(DB_DEBUG4, db_debug4);
1447 	}
1448 
1449 	WREG32(SX_EXPORT_BUFFER_SIZES, (COLOR_BUFFER_SIZE((rdev->config.rv770.sx_max_export_size / 4) - 1) |
1450 					POSITION_BUFFER_SIZE((rdev->config.rv770.sx_max_export_pos_size / 4) - 1) |
1451 					SMX_BUFFER_SIZE((rdev->config.rv770.sx_max_export_smx_size / 4) - 1)));
1452 
1453 	WREG32(PA_SC_FIFO_SIZE, (SC_PRIM_FIFO_SIZE(rdev->config.rv770.sc_prim_fifo_size) |
1454 				 SC_HIZ_TILE_FIFO_SIZE(rdev->config.rv770.sc_hiz_tile_fifo_size) |
1455 				 SC_EARLYZ_TILE_FIFO_SIZE(rdev->config.rv770.sc_earlyz_tile_fifo_fize)));
1456 
1457 	WREG32(PA_SC_MULTI_CHIP_CNTL, 0);
1458 
1459 	WREG32(VGT_NUM_INSTANCES, 1);
1460 
1461 	WREG32(SPI_CONFIG_CNTL_1, VTX_DONE_DELAY(4));
1462 
1463 	WREG32(CP_PERFMON_CNTL, 0);
1464 
1465 	sq_ms_fifo_sizes = (CACHE_FIFO_SIZE(16 * rdev->config.rv770.sq_num_cf_insts) |
1466 			    DONE_FIFO_HIWATER(0xe0) |
1467 			    ALU_UPDATE_FIFO_HIWATER(0x8));
1468 	switch (rdev->family) {
1469 	case CHIP_RV770:
1470 	case CHIP_RV730:
1471 	case CHIP_RV710:
1472 		sq_ms_fifo_sizes |= FETCH_FIFO_HIWATER(0x1);
1473 		break;
1474 	case CHIP_RV740:
1475 	default:
1476 		sq_ms_fifo_sizes |= FETCH_FIFO_HIWATER(0x4);
1477 		break;
1478 	}
1479 	WREG32(SQ_MS_FIFO_SIZES, sq_ms_fifo_sizes);
1480 
1481 	/* SQ_CONFIG, SQ_GPR_RESOURCE_MGMT, SQ_THREAD_RESOURCE_MGMT, SQ_STACK_RESOURCE_MGMT
1482 	 * should be adjusted as needed by the 2D/3D drivers.  This just sets default values
1483 	 */
1484 	sq_config = RREG32(SQ_CONFIG);
1485 	sq_config &= ~(PS_PRIO(3) |
1486 		       VS_PRIO(3) |
1487 		       GS_PRIO(3) |
1488 		       ES_PRIO(3));
1489 	sq_config |= (DX9_CONSTS |
1490 		      VC_ENABLE |
1491 		      EXPORT_SRC_C |
1492 		      PS_PRIO(0) |
1493 		      VS_PRIO(1) |
1494 		      GS_PRIO(2) |
1495 		      ES_PRIO(3));
1496 	if (rdev->family == CHIP_RV710)
1497 		/* no vertex cache */
1498 		sq_config &= ~VC_ENABLE;
1499 
1500 	WREG32(SQ_CONFIG, sq_config);
1501 
1502 	WREG32(SQ_GPR_RESOURCE_MGMT_1,  (NUM_PS_GPRS((rdev->config.rv770.max_gprs * 24)/64) |
1503 					 NUM_VS_GPRS((rdev->config.rv770.max_gprs * 24)/64) |
1504 					 NUM_CLAUSE_TEMP_GPRS(((rdev->config.rv770.max_gprs * 24)/64)/2)));
1505 
1506 	WREG32(SQ_GPR_RESOURCE_MGMT_2,  (NUM_GS_GPRS((rdev->config.rv770.max_gprs * 7)/64) |
1507 					 NUM_ES_GPRS((rdev->config.rv770.max_gprs * 7)/64)));
1508 
1509 	sq_thread_resource_mgmt = (NUM_PS_THREADS((rdev->config.rv770.max_threads * 4)/8) |
1510 				   NUM_VS_THREADS((rdev->config.rv770.max_threads * 2)/8) |
1511 				   NUM_ES_THREADS((rdev->config.rv770.max_threads * 1)/8));
1512 	if (((rdev->config.rv770.max_threads * 1) / 8) > rdev->config.rv770.max_gs_threads)
1513 		sq_thread_resource_mgmt |= NUM_GS_THREADS(rdev->config.rv770.max_gs_threads);
1514 	else
1515 		sq_thread_resource_mgmt |= NUM_GS_THREADS((rdev->config.rv770.max_gs_threads * 1)/8);
1516 	WREG32(SQ_THREAD_RESOURCE_MGMT, sq_thread_resource_mgmt);
1517 
1518 	WREG32(SQ_STACK_RESOURCE_MGMT_1, (NUM_PS_STACK_ENTRIES((rdev->config.rv770.max_stack_entries * 1)/4) |
1519 						     NUM_VS_STACK_ENTRIES((rdev->config.rv770.max_stack_entries * 1)/4)));
1520 
1521 	WREG32(SQ_STACK_RESOURCE_MGMT_2, (NUM_GS_STACK_ENTRIES((rdev->config.rv770.max_stack_entries * 1)/4) |
1522 						     NUM_ES_STACK_ENTRIES((rdev->config.rv770.max_stack_entries * 1)/4)));
1523 
1524 	sq_dyn_gpr_size_simd_ab_0 = (SIMDA_RING0((rdev->config.rv770.max_gprs * 38)/64) |
1525 				     SIMDA_RING1((rdev->config.rv770.max_gprs * 38)/64) |
1526 				     SIMDB_RING0((rdev->config.rv770.max_gprs * 38)/64) |
1527 				     SIMDB_RING1((rdev->config.rv770.max_gprs * 38)/64));
1528 
1529 	WREG32(SQ_DYN_GPR_SIZE_SIMD_AB_0, sq_dyn_gpr_size_simd_ab_0);
1530 	WREG32(SQ_DYN_GPR_SIZE_SIMD_AB_1, sq_dyn_gpr_size_simd_ab_0);
1531 	WREG32(SQ_DYN_GPR_SIZE_SIMD_AB_2, sq_dyn_gpr_size_simd_ab_0);
1532 	WREG32(SQ_DYN_GPR_SIZE_SIMD_AB_3, sq_dyn_gpr_size_simd_ab_0);
1533 	WREG32(SQ_DYN_GPR_SIZE_SIMD_AB_4, sq_dyn_gpr_size_simd_ab_0);
1534 	WREG32(SQ_DYN_GPR_SIZE_SIMD_AB_5, sq_dyn_gpr_size_simd_ab_0);
1535 	WREG32(SQ_DYN_GPR_SIZE_SIMD_AB_6, sq_dyn_gpr_size_simd_ab_0);
1536 	WREG32(SQ_DYN_GPR_SIZE_SIMD_AB_7, sq_dyn_gpr_size_simd_ab_0);
1537 
1538 	WREG32(PA_SC_FORCE_EOV_MAX_CNTS, (FORCE_EOV_MAX_CLK_CNT(4095) |
1539 					  FORCE_EOV_MAX_REZ_CNT(255)));
1540 
1541 	if (rdev->family == CHIP_RV710)
1542 		WREG32(VGT_CACHE_INVALIDATION, (CACHE_INVALIDATION(TC_ONLY) |
1543 						AUTO_INVLD_EN(ES_AND_GS_AUTO)));
1544 	else
1545 		WREG32(VGT_CACHE_INVALIDATION, (CACHE_INVALIDATION(VC_AND_TC) |
1546 						AUTO_INVLD_EN(ES_AND_GS_AUTO)));
1547 
1548 	switch (rdev->family) {
1549 	case CHIP_RV770:
1550 	case CHIP_RV730:
1551 	case CHIP_RV740:
1552 		gs_prim_buffer_depth = 384;
1553 		break;
1554 	case CHIP_RV710:
1555 		gs_prim_buffer_depth = 128;
1556 		break;
1557 	default:
1558 		break;
1559 	}
1560 
1561 	num_gs_verts_per_thread = rdev->config.rv770.max_pipes * 16;
1562 	vgt_gs_per_es = gs_prim_buffer_depth + num_gs_verts_per_thread;
1563 	/* Max value for this is 256 */
1564 	if (vgt_gs_per_es > 256)
1565 		vgt_gs_per_es = 256;
1566 
1567 	WREG32(VGT_ES_PER_GS, 128);
1568 	WREG32(VGT_GS_PER_ES, vgt_gs_per_es);
1569 	WREG32(VGT_GS_PER_VS, 2);
1570 
1571 	/* more default values. 2D/3D driver should adjust as needed */
1572 	WREG32(VGT_GS_VERTEX_REUSE, 16);
1573 	WREG32(PA_SC_LINE_STIPPLE_STATE, 0);
1574 	WREG32(VGT_STRMOUT_EN, 0);
1575 	WREG32(SX_MISC, 0);
1576 	WREG32(PA_SC_MODE_CNTL, 0);
1577 	WREG32(PA_SC_EDGERULE, 0xaaaaaaaa);
1578 	WREG32(PA_SC_AA_CONFIG, 0);
1579 	WREG32(PA_SC_CLIPRECT_RULE, 0xffff);
1580 	WREG32(PA_SC_LINE_STIPPLE, 0);
1581 	WREG32(SPI_INPUT_Z, 0);
1582 	WREG32(SPI_PS_IN_CONTROL_0, NUM_INTERP(2));
1583 	WREG32(CB_COLOR7_FRAG, 0);
1584 
1585 	/* clear render buffer base addresses */
1586 	WREG32(CB_COLOR0_BASE, 0);
1587 	WREG32(CB_COLOR1_BASE, 0);
1588 	WREG32(CB_COLOR2_BASE, 0);
1589 	WREG32(CB_COLOR3_BASE, 0);
1590 	WREG32(CB_COLOR4_BASE, 0);
1591 	WREG32(CB_COLOR5_BASE, 0);
1592 	WREG32(CB_COLOR6_BASE, 0);
1593 	WREG32(CB_COLOR7_BASE, 0);
1594 
1595 	WREG32(TCP_CNTL, 0);
1596 
1597 	hdp_host_path_cntl = RREG32(HDP_HOST_PATH_CNTL);
1598 	WREG32(HDP_HOST_PATH_CNTL, hdp_host_path_cntl);
1599 
1600 	WREG32(PA_SC_MULTI_CHIP_CNTL, 0);
1601 
1602 	WREG32(PA_CL_ENHANCE, (CLIP_VTX_REORDER_ENA |
1603 					  NUM_CLIP_SEQ(3)));
1604 	WREG32(VC_ENHANCE, 0);
1605 }
1606 
1607 void r700_vram_gtt_location(struct radeon_device *rdev, struct radeon_mc *mc)
1608 {
1609 	u64 size_bf, size_af;
1610 
1611 	if (mc->mc_vram_size > 0xE0000000) {
1612 		/* leave room for at least 512M GTT */
1613 		dev_warn(rdev->dev, "limiting VRAM\n");
1614 		mc->real_vram_size = 0xE0000000;
1615 		mc->mc_vram_size = 0xE0000000;
1616 	}
1617 	if (rdev->flags & RADEON_IS_AGP) {
1618 		size_bf = mc->gtt_start;
1619 		size_af = mc->mc_mask - mc->gtt_end;
1620 		if (size_bf > size_af) {
1621 			if (mc->mc_vram_size > size_bf) {
1622 				dev_warn(rdev->dev, "limiting VRAM\n");
1623 				mc->real_vram_size = size_bf;
1624 				mc->mc_vram_size = size_bf;
1625 			}
1626 			mc->vram_start = mc->gtt_start - mc->mc_vram_size;
1627 		} else {
1628 			if (mc->mc_vram_size > size_af) {
1629 				dev_warn(rdev->dev, "limiting VRAM\n");
1630 				mc->real_vram_size = size_af;
1631 				mc->mc_vram_size = size_af;
1632 			}
1633 			mc->vram_start = mc->gtt_end + 1;
1634 		}
1635 		mc->vram_end = mc->vram_start + mc->mc_vram_size - 1;
1636 		dev_info(rdev->dev, "VRAM: %lluM 0x%08llX - 0x%08llX (%lluM used)\n",
1637 				mc->mc_vram_size >> 20, mc->vram_start,
1638 				mc->vram_end, mc->real_vram_size >> 20);
1639 	} else {
1640 		radeon_vram_location(rdev, &rdev->mc, 0);
1641 		rdev->mc.gtt_base_align = 0;
1642 		radeon_gtt_location(rdev, mc);
1643 	}
1644 }
1645 
1646 static int rv770_mc_init(struct radeon_device *rdev)
1647 {
1648 	u32 tmp;
1649 	int chansize, numchan;
1650 
1651 	/* Get VRAM informations */
1652 	rdev->mc.vram_is_ddr = true;
1653 	tmp = RREG32(MC_ARB_RAMCFG);
1654 	if (tmp & CHANSIZE_OVERRIDE) {
1655 		chansize = 16;
1656 	} else if (tmp & CHANSIZE_MASK) {
1657 		chansize = 64;
1658 	} else {
1659 		chansize = 32;
1660 	}
1661 	tmp = RREG32(MC_SHARED_CHMAP);
1662 	switch ((tmp & NOOFCHAN_MASK) >> NOOFCHAN_SHIFT) {
1663 	case 0:
1664 	default:
1665 		numchan = 1;
1666 		break;
1667 	case 1:
1668 		numchan = 2;
1669 		break;
1670 	case 2:
1671 		numchan = 4;
1672 		break;
1673 	case 3:
1674 		numchan = 8;
1675 		break;
1676 	}
1677 	rdev->mc.vram_width = numchan * chansize;
1678 	/* Could aper size report 0 ? */
1679 	rdev->mc.aper_base = pci_resource_start(rdev->pdev, 0);
1680 	rdev->mc.aper_size = pci_resource_len(rdev->pdev, 0);
1681 	/* Setup GPU memory space */
1682 	rdev->mc.mc_vram_size = RREG32(CONFIG_MEMSIZE);
1683 	rdev->mc.real_vram_size = RREG32(CONFIG_MEMSIZE);
1684 	rdev->mc.visible_vram_size = rdev->mc.aper_size;
1685 	r700_vram_gtt_location(rdev, &rdev->mc);
1686 	radeon_update_bandwidth_info(rdev);
1687 
1688 	return 0;
1689 }
1690 
1691 static void rv770_uvd_init(struct radeon_device *rdev)
1692 {
1693 	int r;
1694 
1695 	if (!rdev->has_uvd)
1696 		return;
1697 
1698 	r = radeon_uvd_init(rdev);
1699 	if (r) {
1700 		dev_err(rdev->dev, "failed UVD (%d) init.\n", r);
1701 		/*
1702 		 * At this point rdev->uvd.vcpu_bo is NULL which trickles down
1703 		 * to early fails uvd_v2_2_resume() and thus nothing happens
1704 		 * there. So it is pointless to try to go through that code
1705 		 * hence why we disable uvd here.
1706 		 */
1707 		rdev->has_uvd = false;
1708 		return;
1709 	}
1710 	rdev->ring[R600_RING_TYPE_UVD_INDEX].ring_obj = NULL;
1711 	r600_ring_init(rdev, &rdev->ring[R600_RING_TYPE_UVD_INDEX], 4096);
1712 }
1713 
1714 static void rv770_uvd_start(struct radeon_device *rdev)
1715 {
1716 	int r;
1717 
1718 	if (!rdev->has_uvd)
1719 		return;
1720 
1721 	r = uvd_v2_2_resume(rdev);
1722 	if (r) {
1723 		dev_err(rdev->dev, "failed UVD resume (%d).\n", r);
1724 		goto error;
1725 	}
1726 	r = radeon_fence_driver_start_ring(rdev, R600_RING_TYPE_UVD_INDEX);
1727 	if (r) {
1728 		dev_err(rdev->dev, "failed initializing UVD fences (%d).\n", r);
1729 		goto error;
1730 	}
1731 	return;
1732 
1733 error:
1734 	rdev->ring[R600_RING_TYPE_UVD_INDEX].ring_size = 0;
1735 }
1736 
1737 static void rv770_uvd_resume(struct radeon_device *rdev)
1738 {
1739 	struct radeon_ring *ring;
1740 	int r;
1741 
1742 	if (!rdev->has_uvd || !rdev->ring[R600_RING_TYPE_UVD_INDEX].ring_size)
1743 		return;
1744 
1745 	ring = &rdev->ring[R600_RING_TYPE_UVD_INDEX];
1746 	r = radeon_ring_init(rdev, ring, ring->ring_size, 0, PACKET0(UVD_NO_OP, 0));
1747 	if (r) {
1748 		dev_err(rdev->dev, "failed initializing UVD ring (%d).\n", r);
1749 		return;
1750 	}
1751 	r = uvd_v1_0_init(rdev);
1752 	if (r) {
1753 		dev_err(rdev->dev, "failed initializing UVD (%d).\n", r);
1754 		return;
1755 	}
1756 }
1757 
1758 static int rv770_startup(struct radeon_device *rdev)
1759 {
1760 	struct radeon_ring *ring;
1761 	int r;
1762 
1763 	/* enable pcie gen2 link */
1764 	rv770_pcie_gen2_enable(rdev);
1765 
1766 	/* scratch needs to be initialized before MC */
1767 	r = r600_vram_scratch_init(rdev);
1768 	if (r)
1769 		return r;
1770 
1771 	rv770_mc_program(rdev);
1772 
1773 	if (rdev->flags & RADEON_IS_AGP) {
1774 		rv770_agp_enable(rdev);
1775 	} else {
1776 		r = rv770_pcie_gart_enable(rdev);
1777 		if (r)
1778 			return r;
1779 	}
1780 
1781 	rv770_gpu_init(rdev);
1782 
1783 	/* allocate wb buffer */
1784 	r = radeon_wb_init(rdev);
1785 	if (r)
1786 		return r;
1787 
1788 	r = radeon_fence_driver_start_ring(rdev, RADEON_RING_TYPE_GFX_INDEX);
1789 	if (r) {
1790 		dev_err(rdev->dev, "failed initializing CP fences (%d).\n", r);
1791 		return r;
1792 	}
1793 
1794 	r = radeon_fence_driver_start_ring(rdev, R600_RING_TYPE_DMA_INDEX);
1795 	if (r) {
1796 		dev_err(rdev->dev, "failed initializing DMA fences (%d).\n", r);
1797 		return r;
1798 	}
1799 
1800 	rv770_uvd_start(rdev);
1801 
1802 	/* Enable IRQ */
1803 	if (!rdev->irq.installed) {
1804 		r = radeon_irq_kms_init(rdev);
1805 		if (r)
1806 			return r;
1807 	}
1808 
1809 	r = r600_irq_init(rdev);
1810 	if (r) {
1811 		DRM_ERROR("radeon: IH init failed (%d).\n", r);
1812 		radeon_irq_kms_fini(rdev);
1813 		return r;
1814 	}
1815 	r600_irq_set(rdev);
1816 
1817 	ring = &rdev->ring[RADEON_RING_TYPE_GFX_INDEX];
1818 	r = radeon_ring_init(rdev, ring, ring->ring_size, RADEON_WB_CP_RPTR_OFFSET,
1819 			     RADEON_CP_PACKET2);
1820 	if (r)
1821 		return r;
1822 
1823 	ring = &rdev->ring[R600_RING_TYPE_DMA_INDEX];
1824 	r = radeon_ring_init(rdev, ring, ring->ring_size, R600_WB_DMA_RPTR_OFFSET,
1825 			     DMA_PACKET(DMA_PACKET_NOP, 0, 0, 0));
1826 	if (r)
1827 		return r;
1828 
1829 	r = rv770_cp_load_microcode(rdev);
1830 	if (r)
1831 		return r;
1832 	r = r600_cp_resume(rdev);
1833 	if (r)
1834 		return r;
1835 
1836 	r = r600_dma_resume(rdev);
1837 	if (r)
1838 		return r;
1839 
1840 	rv770_uvd_resume(rdev);
1841 
1842 	r = radeon_ib_pool_init(rdev);
1843 	if (r) {
1844 		dev_err(rdev->dev, "IB initialization failed (%d).\n", r);
1845 		return r;
1846 	}
1847 
1848 	r = radeon_audio_init(rdev);
1849 	if (r) {
1850 		DRM_ERROR("radeon: audio init failed\n");
1851 		return r;
1852 	}
1853 
1854 	return 0;
1855 }
1856 
1857 int rv770_resume(struct radeon_device *rdev)
1858 {
1859 	int r;
1860 
1861 	/* Do not reset GPU before posting, on rv770 hw unlike on r500 hw,
1862 	 * posting will perform necessary task to bring back GPU into good
1863 	 * shape.
1864 	 */
1865 	/* post card */
1866 	atom_asic_init(rdev->mode_info.atom_context);
1867 
1868 	/* init golden registers */
1869 	rv770_init_golden_registers(rdev);
1870 
1871 	if (rdev->pm.pm_method == PM_METHOD_DPM)
1872 		radeon_pm_resume(rdev);
1873 
1874 	rdev->accel_working = true;
1875 	r = rv770_startup(rdev);
1876 	if (r) {
1877 		DRM_ERROR("r600 startup failed on resume\n");
1878 		rdev->accel_working = false;
1879 		return r;
1880 	}
1881 
1882 	return r;
1883 
1884 }
1885 
1886 int rv770_suspend(struct radeon_device *rdev)
1887 {
1888 	radeon_pm_suspend(rdev);
1889 	radeon_audio_fini(rdev);
1890 	if (rdev->has_uvd) {
1891 		uvd_v1_0_fini(rdev);
1892 		radeon_uvd_suspend(rdev);
1893 	}
1894 	r700_cp_stop(rdev);
1895 	r600_dma_stop(rdev);
1896 	r600_irq_suspend(rdev);
1897 	radeon_wb_disable(rdev);
1898 	rv770_pcie_gart_disable(rdev);
1899 
1900 	return 0;
1901 }
1902 
1903 /* Plan is to move initialization in that function and use
1904  * helper function so that radeon_device_init pretty much
1905  * do nothing more than calling asic specific function. This
1906  * should also allow to remove a bunch of callback function
1907  * like vram_info.
1908  */
1909 int rv770_init(struct radeon_device *rdev)
1910 {
1911 	int r;
1912 
1913 	/* Read BIOS */
1914 	if (!radeon_get_bios(rdev)) {
1915 		if (ASIC_IS_AVIVO(rdev))
1916 			return -EINVAL;
1917 	}
1918 	/* Must be an ATOMBIOS */
1919 	if (!rdev->is_atom_bios) {
1920 		dev_err(rdev->dev, "Expecting atombios for R600 GPU\n");
1921 		return -EINVAL;
1922 	}
1923 	r = radeon_atombios_init(rdev);
1924 	if (r)
1925 		return r;
1926 	/* Post card if necessary */
1927 	if (!radeon_card_posted(rdev)) {
1928 		if (!rdev->bios) {
1929 			dev_err(rdev->dev, "Card not posted and no BIOS - ignoring\n");
1930 			return -EINVAL;
1931 		}
1932 		DRM_INFO("GPU not posted. posting now...\n");
1933 		atom_asic_init(rdev->mode_info.atom_context);
1934 	}
1935 	/* init golden registers */
1936 	rv770_init_golden_registers(rdev);
1937 	/* Initialize scratch registers */
1938 	r600_scratch_init(rdev);
1939 	/* Initialize surface registers */
1940 	radeon_surface_init(rdev);
1941 	/* Initialize clocks */
1942 	radeon_get_clock_info(rdev->ddev);
1943 	/* Fence driver */
1944 	radeon_fence_driver_init(rdev);
1945 	/* initialize AGP */
1946 	if (rdev->flags & RADEON_IS_AGP) {
1947 		r = radeon_agp_init(rdev);
1948 		if (r)
1949 			radeon_agp_disable(rdev);
1950 	}
1951 	r = rv770_mc_init(rdev);
1952 	if (r)
1953 		return r;
1954 	/* Memory manager */
1955 	r = radeon_bo_init(rdev);
1956 	if (r)
1957 		return r;
1958 
1959 	if (!rdev->me_fw || !rdev->pfp_fw || !rdev->rlc_fw) {
1960 		r = r600_init_microcode(rdev);
1961 		if (r) {
1962 			DRM_ERROR("Failed to load firmware!\n");
1963 			return r;
1964 		}
1965 	}
1966 
1967 	/* Initialize power management */
1968 	radeon_pm_init(rdev);
1969 
1970 	rdev->ring[RADEON_RING_TYPE_GFX_INDEX].ring_obj = NULL;
1971 	r600_ring_init(rdev, &rdev->ring[RADEON_RING_TYPE_GFX_INDEX], 1024 * 1024);
1972 
1973 	rdev->ring[R600_RING_TYPE_DMA_INDEX].ring_obj = NULL;
1974 	r600_ring_init(rdev, &rdev->ring[R600_RING_TYPE_DMA_INDEX], 64 * 1024);
1975 
1976 	rv770_uvd_init(rdev);
1977 
1978 	rdev->ih.ring_obj = NULL;
1979 	r600_ih_ring_init(rdev, 64 * 1024);
1980 
1981 	r = r600_pcie_gart_init(rdev);
1982 	if (r)
1983 		return r;
1984 
1985 	rdev->accel_working = true;
1986 	r = rv770_startup(rdev);
1987 	if (r) {
1988 		dev_err(rdev->dev, "disabling GPU acceleration\n");
1989 		r700_cp_fini(rdev);
1990 		r600_dma_fini(rdev);
1991 		r600_irq_fini(rdev);
1992 		radeon_wb_fini(rdev);
1993 		radeon_ib_pool_fini(rdev);
1994 		radeon_irq_kms_fini(rdev);
1995 		rv770_pcie_gart_fini(rdev);
1996 		rdev->accel_working = false;
1997 	}
1998 
1999 	return 0;
2000 }
2001 
2002 void rv770_fini(struct radeon_device *rdev)
2003 {
2004 	radeon_pm_fini(rdev);
2005 	r700_cp_fini(rdev);
2006 	r600_dma_fini(rdev);
2007 	r600_irq_fini(rdev);
2008 	radeon_wb_fini(rdev);
2009 	radeon_ib_pool_fini(rdev);
2010 	radeon_irq_kms_fini(rdev);
2011 	uvd_v1_0_fini(rdev);
2012 	radeon_uvd_fini(rdev);
2013 	rv770_pcie_gart_fini(rdev);
2014 	r600_vram_scratch_fini(rdev);
2015 	radeon_gem_fini(rdev);
2016 	radeon_fence_driver_fini(rdev);
2017 	radeon_agp_fini(rdev);
2018 	radeon_bo_fini(rdev);
2019 	radeon_atombios_fini(rdev);
2020 	kfree(rdev->bios);
2021 	rdev->bios = NULL;
2022 }
2023 
2024 static void rv770_pcie_gen2_enable(struct radeon_device *rdev)
2025 {
2026 	u32 link_width_cntl, lanes, speed_cntl, tmp;
2027 	u16 link_cntl2;
2028 
2029 	if (radeon_pcie_gen2 == 0)
2030 		return;
2031 
2032 	if (rdev->flags & RADEON_IS_IGP)
2033 		return;
2034 
2035 	if (!(rdev->flags & RADEON_IS_PCIE))
2036 		return;
2037 
2038 	/* x2 cards have a special sequence */
2039 	if (ASIC_IS_X2(rdev))
2040 		return;
2041 
2042 	if ((rdev->pdev->bus->max_bus_speed != PCIE_SPEED_5_0GT) &&
2043 		(rdev->pdev->bus->max_bus_speed != PCIE_SPEED_8_0GT))
2044 		return;
2045 
2046 	DRM_INFO("enabling PCIE gen 2 link speeds, disable with radeon.pcie_gen2=0\n");
2047 
2048 	/* advertise upconfig capability */
2049 	link_width_cntl = RREG32_PCIE_PORT(PCIE_LC_LINK_WIDTH_CNTL);
2050 	link_width_cntl &= ~LC_UPCONFIGURE_DIS;
2051 	WREG32_PCIE_PORT(PCIE_LC_LINK_WIDTH_CNTL, link_width_cntl);
2052 	link_width_cntl = RREG32_PCIE_PORT(PCIE_LC_LINK_WIDTH_CNTL);
2053 	if (link_width_cntl & LC_RENEGOTIATION_SUPPORT) {
2054 		lanes = (link_width_cntl & LC_LINK_WIDTH_RD_MASK) >> LC_LINK_WIDTH_RD_SHIFT;
2055 		link_width_cntl &= ~(LC_LINK_WIDTH_MASK |
2056 				     LC_RECONFIG_ARC_MISSING_ESCAPE);
2057 		link_width_cntl |= lanes | LC_RECONFIG_NOW |
2058 			LC_RENEGOTIATE_EN | LC_UPCONFIGURE_SUPPORT;
2059 		WREG32_PCIE_PORT(PCIE_LC_LINK_WIDTH_CNTL, link_width_cntl);
2060 	} else {
2061 		link_width_cntl |= LC_UPCONFIGURE_DIS;
2062 		WREG32_PCIE_PORT(PCIE_LC_LINK_WIDTH_CNTL, link_width_cntl);
2063 	}
2064 
2065 	speed_cntl = RREG32_PCIE_PORT(PCIE_LC_SPEED_CNTL);
2066 	if ((speed_cntl & LC_OTHER_SIDE_EVER_SENT_GEN2) &&
2067 	    (speed_cntl & LC_OTHER_SIDE_SUPPORTS_GEN2)) {
2068 
2069 		tmp = RREG32(0x541c);
2070 		WREG32(0x541c, tmp | 0x8);
2071 		WREG32(MM_CFGREGS_CNTL, MM_WR_TO_CFG_EN);
2072 		link_cntl2 = RREG16(0x4088);
2073 		link_cntl2 &= ~TARGET_LINK_SPEED_MASK;
2074 		link_cntl2 |= 0x2;
2075 		WREG16(0x4088, link_cntl2);
2076 		WREG32(MM_CFGREGS_CNTL, 0);
2077 
2078 		speed_cntl = RREG32_PCIE_PORT(PCIE_LC_SPEED_CNTL);
2079 		speed_cntl &= ~LC_TARGET_LINK_SPEED_OVERRIDE_EN;
2080 		WREG32_PCIE_PORT(PCIE_LC_SPEED_CNTL, speed_cntl);
2081 
2082 		speed_cntl = RREG32_PCIE_PORT(PCIE_LC_SPEED_CNTL);
2083 		speed_cntl |= LC_CLR_FAILED_SPD_CHANGE_CNT;
2084 		WREG32_PCIE_PORT(PCIE_LC_SPEED_CNTL, speed_cntl);
2085 
2086 		speed_cntl = RREG32_PCIE_PORT(PCIE_LC_SPEED_CNTL);
2087 		speed_cntl &= ~LC_CLR_FAILED_SPD_CHANGE_CNT;
2088 		WREG32_PCIE_PORT(PCIE_LC_SPEED_CNTL, speed_cntl);
2089 
2090 		speed_cntl = RREG32_PCIE_PORT(PCIE_LC_SPEED_CNTL);
2091 		speed_cntl |= LC_GEN2_EN_STRAP;
2092 		WREG32_PCIE_PORT(PCIE_LC_SPEED_CNTL, speed_cntl);
2093 
2094 	} else {
2095 		link_width_cntl = RREG32_PCIE_PORT(PCIE_LC_LINK_WIDTH_CNTL);
2096 		/* XXX: only disable it if gen1 bridge vendor == 0x111d or 0x1106 */
2097 		if (1)
2098 			link_width_cntl |= LC_UPCONFIGURE_DIS;
2099 		else
2100 			link_width_cntl &= ~LC_UPCONFIGURE_DIS;
2101 		WREG32_PCIE_PORT(PCIE_LC_LINK_WIDTH_CNTL, link_width_cntl);
2102 	}
2103 }
2104