Merge tag 'mac80211-for-davem-2016-06-09' of git://git.kernel.org/pub/scm/linux/kerne...
[cascardo/linux.git] / 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/slab.h>
30 #include <drm/drmP.h>
31 #include "radeon.h"
32 #include "radeon_asic.h"
33 #include "radeon_audio.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 void rv770_page_flip(struct radeon_device *rdev, int crtc_id, u64 crtc_base, bool async)
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         WREG32(AVIVO_D1GRPH_FLIP_CONTROL + radeon_crtc->crtc_offset,
816                async ? AVIVO_D1GRPH_SURFACE_UPDATE_H_RETRACE_EN : 0);
817         if (radeon_crtc->crtc_id) {
818                 WREG32(D2GRPH_SECONDARY_SURFACE_ADDRESS_HIGH, upper_32_bits(crtc_base));
819                 WREG32(D2GRPH_PRIMARY_SURFACE_ADDRESS_HIGH, upper_32_bits(crtc_base));
820         } else {
821                 WREG32(D1GRPH_SECONDARY_SURFACE_ADDRESS_HIGH, upper_32_bits(crtc_base));
822                 WREG32(D1GRPH_PRIMARY_SURFACE_ADDRESS_HIGH, upper_32_bits(crtc_base));
823         }
824         WREG32(D1GRPH_SECONDARY_SURFACE_ADDRESS + radeon_crtc->crtc_offset,
825                (u32)crtc_base);
826         WREG32(D1GRPH_PRIMARY_SURFACE_ADDRESS + radeon_crtc->crtc_offset,
827                (u32)crtc_base);
828
829         /* Wait for update_pending to go high. */
830         for (i = 0; i < rdev->usec_timeout; i++) {
831                 if (RREG32(AVIVO_D1GRPH_UPDATE + radeon_crtc->crtc_offset) & AVIVO_D1GRPH_SURFACE_UPDATE_PENDING)
832                         break;
833                 udelay(1);
834         }
835         DRM_DEBUG("Update pending now high. Unlocking vupdate_lock.\n");
836
837         /* Unlock the lock, so double-buffering can take place inside vblank */
838         tmp &= ~AVIVO_D1GRPH_UPDATE_LOCK;
839         WREG32(AVIVO_D1GRPH_UPDATE + radeon_crtc->crtc_offset, tmp);
840 }
841
842 bool rv770_page_flip_pending(struct radeon_device *rdev, int crtc_id)
843 {
844         struct radeon_crtc *radeon_crtc = rdev->mode_info.crtcs[crtc_id];
845
846         /* Return current update_pending status: */
847         return !!(RREG32(AVIVO_D1GRPH_UPDATE + radeon_crtc->crtc_offset) &
848                 AVIVO_D1GRPH_SURFACE_UPDATE_PENDING);
849 }
850
851 /* get temperature in millidegrees */
852 int rv770_get_temp(struct radeon_device *rdev)
853 {
854         u32 temp = (RREG32(CG_MULT_THERMAL_STATUS) & ASIC_T_MASK) >>
855                 ASIC_T_SHIFT;
856         int actual_temp;
857
858         if (temp & 0x400)
859                 actual_temp = -256;
860         else if (temp & 0x200)
861                 actual_temp = 255;
862         else if (temp & 0x100) {
863                 actual_temp = temp & 0x1ff;
864                 actual_temp |= ~0x1ff;
865         } else
866                 actual_temp = temp & 0xff;
867
868         return (actual_temp * 1000) / 2;
869 }
870
871 void rv770_pm_misc(struct radeon_device *rdev)
872 {
873         int req_ps_idx = rdev->pm.requested_power_state_index;
874         int req_cm_idx = rdev->pm.requested_clock_mode_index;
875         struct radeon_power_state *ps = &rdev->pm.power_state[req_ps_idx];
876         struct radeon_voltage *voltage = &ps->clock_info[req_cm_idx].voltage;
877
878         if ((voltage->type == VOLTAGE_SW) && voltage->voltage) {
879                 /* 0xff01 is a flag rather then an actual voltage */
880                 if (voltage->voltage == 0xff01)
881                         return;
882                 if (voltage->voltage != rdev->pm.current_vddc) {
883                         radeon_atom_set_voltage(rdev, voltage->voltage, SET_VOLTAGE_TYPE_ASIC_VDDC);
884                         rdev->pm.current_vddc = voltage->voltage;
885                         DRM_DEBUG("Setting: v: %d\n", voltage->voltage);
886                 }
887         }
888 }
889
890 /*
891  * GART
892  */
893 static int rv770_pcie_gart_enable(struct radeon_device *rdev)
894 {
895         u32 tmp;
896         int r, i;
897
898         if (rdev->gart.robj == NULL) {
899                 dev_err(rdev->dev, "No VRAM object for PCIE GART.\n");
900                 return -EINVAL;
901         }
902         r = radeon_gart_table_vram_pin(rdev);
903         if (r)
904                 return r;
905         /* Setup L2 cache */
906         WREG32(VM_L2_CNTL, ENABLE_L2_CACHE | ENABLE_L2_FRAGMENT_PROCESSING |
907                                 ENABLE_L2_PTE_CACHE_LRU_UPDATE_BY_WRITE |
908                                 EFFECTIVE_L2_QUEUE_SIZE(7));
909         WREG32(VM_L2_CNTL2, 0);
910         WREG32(VM_L2_CNTL3, BANK_SELECT(0) | CACHE_UPDATE_MODE(2));
911         /* Setup TLB control */
912         tmp = ENABLE_L1_TLB | ENABLE_L1_FRAGMENT_PROCESSING |
913                 SYSTEM_ACCESS_MODE_NOT_IN_SYS |
914                 SYSTEM_APERTURE_UNMAPPED_ACCESS_PASS_THRU |
915                 EFFECTIVE_L1_TLB_SIZE(5) | EFFECTIVE_L1_QUEUE_SIZE(5);
916         WREG32(MC_VM_MD_L1_TLB0_CNTL, tmp);
917         WREG32(MC_VM_MD_L1_TLB1_CNTL, tmp);
918         WREG32(MC_VM_MD_L1_TLB2_CNTL, tmp);
919         if (rdev->family == CHIP_RV740)
920                 WREG32(MC_VM_MD_L1_TLB3_CNTL, tmp);
921         WREG32(MC_VM_MB_L1_TLB0_CNTL, tmp);
922         WREG32(MC_VM_MB_L1_TLB1_CNTL, tmp);
923         WREG32(MC_VM_MB_L1_TLB2_CNTL, tmp);
924         WREG32(MC_VM_MB_L1_TLB3_CNTL, tmp);
925         WREG32(VM_CONTEXT0_PAGE_TABLE_START_ADDR, rdev->mc.gtt_start >> 12);
926         WREG32(VM_CONTEXT0_PAGE_TABLE_END_ADDR, rdev->mc.gtt_end >> 12);
927         WREG32(VM_CONTEXT0_PAGE_TABLE_BASE_ADDR, rdev->gart.table_addr >> 12);
928         WREG32(VM_CONTEXT0_CNTL, ENABLE_CONTEXT | PAGE_TABLE_DEPTH(0) |
929                                 RANGE_PROTECTION_FAULT_ENABLE_DEFAULT);
930         WREG32(VM_CONTEXT0_PROTECTION_FAULT_DEFAULT_ADDR,
931                         (u32)(rdev->dummy_page.addr >> 12));
932         for (i = 1; i < 7; i++)
933                 WREG32(VM_CONTEXT0_CNTL + (i * 4), 0);
934
935         r600_pcie_gart_tlb_flush(rdev);
936         DRM_INFO("PCIE GART of %uM enabled (table at 0x%016llX).\n",
937                  (unsigned)(rdev->mc.gtt_size >> 20),
938                  (unsigned long long)rdev->gart.table_addr);
939         rdev->gart.ready = true;
940         return 0;
941 }
942
943 static void rv770_pcie_gart_disable(struct radeon_device *rdev)
944 {
945         u32 tmp;
946         int i;
947
948         /* Disable all tables */
949         for (i = 0; i < 7; i++)
950                 WREG32(VM_CONTEXT0_CNTL + (i * 4), 0);
951
952         /* Setup L2 cache */
953         WREG32(VM_L2_CNTL, ENABLE_L2_FRAGMENT_PROCESSING |
954                                 EFFECTIVE_L2_QUEUE_SIZE(7));
955         WREG32(VM_L2_CNTL2, 0);
956         WREG32(VM_L2_CNTL3, BANK_SELECT(0) | CACHE_UPDATE_MODE(2));
957         /* Setup TLB control */
958         tmp = EFFECTIVE_L1_TLB_SIZE(5) | EFFECTIVE_L1_QUEUE_SIZE(5);
959         WREG32(MC_VM_MD_L1_TLB0_CNTL, tmp);
960         WREG32(MC_VM_MD_L1_TLB1_CNTL, tmp);
961         WREG32(MC_VM_MD_L1_TLB2_CNTL, tmp);
962         WREG32(MC_VM_MB_L1_TLB0_CNTL, tmp);
963         WREG32(MC_VM_MB_L1_TLB1_CNTL, tmp);
964         WREG32(MC_VM_MB_L1_TLB2_CNTL, tmp);
965         WREG32(MC_VM_MB_L1_TLB3_CNTL, tmp);
966         radeon_gart_table_vram_unpin(rdev);
967 }
968
969 static void rv770_pcie_gart_fini(struct radeon_device *rdev)
970 {
971         radeon_gart_fini(rdev);
972         rv770_pcie_gart_disable(rdev);
973         radeon_gart_table_vram_free(rdev);
974 }
975
976
977 static void rv770_agp_enable(struct radeon_device *rdev)
978 {
979         u32 tmp;
980         int i;
981
982         /* Setup L2 cache */
983         WREG32(VM_L2_CNTL, ENABLE_L2_CACHE | ENABLE_L2_FRAGMENT_PROCESSING |
984                                 ENABLE_L2_PTE_CACHE_LRU_UPDATE_BY_WRITE |
985                                 EFFECTIVE_L2_QUEUE_SIZE(7));
986         WREG32(VM_L2_CNTL2, 0);
987         WREG32(VM_L2_CNTL3, BANK_SELECT(0) | CACHE_UPDATE_MODE(2));
988         /* Setup TLB control */
989         tmp = ENABLE_L1_TLB | ENABLE_L1_FRAGMENT_PROCESSING |
990                 SYSTEM_ACCESS_MODE_NOT_IN_SYS |
991                 SYSTEM_APERTURE_UNMAPPED_ACCESS_PASS_THRU |
992                 EFFECTIVE_L1_TLB_SIZE(5) | EFFECTIVE_L1_QUEUE_SIZE(5);
993         WREG32(MC_VM_MD_L1_TLB0_CNTL, tmp);
994         WREG32(MC_VM_MD_L1_TLB1_CNTL, tmp);
995         WREG32(MC_VM_MD_L1_TLB2_CNTL, tmp);
996         WREG32(MC_VM_MB_L1_TLB0_CNTL, tmp);
997         WREG32(MC_VM_MB_L1_TLB1_CNTL, tmp);
998         WREG32(MC_VM_MB_L1_TLB2_CNTL, tmp);
999         WREG32(MC_VM_MB_L1_TLB3_CNTL, tmp);
1000         for (i = 0; i < 7; i++)
1001                 WREG32(VM_CONTEXT0_CNTL + (i * 4), 0);
1002 }
1003
1004 static void rv770_mc_program(struct radeon_device *rdev)
1005 {
1006         struct rv515_mc_save save;
1007         u32 tmp;
1008         int i, j;
1009
1010         /* Initialize HDP */
1011         for (i = 0, j = 0; i < 32; i++, j += 0x18) {
1012                 WREG32((0x2c14 + j), 0x00000000);
1013                 WREG32((0x2c18 + j), 0x00000000);
1014                 WREG32((0x2c1c + j), 0x00000000);
1015                 WREG32((0x2c20 + j), 0x00000000);
1016                 WREG32((0x2c24 + j), 0x00000000);
1017         }
1018         /* r7xx hw bug.  Read from HDP_DEBUG1 rather
1019          * than writing to HDP_REG_COHERENCY_FLUSH_CNTL
1020          */
1021         tmp = RREG32(HDP_DEBUG1);
1022
1023         rv515_mc_stop(rdev, &save);
1024         if (r600_mc_wait_for_idle(rdev)) {
1025                 dev_warn(rdev->dev, "Wait for MC idle timedout !\n");
1026         }
1027         /* Lockout access through VGA aperture*/
1028         WREG32(VGA_HDP_CONTROL, VGA_MEMORY_DISABLE);
1029         /* Update configuration */
1030         if (rdev->flags & RADEON_IS_AGP) {
1031                 if (rdev->mc.vram_start < rdev->mc.gtt_start) {
1032                         /* VRAM before AGP */
1033                         WREG32(MC_VM_SYSTEM_APERTURE_LOW_ADDR,
1034                                 rdev->mc.vram_start >> 12);
1035                         WREG32(MC_VM_SYSTEM_APERTURE_HIGH_ADDR,
1036                                 rdev->mc.gtt_end >> 12);
1037                 } else {
1038                         /* VRAM after AGP */
1039                         WREG32(MC_VM_SYSTEM_APERTURE_LOW_ADDR,
1040                                 rdev->mc.gtt_start >> 12);
1041                         WREG32(MC_VM_SYSTEM_APERTURE_HIGH_ADDR,
1042                                 rdev->mc.vram_end >> 12);
1043                 }
1044         } else {
1045                 WREG32(MC_VM_SYSTEM_APERTURE_LOW_ADDR,
1046                         rdev->mc.vram_start >> 12);
1047                 WREG32(MC_VM_SYSTEM_APERTURE_HIGH_ADDR,
1048                         rdev->mc.vram_end >> 12);
1049         }
1050         WREG32(MC_VM_SYSTEM_APERTURE_DEFAULT_ADDR, rdev->vram_scratch.gpu_addr >> 12);
1051         tmp = ((rdev->mc.vram_end >> 24) & 0xFFFF) << 16;
1052         tmp |= ((rdev->mc.vram_start >> 24) & 0xFFFF);
1053         WREG32(MC_VM_FB_LOCATION, tmp);
1054         WREG32(HDP_NONSURFACE_BASE, (rdev->mc.vram_start >> 8));
1055         WREG32(HDP_NONSURFACE_INFO, (2 << 7));
1056         WREG32(HDP_NONSURFACE_SIZE, 0x3FFFFFFF);
1057         if (rdev->flags & RADEON_IS_AGP) {
1058                 WREG32(MC_VM_AGP_TOP, rdev->mc.gtt_end >> 16);
1059                 WREG32(MC_VM_AGP_BOT, rdev->mc.gtt_start >> 16);
1060                 WREG32(MC_VM_AGP_BASE, rdev->mc.agp_base >> 22);
1061         } else {
1062                 WREG32(MC_VM_AGP_BASE, 0);
1063                 WREG32(MC_VM_AGP_TOP, 0x0FFFFFFF);
1064                 WREG32(MC_VM_AGP_BOT, 0x0FFFFFFF);
1065         }
1066         if (r600_mc_wait_for_idle(rdev)) {
1067                 dev_warn(rdev->dev, "Wait for MC idle timedout !\n");
1068         }
1069         rv515_mc_resume(rdev, &save);
1070         /* we need to own VRAM, so turn off the VGA renderer here
1071          * to stop it overwriting our objects */
1072         rv515_vga_render_disable(rdev);
1073 }
1074
1075
1076 /*
1077  * CP.
1078  */
1079 void r700_cp_stop(struct radeon_device *rdev)
1080 {
1081         if (rdev->asic->copy.copy_ring_index == RADEON_RING_TYPE_GFX_INDEX)
1082                 radeon_ttm_set_active_vram_size(rdev, rdev->mc.visible_vram_size);
1083         WREG32(CP_ME_CNTL, (CP_ME_HALT | CP_PFP_HALT));
1084         WREG32(SCRATCH_UMSK, 0);
1085         rdev->ring[RADEON_RING_TYPE_GFX_INDEX].ready = false;
1086 }
1087
1088 static int rv770_cp_load_microcode(struct radeon_device *rdev)
1089 {
1090         const __be32 *fw_data;
1091         int i;
1092
1093         if (!rdev->me_fw || !rdev->pfp_fw)
1094                 return -EINVAL;
1095
1096         r700_cp_stop(rdev);
1097         WREG32(CP_RB_CNTL,
1098 #ifdef __BIG_ENDIAN
1099                BUF_SWAP_32BIT |
1100 #endif
1101                RB_NO_UPDATE | RB_BLKSZ(15) | RB_BUFSZ(3));
1102
1103         /* Reset cp */
1104         WREG32(GRBM_SOFT_RESET, SOFT_RESET_CP);
1105         RREG32(GRBM_SOFT_RESET);
1106         mdelay(15);
1107         WREG32(GRBM_SOFT_RESET, 0);
1108
1109         fw_data = (const __be32 *)rdev->pfp_fw->data;
1110         WREG32(CP_PFP_UCODE_ADDR, 0);
1111         for (i = 0; i < R700_PFP_UCODE_SIZE; i++)
1112                 WREG32(CP_PFP_UCODE_DATA, be32_to_cpup(fw_data++));
1113         WREG32(CP_PFP_UCODE_ADDR, 0);
1114
1115         fw_data = (const __be32 *)rdev->me_fw->data;
1116         WREG32(CP_ME_RAM_WADDR, 0);
1117         for (i = 0; i < R700_PM4_UCODE_SIZE; i++)
1118                 WREG32(CP_ME_RAM_DATA, be32_to_cpup(fw_data++));
1119
1120         WREG32(CP_PFP_UCODE_ADDR, 0);
1121         WREG32(CP_ME_RAM_WADDR, 0);
1122         WREG32(CP_ME_RAM_RADDR, 0);
1123         return 0;
1124 }
1125
1126 void r700_cp_fini(struct radeon_device *rdev)
1127 {
1128         struct radeon_ring *ring = &rdev->ring[RADEON_RING_TYPE_GFX_INDEX];
1129         r700_cp_stop(rdev);
1130         radeon_ring_fini(rdev, ring);
1131         radeon_scratch_free(rdev, ring->rptr_save_reg);
1132 }
1133
1134 void rv770_set_clk_bypass_mode(struct radeon_device *rdev)
1135 {
1136         u32 tmp, i;
1137
1138         if (rdev->flags & RADEON_IS_IGP)
1139                 return;
1140
1141         tmp = RREG32(CG_SPLL_FUNC_CNTL_2);
1142         tmp &= SCLK_MUX_SEL_MASK;
1143         tmp |= SCLK_MUX_SEL(1) | SCLK_MUX_UPDATE;
1144         WREG32(CG_SPLL_FUNC_CNTL_2, tmp);
1145
1146         for (i = 0; i < rdev->usec_timeout; i++) {
1147                 if (RREG32(CG_SPLL_STATUS) & SPLL_CHG_STATUS)
1148                         break;
1149                 udelay(1);
1150         }
1151
1152         tmp &= ~SCLK_MUX_UPDATE;
1153         WREG32(CG_SPLL_FUNC_CNTL_2, tmp);
1154
1155         tmp = RREG32(MPLL_CNTL_MODE);
1156         if ((rdev->family == CHIP_RV710) || (rdev->family == CHIP_RV730))
1157                 tmp &= ~RV730_MPLL_MCLK_SEL;
1158         else
1159                 tmp &= ~MPLL_MCLK_SEL;
1160         WREG32(MPLL_CNTL_MODE, tmp);
1161 }
1162
1163 /*
1164  * Core functions
1165  */
1166 static void rv770_gpu_init(struct radeon_device *rdev)
1167 {
1168         int i, j, num_qd_pipes;
1169         u32 ta_aux_cntl;
1170         u32 sx_debug_1;
1171         u32 smx_dc_ctl0;
1172         u32 db_debug3;
1173         u32 num_gs_verts_per_thread;
1174         u32 vgt_gs_per_es;
1175         u32 gs_prim_buffer_depth = 0;
1176         u32 sq_ms_fifo_sizes;
1177         u32 sq_config;
1178         u32 sq_thread_resource_mgmt;
1179         u32 hdp_host_path_cntl;
1180         u32 sq_dyn_gpr_size_simd_ab_0;
1181         u32 gb_tiling_config = 0;
1182         u32 cc_gc_shader_pipe_config = 0;
1183         u32 mc_arb_ramcfg;
1184         u32 db_debug4, tmp;
1185         u32 inactive_pipes, shader_pipe_config;
1186         u32 disabled_rb_mask;
1187         unsigned active_number;
1188
1189         /* setup chip specs */
1190         rdev->config.rv770.tiling_group_size = 256;
1191         switch (rdev->family) {
1192         case CHIP_RV770:
1193                 rdev->config.rv770.max_pipes = 4;
1194                 rdev->config.rv770.max_tile_pipes = 8;
1195                 rdev->config.rv770.max_simds = 10;
1196                 rdev->config.rv770.max_backends = 4;
1197                 rdev->config.rv770.max_gprs = 256;
1198                 rdev->config.rv770.max_threads = 248;
1199                 rdev->config.rv770.max_stack_entries = 512;
1200                 rdev->config.rv770.max_hw_contexts = 8;
1201                 rdev->config.rv770.max_gs_threads = 16 * 2;
1202                 rdev->config.rv770.sx_max_export_size = 128;
1203                 rdev->config.rv770.sx_max_export_pos_size = 16;
1204                 rdev->config.rv770.sx_max_export_smx_size = 112;
1205                 rdev->config.rv770.sq_num_cf_insts = 2;
1206
1207                 rdev->config.rv770.sx_num_of_sets = 7;
1208                 rdev->config.rv770.sc_prim_fifo_size = 0xF9;
1209                 rdev->config.rv770.sc_hiz_tile_fifo_size = 0x30;
1210                 rdev->config.rv770.sc_earlyz_tile_fifo_fize = 0x130;
1211                 break;
1212         case CHIP_RV730:
1213                 rdev->config.rv770.max_pipes = 2;
1214                 rdev->config.rv770.max_tile_pipes = 4;
1215                 rdev->config.rv770.max_simds = 8;
1216                 rdev->config.rv770.max_backends = 2;
1217                 rdev->config.rv770.max_gprs = 128;
1218                 rdev->config.rv770.max_threads = 248;
1219                 rdev->config.rv770.max_stack_entries = 256;
1220                 rdev->config.rv770.max_hw_contexts = 8;
1221                 rdev->config.rv770.max_gs_threads = 16 * 2;
1222                 rdev->config.rv770.sx_max_export_size = 256;
1223                 rdev->config.rv770.sx_max_export_pos_size = 32;
1224                 rdev->config.rv770.sx_max_export_smx_size = 224;
1225                 rdev->config.rv770.sq_num_cf_insts = 2;
1226
1227                 rdev->config.rv770.sx_num_of_sets = 7;
1228                 rdev->config.rv770.sc_prim_fifo_size = 0xf9;
1229                 rdev->config.rv770.sc_hiz_tile_fifo_size = 0x30;
1230                 rdev->config.rv770.sc_earlyz_tile_fifo_fize = 0x130;
1231                 if (rdev->config.rv770.sx_max_export_pos_size > 16) {
1232                         rdev->config.rv770.sx_max_export_pos_size -= 16;
1233                         rdev->config.rv770.sx_max_export_smx_size += 16;
1234                 }
1235                 break;
1236         case CHIP_RV710:
1237                 rdev->config.rv770.max_pipes = 2;
1238                 rdev->config.rv770.max_tile_pipes = 2;
1239                 rdev->config.rv770.max_simds = 2;
1240                 rdev->config.rv770.max_backends = 1;
1241                 rdev->config.rv770.max_gprs = 256;
1242                 rdev->config.rv770.max_threads = 192;
1243                 rdev->config.rv770.max_stack_entries = 256;
1244                 rdev->config.rv770.max_hw_contexts = 4;
1245                 rdev->config.rv770.max_gs_threads = 8 * 2;
1246                 rdev->config.rv770.sx_max_export_size = 128;
1247                 rdev->config.rv770.sx_max_export_pos_size = 16;
1248                 rdev->config.rv770.sx_max_export_smx_size = 112;
1249                 rdev->config.rv770.sq_num_cf_insts = 1;
1250
1251                 rdev->config.rv770.sx_num_of_sets = 7;
1252                 rdev->config.rv770.sc_prim_fifo_size = 0x40;
1253                 rdev->config.rv770.sc_hiz_tile_fifo_size = 0x30;
1254                 rdev->config.rv770.sc_earlyz_tile_fifo_fize = 0x130;
1255                 break;
1256         case CHIP_RV740:
1257                 rdev->config.rv770.max_pipes = 4;
1258                 rdev->config.rv770.max_tile_pipes = 4;
1259                 rdev->config.rv770.max_simds = 8;
1260                 rdev->config.rv770.max_backends = 4;
1261                 rdev->config.rv770.max_gprs = 256;
1262                 rdev->config.rv770.max_threads = 248;
1263                 rdev->config.rv770.max_stack_entries = 512;
1264                 rdev->config.rv770.max_hw_contexts = 8;
1265                 rdev->config.rv770.max_gs_threads = 16 * 2;
1266                 rdev->config.rv770.sx_max_export_size = 256;
1267                 rdev->config.rv770.sx_max_export_pos_size = 32;
1268                 rdev->config.rv770.sx_max_export_smx_size = 224;
1269                 rdev->config.rv770.sq_num_cf_insts = 2;
1270
1271                 rdev->config.rv770.sx_num_of_sets = 7;
1272                 rdev->config.rv770.sc_prim_fifo_size = 0x100;
1273                 rdev->config.rv770.sc_hiz_tile_fifo_size = 0x30;
1274                 rdev->config.rv770.sc_earlyz_tile_fifo_fize = 0x130;
1275
1276                 if (rdev->config.rv770.sx_max_export_pos_size > 16) {
1277                         rdev->config.rv770.sx_max_export_pos_size -= 16;
1278                         rdev->config.rv770.sx_max_export_smx_size += 16;
1279                 }
1280                 break;
1281         default:
1282                 break;
1283         }
1284
1285         /* Initialize HDP */
1286         j = 0;
1287         for (i = 0; i < 32; i++) {
1288                 WREG32((0x2c14 + j), 0x00000000);
1289                 WREG32((0x2c18 + j), 0x00000000);
1290                 WREG32((0x2c1c + j), 0x00000000);
1291                 WREG32((0x2c20 + j), 0x00000000);
1292                 WREG32((0x2c24 + j), 0x00000000);
1293                 j += 0x18;
1294         }
1295
1296         WREG32(GRBM_CNTL, GRBM_READ_TIMEOUT(0xff));
1297
1298         /* setup tiling, simd, pipe config */
1299         mc_arb_ramcfg = RREG32(MC_ARB_RAMCFG);
1300
1301         shader_pipe_config = RREG32(CC_GC_SHADER_PIPE_CONFIG);
1302         inactive_pipes = (shader_pipe_config & INACTIVE_QD_PIPES_MASK) >> INACTIVE_QD_PIPES_SHIFT;
1303         for (i = 0, tmp = 1, active_number = 0; i < R7XX_MAX_PIPES; i++) {
1304                 if (!(inactive_pipes & tmp)) {
1305                         active_number++;
1306                 }
1307                 tmp <<= 1;
1308         }
1309         if (active_number == 1) {
1310                 WREG32(SPI_CONFIG_CNTL, DISABLE_INTERP_1);
1311         } else {
1312                 WREG32(SPI_CONFIG_CNTL, 0);
1313         }
1314
1315         cc_gc_shader_pipe_config = RREG32(CC_GC_SHADER_PIPE_CONFIG) & 0xffffff00;
1316         tmp = rdev->config.rv770.max_simds -
1317                 r600_count_pipe_bits((cc_gc_shader_pipe_config >> 16) & R7XX_MAX_SIMDS_MASK);
1318         rdev->config.rv770.active_simds = tmp;
1319
1320         switch (rdev->config.rv770.max_tile_pipes) {
1321         case 1:
1322         default:
1323                 gb_tiling_config = PIPE_TILING(0);
1324                 break;
1325         case 2:
1326                 gb_tiling_config = PIPE_TILING(1);
1327                 break;
1328         case 4:
1329                 gb_tiling_config = PIPE_TILING(2);
1330                 break;
1331         case 8:
1332                 gb_tiling_config = PIPE_TILING(3);
1333                 break;
1334         }
1335         rdev->config.rv770.tiling_npipes = rdev->config.rv770.max_tile_pipes;
1336
1337         disabled_rb_mask = (RREG32(CC_RB_BACKEND_DISABLE) >> 16) & R7XX_MAX_BACKENDS_MASK;
1338         tmp = 0;
1339         for (i = 0; i < rdev->config.rv770.max_backends; i++)
1340                 tmp |= (1 << i);
1341         /* if all the backends are disabled, fix it up here */
1342         if ((disabled_rb_mask & tmp) == tmp) {
1343                 for (i = 0; i < rdev->config.rv770.max_backends; i++)
1344                         disabled_rb_mask &= ~(1 << i);
1345         }
1346         tmp = (gb_tiling_config & PIPE_TILING__MASK) >> PIPE_TILING__SHIFT;
1347         tmp = r6xx_remap_render_backend(rdev, tmp, rdev->config.rv770.max_backends,
1348                                         R7XX_MAX_BACKENDS, disabled_rb_mask);
1349         gb_tiling_config |= tmp << 16;
1350         rdev->config.rv770.backend_map = tmp;
1351
1352         if (rdev->family == CHIP_RV770)
1353                 gb_tiling_config |= BANK_TILING(1);
1354         else {
1355                 if ((mc_arb_ramcfg & NOOFBANK_MASK) >> NOOFBANK_SHIFT)
1356                         gb_tiling_config |= BANK_TILING(1);
1357                 else
1358                         gb_tiling_config |= BANK_TILING(0);
1359         }
1360         rdev->config.rv770.tiling_nbanks = 4 << ((gb_tiling_config >> 4) & 0x3);
1361         gb_tiling_config |= GROUP_SIZE((mc_arb_ramcfg & BURSTLENGTH_MASK) >> BURSTLENGTH_SHIFT);
1362         if (((mc_arb_ramcfg & NOOFROWS_MASK) >> NOOFROWS_SHIFT) > 3) {
1363                 gb_tiling_config |= ROW_TILING(3);
1364                 gb_tiling_config |= SAMPLE_SPLIT(3);
1365         } else {
1366                 gb_tiling_config |=
1367                         ROW_TILING(((mc_arb_ramcfg & NOOFROWS_MASK) >> NOOFROWS_SHIFT));
1368                 gb_tiling_config |=
1369                         SAMPLE_SPLIT(((mc_arb_ramcfg & NOOFROWS_MASK) >> NOOFROWS_SHIFT));
1370         }
1371
1372         gb_tiling_config |= BANK_SWAPS(1);
1373         rdev->config.rv770.tile_config = gb_tiling_config;
1374
1375         WREG32(GB_TILING_CONFIG, gb_tiling_config);
1376         WREG32(DCP_TILING_CONFIG, (gb_tiling_config & 0xffff));
1377         WREG32(HDP_TILING_CONFIG, (gb_tiling_config & 0xffff));
1378         WREG32(DMA_TILING_CONFIG, (gb_tiling_config & 0xffff));
1379         WREG32(DMA_TILING_CONFIG2, (gb_tiling_config & 0xffff));
1380         if (rdev->family == CHIP_RV730) {
1381                 WREG32(UVD_UDEC_DB_TILING_CONFIG, (gb_tiling_config & 0xffff));
1382                 WREG32(UVD_UDEC_DBW_TILING_CONFIG, (gb_tiling_config & 0xffff));
1383                 WREG32(UVD_UDEC_TILING_CONFIG, (gb_tiling_config & 0xffff));
1384         }
1385
1386         WREG32(CGTS_SYS_TCC_DISABLE, 0);
1387         WREG32(CGTS_TCC_DISABLE, 0);
1388         WREG32(CGTS_USER_SYS_TCC_DISABLE, 0);
1389         WREG32(CGTS_USER_TCC_DISABLE, 0);
1390
1391
1392         num_qd_pipes = R7XX_MAX_PIPES - r600_count_pipe_bits((cc_gc_shader_pipe_config & INACTIVE_QD_PIPES_MASK) >> 8);
1393         WREG32(VGT_OUT_DEALLOC_CNTL, (num_qd_pipes * 4) & DEALLOC_DIST_MASK);
1394         WREG32(VGT_VERTEX_REUSE_BLOCK_CNTL, ((num_qd_pipes * 4) - 2) & VTX_REUSE_DEPTH_MASK);
1395
1396         /* set HW defaults for 3D engine */
1397         WREG32(CP_QUEUE_THRESHOLDS, (ROQ_IB1_START(0x16) |
1398                                      ROQ_IB2_START(0x2b)));
1399
1400         WREG32(CP_MEQ_THRESHOLDS, STQ_SPLIT(0x30));
1401
1402         ta_aux_cntl = RREG32(TA_CNTL_AUX);
1403         WREG32(TA_CNTL_AUX, ta_aux_cntl | DISABLE_CUBE_ANISO);
1404
1405         sx_debug_1 = RREG32(SX_DEBUG_1);
1406         sx_debug_1 |= ENABLE_NEW_SMX_ADDRESS;
1407         WREG32(SX_DEBUG_1, sx_debug_1);
1408
1409         smx_dc_ctl0 = RREG32(SMX_DC_CTL0);
1410         smx_dc_ctl0 &= ~CACHE_DEPTH(0x1ff);
1411         smx_dc_ctl0 |= CACHE_DEPTH((rdev->config.rv770.sx_num_of_sets * 64) - 1);
1412         WREG32(SMX_DC_CTL0, smx_dc_ctl0);
1413
1414         if (rdev->family != CHIP_RV740)
1415                 WREG32(SMX_EVENT_CTL, (ES_FLUSH_CTL(4) |
1416                                        GS_FLUSH_CTL(4) |
1417                                        ACK_FLUSH_CTL(3) |
1418                                        SYNC_FLUSH_CTL));
1419
1420         if (rdev->family != CHIP_RV770)
1421                 WREG32(SMX_SAR_CTL0, 0x00003f3f);
1422
1423         db_debug3 = RREG32(DB_DEBUG3);
1424         db_debug3 &= ~DB_CLK_OFF_DELAY(0x1f);
1425         switch (rdev->family) {
1426         case CHIP_RV770:
1427         case CHIP_RV740:
1428                 db_debug3 |= DB_CLK_OFF_DELAY(0x1f);
1429                 break;
1430         case CHIP_RV710:
1431         case CHIP_RV730:
1432         default:
1433                 db_debug3 |= DB_CLK_OFF_DELAY(2);
1434                 break;
1435         }
1436         WREG32(DB_DEBUG3, db_debug3);
1437
1438         if (rdev->family != CHIP_RV770) {
1439                 db_debug4 = RREG32(DB_DEBUG4);
1440                 db_debug4 |= DISABLE_TILE_COVERED_FOR_PS_ITER;
1441                 WREG32(DB_DEBUG4, db_debug4);
1442         }
1443
1444         WREG32(SX_EXPORT_BUFFER_SIZES, (COLOR_BUFFER_SIZE((rdev->config.rv770.sx_max_export_size / 4) - 1) |
1445                                         POSITION_BUFFER_SIZE((rdev->config.rv770.sx_max_export_pos_size / 4) - 1) |
1446                                         SMX_BUFFER_SIZE((rdev->config.rv770.sx_max_export_smx_size / 4) - 1)));
1447
1448         WREG32(PA_SC_FIFO_SIZE, (SC_PRIM_FIFO_SIZE(rdev->config.rv770.sc_prim_fifo_size) |
1449                                  SC_HIZ_TILE_FIFO_SIZE(rdev->config.rv770.sc_hiz_tile_fifo_size) |
1450                                  SC_EARLYZ_TILE_FIFO_SIZE(rdev->config.rv770.sc_earlyz_tile_fifo_fize)));
1451
1452         WREG32(PA_SC_MULTI_CHIP_CNTL, 0);
1453
1454         WREG32(VGT_NUM_INSTANCES, 1);
1455
1456         WREG32(SPI_CONFIG_CNTL_1, VTX_DONE_DELAY(4));
1457
1458         WREG32(CP_PERFMON_CNTL, 0);
1459
1460         sq_ms_fifo_sizes = (CACHE_FIFO_SIZE(16 * rdev->config.rv770.sq_num_cf_insts) |
1461                             DONE_FIFO_HIWATER(0xe0) |
1462                             ALU_UPDATE_FIFO_HIWATER(0x8));
1463         switch (rdev->family) {
1464         case CHIP_RV770:
1465         case CHIP_RV730:
1466         case CHIP_RV710:
1467                 sq_ms_fifo_sizes |= FETCH_FIFO_HIWATER(0x1);
1468                 break;
1469         case CHIP_RV740:
1470         default:
1471                 sq_ms_fifo_sizes |= FETCH_FIFO_HIWATER(0x4);
1472                 break;
1473         }
1474         WREG32(SQ_MS_FIFO_SIZES, sq_ms_fifo_sizes);
1475
1476         /* SQ_CONFIG, SQ_GPR_RESOURCE_MGMT, SQ_THREAD_RESOURCE_MGMT, SQ_STACK_RESOURCE_MGMT
1477          * should be adjusted as needed by the 2D/3D drivers.  This just sets default values
1478          */
1479         sq_config = RREG32(SQ_CONFIG);
1480         sq_config &= ~(PS_PRIO(3) |
1481                        VS_PRIO(3) |
1482                        GS_PRIO(3) |
1483                        ES_PRIO(3));
1484         sq_config |= (DX9_CONSTS |
1485                       VC_ENABLE |
1486                       EXPORT_SRC_C |
1487                       PS_PRIO(0) |
1488                       VS_PRIO(1) |
1489                       GS_PRIO(2) |
1490                       ES_PRIO(3));
1491         if (rdev->family == CHIP_RV710)
1492                 /* no vertex cache */
1493                 sq_config &= ~VC_ENABLE;
1494
1495         WREG32(SQ_CONFIG, sq_config);
1496
1497         WREG32(SQ_GPR_RESOURCE_MGMT_1,  (NUM_PS_GPRS((rdev->config.rv770.max_gprs * 24)/64) |
1498                                          NUM_VS_GPRS((rdev->config.rv770.max_gprs * 24)/64) |
1499                                          NUM_CLAUSE_TEMP_GPRS(((rdev->config.rv770.max_gprs * 24)/64)/2)));
1500
1501         WREG32(SQ_GPR_RESOURCE_MGMT_2,  (NUM_GS_GPRS((rdev->config.rv770.max_gprs * 7)/64) |
1502                                          NUM_ES_GPRS((rdev->config.rv770.max_gprs * 7)/64)));
1503
1504         sq_thread_resource_mgmt = (NUM_PS_THREADS((rdev->config.rv770.max_threads * 4)/8) |
1505                                    NUM_VS_THREADS((rdev->config.rv770.max_threads * 2)/8) |
1506                                    NUM_ES_THREADS((rdev->config.rv770.max_threads * 1)/8));
1507         if (((rdev->config.rv770.max_threads * 1) / 8) > rdev->config.rv770.max_gs_threads)
1508                 sq_thread_resource_mgmt |= NUM_GS_THREADS(rdev->config.rv770.max_gs_threads);
1509         else
1510                 sq_thread_resource_mgmt |= NUM_GS_THREADS((rdev->config.rv770.max_gs_threads * 1)/8);
1511         WREG32(SQ_THREAD_RESOURCE_MGMT, sq_thread_resource_mgmt);
1512
1513         WREG32(SQ_STACK_RESOURCE_MGMT_1, (NUM_PS_STACK_ENTRIES((rdev->config.rv770.max_stack_entries * 1)/4) |
1514                                                      NUM_VS_STACK_ENTRIES((rdev->config.rv770.max_stack_entries * 1)/4)));
1515
1516         WREG32(SQ_STACK_RESOURCE_MGMT_2, (NUM_GS_STACK_ENTRIES((rdev->config.rv770.max_stack_entries * 1)/4) |
1517                                                      NUM_ES_STACK_ENTRIES((rdev->config.rv770.max_stack_entries * 1)/4)));
1518
1519         sq_dyn_gpr_size_simd_ab_0 = (SIMDA_RING0((rdev->config.rv770.max_gprs * 38)/64) |
1520                                      SIMDA_RING1((rdev->config.rv770.max_gprs * 38)/64) |
1521                                      SIMDB_RING0((rdev->config.rv770.max_gprs * 38)/64) |
1522                                      SIMDB_RING1((rdev->config.rv770.max_gprs * 38)/64));
1523
1524         WREG32(SQ_DYN_GPR_SIZE_SIMD_AB_0, sq_dyn_gpr_size_simd_ab_0);
1525         WREG32(SQ_DYN_GPR_SIZE_SIMD_AB_1, sq_dyn_gpr_size_simd_ab_0);
1526         WREG32(SQ_DYN_GPR_SIZE_SIMD_AB_2, sq_dyn_gpr_size_simd_ab_0);
1527         WREG32(SQ_DYN_GPR_SIZE_SIMD_AB_3, sq_dyn_gpr_size_simd_ab_0);
1528         WREG32(SQ_DYN_GPR_SIZE_SIMD_AB_4, sq_dyn_gpr_size_simd_ab_0);
1529         WREG32(SQ_DYN_GPR_SIZE_SIMD_AB_5, sq_dyn_gpr_size_simd_ab_0);
1530         WREG32(SQ_DYN_GPR_SIZE_SIMD_AB_6, sq_dyn_gpr_size_simd_ab_0);
1531         WREG32(SQ_DYN_GPR_SIZE_SIMD_AB_7, sq_dyn_gpr_size_simd_ab_0);
1532
1533         WREG32(PA_SC_FORCE_EOV_MAX_CNTS, (FORCE_EOV_MAX_CLK_CNT(4095) |
1534                                           FORCE_EOV_MAX_REZ_CNT(255)));
1535
1536         if (rdev->family == CHIP_RV710)
1537                 WREG32(VGT_CACHE_INVALIDATION, (CACHE_INVALIDATION(TC_ONLY) |
1538                                                 AUTO_INVLD_EN(ES_AND_GS_AUTO)));
1539         else
1540                 WREG32(VGT_CACHE_INVALIDATION, (CACHE_INVALIDATION(VC_AND_TC) |
1541                                                 AUTO_INVLD_EN(ES_AND_GS_AUTO)));
1542
1543         switch (rdev->family) {
1544         case CHIP_RV770:
1545         case CHIP_RV730:
1546         case CHIP_RV740:
1547                 gs_prim_buffer_depth = 384;
1548                 break;
1549         case CHIP_RV710:
1550                 gs_prim_buffer_depth = 128;
1551                 break;
1552         default:
1553                 break;
1554         }
1555
1556         num_gs_verts_per_thread = rdev->config.rv770.max_pipes * 16;
1557         vgt_gs_per_es = gs_prim_buffer_depth + num_gs_verts_per_thread;
1558         /* Max value for this is 256 */
1559         if (vgt_gs_per_es > 256)
1560                 vgt_gs_per_es = 256;
1561
1562         WREG32(VGT_ES_PER_GS, 128);
1563         WREG32(VGT_GS_PER_ES, vgt_gs_per_es);
1564         WREG32(VGT_GS_PER_VS, 2);
1565
1566         /* more default values. 2D/3D driver should adjust as needed */
1567         WREG32(VGT_GS_VERTEX_REUSE, 16);
1568         WREG32(PA_SC_LINE_STIPPLE_STATE, 0);
1569         WREG32(VGT_STRMOUT_EN, 0);
1570         WREG32(SX_MISC, 0);
1571         WREG32(PA_SC_MODE_CNTL, 0);
1572         WREG32(PA_SC_EDGERULE, 0xaaaaaaaa);
1573         WREG32(PA_SC_AA_CONFIG, 0);
1574         WREG32(PA_SC_CLIPRECT_RULE, 0xffff);
1575         WREG32(PA_SC_LINE_STIPPLE, 0);
1576         WREG32(SPI_INPUT_Z, 0);
1577         WREG32(SPI_PS_IN_CONTROL_0, NUM_INTERP(2));
1578         WREG32(CB_COLOR7_FRAG, 0);
1579
1580         /* clear render buffer base addresses */
1581         WREG32(CB_COLOR0_BASE, 0);
1582         WREG32(CB_COLOR1_BASE, 0);
1583         WREG32(CB_COLOR2_BASE, 0);
1584         WREG32(CB_COLOR3_BASE, 0);
1585         WREG32(CB_COLOR4_BASE, 0);
1586         WREG32(CB_COLOR5_BASE, 0);
1587         WREG32(CB_COLOR6_BASE, 0);
1588         WREG32(CB_COLOR7_BASE, 0);
1589
1590         WREG32(TCP_CNTL, 0);
1591
1592         hdp_host_path_cntl = RREG32(HDP_HOST_PATH_CNTL);
1593         WREG32(HDP_HOST_PATH_CNTL, hdp_host_path_cntl);
1594
1595         WREG32(PA_SC_MULTI_CHIP_CNTL, 0);
1596
1597         WREG32(PA_CL_ENHANCE, (CLIP_VTX_REORDER_ENA |
1598                                           NUM_CLIP_SEQ(3)));
1599         WREG32(VC_ENHANCE, 0);
1600 }
1601
1602 void r700_vram_gtt_location(struct radeon_device *rdev, struct radeon_mc *mc)
1603 {
1604         u64 size_bf, size_af;
1605
1606         if (mc->mc_vram_size > 0xE0000000) {
1607                 /* leave room for at least 512M GTT */
1608                 dev_warn(rdev->dev, "limiting VRAM\n");
1609                 mc->real_vram_size = 0xE0000000;
1610                 mc->mc_vram_size = 0xE0000000;
1611         }
1612         if (rdev->flags & RADEON_IS_AGP) {
1613                 size_bf = mc->gtt_start;
1614                 size_af = mc->mc_mask - mc->gtt_end;
1615                 if (size_bf > size_af) {
1616                         if (mc->mc_vram_size > size_bf) {
1617                                 dev_warn(rdev->dev, "limiting VRAM\n");
1618                                 mc->real_vram_size = size_bf;
1619                                 mc->mc_vram_size = size_bf;
1620                         }
1621                         mc->vram_start = mc->gtt_start - mc->mc_vram_size;
1622                 } else {
1623                         if (mc->mc_vram_size > size_af) {
1624                                 dev_warn(rdev->dev, "limiting VRAM\n");
1625                                 mc->real_vram_size = size_af;
1626                                 mc->mc_vram_size = size_af;
1627                         }
1628                         mc->vram_start = mc->gtt_end + 1;
1629                 }
1630                 mc->vram_end = mc->vram_start + mc->mc_vram_size - 1;
1631                 dev_info(rdev->dev, "VRAM: %lluM 0x%08llX - 0x%08llX (%lluM used)\n",
1632                                 mc->mc_vram_size >> 20, mc->vram_start,
1633                                 mc->vram_end, mc->real_vram_size >> 20);
1634         } else {
1635                 radeon_vram_location(rdev, &rdev->mc, 0);
1636                 rdev->mc.gtt_base_align = 0;
1637                 radeon_gtt_location(rdev, mc);
1638         }
1639 }
1640
1641 static int rv770_mc_init(struct radeon_device *rdev)
1642 {
1643         u32 tmp;
1644         int chansize, numchan;
1645
1646         /* Get VRAM informations */
1647         rdev->mc.vram_is_ddr = true;
1648         tmp = RREG32(MC_ARB_RAMCFG);
1649         if (tmp & CHANSIZE_OVERRIDE) {
1650                 chansize = 16;
1651         } else if (tmp & CHANSIZE_MASK) {
1652                 chansize = 64;
1653         } else {
1654                 chansize = 32;
1655         }
1656         tmp = RREG32(MC_SHARED_CHMAP);
1657         switch ((tmp & NOOFCHAN_MASK) >> NOOFCHAN_SHIFT) {
1658         case 0:
1659         default:
1660                 numchan = 1;
1661                 break;
1662         case 1:
1663                 numchan = 2;
1664                 break;
1665         case 2:
1666                 numchan = 4;
1667                 break;
1668         case 3:
1669                 numchan = 8;
1670                 break;
1671         }
1672         rdev->mc.vram_width = numchan * chansize;
1673         /* Could aper size report 0 ? */
1674         rdev->mc.aper_base = pci_resource_start(rdev->pdev, 0);
1675         rdev->mc.aper_size = pci_resource_len(rdev->pdev, 0);
1676         /* Setup GPU memory space */
1677         rdev->mc.mc_vram_size = RREG32(CONFIG_MEMSIZE);
1678         rdev->mc.real_vram_size = RREG32(CONFIG_MEMSIZE);
1679         rdev->mc.visible_vram_size = rdev->mc.aper_size;
1680         r700_vram_gtt_location(rdev, &rdev->mc);
1681         radeon_update_bandwidth_info(rdev);
1682
1683         return 0;
1684 }
1685
1686 static void rv770_uvd_init(struct radeon_device *rdev)
1687 {
1688         int r;
1689
1690         if (!rdev->has_uvd)
1691                 return;
1692
1693         r = radeon_uvd_init(rdev);
1694         if (r) {
1695                 dev_err(rdev->dev, "failed UVD (%d) init.\n", r);
1696                 /*
1697                  * At this point rdev->uvd.vcpu_bo is NULL which trickles down
1698                  * to early fails uvd_v2_2_resume() and thus nothing happens
1699                  * there. So it is pointless to try to go through that code
1700                  * hence why we disable uvd here.
1701                  */
1702                 rdev->has_uvd = 0;
1703                 return;
1704         }
1705         rdev->ring[R600_RING_TYPE_UVD_INDEX].ring_obj = NULL;
1706         r600_ring_init(rdev, &rdev->ring[R600_RING_TYPE_UVD_INDEX], 4096);
1707 }
1708
1709 static void rv770_uvd_start(struct radeon_device *rdev)
1710 {
1711         int r;
1712
1713         if (!rdev->has_uvd)
1714                 return;
1715
1716         r = uvd_v2_2_resume(rdev);
1717         if (r) {
1718                 dev_err(rdev->dev, "failed UVD resume (%d).\n", r);
1719                 goto error;
1720         }
1721         r = radeon_fence_driver_start_ring(rdev, R600_RING_TYPE_UVD_INDEX);
1722         if (r) {
1723                 dev_err(rdev->dev, "failed initializing UVD fences (%d).\n", r);
1724                 goto error;
1725         }
1726         return;
1727
1728 error:
1729         rdev->ring[R600_RING_TYPE_UVD_INDEX].ring_size = 0;
1730 }
1731
1732 static void rv770_uvd_resume(struct radeon_device *rdev)
1733 {
1734         struct radeon_ring *ring;
1735         int r;
1736
1737         if (!rdev->has_uvd || !rdev->ring[R600_RING_TYPE_UVD_INDEX].ring_size)
1738                 return;
1739
1740         ring = &rdev->ring[R600_RING_TYPE_UVD_INDEX];
1741         r = radeon_ring_init(rdev, ring, ring->ring_size, 0, RADEON_CP_PACKET2);
1742         if (r) {
1743                 dev_err(rdev->dev, "failed initializing UVD ring (%d).\n", r);
1744                 return;
1745         }
1746         r = uvd_v1_0_init(rdev);
1747         if (r) {
1748                 dev_err(rdev->dev, "failed initializing UVD (%d).\n", r);
1749                 return;
1750         }
1751 }
1752
1753 static int rv770_startup(struct radeon_device *rdev)
1754 {
1755         struct radeon_ring *ring;
1756         int r;
1757
1758         /* enable pcie gen2 link */
1759         rv770_pcie_gen2_enable(rdev);
1760
1761         /* scratch needs to be initialized before MC */
1762         r = r600_vram_scratch_init(rdev);
1763         if (r)
1764                 return r;
1765
1766         rv770_mc_program(rdev);
1767
1768         if (rdev->flags & RADEON_IS_AGP) {
1769                 rv770_agp_enable(rdev);
1770         } else {
1771                 r = rv770_pcie_gart_enable(rdev);
1772                 if (r)
1773                         return r;
1774         }
1775
1776         rv770_gpu_init(rdev);
1777
1778         /* allocate wb buffer */
1779         r = radeon_wb_init(rdev);
1780         if (r)
1781                 return r;
1782
1783         r = radeon_fence_driver_start_ring(rdev, RADEON_RING_TYPE_GFX_INDEX);
1784         if (r) {
1785                 dev_err(rdev->dev, "failed initializing CP fences (%d).\n", r);
1786                 return r;
1787         }
1788
1789         r = radeon_fence_driver_start_ring(rdev, R600_RING_TYPE_DMA_INDEX);
1790         if (r) {
1791                 dev_err(rdev->dev, "failed initializing DMA fences (%d).\n", r);
1792                 return r;
1793         }
1794
1795         rv770_uvd_start(rdev);
1796
1797         /* Enable IRQ */
1798         if (!rdev->irq.installed) {
1799                 r = radeon_irq_kms_init(rdev);
1800                 if (r)
1801                         return r;
1802         }
1803
1804         r = r600_irq_init(rdev);
1805         if (r) {
1806                 DRM_ERROR("radeon: IH init failed (%d).\n", r);
1807                 radeon_irq_kms_fini(rdev);
1808                 return r;
1809         }
1810         r600_irq_set(rdev);
1811
1812         ring = &rdev->ring[RADEON_RING_TYPE_GFX_INDEX];
1813         r = radeon_ring_init(rdev, ring, ring->ring_size, RADEON_WB_CP_RPTR_OFFSET,
1814                              RADEON_CP_PACKET2);
1815         if (r)
1816                 return r;
1817
1818         ring = &rdev->ring[R600_RING_TYPE_DMA_INDEX];
1819         r = radeon_ring_init(rdev, ring, ring->ring_size, R600_WB_DMA_RPTR_OFFSET,
1820                              DMA_PACKET(DMA_PACKET_NOP, 0, 0, 0));
1821         if (r)
1822                 return r;
1823
1824         r = rv770_cp_load_microcode(rdev);
1825         if (r)
1826                 return r;
1827         r = r600_cp_resume(rdev);
1828         if (r)
1829                 return r;
1830
1831         r = r600_dma_resume(rdev);
1832         if (r)
1833                 return r;
1834
1835         rv770_uvd_resume(rdev);
1836
1837         r = radeon_ib_pool_init(rdev);
1838         if (r) {
1839                 dev_err(rdev->dev, "IB initialization failed (%d).\n", r);
1840                 return r;
1841         }
1842
1843         r = radeon_audio_init(rdev);
1844         if (r) {
1845                 DRM_ERROR("radeon: audio init failed\n");
1846                 return r;
1847         }
1848
1849         return 0;
1850 }
1851
1852 int rv770_resume(struct radeon_device *rdev)
1853 {
1854         int r;
1855
1856         /* Do not reset GPU before posting, on rv770 hw unlike on r500 hw,
1857          * posting will perform necessary task to bring back GPU into good
1858          * shape.
1859          */
1860         /* post card */
1861         atom_asic_init(rdev->mode_info.atom_context);
1862
1863         /* init golden registers */
1864         rv770_init_golden_registers(rdev);
1865
1866         if (rdev->pm.pm_method == PM_METHOD_DPM)
1867                 radeon_pm_resume(rdev);
1868
1869         rdev->accel_working = true;
1870         r = rv770_startup(rdev);
1871         if (r) {
1872                 DRM_ERROR("r600 startup failed on resume\n");
1873                 rdev->accel_working = false;
1874                 return r;
1875         }
1876
1877         return r;
1878
1879 }
1880
1881 int rv770_suspend(struct radeon_device *rdev)
1882 {
1883         radeon_pm_suspend(rdev);
1884         radeon_audio_fini(rdev);
1885         if (rdev->has_uvd) {
1886                 uvd_v1_0_fini(rdev);
1887                 radeon_uvd_suspend(rdev);
1888         }
1889         r700_cp_stop(rdev);
1890         r600_dma_stop(rdev);
1891         r600_irq_suspend(rdev);
1892         radeon_wb_disable(rdev);
1893         rv770_pcie_gart_disable(rdev);
1894
1895         return 0;
1896 }
1897
1898 /* Plan is to move initialization in that function and use
1899  * helper function so that radeon_device_init pretty much
1900  * do nothing more than calling asic specific function. This
1901  * should also allow to remove a bunch of callback function
1902  * like vram_info.
1903  */
1904 int rv770_init(struct radeon_device *rdev)
1905 {
1906         int r;
1907
1908         /* Read BIOS */
1909         if (!radeon_get_bios(rdev)) {
1910                 if (ASIC_IS_AVIVO(rdev))
1911                         return -EINVAL;
1912         }
1913         /* Must be an ATOMBIOS */
1914         if (!rdev->is_atom_bios) {
1915                 dev_err(rdev->dev, "Expecting atombios for R600 GPU\n");
1916                 return -EINVAL;
1917         }
1918         r = radeon_atombios_init(rdev);
1919         if (r)
1920                 return r;
1921         /* Post card if necessary */
1922         if (!radeon_card_posted(rdev)) {
1923                 if (!rdev->bios) {
1924                         dev_err(rdev->dev, "Card not posted and no BIOS - ignoring\n");
1925                         return -EINVAL;
1926                 }
1927                 DRM_INFO("GPU not posted. posting now...\n");
1928                 atom_asic_init(rdev->mode_info.atom_context);
1929         }
1930         /* init golden registers */
1931         rv770_init_golden_registers(rdev);
1932         /* Initialize scratch registers */
1933         r600_scratch_init(rdev);
1934         /* Initialize surface registers */
1935         radeon_surface_init(rdev);
1936         /* Initialize clocks */
1937         radeon_get_clock_info(rdev->ddev);
1938         /* Fence driver */
1939         r = radeon_fence_driver_init(rdev);
1940         if (r)
1941                 return r;
1942         /* initialize AGP */
1943         if (rdev->flags & RADEON_IS_AGP) {
1944                 r = radeon_agp_init(rdev);
1945                 if (r)
1946                         radeon_agp_disable(rdev);
1947         }
1948         r = rv770_mc_init(rdev);
1949         if (r)
1950                 return r;
1951         /* Memory manager */
1952         r = radeon_bo_init(rdev);
1953         if (r)
1954                 return r;
1955
1956         if (!rdev->me_fw || !rdev->pfp_fw || !rdev->rlc_fw) {
1957                 r = r600_init_microcode(rdev);
1958                 if (r) {
1959                         DRM_ERROR("Failed to load firmware!\n");
1960                         return r;
1961                 }
1962         }
1963
1964         /* Initialize power management */
1965         radeon_pm_init(rdev);
1966
1967         rdev->ring[RADEON_RING_TYPE_GFX_INDEX].ring_obj = NULL;
1968         r600_ring_init(rdev, &rdev->ring[RADEON_RING_TYPE_GFX_INDEX], 1024 * 1024);
1969
1970         rdev->ring[R600_RING_TYPE_DMA_INDEX].ring_obj = NULL;
1971         r600_ring_init(rdev, &rdev->ring[R600_RING_TYPE_DMA_INDEX], 64 * 1024);
1972
1973         rv770_uvd_init(rdev);
1974
1975         rdev->ih.ring_obj = NULL;
1976         r600_ih_ring_init(rdev, 64 * 1024);
1977
1978         r = r600_pcie_gart_init(rdev);
1979         if (r)
1980                 return r;
1981
1982         rdev->accel_working = true;
1983         r = rv770_startup(rdev);
1984         if (r) {
1985                 dev_err(rdev->dev, "disabling GPU acceleration\n");
1986                 r700_cp_fini(rdev);
1987                 r600_dma_fini(rdev);
1988                 r600_irq_fini(rdev);
1989                 radeon_wb_fini(rdev);
1990                 radeon_ib_pool_fini(rdev);
1991                 radeon_irq_kms_fini(rdev);
1992                 rv770_pcie_gart_fini(rdev);
1993                 rdev->accel_working = false;
1994         }
1995
1996         return 0;
1997 }
1998
1999 void rv770_fini(struct radeon_device *rdev)
2000 {
2001         radeon_pm_fini(rdev);
2002         r700_cp_fini(rdev);
2003         r600_dma_fini(rdev);
2004         r600_irq_fini(rdev);
2005         radeon_wb_fini(rdev);
2006         radeon_ib_pool_fini(rdev);
2007         radeon_irq_kms_fini(rdev);
2008         uvd_v1_0_fini(rdev);
2009         radeon_uvd_fini(rdev);
2010         rv770_pcie_gart_fini(rdev);
2011         r600_vram_scratch_fini(rdev);
2012         radeon_gem_fini(rdev);
2013         radeon_fence_driver_fini(rdev);
2014         radeon_agp_fini(rdev);
2015         radeon_bo_fini(rdev);
2016         radeon_atombios_fini(rdev);
2017         kfree(rdev->bios);
2018         rdev->bios = NULL;
2019 }
2020
2021 static void rv770_pcie_gen2_enable(struct radeon_device *rdev)
2022 {
2023         u32 link_width_cntl, lanes, speed_cntl, tmp;
2024         u16 link_cntl2;
2025
2026         if (radeon_pcie_gen2 == 0)
2027                 return;
2028
2029         if (rdev->flags & RADEON_IS_IGP)
2030                 return;
2031
2032         if (!(rdev->flags & RADEON_IS_PCIE))
2033                 return;
2034
2035         /* x2 cards have a special sequence */
2036         if (ASIC_IS_X2(rdev))
2037                 return;
2038
2039         if ((rdev->pdev->bus->max_bus_speed != PCIE_SPEED_5_0GT) &&
2040                 (rdev->pdev->bus->max_bus_speed != PCIE_SPEED_8_0GT))
2041                 return;
2042
2043         DRM_INFO("enabling PCIE gen 2 link speeds, disable with radeon.pcie_gen2=0\n");
2044
2045         /* advertise upconfig capability */
2046         link_width_cntl = RREG32_PCIE_PORT(PCIE_LC_LINK_WIDTH_CNTL);
2047         link_width_cntl &= ~LC_UPCONFIGURE_DIS;
2048         WREG32_PCIE_PORT(PCIE_LC_LINK_WIDTH_CNTL, link_width_cntl);
2049         link_width_cntl = RREG32_PCIE_PORT(PCIE_LC_LINK_WIDTH_CNTL);
2050         if (link_width_cntl & LC_RENEGOTIATION_SUPPORT) {
2051                 lanes = (link_width_cntl & LC_LINK_WIDTH_RD_MASK) >> LC_LINK_WIDTH_RD_SHIFT;
2052                 link_width_cntl &= ~(LC_LINK_WIDTH_MASK |
2053                                      LC_RECONFIG_ARC_MISSING_ESCAPE);
2054                 link_width_cntl |= lanes | LC_RECONFIG_NOW |
2055                         LC_RENEGOTIATE_EN | LC_UPCONFIGURE_SUPPORT;
2056                 WREG32_PCIE_PORT(PCIE_LC_LINK_WIDTH_CNTL, link_width_cntl);
2057         } else {
2058                 link_width_cntl |= LC_UPCONFIGURE_DIS;
2059                 WREG32_PCIE_PORT(PCIE_LC_LINK_WIDTH_CNTL, link_width_cntl);
2060         }
2061
2062         speed_cntl = RREG32_PCIE_PORT(PCIE_LC_SPEED_CNTL);
2063         if ((speed_cntl & LC_OTHER_SIDE_EVER_SENT_GEN2) &&
2064             (speed_cntl & LC_OTHER_SIDE_SUPPORTS_GEN2)) {
2065
2066                 tmp = RREG32(0x541c);
2067                 WREG32(0x541c, tmp | 0x8);
2068                 WREG32(MM_CFGREGS_CNTL, MM_WR_TO_CFG_EN);
2069                 link_cntl2 = RREG16(0x4088);
2070                 link_cntl2 &= ~TARGET_LINK_SPEED_MASK;
2071                 link_cntl2 |= 0x2;
2072                 WREG16(0x4088, link_cntl2);
2073                 WREG32(MM_CFGREGS_CNTL, 0);
2074
2075                 speed_cntl = RREG32_PCIE_PORT(PCIE_LC_SPEED_CNTL);
2076                 speed_cntl &= ~LC_TARGET_LINK_SPEED_OVERRIDE_EN;
2077                 WREG32_PCIE_PORT(PCIE_LC_SPEED_CNTL, speed_cntl);
2078
2079                 speed_cntl = RREG32_PCIE_PORT(PCIE_LC_SPEED_CNTL);
2080                 speed_cntl |= LC_CLR_FAILED_SPD_CHANGE_CNT;
2081                 WREG32_PCIE_PORT(PCIE_LC_SPEED_CNTL, speed_cntl);
2082
2083                 speed_cntl = RREG32_PCIE_PORT(PCIE_LC_SPEED_CNTL);
2084                 speed_cntl &= ~LC_CLR_FAILED_SPD_CHANGE_CNT;
2085                 WREG32_PCIE_PORT(PCIE_LC_SPEED_CNTL, speed_cntl);
2086
2087                 speed_cntl = RREG32_PCIE_PORT(PCIE_LC_SPEED_CNTL);
2088                 speed_cntl |= LC_GEN2_EN_STRAP;
2089                 WREG32_PCIE_PORT(PCIE_LC_SPEED_CNTL, speed_cntl);
2090
2091         } else {
2092                 link_width_cntl = RREG32_PCIE_PORT(PCIE_LC_LINK_WIDTH_CNTL);
2093                 /* XXX: only disable it if gen1 bridge vendor == 0x111d or 0x1106 */
2094                 if (1)
2095                         link_width_cntl |= LC_UPCONFIGURE_DIS;
2096                 else
2097                         link_width_cntl &= ~LC_UPCONFIGURE_DIS;
2098                 WREG32_PCIE_PORT(PCIE_LC_LINK_WIDTH_CNTL, link_width_cntl);
2099         }
2100 }