Subversion Repositories Kolibri OS

Rev

Rev 5078 | Go to most recent revision | Only display areas with differences | Regard whitespace | Details | Blame | Last modification | View Log | RSS feed

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