2 * Copyright 2008 Advanced Micro Devices, Inc.
3 * Copyright 2008 Red Hat Inc.
4 * Copyright 2009 Jerome Glisse.
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:
13 * The above copyright notice and this permission notice shall be included in
14 * all copies or substantial portions of the Software.
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.
24 * Authors: Dave Airlie
28 * $FreeBSD: head/sys/dev/drm2/radeon/rv770.c 254885 2013-08-25 19:37:15Z dumbbell $
33 #include "radeon_asic.h"
34 #include <uapi_drm/radeon_drm.h>
39 #define R700_PFP_UCODE_SIZE 848
40 #define R700_PM4_UCODE_SIZE 1360
42 static void rv770_gpu_init(struct radeon_device *rdev);
43 static void rv770_pcie_gen2_enable(struct radeon_device *rdev);
45 int rv770_set_uvd_clocks(struct radeon_device *rdev, u32 vclk, u32 dclk)
47 unsigned fb_div = 0, vclk_div = 0, dclk_div = 0;
50 /* RV740 uses evergreen uvd clk programming */
51 if (rdev->family == CHIP_RV740)
52 return evergreen_set_uvd_clocks(rdev, vclk, dclk);
54 /* bypass vclk and dclk with bclk */
55 WREG32_P(CG_UPLL_FUNC_CNTL_2,
56 VCLK_SRC_SEL(1) | DCLK_SRC_SEL(1),
57 ~(VCLK_SRC_SEL_MASK | DCLK_SRC_SEL_MASK));
60 /* keep the Bypass mode, put PLL to sleep */
61 WREG32_P(CG_UPLL_FUNC_CNTL, UPLL_SLEEP_MASK, ~UPLL_SLEEP_MASK);
65 r = radeon_uvd_calc_upll_dividers(rdev, vclk, dclk, 50000, 160000,
66 43663, 0x03FFFFFE, 1, 30, ~0,
67 &fb_div, &vclk_div, &dclk_div);
75 /* set UPLL_FB_DIV to 0x50000 */
76 WREG32_P(CG_UPLL_FUNC_CNTL_3, UPLL_FB_DIV(0x50000), ~UPLL_FB_DIV_MASK);
78 /* deassert UPLL_RESET and UPLL_SLEEP */
79 WREG32_P(CG_UPLL_FUNC_CNTL, 0, ~(UPLL_RESET_MASK | UPLL_SLEEP_MASK));
81 /* assert BYPASS EN and FB_DIV[0] <- ??? why? */
82 WREG32_P(CG_UPLL_FUNC_CNTL, UPLL_BYPASS_EN_MASK, ~UPLL_BYPASS_EN_MASK);
83 WREG32_P(CG_UPLL_FUNC_CNTL_3, UPLL_FB_DIV(1), ~UPLL_FB_DIV(1));
85 r = radeon_uvd_send_upll_ctlreq(rdev, CG_UPLL_FUNC_CNTL);
89 /* assert PLL_RESET */
90 WREG32_P(CG_UPLL_FUNC_CNTL, UPLL_RESET_MASK, ~UPLL_RESET_MASK);
92 /* set the required FB_DIV, REF_DIV, Post divder values */
93 WREG32_P(CG_UPLL_FUNC_CNTL, UPLL_REF_DIV(1), ~UPLL_REF_DIV_MASK);
94 WREG32_P(CG_UPLL_FUNC_CNTL_2,
95 UPLL_SW_HILEN(vclk_div >> 1) |
96 UPLL_SW_LOLEN((vclk_div >> 1) + (vclk_div & 1)) |
97 UPLL_SW_HILEN2(dclk_div >> 1) |
98 UPLL_SW_LOLEN2((dclk_div >> 1) + (dclk_div & 1)),
101 WREG32_P(CG_UPLL_FUNC_CNTL_3, UPLL_FB_DIV(fb_div),
104 /* give the PLL some time to settle */
107 /* deassert PLL_RESET */
108 WREG32_P(CG_UPLL_FUNC_CNTL, 0, ~UPLL_RESET_MASK);
112 /* deassert BYPASS EN and FB_DIV[0] <- ??? why? */
113 WREG32_P(CG_UPLL_FUNC_CNTL, 0, ~UPLL_BYPASS_EN_MASK);
114 WREG32_P(CG_UPLL_FUNC_CNTL_3, 0, ~UPLL_FB_DIV(1));
116 r = radeon_uvd_send_upll_ctlreq(rdev, CG_UPLL_FUNC_CNTL);
120 /* switch VCLK and DCLK selection */
121 WREG32_P(CG_UPLL_FUNC_CNTL_2,
122 VCLK_SRC_SEL(2) | DCLK_SRC_SEL(2),
123 ~(VCLK_SRC_SEL_MASK | DCLK_SRC_SEL_MASK));
130 static const u32 r7xx_golden_registers[] =
132 0x8d00, 0xffffffff, 0x0e0e0074,
133 0x8d04, 0xffffffff, 0x013a2b34,
134 0x9508, 0xffffffff, 0x00000002,
135 0x8b20, 0xffffffff, 0,
136 0x88c4, 0xffffffff, 0x000000c2,
137 0x28350, 0xffffffff, 0,
138 0x9058, 0xffffffff, 0x0fffc40f,
139 0x240c, 0xffffffff, 0x00000380,
140 0x733c, 0xffffffff, 0x00000002,
141 0x2650, 0x00040000, 0,
142 0x20bc, 0x00040000, 0,
143 0x7300, 0xffffffff, 0x001000f0
146 static const u32 r7xx_golden_dyn_gpr_registers[] =
148 0x8db0, 0xffffffff, 0x98989898,
149 0x8db4, 0xffffffff, 0x98989898,
150 0x8db8, 0xffffffff, 0x98989898,
151 0x8dbc, 0xffffffff, 0x98989898,
152 0x8dc0, 0xffffffff, 0x98989898,
153 0x8dc4, 0xffffffff, 0x98989898,
154 0x8dc8, 0xffffffff, 0x98989898,
155 0x8dcc, 0xffffffff, 0x98989898,
156 0x88c4, 0xffffffff, 0x00000082
159 static const u32 rv770_golden_registers[] =
161 0x562c, 0xffffffff, 0,
162 0x3f90, 0xffffffff, 0,
163 0x9148, 0xffffffff, 0,
164 0x3f94, 0xffffffff, 0,
165 0x914c, 0xffffffff, 0,
166 0x9698, 0x18000000, 0x18000000
169 static const u32 rv770ce_golden_registers[] =
171 0x562c, 0xffffffff, 0,
172 0x3f90, 0xffffffff, 0x00cc0000,
173 0x9148, 0xffffffff, 0x00cc0000,
174 0x3f94, 0xffffffff, 0x00cc0000,
175 0x914c, 0xffffffff, 0x00cc0000,
176 0x9b7c, 0xffffffff, 0x00fa0000,
177 0x3f8c, 0xffffffff, 0x00fa0000,
178 0x9698, 0x18000000, 0x18000000
181 static const u32 rv770_mgcg_init[] =
183 0x8bcc, 0xffffffff, 0x130300f9,
184 0x5448, 0xffffffff, 0x100,
185 0x55e4, 0xffffffff, 0x100,
186 0x160c, 0xffffffff, 0x100,
187 0x5644, 0xffffffff, 0x100,
188 0xc164, 0xffffffff, 0x100,
189 0x8a18, 0xffffffff, 0x100,
190 0x897c, 0xffffffff, 0x8000100,
191 0x8b28, 0xffffffff, 0x3c000100,
192 0x9144, 0xffffffff, 0x100,
193 0x9a1c, 0xffffffff, 0x10000,
194 0x9a50, 0xffffffff, 0x100,
195 0x9a1c, 0xffffffff, 0x10001,
196 0x9a50, 0xffffffff, 0x100,
197 0x9a1c, 0xffffffff, 0x10002,
198 0x9a50, 0xffffffff, 0x100,
199 0x9a1c, 0xffffffff, 0x10003,
200 0x9a50, 0xffffffff, 0x100,
201 0x9a1c, 0xffffffff, 0x0,
202 0x9870, 0xffffffff, 0x100,
203 0x8d58, 0xffffffff, 0x100,
204 0x9500, 0xffffffff, 0x0,
205 0x9510, 0xffffffff, 0x100,
206 0x9500, 0xffffffff, 0x1,
207 0x9510, 0xffffffff, 0x100,
208 0x9500, 0xffffffff, 0x2,
209 0x9510, 0xffffffff, 0x100,
210 0x9500, 0xffffffff, 0x3,
211 0x9510, 0xffffffff, 0x100,
212 0x9500, 0xffffffff, 0x4,
213 0x9510, 0xffffffff, 0x100,
214 0x9500, 0xffffffff, 0x5,
215 0x9510, 0xffffffff, 0x100,
216 0x9500, 0xffffffff, 0x6,
217 0x9510, 0xffffffff, 0x100,
218 0x9500, 0xffffffff, 0x7,
219 0x9510, 0xffffffff, 0x100,
220 0x9500, 0xffffffff, 0x8,
221 0x9510, 0xffffffff, 0x100,
222 0x9500, 0xffffffff, 0x9,
223 0x9510, 0xffffffff, 0x100,
224 0x9500, 0xffffffff, 0x8000,
225 0x9490, 0xffffffff, 0x0,
226 0x949c, 0xffffffff, 0x100,
227 0x9490, 0xffffffff, 0x1,
228 0x949c, 0xffffffff, 0x100,
229 0x9490, 0xffffffff, 0x2,
230 0x949c, 0xffffffff, 0x100,
231 0x9490, 0xffffffff, 0x3,
232 0x949c, 0xffffffff, 0x100,
233 0x9490, 0xffffffff, 0x4,
234 0x949c, 0xffffffff, 0x100,
235 0x9490, 0xffffffff, 0x5,
236 0x949c, 0xffffffff, 0x100,
237 0x9490, 0xffffffff, 0x6,
238 0x949c, 0xffffffff, 0x100,
239 0x9490, 0xffffffff, 0x7,
240 0x949c, 0xffffffff, 0x100,
241 0x9490, 0xffffffff, 0x8,
242 0x949c, 0xffffffff, 0x100,
243 0x9490, 0xffffffff, 0x9,
244 0x949c, 0xffffffff, 0x100,
245 0x9490, 0xffffffff, 0x8000,
246 0x9604, 0xffffffff, 0x0,
247 0x9654, 0xffffffff, 0x100,
248 0x9604, 0xffffffff, 0x1,
249 0x9654, 0xffffffff, 0x100,
250 0x9604, 0xffffffff, 0x2,
251 0x9654, 0xffffffff, 0x100,
252 0x9604, 0xffffffff, 0x3,
253 0x9654, 0xffffffff, 0x100,
254 0x9604, 0xffffffff, 0x4,
255 0x9654, 0xffffffff, 0x100,
256 0x9604, 0xffffffff, 0x5,
257 0x9654, 0xffffffff, 0x100,
258 0x9604, 0xffffffff, 0x6,
259 0x9654, 0xffffffff, 0x100,
260 0x9604, 0xffffffff, 0x7,
261 0x9654, 0xffffffff, 0x100,
262 0x9604, 0xffffffff, 0x8,
263 0x9654, 0xffffffff, 0x100,
264 0x9604, 0xffffffff, 0x9,
265 0x9654, 0xffffffff, 0x100,
266 0x9604, 0xffffffff, 0x80000000,
267 0x9030, 0xffffffff, 0x100,
268 0x9034, 0xffffffff, 0x100,
269 0x9038, 0xffffffff, 0x100,
270 0x903c, 0xffffffff, 0x100,
271 0x9040, 0xffffffff, 0x100,
272 0xa200, 0xffffffff, 0x100,
273 0xa204, 0xffffffff, 0x100,
274 0xa208, 0xffffffff, 0x100,
275 0xa20c, 0xffffffff, 0x100,
276 0x971c, 0xffffffff, 0x100,
277 0x915c, 0xffffffff, 0x00020001,
278 0x9160, 0xffffffff, 0x00040003,
279 0x916c, 0xffffffff, 0x00060005,
280 0x9170, 0xffffffff, 0x00080007,
281 0x9174, 0xffffffff, 0x000a0009,
282 0x9178, 0xffffffff, 0x000c000b,
283 0x917c, 0xffffffff, 0x000e000d,
284 0x9180, 0xffffffff, 0x0010000f,
285 0x918c, 0xffffffff, 0x00120011,
286 0x9190, 0xffffffff, 0x00140013,
287 0x9194, 0xffffffff, 0x00020001,
288 0x9198, 0xffffffff, 0x00040003,
289 0x919c, 0xffffffff, 0x00060005,
290 0x91a8, 0xffffffff, 0x00080007,
291 0x91ac, 0xffffffff, 0x000a0009,
292 0x91b0, 0xffffffff, 0x000c000b,
293 0x91b4, 0xffffffff, 0x000e000d,
294 0x91b8, 0xffffffff, 0x0010000f,
295 0x91c4, 0xffffffff, 0x00120011,
296 0x91c8, 0xffffffff, 0x00140013,
297 0x91cc, 0xffffffff, 0x00020001,
298 0x91d0, 0xffffffff, 0x00040003,
299 0x91d4, 0xffffffff, 0x00060005,
300 0x91e0, 0xffffffff, 0x00080007,
301 0x91e4, 0xffffffff, 0x000a0009,
302 0x91e8, 0xffffffff, 0x000c000b,
303 0x91ec, 0xffffffff, 0x00020001,
304 0x91f0, 0xffffffff, 0x00040003,
305 0x91f4, 0xffffffff, 0x00060005,
306 0x9200, 0xffffffff, 0x00080007,
307 0x9204, 0xffffffff, 0x000a0009,
308 0x9208, 0xffffffff, 0x000c000b,
309 0x920c, 0xffffffff, 0x000e000d,
310 0x9210, 0xffffffff, 0x0010000f,
311 0x921c, 0xffffffff, 0x00120011,
312 0x9220, 0xffffffff, 0x00140013,
313 0x9224, 0xffffffff, 0x00020001,
314 0x9228, 0xffffffff, 0x00040003,
315 0x922c, 0xffffffff, 0x00060005,
316 0x9238, 0xffffffff, 0x00080007,
317 0x923c, 0xffffffff, 0x000a0009,
318 0x9240, 0xffffffff, 0x000c000b,
319 0x9244, 0xffffffff, 0x000e000d,
320 0x9248, 0xffffffff, 0x0010000f,
321 0x9254, 0xffffffff, 0x00120011,
322 0x9258, 0xffffffff, 0x00140013,
323 0x925c, 0xffffffff, 0x00020001,
324 0x9260, 0xffffffff, 0x00040003,
325 0x9264, 0xffffffff, 0x00060005,
326 0x9270, 0xffffffff, 0x00080007,
327 0x9274, 0xffffffff, 0x000a0009,
328 0x9278, 0xffffffff, 0x000c000b,
329 0x927c, 0xffffffff, 0x000e000d,
330 0x9280, 0xffffffff, 0x0010000f,
331 0x928c, 0xffffffff, 0x00120011,
332 0x9290, 0xffffffff, 0x00140013,
333 0x9294, 0xffffffff, 0x00020001,
334 0x929c, 0xffffffff, 0x00040003,
335 0x92a0, 0xffffffff, 0x00060005,
336 0x92a4, 0xffffffff, 0x00080007
339 static const u32 rv710_golden_registers[] =
341 0x3f90, 0x00ff0000, 0x00fc0000,
342 0x9148, 0x00ff0000, 0x00fc0000,
343 0x3f94, 0x00ff0000, 0x00fc0000,
344 0x914c, 0x00ff0000, 0x00fc0000,
345 0xb4c, 0x00000020, 0x00000020,
346 0xa180, 0xffffffff, 0x00003f3f
349 static const u32 rv710_mgcg_init[] =
351 0x8bcc, 0xffffffff, 0x13030040,
352 0x5448, 0xffffffff, 0x100,
353 0x55e4, 0xffffffff, 0x100,
354 0x160c, 0xffffffff, 0x100,
355 0x5644, 0xffffffff, 0x100,
356 0xc164, 0xffffffff, 0x100,
357 0x8a18, 0xffffffff, 0x100,
358 0x897c, 0xffffffff, 0x8000100,
359 0x8b28, 0xffffffff, 0x3c000100,
360 0x9144, 0xffffffff, 0x100,
361 0x9a1c, 0xffffffff, 0x10000,
362 0x9a50, 0xffffffff, 0x100,
363 0x9a1c, 0xffffffff, 0x0,
364 0x9870, 0xffffffff, 0x100,
365 0x8d58, 0xffffffff, 0x100,
366 0x9500, 0xffffffff, 0x0,
367 0x9510, 0xffffffff, 0x100,
368 0x9500, 0xffffffff, 0x1,
369 0x9510, 0xffffffff, 0x100,
370 0x9500, 0xffffffff, 0x8000,
371 0x9490, 0xffffffff, 0x0,
372 0x949c, 0xffffffff, 0x100,
373 0x9490, 0xffffffff, 0x1,
374 0x949c, 0xffffffff, 0x100,
375 0x9490, 0xffffffff, 0x8000,
376 0x9604, 0xffffffff, 0x0,
377 0x9654, 0xffffffff, 0x100,
378 0x9604, 0xffffffff, 0x1,
379 0x9654, 0xffffffff, 0x100,
380 0x9604, 0xffffffff, 0x80000000,
381 0x9030, 0xffffffff, 0x100,
382 0x9034, 0xffffffff, 0x100,
383 0x9038, 0xffffffff, 0x100,
384 0x903c, 0xffffffff, 0x100,
385 0x9040, 0xffffffff, 0x100,
386 0xa200, 0xffffffff, 0x100,
387 0xa204, 0xffffffff, 0x100,
388 0xa208, 0xffffffff, 0x100,
389 0xa20c, 0xffffffff, 0x100,
390 0x971c, 0xffffffff, 0x100,
391 0x915c, 0xffffffff, 0x00020001,
392 0x9174, 0xffffffff, 0x00000003,
393 0x9178, 0xffffffff, 0x00050001,
394 0x917c, 0xffffffff, 0x00030002,
395 0x918c, 0xffffffff, 0x00000004,
396 0x9190, 0xffffffff, 0x00070006,
397 0x9194, 0xffffffff, 0x00050001,
398 0x9198, 0xffffffff, 0x00030002,
399 0x91a8, 0xffffffff, 0x00000004,
400 0x91ac, 0xffffffff, 0x00070006,
401 0x91e8, 0xffffffff, 0x00000001,
402 0x9294, 0xffffffff, 0x00000001,
403 0x929c, 0xffffffff, 0x00000002,
404 0x92a0, 0xffffffff, 0x00040003,
405 0x9150, 0xffffffff, 0x4d940000
408 static const u32 rv730_golden_registers[] =
410 0x3f90, 0x00ff0000, 0x00f00000,
411 0x9148, 0x00ff0000, 0x00f00000,
412 0x3f94, 0x00ff0000, 0x00f00000,
413 0x914c, 0x00ff0000, 0x00f00000,
414 0x900c, 0xffffffff, 0x003b033f,
415 0xb4c, 0x00000020, 0x00000020,
416 0xa180, 0xffffffff, 0x00003f3f
419 static const u32 rv730_mgcg_init[] =
421 0x8bcc, 0xffffffff, 0x130300f9,
422 0x5448, 0xffffffff, 0x100,
423 0x55e4, 0xffffffff, 0x100,
424 0x160c, 0xffffffff, 0x100,
425 0x5644, 0xffffffff, 0x100,
426 0xc164, 0xffffffff, 0x100,
427 0x8a18, 0xffffffff, 0x100,
428 0x897c, 0xffffffff, 0x8000100,
429 0x8b28, 0xffffffff, 0x3c000100,
430 0x9144, 0xffffffff, 0x100,
431 0x9a1c, 0xffffffff, 0x10000,
432 0x9a50, 0xffffffff, 0x100,
433 0x9a1c, 0xffffffff, 0x10001,
434 0x9a50, 0xffffffff, 0x100,
435 0x9a1c, 0xffffffff, 0x0,
436 0x9870, 0xffffffff, 0x100,
437 0x8d58, 0xffffffff, 0x100,
438 0x9500, 0xffffffff, 0x0,
439 0x9510, 0xffffffff, 0x100,
440 0x9500, 0xffffffff, 0x1,
441 0x9510, 0xffffffff, 0x100,
442 0x9500, 0xffffffff, 0x2,
443 0x9510, 0xffffffff, 0x100,
444 0x9500, 0xffffffff, 0x3,
445 0x9510, 0xffffffff, 0x100,
446 0x9500, 0xffffffff, 0x4,
447 0x9510, 0xffffffff, 0x100,
448 0x9500, 0xffffffff, 0x5,
449 0x9510, 0xffffffff, 0x100,
450 0x9500, 0xffffffff, 0x6,
451 0x9510, 0xffffffff, 0x100,
452 0x9500, 0xffffffff, 0x7,
453 0x9510, 0xffffffff, 0x100,
454 0x9500, 0xffffffff, 0x8000,
455 0x9490, 0xffffffff, 0x0,
456 0x949c, 0xffffffff, 0x100,
457 0x9490, 0xffffffff, 0x1,
458 0x949c, 0xffffffff, 0x100,
459 0x9490, 0xffffffff, 0x2,
460 0x949c, 0xffffffff, 0x100,
461 0x9490, 0xffffffff, 0x3,
462 0x949c, 0xffffffff, 0x100,
463 0x9490, 0xffffffff, 0x4,
464 0x949c, 0xffffffff, 0x100,
465 0x9490, 0xffffffff, 0x5,
466 0x949c, 0xffffffff, 0x100,
467 0x9490, 0xffffffff, 0x6,
468 0x949c, 0xffffffff, 0x100,
469 0x9490, 0xffffffff, 0x7,
470 0x949c, 0xffffffff, 0x100,
471 0x9490, 0xffffffff, 0x8000,
472 0x9604, 0xffffffff, 0x0,
473 0x9654, 0xffffffff, 0x100,
474 0x9604, 0xffffffff, 0x1,
475 0x9654, 0xffffffff, 0x100,
476 0x9604, 0xffffffff, 0x2,
477 0x9654, 0xffffffff, 0x100,
478 0x9604, 0xffffffff, 0x3,
479 0x9654, 0xffffffff, 0x100,
480 0x9604, 0xffffffff, 0x4,
481 0x9654, 0xffffffff, 0x100,
482 0x9604, 0xffffffff, 0x5,
483 0x9654, 0xffffffff, 0x100,
484 0x9604, 0xffffffff, 0x6,
485 0x9654, 0xffffffff, 0x100,
486 0x9604, 0xffffffff, 0x7,
487 0x9654, 0xffffffff, 0x100,
488 0x9604, 0xffffffff, 0x80000000,
489 0x9030, 0xffffffff, 0x100,
490 0x9034, 0xffffffff, 0x100,
491 0x9038, 0xffffffff, 0x100,
492 0x903c, 0xffffffff, 0x100,
493 0x9040, 0xffffffff, 0x100,
494 0xa200, 0xffffffff, 0x100,
495 0xa204, 0xffffffff, 0x100,
496 0xa208, 0xffffffff, 0x100,
497 0xa20c, 0xffffffff, 0x100,
498 0x971c, 0xffffffff, 0x100,
499 0x915c, 0xffffffff, 0x00020001,
500 0x916c, 0xffffffff, 0x00040003,
501 0x9170, 0xffffffff, 0x00000005,
502 0x9178, 0xffffffff, 0x00050001,
503 0x917c, 0xffffffff, 0x00030002,
504 0x918c, 0xffffffff, 0x00000004,
505 0x9190, 0xffffffff, 0x00070006,
506 0x9194, 0xffffffff, 0x00050001,
507 0x9198, 0xffffffff, 0x00030002,
508 0x91a8, 0xffffffff, 0x00000004,
509 0x91ac, 0xffffffff, 0x00070006,
510 0x91b0, 0xffffffff, 0x00050001,
511 0x91b4, 0xffffffff, 0x00030002,
512 0x91c4, 0xffffffff, 0x00000004,
513 0x91c8, 0xffffffff, 0x00070006,
514 0x91cc, 0xffffffff, 0x00050001,
515 0x91d0, 0xffffffff, 0x00030002,
516 0x91e0, 0xffffffff, 0x00000004,
517 0x91e4, 0xffffffff, 0x00070006,
518 0x91e8, 0xffffffff, 0x00000001,
519 0x91ec, 0xffffffff, 0x00050001,
520 0x91f0, 0xffffffff, 0x00030002,
521 0x9200, 0xffffffff, 0x00000004,
522 0x9204, 0xffffffff, 0x00070006,
523 0x9208, 0xffffffff, 0x00050001,
524 0x920c, 0xffffffff, 0x00030002,
525 0x921c, 0xffffffff, 0x00000004,
526 0x9220, 0xffffffff, 0x00070006,
527 0x9224, 0xffffffff, 0x00050001,
528 0x9228, 0xffffffff, 0x00030002,
529 0x9238, 0xffffffff, 0x00000004,
530 0x923c, 0xffffffff, 0x00070006,
531 0x9240, 0xffffffff, 0x00050001,
532 0x9244, 0xffffffff, 0x00030002,
533 0x9254, 0xffffffff, 0x00000004,
534 0x9258, 0xffffffff, 0x00070006,
535 0x9294, 0xffffffff, 0x00000001,
536 0x929c, 0xffffffff, 0x00000002,
537 0x92a0, 0xffffffff, 0x00040003,
538 0x92a4, 0xffffffff, 0x00000005
541 static const u32 rv740_golden_registers[] =
543 0x88c4, 0xffffffff, 0x00000082,
544 0x28a50, 0xfffffffc, 0x00000004,
545 0x2650, 0x00040000, 0,
546 0x20bc, 0x00040000, 0,
547 0x733c, 0xffffffff, 0x00000002,
548 0x7300, 0xffffffff, 0x001000f0,
549 0x3f90, 0x00ff0000, 0,
550 0x9148, 0x00ff0000, 0,
551 0x3f94, 0x00ff0000, 0,
552 0x914c, 0x00ff0000, 0,
553 0x240c, 0xffffffff, 0x00000380,
554 0x8a14, 0x00000007, 0x00000007,
555 0x8b24, 0xffffffff, 0x00ff0fff,
556 0x28a4c, 0xffffffff, 0x00004000,
557 0xa180, 0xffffffff, 0x00003f3f,
558 0x8d00, 0xffffffff, 0x0e0e003a,
559 0x8d04, 0xffffffff, 0x013a0e2a,
560 0x8c00, 0xffffffff, 0xe400000f,
561 0x8db0, 0xffffffff, 0x98989898,
562 0x8db4, 0xffffffff, 0x98989898,
563 0x8db8, 0xffffffff, 0x98989898,
564 0x8dbc, 0xffffffff, 0x98989898,
565 0x8dc0, 0xffffffff, 0x98989898,
566 0x8dc4, 0xffffffff, 0x98989898,
567 0x8dc8, 0xffffffff, 0x98989898,
568 0x8dcc, 0xffffffff, 0x98989898,
569 0x9058, 0xffffffff, 0x0fffc40f,
570 0x900c, 0xffffffff, 0x003b033f,
571 0x28350, 0xffffffff, 0,
572 0x8cf0, 0x1fffffff, 0x08e00420,
573 0x9508, 0xffffffff, 0x00000002,
574 0x88c4, 0xffffffff, 0x000000c2,
575 0x9698, 0x18000000, 0x18000000
578 static const u32 rv740_mgcg_init[] =
580 0x8bcc, 0xffffffff, 0x13030100,
581 0x5448, 0xffffffff, 0x100,
582 0x55e4, 0xffffffff, 0x100,
583 0x160c, 0xffffffff, 0x100,
584 0x5644, 0xffffffff, 0x100,
585 0xc164, 0xffffffff, 0x100,
586 0x8a18, 0xffffffff, 0x100,
587 0x897c, 0xffffffff, 0x100,
588 0x8b28, 0xffffffff, 0x100,
589 0x9144, 0xffffffff, 0x100,
590 0x9a1c, 0xffffffff, 0x10000,
591 0x9a50, 0xffffffff, 0x100,
592 0x9a1c, 0xffffffff, 0x10001,
593 0x9a50, 0xffffffff, 0x100,
594 0x9a1c, 0xffffffff, 0x10002,
595 0x9a50, 0xffffffff, 0x100,
596 0x9a1c, 0xffffffff, 0x10003,
597 0x9a50, 0xffffffff, 0x100,
598 0x9a1c, 0xffffffff, 0x0,
599 0x9870, 0xffffffff, 0x100,
600 0x8d58, 0xffffffff, 0x100,
601 0x9500, 0xffffffff, 0x0,
602 0x9510, 0xffffffff, 0x100,
603 0x9500, 0xffffffff, 0x1,
604 0x9510, 0xffffffff, 0x100,
605 0x9500, 0xffffffff, 0x2,
606 0x9510, 0xffffffff, 0x100,
607 0x9500, 0xffffffff, 0x3,
608 0x9510, 0xffffffff, 0x100,
609 0x9500, 0xffffffff, 0x4,
610 0x9510, 0xffffffff, 0x100,
611 0x9500, 0xffffffff, 0x5,
612 0x9510, 0xffffffff, 0x100,
613 0x9500, 0xffffffff, 0x6,
614 0x9510, 0xffffffff, 0x100,
615 0x9500, 0xffffffff, 0x7,
616 0x9510, 0xffffffff, 0x100,
617 0x9500, 0xffffffff, 0x8000,
618 0x9490, 0xffffffff, 0x0,
619 0x949c, 0xffffffff, 0x100,
620 0x9490, 0xffffffff, 0x1,
621 0x949c, 0xffffffff, 0x100,
622 0x9490, 0xffffffff, 0x2,
623 0x949c, 0xffffffff, 0x100,
624 0x9490, 0xffffffff, 0x3,
625 0x949c, 0xffffffff, 0x100,
626 0x9490, 0xffffffff, 0x4,
627 0x949c, 0xffffffff, 0x100,
628 0x9490, 0xffffffff, 0x5,
629 0x949c, 0xffffffff, 0x100,
630 0x9490, 0xffffffff, 0x6,
631 0x949c, 0xffffffff, 0x100,
632 0x9490, 0xffffffff, 0x7,
633 0x949c, 0xffffffff, 0x100,
634 0x9490, 0xffffffff, 0x8000,
635 0x9604, 0xffffffff, 0x0,
636 0x9654, 0xffffffff, 0x100,
637 0x9604, 0xffffffff, 0x1,
638 0x9654, 0xffffffff, 0x100,
639 0x9604, 0xffffffff, 0x2,
640 0x9654, 0xffffffff, 0x100,
641 0x9604, 0xffffffff, 0x3,
642 0x9654, 0xffffffff, 0x100,
643 0x9604, 0xffffffff, 0x4,
644 0x9654, 0xffffffff, 0x100,
645 0x9604, 0xffffffff, 0x5,
646 0x9654, 0xffffffff, 0x100,
647 0x9604, 0xffffffff, 0x6,
648 0x9654, 0xffffffff, 0x100,
649 0x9604, 0xffffffff, 0x7,
650 0x9654, 0xffffffff, 0x100,
651 0x9604, 0xffffffff, 0x80000000,
652 0x9030, 0xffffffff, 0x100,
653 0x9034, 0xffffffff, 0x100,
654 0x9038, 0xffffffff, 0x100,
655 0x903c, 0xffffffff, 0x100,
656 0x9040, 0xffffffff, 0x100,
657 0xa200, 0xffffffff, 0x100,
658 0xa204, 0xffffffff, 0x100,
659 0xa208, 0xffffffff, 0x100,
660 0xa20c, 0xffffffff, 0x100,
661 0x971c, 0xffffffff, 0x100,
662 0x915c, 0xffffffff, 0x00020001,
663 0x9160, 0xffffffff, 0x00040003,
664 0x916c, 0xffffffff, 0x00060005,
665 0x9170, 0xffffffff, 0x00080007,
666 0x9174, 0xffffffff, 0x000a0009,
667 0x9178, 0xffffffff, 0x000c000b,
668 0x917c, 0xffffffff, 0x000e000d,
669 0x9180, 0xffffffff, 0x0010000f,
670 0x918c, 0xffffffff, 0x00120011,
671 0x9190, 0xffffffff, 0x00140013,
672 0x9194, 0xffffffff, 0x00020001,
673 0x9198, 0xffffffff, 0x00040003,
674 0x919c, 0xffffffff, 0x00060005,
675 0x91a8, 0xffffffff, 0x00080007,
676 0x91ac, 0xffffffff, 0x000a0009,
677 0x91b0, 0xffffffff, 0x000c000b,
678 0x91b4, 0xffffffff, 0x000e000d,
679 0x91b8, 0xffffffff, 0x0010000f,
680 0x91c4, 0xffffffff, 0x00120011,
681 0x91c8, 0xffffffff, 0x00140013,
682 0x91cc, 0xffffffff, 0x00020001,
683 0x91d0, 0xffffffff, 0x00040003,
684 0x91d4, 0xffffffff, 0x00060005,
685 0x91e0, 0xffffffff, 0x00080007,
686 0x91e4, 0xffffffff, 0x000a0009,
687 0x91e8, 0xffffffff, 0x000c000b,
688 0x91ec, 0xffffffff, 0x00020001,
689 0x91f0, 0xffffffff, 0x00040003,
690 0x91f4, 0xffffffff, 0x00060005,
691 0x9200, 0xffffffff, 0x00080007,
692 0x9204, 0xffffffff, 0x000a0009,
693 0x9208, 0xffffffff, 0x000c000b,
694 0x920c, 0xffffffff, 0x000e000d,
695 0x9210, 0xffffffff, 0x0010000f,
696 0x921c, 0xffffffff, 0x00120011,
697 0x9220, 0xffffffff, 0x00140013,
698 0x9224, 0xffffffff, 0x00020001,
699 0x9228, 0xffffffff, 0x00040003,
700 0x922c, 0xffffffff, 0x00060005,
701 0x9238, 0xffffffff, 0x00080007,
702 0x923c, 0xffffffff, 0x000a0009,
703 0x9240, 0xffffffff, 0x000c000b,
704 0x9244, 0xffffffff, 0x000e000d,
705 0x9248, 0xffffffff, 0x0010000f,
706 0x9254, 0xffffffff, 0x00120011,
707 0x9258, 0xffffffff, 0x00140013,
708 0x9294, 0xffffffff, 0x00020001,
709 0x929c, 0xffffffff, 0x00040003,
710 0x92a0, 0xffffffff, 0x00060005,
711 0x92a4, 0xffffffff, 0x00080007
714 static void rv770_init_golden_registers(struct radeon_device *rdev)
716 switch (rdev->family) {
718 radeon_program_register_sequence(rdev,
719 r7xx_golden_registers,
720 (const u32)ARRAY_SIZE(r7xx_golden_registers));
721 radeon_program_register_sequence(rdev,
722 r7xx_golden_dyn_gpr_registers,
723 (const u32)ARRAY_SIZE(r7xx_golden_dyn_gpr_registers));
724 if (rdev->ddev->pci_device == 0x994e)
725 radeon_program_register_sequence(rdev,
726 rv770ce_golden_registers,
727 (const u32)ARRAY_SIZE(rv770ce_golden_registers));
729 radeon_program_register_sequence(rdev,
730 rv770_golden_registers,
731 (const u32)ARRAY_SIZE(rv770_golden_registers));
732 radeon_program_register_sequence(rdev,
734 (const u32)ARRAY_SIZE(rv770_mgcg_init));
737 radeon_program_register_sequence(rdev,
738 r7xx_golden_registers,
739 (const u32)ARRAY_SIZE(r7xx_golden_registers));
740 radeon_program_register_sequence(rdev,
741 r7xx_golden_dyn_gpr_registers,
742 (const u32)ARRAY_SIZE(r7xx_golden_dyn_gpr_registers));
743 radeon_program_register_sequence(rdev,
744 rv730_golden_registers,
745 (const u32)ARRAY_SIZE(rv730_golden_registers));
746 radeon_program_register_sequence(rdev,
748 (const u32)ARRAY_SIZE(rv730_mgcg_init));
751 radeon_program_register_sequence(rdev,
752 r7xx_golden_registers,
753 (const u32)ARRAY_SIZE(r7xx_golden_registers));
754 radeon_program_register_sequence(rdev,
755 r7xx_golden_dyn_gpr_registers,
756 (const u32)ARRAY_SIZE(r7xx_golden_dyn_gpr_registers));
757 radeon_program_register_sequence(rdev,
758 rv710_golden_registers,
759 (const u32)ARRAY_SIZE(rv710_golden_registers));
760 radeon_program_register_sequence(rdev,
762 (const u32)ARRAY_SIZE(rv710_mgcg_init));
765 radeon_program_register_sequence(rdev,
766 rv740_golden_registers,
767 (const u32)ARRAY_SIZE(rv740_golden_registers));
768 radeon_program_register_sequence(rdev,
770 (const u32)ARRAY_SIZE(rv740_mgcg_init));
777 #define PCIE_BUS_CLK 10000
778 #define TCLK (PCIE_BUS_CLK / 10)
781 * rv770_get_xclk - get the xclk
783 * @rdev: radeon_device pointer
785 * Returns the reference clock used by the gfx engine
788 u32 rv770_get_xclk(struct radeon_device *rdev)
790 u32 reference_clock = rdev->clock.spll.reference_freq;
791 u32 tmp = RREG32(CG_CLKPIN_CNTL);
793 if (tmp & MUX_TCLK_TO_XCLK)
796 if (tmp & XTALIN_DIVIDE)
797 return reference_clock / 4;
799 return reference_clock;
802 int rv770_uvd_resume(struct radeon_device *rdev)
805 uint32_t chip_id, size;
808 r = radeon_uvd_resume(rdev);
812 /* programm the VCPU memory controller bits 0-27 */
813 addr = rdev->uvd.gpu_addr >> 3;
814 size = RADEON_GPU_PAGE_ALIGN(rdev->uvd_fw->datasize + 4) >> 3;
815 WREG32(UVD_VCPU_CACHE_OFFSET0, addr);
816 WREG32(UVD_VCPU_CACHE_SIZE0, size);
819 size = RADEON_UVD_STACK_SIZE >> 3;
820 WREG32(UVD_VCPU_CACHE_OFFSET1, addr);
821 WREG32(UVD_VCPU_CACHE_SIZE1, size);
824 size = RADEON_UVD_HEAP_SIZE >> 3;
825 WREG32(UVD_VCPU_CACHE_OFFSET2, addr);
826 WREG32(UVD_VCPU_CACHE_SIZE2, size);
829 addr = (rdev->uvd.gpu_addr >> 28) & 0xF;
830 WREG32(UVD_LMI_ADDR_EXT, (addr << 12) | (addr << 0));
833 addr = (rdev->uvd.gpu_addr >> 32) & 0xFF;
834 WREG32(UVD_LMI_EXT40_ADDR, addr | (0x9 << 16) | (0x1 << 31));
836 /* tell firmware which hardware it is running on */
837 switch (rdev->family) {
841 chip_id = 0x01000005;
844 chip_id = 0x01000006;
847 chip_id = 0x01000007;
851 chip_id = 0x01000008;
854 chip_id = 0x01000009;
857 chip_id = 0x0100000a;
860 chip_id = 0x0100000b;
864 chip_id = 0x0100000c;
867 chip_id = 0x0100000e;
870 chip_id = 0x0100000f;
873 chip_id = 0x01000010;
876 chip_id = 0x01000011;
879 chip_id = 0x01000012;
882 chip_id = 0x01000014;
885 chip_id = 0x01000015;
888 chip_id = 0x01000016;
891 chip_id = 0x01000017;
894 WREG32(UVD_VCPU_CHIP_ID, chip_id);
899 u32 rv770_page_flip(struct radeon_device *rdev, int crtc_id, u64 crtc_base)
901 struct radeon_crtc *radeon_crtc = rdev->mode_info.crtcs[crtc_id];
902 u32 tmp = RREG32(AVIVO_D1GRPH_UPDATE + radeon_crtc->crtc_offset);
905 /* Lock the graphics update lock */
906 tmp |= AVIVO_D1GRPH_UPDATE_LOCK;
907 WREG32(AVIVO_D1GRPH_UPDATE + radeon_crtc->crtc_offset, tmp);
909 /* update the scanout addresses */
910 if (radeon_crtc->crtc_id) {
911 WREG32(D2GRPH_SECONDARY_SURFACE_ADDRESS_HIGH, upper_32_bits(crtc_base));
912 WREG32(D2GRPH_PRIMARY_SURFACE_ADDRESS_HIGH, upper_32_bits(crtc_base));
914 WREG32(D1GRPH_SECONDARY_SURFACE_ADDRESS_HIGH, upper_32_bits(crtc_base));
915 WREG32(D1GRPH_PRIMARY_SURFACE_ADDRESS_HIGH, upper_32_bits(crtc_base));
917 WREG32(D1GRPH_SECONDARY_SURFACE_ADDRESS + radeon_crtc->crtc_offset,
919 WREG32(D1GRPH_PRIMARY_SURFACE_ADDRESS + radeon_crtc->crtc_offset,
922 /* Wait for update_pending to go high. */
923 for (i = 0; i < rdev->usec_timeout; i++) {
924 if (RREG32(AVIVO_D1GRPH_UPDATE + radeon_crtc->crtc_offset) & AVIVO_D1GRPH_SURFACE_UPDATE_PENDING)
928 DRM_DEBUG("Update pending now high. Unlocking vupdate_lock.\n");
930 /* Unlock the lock, so double-buffering can take place inside vblank */
931 tmp &= ~AVIVO_D1GRPH_UPDATE_LOCK;
932 WREG32(AVIVO_D1GRPH_UPDATE + radeon_crtc->crtc_offset, tmp);
934 /* Return current update_pending status: */
935 return RREG32(AVIVO_D1GRPH_UPDATE + radeon_crtc->crtc_offset) & AVIVO_D1GRPH_SURFACE_UPDATE_PENDING;
938 /* get temperature in millidegrees */
939 int rv770_get_temp(struct radeon_device *rdev)
941 u32 temp = (RREG32(CG_MULT_THERMAL_STATUS) & ASIC_T_MASK) >>
947 else if (temp & 0x200)
949 else if (temp & 0x100) {
950 actual_temp = temp & 0x1ff;
951 actual_temp |= ~0x1ff;
953 actual_temp = temp & 0xff;
955 return (actual_temp * 1000) / 2;
958 void rv770_pm_misc(struct radeon_device *rdev)
960 int req_ps_idx = rdev->pm.requested_power_state_index;
961 int req_cm_idx = rdev->pm.requested_clock_mode_index;
962 struct radeon_power_state *ps = &rdev->pm.power_state[req_ps_idx];
963 struct radeon_voltage *voltage = &ps->clock_info[req_cm_idx].voltage;
965 if ((voltage->type == VOLTAGE_SW) && voltage->voltage) {
966 /* 0xff01 is a flag rather then an actual voltage */
967 if (voltage->voltage == 0xff01)
969 if (voltage->voltage != rdev->pm.current_vddc) {
970 radeon_atom_set_voltage(rdev, voltage->voltage, SET_VOLTAGE_TYPE_ASIC_VDDC);
971 rdev->pm.current_vddc = voltage->voltage;
972 DRM_DEBUG("Setting: v: %d\n", voltage->voltage);
980 static int rv770_pcie_gart_enable(struct radeon_device *rdev)
985 if (rdev->gart.robj == NULL) {
986 dev_err(rdev->dev, "No VRAM object for PCIE GART.\n");
989 r = radeon_gart_table_vram_pin(rdev);
992 radeon_gart_restore(rdev);
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 if (rdev->family == CHIP_RV740)
1008 WREG32(MC_VM_MD_L1_TLB3_CNTL, tmp);
1009 WREG32(MC_VM_MB_L1_TLB0_CNTL, tmp);
1010 WREG32(MC_VM_MB_L1_TLB1_CNTL, tmp);
1011 WREG32(MC_VM_MB_L1_TLB2_CNTL, tmp);
1012 WREG32(MC_VM_MB_L1_TLB3_CNTL, tmp);
1013 WREG32(VM_CONTEXT0_PAGE_TABLE_START_ADDR, rdev->mc.gtt_start >> 12);
1014 WREG32(VM_CONTEXT0_PAGE_TABLE_END_ADDR, rdev->mc.gtt_end >> 12);
1015 WREG32(VM_CONTEXT0_PAGE_TABLE_BASE_ADDR, rdev->gart.table_addr >> 12);
1016 WREG32(VM_CONTEXT0_CNTL, ENABLE_CONTEXT | PAGE_TABLE_DEPTH(0) |
1017 RANGE_PROTECTION_FAULT_ENABLE_DEFAULT);
1018 WREG32(VM_CONTEXT0_PROTECTION_FAULT_DEFAULT_ADDR,
1019 (u32)(rdev->dummy_page.addr >> 12));
1020 for (i = 1; i < 7; i++)
1021 WREG32(VM_CONTEXT0_CNTL + (i * 4), 0);
1023 r600_pcie_gart_tlb_flush(rdev);
1024 DRM_INFO("PCIE GART of %uM enabled (table at 0x%016llX).\n",
1025 (unsigned)(rdev->mc.gtt_size >> 20),
1026 (unsigned long long)rdev->gart.table_addr);
1027 rdev->gart.ready = true;
1031 static void rv770_pcie_gart_disable(struct radeon_device *rdev)
1036 /* Disable all tables */
1037 for (i = 0; i < 7; i++)
1038 WREG32(VM_CONTEXT0_CNTL + (i * 4), 0);
1040 /* Setup L2 cache */
1041 WREG32(VM_L2_CNTL, ENABLE_L2_FRAGMENT_PROCESSING |
1042 EFFECTIVE_L2_QUEUE_SIZE(7));
1043 WREG32(VM_L2_CNTL2, 0);
1044 WREG32(VM_L2_CNTL3, BANK_SELECT(0) | CACHE_UPDATE_MODE(2));
1045 /* Setup TLB control */
1046 tmp = EFFECTIVE_L1_TLB_SIZE(5) | EFFECTIVE_L1_QUEUE_SIZE(5);
1047 WREG32(MC_VM_MD_L1_TLB0_CNTL, tmp);
1048 WREG32(MC_VM_MD_L1_TLB1_CNTL, tmp);
1049 WREG32(MC_VM_MD_L1_TLB2_CNTL, tmp);
1050 WREG32(MC_VM_MB_L1_TLB0_CNTL, tmp);
1051 WREG32(MC_VM_MB_L1_TLB1_CNTL, tmp);
1052 WREG32(MC_VM_MB_L1_TLB2_CNTL, tmp);
1053 WREG32(MC_VM_MB_L1_TLB3_CNTL, tmp);
1054 radeon_gart_table_vram_unpin(rdev);
1057 static void rv770_pcie_gart_fini(struct radeon_device *rdev)
1059 radeon_gart_fini(rdev);
1060 rv770_pcie_gart_disable(rdev);
1061 radeon_gart_table_vram_free(rdev);
1065 static void rv770_agp_enable(struct radeon_device *rdev)
1070 /* Setup L2 cache */
1071 WREG32(VM_L2_CNTL, ENABLE_L2_CACHE | ENABLE_L2_FRAGMENT_PROCESSING |
1072 ENABLE_L2_PTE_CACHE_LRU_UPDATE_BY_WRITE |
1073 EFFECTIVE_L2_QUEUE_SIZE(7));
1074 WREG32(VM_L2_CNTL2, 0);
1075 WREG32(VM_L2_CNTL3, BANK_SELECT(0) | CACHE_UPDATE_MODE(2));
1076 /* Setup TLB control */
1077 tmp = ENABLE_L1_TLB | ENABLE_L1_FRAGMENT_PROCESSING |
1078 SYSTEM_ACCESS_MODE_NOT_IN_SYS |
1079 SYSTEM_APERTURE_UNMAPPED_ACCESS_PASS_THRU |
1080 EFFECTIVE_L1_TLB_SIZE(5) | EFFECTIVE_L1_QUEUE_SIZE(5);
1081 WREG32(MC_VM_MD_L1_TLB0_CNTL, tmp);
1082 WREG32(MC_VM_MD_L1_TLB1_CNTL, tmp);
1083 WREG32(MC_VM_MD_L1_TLB2_CNTL, tmp);
1084 WREG32(MC_VM_MB_L1_TLB0_CNTL, tmp);
1085 WREG32(MC_VM_MB_L1_TLB1_CNTL, tmp);
1086 WREG32(MC_VM_MB_L1_TLB2_CNTL, tmp);
1087 WREG32(MC_VM_MB_L1_TLB3_CNTL, tmp);
1088 for (i = 0; i < 7; i++)
1089 WREG32(VM_CONTEXT0_CNTL + (i * 4), 0);
1092 static void rv770_mc_program(struct radeon_device *rdev)
1094 struct rv515_mc_save save;
1098 /* Initialize HDP */
1099 for (i = 0, j = 0; i < 32; i++, j += 0x18) {
1100 WREG32((0x2c14 + j), 0x00000000);
1101 WREG32((0x2c18 + j), 0x00000000);
1102 WREG32((0x2c1c + j), 0x00000000);
1103 WREG32((0x2c20 + j), 0x00000000);
1104 WREG32((0x2c24 + j), 0x00000000);
1106 /* r7xx hw bug. Read from HDP_DEBUG1 rather
1107 * than writing to HDP_REG_COHERENCY_FLUSH_CNTL
1109 tmp = RREG32(HDP_DEBUG1);
1111 rv515_mc_stop(rdev, &save);
1112 if (r600_mc_wait_for_idle(rdev)) {
1113 dev_warn(rdev->dev, "Wait for MC idle timedout !\n");
1115 /* Lockout access through VGA aperture*/
1116 WREG32(VGA_HDP_CONTROL, VGA_MEMORY_DISABLE);
1117 /* Update configuration */
1118 if (rdev->flags & RADEON_IS_AGP) {
1119 if (rdev->mc.vram_start < rdev->mc.gtt_start) {
1120 /* VRAM before AGP */
1121 WREG32(MC_VM_SYSTEM_APERTURE_LOW_ADDR,
1122 rdev->mc.vram_start >> 12);
1123 WREG32(MC_VM_SYSTEM_APERTURE_HIGH_ADDR,
1124 rdev->mc.gtt_end >> 12);
1126 /* VRAM after AGP */
1127 WREG32(MC_VM_SYSTEM_APERTURE_LOW_ADDR,
1128 rdev->mc.gtt_start >> 12);
1129 WREG32(MC_VM_SYSTEM_APERTURE_HIGH_ADDR,
1130 rdev->mc.vram_end >> 12);
1133 WREG32(MC_VM_SYSTEM_APERTURE_LOW_ADDR,
1134 rdev->mc.vram_start >> 12);
1135 WREG32(MC_VM_SYSTEM_APERTURE_HIGH_ADDR,
1136 rdev->mc.vram_end >> 12);
1138 WREG32(MC_VM_SYSTEM_APERTURE_DEFAULT_ADDR, rdev->vram_scratch.gpu_addr >> 12);
1139 tmp = ((rdev->mc.vram_end >> 24) & 0xFFFF) << 16;
1140 tmp |= ((rdev->mc.vram_start >> 24) & 0xFFFF);
1141 WREG32(MC_VM_FB_LOCATION, tmp);
1142 WREG32(HDP_NONSURFACE_BASE, (rdev->mc.vram_start >> 8));
1143 WREG32(HDP_NONSURFACE_INFO, (2 << 7));
1144 WREG32(HDP_NONSURFACE_SIZE, 0x3FFFFFFF);
1145 if (rdev->flags & RADEON_IS_AGP) {
1146 WREG32(MC_VM_AGP_TOP, rdev->mc.gtt_end >> 16);
1147 WREG32(MC_VM_AGP_BOT, rdev->mc.gtt_start >> 16);
1148 WREG32(MC_VM_AGP_BASE, rdev->mc.agp_base >> 22);
1150 WREG32(MC_VM_AGP_BASE, 0);
1151 WREG32(MC_VM_AGP_TOP, 0x0FFFFFFF);
1152 WREG32(MC_VM_AGP_BOT, 0x0FFFFFFF);
1154 if (r600_mc_wait_for_idle(rdev)) {
1155 dev_warn(rdev->dev, "Wait for MC idle timedout !\n");
1157 rv515_mc_resume(rdev, &save);
1158 /* we need to own VRAM, so turn off the VGA renderer here
1159 * to stop it overwriting our objects */
1160 rv515_vga_render_disable(rdev);
1167 void r700_cp_stop(struct radeon_device *rdev)
1169 radeon_ttm_set_active_vram_size(rdev, rdev->mc.visible_vram_size);
1170 WREG32(CP_ME_CNTL, (CP_ME_HALT | CP_PFP_HALT));
1171 WREG32(SCRATCH_UMSK, 0);
1172 rdev->ring[RADEON_RING_TYPE_GFX_INDEX].ready = false;
1175 static int rv770_cp_load_microcode(struct radeon_device *rdev)
1177 const __be32 *fw_data;
1180 if (!rdev->me_fw || !rdev->pfp_fw)
1188 RB_NO_UPDATE | RB_BLKSZ(15) | RB_BUFSZ(3));
1191 WREG32(GRBM_SOFT_RESET, SOFT_RESET_CP);
1192 RREG32(GRBM_SOFT_RESET);
1194 WREG32(GRBM_SOFT_RESET, 0);
1196 fw_data = (const __be32 *)rdev->pfp_fw->data;
1197 WREG32(CP_PFP_UCODE_ADDR, 0);
1198 for (i = 0; i < R700_PFP_UCODE_SIZE; i++)
1199 WREG32(CP_PFP_UCODE_DATA, be32_to_cpup(fw_data++));
1200 WREG32(CP_PFP_UCODE_ADDR, 0);
1202 fw_data = (const __be32 *)rdev->me_fw->data;
1203 WREG32(CP_ME_RAM_WADDR, 0);
1204 for (i = 0; i < R700_PM4_UCODE_SIZE; i++)
1205 WREG32(CP_ME_RAM_DATA, be32_to_cpup(fw_data++));
1207 WREG32(CP_PFP_UCODE_ADDR, 0);
1208 WREG32(CP_ME_RAM_WADDR, 0);
1209 WREG32(CP_ME_RAM_RADDR, 0);
1213 void r700_cp_fini(struct radeon_device *rdev)
1215 struct radeon_ring *ring = &rdev->ring[RADEON_RING_TYPE_GFX_INDEX];
1217 radeon_ring_fini(rdev, ring);
1218 radeon_scratch_free(rdev, ring->rptr_save_reg);
1224 static void rv770_gpu_init(struct radeon_device *rdev)
1226 int i, j, num_qd_pipes;
1231 u32 num_gs_verts_per_thread;
1233 u32 gs_prim_buffer_depth = 0;
1234 u32 sq_ms_fifo_sizes;
1236 u32 sq_thread_resource_mgmt;
1237 u32 hdp_host_path_cntl;
1238 u32 sq_dyn_gpr_size_simd_ab_0;
1239 u32 gb_tiling_config = 0;
1240 u32 cc_rb_backend_disable = 0;
1241 u32 cc_gc_shader_pipe_config = 0;
1244 u32 inactive_pipes, shader_pipe_config;
1245 u32 disabled_rb_mask;
1246 unsigned active_number;
1248 /* setup chip specs */
1249 rdev->config.rv770.tiling_group_size = 256;
1250 switch (rdev->family) {
1252 rdev->config.rv770.max_pipes = 4;
1253 rdev->config.rv770.max_tile_pipes = 8;
1254 rdev->config.rv770.max_simds = 10;
1255 rdev->config.rv770.max_backends = 4;
1256 rdev->config.rv770.max_gprs = 256;
1257 rdev->config.rv770.max_threads = 248;
1258 rdev->config.rv770.max_stack_entries = 512;
1259 rdev->config.rv770.max_hw_contexts = 8;
1260 rdev->config.rv770.max_gs_threads = 16 * 2;
1261 rdev->config.rv770.sx_max_export_size = 128;
1262 rdev->config.rv770.sx_max_export_pos_size = 16;
1263 rdev->config.rv770.sx_max_export_smx_size = 112;
1264 rdev->config.rv770.sq_num_cf_insts = 2;
1266 rdev->config.rv770.sx_num_of_sets = 7;
1267 rdev->config.rv770.sc_prim_fifo_size = 0xF9;
1268 rdev->config.rv770.sc_hiz_tile_fifo_size = 0x30;
1269 rdev->config.rv770.sc_earlyz_tile_fifo_fize = 0x130;
1272 rdev->config.rv770.max_pipes = 2;
1273 rdev->config.rv770.max_tile_pipes = 4;
1274 rdev->config.rv770.max_simds = 8;
1275 rdev->config.rv770.max_backends = 2;
1276 rdev->config.rv770.max_gprs = 128;
1277 rdev->config.rv770.max_threads = 248;
1278 rdev->config.rv770.max_stack_entries = 256;
1279 rdev->config.rv770.max_hw_contexts = 8;
1280 rdev->config.rv770.max_gs_threads = 16 * 2;
1281 rdev->config.rv770.sx_max_export_size = 256;
1282 rdev->config.rv770.sx_max_export_pos_size = 32;
1283 rdev->config.rv770.sx_max_export_smx_size = 224;
1284 rdev->config.rv770.sq_num_cf_insts = 2;
1286 rdev->config.rv770.sx_num_of_sets = 7;
1287 rdev->config.rv770.sc_prim_fifo_size = 0xf9;
1288 rdev->config.rv770.sc_hiz_tile_fifo_size = 0x30;
1289 rdev->config.rv770.sc_earlyz_tile_fifo_fize = 0x130;
1290 if (rdev->config.rv770.sx_max_export_pos_size > 16) {
1291 rdev->config.rv770.sx_max_export_pos_size -= 16;
1292 rdev->config.rv770.sx_max_export_smx_size += 16;
1296 rdev->config.rv770.max_pipes = 2;
1297 rdev->config.rv770.max_tile_pipes = 2;
1298 rdev->config.rv770.max_simds = 2;
1299 rdev->config.rv770.max_backends = 1;
1300 rdev->config.rv770.max_gprs = 256;
1301 rdev->config.rv770.max_threads = 192;
1302 rdev->config.rv770.max_stack_entries = 256;
1303 rdev->config.rv770.max_hw_contexts = 4;
1304 rdev->config.rv770.max_gs_threads = 8 * 2;
1305 rdev->config.rv770.sx_max_export_size = 128;
1306 rdev->config.rv770.sx_max_export_pos_size = 16;
1307 rdev->config.rv770.sx_max_export_smx_size = 112;
1308 rdev->config.rv770.sq_num_cf_insts = 1;
1310 rdev->config.rv770.sx_num_of_sets = 7;
1311 rdev->config.rv770.sc_prim_fifo_size = 0x40;
1312 rdev->config.rv770.sc_hiz_tile_fifo_size = 0x30;
1313 rdev->config.rv770.sc_earlyz_tile_fifo_fize = 0x130;
1316 rdev->config.rv770.max_pipes = 4;
1317 rdev->config.rv770.max_tile_pipes = 4;
1318 rdev->config.rv770.max_simds = 8;
1319 rdev->config.rv770.max_backends = 4;
1320 rdev->config.rv770.max_gprs = 256;
1321 rdev->config.rv770.max_threads = 248;
1322 rdev->config.rv770.max_stack_entries = 512;
1323 rdev->config.rv770.max_hw_contexts = 8;
1324 rdev->config.rv770.max_gs_threads = 16 * 2;
1325 rdev->config.rv770.sx_max_export_size = 256;
1326 rdev->config.rv770.sx_max_export_pos_size = 32;
1327 rdev->config.rv770.sx_max_export_smx_size = 224;
1328 rdev->config.rv770.sq_num_cf_insts = 2;
1330 rdev->config.rv770.sx_num_of_sets = 7;
1331 rdev->config.rv770.sc_prim_fifo_size = 0x100;
1332 rdev->config.rv770.sc_hiz_tile_fifo_size = 0x30;
1333 rdev->config.rv770.sc_earlyz_tile_fifo_fize = 0x130;
1335 if (rdev->config.rv770.sx_max_export_pos_size > 16) {
1336 rdev->config.rv770.sx_max_export_pos_size -= 16;
1337 rdev->config.rv770.sx_max_export_smx_size += 16;
1344 /* Initialize HDP */
1346 for (i = 0; i < 32; i++) {
1347 WREG32((0x2c14 + j), 0x00000000);
1348 WREG32((0x2c18 + j), 0x00000000);
1349 WREG32((0x2c1c + j), 0x00000000);
1350 WREG32((0x2c20 + j), 0x00000000);
1351 WREG32((0x2c24 + j), 0x00000000);
1355 WREG32(GRBM_CNTL, GRBM_READ_TIMEOUT(0xff));
1357 /* setup tiling, simd, pipe config */
1358 mc_arb_ramcfg = RREG32(MC_ARB_RAMCFG);
1360 shader_pipe_config = RREG32(CC_GC_SHADER_PIPE_CONFIG);
1361 inactive_pipes = (shader_pipe_config & INACTIVE_QD_PIPES_MASK) >> INACTIVE_QD_PIPES_SHIFT;
1362 for (i = 0, tmp = 1, active_number = 0; i < R7XX_MAX_PIPES; i++) {
1363 if (!(inactive_pipes & tmp)) {
1368 if (active_number == 1) {
1369 WREG32(SPI_CONFIG_CNTL, DISABLE_INTERP_1);
1371 WREG32(SPI_CONFIG_CNTL, 0);
1374 cc_rb_backend_disable = RREG32(CC_RB_BACKEND_DISABLE) & 0x00ff0000;
1375 tmp = R7XX_MAX_BACKENDS - r600_count_pipe_bits(cc_rb_backend_disable >> 16);
1376 if (tmp < rdev->config.rv770.max_backends) {
1377 rdev->config.rv770.max_backends = tmp;
1380 cc_gc_shader_pipe_config = RREG32(CC_GC_SHADER_PIPE_CONFIG) & 0xffffff00;
1381 tmp = R7XX_MAX_PIPES - r600_count_pipe_bits((cc_gc_shader_pipe_config >> 8) & R7XX_MAX_PIPES_MASK);
1382 if (tmp < rdev->config.rv770.max_pipes) {
1383 rdev->config.rv770.max_pipes = tmp;
1385 tmp = R7XX_MAX_SIMDS - r600_count_pipe_bits((cc_gc_shader_pipe_config >> 16) & R7XX_MAX_SIMDS_MASK);
1386 if (tmp < rdev->config.rv770.max_simds) {
1387 rdev->config.rv770.max_simds = tmp;
1390 switch (rdev->config.rv770.max_tile_pipes) {
1393 gb_tiling_config = PIPE_TILING(0);
1396 gb_tiling_config = PIPE_TILING(1);
1399 gb_tiling_config = PIPE_TILING(2);
1402 gb_tiling_config = PIPE_TILING(3);
1405 rdev->config.rv770.tiling_npipes = rdev->config.rv770.max_tile_pipes;
1407 disabled_rb_mask = (RREG32(CC_RB_BACKEND_DISABLE) >> 16) & R7XX_MAX_BACKENDS_MASK;
1408 tmp = (gb_tiling_config & PIPE_TILING__MASK) >> PIPE_TILING__SHIFT;
1409 tmp = r6xx_remap_render_backend(rdev, tmp, rdev->config.rv770.max_backends,
1410 R7XX_MAX_BACKENDS, disabled_rb_mask);
1411 gb_tiling_config |= tmp << 16;
1412 rdev->config.rv770.backend_map = tmp;
1414 if (rdev->family == CHIP_RV770)
1415 gb_tiling_config |= BANK_TILING(1);
1417 if ((mc_arb_ramcfg & NOOFBANK_MASK) >> NOOFBANK_SHIFT)
1418 gb_tiling_config |= BANK_TILING(1);
1420 gb_tiling_config |= BANK_TILING(0);
1422 rdev->config.rv770.tiling_nbanks = 4 << ((gb_tiling_config >> 4) & 0x3);
1423 gb_tiling_config |= GROUP_SIZE((mc_arb_ramcfg & BURSTLENGTH_MASK) >> BURSTLENGTH_SHIFT);
1424 if (((mc_arb_ramcfg & NOOFROWS_MASK) >> NOOFROWS_SHIFT) > 3) {
1425 gb_tiling_config |= ROW_TILING(3);
1426 gb_tiling_config |= SAMPLE_SPLIT(3);
1429 ROW_TILING(((mc_arb_ramcfg & NOOFROWS_MASK) >> NOOFROWS_SHIFT));
1431 SAMPLE_SPLIT(((mc_arb_ramcfg & NOOFROWS_MASK) >> NOOFROWS_SHIFT));
1434 gb_tiling_config |= BANK_SWAPS(1);
1435 rdev->config.rv770.tile_config = gb_tiling_config;
1437 WREG32(GB_TILING_CONFIG, gb_tiling_config);
1438 WREG32(DCP_TILING_CONFIG, (gb_tiling_config & 0xffff));
1439 WREG32(HDP_TILING_CONFIG, (gb_tiling_config & 0xffff));
1440 WREG32(DMA_TILING_CONFIG, (gb_tiling_config & 0xffff));
1441 WREG32(DMA_TILING_CONFIG2, (gb_tiling_config & 0xffff));
1442 if (rdev->family == CHIP_RV730) {
1443 WREG32(UVD_UDEC_DB_TILING_CONFIG, (gb_tiling_config & 0xffff));
1444 WREG32(UVD_UDEC_DBW_TILING_CONFIG, (gb_tiling_config & 0xffff));
1445 WREG32(UVD_UDEC_TILING_CONFIG, (gb_tiling_config & 0xffff));
1448 WREG32(CGTS_SYS_TCC_DISABLE, 0);
1449 WREG32(CGTS_TCC_DISABLE, 0);
1450 WREG32(CGTS_USER_SYS_TCC_DISABLE, 0);
1451 WREG32(CGTS_USER_TCC_DISABLE, 0);
1454 num_qd_pipes = R7XX_MAX_PIPES - r600_count_pipe_bits((cc_gc_shader_pipe_config & INACTIVE_QD_PIPES_MASK) >> 8);
1455 WREG32(VGT_OUT_DEALLOC_CNTL, (num_qd_pipes * 4) & DEALLOC_DIST_MASK);
1456 WREG32(VGT_VERTEX_REUSE_BLOCK_CNTL, ((num_qd_pipes * 4) - 2) & VTX_REUSE_DEPTH_MASK);
1458 /* set HW defaults for 3D engine */
1459 WREG32(CP_QUEUE_THRESHOLDS, (ROQ_IB1_START(0x16) |
1460 ROQ_IB2_START(0x2b)));
1462 WREG32(CP_MEQ_THRESHOLDS, STQ_SPLIT(0x30));
1464 ta_aux_cntl = RREG32(TA_CNTL_AUX);
1465 WREG32(TA_CNTL_AUX, ta_aux_cntl | DISABLE_CUBE_ANISO);
1467 sx_debug_1 = RREG32(SX_DEBUG_1);
1468 sx_debug_1 |= ENABLE_NEW_SMX_ADDRESS;
1469 WREG32(SX_DEBUG_1, sx_debug_1);
1471 smx_dc_ctl0 = RREG32(SMX_DC_CTL0);
1472 smx_dc_ctl0 &= ~CACHE_DEPTH(0x1ff);
1473 smx_dc_ctl0 |= CACHE_DEPTH((rdev->config.rv770.sx_num_of_sets * 64) - 1);
1474 WREG32(SMX_DC_CTL0, smx_dc_ctl0);
1476 if (rdev->family != CHIP_RV740)
1477 WREG32(SMX_EVENT_CTL, (ES_FLUSH_CTL(4) |
1482 if (rdev->family != CHIP_RV770)
1483 WREG32(SMX_SAR_CTL0, 0x00003f3f);
1485 db_debug3 = RREG32(DB_DEBUG3);
1486 db_debug3 &= ~DB_CLK_OFF_DELAY(0x1f);
1487 switch (rdev->family) {
1490 db_debug3 |= DB_CLK_OFF_DELAY(0x1f);
1495 db_debug3 |= DB_CLK_OFF_DELAY(2);
1498 WREG32(DB_DEBUG3, db_debug3);
1500 if (rdev->family != CHIP_RV770) {
1501 db_debug4 = RREG32(DB_DEBUG4);
1502 db_debug4 |= DISABLE_TILE_COVERED_FOR_PS_ITER;
1503 WREG32(DB_DEBUG4, db_debug4);
1506 WREG32(SX_EXPORT_BUFFER_SIZES, (COLOR_BUFFER_SIZE((rdev->config.rv770.sx_max_export_size / 4) - 1) |
1507 POSITION_BUFFER_SIZE((rdev->config.rv770.sx_max_export_pos_size / 4) - 1) |
1508 SMX_BUFFER_SIZE((rdev->config.rv770.sx_max_export_smx_size / 4) - 1)));
1510 WREG32(PA_SC_FIFO_SIZE, (SC_PRIM_FIFO_SIZE(rdev->config.rv770.sc_prim_fifo_size) |
1511 SC_HIZ_TILE_FIFO_SIZE(rdev->config.rv770.sc_hiz_tile_fifo_size) |
1512 SC_EARLYZ_TILE_FIFO_SIZE(rdev->config.rv770.sc_earlyz_tile_fifo_fize)));
1514 WREG32(PA_SC_MULTI_CHIP_CNTL, 0);
1516 WREG32(VGT_NUM_INSTANCES, 1);
1518 WREG32(SPI_CONFIG_CNTL_1, VTX_DONE_DELAY(4));
1520 WREG32(CP_PERFMON_CNTL, 0);
1522 sq_ms_fifo_sizes = (CACHE_FIFO_SIZE(16 * rdev->config.rv770.sq_num_cf_insts) |
1523 DONE_FIFO_HIWATER(0xe0) |
1524 ALU_UPDATE_FIFO_HIWATER(0x8));
1525 switch (rdev->family) {
1529 sq_ms_fifo_sizes |= FETCH_FIFO_HIWATER(0x1);
1533 sq_ms_fifo_sizes |= FETCH_FIFO_HIWATER(0x4);
1536 WREG32(SQ_MS_FIFO_SIZES, sq_ms_fifo_sizes);
1538 /* SQ_CONFIG, SQ_GPR_RESOURCE_MGMT, SQ_THREAD_RESOURCE_MGMT, SQ_STACK_RESOURCE_MGMT
1539 * should be adjusted as needed by the 2D/3D drivers. This just sets default values
1541 sq_config = RREG32(SQ_CONFIG);
1542 sq_config &= ~(PS_PRIO(3) |
1546 sq_config |= (DX9_CONSTS |
1553 if (rdev->family == CHIP_RV710)
1554 /* no vertex cache */
1555 sq_config &= ~VC_ENABLE;
1557 WREG32(SQ_CONFIG, sq_config);
1559 WREG32(SQ_GPR_RESOURCE_MGMT_1, (NUM_PS_GPRS((rdev->config.rv770.max_gprs * 24)/64) |
1560 NUM_VS_GPRS((rdev->config.rv770.max_gprs * 24)/64) |
1561 NUM_CLAUSE_TEMP_GPRS(((rdev->config.rv770.max_gprs * 24)/64)/2)));
1563 WREG32(SQ_GPR_RESOURCE_MGMT_2, (NUM_GS_GPRS((rdev->config.rv770.max_gprs * 7)/64) |
1564 NUM_ES_GPRS((rdev->config.rv770.max_gprs * 7)/64)));
1566 sq_thread_resource_mgmt = (NUM_PS_THREADS((rdev->config.rv770.max_threads * 4)/8) |
1567 NUM_VS_THREADS((rdev->config.rv770.max_threads * 2)/8) |
1568 NUM_ES_THREADS((rdev->config.rv770.max_threads * 1)/8));
1569 if (((rdev->config.rv770.max_threads * 1) / 8) > rdev->config.rv770.max_gs_threads)
1570 sq_thread_resource_mgmt |= NUM_GS_THREADS(rdev->config.rv770.max_gs_threads);
1572 sq_thread_resource_mgmt |= NUM_GS_THREADS((rdev->config.rv770.max_gs_threads * 1)/8);
1573 WREG32(SQ_THREAD_RESOURCE_MGMT, sq_thread_resource_mgmt);
1575 WREG32(SQ_STACK_RESOURCE_MGMT_1, (NUM_PS_STACK_ENTRIES((rdev->config.rv770.max_stack_entries * 1)/4) |
1576 NUM_VS_STACK_ENTRIES((rdev->config.rv770.max_stack_entries * 1)/4)));
1578 WREG32(SQ_STACK_RESOURCE_MGMT_2, (NUM_GS_STACK_ENTRIES((rdev->config.rv770.max_stack_entries * 1)/4) |
1579 NUM_ES_STACK_ENTRIES((rdev->config.rv770.max_stack_entries * 1)/4)));
1581 sq_dyn_gpr_size_simd_ab_0 = (SIMDA_RING0((rdev->config.rv770.max_gprs * 38)/64) |
1582 SIMDA_RING1((rdev->config.rv770.max_gprs * 38)/64) |
1583 SIMDB_RING0((rdev->config.rv770.max_gprs * 38)/64) |
1584 SIMDB_RING1((rdev->config.rv770.max_gprs * 38)/64));
1586 WREG32(SQ_DYN_GPR_SIZE_SIMD_AB_0, sq_dyn_gpr_size_simd_ab_0);
1587 WREG32(SQ_DYN_GPR_SIZE_SIMD_AB_1, sq_dyn_gpr_size_simd_ab_0);
1588 WREG32(SQ_DYN_GPR_SIZE_SIMD_AB_2, sq_dyn_gpr_size_simd_ab_0);
1589 WREG32(SQ_DYN_GPR_SIZE_SIMD_AB_3, sq_dyn_gpr_size_simd_ab_0);
1590 WREG32(SQ_DYN_GPR_SIZE_SIMD_AB_4, sq_dyn_gpr_size_simd_ab_0);
1591 WREG32(SQ_DYN_GPR_SIZE_SIMD_AB_5, sq_dyn_gpr_size_simd_ab_0);
1592 WREG32(SQ_DYN_GPR_SIZE_SIMD_AB_6, sq_dyn_gpr_size_simd_ab_0);
1593 WREG32(SQ_DYN_GPR_SIZE_SIMD_AB_7, sq_dyn_gpr_size_simd_ab_0);
1595 WREG32(PA_SC_FORCE_EOV_MAX_CNTS, (FORCE_EOV_MAX_CLK_CNT(4095) |
1596 FORCE_EOV_MAX_REZ_CNT(255)));
1598 if (rdev->family == CHIP_RV710)
1599 WREG32(VGT_CACHE_INVALIDATION, (CACHE_INVALIDATION(TC_ONLY) |
1600 AUTO_INVLD_EN(ES_AND_GS_AUTO)));
1602 WREG32(VGT_CACHE_INVALIDATION, (CACHE_INVALIDATION(VC_AND_TC) |
1603 AUTO_INVLD_EN(ES_AND_GS_AUTO)));
1605 switch (rdev->family) {
1609 gs_prim_buffer_depth = 384;
1612 gs_prim_buffer_depth = 128;
1618 num_gs_verts_per_thread = rdev->config.rv770.max_pipes * 16;
1619 vgt_gs_per_es = gs_prim_buffer_depth + num_gs_verts_per_thread;
1620 /* Max value for this is 256 */
1621 if (vgt_gs_per_es > 256)
1622 vgt_gs_per_es = 256;
1624 WREG32(VGT_ES_PER_GS, 128);
1625 WREG32(VGT_GS_PER_ES, vgt_gs_per_es);
1626 WREG32(VGT_GS_PER_VS, 2);
1628 /* more default values. 2D/3D driver should adjust as needed */
1629 WREG32(VGT_GS_VERTEX_REUSE, 16);
1630 WREG32(PA_SC_LINE_STIPPLE_STATE, 0);
1631 WREG32(VGT_STRMOUT_EN, 0);
1633 WREG32(PA_SC_MODE_CNTL, 0);
1634 WREG32(PA_SC_EDGERULE, 0xaaaaaaaa);
1635 WREG32(PA_SC_AA_CONFIG, 0);
1636 WREG32(PA_SC_CLIPRECT_RULE, 0xffff);
1637 WREG32(PA_SC_LINE_STIPPLE, 0);
1638 WREG32(SPI_INPUT_Z, 0);
1639 WREG32(SPI_PS_IN_CONTROL_0, NUM_INTERP(2));
1640 WREG32(CB_COLOR7_FRAG, 0);
1642 /* clear render buffer base addresses */
1643 WREG32(CB_COLOR0_BASE, 0);
1644 WREG32(CB_COLOR1_BASE, 0);
1645 WREG32(CB_COLOR2_BASE, 0);
1646 WREG32(CB_COLOR3_BASE, 0);
1647 WREG32(CB_COLOR4_BASE, 0);
1648 WREG32(CB_COLOR5_BASE, 0);
1649 WREG32(CB_COLOR6_BASE, 0);
1650 WREG32(CB_COLOR7_BASE, 0);
1652 WREG32(TCP_CNTL, 0);
1654 hdp_host_path_cntl = RREG32(HDP_HOST_PATH_CNTL);
1655 WREG32(HDP_HOST_PATH_CNTL, hdp_host_path_cntl);
1657 WREG32(PA_SC_MULTI_CHIP_CNTL, 0);
1659 WREG32(PA_CL_ENHANCE, (CLIP_VTX_REORDER_ENA |
1661 WREG32(VC_ENHANCE, 0);
1664 void r700_vram_gtt_location(struct radeon_device *rdev, struct radeon_mc *mc)
1666 u64 size_bf, size_af;
1668 if (mc->mc_vram_size > 0xE0000000) {
1669 /* leave room for at least 512M GTT */
1670 dev_warn(rdev->dev, "limiting VRAM\n");
1671 mc->real_vram_size = 0xE0000000;
1672 mc->mc_vram_size = 0xE0000000;
1674 if (rdev->flags & RADEON_IS_AGP) {
1675 size_bf = mc->gtt_start;
1676 size_af = mc->mc_mask - mc->gtt_end;
1677 if (size_bf > size_af) {
1678 if (mc->mc_vram_size > size_bf) {
1679 dev_warn(rdev->dev, "limiting VRAM\n");
1680 mc->real_vram_size = size_bf;
1681 mc->mc_vram_size = size_bf;
1683 mc->vram_start = mc->gtt_start - mc->mc_vram_size;
1685 if (mc->mc_vram_size > size_af) {
1686 dev_warn(rdev->dev, "limiting VRAM\n");
1687 mc->real_vram_size = size_af;
1688 mc->mc_vram_size = size_af;
1690 mc->vram_start = mc->gtt_end + 1;
1692 mc->vram_end = mc->vram_start + mc->mc_vram_size - 1;
1693 dev_info(rdev->dev, "VRAM: %juM 0x%08jX - 0x%08jX (%juM used)\n",
1694 (uintmax_t)mc->mc_vram_size >> 20, (uintmax_t)mc->vram_start,
1695 (uintmax_t)mc->vram_end, (uintmax_t)mc->real_vram_size >> 20);
1697 radeon_vram_location(rdev, &rdev->mc, 0);
1698 rdev->mc.gtt_base_align = 0;
1699 radeon_gtt_location(rdev, mc);
1703 static int rv770_mc_init(struct radeon_device *rdev)
1706 int chansize, numchan;
1708 /* Get VRAM informations */
1709 rdev->mc.vram_is_ddr = true;
1710 tmp = RREG32(MC_ARB_RAMCFG);
1711 if (tmp & CHANSIZE_OVERRIDE) {
1713 } else if (tmp & CHANSIZE_MASK) {
1718 tmp = RREG32(MC_SHARED_CHMAP);
1719 switch ((tmp & NOOFCHAN_MASK) >> NOOFCHAN_SHIFT) {
1734 rdev->mc.vram_width = numchan * chansize;
1735 /* Could aper size report 0 ? */
1736 rdev->mc.aper_base = drm_get_resource_start(rdev->ddev, 0);
1737 rdev->mc.aper_size = drm_get_resource_len(rdev->ddev, 0);
1738 /* Setup GPU memory space */
1739 rdev->mc.mc_vram_size = RREG32(CONFIG_MEMSIZE);
1740 rdev->mc.real_vram_size = RREG32(CONFIG_MEMSIZE);
1741 rdev->mc.visible_vram_size = rdev->mc.aper_size;
1742 r700_vram_gtt_location(rdev, &rdev->mc);
1743 radeon_update_bandwidth_info(rdev);
1749 * rv770_copy_dma - copy pages using the DMA engine
1751 * @rdev: radeon_device pointer
1752 * @src_offset: src GPU address
1753 * @dst_offset: dst GPU address
1754 * @num_gpu_pages: number of GPU pages to xfer
1755 * @fence: radeon fence object
1757 * Copy GPU paging using the DMA engine (r7xx).
1758 * Used by the radeon ttm implementation to move pages if
1759 * registered as the asic copy callback.
1761 int rv770_copy_dma(struct radeon_device *rdev,
1762 uint64_t src_offset, uint64_t dst_offset,
1763 unsigned num_gpu_pages,
1764 struct radeon_fence **fence)
1766 struct radeon_semaphore *sem = NULL;
1767 int ring_index = rdev->asic->copy.dma_ring_index;
1768 struct radeon_ring *ring = &rdev->ring[ring_index];
1769 u32 size_in_dw, cur_size_in_dw;
1773 r = radeon_semaphore_create(rdev, &sem);
1775 DRM_ERROR("radeon: moving bo (%d).\n", r);
1779 size_in_dw = (num_gpu_pages << RADEON_GPU_PAGE_SHIFT) / 4;
1780 num_loops = DIV_ROUND_UP(size_in_dw, 0xFFFF);
1781 r = radeon_ring_lock(rdev, ring, num_loops * 5 + 8);
1783 DRM_ERROR("radeon: moving bo (%d).\n", r);
1784 radeon_semaphore_free(rdev, &sem, NULL);
1788 if (radeon_fence_need_sync(*fence, ring->idx)) {
1789 radeon_semaphore_sync_rings(rdev, sem, (*fence)->ring,
1791 radeon_fence_note_sync(*fence, ring->idx);
1793 radeon_semaphore_free(rdev, &sem, NULL);
1796 for (i = 0; i < num_loops; i++) {
1797 cur_size_in_dw = size_in_dw;
1798 if (cur_size_in_dw > 0xFFFF)
1799 cur_size_in_dw = 0xFFFF;
1800 size_in_dw -= cur_size_in_dw;
1801 radeon_ring_write(ring, DMA_PACKET(DMA_PACKET_COPY, 0, 0, cur_size_in_dw));
1802 radeon_ring_write(ring, dst_offset & 0xfffffffc);
1803 radeon_ring_write(ring, src_offset & 0xfffffffc);
1804 radeon_ring_write(ring, upper_32_bits(dst_offset) & 0xff);
1805 radeon_ring_write(ring, upper_32_bits(src_offset) & 0xff);
1806 src_offset += cur_size_in_dw * 4;
1807 dst_offset += cur_size_in_dw * 4;
1810 r = radeon_fence_emit(rdev, fence, ring->idx);
1812 radeon_ring_unlock_undo(rdev, ring);
1816 radeon_ring_unlock_commit(rdev, ring);
1817 radeon_semaphore_free(rdev, &sem, *fence);
1822 static int rv770_startup(struct radeon_device *rdev)
1824 struct radeon_ring *ring;
1827 /* enable pcie gen2 link */
1828 rv770_pcie_gen2_enable(rdev);
1830 rv770_mc_program(rdev);
1832 if (!rdev->me_fw || !rdev->pfp_fw || !rdev->rlc_fw) {
1833 r = r600_init_microcode(rdev);
1835 DRM_ERROR("Failed to load firmware!\n");
1840 r = r600_vram_scratch_init(rdev);
1844 if (rdev->flags & RADEON_IS_AGP) {
1845 rv770_agp_enable(rdev);
1847 r = rv770_pcie_gart_enable(rdev);
1852 rv770_gpu_init(rdev);
1853 r = r600_blit_init(rdev);
1855 r600_blit_fini(rdev);
1856 rdev->asic->copy.copy = NULL;
1857 dev_warn(rdev->dev, "failed blitter (%d) falling back to memcpy\n", r);
1860 /* allocate wb buffer */
1861 r = radeon_wb_init(rdev);
1865 r = radeon_fence_driver_start_ring(rdev, RADEON_RING_TYPE_GFX_INDEX);
1867 dev_err(rdev->dev, "failed initializing CP fences (%d).\n", r);
1871 r = radeon_fence_driver_start_ring(rdev, R600_RING_TYPE_DMA_INDEX);
1873 dev_err(rdev->dev, "failed initializing DMA fences (%d).\n", r);
1877 r = rv770_uvd_resume(rdev);
1879 r = radeon_fence_driver_start_ring(rdev,
1880 R600_RING_TYPE_UVD_INDEX);
1882 dev_err(rdev->dev, "UVD fences init error (%d).\n", r);
1886 rdev->ring[R600_RING_TYPE_UVD_INDEX].ring_size = 0;
1889 if (!rdev->irq.installed) {
1890 r = radeon_irq_kms_init(rdev);
1895 r = r600_irq_init(rdev);
1897 DRM_ERROR("radeon: IH init failed (%d).\n", r);
1898 radeon_irq_kms_fini(rdev);
1903 ring = &rdev->ring[RADEON_RING_TYPE_GFX_INDEX];
1904 r = radeon_ring_init(rdev, ring, ring->ring_size, RADEON_WB_CP_RPTR_OFFSET,
1905 R600_CP_RB_RPTR, R600_CP_RB_WPTR,
1906 0, 0xfffff, RADEON_CP_PACKET2);
1910 ring = &rdev->ring[R600_RING_TYPE_DMA_INDEX];
1911 r = radeon_ring_init(rdev, ring, ring->ring_size, R600_WB_DMA_RPTR_OFFSET,
1912 DMA_RB_RPTR, DMA_RB_WPTR,
1913 2, 0x3fffc, DMA_PACKET(DMA_PACKET_NOP, 0, 0, 0));
1917 r = rv770_cp_load_microcode(rdev);
1920 r = r600_cp_resume(rdev);
1924 r = r600_dma_resume(rdev);
1928 ring = &rdev->ring[R600_RING_TYPE_UVD_INDEX];
1929 if (ring->ring_size) {
1930 r = radeon_ring_init(rdev, ring, ring->ring_size,
1931 R600_WB_UVD_RPTR_OFFSET,
1932 UVD_RBC_RB_RPTR, UVD_RBC_RB_WPTR,
1933 0, 0xfffff, RADEON_CP_PACKET2);
1935 r = r600_uvd_init(rdev);
1938 DRM_ERROR("radeon: failed initializing UVD (%d).\n", r);
1941 r = radeon_ib_pool_init(rdev);
1943 dev_err(rdev->dev, "IB initialization failed (%d).\n", r);
1947 r = r600_audio_init(rdev);
1949 DRM_ERROR("radeon: audio init failed\n");
1956 int rv770_resume(struct radeon_device *rdev)
1960 /* Do not reset GPU before posting, on rv770 hw unlike on r500 hw,
1961 * posting will perform necessary task to bring back GPU into good
1965 atom_asic_init(rdev->mode_info.atom_context);
1967 /* init golden registers */
1968 rv770_init_golden_registers(rdev);
1970 rdev->accel_working = true;
1971 r = rv770_startup(rdev);
1973 DRM_ERROR("r600 startup failed on resume\n");
1974 rdev->accel_working = false;
1982 int rv770_suspend(struct radeon_device *rdev)
1984 r600_audio_fini(rdev);
1985 r600_uvd_stop(rdev);
1986 radeon_uvd_suspend(rdev);
1988 r600_dma_stop(rdev);
1989 r600_irq_suspend(rdev);
1990 radeon_wb_disable(rdev);
1991 rv770_pcie_gart_disable(rdev);
1996 /* Plan is to move initialization in that function and use
1997 * helper function so that radeon_device_init pretty much
1998 * do nothing more than calling asic specific function. This
1999 * should also allow to remove a bunch of callback function
2002 int rv770_init(struct radeon_device *rdev)
2007 if (!radeon_get_bios(rdev)) {
2008 if (ASIC_IS_AVIVO(rdev))
2011 /* Must be an ATOMBIOS */
2012 if (!rdev->is_atom_bios) {
2013 dev_err(rdev->dev, "Expecting atombios for R600 GPU\n");
2016 r = radeon_atombios_init(rdev);
2019 /* Post card if necessary */
2020 if (!radeon_card_posted(rdev)) {
2022 dev_err(rdev->dev, "Card not posted and no BIOS - ignoring\n");
2025 DRM_INFO("GPU not posted. posting now...\n");
2026 atom_asic_init(rdev->mode_info.atom_context);
2028 /* init golden registers */
2029 rv770_init_golden_registers(rdev);
2030 /* Initialize scratch registers */
2031 r600_scratch_init(rdev);
2032 /* Initialize surface registers */
2033 radeon_surface_init(rdev);
2034 /* Initialize clocks */
2035 radeon_get_clock_info(rdev->ddev);
2037 r = radeon_fence_driver_init(rdev);
2040 /* initialize AGP */
2041 if (rdev->flags & RADEON_IS_AGP) {
2042 r = radeon_agp_init(rdev);
2044 radeon_agp_disable(rdev);
2046 r = rv770_mc_init(rdev);
2049 /* Memory manager */
2050 r = radeon_bo_init(rdev);
2054 rdev->ring[RADEON_RING_TYPE_GFX_INDEX].ring_obj = NULL;
2055 r600_ring_init(rdev, &rdev->ring[RADEON_RING_TYPE_GFX_INDEX], 1024 * 1024);
2057 rdev->ring[R600_RING_TYPE_DMA_INDEX].ring_obj = NULL;
2058 r600_ring_init(rdev, &rdev->ring[R600_RING_TYPE_DMA_INDEX], 64 * 1024);
2060 r = radeon_uvd_init(rdev);
2062 rdev->ring[R600_RING_TYPE_UVD_INDEX].ring_obj = NULL;
2063 r600_ring_init(rdev, &rdev->ring[R600_RING_TYPE_UVD_INDEX],
2067 rdev->ih.ring_obj = NULL;
2068 r600_ih_ring_init(rdev, 64 * 1024);
2070 r = r600_pcie_gart_init(rdev);
2074 rdev->accel_working = true;
2075 r = rv770_startup(rdev);
2077 dev_err(rdev->dev, "disabling GPU acceleration\n");
2079 r600_dma_fini(rdev);
2080 r600_irq_fini(rdev);
2081 radeon_wb_fini(rdev);
2082 radeon_ib_pool_fini(rdev);
2083 radeon_irq_kms_fini(rdev);
2084 rv770_pcie_gart_fini(rdev);
2085 rdev->accel_working = false;
2091 void rv770_fini(struct radeon_device *rdev)
2093 r600_blit_fini(rdev);
2095 r600_dma_fini(rdev);
2096 r600_irq_fini(rdev);
2097 radeon_wb_fini(rdev);
2098 radeon_ib_pool_fini(rdev);
2099 radeon_irq_kms_fini(rdev);
2100 rv770_pcie_gart_fini(rdev);
2101 r600_uvd_stop(rdev);
2102 radeon_uvd_fini(rdev);
2103 r600_vram_scratch_fini(rdev);
2104 radeon_gem_fini(rdev);
2105 radeon_fence_driver_fini(rdev);
2106 radeon_agp_fini(rdev);
2107 radeon_bo_fini(rdev);
2108 radeon_atombios_fini(rdev);
2109 r600_fini_microcode(rdev);
2110 drm_free(rdev->bios, M_DRM);
2114 static void rv770_pcie_gen2_enable(struct radeon_device *rdev)
2116 u32 link_width_cntl, lanes, speed_cntl, tmp;
2121 if (radeon_pcie_gen2 == 0)
2124 if (rdev->flags & RADEON_IS_IGP)
2127 if (!(rdev->flags & RADEON_IS_PCIE))
2130 /* x2 cards have a special sequence */
2131 if (ASIC_IS_X2(rdev))
2134 ret = drm_pcie_get_speed_cap_mask(rdev->ddev, &mask);
2138 if (!(mask & DRM_PCIE_SPEED_50))
2141 DRM_INFO("enabling PCIE gen 2 link speeds, disable with radeon.pcie_gen2=0\n");
2143 /* advertise upconfig capability */
2144 link_width_cntl = RREG32_PCIE_PORT(PCIE_LC_LINK_WIDTH_CNTL);
2145 link_width_cntl &= ~LC_UPCONFIGURE_DIS;
2146 WREG32_PCIE_PORT(PCIE_LC_LINK_WIDTH_CNTL, link_width_cntl);
2147 link_width_cntl = RREG32_PCIE_PORT(PCIE_LC_LINK_WIDTH_CNTL);
2148 if (link_width_cntl & LC_RENEGOTIATION_SUPPORT) {
2149 lanes = (link_width_cntl & LC_LINK_WIDTH_RD_MASK) >> LC_LINK_WIDTH_RD_SHIFT;
2150 link_width_cntl &= ~(LC_LINK_WIDTH_MASK |
2151 LC_RECONFIG_ARC_MISSING_ESCAPE);
2152 link_width_cntl |= lanes | LC_RECONFIG_NOW |
2153 LC_RENEGOTIATE_EN | LC_UPCONFIGURE_SUPPORT;
2154 WREG32_PCIE_PORT(PCIE_LC_LINK_WIDTH_CNTL, link_width_cntl);
2156 link_width_cntl |= LC_UPCONFIGURE_DIS;
2157 WREG32_PCIE_PORT(PCIE_LC_LINK_WIDTH_CNTL, link_width_cntl);
2160 speed_cntl = RREG32_PCIE_PORT(PCIE_LC_SPEED_CNTL);
2161 if ((speed_cntl & LC_OTHER_SIDE_EVER_SENT_GEN2) &&
2162 (speed_cntl & LC_OTHER_SIDE_SUPPORTS_GEN2)) {
2164 tmp = RREG32(0x541c);
2165 WREG32(0x541c, tmp | 0x8);
2166 WREG32(MM_CFGREGS_CNTL, MM_WR_TO_CFG_EN);
2167 link_cntl2 = RREG16(0x4088);
2168 link_cntl2 &= ~TARGET_LINK_SPEED_MASK;
2170 WREG16(0x4088, link_cntl2);
2171 WREG32(MM_CFGREGS_CNTL, 0);
2173 speed_cntl = RREG32_PCIE_PORT(PCIE_LC_SPEED_CNTL);
2174 speed_cntl &= ~LC_TARGET_LINK_SPEED_OVERRIDE_EN;
2175 WREG32_PCIE_PORT(PCIE_LC_SPEED_CNTL, speed_cntl);
2177 speed_cntl = RREG32_PCIE_PORT(PCIE_LC_SPEED_CNTL);
2178 speed_cntl |= LC_CLR_FAILED_SPD_CHANGE_CNT;
2179 WREG32_PCIE_PORT(PCIE_LC_SPEED_CNTL, speed_cntl);
2181 speed_cntl = RREG32_PCIE_PORT(PCIE_LC_SPEED_CNTL);
2182 speed_cntl &= ~LC_CLR_FAILED_SPD_CHANGE_CNT;
2183 WREG32_PCIE_PORT(PCIE_LC_SPEED_CNTL, speed_cntl);
2185 speed_cntl = RREG32_PCIE_PORT(PCIE_LC_SPEED_CNTL);
2186 speed_cntl |= LC_GEN2_EN_STRAP;
2187 WREG32_PCIE_PORT(PCIE_LC_SPEED_CNTL, speed_cntl);
2190 link_width_cntl = RREG32_PCIE_PORT(PCIE_LC_LINK_WIDTH_CNTL);
2191 /* XXX: only disable it if gen1 bridge vendor == 0x111d or 0x1106 */
2193 link_width_cntl |= LC_UPCONFIGURE_DIS;
2195 link_width_cntl &= ~LC_UPCONFIGURE_DIS;
2196 WREG32_PCIE_PORT(PCIE_LC_LINK_WIDTH_CNTL, link_width_cntl);