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