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