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