Revert "Update drm/radeon to Linux 4.7.10 as much as possible..."
[dragonfly.git] / sys / dev / 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 <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"
36
37 #define R700_PFP_UCODE_SIZE 848
38 #define R700_PM4_UCODE_SIZE 1360
39
40 static void rv770_gpu_init(struct radeon_device *rdev);
41 static void rv770_pcie_gen2_enable(struct radeon_device *rdev);
42
43 int rv770_set_uvd_clocks(struct radeon_device *rdev, u32 vclk, u32 dclk)
44 {
45         unsigned fb_div = 0, vclk_div = 0, dclk_div = 0;
46         int r;
47
48         /* RV740 uses evergreen uvd clk programming */
49         if (rdev->family == CHIP_RV740)
50                 return evergreen_set_uvd_clocks(rdev, vclk, dclk);
51
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));
56
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;
61         }
62
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;
68
69         fb_div |= 1;
70         vclk_div -= 1;
71         dclk_div -= 1;
72
73         /* set UPLL_FB_DIV to 0x50000 */
74         WREG32_P(CG_UPLL_FUNC_CNTL_3, UPLL_FB_DIV(0x50000), ~UPLL_FB_DIV_MASK);
75
76         /* deassert UPLL_RESET and UPLL_SLEEP */
77         WREG32_P(CG_UPLL_FUNC_CNTL, 0, ~(UPLL_RESET_MASK | UPLL_SLEEP_MASK));
78
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));
82
83         r = radeon_uvd_send_upll_ctlreq(rdev, CG_UPLL_FUNC_CNTL);
84         if (r)
85                 return r;
86
87         /* assert PLL_RESET */
88         WREG32_P(CG_UPLL_FUNC_CNTL, UPLL_RESET_MASK, ~UPLL_RESET_MASK);
89
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);
98
99         WREG32_P(CG_UPLL_FUNC_CNTL_3, UPLL_FB_DIV(fb_div),
100                  ~UPLL_FB_DIV_MASK);
101
102         /* give the PLL some time to settle */
103         mdelay(15);
104
105         /* deassert PLL_RESET */
106         WREG32_P(CG_UPLL_FUNC_CNTL, 0, ~UPLL_RESET_MASK);
107
108         mdelay(15);
109
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));
113
114         r = radeon_uvd_send_upll_ctlreq(rdev, CG_UPLL_FUNC_CNTL);
115         if (r)
116                 return r;
117
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));
122
123         mdelay(100);
124
125         return 0;
126 }
127
128 static const u32 r7xx_golden_registers[] =
129 {
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
142 };
143
144 static const u32 r7xx_golden_dyn_gpr_registers[] =
145 {
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
155 };
156
157 static const u32 rv770_golden_registers[] =
158 {
159         0x562c, 0xffffffff, 0,
160         0x3f90, 0xffffffff, 0,
161         0x9148, 0xffffffff, 0,
162         0x3f94, 0xffffffff, 0,
163         0x914c, 0xffffffff, 0,
164         0x9698, 0x18000000, 0x18000000
165 };
166
167 static const u32 rv770ce_golden_registers[] =
168 {
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
177 };
178
179 static const u32 rv770_mgcg_init[] =
180 {
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
335 };
336
337 static const u32 rv710_golden_registers[] =
338 {
339         0x3f90, 0x00ff0000, 0x00fc0000,
340         0x9148, 0x00ff0000, 0x00fc0000,
341         0x3f94, 0x00ff0000, 0x00fc0000,
342         0x914c, 0x00ff0000, 0x00fc0000,
343         0xb4c, 0x00000020, 0x00000020,
344         0xa180, 0xffffffff, 0x00003f3f
345 };
346
347 static const u32 rv710_mgcg_init[] =
348 {
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
404 };
405
406 static const u32 rv730_golden_registers[] =
407 {
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
415 };
416
417 static const u32 rv730_mgcg_init[] =
418 {
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
537 };
538
539 static const u32 rv740_golden_registers[] =
540 {
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
574 };
575
576 static const u32 rv740_mgcg_init[] =
577 {
578         0x8bcc, 0xffffffff, 0x13030100,
579         0x5448, 0xffffffff, 0x100,
580         0x55e4, 0xffffffff, 0x100,
581         0x160c, 0xffffffff, 0x100,
582         0x5644, 0xffffffff, 0x100,
583         0xc164, 0xffffffff, 0x100,
584         0x8a18, 0xffffffff, 0x100,
585         0x897c, 0xffffffff, 0x100,
586         0x8b28, 0xffffffff, 0x100,
587         0x9144, 0xffffffff, 0x100,
588         0x9a1c, 0xffffffff, 0x10000,
589         0x9a50, 0xffffffff, 0x100,
590         0x9a1c, 0xffffffff, 0x10001,
591         0x9a50, 0xffffffff, 0x100,
592         0x9a1c, 0xffffffff, 0x10002,
593         0x9a50, 0xffffffff, 0x100,
594         0x9a1c, 0xffffffff, 0x10003,
595         0x9a50, 0xffffffff, 0x100,
596         0x9a1c, 0xffffffff, 0x0,
597         0x9870, 0xffffffff, 0x100,
598         0x8d58, 0xffffffff, 0x100,
599         0x9500, 0xffffffff, 0x0,
600         0x9510, 0xffffffff, 0x100,
601         0x9500, 0xffffffff, 0x1,
602         0x9510, 0xffffffff, 0x100,
603         0x9500, 0xffffffff, 0x2,
604         0x9510, 0xffffffff, 0x100,
605         0x9500, 0xffffffff, 0x3,
606         0x9510, 0xffffffff, 0x100,
607         0x9500, 0xffffffff, 0x4,
608         0x9510, 0xffffffff, 0x100,
609         0x9500, 0xffffffff, 0x5,
610         0x9510, 0xffffffff, 0x100,
611         0x9500, 0xffffffff, 0x6,
612         0x9510, 0xffffffff, 0x100,
613         0x9500, 0xffffffff, 0x7,
614         0x9510, 0xffffffff, 0x100,
615         0x9500, 0xffffffff, 0x8000,
616         0x9490, 0xffffffff, 0x0,
617         0x949c, 0xffffffff, 0x100,
618         0x9490, 0xffffffff, 0x1,
619         0x949c, 0xffffffff, 0x100,
620         0x9490, 0xffffffff, 0x2,
621         0x949c, 0xffffffff, 0x100,
622         0x9490, 0xffffffff, 0x3,
623         0x949c, 0xffffffff, 0x100,
624         0x9490, 0xffffffff, 0x4,
625         0x949c, 0xffffffff, 0x100,
626         0x9490, 0xffffffff, 0x5,
627         0x949c, 0xffffffff, 0x100,
628         0x9490, 0xffffffff, 0x6,
629         0x949c, 0xffffffff, 0x100,
630         0x9490, 0xffffffff, 0x7,
631         0x949c, 0xffffffff, 0x100,
632         0x9490, 0xffffffff, 0x8000,
633         0x9604, 0xffffffff, 0x0,
634         0x9654, 0xffffffff, 0x100,
635         0x9604, 0xffffffff, 0x1,
636         0x9654, 0xffffffff, 0x100,
637         0x9604, 0xffffffff, 0x2,
638         0x9654, 0xffffffff, 0x100,
639         0x9604, 0xffffffff, 0x3,
640         0x9654, 0xffffffff, 0x100,
641         0x9604, 0xffffffff, 0x4,
642         0x9654, 0xffffffff, 0x100,
643         0x9604, 0xffffffff, 0x5,
644         0x9654, 0xffffffff, 0x100,
645         0x9604, 0xffffffff, 0x6,
646         0x9654, 0xffffffff, 0x100,
647         0x9604, 0xffffffff, 0x7,
648         0x9654, 0xffffffff, 0x100,
649         0x9604, 0xffffffff, 0x80000000,
650         0x9030, 0xffffffff, 0x100,
651         0x9034, 0xffffffff, 0x100,
652         0x9038, 0xffffffff, 0x100,
653         0x903c, 0xffffffff, 0x100,
654         0x9040, 0xffffffff, 0x100,
655         0xa200, 0xffffffff, 0x100,
656         0xa204, 0xffffffff, 0x100,
657         0xa208, 0xffffffff, 0x100,
658         0xa20c, 0xffffffff, 0x100,
659         0x971c, 0xffffffff, 0x100,
660         0x915c, 0xffffffff, 0x00020001,
661         0x9160, 0xffffffff, 0x00040003,
662         0x916c, 0xffffffff, 0x00060005,
663         0x9170, 0xffffffff, 0x00080007,
664         0x9174, 0xffffffff, 0x000a0009,
665         0x9178, 0xffffffff, 0x000c000b,
666         0x917c, 0xffffffff, 0x000e000d,
667         0x9180, 0xffffffff, 0x0010000f,
668         0x918c, 0xffffffff, 0x00120011,
669         0x9190, 0xffffffff, 0x00140013,
670         0x9194, 0xffffffff, 0x00020001,
671         0x9198, 0xffffffff, 0x00040003,
672         0x919c, 0xffffffff, 0x00060005,
673         0x91a8, 0xffffffff, 0x00080007,
674         0x91ac, 0xffffffff, 0x000a0009,
675         0x91b0, 0xffffffff, 0x000c000b,
676         0x91b4, 0xffffffff, 0x000e000d,
677         0x91b8, 0xffffffff, 0x0010000f,
678         0x91c4, 0xffffffff, 0x00120011,
679         0x91c8, 0xffffffff, 0x00140013,
680         0x91cc, 0xffffffff, 0x00020001,
681         0x91d0, 0xffffffff, 0x00040003,
682         0x91d4, 0xffffffff, 0x00060005,
683         0x91e0, 0xffffffff, 0x00080007,
684         0x91e4, 0xffffffff, 0x000a0009,
685         0x91e8, 0xffffffff, 0x000c000b,
686         0x91ec, 0xffffffff, 0x00020001,
687         0x91f0, 0xffffffff, 0x00040003,
688         0x91f4, 0xffffffff, 0x00060005,
689         0x9200, 0xffffffff, 0x00080007,
690         0x9204, 0xffffffff, 0x000a0009,
691         0x9208, 0xffffffff, 0x000c000b,
692         0x920c, 0xffffffff, 0x000e000d,
693         0x9210, 0xffffffff, 0x0010000f,
694         0x921c, 0xffffffff, 0x00120011,
695         0x9220, 0xffffffff, 0x00140013,
696         0x9224, 0xffffffff, 0x00020001,
697         0x9228, 0xffffffff, 0x00040003,
698         0x922c, 0xffffffff, 0x00060005,
699         0x9238, 0xffffffff, 0x00080007,
700         0x923c, 0xffffffff, 0x000a0009,
701         0x9240, 0xffffffff, 0x000c000b,
702         0x9244, 0xffffffff, 0x000e000d,
703         0x9248, 0xffffffff, 0x0010000f,
704         0x9254, 0xffffffff, 0x00120011,
705         0x9258, 0xffffffff, 0x00140013,
706         0x9294, 0xffffffff, 0x00020001,
707         0x929c, 0xffffffff, 0x00040003,
708         0x92a0, 0xffffffff, 0x00060005,
709         0x92a4, 0xffffffff, 0x00080007
710 };
711
712 static void rv770_init_golden_registers(struct radeon_device *rdev)
713 {
714         switch (rdev->family) {
715         case CHIP_RV770:
716                 radeon_program_register_sequence(rdev,
717                                                  r7xx_golden_registers,
718                                                  (const u32)ARRAY_SIZE(r7xx_golden_registers));
719                 radeon_program_register_sequence(rdev,
720                                                  r7xx_golden_dyn_gpr_registers,
721                                                  (const u32)ARRAY_SIZE(r7xx_golden_dyn_gpr_registers));
722                 if (rdev->pdev->device == 0x994e)
723                         radeon_program_register_sequence(rdev,
724                                                          rv770ce_golden_registers,
725                                                          (const u32)ARRAY_SIZE(rv770ce_golden_registers));
726                 else
727                         radeon_program_register_sequence(rdev,
728                                                          rv770_golden_registers,
729                                                          (const u32)ARRAY_SIZE(rv770_golden_registers));
730                 radeon_program_register_sequence(rdev,
731                                                  rv770_mgcg_init,
732                                                  (const u32)ARRAY_SIZE(rv770_mgcg_init));
733                 break;
734         case CHIP_RV730:
735                 radeon_program_register_sequence(rdev,
736                                                  r7xx_golden_registers,
737                                                  (const u32)ARRAY_SIZE(r7xx_golden_registers));
738                 radeon_program_register_sequence(rdev,
739                                                  r7xx_golden_dyn_gpr_registers,
740                                                  (const u32)ARRAY_SIZE(r7xx_golden_dyn_gpr_registers));
741                 radeon_program_register_sequence(rdev,
742                                                  rv730_golden_registers,
743                                                  (const u32)ARRAY_SIZE(rv730_golden_registers));
744                 radeon_program_register_sequence(rdev,
745                                                  rv730_mgcg_init,
746                                                  (const u32)ARRAY_SIZE(rv730_mgcg_init));
747                 break;
748         case CHIP_RV710:
749                 radeon_program_register_sequence(rdev,
750                                                  r7xx_golden_registers,
751                                                  (const u32)ARRAY_SIZE(r7xx_golden_registers));
752                 radeon_program_register_sequence(rdev,
753                                                  r7xx_golden_dyn_gpr_registers,
754                                                  (const u32)ARRAY_SIZE(r7xx_golden_dyn_gpr_registers));
755                 radeon_program_register_sequence(rdev,
756                                                  rv710_golden_registers,
757                                                  (const u32)ARRAY_SIZE(rv710_golden_registers));
758                 radeon_program_register_sequence(rdev,
759                                                  rv710_mgcg_init,
760                                                  (const u32)ARRAY_SIZE(rv710_mgcg_init));
761                 break;
762         case CHIP_RV740:
763                 radeon_program_register_sequence(rdev,
764                                                  rv740_golden_registers,
765                                                  (const u32)ARRAY_SIZE(rv740_golden_registers));
766                 radeon_program_register_sequence(rdev,
767                                                  rv740_mgcg_init,
768                                                  (const u32)ARRAY_SIZE(rv740_mgcg_init));
769                 break;
770         default:
771                 break;
772         }
773 }
774
775 #define PCIE_BUS_CLK                10000
776 #define TCLK                        (PCIE_BUS_CLK / 10)
777
778 /**
779  * rv770_get_xclk - get the xclk
780  *
781  * @rdev: radeon_device pointer
782  *
783  * Returns the reference clock used by the gfx engine
784  * (r7xx-cayman).
785  */
786 u32 rv770_get_xclk(struct radeon_device *rdev)
787 {
788         u32 reference_clock = rdev->clock.spll.reference_freq;
789         u32 tmp = RREG32(CG_CLKPIN_CNTL);
790
791         if (tmp & MUX_TCLK_TO_XCLK)
792                 return TCLK;
793
794         if (tmp & XTALIN_DIVIDE)
795                 return reference_clock / 4;
796
797         return reference_clock;
798 }
799
800 void rv770_page_flip(struct radeon_device *rdev, int crtc_id, u64 crtc_base)
801 {
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;
805
806         /* Lock the graphics update lock */
807         tmp |= AVIVO_D1GRPH_UPDATE_LOCK;
808         WREG32(AVIVO_D1GRPH_UPDATE + radeon_crtc->crtc_offset, tmp);
809
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));
817         }
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);
822
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);
828         }
829         DRM_DEBUG("Update pending now high. Unlocking vupdate_lock.\n");
830
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);
834 }
835
836 bool rv770_page_flip_pending(struct radeon_device *rdev, int crtc_id)
837 {
838         struct radeon_crtc *radeon_crtc = rdev->mode_info.crtcs[crtc_id];
839
840         /* Return current update_pending status: */
841         return !!(RREG32(AVIVO_D1GRPH_UPDATE + radeon_crtc->crtc_offset) &
842                 AVIVO_D1GRPH_SURFACE_UPDATE_PENDING);
843 }
844
845 /* get temperature in millidegrees */
846 int rv770_get_temp(struct radeon_device *rdev)
847 {
848         u32 temp = (RREG32(CG_MULT_THERMAL_STATUS) & ASIC_T_MASK) >>
849                 ASIC_T_SHIFT;
850         int actual_temp;
851
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;
861
862         return (actual_temp * 1000) / 2;
863 }
864
865 void rv770_pm_misc(struct radeon_device *rdev)
866 {
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;
871
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);
880                 }
881         }
882 }
883
884 /*
885  * GART
886  */
887 static int rv770_pcie_gart_enable(struct radeon_device *rdev)
888 {
889         u32 tmp;
890         int r, i;
891
892         if (rdev->gart.robj == NULL) {
893                 dev_err(rdev->dev, "No VRAM object for PCIE GART.\n");
894                 return -EINVAL;
895         }
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);
928
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;
935 }
936
937 static void rv770_pcie_gart_disable(struct radeon_device *rdev)
938 {
939         u32 tmp;
940         int i;
941
942         /* Disable all tables */
943         for (i = 0; i < 7; i++)
944                 WREG32(VM_CONTEXT0_CNTL + (i * 4), 0);
945
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);
961 }
962
963 static void rv770_pcie_gart_fini(struct radeon_device *rdev)
964 {
965         radeon_gart_fini(rdev);
966         rv770_pcie_gart_disable(rdev);
967         radeon_gart_table_vram_free(rdev);
968 }
969
970
971 static void rv770_agp_enable(struct radeon_device *rdev)
972 {
973         u32 tmp;
974         int i;
975
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);
996 }
997
998 static void rv770_mc_program(struct radeon_device *rdev)
999 {
1000         struct rv515_mc_save save;
1001         u32 tmp;
1002         int i, j;
1003
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);
1011         }
1012         /* r7xx hw bug.  Read from HDP_DEBUG1 rather
1013          * than writing to HDP_REG_COHERENCY_FLUSH_CNTL
1014          */
1015         tmp = RREG32(HDP_DEBUG1);
1016
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");
1020         }
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);
1037                 }
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);
1043         }
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);
1059         }
1060         if (r600_mc_wait_for_idle(rdev)) {
1061                 dev_warn(rdev->dev, "Wait for MC idle timedout !\n");
1062         }
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);
1067 }
1068
1069
1070 /*
1071  * CP.
1072  */
1073 void r700_cp_stop(struct radeon_device *rdev)
1074 {
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;
1080 }
1081
1082 static int rv770_cp_load_microcode(struct radeon_device *rdev)
1083 {
1084         const __be32 *fw_data;
1085         int i;
1086
1087         if (!rdev->me_fw || !rdev->pfp_fw)
1088                 return -EINVAL;
1089
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));
1096
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);
1102
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);
1108
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++));
1113
1114         WREG32(CP_PFP_UCODE_ADDR, 0);
1115         WREG32(CP_ME_RAM_WADDR, 0);
1116         WREG32(CP_ME_RAM_RADDR, 0);
1117         return 0;
1118 }
1119
1120 void r700_cp_fini(struct radeon_device *rdev)
1121 {
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);
1126 }
1127
1128 void rv770_set_clk_bypass_mode(struct radeon_device *rdev)
1129 {
1130         u32 tmp, i;
1131
1132         if (rdev->flags & RADEON_IS_IGP)
1133                 return;
1134
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);
1139
1140         for (i = 0; i < rdev->usec_timeout; i++) {
1141                 if (RREG32(CG_SPLL_STATUS) & SPLL_CHG_STATUS)
1142                         break;
1143                 udelay(1);
1144         }
1145
1146         tmp &= ~SCLK_MUX_UPDATE;
1147         WREG32(CG_SPLL_FUNC_CNTL_2, tmp);
1148
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);
1155 }
1156
1157 /*
1158  * Core functions
1159  */
1160 static void rv770_gpu_init(struct radeon_device *rdev)
1161 {
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;
1182
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;
1200
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;
1220
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;
1228                 }
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;
1244
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;
1264
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;
1269
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;
1273                 }
1274                 break;
1275         default:
1276                 break;
1277         }
1278
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;
1288         }
1289
1290         WREG32(GRBM_CNTL, GRBM_READ_TIMEOUT(0xff));
1291
1292         /* setup tiling, simd, pipe config */
1293         mc_arb_ramcfg = RREG32(MC_ARB_RAMCFG);
1294
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++;
1300                 }
1301                 tmp <<= 1;
1302         }
1303         if (active_number == 1) {
1304                 WREG32(SPI_CONFIG_CNTL, DISABLE_INTERP_1);
1305         } else {
1306                 WREG32(SPI_CONFIG_CNTL, 0);
1307         }
1308
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;
1313
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;
1328         }
1329         rdev->config.rv770.tiling_npipes = rdev->config.rv770.max_tile_pipes;
1330
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);
1339         }
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;
1345
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);
1353         }
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));
1364         }
1365
1366         gb_tiling_config |= BANK_SWAPS(1);
1367         rdev->config.rv770.tile_config = gb_tiling_config;
1368
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));
1378         }
1379
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);
1384
1385
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);
1389
1390         /* set HW defaults for 3D engine */
1391         WREG32(CP_QUEUE_THRESHOLDS, (ROQ_IB1_START(0x16) |
1392                                      ROQ_IB2_START(0x2b)));
1393
1394         WREG32(CP_MEQ_THRESHOLDS, STQ_SPLIT(0x30));
1395
1396         ta_aux_cntl = RREG32(TA_CNTL_AUX);
1397         WREG32(TA_CNTL_AUX, ta_aux_cntl | DISABLE_CUBE_ANISO);
1398
1399         sx_debug_1 = RREG32(SX_DEBUG_1);
1400         sx_debug_1 |= ENABLE_NEW_SMX_ADDRESS;
1401         WREG32(SX_DEBUG_1, sx_debug_1);
1402
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);
1407
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));
1413
1414         if (rdev->family != CHIP_RV770)
1415                 WREG32(SMX_SAR_CTL0, 0x00003f3f);
1416
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;
1429         }
1430         WREG32(DB_DEBUG3, db_debug3);
1431
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);
1436         }
1437
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)));
1441
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)));
1445
1446         WREG32(PA_SC_MULTI_CHIP_CNTL, 0);
1447
1448         WREG32(VGT_NUM_INSTANCES, 1);
1449
1450         WREG32(SPI_CONFIG_CNTL_1, VTX_DONE_DELAY(4));
1451
1452         WREG32(CP_PERFMON_CNTL, 0);
1453
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;
1467         }
1468         WREG32(SQ_MS_FIFO_SIZES, sq_ms_fifo_sizes);
1469
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
1472          */
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;
1488
1489         WREG32(SQ_CONFIG, sq_config);
1490
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)));
1494
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)));
1497
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);
1506
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)));
1509
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)));
1512
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));
1517
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);
1526
1527         WREG32(PA_SC_FORCE_EOV_MAX_CNTS, (FORCE_EOV_MAX_CLK_CNT(4095) |
1528                                           FORCE_EOV_MAX_REZ_CNT(255)));
1529
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)));
1536
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;
1548         }
1549
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;
1555
1556         WREG32(VGT_ES_PER_GS, 128);
1557         WREG32(VGT_GS_PER_ES, vgt_gs_per_es);
1558         WREG32(VGT_GS_PER_VS, 2);
1559
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);
1573
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);
1583
1584         WREG32(TCP_CNTL, 0);
1585
1586         hdp_host_path_cntl = RREG32(HDP_HOST_PATH_CNTL);
1587         WREG32(HDP_HOST_PATH_CNTL, hdp_host_path_cntl);
1588
1589         WREG32(PA_SC_MULTI_CHIP_CNTL, 0);
1590
1591         WREG32(PA_CL_ENHANCE, (CLIP_VTX_REORDER_ENA |
1592                                           NUM_CLIP_SEQ(3)));
1593         WREG32(VC_ENHANCE, 0);
1594 }
1595
1596 void r700_vram_gtt_location(struct radeon_device *rdev, struct radeon_mc *mc)
1597 {
1598         u64 size_bf, size_af;
1599
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;
1605         }
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;
1614                         }
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;
1621                         }
1622                         mc->vram_start = mc->gtt_end + 1;
1623                 }
1624                 mc->vram_end = mc->vram_start + mc->mc_vram_size - 1;
1625                 dev_info(rdev->dev, "VRAM: %lluM 0x%08llX - 0x%08llX (%lluM 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);
1632         }
1633 }
1634
1635 static int rv770_mc_init(struct radeon_device *rdev)
1636 {
1637         u32 tmp;
1638         int chansize, numchan;
1639
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;
1649         }
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;
1665         }
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);
1676
1677         return 0;
1678 }
1679
1680 static int rv770_startup(struct radeon_device *rdev)
1681 {
1682         struct radeon_ring *ring;
1683         int r;
1684
1685         /* enable pcie gen2 link */
1686         rv770_pcie_gen2_enable(rdev);
1687
1688         /* scratch needs to be initialized before MC */
1689         r = r600_vram_scratch_init(rdev);
1690         if (r)
1691                 return r;
1692
1693         rv770_mc_program(rdev);
1694
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;
1701         }
1702
1703         rv770_gpu_init(rdev);
1704
1705         /* allocate wb buffer */
1706         r = radeon_wb_init(rdev);
1707         if (r)
1708                 return r;
1709
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;
1714         }
1715
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;
1720         }
1721
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);
1728         }
1729
1730         if (r)
1731                 rdev->ring[R600_RING_TYPE_UVD_INDEX].ring_size = 0;
1732
1733         /* Enable IRQ */
1734         if (!rdev->irq.installed) {
1735                 r = radeon_irq_kms_init(rdev);
1736                 if (r)
1737                         return r;
1738         }
1739
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;
1745         }
1746         r600_irq_set(rdev);
1747
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;
1753
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;
1759
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;
1766
1767         r = r600_dma_resume(rdev);
1768         if (r)
1769                 return r;
1770
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);
1777
1778                 if (r)
1779                         DRM_ERROR("radeon: failed initializing UVD (%d).\n", r);
1780         }
1781
1782         r = radeon_ib_pool_init(rdev);
1783         if (r) {
1784                 dev_err(rdev->dev, "IB initialization failed (%d).\n", r);
1785                 return r;
1786         }
1787
1788         r = r600_audio_init(rdev);
1789         if (r) {
1790                 DRM_ERROR("radeon: audio init failed\n");
1791                 return r;
1792         }
1793
1794         return 0;
1795 }
1796
1797 int rv770_resume(struct radeon_device *rdev)
1798 {
1799         int r;
1800
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.
1804          */
1805         /* post card */
1806         atom_asic_init(rdev->mode_info.atom_context);
1807
1808         /* init golden registers */
1809         rv770_init_golden_registers(rdev);
1810
1811         if (rdev->pm.pm_method == PM_METHOD_DPM)
1812                 radeon_pm_resume(rdev);
1813
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;
1820         }
1821
1822         return r;
1823
1824 }
1825
1826 int rv770_suspend(struct radeon_device *rdev)
1827 {
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);
1837
1838         return 0;
1839 }
1840
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.
1846  */
1847 int rv770_init(struct radeon_device *rdev)
1848 {
1849         int r;
1850
1851         /* Read BIOS */
1852         if (!radeon_get_bios(rdev)) {
1853                 if (ASIC_IS_AVIVO(rdev))
1854                         return -EINVAL;
1855         }
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;
1860         }
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;
1869                 }
1870                 DRM_INFO("GPU not posted. posting now...\n");
1871                 atom_asic_init(rdev->mode_info.atom_context);
1872         }
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);
1890         }
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;
1898
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;
1904                 }
1905         }
1906
1907         /* Initialize power management */
1908         radeon_pm_init(rdev);
1909
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);
1912
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);
1915
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);
1921         }
1922
1923         rdev->ih.ring_obj = NULL;
1924         r600_ih_ring_init(rdev, 64 * 1024);
1925
1926         r = r600_pcie_gart_init(rdev);
1927         if (r)
1928                 return r;
1929
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;
1942         }
1943
1944         return 0;
1945 }
1946
1947 void rv770_fini(struct radeon_device *rdev)
1948 {
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;
1968 }
1969
1970 static void rv770_pcie_gen2_enable(struct radeon_device *rdev)
1971 {
1972         u32 link_width_cntl, lanes, speed_cntl, tmp;
1973         u16 link_cntl2;
1974         u32 mask;
1975         int ret;
1976
1977         if (radeon_pcie_gen2 == 0)
1978                 return;
1979
1980         if (rdev->flags & RADEON_IS_IGP)
1981                 return;
1982
1983         if (!(rdev->flags & RADEON_IS_PCIE))
1984                 return;
1985
1986         /* x2 cards have a special sequence */
1987         if (ASIC_IS_X2(rdev))
1988                 return;
1989
1990         ret = drm_pcie_get_speed_cap_mask(rdev->ddev, &mask);
1991         if (ret != 0)
1992                 return;
1993
1994         if (!(mask & DRM_PCIE_SPEED_50))
1995                 return;
1996
1997         DRM_INFO("enabling PCIE gen 2 link speeds, disable with radeon.pcie_gen2=0\n");
1998
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);
2014         }
2015
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)) {
2019
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);
2028
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);
2032
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);
2036
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);
2040
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);
2044
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);
2053         }
2054 }