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