2 * Copyright 2011 Advanced Micro Devices, Inc.
4 * Permission is hereby granted, free of charge, to any person obtaining a
5 * copy of this software and associated documentation files (the "Software"),
6 * to deal in the Software without restriction, including without limitation
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
9 * Software is furnished to do so, subject to the following conditions:
11 * The above copyright notice and this permission notice shall be included in
12 * all copies or substantial portions of the Software.
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,
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
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
20 * OTHER DEALINGS IN THE SOFTWARE.
22 * Authors: Alex Deucher
24 #include <linux/firmware.h>
25 #include <linux/platform_device.h>
26 #include <linux/slab.h>
27 #include <linux/module.h>
30 #include "radeon_asic.h"
31 #include <drm/radeon_drm.h>
34 #include "si_blit_shaders.h"
36 #define SI_PFP_UCODE_SIZE 2144
37 #define SI_PM4_UCODE_SIZE 2144
38 #define SI_CE_UCODE_SIZE 2144
39 #define SI_RLC_UCODE_SIZE 2048
40 #define SI_MC_UCODE_SIZE 7769
41 #define OLAND_MC_UCODE_SIZE 7863
43 MODULE_FIRMWARE("radeon/TAHITI_pfp.bin");
44 MODULE_FIRMWARE("radeon/TAHITI_me.bin");
45 MODULE_FIRMWARE("radeon/TAHITI_ce.bin");
46 MODULE_FIRMWARE("radeon/TAHITI_mc.bin");
47 MODULE_FIRMWARE("radeon/TAHITI_rlc.bin");
48 MODULE_FIRMWARE("radeon/PITCAIRN_pfp.bin");
49 MODULE_FIRMWARE("radeon/PITCAIRN_me.bin");
50 MODULE_FIRMWARE("radeon/PITCAIRN_ce.bin");
51 MODULE_FIRMWARE("radeon/PITCAIRN_mc.bin");
52 MODULE_FIRMWARE("radeon/PITCAIRN_rlc.bin");
53 MODULE_FIRMWARE("radeon/VERDE_pfp.bin");
54 MODULE_FIRMWARE("radeon/VERDE_me.bin");
55 MODULE_FIRMWARE("radeon/VERDE_ce.bin");
56 MODULE_FIRMWARE("radeon/VERDE_mc.bin");
57 MODULE_FIRMWARE("radeon/VERDE_rlc.bin");
58 MODULE_FIRMWARE("radeon/OLAND_pfp.bin");
59 MODULE_FIRMWARE("radeon/OLAND_me.bin");
60 MODULE_FIRMWARE("radeon/OLAND_ce.bin");
61 MODULE_FIRMWARE("radeon/OLAND_mc.bin");
62 MODULE_FIRMWARE("radeon/OLAND_rlc.bin");
64 extern int r600_ih_ring_alloc(struct radeon_device *rdev);
65 extern void r600_ih_ring_fini(struct radeon_device *rdev);
66 extern void evergreen_fix_pci_max_read_req_size(struct radeon_device *rdev);
67 extern void evergreen_mc_stop(struct radeon_device *rdev, struct evergreen_mc_save *save);
68 extern void evergreen_mc_resume(struct radeon_device *rdev, struct evergreen_mc_save *save);
69 extern u32 evergreen_get_number_of_dram_channels(struct radeon_device *rdev);
70 extern void evergreen_print_gpu_status_regs(struct radeon_device *rdev);
71 extern bool evergreen_is_display_hung(struct radeon_device *rdev);
73 static const u32 tahiti_golden_rlc_registers[] =
75 0xc424, 0xffffffff, 0x00601005,
76 0xc47c, 0xffffffff, 0x10104040,
77 0xc488, 0xffffffff, 0x0100000a,
78 0xc314, 0xffffffff, 0x00000800,
79 0xc30c, 0xffffffff, 0x800000f4,
80 0xf4a8, 0xffffffff, 0x00000000
83 static const u32 tahiti_golden_registers[] =
85 0x9a10, 0x00010000, 0x00018208,
86 0x9830, 0xffffffff, 0x00000000,
87 0x9834, 0xf00fffff, 0x00000400,
88 0x9838, 0x0002021c, 0x00020200,
89 0xc78, 0x00000080, 0x00000000,
90 0xd030, 0x000300c0, 0x00800040,
91 0xd830, 0x000300c0, 0x00800040,
92 0x5bb0, 0x000000f0, 0x00000070,
93 0x5bc0, 0x00200000, 0x50100000,
94 0x7030, 0x31000311, 0x00000011,
95 0x277c, 0x00000003, 0x000007ff,
96 0x240c, 0x000007ff, 0x00000000,
97 0x8a14, 0xf000001f, 0x00000007,
98 0x8b24, 0xffffffff, 0x00ffffff,
99 0x8b10, 0x0000ff0f, 0x00000000,
100 0x28a4c, 0x07ffffff, 0x4e000000,
101 0x28350, 0x3f3f3fff, 0x2a00126a,
102 0x30, 0x000000ff, 0x0040,
103 0x34, 0x00000040, 0x00004040,
104 0x9100, 0x07ffffff, 0x03000000,
105 0x8e88, 0x01ff1f3f, 0x00000000,
106 0x8e84, 0x01ff1f3f, 0x00000000,
107 0x9060, 0x0000007f, 0x00000020,
108 0x9508, 0x00010000, 0x00010000,
109 0xac14, 0x00000200, 0x000002fb,
110 0xac10, 0xffffffff, 0x0000543b,
111 0xac0c, 0xffffffff, 0xa9210876,
112 0x88d0, 0xffffffff, 0x000fff40,
113 0x88d4, 0x0000001f, 0x00000010,
114 0x1410, 0x20000000, 0x20fffed8,
115 0x15c0, 0x000c0fc0, 0x000c0400
118 static const u32 tahiti_golden_registers2[] =
120 0xc64, 0x00000001, 0x00000001
123 static const u32 pitcairn_golden_rlc_registers[] =
125 0xc424, 0xffffffff, 0x00601004,
126 0xc47c, 0xffffffff, 0x10102020,
127 0xc488, 0xffffffff, 0x01000020,
128 0xc314, 0xffffffff, 0x00000800,
129 0xc30c, 0xffffffff, 0x800000a4
132 static const u32 pitcairn_golden_registers[] =
134 0x9a10, 0x00010000, 0x00018208,
135 0x9830, 0xffffffff, 0x00000000,
136 0x9834, 0xf00fffff, 0x00000400,
137 0x9838, 0x0002021c, 0x00020200,
138 0xc78, 0x00000080, 0x00000000,
139 0xd030, 0x000300c0, 0x00800040,
140 0xd830, 0x000300c0, 0x00800040,
141 0x5bb0, 0x000000f0, 0x00000070,
142 0x5bc0, 0x00200000, 0x50100000,
143 0x7030, 0x31000311, 0x00000011,
144 0x2ae4, 0x00073ffe, 0x000022a2,
145 0x240c, 0x000007ff, 0x00000000,
146 0x8a14, 0xf000001f, 0x00000007,
147 0x8b24, 0xffffffff, 0x00ffffff,
148 0x8b10, 0x0000ff0f, 0x00000000,
149 0x28a4c, 0x07ffffff, 0x4e000000,
150 0x28350, 0x3f3f3fff, 0x2a00126a,
151 0x30, 0x000000ff, 0x0040,
152 0x34, 0x00000040, 0x00004040,
153 0x9100, 0x07ffffff, 0x03000000,
154 0x9060, 0x0000007f, 0x00000020,
155 0x9508, 0x00010000, 0x00010000,
156 0xac14, 0x000003ff, 0x000000f7,
157 0xac10, 0xffffffff, 0x00000000,
158 0xac0c, 0xffffffff, 0x32761054,
159 0x88d4, 0x0000001f, 0x00000010,
160 0x15c0, 0x000c0fc0, 0x000c0400
163 static const u32 verde_golden_rlc_registers[] =
165 0xc424, 0xffffffff, 0x033f1005,
166 0xc47c, 0xffffffff, 0x10808020,
167 0xc488, 0xffffffff, 0x00800008,
168 0xc314, 0xffffffff, 0x00001000,
169 0xc30c, 0xffffffff, 0x80010014
172 static const u32 verde_golden_registers[] =
174 0x9a10, 0x00010000, 0x00018208,
175 0x9830, 0xffffffff, 0x00000000,
176 0x9834, 0xf00fffff, 0x00000400,
177 0x9838, 0x0002021c, 0x00020200,
178 0xc78, 0x00000080, 0x00000000,
179 0xd030, 0x000300c0, 0x00800040,
180 0xd030, 0x000300c0, 0x00800040,
181 0xd830, 0x000300c0, 0x00800040,
182 0xd830, 0x000300c0, 0x00800040,
183 0x5bb0, 0x000000f0, 0x00000070,
184 0x5bc0, 0x00200000, 0x50100000,
185 0x7030, 0x31000311, 0x00000011,
186 0x2ae4, 0x00073ffe, 0x000022a2,
187 0x2ae4, 0x00073ffe, 0x000022a2,
188 0x2ae4, 0x00073ffe, 0x000022a2,
189 0x240c, 0x000007ff, 0x00000000,
190 0x240c, 0x000007ff, 0x00000000,
191 0x240c, 0x000007ff, 0x00000000,
192 0x8a14, 0xf000001f, 0x00000007,
193 0x8a14, 0xf000001f, 0x00000007,
194 0x8a14, 0xf000001f, 0x00000007,
195 0x8b24, 0xffffffff, 0x00ffffff,
196 0x8b10, 0x0000ff0f, 0x00000000,
197 0x28a4c, 0x07ffffff, 0x4e000000,
198 0x28350, 0x3f3f3fff, 0x0000124a,
199 0x28350, 0x3f3f3fff, 0x0000124a,
200 0x28350, 0x3f3f3fff, 0x0000124a,
201 0x30, 0x000000ff, 0x0040,
202 0x34, 0x00000040, 0x00004040,
203 0x9100, 0x07ffffff, 0x03000000,
204 0x9100, 0x07ffffff, 0x03000000,
205 0x8e88, 0x01ff1f3f, 0x00000000,
206 0x8e88, 0x01ff1f3f, 0x00000000,
207 0x8e88, 0x01ff1f3f, 0x00000000,
208 0x8e84, 0x01ff1f3f, 0x00000000,
209 0x8e84, 0x01ff1f3f, 0x00000000,
210 0x8e84, 0x01ff1f3f, 0x00000000,
211 0x9060, 0x0000007f, 0x00000020,
212 0x9508, 0x00010000, 0x00010000,
213 0xac14, 0x000003ff, 0x00000003,
214 0xac14, 0x000003ff, 0x00000003,
215 0xac14, 0x000003ff, 0x00000003,
216 0xac10, 0xffffffff, 0x00000000,
217 0xac10, 0xffffffff, 0x00000000,
218 0xac10, 0xffffffff, 0x00000000,
219 0xac0c, 0xffffffff, 0x00001032,
220 0xac0c, 0xffffffff, 0x00001032,
221 0xac0c, 0xffffffff, 0x00001032,
222 0x88d4, 0x0000001f, 0x00000010,
223 0x88d4, 0x0000001f, 0x00000010,
224 0x88d4, 0x0000001f, 0x00000010,
225 0x15c0, 0x000c0fc0, 0x000c0400
228 static const u32 oland_golden_rlc_registers[] =
230 0xc424, 0xffffffff, 0x00601005,
231 0xc47c, 0xffffffff, 0x10104040,
232 0xc488, 0xffffffff, 0x0100000a,
233 0xc314, 0xffffffff, 0x00000800,
234 0xc30c, 0xffffffff, 0x800000f4
237 static const u32 oland_golden_registers[] =
239 0x9a10, 0x00010000, 0x00018208,
240 0x9830, 0xffffffff, 0x00000000,
241 0x9834, 0xf00fffff, 0x00000400,
242 0x9838, 0x0002021c, 0x00020200,
243 0xc78, 0x00000080, 0x00000000,
244 0xd030, 0x000300c0, 0x00800040,
245 0xd830, 0x000300c0, 0x00800040,
246 0x5bb0, 0x000000f0, 0x00000070,
247 0x5bc0, 0x00200000, 0x50100000,
248 0x7030, 0x31000311, 0x00000011,
249 0x2ae4, 0x00073ffe, 0x000022a2,
250 0x240c, 0x000007ff, 0x00000000,
251 0x8a14, 0xf000001f, 0x00000007,
252 0x8b24, 0xffffffff, 0x00ffffff,
253 0x8b10, 0x0000ff0f, 0x00000000,
254 0x28a4c, 0x07ffffff, 0x4e000000,
255 0x28350, 0x3f3f3fff, 0x00000082,
256 0x30, 0x000000ff, 0x0040,
257 0x34, 0x00000040, 0x00004040,
258 0x9100, 0x07ffffff, 0x03000000,
259 0x9060, 0x0000007f, 0x00000020,
260 0x9508, 0x00010000, 0x00010000,
261 0xac14, 0x000003ff, 0x000000f3,
262 0xac10, 0xffffffff, 0x00000000,
263 0xac0c, 0xffffffff, 0x00003210,
264 0x88d4, 0x0000001f, 0x00000010,
265 0x15c0, 0x000c0fc0, 0x000c0400
268 static const u32 tahiti_mgcg_cgcg_init[] =
270 0xc400, 0xffffffff, 0xfffffffc,
271 0x802c, 0xffffffff, 0xe0000000,
272 0x9a60, 0xffffffff, 0x00000100,
273 0x92a4, 0xffffffff, 0x00000100,
274 0xc164, 0xffffffff, 0x00000100,
275 0x9774, 0xffffffff, 0x00000100,
276 0x8984, 0xffffffff, 0x06000100,
277 0x8a18, 0xffffffff, 0x00000100,
278 0x92a0, 0xffffffff, 0x00000100,
279 0xc380, 0xffffffff, 0x00000100,
280 0x8b28, 0xffffffff, 0x00000100,
281 0x9144, 0xffffffff, 0x00000100,
282 0x8d88, 0xffffffff, 0x00000100,
283 0x8d8c, 0xffffffff, 0x00000100,
284 0x9030, 0xffffffff, 0x00000100,
285 0x9034, 0xffffffff, 0x00000100,
286 0x9038, 0xffffffff, 0x00000100,
287 0x903c, 0xffffffff, 0x00000100,
288 0xad80, 0xffffffff, 0x00000100,
289 0xac54, 0xffffffff, 0x00000100,
290 0x897c, 0xffffffff, 0x06000100,
291 0x9868, 0xffffffff, 0x00000100,
292 0x9510, 0xffffffff, 0x00000100,
293 0xaf04, 0xffffffff, 0x00000100,
294 0xae04, 0xffffffff, 0x00000100,
295 0x949c, 0xffffffff, 0x00000100,
296 0x802c, 0xffffffff, 0xe0000000,
297 0x9160, 0xffffffff, 0x00010000,
298 0x9164, 0xffffffff, 0x00030002,
299 0x9168, 0xffffffff, 0x00040007,
300 0x916c, 0xffffffff, 0x00060005,
301 0x9170, 0xffffffff, 0x00090008,
302 0x9174, 0xffffffff, 0x00020001,
303 0x9178, 0xffffffff, 0x00040003,
304 0x917c, 0xffffffff, 0x00000007,
305 0x9180, 0xffffffff, 0x00060005,
306 0x9184, 0xffffffff, 0x00090008,
307 0x9188, 0xffffffff, 0x00030002,
308 0x918c, 0xffffffff, 0x00050004,
309 0x9190, 0xffffffff, 0x00000008,
310 0x9194, 0xffffffff, 0x00070006,
311 0x9198, 0xffffffff, 0x000a0009,
312 0x919c, 0xffffffff, 0x00040003,
313 0x91a0, 0xffffffff, 0x00060005,
314 0x91a4, 0xffffffff, 0x00000009,
315 0x91a8, 0xffffffff, 0x00080007,
316 0x91ac, 0xffffffff, 0x000b000a,
317 0x91b0, 0xffffffff, 0x00050004,
318 0x91b4, 0xffffffff, 0x00070006,
319 0x91b8, 0xffffffff, 0x0008000b,
320 0x91bc, 0xffffffff, 0x000a0009,
321 0x91c0, 0xffffffff, 0x000d000c,
322 0x91c4, 0xffffffff, 0x00060005,
323 0x91c8, 0xffffffff, 0x00080007,
324 0x91cc, 0xffffffff, 0x0000000b,
325 0x91d0, 0xffffffff, 0x000a0009,
326 0x91d4, 0xffffffff, 0x000d000c,
327 0x91d8, 0xffffffff, 0x00070006,
328 0x91dc, 0xffffffff, 0x00090008,
329 0x91e0, 0xffffffff, 0x0000000c,
330 0x91e4, 0xffffffff, 0x000b000a,
331 0x91e8, 0xffffffff, 0x000e000d,
332 0x91ec, 0xffffffff, 0x00080007,
333 0x91f0, 0xffffffff, 0x000a0009,
334 0x91f4, 0xffffffff, 0x0000000d,
335 0x91f8, 0xffffffff, 0x000c000b,
336 0x91fc, 0xffffffff, 0x000f000e,
337 0x9200, 0xffffffff, 0x00090008,
338 0x9204, 0xffffffff, 0x000b000a,
339 0x9208, 0xffffffff, 0x000c000f,
340 0x920c, 0xffffffff, 0x000e000d,
341 0x9210, 0xffffffff, 0x00110010,
342 0x9214, 0xffffffff, 0x000a0009,
343 0x9218, 0xffffffff, 0x000c000b,
344 0x921c, 0xffffffff, 0x0000000f,
345 0x9220, 0xffffffff, 0x000e000d,
346 0x9224, 0xffffffff, 0x00110010,
347 0x9228, 0xffffffff, 0x000b000a,
348 0x922c, 0xffffffff, 0x000d000c,
349 0x9230, 0xffffffff, 0x00000010,
350 0x9234, 0xffffffff, 0x000f000e,
351 0x9238, 0xffffffff, 0x00120011,
352 0x923c, 0xffffffff, 0x000c000b,
353 0x9240, 0xffffffff, 0x000e000d,
354 0x9244, 0xffffffff, 0x00000011,
355 0x9248, 0xffffffff, 0x0010000f,
356 0x924c, 0xffffffff, 0x00130012,
357 0x9250, 0xffffffff, 0x000d000c,
358 0x9254, 0xffffffff, 0x000f000e,
359 0x9258, 0xffffffff, 0x00100013,
360 0x925c, 0xffffffff, 0x00120011,
361 0x9260, 0xffffffff, 0x00150014,
362 0x9264, 0xffffffff, 0x000e000d,
363 0x9268, 0xffffffff, 0x0010000f,
364 0x926c, 0xffffffff, 0x00000013,
365 0x9270, 0xffffffff, 0x00120011,
366 0x9274, 0xffffffff, 0x00150014,
367 0x9278, 0xffffffff, 0x000f000e,
368 0x927c, 0xffffffff, 0x00110010,
369 0x9280, 0xffffffff, 0x00000014,
370 0x9284, 0xffffffff, 0x00130012,
371 0x9288, 0xffffffff, 0x00160015,
372 0x928c, 0xffffffff, 0x0010000f,
373 0x9290, 0xffffffff, 0x00120011,
374 0x9294, 0xffffffff, 0x00000015,
375 0x9298, 0xffffffff, 0x00140013,
376 0x929c, 0xffffffff, 0x00170016,
377 0x9150, 0xffffffff, 0x96940200,
378 0x8708, 0xffffffff, 0x00900100,
379 0xc478, 0xffffffff, 0x00000080,
380 0xc404, 0xffffffff, 0x0020003f,
381 0x30, 0xffffffff, 0x0000001c,
382 0x34, 0x000f0000, 0x000f0000,
383 0x160c, 0xffffffff, 0x00000100,
384 0x1024, 0xffffffff, 0x00000100,
385 0x102c, 0x00000101, 0x00000000,
386 0x20a8, 0xffffffff, 0x00000104,
387 0x264c, 0x000c0000, 0x000c0000,
388 0x2648, 0x000c0000, 0x000c0000,
389 0x55e4, 0xff000fff, 0x00000100,
390 0x55e8, 0x00000001, 0x00000001,
391 0x2f50, 0x00000001, 0x00000001,
392 0x30cc, 0xc0000fff, 0x00000104,
393 0xc1e4, 0x00000001, 0x00000001,
394 0xd0c0, 0xfffffff0, 0x00000100,
395 0xd8c0, 0xfffffff0, 0x00000100
398 static const u32 pitcairn_mgcg_cgcg_init[] =
400 0xc400, 0xffffffff, 0xfffffffc,
401 0x802c, 0xffffffff, 0xe0000000,
402 0x9a60, 0xffffffff, 0x00000100,
403 0x92a4, 0xffffffff, 0x00000100,
404 0xc164, 0xffffffff, 0x00000100,
405 0x9774, 0xffffffff, 0x00000100,
406 0x8984, 0xffffffff, 0x06000100,
407 0x8a18, 0xffffffff, 0x00000100,
408 0x92a0, 0xffffffff, 0x00000100,
409 0xc380, 0xffffffff, 0x00000100,
410 0x8b28, 0xffffffff, 0x00000100,
411 0x9144, 0xffffffff, 0x00000100,
412 0x8d88, 0xffffffff, 0x00000100,
413 0x8d8c, 0xffffffff, 0x00000100,
414 0x9030, 0xffffffff, 0x00000100,
415 0x9034, 0xffffffff, 0x00000100,
416 0x9038, 0xffffffff, 0x00000100,
417 0x903c, 0xffffffff, 0x00000100,
418 0xad80, 0xffffffff, 0x00000100,
419 0xac54, 0xffffffff, 0x00000100,
420 0x897c, 0xffffffff, 0x06000100,
421 0x9868, 0xffffffff, 0x00000100,
422 0x9510, 0xffffffff, 0x00000100,
423 0xaf04, 0xffffffff, 0x00000100,
424 0xae04, 0xffffffff, 0x00000100,
425 0x949c, 0xffffffff, 0x00000100,
426 0x802c, 0xffffffff, 0xe0000000,
427 0x9160, 0xffffffff, 0x00010000,
428 0x9164, 0xffffffff, 0x00030002,
429 0x9168, 0xffffffff, 0x00040007,
430 0x916c, 0xffffffff, 0x00060005,
431 0x9170, 0xffffffff, 0x00090008,
432 0x9174, 0xffffffff, 0x00020001,
433 0x9178, 0xffffffff, 0x00040003,
434 0x917c, 0xffffffff, 0x00000007,
435 0x9180, 0xffffffff, 0x00060005,
436 0x9184, 0xffffffff, 0x00090008,
437 0x9188, 0xffffffff, 0x00030002,
438 0x918c, 0xffffffff, 0x00050004,
439 0x9190, 0xffffffff, 0x00000008,
440 0x9194, 0xffffffff, 0x00070006,
441 0x9198, 0xffffffff, 0x000a0009,
442 0x919c, 0xffffffff, 0x00040003,
443 0x91a0, 0xffffffff, 0x00060005,
444 0x91a4, 0xffffffff, 0x00000009,
445 0x91a8, 0xffffffff, 0x00080007,
446 0x91ac, 0xffffffff, 0x000b000a,
447 0x91b0, 0xffffffff, 0x00050004,
448 0x91b4, 0xffffffff, 0x00070006,
449 0x91b8, 0xffffffff, 0x0008000b,
450 0x91bc, 0xffffffff, 0x000a0009,
451 0x91c0, 0xffffffff, 0x000d000c,
452 0x9200, 0xffffffff, 0x00090008,
453 0x9204, 0xffffffff, 0x000b000a,
454 0x9208, 0xffffffff, 0x000c000f,
455 0x920c, 0xffffffff, 0x000e000d,
456 0x9210, 0xffffffff, 0x00110010,
457 0x9214, 0xffffffff, 0x000a0009,
458 0x9218, 0xffffffff, 0x000c000b,
459 0x921c, 0xffffffff, 0x0000000f,
460 0x9220, 0xffffffff, 0x000e000d,
461 0x9224, 0xffffffff, 0x00110010,
462 0x9228, 0xffffffff, 0x000b000a,
463 0x922c, 0xffffffff, 0x000d000c,
464 0x9230, 0xffffffff, 0x00000010,
465 0x9234, 0xffffffff, 0x000f000e,
466 0x9238, 0xffffffff, 0x00120011,
467 0x923c, 0xffffffff, 0x000c000b,
468 0x9240, 0xffffffff, 0x000e000d,
469 0x9244, 0xffffffff, 0x00000011,
470 0x9248, 0xffffffff, 0x0010000f,
471 0x924c, 0xffffffff, 0x00130012,
472 0x9250, 0xffffffff, 0x000d000c,
473 0x9254, 0xffffffff, 0x000f000e,
474 0x9258, 0xffffffff, 0x00100013,
475 0x925c, 0xffffffff, 0x00120011,
476 0x9260, 0xffffffff, 0x00150014,
477 0x9150, 0xffffffff, 0x96940200,
478 0x8708, 0xffffffff, 0x00900100,
479 0xc478, 0xffffffff, 0x00000080,
480 0xc404, 0xffffffff, 0x0020003f,
481 0x30, 0xffffffff, 0x0000001c,
482 0x34, 0x000f0000, 0x000f0000,
483 0x160c, 0xffffffff, 0x00000100,
484 0x1024, 0xffffffff, 0x00000100,
485 0x102c, 0x00000101, 0x00000000,
486 0x20a8, 0xffffffff, 0x00000104,
487 0x55e4, 0xff000fff, 0x00000100,
488 0x55e8, 0x00000001, 0x00000001,
489 0x2f50, 0x00000001, 0x00000001,
490 0x30cc, 0xc0000fff, 0x00000104,
491 0xc1e4, 0x00000001, 0x00000001,
492 0xd0c0, 0xfffffff0, 0x00000100,
493 0xd8c0, 0xfffffff0, 0x00000100
496 static const u32 verde_mgcg_cgcg_init[] =
498 0xc400, 0xffffffff, 0xfffffffc,
499 0x802c, 0xffffffff, 0xe0000000,
500 0x9a60, 0xffffffff, 0x00000100,
501 0x92a4, 0xffffffff, 0x00000100,
502 0xc164, 0xffffffff, 0x00000100,
503 0x9774, 0xffffffff, 0x00000100,
504 0x8984, 0xffffffff, 0x06000100,
505 0x8a18, 0xffffffff, 0x00000100,
506 0x92a0, 0xffffffff, 0x00000100,
507 0xc380, 0xffffffff, 0x00000100,
508 0x8b28, 0xffffffff, 0x00000100,
509 0x9144, 0xffffffff, 0x00000100,
510 0x8d88, 0xffffffff, 0x00000100,
511 0x8d8c, 0xffffffff, 0x00000100,
512 0x9030, 0xffffffff, 0x00000100,
513 0x9034, 0xffffffff, 0x00000100,
514 0x9038, 0xffffffff, 0x00000100,
515 0x903c, 0xffffffff, 0x00000100,
516 0xad80, 0xffffffff, 0x00000100,
517 0xac54, 0xffffffff, 0x00000100,
518 0x897c, 0xffffffff, 0x06000100,
519 0x9868, 0xffffffff, 0x00000100,
520 0x9510, 0xffffffff, 0x00000100,
521 0xaf04, 0xffffffff, 0x00000100,
522 0xae04, 0xffffffff, 0x00000100,
523 0x949c, 0xffffffff, 0x00000100,
524 0x802c, 0xffffffff, 0xe0000000,
525 0x9160, 0xffffffff, 0x00010000,
526 0x9164, 0xffffffff, 0x00030002,
527 0x9168, 0xffffffff, 0x00040007,
528 0x916c, 0xffffffff, 0x00060005,
529 0x9170, 0xffffffff, 0x00090008,
530 0x9174, 0xffffffff, 0x00020001,
531 0x9178, 0xffffffff, 0x00040003,
532 0x917c, 0xffffffff, 0x00000007,
533 0x9180, 0xffffffff, 0x00060005,
534 0x9184, 0xffffffff, 0x00090008,
535 0x9188, 0xffffffff, 0x00030002,
536 0x918c, 0xffffffff, 0x00050004,
537 0x9190, 0xffffffff, 0x00000008,
538 0x9194, 0xffffffff, 0x00070006,
539 0x9198, 0xffffffff, 0x000a0009,
540 0x919c, 0xffffffff, 0x00040003,
541 0x91a0, 0xffffffff, 0x00060005,
542 0x91a4, 0xffffffff, 0x00000009,
543 0x91a8, 0xffffffff, 0x00080007,
544 0x91ac, 0xffffffff, 0x000b000a,
545 0x91b0, 0xffffffff, 0x00050004,
546 0x91b4, 0xffffffff, 0x00070006,
547 0x91b8, 0xffffffff, 0x0008000b,
548 0x91bc, 0xffffffff, 0x000a0009,
549 0x91c0, 0xffffffff, 0x000d000c,
550 0x9200, 0xffffffff, 0x00090008,
551 0x9204, 0xffffffff, 0x000b000a,
552 0x9208, 0xffffffff, 0x000c000f,
553 0x920c, 0xffffffff, 0x000e000d,
554 0x9210, 0xffffffff, 0x00110010,
555 0x9214, 0xffffffff, 0x000a0009,
556 0x9218, 0xffffffff, 0x000c000b,
557 0x921c, 0xffffffff, 0x0000000f,
558 0x9220, 0xffffffff, 0x000e000d,
559 0x9224, 0xffffffff, 0x00110010,
560 0x9228, 0xffffffff, 0x000b000a,
561 0x922c, 0xffffffff, 0x000d000c,
562 0x9230, 0xffffffff, 0x00000010,
563 0x9234, 0xffffffff, 0x000f000e,
564 0x9238, 0xffffffff, 0x00120011,
565 0x923c, 0xffffffff, 0x000c000b,
566 0x9240, 0xffffffff, 0x000e000d,
567 0x9244, 0xffffffff, 0x00000011,
568 0x9248, 0xffffffff, 0x0010000f,
569 0x924c, 0xffffffff, 0x00130012,
570 0x9250, 0xffffffff, 0x000d000c,
571 0x9254, 0xffffffff, 0x000f000e,
572 0x9258, 0xffffffff, 0x00100013,
573 0x925c, 0xffffffff, 0x00120011,
574 0x9260, 0xffffffff, 0x00150014,
575 0x9150, 0xffffffff, 0x96940200,
576 0x8708, 0xffffffff, 0x00900100,
577 0xc478, 0xffffffff, 0x00000080,
578 0xc404, 0xffffffff, 0x0020003f,
579 0x30, 0xffffffff, 0x0000001c,
580 0x34, 0x000f0000, 0x000f0000,
581 0x160c, 0xffffffff, 0x00000100,
582 0x1024, 0xffffffff, 0x00000100,
583 0x102c, 0x00000101, 0x00000000,
584 0x20a8, 0xffffffff, 0x00000104,
585 0x264c, 0x000c0000, 0x000c0000,
586 0x2648, 0x000c0000, 0x000c0000,
587 0x55e4, 0xff000fff, 0x00000100,
588 0x55e8, 0x00000001, 0x00000001,
589 0x2f50, 0x00000001, 0x00000001,
590 0x30cc, 0xc0000fff, 0x00000104,
591 0xc1e4, 0x00000001, 0x00000001,
592 0xd0c0, 0xfffffff0, 0x00000100,
593 0xd8c0, 0xfffffff0, 0x00000100
596 static const u32 oland_mgcg_cgcg_init[] =
598 0xc400, 0xffffffff, 0xfffffffc,
599 0x802c, 0xffffffff, 0xe0000000,
600 0x9a60, 0xffffffff, 0x00000100,
601 0x92a4, 0xffffffff, 0x00000100,
602 0xc164, 0xffffffff, 0x00000100,
603 0x9774, 0xffffffff, 0x00000100,
604 0x8984, 0xffffffff, 0x06000100,
605 0x8a18, 0xffffffff, 0x00000100,
606 0x92a0, 0xffffffff, 0x00000100,
607 0xc380, 0xffffffff, 0x00000100,
608 0x8b28, 0xffffffff, 0x00000100,
609 0x9144, 0xffffffff, 0x00000100,
610 0x8d88, 0xffffffff, 0x00000100,
611 0x8d8c, 0xffffffff, 0x00000100,
612 0x9030, 0xffffffff, 0x00000100,
613 0x9034, 0xffffffff, 0x00000100,
614 0x9038, 0xffffffff, 0x00000100,
615 0x903c, 0xffffffff, 0x00000100,
616 0xad80, 0xffffffff, 0x00000100,
617 0xac54, 0xffffffff, 0x00000100,
618 0x897c, 0xffffffff, 0x06000100,
619 0x9868, 0xffffffff, 0x00000100,
620 0x9510, 0xffffffff, 0x00000100,
621 0xaf04, 0xffffffff, 0x00000100,
622 0xae04, 0xffffffff, 0x00000100,
623 0x949c, 0xffffffff, 0x00000100,
624 0x802c, 0xffffffff, 0xe0000000,
625 0x9160, 0xffffffff, 0x00010000,
626 0x9164, 0xffffffff, 0x00030002,
627 0x9168, 0xffffffff, 0x00040007,
628 0x916c, 0xffffffff, 0x00060005,
629 0x9170, 0xffffffff, 0x00090008,
630 0x9174, 0xffffffff, 0x00020001,
631 0x9178, 0xffffffff, 0x00040003,
632 0x917c, 0xffffffff, 0x00000007,
633 0x9180, 0xffffffff, 0x00060005,
634 0x9184, 0xffffffff, 0x00090008,
635 0x9188, 0xffffffff, 0x00030002,
636 0x918c, 0xffffffff, 0x00050004,
637 0x9190, 0xffffffff, 0x00000008,
638 0x9194, 0xffffffff, 0x00070006,
639 0x9198, 0xffffffff, 0x000a0009,
640 0x919c, 0xffffffff, 0x00040003,
641 0x91a0, 0xffffffff, 0x00060005,
642 0x91a4, 0xffffffff, 0x00000009,
643 0x91a8, 0xffffffff, 0x00080007,
644 0x91ac, 0xffffffff, 0x000b000a,
645 0x91b0, 0xffffffff, 0x00050004,
646 0x91b4, 0xffffffff, 0x00070006,
647 0x91b8, 0xffffffff, 0x0008000b,
648 0x91bc, 0xffffffff, 0x000a0009,
649 0x91c0, 0xffffffff, 0x000d000c,
650 0x91c4, 0xffffffff, 0x00060005,
651 0x91c8, 0xffffffff, 0x00080007,
652 0x91cc, 0xffffffff, 0x0000000b,
653 0x91d0, 0xffffffff, 0x000a0009,
654 0x91d4, 0xffffffff, 0x000d000c,
655 0x9150, 0xffffffff, 0x96940200,
656 0x8708, 0xffffffff, 0x00900100,
657 0xc478, 0xffffffff, 0x00000080,
658 0xc404, 0xffffffff, 0x0020003f,
659 0x30, 0xffffffff, 0x0000001c,
660 0x34, 0x000f0000, 0x000f0000,
661 0x160c, 0xffffffff, 0x00000100,
662 0x1024, 0xffffffff, 0x00000100,
663 0x102c, 0x00000101, 0x00000000,
664 0x20a8, 0xffffffff, 0x00000104,
665 0x264c, 0x000c0000, 0x000c0000,
666 0x2648, 0x000c0000, 0x000c0000,
667 0x55e4, 0xff000fff, 0x00000100,
668 0x55e8, 0x00000001, 0x00000001,
669 0x2f50, 0x00000001, 0x00000001,
670 0x30cc, 0xc0000fff, 0x00000104,
671 0xc1e4, 0x00000001, 0x00000001,
672 0xd0c0, 0xfffffff0, 0x00000100,
673 0xd8c0, 0xfffffff0, 0x00000100
676 static u32 verde_pg_init[] =
678 0x353c, 0xffffffff, 0x40000,
679 0x3538, 0xffffffff, 0x200010ff,
680 0x353c, 0xffffffff, 0x0,
681 0x353c, 0xffffffff, 0x0,
682 0x353c, 0xffffffff, 0x0,
683 0x353c, 0xffffffff, 0x0,
684 0x353c, 0xffffffff, 0x0,
685 0x353c, 0xffffffff, 0x7007,
686 0x3538, 0xffffffff, 0x300010ff,
687 0x353c, 0xffffffff, 0x0,
688 0x353c, 0xffffffff, 0x0,
689 0x353c, 0xffffffff, 0x0,
690 0x353c, 0xffffffff, 0x0,
691 0x353c, 0xffffffff, 0x0,
692 0x353c, 0xffffffff, 0x400000,
693 0x3538, 0xffffffff, 0x100010ff,
694 0x353c, 0xffffffff, 0x0,
695 0x353c, 0xffffffff, 0x0,
696 0x353c, 0xffffffff, 0x0,
697 0x353c, 0xffffffff, 0x0,
698 0x353c, 0xffffffff, 0x0,
699 0x353c, 0xffffffff, 0x120200,
700 0x3538, 0xffffffff, 0x500010ff,
701 0x353c, 0xffffffff, 0x0,
702 0x353c, 0xffffffff, 0x0,
703 0x353c, 0xffffffff, 0x0,
704 0x353c, 0xffffffff, 0x0,
705 0x353c, 0xffffffff, 0x0,
706 0x353c, 0xffffffff, 0x1e1e16,
707 0x3538, 0xffffffff, 0x600010ff,
708 0x353c, 0xffffffff, 0x0,
709 0x353c, 0xffffffff, 0x0,
710 0x353c, 0xffffffff, 0x0,
711 0x353c, 0xffffffff, 0x0,
712 0x353c, 0xffffffff, 0x0,
713 0x353c, 0xffffffff, 0x171f1e,
714 0x3538, 0xffffffff, 0x700010ff,
715 0x353c, 0xffffffff, 0x0,
716 0x353c, 0xffffffff, 0x0,
717 0x353c, 0xffffffff, 0x0,
718 0x353c, 0xffffffff, 0x0,
719 0x353c, 0xffffffff, 0x0,
720 0x353c, 0xffffffff, 0x0,
721 0x3538, 0xffffffff, 0x9ff,
722 0x3500, 0xffffffff, 0x0,
723 0x3504, 0xffffffff, 0x10000800,
724 0x3504, 0xffffffff, 0xf,
725 0x3504, 0xffffffff, 0xf,
726 0x3500, 0xffffffff, 0x4,
727 0x3504, 0xffffffff, 0x1000051e,
728 0x3504, 0xffffffff, 0xffff,
729 0x3504, 0xffffffff, 0xffff,
730 0x3500, 0xffffffff, 0x8,
731 0x3504, 0xffffffff, 0x80500,
732 0x3500, 0xffffffff, 0x12,
733 0x3504, 0xffffffff, 0x9050c,
734 0x3500, 0xffffffff, 0x1d,
735 0x3504, 0xffffffff, 0xb052c,
736 0x3500, 0xffffffff, 0x2a,
737 0x3504, 0xffffffff, 0x1053e,
738 0x3500, 0xffffffff, 0x2d,
739 0x3504, 0xffffffff, 0x10546,
740 0x3500, 0xffffffff, 0x30,
741 0x3504, 0xffffffff, 0xa054e,
742 0x3500, 0xffffffff, 0x3c,
743 0x3504, 0xffffffff, 0x1055f,
744 0x3500, 0xffffffff, 0x3f,
745 0x3504, 0xffffffff, 0x10567,
746 0x3500, 0xffffffff, 0x42,
747 0x3504, 0xffffffff, 0x1056f,
748 0x3500, 0xffffffff, 0x45,
749 0x3504, 0xffffffff, 0x10572,
750 0x3500, 0xffffffff, 0x48,
751 0x3504, 0xffffffff, 0x20575,
752 0x3500, 0xffffffff, 0x4c,
753 0x3504, 0xffffffff, 0x190801,
754 0x3500, 0xffffffff, 0x67,
755 0x3504, 0xffffffff, 0x1082a,
756 0x3500, 0xffffffff, 0x6a,
757 0x3504, 0xffffffff, 0x1b082d,
758 0x3500, 0xffffffff, 0x87,
759 0x3504, 0xffffffff, 0x310851,
760 0x3500, 0xffffffff, 0xba,
761 0x3504, 0xffffffff, 0x891,
762 0x3500, 0xffffffff, 0xbc,
763 0x3504, 0xffffffff, 0x893,
764 0x3500, 0xffffffff, 0xbe,
765 0x3504, 0xffffffff, 0x20895,
766 0x3500, 0xffffffff, 0xc2,
767 0x3504, 0xffffffff, 0x20899,
768 0x3500, 0xffffffff, 0xc6,
769 0x3504, 0xffffffff, 0x2089d,
770 0x3500, 0xffffffff, 0xca,
771 0x3504, 0xffffffff, 0x8a1,
772 0x3500, 0xffffffff, 0xcc,
773 0x3504, 0xffffffff, 0x8a3,
774 0x3500, 0xffffffff, 0xce,
775 0x3504, 0xffffffff, 0x308a5,
776 0x3500, 0xffffffff, 0xd3,
777 0x3504, 0xffffffff, 0x6d08cd,
778 0x3500, 0xffffffff, 0x142,
779 0x3504, 0xffffffff, 0x2000095a,
780 0x3504, 0xffffffff, 0x1,
781 0x3500, 0xffffffff, 0x144,
782 0x3504, 0xffffffff, 0x301f095b,
783 0x3500, 0xffffffff, 0x165,
784 0x3504, 0xffffffff, 0xc094d,
785 0x3500, 0xffffffff, 0x173,
786 0x3504, 0xffffffff, 0xf096d,
787 0x3500, 0xffffffff, 0x184,
788 0x3504, 0xffffffff, 0x15097f,
789 0x3500, 0xffffffff, 0x19b,
790 0x3504, 0xffffffff, 0xc0998,
791 0x3500, 0xffffffff, 0x1a9,
792 0x3504, 0xffffffff, 0x409a7,
793 0x3500, 0xffffffff, 0x1af,
794 0x3504, 0xffffffff, 0xcdc,
795 0x3500, 0xffffffff, 0x1b1,
796 0x3504, 0xffffffff, 0x800,
797 0x3508, 0xffffffff, 0x6c9b2000,
798 0x3510, 0xfc00, 0x2000,
799 0x3544, 0xffffffff, 0xfc0,
800 0x28d4, 0x00000100, 0x100
803 static void si_init_golden_registers(struct radeon_device *rdev)
805 switch (rdev->family) {
807 radeon_program_register_sequence(rdev,
808 tahiti_golden_registers,
809 (const u32)ARRAY_SIZE(tahiti_golden_registers));
810 radeon_program_register_sequence(rdev,
811 tahiti_golden_rlc_registers,
812 (const u32)ARRAY_SIZE(tahiti_golden_rlc_registers));
813 radeon_program_register_sequence(rdev,
814 tahiti_mgcg_cgcg_init,
815 (const u32)ARRAY_SIZE(tahiti_mgcg_cgcg_init));
816 radeon_program_register_sequence(rdev,
817 tahiti_golden_registers2,
818 (const u32)ARRAY_SIZE(tahiti_golden_registers2));
821 radeon_program_register_sequence(rdev,
822 pitcairn_golden_registers,
823 (const u32)ARRAY_SIZE(pitcairn_golden_registers));
824 radeon_program_register_sequence(rdev,
825 pitcairn_golden_rlc_registers,
826 (const u32)ARRAY_SIZE(pitcairn_golden_rlc_registers));
827 radeon_program_register_sequence(rdev,
828 pitcairn_mgcg_cgcg_init,
829 (const u32)ARRAY_SIZE(pitcairn_mgcg_cgcg_init));
832 radeon_program_register_sequence(rdev,
833 verde_golden_registers,
834 (const u32)ARRAY_SIZE(verde_golden_registers));
835 radeon_program_register_sequence(rdev,
836 verde_golden_rlc_registers,
837 (const u32)ARRAY_SIZE(verde_golden_rlc_registers));
838 radeon_program_register_sequence(rdev,
839 verde_mgcg_cgcg_init,
840 (const u32)ARRAY_SIZE(verde_mgcg_cgcg_init));
841 radeon_program_register_sequence(rdev,
843 (const u32)ARRAY_SIZE(verde_pg_init));
846 radeon_program_register_sequence(rdev,
847 oland_golden_registers,
848 (const u32)ARRAY_SIZE(oland_golden_registers));
849 radeon_program_register_sequence(rdev,
850 oland_golden_rlc_registers,
851 (const u32)ARRAY_SIZE(oland_golden_rlc_registers));
852 radeon_program_register_sequence(rdev,
853 oland_mgcg_cgcg_init,
854 (const u32)ARRAY_SIZE(oland_mgcg_cgcg_init));
861 #define PCIE_BUS_CLK 10000
862 #define TCLK (PCIE_BUS_CLK / 10)
865 * si_get_xclk - get the xclk
867 * @rdev: radeon_device pointer
869 * Returns the reference clock used by the gfx engine
872 u32 si_get_xclk(struct radeon_device *rdev)
874 u32 reference_clock = rdev->clock.spll.reference_freq;
877 tmp = RREG32(CG_CLKPIN_CNTL_2);
878 if (tmp & MUX_TCLK_TO_XCLK)
881 tmp = RREG32(CG_CLKPIN_CNTL);
882 if (tmp & XTALIN_DIVIDE)
883 return reference_clock / 4;
885 return reference_clock;
888 /* get temperature in millidegrees */
889 int si_get_temp(struct radeon_device *rdev)
894 temp = (RREG32(CG_MULT_THERMAL_STATUS) & CTF_TEMP_MASK) >>
900 actual_temp = temp & 0x1ff;
902 actual_temp = (actual_temp * 1000);
907 #define TAHITI_IO_MC_REGS_SIZE 36
909 static const u32 tahiti_io_mc_regs[TAHITI_IO_MC_REGS_SIZE][2] = {
910 {0x0000006f, 0x03044000},
911 {0x00000070, 0x0480c018},
912 {0x00000071, 0x00000040},
913 {0x00000072, 0x01000000},
914 {0x00000074, 0x000000ff},
915 {0x00000075, 0x00143400},
916 {0x00000076, 0x08ec0800},
917 {0x00000077, 0x040000cc},
918 {0x00000079, 0x00000000},
919 {0x0000007a, 0x21000409},
920 {0x0000007c, 0x00000000},
921 {0x0000007d, 0xe8000000},
922 {0x0000007e, 0x044408a8},
923 {0x0000007f, 0x00000003},
924 {0x00000080, 0x00000000},
925 {0x00000081, 0x01000000},
926 {0x00000082, 0x02000000},
927 {0x00000083, 0x00000000},
928 {0x00000084, 0xe3f3e4f4},
929 {0x00000085, 0x00052024},
930 {0x00000087, 0x00000000},
931 {0x00000088, 0x66036603},
932 {0x00000089, 0x01000000},
933 {0x0000008b, 0x1c0a0000},
934 {0x0000008c, 0xff010000},
935 {0x0000008e, 0xffffefff},
936 {0x0000008f, 0xfff3efff},
937 {0x00000090, 0xfff3efbf},
938 {0x00000094, 0x00101101},
939 {0x00000095, 0x00000fff},
940 {0x00000096, 0x00116fff},
941 {0x00000097, 0x60010000},
942 {0x00000098, 0x10010000},
943 {0x00000099, 0x00006000},
944 {0x0000009a, 0x00001000},
945 {0x0000009f, 0x00a77400}
948 static const u32 pitcairn_io_mc_regs[TAHITI_IO_MC_REGS_SIZE][2] = {
949 {0x0000006f, 0x03044000},
950 {0x00000070, 0x0480c018},
951 {0x00000071, 0x00000040},
952 {0x00000072, 0x01000000},
953 {0x00000074, 0x000000ff},
954 {0x00000075, 0x00143400},
955 {0x00000076, 0x08ec0800},
956 {0x00000077, 0x040000cc},
957 {0x00000079, 0x00000000},
958 {0x0000007a, 0x21000409},
959 {0x0000007c, 0x00000000},
960 {0x0000007d, 0xe8000000},
961 {0x0000007e, 0x044408a8},
962 {0x0000007f, 0x00000003},
963 {0x00000080, 0x00000000},
964 {0x00000081, 0x01000000},
965 {0x00000082, 0x02000000},
966 {0x00000083, 0x00000000},
967 {0x00000084, 0xe3f3e4f4},
968 {0x00000085, 0x00052024},
969 {0x00000087, 0x00000000},
970 {0x00000088, 0x66036603},
971 {0x00000089, 0x01000000},
972 {0x0000008b, 0x1c0a0000},
973 {0x0000008c, 0xff010000},
974 {0x0000008e, 0xffffefff},
975 {0x0000008f, 0xfff3efff},
976 {0x00000090, 0xfff3efbf},
977 {0x00000094, 0x00101101},
978 {0x00000095, 0x00000fff},
979 {0x00000096, 0x00116fff},
980 {0x00000097, 0x60010000},
981 {0x00000098, 0x10010000},
982 {0x00000099, 0x00006000},
983 {0x0000009a, 0x00001000},
984 {0x0000009f, 0x00a47400}
987 static const u32 verde_io_mc_regs[TAHITI_IO_MC_REGS_SIZE][2] = {
988 {0x0000006f, 0x03044000},
989 {0x00000070, 0x0480c018},
990 {0x00000071, 0x00000040},
991 {0x00000072, 0x01000000},
992 {0x00000074, 0x000000ff},
993 {0x00000075, 0x00143400},
994 {0x00000076, 0x08ec0800},
995 {0x00000077, 0x040000cc},
996 {0x00000079, 0x00000000},
997 {0x0000007a, 0x21000409},
998 {0x0000007c, 0x00000000},
999 {0x0000007d, 0xe8000000},
1000 {0x0000007e, 0x044408a8},
1001 {0x0000007f, 0x00000003},
1002 {0x00000080, 0x00000000},
1003 {0x00000081, 0x01000000},
1004 {0x00000082, 0x02000000},
1005 {0x00000083, 0x00000000},
1006 {0x00000084, 0xe3f3e4f4},
1007 {0x00000085, 0x00052024},
1008 {0x00000087, 0x00000000},
1009 {0x00000088, 0x66036603},
1010 {0x00000089, 0x01000000},
1011 {0x0000008b, 0x1c0a0000},
1012 {0x0000008c, 0xff010000},
1013 {0x0000008e, 0xffffefff},
1014 {0x0000008f, 0xfff3efff},
1015 {0x00000090, 0xfff3efbf},
1016 {0x00000094, 0x00101101},
1017 {0x00000095, 0x00000fff},
1018 {0x00000096, 0x00116fff},
1019 {0x00000097, 0x60010000},
1020 {0x00000098, 0x10010000},
1021 {0x00000099, 0x00006000},
1022 {0x0000009a, 0x00001000},
1023 {0x0000009f, 0x00a37400}
1026 static const u32 oland_io_mc_regs[TAHITI_IO_MC_REGS_SIZE][2] = {
1027 {0x0000006f, 0x03044000},
1028 {0x00000070, 0x0480c018},
1029 {0x00000071, 0x00000040},
1030 {0x00000072, 0x01000000},
1031 {0x00000074, 0x000000ff},
1032 {0x00000075, 0x00143400},
1033 {0x00000076, 0x08ec0800},
1034 {0x00000077, 0x040000cc},
1035 {0x00000079, 0x00000000},
1036 {0x0000007a, 0x21000409},
1037 {0x0000007c, 0x00000000},
1038 {0x0000007d, 0xe8000000},
1039 {0x0000007e, 0x044408a8},
1040 {0x0000007f, 0x00000003},
1041 {0x00000080, 0x00000000},
1042 {0x00000081, 0x01000000},
1043 {0x00000082, 0x02000000},
1044 {0x00000083, 0x00000000},
1045 {0x00000084, 0xe3f3e4f4},
1046 {0x00000085, 0x00052024},
1047 {0x00000087, 0x00000000},
1048 {0x00000088, 0x66036603},
1049 {0x00000089, 0x01000000},
1050 {0x0000008b, 0x1c0a0000},
1051 {0x0000008c, 0xff010000},
1052 {0x0000008e, 0xffffefff},
1053 {0x0000008f, 0xfff3efff},
1054 {0x00000090, 0xfff3efbf},
1055 {0x00000094, 0x00101101},
1056 {0x00000095, 0x00000fff},
1057 {0x00000096, 0x00116fff},
1058 {0x00000097, 0x60010000},
1059 {0x00000098, 0x10010000},
1060 {0x00000099, 0x00006000},
1061 {0x0000009a, 0x00001000},
1062 {0x0000009f, 0x00a17730}
1066 static int si_mc_load_microcode(struct radeon_device *rdev)
1068 const __be32 *fw_data;
1069 u32 running, blackout = 0;
1071 int i, ucode_size, regs_size;
1076 switch (rdev->family) {
1078 io_mc_regs = (u32 *)&tahiti_io_mc_regs;
1079 ucode_size = SI_MC_UCODE_SIZE;
1080 regs_size = TAHITI_IO_MC_REGS_SIZE;
1083 io_mc_regs = (u32 *)&pitcairn_io_mc_regs;
1084 ucode_size = SI_MC_UCODE_SIZE;
1085 regs_size = TAHITI_IO_MC_REGS_SIZE;
1089 io_mc_regs = (u32 *)&verde_io_mc_regs;
1090 ucode_size = SI_MC_UCODE_SIZE;
1091 regs_size = TAHITI_IO_MC_REGS_SIZE;
1094 io_mc_regs = (u32 *)&oland_io_mc_regs;
1095 ucode_size = OLAND_MC_UCODE_SIZE;
1096 regs_size = TAHITI_IO_MC_REGS_SIZE;
1100 running = RREG32(MC_SEQ_SUP_CNTL) & RUN_MASK;
1104 blackout = RREG32(MC_SHARED_BLACKOUT_CNTL);
1105 WREG32(MC_SHARED_BLACKOUT_CNTL, blackout | 1);
1108 /* reset the engine and set to writable */
1109 WREG32(MC_SEQ_SUP_CNTL, 0x00000008);
1110 WREG32(MC_SEQ_SUP_CNTL, 0x00000010);
1112 /* load mc io regs */
1113 for (i = 0; i < regs_size; i++) {
1114 WREG32(MC_SEQ_IO_DEBUG_INDEX, io_mc_regs[(i << 1)]);
1115 WREG32(MC_SEQ_IO_DEBUG_DATA, io_mc_regs[(i << 1) + 1]);
1117 /* load the MC ucode */
1118 fw_data = (const __be32 *)rdev->mc_fw->data;
1119 for (i = 0; i < ucode_size; i++)
1120 WREG32(MC_SEQ_SUP_PGM, be32_to_cpup(fw_data++));
1122 /* put the engine back into the active state */
1123 WREG32(MC_SEQ_SUP_CNTL, 0x00000008);
1124 WREG32(MC_SEQ_SUP_CNTL, 0x00000004);
1125 WREG32(MC_SEQ_SUP_CNTL, 0x00000001);
1127 /* wait for training to complete */
1128 for (i = 0; i < rdev->usec_timeout; i++) {
1129 if (RREG32(MC_SEQ_TRAIN_WAKEUP_CNTL) & TRAIN_DONE_D0)
1133 for (i = 0; i < rdev->usec_timeout; i++) {
1134 if (RREG32(MC_SEQ_TRAIN_WAKEUP_CNTL) & TRAIN_DONE_D1)
1140 WREG32(MC_SHARED_BLACKOUT_CNTL, blackout);
1146 static int si_init_microcode(struct radeon_device *rdev)
1148 struct platform_device *pdev;
1149 const char *chip_name;
1150 const char *rlc_chip_name;
1151 size_t pfp_req_size, me_req_size, ce_req_size, rlc_req_size, mc_req_size;
1157 pdev = platform_device_register_simple("radeon_cp", 0, NULL, 0);
1160 printk(KERN_ERR "radeon_cp: Failed to register firmware\n");
1164 switch (rdev->family) {
1166 chip_name = "TAHITI";
1167 rlc_chip_name = "TAHITI";
1168 pfp_req_size = SI_PFP_UCODE_SIZE * 4;
1169 me_req_size = SI_PM4_UCODE_SIZE * 4;
1170 ce_req_size = SI_CE_UCODE_SIZE * 4;
1171 rlc_req_size = SI_RLC_UCODE_SIZE * 4;
1172 mc_req_size = SI_MC_UCODE_SIZE * 4;
1175 chip_name = "PITCAIRN";
1176 rlc_chip_name = "PITCAIRN";
1177 pfp_req_size = SI_PFP_UCODE_SIZE * 4;
1178 me_req_size = SI_PM4_UCODE_SIZE * 4;
1179 ce_req_size = SI_CE_UCODE_SIZE * 4;
1180 rlc_req_size = SI_RLC_UCODE_SIZE * 4;
1181 mc_req_size = SI_MC_UCODE_SIZE * 4;
1184 chip_name = "VERDE";
1185 rlc_chip_name = "VERDE";
1186 pfp_req_size = SI_PFP_UCODE_SIZE * 4;
1187 me_req_size = SI_PM4_UCODE_SIZE * 4;
1188 ce_req_size = SI_CE_UCODE_SIZE * 4;
1189 rlc_req_size = SI_RLC_UCODE_SIZE * 4;
1190 mc_req_size = SI_MC_UCODE_SIZE * 4;
1193 chip_name = "OLAND";
1194 rlc_chip_name = "OLAND";
1195 pfp_req_size = SI_PFP_UCODE_SIZE * 4;
1196 me_req_size = SI_PM4_UCODE_SIZE * 4;
1197 ce_req_size = SI_CE_UCODE_SIZE * 4;
1198 rlc_req_size = SI_RLC_UCODE_SIZE * 4;
1199 mc_req_size = OLAND_MC_UCODE_SIZE * 4;
1204 DRM_INFO("Loading %s Microcode\n", chip_name);
1206 snprintf(fw_name, sizeof(fw_name), "radeon/%s_pfp.bin", chip_name);
1207 err = request_firmware(&rdev->pfp_fw, fw_name, &pdev->dev);
1210 if (rdev->pfp_fw->size != pfp_req_size) {
1212 "si_cp: Bogus length %zu in firmware \"%s\"\n",
1213 rdev->pfp_fw->size, fw_name);
1218 snprintf(fw_name, sizeof(fw_name), "radeon/%s_me.bin", chip_name);
1219 err = request_firmware(&rdev->me_fw, fw_name, &pdev->dev);
1222 if (rdev->me_fw->size != me_req_size) {
1224 "si_cp: Bogus length %zu in firmware \"%s\"\n",
1225 rdev->me_fw->size, fw_name);
1229 snprintf(fw_name, sizeof(fw_name), "radeon/%s_ce.bin", chip_name);
1230 err = request_firmware(&rdev->ce_fw, fw_name, &pdev->dev);
1233 if (rdev->ce_fw->size != ce_req_size) {
1235 "si_cp: Bogus length %zu in firmware \"%s\"\n",
1236 rdev->ce_fw->size, fw_name);
1240 snprintf(fw_name, sizeof(fw_name), "radeon/%s_rlc.bin", rlc_chip_name);
1241 err = request_firmware(&rdev->rlc_fw, fw_name, &pdev->dev);
1244 if (rdev->rlc_fw->size != rlc_req_size) {
1246 "si_rlc: Bogus length %zu in firmware \"%s\"\n",
1247 rdev->rlc_fw->size, fw_name);
1251 snprintf(fw_name, sizeof(fw_name), "radeon/%s_mc.bin", chip_name);
1252 err = request_firmware(&rdev->mc_fw, fw_name, &pdev->dev);
1255 if (rdev->mc_fw->size != mc_req_size) {
1257 "si_mc: Bogus length %zu in firmware \"%s\"\n",
1258 rdev->mc_fw->size, fw_name);
1263 platform_device_unregister(pdev);
1268 "si_cp: Failed to load firmware \"%s\"\n",
1270 release_firmware(rdev->pfp_fw);
1271 rdev->pfp_fw = NULL;
1272 release_firmware(rdev->me_fw);
1274 release_firmware(rdev->ce_fw);
1276 release_firmware(rdev->rlc_fw);
1277 rdev->rlc_fw = NULL;
1278 release_firmware(rdev->mc_fw);
1284 /* watermark setup */
1285 static u32 dce6_line_buffer_adjust(struct radeon_device *rdev,
1286 struct radeon_crtc *radeon_crtc,
1287 struct drm_display_mode *mode,
1288 struct drm_display_mode *other_mode)
1293 * There are 3 line buffers, each one shared by 2 display controllers.
1294 * DC_LB_MEMORY_SPLIT controls how that line buffer is shared between
1295 * the display controllers. The paritioning is done via one of four
1296 * preset allocations specified in bits 21:20:
1298 * 2 - whole lb, other crtc must be disabled
1300 /* this can get tricky if we have two large displays on a paired group
1301 * of crtcs. Ideally for multiple large displays we'd assign them to
1302 * non-linked crtcs for maximum line buffer allocation.
1304 if (radeon_crtc->base.enabled && mode) {
1308 tmp = 2; /* whole */
1312 WREG32(DC_LB_MEMORY_SPLIT + radeon_crtc->crtc_offset,
1313 DC_LB_MEMORY_CONFIG(tmp));
1315 if (radeon_crtc->base.enabled && mode) {
1325 /* controller not enabled, so no lb used */
1329 static u32 si_get_number_of_dram_channels(struct radeon_device *rdev)
1331 u32 tmp = RREG32(MC_SHARED_CHMAP);
1333 switch ((tmp & NOOFCHAN_MASK) >> NOOFCHAN_SHIFT) {
1356 struct dce6_wm_params {
1357 u32 dram_channels; /* number of dram channels */
1358 u32 yclk; /* bandwidth per dram data pin in kHz */
1359 u32 sclk; /* engine clock in kHz */
1360 u32 disp_clk; /* display clock in kHz */
1361 u32 src_width; /* viewport width */
1362 u32 active_time; /* active display time in ns */
1363 u32 blank_time; /* blank time in ns */
1364 bool interlaced; /* mode is interlaced */
1365 fixed20_12 vsc; /* vertical scale ratio */
1366 u32 num_heads; /* number of active crtcs */
1367 u32 bytes_per_pixel; /* bytes per pixel display + overlay */
1368 u32 lb_size; /* line buffer allocated to pipe */
1369 u32 vtaps; /* vertical scaler taps */
1372 static u32 dce6_dram_bandwidth(struct dce6_wm_params *wm)
1374 /* Calculate raw DRAM Bandwidth */
1375 fixed20_12 dram_efficiency; /* 0.7 */
1376 fixed20_12 yclk, dram_channels, bandwidth;
1379 a.full = dfixed_const(1000);
1380 yclk.full = dfixed_const(wm->yclk);
1381 yclk.full = dfixed_div(yclk, a);
1382 dram_channels.full = dfixed_const(wm->dram_channels * 4);
1383 a.full = dfixed_const(10);
1384 dram_efficiency.full = dfixed_const(7);
1385 dram_efficiency.full = dfixed_div(dram_efficiency, a);
1386 bandwidth.full = dfixed_mul(dram_channels, yclk);
1387 bandwidth.full = dfixed_mul(bandwidth, dram_efficiency);
1389 return dfixed_trunc(bandwidth);
1392 static u32 dce6_dram_bandwidth_for_display(struct dce6_wm_params *wm)
1394 /* Calculate DRAM Bandwidth and the part allocated to display. */
1395 fixed20_12 disp_dram_allocation; /* 0.3 to 0.7 */
1396 fixed20_12 yclk, dram_channels, bandwidth;
1399 a.full = dfixed_const(1000);
1400 yclk.full = dfixed_const(wm->yclk);
1401 yclk.full = dfixed_div(yclk, a);
1402 dram_channels.full = dfixed_const(wm->dram_channels * 4);
1403 a.full = dfixed_const(10);
1404 disp_dram_allocation.full = dfixed_const(3); /* XXX worse case value 0.3 */
1405 disp_dram_allocation.full = dfixed_div(disp_dram_allocation, a);
1406 bandwidth.full = dfixed_mul(dram_channels, yclk);
1407 bandwidth.full = dfixed_mul(bandwidth, disp_dram_allocation);
1409 return dfixed_trunc(bandwidth);
1412 static u32 dce6_data_return_bandwidth(struct dce6_wm_params *wm)
1414 /* Calculate the display Data return Bandwidth */
1415 fixed20_12 return_efficiency; /* 0.8 */
1416 fixed20_12 sclk, bandwidth;
1419 a.full = dfixed_const(1000);
1420 sclk.full = dfixed_const(wm->sclk);
1421 sclk.full = dfixed_div(sclk, a);
1422 a.full = dfixed_const(10);
1423 return_efficiency.full = dfixed_const(8);
1424 return_efficiency.full = dfixed_div(return_efficiency, a);
1425 a.full = dfixed_const(32);
1426 bandwidth.full = dfixed_mul(a, sclk);
1427 bandwidth.full = dfixed_mul(bandwidth, return_efficiency);
1429 return dfixed_trunc(bandwidth);
1432 static u32 dce6_get_dmif_bytes_per_request(struct dce6_wm_params *wm)
1437 static u32 dce6_dmif_request_bandwidth(struct dce6_wm_params *wm)
1439 /* Calculate the DMIF Request Bandwidth */
1440 fixed20_12 disp_clk_request_efficiency; /* 0.8 */
1441 fixed20_12 disp_clk, sclk, bandwidth;
1442 fixed20_12 a, b1, b2;
1445 a.full = dfixed_const(1000);
1446 disp_clk.full = dfixed_const(wm->disp_clk);
1447 disp_clk.full = dfixed_div(disp_clk, a);
1448 a.full = dfixed_const(dce6_get_dmif_bytes_per_request(wm) / 2);
1449 b1.full = dfixed_mul(a, disp_clk);
1451 a.full = dfixed_const(1000);
1452 sclk.full = dfixed_const(wm->sclk);
1453 sclk.full = dfixed_div(sclk, a);
1454 a.full = dfixed_const(dce6_get_dmif_bytes_per_request(wm));
1455 b2.full = dfixed_mul(a, sclk);
1457 a.full = dfixed_const(10);
1458 disp_clk_request_efficiency.full = dfixed_const(8);
1459 disp_clk_request_efficiency.full = dfixed_div(disp_clk_request_efficiency, a);
1461 min_bandwidth = min(dfixed_trunc(b1), dfixed_trunc(b2));
1463 a.full = dfixed_const(min_bandwidth);
1464 bandwidth.full = dfixed_mul(a, disp_clk_request_efficiency);
1466 return dfixed_trunc(bandwidth);
1469 static u32 dce6_available_bandwidth(struct dce6_wm_params *wm)
1471 /* Calculate the Available bandwidth. Display can use this temporarily but not in average. */
1472 u32 dram_bandwidth = dce6_dram_bandwidth(wm);
1473 u32 data_return_bandwidth = dce6_data_return_bandwidth(wm);
1474 u32 dmif_req_bandwidth = dce6_dmif_request_bandwidth(wm);
1476 return min(dram_bandwidth, min(data_return_bandwidth, dmif_req_bandwidth));
1479 static u32 dce6_average_bandwidth(struct dce6_wm_params *wm)
1481 /* Calculate the display mode Average Bandwidth
1482 * DisplayMode should contain the source and destination dimensions,
1486 fixed20_12 line_time;
1487 fixed20_12 src_width;
1488 fixed20_12 bandwidth;
1491 a.full = dfixed_const(1000);
1492 line_time.full = dfixed_const(wm->active_time + wm->blank_time);
1493 line_time.full = dfixed_div(line_time, a);
1494 bpp.full = dfixed_const(wm->bytes_per_pixel);
1495 src_width.full = dfixed_const(wm->src_width);
1496 bandwidth.full = dfixed_mul(src_width, bpp);
1497 bandwidth.full = dfixed_mul(bandwidth, wm->vsc);
1498 bandwidth.full = dfixed_div(bandwidth, line_time);
1500 return dfixed_trunc(bandwidth);
1503 static u32 dce6_latency_watermark(struct dce6_wm_params *wm)
1505 /* First calcualte the latency in ns */
1506 u32 mc_latency = 2000; /* 2000 ns. */
1507 u32 available_bandwidth = dce6_available_bandwidth(wm);
1508 u32 worst_chunk_return_time = (512 * 8 * 1000) / available_bandwidth;
1509 u32 cursor_line_pair_return_time = (128 * 4 * 1000) / available_bandwidth;
1510 u32 dc_latency = 40000000 / wm->disp_clk; /* dc pipe latency */
1511 u32 other_heads_data_return_time = ((wm->num_heads + 1) * worst_chunk_return_time) +
1512 (wm->num_heads * cursor_line_pair_return_time);
1513 u32 latency = mc_latency + other_heads_data_return_time + dc_latency;
1514 u32 max_src_lines_per_dst_line, lb_fill_bw, line_fill_time;
1515 u32 tmp, dmif_size = 12288;
1518 if (wm->num_heads == 0)
1521 a.full = dfixed_const(2);
1522 b.full = dfixed_const(1);
1523 if ((wm->vsc.full > a.full) ||
1524 ((wm->vsc.full > b.full) && (wm->vtaps >= 3)) ||
1526 ((wm->vsc.full >= a.full) && wm->interlaced))
1527 max_src_lines_per_dst_line = 4;
1529 max_src_lines_per_dst_line = 2;
1531 a.full = dfixed_const(available_bandwidth);
1532 b.full = dfixed_const(wm->num_heads);
1533 a.full = dfixed_div(a, b);
1535 b.full = dfixed_const(mc_latency + 512);
1536 c.full = dfixed_const(wm->disp_clk);
1537 b.full = dfixed_div(b, c);
1539 c.full = dfixed_const(dmif_size);
1540 b.full = dfixed_div(c, b);
1542 tmp = min(dfixed_trunc(a), dfixed_trunc(b));
1544 b.full = dfixed_const(1000);
1545 c.full = dfixed_const(wm->disp_clk);
1546 b.full = dfixed_div(c, b);
1547 c.full = dfixed_const(wm->bytes_per_pixel);
1548 b.full = dfixed_mul(b, c);
1550 lb_fill_bw = min(tmp, dfixed_trunc(b));
1552 a.full = dfixed_const(max_src_lines_per_dst_line * wm->src_width * wm->bytes_per_pixel);
1553 b.full = dfixed_const(1000);
1554 c.full = dfixed_const(lb_fill_bw);
1555 b.full = dfixed_div(c, b);
1556 a.full = dfixed_div(a, b);
1557 line_fill_time = dfixed_trunc(a);
1559 if (line_fill_time < wm->active_time)
1562 return latency + (line_fill_time - wm->active_time);
1566 static bool dce6_average_bandwidth_vs_dram_bandwidth_for_display(struct dce6_wm_params *wm)
1568 if (dce6_average_bandwidth(wm) <=
1569 (dce6_dram_bandwidth_for_display(wm) / wm->num_heads))
1575 static bool dce6_average_bandwidth_vs_available_bandwidth(struct dce6_wm_params *wm)
1577 if (dce6_average_bandwidth(wm) <=
1578 (dce6_available_bandwidth(wm) / wm->num_heads))
1584 static bool dce6_check_latency_hiding(struct dce6_wm_params *wm)
1586 u32 lb_partitions = wm->lb_size / wm->src_width;
1587 u32 line_time = wm->active_time + wm->blank_time;
1588 u32 latency_tolerant_lines;
1592 a.full = dfixed_const(1);
1593 if (wm->vsc.full > a.full)
1594 latency_tolerant_lines = 1;
1596 if (lb_partitions <= (wm->vtaps + 1))
1597 latency_tolerant_lines = 1;
1599 latency_tolerant_lines = 2;
1602 latency_hiding = (latency_tolerant_lines * line_time + wm->blank_time);
1604 if (dce6_latency_watermark(wm) <= latency_hiding)
1610 static void dce6_program_watermarks(struct radeon_device *rdev,
1611 struct radeon_crtc *radeon_crtc,
1612 u32 lb_size, u32 num_heads)
1614 struct drm_display_mode *mode = &radeon_crtc->base.mode;
1615 struct dce6_wm_params wm;
1618 u32 latency_watermark_a = 0, latency_watermark_b = 0;
1619 u32 priority_a_mark = 0, priority_b_mark = 0;
1620 u32 priority_a_cnt = PRIORITY_OFF;
1621 u32 priority_b_cnt = PRIORITY_OFF;
1622 u32 tmp, arb_control3;
1625 if (radeon_crtc->base.enabled && num_heads && mode) {
1626 pixel_period = 1000000 / (u32)mode->clock;
1627 line_time = min((u32)mode->crtc_htotal * pixel_period, (u32)65535);
1631 wm.yclk = rdev->pm.current_mclk * 10;
1632 wm.sclk = rdev->pm.current_sclk * 10;
1633 wm.disp_clk = mode->clock;
1634 wm.src_width = mode->crtc_hdisplay;
1635 wm.active_time = mode->crtc_hdisplay * pixel_period;
1636 wm.blank_time = line_time - wm.active_time;
1637 wm.interlaced = false;
1638 if (mode->flags & DRM_MODE_FLAG_INTERLACE)
1639 wm.interlaced = true;
1640 wm.vsc = radeon_crtc->vsc;
1642 if (radeon_crtc->rmx_type != RMX_OFF)
1644 wm.bytes_per_pixel = 4; /* XXX: get this from fb config */
1645 wm.lb_size = lb_size;
1646 if (rdev->family == CHIP_ARUBA)
1647 wm.dram_channels = evergreen_get_number_of_dram_channels(rdev);
1649 wm.dram_channels = si_get_number_of_dram_channels(rdev);
1650 wm.num_heads = num_heads;
1652 /* set for high clocks */
1653 latency_watermark_a = min(dce6_latency_watermark(&wm), (u32)65535);
1654 /* set for low clocks */
1655 /* wm.yclk = low clk; wm.sclk = low clk */
1656 latency_watermark_b = min(dce6_latency_watermark(&wm), (u32)65535);
1658 /* possibly force display priority to high */
1659 /* should really do this at mode validation time... */
1660 if (!dce6_average_bandwidth_vs_dram_bandwidth_for_display(&wm) ||
1661 !dce6_average_bandwidth_vs_available_bandwidth(&wm) ||
1662 !dce6_check_latency_hiding(&wm) ||
1663 (rdev->disp_priority == 2)) {
1664 DRM_DEBUG_KMS("force priority to high\n");
1665 priority_a_cnt |= PRIORITY_ALWAYS_ON;
1666 priority_b_cnt |= PRIORITY_ALWAYS_ON;
1669 a.full = dfixed_const(1000);
1670 b.full = dfixed_const(mode->clock);
1671 b.full = dfixed_div(b, a);
1672 c.full = dfixed_const(latency_watermark_a);
1673 c.full = dfixed_mul(c, b);
1674 c.full = dfixed_mul(c, radeon_crtc->hsc);
1675 c.full = dfixed_div(c, a);
1676 a.full = dfixed_const(16);
1677 c.full = dfixed_div(c, a);
1678 priority_a_mark = dfixed_trunc(c);
1679 priority_a_cnt |= priority_a_mark & PRIORITY_MARK_MASK;
1681 a.full = dfixed_const(1000);
1682 b.full = dfixed_const(mode->clock);
1683 b.full = dfixed_div(b, a);
1684 c.full = dfixed_const(latency_watermark_b);
1685 c.full = dfixed_mul(c, b);
1686 c.full = dfixed_mul(c, radeon_crtc->hsc);
1687 c.full = dfixed_div(c, a);
1688 a.full = dfixed_const(16);
1689 c.full = dfixed_div(c, a);
1690 priority_b_mark = dfixed_trunc(c);
1691 priority_b_cnt |= priority_b_mark & PRIORITY_MARK_MASK;
1695 arb_control3 = RREG32(DPG_PIPE_ARBITRATION_CONTROL3 + radeon_crtc->crtc_offset);
1697 tmp &= ~LATENCY_WATERMARK_MASK(3);
1698 tmp |= LATENCY_WATERMARK_MASK(1);
1699 WREG32(DPG_PIPE_ARBITRATION_CONTROL3 + radeon_crtc->crtc_offset, tmp);
1700 WREG32(DPG_PIPE_LATENCY_CONTROL + radeon_crtc->crtc_offset,
1701 (LATENCY_LOW_WATERMARK(latency_watermark_a) |
1702 LATENCY_HIGH_WATERMARK(line_time)));
1704 tmp = RREG32(DPG_PIPE_ARBITRATION_CONTROL3 + radeon_crtc->crtc_offset);
1705 tmp &= ~LATENCY_WATERMARK_MASK(3);
1706 tmp |= LATENCY_WATERMARK_MASK(2);
1707 WREG32(DPG_PIPE_ARBITRATION_CONTROL3 + radeon_crtc->crtc_offset, tmp);
1708 WREG32(DPG_PIPE_LATENCY_CONTROL + radeon_crtc->crtc_offset,
1709 (LATENCY_LOW_WATERMARK(latency_watermark_b) |
1710 LATENCY_HIGH_WATERMARK(line_time)));
1711 /* restore original selection */
1712 WREG32(DPG_PIPE_ARBITRATION_CONTROL3 + radeon_crtc->crtc_offset, arb_control3);
1714 /* write the priority marks */
1715 WREG32(PRIORITY_A_CNT + radeon_crtc->crtc_offset, priority_a_cnt);
1716 WREG32(PRIORITY_B_CNT + radeon_crtc->crtc_offset, priority_b_cnt);
1720 void dce6_bandwidth_update(struct radeon_device *rdev)
1722 struct drm_display_mode *mode0 = NULL;
1723 struct drm_display_mode *mode1 = NULL;
1724 u32 num_heads = 0, lb_size;
1727 radeon_update_display_priority(rdev);
1729 for (i = 0; i < rdev->num_crtc; i++) {
1730 if (rdev->mode_info.crtcs[i]->base.enabled)
1733 for (i = 0; i < rdev->num_crtc; i += 2) {
1734 mode0 = &rdev->mode_info.crtcs[i]->base.mode;
1735 mode1 = &rdev->mode_info.crtcs[i+1]->base.mode;
1736 lb_size = dce6_line_buffer_adjust(rdev, rdev->mode_info.crtcs[i], mode0, mode1);
1737 dce6_program_watermarks(rdev, rdev->mode_info.crtcs[i], lb_size, num_heads);
1738 lb_size = dce6_line_buffer_adjust(rdev, rdev->mode_info.crtcs[i+1], mode1, mode0);
1739 dce6_program_watermarks(rdev, rdev->mode_info.crtcs[i+1], lb_size, num_heads);
1746 static void si_tiling_mode_table_init(struct radeon_device *rdev)
1748 const u32 num_tile_mode_states = 32;
1749 u32 reg_offset, gb_tile_moden, split_equal_to_row_size;
1751 switch (rdev->config.si.mem_row_size_in_kb) {
1753 split_equal_to_row_size = ADDR_SURF_TILE_SPLIT_1KB;
1757 split_equal_to_row_size = ADDR_SURF_TILE_SPLIT_2KB;
1760 split_equal_to_row_size = ADDR_SURF_TILE_SPLIT_4KB;
1764 if ((rdev->family == CHIP_TAHITI) ||
1765 (rdev->family == CHIP_PITCAIRN)) {
1766 for (reg_offset = 0; reg_offset < num_tile_mode_states; reg_offset++) {
1767 switch (reg_offset) {
1768 case 0: /* non-AA compressed depth or any compressed stencil */
1769 gb_tile_moden = (ARRAY_MODE(ARRAY_2D_TILED_THIN1) |
1770 MICRO_TILE_MODE(ADDR_SURF_DEPTH_MICRO_TILING) |
1771 PIPE_CONFIG(ADDR_SURF_P8_32x32_8x16) |
1772 TILE_SPLIT(ADDR_SURF_TILE_SPLIT_64B) |
1773 NUM_BANKS(ADDR_SURF_16_BANK) |
1774 BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
1775 BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_4) |
1776 MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_2));
1778 case 1: /* 2xAA/4xAA compressed depth only */
1779 gb_tile_moden = (ARRAY_MODE(ARRAY_2D_TILED_THIN1) |
1780 MICRO_TILE_MODE(ADDR_SURF_DEPTH_MICRO_TILING) |
1781 PIPE_CONFIG(ADDR_SURF_P8_32x32_8x16) |
1782 TILE_SPLIT(ADDR_SURF_TILE_SPLIT_128B) |
1783 NUM_BANKS(ADDR_SURF_16_BANK) |
1784 BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
1785 BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_4) |
1786 MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_2));
1788 case 2: /* 8xAA compressed depth only */
1789 gb_tile_moden = (ARRAY_MODE(ARRAY_2D_TILED_THIN1) |
1790 MICRO_TILE_MODE(ADDR_SURF_DEPTH_MICRO_TILING) |
1791 PIPE_CONFIG(ADDR_SURF_P8_32x32_8x16) |
1792 TILE_SPLIT(ADDR_SURF_TILE_SPLIT_256B) |
1793 NUM_BANKS(ADDR_SURF_16_BANK) |
1794 BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
1795 BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_4) |
1796 MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_2));
1798 case 3: /* 2xAA/4xAA compressed depth with stencil (for depth buffer) */
1799 gb_tile_moden = (ARRAY_MODE(ARRAY_2D_TILED_THIN1) |
1800 MICRO_TILE_MODE(ADDR_SURF_DEPTH_MICRO_TILING) |
1801 PIPE_CONFIG(ADDR_SURF_P8_32x32_8x16) |
1802 TILE_SPLIT(ADDR_SURF_TILE_SPLIT_128B) |
1803 NUM_BANKS(ADDR_SURF_16_BANK) |
1804 BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
1805 BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_4) |
1806 MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_2));
1808 case 4: /* Maps w/ a dimension less than the 2D macro-tile dimensions (for mipmapped depth textures) */
1809 gb_tile_moden = (ARRAY_MODE(ARRAY_1D_TILED_THIN1) |
1810 MICRO_TILE_MODE(ADDR_SURF_DEPTH_MICRO_TILING) |
1811 PIPE_CONFIG(ADDR_SURF_P8_32x32_8x16) |
1812 TILE_SPLIT(ADDR_SURF_TILE_SPLIT_64B) |
1813 NUM_BANKS(ADDR_SURF_16_BANK) |
1814 BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
1815 BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_2) |
1816 MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_2));
1818 case 5: /* Uncompressed 16bpp depth - and stencil buffer allocated with it */
1819 gb_tile_moden = (ARRAY_MODE(ARRAY_2D_TILED_THIN1) |
1820 MICRO_TILE_MODE(ADDR_SURF_DEPTH_MICRO_TILING) |
1821 PIPE_CONFIG(ADDR_SURF_P8_32x32_8x16) |
1822 TILE_SPLIT(split_equal_to_row_size) |
1823 NUM_BANKS(ADDR_SURF_16_BANK) |
1824 BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
1825 BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_2) |
1826 MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_2));
1828 case 6: /* Uncompressed 32bpp depth - and stencil buffer allocated with it */
1829 gb_tile_moden = (ARRAY_MODE(ARRAY_2D_TILED_THIN1) |
1830 MICRO_TILE_MODE(ADDR_SURF_DEPTH_MICRO_TILING) |
1831 PIPE_CONFIG(ADDR_SURF_P8_32x32_8x16) |
1832 TILE_SPLIT(split_equal_to_row_size) |
1833 NUM_BANKS(ADDR_SURF_16_BANK) |
1834 BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
1835 BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_1) |
1836 MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_1));
1838 case 7: /* Uncompressed 8bpp stencil without depth (drivers typically do not use) */
1839 gb_tile_moden = (ARRAY_MODE(ARRAY_2D_TILED_THIN1) |
1840 MICRO_TILE_MODE(ADDR_SURF_DEPTH_MICRO_TILING) |
1841 PIPE_CONFIG(ADDR_SURF_P8_32x32_8x16) |
1842 TILE_SPLIT(split_equal_to_row_size) |
1843 NUM_BANKS(ADDR_SURF_16_BANK) |
1844 BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
1845 BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_4) |
1846 MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_2));
1848 case 8: /* 1D and 1D Array Surfaces */
1849 gb_tile_moden = (ARRAY_MODE(ARRAY_LINEAR_ALIGNED) |
1850 MICRO_TILE_MODE(ADDR_SURF_DISPLAY_MICRO_TILING) |
1851 PIPE_CONFIG(ADDR_SURF_P8_32x32_8x16) |
1852 TILE_SPLIT(ADDR_SURF_TILE_SPLIT_64B) |
1853 NUM_BANKS(ADDR_SURF_16_BANK) |
1854 BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
1855 BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_2) |
1856 MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_2));
1858 case 9: /* Displayable maps. */
1859 gb_tile_moden = (ARRAY_MODE(ARRAY_1D_TILED_THIN1) |
1860 MICRO_TILE_MODE(ADDR_SURF_DISPLAY_MICRO_TILING) |
1861 PIPE_CONFIG(ADDR_SURF_P8_32x32_8x16) |
1862 TILE_SPLIT(ADDR_SURF_TILE_SPLIT_64B) |
1863 NUM_BANKS(ADDR_SURF_16_BANK) |
1864 BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
1865 BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_2) |
1866 MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_2));
1868 case 10: /* Display 8bpp. */
1869 gb_tile_moden = (ARRAY_MODE(ARRAY_2D_TILED_THIN1) |
1870 MICRO_TILE_MODE(ADDR_SURF_DISPLAY_MICRO_TILING) |
1871 PIPE_CONFIG(ADDR_SURF_P8_32x32_8x16) |
1872 TILE_SPLIT(ADDR_SURF_TILE_SPLIT_256B) |
1873 NUM_BANKS(ADDR_SURF_16_BANK) |
1874 BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
1875 BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_4) |
1876 MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_2));
1878 case 11: /* Display 16bpp. */
1879 gb_tile_moden = (ARRAY_MODE(ARRAY_2D_TILED_THIN1) |
1880 MICRO_TILE_MODE(ADDR_SURF_DISPLAY_MICRO_TILING) |
1881 PIPE_CONFIG(ADDR_SURF_P8_32x32_8x16) |
1882 TILE_SPLIT(ADDR_SURF_TILE_SPLIT_256B) |
1883 NUM_BANKS(ADDR_SURF_16_BANK) |
1884 BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
1885 BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_2) |
1886 MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_2));
1888 case 12: /* Display 32bpp. */
1889 gb_tile_moden = (ARRAY_MODE(ARRAY_2D_TILED_THIN1) |
1890 MICRO_TILE_MODE(ADDR_SURF_DISPLAY_MICRO_TILING) |
1891 PIPE_CONFIG(ADDR_SURF_P8_32x32_8x16) |
1892 TILE_SPLIT(ADDR_SURF_TILE_SPLIT_512B) |
1893 NUM_BANKS(ADDR_SURF_16_BANK) |
1894 BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
1895 BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_1) |
1896 MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_1));
1898 case 13: /* Thin. */
1899 gb_tile_moden = (ARRAY_MODE(ARRAY_1D_TILED_THIN1) |
1900 MICRO_TILE_MODE(ADDR_SURF_THIN_MICRO_TILING) |
1901 PIPE_CONFIG(ADDR_SURF_P8_32x32_8x16) |
1902 TILE_SPLIT(ADDR_SURF_TILE_SPLIT_64B) |
1903 NUM_BANKS(ADDR_SURF_16_BANK) |
1904 BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
1905 BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_2) |
1906 MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_2));
1908 case 14: /* Thin 8 bpp. */
1909 gb_tile_moden = (ARRAY_MODE(ARRAY_2D_TILED_THIN1) |
1910 MICRO_TILE_MODE(ADDR_SURF_THIN_MICRO_TILING) |
1911 PIPE_CONFIG(ADDR_SURF_P8_32x32_8x16) |
1912 TILE_SPLIT(ADDR_SURF_TILE_SPLIT_256B) |
1913 NUM_BANKS(ADDR_SURF_16_BANK) |
1914 BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
1915 BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_4) |
1916 MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_1));
1918 case 15: /* Thin 16 bpp. */
1919 gb_tile_moden = (ARRAY_MODE(ARRAY_2D_TILED_THIN1) |
1920 MICRO_TILE_MODE(ADDR_SURF_THIN_MICRO_TILING) |
1921 PIPE_CONFIG(ADDR_SURF_P8_32x32_8x16) |
1922 TILE_SPLIT(ADDR_SURF_TILE_SPLIT_256B) |
1923 NUM_BANKS(ADDR_SURF_16_BANK) |
1924 BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
1925 BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_2) |
1926 MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_1));
1928 case 16: /* Thin 32 bpp. */
1929 gb_tile_moden = (ARRAY_MODE(ARRAY_2D_TILED_THIN1) |
1930 MICRO_TILE_MODE(ADDR_SURF_THIN_MICRO_TILING) |
1931 PIPE_CONFIG(ADDR_SURF_P8_32x32_8x16) |
1932 TILE_SPLIT(ADDR_SURF_TILE_SPLIT_512B) |
1933 NUM_BANKS(ADDR_SURF_16_BANK) |
1934 BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
1935 BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_1) |
1936 MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_1));
1938 case 17: /* Thin 64 bpp. */
1939 gb_tile_moden = (ARRAY_MODE(ARRAY_2D_TILED_THIN1) |
1940 MICRO_TILE_MODE(ADDR_SURF_THIN_MICRO_TILING) |
1941 PIPE_CONFIG(ADDR_SURF_P8_32x32_8x16) |
1942 TILE_SPLIT(split_equal_to_row_size) |
1943 NUM_BANKS(ADDR_SURF_16_BANK) |
1944 BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
1945 BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_1) |
1946 MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_1));
1948 case 21: /* 8 bpp PRT. */
1949 gb_tile_moden = (ARRAY_MODE(ARRAY_2D_TILED_THIN1) |
1950 MICRO_TILE_MODE(ADDR_SURF_THIN_MICRO_TILING) |
1951 PIPE_CONFIG(ADDR_SURF_P8_32x32_8x16) |
1952 TILE_SPLIT(ADDR_SURF_TILE_SPLIT_256B) |
1953 NUM_BANKS(ADDR_SURF_16_BANK) |
1954 BANK_WIDTH(ADDR_SURF_BANK_WIDTH_2) |
1955 BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_4) |
1956 MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_2));
1958 case 22: /* 16 bpp PRT */
1959 gb_tile_moden = (ARRAY_MODE(ARRAY_2D_TILED_THIN1) |
1960 MICRO_TILE_MODE(ADDR_SURF_THIN_MICRO_TILING) |
1961 PIPE_CONFIG(ADDR_SURF_P8_32x32_8x16) |
1962 TILE_SPLIT(ADDR_SURF_TILE_SPLIT_256B) |
1963 NUM_BANKS(ADDR_SURF_16_BANK) |
1964 BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
1965 BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_4) |
1966 MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_4));
1968 case 23: /* 32 bpp PRT */
1969 gb_tile_moden = (ARRAY_MODE(ARRAY_2D_TILED_THIN1) |
1970 MICRO_TILE_MODE(ADDR_SURF_THIN_MICRO_TILING) |
1971 PIPE_CONFIG(ADDR_SURF_P8_32x32_8x16) |
1972 TILE_SPLIT(ADDR_SURF_TILE_SPLIT_256B) |
1973 NUM_BANKS(ADDR_SURF_16_BANK) |
1974 BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
1975 BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_2) |
1976 MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_2));
1978 case 24: /* 64 bpp PRT */
1979 gb_tile_moden = (ARRAY_MODE(ARRAY_2D_TILED_THIN1) |
1980 MICRO_TILE_MODE(ADDR_SURF_THIN_MICRO_TILING) |
1981 PIPE_CONFIG(ADDR_SURF_P8_32x32_8x16) |
1982 TILE_SPLIT(ADDR_SURF_TILE_SPLIT_512B) |
1983 NUM_BANKS(ADDR_SURF_16_BANK) |
1984 BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
1985 BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_1) |
1986 MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_2));
1988 case 25: /* 128 bpp PRT */
1989 gb_tile_moden = (ARRAY_MODE(ARRAY_2D_TILED_THIN1) |
1990 MICRO_TILE_MODE(ADDR_SURF_THIN_MICRO_TILING) |
1991 PIPE_CONFIG(ADDR_SURF_P8_32x32_8x16) |
1992 TILE_SPLIT(ADDR_SURF_TILE_SPLIT_1KB) |
1993 NUM_BANKS(ADDR_SURF_8_BANK) |
1994 BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
1995 BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_1) |
1996 MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_1));
2002 rdev->config.si.tile_mode_array[reg_offset] = gb_tile_moden;
2003 WREG32(GB_TILE_MODE0 + (reg_offset * 4), gb_tile_moden);
2005 } else if ((rdev->family == CHIP_VERDE) ||
2006 (rdev->family == CHIP_OLAND) ||
2007 (rdev->family == CHIP_HAINAN)) {
2008 for (reg_offset = 0; reg_offset < num_tile_mode_states; reg_offset++) {
2009 switch (reg_offset) {
2010 case 0: /* non-AA compressed depth or any compressed stencil */
2011 gb_tile_moden = (ARRAY_MODE(ARRAY_2D_TILED_THIN1) |
2012 MICRO_TILE_MODE(ADDR_SURF_DEPTH_MICRO_TILING) |
2013 PIPE_CONFIG(ADDR_SURF_P4_8x16) |
2014 TILE_SPLIT(ADDR_SURF_TILE_SPLIT_64B) |
2015 NUM_BANKS(ADDR_SURF_16_BANK) |
2016 BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
2017 BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_4) |
2018 MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_4));
2020 case 1: /* 2xAA/4xAA compressed depth only */
2021 gb_tile_moden = (ARRAY_MODE(ARRAY_2D_TILED_THIN1) |
2022 MICRO_TILE_MODE(ADDR_SURF_DEPTH_MICRO_TILING) |
2023 PIPE_CONFIG(ADDR_SURF_P4_8x16) |
2024 TILE_SPLIT(ADDR_SURF_TILE_SPLIT_128B) |
2025 NUM_BANKS(ADDR_SURF_16_BANK) |
2026 BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
2027 BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_4) |
2028 MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_4));
2030 case 2: /* 8xAA compressed depth only */
2031 gb_tile_moden = (ARRAY_MODE(ARRAY_2D_TILED_THIN1) |
2032 MICRO_TILE_MODE(ADDR_SURF_DEPTH_MICRO_TILING) |
2033 PIPE_CONFIG(ADDR_SURF_P4_8x16) |
2034 TILE_SPLIT(ADDR_SURF_TILE_SPLIT_256B) |
2035 NUM_BANKS(ADDR_SURF_16_BANK) |
2036 BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
2037 BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_4) |
2038 MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_4));
2040 case 3: /* 2xAA/4xAA compressed depth with stencil (for depth buffer) */
2041 gb_tile_moden = (ARRAY_MODE(ARRAY_2D_TILED_THIN1) |
2042 MICRO_TILE_MODE(ADDR_SURF_DEPTH_MICRO_TILING) |
2043 PIPE_CONFIG(ADDR_SURF_P4_8x16) |
2044 TILE_SPLIT(ADDR_SURF_TILE_SPLIT_128B) |
2045 NUM_BANKS(ADDR_SURF_16_BANK) |
2046 BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
2047 BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_4) |
2048 MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_4));
2050 case 4: /* Maps w/ a dimension less than the 2D macro-tile dimensions (for mipmapped depth textures) */
2051 gb_tile_moden = (ARRAY_MODE(ARRAY_1D_TILED_THIN1) |
2052 MICRO_TILE_MODE(ADDR_SURF_DEPTH_MICRO_TILING) |
2053 PIPE_CONFIG(ADDR_SURF_P4_8x16) |
2054 TILE_SPLIT(ADDR_SURF_TILE_SPLIT_64B) |
2055 NUM_BANKS(ADDR_SURF_16_BANK) |
2056 BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
2057 BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_2) |
2058 MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_2));
2060 case 5: /* Uncompressed 16bpp depth - and stencil buffer allocated with it */
2061 gb_tile_moden = (ARRAY_MODE(ARRAY_2D_TILED_THIN1) |
2062 MICRO_TILE_MODE(ADDR_SURF_DEPTH_MICRO_TILING) |
2063 PIPE_CONFIG(ADDR_SURF_P4_8x16) |
2064 TILE_SPLIT(split_equal_to_row_size) |
2065 NUM_BANKS(ADDR_SURF_16_BANK) |
2066 BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
2067 BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_2) |
2068 MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_2));
2070 case 6: /* Uncompressed 32bpp depth - and stencil buffer allocated with it */
2071 gb_tile_moden = (ARRAY_MODE(ARRAY_2D_TILED_THIN1) |
2072 MICRO_TILE_MODE(ADDR_SURF_DEPTH_MICRO_TILING) |
2073 PIPE_CONFIG(ADDR_SURF_P4_8x16) |
2074 TILE_SPLIT(split_equal_to_row_size) |
2075 NUM_BANKS(ADDR_SURF_16_BANK) |
2076 BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
2077 BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_1) |
2078 MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_2));
2080 case 7: /* Uncompressed 8bpp stencil without depth (drivers typically do not use) */
2081 gb_tile_moden = (ARRAY_MODE(ARRAY_2D_TILED_THIN1) |
2082 MICRO_TILE_MODE(ADDR_SURF_DEPTH_MICRO_TILING) |
2083 PIPE_CONFIG(ADDR_SURF_P4_8x16) |
2084 TILE_SPLIT(split_equal_to_row_size) |
2085 NUM_BANKS(ADDR_SURF_16_BANK) |
2086 BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
2087 BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_4) |
2088 MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_4));
2090 case 8: /* 1D and 1D Array Surfaces */
2091 gb_tile_moden = (ARRAY_MODE(ARRAY_LINEAR_ALIGNED) |
2092 MICRO_TILE_MODE(ADDR_SURF_DISPLAY_MICRO_TILING) |
2093 PIPE_CONFIG(ADDR_SURF_P4_8x16) |
2094 TILE_SPLIT(ADDR_SURF_TILE_SPLIT_64B) |
2095 NUM_BANKS(ADDR_SURF_16_BANK) |
2096 BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
2097 BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_2) |
2098 MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_2));
2100 case 9: /* Displayable maps. */
2101 gb_tile_moden = (ARRAY_MODE(ARRAY_1D_TILED_THIN1) |
2102 MICRO_TILE_MODE(ADDR_SURF_DISPLAY_MICRO_TILING) |
2103 PIPE_CONFIG(ADDR_SURF_P4_8x16) |
2104 TILE_SPLIT(ADDR_SURF_TILE_SPLIT_64B) |
2105 NUM_BANKS(ADDR_SURF_16_BANK) |
2106 BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
2107 BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_2) |
2108 MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_2));
2110 case 10: /* Display 8bpp. */
2111 gb_tile_moden = (ARRAY_MODE(ARRAY_2D_TILED_THIN1) |
2112 MICRO_TILE_MODE(ADDR_SURF_DISPLAY_MICRO_TILING) |
2113 PIPE_CONFIG(ADDR_SURF_P4_8x16) |
2114 TILE_SPLIT(ADDR_SURF_TILE_SPLIT_256B) |
2115 NUM_BANKS(ADDR_SURF_16_BANK) |
2116 BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
2117 BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_4) |
2118 MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_4));
2120 case 11: /* Display 16bpp. */
2121 gb_tile_moden = (ARRAY_MODE(ARRAY_2D_TILED_THIN1) |
2122 MICRO_TILE_MODE(ADDR_SURF_DISPLAY_MICRO_TILING) |
2123 PIPE_CONFIG(ADDR_SURF_P4_8x16) |
2124 TILE_SPLIT(ADDR_SURF_TILE_SPLIT_256B) |
2125 NUM_BANKS(ADDR_SURF_16_BANK) |
2126 BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
2127 BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_2) |
2128 MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_2));
2130 case 12: /* Display 32bpp. */
2131 gb_tile_moden = (ARRAY_MODE(ARRAY_2D_TILED_THIN1) |
2132 MICRO_TILE_MODE(ADDR_SURF_DISPLAY_MICRO_TILING) |
2133 PIPE_CONFIG(ADDR_SURF_P4_8x16) |
2134 TILE_SPLIT(ADDR_SURF_TILE_SPLIT_512B) |
2135 NUM_BANKS(ADDR_SURF_16_BANK) |
2136 BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
2137 BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_1) |
2138 MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_2));
2140 case 13: /* Thin. */
2141 gb_tile_moden = (ARRAY_MODE(ARRAY_1D_TILED_THIN1) |
2142 MICRO_TILE_MODE(ADDR_SURF_THIN_MICRO_TILING) |
2143 PIPE_CONFIG(ADDR_SURF_P4_8x16) |
2144 TILE_SPLIT(ADDR_SURF_TILE_SPLIT_64B) |
2145 NUM_BANKS(ADDR_SURF_16_BANK) |
2146 BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
2147 BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_2) |
2148 MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_2));
2150 case 14: /* Thin 8 bpp. */
2151 gb_tile_moden = (ARRAY_MODE(ARRAY_2D_TILED_THIN1) |
2152 MICRO_TILE_MODE(ADDR_SURF_THIN_MICRO_TILING) |
2153 PIPE_CONFIG(ADDR_SURF_P4_8x16) |
2154 TILE_SPLIT(ADDR_SURF_TILE_SPLIT_256B) |
2155 NUM_BANKS(ADDR_SURF_16_BANK) |
2156 BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
2157 BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_4) |
2158 MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_2));
2160 case 15: /* Thin 16 bpp. */
2161 gb_tile_moden = (ARRAY_MODE(ARRAY_2D_TILED_THIN1) |
2162 MICRO_TILE_MODE(ADDR_SURF_THIN_MICRO_TILING) |
2163 PIPE_CONFIG(ADDR_SURF_P4_8x16) |
2164 TILE_SPLIT(ADDR_SURF_TILE_SPLIT_256B) |
2165 NUM_BANKS(ADDR_SURF_16_BANK) |
2166 BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
2167 BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_2) |
2168 MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_2));
2170 case 16: /* Thin 32 bpp. */
2171 gb_tile_moden = (ARRAY_MODE(ARRAY_2D_TILED_THIN1) |
2172 MICRO_TILE_MODE(ADDR_SURF_THIN_MICRO_TILING) |
2173 PIPE_CONFIG(ADDR_SURF_P4_8x16) |
2174 TILE_SPLIT(ADDR_SURF_TILE_SPLIT_512B) |
2175 NUM_BANKS(ADDR_SURF_16_BANK) |
2176 BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
2177 BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_1) |
2178 MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_2));
2180 case 17: /* Thin 64 bpp. */
2181 gb_tile_moden = (ARRAY_MODE(ARRAY_2D_TILED_THIN1) |
2182 MICRO_TILE_MODE(ADDR_SURF_THIN_MICRO_TILING) |
2183 PIPE_CONFIG(ADDR_SURF_P4_8x16) |
2184 TILE_SPLIT(split_equal_to_row_size) |
2185 NUM_BANKS(ADDR_SURF_16_BANK) |
2186 BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
2187 BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_1) |
2188 MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_2));
2190 case 21: /* 8 bpp PRT. */
2191 gb_tile_moden = (ARRAY_MODE(ARRAY_2D_TILED_THIN1) |
2192 MICRO_TILE_MODE(ADDR_SURF_THIN_MICRO_TILING) |
2193 PIPE_CONFIG(ADDR_SURF_P8_32x32_8x16) |
2194 TILE_SPLIT(ADDR_SURF_TILE_SPLIT_256B) |
2195 NUM_BANKS(ADDR_SURF_16_BANK) |
2196 BANK_WIDTH(ADDR_SURF_BANK_WIDTH_2) |
2197 BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_4) |
2198 MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_2));
2200 case 22: /* 16 bpp PRT */
2201 gb_tile_moden = (ARRAY_MODE(ARRAY_2D_TILED_THIN1) |
2202 MICRO_TILE_MODE(ADDR_SURF_THIN_MICRO_TILING) |
2203 PIPE_CONFIG(ADDR_SURF_P8_32x32_8x16) |
2204 TILE_SPLIT(ADDR_SURF_TILE_SPLIT_256B) |
2205 NUM_BANKS(ADDR_SURF_16_BANK) |
2206 BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
2207 BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_4) |
2208 MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_4));
2210 case 23: /* 32 bpp PRT */
2211 gb_tile_moden = (ARRAY_MODE(ARRAY_2D_TILED_THIN1) |
2212 MICRO_TILE_MODE(ADDR_SURF_THIN_MICRO_TILING) |
2213 PIPE_CONFIG(ADDR_SURF_P8_32x32_8x16) |
2214 TILE_SPLIT(ADDR_SURF_TILE_SPLIT_256B) |
2215 NUM_BANKS(ADDR_SURF_16_BANK) |
2216 BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
2217 BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_2) |
2218 MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_2));
2220 case 24: /* 64 bpp PRT */
2221 gb_tile_moden = (ARRAY_MODE(ARRAY_2D_TILED_THIN1) |
2222 MICRO_TILE_MODE(ADDR_SURF_THIN_MICRO_TILING) |
2223 PIPE_CONFIG(ADDR_SURF_P8_32x32_8x16) |
2224 TILE_SPLIT(ADDR_SURF_TILE_SPLIT_512B) |
2225 NUM_BANKS(ADDR_SURF_16_BANK) |
2226 BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
2227 BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_1) |
2228 MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_2));
2230 case 25: /* 128 bpp PRT */
2231 gb_tile_moden = (ARRAY_MODE(ARRAY_2D_TILED_THIN1) |
2232 MICRO_TILE_MODE(ADDR_SURF_THIN_MICRO_TILING) |
2233 PIPE_CONFIG(ADDR_SURF_P8_32x32_8x16) |
2234 TILE_SPLIT(ADDR_SURF_TILE_SPLIT_1KB) |
2235 NUM_BANKS(ADDR_SURF_8_BANK) |
2236 BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
2237 BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_1) |
2238 MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_1));
2244 rdev->config.si.tile_mode_array[reg_offset] = gb_tile_moden;
2245 WREG32(GB_TILE_MODE0 + (reg_offset * 4), gb_tile_moden);
2248 DRM_ERROR("unknown asic: 0x%x\n", rdev->family);
2251 static void si_select_se_sh(struct radeon_device *rdev,
2252 u32 se_num, u32 sh_num)
2254 u32 data = INSTANCE_BROADCAST_WRITES;
2256 if ((se_num == 0xffffffff) && (sh_num == 0xffffffff))
2257 data |= SH_BROADCAST_WRITES | SE_BROADCAST_WRITES;
2258 else if (se_num == 0xffffffff)
2259 data |= SE_BROADCAST_WRITES | SH_INDEX(sh_num);
2260 else if (sh_num == 0xffffffff)
2261 data |= SH_BROADCAST_WRITES | SE_INDEX(se_num);
2263 data |= SH_INDEX(sh_num) | SE_INDEX(se_num);
2264 WREG32(GRBM_GFX_INDEX, data);
2267 static u32 si_create_bitmask(u32 bit_width)
2271 for (i = 0; i < bit_width; i++) {
2278 static u32 si_get_cu_enabled(struct radeon_device *rdev, u32 cu_per_sh)
2282 data = RREG32(CC_GC_SHADER_ARRAY_CONFIG);
2284 data &= INACTIVE_CUS_MASK;
2287 data |= RREG32(GC_USER_SHADER_ARRAY_CONFIG);
2289 data >>= INACTIVE_CUS_SHIFT;
2291 mask = si_create_bitmask(cu_per_sh);
2293 return ~data & mask;
2296 static void si_setup_spi(struct radeon_device *rdev,
2297 u32 se_num, u32 sh_per_se,
2301 u32 data, mask, active_cu;
2303 for (i = 0; i < se_num; i++) {
2304 for (j = 0; j < sh_per_se; j++) {
2305 si_select_se_sh(rdev, i, j);
2306 data = RREG32(SPI_STATIC_THREAD_MGMT_3);
2307 active_cu = si_get_cu_enabled(rdev, cu_per_sh);
2310 for (k = 0; k < 16; k++) {
2312 if (active_cu & mask) {
2314 WREG32(SPI_STATIC_THREAD_MGMT_3, data);
2320 si_select_se_sh(rdev, 0xffffffff, 0xffffffff);
2323 static u32 si_get_rb_disabled(struct radeon_device *rdev,
2324 u32 max_rb_num, u32 se_num,
2329 data = RREG32(CC_RB_BACKEND_DISABLE);
2331 data &= BACKEND_DISABLE_MASK;
2334 data |= RREG32(GC_USER_RB_BACKEND_DISABLE);
2336 data >>= BACKEND_DISABLE_SHIFT;
2338 mask = si_create_bitmask(max_rb_num / se_num / sh_per_se);
2343 static void si_setup_rb(struct radeon_device *rdev,
2344 u32 se_num, u32 sh_per_se,
2349 u32 disabled_rbs = 0;
2350 u32 enabled_rbs = 0;
2352 for (i = 0; i < se_num; i++) {
2353 for (j = 0; j < sh_per_se; j++) {
2354 si_select_se_sh(rdev, i, j);
2355 data = si_get_rb_disabled(rdev, max_rb_num, se_num, sh_per_se);
2356 disabled_rbs |= data << ((i * sh_per_se + j) * TAHITI_RB_BITMAP_WIDTH_PER_SH);
2359 si_select_se_sh(rdev, 0xffffffff, 0xffffffff);
2362 for (i = 0; i < max_rb_num; i++) {
2363 if (!(disabled_rbs & mask))
2364 enabled_rbs |= mask;
2368 for (i = 0; i < se_num; i++) {
2369 si_select_se_sh(rdev, i, 0xffffffff);
2371 for (j = 0; j < sh_per_se; j++) {
2372 switch (enabled_rbs & 3) {
2374 data |= (RASTER_CONFIG_RB_MAP_0 << (i * sh_per_se + j) * 2);
2377 data |= (RASTER_CONFIG_RB_MAP_3 << (i * sh_per_se + j) * 2);
2381 data |= (RASTER_CONFIG_RB_MAP_2 << (i * sh_per_se + j) * 2);
2386 WREG32(PA_SC_RASTER_CONFIG, data);
2388 si_select_se_sh(rdev, 0xffffffff, 0xffffffff);
2391 static void si_gpu_init(struct radeon_device *rdev)
2393 u32 gb_addr_config = 0;
2394 u32 mc_shared_chmap, mc_arb_ramcfg;
2396 u32 hdp_host_path_cntl;
2400 switch (rdev->family) {
2402 rdev->config.si.max_shader_engines = 2;
2403 rdev->config.si.max_tile_pipes = 12;
2404 rdev->config.si.max_cu_per_sh = 8;
2405 rdev->config.si.max_sh_per_se = 2;
2406 rdev->config.si.max_backends_per_se = 4;
2407 rdev->config.si.max_texture_channel_caches = 12;
2408 rdev->config.si.max_gprs = 256;
2409 rdev->config.si.max_gs_threads = 32;
2410 rdev->config.si.max_hw_contexts = 8;
2412 rdev->config.si.sc_prim_fifo_size_frontend = 0x20;
2413 rdev->config.si.sc_prim_fifo_size_backend = 0x100;
2414 rdev->config.si.sc_hiz_tile_fifo_size = 0x30;
2415 rdev->config.si.sc_earlyz_tile_fifo_size = 0x130;
2416 gb_addr_config = TAHITI_GB_ADDR_CONFIG_GOLDEN;
2419 rdev->config.si.max_shader_engines = 2;
2420 rdev->config.si.max_tile_pipes = 8;
2421 rdev->config.si.max_cu_per_sh = 5;
2422 rdev->config.si.max_sh_per_se = 2;
2423 rdev->config.si.max_backends_per_se = 4;
2424 rdev->config.si.max_texture_channel_caches = 8;
2425 rdev->config.si.max_gprs = 256;
2426 rdev->config.si.max_gs_threads = 32;
2427 rdev->config.si.max_hw_contexts = 8;
2429 rdev->config.si.sc_prim_fifo_size_frontend = 0x20;
2430 rdev->config.si.sc_prim_fifo_size_backend = 0x100;
2431 rdev->config.si.sc_hiz_tile_fifo_size = 0x30;
2432 rdev->config.si.sc_earlyz_tile_fifo_size = 0x130;
2433 gb_addr_config = TAHITI_GB_ADDR_CONFIG_GOLDEN;
2437 rdev->config.si.max_shader_engines = 1;
2438 rdev->config.si.max_tile_pipes = 4;
2439 rdev->config.si.max_cu_per_sh = 2;
2440 rdev->config.si.max_sh_per_se = 2;
2441 rdev->config.si.max_backends_per_se = 4;
2442 rdev->config.si.max_texture_channel_caches = 4;
2443 rdev->config.si.max_gprs = 256;
2444 rdev->config.si.max_gs_threads = 32;
2445 rdev->config.si.max_hw_contexts = 8;
2447 rdev->config.si.sc_prim_fifo_size_frontend = 0x20;
2448 rdev->config.si.sc_prim_fifo_size_backend = 0x40;
2449 rdev->config.si.sc_hiz_tile_fifo_size = 0x30;
2450 rdev->config.si.sc_earlyz_tile_fifo_size = 0x130;
2451 gb_addr_config = VERDE_GB_ADDR_CONFIG_GOLDEN;
2454 rdev->config.si.max_shader_engines = 1;
2455 rdev->config.si.max_tile_pipes = 4;
2456 rdev->config.si.max_cu_per_sh = 6;
2457 rdev->config.si.max_sh_per_se = 1;
2458 rdev->config.si.max_backends_per_se = 2;
2459 rdev->config.si.max_texture_channel_caches = 4;
2460 rdev->config.si.max_gprs = 256;
2461 rdev->config.si.max_gs_threads = 16;
2462 rdev->config.si.max_hw_contexts = 8;
2464 rdev->config.si.sc_prim_fifo_size_frontend = 0x20;
2465 rdev->config.si.sc_prim_fifo_size_backend = 0x40;
2466 rdev->config.si.sc_hiz_tile_fifo_size = 0x30;
2467 rdev->config.si.sc_earlyz_tile_fifo_size = 0x130;
2468 gb_addr_config = VERDE_GB_ADDR_CONFIG_GOLDEN;
2471 rdev->config.si.max_shader_engines = 1;
2472 rdev->config.si.max_tile_pipes = 4;
2473 rdev->config.si.max_cu_per_sh = 5;
2474 rdev->config.si.max_sh_per_se = 1;
2475 rdev->config.si.max_backends_per_se = 1;
2476 rdev->config.si.max_texture_channel_caches = 2;
2477 rdev->config.si.max_gprs = 256;
2478 rdev->config.si.max_gs_threads = 16;
2479 rdev->config.si.max_hw_contexts = 8;
2481 rdev->config.si.sc_prim_fifo_size_frontend = 0x20;
2482 rdev->config.si.sc_prim_fifo_size_backend = 0x40;
2483 rdev->config.si.sc_hiz_tile_fifo_size = 0x30;
2484 rdev->config.si.sc_earlyz_tile_fifo_size = 0x130;
2485 gb_addr_config = HAINAN_GB_ADDR_CONFIG_GOLDEN;
2489 /* Initialize HDP */
2490 for (i = 0, j = 0; i < 32; i++, j += 0x18) {
2491 WREG32((0x2c14 + j), 0x00000000);
2492 WREG32((0x2c18 + j), 0x00000000);
2493 WREG32((0x2c1c + j), 0x00000000);
2494 WREG32((0x2c20 + j), 0x00000000);
2495 WREG32((0x2c24 + j), 0x00000000);
2498 WREG32(GRBM_CNTL, GRBM_READ_TIMEOUT(0xff));
2500 evergreen_fix_pci_max_read_req_size(rdev);
2502 WREG32(BIF_FB_EN, FB_READ_EN | FB_WRITE_EN);
2504 mc_shared_chmap = RREG32(MC_SHARED_CHMAP);
2505 mc_arb_ramcfg = RREG32(MC_ARB_RAMCFG);
2507 rdev->config.si.num_tile_pipes = rdev->config.si.max_tile_pipes;
2508 rdev->config.si.mem_max_burst_length_bytes = 256;
2509 tmp = (mc_arb_ramcfg & NOOFCOLS_MASK) >> NOOFCOLS_SHIFT;
2510 rdev->config.si.mem_row_size_in_kb = (4 * (1 << (8 + tmp))) / 1024;
2511 if (rdev->config.si.mem_row_size_in_kb > 4)
2512 rdev->config.si.mem_row_size_in_kb = 4;
2513 /* XXX use MC settings? */
2514 rdev->config.si.shader_engine_tile_size = 32;
2515 rdev->config.si.num_gpus = 1;
2516 rdev->config.si.multi_gpu_tile_size = 64;
2518 /* fix up row size */
2519 gb_addr_config &= ~ROW_SIZE_MASK;
2520 switch (rdev->config.si.mem_row_size_in_kb) {
2523 gb_addr_config |= ROW_SIZE(0);
2526 gb_addr_config |= ROW_SIZE(1);
2529 gb_addr_config |= ROW_SIZE(2);
2533 /* setup tiling info dword. gb_addr_config is not adequate since it does
2534 * not have bank info, so create a custom tiling dword.
2535 * bits 3:0 num_pipes
2536 * bits 7:4 num_banks
2537 * bits 11:8 group_size
2538 * bits 15:12 row_size
2540 rdev->config.si.tile_config = 0;
2541 switch (rdev->config.si.num_tile_pipes) {
2543 rdev->config.si.tile_config |= (0 << 0);
2546 rdev->config.si.tile_config |= (1 << 0);
2549 rdev->config.si.tile_config |= (2 << 0);
2553 /* XXX what about 12? */
2554 rdev->config.si.tile_config |= (3 << 0);
2557 switch ((mc_arb_ramcfg & NOOFBANK_MASK) >> NOOFBANK_SHIFT) {
2558 case 0: /* four banks */
2559 rdev->config.si.tile_config |= 0 << 4;
2561 case 1: /* eight banks */
2562 rdev->config.si.tile_config |= 1 << 4;
2564 case 2: /* sixteen banks */
2566 rdev->config.si.tile_config |= 2 << 4;
2569 rdev->config.si.tile_config |=
2570 ((gb_addr_config & PIPE_INTERLEAVE_SIZE_MASK) >> PIPE_INTERLEAVE_SIZE_SHIFT) << 8;
2571 rdev->config.si.tile_config |=
2572 ((gb_addr_config & ROW_SIZE_MASK) >> ROW_SIZE_SHIFT) << 12;
2574 WREG32(GB_ADDR_CONFIG, gb_addr_config);
2575 WREG32(DMIF_ADDR_CONFIG, gb_addr_config);
2576 WREG32(DMIF_ADDR_CALC, gb_addr_config);
2577 WREG32(HDP_ADDR_CONFIG, gb_addr_config);
2578 WREG32(DMA_TILING_CONFIG + DMA0_REGISTER_OFFSET, gb_addr_config);
2579 WREG32(DMA_TILING_CONFIG + DMA1_REGISTER_OFFSET, gb_addr_config);
2580 WREG32(UVD_UDEC_ADDR_CONFIG, gb_addr_config);
2581 WREG32(UVD_UDEC_DB_ADDR_CONFIG, gb_addr_config);
2582 WREG32(UVD_UDEC_DBW_ADDR_CONFIG, gb_addr_config);
2584 si_tiling_mode_table_init(rdev);
2586 si_setup_rb(rdev, rdev->config.si.max_shader_engines,
2587 rdev->config.si.max_sh_per_se,
2588 rdev->config.si.max_backends_per_se);
2590 si_setup_spi(rdev, rdev->config.si.max_shader_engines,
2591 rdev->config.si.max_sh_per_se,
2592 rdev->config.si.max_cu_per_sh);
2595 /* set HW defaults for 3D engine */
2596 WREG32(CP_QUEUE_THRESHOLDS, (ROQ_IB1_START(0x16) |
2597 ROQ_IB2_START(0x2b)));
2598 WREG32(CP_MEQ_THRESHOLDS, MEQ1_START(0x30) | MEQ2_START(0x60));
2600 sx_debug_1 = RREG32(SX_DEBUG_1);
2601 WREG32(SX_DEBUG_1, sx_debug_1);
2603 WREG32(SPI_CONFIG_CNTL_1, VTX_DONE_DELAY(4));
2605 WREG32(PA_SC_FIFO_SIZE, (SC_FRONTEND_PRIM_FIFO_SIZE(rdev->config.si.sc_prim_fifo_size_frontend) |
2606 SC_BACKEND_PRIM_FIFO_SIZE(rdev->config.si.sc_prim_fifo_size_backend) |
2607 SC_HIZ_TILE_FIFO_SIZE(rdev->config.si.sc_hiz_tile_fifo_size) |
2608 SC_EARLYZ_TILE_FIFO_SIZE(rdev->config.si.sc_earlyz_tile_fifo_size)));
2610 WREG32(VGT_NUM_INSTANCES, 1);
2612 WREG32(CP_PERFMON_CNTL, 0);
2614 WREG32(SQ_CONFIG, 0);
2616 WREG32(PA_SC_FORCE_EOV_MAX_CNTS, (FORCE_EOV_MAX_CLK_CNT(4095) |
2617 FORCE_EOV_MAX_REZ_CNT(255)));
2619 WREG32(VGT_CACHE_INVALIDATION, CACHE_INVALIDATION(VC_AND_TC) |
2620 AUTO_INVLD_EN(ES_AND_GS_AUTO));
2622 WREG32(VGT_GS_VERTEX_REUSE, 16);
2623 WREG32(PA_SC_LINE_STIPPLE_STATE, 0);
2625 WREG32(CB_PERFCOUNTER0_SELECT0, 0);
2626 WREG32(CB_PERFCOUNTER0_SELECT1, 0);
2627 WREG32(CB_PERFCOUNTER1_SELECT0, 0);
2628 WREG32(CB_PERFCOUNTER1_SELECT1, 0);
2629 WREG32(CB_PERFCOUNTER2_SELECT0, 0);
2630 WREG32(CB_PERFCOUNTER2_SELECT1, 0);
2631 WREG32(CB_PERFCOUNTER3_SELECT0, 0);
2632 WREG32(CB_PERFCOUNTER3_SELECT1, 0);
2634 tmp = RREG32(HDP_MISC_CNTL);
2635 tmp |= HDP_FLUSH_INVALIDATE_CACHE;
2636 WREG32(HDP_MISC_CNTL, tmp);
2638 hdp_host_path_cntl = RREG32(HDP_HOST_PATH_CNTL);
2639 WREG32(HDP_HOST_PATH_CNTL, hdp_host_path_cntl);
2641 WREG32(PA_CL_ENHANCE, CLIP_VTX_REORDER_ENA | NUM_CLIP_SEQ(3));
2647 * GPU scratch registers helpers function.
2649 static void si_scratch_init(struct radeon_device *rdev)
2653 rdev->scratch.num_reg = 7;
2654 rdev->scratch.reg_base = SCRATCH_REG0;
2655 for (i = 0; i < rdev->scratch.num_reg; i++) {
2656 rdev->scratch.free[i] = true;
2657 rdev->scratch.reg[i] = rdev->scratch.reg_base + (i * 4);
2661 void si_fence_ring_emit(struct radeon_device *rdev,
2662 struct radeon_fence *fence)
2664 struct radeon_ring *ring = &rdev->ring[fence->ring];
2665 u64 addr = rdev->fence_drv[fence->ring].gpu_addr;
2667 /* flush read cache over gart */
2668 radeon_ring_write(ring, PACKET3(PACKET3_SET_CONFIG_REG, 1));
2669 radeon_ring_write(ring, (CP_COHER_CNTL2 - PACKET3_SET_CONFIG_REG_START) >> 2);
2670 radeon_ring_write(ring, 0);
2671 radeon_ring_write(ring, PACKET3(PACKET3_SURFACE_SYNC, 3));
2672 radeon_ring_write(ring, PACKET3_TCL1_ACTION_ENA |
2673 PACKET3_TC_ACTION_ENA |
2674 PACKET3_SH_KCACHE_ACTION_ENA |
2675 PACKET3_SH_ICACHE_ACTION_ENA);
2676 radeon_ring_write(ring, 0xFFFFFFFF);
2677 radeon_ring_write(ring, 0);
2678 radeon_ring_write(ring, 10); /* poll interval */
2679 /* EVENT_WRITE_EOP - flush caches, send int */
2680 radeon_ring_write(ring, PACKET3(PACKET3_EVENT_WRITE_EOP, 4));
2681 radeon_ring_write(ring, EVENT_TYPE(CACHE_FLUSH_AND_INV_TS_EVENT) | EVENT_INDEX(5));
2682 radeon_ring_write(ring, addr & 0xffffffff);
2683 radeon_ring_write(ring, (upper_32_bits(addr) & 0xff) | DATA_SEL(1) | INT_SEL(2));
2684 radeon_ring_write(ring, fence->seq);
2685 radeon_ring_write(ring, 0);
2691 void si_ring_ib_execute(struct radeon_device *rdev, struct radeon_ib *ib)
2693 struct radeon_ring *ring = &rdev->ring[ib->ring];
2696 if (ib->is_const_ib) {
2697 /* set switch buffer packet before const IB */
2698 radeon_ring_write(ring, PACKET3(PACKET3_SWITCH_BUFFER, 0));
2699 radeon_ring_write(ring, 0);
2701 header = PACKET3(PACKET3_INDIRECT_BUFFER_CONST, 2);
2704 if (ring->rptr_save_reg) {
2705 next_rptr = ring->wptr + 3 + 4 + 8;
2706 radeon_ring_write(ring, PACKET3(PACKET3_SET_CONFIG_REG, 1));
2707 radeon_ring_write(ring, ((ring->rptr_save_reg -
2708 PACKET3_SET_CONFIG_REG_START) >> 2));
2709 radeon_ring_write(ring, next_rptr);
2710 } else if (rdev->wb.enabled) {
2711 next_rptr = ring->wptr + 5 + 4 + 8;
2712 radeon_ring_write(ring, PACKET3(PACKET3_WRITE_DATA, 3));
2713 radeon_ring_write(ring, (1 << 8));
2714 radeon_ring_write(ring, ring->next_rptr_gpu_addr & 0xfffffffc);
2715 radeon_ring_write(ring, upper_32_bits(ring->next_rptr_gpu_addr) & 0xffffffff);
2716 radeon_ring_write(ring, next_rptr);
2719 header = PACKET3(PACKET3_INDIRECT_BUFFER, 2);
2722 radeon_ring_write(ring, header);
2723 radeon_ring_write(ring,
2727 (ib->gpu_addr & 0xFFFFFFFC));
2728 radeon_ring_write(ring, upper_32_bits(ib->gpu_addr) & 0xFFFF);
2729 radeon_ring_write(ring, ib->length_dw |
2730 (ib->vm ? (ib->vm->id << 24) : 0));
2732 if (!ib->is_const_ib) {
2733 /* flush read cache over gart for this vmid */
2734 radeon_ring_write(ring, PACKET3(PACKET3_SET_CONFIG_REG, 1));
2735 radeon_ring_write(ring, (CP_COHER_CNTL2 - PACKET3_SET_CONFIG_REG_START) >> 2);
2736 radeon_ring_write(ring, ib->vm ? ib->vm->id : 0);
2737 radeon_ring_write(ring, PACKET3(PACKET3_SURFACE_SYNC, 3));
2738 radeon_ring_write(ring, PACKET3_TCL1_ACTION_ENA |
2739 PACKET3_TC_ACTION_ENA |
2740 PACKET3_SH_KCACHE_ACTION_ENA |
2741 PACKET3_SH_ICACHE_ACTION_ENA);
2742 radeon_ring_write(ring, 0xFFFFFFFF);
2743 radeon_ring_write(ring, 0);
2744 radeon_ring_write(ring, 10); /* poll interval */
2751 static void si_cp_enable(struct radeon_device *rdev, bool enable)
2754 WREG32(CP_ME_CNTL, 0);
2756 radeon_ttm_set_active_vram_size(rdev, rdev->mc.visible_vram_size);
2757 WREG32(CP_ME_CNTL, (CP_ME_HALT | CP_PFP_HALT | CP_CE_HALT));
2758 WREG32(SCRATCH_UMSK, 0);
2759 rdev->ring[RADEON_RING_TYPE_GFX_INDEX].ready = false;
2760 rdev->ring[CAYMAN_RING_TYPE_CP1_INDEX].ready = false;
2761 rdev->ring[CAYMAN_RING_TYPE_CP2_INDEX].ready = false;
2766 static int si_cp_load_microcode(struct radeon_device *rdev)
2768 const __be32 *fw_data;
2771 if (!rdev->me_fw || !rdev->pfp_fw)
2774 si_cp_enable(rdev, false);
2777 fw_data = (const __be32 *)rdev->pfp_fw->data;
2778 WREG32(CP_PFP_UCODE_ADDR, 0);
2779 for (i = 0; i < SI_PFP_UCODE_SIZE; i++)
2780 WREG32(CP_PFP_UCODE_DATA, be32_to_cpup(fw_data++));
2781 WREG32(CP_PFP_UCODE_ADDR, 0);
2784 fw_data = (const __be32 *)rdev->ce_fw->data;
2785 WREG32(CP_CE_UCODE_ADDR, 0);
2786 for (i = 0; i < SI_CE_UCODE_SIZE; i++)
2787 WREG32(CP_CE_UCODE_DATA, be32_to_cpup(fw_data++));
2788 WREG32(CP_CE_UCODE_ADDR, 0);
2791 fw_data = (const __be32 *)rdev->me_fw->data;
2792 WREG32(CP_ME_RAM_WADDR, 0);
2793 for (i = 0; i < SI_PM4_UCODE_SIZE; i++)
2794 WREG32(CP_ME_RAM_DATA, be32_to_cpup(fw_data++));
2795 WREG32(CP_ME_RAM_WADDR, 0);
2797 WREG32(CP_PFP_UCODE_ADDR, 0);
2798 WREG32(CP_CE_UCODE_ADDR, 0);
2799 WREG32(CP_ME_RAM_WADDR, 0);
2800 WREG32(CP_ME_RAM_RADDR, 0);
2804 static int si_cp_start(struct radeon_device *rdev)
2806 struct radeon_ring *ring = &rdev->ring[RADEON_RING_TYPE_GFX_INDEX];
2809 r = radeon_ring_lock(rdev, ring, 7 + 4);
2811 DRM_ERROR("radeon: cp failed to lock ring (%d).\n", r);
2815 radeon_ring_write(ring, PACKET3(PACKET3_ME_INITIALIZE, 5));
2816 radeon_ring_write(ring, 0x1);
2817 radeon_ring_write(ring, 0x0);
2818 radeon_ring_write(ring, rdev->config.si.max_hw_contexts - 1);
2819 radeon_ring_write(ring, PACKET3_ME_INITIALIZE_DEVICE_ID(1));
2820 radeon_ring_write(ring, 0);
2821 radeon_ring_write(ring, 0);
2823 /* init the CE partitions */
2824 radeon_ring_write(ring, PACKET3(PACKET3_SET_BASE, 2));
2825 radeon_ring_write(ring, PACKET3_BASE_INDEX(CE_PARTITION_BASE));
2826 radeon_ring_write(ring, 0xc000);
2827 radeon_ring_write(ring, 0xe000);
2828 radeon_ring_unlock_commit(rdev, ring);
2830 si_cp_enable(rdev, true);
2832 r = radeon_ring_lock(rdev, ring, si_default_size + 10);
2834 DRM_ERROR("radeon: cp failed to lock ring (%d).\n", r);
2838 /* setup clear context state */
2839 radeon_ring_write(ring, PACKET3(PACKET3_PREAMBLE_CNTL, 0));
2840 radeon_ring_write(ring, PACKET3_PREAMBLE_BEGIN_CLEAR_STATE);
2842 for (i = 0; i < si_default_size; i++)
2843 radeon_ring_write(ring, si_default_state[i]);
2845 radeon_ring_write(ring, PACKET3(PACKET3_PREAMBLE_CNTL, 0));
2846 radeon_ring_write(ring, PACKET3_PREAMBLE_END_CLEAR_STATE);
2848 /* set clear context state */
2849 radeon_ring_write(ring, PACKET3(PACKET3_CLEAR_STATE, 0));
2850 radeon_ring_write(ring, 0);
2852 radeon_ring_write(ring, PACKET3(PACKET3_SET_CONTEXT_REG, 2));
2853 radeon_ring_write(ring, 0x00000316);
2854 radeon_ring_write(ring, 0x0000000e); /* VGT_VERTEX_REUSE_BLOCK_CNTL */
2855 radeon_ring_write(ring, 0x00000010); /* VGT_OUT_DEALLOC_CNTL */
2857 radeon_ring_unlock_commit(rdev, ring);
2859 for (i = RADEON_RING_TYPE_GFX_INDEX; i <= CAYMAN_RING_TYPE_CP2_INDEX; ++i) {
2860 ring = &rdev->ring[i];
2861 r = radeon_ring_lock(rdev, ring, 2);
2863 /* clear the compute context state */
2864 radeon_ring_write(ring, PACKET3_COMPUTE(PACKET3_CLEAR_STATE, 0));
2865 radeon_ring_write(ring, 0);
2867 radeon_ring_unlock_commit(rdev, ring);
2873 static void si_cp_fini(struct radeon_device *rdev)
2875 struct radeon_ring *ring;
2876 si_cp_enable(rdev, false);
2878 ring = &rdev->ring[RADEON_RING_TYPE_GFX_INDEX];
2879 radeon_ring_fini(rdev, ring);
2880 radeon_scratch_free(rdev, ring->rptr_save_reg);
2882 ring = &rdev->ring[CAYMAN_RING_TYPE_CP1_INDEX];
2883 radeon_ring_fini(rdev, ring);
2884 radeon_scratch_free(rdev, ring->rptr_save_reg);
2886 ring = &rdev->ring[CAYMAN_RING_TYPE_CP2_INDEX];
2887 radeon_ring_fini(rdev, ring);
2888 radeon_scratch_free(rdev, ring->rptr_save_reg);
2891 static int si_cp_resume(struct radeon_device *rdev)
2893 struct radeon_ring *ring;
2898 /* Reset cp; if cp is reset, then PA, SH, VGT also need to be reset */
2899 WREG32(GRBM_SOFT_RESET, (SOFT_RESET_CP |
2904 RREG32(GRBM_SOFT_RESET);
2906 WREG32(GRBM_SOFT_RESET, 0);
2907 RREG32(GRBM_SOFT_RESET);
2909 WREG32(CP_SEM_WAIT_TIMER, 0x0);
2910 WREG32(CP_SEM_INCOMPLETE_TIMER_CNTL, 0x0);
2912 /* Set the write pointer delay */
2913 WREG32(CP_RB_WPTR_DELAY, 0);
2915 WREG32(CP_DEBUG, 0);
2916 WREG32(SCRATCH_ADDR, ((rdev->wb.gpu_addr + RADEON_WB_SCRATCH_OFFSET) >> 8) & 0xFFFFFFFF);
2918 /* ring 0 - compute and gfx */
2919 /* Set ring buffer size */
2920 ring = &rdev->ring[RADEON_RING_TYPE_GFX_INDEX];
2921 rb_bufsz = drm_order(ring->ring_size / 8);
2922 tmp = (drm_order(RADEON_GPU_PAGE_SIZE/8) << 8) | rb_bufsz;
2924 tmp |= BUF_SWAP_32BIT;
2926 WREG32(CP_RB0_CNTL, tmp);
2928 /* Initialize the ring buffer's read and write pointers */
2929 WREG32(CP_RB0_CNTL, tmp | RB_RPTR_WR_ENA);
2931 WREG32(CP_RB0_WPTR, ring->wptr);
2933 /* set the wb address whether it's enabled or not */
2934 WREG32(CP_RB0_RPTR_ADDR, (rdev->wb.gpu_addr + RADEON_WB_CP_RPTR_OFFSET) & 0xFFFFFFFC);
2935 WREG32(CP_RB0_RPTR_ADDR_HI, upper_32_bits(rdev->wb.gpu_addr + RADEON_WB_CP_RPTR_OFFSET) & 0xFF);
2937 if (rdev->wb.enabled)
2938 WREG32(SCRATCH_UMSK, 0xff);
2940 tmp |= RB_NO_UPDATE;
2941 WREG32(SCRATCH_UMSK, 0);
2945 WREG32(CP_RB0_CNTL, tmp);
2947 WREG32(CP_RB0_BASE, ring->gpu_addr >> 8);
2949 ring->rptr = RREG32(CP_RB0_RPTR);
2951 /* ring1 - compute only */
2952 /* Set ring buffer size */
2953 ring = &rdev->ring[CAYMAN_RING_TYPE_CP1_INDEX];
2954 rb_bufsz = drm_order(ring->ring_size / 8);
2955 tmp = (drm_order(RADEON_GPU_PAGE_SIZE/8) << 8) | rb_bufsz;
2957 tmp |= BUF_SWAP_32BIT;
2959 WREG32(CP_RB1_CNTL, tmp);
2961 /* Initialize the ring buffer's read and write pointers */
2962 WREG32(CP_RB1_CNTL, tmp | RB_RPTR_WR_ENA);
2964 WREG32(CP_RB1_WPTR, ring->wptr);
2966 /* set the wb address whether it's enabled or not */
2967 WREG32(CP_RB1_RPTR_ADDR, (rdev->wb.gpu_addr + RADEON_WB_CP1_RPTR_OFFSET) & 0xFFFFFFFC);
2968 WREG32(CP_RB1_RPTR_ADDR_HI, upper_32_bits(rdev->wb.gpu_addr + RADEON_WB_CP1_RPTR_OFFSET) & 0xFF);
2971 WREG32(CP_RB1_CNTL, tmp);
2973 WREG32(CP_RB1_BASE, ring->gpu_addr >> 8);
2975 ring->rptr = RREG32(CP_RB1_RPTR);
2977 /* ring2 - compute only */
2978 /* Set ring buffer size */
2979 ring = &rdev->ring[CAYMAN_RING_TYPE_CP2_INDEX];
2980 rb_bufsz = drm_order(ring->ring_size / 8);
2981 tmp = (drm_order(RADEON_GPU_PAGE_SIZE/8) << 8) | rb_bufsz;
2983 tmp |= BUF_SWAP_32BIT;
2985 WREG32(CP_RB2_CNTL, tmp);
2987 /* Initialize the ring buffer's read and write pointers */
2988 WREG32(CP_RB2_CNTL, tmp | RB_RPTR_WR_ENA);
2990 WREG32(CP_RB2_WPTR, ring->wptr);
2992 /* set the wb address whether it's enabled or not */
2993 WREG32(CP_RB2_RPTR_ADDR, (rdev->wb.gpu_addr + RADEON_WB_CP2_RPTR_OFFSET) & 0xFFFFFFFC);
2994 WREG32(CP_RB2_RPTR_ADDR_HI, upper_32_bits(rdev->wb.gpu_addr + RADEON_WB_CP2_RPTR_OFFSET) & 0xFF);
2997 WREG32(CP_RB2_CNTL, tmp);
2999 WREG32(CP_RB2_BASE, ring->gpu_addr >> 8);
3001 ring->rptr = RREG32(CP_RB2_RPTR);
3003 /* start the rings */
3005 rdev->ring[RADEON_RING_TYPE_GFX_INDEX].ready = true;
3006 rdev->ring[CAYMAN_RING_TYPE_CP1_INDEX].ready = true;
3007 rdev->ring[CAYMAN_RING_TYPE_CP2_INDEX].ready = true;
3008 r = radeon_ring_test(rdev, RADEON_RING_TYPE_GFX_INDEX, &rdev->ring[RADEON_RING_TYPE_GFX_INDEX]);
3010 rdev->ring[RADEON_RING_TYPE_GFX_INDEX].ready = false;
3011 rdev->ring[CAYMAN_RING_TYPE_CP1_INDEX].ready = false;
3012 rdev->ring[CAYMAN_RING_TYPE_CP2_INDEX].ready = false;
3015 r = radeon_ring_test(rdev, CAYMAN_RING_TYPE_CP1_INDEX, &rdev->ring[CAYMAN_RING_TYPE_CP1_INDEX]);
3017 rdev->ring[CAYMAN_RING_TYPE_CP1_INDEX].ready = false;
3019 r = radeon_ring_test(rdev, CAYMAN_RING_TYPE_CP2_INDEX, &rdev->ring[CAYMAN_RING_TYPE_CP2_INDEX]);
3021 rdev->ring[CAYMAN_RING_TYPE_CP2_INDEX].ready = false;
3027 static u32 si_gpu_check_soft_reset(struct radeon_device *rdev)
3033 tmp = RREG32(GRBM_STATUS);
3034 if (tmp & (PA_BUSY | SC_BUSY |
3035 BCI_BUSY | SX_BUSY |
3036 TA_BUSY | VGT_BUSY |
3038 GDS_BUSY | SPI_BUSY |
3039 IA_BUSY | IA_BUSY_NO_DMA))
3040 reset_mask |= RADEON_RESET_GFX;
3042 if (tmp & (CF_RQ_PENDING | PF_RQ_PENDING |
3043 CP_BUSY | CP_COHERENCY_BUSY))
3044 reset_mask |= RADEON_RESET_CP;
3046 if (tmp & GRBM_EE_BUSY)
3047 reset_mask |= RADEON_RESET_GRBM | RADEON_RESET_GFX | RADEON_RESET_CP;
3050 tmp = RREG32(GRBM_STATUS2);
3051 if (tmp & (RLC_RQ_PENDING | RLC_BUSY))
3052 reset_mask |= RADEON_RESET_RLC;
3054 /* DMA_STATUS_REG 0 */
3055 tmp = RREG32(DMA_STATUS_REG + DMA0_REGISTER_OFFSET);
3056 if (!(tmp & DMA_IDLE))
3057 reset_mask |= RADEON_RESET_DMA;
3059 /* DMA_STATUS_REG 1 */
3060 tmp = RREG32(DMA_STATUS_REG + DMA1_REGISTER_OFFSET);
3061 if (!(tmp & DMA_IDLE))
3062 reset_mask |= RADEON_RESET_DMA1;
3065 tmp = RREG32(SRBM_STATUS2);
3067 reset_mask |= RADEON_RESET_DMA;
3069 if (tmp & DMA1_BUSY)
3070 reset_mask |= RADEON_RESET_DMA1;
3073 tmp = RREG32(SRBM_STATUS);
3076 reset_mask |= RADEON_RESET_IH;
3079 reset_mask |= RADEON_RESET_SEM;
3081 if (tmp & GRBM_RQ_PENDING)
3082 reset_mask |= RADEON_RESET_GRBM;
3085 reset_mask |= RADEON_RESET_VMC;
3087 if (tmp & (MCB_BUSY | MCB_NON_DISPLAY_BUSY |
3088 MCC_BUSY | MCD_BUSY))
3089 reset_mask |= RADEON_RESET_MC;
3091 if (evergreen_is_display_hung(rdev))
3092 reset_mask |= RADEON_RESET_DISPLAY;
3095 tmp = RREG32(VM_L2_STATUS);
3097 reset_mask |= RADEON_RESET_VMC;
3099 /* Skip MC reset as it's mostly likely not hung, just busy */
3100 if (reset_mask & RADEON_RESET_MC) {
3101 DRM_DEBUG("MC busy: 0x%08X, clearing.\n", reset_mask);
3102 reset_mask &= ~RADEON_RESET_MC;
3108 static void si_gpu_soft_reset(struct radeon_device *rdev, u32 reset_mask)
3110 struct evergreen_mc_save save;
3111 u32 grbm_soft_reset = 0, srbm_soft_reset = 0;
3114 if (reset_mask == 0)
3117 dev_info(rdev->dev, "GPU softreset: 0x%08X\n", reset_mask);
3119 evergreen_print_gpu_status_regs(rdev);
3120 dev_info(rdev->dev, " VM_CONTEXT1_PROTECTION_FAULT_ADDR 0x%08X\n",
3121 RREG32(VM_CONTEXT1_PROTECTION_FAULT_ADDR));
3122 dev_info(rdev->dev, " VM_CONTEXT1_PROTECTION_FAULT_STATUS 0x%08X\n",
3123 RREG32(VM_CONTEXT1_PROTECTION_FAULT_STATUS));
3125 /* Disable CP parsing/prefetching */
3126 WREG32(CP_ME_CNTL, CP_ME_HALT | CP_PFP_HALT | CP_CE_HALT);
3128 if (reset_mask & RADEON_RESET_DMA) {
3130 tmp = RREG32(DMA_RB_CNTL + DMA0_REGISTER_OFFSET);
3131 tmp &= ~DMA_RB_ENABLE;
3132 WREG32(DMA_RB_CNTL + DMA0_REGISTER_OFFSET, tmp);
3134 if (reset_mask & RADEON_RESET_DMA1) {
3136 tmp = RREG32(DMA_RB_CNTL + DMA1_REGISTER_OFFSET);
3137 tmp &= ~DMA_RB_ENABLE;
3138 WREG32(DMA_RB_CNTL + DMA1_REGISTER_OFFSET, tmp);
3143 evergreen_mc_stop(rdev, &save);
3144 if (evergreen_mc_wait_for_idle(rdev)) {
3145 dev_warn(rdev->dev, "Wait for MC idle timedout !\n");
3148 if (reset_mask & (RADEON_RESET_GFX | RADEON_RESET_COMPUTE | RADEON_RESET_CP)) {
3149 grbm_soft_reset = SOFT_RESET_CB |
3163 if (reset_mask & RADEON_RESET_CP) {
3164 grbm_soft_reset |= SOFT_RESET_CP | SOFT_RESET_VGT;
3166 srbm_soft_reset |= SOFT_RESET_GRBM;
3169 if (reset_mask & RADEON_RESET_DMA)
3170 srbm_soft_reset |= SOFT_RESET_DMA;
3172 if (reset_mask & RADEON_RESET_DMA1)
3173 srbm_soft_reset |= SOFT_RESET_DMA1;
3175 if (reset_mask & RADEON_RESET_DISPLAY)
3176 srbm_soft_reset |= SOFT_RESET_DC;
3178 if (reset_mask & RADEON_RESET_RLC)
3179 grbm_soft_reset |= SOFT_RESET_RLC;
3181 if (reset_mask & RADEON_RESET_SEM)
3182 srbm_soft_reset |= SOFT_RESET_SEM;
3184 if (reset_mask & RADEON_RESET_IH)
3185 srbm_soft_reset |= SOFT_RESET_IH;
3187 if (reset_mask & RADEON_RESET_GRBM)
3188 srbm_soft_reset |= SOFT_RESET_GRBM;
3190 if (reset_mask & RADEON_RESET_VMC)
3191 srbm_soft_reset |= SOFT_RESET_VMC;
3193 if (reset_mask & RADEON_RESET_MC)
3194 srbm_soft_reset |= SOFT_RESET_MC;
3196 if (grbm_soft_reset) {
3197 tmp = RREG32(GRBM_SOFT_RESET);
3198 tmp |= grbm_soft_reset;
3199 dev_info(rdev->dev, "GRBM_SOFT_RESET=0x%08X\n", tmp);
3200 WREG32(GRBM_SOFT_RESET, tmp);
3201 tmp = RREG32(GRBM_SOFT_RESET);
3205 tmp &= ~grbm_soft_reset;
3206 WREG32(GRBM_SOFT_RESET, tmp);
3207 tmp = RREG32(GRBM_SOFT_RESET);
3210 if (srbm_soft_reset) {
3211 tmp = RREG32(SRBM_SOFT_RESET);
3212 tmp |= srbm_soft_reset;
3213 dev_info(rdev->dev, "SRBM_SOFT_RESET=0x%08X\n", tmp);
3214 WREG32(SRBM_SOFT_RESET, tmp);
3215 tmp = RREG32(SRBM_SOFT_RESET);
3219 tmp &= ~srbm_soft_reset;
3220 WREG32(SRBM_SOFT_RESET, tmp);
3221 tmp = RREG32(SRBM_SOFT_RESET);
3224 /* Wait a little for things to settle down */
3227 evergreen_mc_resume(rdev, &save);
3230 evergreen_print_gpu_status_regs(rdev);
3233 int si_asic_reset(struct radeon_device *rdev)
3237 reset_mask = si_gpu_check_soft_reset(rdev);
3240 r600_set_bios_scratch_engine_hung(rdev, true);
3242 si_gpu_soft_reset(rdev, reset_mask);
3244 reset_mask = si_gpu_check_soft_reset(rdev);
3247 r600_set_bios_scratch_engine_hung(rdev, false);
3253 * si_gfx_is_lockup - Check if the GFX engine is locked up
3255 * @rdev: radeon_device pointer
3256 * @ring: radeon_ring structure holding ring information
3258 * Check if the GFX engine is locked up.
3259 * Returns true if the engine appears to be locked up, false if not.
3261 bool si_gfx_is_lockup(struct radeon_device *rdev, struct radeon_ring *ring)
3263 u32 reset_mask = si_gpu_check_soft_reset(rdev);
3265 if (!(reset_mask & (RADEON_RESET_GFX |
3266 RADEON_RESET_COMPUTE |
3267 RADEON_RESET_CP))) {
3268 radeon_ring_lockup_update(ring);
3271 /* force CP activities */
3272 radeon_ring_force_activity(rdev, ring);
3273 return radeon_ring_test_lockup(rdev, ring);
3277 * si_dma_is_lockup - Check if the DMA engine is locked up
3279 * @rdev: radeon_device pointer
3280 * @ring: radeon_ring structure holding ring information
3282 * Check if the async DMA engine is locked up.
3283 * Returns true if the engine appears to be locked up, false if not.
3285 bool si_dma_is_lockup(struct radeon_device *rdev, struct radeon_ring *ring)
3287 u32 reset_mask = si_gpu_check_soft_reset(rdev);
3290 if (ring->idx == R600_RING_TYPE_DMA_INDEX)
3291 mask = RADEON_RESET_DMA;
3293 mask = RADEON_RESET_DMA1;
3295 if (!(reset_mask & mask)) {
3296 radeon_ring_lockup_update(ring);
3299 /* force ring activities */
3300 radeon_ring_force_activity(rdev, ring);
3301 return radeon_ring_test_lockup(rdev, ring);
3305 static void si_mc_program(struct radeon_device *rdev)
3307 struct evergreen_mc_save save;
3311 /* Initialize HDP */
3312 for (i = 0, j = 0; i < 32; i++, j += 0x18) {
3313 WREG32((0x2c14 + j), 0x00000000);
3314 WREG32((0x2c18 + j), 0x00000000);
3315 WREG32((0x2c1c + j), 0x00000000);
3316 WREG32((0x2c20 + j), 0x00000000);
3317 WREG32((0x2c24 + j), 0x00000000);
3319 WREG32(HDP_REG_COHERENCY_FLUSH_CNTL, 0);
3321 evergreen_mc_stop(rdev, &save);
3322 if (radeon_mc_wait_for_idle(rdev)) {
3323 dev_warn(rdev->dev, "Wait for MC idle timedout !\n");
3325 if (!ASIC_IS_NODCE(rdev))
3326 /* Lockout access through VGA aperture*/
3327 WREG32(VGA_HDP_CONTROL, VGA_MEMORY_DISABLE);
3328 /* Update configuration */
3329 WREG32(MC_VM_SYSTEM_APERTURE_LOW_ADDR,
3330 rdev->mc.vram_start >> 12);
3331 WREG32(MC_VM_SYSTEM_APERTURE_HIGH_ADDR,
3332 rdev->mc.vram_end >> 12);
3333 WREG32(MC_VM_SYSTEM_APERTURE_DEFAULT_ADDR,
3334 rdev->vram_scratch.gpu_addr >> 12);
3335 tmp = ((rdev->mc.vram_end >> 24) & 0xFFFF) << 16;
3336 tmp |= ((rdev->mc.vram_start >> 24) & 0xFFFF);
3337 WREG32(MC_VM_FB_LOCATION, tmp);
3338 /* XXX double check these! */
3339 WREG32(HDP_NONSURFACE_BASE, (rdev->mc.vram_start >> 8));
3340 WREG32(HDP_NONSURFACE_INFO, (2 << 7) | (1 << 30));
3341 WREG32(HDP_NONSURFACE_SIZE, 0x3FFFFFFF);
3342 WREG32(MC_VM_AGP_BASE, 0);
3343 WREG32(MC_VM_AGP_TOP, 0x0FFFFFFF);
3344 WREG32(MC_VM_AGP_BOT, 0x0FFFFFFF);
3345 if (radeon_mc_wait_for_idle(rdev)) {
3346 dev_warn(rdev->dev, "Wait for MC idle timedout !\n");
3348 evergreen_mc_resume(rdev, &save);
3349 if (!ASIC_IS_NODCE(rdev)) {
3350 /* we need to own VRAM, so turn off the VGA renderer here
3351 * to stop it overwriting our objects */
3352 rv515_vga_render_disable(rdev);
3356 static void si_vram_gtt_location(struct radeon_device *rdev,
3357 struct radeon_mc *mc)
3359 if (mc->mc_vram_size > 0xFFC0000000ULL) {
3360 /* leave room for at least 1024M GTT */
3361 dev_warn(rdev->dev, "limiting VRAM\n");
3362 mc->real_vram_size = 0xFFC0000000ULL;
3363 mc->mc_vram_size = 0xFFC0000000ULL;
3365 radeon_vram_location(rdev, &rdev->mc, 0);
3366 rdev->mc.gtt_base_align = 0;
3367 radeon_gtt_location(rdev, mc);
3370 static int si_mc_init(struct radeon_device *rdev)
3373 int chansize, numchan;
3375 /* Get VRAM informations */
3376 rdev->mc.vram_is_ddr = true;
3377 tmp = RREG32(MC_ARB_RAMCFG);
3378 if (tmp & CHANSIZE_OVERRIDE) {
3380 } else if (tmp & CHANSIZE_MASK) {
3385 tmp = RREG32(MC_SHARED_CHMAP);
3386 switch ((tmp & NOOFCHAN_MASK) >> NOOFCHAN_SHIFT) {
3416 rdev->mc.vram_width = numchan * chansize;
3417 /* Could aper size report 0 ? */
3418 rdev->mc.aper_base = pci_resource_start(rdev->pdev, 0);
3419 rdev->mc.aper_size = pci_resource_len(rdev->pdev, 0);
3420 /* size in MB on si */
3421 rdev->mc.mc_vram_size = RREG32(CONFIG_MEMSIZE) * 1024ULL * 1024ULL;
3422 rdev->mc.real_vram_size = RREG32(CONFIG_MEMSIZE) * 1024ULL * 1024ULL;
3423 rdev->mc.visible_vram_size = rdev->mc.aper_size;
3424 si_vram_gtt_location(rdev, &rdev->mc);
3425 radeon_update_bandwidth_info(rdev);
3433 void si_pcie_gart_tlb_flush(struct radeon_device *rdev)
3435 /* flush hdp cache */
3436 WREG32(HDP_MEM_COHERENCY_FLUSH_CNTL, 0x1);
3438 /* bits 0-15 are the VM contexts0-15 */
3439 WREG32(VM_INVALIDATE_REQUEST, 1);
3442 static int si_pcie_gart_enable(struct radeon_device *rdev)
3446 if (rdev->gart.robj == NULL) {
3447 dev_err(rdev->dev, "No VRAM object for PCIE GART.\n");
3450 r = radeon_gart_table_vram_pin(rdev);
3453 radeon_gart_restore(rdev);
3454 /* Setup TLB control */
3455 WREG32(MC_VM_MX_L1_TLB_CNTL,
3458 SYSTEM_ACCESS_MODE_NOT_IN_SYS |
3459 ENABLE_ADVANCED_DRIVER_MODEL |
3460 SYSTEM_APERTURE_UNMAPPED_ACCESS_PASS_THRU);
3461 /* Setup L2 cache */
3462 WREG32(VM_L2_CNTL, ENABLE_L2_CACHE |
3463 ENABLE_L2_PTE_CACHE_LRU_UPDATE_BY_WRITE |
3464 ENABLE_L2_PDE0_CACHE_LRU_UPDATE_BY_WRITE |
3465 EFFECTIVE_L2_QUEUE_SIZE(7) |
3466 CONTEXT1_IDENTITY_ACCESS_MODE(1));
3467 WREG32(VM_L2_CNTL2, INVALIDATE_ALL_L1_TLBS | INVALIDATE_L2_CACHE);
3468 WREG32(VM_L2_CNTL3, L2_CACHE_BIGK_ASSOCIATIVITY |
3469 L2_CACHE_BIGK_FRAGMENT_SIZE(0));
3470 /* setup context0 */
3471 WREG32(VM_CONTEXT0_PAGE_TABLE_START_ADDR, rdev->mc.gtt_start >> 12);
3472 WREG32(VM_CONTEXT0_PAGE_TABLE_END_ADDR, rdev->mc.gtt_end >> 12);
3473 WREG32(VM_CONTEXT0_PAGE_TABLE_BASE_ADDR, rdev->gart.table_addr >> 12);
3474 WREG32(VM_CONTEXT0_PROTECTION_FAULT_DEFAULT_ADDR,
3475 (u32)(rdev->dummy_page.addr >> 12));
3476 WREG32(VM_CONTEXT0_CNTL2, 0);
3477 WREG32(VM_CONTEXT0_CNTL, (ENABLE_CONTEXT | PAGE_TABLE_DEPTH(0) |
3478 RANGE_PROTECTION_FAULT_ENABLE_DEFAULT));
3484 /* empty context1-15 */
3485 /* set vm size, must be a multiple of 4 */
3486 WREG32(VM_CONTEXT1_PAGE_TABLE_START_ADDR, 0);
3487 WREG32(VM_CONTEXT1_PAGE_TABLE_END_ADDR, rdev->vm_manager.max_pfn);
3488 /* Assign the pt base to something valid for now; the pts used for
3489 * the VMs are determined by the application and setup and assigned
3490 * on the fly in the vm part of radeon_gart.c
3492 for (i = 1; i < 16; i++) {
3494 WREG32(VM_CONTEXT0_PAGE_TABLE_BASE_ADDR + (i << 2),
3495 rdev->gart.table_addr >> 12);
3497 WREG32(VM_CONTEXT8_PAGE_TABLE_BASE_ADDR + ((i - 8) << 2),
3498 rdev->gart.table_addr >> 12);
3501 /* enable context1-15 */
3502 WREG32(VM_CONTEXT1_PROTECTION_FAULT_DEFAULT_ADDR,
3503 (u32)(rdev->dummy_page.addr >> 12));
3504 WREG32(VM_CONTEXT1_CNTL2, 4);
3505 WREG32(VM_CONTEXT1_CNTL, ENABLE_CONTEXT | PAGE_TABLE_DEPTH(1) |
3506 RANGE_PROTECTION_FAULT_ENABLE_INTERRUPT |
3507 RANGE_PROTECTION_FAULT_ENABLE_DEFAULT |
3508 DUMMY_PAGE_PROTECTION_FAULT_ENABLE_INTERRUPT |
3509 DUMMY_PAGE_PROTECTION_FAULT_ENABLE_DEFAULT |
3510 PDE0_PROTECTION_FAULT_ENABLE_INTERRUPT |
3511 PDE0_PROTECTION_FAULT_ENABLE_DEFAULT |
3512 VALID_PROTECTION_FAULT_ENABLE_INTERRUPT |
3513 VALID_PROTECTION_FAULT_ENABLE_DEFAULT |
3514 READ_PROTECTION_FAULT_ENABLE_INTERRUPT |
3515 READ_PROTECTION_FAULT_ENABLE_DEFAULT |
3516 WRITE_PROTECTION_FAULT_ENABLE_INTERRUPT |
3517 WRITE_PROTECTION_FAULT_ENABLE_DEFAULT);
3519 si_pcie_gart_tlb_flush(rdev);
3520 DRM_INFO("PCIE GART of %uM enabled (table at 0x%016llX).\n",
3521 (unsigned)(rdev->mc.gtt_size >> 20),
3522 (unsigned long long)rdev->gart.table_addr);
3523 rdev->gart.ready = true;
3527 static void si_pcie_gart_disable(struct radeon_device *rdev)
3529 /* Disable all tables */
3530 WREG32(VM_CONTEXT0_CNTL, 0);
3531 WREG32(VM_CONTEXT1_CNTL, 0);
3532 /* Setup TLB control */
3533 WREG32(MC_VM_MX_L1_TLB_CNTL, SYSTEM_ACCESS_MODE_NOT_IN_SYS |
3534 SYSTEM_APERTURE_UNMAPPED_ACCESS_PASS_THRU);
3535 /* Setup L2 cache */
3536 WREG32(VM_L2_CNTL, ENABLE_L2_PTE_CACHE_LRU_UPDATE_BY_WRITE |
3537 ENABLE_L2_PDE0_CACHE_LRU_UPDATE_BY_WRITE |
3538 EFFECTIVE_L2_QUEUE_SIZE(7) |
3539 CONTEXT1_IDENTITY_ACCESS_MODE(1));
3540 WREG32(VM_L2_CNTL2, 0);
3541 WREG32(VM_L2_CNTL3, L2_CACHE_BIGK_ASSOCIATIVITY |
3542 L2_CACHE_BIGK_FRAGMENT_SIZE(0));
3543 radeon_gart_table_vram_unpin(rdev);
3546 static void si_pcie_gart_fini(struct radeon_device *rdev)
3548 si_pcie_gart_disable(rdev);
3549 radeon_gart_table_vram_free(rdev);
3550 radeon_gart_fini(rdev);
3554 static bool si_vm_reg_valid(u32 reg)
3556 /* context regs are fine */
3560 /* check config regs */
3562 case GRBM_GFX_INDEX:
3563 case CP_STRMOUT_CNTL:
3564 case VGT_VTX_VECT_EJECT_REG:
3565 case VGT_CACHE_INVALIDATION:
3566 case VGT_ESGS_RING_SIZE:
3567 case VGT_GSVS_RING_SIZE:
3568 case VGT_GS_VERTEX_REUSE:
3569 case VGT_PRIMITIVE_TYPE:
3570 case VGT_INDEX_TYPE:
3571 case VGT_NUM_INDICES:
3572 case VGT_NUM_INSTANCES:
3573 case VGT_TF_RING_SIZE:
3574 case VGT_HS_OFFCHIP_PARAM:
3575 case VGT_TF_MEMORY_BASE:
3577 case PA_SU_LINE_STIPPLE_VALUE:
3578 case PA_SC_LINE_STIPPLE_STATE:
3581 case SPI_STATIC_THREAD_MGMT_1:
3582 case SPI_STATIC_THREAD_MGMT_2:
3583 case SPI_STATIC_THREAD_MGMT_3:
3584 case SPI_PS_MAX_WAVE_ID:
3585 case SPI_CONFIG_CNTL:
3586 case SPI_CONFIG_CNTL_1:
3590 DRM_ERROR("Invalid register 0x%x in CS\n", reg);
3595 static int si_vm_packet3_ce_check(struct radeon_device *rdev,
3596 u32 *ib, struct radeon_cs_packet *pkt)
3598 switch (pkt->opcode) {
3600 case PACKET3_SET_BASE:
3601 case PACKET3_SET_CE_DE_COUNTERS:
3602 case PACKET3_LOAD_CONST_RAM:
3603 case PACKET3_WRITE_CONST_RAM:
3604 case PACKET3_WRITE_CONST_RAM_OFFSET:
3605 case PACKET3_DUMP_CONST_RAM:
3606 case PACKET3_INCREMENT_CE_COUNTER:
3607 case PACKET3_WAIT_ON_DE_COUNTER:
3608 case PACKET3_CE_WRITE:
3611 DRM_ERROR("Invalid CE packet3: 0x%x\n", pkt->opcode);
3617 static int si_vm_packet3_gfx_check(struct radeon_device *rdev,
3618 u32 *ib, struct radeon_cs_packet *pkt)
3620 u32 idx = pkt->idx + 1;
3621 u32 idx_value = ib[idx];
3622 u32 start_reg, end_reg, reg, i;
3625 switch (pkt->opcode) {
3627 case PACKET3_SET_BASE:
3628 case PACKET3_CLEAR_STATE:
3629 case PACKET3_INDEX_BUFFER_SIZE:
3630 case PACKET3_DISPATCH_DIRECT:
3631 case PACKET3_DISPATCH_INDIRECT:
3632 case PACKET3_ALLOC_GDS:
3633 case PACKET3_WRITE_GDS_RAM:
3634 case PACKET3_ATOMIC_GDS:
3635 case PACKET3_ATOMIC:
3636 case PACKET3_OCCLUSION_QUERY:
3637 case PACKET3_SET_PREDICATION:
3638 case PACKET3_COND_EXEC:
3639 case PACKET3_PRED_EXEC:
3640 case PACKET3_DRAW_INDIRECT:
3641 case PACKET3_DRAW_INDEX_INDIRECT:
3642 case PACKET3_INDEX_BASE:
3643 case PACKET3_DRAW_INDEX_2:
3644 case PACKET3_CONTEXT_CONTROL:
3645 case PACKET3_INDEX_TYPE:
3646 case PACKET3_DRAW_INDIRECT_MULTI:
3647 case PACKET3_DRAW_INDEX_AUTO:
3648 case PACKET3_DRAW_INDEX_IMMD:
3649 case PACKET3_NUM_INSTANCES:
3650 case PACKET3_DRAW_INDEX_MULTI_AUTO:
3651 case PACKET3_STRMOUT_BUFFER_UPDATE:
3652 case PACKET3_DRAW_INDEX_OFFSET_2:
3653 case PACKET3_DRAW_INDEX_MULTI_ELEMENT:
3654 case PACKET3_DRAW_INDEX_INDIRECT_MULTI:
3655 case PACKET3_MPEG_INDEX:
3656 case PACKET3_WAIT_REG_MEM:
3657 case PACKET3_MEM_WRITE:
3658 case PACKET3_PFP_SYNC_ME:
3659 case PACKET3_SURFACE_SYNC:
3660 case PACKET3_EVENT_WRITE:
3661 case PACKET3_EVENT_WRITE_EOP:
3662 case PACKET3_EVENT_WRITE_EOS:
3663 case PACKET3_SET_CONTEXT_REG:
3664 case PACKET3_SET_CONTEXT_REG_INDIRECT:
3665 case PACKET3_SET_SH_REG:
3666 case PACKET3_SET_SH_REG_OFFSET:
3667 case PACKET3_INCREMENT_DE_COUNTER:
3668 case PACKET3_WAIT_ON_CE_COUNTER:
3669 case PACKET3_WAIT_ON_AVAIL_BUFFER:
3670 case PACKET3_ME_WRITE:
3672 case PACKET3_COPY_DATA:
3673 if ((idx_value & 0xf00) == 0) {
3674 reg = ib[idx + 3] * 4;
3675 if (!si_vm_reg_valid(reg))
3679 case PACKET3_WRITE_DATA:
3680 if ((idx_value & 0xf00) == 0) {
3681 start_reg = ib[idx + 1] * 4;
3682 if (idx_value & 0x10000) {
3683 if (!si_vm_reg_valid(start_reg))
3686 for (i = 0; i < (pkt->count - 2); i++) {
3687 reg = start_reg + (4 * i);
3688 if (!si_vm_reg_valid(reg))
3694 case PACKET3_COND_WRITE:
3695 if (idx_value & 0x100) {
3696 reg = ib[idx + 5] * 4;
3697 if (!si_vm_reg_valid(reg))
3701 case PACKET3_COPY_DW:
3702 if (idx_value & 0x2) {
3703 reg = ib[idx + 3] * 4;
3704 if (!si_vm_reg_valid(reg))
3708 case PACKET3_SET_CONFIG_REG:
3709 start_reg = (idx_value << 2) + PACKET3_SET_CONFIG_REG_START;
3710 end_reg = 4 * pkt->count + start_reg - 4;
3711 if ((start_reg < PACKET3_SET_CONFIG_REG_START) ||
3712 (start_reg >= PACKET3_SET_CONFIG_REG_END) ||
3713 (end_reg >= PACKET3_SET_CONFIG_REG_END)) {
3714 DRM_ERROR("bad PACKET3_SET_CONFIG_REG\n");
3717 for (i = 0; i < pkt->count; i++) {
3718 reg = start_reg + (4 * i);
3719 if (!si_vm_reg_valid(reg))
3723 case PACKET3_CP_DMA:
3724 command = ib[idx + 4];
3726 if (command & PACKET3_CP_DMA_CMD_SAS) {
3727 /* src address space is register */
3728 if (((info & 0x60000000) >> 29) == 0) {
3729 start_reg = idx_value << 2;
3730 if (command & PACKET3_CP_DMA_CMD_SAIC) {
3732 if (!si_vm_reg_valid(reg)) {
3733 DRM_ERROR("CP DMA Bad SRC register\n");
3737 for (i = 0; i < (command & 0x1fffff); i++) {
3738 reg = start_reg + (4 * i);
3739 if (!si_vm_reg_valid(reg)) {
3740 DRM_ERROR("CP DMA Bad SRC register\n");
3747 if (command & PACKET3_CP_DMA_CMD_DAS) {
3748 /* dst address space is register */
3749 if (((info & 0x00300000) >> 20) == 0) {
3750 start_reg = ib[idx + 2];
3751 if (command & PACKET3_CP_DMA_CMD_DAIC) {
3753 if (!si_vm_reg_valid(reg)) {
3754 DRM_ERROR("CP DMA Bad DST register\n");
3758 for (i = 0; i < (command & 0x1fffff); i++) {
3759 reg = start_reg + (4 * i);
3760 if (!si_vm_reg_valid(reg)) {
3761 DRM_ERROR("CP DMA Bad DST register\n");
3770 DRM_ERROR("Invalid GFX packet3: 0x%x\n", pkt->opcode);
3776 static int si_vm_packet3_compute_check(struct radeon_device *rdev,
3777 u32 *ib, struct radeon_cs_packet *pkt)
3779 u32 idx = pkt->idx + 1;
3780 u32 idx_value = ib[idx];
3781 u32 start_reg, reg, i;
3783 switch (pkt->opcode) {
3785 case PACKET3_SET_BASE:
3786 case PACKET3_CLEAR_STATE:
3787 case PACKET3_DISPATCH_DIRECT:
3788 case PACKET3_DISPATCH_INDIRECT:
3789 case PACKET3_ALLOC_GDS:
3790 case PACKET3_WRITE_GDS_RAM:
3791 case PACKET3_ATOMIC_GDS:
3792 case PACKET3_ATOMIC:
3793 case PACKET3_OCCLUSION_QUERY:
3794 case PACKET3_SET_PREDICATION:
3795 case PACKET3_COND_EXEC:
3796 case PACKET3_PRED_EXEC:
3797 case PACKET3_CONTEXT_CONTROL:
3798 case PACKET3_STRMOUT_BUFFER_UPDATE:
3799 case PACKET3_WAIT_REG_MEM:
3800 case PACKET3_MEM_WRITE:
3801 case PACKET3_PFP_SYNC_ME:
3802 case PACKET3_SURFACE_SYNC:
3803 case PACKET3_EVENT_WRITE:
3804 case PACKET3_EVENT_WRITE_EOP:
3805 case PACKET3_EVENT_WRITE_EOS:
3806 case PACKET3_SET_CONTEXT_REG:
3807 case PACKET3_SET_CONTEXT_REG_INDIRECT:
3808 case PACKET3_SET_SH_REG:
3809 case PACKET3_SET_SH_REG_OFFSET:
3810 case PACKET3_INCREMENT_DE_COUNTER:
3811 case PACKET3_WAIT_ON_CE_COUNTER:
3812 case PACKET3_WAIT_ON_AVAIL_BUFFER:
3813 case PACKET3_ME_WRITE:
3815 case PACKET3_COPY_DATA:
3816 if ((idx_value & 0xf00) == 0) {
3817 reg = ib[idx + 3] * 4;
3818 if (!si_vm_reg_valid(reg))
3822 case PACKET3_WRITE_DATA:
3823 if ((idx_value & 0xf00) == 0) {
3824 start_reg = ib[idx + 1] * 4;
3825 if (idx_value & 0x10000) {
3826 if (!si_vm_reg_valid(start_reg))
3829 for (i = 0; i < (pkt->count - 2); i++) {
3830 reg = start_reg + (4 * i);
3831 if (!si_vm_reg_valid(reg))
3837 case PACKET3_COND_WRITE:
3838 if (idx_value & 0x100) {
3839 reg = ib[idx + 5] * 4;
3840 if (!si_vm_reg_valid(reg))
3844 case PACKET3_COPY_DW:
3845 if (idx_value & 0x2) {
3846 reg = ib[idx + 3] * 4;
3847 if (!si_vm_reg_valid(reg))
3852 DRM_ERROR("Invalid Compute packet3: 0x%x\n", pkt->opcode);
3858 int si_ib_parse(struct radeon_device *rdev, struct radeon_ib *ib)
3862 struct radeon_cs_packet pkt;
3866 pkt.type = RADEON_CP_PACKET_GET_TYPE(ib->ptr[idx]);
3867 pkt.count = RADEON_CP_PACKET_GET_COUNT(ib->ptr[idx]);
3870 case RADEON_PACKET_TYPE0:
3871 dev_err(rdev->dev, "Packet0 not allowed!\n");
3874 case RADEON_PACKET_TYPE2:
3877 case RADEON_PACKET_TYPE3:
3878 pkt.opcode = RADEON_CP_PACKET3_GET_OPCODE(ib->ptr[idx]);
3879 if (ib->is_const_ib)
3880 ret = si_vm_packet3_ce_check(rdev, ib->ptr, &pkt);
3883 case RADEON_RING_TYPE_GFX_INDEX:
3884 ret = si_vm_packet3_gfx_check(rdev, ib->ptr, &pkt);
3886 case CAYMAN_RING_TYPE_CP1_INDEX:
3887 case CAYMAN_RING_TYPE_CP2_INDEX:
3888 ret = si_vm_packet3_compute_check(rdev, ib->ptr, &pkt);
3891 dev_err(rdev->dev, "Non-PM4 ring %d !\n", ib->ring);
3896 idx += pkt.count + 2;
3899 dev_err(rdev->dev, "Unknown packet type %d !\n", pkt.type);
3905 } while (idx < ib->length_dw);
3913 int si_vm_init(struct radeon_device *rdev)
3916 rdev->vm_manager.nvm = 16;
3917 /* base offset of vram pages */
3918 rdev->vm_manager.vram_base_offset = 0;
3923 void si_vm_fini(struct radeon_device *rdev)
3928 * si_vm_set_page - update the page tables using the CP
3930 * @rdev: radeon_device pointer
3931 * @ib: indirect buffer to fill with commands
3932 * @pe: addr of the page entry
3933 * @addr: dst addr to write into pe
3934 * @count: number of page entries to update
3935 * @incr: increase next addr by incr bytes
3936 * @flags: access flags
3938 * Update the page tables using the CP (SI).
3940 void si_vm_set_page(struct radeon_device *rdev,
3941 struct radeon_ib *ib,
3943 uint64_t addr, unsigned count,
3944 uint32_t incr, uint32_t flags)
3946 uint32_t r600_flags = cayman_vm_page_flags(rdev, flags);
3950 if (rdev->asic->vm.pt_ring_index == RADEON_RING_TYPE_GFX_INDEX) {
3952 ndw = 2 + count * 2;
3956 ib->ptr[ib->length_dw++] = PACKET3(PACKET3_WRITE_DATA, ndw);
3957 ib->ptr[ib->length_dw++] = (WRITE_DATA_ENGINE_SEL(0) |
3958 WRITE_DATA_DST_SEL(1));
3959 ib->ptr[ib->length_dw++] = pe;
3960 ib->ptr[ib->length_dw++] = upper_32_bits(pe);
3961 for (; ndw > 2; ndw -= 2, --count, pe += 8) {
3962 if (flags & RADEON_VM_PAGE_SYSTEM) {
3963 value = radeon_vm_map_gart(rdev, addr);
3964 value &= 0xFFFFFFFFFFFFF000ULL;
3965 } else if (flags & RADEON_VM_PAGE_VALID) {
3971 value |= r600_flags;
3972 ib->ptr[ib->length_dw++] = value;
3973 ib->ptr[ib->length_dw++] = upper_32_bits(value);
3978 if (flags & RADEON_VM_PAGE_SYSTEM) {
3984 /* for non-physically contiguous pages (system) */
3985 ib->ptr[ib->length_dw++] = DMA_PACKET(DMA_PACKET_WRITE, 0, 0, 0, ndw);
3986 ib->ptr[ib->length_dw++] = pe;
3987 ib->ptr[ib->length_dw++] = upper_32_bits(pe) & 0xff;
3988 for (; ndw > 0; ndw -= 2, --count, pe += 8) {
3989 if (flags & RADEON_VM_PAGE_SYSTEM) {
3990 value = radeon_vm_map_gart(rdev, addr);
3991 value &= 0xFFFFFFFFFFFFF000ULL;
3992 } else if (flags & RADEON_VM_PAGE_VALID) {
3998 value |= r600_flags;
3999 ib->ptr[ib->length_dw++] = value;
4000 ib->ptr[ib->length_dw++] = upper_32_bits(value);
4009 if (flags & RADEON_VM_PAGE_VALID)
4013 /* for physically contiguous pages (vram) */
4014 ib->ptr[ib->length_dw++] = DMA_PTE_PDE_PACKET(ndw);
4015 ib->ptr[ib->length_dw++] = pe; /* dst addr */
4016 ib->ptr[ib->length_dw++] = upper_32_bits(pe) & 0xff;
4017 ib->ptr[ib->length_dw++] = r600_flags; /* mask */
4018 ib->ptr[ib->length_dw++] = 0;
4019 ib->ptr[ib->length_dw++] = value; /* value */
4020 ib->ptr[ib->length_dw++] = upper_32_bits(value);
4021 ib->ptr[ib->length_dw++] = incr; /* increment size */
4022 ib->ptr[ib->length_dw++] = 0;
4024 addr += (ndw / 2) * incr;
4028 while (ib->length_dw & 0x7)
4029 ib->ptr[ib->length_dw++] = DMA_PACKET(DMA_PACKET_NOP, 0, 0, 0, 0);
4033 void si_vm_flush(struct radeon_device *rdev, int ridx, struct radeon_vm *vm)
4035 struct radeon_ring *ring = &rdev->ring[ridx];
4040 /* write new base address */
4041 radeon_ring_write(ring, PACKET3(PACKET3_WRITE_DATA, 3));
4042 radeon_ring_write(ring, (WRITE_DATA_ENGINE_SEL(0) |
4043 WRITE_DATA_DST_SEL(0)));
4046 radeon_ring_write(ring,
4047 (VM_CONTEXT0_PAGE_TABLE_BASE_ADDR + (vm->id << 2)) >> 2);
4049 radeon_ring_write(ring,
4050 (VM_CONTEXT8_PAGE_TABLE_BASE_ADDR + ((vm->id - 8) << 2)) >> 2);
4052 radeon_ring_write(ring, 0);
4053 radeon_ring_write(ring, vm->pd_gpu_addr >> 12);
4055 /* flush hdp cache */
4056 radeon_ring_write(ring, PACKET3(PACKET3_WRITE_DATA, 3));
4057 radeon_ring_write(ring, (WRITE_DATA_ENGINE_SEL(0) |
4058 WRITE_DATA_DST_SEL(0)));
4059 radeon_ring_write(ring, HDP_MEM_COHERENCY_FLUSH_CNTL >> 2);
4060 radeon_ring_write(ring, 0);
4061 radeon_ring_write(ring, 0x1);
4063 /* bits 0-15 are the VM contexts0-15 */
4064 radeon_ring_write(ring, PACKET3(PACKET3_WRITE_DATA, 3));
4065 radeon_ring_write(ring, (WRITE_DATA_ENGINE_SEL(0) |
4066 WRITE_DATA_DST_SEL(0)));
4067 radeon_ring_write(ring, VM_INVALIDATE_REQUEST >> 2);
4068 radeon_ring_write(ring, 0);
4069 radeon_ring_write(ring, 1 << vm->id);
4071 /* sync PFP to ME, otherwise we might get invalid PFP reads */
4072 radeon_ring_write(ring, PACKET3(PACKET3_PFP_SYNC_ME, 0));
4073 radeon_ring_write(ring, 0x0);
4076 void si_dma_vm_flush(struct radeon_device *rdev, int ridx, struct radeon_vm *vm)
4078 struct radeon_ring *ring = &rdev->ring[ridx];
4083 radeon_ring_write(ring, DMA_PACKET(DMA_PACKET_SRBM_WRITE, 0, 0, 0, 0));
4085 radeon_ring_write(ring, (0xf << 16) | ((VM_CONTEXT0_PAGE_TABLE_BASE_ADDR + (vm->id << 2)) >> 2));
4087 radeon_ring_write(ring, (0xf << 16) | ((VM_CONTEXT8_PAGE_TABLE_BASE_ADDR + ((vm->id - 8) << 2)) >> 2));
4089 radeon_ring_write(ring, vm->pd_gpu_addr >> 12);
4091 /* flush hdp cache */
4092 radeon_ring_write(ring, DMA_PACKET(DMA_PACKET_SRBM_WRITE, 0, 0, 0, 0));
4093 radeon_ring_write(ring, (0xf << 16) | (HDP_MEM_COHERENCY_FLUSH_CNTL >> 2));
4094 radeon_ring_write(ring, 1);
4096 /* bits 0-7 are the VM contexts0-7 */
4097 radeon_ring_write(ring, DMA_PACKET(DMA_PACKET_SRBM_WRITE, 0, 0, 0, 0));
4098 radeon_ring_write(ring, (0xf << 16) | (VM_INVALIDATE_REQUEST >> 2));
4099 radeon_ring_write(ring, 1 << vm->id);
4105 void si_rlc_fini(struct radeon_device *rdev)
4109 /* save restore block */
4110 if (rdev->rlc.save_restore_obj) {
4111 r = radeon_bo_reserve(rdev->rlc.save_restore_obj, false);
4112 if (unlikely(r != 0))
4113 dev_warn(rdev->dev, "(%d) reserve RLC sr bo failed\n", r);
4114 radeon_bo_unpin(rdev->rlc.save_restore_obj);
4115 radeon_bo_unreserve(rdev->rlc.save_restore_obj);
4117 radeon_bo_unref(&rdev->rlc.save_restore_obj);
4118 rdev->rlc.save_restore_obj = NULL;
4121 /* clear state block */
4122 if (rdev->rlc.clear_state_obj) {
4123 r = radeon_bo_reserve(rdev->rlc.clear_state_obj, false);
4124 if (unlikely(r != 0))
4125 dev_warn(rdev->dev, "(%d) reserve RLC c bo failed\n", r);
4126 radeon_bo_unpin(rdev->rlc.clear_state_obj);
4127 radeon_bo_unreserve(rdev->rlc.clear_state_obj);
4129 radeon_bo_unref(&rdev->rlc.clear_state_obj);
4130 rdev->rlc.clear_state_obj = NULL;
4134 int si_rlc_init(struct radeon_device *rdev)
4138 /* save restore block */
4139 if (rdev->rlc.save_restore_obj == NULL) {
4140 r = radeon_bo_create(rdev, RADEON_GPU_PAGE_SIZE, PAGE_SIZE, true,
4141 RADEON_GEM_DOMAIN_VRAM, NULL,
4142 &rdev->rlc.save_restore_obj);
4144 dev_warn(rdev->dev, "(%d) create RLC sr bo failed\n", r);
4149 r = radeon_bo_reserve(rdev->rlc.save_restore_obj, false);
4150 if (unlikely(r != 0)) {
4154 r = radeon_bo_pin(rdev->rlc.save_restore_obj, RADEON_GEM_DOMAIN_VRAM,
4155 &rdev->rlc.save_restore_gpu_addr);
4156 radeon_bo_unreserve(rdev->rlc.save_restore_obj);
4158 dev_warn(rdev->dev, "(%d) pin RLC sr bo failed\n", r);
4163 /* clear state block */
4164 if (rdev->rlc.clear_state_obj == NULL) {
4165 r = radeon_bo_create(rdev, RADEON_GPU_PAGE_SIZE, PAGE_SIZE, true,
4166 RADEON_GEM_DOMAIN_VRAM, NULL,
4167 &rdev->rlc.clear_state_obj);
4169 dev_warn(rdev->dev, "(%d) create RLC c bo failed\n", r);
4174 r = radeon_bo_reserve(rdev->rlc.clear_state_obj, false);
4175 if (unlikely(r != 0)) {
4179 r = radeon_bo_pin(rdev->rlc.clear_state_obj, RADEON_GEM_DOMAIN_VRAM,
4180 &rdev->rlc.clear_state_gpu_addr);
4181 radeon_bo_unreserve(rdev->rlc.clear_state_obj);
4183 dev_warn(rdev->dev, "(%d) pin RLC c bo failed\n", r);
4191 static void si_rlc_stop(struct radeon_device *rdev)
4193 WREG32(RLC_CNTL, 0);
4196 static void si_rlc_start(struct radeon_device *rdev)
4198 WREG32(RLC_CNTL, RLC_ENABLE);
4201 static int si_rlc_resume(struct radeon_device *rdev)
4204 const __be32 *fw_data;
4211 WREG32(RLC_RL_BASE, 0);
4212 WREG32(RLC_RL_SIZE, 0);
4213 WREG32(RLC_LB_CNTL, 0);
4214 WREG32(RLC_LB_CNTR_MAX, 0xffffffff);
4215 WREG32(RLC_LB_CNTR_INIT, 0);
4217 WREG32(RLC_SAVE_AND_RESTORE_BASE, rdev->rlc.save_restore_gpu_addr >> 8);
4218 WREG32(RLC_CLEAR_STATE_RESTORE_BASE, rdev->rlc.clear_state_gpu_addr >> 8);
4220 WREG32(RLC_MC_CNTL, 0);
4221 WREG32(RLC_UCODE_CNTL, 0);
4223 fw_data = (const __be32 *)rdev->rlc_fw->data;
4224 for (i = 0; i < SI_RLC_UCODE_SIZE; i++) {
4225 WREG32(RLC_UCODE_ADDR, i);
4226 WREG32(RLC_UCODE_DATA, be32_to_cpup(fw_data++));
4228 WREG32(RLC_UCODE_ADDR, 0);
4235 static void si_enable_interrupts(struct radeon_device *rdev)
4237 u32 ih_cntl = RREG32(IH_CNTL);
4238 u32 ih_rb_cntl = RREG32(IH_RB_CNTL);
4240 ih_cntl |= ENABLE_INTR;
4241 ih_rb_cntl |= IH_RB_ENABLE;
4242 WREG32(IH_CNTL, ih_cntl);
4243 WREG32(IH_RB_CNTL, ih_rb_cntl);
4244 rdev->ih.enabled = true;
4247 static void si_disable_interrupts(struct radeon_device *rdev)
4249 u32 ih_rb_cntl = RREG32(IH_RB_CNTL);
4250 u32 ih_cntl = RREG32(IH_CNTL);
4252 ih_rb_cntl &= ~IH_RB_ENABLE;
4253 ih_cntl &= ~ENABLE_INTR;
4254 WREG32(IH_RB_CNTL, ih_rb_cntl);
4255 WREG32(IH_CNTL, ih_cntl);
4256 /* set rptr, wptr to 0 */
4257 WREG32(IH_RB_RPTR, 0);
4258 WREG32(IH_RB_WPTR, 0);
4259 rdev->ih.enabled = false;
4263 static void si_disable_interrupt_state(struct radeon_device *rdev)
4267 WREG32(CP_INT_CNTL_RING0, CNTX_BUSY_INT_ENABLE | CNTX_EMPTY_INT_ENABLE);
4268 WREG32(CP_INT_CNTL_RING1, 0);
4269 WREG32(CP_INT_CNTL_RING2, 0);
4270 tmp = RREG32(DMA_CNTL + DMA0_REGISTER_OFFSET) & ~TRAP_ENABLE;
4271 WREG32(DMA_CNTL + DMA0_REGISTER_OFFSET, tmp);
4272 tmp = RREG32(DMA_CNTL + DMA1_REGISTER_OFFSET) & ~TRAP_ENABLE;
4273 WREG32(DMA_CNTL + DMA1_REGISTER_OFFSET, tmp);
4274 WREG32(GRBM_INT_CNTL, 0);
4275 if (rdev->num_crtc >= 2) {
4276 WREG32(INT_MASK + EVERGREEN_CRTC0_REGISTER_OFFSET, 0);
4277 WREG32(INT_MASK + EVERGREEN_CRTC1_REGISTER_OFFSET, 0);
4279 if (rdev->num_crtc >= 4) {
4280 WREG32(INT_MASK + EVERGREEN_CRTC2_REGISTER_OFFSET, 0);
4281 WREG32(INT_MASK + EVERGREEN_CRTC3_REGISTER_OFFSET, 0);
4283 if (rdev->num_crtc >= 6) {
4284 WREG32(INT_MASK + EVERGREEN_CRTC4_REGISTER_OFFSET, 0);
4285 WREG32(INT_MASK + EVERGREEN_CRTC5_REGISTER_OFFSET, 0);
4288 if (rdev->num_crtc >= 2) {
4289 WREG32(GRPH_INT_CONTROL + EVERGREEN_CRTC0_REGISTER_OFFSET, 0);
4290 WREG32(GRPH_INT_CONTROL + EVERGREEN_CRTC1_REGISTER_OFFSET, 0);
4292 if (rdev->num_crtc >= 4) {
4293 WREG32(GRPH_INT_CONTROL + EVERGREEN_CRTC2_REGISTER_OFFSET, 0);
4294 WREG32(GRPH_INT_CONTROL + EVERGREEN_CRTC3_REGISTER_OFFSET, 0);
4296 if (rdev->num_crtc >= 6) {
4297 WREG32(GRPH_INT_CONTROL + EVERGREEN_CRTC4_REGISTER_OFFSET, 0);
4298 WREG32(GRPH_INT_CONTROL + EVERGREEN_CRTC5_REGISTER_OFFSET, 0);
4301 if (!ASIC_IS_NODCE(rdev)) {
4302 WREG32(DACA_AUTODETECT_INT_CONTROL, 0);
4304 tmp = RREG32(DC_HPD1_INT_CONTROL) & DC_HPDx_INT_POLARITY;
4305 WREG32(DC_HPD1_INT_CONTROL, tmp);
4306 tmp = RREG32(DC_HPD2_INT_CONTROL) & DC_HPDx_INT_POLARITY;
4307 WREG32(DC_HPD2_INT_CONTROL, tmp);
4308 tmp = RREG32(DC_HPD3_INT_CONTROL) & DC_HPDx_INT_POLARITY;
4309 WREG32(DC_HPD3_INT_CONTROL, tmp);
4310 tmp = RREG32(DC_HPD4_INT_CONTROL) & DC_HPDx_INT_POLARITY;
4311 WREG32(DC_HPD4_INT_CONTROL, tmp);
4312 tmp = RREG32(DC_HPD5_INT_CONTROL) & DC_HPDx_INT_POLARITY;
4313 WREG32(DC_HPD5_INT_CONTROL, tmp);
4314 tmp = RREG32(DC_HPD6_INT_CONTROL) & DC_HPDx_INT_POLARITY;
4315 WREG32(DC_HPD6_INT_CONTROL, tmp);
4319 static int si_irq_init(struct radeon_device *rdev)
4323 u32 interrupt_cntl, ih_cntl, ih_rb_cntl;
4326 ret = r600_ih_ring_alloc(rdev);
4331 si_disable_interrupts(rdev);
4334 ret = si_rlc_resume(rdev);
4336 r600_ih_ring_fini(rdev);
4340 /* setup interrupt control */
4341 /* set dummy read address to ring address */
4342 WREG32(INTERRUPT_CNTL2, rdev->ih.gpu_addr >> 8);
4343 interrupt_cntl = RREG32(INTERRUPT_CNTL);
4344 /* IH_DUMMY_RD_OVERRIDE=0 - dummy read disabled with msi, enabled without msi
4345 * IH_DUMMY_RD_OVERRIDE=1 - dummy read controlled by IH_DUMMY_RD_EN
4347 interrupt_cntl &= ~IH_DUMMY_RD_OVERRIDE;
4348 /* IH_REQ_NONSNOOP_EN=1 if ring is in non-cacheable memory, e.g., vram */
4349 interrupt_cntl &= ~IH_REQ_NONSNOOP_EN;
4350 WREG32(INTERRUPT_CNTL, interrupt_cntl);
4352 WREG32(IH_RB_BASE, rdev->ih.gpu_addr >> 8);
4353 rb_bufsz = drm_order(rdev->ih.ring_size / 4);
4355 ih_rb_cntl = (IH_WPTR_OVERFLOW_ENABLE |
4356 IH_WPTR_OVERFLOW_CLEAR |
4359 if (rdev->wb.enabled)
4360 ih_rb_cntl |= IH_WPTR_WRITEBACK_ENABLE;
4362 /* set the writeback address whether it's enabled or not */
4363 WREG32(IH_RB_WPTR_ADDR_LO, (rdev->wb.gpu_addr + R600_WB_IH_WPTR_OFFSET) & 0xFFFFFFFC);
4364 WREG32(IH_RB_WPTR_ADDR_HI, upper_32_bits(rdev->wb.gpu_addr + R600_WB_IH_WPTR_OFFSET) & 0xFF);
4366 WREG32(IH_RB_CNTL, ih_rb_cntl);
4368 /* set rptr, wptr to 0 */
4369 WREG32(IH_RB_RPTR, 0);
4370 WREG32(IH_RB_WPTR, 0);
4372 /* Default settings for IH_CNTL (disabled at first) */
4373 ih_cntl = MC_WRREQ_CREDIT(0x10) | MC_WR_CLEAN_CNT(0x10) | MC_VMID(0);
4374 /* RPTR_REARM only works if msi's are enabled */
4375 if (rdev->msi_enabled)
4376 ih_cntl |= RPTR_REARM;
4377 WREG32(IH_CNTL, ih_cntl);
4379 /* force the active interrupt state to all disabled */
4380 si_disable_interrupt_state(rdev);
4382 pci_set_master(rdev->pdev);
4385 si_enable_interrupts(rdev);
4390 int si_irq_set(struct radeon_device *rdev)
4392 u32 cp_int_cntl = CNTX_BUSY_INT_ENABLE | CNTX_EMPTY_INT_ENABLE;
4393 u32 cp_int_cntl1 = 0, cp_int_cntl2 = 0;
4394 u32 crtc1 = 0, crtc2 = 0, crtc3 = 0, crtc4 = 0, crtc5 = 0, crtc6 = 0;
4395 u32 hpd1 = 0, hpd2 = 0, hpd3 = 0, hpd4 = 0, hpd5 = 0, hpd6 = 0;
4396 u32 grbm_int_cntl = 0;
4397 u32 grph1 = 0, grph2 = 0, grph3 = 0, grph4 = 0, grph5 = 0, grph6 = 0;
4398 u32 dma_cntl, dma_cntl1;
4400 if (!rdev->irq.installed) {
4401 WARN(1, "Can't enable IRQ/MSI because no handler is installed\n");
4404 /* don't enable anything if the ih is disabled */
4405 if (!rdev->ih.enabled) {
4406 si_disable_interrupts(rdev);
4407 /* force the active interrupt state to all disabled */
4408 si_disable_interrupt_state(rdev);
4412 if (!ASIC_IS_NODCE(rdev)) {
4413 hpd1 = RREG32(DC_HPD1_INT_CONTROL) & ~DC_HPDx_INT_EN;
4414 hpd2 = RREG32(DC_HPD2_INT_CONTROL) & ~DC_HPDx_INT_EN;
4415 hpd3 = RREG32(DC_HPD3_INT_CONTROL) & ~DC_HPDx_INT_EN;
4416 hpd4 = RREG32(DC_HPD4_INT_CONTROL) & ~DC_HPDx_INT_EN;
4417 hpd5 = RREG32(DC_HPD5_INT_CONTROL) & ~DC_HPDx_INT_EN;
4418 hpd6 = RREG32(DC_HPD6_INT_CONTROL) & ~DC_HPDx_INT_EN;
4421 dma_cntl = RREG32(DMA_CNTL + DMA0_REGISTER_OFFSET) & ~TRAP_ENABLE;
4422 dma_cntl1 = RREG32(DMA_CNTL + DMA1_REGISTER_OFFSET) & ~TRAP_ENABLE;
4424 /* enable CP interrupts on all rings */
4425 if (atomic_read(&rdev->irq.ring_int[RADEON_RING_TYPE_GFX_INDEX])) {
4426 DRM_DEBUG("si_irq_set: sw int gfx\n");
4427 cp_int_cntl |= TIME_STAMP_INT_ENABLE;
4429 if (atomic_read(&rdev->irq.ring_int[CAYMAN_RING_TYPE_CP1_INDEX])) {
4430 DRM_DEBUG("si_irq_set: sw int cp1\n");
4431 cp_int_cntl1 |= TIME_STAMP_INT_ENABLE;
4433 if (atomic_read(&rdev->irq.ring_int[CAYMAN_RING_TYPE_CP2_INDEX])) {
4434 DRM_DEBUG("si_irq_set: sw int cp2\n");
4435 cp_int_cntl2 |= TIME_STAMP_INT_ENABLE;
4437 if (atomic_read(&rdev->irq.ring_int[R600_RING_TYPE_DMA_INDEX])) {
4438 DRM_DEBUG("si_irq_set: sw int dma\n");
4439 dma_cntl |= TRAP_ENABLE;
4442 if (atomic_read(&rdev->irq.ring_int[CAYMAN_RING_TYPE_DMA1_INDEX])) {
4443 DRM_DEBUG("si_irq_set: sw int dma1\n");
4444 dma_cntl1 |= TRAP_ENABLE;
4446 if (rdev->irq.crtc_vblank_int[0] ||
4447 atomic_read(&rdev->irq.pflip[0])) {
4448 DRM_DEBUG("si_irq_set: vblank 0\n");
4449 crtc1 |= VBLANK_INT_MASK;
4451 if (rdev->irq.crtc_vblank_int[1] ||
4452 atomic_read(&rdev->irq.pflip[1])) {
4453 DRM_DEBUG("si_irq_set: vblank 1\n");
4454 crtc2 |= VBLANK_INT_MASK;
4456 if (rdev->irq.crtc_vblank_int[2] ||
4457 atomic_read(&rdev->irq.pflip[2])) {
4458 DRM_DEBUG("si_irq_set: vblank 2\n");
4459 crtc3 |= VBLANK_INT_MASK;
4461 if (rdev->irq.crtc_vblank_int[3] ||
4462 atomic_read(&rdev->irq.pflip[3])) {
4463 DRM_DEBUG("si_irq_set: vblank 3\n");
4464 crtc4 |= VBLANK_INT_MASK;
4466 if (rdev->irq.crtc_vblank_int[4] ||
4467 atomic_read(&rdev->irq.pflip[4])) {
4468 DRM_DEBUG("si_irq_set: vblank 4\n");
4469 crtc5 |= VBLANK_INT_MASK;
4471 if (rdev->irq.crtc_vblank_int[5] ||
4472 atomic_read(&rdev->irq.pflip[5])) {
4473 DRM_DEBUG("si_irq_set: vblank 5\n");
4474 crtc6 |= VBLANK_INT_MASK;
4476 if (rdev->irq.hpd[0]) {
4477 DRM_DEBUG("si_irq_set: hpd 1\n");
4478 hpd1 |= DC_HPDx_INT_EN;
4480 if (rdev->irq.hpd[1]) {
4481 DRM_DEBUG("si_irq_set: hpd 2\n");
4482 hpd2 |= DC_HPDx_INT_EN;
4484 if (rdev->irq.hpd[2]) {
4485 DRM_DEBUG("si_irq_set: hpd 3\n");
4486 hpd3 |= DC_HPDx_INT_EN;
4488 if (rdev->irq.hpd[3]) {
4489 DRM_DEBUG("si_irq_set: hpd 4\n");
4490 hpd4 |= DC_HPDx_INT_EN;
4492 if (rdev->irq.hpd[4]) {
4493 DRM_DEBUG("si_irq_set: hpd 5\n");
4494 hpd5 |= DC_HPDx_INT_EN;
4496 if (rdev->irq.hpd[5]) {
4497 DRM_DEBUG("si_irq_set: hpd 6\n");
4498 hpd6 |= DC_HPDx_INT_EN;
4501 WREG32(CP_INT_CNTL_RING0, cp_int_cntl);
4502 WREG32(CP_INT_CNTL_RING1, cp_int_cntl1);
4503 WREG32(CP_INT_CNTL_RING2, cp_int_cntl2);
4505 WREG32(DMA_CNTL + DMA0_REGISTER_OFFSET, dma_cntl);
4506 WREG32(DMA_CNTL + DMA1_REGISTER_OFFSET, dma_cntl1);
4508 WREG32(GRBM_INT_CNTL, grbm_int_cntl);
4510 if (rdev->num_crtc >= 2) {
4511 WREG32(INT_MASK + EVERGREEN_CRTC0_REGISTER_OFFSET, crtc1);
4512 WREG32(INT_MASK + EVERGREEN_CRTC1_REGISTER_OFFSET, crtc2);
4514 if (rdev->num_crtc >= 4) {
4515 WREG32(INT_MASK + EVERGREEN_CRTC2_REGISTER_OFFSET, crtc3);
4516 WREG32(INT_MASK + EVERGREEN_CRTC3_REGISTER_OFFSET, crtc4);
4518 if (rdev->num_crtc >= 6) {
4519 WREG32(INT_MASK + EVERGREEN_CRTC4_REGISTER_OFFSET, crtc5);
4520 WREG32(INT_MASK + EVERGREEN_CRTC5_REGISTER_OFFSET, crtc6);
4523 if (rdev->num_crtc >= 2) {
4524 WREG32(GRPH_INT_CONTROL + EVERGREEN_CRTC0_REGISTER_OFFSET, grph1);
4525 WREG32(GRPH_INT_CONTROL + EVERGREEN_CRTC1_REGISTER_OFFSET, grph2);
4527 if (rdev->num_crtc >= 4) {
4528 WREG32(GRPH_INT_CONTROL + EVERGREEN_CRTC2_REGISTER_OFFSET, grph3);
4529 WREG32(GRPH_INT_CONTROL + EVERGREEN_CRTC3_REGISTER_OFFSET, grph4);
4531 if (rdev->num_crtc >= 6) {
4532 WREG32(GRPH_INT_CONTROL + EVERGREEN_CRTC4_REGISTER_OFFSET, grph5);
4533 WREG32(GRPH_INT_CONTROL + EVERGREEN_CRTC5_REGISTER_OFFSET, grph6);
4536 if (!ASIC_IS_NODCE(rdev)) {
4537 WREG32(DC_HPD1_INT_CONTROL, hpd1);
4538 WREG32(DC_HPD2_INT_CONTROL, hpd2);
4539 WREG32(DC_HPD3_INT_CONTROL, hpd3);
4540 WREG32(DC_HPD4_INT_CONTROL, hpd4);
4541 WREG32(DC_HPD5_INT_CONTROL, hpd5);
4542 WREG32(DC_HPD6_INT_CONTROL, hpd6);
4548 static inline void si_irq_ack(struct radeon_device *rdev)
4552 if (ASIC_IS_NODCE(rdev))
4555 rdev->irq.stat_regs.evergreen.disp_int = RREG32(DISP_INTERRUPT_STATUS);
4556 rdev->irq.stat_regs.evergreen.disp_int_cont = RREG32(DISP_INTERRUPT_STATUS_CONTINUE);
4557 rdev->irq.stat_regs.evergreen.disp_int_cont2 = RREG32(DISP_INTERRUPT_STATUS_CONTINUE2);
4558 rdev->irq.stat_regs.evergreen.disp_int_cont3 = RREG32(DISP_INTERRUPT_STATUS_CONTINUE3);
4559 rdev->irq.stat_regs.evergreen.disp_int_cont4 = RREG32(DISP_INTERRUPT_STATUS_CONTINUE4);
4560 rdev->irq.stat_regs.evergreen.disp_int_cont5 = RREG32(DISP_INTERRUPT_STATUS_CONTINUE5);
4561 rdev->irq.stat_regs.evergreen.d1grph_int = RREG32(GRPH_INT_STATUS + EVERGREEN_CRTC0_REGISTER_OFFSET);
4562 rdev->irq.stat_regs.evergreen.d2grph_int = RREG32(GRPH_INT_STATUS + EVERGREEN_CRTC1_REGISTER_OFFSET);
4563 if (rdev->num_crtc >= 4) {
4564 rdev->irq.stat_regs.evergreen.d3grph_int = RREG32(GRPH_INT_STATUS + EVERGREEN_CRTC2_REGISTER_OFFSET);
4565 rdev->irq.stat_regs.evergreen.d4grph_int = RREG32(GRPH_INT_STATUS + EVERGREEN_CRTC3_REGISTER_OFFSET);
4567 if (rdev->num_crtc >= 6) {
4568 rdev->irq.stat_regs.evergreen.d5grph_int = RREG32(GRPH_INT_STATUS + EVERGREEN_CRTC4_REGISTER_OFFSET);
4569 rdev->irq.stat_regs.evergreen.d6grph_int = RREG32(GRPH_INT_STATUS + EVERGREEN_CRTC5_REGISTER_OFFSET);
4572 if (rdev->irq.stat_regs.evergreen.d1grph_int & GRPH_PFLIP_INT_OCCURRED)
4573 WREG32(GRPH_INT_STATUS + EVERGREEN_CRTC0_REGISTER_OFFSET, GRPH_PFLIP_INT_CLEAR);
4574 if (rdev->irq.stat_regs.evergreen.d2grph_int & GRPH_PFLIP_INT_OCCURRED)
4575 WREG32(GRPH_INT_STATUS + EVERGREEN_CRTC1_REGISTER_OFFSET, GRPH_PFLIP_INT_CLEAR);
4576 if (rdev->irq.stat_regs.evergreen.disp_int & LB_D1_VBLANK_INTERRUPT)
4577 WREG32(VBLANK_STATUS + EVERGREEN_CRTC0_REGISTER_OFFSET, VBLANK_ACK);
4578 if (rdev->irq.stat_regs.evergreen.disp_int & LB_D1_VLINE_INTERRUPT)
4579 WREG32(VLINE_STATUS + EVERGREEN_CRTC0_REGISTER_OFFSET, VLINE_ACK);
4580 if (rdev->irq.stat_regs.evergreen.disp_int_cont & LB_D2_VBLANK_INTERRUPT)
4581 WREG32(VBLANK_STATUS + EVERGREEN_CRTC1_REGISTER_OFFSET, VBLANK_ACK);
4582 if (rdev->irq.stat_regs.evergreen.disp_int_cont & LB_D2_VLINE_INTERRUPT)
4583 WREG32(VLINE_STATUS + EVERGREEN_CRTC1_REGISTER_OFFSET, VLINE_ACK);
4585 if (rdev->num_crtc >= 4) {
4586 if (rdev->irq.stat_regs.evergreen.d3grph_int & GRPH_PFLIP_INT_OCCURRED)
4587 WREG32(GRPH_INT_STATUS + EVERGREEN_CRTC2_REGISTER_OFFSET, GRPH_PFLIP_INT_CLEAR);
4588 if (rdev->irq.stat_regs.evergreen.d4grph_int & GRPH_PFLIP_INT_OCCURRED)
4589 WREG32(GRPH_INT_STATUS + EVERGREEN_CRTC3_REGISTER_OFFSET, GRPH_PFLIP_INT_CLEAR);
4590 if (rdev->irq.stat_regs.evergreen.disp_int_cont2 & LB_D3_VBLANK_INTERRUPT)
4591 WREG32(VBLANK_STATUS + EVERGREEN_CRTC2_REGISTER_OFFSET, VBLANK_ACK);
4592 if (rdev->irq.stat_regs.evergreen.disp_int_cont2 & LB_D3_VLINE_INTERRUPT)
4593 WREG32(VLINE_STATUS + EVERGREEN_CRTC2_REGISTER_OFFSET, VLINE_ACK);
4594 if (rdev->irq.stat_regs.evergreen.disp_int_cont3 & LB_D4_VBLANK_INTERRUPT)
4595 WREG32(VBLANK_STATUS + EVERGREEN_CRTC3_REGISTER_OFFSET, VBLANK_ACK);
4596 if (rdev->irq.stat_regs.evergreen.disp_int_cont3 & LB_D4_VLINE_INTERRUPT)
4597 WREG32(VLINE_STATUS + EVERGREEN_CRTC3_REGISTER_OFFSET, VLINE_ACK);
4600 if (rdev->num_crtc >= 6) {
4601 if (rdev->irq.stat_regs.evergreen.d5grph_int & GRPH_PFLIP_INT_OCCURRED)
4602 WREG32(GRPH_INT_STATUS + EVERGREEN_CRTC4_REGISTER_OFFSET, GRPH_PFLIP_INT_CLEAR);
4603 if (rdev->irq.stat_regs.evergreen.d6grph_int & GRPH_PFLIP_INT_OCCURRED)
4604 WREG32(GRPH_INT_STATUS + EVERGREEN_CRTC5_REGISTER_OFFSET, GRPH_PFLIP_INT_CLEAR);
4605 if (rdev->irq.stat_regs.evergreen.disp_int_cont4 & LB_D5_VBLANK_INTERRUPT)
4606 WREG32(VBLANK_STATUS + EVERGREEN_CRTC4_REGISTER_OFFSET, VBLANK_ACK);
4607 if (rdev->irq.stat_regs.evergreen.disp_int_cont4 & LB_D5_VLINE_INTERRUPT)
4608 WREG32(VLINE_STATUS + EVERGREEN_CRTC4_REGISTER_OFFSET, VLINE_ACK);
4609 if (rdev->irq.stat_regs.evergreen.disp_int_cont5 & LB_D6_VBLANK_INTERRUPT)
4610 WREG32(VBLANK_STATUS + EVERGREEN_CRTC5_REGISTER_OFFSET, VBLANK_ACK);
4611 if (rdev->irq.stat_regs.evergreen.disp_int_cont5 & LB_D6_VLINE_INTERRUPT)
4612 WREG32(VLINE_STATUS + EVERGREEN_CRTC5_REGISTER_OFFSET, VLINE_ACK);
4615 if (rdev->irq.stat_regs.evergreen.disp_int & DC_HPD1_INTERRUPT) {
4616 tmp = RREG32(DC_HPD1_INT_CONTROL);
4617 tmp |= DC_HPDx_INT_ACK;
4618 WREG32(DC_HPD1_INT_CONTROL, tmp);
4620 if (rdev->irq.stat_regs.evergreen.disp_int_cont & DC_HPD2_INTERRUPT) {
4621 tmp = RREG32(DC_HPD2_INT_CONTROL);
4622 tmp |= DC_HPDx_INT_ACK;
4623 WREG32(DC_HPD2_INT_CONTROL, tmp);
4625 if (rdev->irq.stat_regs.evergreen.disp_int_cont2 & DC_HPD3_INTERRUPT) {
4626 tmp = RREG32(DC_HPD3_INT_CONTROL);
4627 tmp |= DC_HPDx_INT_ACK;
4628 WREG32(DC_HPD3_INT_CONTROL, tmp);
4630 if (rdev->irq.stat_regs.evergreen.disp_int_cont3 & DC_HPD4_INTERRUPT) {
4631 tmp = RREG32(DC_HPD4_INT_CONTROL);
4632 tmp |= DC_HPDx_INT_ACK;
4633 WREG32(DC_HPD4_INT_CONTROL, tmp);
4635 if (rdev->irq.stat_regs.evergreen.disp_int_cont4 & DC_HPD5_INTERRUPT) {
4636 tmp = RREG32(DC_HPD5_INT_CONTROL);
4637 tmp |= DC_HPDx_INT_ACK;
4638 WREG32(DC_HPD5_INT_CONTROL, tmp);
4640 if (rdev->irq.stat_regs.evergreen.disp_int_cont5 & DC_HPD6_INTERRUPT) {
4641 tmp = RREG32(DC_HPD5_INT_CONTROL);
4642 tmp |= DC_HPDx_INT_ACK;
4643 WREG32(DC_HPD6_INT_CONTROL, tmp);
4647 static void si_irq_disable(struct radeon_device *rdev)
4649 si_disable_interrupts(rdev);
4650 /* Wait and acknowledge irq */
4653 si_disable_interrupt_state(rdev);
4656 static void si_irq_suspend(struct radeon_device *rdev)
4658 si_irq_disable(rdev);
4662 static void si_irq_fini(struct radeon_device *rdev)
4664 si_irq_suspend(rdev);
4665 r600_ih_ring_fini(rdev);
4668 static inline u32 si_get_ih_wptr(struct radeon_device *rdev)
4672 if (rdev->wb.enabled)
4673 wptr = le32_to_cpu(rdev->wb.wb[R600_WB_IH_WPTR_OFFSET/4]);
4675 wptr = RREG32(IH_RB_WPTR);
4677 if (wptr & RB_OVERFLOW) {
4678 /* When a ring buffer overflow happen start parsing interrupt
4679 * from the last not overwritten vector (wptr + 16). Hopefully
4680 * this should allow us to catchup.
4682 dev_warn(rdev->dev, "IH ring buffer overflow (0x%08X, %d, %d)\n",
4683 wptr, rdev->ih.rptr, (wptr + 16) + rdev->ih.ptr_mask);
4684 rdev->ih.rptr = (wptr + 16) & rdev->ih.ptr_mask;
4685 tmp = RREG32(IH_RB_CNTL);
4686 tmp |= IH_WPTR_OVERFLOW_CLEAR;
4687 WREG32(IH_RB_CNTL, tmp);
4689 return (wptr & rdev->ih.ptr_mask);
4693 * Each IV ring entry is 128 bits:
4694 * [7:0] - interrupt source id
4696 * [59:32] - interrupt source data
4697 * [63:60] - reserved
4700 * [127:80] - reserved
4702 int si_irq_process(struct radeon_device *rdev)
4706 u32 src_id, src_data, ring_id;
4708 bool queue_hotplug = false;
4710 if (!rdev->ih.enabled || rdev->shutdown)
4713 wptr = si_get_ih_wptr(rdev);
4716 /* is somebody else already processing irqs? */
4717 if (atomic_xchg(&rdev->ih.lock, 1))
4720 rptr = rdev->ih.rptr;
4721 DRM_DEBUG("si_irq_process start: rptr %d, wptr %d\n", rptr, wptr);
4723 /* Order reading of wptr vs. reading of IH ring data */
4726 /* display interrupts */
4729 while (rptr != wptr) {
4730 /* wptr/rptr are in bytes! */
4731 ring_index = rptr / 4;
4732 src_id = le32_to_cpu(rdev->ih.ring[ring_index]) & 0xff;
4733 src_data = le32_to_cpu(rdev->ih.ring[ring_index + 1]) & 0xfffffff;
4734 ring_id = le32_to_cpu(rdev->ih.ring[ring_index + 2]) & 0xff;
4737 case 1: /* D1 vblank/vline */
4739 case 0: /* D1 vblank */
4740 if (rdev->irq.stat_regs.evergreen.disp_int & LB_D1_VBLANK_INTERRUPT) {
4741 if (rdev->irq.crtc_vblank_int[0]) {
4742 drm_handle_vblank(rdev->ddev, 0);
4743 rdev->pm.vblank_sync = true;
4744 wake_up(&rdev->irq.vblank_queue);
4746 if (atomic_read(&rdev->irq.pflip[0]))
4747 radeon_crtc_handle_flip(rdev, 0);
4748 rdev->irq.stat_regs.evergreen.disp_int &= ~LB_D1_VBLANK_INTERRUPT;
4749 DRM_DEBUG("IH: D1 vblank\n");
4752 case 1: /* D1 vline */
4753 if (rdev->irq.stat_regs.evergreen.disp_int & LB_D1_VLINE_INTERRUPT) {
4754 rdev->irq.stat_regs.evergreen.disp_int &= ~LB_D1_VLINE_INTERRUPT;
4755 DRM_DEBUG("IH: D1 vline\n");
4759 DRM_DEBUG("Unhandled interrupt: %d %d\n", src_id, src_data);
4763 case 2: /* D2 vblank/vline */
4765 case 0: /* D2 vblank */
4766 if (rdev->irq.stat_regs.evergreen.disp_int_cont & LB_D2_VBLANK_INTERRUPT) {
4767 if (rdev->irq.crtc_vblank_int[1]) {
4768 drm_handle_vblank(rdev->ddev, 1);
4769 rdev->pm.vblank_sync = true;
4770 wake_up(&rdev->irq.vblank_queue);
4772 if (atomic_read(&rdev->irq.pflip[1]))
4773 radeon_crtc_handle_flip(rdev, 1);
4774 rdev->irq.stat_regs.evergreen.disp_int_cont &= ~LB_D2_VBLANK_INTERRUPT;
4775 DRM_DEBUG("IH: D2 vblank\n");
4778 case 1: /* D2 vline */
4779 if (rdev->irq.stat_regs.evergreen.disp_int_cont & LB_D2_VLINE_INTERRUPT) {
4780 rdev->irq.stat_regs.evergreen.disp_int_cont &= ~LB_D2_VLINE_INTERRUPT;
4781 DRM_DEBUG("IH: D2 vline\n");
4785 DRM_DEBUG("Unhandled interrupt: %d %d\n", src_id, src_data);
4789 case 3: /* D3 vblank/vline */
4791 case 0: /* D3 vblank */
4792 if (rdev->irq.stat_regs.evergreen.disp_int_cont2 & LB_D3_VBLANK_INTERRUPT) {
4793 if (rdev->irq.crtc_vblank_int[2]) {
4794 drm_handle_vblank(rdev->ddev, 2);
4795 rdev->pm.vblank_sync = true;
4796 wake_up(&rdev->irq.vblank_queue);
4798 if (atomic_read(&rdev->irq.pflip[2]))
4799 radeon_crtc_handle_flip(rdev, 2);
4800 rdev->irq.stat_regs.evergreen.disp_int_cont2 &= ~LB_D3_VBLANK_INTERRUPT;
4801 DRM_DEBUG("IH: D3 vblank\n");
4804 case 1: /* D3 vline */
4805 if (rdev->irq.stat_regs.evergreen.disp_int_cont2 & LB_D3_VLINE_INTERRUPT) {
4806 rdev->irq.stat_regs.evergreen.disp_int_cont2 &= ~LB_D3_VLINE_INTERRUPT;
4807 DRM_DEBUG("IH: D3 vline\n");
4811 DRM_DEBUG("Unhandled interrupt: %d %d\n", src_id, src_data);
4815 case 4: /* D4 vblank/vline */
4817 case 0: /* D4 vblank */
4818 if (rdev->irq.stat_regs.evergreen.disp_int_cont3 & LB_D4_VBLANK_INTERRUPT) {
4819 if (rdev->irq.crtc_vblank_int[3]) {
4820 drm_handle_vblank(rdev->ddev, 3);
4821 rdev->pm.vblank_sync = true;
4822 wake_up(&rdev->irq.vblank_queue);
4824 if (atomic_read(&rdev->irq.pflip[3]))
4825 radeon_crtc_handle_flip(rdev, 3);
4826 rdev->irq.stat_regs.evergreen.disp_int_cont3 &= ~LB_D4_VBLANK_INTERRUPT;
4827 DRM_DEBUG("IH: D4 vblank\n");
4830 case 1: /* D4 vline */
4831 if (rdev->irq.stat_regs.evergreen.disp_int_cont3 & LB_D4_VLINE_INTERRUPT) {
4832 rdev->irq.stat_regs.evergreen.disp_int_cont3 &= ~LB_D4_VLINE_INTERRUPT;
4833 DRM_DEBUG("IH: D4 vline\n");
4837 DRM_DEBUG("Unhandled interrupt: %d %d\n", src_id, src_data);
4841 case 5: /* D5 vblank/vline */
4843 case 0: /* D5 vblank */
4844 if (rdev->irq.stat_regs.evergreen.disp_int_cont4 & LB_D5_VBLANK_INTERRUPT) {
4845 if (rdev->irq.crtc_vblank_int[4]) {
4846 drm_handle_vblank(rdev->ddev, 4);
4847 rdev->pm.vblank_sync = true;
4848 wake_up(&rdev->irq.vblank_queue);
4850 if (atomic_read(&rdev->irq.pflip[4]))
4851 radeon_crtc_handle_flip(rdev, 4);
4852 rdev->irq.stat_regs.evergreen.disp_int_cont4 &= ~LB_D5_VBLANK_INTERRUPT;
4853 DRM_DEBUG("IH: D5 vblank\n");
4856 case 1: /* D5 vline */
4857 if (rdev->irq.stat_regs.evergreen.disp_int_cont4 & LB_D5_VLINE_INTERRUPT) {
4858 rdev->irq.stat_regs.evergreen.disp_int_cont4 &= ~LB_D5_VLINE_INTERRUPT;
4859 DRM_DEBUG("IH: D5 vline\n");
4863 DRM_DEBUG("Unhandled interrupt: %d %d\n", src_id, src_data);
4867 case 6: /* D6 vblank/vline */
4869 case 0: /* D6 vblank */
4870 if (rdev->irq.stat_regs.evergreen.disp_int_cont5 & LB_D6_VBLANK_INTERRUPT) {
4871 if (rdev->irq.crtc_vblank_int[5]) {
4872 drm_handle_vblank(rdev->ddev, 5);
4873 rdev->pm.vblank_sync = true;
4874 wake_up(&rdev->irq.vblank_queue);
4876 if (atomic_read(&rdev->irq.pflip[5]))
4877 radeon_crtc_handle_flip(rdev, 5);
4878 rdev->irq.stat_regs.evergreen.disp_int_cont5 &= ~LB_D6_VBLANK_INTERRUPT;
4879 DRM_DEBUG("IH: D6 vblank\n");
4882 case 1: /* D6 vline */
4883 if (rdev->irq.stat_regs.evergreen.disp_int_cont5 & LB_D6_VLINE_INTERRUPT) {
4884 rdev->irq.stat_regs.evergreen.disp_int_cont5 &= ~LB_D6_VLINE_INTERRUPT;
4885 DRM_DEBUG("IH: D6 vline\n");
4889 DRM_DEBUG("Unhandled interrupt: %d %d\n", src_id, src_data);
4893 case 42: /* HPD hotplug */
4896 if (rdev->irq.stat_regs.evergreen.disp_int & DC_HPD1_INTERRUPT) {
4897 rdev->irq.stat_regs.evergreen.disp_int &= ~DC_HPD1_INTERRUPT;
4898 queue_hotplug = true;
4899 DRM_DEBUG("IH: HPD1\n");
4903 if (rdev->irq.stat_regs.evergreen.disp_int_cont & DC_HPD2_INTERRUPT) {
4904 rdev->irq.stat_regs.evergreen.disp_int_cont &= ~DC_HPD2_INTERRUPT;
4905 queue_hotplug = true;
4906 DRM_DEBUG("IH: HPD2\n");
4910 if (rdev->irq.stat_regs.evergreen.disp_int_cont2 & DC_HPD3_INTERRUPT) {
4911 rdev->irq.stat_regs.evergreen.disp_int_cont2 &= ~DC_HPD3_INTERRUPT;
4912 queue_hotplug = true;
4913 DRM_DEBUG("IH: HPD3\n");
4917 if (rdev->irq.stat_regs.evergreen.disp_int_cont3 & DC_HPD4_INTERRUPT) {
4918 rdev->irq.stat_regs.evergreen.disp_int_cont3 &= ~DC_HPD4_INTERRUPT;
4919 queue_hotplug = true;
4920 DRM_DEBUG("IH: HPD4\n");
4924 if (rdev->irq.stat_regs.evergreen.disp_int_cont4 & DC_HPD5_INTERRUPT) {
4925 rdev->irq.stat_regs.evergreen.disp_int_cont4 &= ~DC_HPD5_INTERRUPT;
4926 queue_hotplug = true;
4927 DRM_DEBUG("IH: HPD5\n");
4931 if (rdev->irq.stat_regs.evergreen.disp_int_cont5 & DC_HPD6_INTERRUPT) {
4932 rdev->irq.stat_regs.evergreen.disp_int_cont5 &= ~DC_HPD6_INTERRUPT;
4933 queue_hotplug = true;
4934 DRM_DEBUG("IH: HPD6\n");
4938 DRM_DEBUG("Unhandled interrupt: %d %d\n", src_id, src_data);
4944 dev_err(rdev->dev, "GPU fault detected: %d 0x%08x\n", src_id, src_data);
4945 dev_err(rdev->dev, " VM_CONTEXT1_PROTECTION_FAULT_ADDR 0x%08X\n",
4946 RREG32(VM_CONTEXT1_PROTECTION_FAULT_ADDR));
4947 dev_err(rdev->dev, " VM_CONTEXT1_PROTECTION_FAULT_STATUS 0x%08X\n",
4948 RREG32(VM_CONTEXT1_PROTECTION_FAULT_STATUS));
4949 /* reset addr and status */
4950 WREG32_P(VM_CONTEXT1_CNTL2, 1, ~1);
4952 case 176: /* RINGID0 CP_INT */
4953 radeon_fence_process(rdev, RADEON_RING_TYPE_GFX_INDEX);
4955 case 177: /* RINGID1 CP_INT */
4956 radeon_fence_process(rdev, CAYMAN_RING_TYPE_CP1_INDEX);
4958 case 178: /* RINGID2 CP_INT */
4959 radeon_fence_process(rdev, CAYMAN_RING_TYPE_CP2_INDEX);
4961 case 181: /* CP EOP event */
4962 DRM_DEBUG("IH: CP EOP\n");
4965 radeon_fence_process(rdev, RADEON_RING_TYPE_GFX_INDEX);
4968 radeon_fence_process(rdev, CAYMAN_RING_TYPE_CP1_INDEX);
4971 radeon_fence_process(rdev, CAYMAN_RING_TYPE_CP2_INDEX);
4975 case 224: /* DMA trap event */
4976 DRM_DEBUG("IH: DMA trap\n");
4977 radeon_fence_process(rdev, R600_RING_TYPE_DMA_INDEX);
4979 case 233: /* GUI IDLE */
4980 DRM_DEBUG("IH: GUI idle\n");
4982 case 244: /* DMA trap event */
4983 DRM_DEBUG("IH: DMA1 trap\n");
4984 radeon_fence_process(rdev, CAYMAN_RING_TYPE_DMA1_INDEX);
4987 DRM_DEBUG("Unhandled interrupt: %d %d\n", src_id, src_data);
4991 /* wptr/rptr are in bytes! */
4993 rptr &= rdev->ih.ptr_mask;
4996 schedule_work(&rdev->hotplug_work);
4997 rdev->ih.rptr = rptr;
4998 WREG32(IH_RB_RPTR, rdev->ih.rptr);
4999 atomic_set(&rdev->ih.lock, 0);
5001 /* make sure wptr hasn't changed while processing */
5002 wptr = si_get_ih_wptr(rdev);
5010 * si_copy_dma - copy pages using the DMA engine
5012 * @rdev: radeon_device pointer
5013 * @src_offset: src GPU address
5014 * @dst_offset: dst GPU address
5015 * @num_gpu_pages: number of GPU pages to xfer
5016 * @fence: radeon fence object
5018 * Copy GPU paging using the DMA engine (SI).
5019 * Used by the radeon ttm implementation to move pages if
5020 * registered as the asic copy callback.
5022 int si_copy_dma(struct radeon_device *rdev,
5023 uint64_t src_offset, uint64_t dst_offset,
5024 unsigned num_gpu_pages,
5025 struct radeon_fence **fence)
5027 struct radeon_semaphore *sem = NULL;
5028 int ring_index = rdev->asic->copy.dma_ring_index;
5029 struct radeon_ring *ring = &rdev->ring[ring_index];
5030 u32 size_in_bytes, cur_size_in_bytes;
5034 r = radeon_semaphore_create(rdev, &sem);
5036 DRM_ERROR("radeon: moving bo (%d).\n", r);
5040 size_in_bytes = (num_gpu_pages << RADEON_GPU_PAGE_SHIFT);
5041 num_loops = DIV_ROUND_UP(size_in_bytes, 0xfffff);
5042 r = radeon_ring_lock(rdev, ring, num_loops * 5 + 11);
5044 DRM_ERROR("radeon: moving bo (%d).\n", r);
5045 radeon_semaphore_free(rdev, &sem, NULL);
5049 if (radeon_fence_need_sync(*fence, ring->idx)) {
5050 radeon_semaphore_sync_rings(rdev, sem, (*fence)->ring,
5052 radeon_fence_note_sync(*fence, ring->idx);
5054 radeon_semaphore_free(rdev, &sem, NULL);
5057 for (i = 0; i < num_loops; i++) {
5058 cur_size_in_bytes = size_in_bytes;
5059 if (cur_size_in_bytes > 0xFFFFF)
5060 cur_size_in_bytes = 0xFFFFF;
5061 size_in_bytes -= cur_size_in_bytes;
5062 radeon_ring_write(ring, DMA_PACKET(DMA_PACKET_COPY, 1, 0, 0, cur_size_in_bytes));
5063 radeon_ring_write(ring, dst_offset & 0xffffffff);
5064 radeon_ring_write(ring, src_offset & 0xffffffff);
5065 radeon_ring_write(ring, upper_32_bits(dst_offset) & 0xff);
5066 radeon_ring_write(ring, upper_32_bits(src_offset) & 0xff);
5067 src_offset += cur_size_in_bytes;
5068 dst_offset += cur_size_in_bytes;
5071 r = radeon_fence_emit(rdev, fence, ring->idx);
5073 radeon_ring_unlock_undo(rdev, ring);
5077 radeon_ring_unlock_commit(rdev, ring);
5078 radeon_semaphore_free(rdev, &sem, *fence);
5084 * startup/shutdown callbacks
5086 static int si_startup(struct radeon_device *rdev)
5088 struct radeon_ring *ring;
5091 if (!rdev->me_fw || !rdev->pfp_fw || !rdev->ce_fw ||
5092 !rdev->rlc_fw || !rdev->mc_fw) {
5093 r = si_init_microcode(rdev);
5095 DRM_ERROR("Failed to load firmware!\n");
5100 r = si_mc_load_microcode(rdev);
5102 DRM_ERROR("Failed to load MC firmware!\n");
5106 r = r600_vram_scratch_init(rdev);
5110 si_mc_program(rdev);
5111 r = si_pcie_gart_enable(rdev);
5116 /* allocate rlc buffers */
5117 r = si_rlc_init(rdev);
5119 DRM_ERROR("Failed to init rlc BOs!\n");
5123 /* allocate wb buffer */
5124 r = radeon_wb_init(rdev);
5128 r = radeon_fence_driver_start_ring(rdev, RADEON_RING_TYPE_GFX_INDEX);
5130 dev_err(rdev->dev, "failed initializing CP fences (%d).\n", r);
5134 r = radeon_fence_driver_start_ring(rdev, CAYMAN_RING_TYPE_CP1_INDEX);
5136 dev_err(rdev->dev, "failed initializing CP fences (%d).\n", r);
5140 r = radeon_fence_driver_start_ring(rdev, CAYMAN_RING_TYPE_CP2_INDEX);
5142 dev_err(rdev->dev, "failed initializing CP fences (%d).\n", r);
5146 r = radeon_fence_driver_start_ring(rdev, R600_RING_TYPE_DMA_INDEX);
5148 dev_err(rdev->dev, "failed initializing DMA fences (%d).\n", r);
5152 r = radeon_fence_driver_start_ring(rdev, CAYMAN_RING_TYPE_DMA1_INDEX);
5154 dev_err(rdev->dev, "failed initializing DMA fences (%d).\n", r);
5158 r = rv770_uvd_resume(rdev);
5160 r = radeon_fence_driver_start_ring(rdev,
5161 R600_RING_TYPE_UVD_INDEX);
5163 dev_err(rdev->dev, "UVD fences init error (%d).\n", r);
5166 rdev->ring[R600_RING_TYPE_UVD_INDEX].ring_size = 0;
5169 r = si_irq_init(rdev);
5171 DRM_ERROR("radeon: IH init failed (%d).\n", r);
5172 radeon_irq_kms_fini(rdev);
5177 ring = &rdev->ring[RADEON_RING_TYPE_GFX_INDEX];
5178 r = radeon_ring_init(rdev, ring, ring->ring_size, RADEON_WB_CP_RPTR_OFFSET,
5179 CP_RB0_RPTR, CP_RB0_WPTR,
5180 0, 0xfffff, RADEON_CP_PACKET2);
5184 ring = &rdev->ring[CAYMAN_RING_TYPE_CP1_INDEX];
5185 r = radeon_ring_init(rdev, ring, ring->ring_size, RADEON_WB_CP1_RPTR_OFFSET,
5186 CP_RB1_RPTR, CP_RB1_WPTR,
5187 0, 0xfffff, RADEON_CP_PACKET2);
5191 ring = &rdev->ring[CAYMAN_RING_TYPE_CP2_INDEX];
5192 r = radeon_ring_init(rdev, ring, ring->ring_size, RADEON_WB_CP2_RPTR_OFFSET,
5193 CP_RB2_RPTR, CP_RB2_WPTR,
5194 0, 0xfffff, RADEON_CP_PACKET2);
5198 ring = &rdev->ring[R600_RING_TYPE_DMA_INDEX];
5199 r = radeon_ring_init(rdev, ring, ring->ring_size, R600_WB_DMA_RPTR_OFFSET,
5200 DMA_RB_RPTR + DMA0_REGISTER_OFFSET,
5201 DMA_RB_WPTR + DMA0_REGISTER_OFFSET,
5202 2, 0x3fffc, DMA_PACKET(DMA_PACKET_NOP, 0, 0, 0, 0));
5206 ring = &rdev->ring[CAYMAN_RING_TYPE_DMA1_INDEX];
5207 r = radeon_ring_init(rdev, ring, ring->ring_size, CAYMAN_WB_DMA1_RPTR_OFFSET,
5208 DMA_RB_RPTR + DMA1_REGISTER_OFFSET,
5209 DMA_RB_WPTR + DMA1_REGISTER_OFFSET,
5210 2, 0x3fffc, DMA_PACKET(DMA_PACKET_NOP, 0, 0, 0, 0));
5214 r = si_cp_load_microcode(rdev);
5217 r = si_cp_resume(rdev);
5221 r = cayman_dma_resume(rdev);
5225 ring = &rdev->ring[R600_RING_TYPE_UVD_INDEX];
5226 if (ring->ring_size) {
5227 r = radeon_ring_init(rdev, ring, ring->ring_size,
5228 R600_WB_UVD_RPTR_OFFSET,
5229 UVD_RBC_RB_RPTR, UVD_RBC_RB_WPTR,
5230 0, 0xfffff, RADEON_CP_PACKET2);
5232 r = r600_uvd_init(rdev);
5234 DRM_ERROR("radeon: failed initializing UVD (%d).\n", r);
5237 r = radeon_ib_pool_init(rdev);
5239 dev_err(rdev->dev, "IB initialization failed (%d).\n", r);
5243 r = radeon_vm_manager_init(rdev);
5245 dev_err(rdev->dev, "vm manager initialization failed (%d).\n", r);
5252 int si_resume(struct radeon_device *rdev)
5256 /* Do not reset GPU before posting, on rv770 hw unlike on r500 hw,
5257 * posting will perform necessary task to bring back GPU into good
5261 atom_asic_init(rdev->mode_info.atom_context);
5263 /* init golden registers */
5264 si_init_golden_registers(rdev);
5266 rdev->accel_working = true;
5267 r = si_startup(rdev);
5269 DRM_ERROR("si startup failed on resume\n");
5270 rdev->accel_working = false;
5278 int si_suspend(struct radeon_device *rdev)
5280 radeon_vm_manager_fini(rdev);
5281 si_cp_enable(rdev, false);
5282 cayman_dma_stop(rdev);
5283 r600_uvd_rbc_stop(rdev);
5284 radeon_uvd_suspend(rdev);
5285 si_irq_suspend(rdev);
5286 radeon_wb_disable(rdev);
5287 si_pcie_gart_disable(rdev);
5291 /* Plan is to move initialization in that function and use
5292 * helper function so that radeon_device_init pretty much
5293 * do nothing more than calling asic specific function. This
5294 * should also allow to remove a bunch of callback function
5297 int si_init(struct radeon_device *rdev)
5299 struct radeon_ring *ring = &rdev->ring[RADEON_RING_TYPE_GFX_INDEX];
5303 if (!radeon_get_bios(rdev)) {
5304 if (ASIC_IS_AVIVO(rdev))
5307 /* Must be an ATOMBIOS */
5308 if (!rdev->is_atom_bios) {
5309 dev_err(rdev->dev, "Expecting atombios for cayman GPU\n");
5312 r = radeon_atombios_init(rdev);
5316 /* Post card if necessary */
5317 if (!radeon_card_posted(rdev)) {
5319 dev_err(rdev->dev, "Card not posted and no BIOS - ignoring\n");
5322 DRM_INFO("GPU not posted. posting now...\n");
5323 atom_asic_init(rdev->mode_info.atom_context);
5325 /* init golden registers */
5326 si_init_golden_registers(rdev);
5327 /* Initialize scratch registers */
5328 si_scratch_init(rdev);
5329 /* Initialize surface registers */
5330 radeon_surface_init(rdev);
5331 /* Initialize clocks */
5332 radeon_get_clock_info(rdev->ddev);
5335 r = radeon_fence_driver_init(rdev);
5339 /* initialize memory controller */
5340 r = si_mc_init(rdev);
5343 /* Memory manager */
5344 r = radeon_bo_init(rdev);
5348 r = radeon_irq_kms_init(rdev);
5352 ring = &rdev->ring[RADEON_RING_TYPE_GFX_INDEX];
5353 ring->ring_obj = NULL;
5354 r600_ring_init(rdev, ring, 1024 * 1024);
5356 ring = &rdev->ring[CAYMAN_RING_TYPE_CP1_INDEX];
5357 ring->ring_obj = NULL;
5358 r600_ring_init(rdev, ring, 1024 * 1024);
5360 ring = &rdev->ring[CAYMAN_RING_TYPE_CP2_INDEX];
5361 ring->ring_obj = NULL;
5362 r600_ring_init(rdev, ring, 1024 * 1024);
5364 ring = &rdev->ring[R600_RING_TYPE_DMA_INDEX];
5365 ring->ring_obj = NULL;
5366 r600_ring_init(rdev, ring, 64 * 1024);
5368 ring = &rdev->ring[CAYMAN_RING_TYPE_DMA1_INDEX];
5369 ring->ring_obj = NULL;
5370 r600_ring_init(rdev, ring, 64 * 1024);
5372 r = radeon_uvd_init(rdev);
5374 ring = &rdev->ring[R600_RING_TYPE_UVD_INDEX];
5375 ring->ring_obj = NULL;
5376 r600_ring_init(rdev, ring, 4096);
5379 rdev->ih.ring_obj = NULL;
5380 r600_ih_ring_init(rdev, 64 * 1024);
5382 r = r600_pcie_gart_init(rdev);
5386 rdev->accel_working = true;
5387 r = si_startup(rdev);
5389 dev_err(rdev->dev, "disabling GPU acceleration\n");
5391 cayman_dma_fini(rdev);
5394 radeon_wb_fini(rdev);
5395 radeon_ib_pool_fini(rdev);
5396 radeon_vm_manager_fini(rdev);
5397 radeon_irq_kms_fini(rdev);
5398 si_pcie_gart_fini(rdev);
5399 rdev->accel_working = false;
5402 /* Don't start up if the MC ucode is missing.
5403 * The default clocks and voltages before the MC ucode
5404 * is loaded are not suffient for advanced operations.
5407 DRM_ERROR("radeon: MC ucode required for NI+.\n");
5414 void si_fini(struct radeon_device *rdev)
5417 cayman_dma_fini(rdev);
5420 radeon_wb_fini(rdev);
5421 radeon_vm_manager_fini(rdev);
5422 radeon_ib_pool_fini(rdev);
5423 radeon_irq_kms_fini(rdev);
5424 radeon_uvd_fini(rdev);
5425 si_pcie_gart_fini(rdev);
5426 r600_vram_scratch_fini(rdev);
5427 radeon_gem_fini(rdev);
5428 radeon_fence_driver_fini(rdev);
5429 radeon_bo_fini(rdev);
5430 radeon_atombios_fini(rdev);
5436 * si_get_gpu_clock_counter - return GPU clock counter snapshot
5438 * @rdev: radeon_device pointer
5440 * Fetches a GPU clock counter snapshot (SI).
5441 * Returns the 64 bit clock counter snapshot.
5443 uint64_t si_get_gpu_clock_counter(struct radeon_device *rdev)
5447 mutex_lock(&rdev->gpu_clock_mutex);
5448 WREG32(RLC_CAPTURE_GPU_CLOCK_COUNT, 1);
5449 clock = (uint64_t)RREG32(RLC_GPU_CLOCK_COUNT_LSB) |
5450 ((uint64_t)RREG32(RLC_GPU_CLOCK_COUNT_MSB) << 32ULL);
5451 mutex_unlock(&rdev->gpu_clock_mutex);
5455 int si_set_uvd_clocks(struct radeon_device *rdev, u32 vclk, u32 dclk)
5457 unsigned fb_div = 0, vclk_div = 0, dclk_div = 0;
5460 /* bypass vclk and dclk with bclk */
5461 WREG32_P(CG_UPLL_FUNC_CNTL_2,
5462 VCLK_SRC_SEL(1) | DCLK_SRC_SEL(1),
5463 ~(VCLK_SRC_SEL_MASK | DCLK_SRC_SEL_MASK));
5465 /* put PLL in bypass mode */
5466 WREG32_P(CG_UPLL_FUNC_CNTL, UPLL_BYPASS_EN_MASK, ~UPLL_BYPASS_EN_MASK);
5468 if (!vclk || !dclk) {
5469 /* keep the Bypass mode, put PLL to sleep */
5470 WREG32_P(CG_UPLL_FUNC_CNTL, UPLL_SLEEP_MASK, ~UPLL_SLEEP_MASK);
5474 r = radeon_uvd_calc_upll_dividers(rdev, vclk, dclk, 125000, 250000,
5475 16384, 0x03FFFFFF, 0, 128, 5,
5476 &fb_div, &vclk_div, &dclk_div);
5480 /* set RESET_ANTI_MUX to 0 */
5481 WREG32_P(CG_UPLL_FUNC_CNTL_5, 0, ~RESET_ANTI_MUX_MASK);
5483 /* set VCO_MODE to 1 */
5484 WREG32_P(CG_UPLL_FUNC_CNTL, UPLL_VCO_MODE_MASK, ~UPLL_VCO_MODE_MASK);
5486 /* toggle UPLL_SLEEP to 1 then back to 0 */
5487 WREG32_P(CG_UPLL_FUNC_CNTL, UPLL_SLEEP_MASK, ~UPLL_SLEEP_MASK);
5488 WREG32_P(CG_UPLL_FUNC_CNTL, 0, ~UPLL_SLEEP_MASK);
5490 /* deassert UPLL_RESET */
5491 WREG32_P(CG_UPLL_FUNC_CNTL, 0, ~UPLL_RESET_MASK);
5495 r = radeon_uvd_send_upll_ctlreq(rdev, CG_UPLL_FUNC_CNTL);
5499 /* assert UPLL_RESET again */
5500 WREG32_P(CG_UPLL_FUNC_CNTL, UPLL_RESET_MASK, ~UPLL_RESET_MASK);
5502 /* disable spread spectrum. */
5503 WREG32_P(CG_UPLL_SPREAD_SPECTRUM, 0, ~SSEN_MASK);
5505 /* set feedback divider */
5506 WREG32_P(CG_UPLL_FUNC_CNTL_3, UPLL_FB_DIV(fb_div), ~UPLL_FB_DIV_MASK);
5508 /* set ref divider to 0 */
5509 WREG32_P(CG_UPLL_FUNC_CNTL, 0, ~UPLL_REF_DIV_MASK);
5511 if (fb_div < 307200)
5512 WREG32_P(CG_UPLL_FUNC_CNTL_4, 0, ~UPLL_SPARE_ISPARE9);
5514 WREG32_P(CG_UPLL_FUNC_CNTL_4, UPLL_SPARE_ISPARE9, ~UPLL_SPARE_ISPARE9);
5516 /* set PDIV_A and PDIV_B */
5517 WREG32_P(CG_UPLL_FUNC_CNTL_2,
5518 UPLL_PDIV_A(vclk_div) | UPLL_PDIV_B(dclk_div),
5519 ~(UPLL_PDIV_A_MASK | UPLL_PDIV_B_MASK));
5521 /* give the PLL some time to settle */
5524 /* deassert PLL_RESET */
5525 WREG32_P(CG_UPLL_FUNC_CNTL, 0, ~UPLL_RESET_MASK);
5529 /* switch from bypass mode to normal mode */
5530 WREG32_P(CG_UPLL_FUNC_CNTL, 0, ~UPLL_BYPASS_EN_MASK);
5532 r = radeon_uvd_send_upll_ctlreq(rdev, CG_UPLL_FUNC_CNTL);
5536 /* switch VCLK and DCLK selection */
5537 WREG32_P(CG_UPLL_FUNC_CNTL_2,
5538 VCLK_SRC_SEL(2) | DCLK_SRC_SEL(2),
5539 ~(VCLK_SRC_SEL_MASK | DCLK_SRC_SEL_MASK));