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