Subversion Repositories Kolibri OS

Rev

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

Rev 3764 Rev 5078
1
/*
1
/*
2
 * Copyright 2010 Advanced Micro Devices, Inc.
2
 * Copyright 2010 Advanced Micro Devices, Inc.
3
 *
3
 *
4
 * Permission is hereby granted, free of charge, to any person obtaining a
4
 * Permission is hereby granted, free of charge, to any person obtaining a
5
 * copy of this software and associated documentation files (the "Software"),
5
 * copy of this software and associated documentation files (the "Software"),
6
 * to deal in the Software without restriction, including without limitation
6
 * to deal in the Software without restriction, including without limitation
7
 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
7
 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
8
 * and/or sell copies of the Software, and to permit persons to whom the
8
 * and/or sell copies of the Software, and to permit persons to whom the
9
 * Software is furnished to do so, subject to the following conditions:
9
 * Software is furnished to do so, subject to the following conditions:
10
 *
10
 *
11
 * The above copyright notice and this permission notice shall be included in
11
 * The above copyright notice and this permission notice shall be included in
12
 * all copies or substantial portions of the Software.
12
 * all copies or substantial portions of the Software.
13
 *
13
 *
14
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
14
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
15
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
15
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
16
 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
16
 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
17
 * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
17
 * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
18
 * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
18
 * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
19
 * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
19
 * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
20
 * OTHER DEALINGS IN THE SOFTWARE.
20
 * OTHER DEALINGS IN THE SOFTWARE.
21
 *
21
 *
22
 * Authors: Alex Deucher
22
 * Authors: Alex Deucher
23
 */
23
 */
24
#include 
24
#include 
25
//#include 
-
 
26
#include 
25
#include 
27
#include 
26
#include 
28
#include 
27
#include 
29
#include "radeon.h"
28
#include "radeon.h"
30
#include "radeon_asic.h"
29
#include "radeon_asic.h"
31
#include 
30
#include 
32
#include "nid.h"
31
#include "nid.h"
33
#include "atom.h"
32
#include "atom.h"
34
#include "ni_reg.h"
33
#include "ni_reg.h"
35
#include "cayman_blit_shaders.h"
34
#include "cayman_blit_shaders.h"
-
 
35
#include "radeon_ucode.h"
-
 
36
#include "clearstate_cayman.h"
-
 
37
 
-
 
38
static const u32 tn_rlc_save_restore_register_list[] =
-
 
39
{
-
 
40
	0x98fc,
-
 
41
	0x98f0,
-
 
42
	0x9834,
-
 
43
	0x9838,
-
 
44
	0x9870,
-
 
45
	0x9874,
-
 
46
	0x8a14,
-
 
47
	0x8b24,
-
 
48
	0x8bcc,
-
 
49
	0x8b10,
-
 
50
	0x8c30,
-
 
51
	0x8d00,
-
 
52
	0x8d04,
-
 
53
	0x8c00,
-
 
54
	0x8c04,
-
 
55
	0x8c10,
-
 
56
	0x8c14,
-
 
57
	0x8d8c,
-
 
58
	0x8cf0,
-
 
59
	0x8e38,
-
 
60
	0x9508,
-
 
61
	0x9688,
-
 
62
	0x9608,
-
 
63
	0x960c,
-
 
64
	0x9610,
-
 
65
	0x9614,
-
 
66
	0x88c4,
-
 
67
	0x8978,
-
 
68
	0x88d4,
-
 
69
	0x900c,
-
 
70
	0x9100,
-
 
71
	0x913c,
-
 
72
	0x90e8,
-
 
73
	0x9354,
-
 
74
	0xa008,
-
 
75
	0x98f8,
-
 
76
	0x9148,
-
 
77
	0x914c,
-
 
78
	0x3f94,
-
 
79
	0x98f4,
-
 
80
	0x9b7c,
-
 
81
	0x3f8c,
-
 
82
	0x8950,
-
 
83
	0x8954,
-
 
84
	0x8a18,
-
 
85
	0x8b28,
-
 
86
	0x9144,
-
 
87
	0x3f90,
-
 
88
	0x915c,
-
 
89
	0x9160,
-
 
90
	0x9178,
-
 
91
	0x917c,
-
 
92
	0x9180,
-
 
93
	0x918c,
-
 
94
	0x9190,
-
 
95
	0x9194,
-
 
96
	0x9198,
-
 
97
	0x919c,
-
 
98
	0x91a8,
-
 
99
	0x91ac,
-
 
100
	0x91b0,
-
 
101
	0x91b4,
-
 
102
	0x91b8,
-
 
103
	0x91c4,
-
 
104
	0x91c8,
-
 
105
	0x91cc,
-
 
106
	0x91d0,
-
 
107
	0x91d4,
-
 
108
	0x91e0,
-
 
109
	0x91e4,
-
 
110
	0x91ec,
-
 
111
	0x91f0,
-
 
112
	0x91f4,
-
 
113
	0x9200,
-
 
114
	0x9204,
-
 
115
	0x929c,
-
 
116
	0x8030,
-
 
117
	0x9150,
-
 
118
	0x9a60,
-
 
119
	0x920c,
-
 
120
	0x9210,
-
 
121
	0x9228,
-
 
122
	0x922c,
-
 
123
	0x9244,
-
 
124
	0x9248,
-
 
125
	0x91e8,
-
 
126
	0x9294,
-
 
127
	0x9208,
-
 
128
	0x9224,
-
 
129
	0x9240,
-
 
130
	0x9220,
-
 
131
	0x923c,
-
 
132
	0x9258,
-
 
133
	0x9744,
-
 
134
	0xa200,
-
 
135
	0xa204,
-
 
136
	0xa208,
-
 
137
	0xa20c,
-
 
138
	0x8d58,
-
 
139
	0x9030,
-
 
140
	0x9034,
-
 
141
	0x9038,
-
 
142
	0x903c,
-
 
143
	0x9040,
-
 
144
	0x9654,
-
 
145
	0x897c,
-
 
146
	0xa210,
-
 
147
	0xa214,
-
 
148
	0x9868,
-
 
149
	0xa02c,
-
 
150
	0x9664,
-
 
151
	0x9698,
-
 
152
	0x949c,
-
 
153
	0x8e10,
-
 
154
	0x8e18,
-
 
155
	0x8c50,
-
 
156
	0x8c58,
-
 
157
	0x8c60,
-
 
158
	0x8c68,
-
 
159
	0x89b4,
-
 
160
	0x9830,
-
 
161
	0x802c,
-
 
162
};
36
 
163
 
37
extern bool evergreen_is_display_hung(struct radeon_device *rdev);
164
extern bool evergreen_is_display_hung(struct radeon_device *rdev);
38
extern void evergreen_print_gpu_status_regs(struct radeon_device *rdev);
165
extern void evergreen_print_gpu_status_regs(struct radeon_device *rdev);
39
extern void evergreen_mc_stop(struct radeon_device *rdev, struct evergreen_mc_save *save);
166
extern void evergreen_mc_stop(struct radeon_device *rdev, struct evergreen_mc_save *save);
40
extern void evergreen_mc_resume(struct radeon_device *rdev, struct evergreen_mc_save *save);
167
extern void evergreen_mc_resume(struct radeon_device *rdev, struct evergreen_mc_save *save);
41
extern int evergreen_mc_wait_for_idle(struct radeon_device *rdev);
168
extern int evergreen_mc_wait_for_idle(struct radeon_device *rdev);
42
extern void evergreen_mc_program(struct radeon_device *rdev);
169
extern void evergreen_mc_program(struct radeon_device *rdev);
43
extern void evergreen_irq_suspend(struct radeon_device *rdev);
170
extern void evergreen_irq_suspend(struct radeon_device *rdev);
44
extern int evergreen_mc_init(struct radeon_device *rdev);
171
extern int evergreen_mc_init(struct radeon_device *rdev);
45
extern void evergreen_fix_pci_max_read_req_size(struct radeon_device *rdev);
172
extern void evergreen_fix_pci_max_read_req_size(struct radeon_device *rdev);
46
extern void evergreen_pcie_gen2_enable(struct radeon_device *rdev);
173
extern void evergreen_pcie_gen2_enable(struct radeon_device *rdev);
47
extern void si_rlc_fini(struct radeon_device *rdev);
174
extern void evergreen_program_aspm(struct radeon_device *rdev);
48
extern int si_rlc_init(struct radeon_device *rdev);
175
extern void sumo_rlc_fini(struct radeon_device *rdev);
49
 
-
 
50
#define EVERGREEN_PFP_UCODE_SIZE 1120
176
extern int sumo_rlc_init(struct radeon_device *rdev);
51
#define EVERGREEN_PM4_UCODE_SIZE 1376
177
extern void evergreen_gpu_pci_config_reset(struct radeon_device *rdev);
52
#define EVERGREEN_RLC_UCODE_SIZE 768
-
 
53
#define BTC_MC_UCODE_SIZE 6024
-
 
54
 
-
 
55
#define CAYMAN_PFP_UCODE_SIZE 2176
-
 
56
#define CAYMAN_PM4_UCODE_SIZE 2176
-
 
57
#define CAYMAN_RLC_UCODE_SIZE 1024
-
 
58
#define CAYMAN_MC_UCODE_SIZE 6037
-
 
59
 
-
 
60
#define ARUBA_RLC_UCODE_SIZE 1536
-
 
61
 
178
 
62
/* Firmware Names */
179
/* Firmware Names */
63
MODULE_FIRMWARE("radeon/BARTS_pfp.bin");
180
MODULE_FIRMWARE("radeon/BARTS_pfp.bin");
64
MODULE_FIRMWARE("radeon/BARTS_me.bin");
181
MODULE_FIRMWARE("radeon/BARTS_me.bin");
65
MODULE_FIRMWARE("radeon/BARTS_mc.bin");
182
MODULE_FIRMWARE("radeon/BARTS_mc.bin");
-
 
183
MODULE_FIRMWARE("radeon/BARTS_smc.bin");
66
MODULE_FIRMWARE("radeon/BTC_rlc.bin");
184
MODULE_FIRMWARE("radeon/BTC_rlc.bin");
67
MODULE_FIRMWARE("radeon/TURKS_pfp.bin");
185
MODULE_FIRMWARE("radeon/TURKS_pfp.bin");
68
MODULE_FIRMWARE("radeon/TURKS_me.bin");
186
MODULE_FIRMWARE("radeon/TURKS_me.bin");
69
MODULE_FIRMWARE("radeon/TURKS_mc.bin");
187
MODULE_FIRMWARE("radeon/TURKS_mc.bin");
-
 
188
MODULE_FIRMWARE("radeon/TURKS_smc.bin");
70
MODULE_FIRMWARE("radeon/CAICOS_pfp.bin");
189
MODULE_FIRMWARE("radeon/CAICOS_pfp.bin");
71
MODULE_FIRMWARE("radeon/CAICOS_me.bin");
190
MODULE_FIRMWARE("radeon/CAICOS_me.bin");
72
MODULE_FIRMWARE("radeon/CAICOS_mc.bin");
191
MODULE_FIRMWARE("radeon/CAICOS_mc.bin");
-
 
192
MODULE_FIRMWARE("radeon/CAICOS_smc.bin");
73
MODULE_FIRMWARE("radeon/CAYMAN_pfp.bin");
193
MODULE_FIRMWARE("radeon/CAYMAN_pfp.bin");
74
MODULE_FIRMWARE("radeon/CAYMAN_me.bin");
194
MODULE_FIRMWARE("radeon/CAYMAN_me.bin");
75
MODULE_FIRMWARE("radeon/CAYMAN_mc.bin");
195
MODULE_FIRMWARE("radeon/CAYMAN_mc.bin");
76
MODULE_FIRMWARE("radeon/CAYMAN_rlc.bin");
196
MODULE_FIRMWARE("radeon/CAYMAN_rlc.bin");
-
 
197
MODULE_FIRMWARE("radeon/CAYMAN_smc.bin");
77
MODULE_FIRMWARE("radeon/ARUBA_pfp.bin");
198
MODULE_FIRMWARE("radeon/ARUBA_pfp.bin");
78
MODULE_FIRMWARE("radeon/ARUBA_me.bin");
199
MODULE_FIRMWARE("radeon/ARUBA_me.bin");
79
MODULE_FIRMWARE("radeon/ARUBA_rlc.bin");
200
MODULE_FIRMWARE("radeon/ARUBA_rlc.bin");
80
 
201
 
81
 
202
 
82
static const u32 cayman_golden_registers2[] =
203
static const u32 cayman_golden_registers2[] =
83
{
204
{
84
	0x3e5c, 0xffffffff, 0x00000000,
205
	0x3e5c, 0xffffffff, 0x00000000,
85
	0x3e48, 0xffffffff, 0x00000000,
206
	0x3e48, 0xffffffff, 0x00000000,
86
	0x3e4c, 0xffffffff, 0x00000000,
207
	0x3e4c, 0xffffffff, 0x00000000,
87
	0x3e64, 0xffffffff, 0x00000000,
208
	0x3e64, 0xffffffff, 0x00000000,
88
	0x3e50, 0xffffffff, 0x00000000,
209
	0x3e50, 0xffffffff, 0x00000000,
89
	0x3e60, 0xffffffff, 0x00000000
210
	0x3e60, 0xffffffff, 0x00000000
90
};
211
};
91
 
212
 
92
static const u32 cayman_golden_registers[] =
213
static const u32 cayman_golden_registers[] =
93
{
214
{
94
	0x5eb4, 0xffffffff, 0x00000002,
215
	0x5eb4, 0xffffffff, 0x00000002,
95
	0x5e78, 0x8f311ff1, 0x001000f0,
216
	0x5e78, 0x8f311ff1, 0x001000f0,
96
	0x3f90, 0xffff0000, 0xff000000,
217
	0x3f90, 0xffff0000, 0xff000000,
97
	0x9148, 0xffff0000, 0xff000000,
218
	0x9148, 0xffff0000, 0xff000000,
98
	0x3f94, 0xffff0000, 0xff000000,
219
	0x3f94, 0xffff0000, 0xff000000,
99
	0x914c, 0xffff0000, 0xff000000,
220
	0x914c, 0xffff0000, 0xff000000,
100
	0xc78, 0x00000080, 0x00000080,
221
	0xc78, 0x00000080, 0x00000080,
101
	0xbd4, 0x70073777, 0x00011003,
222
	0xbd4, 0x70073777, 0x00011003,
102
	0xd02c, 0xbfffff1f, 0x08421000,
223
	0xd02c, 0xbfffff1f, 0x08421000,
103
	0xd0b8, 0x73773777, 0x02011003,
224
	0xd0b8, 0x73773777, 0x02011003,
104
	0x5bc0, 0x00200000, 0x50100000,
225
	0x5bc0, 0x00200000, 0x50100000,
105
	0x98f8, 0x33773777, 0x02011003,
226
	0x98f8, 0x33773777, 0x02011003,
106
	0x98fc, 0xffffffff, 0x76541032,
227
	0x98fc, 0xffffffff, 0x76541032,
107
	0x7030, 0x31000311, 0x00000011,
228
	0x7030, 0x31000311, 0x00000011,
108
	0x2f48, 0x33773777, 0x42010001,
229
	0x2f48, 0x33773777, 0x42010001,
109
	0x6b28, 0x00000010, 0x00000012,
230
	0x6b28, 0x00000010, 0x00000012,
110
	0x7728, 0x00000010, 0x00000012,
231
	0x7728, 0x00000010, 0x00000012,
111
	0x10328, 0x00000010, 0x00000012,
232
	0x10328, 0x00000010, 0x00000012,
112
	0x10f28, 0x00000010, 0x00000012,
233
	0x10f28, 0x00000010, 0x00000012,
113
	0x11b28, 0x00000010, 0x00000012,
234
	0x11b28, 0x00000010, 0x00000012,
114
	0x12728, 0x00000010, 0x00000012,
235
	0x12728, 0x00000010, 0x00000012,
115
	0x240c, 0x000007ff, 0x00000000,
236
	0x240c, 0x000007ff, 0x00000000,
116
	0x8a14, 0xf000001f, 0x00000007,
237
	0x8a14, 0xf000001f, 0x00000007,
117
	0x8b24, 0x3fff3fff, 0x00ff0fff,
238
	0x8b24, 0x3fff3fff, 0x00ff0fff,
118
	0x8b10, 0x0000ff0f, 0x00000000,
239
	0x8b10, 0x0000ff0f, 0x00000000,
119
	0x28a4c, 0x07ffffff, 0x06000000,
240
	0x28a4c, 0x07ffffff, 0x06000000,
120
	0x10c, 0x00000001, 0x00010003,
241
	0x10c, 0x00000001, 0x00010003,
121
	0xa02c, 0xffffffff, 0x0000009b,
242
	0xa02c, 0xffffffff, 0x0000009b,
122
	0x913c, 0x0000010f, 0x01000100,
243
	0x913c, 0x0000010f, 0x01000100,
123
	0x8c04, 0xf8ff00ff, 0x40600060,
244
	0x8c04, 0xf8ff00ff, 0x40600060,
124
	0x28350, 0x00000f01, 0x00000000,
245
	0x28350, 0x00000f01, 0x00000000,
125
	0x9508, 0x3700001f, 0x00000002,
246
	0x9508, 0x3700001f, 0x00000002,
126
	0x960c, 0xffffffff, 0x54763210,
247
	0x960c, 0xffffffff, 0x54763210,
127
	0x88c4, 0x001f3ae3, 0x00000082,
248
	0x88c4, 0x001f3ae3, 0x00000082,
128
	0x88d0, 0xffffffff, 0x0f40df40,
249
	0x88d0, 0xffffffff, 0x0f40df40,
129
	0x88d4, 0x0000001f, 0x00000010,
250
	0x88d4, 0x0000001f, 0x00000010,
130
	0x8974, 0xffffffff, 0x00000000
251
	0x8974, 0xffffffff, 0x00000000
131
};
252
};
132
 
253
 
133
static const u32 dvst_golden_registers2[] =
254
static const u32 dvst_golden_registers2[] =
134
{
255
{
135
	0x8f8, 0xffffffff, 0,
256
	0x8f8, 0xffffffff, 0,
136
	0x8fc, 0x00380000, 0,
257
	0x8fc, 0x00380000, 0,
137
	0x8f8, 0xffffffff, 1,
258
	0x8f8, 0xffffffff, 1,
138
	0x8fc, 0x0e000000, 0
259
	0x8fc, 0x0e000000, 0
139
};
260
};
140
 
261
 
141
static const u32 dvst_golden_registers[] =
262
static const u32 dvst_golden_registers[] =
142
{
263
{
143
	0x690, 0x3fff3fff, 0x20c00033,
264
	0x690, 0x3fff3fff, 0x20c00033,
144
	0x918c, 0x0fff0fff, 0x00010006,
265
	0x918c, 0x0fff0fff, 0x00010006,
145
	0x91a8, 0x0fff0fff, 0x00010006,
266
	0x91a8, 0x0fff0fff, 0x00010006,
146
	0x9150, 0xffffdfff, 0x6e944040,
267
	0x9150, 0xffffdfff, 0x6e944040,
147
	0x917c, 0x0fff0fff, 0x00030002,
268
	0x917c, 0x0fff0fff, 0x00030002,
148
	0x9198, 0x0fff0fff, 0x00030002,
269
	0x9198, 0x0fff0fff, 0x00030002,
149
	0x915c, 0x0fff0fff, 0x00010000,
270
	0x915c, 0x0fff0fff, 0x00010000,
150
	0x3f90, 0xffff0001, 0xff000000,
271
	0x3f90, 0xffff0001, 0xff000000,
151
	0x9178, 0x0fff0fff, 0x00070000,
272
	0x9178, 0x0fff0fff, 0x00070000,
152
	0x9194, 0x0fff0fff, 0x00070000,
273
	0x9194, 0x0fff0fff, 0x00070000,
153
	0x9148, 0xffff0001, 0xff000000,
274
	0x9148, 0xffff0001, 0xff000000,
154
	0x9190, 0x0fff0fff, 0x00090008,
275
	0x9190, 0x0fff0fff, 0x00090008,
155
	0x91ac, 0x0fff0fff, 0x00090008,
276
	0x91ac, 0x0fff0fff, 0x00090008,
156
	0x3f94, 0xffff0000, 0xff000000,
277
	0x3f94, 0xffff0000, 0xff000000,
157
	0x914c, 0xffff0000, 0xff000000,
278
	0x914c, 0xffff0000, 0xff000000,
158
	0x929c, 0x00000fff, 0x00000001,
279
	0x929c, 0x00000fff, 0x00000001,
159
	0x55e4, 0xff607fff, 0xfc000100,
280
	0x55e4, 0xff607fff, 0xfc000100,
160
	0x8a18, 0xff000fff, 0x00000100,
281
	0x8a18, 0xff000fff, 0x00000100,
161
	0x8b28, 0xff000fff, 0x00000100,
282
	0x8b28, 0xff000fff, 0x00000100,
162
	0x9144, 0xfffc0fff, 0x00000100,
283
	0x9144, 0xfffc0fff, 0x00000100,
163
	0x6ed8, 0x00010101, 0x00010000,
284
	0x6ed8, 0x00010101, 0x00010000,
164
	0x9830, 0xffffffff, 0x00000000,
285
	0x9830, 0xffffffff, 0x00000000,
165
	0x9834, 0xf00fffff, 0x00000400,
286
	0x9834, 0xf00fffff, 0x00000400,
166
	0x9838, 0xfffffffe, 0x00000000,
287
	0x9838, 0xfffffffe, 0x00000000,
167
	0xd0c0, 0xff000fff, 0x00000100,
288
	0xd0c0, 0xff000fff, 0x00000100,
168
	0xd02c, 0xbfffff1f, 0x08421000,
289
	0xd02c, 0xbfffff1f, 0x08421000,
169
	0xd0b8, 0x73773777, 0x12010001,
290
	0xd0b8, 0x73773777, 0x12010001,
170
	0x5bb0, 0x000000f0, 0x00000070,
291
	0x5bb0, 0x000000f0, 0x00000070,
171
	0x98f8, 0x73773777, 0x12010001,
292
	0x98f8, 0x73773777, 0x12010001,
172
	0x98fc, 0xffffffff, 0x00000010,
293
	0x98fc, 0xffffffff, 0x00000010,
173
	0x9b7c, 0x00ff0000, 0x00fc0000,
294
	0x9b7c, 0x00ff0000, 0x00fc0000,
174
	0x8030, 0x00001f0f, 0x0000100a,
295
	0x8030, 0x00001f0f, 0x0000100a,
175
	0x2f48, 0x73773777, 0x12010001,
296
	0x2f48, 0x73773777, 0x12010001,
176
	0x2408, 0x00030000, 0x000c007f,
297
	0x2408, 0x00030000, 0x000c007f,
177
	0x8a14, 0xf000003f, 0x00000007,
298
	0x8a14, 0xf000003f, 0x00000007,
178
	0x8b24, 0x3fff3fff, 0x00ff0fff,
299
	0x8b24, 0x3fff3fff, 0x00ff0fff,
179
	0x8b10, 0x0000ff0f, 0x00000000,
300
	0x8b10, 0x0000ff0f, 0x00000000,
180
	0x28a4c, 0x07ffffff, 0x06000000,
301
	0x28a4c, 0x07ffffff, 0x06000000,
181
	0x4d8, 0x00000fff, 0x00000100,
302
	0x4d8, 0x00000fff, 0x00000100,
182
	0xa008, 0xffffffff, 0x00010000,
303
	0xa008, 0xffffffff, 0x00010000,
183
	0x913c, 0xffff03ff, 0x01000100,
304
	0x913c, 0xffff03ff, 0x01000100,
184
	0x8c00, 0x000000ff, 0x00000003,
305
	0x8c00, 0x000000ff, 0x00000003,
185
	0x8c04, 0xf8ff00ff, 0x40600060,
306
	0x8c04, 0xf8ff00ff, 0x40600060,
186
	0x8cf0, 0x1fff1fff, 0x08e00410,
307
	0x8cf0, 0x1fff1fff, 0x08e00410,
187
	0x28350, 0x00000f01, 0x00000000,
308
	0x28350, 0x00000f01, 0x00000000,
188
	0x9508, 0xf700071f, 0x00000002,
309
	0x9508, 0xf700071f, 0x00000002,
189
	0x960c, 0xffffffff, 0x54763210,
310
	0x960c, 0xffffffff, 0x54763210,
190
	0x20ef8, 0x01ff01ff, 0x00000002,
311
	0x20ef8, 0x01ff01ff, 0x00000002,
191
	0x20e98, 0xfffffbff, 0x00200000,
312
	0x20e98, 0xfffffbff, 0x00200000,
192
	0x2015c, 0xffffffff, 0x00000f40,
313
	0x2015c, 0xffffffff, 0x00000f40,
193
	0x88c4, 0x001f3ae3, 0x00000082,
314
	0x88c4, 0x001f3ae3, 0x00000082,
194
	0x8978, 0x3fffffff, 0x04050140,
315
	0x8978, 0x3fffffff, 0x04050140,
195
	0x88d4, 0x0000001f, 0x00000010,
316
	0x88d4, 0x0000001f, 0x00000010,
196
	0x8974, 0xffffffff, 0x00000000
317
	0x8974, 0xffffffff, 0x00000000
197
};
318
};
198
 
319
 
199
static const u32 scrapper_golden_registers[] =
320
static const u32 scrapper_golden_registers[] =
200
{
321
{
201
	0x690, 0x3fff3fff, 0x20c00033,
322
	0x690, 0x3fff3fff, 0x20c00033,
202
	0x918c, 0x0fff0fff, 0x00010006,
323
	0x918c, 0x0fff0fff, 0x00010006,
203
	0x918c, 0x0fff0fff, 0x00010006,
324
	0x918c, 0x0fff0fff, 0x00010006,
204
	0x91a8, 0x0fff0fff, 0x00010006,
325
	0x91a8, 0x0fff0fff, 0x00010006,
205
	0x91a8, 0x0fff0fff, 0x00010006,
326
	0x91a8, 0x0fff0fff, 0x00010006,
206
	0x9150, 0xffffdfff, 0x6e944040,
327
	0x9150, 0xffffdfff, 0x6e944040,
207
	0x9150, 0xffffdfff, 0x6e944040,
328
	0x9150, 0xffffdfff, 0x6e944040,
208
	0x917c, 0x0fff0fff, 0x00030002,
329
	0x917c, 0x0fff0fff, 0x00030002,
209
	0x917c, 0x0fff0fff, 0x00030002,
330
	0x917c, 0x0fff0fff, 0x00030002,
210
	0x9198, 0x0fff0fff, 0x00030002,
331
	0x9198, 0x0fff0fff, 0x00030002,
211
	0x9198, 0x0fff0fff, 0x00030002,
332
	0x9198, 0x0fff0fff, 0x00030002,
212
	0x915c, 0x0fff0fff, 0x00010000,
333
	0x915c, 0x0fff0fff, 0x00010000,
213
	0x915c, 0x0fff0fff, 0x00010000,
334
	0x915c, 0x0fff0fff, 0x00010000,
214
	0x3f90, 0xffff0001, 0xff000000,
335
	0x3f90, 0xffff0001, 0xff000000,
215
	0x3f90, 0xffff0001, 0xff000000,
336
	0x3f90, 0xffff0001, 0xff000000,
216
	0x9178, 0x0fff0fff, 0x00070000,
337
	0x9178, 0x0fff0fff, 0x00070000,
217
	0x9178, 0x0fff0fff, 0x00070000,
338
	0x9178, 0x0fff0fff, 0x00070000,
218
	0x9194, 0x0fff0fff, 0x00070000,
339
	0x9194, 0x0fff0fff, 0x00070000,
219
	0x9194, 0x0fff0fff, 0x00070000,
340
	0x9194, 0x0fff0fff, 0x00070000,
220
	0x9148, 0xffff0001, 0xff000000,
341
	0x9148, 0xffff0001, 0xff000000,
221
	0x9148, 0xffff0001, 0xff000000,
342
	0x9148, 0xffff0001, 0xff000000,
222
	0x9190, 0x0fff0fff, 0x00090008,
343
	0x9190, 0x0fff0fff, 0x00090008,
223
	0x9190, 0x0fff0fff, 0x00090008,
344
	0x9190, 0x0fff0fff, 0x00090008,
224
	0x91ac, 0x0fff0fff, 0x00090008,
345
	0x91ac, 0x0fff0fff, 0x00090008,
225
	0x91ac, 0x0fff0fff, 0x00090008,
346
	0x91ac, 0x0fff0fff, 0x00090008,
226
	0x3f94, 0xffff0000, 0xff000000,
347
	0x3f94, 0xffff0000, 0xff000000,
227
	0x3f94, 0xffff0000, 0xff000000,
348
	0x3f94, 0xffff0000, 0xff000000,
228
	0x914c, 0xffff0000, 0xff000000,
349
	0x914c, 0xffff0000, 0xff000000,
229
	0x914c, 0xffff0000, 0xff000000,
350
	0x914c, 0xffff0000, 0xff000000,
230
	0x929c, 0x00000fff, 0x00000001,
351
	0x929c, 0x00000fff, 0x00000001,
231
	0x929c, 0x00000fff, 0x00000001,
352
	0x929c, 0x00000fff, 0x00000001,
232
	0x55e4, 0xff607fff, 0xfc000100,
353
	0x55e4, 0xff607fff, 0xfc000100,
233
	0x8a18, 0xff000fff, 0x00000100,
354
	0x8a18, 0xff000fff, 0x00000100,
234
	0x8a18, 0xff000fff, 0x00000100,
355
	0x8a18, 0xff000fff, 0x00000100,
235
	0x8b28, 0xff000fff, 0x00000100,
356
	0x8b28, 0xff000fff, 0x00000100,
236
	0x8b28, 0xff000fff, 0x00000100,
357
	0x8b28, 0xff000fff, 0x00000100,
237
	0x9144, 0xfffc0fff, 0x00000100,
358
	0x9144, 0xfffc0fff, 0x00000100,
238
	0x9144, 0xfffc0fff, 0x00000100,
359
	0x9144, 0xfffc0fff, 0x00000100,
239
	0x6ed8, 0x00010101, 0x00010000,
360
	0x6ed8, 0x00010101, 0x00010000,
240
	0x9830, 0xffffffff, 0x00000000,
361
	0x9830, 0xffffffff, 0x00000000,
241
	0x9830, 0xffffffff, 0x00000000,
362
	0x9830, 0xffffffff, 0x00000000,
242
	0x9834, 0xf00fffff, 0x00000400,
363
	0x9834, 0xf00fffff, 0x00000400,
243
	0x9834, 0xf00fffff, 0x00000400,
364
	0x9834, 0xf00fffff, 0x00000400,
244
	0x9838, 0xfffffffe, 0x00000000,
365
	0x9838, 0xfffffffe, 0x00000000,
245
	0x9838, 0xfffffffe, 0x00000000,
366
	0x9838, 0xfffffffe, 0x00000000,
246
	0xd0c0, 0xff000fff, 0x00000100,
367
	0xd0c0, 0xff000fff, 0x00000100,
247
	0xd02c, 0xbfffff1f, 0x08421000,
368
	0xd02c, 0xbfffff1f, 0x08421000,
248
	0xd02c, 0xbfffff1f, 0x08421000,
369
	0xd02c, 0xbfffff1f, 0x08421000,
249
	0xd0b8, 0x73773777, 0x12010001,
370
	0xd0b8, 0x73773777, 0x12010001,
250
	0xd0b8, 0x73773777, 0x12010001,
371
	0xd0b8, 0x73773777, 0x12010001,
251
	0x5bb0, 0x000000f0, 0x00000070,
372
	0x5bb0, 0x000000f0, 0x00000070,
252
	0x98f8, 0x73773777, 0x12010001,
373
	0x98f8, 0x73773777, 0x12010001,
253
	0x98f8, 0x73773777, 0x12010001,
374
	0x98f8, 0x73773777, 0x12010001,
254
	0x98fc, 0xffffffff, 0x00000010,
375
	0x98fc, 0xffffffff, 0x00000010,
255
	0x98fc, 0xffffffff, 0x00000010,
376
	0x98fc, 0xffffffff, 0x00000010,
256
	0x9b7c, 0x00ff0000, 0x00fc0000,
377
	0x9b7c, 0x00ff0000, 0x00fc0000,
257
	0x9b7c, 0x00ff0000, 0x00fc0000,
378
	0x9b7c, 0x00ff0000, 0x00fc0000,
258
	0x8030, 0x00001f0f, 0x0000100a,
379
	0x8030, 0x00001f0f, 0x0000100a,
259
	0x8030, 0x00001f0f, 0x0000100a,
380
	0x8030, 0x00001f0f, 0x0000100a,
260
	0x2f48, 0x73773777, 0x12010001,
381
	0x2f48, 0x73773777, 0x12010001,
261
	0x2f48, 0x73773777, 0x12010001,
382
	0x2f48, 0x73773777, 0x12010001,
262
	0x2408, 0x00030000, 0x000c007f,
383
	0x2408, 0x00030000, 0x000c007f,
263
	0x8a14, 0xf000003f, 0x00000007,
384
	0x8a14, 0xf000003f, 0x00000007,
264
	0x8a14, 0xf000003f, 0x00000007,
385
	0x8a14, 0xf000003f, 0x00000007,
265
	0x8b24, 0x3fff3fff, 0x00ff0fff,
386
	0x8b24, 0x3fff3fff, 0x00ff0fff,
266
	0x8b24, 0x3fff3fff, 0x00ff0fff,
387
	0x8b24, 0x3fff3fff, 0x00ff0fff,
267
	0x8b10, 0x0000ff0f, 0x00000000,
388
	0x8b10, 0x0000ff0f, 0x00000000,
268
	0x8b10, 0x0000ff0f, 0x00000000,
389
	0x8b10, 0x0000ff0f, 0x00000000,
269
	0x28a4c, 0x07ffffff, 0x06000000,
390
	0x28a4c, 0x07ffffff, 0x06000000,
270
	0x28a4c, 0x07ffffff, 0x06000000,
391
	0x28a4c, 0x07ffffff, 0x06000000,
271
	0x4d8, 0x00000fff, 0x00000100,
392
	0x4d8, 0x00000fff, 0x00000100,
272
	0x4d8, 0x00000fff, 0x00000100,
393
	0x4d8, 0x00000fff, 0x00000100,
273
	0xa008, 0xffffffff, 0x00010000,
394
	0xa008, 0xffffffff, 0x00010000,
274
	0xa008, 0xffffffff, 0x00010000,
395
	0xa008, 0xffffffff, 0x00010000,
275
	0x913c, 0xffff03ff, 0x01000100,
396
	0x913c, 0xffff03ff, 0x01000100,
276
	0x913c, 0xffff03ff, 0x01000100,
397
	0x913c, 0xffff03ff, 0x01000100,
277
	0x90e8, 0x001fffff, 0x010400c0,
398
	0x90e8, 0x001fffff, 0x010400c0,
278
	0x8c00, 0x000000ff, 0x00000003,
399
	0x8c00, 0x000000ff, 0x00000003,
279
	0x8c00, 0x000000ff, 0x00000003,
400
	0x8c00, 0x000000ff, 0x00000003,
280
	0x8c04, 0xf8ff00ff, 0x40600060,
401
	0x8c04, 0xf8ff00ff, 0x40600060,
281
	0x8c04, 0xf8ff00ff, 0x40600060,
402
	0x8c04, 0xf8ff00ff, 0x40600060,
282
	0x8c30, 0x0000000f, 0x00040005,
403
	0x8c30, 0x0000000f, 0x00040005,
283
	0x8cf0, 0x1fff1fff, 0x08e00410,
404
	0x8cf0, 0x1fff1fff, 0x08e00410,
284
	0x8cf0, 0x1fff1fff, 0x08e00410,
405
	0x8cf0, 0x1fff1fff, 0x08e00410,
285
	0x900c, 0x00ffffff, 0x0017071f,
406
	0x900c, 0x00ffffff, 0x0017071f,
286
	0x28350, 0x00000f01, 0x00000000,
407
	0x28350, 0x00000f01, 0x00000000,
287
	0x28350, 0x00000f01, 0x00000000,
408
	0x28350, 0x00000f01, 0x00000000,
288
	0x9508, 0xf700071f, 0x00000002,
409
	0x9508, 0xf700071f, 0x00000002,
289
	0x9508, 0xf700071f, 0x00000002,
410
	0x9508, 0xf700071f, 0x00000002,
290
	0x9688, 0x00300000, 0x0017000f,
411
	0x9688, 0x00300000, 0x0017000f,
291
	0x960c, 0xffffffff, 0x54763210,
412
	0x960c, 0xffffffff, 0x54763210,
292
	0x960c, 0xffffffff, 0x54763210,
413
	0x960c, 0xffffffff, 0x54763210,
293
	0x20ef8, 0x01ff01ff, 0x00000002,
414
	0x20ef8, 0x01ff01ff, 0x00000002,
294
	0x20e98, 0xfffffbff, 0x00200000,
415
	0x20e98, 0xfffffbff, 0x00200000,
295
	0x2015c, 0xffffffff, 0x00000f40,
416
	0x2015c, 0xffffffff, 0x00000f40,
296
	0x88c4, 0x001f3ae3, 0x00000082,
417
	0x88c4, 0x001f3ae3, 0x00000082,
297
	0x88c4, 0x001f3ae3, 0x00000082,
418
	0x88c4, 0x001f3ae3, 0x00000082,
298
	0x8978, 0x3fffffff, 0x04050140,
419
	0x8978, 0x3fffffff, 0x04050140,
299
	0x8978, 0x3fffffff, 0x04050140,
420
	0x8978, 0x3fffffff, 0x04050140,
300
	0x88d4, 0x0000001f, 0x00000010,
421
	0x88d4, 0x0000001f, 0x00000010,
301
	0x88d4, 0x0000001f, 0x00000010,
422
	0x88d4, 0x0000001f, 0x00000010,
302
	0x8974, 0xffffffff, 0x00000000,
423
	0x8974, 0xffffffff, 0x00000000,
303
	0x8974, 0xffffffff, 0x00000000
424
	0x8974, 0xffffffff, 0x00000000
304
};
425
};
305
 
426
 
306
static void ni_init_golden_registers(struct radeon_device *rdev)
427
static void ni_init_golden_registers(struct radeon_device *rdev)
307
{
428
{
308
	switch (rdev->family) {
429
	switch (rdev->family) {
309
	case CHIP_CAYMAN:
430
	case CHIP_CAYMAN:
310
		radeon_program_register_sequence(rdev,
431
		radeon_program_register_sequence(rdev,
311
						 cayman_golden_registers,
432
						 cayman_golden_registers,
312
						 (const u32)ARRAY_SIZE(cayman_golden_registers));
433
						 (const u32)ARRAY_SIZE(cayman_golden_registers));
313
		radeon_program_register_sequence(rdev,
434
		radeon_program_register_sequence(rdev,
314
						 cayman_golden_registers2,
435
						 cayman_golden_registers2,
315
						 (const u32)ARRAY_SIZE(cayman_golden_registers2));
436
						 (const u32)ARRAY_SIZE(cayman_golden_registers2));
316
		break;
437
		break;
317
	case CHIP_ARUBA:
438
	case CHIP_ARUBA:
318
		if ((rdev->pdev->device == 0x9900) ||
439
		if ((rdev->pdev->device == 0x9900) ||
319
		    (rdev->pdev->device == 0x9901) ||
440
		    (rdev->pdev->device == 0x9901) ||
320
		    (rdev->pdev->device == 0x9903) ||
441
		    (rdev->pdev->device == 0x9903) ||
321
		    (rdev->pdev->device == 0x9904) ||
442
		    (rdev->pdev->device == 0x9904) ||
322
		    (rdev->pdev->device == 0x9905) ||
443
		    (rdev->pdev->device == 0x9905) ||
323
		    (rdev->pdev->device == 0x9906) ||
444
		    (rdev->pdev->device == 0x9906) ||
324
		    (rdev->pdev->device == 0x9907) ||
445
		    (rdev->pdev->device == 0x9907) ||
325
		    (rdev->pdev->device == 0x9908) ||
446
		    (rdev->pdev->device == 0x9908) ||
326
		    (rdev->pdev->device == 0x9909) ||
447
		    (rdev->pdev->device == 0x9909) ||
327
		    (rdev->pdev->device == 0x990A) ||
448
		    (rdev->pdev->device == 0x990A) ||
328
		    (rdev->pdev->device == 0x990B) ||
449
		    (rdev->pdev->device == 0x990B) ||
329
		    (rdev->pdev->device == 0x990C) ||
450
		    (rdev->pdev->device == 0x990C) ||
330
		    (rdev->pdev->device == 0x990D) ||
451
		    (rdev->pdev->device == 0x990D) ||
331
		    (rdev->pdev->device == 0x990E) ||
452
		    (rdev->pdev->device == 0x990E) ||
332
		    (rdev->pdev->device == 0x990F) ||
453
		    (rdev->pdev->device == 0x990F) ||
333
		    (rdev->pdev->device == 0x9910) ||
454
		    (rdev->pdev->device == 0x9910) ||
334
		    (rdev->pdev->device == 0x9913) ||
455
		    (rdev->pdev->device == 0x9913) ||
335
		    (rdev->pdev->device == 0x9917) ||
456
		    (rdev->pdev->device == 0x9917) ||
336
		    (rdev->pdev->device == 0x9918)) {
457
		    (rdev->pdev->device == 0x9918)) {
337
			radeon_program_register_sequence(rdev,
458
			radeon_program_register_sequence(rdev,
338
							 dvst_golden_registers,
459
							 dvst_golden_registers,
339
							 (const u32)ARRAY_SIZE(dvst_golden_registers));
460
							 (const u32)ARRAY_SIZE(dvst_golden_registers));
340
			radeon_program_register_sequence(rdev,
461
			radeon_program_register_sequence(rdev,
341
							 dvst_golden_registers2,
462
							 dvst_golden_registers2,
342
							 (const u32)ARRAY_SIZE(dvst_golden_registers2));
463
							 (const u32)ARRAY_SIZE(dvst_golden_registers2));
343
		} else {
464
		} else {
344
			radeon_program_register_sequence(rdev,
465
			radeon_program_register_sequence(rdev,
345
							 scrapper_golden_registers,
466
							 scrapper_golden_registers,
346
							 (const u32)ARRAY_SIZE(scrapper_golden_registers));
467
							 (const u32)ARRAY_SIZE(scrapper_golden_registers));
347
			radeon_program_register_sequence(rdev,
468
			radeon_program_register_sequence(rdev,
348
							 dvst_golden_registers2,
469
							 dvst_golden_registers2,
349
							 (const u32)ARRAY_SIZE(dvst_golden_registers2));
470
							 (const u32)ARRAY_SIZE(dvst_golden_registers2));
350
		}
471
		}
351
		break;
472
		break;
352
	default:
473
	default:
353
		break;
474
		break;
354
	}
475
	}
355
}
476
}
356
 
477
 
357
#define BTC_IO_MC_REGS_SIZE 29
478
#define BTC_IO_MC_REGS_SIZE 29
358
 
479
 
359
static const u32 barts_io_mc_regs[BTC_IO_MC_REGS_SIZE][2] = {
480
static const u32 barts_io_mc_regs[BTC_IO_MC_REGS_SIZE][2] = {
360
	{0x00000077, 0xff010100},
481
	{0x00000077, 0xff010100},
361
	{0x00000078, 0x00000000},
482
	{0x00000078, 0x00000000},
362
	{0x00000079, 0x00001434},
483
	{0x00000079, 0x00001434},
363
	{0x0000007a, 0xcc08ec08},
484
	{0x0000007a, 0xcc08ec08},
364
	{0x0000007b, 0x00040000},
485
	{0x0000007b, 0x00040000},
365
	{0x0000007c, 0x000080c0},
486
	{0x0000007c, 0x000080c0},
366
	{0x0000007d, 0x09000000},
487
	{0x0000007d, 0x09000000},
367
	{0x0000007e, 0x00210404},
488
	{0x0000007e, 0x00210404},
368
	{0x00000081, 0x08a8e800},
489
	{0x00000081, 0x08a8e800},
369
	{0x00000082, 0x00030444},
490
	{0x00000082, 0x00030444},
370
	{0x00000083, 0x00000000},
491
	{0x00000083, 0x00000000},
371
	{0x00000085, 0x00000001},
492
	{0x00000085, 0x00000001},
372
	{0x00000086, 0x00000002},
493
	{0x00000086, 0x00000002},
373
	{0x00000087, 0x48490000},
494
	{0x00000087, 0x48490000},
374
	{0x00000088, 0x20244647},
495
	{0x00000088, 0x20244647},
375
	{0x00000089, 0x00000005},
496
	{0x00000089, 0x00000005},
376
	{0x0000008b, 0x66030000},
497
	{0x0000008b, 0x66030000},
377
	{0x0000008c, 0x00006603},
498
	{0x0000008c, 0x00006603},
378
	{0x0000008d, 0x00000100},
499
	{0x0000008d, 0x00000100},
379
	{0x0000008f, 0x00001c0a},
500
	{0x0000008f, 0x00001c0a},
380
	{0x00000090, 0xff000001},
501
	{0x00000090, 0xff000001},
381
	{0x00000094, 0x00101101},
502
	{0x00000094, 0x00101101},
382
	{0x00000095, 0x00000fff},
503
	{0x00000095, 0x00000fff},
383
	{0x00000096, 0x00116fff},
504
	{0x00000096, 0x00116fff},
384
	{0x00000097, 0x60010000},
505
	{0x00000097, 0x60010000},
385
	{0x00000098, 0x10010000},
506
	{0x00000098, 0x10010000},
386
	{0x00000099, 0x00006000},
507
	{0x00000099, 0x00006000},
387
	{0x0000009a, 0x00001000},
508
	{0x0000009a, 0x00001000},
388
	{0x0000009f, 0x00946a00}
509
	{0x0000009f, 0x00946a00}
389
};
510
};
390
 
511
 
391
static const u32 turks_io_mc_regs[BTC_IO_MC_REGS_SIZE][2] = {
512
static const u32 turks_io_mc_regs[BTC_IO_MC_REGS_SIZE][2] = {
392
	{0x00000077, 0xff010100},
513
	{0x00000077, 0xff010100},
393
	{0x00000078, 0x00000000},
514
	{0x00000078, 0x00000000},
394
	{0x00000079, 0x00001434},
515
	{0x00000079, 0x00001434},
395
	{0x0000007a, 0xcc08ec08},
516
	{0x0000007a, 0xcc08ec08},
396
	{0x0000007b, 0x00040000},
517
	{0x0000007b, 0x00040000},
397
	{0x0000007c, 0x000080c0},
518
	{0x0000007c, 0x000080c0},
398
	{0x0000007d, 0x09000000},
519
	{0x0000007d, 0x09000000},
399
	{0x0000007e, 0x00210404},
520
	{0x0000007e, 0x00210404},
400
	{0x00000081, 0x08a8e800},
521
	{0x00000081, 0x08a8e800},
401
	{0x00000082, 0x00030444},
522
	{0x00000082, 0x00030444},
402
	{0x00000083, 0x00000000},
523
	{0x00000083, 0x00000000},
403
	{0x00000085, 0x00000001},
524
	{0x00000085, 0x00000001},
404
	{0x00000086, 0x00000002},
525
	{0x00000086, 0x00000002},
405
	{0x00000087, 0x48490000},
526
	{0x00000087, 0x48490000},
406
	{0x00000088, 0x20244647},
527
	{0x00000088, 0x20244647},
407
	{0x00000089, 0x00000005},
528
	{0x00000089, 0x00000005},
408
	{0x0000008b, 0x66030000},
529
	{0x0000008b, 0x66030000},
409
	{0x0000008c, 0x00006603},
530
	{0x0000008c, 0x00006603},
410
	{0x0000008d, 0x00000100},
531
	{0x0000008d, 0x00000100},
411
	{0x0000008f, 0x00001c0a},
532
	{0x0000008f, 0x00001c0a},
412
	{0x00000090, 0xff000001},
533
	{0x00000090, 0xff000001},
413
	{0x00000094, 0x00101101},
534
	{0x00000094, 0x00101101},
414
	{0x00000095, 0x00000fff},
535
	{0x00000095, 0x00000fff},
415
	{0x00000096, 0x00116fff},
536
	{0x00000096, 0x00116fff},
416
	{0x00000097, 0x60010000},
537
	{0x00000097, 0x60010000},
417
	{0x00000098, 0x10010000},
538
	{0x00000098, 0x10010000},
418
	{0x00000099, 0x00006000},
539
	{0x00000099, 0x00006000},
419
	{0x0000009a, 0x00001000},
540
	{0x0000009a, 0x00001000},
420
	{0x0000009f, 0x00936a00}
541
	{0x0000009f, 0x00936a00}
421
};
542
};
422
 
543
 
423
static const u32 caicos_io_mc_regs[BTC_IO_MC_REGS_SIZE][2] = {
544
static const u32 caicos_io_mc_regs[BTC_IO_MC_REGS_SIZE][2] = {
424
	{0x00000077, 0xff010100},
545
	{0x00000077, 0xff010100},
425
	{0x00000078, 0x00000000},
546
	{0x00000078, 0x00000000},
426
	{0x00000079, 0x00001434},
547
	{0x00000079, 0x00001434},
427
	{0x0000007a, 0xcc08ec08},
548
	{0x0000007a, 0xcc08ec08},
428
	{0x0000007b, 0x00040000},
549
	{0x0000007b, 0x00040000},
429
	{0x0000007c, 0x000080c0},
550
	{0x0000007c, 0x000080c0},
430
	{0x0000007d, 0x09000000},
551
	{0x0000007d, 0x09000000},
431
	{0x0000007e, 0x00210404},
552
	{0x0000007e, 0x00210404},
432
	{0x00000081, 0x08a8e800},
553
	{0x00000081, 0x08a8e800},
433
	{0x00000082, 0x00030444},
554
	{0x00000082, 0x00030444},
434
	{0x00000083, 0x00000000},
555
	{0x00000083, 0x00000000},
435
	{0x00000085, 0x00000001},
556
	{0x00000085, 0x00000001},
436
	{0x00000086, 0x00000002},
557
	{0x00000086, 0x00000002},
437
	{0x00000087, 0x48490000},
558
	{0x00000087, 0x48490000},
438
	{0x00000088, 0x20244647},
559
	{0x00000088, 0x20244647},
439
	{0x00000089, 0x00000005},
560
	{0x00000089, 0x00000005},
440
	{0x0000008b, 0x66030000},
561
	{0x0000008b, 0x66030000},
441
	{0x0000008c, 0x00006603},
562
	{0x0000008c, 0x00006603},
442
	{0x0000008d, 0x00000100},
563
	{0x0000008d, 0x00000100},
443
	{0x0000008f, 0x00001c0a},
564
	{0x0000008f, 0x00001c0a},
444
	{0x00000090, 0xff000001},
565
	{0x00000090, 0xff000001},
445
	{0x00000094, 0x00101101},
566
	{0x00000094, 0x00101101},
446
	{0x00000095, 0x00000fff},
567
	{0x00000095, 0x00000fff},
447
	{0x00000096, 0x00116fff},
568
	{0x00000096, 0x00116fff},
448
	{0x00000097, 0x60010000},
569
	{0x00000097, 0x60010000},
449
	{0x00000098, 0x10010000},
570
	{0x00000098, 0x10010000},
450
	{0x00000099, 0x00006000},
571
	{0x00000099, 0x00006000},
451
	{0x0000009a, 0x00001000},
572
	{0x0000009a, 0x00001000},
452
	{0x0000009f, 0x00916a00}
573
	{0x0000009f, 0x00916a00}
453
};
574
};
454
 
575
 
455
static const u32 cayman_io_mc_regs[BTC_IO_MC_REGS_SIZE][2] = {
576
static const u32 cayman_io_mc_regs[BTC_IO_MC_REGS_SIZE][2] = {
456
	{0x00000077, 0xff010100},
577
	{0x00000077, 0xff010100},
457
	{0x00000078, 0x00000000},
578
	{0x00000078, 0x00000000},
458
	{0x00000079, 0x00001434},
579
	{0x00000079, 0x00001434},
459
	{0x0000007a, 0xcc08ec08},
580
	{0x0000007a, 0xcc08ec08},
460
	{0x0000007b, 0x00040000},
581
	{0x0000007b, 0x00040000},
461
	{0x0000007c, 0x000080c0},
582
	{0x0000007c, 0x000080c0},
462
	{0x0000007d, 0x09000000},
583
	{0x0000007d, 0x09000000},
463
	{0x0000007e, 0x00210404},
584
	{0x0000007e, 0x00210404},
464
	{0x00000081, 0x08a8e800},
585
	{0x00000081, 0x08a8e800},
465
	{0x00000082, 0x00030444},
586
	{0x00000082, 0x00030444},
466
	{0x00000083, 0x00000000},
587
	{0x00000083, 0x00000000},
467
	{0x00000085, 0x00000001},
588
	{0x00000085, 0x00000001},
468
	{0x00000086, 0x00000002},
589
	{0x00000086, 0x00000002},
469
	{0x00000087, 0x48490000},
590
	{0x00000087, 0x48490000},
470
	{0x00000088, 0x20244647},
591
	{0x00000088, 0x20244647},
471
	{0x00000089, 0x00000005},
592
	{0x00000089, 0x00000005},
472
	{0x0000008b, 0x66030000},
593
	{0x0000008b, 0x66030000},
473
	{0x0000008c, 0x00006603},
594
	{0x0000008c, 0x00006603},
474
	{0x0000008d, 0x00000100},
595
	{0x0000008d, 0x00000100},
475
	{0x0000008f, 0x00001c0a},
596
	{0x0000008f, 0x00001c0a},
476
	{0x00000090, 0xff000001},
597
	{0x00000090, 0xff000001},
477
	{0x00000094, 0x00101101},
598
	{0x00000094, 0x00101101},
478
	{0x00000095, 0x00000fff},
599
	{0x00000095, 0x00000fff},
479
	{0x00000096, 0x00116fff},
600
	{0x00000096, 0x00116fff},
480
	{0x00000097, 0x60010000},
601
	{0x00000097, 0x60010000},
481
	{0x00000098, 0x10010000},
602
	{0x00000098, 0x10010000},
482
	{0x00000099, 0x00006000},
603
	{0x00000099, 0x00006000},
483
	{0x0000009a, 0x00001000},
604
	{0x0000009a, 0x00001000},
484
	{0x0000009f, 0x00976b00}
605
	{0x0000009f, 0x00976b00}
485
};
606
};
486
 
607
 
487
int ni_mc_load_microcode(struct radeon_device *rdev)
608
int ni_mc_load_microcode(struct radeon_device *rdev)
488
{
609
{
489
	const __be32 *fw_data;
610
	const __be32 *fw_data;
490
	u32 mem_type, running, blackout = 0;
611
	u32 mem_type, running, blackout = 0;
491
	u32 *io_mc_regs;
612
	u32 *io_mc_regs;
492
	int i, ucode_size, regs_size;
613
	int i, ucode_size, regs_size;
493
 
614
 
494
	if (!rdev->mc_fw)
615
	if (!rdev->mc_fw)
495
		return -EINVAL;
616
		return -EINVAL;
496
 
617
 
497
	switch (rdev->family) {
618
	switch (rdev->family) {
498
	case CHIP_BARTS:
619
	case CHIP_BARTS:
499
		io_mc_regs = (u32 *)&barts_io_mc_regs;
620
		io_mc_regs = (u32 *)&barts_io_mc_regs;
500
		ucode_size = BTC_MC_UCODE_SIZE;
621
		ucode_size = BTC_MC_UCODE_SIZE;
501
		regs_size = BTC_IO_MC_REGS_SIZE;
622
		regs_size = BTC_IO_MC_REGS_SIZE;
502
		break;
623
		break;
503
	case CHIP_TURKS:
624
	case CHIP_TURKS:
504
		io_mc_regs = (u32 *)&turks_io_mc_regs;
625
		io_mc_regs = (u32 *)&turks_io_mc_regs;
505
		ucode_size = BTC_MC_UCODE_SIZE;
626
		ucode_size = BTC_MC_UCODE_SIZE;
506
		regs_size = BTC_IO_MC_REGS_SIZE;
627
		regs_size = BTC_IO_MC_REGS_SIZE;
507
		break;
628
		break;
508
	case CHIP_CAICOS:
629
	case CHIP_CAICOS:
509
	default:
630
	default:
510
		io_mc_regs = (u32 *)&caicos_io_mc_regs;
631
		io_mc_regs = (u32 *)&caicos_io_mc_regs;
511
		ucode_size = BTC_MC_UCODE_SIZE;
632
		ucode_size = BTC_MC_UCODE_SIZE;
512
		regs_size = BTC_IO_MC_REGS_SIZE;
633
		regs_size = BTC_IO_MC_REGS_SIZE;
513
		break;
634
		break;
514
	case CHIP_CAYMAN:
635
	case CHIP_CAYMAN:
515
		io_mc_regs = (u32 *)&cayman_io_mc_regs;
636
		io_mc_regs = (u32 *)&cayman_io_mc_regs;
516
		ucode_size = CAYMAN_MC_UCODE_SIZE;
637
		ucode_size = CAYMAN_MC_UCODE_SIZE;
517
		regs_size = BTC_IO_MC_REGS_SIZE;
638
		regs_size = BTC_IO_MC_REGS_SIZE;
518
		break;
639
		break;
519
	}
640
	}
520
 
641
 
521
	mem_type = (RREG32(MC_SEQ_MISC0) & MC_SEQ_MISC0_GDDR5_MASK) >> MC_SEQ_MISC0_GDDR5_SHIFT;
642
	mem_type = (RREG32(MC_SEQ_MISC0) & MC_SEQ_MISC0_GDDR5_MASK) >> MC_SEQ_MISC0_GDDR5_SHIFT;
522
	running = RREG32(MC_SEQ_SUP_CNTL) & RUN_MASK;
643
	running = RREG32(MC_SEQ_SUP_CNTL) & RUN_MASK;
523
 
644
 
524
	if ((mem_type == MC_SEQ_MISC0_GDDR5_VALUE) && (running == 0)) {
645
	if ((mem_type == MC_SEQ_MISC0_GDDR5_VALUE) && (running == 0)) {
525
		if (running) {
646
		if (running) {
526
			blackout = RREG32(MC_SHARED_BLACKOUT_CNTL);
647
			blackout = RREG32(MC_SHARED_BLACKOUT_CNTL);
527
			WREG32(MC_SHARED_BLACKOUT_CNTL, 1);
648
			WREG32(MC_SHARED_BLACKOUT_CNTL, 1);
528
		}
649
		}
529
 
650
 
530
		/* reset the engine and set to writable */
651
		/* reset the engine and set to writable */
531
		WREG32(MC_SEQ_SUP_CNTL, 0x00000008);
652
		WREG32(MC_SEQ_SUP_CNTL, 0x00000008);
532
		WREG32(MC_SEQ_SUP_CNTL, 0x00000010);
653
		WREG32(MC_SEQ_SUP_CNTL, 0x00000010);
533
 
654
 
534
		/* load mc io regs */
655
		/* load mc io regs */
535
		for (i = 0; i < regs_size; i++) {
656
		for (i = 0; i < regs_size; i++) {
536
			WREG32(MC_SEQ_IO_DEBUG_INDEX, io_mc_regs[(i << 1)]);
657
			WREG32(MC_SEQ_IO_DEBUG_INDEX, io_mc_regs[(i << 1)]);
537
			WREG32(MC_SEQ_IO_DEBUG_DATA, io_mc_regs[(i << 1) + 1]);
658
			WREG32(MC_SEQ_IO_DEBUG_DATA, io_mc_regs[(i << 1) + 1]);
538
		}
659
		}
539
		/* load the MC ucode */
660
		/* load the MC ucode */
540
		fw_data = (const __be32 *)rdev->mc_fw->data;
661
		fw_data = (const __be32 *)rdev->mc_fw->data;
541
		for (i = 0; i < ucode_size; i++)
662
		for (i = 0; i < ucode_size; i++)
542
			WREG32(MC_SEQ_SUP_PGM, be32_to_cpup(fw_data++));
663
			WREG32(MC_SEQ_SUP_PGM, be32_to_cpup(fw_data++));
543
 
664
 
544
		/* put the engine back into the active state */
665
		/* put the engine back into the active state */
545
		WREG32(MC_SEQ_SUP_CNTL, 0x00000008);
666
		WREG32(MC_SEQ_SUP_CNTL, 0x00000008);
546
		WREG32(MC_SEQ_SUP_CNTL, 0x00000004);
667
		WREG32(MC_SEQ_SUP_CNTL, 0x00000004);
547
		WREG32(MC_SEQ_SUP_CNTL, 0x00000001);
668
		WREG32(MC_SEQ_SUP_CNTL, 0x00000001);
548
 
669
 
549
		/* wait for training to complete */
670
		/* wait for training to complete */
550
		for (i = 0; i < rdev->usec_timeout; i++) {
671
		for (i = 0; i < rdev->usec_timeout; i++) {
551
			if (RREG32(MC_IO_PAD_CNTL_D0) & MEM_FALL_OUT_CMD)
672
			if (RREG32(MC_IO_PAD_CNTL_D0) & MEM_FALL_OUT_CMD)
552
				break;
673
				break;
553
			udelay(1);
674
			udelay(1);
554
		}
675
		}
555
 
676
 
556
		if (running)
677
		if (running)
557
			WREG32(MC_SHARED_BLACKOUT_CNTL, blackout);
678
			WREG32(MC_SHARED_BLACKOUT_CNTL, blackout);
558
	}
679
	}
559
 
680
 
560
	return 0;
681
	return 0;
561
}
682
}
562
 
683
 
563
int ni_init_microcode(struct radeon_device *rdev)
684
int ni_init_microcode(struct radeon_device *rdev)
564
{
685
{
565
	struct platform_device *pdev;
-
 
566
	const char *chip_name;
686
	const char *chip_name;
567
	const char *rlc_chip_name;
687
	const char *rlc_chip_name;
568
	size_t pfp_req_size, me_req_size, rlc_req_size, mc_req_size;
688
	size_t pfp_req_size, me_req_size, rlc_req_size, mc_req_size;
-
 
689
	size_t smc_req_size = 0;
569
	char fw_name[30];
690
	char fw_name[30];
570
	int err;
691
	int err;
571
 
692
 
572
	DRM_DEBUG("\n");
693
	DRM_DEBUG("\n");
573
 
-
 
574
	pdev = platform_device_register_simple("radeon_cp", 0, NULL, 0);
-
 
575
	err = IS_ERR(pdev);
-
 
576
	if (err) {
-
 
577
		printk(KERN_ERR "radeon_cp: Failed to register firmware\n");
-
 
578
		return -EINVAL;
-
 
579
	}
-
 
580
 
694
 
581
	switch (rdev->family) {
695
	switch (rdev->family) {
582
	case CHIP_BARTS:
696
	case CHIP_BARTS:
583
		chip_name = "BARTS";
697
		chip_name = "BARTS";
584
		rlc_chip_name = "BTC";
698
		rlc_chip_name = "BTC";
585
		pfp_req_size = EVERGREEN_PFP_UCODE_SIZE * 4;
699
		pfp_req_size = EVERGREEN_PFP_UCODE_SIZE * 4;
586
		me_req_size = EVERGREEN_PM4_UCODE_SIZE * 4;
700
		me_req_size = EVERGREEN_PM4_UCODE_SIZE * 4;
587
		rlc_req_size = EVERGREEN_RLC_UCODE_SIZE * 4;
701
		rlc_req_size = EVERGREEN_RLC_UCODE_SIZE * 4;
588
		mc_req_size = BTC_MC_UCODE_SIZE * 4;
702
		mc_req_size = BTC_MC_UCODE_SIZE * 4;
-
 
703
		smc_req_size = ALIGN(BARTS_SMC_UCODE_SIZE, 4);
589
		break;
704
		break;
590
	case CHIP_TURKS:
705
	case CHIP_TURKS:
591
		chip_name = "TURKS";
706
		chip_name = "TURKS";
592
		rlc_chip_name = "BTC";
707
		rlc_chip_name = "BTC";
593
		pfp_req_size = EVERGREEN_PFP_UCODE_SIZE * 4;
708
		pfp_req_size = EVERGREEN_PFP_UCODE_SIZE * 4;
594
		me_req_size = EVERGREEN_PM4_UCODE_SIZE * 4;
709
		me_req_size = EVERGREEN_PM4_UCODE_SIZE * 4;
595
		rlc_req_size = EVERGREEN_RLC_UCODE_SIZE * 4;
710
		rlc_req_size = EVERGREEN_RLC_UCODE_SIZE * 4;
596
		mc_req_size = BTC_MC_UCODE_SIZE * 4;
711
		mc_req_size = BTC_MC_UCODE_SIZE * 4;
-
 
712
		smc_req_size = ALIGN(TURKS_SMC_UCODE_SIZE, 4);
597
		break;
713
		break;
598
	case CHIP_CAICOS:
714
	case CHIP_CAICOS:
599
		chip_name = "CAICOS";
715
		chip_name = "CAICOS";
600
		rlc_chip_name = "BTC";
716
		rlc_chip_name = "BTC";
601
		pfp_req_size = EVERGREEN_PFP_UCODE_SIZE * 4;
717
		pfp_req_size = EVERGREEN_PFP_UCODE_SIZE * 4;
602
		me_req_size = EVERGREEN_PM4_UCODE_SIZE * 4;
718
		me_req_size = EVERGREEN_PM4_UCODE_SIZE * 4;
603
		rlc_req_size = EVERGREEN_RLC_UCODE_SIZE * 4;
719
		rlc_req_size = EVERGREEN_RLC_UCODE_SIZE * 4;
604
		mc_req_size = BTC_MC_UCODE_SIZE * 4;
720
		mc_req_size = BTC_MC_UCODE_SIZE * 4;
-
 
721
		smc_req_size = ALIGN(CAICOS_SMC_UCODE_SIZE, 4);
605
		break;
722
		break;
606
	case CHIP_CAYMAN:
723
	case CHIP_CAYMAN:
607
		chip_name = "CAYMAN";
724
		chip_name = "CAYMAN";
608
		rlc_chip_name = "CAYMAN";
725
		rlc_chip_name = "CAYMAN";
609
		pfp_req_size = CAYMAN_PFP_UCODE_SIZE * 4;
726
		pfp_req_size = CAYMAN_PFP_UCODE_SIZE * 4;
610
		me_req_size = CAYMAN_PM4_UCODE_SIZE * 4;
727
		me_req_size = CAYMAN_PM4_UCODE_SIZE * 4;
611
		rlc_req_size = CAYMAN_RLC_UCODE_SIZE * 4;
728
		rlc_req_size = CAYMAN_RLC_UCODE_SIZE * 4;
612
		mc_req_size = CAYMAN_MC_UCODE_SIZE * 4;
729
		mc_req_size = CAYMAN_MC_UCODE_SIZE * 4;
-
 
730
		smc_req_size = ALIGN(CAYMAN_SMC_UCODE_SIZE, 4);
613
		break;
731
		break;
614
	case CHIP_ARUBA:
732
	case CHIP_ARUBA:
615
		chip_name = "ARUBA";
733
		chip_name = "ARUBA";
616
		rlc_chip_name = "ARUBA";
734
		rlc_chip_name = "ARUBA";
617
		/* pfp/me same size as CAYMAN */
735
		/* pfp/me same size as CAYMAN */
618
		pfp_req_size = CAYMAN_PFP_UCODE_SIZE * 4;
736
		pfp_req_size = CAYMAN_PFP_UCODE_SIZE * 4;
619
		me_req_size = CAYMAN_PM4_UCODE_SIZE * 4;
737
		me_req_size = CAYMAN_PM4_UCODE_SIZE * 4;
620
		rlc_req_size = ARUBA_RLC_UCODE_SIZE * 4;
738
		rlc_req_size = ARUBA_RLC_UCODE_SIZE * 4;
621
		mc_req_size = 0;
739
		mc_req_size = 0;
622
		break;
740
		break;
623
	default: BUG();
741
	default: BUG();
624
	}
742
	}
625
 
743
 
626
	DRM_INFO("Loading %s Microcode\n", chip_name);
744
	DRM_INFO("Loading %s Microcode\n", chip_name);
627
 
745
 
628
	snprintf(fw_name, sizeof(fw_name), "radeon/%s_pfp.bin", chip_name);
746
	snprintf(fw_name, sizeof(fw_name), "radeon/%s_pfp.bin", chip_name);
629
	err = request_firmware(&rdev->pfp_fw, fw_name, &pdev->dev);
747
	err = request_firmware(&rdev->pfp_fw, fw_name, rdev->dev);
630
	if (err)
748
	if (err)
631
		goto out;
749
		goto out;
632
	if (rdev->pfp_fw->size != pfp_req_size) {
750
	if (rdev->pfp_fw->size != pfp_req_size) {
633
		printk(KERN_ERR
751
		printk(KERN_ERR
634
		       "ni_cp: Bogus length %zu in firmware \"%s\"\n",
752
		       "ni_cp: Bogus length %zu in firmware \"%s\"\n",
635
		       rdev->pfp_fw->size, fw_name);
753
		       rdev->pfp_fw->size, fw_name);
636
		err = -EINVAL;
754
		err = -EINVAL;
637
		goto out;
755
		goto out;
638
	}
756
	}
639
 
757
 
640
	snprintf(fw_name, sizeof(fw_name), "radeon/%s_me.bin", chip_name);
758
	snprintf(fw_name, sizeof(fw_name), "radeon/%s_me.bin", chip_name);
641
	err = request_firmware(&rdev->me_fw, fw_name, &pdev->dev);
759
	err = request_firmware(&rdev->me_fw, fw_name, rdev->dev);
642
	if (err)
760
	if (err)
643
		goto out;
761
		goto out;
644
	if (rdev->me_fw->size != me_req_size) {
762
	if (rdev->me_fw->size != me_req_size) {
645
		printk(KERN_ERR
763
		printk(KERN_ERR
646
		       "ni_cp: Bogus length %zu in firmware \"%s\"\n",
764
		       "ni_cp: Bogus length %zu in firmware \"%s\"\n",
647
		       rdev->me_fw->size, fw_name);
765
		       rdev->me_fw->size, fw_name);
648
		err = -EINVAL;
766
		err = -EINVAL;
649
	}
767
	}
650
 
768
 
651
	snprintf(fw_name, sizeof(fw_name), "radeon/%s_rlc.bin", rlc_chip_name);
769
	snprintf(fw_name, sizeof(fw_name), "radeon/%s_rlc.bin", rlc_chip_name);
652
	err = request_firmware(&rdev->rlc_fw, fw_name, &pdev->dev);
770
	err = request_firmware(&rdev->rlc_fw, fw_name, rdev->dev);
653
	if (err)
771
	if (err)
654
		goto out;
772
		goto out;
655
	if (rdev->rlc_fw->size != rlc_req_size) {
773
	if (rdev->rlc_fw->size != rlc_req_size) {
656
		printk(KERN_ERR
774
		printk(KERN_ERR
657
		       "ni_rlc: Bogus length %zu in firmware \"%s\"\n",
775
		       "ni_rlc: Bogus length %zu in firmware \"%s\"\n",
658
		       rdev->rlc_fw->size, fw_name);
776
		       rdev->rlc_fw->size, fw_name);
659
		err = -EINVAL;
777
		err = -EINVAL;
660
	}
778
	}
661
 
779
 
662
	/* no MC ucode on TN */
780
	/* no MC ucode on TN */
663
	if (!(rdev->flags & RADEON_IS_IGP)) {
781
	if (!(rdev->flags & RADEON_IS_IGP)) {
664
	snprintf(fw_name, sizeof(fw_name), "radeon/%s_mc.bin", chip_name);
782
	snprintf(fw_name, sizeof(fw_name), "radeon/%s_mc.bin", chip_name);
665
	err = request_firmware(&rdev->mc_fw, fw_name, &pdev->dev);
783
		err = request_firmware(&rdev->mc_fw, fw_name, rdev->dev);
666
	if (err)
784
	if (err)
667
		goto out;
785
		goto out;
668
	if (rdev->mc_fw->size != mc_req_size) {
786
	if (rdev->mc_fw->size != mc_req_size) {
669
		printk(KERN_ERR
787
		printk(KERN_ERR
670
		       "ni_mc: Bogus length %zu in firmware \"%s\"\n",
788
		       "ni_mc: Bogus length %zu in firmware \"%s\"\n",
671
		       rdev->mc_fw->size, fw_name);
789
		       rdev->mc_fw->size, fw_name);
672
		err = -EINVAL;
790
		err = -EINVAL;
673
	}
791
	}
674
	}
792
	}
675
out:
-
 
676
	platform_device_unregister(pdev);
-
 
-
 
793
 
-
 
794
	if ((rdev->family >= CHIP_BARTS) && (rdev->family <= CHIP_CAYMAN)) {
-
 
795
		snprintf(fw_name, sizeof(fw_name), "radeon/%s_smc.bin", chip_name);
-
 
796
		err = request_firmware(&rdev->smc_fw, fw_name, rdev->dev);
-
 
797
		if (err) {
-
 
798
			printk(KERN_ERR
-
 
799
			       "smc: error loading firmware \"%s\"\n",
-
 
800
			       fw_name);
-
 
801
			release_firmware(rdev->smc_fw);
-
 
802
			rdev->smc_fw = NULL;
-
 
803
			err = 0;
-
 
804
		} else if (rdev->smc_fw->size != smc_req_size) {
-
 
805
			printk(KERN_ERR
-
 
806
			       "ni_mc: Bogus length %zu in firmware \"%s\"\n",
-
 
807
			       rdev->mc_fw->size, fw_name);
-
 
808
			err = -EINVAL;
-
 
809
		}
-
 
810
	}
-
 
811
 
677
 
812
out:
678
	if (err) {
813
	if (err) {
679
		if (err != -EINVAL)
814
		if (err != -EINVAL)
680
			printk(KERN_ERR
815
			printk(KERN_ERR
681
			       "ni_cp: Failed to load firmware \"%s\"\n",
816
			       "ni_cp: Failed to load firmware \"%s\"\n",
682
			       fw_name);
817
			       fw_name);
683
		release_firmware(rdev->pfp_fw);
818
		release_firmware(rdev->pfp_fw);
684
		rdev->pfp_fw = NULL;
819
		rdev->pfp_fw = NULL;
685
		release_firmware(rdev->me_fw);
820
		release_firmware(rdev->me_fw);
686
		rdev->me_fw = NULL;
821
		rdev->me_fw = NULL;
687
		release_firmware(rdev->rlc_fw);
822
		release_firmware(rdev->rlc_fw);
688
		rdev->rlc_fw = NULL;
823
		rdev->rlc_fw = NULL;
689
		release_firmware(rdev->mc_fw);
824
		release_firmware(rdev->mc_fw);
690
		rdev->mc_fw = NULL;
825
		rdev->mc_fw = NULL;
691
	}
826
	}
692
	return err;
827
	return err;
693
}
828
}
-
 
829
 
-
 
830
int tn_get_temp(struct radeon_device *rdev)
-
 
831
{
-
 
832
	u32 temp = RREG32_SMC(TN_CURRENT_GNB_TEMP) & 0x7ff;
-
 
833
	int actual_temp = (temp / 8) - 49;
-
 
834
 
-
 
835
	return actual_temp * 1000;
-
 
836
}
694
 
837
 
695
/*
838
/*
696
 * Core functions
839
 * Core functions
697
 */
840
 */
698
static void cayman_gpu_init(struct radeon_device *rdev)
841
static void cayman_gpu_init(struct radeon_device *rdev)
699
{
842
{
700
	u32 gb_addr_config = 0;
843
	u32 gb_addr_config = 0;
701
	u32 mc_shared_chmap, mc_arb_ramcfg;
844
	u32 mc_shared_chmap, mc_arb_ramcfg;
702
	u32 cgts_tcc_disable;
845
	u32 cgts_tcc_disable;
703
	u32 sx_debug_1;
846
	u32 sx_debug_1;
704
	u32 smx_dc_ctl0;
847
	u32 smx_dc_ctl0;
705
	u32 cgts_sm_ctrl_reg;
848
	u32 cgts_sm_ctrl_reg;
706
	u32 hdp_host_path_cntl;
849
	u32 hdp_host_path_cntl;
707
	u32 tmp;
850
	u32 tmp;
708
	u32 disabled_rb_mask;
851
	u32 disabled_rb_mask;
709
	int i, j;
852
	int i, j;
710
 
853
 
711
	switch (rdev->family) {
854
	switch (rdev->family) {
712
	case CHIP_CAYMAN:
855
	case CHIP_CAYMAN:
713
		rdev->config.cayman.max_shader_engines = 2;
856
		rdev->config.cayman.max_shader_engines = 2;
714
		rdev->config.cayman.max_pipes_per_simd = 4;
857
		rdev->config.cayman.max_pipes_per_simd = 4;
715
		rdev->config.cayman.max_tile_pipes = 8;
858
		rdev->config.cayman.max_tile_pipes = 8;
716
		rdev->config.cayman.max_simds_per_se = 12;
859
		rdev->config.cayman.max_simds_per_se = 12;
717
		rdev->config.cayman.max_backends_per_se = 4;
860
		rdev->config.cayman.max_backends_per_se = 4;
718
		rdev->config.cayman.max_texture_channel_caches = 8;
861
		rdev->config.cayman.max_texture_channel_caches = 8;
719
		rdev->config.cayman.max_gprs = 256;
862
		rdev->config.cayman.max_gprs = 256;
720
		rdev->config.cayman.max_threads = 256;
863
		rdev->config.cayman.max_threads = 256;
721
		rdev->config.cayman.max_gs_threads = 32;
864
		rdev->config.cayman.max_gs_threads = 32;
722
		rdev->config.cayman.max_stack_entries = 512;
865
		rdev->config.cayman.max_stack_entries = 512;
723
		rdev->config.cayman.sx_num_of_sets = 8;
866
		rdev->config.cayman.sx_num_of_sets = 8;
724
		rdev->config.cayman.sx_max_export_size = 256;
867
		rdev->config.cayman.sx_max_export_size = 256;
725
		rdev->config.cayman.sx_max_export_pos_size = 64;
868
		rdev->config.cayman.sx_max_export_pos_size = 64;
726
		rdev->config.cayman.sx_max_export_smx_size = 192;
869
		rdev->config.cayman.sx_max_export_smx_size = 192;
727
		rdev->config.cayman.max_hw_contexts = 8;
870
		rdev->config.cayman.max_hw_contexts = 8;
728
		rdev->config.cayman.sq_num_cf_insts = 2;
871
		rdev->config.cayman.sq_num_cf_insts = 2;
729
 
872
 
730
		rdev->config.cayman.sc_prim_fifo_size = 0x100;
873
		rdev->config.cayman.sc_prim_fifo_size = 0x100;
731
		rdev->config.cayman.sc_hiz_tile_fifo_size = 0x30;
874
		rdev->config.cayman.sc_hiz_tile_fifo_size = 0x30;
732
		rdev->config.cayman.sc_earlyz_tile_fifo_size = 0x130;
875
		rdev->config.cayman.sc_earlyz_tile_fifo_size = 0x130;
733
		gb_addr_config = CAYMAN_GB_ADDR_CONFIG_GOLDEN;
876
		gb_addr_config = CAYMAN_GB_ADDR_CONFIG_GOLDEN;
734
		break;
877
		break;
735
	case CHIP_ARUBA:
878
	case CHIP_ARUBA:
736
	default:
879
	default:
737
		rdev->config.cayman.max_shader_engines = 1;
880
		rdev->config.cayman.max_shader_engines = 1;
738
		rdev->config.cayman.max_pipes_per_simd = 4;
881
		rdev->config.cayman.max_pipes_per_simd = 4;
739
		rdev->config.cayman.max_tile_pipes = 2;
882
		rdev->config.cayman.max_tile_pipes = 2;
740
		if ((rdev->pdev->device == 0x9900) ||
883
		if ((rdev->pdev->device == 0x9900) ||
741
		    (rdev->pdev->device == 0x9901) ||
884
		    (rdev->pdev->device == 0x9901) ||
742
		    (rdev->pdev->device == 0x9905) ||
885
		    (rdev->pdev->device == 0x9905) ||
743
		    (rdev->pdev->device == 0x9906) ||
886
		    (rdev->pdev->device == 0x9906) ||
744
		    (rdev->pdev->device == 0x9907) ||
887
		    (rdev->pdev->device == 0x9907) ||
745
		    (rdev->pdev->device == 0x9908) ||
888
		    (rdev->pdev->device == 0x9908) ||
746
		    (rdev->pdev->device == 0x9909) ||
889
		    (rdev->pdev->device == 0x9909) ||
747
		    (rdev->pdev->device == 0x990B) ||
890
		    (rdev->pdev->device == 0x990B) ||
748
		    (rdev->pdev->device == 0x990C) ||
891
		    (rdev->pdev->device == 0x990C) ||
749
		    (rdev->pdev->device == 0x990F) ||
892
		    (rdev->pdev->device == 0x990F) ||
750
		    (rdev->pdev->device == 0x9910) ||
893
		    (rdev->pdev->device == 0x9910) ||
751
		    (rdev->pdev->device == 0x9917) ||
894
		    (rdev->pdev->device == 0x9917) ||
752
		    (rdev->pdev->device == 0x9999) ||
895
		    (rdev->pdev->device == 0x9999) ||
753
		    (rdev->pdev->device == 0x999C)) {
896
		    (rdev->pdev->device == 0x999C)) {
754
			rdev->config.cayman.max_simds_per_se = 6;
897
			rdev->config.cayman.max_simds_per_se = 6;
755
			rdev->config.cayman.max_backends_per_se = 2;
898
			rdev->config.cayman.max_backends_per_se = 2;
-
 
899
			rdev->config.cayman.max_hw_contexts = 8;
-
 
900
			rdev->config.cayman.sx_max_export_size = 256;
-
 
901
			rdev->config.cayman.sx_max_export_pos_size = 64;
-
 
902
			rdev->config.cayman.sx_max_export_smx_size = 192;
756
		} else if ((rdev->pdev->device == 0x9903) ||
903
		} else if ((rdev->pdev->device == 0x9903) ||
757
			   (rdev->pdev->device == 0x9904) ||
904
			   (rdev->pdev->device == 0x9904) ||
758
			   (rdev->pdev->device == 0x990A) ||
905
			   (rdev->pdev->device == 0x990A) ||
759
			   (rdev->pdev->device == 0x990D) ||
906
			   (rdev->pdev->device == 0x990D) ||
760
			   (rdev->pdev->device == 0x990E) ||
907
			   (rdev->pdev->device == 0x990E) ||
761
			   (rdev->pdev->device == 0x9913) ||
908
			   (rdev->pdev->device == 0x9913) ||
762
			   (rdev->pdev->device == 0x9918) ||
909
			   (rdev->pdev->device == 0x9918) ||
763
			   (rdev->pdev->device == 0x999D)) {
910
			   (rdev->pdev->device == 0x999D)) {
764
			rdev->config.cayman.max_simds_per_se = 4;
911
			rdev->config.cayman.max_simds_per_se = 4;
765
			rdev->config.cayman.max_backends_per_se = 2;
912
			rdev->config.cayman.max_backends_per_se = 2;
-
 
913
			rdev->config.cayman.max_hw_contexts = 8;
-
 
914
			rdev->config.cayman.sx_max_export_size = 256;
-
 
915
			rdev->config.cayman.sx_max_export_pos_size = 64;
-
 
916
			rdev->config.cayman.sx_max_export_smx_size = 192;
766
		} else if ((rdev->pdev->device == 0x9919) ||
917
		} else if ((rdev->pdev->device == 0x9919) ||
767
			   (rdev->pdev->device == 0x9990) ||
918
			   (rdev->pdev->device == 0x9990) ||
768
			   (rdev->pdev->device == 0x9991) ||
919
			   (rdev->pdev->device == 0x9991) ||
769
			   (rdev->pdev->device == 0x9994) ||
920
			   (rdev->pdev->device == 0x9994) ||
770
			   (rdev->pdev->device == 0x9995) ||
921
			   (rdev->pdev->device == 0x9995) ||
771
			   (rdev->pdev->device == 0x9996) ||
922
			   (rdev->pdev->device == 0x9996) ||
772
			   (rdev->pdev->device == 0x999A) ||
923
			   (rdev->pdev->device == 0x999A) ||
773
			   (rdev->pdev->device == 0x99A0)) {
924
			   (rdev->pdev->device == 0x99A0)) {
774
			rdev->config.cayman.max_simds_per_se = 3;
925
			rdev->config.cayman.max_simds_per_se = 3;
775
			rdev->config.cayman.max_backends_per_se = 1;
926
			rdev->config.cayman.max_backends_per_se = 1;
-
 
927
			rdev->config.cayman.max_hw_contexts = 4;
-
 
928
			rdev->config.cayman.sx_max_export_size = 128;
-
 
929
			rdev->config.cayman.sx_max_export_pos_size = 32;
-
 
930
			rdev->config.cayman.sx_max_export_smx_size = 96;
776
		} else {
931
		} else {
777
			rdev->config.cayman.max_simds_per_se = 2;
932
			rdev->config.cayman.max_simds_per_se = 2;
778
			rdev->config.cayman.max_backends_per_se = 1;
933
			rdev->config.cayman.max_backends_per_se = 1;
-
 
934
			rdev->config.cayman.max_hw_contexts = 4;
-
 
935
			rdev->config.cayman.sx_max_export_size = 128;
-
 
936
			rdev->config.cayman.sx_max_export_pos_size = 32;
-
 
937
			rdev->config.cayman.sx_max_export_smx_size = 96;
779
		}
938
		}
780
		rdev->config.cayman.max_texture_channel_caches = 2;
939
		rdev->config.cayman.max_texture_channel_caches = 2;
781
		rdev->config.cayman.max_gprs = 256;
940
		rdev->config.cayman.max_gprs = 256;
782
		rdev->config.cayman.max_threads = 256;
941
		rdev->config.cayman.max_threads = 256;
783
		rdev->config.cayman.max_gs_threads = 32;
942
		rdev->config.cayman.max_gs_threads = 32;
784
		rdev->config.cayman.max_stack_entries = 512;
943
		rdev->config.cayman.max_stack_entries = 512;
785
		rdev->config.cayman.sx_num_of_sets = 8;
944
		rdev->config.cayman.sx_num_of_sets = 8;
786
		rdev->config.cayman.sx_max_export_size = 256;
-
 
787
		rdev->config.cayman.sx_max_export_pos_size = 64;
-
 
788
		rdev->config.cayman.sx_max_export_smx_size = 192;
-
 
789
		rdev->config.cayman.max_hw_contexts = 8;
-
 
790
		rdev->config.cayman.sq_num_cf_insts = 2;
945
		rdev->config.cayman.sq_num_cf_insts = 2;
791
 
946
 
792
		rdev->config.cayman.sc_prim_fifo_size = 0x40;
947
		rdev->config.cayman.sc_prim_fifo_size = 0x40;
793
		rdev->config.cayman.sc_hiz_tile_fifo_size = 0x30;
948
		rdev->config.cayman.sc_hiz_tile_fifo_size = 0x30;
794
		rdev->config.cayman.sc_earlyz_tile_fifo_size = 0x130;
949
		rdev->config.cayman.sc_earlyz_tile_fifo_size = 0x130;
795
		gb_addr_config = ARUBA_GB_ADDR_CONFIG_GOLDEN;
950
		gb_addr_config = ARUBA_GB_ADDR_CONFIG_GOLDEN;
796
		break;
951
		break;
797
	}
952
	}
798
 
953
 
799
	/* Initialize HDP */
954
	/* Initialize HDP */
800
	for (i = 0, j = 0; i < 32; i++, j += 0x18) {
955
	for (i = 0, j = 0; i < 32; i++, j += 0x18) {
801
		WREG32((0x2c14 + j), 0x00000000);
956
		WREG32((0x2c14 + j), 0x00000000);
802
		WREG32((0x2c18 + j), 0x00000000);
957
		WREG32((0x2c18 + j), 0x00000000);
803
		WREG32((0x2c1c + j), 0x00000000);
958
		WREG32((0x2c1c + j), 0x00000000);
804
		WREG32((0x2c20 + j), 0x00000000);
959
		WREG32((0x2c20 + j), 0x00000000);
805
		WREG32((0x2c24 + j), 0x00000000);
960
		WREG32((0x2c24 + j), 0x00000000);
806
	}
961
	}
807
 
962
 
808
	WREG32(GRBM_CNTL, GRBM_READ_TIMEOUT(0xff));
963
	WREG32(GRBM_CNTL, GRBM_READ_TIMEOUT(0xff));
809
 
964
 
810
	evergreen_fix_pci_max_read_req_size(rdev);
965
	evergreen_fix_pci_max_read_req_size(rdev);
811
 
966
 
812
	mc_shared_chmap = RREG32(MC_SHARED_CHMAP);
967
	mc_shared_chmap = RREG32(MC_SHARED_CHMAP);
813
	mc_arb_ramcfg = RREG32(MC_ARB_RAMCFG);
968
	mc_arb_ramcfg = RREG32(MC_ARB_RAMCFG);
814
 
969
 
815
	tmp = (mc_arb_ramcfg & NOOFCOLS_MASK) >> NOOFCOLS_SHIFT;
970
	tmp = (mc_arb_ramcfg & NOOFCOLS_MASK) >> NOOFCOLS_SHIFT;
816
	rdev->config.cayman.mem_row_size_in_kb = (4 * (1 << (8 + tmp))) / 1024;
971
	rdev->config.cayman.mem_row_size_in_kb = (4 * (1 << (8 + tmp))) / 1024;
817
	if (rdev->config.cayman.mem_row_size_in_kb > 4)
972
	if (rdev->config.cayman.mem_row_size_in_kb > 4)
818
		rdev->config.cayman.mem_row_size_in_kb = 4;
973
		rdev->config.cayman.mem_row_size_in_kb = 4;
819
	/* XXX use MC settings? */
974
	/* XXX use MC settings? */
820
	rdev->config.cayman.shader_engine_tile_size = 32;
975
	rdev->config.cayman.shader_engine_tile_size = 32;
821
	rdev->config.cayman.num_gpus = 1;
976
	rdev->config.cayman.num_gpus = 1;
822
	rdev->config.cayman.multi_gpu_tile_size = 64;
977
	rdev->config.cayman.multi_gpu_tile_size = 64;
823
 
978
 
824
	tmp = (gb_addr_config & NUM_PIPES_MASK) >> NUM_PIPES_SHIFT;
979
	tmp = (gb_addr_config & NUM_PIPES_MASK) >> NUM_PIPES_SHIFT;
825
	rdev->config.cayman.num_tile_pipes = (1 << tmp);
980
	rdev->config.cayman.num_tile_pipes = (1 << tmp);
826
	tmp = (gb_addr_config & PIPE_INTERLEAVE_SIZE_MASK) >> PIPE_INTERLEAVE_SIZE_SHIFT;
981
	tmp = (gb_addr_config & PIPE_INTERLEAVE_SIZE_MASK) >> PIPE_INTERLEAVE_SIZE_SHIFT;
827
	rdev->config.cayman.mem_max_burst_length_bytes = (tmp + 1) * 256;
982
	rdev->config.cayman.mem_max_burst_length_bytes = (tmp + 1) * 256;
828
	tmp = (gb_addr_config & NUM_SHADER_ENGINES_MASK) >> NUM_SHADER_ENGINES_SHIFT;
983
	tmp = (gb_addr_config & NUM_SHADER_ENGINES_MASK) >> NUM_SHADER_ENGINES_SHIFT;
829
	rdev->config.cayman.num_shader_engines = tmp + 1;
984
	rdev->config.cayman.num_shader_engines = tmp + 1;
830
	tmp = (gb_addr_config & NUM_GPUS_MASK) >> NUM_GPUS_SHIFT;
985
	tmp = (gb_addr_config & NUM_GPUS_MASK) >> NUM_GPUS_SHIFT;
831
	rdev->config.cayman.num_gpus = tmp + 1;
986
	rdev->config.cayman.num_gpus = tmp + 1;
832
	tmp = (gb_addr_config & MULTI_GPU_TILE_SIZE_MASK) >> MULTI_GPU_TILE_SIZE_SHIFT;
987
	tmp = (gb_addr_config & MULTI_GPU_TILE_SIZE_MASK) >> MULTI_GPU_TILE_SIZE_SHIFT;
833
	rdev->config.cayman.multi_gpu_tile_size = 1 << tmp;
988
	rdev->config.cayman.multi_gpu_tile_size = 1 << tmp;
834
	tmp = (gb_addr_config & ROW_SIZE_MASK) >> ROW_SIZE_SHIFT;
989
	tmp = (gb_addr_config & ROW_SIZE_MASK) >> ROW_SIZE_SHIFT;
835
	rdev->config.cayman.mem_row_size_in_kb = 1 << tmp;
990
	rdev->config.cayman.mem_row_size_in_kb = 1 << tmp;
836
 
991
 
837
 
992
 
838
	/* setup tiling info dword.  gb_addr_config is not adequate since it does
993
	/* setup tiling info dword.  gb_addr_config is not adequate since it does
839
	 * not have bank info, so create a custom tiling dword.
994
	 * not have bank info, so create a custom tiling dword.
840
	 * bits 3:0   num_pipes
995
	 * bits 3:0   num_pipes
841
	 * bits 7:4   num_banks
996
	 * bits 7:4   num_banks
842
	 * bits 11:8  group_size
997
	 * bits 11:8  group_size
843
	 * bits 15:12 row_size
998
	 * bits 15:12 row_size
844
	 */
999
	 */
845
	rdev->config.cayman.tile_config = 0;
1000
	rdev->config.cayman.tile_config = 0;
846
	switch (rdev->config.cayman.num_tile_pipes) {
1001
	switch (rdev->config.cayman.num_tile_pipes) {
847
	case 1:
1002
	case 1:
848
	default:
1003
	default:
849
		rdev->config.cayman.tile_config |= (0 << 0);
1004
		rdev->config.cayman.tile_config |= (0 << 0);
850
		break;
1005
		break;
851
	case 2:
1006
	case 2:
852
		rdev->config.cayman.tile_config |= (1 << 0);
1007
		rdev->config.cayman.tile_config |= (1 << 0);
853
		break;
1008
		break;
854
	case 4:
1009
	case 4:
855
		rdev->config.cayman.tile_config |= (2 << 0);
1010
		rdev->config.cayman.tile_config |= (2 << 0);
856
		break;
1011
		break;
857
	case 8:
1012
	case 8:
858
		rdev->config.cayman.tile_config |= (3 << 0);
1013
		rdev->config.cayman.tile_config |= (3 << 0);
859
		break;
1014
		break;
860
	}
1015
	}
861
 
1016
 
862
	/* num banks is 8 on all fusion asics. 0 = 4, 1 = 8, 2 = 16 */
1017
	/* num banks is 8 on all fusion asics. 0 = 4, 1 = 8, 2 = 16 */
863
	if (rdev->flags & RADEON_IS_IGP)
1018
	if (rdev->flags & RADEON_IS_IGP)
864
		rdev->config.cayman.tile_config |= 1 << 4;
1019
		rdev->config.cayman.tile_config |= 1 << 4;
865
	else {
1020
	else {
866
		switch ((mc_arb_ramcfg & NOOFBANK_MASK) >> NOOFBANK_SHIFT) {
1021
		switch ((mc_arb_ramcfg & NOOFBANK_MASK) >> NOOFBANK_SHIFT) {
867
		case 0: /* four banks */
1022
		case 0: /* four banks */
868
			rdev->config.cayman.tile_config |= 0 << 4;
1023
			rdev->config.cayman.tile_config |= 0 << 4;
869
			break;
1024
			break;
870
		case 1: /* eight banks */
1025
		case 1: /* eight banks */
871
			rdev->config.cayman.tile_config |= 1 << 4;
1026
			rdev->config.cayman.tile_config |= 1 << 4;
872
			break;
1027
			break;
873
		case 2: /* sixteen banks */
1028
		case 2: /* sixteen banks */
874
		default:
1029
		default:
875
			rdev->config.cayman.tile_config |= 2 << 4;
1030
			rdev->config.cayman.tile_config |= 2 << 4;
876
			break;
1031
			break;
877
		}
1032
		}
878
	}
1033
	}
879
	rdev->config.cayman.tile_config |=
1034
	rdev->config.cayman.tile_config |=
880
		((gb_addr_config & PIPE_INTERLEAVE_SIZE_MASK) >> PIPE_INTERLEAVE_SIZE_SHIFT) << 8;
1035
		((gb_addr_config & PIPE_INTERLEAVE_SIZE_MASK) >> PIPE_INTERLEAVE_SIZE_SHIFT) << 8;
881
	rdev->config.cayman.tile_config |=
1036
	rdev->config.cayman.tile_config |=
882
		((gb_addr_config & ROW_SIZE_MASK) >> ROW_SIZE_SHIFT) << 12;
1037
		((gb_addr_config & ROW_SIZE_MASK) >> ROW_SIZE_SHIFT) << 12;
883
 
1038
 
884
	tmp = 0;
1039
	tmp = 0;
885
	for (i = (rdev->config.cayman.max_shader_engines - 1); i >= 0; i--) {
1040
	for (i = (rdev->config.cayman.max_shader_engines - 1); i >= 0; i--) {
886
		u32 rb_disable_bitmap;
1041
		u32 rb_disable_bitmap;
887
 
1042
 
888
		WREG32(GRBM_GFX_INDEX, INSTANCE_BROADCAST_WRITES | SE_INDEX(i));
1043
		WREG32(GRBM_GFX_INDEX, INSTANCE_BROADCAST_WRITES | SE_INDEX(i));
889
		WREG32(RLC_GFX_INDEX, INSTANCE_BROADCAST_WRITES | SE_INDEX(i));
1044
		WREG32(RLC_GFX_INDEX, INSTANCE_BROADCAST_WRITES | SE_INDEX(i));
890
		rb_disable_bitmap = (RREG32(CC_RB_BACKEND_DISABLE) & 0x00ff0000) >> 16;
1045
		rb_disable_bitmap = (RREG32(CC_RB_BACKEND_DISABLE) & 0x00ff0000) >> 16;
891
		tmp <<= 4;
1046
		tmp <<= 4;
892
		tmp |= rb_disable_bitmap;
1047
		tmp |= rb_disable_bitmap;
893
	}
1048
	}
894
	/* enabled rb are just the one not disabled :) */
1049
	/* enabled rb are just the one not disabled :) */
895
	disabled_rb_mask = tmp;
1050
	disabled_rb_mask = tmp;
896
	tmp = 0;
1051
	tmp = 0;
897
	for (i = 0; i < (rdev->config.cayman.max_backends_per_se * rdev->config.cayman.max_shader_engines); i++)
1052
	for (i = 0; i < (rdev->config.cayman.max_backends_per_se * rdev->config.cayman.max_shader_engines); i++)
898
		tmp |= (1 << i);
1053
		tmp |= (1 << i);
899
	/* if all the backends are disabled, fix it up here */
1054
	/* if all the backends are disabled, fix it up here */
900
	if ((disabled_rb_mask & tmp) == tmp) {
1055
	if ((disabled_rb_mask & tmp) == tmp) {
901
		for (i = 0; i < (rdev->config.cayman.max_backends_per_se * rdev->config.cayman.max_shader_engines); i++)
1056
		for (i = 0; i < (rdev->config.cayman.max_backends_per_se * rdev->config.cayman.max_shader_engines); i++)
902
			disabled_rb_mask &= ~(1 << i);
1057
			disabled_rb_mask &= ~(1 << i);
903
	}
1058
	}
-
 
1059
 
-
 
1060
	for (i = 0; i < rdev->config.cayman.max_shader_engines; i++) {
-
 
1061
		u32 simd_disable_bitmap;
-
 
1062
 
-
 
1063
		WREG32(GRBM_GFX_INDEX, INSTANCE_BROADCAST_WRITES | SE_INDEX(i));
-
 
1064
		WREG32(RLC_GFX_INDEX, INSTANCE_BROADCAST_WRITES | SE_INDEX(i));
-
 
1065
		simd_disable_bitmap = (RREG32(CC_GC_SHADER_PIPE_CONFIG) & 0xffff0000) >> 16;
-
 
1066
		simd_disable_bitmap |= 0xffffffff << rdev->config.cayman.max_simds_per_se;
-
 
1067
		tmp <<= 16;
-
 
1068
		tmp |= simd_disable_bitmap;
-
 
1069
	}
-
 
1070
	rdev->config.cayman.active_simds = hweight32(~tmp);
904
 
1071
 
905
	WREG32(GRBM_GFX_INDEX, INSTANCE_BROADCAST_WRITES | SE_BROADCAST_WRITES);
1072
	WREG32(GRBM_GFX_INDEX, INSTANCE_BROADCAST_WRITES | SE_BROADCAST_WRITES);
906
	WREG32(RLC_GFX_INDEX, INSTANCE_BROADCAST_WRITES | SE_BROADCAST_WRITES);
1073
	WREG32(RLC_GFX_INDEX, INSTANCE_BROADCAST_WRITES | SE_BROADCAST_WRITES);
907
 
1074
 
908
	WREG32(GB_ADDR_CONFIG, gb_addr_config);
1075
	WREG32(GB_ADDR_CONFIG, gb_addr_config);
909
	WREG32(DMIF_ADDR_CONFIG, gb_addr_config);
1076
	WREG32(DMIF_ADDR_CONFIG, gb_addr_config);
910
	if (ASIC_IS_DCE6(rdev))
1077
	if (ASIC_IS_DCE6(rdev))
911
		WREG32(DMIF_ADDR_CALC, gb_addr_config);
1078
		WREG32(DMIF_ADDR_CALC, gb_addr_config);
912
	WREG32(HDP_ADDR_CONFIG, gb_addr_config);
1079
	WREG32(HDP_ADDR_CONFIG, gb_addr_config);
913
	WREG32(DMA_TILING_CONFIG + DMA0_REGISTER_OFFSET, gb_addr_config);
1080
	WREG32(DMA_TILING_CONFIG + DMA0_REGISTER_OFFSET, gb_addr_config);
914
	WREG32(DMA_TILING_CONFIG + DMA1_REGISTER_OFFSET, gb_addr_config);
1081
	WREG32(DMA_TILING_CONFIG + DMA1_REGISTER_OFFSET, gb_addr_config);
915
	WREG32(UVD_UDEC_ADDR_CONFIG, gb_addr_config);
1082
	WREG32(UVD_UDEC_ADDR_CONFIG, gb_addr_config);
916
	WREG32(UVD_UDEC_DB_ADDR_CONFIG, gb_addr_config);
1083
	WREG32(UVD_UDEC_DB_ADDR_CONFIG, gb_addr_config);
917
	WREG32(UVD_UDEC_DBW_ADDR_CONFIG, gb_addr_config);
1084
	WREG32(UVD_UDEC_DBW_ADDR_CONFIG, gb_addr_config);
918
 
1085
 
919
	if ((rdev->config.cayman.max_backends_per_se == 1) &&
1086
	if ((rdev->config.cayman.max_backends_per_se == 1) &&
920
	    (rdev->flags & RADEON_IS_IGP)) {
1087
	    (rdev->flags & RADEON_IS_IGP)) {
921
		if ((disabled_rb_mask & 3) == 1) {
1088
		if ((disabled_rb_mask & 3) == 1) {
922
			/* RB0 disabled, RB1 enabled */
1089
			/* RB0 disabled, RB1 enabled */
923
			tmp = 0x11111111;
1090
			tmp = 0x11111111;
924
		} else {
1091
		} else {
925
			/* RB1 disabled, RB0 enabled */
1092
			/* RB1 disabled, RB0 enabled */
926
			tmp = 0x00000000;
1093
			tmp = 0x00000000;
927
		}
1094
		}
928
	} else {
1095
	} else {
929
	tmp = gb_addr_config & NUM_PIPES_MASK;
1096
	tmp = gb_addr_config & NUM_PIPES_MASK;
930
	tmp = r6xx_remap_render_backend(rdev, tmp,
1097
	tmp = r6xx_remap_render_backend(rdev, tmp,
931
					rdev->config.cayman.max_backends_per_se *
1098
					rdev->config.cayman.max_backends_per_se *
932
					rdev->config.cayman.max_shader_engines,
1099
					rdev->config.cayman.max_shader_engines,
933
					CAYMAN_MAX_BACKENDS, disabled_rb_mask);
1100
					CAYMAN_MAX_BACKENDS, disabled_rb_mask);
934
	}
1101
	}
935
	WREG32(GB_BACKEND_MAP, tmp);
1102
	WREG32(GB_BACKEND_MAP, tmp);
936
 
1103
 
937
	cgts_tcc_disable = 0xffff0000;
1104
	cgts_tcc_disable = 0xffff0000;
938
	for (i = 0; i < rdev->config.cayman.max_texture_channel_caches; i++)
1105
	for (i = 0; i < rdev->config.cayman.max_texture_channel_caches; i++)
939
		cgts_tcc_disable &= ~(1 << (16 + i));
1106
		cgts_tcc_disable &= ~(1 << (16 + i));
940
	WREG32(CGTS_TCC_DISABLE, cgts_tcc_disable);
1107
	WREG32(CGTS_TCC_DISABLE, cgts_tcc_disable);
941
	WREG32(CGTS_SYS_TCC_DISABLE, cgts_tcc_disable);
1108
	WREG32(CGTS_SYS_TCC_DISABLE, cgts_tcc_disable);
942
	WREG32(CGTS_USER_SYS_TCC_DISABLE, cgts_tcc_disable);
1109
	WREG32(CGTS_USER_SYS_TCC_DISABLE, cgts_tcc_disable);
943
	WREG32(CGTS_USER_TCC_DISABLE, cgts_tcc_disable);
1110
	WREG32(CGTS_USER_TCC_DISABLE, cgts_tcc_disable);
944
 
1111
 
945
	/* reprogram the shader complex */
1112
	/* reprogram the shader complex */
946
	cgts_sm_ctrl_reg = RREG32(CGTS_SM_CTRL_REG);
1113
	cgts_sm_ctrl_reg = RREG32(CGTS_SM_CTRL_REG);
947
	for (i = 0; i < 16; i++)
1114
	for (i = 0; i < 16; i++)
948
		WREG32(CGTS_SM_CTRL_REG, OVERRIDE);
1115
		WREG32(CGTS_SM_CTRL_REG, OVERRIDE);
949
	WREG32(CGTS_SM_CTRL_REG, cgts_sm_ctrl_reg);
1116
	WREG32(CGTS_SM_CTRL_REG, cgts_sm_ctrl_reg);
950
 
1117
 
951
	/* set HW defaults for 3D engine */
1118
	/* set HW defaults for 3D engine */
952
	WREG32(CP_MEQ_THRESHOLDS, MEQ1_START(0x30) | MEQ2_START(0x60));
1119
	WREG32(CP_MEQ_THRESHOLDS, MEQ1_START(0x30) | MEQ2_START(0x60));
953
 
1120
 
954
	sx_debug_1 = RREG32(SX_DEBUG_1);
1121
	sx_debug_1 = RREG32(SX_DEBUG_1);
955
	sx_debug_1 |= ENABLE_NEW_SMX_ADDRESS;
1122
	sx_debug_1 |= ENABLE_NEW_SMX_ADDRESS;
956
	WREG32(SX_DEBUG_1, sx_debug_1);
1123
	WREG32(SX_DEBUG_1, sx_debug_1);
957
 
1124
 
958
	smx_dc_ctl0 = RREG32(SMX_DC_CTL0);
1125
	smx_dc_ctl0 = RREG32(SMX_DC_CTL0);
959
	smx_dc_ctl0 &= ~NUMBER_OF_SETS(0x1ff);
1126
	smx_dc_ctl0 &= ~NUMBER_OF_SETS(0x1ff);
960
	smx_dc_ctl0 |= NUMBER_OF_SETS(rdev->config.cayman.sx_num_of_sets);
1127
	smx_dc_ctl0 |= NUMBER_OF_SETS(rdev->config.cayman.sx_num_of_sets);
961
	WREG32(SMX_DC_CTL0, smx_dc_ctl0);
1128
	WREG32(SMX_DC_CTL0, smx_dc_ctl0);
962
 
1129
 
963
	WREG32(SPI_CONFIG_CNTL_1, VTX_DONE_DELAY(4) | CRC_SIMD_ID_WADDR_DISABLE);
1130
	WREG32(SPI_CONFIG_CNTL_1, VTX_DONE_DELAY(4) | CRC_SIMD_ID_WADDR_DISABLE);
964
 
1131
 
965
	/* need to be explicitly zero-ed */
1132
	/* need to be explicitly zero-ed */
966
	WREG32(VGT_OFFCHIP_LDS_BASE, 0);
1133
	WREG32(VGT_OFFCHIP_LDS_BASE, 0);
967
	WREG32(SQ_LSTMP_RING_BASE, 0);
1134
	WREG32(SQ_LSTMP_RING_BASE, 0);
968
	WREG32(SQ_HSTMP_RING_BASE, 0);
1135
	WREG32(SQ_HSTMP_RING_BASE, 0);
969
	WREG32(SQ_ESTMP_RING_BASE, 0);
1136
	WREG32(SQ_ESTMP_RING_BASE, 0);
970
	WREG32(SQ_GSTMP_RING_BASE, 0);
1137
	WREG32(SQ_GSTMP_RING_BASE, 0);
971
	WREG32(SQ_VSTMP_RING_BASE, 0);
1138
	WREG32(SQ_VSTMP_RING_BASE, 0);
972
	WREG32(SQ_PSTMP_RING_BASE, 0);
1139
	WREG32(SQ_PSTMP_RING_BASE, 0);
973
 
1140
 
974
	WREG32(TA_CNTL_AUX, DISABLE_CUBE_ANISO);
1141
	WREG32(TA_CNTL_AUX, DISABLE_CUBE_ANISO);
975
 
1142
 
976
	WREG32(SX_EXPORT_BUFFER_SIZES, (COLOR_BUFFER_SIZE((rdev->config.cayman.sx_max_export_size / 4) - 1) |
1143
	WREG32(SX_EXPORT_BUFFER_SIZES, (COLOR_BUFFER_SIZE((rdev->config.cayman.sx_max_export_size / 4) - 1) |
977
					POSITION_BUFFER_SIZE((rdev->config.cayman.sx_max_export_pos_size / 4) - 1) |
1144
					POSITION_BUFFER_SIZE((rdev->config.cayman.sx_max_export_pos_size / 4) - 1) |
978
					SMX_BUFFER_SIZE((rdev->config.cayman.sx_max_export_smx_size / 4) - 1)));
1145
					SMX_BUFFER_SIZE((rdev->config.cayman.sx_max_export_smx_size / 4) - 1)));
979
 
1146
 
980
	WREG32(PA_SC_FIFO_SIZE, (SC_PRIM_FIFO_SIZE(rdev->config.cayman.sc_prim_fifo_size) |
1147
	WREG32(PA_SC_FIFO_SIZE, (SC_PRIM_FIFO_SIZE(rdev->config.cayman.sc_prim_fifo_size) |
981
				 SC_HIZ_TILE_FIFO_SIZE(rdev->config.cayman.sc_hiz_tile_fifo_size) |
1148
				 SC_HIZ_TILE_FIFO_SIZE(rdev->config.cayman.sc_hiz_tile_fifo_size) |
982
				 SC_EARLYZ_TILE_FIFO_SIZE(rdev->config.cayman.sc_earlyz_tile_fifo_size)));
1149
				 SC_EARLYZ_TILE_FIFO_SIZE(rdev->config.cayman.sc_earlyz_tile_fifo_size)));
983
 
1150
 
984
 
1151
 
985
	WREG32(VGT_NUM_INSTANCES, 1);
1152
	WREG32(VGT_NUM_INSTANCES, 1);
986
 
1153
 
987
	WREG32(CP_PERFMON_CNTL, 0);
1154
	WREG32(CP_PERFMON_CNTL, 0);
988
 
1155
 
989
	WREG32(SQ_MS_FIFO_SIZES, (CACHE_FIFO_SIZE(16 * rdev->config.cayman.sq_num_cf_insts) |
1156
	WREG32(SQ_MS_FIFO_SIZES, (CACHE_FIFO_SIZE(16 * rdev->config.cayman.sq_num_cf_insts) |
990
				  FETCH_FIFO_HIWATER(0x4) |
1157
				  FETCH_FIFO_HIWATER(0x4) |
991
				  DONE_FIFO_HIWATER(0xe0) |
1158
				  DONE_FIFO_HIWATER(0xe0) |
992
				  ALU_UPDATE_FIFO_HIWATER(0x8)));
1159
				  ALU_UPDATE_FIFO_HIWATER(0x8)));
993
 
1160
 
994
	WREG32(SQ_GPR_RESOURCE_MGMT_1, NUM_CLAUSE_TEMP_GPRS(4));
1161
	WREG32(SQ_GPR_RESOURCE_MGMT_1, NUM_CLAUSE_TEMP_GPRS(4));
995
	WREG32(SQ_CONFIG, (VC_ENABLE |
1162
	WREG32(SQ_CONFIG, (VC_ENABLE |
996
			   EXPORT_SRC_C |
1163
			   EXPORT_SRC_C |
997
			   GFX_PRIO(0) |
1164
			   GFX_PRIO(0) |
998
			   CS1_PRIO(0) |
1165
			   CS1_PRIO(0) |
999
			   CS2_PRIO(1)));
1166
			   CS2_PRIO(1)));
1000
	WREG32(SQ_DYN_GPR_CNTL_PS_FLUSH_REQ, DYN_GPR_ENABLE);
1167
	WREG32(SQ_DYN_GPR_CNTL_PS_FLUSH_REQ, DYN_GPR_ENABLE);
1001
 
1168
 
1002
	WREG32(PA_SC_FORCE_EOV_MAX_CNTS, (FORCE_EOV_MAX_CLK_CNT(4095) |
1169
	WREG32(PA_SC_FORCE_EOV_MAX_CNTS, (FORCE_EOV_MAX_CLK_CNT(4095) |
1003
					  FORCE_EOV_MAX_REZ_CNT(255)));
1170
					  FORCE_EOV_MAX_REZ_CNT(255)));
1004
 
1171
 
1005
	WREG32(VGT_CACHE_INVALIDATION, CACHE_INVALIDATION(VC_AND_TC) |
1172
	WREG32(VGT_CACHE_INVALIDATION, CACHE_INVALIDATION(VC_AND_TC) |
1006
	       AUTO_INVLD_EN(ES_AND_GS_AUTO));
1173
	       AUTO_INVLD_EN(ES_AND_GS_AUTO));
1007
 
1174
 
1008
	WREG32(VGT_GS_VERTEX_REUSE, 16);
1175
	WREG32(VGT_GS_VERTEX_REUSE, 16);
1009
	WREG32(PA_SC_LINE_STIPPLE_STATE, 0);
1176
	WREG32(PA_SC_LINE_STIPPLE_STATE, 0);
1010
 
1177
 
1011
	WREG32(CB_PERF_CTR0_SEL_0, 0);
1178
	WREG32(CB_PERF_CTR0_SEL_0, 0);
1012
	WREG32(CB_PERF_CTR0_SEL_1, 0);
1179
	WREG32(CB_PERF_CTR0_SEL_1, 0);
1013
	WREG32(CB_PERF_CTR1_SEL_0, 0);
1180
	WREG32(CB_PERF_CTR1_SEL_0, 0);
1014
	WREG32(CB_PERF_CTR1_SEL_1, 0);
1181
	WREG32(CB_PERF_CTR1_SEL_1, 0);
1015
	WREG32(CB_PERF_CTR2_SEL_0, 0);
1182
	WREG32(CB_PERF_CTR2_SEL_0, 0);
1016
	WREG32(CB_PERF_CTR2_SEL_1, 0);
1183
	WREG32(CB_PERF_CTR2_SEL_1, 0);
1017
	WREG32(CB_PERF_CTR3_SEL_0, 0);
1184
	WREG32(CB_PERF_CTR3_SEL_0, 0);
1018
	WREG32(CB_PERF_CTR3_SEL_1, 0);
1185
	WREG32(CB_PERF_CTR3_SEL_1, 0);
1019
 
1186
 
1020
	tmp = RREG32(HDP_MISC_CNTL);
1187
	tmp = RREG32(HDP_MISC_CNTL);
1021
	tmp |= HDP_FLUSH_INVALIDATE_CACHE;
1188
	tmp |= HDP_FLUSH_INVALIDATE_CACHE;
1022
	WREG32(HDP_MISC_CNTL, tmp);
1189
	WREG32(HDP_MISC_CNTL, tmp);
1023
 
1190
 
1024
	hdp_host_path_cntl = RREG32(HDP_HOST_PATH_CNTL);
1191
	hdp_host_path_cntl = RREG32(HDP_HOST_PATH_CNTL);
1025
	WREG32(HDP_HOST_PATH_CNTL, hdp_host_path_cntl);
1192
	WREG32(HDP_HOST_PATH_CNTL, hdp_host_path_cntl);
1026
 
1193
 
1027
	WREG32(PA_CL_ENHANCE, CLIP_VTX_REORDER_ENA | NUM_CLIP_SEQ(3));
1194
	WREG32(PA_CL_ENHANCE, CLIP_VTX_REORDER_ENA | NUM_CLIP_SEQ(3));
1028
 
1195
 
1029
	udelay(50);
1196
	udelay(50);
-
 
1197
 
-
 
1198
	/* set clockgating golden values on TN */
-
 
1199
	if (rdev->family == CHIP_ARUBA) {
-
 
1200
		tmp = RREG32_CG(CG_CGTT_LOCAL_0);
-
 
1201
		tmp &= ~0x00380000;
-
 
1202
		WREG32_CG(CG_CGTT_LOCAL_0, tmp);
-
 
1203
                tmp = RREG32_CG(CG_CGTT_LOCAL_1);
-
 
1204
		tmp &= ~0x0e000000;
-
 
1205
		WREG32_CG(CG_CGTT_LOCAL_1, tmp);
-
 
1206
	}
1030
}
1207
}
1031
 
1208
 
1032
/*
1209
/*
1033
 * GART
1210
 * GART
1034
 */
1211
 */
1035
void cayman_pcie_gart_tlb_flush(struct radeon_device *rdev)
1212
void cayman_pcie_gart_tlb_flush(struct radeon_device *rdev)
1036
{
1213
{
1037
	/* flush hdp cache */
1214
	/* flush hdp cache */
1038
	WREG32(HDP_MEM_COHERENCY_FLUSH_CNTL, 0x1);
1215
	WREG32(HDP_MEM_COHERENCY_FLUSH_CNTL, 0x1);
1039
 
1216
 
1040
	/* bits 0-7 are the VM contexts0-7 */
1217
	/* bits 0-7 are the VM contexts0-7 */
1041
	WREG32(VM_INVALIDATE_REQUEST, 1);
1218
	WREG32(VM_INVALIDATE_REQUEST, 1);
1042
}
1219
}
1043
 
1220
 
1044
static int cayman_pcie_gart_enable(struct radeon_device *rdev)
1221
static int cayman_pcie_gart_enable(struct radeon_device *rdev)
1045
{
1222
{
1046
	int i, r;
1223
	int i, r;
1047
 
1224
 
1048
	if (rdev->gart.robj == NULL) {
1225
	if (rdev->gart.robj == NULL) {
1049
		dev_err(rdev->dev, "No VRAM object for PCIE GART.\n");
1226
		dev_err(rdev->dev, "No VRAM object for PCIE GART.\n");
1050
		return -EINVAL;
1227
		return -EINVAL;
1051
	}
1228
	}
1052
	r = radeon_gart_table_vram_pin(rdev);
1229
	r = radeon_gart_table_vram_pin(rdev);
1053
	if (r)
1230
	if (r)
1054
		return r;
1231
		return r;
1055
	radeon_gart_restore(rdev);
-
 
1056
	/* Setup TLB control */
1232
	/* Setup TLB control */
1057
	WREG32(MC_VM_MX_L1_TLB_CNTL,
1233
	WREG32(MC_VM_MX_L1_TLB_CNTL,
1058
	       (0xA << 7) |
1234
	       (0xA << 7) |
1059
	       ENABLE_L1_TLB |
1235
	       ENABLE_L1_TLB |
1060
	       ENABLE_L1_FRAGMENT_PROCESSING |
1236
	       ENABLE_L1_FRAGMENT_PROCESSING |
1061
	       SYSTEM_ACCESS_MODE_NOT_IN_SYS |
1237
	       SYSTEM_ACCESS_MODE_NOT_IN_SYS |
1062
	       ENABLE_ADVANCED_DRIVER_MODEL |
1238
	       ENABLE_ADVANCED_DRIVER_MODEL |
1063
	       SYSTEM_APERTURE_UNMAPPED_ACCESS_PASS_THRU);
1239
	       SYSTEM_APERTURE_UNMAPPED_ACCESS_PASS_THRU);
1064
	/* Setup L2 cache */
1240
	/* Setup L2 cache */
1065
	WREG32(VM_L2_CNTL, ENABLE_L2_CACHE |
1241
	WREG32(VM_L2_CNTL, ENABLE_L2_CACHE |
-
 
1242
	       ENABLE_L2_FRAGMENT_PROCESSING |
1066
	       ENABLE_L2_PTE_CACHE_LRU_UPDATE_BY_WRITE |
1243
	       ENABLE_L2_PTE_CACHE_LRU_UPDATE_BY_WRITE |
1067
	       ENABLE_L2_PDE0_CACHE_LRU_UPDATE_BY_WRITE |
1244
	       ENABLE_L2_PDE0_CACHE_LRU_UPDATE_BY_WRITE |
1068
	       EFFECTIVE_L2_QUEUE_SIZE(7) |
1245
	       EFFECTIVE_L2_QUEUE_SIZE(7) |
1069
	       CONTEXT1_IDENTITY_ACCESS_MODE(1));
1246
	       CONTEXT1_IDENTITY_ACCESS_MODE(1));
1070
	WREG32(VM_L2_CNTL2, INVALIDATE_ALL_L1_TLBS | INVALIDATE_L2_CACHE);
1247
	WREG32(VM_L2_CNTL2, INVALIDATE_ALL_L1_TLBS | INVALIDATE_L2_CACHE);
1071
	WREG32(VM_L2_CNTL3, L2_CACHE_BIGK_ASSOCIATIVITY |
1248
	WREG32(VM_L2_CNTL3, L2_CACHE_BIGK_ASSOCIATIVITY |
-
 
1249
	       BANK_SELECT(6) |
1072
	       L2_CACHE_BIGK_FRAGMENT_SIZE(6));
1250
	       L2_CACHE_BIGK_FRAGMENT_SIZE(6));
1073
	/* setup context0 */
1251
	/* setup context0 */
1074
	WREG32(VM_CONTEXT0_PAGE_TABLE_START_ADDR, rdev->mc.gtt_start >> 12);
1252
	WREG32(VM_CONTEXT0_PAGE_TABLE_START_ADDR, rdev->mc.gtt_start >> 12);
1075
	WREG32(VM_CONTEXT0_PAGE_TABLE_END_ADDR, rdev->mc.gtt_end >> 12);
1253
	WREG32(VM_CONTEXT0_PAGE_TABLE_END_ADDR, rdev->mc.gtt_end >> 12);
1076
	WREG32(VM_CONTEXT0_PAGE_TABLE_BASE_ADDR, rdev->gart.table_addr >> 12);
1254
	WREG32(VM_CONTEXT0_PAGE_TABLE_BASE_ADDR, rdev->gart.table_addr >> 12);
1077
	WREG32(VM_CONTEXT0_PROTECTION_FAULT_DEFAULT_ADDR,
1255
	WREG32(VM_CONTEXT0_PROTECTION_FAULT_DEFAULT_ADDR,
1078
			(u32)(rdev->dummy_page.addr >> 12));
1256
			(u32)(rdev->dummy_page.addr >> 12));
1079
	WREG32(VM_CONTEXT0_CNTL2, 0);
1257
	WREG32(VM_CONTEXT0_CNTL2, 0);
1080
	WREG32(VM_CONTEXT0_CNTL, ENABLE_CONTEXT | PAGE_TABLE_DEPTH(0) |
1258
	WREG32(VM_CONTEXT0_CNTL, ENABLE_CONTEXT | PAGE_TABLE_DEPTH(0) |
1081
				RANGE_PROTECTION_FAULT_ENABLE_DEFAULT);
1259
				RANGE_PROTECTION_FAULT_ENABLE_DEFAULT);
1082
 
1260
 
1083
	WREG32(0x15D4, 0);
1261
	WREG32(0x15D4, 0);
1084
	WREG32(0x15D8, 0);
1262
	WREG32(0x15D8, 0);
1085
	WREG32(0x15DC, 0);
1263
	WREG32(0x15DC, 0);
1086
 
1264
 
1087
	/* empty context1-7 */
1265
	/* empty context1-7 */
1088
	/* Assign the pt base to something valid for now; the pts used for
1266
	/* Assign the pt base to something valid for now; the pts used for
1089
	 * the VMs are determined by the application and setup and assigned
1267
	 * the VMs are determined by the application and setup and assigned
1090
	 * on the fly in the vm part of radeon_gart.c
1268
	 * on the fly in the vm part of radeon_gart.c
1091
	 */
1269
	 */
1092
	for (i = 1; i < 8; i++) {
1270
	for (i = 1; i < 8; i++) {
1093
		WREG32(VM_CONTEXT0_PAGE_TABLE_START_ADDR + (i << 2), 0);
1271
		WREG32(VM_CONTEXT0_PAGE_TABLE_START_ADDR + (i << 2), 0);
1094
		WREG32(VM_CONTEXT0_PAGE_TABLE_END_ADDR + (i << 2), rdev->vm_manager.max_pfn);
1272
		WREG32(VM_CONTEXT0_PAGE_TABLE_END_ADDR + (i << 2), rdev->vm_manager.max_pfn);
1095
		WREG32(VM_CONTEXT0_PAGE_TABLE_BASE_ADDR + (i << 2),
1273
		WREG32(VM_CONTEXT0_PAGE_TABLE_BASE_ADDR + (i << 2),
1096
			rdev->gart.table_addr >> 12);
1274
		       rdev->vm_manager.saved_table_addr[i]);
1097
	}
1275
	}
1098
 
1276
 
1099
	/* enable context1-7 */
1277
	/* enable context1-7 */
1100
	WREG32(VM_CONTEXT1_PROTECTION_FAULT_DEFAULT_ADDR,
1278
	WREG32(VM_CONTEXT1_PROTECTION_FAULT_DEFAULT_ADDR,
1101
	       (u32)(rdev->dummy_page.addr >> 12));
1279
	       (u32)(rdev->dummy_page.addr >> 12));
1102
	WREG32(VM_CONTEXT1_CNTL2, 4);
1280
	WREG32(VM_CONTEXT1_CNTL2, 4);
1103
	WREG32(VM_CONTEXT1_CNTL, ENABLE_CONTEXT | PAGE_TABLE_DEPTH(1) |
1281
	WREG32(VM_CONTEXT1_CNTL, ENABLE_CONTEXT | PAGE_TABLE_DEPTH(1) |
-
 
1282
				PAGE_TABLE_BLOCK_SIZE(radeon_vm_block_size - 9) |
1104
				RANGE_PROTECTION_FAULT_ENABLE_INTERRUPT |
1283
				RANGE_PROTECTION_FAULT_ENABLE_INTERRUPT |
1105
				RANGE_PROTECTION_FAULT_ENABLE_DEFAULT |
1284
				RANGE_PROTECTION_FAULT_ENABLE_DEFAULT |
1106
				DUMMY_PAGE_PROTECTION_FAULT_ENABLE_INTERRUPT |
1285
				DUMMY_PAGE_PROTECTION_FAULT_ENABLE_INTERRUPT |
1107
				DUMMY_PAGE_PROTECTION_FAULT_ENABLE_DEFAULT |
1286
				DUMMY_PAGE_PROTECTION_FAULT_ENABLE_DEFAULT |
1108
				PDE0_PROTECTION_FAULT_ENABLE_INTERRUPT |
1287
				PDE0_PROTECTION_FAULT_ENABLE_INTERRUPT |
1109
				PDE0_PROTECTION_FAULT_ENABLE_DEFAULT |
1288
				PDE0_PROTECTION_FAULT_ENABLE_DEFAULT |
1110
				VALID_PROTECTION_FAULT_ENABLE_INTERRUPT |
1289
				VALID_PROTECTION_FAULT_ENABLE_INTERRUPT |
1111
				VALID_PROTECTION_FAULT_ENABLE_DEFAULT |
1290
				VALID_PROTECTION_FAULT_ENABLE_DEFAULT |
1112
				READ_PROTECTION_FAULT_ENABLE_INTERRUPT |
1291
				READ_PROTECTION_FAULT_ENABLE_INTERRUPT |
1113
				READ_PROTECTION_FAULT_ENABLE_DEFAULT |
1292
				READ_PROTECTION_FAULT_ENABLE_DEFAULT |
1114
				WRITE_PROTECTION_FAULT_ENABLE_INTERRUPT |
1293
				WRITE_PROTECTION_FAULT_ENABLE_INTERRUPT |
1115
				WRITE_PROTECTION_FAULT_ENABLE_DEFAULT);
1294
				WRITE_PROTECTION_FAULT_ENABLE_DEFAULT);
1116
 
1295
 
1117
	cayman_pcie_gart_tlb_flush(rdev);
1296
	cayman_pcie_gart_tlb_flush(rdev);
1118
	DRM_INFO("PCIE GART of %uM enabled (table at 0x%016llX).\n",
1297
	DRM_INFO("PCIE GART of %uM enabled (table at 0x%016llX).\n",
1119
		 (unsigned)(rdev->mc.gtt_size >> 20),
1298
		 (unsigned)(rdev->mc.gtt_size >> 20),
1120
		 (unsigned long long)rdev->gart.table_addr);
1299
		 (unsigned long long)rdev->gart.table_addr);
1121
	rdev->gart.ready = true;
1300
	rdev->gart.ready = true;
1122
	return 0;
1301
	return 0;
1123
}
1302
}
1124
 
1303
 
1125
static void cayman_pcie_gart_disable(struct radeon_device *rdev)
1304
static void cayman_pcie_gart_disable(struct radeon_device *rdev)
1126
{
1305
{
-
 
1306
	unsigned i;
-
 
1307
 
-
 
1308
	for (i = 1; i < 8; ++i) {
-
 
1309
		rdev->vm_manager.saved_table_addr[i] = RREG32(
-
 
1310
			VM_CONTEXT0_PAGE_TABLE_BASE_ADDR + (i << 2));
-
 
1311
	}
-
 
1312
 
1127
	/* Disable all tables */
1313
	/* Disable all tables */
1128
	WREG32(VM_CONTEXT0_CNTL, 0);
1314
	WREG32(VM_CONTEXT0_CNTL, 0);
1129
	WREG32(VM_CONTEXT1_CNTL, 0);
1315
	WREG32(VM_CONTEXT1_CNTL, 0);
1130
	/* Setup TLB control */
1316
	/* Setup TLB control */
1131
	WREG32(MC_VM_MX_L1_TLB_CNTL, ENABLE_L1_FRAGMENT_PROCESSING |
1317
	WREG32(MC_VM_MX_L1_TLB_CNTL, ENABLE_L1_FRAGMENT_PROCESSING |
1132
	       SYSTEM_ACCESS_MODE_NOT_IN_SYS |
1318
	       SYSTEM_ACCESS_MODE_NOT_IN_SYS |
1133
	       SYSTEM_APERTURE_UNMAPPED_ACCESS_PASS_THRU);
1319
	       SYSTEM_APERTURE_UNMAPPED_ACCESS_PASS_THRU);
1134
	/* Setup L2 cache */
1320
	/* Setup L2 cache */
1135
	WREG32(VM_L2_CNTL, ENABLE_L2_PTE_CACHE_LRU_UPDATE_BY_WRITE |
1321
	WREG32(VM_L2_CNTL, ENABLE_L2_PTE_CACHE_LRU_UPDATE_BY_WRITE |
1136
	       ENABLE_L2_PDE0_CACHE_LRU_UPDATE_BY_WRITE |
1322
	       ENABLE_L2_PDE0_CACHE_LRU_UPDATE_BY_WRITE |
1137
	       EFFECTIVE_L2_QUEUE_SIZE(7) |
1323
	       EFFECTIVE_L2_QUEUE_SIZE(7) |
1138
	       CONTEXT1_IDENTITY_ACCESS_MODE(1));
1324
	       CONTEXT1_IDENTITY_ACCESS_MODE(1));
1139
	WREG32(VM_L2_CNTL2, 0);
1325
	WREG32(VM_L2_CNTL2, 0);
1140
	WREG32(VM_L2_CNTL3, L2_CACHE_BIGK_ASSOCIATIVITY |
1326
	WREG32(VM_L2_CNTL3, L2_CACHE_BIGK_ASSOCIATIVITY |
1141
	       L2_CACHE_BIGK_FRAGMENT_SIZE(6));
1327
	       L2_CACHE_BIGK_FRAGMENT_SIZE(6));
1142
	radeon_gart_table_vram_unpin(rdev);
1328
	radeon_gart_table_vram_unpin(rdev);
1143
}
1329
}
1144
 
1330
 
1145
void cayman_cp_int_cntl_setup(struct radeon_device *rdev,
1331
void cayman_cp_int_cntl_setup(struct radeon_device *rdev,
1146
			      int ring, u32 cp_int_cntl)
1332
			      int ring, u32 cp_int_cntl)
1147
{
1333
{
1148
	u32 srbm_gfx_cntl = RREG32(SRBM_GFX_CNTL) & ~3;
1334
	u32 srbm_gfx_cntl = RREG32(SRBM_GFX_CNTL) & ~3;
1149
 
1335
 
1150
	WREG32(SRBM_GFX_CNTL, srbm_gfx_cntl | (ring & 3));
1336
	WREG32(SRBM_GFX_CNTL, srbm_gfx_cntl | (ring & 3));
1151
	WREG32(CP_INT_CNTL, cp_int_cntl);
1337
	WREG32(CP_INT_CNTL, cp_int_cntl);
1152
}
1338
}
1153
 
1339
 
1154
/*
1340
/*
1155
 * CP.
1341
 * CP.
1156
 */
1342
 */
1157
void cayman_fence_ring_emit(struct radeon_device *rdev,
1343
void cayman_fence_ring_emit(struct radeon_device *rdev,
1158
			    struct radeon_fence *fence)
1344
			    struct radeon_fence *fence)
1159
{
1345
{
1160
	struct radeon_ring *ring = &rdev->ring[fence->ring];
1346
	struct radeon_ring *ring = &rdev->ring[fence->ring];
1161
	u64 addr = rdev->fence_drv[fence->ring].gpu_addr;
1347
	u64 addr = rdev->fence_drv[fence->ring].gpu_addr;
-
 
1348
	u32 cp_coher_cntl = PACKET3_FULL_CACHE_ENA | PACKET3_TC_ACTION_ENA |
-
 
1349
		PACKET3_SH_ACTION_ENA;
1162
 
1350
 
1163
	/* flush read cache over gart for this vmid */
-
 
1164
	radeon_ring_write(ring, PACKET3(PACKET3_SET_CONFIG_REG, 1));
-
 
1165
	radeon_ring_write(ring, (CP_COHER_CNTL2 - PACKET3_SET_CONFIG_REG_START) >> 2);
-
 
1166
	radeon_ring_write(ring, 0);
1351
	/* flush read cache over gart for this vmid */
1167
	radeon_ring_write(ring, PACKET3(PACKET3_SURFACE_SYNC, 3));
1352
	radeon_ring_write(ring, PACKET3(PACKET3_SURFACE_SYNC, 3));
1168
	radeon_ring_write(ring, PACKET3_TC_ACTION_ENA | PACKET3_SH_ACTION_ENA);
1353
	radeon_ring_write(ring, PACKET3_ENGINE_ME | cp_coher_cntl);
1169
	radeon_ring_write(ring, 0xFFFFFFFF);
1354
	radeon_ring_write(ring, 0xFFFFFFFF);
1170
	radeon_ring_write(ring, 0);
1355
	radeon_ring_write(ring, 0);
1171
	radeon_ring_write(ring, 10); /* poll interval */
1356
	radeon_ring_write(ring, 10); /* poll interval */
1172
	/* EVENT_WRITE_EOP - flush caches, send int */
1357
	/* EVENT_WRITE_EOP - flush caches, send int */
1173
	radeon_ring_write(ring, PACKET3(PACKET3_EVENT_WRITE_EOP, 4));
1358
	radeon_ring_write(ring, PACKET3(PACKET3_EVENT_WRITE_EOP, 4));
1174
	radeon_ring_write(ring, EVENT_TYPE(CACHE_FLUSH_AND_INV_EVENT_TS) | EVENT_INDEX(5));
1359
	radeon_ring_write(ring, EVENT_TYPE(CACHE_FLUSH_AND_INV_EVENT_TS) | EVENT_INDEX(5));
1175
	radeon_ring_write(ring, addr & 0xffffffff);
1360
	radeon_ring_write(ring, lower_32_bits(addr));
1176
	radeon_ring_write(ring, (upper_32_bits(addr) & 0xff) | DATA_SEL(1) | INT_SEL(2));
1361
	radeon_ring_write(ring, (upper_32_bits(addr) & 0xff) | DATA_SEL(1) | INT_SEL(2));
1177
	radeon_ring_write(ring, fence->seq);
1362
	radeon_ring_write(ring, fence->seq);
1178
	radeon_ring_write(ring, 0);
1363
	radeon_ring_write(ring, 0);
1179
}
1364
}
1180
 
1365
 
1181
void cayman_ring_ib_execute(struct radeon_device *rdev, struct radeon_ib *ib)
1366
void cayman_ring_ib_execute(struct radeon_device *rdev, struct radeon_ib *ib)
1182
{
1367
{
1183
	struct radeon_ring *ring = &rdev->ring[ib->ring];
1368
	struct radeon_ring *ring = &rdev->ring[ib->ring];
-
 
1369
	u32 cp_coher_cntl = PACKET3_FULL_CACHE_ENA | PACKET3_TC_ACTION_ENA |
-
 
1370
		PACKET3_SH_ACTION_ENA;
1184
 
1371
 
1185
	/* set to DX10/11 mode */
1372
	/* set to DX10/11 mode */
1186
	radeon_ring_write(ring, PACKET3(PACKET3_MODE_CONTROL, 0));
1373
	radeon_ring_write(ring, PACKET3(PACKET3_MODE_CONTROL, 0));
1187
	radeon_ring_write(ring, 1);
1374
	radeon_ring_write(ring, 1);
1188
 
1375
 
1189
	if (ring->rptr_save_reg) {
1376
	if (ring->rptr_save_reg) {
1190
		uint32_t next_rptr = ring->wptr + 3 + 4 + 8;
1377
		uint32_t next_rptr = ring->wptr + 3 + 4 + 8;
1191
		radeon_ring_write(ring, PACKET3(PACKET3_SET_CONFIG_REG, 1));
1378
		radeon_ring_write(ring, PACKET3(PACKET3_SET_CONFIG_REG, 1));
1192
		radeon_ring_write(ring, ((ring->rptr_save_reg -
1379
		radeon_ring_write(ring, ((ring->rptr_save_reg -
1193
					  PACKET3_SET_CONFIG_REG_START) >> 2));
1380
					  PACKET3_SET_CONFIG_REG_START) >> 2));
1194
		radeon_ring_write(ring, next_rptr);
1381
		radeon_ring_write(ring, next_rptr);
1195
	}
1382
	}
1196
 
1383
 
1197
	radeon_ring_write(ring, PACKET3(PACKET3_INDIRECT_BUFFER, 2));
1384
	radeon_ring_write(ring, PACKET3(PACKET3_INDIRECT_BUFFER, 2));
1198
	radeon_ring_write(ring,
1385
	radeon_ring_write(ring,
1199
#ifdef __BIG_ENDIAN
1386
#ifdef __BIG_ENDIAN
1200
			  (2 << 0) |
1387
			  (2 << 0) |
1201
#endif
1388
#endif
1202
			  (ib->gpu_addr & 0xFFFFFFFC));
1389
			  (ib->gpu_addr & 0xFFFFFFFC));
1203
	radeon_ring_write(ring, upper_32_bits(ib->gpu_addr) & 0xFF);
1390
	radeon_ring_write(ring, upper_32_bits(ib->gpu_addr) & 0xFF);
1204
	radeon_ring_write(ring, ib->length_dw |
1391
	radeon_ring_write(ring, ib->length_dw |
1205
			  (ib->vm ? (ib->vm->id << 24) : 0));
1392
			  (ib->vm ? (ib->vm->id << 24) : 0));
1206
 
1393
 
1207
	/* flush read cache over gart for this vmid */
1394
	/* flush read cache over gart for this vmid */
1208
	radeon_ring_write(ring, PACKET3(PACKET3_SET_CONFIG_REG, 1));
-
 
1209
	radeon_ring_write(ring, (CP_COHER_CNTL2 - PACKET3_SET_CONFIG_REG_START) >> 2);
-
 
1210
	radeon_ring_write(ring, ib->vm ? ib->vm->id : 0);
-
 
1211
	radeon_ring_write(ring, PACKET3(PACKET3_SURFACE_SYNC, 3));
1395
	radeon_ring_write(ring, PACKET3(PACKET3_SURFACE_SYNC, 3));
1212
	radeon_ring_write(ring, PACKET3_TC_ACTION_ENA | PACKET3_SH_ACTION_ENA);
1396
	radeon_ring_write(ring, PACKET3_ENGINE_ME | cp_coher_cntl);
1213
	radeon_ring_write(ring, 0xFFFFFFFF);
1397
	radeon_ring_write(ring, 0xFFFFFFFF);
1214
	radeon_ring_write(ring, 0);
1398
	radeon_ring_write(ring, 0);
1215
	radeon_ring_write(ring, 10); /* poll interval */
1399
	radeon_ring_write(ring, ((ib->vm ? ib->vm->id : 0) << 24) | 10); /* poll interval */
1216
}
-
 
1217
 
-
 
1218
void cayman_uvd_semaphore_emit(struct radeon_device *rdev,
-
 
1219
			       struct radeon_ring *ring,
-
 
1220
			       struct radeon_semaphore *semaphore,
-
 
1221
			       bool emit_wait)
-
 
1222
{
-
 
1223
	uint64_t addr = semaphore->gpu_addr;
-
 
1224
 
-
 
1225
	radeon_ring_write(ring, PACKET0(UVD_SEMA_ADDR_LOW, 0));
-
 
1226
	radeon_ring_write(ring, (addr >> 3) & 0x000FFFFF);
-
 
1227
 
-
 
1228
	radeon_ring_write(ring, PACKET0(UVD_SEMA_ADDR_HIGH, 0));
-
 
1229
	radeon_ring_write(ring, (addr >> 23) & 0x000FFFFF);
-
 
1230
 
-
 
1231
	radeon_ring_write(ring, PACKET0(UVD_SEMA_CMD, 0));
-
 
1232
	radeon_ring_write(ring, 0x80 | (emit_wait ? 1 : 0));
-
 
1233
}
1400
}
1234
 
1401
 
1235
static void cayman_cp_enable(struct radeon_device *rdev, bool enable)
1402
static void cayman_cp_enable(struct radeon_device *rdev, bool enable)
1236
{
1403
{
1237
	if (enable)
1404
	if (enable)
1238
		WREG32(CP_ME_CNTL, 0);
1405
		WREG32(CP_ME_CNTL, 0);
1239
	else {
1406
	else {
-
 
1407
		if (rdev->asic->copy.copy_ring_index == RADEON_RING_TYPE_GFX_INDEX)
1240
		radeon_ttm_set_active_vram_size(rdev, rdev->mc.visible_vram_size);
1408
		radeon_ttm_set_active_vram_size(rdev, rdev->mc.visible_vram_size);
1241
		WREG32(CP_ME_CNTL, (CP_ME_HALT | CP_PFP_HALT));
1409
		WREG32(CP_ME_CNTL, (CP_ME_HALT | CP_PFP_HALT));
1242
		WREG32(SCRATCH_UMSK, 0);
1410
		WREG32(SCRATCH_UMSK, 0);
1243
		rdev->ring[RADEON_RING_TYPE_GFX_INDEX].ready = false;
1411
		rdev->ring[RADEON_RING_TYPE_GFX_INDEX].ready = false;
1244
	}
1412
	}
1245
}
1413
}
-
 
1414
 
-
 
1415
u32 cayman_gfx_get_rptr(struct radeon_device *rdev,
-
 
1416
			struct radeon_ring *ring)
-
 
1417
{
-
 
1418
	u32 rptr;
-
 
1419
 
-
 
1420
	if (rdev->wb.enabled)
-
 
1421
		rptr = rdev->wb.wb[ring->rptr_offs/4];
-
 
1422
	else {
-
 
1423
		if (ring->idx == RADEON_RING_TYPE_GFX_INDEX)
-
 
1424
			rptr = RREG32(CP_RB0_RPTR);
-
 
1425
		else if (ring->idx == CAYMAN_RING_TYPE_CP1_INDEX)
-
 
1426
			rptr = RREG32(CP_RB1_RPTR);
-
 
1427
		else
-
 
1428
			rptr = RREG32(CP_RB2_RPTR);
-
 
1429
	}
-
 
1430
 
-
 
1431
	return rptr;
-
 
1432
}
-
 
1433
 
-
 
1434
u32 cayman_gfx_get_wptr(struct radeon_device *rdev,
-
 
1435
			struct radeon_ring *ring)
-
 
1436
{
-
 
1437
	u32 wptr;
-
 
1438
 
-
 
1439
	if (ring->idx == RADEON_RING_TYPE_GFX_INDEX)
-
 
1440
		wptr = RREG32(CP_RB0_WPTR);
-
 
1441
	else if (ring->idx == CAYMAN_RING_TYPE_CP1_INDEX)
-
 
1442
		wptr = RREG32(CP_RB1_WPTR);
-
 
1443
	else
-
 
1444
		wptr = RREG32(CP_RB2_WPTR);
-
 
1445
 
-
 
1446
	return wptr;
-
 
1447
}
-
 
1448
 
-
 
1449
void cayman_gfx_set_wptr(struct radeon_device *rdev,
-
 
1450
			 struct radeon_ring *ring)
-
 
1451
{
-
 
1452
	if (ring->idx == RADEON_RING_TYPE_GFX_INDEX) {
-
 
1453
		WREG32(CP_RB0_WPTR, ring->wptr);
-
 
1454
		(void)RREG32(CP_RB0_WPTR);
-
 
1455
	} else if (ring->idx == CAYMAN_RING_TYPE_CP1_INDEX) {
-
 
1456
		WREG32(CP_RB1_WPTR, ring->wptr);
-
 
1457
		(void)RREG32(CP_RB1_WPTR);
-
 
1458
	} else {
-
 
1459
		WREG32(CP_RB2_WPTR, ring->wptr);
-
 
1460
		(void)RREG32(CP_RB2_WPTR);
-
 
1461
	}
-
 
1462
}
1246
 
1463
 
1247
static int cayman_cp_load_microcode(struct radeon_device *rdev)
1464
static int cayman_cp_load_microcode(struct radeon_device *rdev)
1248
{
1465
{
1249
	const __be32 *fw_data;
1466
	const __be32 *fw_data;
1250
	int i;
1467
	int i;
1251
 
1468
 
1252
	if (!rdev->me_fw || !rdev->pfp_fw)
1469
	if (!rdev->me_fw || !rdev->pfp_fw)
1253
		return -EINVAL;
1470
		return -EINVAL;
1254
 
1471
 
1255
	cayman_cp_enable(rdev, false);
1472
	cayman_cp_enable(rdev, false);
1256
 
1473
 
1257
	fw_data = (const __be32 *)rdev->pfp_fw->data;
1474
	fw_data = (const __be32 *)rdev->pfp_fw->data;
1258
	WREG32(CP_PFP_UCODE_ADDR, 0);
1475
	WREG32(CP_PFP_UCODE_ADDR, 0);
1259
	for (i = 0; i < CAYMAN_PFP_UCODE_SIZE; i++)
1476
	for (i = 0; i < CAYMAN_PFP_UCODE_SIZE; i++)
1260
		WREG32(CP_PFP_UCODE_DATA, be32_to_cpup(fw_data++));
1477
		WREG32(CP_PFP_UCODE_DATA, be32_to_cpup(fw_data++));
1261
	WREG32(CP_PFP_UCODE_ADDR, 0);
1478
	WREG32(CP_PFP_UCODE_ADDR, 0);
1262
 
1479
 
1263
	fw_data = (const __be32 *)rdev->me_fw->data;
1480
	fw_data = (const __be32 *)rdev->me_fw->data;
1264
	WREG32(CP_ME_RAM_WADDR, 0);
1481
	WREG32(CP_ME_RAM_WADDR, 0);
1265
	for (i = 0; i < CAYMAN_PM4_UCODE_SIZE; i++)
1482
	for (i = 0; i < CAYMAN_PM4_UCODE_SIZE; i++)
1266
		WREG32(CP_ME_RAM_DATA, be32_to_cpup(fw_data++));
1483
		WREG32(CP_ME_RAM_DATA, be32_to_cpup(fw_data++));
1267
 
1484
 
1268
	WREG32(CP_PFP_UCODE_ADDR, 0);
1485
	WREG32(CP_PFP_UCODE_ADDR, 0);
1269
	WREG32(CP_ME_RAM_WADDR, 0);
1486
	WREG32(CP_ME_RAM_WADDR, 0);
1270
	WREG32(CP_ME_RAM_RADDR, 0);
1487
	WREG32(CP_ME_RAM_RADDR, 0);
1271
	return 0;
1488
	return 0;
1272
}
1489
}
1273
 
1490
 
1274
static int cayman_cp_start(struct radeon_device *rdev)
1491
static int cayman_cp_start(struct radeon_device *rdev)
1275
{
1492
{
1276
	struct radeon_ring *ring = &rdev->ring[RADEON_RING_TYPE_GFX_INDEX];
1493
	struct radeon_ring *ring = &rdev->ring[RADEON_RING_TYPE_GFX_INDEX];
1277
	int r, i;
1494
	int r, i;
1278
 
1495
 
1279
	r = radeon_ring_lock(rdev, ring, 7);
1496
	r = radeon_ring_lock(rdev, ring, 7);
1280
	if (r) {
1497
	if (r) {
1281
		DRM_ERROR("radeon: cp failed to lock ring (%d).\n", r);
1498
		DRM_ERROR("radeon: cp failed to lock ring (%d).\n", r);
1282
		return r;
1499
		return r;
1283
	}
1500
	}
1284
	radeon_ring_write(ring, PACKET3(PACKET3_ME_INITIALIZE, 5));
1501
	radeon_ring_write(ring, PACKET3(PACKET3_ME_INITIALIZE, 5));
1285
	radeon_ring_write(ring, 0x1);
1502
	radeon_ring_write(ring, 0x1);
1286
	radeon_ring_write(ring, 0x0);
1503
	radeon_ring_write(ring, 0x0);
1287
	radeon_ring_write(ring, rdev->config.cayman.max_hw_contexts - 1);
1504
	radeon_ring_write(ring, rdev->config.cayman.max_hw_contexts - 1);
1288
	radeon_ring_write(ring, PACKET3_ME_INITIALIZE_DEVICE_ID(1));
1505
	radeon_ring_write(ring, PACKET3_ME_INITIALIZE_DEVICE_ID(1));
1289
	radeon_ring_write(ring, 0);
1506
	radeon_ring_write(ring, 0);
1290
	radeon_ring_write(ring, 0);
1507
	radeon_ring_write(ring, 0);
1291
	radeon_ring_unlock_commit(rdev, ring);
1508
	radeon_ring_unlock_commit(rdev, ring, false);
1292
 
1509
 
1293
	cayman_cp_enable(rdev, true);
1510
	cayman_cp_enable(rdev, true);
1294
 
1511
 
1295
	r = radeon_ring_lock(rdev, ring, cayman_default_size + 19);
1512
	r = radeon_ring_lock(rdev, ring, cayman_default_size + 19);
1296
	if (r) {
1513
	if (r) {
1297
		DRM_ERROR("radeon: cp failed to lock ring (%d).\n", r);
1514
		DRM_ERROR("radeon: cp failed to lock ring (%d).\n", r);
1298
		return r;
1515
		return r;
1299
	}
1516
	}
1300
 
1517
 
1301
	/* setup clear context state */
1518
	/* setup clear context state */
1302
	radeon_ring_write(ring, PACKET3(PACKET3_PREAMBLE_CNTL, 0));
1519
	radeon_ring_write(ring, PACKET3(PACKET3_PREAMBLE_CNTL, 0));
1303
	radeon_ring_write(ring, PACKET3_PREAMBLE_BEGIN_CLEAR_STATE);
1520
	radeon_ring_write(ring, PACKET3_PREAMBLE_BEGIN_CLEAR_STATE);
1304
 
1521
 
1305
	for (i = 0; i < cayman_default_size; i++)
1522
	for (i = 0; i < cayman_default_size; i++)
1306
		radeon_ring_write(ring, cayman_default_state[i]);
1523
		radeon_ring_write(ring, cayman_default_state[i]);
1307
 
1524
 
1308
	radeon_ring_write(ring, PACKET3(PACKET3_PREAMBLE_CNTL, 0));
1525
	radeon_ring_write(ring, PACKET3(PACKET3_PREAMBLE_CNTL, 0));
1309
	radeon_ring_write(ring, PACKET3_PREAMBLE_END_CLEAR_STATE);
1526
	radeon_ring_write(ring, PACKET3_PREAMBLE_END_CLEAR_STATE);
1310
 
1527
 
1311
	/* set clear context state */
1528
	/* set clear context state */
1312
	radeon_ring_write(ring, PACKET3(PACKET3_CLEAR_STATE, 0));
1529
	radeon_ring_write(ring, PACKET3(PACKET3_CLEAR_STATE, 0));
1313
	radeon_ring_write(ring, 0);
1530
	radeon_ring_write(ring, 0);
1314
 
1531
 
1315
	/* SQ_VTX_BASE_VTX_LOC */
1532
	/* SQ_VTX_BASE_VTX_LOC */
1316
	radeon_ring_write(ring, 0xc0026f00);
1533
	radeon_ring_write(ring, 0xc0026f00);
1317
	radeon_ring_write(ring, 0x00000000);
1534
	radeon_ring_write(ring, 0x00000000);
1318
	radeon_ring_write(ring, 0x00000000);
1535
	radeon_ring_write(ring, 0x00000000);
1319
	radeon_ring_write(ring, 0x00000000);
1536
	radeon_ring_write(ring, 0x00000000);
1320
 
1537
 
1321
	/* Clear consts */
1538
	/* Clear consts */
1322
	radeon_ring_write(ring, 0xc0036f00);
1539
	radeon_ring_write(ring, 0xc0036f00);
1323
	radeon_ring_write(ring, 0x00000bc4);
1540
	radeon_ring_write(ring, 0x00000bc4);
1324
	radeon_ring_write(ring, 0xffffffff);
1541
	radeon_ring_write(ring, 0xffffffff);
1325
	radeon_ring_write(ring, 0xffffffff);
1542
	radeon_ring_write(ring, 0xffffffff);
1326
	radeon_ring_write(ring, 0xffffffff);
1543
	radeon_ring_write(ring, 0xffffffff);
1327
 
1544
 
1328
	radeon_ring_write(ring, 0xc0026900);
1545
	radeon_ring_write(ring, 0xc0026900);
1329
	radeon_ring_write(ring, 0x00000316);
1546
	radeon_ring_write(ring, 0x00000316);
1330
	radeon_ring_write(ring, 0x0000000e); /* VGT_VERTEX_REUSE_BLOCK_CNTL */
1547
	radeon_ring_write(ring, 0x0000000e); /* VGT_VERTEX_REUSE_BLOCK_CNTL */
1331
	radeon_ring_write(ring, 0x00000010); /*  */
1548
	radeon_ring_write(ring, 0x00000010); /*  */
1332
 
1549
 
1333
	radeon_ring_unlock_commit(rdev, ring);
1550
	radeon_ring_unlock_commit(rdev, ring, false);
1334
 
1551
 
1335
	/* XXX init other rings */
1552
	/* XXX init other rings */
1336
 
1553
 
1337
	return 0;
1554
	return 0;
1338
}
1555
}
1339
 
1556
 
1340
 
1557
 
1341
static int cayman_cp_resume(struct radeon_device *rdev)
1558
static int cayman_cp_resume(struct radeon_device *rdev)
1342
{
1559
{
1343
	static const int ridx[] = {
1560
	static const int ridx[] = {
1344
		RADEON_RING_TYPE_GFX_INDEX,
1561
		RADEON_RING_TYPE_GFX_INDEX,
1345
		CAYMAN_RING_TYPE_CP1_INDEX,
1562
		CAYMAN_RING_TYPE_CP1_INDEX,
1346
		CAYMAN_RING_TYPE_CP2_INDEX
1563
		CAYMAN_RING_TYPE_CP2_INDEX
1347
	};
1564
	};
1348
	static const unsigned cp_rb_cntl[] = {
1565
	static const unsigned cp_rb_cntl[] = {
1349
		CP_RB0_CNTL,
1566
		CP_RB0_CNTL,
1350
		CP_RB1_CNTL,
1567
		CP_RB1_CNTL,
1351
		CP_RB2_CNTL,
1568
		CP_RB2_CNTL,
1352
	};
1569
	};
1353
	static const unsigned cp_rb_rptr_addr[] = {
1570
	static const unsigned cp_rb_rptr_addr[] = {
1354
		CP_RB0_RPTR_ADDR,
1571
		CP_RB0_RPTR_ADDR,
1355
		CP_RB1_RPTR_ADDR,
1572
		CP_RB1_RPTR_ADDR,
1356
		CP_RB2_RPTR_ADDR
1573
		CP_RB2_RPTR_ADDR
1357
	};
1574
	};
1358
	static const unsigned cp_rb_rptr_addr_hi[] = {
1575
	static const unsigned cp_rb_rptr_addr_hi[] = {
1359
		CP_RB0_RPTR_ADDR_HI,
1576
		CP_RB0_RPTR_ADDR_HI,
1360
		CP_RB1_RPTR_ADDR_HI,
1577
		CP_RB1_RPTR_ADDR_HI,
1361
		CP_RB2_RPTR_ADDR_HI
1578
		CP_RB2_RPTR_ADDR_HI
1362
	};
1579
	};
1363
	static const unsigned cp_rb_base[] = {
1580
	static const unsigned cp_rb_base[] = {
1364
		CP_RB0_BASE,
1581
		CP_RB0_BASE,
1365
		CP_RB1_BASE,
1582
		CP_RB1_BASE,
1366
		CP_RB2_BASE
1583
		CP_RB2_BASE
1367
	};
1584
	};
-
 
1585
	static const unsigned cp_rb_rptr[] = {
-
 
1586
		CP_RB0_RPTR,
-
 
1587
		CP_RB1_RPTR,
-
 
1588
		CP_RB2_RPTR
-
 
1589
	};
-
 
1590
	static const unsigned cp_rb_wptr[] = {
-
 
1591
		CP_RB0_WPTR,
-
 
1592
		CP_RB1_WPTR,
-
 
1593
		CP_RB2_WPTR
-
 
1594
	};
1368
	struct radeon_ring *ring;
1595
	struct radeon_ring *ring;
1369
	int i, r;
1596
	int i, r;
1370
 
1597
 
1371
	/* Reset cp; if cp is reset, then PA, SH, VGT also need to be reset */
1598
	/* Reset cp; if cp is reset, then PA, SH, VGT also need to be reset */
1372
	WREG32(GRBM_SOFT_RESET, (SOFT_RESET_CP |
1599
	WREG32(GRBM_SOFT_RESET, (SOFT_RESET_CP |
1373
				 SOFT_RESET_PA |
1600
				 SOFT_RESET_PA |
1374
				 SOFT_RESET_SH |
1601
				 SOFT_RESET_SH |
1375
				 SOFT_RESET_VGT |
1602
				 SOFT_RESET_VGT |
1376
				 SOFT_RESET_SPI |
1603
				 SOFT_RESET_SPI |
1377
				 SOFT_RESET_SX));
1604
				 SOFT_RESET_SX));
1378
	RREG32(GRBM_SOFT_RESET);
1605
	RREG32(GRBM_SOFT_RESET);
1379
	mdelay(15);
1606
	mdelay(15);
1380
	WREG32(GRBM_SOFT_RESET, 0);
1607
	WREG32(GRBM_SOFT_RESET, 0);
1381
	RREG32(GRBM_SOFT_RESET);
1608
	RREG32(GRBM_SOFT_RESET);
1382
 
1609
 
1383
	WREG32(CP_SEM_WAIT_TIMER, 0x0);
1610
	WREG32(CP_SEM_WAIT_TIMER, 0x0);
1384
	WREG32(CP_SEM_INCOMPLETE_TIMER_CNTL, 0x0);
1611
	WREG32(CP_SEM_INCOMPLETE_TIMER_CNTL, 0x0);
1385
 
1612
 
1386
	/* Set the write pointer delay */
1613
	/* Set the write pointer delay */
1387
	WREG32(CP_RB_WPTR_DELAY, 0);
1614
	WREG32(CP_RB_WPTR_DELAY, 0);
1388
 
1615
 
1389
	WREG32(CP_DEBUG, (1 << 27));
1616
	WREG32(CP_DEBUG, (1 << 27));
1390
 
1617
 
1391
	/* set the wb address whether it's enabled or not */
1618
	/* set the wb address whether it's enabled or not */
1392
	WREG32(SCRATCH_ADDR, ((rdev->wb.gpu_addr + RADEON_WB_SCRATCH_OFFSET) >> 8) & 0xFFFFFFFF);
1619
	WREG32(SCRATCH_ADDR, ((rdev->wb.gpu_addr + RADEON_WB_SCRATCH_OFFSET) >> 8) & 0xFFFFFFFF);
1393
		WREG32(SCRATCH_UMSK, 0xff);
1620
		WREG32(SCRATCH_UMSK, 0xff);
1394
 
1621
 
1395
	for (i = 0; i < 3; ++i) {
1622
	for (i = 0; i < 3; ++i) {
1396
		uint32_t rb_cntl;
1623
		uint32_t rb_cntl;
1397
		uint64_t addr;
1624
		uint64_t addr;
1398
 
1625
 
1399
	/* Set ring buffer size */
1626
	/* Set ring buffer size */
1400
		ring = &rdev->ring[ridx[i]];
1627
		ring = &rdev->ring[ridx[i]];
1401
		rb_cntl = drm_order(ring->ring_size / 8);
1628
		rb_cntl = order_base_2(ring->ring_size / 8);
1402
		rb_cntl |= drm_order(RADEON_GPU_PAGE_SIZE/8) << 8;
1629
		rb_cntl |= order_base_2(RADEON_GPU_PAGE_SIZE/8) << 8;
1403
#ifdef __BIG_ENDIAN
1630
#ifdef __BIG_ENDIAN
1404
		rb_cntl |= BUF_SWAP_32BIT;
1631
		rb_cntl |= BUF_SWAP_32BIT;
1405
#endif
1632
#endif
1406
		WREG32(cp_rb_cntl[i], rb_cntl);
1633
		WREG32(cp_rb_cntl[i], rb_cntl);
1407
 
1634
 
1408
		/* set the wb address whether it's enabled or not */
1635
		/* set the wb address whether it's enabled or not */
1409
		addr = rdev->wb.gpu_addr + RADEON_WB_CP_RPTR_OFFSET;
1636
		addr = rdev->wb.gpu_addr + RADEON_WB_CP_RPTR_OFFSET;
1410
		WREG32(cp_rb_rptr_addr[i], addr & 0xFFFFFFFC);
1637
		WREG32(cp_rb_rptr_addr[i], addr & 0xFFFFFFFC);
1411
		WREG32(cp_rb_rptr_addr_hi[i], upper_32_bits(addr) & 0xFF);
1638
		WREG32(cp_rb_rptr_addr_hi[i], upper_32_bits(addr) & 0xFF);
1412
	}
1639
	}
1413
 
1640
 
1414
	/* set the rb base addr, this causes an internal reset of ALL rings */
1641
	/* set the rb base addr, this causes an internal reset of ALL rings */
1415
	for (i = 0; i < 3; ++i) {
1642
	for (i = 0; i < 3; ++i) {
1416
		ring = &rdev->ring[ridx[i]];
1643
		ring = &rdev->ring[ridx[i]];
1417
		WREG32(cp_rb_base[i], ring->gpu_addr >> 8);
1644
		WREG32(cp_rb_base[i], ring->gpu_addr >> 8);
1418
	}
1645
	}
1419
 
1646
 
1420
	for (i = 0; i < 3; ++i) {
1647
	for (i = 0; i < 3; ++i) {
1421
	/* Initialize the ring buffer's read and write pointers */
1648
	/* Initialize the ring buffer's read and write pointers */
1422
		ring = &rdev->ring[ridx[i]];
1649
		ring = &rdev->ring[ridx[i]];
1423
		WREG32_P(cp_rb_cntl[i], RB_RPTR_WR_ENA, ~RB_RPTR_WR_ENA);
1650
		WREG32_P(cp_rb_cntl[i], RB_RPTR_WR_ENA, ~RB_RPTR_WR_ENA);
1424
 
1651
 
1425
		ring->rptr = ring->wptr = 0;
1652
		ring->wptr = 0;
1426
		WREG32(ring->rptr_reg, ring->rptr);
1653
		WREG32(cp_rb_rptr[i], 0);
1427
		WREG32(ring->wptr_reg, ring->wptr);
1654
		WREG32(cp_rb_wptr[i], ring->wptr);
1428
 
1655
 
1429
	mdelay(1);
1656
	mdelay(1);
1430
		WREG32_P(cp_rb_cntl[i], 0, ~RB_RPTR_WR_ENA);
1657
		WREG32_P(cp_rb_cntl[i], 0, ~RB_RPTR_WR_ENA);
1431
	}
1658
	}
1432
 
1659
 
1433
	/* start the rings */
1660
	/* start the rings */
1434
	cayman_cp_start(rdev);
1661
	cayman_cp_start(rdev);
1435
	rdev->ring[RADEON_RING_TYPE_GFX_INDEX].ready = true;
1662
	rdev->ring[RADEON_RING_TYPE_GFX_INDEX].ready = true;
1436
	rdev->ring[CAYMAN_RING_TYPE_CP1_INDEX].ready = false;
1663
	rdev->ring[CAYMAN_RING_TYPE_CP1_INDEX].ready = false;
1437
	rdev->ring[CAYMAN_RING_TYPE_CP2_INDEX].ready = false;
1664
	rdev->ring[CAYMAN_RING_TYPE_CP2_INDEX].ready = false;
1438
	/* this only test cp0 */
1665
	/* this only test cp0 */
1439
	r = radeon_ring_test(rdev, RADEON_RING_TYPE_GFX_INDEX, &rdev->ring[RADEON_RING_TYPE_GFX_INDEX]);
1666
	r = radeon_ring_test(rdev, RADEON_RING_TYPE_GFX_INDEX, &rdev->ring[RADEON_RING_TYPE_GFX_INDEX]);
1440
	if (r) {
1667
	if (r) {
1441
		rdev->ring[RADEON_RING_TYPE_GFX_INDEX].ready = false;
1668
		rdev->ring[RADEON_RING_TYPE_GFX_INDEX].ready = false;
1442
		rdev->ring[CAYMAN_RING_TYPE_CP1_INDEX].ready = false;
1669
		rdev->ring[CAYMAN_RING_TYPE_CP1_INDEX].ready = false;
1443
		rdev->ring[CAYMAN_RING_TYPE_CP2_INDEX].ready = false;
1670
		rdev->ring[CAYMAN_RING_TYPE_CP2_INDEX].ready = false;
1444
		return r;
1671
		return r;
1445
	}
1672
	}
1446
 
-
 
1447
	return 0;
-
 
1448
}
-
 
1449
 
-
 
1450
/*
-
 
1451
 * DMA
-
 
1452
 * Starting with R600, the GPU has an asynchronous
-
 
1453
 * DMA engine.  The programming model is very similar
-
 
1454
 * to the 3D engine (ring buffer, IBs, etc.), but the
-
 
1455
 * DMA controller has it's own packet format that is
-
 
1456
 * different form the PM4 format used by the 3D engine.
-
 
1457
 * It supports copying data, writing embedded data,
-
 
1458
 * solid fills, and a number of other things.  It also
-
 
1459
 * has support for tiling/detiling of buffers.
-
 
1460
 * Cayman and newer support two asynchronous DMA engines.
-
 
1461
 */
-
 
1462
/**
-
 
1463
 * cayman_dma_ring_ib_execute - Schedule an IB on the DMA engine
-
 
1464
 *
-
 
1465
 * @rdev: radeon_device pointer
-
 
1466
 * @ib: IB object to schedule
-
 
1467
 *
-
 
1468
 * Schedule an IB in the DMA ring (cayman-SI).
-
 
1469
 */
-
 
1470
void cayman_dma_ring_ib_execute(struct radeon_device *rdev,
-
 
1471
				struct radeon_ib *ib)
-
 
1472
{
-
 
1473
	struct radeon_ring *ring = &rdev->ring[ib->ring];
-
 
1474
 
-
 
1475
	if (rdev->wb.enabled) {
-
 
1476
		u32 next_rptr = ring->wptr + 4;
-
 
1477
		while ((next_rptr & 7) != 5)
-
 
1478
			next_rptr++;
-
 
1479
		next_rptr += 3;
-
 
1480
		radeon_ring_write(ring, DMA_PACKET(DMA_PACKET_WRITE, 0, 0, 1));
-
 
1481
		radeon_ring_write(ring, ring->next_rptr_gpu_addr & 0xfffffffc);
-
 
1482
		radeon_ring_write(ring, upper_32_bits(ring->next_rptr_gpu_addr) & 0xff);
-
 
1483
		radeon_ring_write(ring, next_rptr);
-
 
1484
	}
-
 
1485
 
-
 
1486
	/* The indirect buffer packet must end on an 8 DW boundary in the DMA ring.
-
 
1487
	 * Pad as necessary with NOPs.
-
 
1488
	 */
-
 
1489
	while ((ring->wptr & 7) != 5)
-
 
1490
		radeon_ring_write(ring, DMA_PACKET(DMA_PACKET_NOP, 0, 0, 0));
-
 
1491
	radeon_ring_write(ring, DMA_IB_PACKET(DMA_PACKET_INDIRECT_BUFFER, ib->vm ? ib->vm->id : 0, 0));
-
 
1492
	radeon_ring_write(ring, (ib->gpu_addr & 0xFFFFFFE0));
-
 
1493
	radeon_ring_write(ring, (ib->length_dw << 12) | (upper_32_bits(ib->gpu_addr) & 0xFF));
-
 
1494
 
-
 
1495
}
-
 
1496
 
-
 
1497
/**
-
 
1498
 * cayman_dma_stop - stop the async dma engines
-
 
1499
 *
-
 
1500
 * @rdev: radeon_device pointer
-
 
1501
 *
-
 
1502
 * Stop the async dma engines (cayman-SI).
-
 
1503
 */
-
 
1504
void cayman_dma_stop(struct radeon_device *rdev)
-
 
1505
{
-
 
1506
	u32 rb_cntl;
-
 
1507
 
-
 
1508
	radeon_ttm_set_active_vram_size(rdev, rdev->mc.visible_vram_size);
-
 
1509
 
-
 
1510
	/* dma0 */
-
 
1511
	rb_cntl = RREG32(DMA_RB_CNTL + DMA0_REGISTER_OFFSET);
-
 
1512
	rb_cntl &= ~DMA_RB_ENABLE;
-
 
1513
	WREG32(DMA_RB_CNTL + DMA0_REGISTER_OFFSET, rb_cntl);
-
 
1514
 
-
 
1515
	/* dma1 */
-
 
1516
	rb_cntl = RREG32(DMA_RB_CNTL + DMA1_REGISTER_OFFSET);
-
 
1517
	rb_cntl &= ~DMA_RB_ENABLE;
-
 
1518
	WREG32(DMA_RB_CNTL + DMA1_REGISTER_OFFSET, rb_cntl);
-
 
1519
 
-
 
1520
	rdev->ring[R600_RING_TYPE_DMA_INDEX].ready = false;
-
 
1521
	rdev->ring[CAYMAN_RING_TYPE_DMA1_INDEX].ready = false;
-
 
1522
}
-
 
1523
 
-
 
1524
/**
-
 
1525
 * cayman_dma_resume - setup and start the async dma engines
-
 
1526
 *
-
 
1527
 * @rdev: radeon_device pointer
-
 
1528
 *
-
 
1529
 * Set up the DMA ring buffers and enable them. (cayman-SI).
-
 
1530
 * Returns 0 for success, error for failure.
-
 
1531
 */
-
 
1532
int cayman_dma_resume(struct radeon_device *rdev)
-
 
1533
{
-
 
1534
	struct radeon_ring *ring;
-
 
1535
	u32 rb_cntl, dma_cntl, ib_cntl;
-
 
1536
	u32 rb_bufsz;
-
 
1537
	u32 reg_offset, wb_offset;
-
 
1538
	int i, r;
-
 
1539
 
-
 
1540
	/* Reset dma */
-
 
1541
	WREG32(SRBM_SOFT_RESET, SOFT_RESET_DMA | SOFT_RESET_DMA1);
-
 
1542
	RREG32(SRBM_SOFT_RESET);
-
 
1543
	udelay(50);
-
 
1544
	WREG32(SRBM_SOFT_RESET, 0);
-
 
1545
 
-
 
1546
	for (i = 0; i < 2; i++) {
-
 
1547
		if (i == 0) {
-
 
1548
			ring = &rdev->ring[R600_RING_TYPE_DMA_INDEX];
-
 
1549
			reg_offset = DMA0_REGISTER_OFFSET;
-
 
1550
			wb_offset = R600_WB_DMA_RPTR_OFFSET;
-
 
1551
		} else {
1673
 
1552
			ring = &rdev->ring[CAYMAN_RING_TYPE_DMA1_INDEX];
-
 
1553
			reg_offset = DMA1_REGISTER_OFFSET;
-
 
1554
			wb_offset = CAYMAN_WB_DMA1_RPTR_OFFSET;
-
 
1555
		}
-
 
1556
 
-
 
1557
		WREG32(DMA_SEM_INCOMPLETE_TIMER_CNTL + reg_offset, 0);
-
 
1558
		WREG32(DMA_SEM_WAIT_FAIL_TIMER_CNTL + reg_offset, 0);
-
 
1559
 
-
 
1560
		/* Set ring buffer size in dwords */
-
 
1561
		rb_bufsz = drm_order(ring->ring_size / 4);
-
 
1562
		rb_cntl = rb_bufsz << 1;
-
 
1563
#ifdef __BIG_ENDIAN
-
 
1564
		rb_cntl |= DMA_RB_SWAP_ENABLE | DMA_RPTR_WRITEBACK_SWAP_ENABLE;
-
 
1565
#endif
-
 
1566
		WREG32(DMA_RB_CNTL + reg_offset, rb_cntl);
-
 
1567
 
-
 
1568
		/* Initialize the ring buffer's read and write pointers */
-
 
1569
		WREG32(DMA_RB_RPTR + reg_offset, 0);
-
 
1570
		WREG32(DMA_RB_WPTR + reg_offset, 0);
-
 
1571
 
-
 
1572
		/* set the wb address whether it's enabled or not */
-
 
1573
		WREG32(DMA_RB_RPTR_ADDR_HI + reg_offset,
-
 
1574
		       upper_32_bits(rdev->wb.gpu_addr + wb_offset) & 0xFF);
-
 
1575
		WREG32(DMA_RB_RPTR_ADDR_LO + reg_offset,
-
 
1576
		       ((rdev->wb.gpu_addr + wb_offset) & 0xFFFFFFFC));
-
 
1577
 
-
 
1578
		if (rdev->wb.enabled)
-
 
1579
			rb_cntl |= DMA_RPTR_WRITEBACK_ENABLE;
-
 
1580
 
-
 
1581
		WREG32(DMA_RB_BASE + reg_offset, ring->gpu_addr >> 8);
-
 
1582
 
-
 
1583
		/* enable DMA IBs */
-
 
1584
		ib_cntl = DMA_IB_ENABLE | CMD_VMID_FORCE;
-
 
1585
#ifdef __BIG_ENDIAN
-
 
1586
		ib_cntl |= DMA_IB_SWAP_ENABLE;
-
 
1587
#endif
-
 
1588
		WREG32(DMA_IB_CNTL + reg_offset, ib_cntl);
-
 
1589
 
-
 
1590
		dma_cntl = RREG32(DMA_CNTL + reg_offset);
-
 
1591
		dma_cntl &= ~CTXEMPTY_INT_ENABLE;
-
 
1592
		WREG32(DMA_CNTL + reg_offset, dma_cntl);
-
 
1593
 
-
 
1594
		ring->wptr = 0;
-
 
1595
		WREG32(DMA_RB_WPTR + reg_offset, ring->wptr << 2);
-
 
1596
 
-
 
1597
		ring->rptr = RREG32(DMA_RB_RPTR + reg_offset) >> 2;
-
 
1598
 
-
 
1599
		WREG32(DMA_RB_CNTL + reg_offset, rb_cntl | DMA_RB_ENABLE);
-
 
1600
 
-
 
1601
		ring->ready = true;
-
 
1602
 
-
 
1603
		r = radeon_ring_test(rdev, ring->idx, ring);
-
 
1604
		if (r) {
-
 
1605
			ring->ready = false;
-
 
1606
			return r;
-
 
1607
		}
-
 
1608
	}
-
 
1609
 
1674
	if (rdev->asic->copy.copy_ring_index == RADEON_RING_TYPE_GFX_INDEX)
1610
	radeon_ttm_set_active_vram_size(rdev, rdev->mc.real_vram_size);
1675
	radeon_ttm_set_active_vram_size(rdev, rdev->mc.real_vram_size);
1611
 
1676
 
1612
	return 0;
1677
	return 0;
1613
}
1678
}
1614
 
-
 
1615
/**
-
 
1616
 * cayman_dma_fini - tear down the async dma engines
-
 
1617
 *
-
 
1618
 * @rdev: radeon_device pointer
-
 
1619
 *
-
 
1620
 * Stop the async dma engines and free the rings (cayman-SI).
-
 
1621
 */
-
 
1622
void cayman_dma_fini(struct radeon_device *rdev)
-
 
1623
{
-
 
1624
	cayman_dma_stop(rdev);
-
 
1625
	radeon_ring_fini(rdev, &rdev->ring[R600_RING_TYPE_DMA_INDEX]);
-
 
1626
	radeon_ring_fini(rdev, &rdev->ring[CAYMAN_RING_TYPE_DMA1_INDEX]);
-
 
1627
}
-
 
1628
 
1679
 
1629
static u32 cayman_gpu_check_soft_reset(struct radeon_device *rdev)
1680
u32 cayman_gpu_check_soft_reset(struct radeon_device *rdev)
1630
{
1681
{
1631
	u32 reset_mask = 0;
1682
	u32 reset_mask = 0;
1632
	u32 tmp;
1683
	u32 tmp;
1633
 
1684
 
1634
	/* GRBM_STATUS */
1685
	/* GRBM_STATUS */
1635
	tmp = RREG32(GRBM_STATUS);
1686
	tmp = RREG32(GRBM_STATUS);
1636
	if (tmp & (PA_BUSY | SC_BUSY |
1687
	if (tmp & (PA_BUSY | SC_BUSY |
1637
		   SH_BUSY | SX_BUSY |
1688
		   SH_BUSY | SX_BUSY |
1638
		   TA_BUSY | VGT_BUSY |
1689
		   TA_BUSY | VGT_BUSY |
1639
		   DB_BUSY | CB_BUSY |
1690
		   DB_BUSY | CB_BUSY |
1640
		   GDS_BUSY | SPI_BUSY |
1691
		   GDS_BUSY | SPI_BUSY |
1641
		   IA_BUSY | IA_BUSY_NO_DMA))
1692
		   IA_BUSY | IA_BUSY_NO_DMA))
1642
		reset_mask |= RADEON_RESET_GFX;
1693
		reset_mask |= RADEON_RESET_GFX;
1643
 
1694
 
1644
	if (tmp & (CF_RQ_PENDING | PF_RQ_PENDING |
1695
	if (tmp & (CF_RQ_PENDING | PF_RQ_PENDING |
1645
		   CP_BUSY | CP_COHERENCY_BUSY))
1696
		   CP_BUSY | CP_COHERENCY_BUSY))
1646
		reset_mask |= RADEON_RESET_CP;
1697
		reset_mask |= RADEON_RESET_CP;
1647
 
1698
 
1648
	if (tmp & GRBM_EE_BUSY)
1699
	if (tmp & GRBM_EE_BUSY)
1649
		reset_mask |= RADEON_RESET_GRBM | RADEON_RESET_GFX | RADEON_RESET_CP;
1700
		reset_mask |= RADEON_RESET_GRBM | RADEON_RESET_GFX | RADEON_RESET_CP;
1650
 
1701
 
1651
	/* DMA_STATUS_REG 0 */
1702
	/* DMA_STATUS_REG 0 */
1652
	tmp = RREG32(DMA_STATUS_REG + DMA0_REGISTER_OFFSET);
1703
	tmp = RREG32(DMA_STATUS_REG + DMA0_REGISTER_OFFSET);
1653
	if (!(tmp & DMA_IDLE))
1704
	if (!(tmp & DMA_IDLE))
1654
		reset_mask |= RADEON_RESET_DMA;
1705
		reset_mask |= RADEON_RESET_DMA;
1655
 
1706
 
1656
	/* DMA_STATUS_REG 1 */
1707
	/* DMA_STATUS_REG 1 */
1657
	tmp = RREG32(DMA_STATUS_REG + DMA1_REGISTER_OFFSET);
1708
	tmp = RREG32(DMA_STATUS_REG + DMA1_REGISTER_OFFSET);
1658
	if (!(tmp & DMA_IDLE))
1709
	if (!(tmp & DMA_IDLE))
1659
		reset_mask |= RADEON_RESET_DMA1;
1710
		reset_mask |= RADEON_RESET_DMA1;
1660
 
1711
 
1661
	/* SRBM_STATUS2 */
1712
	/* SRBM_STATUS2 */
1662
	tmp = RREG32(SRBM_STATUS2);
1713
	tmp = RREG32(SRBM_STATUS2);
1663
	if (tmp & DMA_BUSY)
1714
	if (tmp & DMA_BUSY)
1664
		reset_mask |= RADEON_RESET_DMA;
1715
		reset_mask |= RADEON_RESET_DMA;
1665
 
1716
 
1666
	if (tmp & DMA1_BUSY)
1717
	if (tmp & DMA1_BUSY)
1667
		reset_mask |= RADEON_RESET_DMA1;
1718
		reset_mask |= RADEON_RESET_DMA1;
1668
 
1719
 
1669
	/* SRBM_STATUS */
1720
	/* SRBM_STATUS */
1670
	tmp = RREG32(SRBM_STATUS);
1721
	tmp = RREG32(SRBM_STATUS);
1671
	if (tmp & (RLC_RQ_PENDING | RLC_BUSY))
1722
	if (tmp & (RLC_RQ_PENDING | RLC_BUSY))
1672
		reset_mask |= RADEON_RESET_RLC;
1723
		reset_mask |= RADEON_RESET_RLC;
1673
 
1724
 
1674
	if (tmp & IH_BUSY)
1725
	if (tmp & IH_BUSY)
1675
		reset_mask |= RADEON_RESET_IH;
1726
		reset_mask |= RADEON_RESET_IH;
1676
 
1727
 
1677
	if (tmp & SEM_BUSY)
1728
	if (tmp & SEM_BUSY)
1678
		reset_mask |= RADEON_RESET_SEM;
1729
		reset_mask |= RADEON_RESET_SEM;
1679
 
1730
 
1680
	if (tmp & GRBM_RQ_PENDING)
1731
	if (tmp & GRBM_RQ_PENDING)
1681
		reset_mask |= RADEON_RESET_GRBM;
1732
		reset_mask |= RADEON_RESET_GRBM;
1682
 
1733
 
1683
	if (tmp & VMC_BUSY)
1734
	if (tmp & VMC_BUSY)
1684
		reset_mask |= RADEON_RESET_VMC;
1735
		reset_mask |= RADEON_RESET_VMC;
1685
 
1736
 
1686
	if (tmp & (MCB_BUSY | MCB_NON_DISPLAY_BUSY |
1737
	if (tmp & (MCB_BUSY | MCB_NON_DISPLAY_BUSY |
1687
		   MCC_BUSY | MCD_BUSY))
1738
		   MCC_BUSY | MCD_BUSY))
1688
		reset_mask |= RADEON_RESET_MC;
1739
		reset_mask |= RADEON_RESET_MC;
1689
 
1740
 
1690
	if (evergreen_is_display_hung(rdev))
1741
	if (evergreen_is_display_hung(rdev))
1691
		reset_mask |= RADEON_RESET_DISPLAY;
1742
		reset_mask |= RADEON_RESET_DISPLAY;
1692
 
1743
 
1693
	/* VM_L2_STATUS */
1744
	/* VM_L2_STATUS */
1694
	tmp = RREG32(VM_L2_STATUS);
1745
	tmp = RREG32(VM_L2_STATUS);
1695
	if (tmp & L2_BUSY)
1746
	if (tmp & L2_BUSY)
1696
		reset_mask |= RADEON_RESET_VMC;
1747
		reset_mask |= RADEON_RESET_VMC;
1697
 
1748
 
1698
	/* Skip MC reset as it's mostly likely not hung, just busy */
1749
	/* Skip MC reset as it's mostly likely not hung, just busy */
1699
	if (reset_mask & RADEON_RESET_MC) {
1750
	if (reset_mask & RADEON_RESET_MC) {
1700
		DRM_DEBUG("MC busy: 0x%08X, clearing.\n", reset_mask);
1751
		DRM_DEBUG("MC busy: 0x%08X, clearing.\n", reset_mask);
1701
		reset_mask &= ~RADEON_RESET_MC;
1752
		reset_mask &= ~RADEON_RESET_MC;
1702
	}
1753
	}
1703
 
1754
 
1704
	return reset_mask;
1755
	return reset_mask;
1705
}
1756
}
1706
 
1757
 
1707
static void cayman_gpu_soft_reset(struct radeon_device *rdev, u32 reset_mask)
1758
static void cayman_gpu_soft_reset(struct radeon_device *rdev, u32 reset_mask)
1708
{
1759
{
1709
	struct evergreen_mc_save save;
1760
	struct evergreen_mc_save save;
1710
	u32 grbm_soft_reset = 0, srbm_soft_reset = 0;
1761
	u32 grbm_soft_reset = 0, srbm_soft_reset = 0;
1711
	u32 tmp;
1762
	u32 tmp;
1712
 
1763
 
1713
	if (reset_mask == 0)
1764
	if (reset_mask == 0)
1714
		return;
1765
		return;
1715
 
1766
 
1716
	dev_info(rdev->dev, "GPU softreset: 0x%08X\n", reset_mask);
1767
	dev_info(rdev->dev, "GPU softreset: 0x%08X\n", reset_mask);
1717
 
1768
 
1718
	evergreen_print_gpu_status_regs(rdev);
1769
	evergreen_print_gpu_status_regs(rdev);
1719
	dev_info(rdev->dev, "  VM_CONTEXT0_PROTECTION_FAULT_ADDR   0x%08X\n",
1770
	dev_info(rdev->dev, "  VM_CONTEXT0_PROTECTION_FAULT_ADDR   0x%08X\n",
1720
		 RREG32(0x14F8));
1771
		 RREG32(0x14F8));
1721
	dev_info(rdev->dev, "  VM_CONTEXT0_PROTECTION_FAULT_STATUS 0x%08X\n",
1772
	dev_info(rdev->dev, "  VM_CONTEXT0_PROTECTION_FAULT_STATUS 0x%08X\n",
1722
		 RREG32(0x14D8));
1773
		 RREG32(0x14D8));
1723
	dev_info(rdev->dev, "  VM_CONTEXT1_PROTECTION_FAULT_ADDR   0x%08X\n",
1774
	dev_info(rdev->dev, "  VM_CONTEXT1_PROTECTION_FAULT_ADDR   0x%08X\n",
1724
		 RREG32(0x14FC));
1775
		 RREG32(0x14FC));
1725
	dev_info(rdev->dev, "  VM_CONTEXT1_PROTECTION_FAULT_STATUS 0x%08X\n",
1776
	dev_info(rdev->dev, "  VM_CONTEXT1_PROTECTION_FAULT_STATUS 0x%08X\n",
1726
		 RREG32(0x14DC));
1777
		 RREG32(0x14DC));
1727
 
1778
 
1728
	/* Disable CP parsing/prefetching */
1779
	/* Disable CP parsing/prefetching */
1729
	WREG32(CP_ME_CNTL, CP_ME_HALT | CP_PFP_HALT);
1780
	WREG32(CP_ME_CNTL, CP_ME_HALT | CP_PFP_HALT);
1730
 
1781
 
1731
	if (reset_mask & RADEON_RESET_DMA) {
1782
	if (reset_mask & RADEON_RESET_DMA) {
1732
		/* dma0 */
1783
		/* dma0 */
1733
		tmp = RREG32(DMA_RB_CNTL + DMA0_REGISTER_OFFSET);
1784
		tmp = RREG32(DMA_RB_CNTL + DMA0_REGISTER_OFFSET);
1734
		tmp &= ~DMA_RB_ENABLE;
1785
		tmp &= ~DMA_RB_ENABLE;
1735
		WREG32(DMA_RB_CNTL + DMA0_REGISTER_OFFSET, tmp);
1786
		WREG32(DMA_RB_CNTL + DMA0_REGISTER_OFFSET, tmp);
1736
	}
1787
	}
1737
 
1788
 
1738
	if (reset_mask & RADEON_RESET_DMA1) {
1789
	if (reset_mask & RADEON_RESET_DMA1) {
1739
		/* dma1 */
1790
		/* dma1 */
1740
		tmp = RREG32(DMA_RB_CNTL + DMA1_REGISTER_OFFSET);
1791
		tmp = RREG32(DMA_RB_CNTL + DMA1_REGISTER_OFFSET);
1741
		tmp &= ~DMA_RB_ENABLE;
1792
		tmp &= ~DMA_RB_ENABLE;
1742
		WREG32(DMA_RB_CNTL + DMA1_REGISTER_OFFSET, tmp);
1793
		WREG32(DMA_RB_CNTL + DMA1_REGISTER_OFFSET, tmp);
1743
	}
1794
	}
1744
 
1795
 
1745
	udelay(50);
1796
	udelay(50);
1746
 
1797
 
1747
	evergreen_mc_stop(rdev, &save);
1798
	evergreen_mc_stop(rdev, &save);
1748
	if (evergreen_mc_wait_for_idle(rdev)) {
1799
	if (evergreen_mc_wait_for_idle(rdev)) {
1749
		dev_warn(rdev->dev, "Wait for MC idle timedout !\n");
1800
		dev_warn(rdev->dev, "Wait for MC idle timedout !\n");
1750
	}
1801
	}
1751
 
1802
 
1752
	if (reset_mask & (RADEON_RESET_GFX | RADEON_RESET_COMPUTE)) {
1803
	if (reset_mask & (RADEON_RESET_GFX | RADEON_RESET_COMPUTE)) {
1753
		grbm_soft_reset = SOFT_RESET_CB |
1804
		grbm_soft_reset = SOFT_RESET_CB |
1754
			SOFT_RESET_DB |
1805
			SOFT_RESET_DB |
1755
			SOFT_RESET_GDS |
1806
			SOFT_RESET_GDS |
1756
			SOFT_RESET_PA |
1807
			SOFT_RESET_PA |
1757
			SOFT_RESET_SC |
1808
			SOFT_RESET_SC |
1758
			SOFT_RESET_SPI |
1809
			SOFT_RESET_SPI |
1759
			SOFT_RESET_SH |
1810
			SOFT_RESET_SH |
1760
			SOFT_RESET_SX |
1811
			SOFT_RESET_SX |
1761
			SOFT_RESET_TC |
1812
			SOFT_RESET_TC |
1762
			SOFT_RESET_TA |
1813
			SOFT_RESET_TA |
1763
			SOFT_RESET_VGT |
1814
			SOFT_RESET_VGT |
1764
			SOFT_RESET_IA;
1815
			SOFT_RESET_IA;
1765
	}
1816
	}
1766
 
1817
 
1767
	if (reset_mask & RADEON_RESET_CP) {
1818
	if (reset_mask & RADEON_RESET_CP) {
1768
		grbm_soft_reset |= SOFT_RESET_CP | SOFT_RESET_VGT;
1819
		grbm_soft_reset |= SOFT_RESET_CP | SOFT_RESET_VGT;
1769
 
1820
 
1770
		srbm_soft_reset |= SOFT_RESET_GRBM;
1821
		srbm_soft_reset |= SOFT_RESET_GRBM;
1771
	}
1822
	}
1772
 
1823
 
1773
	if (reset_mask & RADEON_RESET_DMA)
1824
	if (reset_mask & RADEON_RESET_DMA)
1774
		srbm_soft_reset |= SOFT_RESET_DMA;
1825
		srbm_soft_reset |= SOFT_RESET_DMA;
1775
 
1826
 
1776
	if (reset_mask & RADEON_RESET_DMA1)
1827
	if (reset_mask & RADEON_RESET_DMA1)
1777
		srbm_soft_reset |= SOFT_RESET_DMA1;
1828
		srbm_soft_reset |= SOFT_RESET_DMA1;
1778
 
1829
 
1779
	if (reset_mask & RADEON_RESET_DISPLAY)
1830
	if (reset_mask & RADEON_RESET_DISPLAY)
1780
		srbm_soft_reset |= SOFT_RESET_DC;
1831
		srbm_soft_reset |= SOFT_RESET_DC;
1781
 
1832
 
1782
	if (reset_mask & RADEON_RESET_RLC)
1833
	if (reset_mask & RADEON_RESET_RLC)
1783
		srbm_soft_reset |= SOFT_RESET_RLC;
1834
		srbm_soft_reset |= SOFT_RESET_RLC;
1784
 
1835
 
1785
	if (reset_mask & RADEON_RESET_SEM)
1836
	if (reset_mask & RADEON_RESET_SEM)
1786
		srbm_soft_reset |= SOFT_RESET_SEM;
1837
		srbm_soft_reset |= SOFT_RESET_SEM;
1787
 
1838
 
1788
	if (reset_mask & RADEON_RESET_IH)
1839
	if (reset_mask & RADEON_RESET_IH)
1789
		srbm_soft_reset |= SOFT_RESET_IH;
1840
		srbm_soft_reset |= SOFT_RESET_IH;
1790
 
1841
 
1791
	if (reset_mask & RADEON_RESET_GRBM)
1842
	if (reset_mask & RADEON_RESET_GRBM)
1792
		srbm_soft_reset |= SOFT_RESET_GRBM;
1843
		srbm_soft_reset |= SOFT_RESET_GRBM;
1793
 
1844
 
1794
	if (reset_mask & RADEON_RESET_VMC)
1845
	if (reset_mask & RADEON_RESET_VMC)
1795
		srbm_soft_reset |= SOFT_RESET_VMC;
1846
		srbm_soft_reset |= SOFT_RESET_VMC;
1796
 
1847
 
1797
	if (!(rdev->flags & RADEON_IS_IGP)) {
1848
	if (!(rdev->flags & RADEON_IS_IGP)) {
1798
		if (reset_mask & RADEON_RESET_MC)
1849
		if (reset_mask & RADEON_RESET_MC)
1799
			srbm_soft_reset |= SOFT_RESET_MC;
1850
			srbm_soft_reset |= SOFT_RESET_MC;
1800
	}
1851
	}
1801
 
1852
 
1802
	if (grbm_soft_reset) {
1853
	if (grbm_soft_reset) {
1803
		tmp = RREG32(GRBM_SOFT_RESET);
1854
		tmp = RREG32(GRBM_SOFT_RESET);
1804
		tmp |= grbm_soft_reset;
1855
		tmp |= grbm_soft_reset;
1805
		dev_info(rdev->dev, "GRBM_SOFT_RESET=0x%08X\n", tmp);
1856
		dev_info(rdev->dev, "GRBM_SOFT_RESET=0x%08X\n", tmp);
1806
		WREG32(GRBM_SOFT_RESET, tmp);
1857
		WREG32(GRBM_SOFT_RESET, tmp);
1807
		tmp = RREG32(GRBM_SOFT_RESET);
1858
		tmp = RREG32(GRBM_SOFT_RESET);
1808
 
1859
 
1809
		udelay(50);
1860
		udelay(50);
1810
 
1861
 
1811
		tmp &= ~grbm_soft_reset;
1862
		tmp &= ~grbm_soft_reset;
1812
		WREG32(GRBM_SOFT_RESET, tmp);
1863
		WREG32(GRBM_SOFT_RESET, tmp);
1813
		tmp = RREG32(GRBM_SOFT_RESET);
1864
		tmp = RREG32(GRBM_SOFT_RESET);
1814
	}
1865
	}
1815
 
1866
 
1816
	if (srbm_soft_reset) {
1867
	if (srbm_soft_reset) {
1817
		tmp = RREG32(SRBM_SOFT_RESET);
1868
		tmp = RREG32(SRBM_SOFT_RESET);
1818
		tmp |= srbm_soft_reset;
1869
		tmp |= srbm_soft_reset;
1819
		dev_info(rdev->dev, "SRBM_SOFT_RESET=0x%08X\n", tmp);
1870
		dev_info(rdev->dev, "SRBM_SOFT_RESET=0x%08X\n", tmp);
1820
		WREG32(SRBM_SOFT_RESET, tmp);
1871
		WREG32(SRBM_SOFT_RESET, tmp);
1821
		tmp = RREG32(SRBM_SOFT_RESET);
1872
		tmp = RREG32(SRBM_SOFT_RESET);
1822
 
1873
 
1823
		udelay(50);
1874
		udelay(50);
1824
 
1875
 
1825
		tmp &= ~srbm_soft_reset;
1876
		tmp &= ~srbm_soft_reset;
1826
		WREG32(SRBM_SOFT_RESET, tmp);
1877
		WREG32(SRBM_SOFT_RESET, tmp);
1827
		tmp = RREG32(SRBM_SOFT_RESET);
1878
		tmp = RREG32(SRBM_SOFT_RESET);
1828
	}
1879
	}
1829
 
1880
 
1830
	/* Wait a little for things to settle down */
1881
	/* Wait a little for things to settle down */
1831
	udelay(50);
1882
	udelay(50);
1832
 
1883
 
1833
	evergreen_mc_resume(rdev, &save);
1884
	evergreen_mc_resume(rdev, &save);
1834
	udelay(50);
1885
	udelay(50);
1835
 
1886
 
1836
	evergreen_print_gpu_status_regs(rdev);
1887
	evergreen_print_gpu_status_regs(rdev);
1837
}
1888
}
1838
 
1889
 
1839
int cayman_asic_reset(struct radeon_device *rdev)
1890
int cayman_asic_reset(struct radeon_device *rdev)
1840
{
1891
{
1841
	u32 reset_mask;
1892
	u32 reset_mask;
1842
 
1893
 
1843
	reset_mask = cayman_gpu_check_soft_reset(rdev);
1894
	reset_mask = cayman_gpu_check_soft_reset(rdev);
1844
 
1895
 
1845
	if (reset_mask)
1896
	if (reset_mask)
1846
		r600_set_bios_scratch_engine_hung(rdev, true);
1897
		r600_set_bios_scratch_engine_hung(rdev, true);
1847
 
1898
 
1848
	cayman_gpu_soft_reset(rdev, reset_mask);
1899
	cayman_gpu_soft_reset(rdev, reset_mask);
1849
 
1900
 
1850
	reset_mask = cayman_gpu_check_soft_reset(rdev);
1901
	reset_mask = cayman_gpu_check_soft_reset(rdev);
1851
 
1902
 
-
 
1903
	if (reset_mask)
-
 
1904
		evergreen_gpu_pci_config_reset(rdev);
1852
	if (!reset_mask)
1905
 
1853
		r600_set_bios_scratch_engine_hung(rdev, false);
1906
		r600_set_bios_scratch_engine_hung(rdev, false);
1854
 
1907
 
1855
	return 0;
1908
	return 0;
1856
}
1909
}
1857
 
1910
 
1858
/**
1911
/**
1859
 * cayman_gfx_is_lockup - Check if the GFX engine is locked up
1912
 * cayman_gfx_is_lockup - Check if the GFX engine is locked up
1860
 *
1913
 *
1861
 * @rdev: radeon_device pointer
1914
 * @rdev: radeon_device pointer
1862
 * @ring: radeon_ring structure holding ring information
1915
 * @ring: radeon_ring structure holding ring information
1863
 *
1916
 *
1864
 * Check if the GFX engine is locked up.
1917
 * Check if the GFX engine is locked up.
1865
 * Returns true if the engine appears to be locked up, false if not.
1918
 * Returns true if the engine appears to be locked up, false if not.
1866
 */
1919
 */
1867
bool cayman_gfx_is_lockup(struct radeon_device *rdev, struct radeon_ring *ring)
1920
bool cayman_gfx_is_lockup(struct radeon_device *rdev, struct radeon_ring *ring)
1868
{
1921
{
1869
	u32 reset_mask = cayman_gpu_check_soft_reset(rdev);
1922
	u32 reset_mask = cayman_gpu_check_soft_reset(rdev);
1870
 
1923
 
1871
	if (!(reset_mask & (RADEON_RESET_GFX |
1924
	if (!(reset_mask & (RADEON_RESET_GFX |
1872
					    RADEON_RESET_COMPUTE |
1925
					    RADEON_RESET_COMPUTE |
1873
			    RADEON_RESET_CP))) {
1926
			    RADEON_RESET_CP))) {
1874
		radeon_ring_lockup_update(ring);
1927
		radeon_ring_lockup_update(rdev, ring);
1875
		return false;
-
 
1876
	}
-
 
1877
	/* force CP activities */
-
 
1878
	radeon_ring_force_activity(rdev, ring);
-
 
1879
	return radeon_ring_test_lockup(rdev, ring);
-
 
1880
}
-
 
1881
 
-
 
1882
/**
-
 
1883
 * cayman_dma_is_lockup - Check if the DMA engine is locked up
-
 
1884
 *
-
 
1885
 * @rdev: radeon_device pointer
-
 
1886
 * @ring: radeon_ring structure holding ring information
-
 
1887
 *
-
 
1888
 * Check if the async DMA engine is locked up.
-
 
1889
 * Returns true if the engine appears to be locked up, false if not.
-
 
1890
 */
-
 
1891
bool cayman_dma_is_lockup(struct radeon_device *rdev, struct radeon_ring *ring)
-
 
1892
{
-
 
1893
	u32 reset_mask = cayman_gpu_check_soft_reset(rdev);
-
 
1894
	u32 mask;
-
 
1895
 
-
 
1896
	if (ring->idx == R600_RING_TYPE_DMA_INDEX)
-
 
1897
		mask = RADEON_RESET_DMA;
-
 
1898
	else
-
 
1899
		mask = RADEON_RESET_DMA1;
-
 
1900
 
-
 
1901
	if (!(reset_mask & mask)) {
-
 
1902
		radeon_ring_lockup_update(ring);
-
 
1903
		return false;
1928
		return false;
1904
	}
1929
	}
1905
	/* force ring activities */
-
 
1906
	radeon_ring_force_activity(rdev, ring);
-
 
1907
	return radeon_ring_test_lockup(rdev, ring);
1930
	return radeon_ring_test_lockup(rdev, ring);
1908
}
1931
}
1909
 
1932
 
1910
static int cayman_startup(struct radeon_device *rdev)
1933
static int cayman_startup(struct radeon_device *rdev)
1911
{
1934
{
1912
	struct radeon_ring *ring = &rdev->ring[RADEON_RING_TYPE_GFX_INDEX];
1935
	struct radeon_ring *ring = &rdev->ring[RADEON_RING_TYPE_GFX_INDEX];
1913
	int r;
1936
	int r;
1914
 
1937
 
1915
	/* enable pcie gen2 link */
1938
	/* enable pcie gen2 link */
1916
	evergreen_pcie_gen2_enable(rdev);
1939
	evergreen_pcie_gen2_enable(rdev);
-
 
1940
	/* enable aspm */
-
 
1941
	evergreen_program_aspm(rdev);
1917
 
-
 
1918
	if (rdev->flags & RADEON_IS_IGP) {
1942
 
1919
		if (!rdev->me_fw || !rdev->pfp_fw || !rdev->rlc_fw) {
-
 
1920
			r = ni_init_microcode(rdev);
-
 
1921
			if (r) {
-
 
1922
				DRM_ERROR("Failed to load firmware!\n");
-
 
1923
				return r;
-
 
1924
			}
-
 
1925
		}
-
 
1926
	} else {
-
 
1927
	if (!rdev->me_fw || !rdev->pfp_fw || !rdev->rlc_fw || !rdev->mc_fw) {
1943
	/* scratch needs to be initialized before MC */
1928
		r = ni_init_microcode(rdev);
1944
	r = r600_vram_scratch_init(rdev);
1929
		if (r) {
-
 
1930
			DRM_ERROR("Failed to load firmware!\n");
1945
	if (r)
1931
			return r;
-
 
1932
		}
-
 
-
 
1946
				return r;
-
 
1947
 
-
 
1948
	evergreen_mc_program(rdev);
1933
	}
1949
 
1934
 
1950
	if (!(rdev->flags & RADEON_IS_IGP) && !rdev->pm.dpm_enabled) {
1935
	r = ni_mc_load_microcode(rdev);
1951
	r = ni_mc_load_microcode(rdev);
1936
	if (r) {
1952
	if (r) {
1937
		DRM_ERROR("Failed to load MC firmware!\n");
1953
		DRM_ERROR("Failed to load MC firmware!\n");
1938
		return r;
1954
		return r;
1939
	}
1955
	}
1940
	}
1956
	}
1941
 
-
 
1942
	r = r600_vram_scratch_init(rdev);
-
 
1943
	if (r)
-
 
1944
		return r;
-
 
1945
 
-
 
1946
	evergreen_mc_program(rdev);
1957
 
1947
	r = cayman_pcie_gart_enable(rdev);
1958
	r = cayman_pcie_gart_enable(rdev);
1948
	if (r)
1959
	if (r)
1949
		return r;
1960
		return r;
1950
	cayman_gpu_init(rdev);
1961
	cayman_gpu_init(rdev);
1951
 
-
 
1952
	r = evergreen_blit_init(rdev);
-
 
1953
	if (r) {
-
 
1954
//		r600_blit_fini(rdev);
-
 
1955
		rdev->asic->copy.copy = NULL;
-
 
1956
		dev_warn(rdev->dev, "failed blitter (%d) falling back to memcpy\n", r);
-
 
1957
	}
-
 
1958
 
1962
 
1959
	/* allocate rlc buffers */
1963
	/* allocate rlc buffers */
-
 
1964
	if (rdev->flags & RADEON_IS_IGP) {
-
 
1965
		rdev->rlc.reg_list = tn_rlc_save_restore_register_list;
-
 
1966
		rdev->rlc.reg_list_size =
-
 
1967
			(u32)ARRAY_SIZE(tn_rlc_save_restore_register_list);
1960
	if (rdev->flags & RADEON_IS_IGP) {
1968
		rdev->rlc.cs_data = cayman_cs_data;
1961
		r = si_rlc_init(rdev);
1969
		r = sumo_rlc_init(rdev);
1962
		if (r) {
1970
		if (r) {
1963
			DRM_ERROR("Failed to init rlc BOs!\n");
1971
			DRM_ERROR("Failed to init rlc BOs!\n");
1964
			return r;
1972
			return r;
1965
		}
1973
		}
1966
	}
1974
	}
1967
 
1975
 
1968
	/* allocate wb buffer */
1976
	/* allocate wb buffer */
1969
	r = radeon_wb_init(rdev);
1977
	r = radeon_wb_init(rdev);
1970
	if (r)
1978
	if (r)
1971
		return r;
1979
		return r;
1972
 
1980
 
1973
	r = radeon_fence_driver_start_ring(rdev, RADEON_RING_TYPE_GFX_INDEX);
1981
	r = radeon_fence_driver_start_ring(rdev, RADEON_RING_TYPE_GFX_INDEX);
1974
	if (r) {
1982
	if (r) {
1975
		dev_err(rdev->dev, "failed initializing CP fences (%d).\n", r);
1983
		dev_err(rdev->dev, "failed initializing CP fences (%d).\n", r);
1976
		return r;
1984
		return r;
1977
	}
1985
	}
1978
 
1986
 
1979
//   r = rv770_uvd_resume(rdev);
1987
//   r = rv770_uvd_resume(rdev);
1980
//   if (!r) {
1988
//   if (!r) {
1981
//       r = radeon_fence_driver_start_ring(rdev,
1989
//       r = radeon_fence_driver_start_ring(rdev,
1982
//                          R600_RING_TYPE_UVD_INDEX);
1990
//                          R600_RING_TYPE_UVD_INDEX);
1983
//       if (r)
1991
//       if (r)
1984
//           dev_err(rdev->dev, "UVD fences init error (%d).\n", r);
1992
//           dev_err(rdev->dev, "UVD fences init error (%d).\n", r);
1985
//   }
1993
//   }
1986
//   if (r)
1994
//   if (r)
1987
//       rdev->ring[R600_RING_TYPE_UVD_INDEX].ring_size = 0;
1995
//       rdev->ring[R600_RING_TYPE_UVD_INDEX].ring_size = 0;
1988
 
1996
 
1989
	r = radeon_fence_driver_start_ring(rdev, CAYMAN_RING_TYPE_CP1_INDEX);
1997
	r = radeon_fence_driver_start_ring(rdev, CAYMAN_RING_TYPE_CP1_INDEX);
1990
	if (r) {
1998
	if (r) {
1991
		dev_err(rdev->dev, "failed initializing CP fences (%d).\n", r);
1999
		dev_err(rdev->dev, "failed initializing CP fences (%d).\n", r);
1992
		return r;
2000
		return r;
1993
	}
2001
	}
1994
 
2002
 
1995
	r = radeon_fence_driver_start_ring(rdev, CAYMAN_RING_TYPE_CP2_INDEX);
2003
	r = radeon_fence_driver_start_ring(rdev, CAYMAN_RING_TYPE_CP2_INDEX);
1996
	if (r) {
2004
	if (r) {
1997
		dev_err(rdev->dev, "failed initializing CP fences (%d).\n", r);
2005
		dev_err(rdev->dev, "failed initializing CP fences (%d).\n", r);
1998
		return r;
2006
		return r;
1999
	}
2007
	}
2000
 
2008
 
2001
	r = radeon_fence_driver_start_ring(rdev, R600_RING_TYPE_DMA_INDEX);
2009
	r = radeon_fence_driver_start_ring(rdev, R600_RING_TYPE_DMA_INDEX);
2002
	if (r) {
2010
	if (r) {
2003
		dev_err(rdev->dev, "failed initializing DMA fences (%d).\n", r);
2011
		dev_err(rdev->dev, "failed initializing DMA fences (%d).\n", r);
2004
		return r;
2012
		return r;
2005
	}
2013
	}
2006
 
2014
 
2007
	r = radeon_fence_driver_start_ring(rdev, CAYMAN_RING_TYPE_DMA1_INDEX);
2015
	r = radeon_fence_driver_start_ring(rdev, CAYMAN_RING_TYPE_DMA1_INDEX);
2008
	if (r) {
2016
	if (r) {
2009
		dev_err(rdev->dev, "failed initializing DMA fences (%d).\n", r);
2017
		dev_err(rdev->dev, "failed initializing DMA fences (%d).\n", r);
2010
		return r;
2018
		return r;
2011
	}
2019
	}
2012
 
2020
 
2013
	/* Enable IRQ */
2021
	/* Enable IRQ */
2014
	if (!rdev->irq.installed) {
2022
	if (!rdev->irq.installed) {
2015
		r = radeon_irq_kms_init(rdev);
2023
		r = radeon_irq_kms_init(rdev);
2016
		if (r)
2024
		if (r)
2017
			return r;
2025
			return r;
2018
	}
2026
	}
2019
 
2027
 
2020
	r = r600_irq_init(rdev);
2028
	r = r600_irq_init(rdev);
2021
	if (r) {
2029
	if (r) {
2022
		DRM_ERROR("radeon: IH init failed (%d).\n", r);
2030
		DRM_ERROR("radeon: IH init failed (%d).\n", r);
2023
//		radeon_irq_kms_fini(rdev);
2031
//		radeon_irq_kms_fini(rdev);
2024
		return r;
2032
		return r;
2025
	}
2033
	}
2026
	evergreen_irq_set(rdev);
2034
	evergreen_irq_set(rdev);
2027
 
2035
 
2028
	r = radeon_ring_init(rdev, ring, ring->ring_size, RADEON_WB_CP_RPTR_OFFSET,
2036
	r = radeon_ring_init(rdev, ring, ring->ring_size, RADEON_WB_CP_RPTR_OFFSET,
2029
			     CP_RB0_RPTR, CP_RB0_WPTR,
-
 
2030
			     0, 0xfffff, RADEON_CP_PACKET2);
2037
			     RADEON_CP_PACKET2);
2031
	if (r)
2038
	if (r)
2032
		return r;
2039
		return r;
2033
 
2040
 
2034
	ring = &rdev->ring[R600_RING_TYPE_DMA_INDEX];
2041
	ring = &rdev->ring[R600_RING_TYPE_DMA_INDEX];
2035
	r = radeon_ring_init(rdev, ring, ring->ring_size, R600_WB_DMA_RPTR_OFFSET,
2042
	r = radeon_ring_init(rdev, ring, ring->ring_size, R600_WB_DMA_RPTR_OFFSET,
2036
			     DMA_RB_RPTR + DMA0_REGISTER_OFFSET,
-
 
2037
			     DMA_RB_WPTR + DMA0_REGISTER_OFFSET,
-
 
2038
			     2, 0x3fffc, DMA_PACKET(DMA_PACKET_NOP, 0, 0, 0));
2043
			     DMA_PACKET(DMA_PACKET_NOP, 0, 0, 0));
2039
	if (r)
2044
	if (r)
2040
		return r;
2045
		return r;
2041
 
2046
 
2042
	ring = &rdev->ring[CAYMAN_RING_TYPE_DMA1_INDEX];
2047
	ring = &rdev->ring[CAYMAN_RING_TYPE_DMA1_INDEX];
2043
	r = radeon_ring_init(rdev, ring, ring->ring_size, CAYMAN_WB_DMA1_RPTR_OFFSET,
2048
	r = radeon_ring_init(rdev, ring, ring->ring_size, CAYMAN_WB_DMA1_RPTR_OFFSET,
2044
			     DMA_RB_RPTR + DMA1_REGISTER_OFFSET,
-
 
2045
			     DMA_RB_WPTR + DMA1_REGISTER_OFFSET,
-
 
2046
			     2, 0x3fffc, DMA_PACKET(DMA_PACKET_NOP, 0, 0, 0));
2049
			     DMA_PACKET(DMA_PACKET_NOP, 0, 0, 0));
2047
	if (r)
2050
	if (r)
2048
		return r;
2051
		return r;
2049
 
2052
 
2050
	r = cayman_cp_load_microcode(rdev);
2053
	r = cayman_cp_load_microcode(rdev);
2051
	if (r)
2054
	if (r)
2052
		return r;
2055
		return r;
2053
	r = cayman_cp_resume(rdev);
2056
	r = cayman_cp_resume(rdev);
2054
	if (r)
2057
	if (r)
2055
		return r;
2058
		return r;
2056
 
2059
 
2057
	r = cayman_dma_resume(rdev);
2060
	r = cayman_dma_resume(rdev);
2058
	if (r)
2061
	if (r)
2059
		return r;
2062
		return r;
2060
 
-
 
2061
	ring = &rdev->ring[R600_RING_TYPE_UVD_INDEX];
-
 
2062
	if (ring->ring_size) {
-
 
2063
		r = radeon_ring_init(rdev, ring, ring->ring_size,
-
 
2064
				     R600_WB_UVD_RPTR_OFFSET,
-
 
2065
				     UVD_RBC_RB_RPTR, UVD_RBC_RB_WPTR,
-
 
2066
				     0, 0xfffff, RADEON_CP_PACKET2);
-
 
2067
		if (!r)
-
 
2068
			r = r600_uvd_init(rdev);
-
 
2069
		if (r)
-
 
2070
			DRM_ERROR("radeon: failed initializing UVD (%d).\n", r);
-
 
2071
	}
2063
 
2072
 
2064
 
2073
	r = radeon_ib_pool_init(rdev);
2065
	r = radeon_ib_pool_init(rdev);
2074
	if (r) {
2066
	if (r) {
2075
		dev_err(rdev->dev, "IB initialization failed (%d).\n", r);
2067
		dev_err(rdev->dev, "IB initialization failed (%d).\n", r);
2076
		return r;
2068
		return r;
2077
	}
2069
	}
2078
 
2070
 
2079
	r = radeon_vm_manager_init(rdev);
2071
	r = radeon_vm_manager_init(rdev);
2080
	if (r) {
2072
	if (r) {
2081
		dev_err(rdev->dev, "vm manager initialization failed (%d).\n", r);
2073
		dev_err(rdev->dev, "vm manager initialization failed (%d).\n", r);
2082
		return r;
2074
		return r;
2083
	}
2075
	}
2084
 
2076
 
2085
 
2077
 
2086
	return 0;
2078
	return 0;
2087
}
2079
}
2088
 
2080
 
2089
 
2081
 
2090
 
2082
 
2091
 
2083
 
2092
 
2084
 
2093
/* Plan is to move initialization in that function and use
2085
/* Plan is to move initialization in that function and use
2094
 * helper function so that radeon_device_init pretty much
2086
 * helper function so that radeon_device_init pretty much
2095
 * do nothing more than calling asic specific function. This
2087
 * do nothing more than calling asic specific function. This
2096
 * should also allow to remove a bunch of callback function
2088
 * should also allow to remove a bunch of callback function
2097
 * like vram_info.
2089
 * like vram_info.
2098
 */
2090
 */
2099
int cayman_init(struct radeon_device *rdev)
2091
int cayman_init(struct radeon_device *rdev)
2100
{
2092
{
2101
	struct radeon_ring *ring = &rdev->ring[RADEON_RING_TYPE_GFX_INDEX];
2093
	struct radeon_ring *ring = &rdev->ring[RADEON_RING_TYPE_GFX_INDEX];
2102
	int r;
2094
	int r;
2103
 
2095
 
2104
	/* Read BIOS */
2096
	/* Read BIOS */
2105
	if (!radeon_get_bios(rdev)) {
2097
	if (!radeon_get_bios(rdev)) {
2106
		if (ASIC_IS_AVIVO(rdev))
2098
		if (ASIC_IS_AVIVO(rdev))
2107
			return -EINVAL;
2099
			return -EINVAL;
2108
	}
2100
	}
2109
	/* Must be an ATOMBIOS */
2101
	/* Must be an ATOMBIOS */
2110
	if (!rdev->is_atom_bios) {
2102
	if (!rdev->is_atom_bios) {
2111
		dev_err(rdev->dev, "Expecting atombios for cayman GPU\n");
2103
		dev_err(rdev->dev, "Expecting atombios for cayman GPU\n");
2112
		return -EINVAL;
2104
		return -EINVAL;
2113
	}
2105
	}
2114
	r = radeon_atombios_init(rdev);
2106
	r = radeon_atombios_init(rdev);
2115
	if (r)
2107
	if (r)
2116
		return r;
2108
		return r;
2117
 
2109
 
2118
	/* Post card if necessary */
2110
	/* Post card if necessary */
2119
	if (!radeon_card_posted(rdev)) {
2111
	if (!radeon_card_posted(rdev)) {
2120
		if (!rdev->bios) {
2112
		if (!rdev->bios) {
2121
			dev_err(rdev->dev, "Card not posted and no BIOS - ignoring\n");
2113
			dev_err(rdev->dev, "Card not posted and no BIOS - ignoring\n");
2122
			return -EINVAL;
2114
			return -EINVAL;
2123
		}
2115
		}
2124
		DRM_INFO("GPU not posted. posting now...\n");
2116
		DRM_INFO("GPU not posted. posting now...\n");
2125
		atom_asic_init(rdev->mode_info.atom_context);
2117
		atom_asic_init(rdev->mode_info.atom_context);
2126
	}
2118
	}
2127
	/* init golden registers */
2119
	/* init golden registers */
2128
	ni_init_golden_registers(rdev);
2120
	ni_init_golden_registers(rdev);
2129
	/* Initialize scratch registers */
2121
	/* Initialize scratch registers */
2130
	r600_scratch_init(rdev);
2122
	r600_scratch_init(rdev);
2131
	/* Initialize surface registers */
2123
	/* Initialize surface registers */
2132
	radeon_surface_init(rdev);
2124
	radeon_surface_init(rdev);
2133
	/* Initialize clocks */
2125
	/* Initialize clocks */
2134
	radeon_get_clock_info(rdev->ddev);
2126
	radeon_get_clock_info(rdev->ddev);
2135
	/* Fence driver */
2127
	/* Fence driver */
2136
	r = radeon_fence_driver_init(rdev);
2128
	r = radeon_fence_driver_init(rdev);
2137
	if (r)
2129
	if (r)
2138
		return r;
2130
		return r;
2139
	/* initialize memory controller */
2131
	/* initialize memory controller */
2140
	r = evergreen_mc_init(rdev);
2132
	r = evergreen_mc_init(rdev);
2141
	if (r)
2133
	if (r)
2142
		return r;
2134
		return r;
2143
	/* Memory manager */
2135
	/* Memory manager */
2144
	r = radeon_bo_init(rdev);
2136
	r = radeon_bo_init(rdev);
2145
	if (r)
2137
	if (r)
2146
		return r;
2138
		return r;
-
 
2139
 
-
 
2140
	if (rdev->flags & RADEON_IS_IGP) {
-
 
2141
		if (!rdev->me_fw || !rdev->pfp_fw || !rdev->rlc_fw) {
-
 
2142
			r = ni_init_microcode(rdev);
-
 
2143
			if (r) {
-
 
2144
				DRM_ERROR("Failed to load firmware!\n");
-
 
2145
				return r;
-
 
2146
			}
-
 
2147
		}
-
 
2148
	} else {
-
 
2149
		if (!rdev->me_fw || !rdev->pfp_fw || !rdev->rlc_fw || !rdev->mc_fw) {
-
 
2150
			r = ni_init_microcode(rdev);
-
 
2151
			if (r) {
-
 
2152
				DRM_ERROR("Failed to load firmware!\n");
-
 
2153
				return r;
-
 
2154
			}
-
 
2155
		}
-
 
2156
	}
-
 
2157
 
-
 
2158
	/* Initialize power management */
-
 
2159
	radeon_pm_init(rdev);
2147
 
2160
 
2148
	ring->ring_obj = NULL;
2161
	ring->ring_obj = NULL;
2149
	r600_ring_init(rdev, ring, 1024 * 1024);
2162
	r600_ring_init(rdev, ring, 1024 * 1024);
2150
 
2163
 
2151
	ring = &rdev->ring[R600_RING_TYPE_DMA_INDEX];
2164
	ring = &rdev->ring[R600_RING_TYPE_DMA_INDEX];
2152
	ring->ring_obj = NULL;
2165
	ring->ring_obj = NULL;
2153
	r600_ring_init(rdev, ring, 64 * 1024);
2166
	r600_ring_init(rdev, ring, 64 * 1024);
2154
 
2167
 
2155
	ring = &rdev->ring[CAYMAN_RING_TYPE_DMA1_INDEX];
2168
	ring = &rdev->ring[CAYMAN_RING_TYPE_DMA1_INDEX];
2156
	ring->ring_obj = NULL;
2169
	ring->ring_obj = NULL;
2157
	r600_ring_init(rdev, ring, 64 * 1024);
2170
	r600_ring_init(rdev, ring, 64 * 1024);
2158
 
2171
 
2159
//   r = radeon_uvd_init(rdev);
2172
//   r = radeon_uvd_init(rdev);
2160
//   if (!r) {
2173
//   if (!r) {
2161
//       ring = &rdev->ring[R600_RING_TYPE_UVD_INDEX];
2174
//       ring = &rdev->ring[R600_RING_TYPE_UVD_INDEX];
2162
//       ring->ring_obj = NULL;
2175
//       ring->ring_obj = NULL;
2163
//       r600_ring_init(rdev, ring, 4096);
2176
//       r600_ring_init(rdev, ring, 4096);
2164
//   }
2177
//   }
2165
 
2178
 
2166
	rdev->ih.ring_obj = NULL;
2179
	rdev->ih.ring_obj = NULL;
2167
	r600_ih_ring_init(rdev, 64 * 1024);
2180
	r600_ih_ring_init(rdev, 64 * 1024);
2168
 
2181
 
2169
	r = r600_pcie_gart_init(rdev);
2182
	r = r600_pcie_gart_init(rdev);
2170
	if (r)
2183
	if (r)
2171
		return r;
2184
		return r;
2172
 
2185
 
2173
	rdev->accel_working = true;
2186
	rdev->accel_working = true;
2174
	r = cayman_startup(rdev);
2187
	r = cayman_startup(rdev);
2175
	if (r) {
2188
	if (r) {
2176
		dev_err(rdev->dev, "disabling GPU acceleration\n");
2189
		dev_err(rdev->dev, "disabling GPU acceleration\n");
2177
		rdev->accel_working = false;
2190
		rdev->accel_working = false;
2178
	}
2191
	}
2179
 
2192
 
2180
	/* Don't start up if the MC ucode is missing.
2193
	/* Don't start up if the MC ucode is missing.
2181
	 * The default clocks and voltages before the MC ucode
2194
	 * The default clocks and voltages before the MC ucode
2182
	 * is loaded are not suffient for advanced operations.
2195
	 * is loaded are not suffient for advanced operations.
2183
	 *
2196
	 *
2184
	 * We can skip this check for TN, because there is no MC
2197
	 * We can skip this check for TN, because there is no MC
2185
	 * ucode.
2198
	 * ucode.
2186
	 */
2199
	 */
2187
	if (!rdev->mc_fw && !(rdev->flags & RADEON_IS_IGP)) {
2200
	if (!rdev->mc_fw && !(rdev->flags & RADEON_IS_IGP)) {
2188
		DRM_ERROR("radeon: MC ucode required for NI+.\n");
2201
		DRM_ERROR("radeon: MC ucode required for NI+.\n");
2189
		return -EINVAL;
2202
		return -EINVAL;
2190
	}
2203
	}
2191
 
2204
 
2192
	return 0;
2205
	return 0;
2193
}
2206
}
2194
 
2207
 
2195
/*
2208
/*
2196
 * vm
2209
 * vm
2197
 */
2210
 */
2198
int cayman_vm_init(struct radeon_device *rdev)
2211
int cayman_vm_init(struct radeon_device *rdev)
2199
{
2212
{
2200
	/* number of VMs */
2213
	/* number of VMs */
2201
	rdev->vm_manager.nvm = 8;
2214
	rdev->vm_manager.nvm = 8;
2202
	/* base offset of vram pages */
2215
	/* base offset of vram pages */
2203
	if (rdev->flags & RADEON_IS_IGP) {
2216
	if (rdev->flags & RADEON_IS_IGP) {
2204
		u64 tmp = RREG32(FUS_MC_VM_FB_OFFSET);
2217
		u64 tmp = RREG32(FUS_MC_VM_FB_OFFSET);
2205
		tmp <<= 22;
2218
		tmp <<= 22;
2206
		rdev->vm_manager.vram_base_offset = tmp;
2219
		rdev->vm_manager.vram_base_offset = tmp;
2207
	} else
2220
	} else
2208
		rdev->vm_manager.vram_base_offset = 0;
2221
		rdev->vm_manager.vram_base_offset = 0;
2209
	return 0;
2222
	return 0;
2210
}
2223
}
2211
 
2224
 
2212
void cayman_vm_fini(struct radeon_device *rdev)
2225
void cayman_vm_fini(struct radeon_device *rdev)
2213
{
2226
{
2214
}
2227
}
2215
 
-
 
2216
#define R600_ENTRY_VALID   (1 << 0)
-
 
2217
#define R600_PTE_SYSTEM    (1 << 1)
-
 
2218
#define R600_PTE_SNOOPED   (1 << 2)
-
 
2219
#define R600_PTE_READABLE  (1 << 5)
-
 
2220
#define R600_PTE_WRITEABLE (1 << 6)
-
 
2221
 
-
 
2222
uint32_t cayman_vm_page_flags(struct radeon_device *rdev, uint32_t flags)
-
 
2223
{
-
 
2224
	uint32_t r600_flags = 0;
-
 
2225
	r600_flags |= (flags & RADEON_VM_PAGE_VALID) ? R600_ENTRY_VALID : 0;
-
 
2226
	r600_flags |= (flags & RADEON_VM_PAGE_READABLE) ? R600_PTE_READABLE : 0;
-
 
2227
	r600_flags |= (flags & RADEON_VM_PAGE_WRITEABLE) ? R600_PTE_WRITEABLE : 0;
-
 
2228
	if (flags & RADEON_VM_PAGE_SYSTEM) {
-
 
2229
		r600_flags |= R600_PTE_SYSTEM;
-
 
2230
		r600_flags |= (flags & RADEON_VM_PAGE_SNOOPED) ? R600_PTE_SNOOPED : 0;
-
 
2231
	}
-
 
2232
	return r600_flags;
-
 
2233
}
-
 
2234
 
2228
 
2235
/**
2229
/**
2236
 * cayman_vm_set_page - update the page tables using the CP
2230
 * cayman_vm_decode_fault - print human readable fault info
2237
 *
2231
 *
2238
 * @rdev: radeon_device pointer
2232
 * @rdev: radeon_device pointer
2239
 * @ib: indirect buffer to fill with commands
-
 
2240
 * @pe: addr of the page entry
2233
 * @status: VM_CONTEXT1_PROTECTION_FAULT_STATUS register value
2241
 * @addr: dst addr to write into pe
-
 
2242
 * @count: number of page entries to update
-
 
2243
 * @incr: increase next addr by incr bytes
-
 
2244
 * @flags: access flags
2234
 * @addr: VM_CONTEXT1_PROTECTION_FAULT_ADDR register value
2245
 *
2235
 *
2246
 * Update the page tables using the CP (cayman/TN).
2236
 * Print human readable fault information (cayman/TN).
2247
 */
2237
 */
2248
void cayman_vm_set_page(struct radeon_device *rdev,
-
 
2249
			struct radeon_ib *ib,
-
 
2250
			uint64_t pe,
-
 
2251
			uint64_t addr, unsigned count,
2238
void cayman_vm_decode_fault(struct radeon_device *rdev,
2252
			uint32_t incr, uint32_t flags)
2239
			    u32 status, u32 addr)
-
 
2240
{
2253
{
2241
	u32 mc_id = (status & MEMORY_CLIENT_ID_MASK) >> MEMORY_CLIENT_ID_SHIFT;
2254
	uint32_t r600_flags = cayman_vm_page_flags(rdev, flags);
2242
	u32 vmid = (status & FAULT_VMID_MASK) >> FAULT_VMID_SHIFT;
2255
	uint64_t value;
2243
	u32 protections = (status & PROTECTIONS_MASK) >> PROTECTIONS_SHIFT;
2256
	unsigned ndw;
2244
	char *block;
2257
 
-
 
2258
	if (rdev->asic->vm.pt_ring_index == RADEON_RING_TYPE_GFX_INDEX) {
2245
 
2259
	while (count) {
2246
	switch (mc_id) {
-
 
2247
	case 32:
-
 
2248
	case 16:
-
 
2249
	case 96:
-
 
2250
	case 80:
-
 
2251
	case 160:
-
 
2252
	case 144:
2260
			ndw = 1 + count * 2;
2253
	case 224:
2261
		if (ndw > 0x3FFF)
2254
	case 208:
2262
			ndw = 0x3FFF;
2255
		block = "CB";
-
 
2256
		break;
-
 
2257
	case 33:
-
 
2258
	case 17:
-
 
2259
	case 97:
-
 
2260
	case 81:
-
 
2261
	case 161:
-
 
2262
	case 145:
-
 
2263
	case 225:
2263
 
2264
	case 209:
2264
			ib->ptr[ib->length_dw++] = PACKET3(PACKET3_ME_WRITE, ndw);
2265
		block = "CB_FMASK";
-
 
2266
		break;
-
 
2267
	case 34:
-
 
2268
	case 18:
-
 
2269
	case 98:
-
 
2270
	case 82:
-
 
2271
	case 162:
-
 
2272
	case 146:
-
 
2273
	case 226:
2265
			ib->ptr[ib->length_dw++] = pe;
2274
	case 210:
-
 
2275
		block = "CB_CMASK";
-
 
2276
		break;
-
 
2277
	case 35:
-
 
2278
	case 19:
2266
			ib->ptr[ib->length_dw++] = upper_32_bits(pe) & 0xff;
2279
	case 99:
-
 
2280
	case 83:
-
 
2281
	case 163:
-
 
2282
	case 147:
-
 
2283
	case 227:
2267
		for (; ndw > 1; ndw -= 2, --count, pe += 8) {
2284
	case 211:
-
 
2285
		block = "CB_IMMED";
-
 
2286
		break;
-
 
2287
	case 36:
-
 
2288
	case 20:
-
 
2289
	case 100:
-
 
2290
	case 84:
-
 
2291
	case 164:
-
 
2292
	case 148:
-
 
2293
	case 228:
2268
			if (flags & RADEON_VM_PAGE_SYSTEM) {
2294
	case 212:
-
 
2295
		block = "DB";
-
 
2296
		break;
-
 
2297
	case 37:
2269
				value = radeon_vm_map_gart(rdev, addr);
2298
	case 21:
-
 
2299
	case 101:
-
 
2300
	case 85:
-
 
2301
	case 165:
-
 
2302
	case 149:
-
 
2303
	case 229:
2270
				value &= 0xFFFFFFFFFFFFF000ULL;
2304
	case 213:
2271
				} else if (flags & RADEON_VM_PAGE_VALID) {
2305
		block = "DB_HTILE";
-
 
2306
		break;
-
 
2307
	case 38:
-
 
2308
	case 22:
-
 
2309
	case 102:
-
 
2310
	case 86:
2272
					value = addr;
2311
	case 166:
2273
				} else {
2312
	case 150:
2274
					value = 0;
2313
	case 230:
2275
				}
2314
	case 214:
-
 
2315
		block = "SX";
-
 
2316
		break;
-
 
2317
	case 39:
-
 
2318
	case 23:
-
 
2319
	case 103:
-
 
2320
	case 87:
-
 
2321
	case 167:
-
 
2322
	case 151:
-
 
2323
	case 231:
2276
				addr += incr;
2324
	case 215:
2277
				value |= r600_flags;
2325
		block = "DB_STEN";
-
 
2326
		break;
-
 
2327
	case 40:
-
 
2328
	case 24:
-
 
2329
	case 104:
-
 
2330
	case 88:
-
 
2331
	case 232:
-
 
2332
	case 216:
-
 
2333
	case 168:
2278
				ib->ptr[ib->length_dw++] = value;
2334
	case 152:
2279
				ib->ptr[ib->length_dw++] = upper_32_bits(value);
2335
		block = "TC_TFETCH";
-
 
2336
		break;
2280
			}
2337
	case 41:
-
 
2338
	case 25:
2281
		}
2339
	case 105:
-
 
2340
	case 89:
-
 
2341
	case 233:
-
 
2342
	case 217:
-
 
2343
	case 169:
2282
	} else {
2344
	case 153:
-
 
2345
		block = "TC_VFETCH";
-
 
2346
		break;
-
 
2347
	case 42:
2283
		if ((flags & RADEON_VM_PAGE_SYSTEM) ||
2348
	case 26:
-
 
2349
	case 106:
2284
		    (count == 1)) {
2350
	case 90:
2285
		while (count) {
2351
	case 234:
2286
			ndw = count * 2;
2352
	case 218:
-
 
2353
	case 170:
2287
			if (ndw > 0xFFFFE)
2354
	case 154:
2288
				ndw = 0xFFFFE;
2355
		block = "VC";
2289
 
2356
		break;
2290
			/* for non-physically contiguous pages (system) */
2357
	case 112:
2291
			ib->ptr[ib->length_dw++] = DMA_PACKET(DMA_PACKET_WRITE, 0, 0, ndw);
2358
		block = "CP";
2292
			ib->ptr[ib->length_dw++] = pe;
2359
		break;
2293
			ib->ptr[ib->length_dw++] = upper_32_bits(pe) & 0xff;
2360
	case 113:
2294
			for (; ndw > 0; ndw -= 2, --count, pe += 8) {
2361
	case 114:
2295
				if (flags & RADEON_VM_PAGE_SYSTEM) {
2362
		block = "SH";
2296
					value = radeon_vm_map_gart(rdev, addr);
2363
		break;
2297
					value &= 0xFFFFFFFFFFFFF000ULL;
2364
	case 115:
2298
			} else if (flags & RADEON_VM_PAGE_VALID) {
2365
		block = "VGT";
2299
				value = addr;
2366
		break;
2300
				} else {
2367
	case 178:
2301
					value = 0;
2368
		block = "IH";
-
 
2369
		break;
2302
				}
2370
	case 51:
-
 
2371
		block = "RLC";
-
 
2372
		break;
2303
				addr += incr;
2373
	case 55:
-
 
2374
		block = "DMA";
-
 
2375
		break;
2304
			value |= r600_flags;
2376
	case 56:
-
 
2377
		block = "HDP";
-
 
2378
		break;
2305
				ib->ptr[ib->length_dw++] = value;
2379
	default:
2306
				ib->ptr[ib->length_dw++] = upper_32_bits(value);
2380
		block = "unknown";
2307
		}
2381
		break;
2308
	}
-
 
2309
		while (ib->length_dw & 0x7)
-
 
2310
			ib->ptr[ib->length_dw++] = DMA_PACKET(DMA_PACKET_NOP, 0, 0, 0);
-
 
2311
		} else {
-
 
2312
			while (count) {
-
 
2313
				ndw = count * 2;
-
 
2314
				if (ndw > 0xFFFFE)
-
 
2315
					ndw = 0xFFFFE;
-
 
2316
 
-
 
2317
				if (flags & RADEON_VM_PAGE_VALID)
-
 
2318
					value = addr;
-
 
2319
				else
2382
			}
2320
					value = 0;
-
 
2321
				/* for physically contiguous pages (vram) */
-
 
2322
				ib->ptr[ib->length_dw++] = DMA_PTE_PDE_PACKET(ndw);
-
 
2323
				ib->ptr[ib->length_dw++] = pe; /* dst addr */
-
 
2324
				ib->ptr[ib->length_dw++] = upper_32_bits(pe) & 0xff;
2383
 
2325
				ib->ptr[ib->length_dw++] = r600_flags; /* mask */
-
 
2326
				ib->ptr[ib->length_dw++] = 0;
-
 
2327
				ib->ptr[ib->length_dw++] = value; /* value */
2384
	printk("VM fault (0x%02x, vmid %d) at page %u, %s from %s (%d)\n",
2328
				ib->ptr[ib->length_dw++] = upper_32_bits(value);
-
 
2329
				ib->ptr[ib->length_dw++] = incr; /* increment size */
2385
	       protections, vmid, addr,
2330
				ib->ptr[ib->length_dw++] = 0;
-
 
2331
				pe += ndw * 4;
-
 
2332
				addr += (ndw / 2) * incr;
-
 
2333
				count -= ndw / 2;
-
 
2334
			}
-
 
2335
		}
-
 
2336
		while (ib->length_dw & 0x7)
-
 
2337
			ib->ptr[ib->length_dw++] = DMA_PACKET(DMA_PACKET_NOP, 0, 0, 0);
2386
	       (status & MEMORY_CLIENT_RW_MASK) ? "write" : "read",
2338
	}
2387
	       block, mc_id);
2339
}
2388
}
2340
 
2389
 
2341
/**
2390
/**
2342
 * cayman_vm_flush - vm flush using the CP
2391
 * cayman_vm_flush - vm flush using the CP
2343
 *
2392
 *
2344
 * @rdev: radeon_device pointer
2393
 * @rdev: radeon_device pointer
2345
 *
2394
 *
2346
 * Update the page table base and flush the VM TLB
2395
 * Update the page table base and flush the VM TLB
2347
 * using the CP (cayman-si).
2396
 * using the CP (cayman-si).
2348
 */
2397
 */
2349
void cayman_vm_flush(struct radeon_device *rdev, int ridx, struct radeon_vm *vm)
2398
void cayman_vm_flush(struct radeon_device *rdev, int ridx, struct radeon_vm *vm)
2350
{
2399
{
2351
	struct radeon_ring *ring = &rdev->ring[ridx];
2400
	struct radeon_ring *ring = &rdev->ring[ridx];
2352
 
2401
 
2353
	if (vm == NULL)
2402
	if (vm == NULL)
2354
		return;
2403
		return;
2355
 
2404
 
2356
	radeon_ring_write(ring, PACKET0(VM_CONTEXT0_PAGE_TABLE_BASE_ADDR + (vm->id << 2), 0));
2405
	radeon_ring_write(ring, PACKET0(VM_CONTEXT0_PAGE_TABLE_BASE_ADDR + (vm->id << 2), 0));
2357
	radeon_ring_write(ring, vm->pd_gpu_addr >> 12);
2406
	radeon_ring_write(ring, vm->pd_gpu_addr >> 12);
2358
 
2407
 
2359
	/* flush hdp cache */
2408
	/* flush hdp cache */
2360
	radeon_ring_write(ring, PACKET0(HDP_MEM_COHERENCY_FLUSH_CNTL, 0));
2409
	radeon_ring_write(ring, PACKET0(HDP_MEM_COHERENCY_FLUSH_CNTL, 0));
2361
	radeon_ring_write(ring, 0x1);
2410
	radeon_ring_write(ring, 0x1);
2362
 
2411
 
2363
	/* bits 0-7 are the VM contexts0-7 */
2412
	/* bits 0-7 are the VM contexts0-7 */
2364
	radeon_ring_write(ring, PACKET0(VM_INVALIDATE_REQUEST, 0));
2413
	radeon_ring_write(ring, PACKET0(VM_INVALIDATE_REQUEST, 0));
2365
	radeon_ring_write(ring, 1 << vm->id);
2414
	radeon_ring_write(ring, 1 << vm->id);
2366
 
2415
 
2367
	/* sync PFP to ME, otherwise we might get invalid PFP reads */
2416
	/* sync PFP to ME, otherwise we might get invalid PFP reads */
2368
	radeon_ring_write(ring, PACKET3(PACKET3_PFP_SYNC_ME, 0));
2417
	radeon_ring_write(ring, PACKET3(PACKET3_PFP_SYNC_ME, 0));
2369
	radeon_ring_write(ring, 0x0);
2418
	radeon_ring_write(ring, 0x0);
2370
}
2419
}
2371
 
-
 
2372
void cayman_dma_vm_flush(struct radeon_device *rdev, int ridx, struct radeon_vm *vm)
-
 
2373
{
-
 
2374
	struct radeon_ring *ring = &rdev->ring[ridx];
-
 
2375
 
-
 
2376
	if (vm == NULL)
-
 
2377
		return;
-
 
2378
 
-
 
2379
	radeon_ring_write(ring, DMA_PACKET(DMA_PACKET_SRBM_WRITE, 0, 0, 0));
-
 
2380
	radeon_ring_write(ring, (0xf << 16) | ((VM_CONTEXT0_PAGE_TABLE_BASE_ADDR + (vm->id << 2)) >> 2));
-
 
2381
	radeon_ring_write(ring, vm->pd_gpu_addr >> 12);
-
 
2382
 
-
 
2383
	/* flush hdp cache */
-
 
2384
	radeon_ring_write(ring, DMA_PACKET(DMA_PACKET_SRBM_WRITE, 0, 0, 0));
-
 
2385
	radeon_ring_write(ring, (0xf << 16) | (HDP_MEM_COHERENCY_FLUSH_CNTL >> 2));
-
 
2386
	radeon_ring_write(ring, 1);
-
 
2387
 
-
 
2388
	/* bits 0-7 are the VM contexts0-7 */
-
 
2389
	radeon_ring_write(ring, DMA_PACKET(DMA_PACKET_SRBM_WRITE, 0, 0, 0));
-
 
2390
	radeon_ring_write(ring, (0xf << 16) | (VM_INVALIDATE_REQUEST >> 2));
-
 
2391
	radeon_ring_write(ring, 1 << vm->id);
-
 
2392
}
-
 
2393
-