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