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