2 * Copyright 2012 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"
34 extern void evergreen_mc_stop(struct radeon_device *rdev, struct evergreen_mc_save *save);
35 extern void evergreen_mc_resume(struct radeon_device *rdev, struct evergreen_mc_save *save);
41 * cik_tiling_mode_table_init - init the hw tiling table
43 * @rdev: radeon_device pointer
45 * Starting with SI, the tiling setup is done globally in a
46 * set of 32 tiling modes. Rather than selecting each set of
47 * parameters per surface as on older asics, we just select
48 * which index in the tiling table we want to use, and the
49 * surface uses those parameters (CIK).
51 static void cik_tiling_mode_table_init(struct radeon_device *rdev)
53 const u32 num_tile_mode_states = 32;
54 const u32 num_secondary_tile_mode_states = 16;
55 u32 reg_offset, gb_tile_moden, split_equal_to_row_size;
57 u32 num_rbs = rdev->config.cik.max_backends_per_se *
58 rdev->config.cik.max_shader_engines;
60 switch (rdev->config.cik.mem_row_size_in_kb) {
62 split_equal_to_row_size = ADDR_SURF_TILE_SPLIT_1KB;
66 split_equal_to_row_size = ADDR_SURF_TILE_SPLIT_2KB;
69 split_equal_to_row_size = ADDR_SURF_TILE_SPLIT_4KB;
73 num_pipe_configs = rdev->config.cik.max_tile_pipes;
74 if (num_pipe_configs > 8)
75 num_pipe_configs = 8; /* ??? */
77 if (num_pipe_configs == 8) {
78 for (reg_offset = 0; reg_offset < num_tile_mode_states; reg_offset++) {
81 gb_tile_moden = (ARRAY_MODE(ARRAY_2D_TILED_THIN1) |
82 MICRO_TILE_MODE_NEW(ADDR_SURF_DEPTH_MICRO_TILING) |
83 PIPE_CONFIG(ADDR_SURF_P8_32x32_16x16) |
84 TILE_SPLIT(ADDR_SURF_TILE_SPLIT_64B));
87 gb_tile_moden = (ARRAY_MODE(ARRAY_2D_TILED_THIN1) |
88 MICRO_TILE_MODE_NEW(ADDR_SURF_DEPTH_MICRO_TILING) |
89 PIPE_CONFIG(ADDR_SURF_P8_32x32_16x16) |
90 TILE_SPLIT(ADDR_SURF_TILE_SPLIT_128B));
93 gb_tile_moden = (ARRAY_MODE(ARRAY_2D_TILED_THIN1) |
94 MICRO_TILE_MODE_NEW(ADDR_SURF_DEPTH_MICRO_TILING) |
95 PIPE_CONFIG(ADDR_SURF_P8_32x32_16x16) |
96 TILE_SPLIT(ADDR_SURF_TILE_SPLIT_256B));
99 gb_tile_moden = (ARRAY_MODE(ARRAY_2D_TILED_THIN1) |
100 MICRO_TILE_MODE_NEW(ADDR_SURF_DEPTH_MICRO_TILING) |
101 PIPE_CONFIG(ADDR_SURF_P8_32x32_16x16) |
102 TILE_SPLIT(ADDR_SURF_TILE_SPLIT_512B));
105 gb_tile_moden = (ARRAY_MODE(ARRAY_2D_TILED_THIN1) |
106 MICRO_TILE_MODE_NEW(ADDR_SURF_DEPTH_MICRO_TILING) |
107 PIPE_CONFIG(ADDR_SURF_P8_32x32_16x16) |
108 TILE_SPLIT(split_equal_to_row_size));
111 gb_tile_moden = (ARRAY_MODE(ARRAY_1D_TILED_THIN1) |
112 MICRO_TILE_MODE_NEW(ADDR_SURF_DEPTH_MICRO_TILING));
115 gb_tile_moden = (ARRAY_MODE(ARRAY_PRT_2D_TILED_THIN1) |
116 MICRO_TILE_MODE_NEW(ADDR_SURF_DEPTH_MICRO_TILING) |
117 PIPE_CONFIG(ADDR_SURF_P8_32x32_16x16) |
118 TILE_SPLIT(ADDR_SURF_TILE_SPLIT_256B));
121 gb_tile_moden = (ARRAY_MODE(ARRAY_PRT_2D_TILED_THIN1) |
122 MICRO_TILE_MODE_NEW(ADDR_SURF_DEPTH_MICRO_TILING) |
123 PIPE_CONFIG(ADDR_SURF_P8_32x32_16x16) |
124 TILE_SPLIT(split_equal_to_row_size));
127 gb_tile_moden = (ARRAY_MODE(ARRAY_LINEAR_ALIGNED) |
128 PIPE_CONFIG(ADDR_SURF_P8_32x32_16x16));
131 gb_tile_moden = (ARRAY_MODE(ARRAY_1D_TILED_THIN1) |
132 MICRO_TILE_MODE_NEW(ADDR_SURF_DISPLAY_MICRO_TILING));
135 gb_tile_moden = (ARRAY_MODE(ARRAY_2D_TILED_THIN1) |
136 MICRO_TILE_MODE_NEW(ADDR_SURF_DISPLAY_MICRO_TILING) |
137 PIPE_CONFIG(ADDR_SURF_P8_32x32_16x16) |
138 SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_2));
141 gb_tile_moden = (ARRAY_MODE(ARRAY_PRT_TILED_THIN1) |
142 MICRO_TILE_MODE_NEW(ADDR_SURF_DISPLAY_MICRO_TILING) |
143 PIPE_CONFIG(ADDR_SURF_P8_32x32_8x16) |
144 SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_2));
147 gb_tile_moden = (ARRAY_MODE(ARRAY_PRT_2D_TILED_THIN1) |
148 MICRO_TILE_MODE_NEW(ADDR_SURF_DISPLAY_MICRO_TILING) |
149 PIPE_CONFIG(ADDR_SURF_P8_32x32_16x16) |
150 SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_2));
153 gb_tile_moden = (ARRAY_MODE(ARRAY_1D_TILED_THIN1) |
154 MICRO_TILE_MODE_NEW(ADDR_SURF_THIN_MICRO_TILING));
157 gb_tile_moden = (ARRAY_MODE(ARRAY_2D_TILED_THIN1) |
158 MICRO_TILE_MODE_NEW(ADDR_SURF_THIN_MICRO_TILING) |
159 PIPE_CONFIG(ADDR_SURF_P8_32x32_16x16) |
160 SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_2));
163 gb_tile_moden = (ARRAY_MODE(ARRAY_PRT_TILED_THIN1) |
164 MICRO_TILE_MODE_NEW(ADDR_SURF_THIN_MICRO_TILING) |
165 PIPE_CONFIG(ADDR_SURF_P8_32x32_8x16) |
166 SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_2));
169 gb_tile_moden = (ARRAY_MODE(ARRAY_PRT_2D_TILED_THIN1) |
170 MICRO_TILE_MODE_NEW(ADDR_SURF_THIN_MICRO_TILING) |
171 PIPE_CONFIG(ADDR_SURF_P8_32x32_16x16) |
172 SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_2));
175 gb_tile_moden = (ARRAY_MODE(ARRAY_1D_TILED_THIN1) |
176 MICRO_TILE_MODE_NEW(ADDR_SURF_ROTATED_MICRO_TILING));
179 gb_tile_moden = (ARRAY_MODE(ARRAY_2D_TILED_THIN1) |
180 MICRO_TILE_MODE_NEW(ADDR_SURF_ROTATED_MICRO_TILING) |
181 PIPE_CONFIG(ADDR_SURF_P8_32x32_16x16) |
182 SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_2));
185 gb_tile_moden = (ARRAY_MODE(ARRAY_PRT_TILED_THIN1) |
186 MICRO_TILE_MODE_NEW(ADDR_SURF_ROTATED_MICRO_TILING) |
187 PIPE_CONFIG(ADDR_SURF_P8_32x32_8x16) |
188 SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_2));
191 gb_tile_moden = (ARRAY_MODE(ARRAY_PRT_2D_TILED_THIN1) |
192 MICRO_TILE_MODE_NEW(ADDR_SURF_ROTATED_MICRO_TILING) |
193 PIPE_CONFIG(ADDR_SURF_P8_32x32_16x16) |
194 SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_2));
200 WREG32(GB_TILE_MODE0 + (reg_offset * 4), gb_tile_moden);
202 for (reg_offset = 0; reg_offset < num_secondary_tile_mode_states; reg_offset++) {
203 switch (reg_offset) {
205 gb_tile_moden = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
206 BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_4) |
207 MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_4) |
208 NUM_BANKS(ADDR_SURF_16_BANK));
211 gb_tile_moden = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
212 BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_2) |
213 MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_2) |
214 NUM_BANKS(ADDR_SURF_16_BANK));
217 gb_tile_moden = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
218 BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_1) |
219 MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_2) |
220 NUM_BANKS(ADDR_SURF_16_BANK));
223 gb_tile_moden = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
224 BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_1) |
225 MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_2) |
226 NUM_BANKS(ADDR_SURF_16_BANK));
229 gb_tile_moden = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
230 BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_1) |
231 MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_1) |
232 NUM_BANKS(ADDR_SURF_8_BANK));
235 gb_tile_moden = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
236 BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_1) |
237 MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_1) |
238 NUM_BANKS(ADDR_SURF_4_BANK));
241 gb_tile_moden = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
242 BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_1) |
243 MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_1) |
244 NUM_BANKS(ADDR_SURF_2_BANK));
247 gb_tile_moden = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
248 BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_8) |
249 MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_4) |
250 NUM_BANKS(ADDR_SURF_16_BANK));
253 gb_tile_moden = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
254 BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_4) |
255 MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_4) |
256 NUM_BANKS(ADDR_SURF_16_BANK));
259 gb_tile_moden = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
260 BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_2) |
261 MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_2) |
262 NUM_BANKS(ADDR_SURF_16_BANK));
265 gb_tile_moden = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
266 BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_1) |
267 MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_2) |
268 NUM_BANKS(ADDR_SURF_16_BANK));
271 gb_tile_moden = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
272 BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_1) |
273 MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_1) |
274 NUM_BANKS(ADDR_SURF_8_BANK));
277 gb_tile_moden = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
278 BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_1) |
279 MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_1) |
280 NUM_BANKS(ADDR_SURF_4_BANK));
283 gb_tile_moden = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
284 BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_1) |
285 MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_1) |
286 NUM_BANKS(ADDR_SURF_2_BANK));
292 WREG32(GB_MACROTILE_MODE0 + (reg_offset * 4), gb_tile_moden);
294 } else if (num_pipe_configs == 4) {
296 for (reg_offset = 0; reg_offset < num_tile_mode_states; reg_offset++) {
297 switch (reg_offset) {
299 gb_tile_moden = (ARRAY_MODE(ARRAY_2D_TILED_THIN1) |
300 MICRO_TILE_MODE_NEW(ADDR_SURF_DEPTH_MICRO_TILING) |
301 PIPE_CONFIG(ADDR_SURF_P4_16x16) |
302 TILE_SPLIT(ADDR_SURF_TILE_SPLIT_64B));
305 gb_tile_moden = (ARRAY_MODE(ARRAY_2D_TILED_THIN1) |
306 MICRO_TILE_MODE_NEW(ADDR_SURF_DEPTH_MICRO_TILING) |
307 PIPE_CONFIG(ADDR_SURF_P4_16x16) |
308 TILE_SPLIT(ADDR_SURF_TILE_SPLIT_128B));
311 gb_tile_moden = (ARRAY_MODE(ARRAY_2D_TILED_THIN1) |
312 MICRO_TILE_MODE_NEW(ADDR_SURF_DEPTH_MICRO_TILING) |
313 PIPE_CONFIG(ADDR_SURF_P4_16x16) |
314 TILE_SPLIT(ADDR_SURF_TILE_SPLIT_256B));
317 gb_tile_moden = (ARRAY_MODE(ARRAY_2D_TILED_THIN1) |
318 MICRO_TILE_MODE_NEW(ADDR_SURF_DEPTH_MICRO_TILING) |
319 PIPE_CONFIG(ADDR_SURF_P4_16x16) |
320 TILE_SPLIT(ADDR_SURF_TILE_SPLIT_512B));
323 gb_tile_moden = (ARRAY_MODE(ARRAY_2D_TILED_THIN1) |
324 MICRO_TILE_MODE_NEW(ADDR_SURF_DEPTH_MICRO_TILING) |
325 PIPE_CONFIG(ADDR_SURF_P4_16x16) |
326 TILE_SPLIT(split_equal_to_row_size));
329 gb_tile_moden = (ARRAY_MODE(ARRAY_1D_TILED_THIN1) |
330 MICRO_TILE_MODE_NEW(ADDR_SURF_DEPTH_MICRO_TILING));
333 gb_tile_moden = (ARRAY_MODE(ARRAY_PRT_2D_TILED_THIN1) |
334 MICRO_TILE_MODE_NEW(ADDR_SURF_DEPTH_MICRO_TILING) |
335 PIPE_CONFIG(ADDR_SURF_P4_16x16) |
336 TILE_SPLIT(ADDR_SURF_TILE_SPLIT_256B));
339 gb_tile_moden = (ARRAY_MODE(ARRAY_PRT_2D_TILED_THIN1) |
340 MICRO_TILE_MODE_NEW(ADDR_SURF_DEPTH_MICRO_TILING) |
341 PIPE_CONFIG(ADDR_SURF_P4_16x16) |
342 TILE_SPLIT(split_equal_to_row_size));
345 gb_tile_moden = (ARRAY_MODE(ARRAY_LINEAR_ALIGNED) |
346 PIPE_CONFIG(ADDR_SURF_P4_16x16));
349 gb_tile_moden = (ARRAY_MODE(ARRAY_1D_TILED_THIN1) |
350 MICRO_TILE_MODE_NEW(ADDR_SURF_DISPLAY_MICRO_TILING));
353 gb_tile_moden = (ARRAY_MODE(ARRAY_2D_TILED_THIN1) |
354 MICRO_TILE_MODE_NEW(ADDR_SURF_DISPLAY_MICRO_TILING) |
355 PIPE_CONFIG(ADDR_SURF_P4_16x16) |
356 SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_2));
359 gb_tile_moden = (ARRAY_MODE(ARRAY_PRT_TILED_THIN1) |
360 MICRO_TILE_MODE_NEW(ADDR_SURF_DISPLAY_MICRO_TILING) |
361 PIPE_CONFIG(ADDR_SURF_P4_8x16) |
362 SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_2));
365 gb_tile_moden = (ARRAY_MODE(ARRAY_PRT_2D_TILED_THIN1) |
366 MICRO_TILE_MODE_NEW(ADDR_SURF_DISPLAY_MICRO_TILING) |
367 PIPE_CONFIG(ADDR_SURF_P4_16x16) |
368 SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_2));
371 gb_tile_moden = (ARRAY_MODE(ARRAY_1D_TILED_THIN1) |
372 MICRO_TILE_MODE_NEW(ADDR_SURF_THIN_MICRO_TILING));
375 gb_tile_moden = (ARRAY_MODE(ARRAY_2D_TILED_THIN1) |
376 MICRO_TILE_MODE_NEW(ADDR_SURF_THIN_MICRO_TILING) |
377 PIPE_CONFIG(ADDR_SURF_P4_16x16) |
378 SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_2));
381 gb_tile_moden = (ARRAY_MODE(ARRAY_PRT_TILED_THIN1) |
382 MICRO_TILE_MODE_NEW(ADDR_SURF_THIN_MICRO_TILING) |
383 PIPE_CONFIG(ADDR_SURF_P4_8x16) |
384 SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_2));
387 gb_tile_moden = (ARRAY_MODE(ARRAY_PRT_2D_TILED_THIN1) |
388 MICRO_TILE_MODE_NEW(ADDR_SURF_THIN_MICRO_TILING) |
389 PIPE_CONFIG(ADDR_SURF_P4_16x16) |
390 SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_2));
393 gb_tile_moden = (ARRAY_MODE(ARRAY_1D_TILED_THIN1) |
394 MICRO_TILE_MODE_NEW(ADDR_SURF_ROTATED_MICRO_TILING));
397 gb_tile_moden = (ARRAY_MODE(ARRAY_PRT_2D_TILED_THIN1) |
398 MICRO_TILE_MODE_NEW(ADDR_SURF_ROTATED_MICRO_TILING) |
399 PIPE_CONFIG(ADDR_SURF_P4_16x16) |
400 SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_2));
403 gb_tile_moden = (ARRAY_MODE(ARRAY_PRT_TILED_THIN1) |
404 MICRO_TILE_MODE_NEW(ADDR_SURF_ROTATED_MICRO_TILING) |
405 PIPE_CONFIG(ADDR_SURF_P4_8x16) |
406 SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_2));
409 gb_tile_moden = (ARRAY_MODE(ARRAY_PRT_2D_TILED_THIN1) |
410 MICRO_TILE_MODE_NEW(ADDR_SURF_ROTATED_MICRO_TILING) |
411 PIPE_CONFIG(ADDR_SURF_P4_16x16) |
412 SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_2));
418 WREG32(GB_TILE_MODE0 + (reg_offset * 4), gb_tile_moden);
420 } else if (num_rbs < 4) {
421 for (reg_offset = 0; reg_offset < num_tile_mode_states; reg_offset++) {
422 switch (reg_offset) {
424 gb_tile_moden = (ARRAY_MODE(ARRAY_2D_TILED_THIN1) |
425 MICRO_TILE_MODE_NEW(ADDR_SURF_DEPTH_MICRO_TILING) |
426 PIPE_CONFIG(ADDR_SURF_P4_8x16) |
427 TILE_SPLIT(ADDR_SURF_TILE_SPLIT_64B));
430 gb_tile_moden = (ARRAY_MODE(ARRAY_2D_TILED_THIN1) |
431 MICRO_TILE_MODE_NEW(ADDR_SURF_DEPTH_MICRO_TILING) |
432 PIPE_CONFIG(ADDR_SURF_P4_8x16) |
433 TILE_SPLIT(ADDR_SURF_TILE_SPLIT_128B));
436 gb_tile_moden = (ARRAY_MODE(ARRAY_2D_TILED_THIN1) |
437 MICRO_TILE_MODE_NEW(ADDR_SURF_DEPTH_MICRO_TILING) |
438 PIPE_CONFIG(ADDR_SURF_P4_8x16) |
439 TILE_SPLIT(ADDR_SURF_TILE_SPLIT_256B));
442 gb_tile_moden = (ARRAY_MODE(ARRAY_2D_TILED_THIN1) |
443 MICRO_TILE_MODE_NEW(ADDR_SURF_DEPTH_MICRO_TILING) |
444 PIPE_CONFIG(ADDR_SURF_P4_8x16) |
445 TILE_SPLIT(ADDR_SURF_TILE_SPLIT_512B));
448 gb_tile_moden = (ARRAY_MODE(ARRAY_2D_TILED_THIN1) |
449 MICRO_TILE_MODE_NEW(ADDR_SURF_DEPTH_MICRO_TILING) |
450 PIPE_CONFIG(ADDR_SURF_P4_8x16) |
451 TILE_SPLIT(split_equal_to_row_size));
454 gb_tile_moden = (ARRAY_MODE(ARRAY_1D_TILED_THIN1) |
455 MICRO_TILE_MODE_NEW(ADDR_SURF_DEPTH_MICRO_TILING));
458 gb_tile_moden = (ARRAY_MODE(ARRAY_PRT_2D_TILED_THIN1) |
459 MICRO_TILE_MODE_NEW(ADDR_SURF_DEPTH_MICRO_TILING) |
460 PIPE_CONFIG(ADDR_SURF_P4_8x16) |
461 TILE_SPLIT(ADDR_SURF_TILE_SPLIT_256B));
464 gb_tile_moden = (ARRAY_MODE(ARRAY_PRT_2D_TILED_THIN1) |
465 MICRO_TILE_MODE_NEW(ADDR_SURF_DEPTH_MICRO_TILING) |
466 PIPE_CONFIG(ADDR_SURF_P4_8x16) |
467 TILE_SPLIT(split_equal_to_row_size));
470 gb_tile_moden = (ARRAY_MODE(ARRAY_LINEAR_ALIGNED) |
471 PIPE_CONFIG(ADDR_SURF_P4_8x16));
474 gb_tile_moden = (ARRAY_MODE(ARRAY_1D_TILED_THIN1) |
475 MICRO_TILE_MODE_NEW(ADDR_SURF_DISPLAY_MICRO_TILING));
478 gb_tile_moden = (ARRAY_MODE(ARRAY_2D_TILED_THIN1) |
479 MICRO_TILE_MODE_NEW(ADDR_SURF_DISPLAY_MICRO_TILING) |
480 PIPE_CONFIG(ADDR_SURF_P4_8x16) |
481 SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_2));
484 gb_tile_moden = (ARRAY_MODE(ARRAY_PRT_TILED_THIN1) |
485 MICRO_TILE_MODE_NEW(ADDR_SURF_DISPLAY_MICRO_TILING) |
486 PIPE_CONFIG(ADDR_SURF_P4_8x16) |
487 SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_2));
490 gb_tile_moden = (ARRAY_MODE(ARRAY_PRT_2D_TILED_THIN1) |
491 MICRO_TILE_MODE_NEW(ADDR_SURF_DISPLAY_MICRO_TILING) |
492 PIPE_CONFIG(ADDR_SURF_P4_8x16) |
493 SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_2));
496 gb_tile_moden = (ARRAY_MODE(ARRAY_1D_TILED_THIN1) |
497 MICRO_TILE_MODE_NEW(ADDR_SURF_THIN_MICRO_TILING));
500 gb_tile_moden = (ARRAY_MODE(ARRAY_2D_TILED_THIN1) |
501 MICRO_TILE_MODE_NEW(ADDR_SURF_THIN_MICRO_TILING) |
502 PIPE_CONFIG(ADDR_SURF_P4_8x16) |
503 SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_2));
506 gb_tile_moden = (ARRAY_MODE(ARRAY_PRT_TILED_THIN1) |
507 MICRO_TILE_MODE_NEW(ADDR_SURF_THIN_MICRO_TILING) |
508 PIPE_CONFIG(ADDR_SURF_P4_8x16) |
509 SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_2));
512 gb_tile_moden = (ARRAY_MODE(ARRAY_PRT_2D_TILED_THIN1) |
513 MICRO_TILE_MODE_NEW(ADDR_SURF_THIN_MICRO_TILING) |
514 PIPE_CONFIG(ADDR_SURF_P4_8x16) |
515 SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_2));
518 gb_tile_moden = (ARRAY_MODE(ARRAY_1D_TILED_THIN1) |
519 MICRO_TILE_MODE_NEW(ADDR_SURF_ROTATED_MICRO_TILING));
522 gb_tile_moden = (ARRAY_MODE(ARRAY_PRT_2D_TILED_THIN1) |
523 MICRO_TILE_MODE_NEW(ADDR_SURF_ROTATED_MICRO_TILING) |
524 PIPE_CONFIG(ADDR_SURF_P4_8x16) |
525 SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_2));
528 gb_tile_moden = (ARRAY_MODE(ARRAY_PRT_TILED_THIN1) |
529 MICRO_TILE_MODE_NEW(ADDR_SURF_ROTATED_MICRO_TILING) |
530 PIPE_CONFIG(ADDR_SURF_P4_8x16) |
531 SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_2));
534 gb_tile_moden = (ARRAY_MODE(ARRAY_PRT_2D_TILED_THIN1) |
535 MICRO_TILE_MODE_NEW(ADDR_SURF_ROTATED_MICRO_TILING) |
536 PIPE_CONFIG(ADDR_SURF_P4_8x16) |
537 SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_2));
543 WREG32(GB_TILE_MODE0 + (reg_offset * 4), gb_tile_moden);
546 for (reg_offset = 0; reg_offset < num_secondary_tile_mode_states; reg_offset++) {
547 switch (reg_offset) {
549 gb_tile_moden = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
550 BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_4) |
551 MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_4) |
552 NUM_BANKS(ADDR_SURF_16_BANK));
555 gb_tile_moden = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
556 BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_2) |
557 MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_4) |
558 NUM_BANKS(ADDR_SURF_16_BANK));
561 gb_tile_moden = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
562 BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_1) |
563 MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_2) |
564 NUM_BANKS(ADDR_SURF_16_BANK));
567 gb_tile_moden = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
568 BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_1) |
569 MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_2) |
570 NUM_BANKS(ADDR_SURF_16_BANK));
573 gb_tile_moden = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
574 BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_1) |
575 MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_2) |
576 NUM_BANKS(ADDR_SURF_16_BANK));
579 gb_tile_moden = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
580 BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_1) |
581 MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_2) |
582 NUM_BANKS(ADDR_SURF_8_BANK));
585 gb_tile_moden = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
586 BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_1) |
587 MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_1) |
588 NUM_BANKS(ADDR_SURF_4_BANK));
591 gb_tile_moden = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_2) |
592 BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_8) |
593 MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_4) |
594 NUM_BANKS(ADDR_SURF_16_BANK));
597 gb_tile_moden = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_2) |
598 BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_4) |
599 MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_4) |
600 NUM_BANKS(ADDR_SURF_16_BANK));
603 gb_tile_moden = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
604 BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_4) |
605 MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_4) |
606 NUM_BANKS(ADDR_SURF_16_BANK));
609 gb_tile_moden = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
610 BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_2) |
611 MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_4) |
612 NUM_BANKS(ADDR_SURF_16_BANK));
615 gb_tile_moden = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
616 BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_1) |
617 MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_2) |
618 NUM_BANKS(ADDR_SURF_16_BANK));
621 gb_tile_moden = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
622 BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_1) |
623 MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_2) |
624 NUM_BANKS(ADDR_SURF_8_BANK));
627 gb_tile_moden = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
628 BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_1) |
629 MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_1) |
630 NUM_BANKS(ADDR_SURF_4_BANK));
636 WREG32(GB_MACROTILE_MODE0 + (reg_offset * 4), gb_tile_moden);
638 } else if (num_pipe_configs == 2) {
639 for (reg_offset = 0; reg_offset < num_tile_mode_states; reg_offset++) {
640 switch (reg_offset) {
642 gb_tile_moden = (ARRAY_MODE(ARRAY_2D_TILED_THIN1) |
643 MICRO_TILE_MODE_NEW(ADDR_SURF_DEPTH_MICRO_TILING) |
644 PIPE_CONFIG(ADDR_SURF_P2) |
645 TILE_SPLIT(ADDR_SURF_TILE_SPLIT_64B));
648 gb_tile_moden = (ARRAY_MODE(ARRAY_2D_TILED_THIN1) |
649 MICRO_TILE_MODE_NEW(ADDR_SURF_DEPTH_MICRO_TILING) |
650 PIPE_CONFIG(ADDR_SURF_P2) |
651 TILE_SPLIT(ADDR_SURF_TILE_SPLIT_128B));
654 gb_tile_moden = (ARRAY_MODE(ARRAY_2D_TILED_THIN1) |
655 MICRO_TILE_MODE_NEW(ADDR_SURF_DEPTH_MICRO_TILING) |
656 PIPE_CONFIG(ADDR_SURF_P2) |
657 TILE_SPLIT(ADDR_SURF_TILE_SPLIT_256B));
660 gb_tile_moden = (ARRAY_MODE(ARRAY_2D_TILED_THIN1) |
661 MICRO_TILE_MODE_NEW(ADDR_SURF_DEPTH_MICRO_TILING) |
662 PIPE_CONFIG(ADDR_SURF_P2) |
663 TILE_SPLIT(ADDR_SURF_TILE_SPLIT_512B));
666 gb_tile_moden = (ARRAY_MODE(ARRAY_2D_TILED_THIN1) |
667 MICRO_TILE_MODE_NEW(ADDR_SURF_DEPTH_MICRO_TILING) |
668 PIPE_CONFIG(ADDR_SURF_P2) |
669 TILE_SPLIT(split_equal_to_row_size));
672 gb_tile_moden = (ARRAY_MODE(ARRAY_1D_TILED_THIN1) |
673 MICRO_TILE_MODE_NEW(ADDR_SURF_DEPTH_MICRO_TILING));
676 gb_tile_moden = (ARRAY_MODE(ARRAY_PRT_2D_TILED_THIN1) |
677 MICRO_TILE_MODE_NEW(ADDR_SURF_DEPTH_MICRO_TILING) |
678 PIPE_CONFIG(ADDR_SURF_P2) |
679 TILE_SPLIT(ADDR_SURF_TILE_SPLIT_256B));
682 gb_tile_moden = (ARRAY_MODE(ARRAY_PRT_2D_TILED_THIN1) |
683 MICRO_TILE_MODE_NEW(ADDR_SURF_DEPTH_MICRO_TILING) |
684 PIPE_CONFIG(ADDR_SURF_P2) |
685 TILE_SPLIT(split_equal_to_row_size));
688 gb_tile_moden = ARRAY_MODE(ARRAY_LINEAR_ALIGNED);
691 gb_tile_moden = (ARRAY_MODE(ARRAY_1D_TILED_THIN1) |
692 MICRO_TILE_MODE_NEW(ADDR_SURF_DISPLAY_MICRO_TILING));
695 gb_tile_moden = (ARRAY_MODE(ARRAY_2D_TILED_THIN1) |
696 MICRO_TILE_MODE_NEW(ADDR_SURF_DISPLAY_MICRO_TILING) |
697 PIPE_CONFIG(ADDR_SURF_P2) |
698 SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_2));
701 gb_tile_moden = (ARRAY_MODE(ARRAY_PRT_TILED_THIN1) |
702 MICRO_TILE_MODE_NEW(ADDR_SURF_DISPLAY_MICRO_TILING) |
703 PIPE_CONFIG(ADDR_SURF_P2) |
704 SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_2));
707 gb_tile_moden = (ARRAY_MODE(ARRAY_PRT_2D_TILED_THIN1) |
708 MICRO_TILE_MODE_NEW(ADDR_SURF_DISPLAY_MICRO_TILING) |
709 PIPE_CONFIG(ADDR_SURF_P2) |
710 SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_2));
713 gb_tile_moden = (ARRAY_MODE(ARRAY_1D_TILED_THIN1) |
714 MICRO_TILE_MODE_NEW(ADDR_SURF_THIN_MICRO_TILING));
717 gb_tile_moden = (ARRAY_MODE(ARRAY_2D_TILED_THIN1) |
718 MICRO_TILE_MODE_NEW(ADDR_SURF_THIN_MICRO_TILING) |
719 PIPE_CONFIG(ADDR_SURF_P2) |
720 SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_2));
723 gb_tile_moden = (ARRAY_MODE(ARRAY_PRT_TILED_THIN1) |
724 MICRO_TILE_MODE_NEW(ADDR_SURF_THIN_MICRO_TILING) |
725 PIPE_CONFIG(ADDR_SURF_P2) |
726 SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_2));
729 gb_tile_moden = (ARRAY_MODE(ARRAY_PRT_2D_TILED_THIN1) |
730 MICRO_TILE_MODE_NEW(ADDR_SURF_THIN_MICRO_TILING) |
731 PIPE_CONFIG(ADDR_SURF_P2) |
732 SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_2));
735 gb_tile_moden = (ARRAY_MODE(ARRAY_1D_TILED_THIN1) |
736 MICRO_TILE_MODE_NEW(ADDR_SURF_ROTATED_MICRO_TILING));
739 gb_tile_moden = (ARRAY_MODE(ARRAY_PRT_2D_TILED_THIN1) |
740 MICRO_TILE_MODE_NEW(ADDR_SURF_ROTATED_MICRO_TILING) |
741 PIPE_CONFIG(ADDR_SURF_P2) |
742 SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_2));
745 gb_tile_moden = (ARRAY_MODE(ARRAY_PRT_TILED_THIN1) |
746 MICRO_TILE_MODE_NEW(ADDR_SURF_ROTATED_MICRO_TILING) |
747 PIPE_CONFIG(ADDR_SURF_P2) |
748 SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_2));
751 gb_tile_moden = (ARRAY_MODE(ARRAY_PRT_2D_TILED_THIN1) |
752 MICRO_TILE_MODE_NEW(ADDR_SURF_ROTATED_MICRO_TILING) |
753 PIPE_CONFIG(ADDR_SURF_P2) |
754 SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_2));
760 WREG32(GB_TILE_MODE0 + (reg_offset * 4), gb_tile_moden);
762 for (reg_offset = 0; reg_offset < num_secondary_tile_mode_states; reg_offset++) {
763 switch (reg_offset) {
765 gb_tile_moden = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_2) |
766 BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_4) |
767 MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_4) |
768 NUM_BANKS(ADDR_SURF_16_BANK));
771 gb_tile_moden = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_2) |
772 BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_2) |
773 MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_4) |
774 NUM_BANKS(ADDR_SURF_16_BANK));
777 gb_tile_moden = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
778 BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_2) |
779 MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_4) |
780 NUM_BANKS(ADDR_SURF_16_BANK));
783 gb_tile_moden = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
784 BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_1) |
785 MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_4) |
786 NUM_BANKS(ADDR_SURF_16_BANK));
789 gb_tile_moden = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
790 BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_1) |
791 MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_4) |
792 NUM_BANKS(ADDR_SURF_16_BANK));
795 gb_tile_moden = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
796 BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_1) |
797 MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_4) |
798 NUM_BANKS(ADDR_SURF_16_BANK));
801 gb_tile_moden = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
802 BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_1) |
803 MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_2) |
804 NUM_BANKS(ADDR_SURF_8_BANK));
807 gb_tile_moden = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_4) |
808 BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_8) |
809 MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_4) |
810 NUM_BANKS(ADDR_SURF_16_BANK));
813 gb_tile_moden = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_4) |
814 BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_4) |
815 MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_4) |
816 NUM_BANKS(ADDR_SURF_16_BANK));
819 gb_tile_moden = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_2) |
820 BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_4) |
821 MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_4) |
822 NUM_BANKS(ADDR_SURF_16_BANK));
825 gb_tile_moden = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_2) |
826 BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_2) |
827 MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_4) |
828 NUM_BANKS(ADDR_SURF_16_BANK));
831 gb_tile_moden = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
832 BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_2) |
833 MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_4) |
834 NUM_BANKS(ADDR_SURF_16_BANK));
837 gb_tile_moden = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
838 BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_1) |
839 MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_4) |
840 NUM_BANKS(ADDR_SURF_16_BANK));
843 gb_tile_moden = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
844 BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_1) |
845 MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_2) |
846 NUM_BANKS(ADDR_SURF_8_BANK));
852 WREG32(GB_MACROTILE_MODE0 + (reg_offset * 4), gb_tile_moden);
855 DRM_ERROR("unknown num pipe config: 0x%x\n", num_pipe_configs);
859 * cik_select_se_sh - select which SE, SH to address
861 * @rdev: radeon_device pointer
862 * @se_num: shader engine to address
863 * @sh_num: sh block to address
865 * Select which SE, SH combinations to address. Certain
866 * registers are instanced per SE or SH. 0xffffffff means
867 * broadcast to all SEs or SHs (CIK).
869 static void cik_select_se_sh(struct radeon_device *rdev,
870 u32 se_num, u32 sh_num)
872 u32 data = INSTANCE_BROADCAST_WRITES;
874 if ((se_num == 0xffffffff) && (sh_num == 0xffffffff))
875 data = SH_BROADCAST_WRITES | SE_BROADCAST_WRITES;
876 else if (se_num == 0xffffffff)
877 data |= SE_BROADCAST_WRITES | SH_INDEX(sh_num);
878 else if (sh_num == 0xffffffff)
879 data |= SH_BROADCAST_WRITES | SE_INDEX(se_num);
881 data |= SH_INDEX(sh_num) | SE_INDEX(se_num);
882 WREG32(GRBM_GFX_INDEX, data);
886 * cik_create_bitmask - create a bitmask
888 * @bit_width: length of the mask
890 * create a variable length bit mask (CIK).
891 * Returns the bitmask.
893 static u32 cik_create_bitmask(u32 bit_width)
897 for (i = 0; i < bit_width; i++) {
905 * cik_select_se_sh - select which SE, SH to address
907 * @rdev: radeon_device pointer
908 * @max_rb_num: max RBs (render backends) for the asic
909 * @se_num: number of SEs (shader engines) for the asic
910 * @sh_per_se: number of SH blocks per SE for the asic
912 * Calculates the bitmask of disabled RBs (CIK).
913 * Returns the disabled RB bitmask.
915 static u32 cik_get_rb_disabled(struct radeon_device *rdev,
916 u32 max_rb_num, u32 se_num,
921 data = RREG32(CC_RB_BACKEND_DISABLE);
923 data &= BACKEND_DISABLE_MASK;
926 data |= RREG32(GC_USER_RB_BACKEND_DISABLE);
928 data >>= BACKEND_DISABLE_SHIFT;
930 mask = cik_create_bitmask(max_rb_num / se_num / sh_per_se);
936 * cik_setup_rb - setup the RBs on the asic
938 * @rdev: radeon_device pointer
939 * @se_num: number of SEs (shader engines) for the asic
940 * @sh_per_se: number of SH blocks per SE for the asic
941 * @max_rb_num: max RBs (render backends) for the asic
943 * Configures per-SE/SH RB registers (CIK).
945 static void cik_setup_rb(struct radeon_device *rdev,
946 u32 se_num, u32 sh_per_se,
951 u32 disabled_rbs = 0;
954 for (i = 0; i < se_num; i++) {
955 for (j = 0; j < sh_per_se; j++) {
956 cik_select_se_sh(rdev, i, j);
957 data = cik_get_rb_disabled(rdev, max_rb_num, se_num, sh_per_se);
958 disabled_rbs |= data << ((i * sh_per_se + j) * CIK_RB_BITMAP_WIDTH_PER_SH);
961 cik_select_se_sh(rdev, 0xffffffff, 0xffffffff);
964 for (i = 0; i < max_rb_num; i++) {
965 if (!(disabled_rbs & mask))
970 for (i = 0; i < se_num; i++) {
971 cik_select_se_sh(rdev, i, 0xffffffff);
973 for (j = 0; j < sh_per_se; j++) {
974 switch (enabled_rbs & 3) {
976 data |= (RASTER_CONFIG_RB_MAP_0 << (i * sh_per_se + j) * 2);
979 data |= (RASTER_CONFIG_RB_MAP_3 << (i * sh_per_se + j) * 2);
983 data |= (RASTER_CONFIG_RB_MAP_2 << (i * sh_per_se + j) * 2);
988 WREG32(PA_SC_RASTER_CONFIG, data);
990 cik_select_se_sh(rdev, 0xffffffff, 0xffffffff);
994 * cik_gpu_init - setup the 3D engine
996 * @rdev: radeon_device pointer
998 * Configures the 3D engine and tiling configuration
999 * registers so that the 3D engine is usable.
1001 static void cik_gpu_init(struct radeon_device *rdev)
1003 u32 gb_addr_config = RREG32(GB_ADDR_CONFIG);
1004 u32 mc_shared_chmap, mc_arb_ramcfg;
1005 u32 hdp_host_path_cntl;
1009 switch (rdev->family) {
1011 rdev->config.cik.max_shader_engines = 2;
1012 rdev->config.cik.max_tile_pipes = 4;
1013 rdev->config.cik.max_cu_per_sh = 7;
1014 rdev->config.cik.max_sh_per_se = 1;
1015 rdev->config.cik.max_backends_per_se = 2;
1016 rdev->config.cik.max_texture_channel_caches = 4;
1017 rdev->config.cik.max_gprs = 256;
1018 rdev->config.cik.max_gs_threads = 32;
1019 rdev->config.cik.max_hw_contexts = 8;
1021 rdev->config.cik.sc_prim_fifo_size_frontend = 0x20;
1022 rdev->config.cik.sc_prim_fifo_size_backend = 0x100;
1023 rdev->config.cik.sc_hiz_tile_fifo_size = 0x30;
1024 rdev->config.cik.sc_earlyz_tile_fifo_size = 0x130;
1025 gb_addr_config = BONAIRE_GB_ADDR_CONFIG_GOLDEN;
1032 rdev->config.cik.max_shader_engines = 1;
1033 rdev->config.cik.max_tile_pipes = 2;
1034 rdev->config.cik.max_cu_per_sh = 2;
1035 rdev->config.cik.max_sh_per_se = 1;
1036 rdev->config.cik.max_backends_per_se = 1;
1037 rdev->config.cik.max_texture_channel_caches = 2;
1038 rdev->config.cik.max_gprs = 256;
1039 rdev->config.cik.max_gs_threads = 16;
1040 rdev->config.cik.max_hw_contexts = 8;
1042 rdev->config.cik.sc_prim_fifo_size_frontend = 0x20;
1043 rdev->config.cik.sc_prim_fifo_size_backend = 0x100;
1044 rdev->config.cik.sc_hiz_tile_fifo_size = 0x30;
1045 rdev->config.cik.sc_earlyz_tile_fifo_size = 0x130;
1046 gb_addr_config = BONAIRE_GB_ADDR_CONFIG_GOLDEN;
1050 /* Initialize HDP */
1051 for (i = 0, j = 0; i < 32; i++, j += 0x18) {
1052 WREG32((0x2c14 + j), 0x00000000);
1053 WREG32((0x2c18 + j), 0x00000000);
1054 WREG32((0x2c1c + j), 0x00000000);
1055 WREG32((0x2c20 + j), 0x00000000);
1056 WREG32((0x2c24 + j), 0x00000000);
1059 WREG32(GRBM_CNTL, GRBM_READ_TIMEOUT(0xff));
1061 WREG32(BIF_FB_EN, FB_READ_EN | FB_WRITE_EN);
1063 mc_shared_chmap = RREG32(MC_SHARED_CHMAP);
1064 mc_arb_ramcfg = RREG32(MC_ARB_RAMCFG);
1066 rdev->config.cik.num_tile_pipes = rdev->config.cik.max_tile_pipes;
1067 rdev->config.cik.mem_max_burst_length_bytes = 256;
1068 tmp = (mc_arb_ramcfg & NOOFCOLS_MASK) >> NOOFCOLS_SHIFT;
1069 rdev->config.cik.mem_row_size_in_kb = (4 * (1 << (8 + tmp))) / 1024;
1070 if (rdev->config.cik.mem_row_size_in_kb > 4)
1071 rdev->config.cik.mem_row_size_in_kb = 4;
1072 /* XXX use MC settings? */
1073 rdev->config.cik.shader_engine_tile_size = 32;
1074 rdev->config.cik.num_gpus = 1;
1075 rdev->config.cik.multi_gpu_tile_size = 64;
1077 /* fix up row size */
1078 gb_addr_config &= ~ROW_SIZE_MASK;
1079 switch (rdev->config.cik.mem_row_size_in_kb) {
1082 gb_addr_config |= ROW_SIZE(0);
1085 gb_addr_config |= ROW_SIZE(1);
1088 gb_addr_config |= ROW_SIZE(2);
1092 /* setup tiling info dword. gb_addr_config is not adequate since it does
1093 * not have bank info, so create a custom tiling dword.
1094 * bits 3:0 num_pipes
1095 * bits 7:4 num_banks
1096 * bits 11:8 group_size
1097 * bits 15:12 row_size
1099 rdev->config.cik.tile_config = 0;
1100 switch (rdev->config.cik.num_tile_pipes) {
1102 rdev->config.cik.tile_config |= (0 << 0);
1105 rdev->config.cik.tile_config |= (1 << 0);
1108 rdev->config.cik.tile_config |= (2 << 0);
1112 /* XXX what about 12? */
1113 rdev->config.cik.tile_config |= (3 << 0);
1116 if ((mc_arb_ramcfg & NOOFBANK_MASK) >> NOOFBANK_SHIFT)
1117 rdev->config.cik.tile_config |= 1 << 4;
1119 rdev->config.cik.tile_config |= 0 << 4;
1120 rdev->config.cik.tile_config |=
1121 ((gb_addr_config & PIPE_INTERLEAVE_SIZE_MASK) >> PIPE_INTERLEAVE_SIZE_SHIFT) << 8;
1122 rdev->config.cik.tile_config |=
1123 ((gb_addr_config & ROW_SIZE_MASK) >> ROW_SIZE_SHIFT) << 12;
1125 WREG32(GB_ADDR_CONFIG, gb_addr_config);
1126 WREG32(HDP_ADDR_CONFIG, gb_addr_config);
1127 WREG32(DMIF_ADDR_CALC, gb_addr_config);
1129 cik_tiling_mode_table_init(rdev);
1131 cik_setup_rb(rdev, rdev->config.cik.max_shader_engines,
1132 rdev->config.cik.max_sh_per_se,
1133 rdev->config.cik.max_backends_per_se);
1135 /* set HW defaults for 3D engine */
1136 WREG32(CP_MEQ_THRESHOLDS, MEQ1_START(0x30) | MEQ2_START(0x60));
1138 WREG32(SX_DEBUG_1, 0x20);
1140 WREG32(TA_CNTL_AUX, 0x00010000);
1142 tmp = RREG32(SPI_CONFIG_CNTL);
1144 WREG32(SPI_CONFIG_CNTL, tmp);
1146 WREG32(SQ_CONFIG, 1);
1148 WREG32(DB_DEBUG, 0);
1150 tmp = RREG32(DB_DEBUG2) & ~0xf00fffff;
1152 WREG32(DB_DEBUG2, tmp);
1154 tmp = RREG32(DB_DEBUG3) & ~0x0002021c;
1156 WREG32(DB_DEBUG3, tmp);
1158 tmp = RREG32(CB_HW_CONTROL) & ~0x00010000;
1160 WREG32(CB_HW_CONTROL, tmp);
1162 WREG32(SPI_CONFIG_CNTL_1, VTX_DONE_DELAY(4));
1164 WREG32(PA_SC_FIFO_SIZE, (SC_FRONTEND_PRIM_FIFO_SIZE(rdev->config.cik.sc_prim_fifo_size_frontend) |
1165 SC_BACKEND_PRIM_FIFO_SIZE(rdev->config.cik.sc_prim_fifo_size_backend) |
1166 SC_HIZ_TILE_FIFO_SIZE(rdev->config.cik.sc_hiz_tile_fifo_size) |
1167 SC_EARLYZ_TILE_FIFO_SIZE(rdev->config.cik.sc_earlyz_tile_fifo_size)));
1169 WREG32(VGT_NUM_INSTANCES, 1);
1171 WREG32(CP_PERFMON_CNTL, 0);
1173 WREG32(SQ_CONFIG, 0);
1175 WREG32(PA_SC_FORCE_EOV_MAX_CNTS, (FORCE_EOV_MAX_CLK_CNT(4095) |
1176 FORCE_EOV_MAX_REZ_CNT(255)));
1178 WREG32(VGT_CACHE_INVALIDATION, CACHE_INVALIDATION(VC_AND_TC) |
1179 AUTO_INVLD_EN(ES_AND_GS_AUTO));
1181 WREG32(VGT_GS_VERTEX_REUSE, 16);
1182 WREG32(PA_SC_LINE_STIPPLE_STATE, 0);
1184 tmp = RREG32(HDP_MISC_CNTL);
1185 tmp |= HDP_FLUSH_INVALIDATE_CACHE;
1186 WREG32(HDP_MISC_CNTL, tmp);
1188 hdp_host_path_cntl = RREG32(HDP_HOST_PATH_CNTL);
1189 WREG32(HDP_HOST_PATH_CNTL, hdp_host_path_cntl);
1191 WREG32(PA_CL_ENHANCE, CLIP_VTX_REORDER_ENA | NUM_CLIP_SEQ(3));
1192 WREG32(PA_SC_ENHANCE, ENABLE_PA_SC_OUT_OF_ORDER);
1198 * cik_gpu_is_lockup - check if the 3D engine is locked up
1200 * @rdev: radeon_device pointer
1201 * @ring: radeon_ring structure holding ring information
1203 * Check if the 3D engine is locked up (CIK).
1204 * Returns true if the engine is locked, false if not.
1206 bool cik_gpu_is_lockup(struct radeon_device *rdev, struct radeon_ring *ring)
1208 u32 srbm_status, srbm_status2;
1209 u32 grbm_status, grbm_status2;
1210 u32 grbm_status_se0, grbm_status_se1, grbm_status_se2, grbm_status_se3;
1212 srbm_status = RREG32(SRBM_STATUS);
1213 srbm_status2 = RREG32(SRBM_STATUS2);
1214 grbm_status = RREG32(GRBM_STATUS);
1215 grbm_status2 = RREG32(GRBM_STATUS2);
1216 grbm_status_se0 = RREG32(GRBM_STATUS_SE0);
1217 grbm_status_se1 = RREG32(GRBM_STATUS_SE1);
1218 grbm_status_se2 = RREG32(GRBM_STATUS_SE2);
1219 grbm_status_se3 = RREG32(GRBM_STATUS_SE3);
1220 if (!(grbm_status & GUI_ACTIVE)) {
1221 radeon_ring_lockup_update(ring);
1224 /* force CP activities */
1225 radeon_ring_force_activity(rdev, ring);
1226 return radeon_ring_test_lockup(rdev, ring);
1230 * cik_gfx_gpu_soft_reset - soft reset the 3D engine and CPG
1232 * @rdev: radeon_device pointer
1234 * Soft reset the GFX engine and CPG blocks (CIK).
1235 * XXX: deal with reseting RLC and CPF
1236 * Returns 0 for success.
1238 static int cik_gfx_gpu_soft_reset(struct radeon_device *rdev)
1240 struct evergreen_mc_save save;
1243 if (!(RREG32(GRBM_STATUS) & GUI_ACTIVE))
1246 dev_info(rdev->dev, "GPU GFX softreset \n");
1247 dev_info(rdev->dev, " GRBM_STATUS=0x%08X\n",
1248 RREG32(GRBM_STATUS));
1249 dev_info(rdev->dev, " GRBM_STATUS2=0x%08X\n",
1250 RREG32(GRBM_STATUS2));
1251 dev_info(rdev->dev, " GRBM_STATUS_SE0=0x%08X\n",
1252 RREG32(GRBM_STATUS_SE0));
1253 dev_info(rdev->dev, " GRBM_STATUS_SE1=0x%08X\n",
1254 RREG32(GRBM_STATUS_SE1));
1255 dev_info(rdev->dev, " GRBM_STATUS_SE2=0x%08X\n",
1256 RREG32(GRBM_STATUS_SE2));
1257 dev_info(rdev->dev, " GRBM_STATUS_SE3=0x%08X\n",
1258 RREG32(GRBM_STATUS_SE3));
1259 dev_info(rdev->dev, " SRBM_STATUS=0x%08X\n",
1260 RREG32(SRBM_STATUS));
1261 dev_info(rdev->dev, " SRBM_STATUS2=0x%08X\n",
1262 RREG32(SRBM_STATUS2));
1263 evergreen_mc_stop(rdev, &save);
1264 if (radeon_mc_wait_for_idle(rdev)) {
1265 dev_warn(rdev->dev, "Wait for MC idle timedout !\n");
1267 /* Disable CP parsing/prefetching */
1268 WREG32(CP_ME_CNTL, CP_ME_HALT | CP_PFP_HALT | CP_CE_HALT);
1270 /* reset all the gfx block and all CPG blocks */
1271 grbm_reset = SOFT_RESET_CPG | SOFT_RESET_GFX;
1273 dev_info(rdev->dev, " GRBM_SOFT_RESET=0x%08X\n", grbm_reset);
1274 WREG32(GRBM_SOFT_RESET, grbm_reset);
1275 (void)RREG32(GRBM_SOFT_RESET);
1277 WREG32(GRBM_SOFT_RESET, 0);
1278 (void)RREG32(GRBM_SOFT_RESET);
1279 /* Wait a little for things to settle down */
1281 dev_info(rdev->dev, " GRBM_STATUS=0x%08X\n",
1282 RREG32(GRBM_STATUS));
1283 dev_info(rdev->dev, " GRBM_STATUS2=0x%08X\n",
1284 RREG32(GRBM_STATUS2));
1285 dev_info(rdev->dev, " GRBM_STATUS_SE0=0x%08X\n",
1286 RREG32(GRBM_STATUS_SE0));
1287 dev_info(rdev->dev, " GRBM_STATUS_SE1=0x%08X\n",
1288 RREG32(GRBM_STATUS_SE1));
1289 dev_info(rdev->dev, " GRBM_STATUS_SE2=0x%08X\n",
1290 RREG32(GRBM_STATUS_SE2));
1291 dev_info(rdev->dev, " GRBM_STATUS_SE3=0x%08X\n",
1292 RREG32(GRBM_STATUS_SE3));
1293 dev_info(rdev->dev, " SRBM_STATUS=0x%08X\n",
1294 RREG32(SRBM_STATUS));
1295 dev_info(rdev->dev, " SRBM_STATUS2=0x%08X\n",
1296 RREG32(SRBM_STATUS2));
1297 evergreen_mc_resume(rdev, &save);
1302 * cik_compute_gpu_soft_reset - soft reset CPC
1304 * @rdev: radeon_device pointer
1306 * Soft reset the CPC blocks (CIK).
1307 * XXX: deal with reseting RLC and CPF
1308 * Returns 0 for success.
1310 static int cik_compute_gpu_soft_reset(struct radeon_device *rdev)
1312 struct evergreen_mc_save save;
1315 dev_info(rdev->dev, "GPU compute softreset \n");
1316 dev_info(rdev->dev, " GRBM_STATUS=0x%08X\n",
1317 RREG32(GRBM_STATUS));
1318 dev_info(rdev->dev, " GRBM_STATUS2=0x%08X\n",
1319 RREG32(GRBM_STATUS2));
1320 dev_info(rdev->dev, " GRBM_STATUS_SE0=0x%08X\n",
1321 RREG32(GRBM_STATUS_SE0));
1322 dev_info(rdev->dev, " GRBM_STATUS_SE1=0x%08X\n",
1323 RREG32(GRBM_STATUS_SE1));
1324 dev_info(rdev->dev, " GRBM_STATUS_SE2=0x%08X\n",
1325 RREG32(GRBM_STATUS_SE2));
1326 dev_info(rdev->dev, " GRBM_STATUS_SE3=0x%08X\n",
1327 RREG32(GRBM_STATUS_SE3));
1328 dev_info(rdev->dev, " SRBM_STATUS=0x%08X\n",
1329 RREG32(SRBM_STATUS));
1330 dev_info(rdev->dev, " SRBM_STATUS2=0x%08X\n",
1331 RREG32(SRBM_STATUS2));
1332 evergreen_mc_stop(rdev, &save);
1333 if (radeon_mc_wait_for_idle(rdev)) {
1334 dev_warn(rdev->dev, "Wait for MC idle timedout !\n");
1336 /* Disable CP parsing/prefetching */
1337 WREG32(CP_MEC_CNTL, MEC_ME1_HALT | MEC_ME2_HALT);
1339 /* reset all the CPC blocks */
1340 grbm_reset = SOFT_RESET_CPG;
1342 dev_info(rdev->dev, " GRBM_SOFT_RESET=0x%08X\n", grbm_reset);
1343 WREG32(GRBM_SOFT_RESET, grbm_reset);
1344 (void)RREG32(GRBM_SOFT_RESET);
1346 WREG32(GRBM_SOFT_RESET, 0);
1347 (void)RREG32(GRBM_SOFT_RESET);
1348 /* Wait a little for things to settle down */
1350 dev_info(rdev->dev, " GRBM_STATUS=0x%08X\n",
1351 RREG32(GRBM_STATUS));
1352 dev_info(rdev->dev, " GRBM_STATUS2=0x%08X\n",
1353 RREG32(GRBM_STATUS2));
1354 dev_info(rdev->dev, " GRBM_STATUS_SE0=0x%08X\n",
1355 RREG32(GRBM_STATUS_SE0));
1356 dev_info(rdev->dev, " GRBM_STATUS_SE1=0x%08X\n",
1357 RREG32(GRBM_STATUS_SE1));
1358 dev_info(rdev->dev, " GRBM_STATUS_SE2=0x%08X\n",
1359 RREG32(GRBM_STATUS_SE2));
1360 dev_info(rdev->dev, " GRBM_STATUS_SE3=0x%08X\n",
1361 RREG32(GRBM_STATUS_SE3));
1362 dev_info(rdev->dev, " SRBM_STATUS=0x%08X\n",
1363 RREG32(SRBM_STATUS));
1364 dev_info(rdev->dev, " SRBM_STATUS2=0x%08X\n",
1365 RREG32(SRBM_STATUS2));
1366 evergreen_mc_resume(rdev, &save);
1371 * cik_asic_reset - soft reset compute and gfx
1373 * @rdev: radeon_device pointer
1375 * Soft reset the CPC blocks (CIK).
1376 * XXX: make this more fine grained and only reset
1377 * what is necessary.
1378 * Returns 0 for success.
1380 int cik_asic_reset(struct radeon_device *rdev)
1384 r = cik_compute_gpu_soft_reset(rdev);
1386 dev_info(rdev->dev, "Compute reset failed!\n");
1388 return cik_gfx_gpu_soft_reset(rdev);