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