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>
37 * cik_tiling_mode_table_init - init the hw tiling table
39 * @rdev: radeon_device pointer
41 * Starting with SI, the tiling setup is done globally in a
42 * set of 32 tiling modes. Rather than selecting each set of
43 * parameters per surface as on older asics, we just select
44 * which index in the tiling table we want to use, and the
45 * surface uses those parameters (CIK).
47 static void cik_tiling_mode_table_init(struct radeon_device *rdev)
49 const u32 num_tile_mode_states = 32;
50 const u32 num_secondary_tile_mode_states = 16;
51 u32 reg_offset, gb_tile_moden, split_equal_to_row_size;
53 u32 num_rbs = rdev->config.cik.max_backends_per_se *
54 rdev->config.cik.max_shader_engines;
56 switch (rdev->config.cik.mem_row_size_in_kb) {
58 split_equal_to_row_size = ADDR_SURF_TILE_SPLIT_1KB;
62 split_equal_to_row_size = ADDR_SURF_TILE_SPLIT_2KB;
65 split_equal_to_row_size = ADDR_SURF_TILE_SPLIT_4KB;
69 num_pipe_configs = rdev->config.cik.max_tile_pipes;
70 if (num_pipe_configs > 8)
71 num_pipe_configs = 8; /* ??? */
73 if (num_pipe_configs == 8) {
74 for (reg_offset = 0; reg_offset < num_tile_mode_states; reg_offset++) {
77 gb_tile_moden = (ARRAY_MODE(ARRAY_2D_TILED_THIN1) |
78 MICRO_TILE_MODE_NEW(ADDR_SURF_DEPTH_MICRO_TILING) |
79 PIPE_CONFIG(ADDR_SURF_P8_32x32_16x16) |
80 TILE_SPLIT(ADDR_SURF_TILE_SPLIT_64B));
83 gb_tile_moden = (ARRAY_MODE(ARRAY_2D_TILED_THIN1) |
84 MICRO_TILE_MODE_NEW(ADDR_SURF_DEPTH_MICRO_TILING) |
85 PIPE_CONFIG(ADDR_SURF_P8_32x32_16x16) |
86 TILE_SPLIT(ADDR_SURF_TILE_SPLIT_128B));
89 gb_tile_moden = (ARRAY_MODE(ARRAY_2D_TILED_THIN1) |
90 MICRO_TILE_MODE_NEW(ADDR_SURF_DEPTH_MICRO_TILING) |
91 PIPE_CONFIG(ADDR_SURF_P8_32x32_16x16) |
92 TILE_SPLIT(ADDR_SURF_TILE_SPLIT_256B));
95 gb_tile_moden = (ARRAY_MODE(ARRAY_2D_TILED_THIN1) |
96 MICRO_TILE_MODE_NEW(ADDR_SURF_DEPTH_MICRO_TILING) |
97 PIPE_CONFIG(ADDR_SURF_P8_32x32_16x16) |
98 TILE_SPLIT(ADDR_SURF_TILE_SPLIT_512B));
101 gb_tile_moden = (ARRAY_MODE(ARRAY_2D_TILED_THIN1) |
102 MICRO_TILE_MODE_NEW(ADDR_SURF_DEPTH_MICRO_TILING) |
103 PIPE_CONFIG(ADDR_SURF_P8_32x32_16x16) |
104 TILE_SPLIT(split_equal_to_row_size));
107 gb_tile_moden = (ARRAY_MODE(ARRAY_1D_TILED_THIN1) |
108 MICRO_TILE_MODE_NEW(ADDR_SURF_DEPTH_MICRO_TILING));
111 gb_tile_moden = (ARRAY_MODE(ARRAY_PRT_2D_TILED_THIN1) |
112 MICRO_TILE_MODE_NEW(ADDR_SURF_DEPTH_MICRO_TILING) |
113 PIPE_CONFIG(ADDR_SURF_P8_32x32_16x16) |
114 TILE_SPLIT(ADDR_SURF_TILE_SPLIT_256B));
117 gb_tile_moden = (ARRAY_MODE(ARRAY_PRT_2D_TILED_THIN1) |
118 MICRO_TILE_MODE_NEW(ADDR_SURF_DEPTH_MICRO_TILING) |
119 PIPE_CONFIG(ADDR_SURF_P8_32x32_16x16) |
120 TILE_SPLIT(split_equal_to_row_size));
123 gb_tile_moden = (ARRAY_MODE(ARRAY_LINEAR_ALIGNED) |
124 PIPE_CONFIG(ADDR_SURF_P8_32x32_16x16));
127 gb_tile_moden = (ARRAY_MODE(ARRAY_1D_TILED_THIN1) |
128 MICRO_TILE_MODE_NEW(ADDR_SURF_DISPLAY_MICRO_TILING));
131 gb_tile_moden = (ARRAY_MODE(ARRAY_2D_TILED_THIN1) |
132 MICRO_TILE_MODE_NEW(ADDR_SURF_DISPLAY_MICRO_TILING) |
133 PIPE_CONFIG(ADDR_SURF_P8_32x32_16x16) |
134 SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_2));
137 gb_tile_moden = (ARRAY_MODE(ARRAY_PRT_TILED_THIN1) |
138 MICRO_TILE_MODE_NEW(ADDR_SURF_DISPLAY_MICRO_TILING) |
139 PIPE_CONFIG(ADDR_SURF_P8_32x32_8x16) |
140 SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_2));
143 gb_tile_moden = (ARRAY_MODE(ARRAY_PRT_2D_TILED_THIN1) |
144 MICRO_TILE_MODE_NEW(ADDR_SURF_DISPLAY_MICRO_TILING) |
145 PIPE_CONFIG(ADDR_SURF_P8_32x32_16x16) |
146 SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_2));
149 gb_tile_moden = (ARRAY_MODE(ARRAY_1D_TILED_THIN1) |
150 MICRO_TILE_MODE_NEW(ADDR_SURF_THIN_MICRO_TILING));
153 gb_tile_moden = (ARRAY_MODE(ARRAY_2D_TILED_THIN1) |
154 MICRO_TILE_MODE_NEW(ADDR_SURF_THIN_MICRO_TILING) |
155 PIPE_CONFIG(ADDR_SURF_P8_32x32_16x16) |
156 SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_2));
159 gb_tile_moden = (ARRAY_MODE(ARRAY_PRT_TILED_THIN1) |
160 MICRO_TILE_MODE_NEW(ADDR_SURF_THIN_MICRO_TILING) |
161 PIPE_CONFIG(ADDR_SURF_P8_32x32_8x16) |
162 SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_2));
165 gb_tile_moden = (ARRAY_MODE(ARRAY_PRT_2D_TILED_THIN1) |
166 MICRO_TILE_MODE_NEW(ADDR_SURF_THIN_MICRO_TILING) |
167 PIPE_CONFIG(ADDR_SURF_P8_32x32_16x16) |
168 SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_2));
171 gb_tile_moden = (ARRAY_MODE(ARRAY_1D_TILED_THIN1) |
172 MICRO_TILE_MODE_NEW(ADDR_SURF_ROTATED_MICRO_TILING));
175 gb_tile_moden = (ARRAY_MODE(ARRAY_2D_TILED_THIN1) |
176 MICRO_TILE_MODE_NEW(ADDR_SURF_ROTATED_MICRO_TILING) |
177 PIPE_CONFIG(ADDR_SURF_P8_32x32_16x16) |
178 SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_2));
181 gb_tile_moden = (ARRAY_MODE(ARRAY_PRT_TILED_THIN1) |
182 MICRO_TILE_MODE_NEW(ADDR_SURF_ROTATED_MICRO_TILING) |
183 PIPE_CONFIG(ADDR_SURF_P8_32x32_8x16) |
184 SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_2));
187 gb_tile_moden = (ARRAY_MODE(ARRAY_PRT_2D_TILED_THIN1) |
188 MICRO_TILE_MODE_NEW(ADDR_SURF_ROTATED_MICRO_TILING) |
189 PIPE_CONFIG(ADDR_SURF_P8_32x32_16x16) |
190 SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_2));
196 WREG32(GB_TILE_MODE0 + (reg_offset * 4), gb_tile_moden);
198 for (reg_offset = 0; reg_offset < num_secondary_tile_mode_states; reg_offset++) {
199 switch (reg_offset) {
201 gb_tile_moden = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
202 BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_4) |
203 MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_4) |
204 NUM_BANKS(ADDR_SURF_16_BANK));
207 gb_tile_moden = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
208 BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_2) |
209 MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_2) |
210 NUM_BANKS(ADDR_SURF_16_BANK));
213 gb_tile_moden = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
214 BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_1) |
215 MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_2) |
216 NUM_BANKS(ADDR_SURF_16_BANK));
219 gb_tile_moden = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
220 BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_1) |
221 MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_2) |
222 NUM_BANKS(ADDR_SURF_16_BANK));
225 gb_tile_moden = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
226 BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_1) |
227 MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_1) |
228 NUM_BANKS(ADDR_SURF_8_BANK));
231 gb_tile_moden = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
232 BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_1) |
233 MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_1) |
234 NUM_BANKS(ADDR_SURF_4_BANK));
237 gb_tile_moden = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
238 BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_1) |
239 MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_1) |
240 NUM_BANKS(ADDR_SURF_2_BANK));
243 gb_tile_moden = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
244 BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_8) |
245 MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_4) |
246 NUM_BANKS(ADDR_SURF_16_BANK));
249 gb_tile_moden = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
250 BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_4) |
251 MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_4) |
252 NUM_BANKS(ADDR_SURF_16_BANK));
255 gb_tile_moden = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
256 BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_2) |
257 MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_2) |
258 NUM_BANKS(ADDR_SURF_16_BANK));
261 gb_tile_moden = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
262 BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_1) |
263 MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_2) |
264 NUM_BANKS(ADDR_SURF_16_BANK));
267 gb_tile_moden = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
268 BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_1) |
269 MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_1) |
270 NUM_BANKS(ADDR_SURF_8_BANK));
273 gb_tile_moden = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
274 BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_1) |
275 MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_1) |
276 NUM_BANKS(ADDR_SURF_4_BANK));
279 gb_tile_moden = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
280 BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_1) |
281 MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_1) |
282 NUM_BANKS(ADDR_SURF_2_BANK));
288 WREG32(GB_MACROTILE_MODE0 + (reg_offset * 4), gb_tile_moden);
290 } else if (num_pipe_configs == 4) {
292 for (reg_offset = 0; reg_offset < num_tile_mode_states; reg_offset++) {
293 switch (reg_offset) {
295 gb_tile_moden = (ARRAY_MODE(ARRAY_2D_TILED_THIN1) |
296 MICRO_TILE_MODE_NEW(ADDR_SURF_DEPTH_MICRO_TILING) |
297 PIPE_CONFIG(ADDR_SURF_P4_16x16) |
298 TILE_SPLIT(ADDR_SURF_TILE_SPLIT_64B));
301 gb_tile_moden = (ARRAY_MODE(ARRAY_2D_TILED_THIN1) |
302 MICRO_TILE_MODE_NEW(ADDR_SURF_DEPTH_MICRO_TILING) |
303 PIPE_CONFIG(ADDR_SURF_P4_16x16) |
304 TILE_SPLIT(ADDR_SURF_TILE_SPLIT_128B));
307 gb_tile_moden = (ARRAY_MODE(ARRAY_2D_TILED_THIN1) |
308 MICRO_TILE_MODE_NEW(ADDR_SURF_DEPTH_MICRO_TILING) |
309 PIPE_CONFIG(ADDR_SURF_P4_16x16) |
310 TILE_SPLIT(ADDR_SURF_TILE_SPLIT_256B));
313 gb_tile_moden = (ARRAY_MODE(ARRAY_2D_TILED_THIN1) |
314 MICRO_TILE_MODE_NEW(ADDR_SURF_DEPTH_MICRO_TILING) |
315 PIPE_CONFIG(ADDR_SURF_P4_16x16) |
316 TILE_SPLIT(ADDR_SURF_TILE_SPLIT_512B));
319 gb_tile_moden = (ARRAY_MODE(ARRAY_2D_TILED_THIN1) |
320 MICRO_TILE_MODE_NEW(ADDR_SURF_DEPTH_MICRO_TILING) |
321 PIPE_CONFIG(ADDR_SURF_P4_16x16) |
322 TILE_SPLIT(split_equal_to_row_size));
325 gb_tile_moden = (ARRAY_MODE(ARRAY_1D_TILED_THIN1) |
326 MICRO_TILE_MODE_NEW(ADDR_SURF_DEPTH_MICRO_TILING));
329 gb_tile_moden = (ARRAY_MODE(ARRAY_PRT_2D_TILED_THIN1) |
330 MICRO_TILE_MODE_NEW(ADDR_SURF_DEPTH_MICRO_TILING) |
331 PIPE_CONFIG(ADDR_SURF_P4_16x16) |
332 TILE_SPLIT(ADDR_SURF_TILE_SPLIT_256B));
335 gb_tile_moden = (ARRAY_MODE(ARRAY_PRT_2D_TILED_THIN1) |
336 MICRO_TILE_MODE_NEW(ADDR_SURF_DEPTH_MICRO_TILING) |
337 PIPE_CONFIG(ADDR_SURF_P4_16x16) |
338 TILE_SPLIT(split_equal_to_row_size));
341 gb_tile_moden = (ARRAY_MODE(ARRAY_LINEAR_ALIGNED) |
342 PIPE_CONFIG(ADDR_SURF_P4_16x16));
345 gb_tile_moden = (ARRAY_MODE(ARRAY_1D_TILED_THIN1) |
346 MICRO_TILE_MODE_NEW(ADDR_SURF_DISPLAY_MICRO_TILING));
349 gb_tile_moden = (ARRAY_MODE(ARRAY_2D_TILED_THIN1) |
350 MICRO_TILE_MODE_NEW(ADDR_SURF_DISPLAY_MICRO_TILING) |
351 PIPE_CONFIG(ADDR_SURF_P4_16x16) |
352 SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_2));
355 gb_tile_moden = (ARRAY_MODE(ARRAY_PRT_TILED_THIN1) |
356 MICRO_TILE_MODE_NEW(ADDR_SURF_DISPLAY_MICRO_TILING) |
357 PIPE_CONFIG(ADDR_SURF_P4_8x16) |
358 SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_2));
361 gb_tile_moden = (ARRAY_MODE(ARRAY_PRT_2D_TILED_THIN1) |
362 MICRO_TILE_MODE_NEW(ADDR_SURF_DISPLAY_MICRO_TILING) |
363 PIPE_CONFIG(ADDR_SURF_P4_16x16) |
364 SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_2));
367 gb_tile_moden = (ARRAY_MODE(ARRAY_1D_TILED_THIN1) |
368 MICRO_TILE_MODE_NEW(ADDR_SURF_THIN_MICRO_TILING));
371 gb_tile_moden = (ARRAY_MODE(ARRAY_2D_TILED_THIN1) |
372 MICRO_TILE_MODE_NEW(ADDR_SURF_THIN_MICRO_TILING) |
373 PIPE_CONFIG(ADDR_SURF_P4_16x16) |
374 SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_2));
377 gb_tile_moden = (ARRAY_MODE(ARRAY_PRT_TILED_THIN1) |
378 MICRO_TILE_MODE_NEW(ADDR_SURF_THIN_MICRO_TILING) |
379 PIPE_CONFIG(ADDR_SURF_P4_8x16) |
380 SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_2));
383 gb_tile_moden = (ARRAY_MODE(ARRAY_PRT_2D_TILED_THIN1) |
384 MICRO_TILE_MODE_NEW(ADDR_SURF_THIN_MICRO_TILING) |
385 PIPE_CONFIG(ADDR_SURF_P4_16x16) |
386 SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_2));
389 gb_tile_moden = (ARRAY_MODE(ARRAY_1D_TILED_THIN1) |
390 MICRO_TILE_MODE_NEW(ADDR_SURF_ROTATED_MICRO_TILING));
393 gb_tile_moden = (ARRAY_MODE(ARRAY_PRT_2D_TILED_THIN1) |
394 MICRO_TILE_MODE_NEW(ADDR_SURF_ROTATED_MICRO_TILING) |
395 PIPE_CONFIG(ADDR_SURF_P4_16x16) |
396 SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_2));
399 gb_tile_moden = (ARRAY_MODE(ARRAY_PRT_TILED_THIN1) |
400 MICRO_TILE_MODE_NEW(ADDR_SURF_ROTATED_MICRO_TILING) |
401 PIPE_CONFIG(ADDR_SURF_P4_8x16) |
402 SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_2));
405 gb_tile_moden = (ARRAY_MODE(ARRAY_PRT_2D_TILED_THIN1) |
406 MICRO_TILE_MODE_NEW(ADDR_SURF_ROTATED_MICRO_TILING) |
407 PIPE_CONFIG(ADDR_SURF_P4_16x16) |
408 SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_2));
414 WREG32(GB_TILE_MODE0 + (reg_offset * 4), gb_tile_moden);
416 } else if (num_rbs < 4) {
417 for (reg_offset = 0; reg_offset < num_tile_mode_states; reg_offset++) {
418 switch (reg_offset) {
420 gb_tile_moden = (ARRAY_MODE(ARRAY_2D_TILED_THIN1) |
421 MICRO_TILE_MODE_NEW(ADDR_SURF_DEPTH_MICRO_TILING) |
422 PIPE_CONFIG(ADDR_SURF_P4_8x16) |
423 TILE_SPLIT(ADDR_SURF_TILE_SPLIT_64B));
426 gb_tile_moden = (ARRAY_MODE(ARRAY_2D_TILED_THIN1) |
427 MICRO_TILE_MODE_NEW(ADDR_SURF_DEPTH_MICRO_TILING) |
428 PIPE_CONFIG(ADDR_SURF_P4_8x16) |
429 TILE_SPLIT(ADDR_SURF_TILE_SPLIT_128B));
432 gb_tile_moden = (ARRAY_MODE(ARRAY_2D_TILED_THIN1) |
433 MICRO_TILE_MODE_NEW(ADDR_SURF_DEPTH_MICRO_TILING) |
434 PIPE_CONFIG(ADDR_SURF_P4_8x16) |
435 TILE_SPLIT(ADDR_SURF_TILE_SPLIT_256B));
438 gb_tile_moden = (ARRAY_MODE(ARRAY_2D_TILED_THIN1) |
439 MICRO_TILE_MODE_NEW(ADDR_SURF_DEPTH_MICRO_TILING) |
440 PIPE_CONFIG(ADDR_SURF_P4_8x16) |
441 TILE_SPLIT(ADDR_SURF_TILE_SPLIT_512B));
444 gb_tile_moden = (ARRAY_MODE(ARRAY_2D_TILED_THIN1) |
445 MICRO_TILE_MODE_NEW(ADDR_SURF_DEPTH_MICRO_TILING) |
446 PIPE_CONFIG(ADDR_SURF_P4_8x16) |
447 TILE_SPLIT(split_equal_to_row_size));
450 gb_tile_moden = (ARRAY_MODE(ARRAY_1D_TILED_THIN1) |
451 MICRO_TILE_MODE_NEW(ADDR_SURF_DEPTH_MICRO_TILING));
454 gb_tile_moden = (ARRAY_MODE(ARRAY_PRT_2D_TILED_THIN1) |
455 MICRO_TILE_MODE_NEW(ADDR_SURF_DEPTH_MICRO_TILING) |
456 PIPE_CONFIG(ADDR_SURF_P4_8x16) |
457 TILE_SPLIT(ADDR_SURF_TILE_SPLIT_256B));
460 gb_tile_moden = (ARRAY_MODE(ARRAY_PRT_2D_TILED_THIN1) |
461 MICRO_TILE_MODE_NEW(ADDR_SURF_DEPTH_MICRO_TILING) |
462 PIPE_CONFIG(ADDR_SURF_P4_8x16) |
463 TILE_SPLIT(split_equal_to_row_size));
466 gb_tile_moden = (ARRAY_MODE(ARRAY_LINEAR_ALIGNED) |
467 PIPE_CONFIG(ADDR_SURF_P4_8x16));
470 gb_tile_moden = (ARRAY_MODE(ARRAY_1D_TILED_THIN1) |
471 MICRO_TILE_MODE_NEW(ADDR_SURF_DISPLAY_MICRO_TILING));
474 gb_tile_moden = (ARRAY_MODE(ARRAY_2D_TILED_THIN1) |
475 MICRO_TILE_MODE_NEW(ADDR_SURF_DISPLAY_MICRO_TILING) |
476 PIPE_CONFIG(ADDR_SURF_P4_8x16) |
477 SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_2));
480 gb_tile_moden = (ARRAY_MODE(ARRAY_PRT_TILED_THIN1) |
481 MICRO_TILE_MODE_NEW(ADDR_SURF_DISPLAY_MICRO_TILING) |
482 PIPE_CONFIG(ADDR_SURF_P4_8x16) |
483 SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_2));
486 gb_tile_moden = (ARRAY_MODE(ARRAY_PRT_2D_TILED_THIN1) |
487 MICRO_TILE_MODE_NEW(ADDR_SURF_DISPLAY_MICRO_TILING) |
488 PIPE_CONFIG(ADDR_SURF_P4_8x16) |
489 SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_2));
492 gb_tile_moden = (ARRAY_MODE(ARRAY_1D_TILED_THIN1) |
493 MICRO_TILE_MODE_NEW(ADDR_SURF_THIN_MICRO_TILING));
496 gb_tile_moden = (ARRAY_MODE(ARRAY_2D_TILED_THIN1) |
497 MICRO_TILE_MODE_NEW(ADDR_SURF_THIN_MICRO_TILING) |
498 PIPE_CONFIG(ADDR_SURF_P4_8x16) |
499 SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_2));
502 gb_tile_moden = (ARRAY_MODE(ARRAY_PRT_TILED_THIN1) |
503 MICRO_TILE_MODE_NEW(ADDR_SURF_THIN_MICRO_TILING) |
504 PIPE_CONFIG(ADDR_SURF_P4_8x16) |
505 SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_2));
508 gb_tile_moden = (ARRAY_MODE(ARRAY_PRT_2D_TILED_THIN1) |
509 MICRO_TILE_MODE_NEW(ADDR_SURF_THIN_MICRO_TILING) |
510 PIPE_CONFIG(ADDR_SURF_P4_8x16) |
511 SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_2));
514 gb_tile_moden = (ARRAY_MODE(ARRAY_1D_TILED_THIN1) |
515 MICRO_TILE_MODE_NEW(ADDR_SURF_ROTATED_MICRO_TILING));
518 gb_tile_moden = (ARRAY_MODE(ARRAY_PRT_2D_TILED_THIN1) |
519 MICRO_TILE_MODE_NEW(ADDR_SURF_ROTATED_MICRO_TILING) |
520 PIPE_CONFIG(ADDR_SURF_P4_8x16) |
521 SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_2));
524 gb_tile_moden = (ARRAY_MODE(ARRAY_PRT_TILED_THIN1) |
525 MICRO_TILE_MODE_NEW(ADDR_SURF_ROTATED_MICRO_TILING) |
526 PIPE_CONFIG(ADDR_SURF_P4_8x16) |
527 SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_2));
530 gb_tile_moden = (ARRAY_MODE(ARRAY_PRT_2D_TILED_THIN1) |
531 MICRO_TILE_MODE_NEW(ADDR_SURF_ROTATED_MICRO_TILING) |
532 PIPE_CONFIG(ADDR_SURF_P4_8x16) |
533 SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_2));
539 WREG32(GB_TILE_MODE0 + (reg_offset * 4), gb_tile_moden);
542 for (reg_offset = 0; reg_offset < num_secondary_tile_mode_states; reg_offset++) {
543 switch (reg_offset) {
545 gb_tile_moden = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
546 BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_4) |
547 MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_4) |
548 NUM_BANKS(ADDR_SURF_16_BANK));
551 gb_tile_moden = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
552 BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_2) |
553 MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_4) |
554 NUM_BANKS(ADDR_SURF_16_BANK));
557 gb_tile_moden = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
558 BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_1) |
559 MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_2) |
560 NUM_BANKS(ADDR_SURF_16_BANK));
563 gb_tile_moden = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
564 BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_1) |
565 MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_2) |
566 NUM_BANKS(ADDR_SURF_16_BANK));
569 gb_tile_moden = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
570 BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_1) |
571 MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_2) |
572 NUM_BANKS(ADDR_SURF_16_BANK));
575 gb_tile_moden = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
576 BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_1) |
577 MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_2) |
578 NUM_BANKS(ADDR_SURF_8_BANK));
581 gb_tile_moden = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
582 BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_1) |
583 MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_1) |
584 NUM_BANKS(ADDR_SURF_4_BANK));
587 gb_tile_moden = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_2) |
588 BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_8) |
589 MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_4) |
590 NUM_BANKS(ADDR_SURF_16_BANK));
593 gb_tile_moden = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_2) |
594 BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_4) |
595 MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_4) |
596 NUM_BANKS(ADDR_SURF_16_BANK));
599 gb_tile_moden = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
600 BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_4) |
601 MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_4) |
602 NUM_BANKS(ADDR_SURF_16_BANK));
605 gb_tile_moden = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
606 BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_2) |
607 MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_4) |
608 NUM_BANKS(ADDR_SURF_16_BANK));
611 gb_tile_moden = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
612 BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_1) |
613 MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_2) |
614 NUM_BANKS(ADDR_SURF_16_BANK));
617 gb_tile_moden = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
618 BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_1) |
619 MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_2) |
620 NUM_BANKS(ADDR_SURF_8_BANK));
623 gb_tile_moden = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
624 BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_1) |
625 MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_1) |
626 NUM_BANKS(ADDR_SURF_4_BANK));
632 WREG32(GB_MACROTILE_MODE0 + (reg_offset * 4), gb_tile_moden);
634 } else if (num_pipe_configs == 2) {
635 for (reg_offset = 0; reg_offset < num_tile_mode_states; reg_offset++) {
636 switch (reg_offset) {
638 gb_tile_moden = (ARRAY_MODE(ARRAY_2D_TILED_THIN1) |
639 MICRO_TILE_MODE_NEW(ADDR_SURF_DEPTH_MICRO_TILING) |
640 PIPE_CONFIG(ADDR_SURF_P2) |
641 TILE_SPLIT(ADDR_SURF_TILE_SPLIT_64B));
644 gb_tile_moden = (ARRAY_MODE(ARRAY_2D_TILED_THIN1) |
645 MICRO_TILE_MODE_NEW(ADDR_SURF_DEPTH_MICRO_TILING) |
646 PIPE_CONFIG(ADDR_SURF_P2) |
647 TILE_SPLIT(ADDR_SURF_TILE_SPLIT_128B));
650 gb_tile_moden = (ARRAY_MODE(ARRAY_2D_TILED_THIN1) |
651 MICRO_TILE_MODE_NEW(ADDR_SURF_DEPTH_MICRO_TILING) |
652 PIPE_CONFIG(ADDR_SURF_P2) |
653 TILE_SPLIT(ADDR_SURF_TILE_SPLIT_256B));
656 gb_tile_moden = (ARRAY_MODE(ARRAY_2D_TILED_THIN1) |
657 MICRO_TILE_MODE_NEW(ADDR_SURF_DEPTH_MICRO_TILING) |
658 PIPE_CONFIG(ADDR_SURF_P2) |
659 TILE_SPLIT(ADDR_SURF_TILE_SPLIT_512B));
662 gb_tile_moden = (ARRAY_MODE(ARRAY_2D_TILED_THIN1) |
663 MICRO_TILE_MODE_NEW(ADDR_SURF_DEPTH_MICRO_TILING) |
664 PIPE_CONFIG(ADDR_SURF_P2) |
665 TILE_SPLIT(split_equal_to_row_size));
668 gb_tile_moden = (ARRAY_MODE(ARRAY_1D_TILED_THIN1) |
669 MICRO_TILE_MODE_NEW(ADDR_SURF_DEPTH_MICRO_TILING));
672 gb_tile_moden = (ARRAY_MODE(ARRAY_PRT_2D_TILED_THIN1) |
673 MICRO_TILE_MODE_NEW(ADDR_SURF_DEPTH_MICRO_TILING) |
674 PIPE_CONFIG(ADDR_SURF_P2) |
675 TILE_SPLIT(ADDR_SURF_TILE_SPLIT_256B));
678 gb_tile_moden = (ARRAY_MODE(ARRAY_PRT_2D_TILED_THIN1) |
679 MICRO_TILE_MODE_NEW(ADDR_SURF_DEPTH_MICRO_TILING) |
680 PIPE_CONFIG(ADDR_SURF_P2) |
681 TILE_SPLIT(split_equal_to_row_size));
684 gb_tile_moden = ARRAY_MODE(ARRAY_LINEAR_ALIGNED);
687 gb_tile_moden = (ARRAY_MODE(ARRAY_1D_TILED_THIN1) |
688 MICRO_TILE_MODE_NEW(ADDR_SURF_DISPLAY_MICRO_TILING));
691 gb_tile_moden = (ARRAY_MODE(ARRAY_2D_TILED_THIN1) |
692 MICRO_TILE_MODE_NEW(ADDR_SURF_DISPLAY_MICRO_TILING) |
693 PIPE_CONFIG(ADDR_SURF_P2) |
694 SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_2));
697 gb_tile_moden = (ARRAY_MODE(ARRAY_PRT_TILED_THIN1) |
698 MICRO_TILE_MODE_NEW(ADDR_SURF_DISPLAY_MICRO_TILING) |
699 PIPE_CONFIG(ADDR_SURF_P2) |
700 SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_2));
703 gb_tile_moden = (ARRAY_MODE(ARRAY_PRT_2D_TILED_THIN1) |
704 MICRO_TILE_MODE_NEW(ADDR_SURF_DISPLAY_MICRO_TILING) |
705 PIPE_CONFIG(ADDR_SURF_P2) |
706 SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_2));
709 gb_tile_moden = (ARRAY_MODE(ARRAY_1D_TILED_THIN1) |
710 MICRO_TILE_MODE_NEW(ADDR_SURF_THIN_MICRO_TILING));
713 gb_tile_moden = (ARRAY_MODE(ARRAY_2D_TILED_THIN1) |
714 MICRO_TILE_MODE_NEW(ADDR_SURF_THIN_MICRO_TILING) |
715 PIPE_CONFIG(ADDR_SURF_P2) |
716 SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_2));
719 gb_tile_moden = (ARRAY_MODE(ARRAY_PRT_TILED_THIN1) |
720 MICRO_TILE_MODE_NEW(ADDR_SURF_THIN_MICRO_TILING) |
721 PIPE_CONFIG(ADDR_SURF_P2) |
722 SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_2));
725 gb_tile_moden = (ARRAY_MODE(ARRAY_PRT_2D_TILED_THIN1) |
726 MICRO_TILE_MODE_NEW(ADDR_SURF_THIN_MICRO_TILING) |
727 PIPE_CONFIG(ADDR_SURF_P2) |
728 SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_2));
731 gb_tile_moden = (ARRAY_MODE(ARRAY_1D_TILED_THIN1) |
732 MICRO_TILE_MODE_NEW(ADDR_SURF_ROTATED_MICRO_TILING));
735 gb_tile_moden = (ARRAY_MODE(ARRAY_PRT_2D_TILED_THIN1) |
736 MICRO_TILE_MODE_NEW(ADDR_SURF_ROTATED_MICRO_TILING) |
737 PIPE_CONFIG(ADDR_SURF_P2) |
738 SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_2));
741 gb_tile_moden = (ARRAY_MODE(ARRAY_PRT_TILED_THIN1) |
742 MICRO_TILE_MODE_NEW(ADDR_SURF_ROTATED_MICRO_TILING) |
743 PIPE_CONFIG(ADDR_SURF_P2) |
744 SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_2));
747 gb_tile_moden = (ARRAY_MODE(ARRAY_PRT_2D_TILED_THIN1) |
748 MICRO_TILE_MODE_NEW(ADDR_SURF_ROTATED_MICRO_TILING) |
749 PIPE_CONFIG(ADDR_SURF_P2) |
750 SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_2));
756 WREG32(GB_TILE_MODE0 + (reg_offset * 4), gb_tile_moden);
758 for (reg_offset = 0; reg_offset < num_secondary_tile_mode_states; reg_offset++) {
759 switch (reg_offset) {
761 gb_tile_moden = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_2) |
762 BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_4) |
763 MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_4) |
764 NUM_BANKS(ADDR_SURF_16_BANK));
767 gb_tile_moden = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_2) |
768 BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_2) |
769 MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_4) |
770 NUM_BANKS(ADDR_SURF_16_BANK));
773 gb_tile_moden = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
774 BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_2) |
775 MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_4) |
776 NUM_BANKS(ADDR_SURF_16_BANK));
779 gb_tile_moden = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
780 BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_1) |
781 MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_4) |
782 NUM_BANKS(ADDR_SURF_16_BANK));
785 gb_tile_moden = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
786 BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_1) |
787 MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_4) |
788 NUM_BANKS(ADDR_SURF_16_BANK));
791 gb_tile_moden = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
792 BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_1) |
793 MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_4) |
794 NUM_BANKS(ADDR_SURF_16_BANK));
797 gb_tile_moden = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
798 BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_1) |
799 MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_2) |
800 NUM_BANKS(ADDR_SURF_8_BANK));
803 gb_tile_moden = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_4) |
804 BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_8) |
805 MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_4) |
806 NUM_BANKS(ADDR_SURF_16_BANK));
809 gb_tile_moden = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_4) |
810 BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_4) |
811 MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_4) |
812 NUM_BANKS(ADDR_SURF_16_BANK));
815 gb_tile_moden = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_2) |
816 BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_4) |
817 MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_4) |
818 NUM_BANKS(ADDR_SURF_16_BANK));
821 gb_tile_moden = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_2) |
822 BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_2) |
823 MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_4) |
824 NUM_BANKS(ADDR_SURF_16_BANK));
827 gb_tile_moden = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
828 BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_2) |
829 MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_4) |
830 NUM_BANKS(ADDR_SURF_16_BANK));
833 gb_tile_moden = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
834 BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_1) |
835 MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_4) |
836 NUM_BANKS(ADDR_SURF_16_BANK));
839 gb_tile_moden = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
840 BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_1) |
841 MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_2) |
842 NUM_BANKS(ADDR_SURF_8_BANK));
848 WREG32(GB_MACROTILE_MODE0 + (reg_offset * 4), gb_tile_moden);
851 DRM_ERROR("unknown num pipe config: 0x%x\n", num_pipe_configs);
855 * cik_select_se_sh - select which SE, SH to address
857 * @rdev: radeon_device pointer
858 * @se_num: shader engine to address
859 * @sh_num: sh block to address
861 * Select which SE, SH combinations to address. Certain
862 * registers are instanced per SE or SH. 0xffffffff means
863 * broadcast to all SEs or SHs (CIK).
865 static void cik_select_se_sh(struct radeon_device *rdev,
866 u32 se_num, u32 sh_num)
868 u32 data = INSTANCE_BROADCAST_WRITES;
870 if ((se_num == 0xffffffff) && (sh_num == 0xffffffff))
871 data = SH_BROADCAST_WRITES | SE_BROADCAST_WRITES;
872 else if (se_num == 0xffffffff)
873 data |= SE_BROADCAST_WRITES | SH_INDEX(sh_num);
874 else if (sh_num == 0xffffffff)
875 data |= SH_BROADCAST_WRITES | SE_INDEX(se_num);
877 data |= SH_INDEX(sh_num) | SE_INDEX(se_num);
878 WREG32(GRBM_GFX_INDEX, data);
882 * cik_create_bitmask - create a bitmask
884 * @bit_width: length of the mask
886 * create a variable length bit mask (CIK).
887 * Returns the bitmask.
889 static u32 cik_create_bitmask(u32 bit_width)
893 for (i = 0; i < bit_width; i++) {
901 * cik_select_se_sh - select which SE, SH to address
903 * @rdev: radeon_device pointer
904 * @max_rb_num: max RBs (render backends) for the asic
905 * @se_num: number of SEs (shader engines) for the asic
906 * @sh_per_se: number of SH blocks per SE for the asic
908 * Calculates the bitmask of disabled RBs (CIK).
909 * Returns the disabled RB bitmask.
911 static u32 cik_get_rb_disabled(struct radeon_device *rdev,
912 u32 max_rb_num, u32 se_num,
917 data = RREG32(CC_RB_BACKEND_DISABLE);
919 data &= BACKEND_DISABLE_MASK;
922 data |= RREG32(GC_USER_RB_BACKEND_DISABLE);
924 data >>= BACKEND_DISABLE_SHIFT;
926 mask = cik_create_bitmask(max_rb_num / se_num / sh_per_se);
932 * cik_setup_rb - setup the RBs on the asic
934 * @rdev: radeon_device pointer
935 * @se_num: number of SEs (shader engines) for the asic
936 * @sh_per_se: number of SH blocks per SE for the asic
937 * @max_rb_num: max RBs (render backends) for the asic
939 * Configures per-SE/SH RB registers (CIK).
941 static void cik_setup_rb(struct radeon_device *rdev,
942 u32 se_num, u32 sh_per_se,
947 u32 disabled_rbs = 0;
950 for (i = 0; i < se_num; i++) {
951 for (j = 0; j < sh_per_se; j++) {
952 cik_select_se_sh(rdev, i, j);
953 data = cik_get_rb_disabled(rdev, max_rb_num, se_num, sh_per_se);
954 disabled_rbs |= data << ((i * sh_per_se + j) * CIK_RB_BITMAP_WIDTH_PER_SH);
957 cik_select_se_sh(rdev, 0xffffffff, 0xffffffff);
960 for (i = 0; i < max_rb_num; i++) {
961 if (!(disabled_rbs & mask))
966 for (i = 0; i < se_num; i++) {
967 cik_select_se_sh(rdev, i, 0xffffffff);
969 for (j = 0; j < sh_per_se; j++) {
970 switch (enabled_rbs & 3) {
972 data |= (RASTER_CONFIG_RB_MAP_0 << (i * sh_per_se + j) * 2);
975 data |= (RASTER_CONFIG_RB_MAP_3 << (i * sh_per_se + j) * 2);
979 data |= (RASTER_CONFIG_RB_MAP_2 << (i * sh_per_se + j) * 2);
984 WREG32(PA_SC_RASTER_CONFIG, data);
986 cik_select_se_sh(rdev, 0xffffffff, 0xffffffff);
990 * cik_gpu_init - setup the 3D engine
992 * @rdev: radeon_device pointer
994 * Configures the 3D engine and tiling configuration
995 * registers so that the 3D engine is usable.
997 static void cik_gpu_init(struct radeon_device *rdev)
999 u32 gb_addr_config = RREG32(GB_ADDR_CONFIG);
1000 u32 mc_shared_chmap, mc_arb_ramcfg;
1001 u32 hdp_host_path_cntl;
1005 switch (rdev->family) {
1007 rdev->config.cik.max_shader_engines = 2;
1008 rdev->config.cik.max_tile_pipes = 4;
1009 rdev->config.cik.max_cu_per_sh = 7;
1010 rdev->config.cik.max_sh_per_se = 1;
1011 rdev->config.cik.max_backends_per_se = 2;
1012 rdev->config.cik.max_texture_channel_caches = 4;
1013 rdev->config.cik.max_gprs = 256;
1014 rdev->config.cik.max_gs_threads = 32;
1015 rdev->config.cik.max_hw_contexts = 8;
1017 rdev->config.cik.sc_prim_fifo_size_frontend = 0x20;
1018 rdev->config.cik.sc_prim_fifo_size_backend = 0x100;
1019 rdev->config.cik.sc_hiz_tile_fifo_size = 0x30;
1020 rdev->config.cik.sc_earlyz_tile_fifo_size = 0x130;
1021 gb_addr_config = BONAIRE_GB_ADDR_CONFIG_GOLDEN;
1028 rdev->config.cik.max_shader_engines = 1;
1029 rdev->config.cik.max_tile_pipes = 2;
1030 rdev->config.cik.max_cu_per_sh = 2;
1031 rdev->config.cik.max_sh_per_se = 1;
1032 rdev->config.cik.max_backends_per_se = 1;
1033 rdev->config.cik.max_texture_channel_caches = 2;
1034 rdev->config.cik.max_gprs = 256;
1035 rdev->config.cik.max_gs_threads = 16;
1036 rdev->config.cik.max_hw_contexts = 8;
1038 rdev->config.cik.sc_prim_fifo_size_frontend = 0x20;
1039 rdev->config.cik.sc_prim_fifo_size_backend = 0x100;
1040 rdev->config.cik.sc_hiz_tile_fifo_size = 0x30;
1041 rdev->config.cik.sc_earlyz_tile_fifo_size = 0x130;
1042 gb_addr_config = BONAIRE_GB_ADDR_CONFIG_GOLDEN;
1046 /* Initialize HDP */
1047 for (i = 0, j = 0; i < 32; i++, j += 0x18) {
1048 WREG32((0x2c14 + j), 0x00000000);
1049 WREG32((0x2c18 + j), 0x00000000);
1050 WREG32((0x2c1c + j), 0x00000000);
1051 WREG32((0x2c20 + j), 0x00000000);
1052 WREG32((0x2c24 + j), 0x00000000);
1055 WREG32(GRBM_CNTL, GRBM_READ_TIMEOUT(0xff));
1057 WREG32(BIF_FB_EN, FB_READ_EN | FB_WRITE_EN);
1059 mc_shared_chmap = RREG32(MC_SHARED_CHMAP);
1060 mc_arb_ramcfg = RREG32(MC_ARB_RAMCFG);
1062 rdev->config.cik.num_tile_pipes = rdev->config.cik.max_tile_pipes;
1063 rdev->config.cik.mem_max_burst_length_bytes = 256;
1064 tmp = (mc_arb_ramcfg & NOOFCOLS_MASK) >> NOOFCOLS_SHIFT;
1065 rdev->config.cik.mem_row_size_in_kb = (4 * (1 << (8 + tmp))) / 1024;
1066 if (rdev->config.cik.mem_row_size_in_kb > 4)
1067 rdev->config.cik.mem_row_size_in_kb = 4;
1068 /* XXX use MC settings? */
1069 rdev->config.cik.shader_engine_tile_size = 32;
1070 rdev->config.cik.num_gpus = 1;
1071 rdev->config.cik.multi_gpu_tile_size = 64;
1073 /* fix up row size */
1074 gb_addr_config &= ~ROW_SIZE_MASK;
1075 switch (rdev->config.cik.mem_row_size_in_kb) {
1078 gb_addr_config |= ROW_SIZE(0);
1081 gb_addr_config |= ROW_SIZE(1);
1084 gb_addr_config |= ROW_SIZE(2);
1088 /* setup tiling info dword. gb_addr_config is not adequate since it does
1089 * not have bank info, so create a custom tiling dword.
1090 * bits 3:0 num_pipes
1091 * bits 7:4 num_banks
1092 * bits 11:8 group_size
1093 * bits 15:12 row_size
1095 rdev->config.cik.tile_config = 0;
1096 switch (rdev->config.cik.num_tile_pipes) {
1098 rdev->config.cik.tile_config |= (0 << 0);
1101 rdev->config.cik.tile_config |= (1 << 0);
1104 rdev->config.cik.tile_config |= (2 << 0);
1108 /* XXX what about 12? */
1109 rdev->config.cik.tile_config |= (3 << 0);
1112 if ((mc_arb_ramcfg & NOOFBANK_MASK) >> NOOFBANK_SHIFT)
1113 rdev->config.cik.tile_config |= 1 << 4;
1115 rdev->config.cik.tile_config |= 0 << 4;
1116 rdev->config.cik.tile_config |=
1117 ((gb_addr_config & PIPE_INTERLEAVE_SIZE_MASK) >> PIPE_INTERLEAVE_SIZE_SHIFT) << 8;
1118 rdev->config.cik.tile_config |=
1119 ((gb_addr_config & ROW_SIZE_MASK) >> ROW_SIZE_SHIFT) << 12;
1121 WREG32(GB_ADDR_CONFIG, gb_addr_config);
1122 WREG32(HDP_ADDR_CONFIG, gb_addr_config);
1123 WREG32(DMIF_ADDR_CALC, gb_addr_config);
1125 cik_tiling_mode_table_init(rdev);
1127 cik_setup_rb(rdev, rdev->config.cik.max_shader_engines,
1128 rdev->config.cik.max_sh_per_se,
1129 rdev->config.cik.max_backends_per_se);
1131 /* set HW defaults for 3D engine */
1132 WREG32(CP_MEQ_THRESHOLDS, MEQ1_START(0x30) | MEQ2_START(0x60));
1134 WREG32(SX_DEBUG_1, 0x20);
1136 WREG32(TA_CNTL_AUX, 0x00010000);
1138 tmp = RREG32(SPI_CONFIG_CNTL);
1140 WREG32(SPI_CONFIG_CNTL, tmp);
1142 WREG32(SQ_CONFIG, 1);
1144 WREG32(DB_DEBUG, 0);
1146 tmp = RREG32(DB_DEBUG2) & ~0xf00fffff;
1148 WREG32(DB_DEBUG2, tmp);
1150 tmp = RREG32(DB_DEBUG3) & ~0x0002021c;
1152 WREG32(DB_DEBUG3, tmp);
1154 tmp = RREG32(CB_HW_CONTROL) & ~0x00010000;
1156 WREG32(CB_HW_CONTROL, tmp);
1158 WREG32(SPI_CONFIG_CNTL_1, VTX_DONE_DELAY(4));
1160 WREG32(PA_SC_FIFO_SIZE, (SC_FRONTEND_PRIM_FIFO_SIZE(rdev->config.cik.sc_prim_fifo_size_frontend) |
1161 SC_BACKEND_PRIM_FIFO_SIZE(rdev->config.cik.sc_prim_fifo_size_backend) |
1162 SC_HIZ_TILE_FIFO_SIZE(rdev->config.cik.sc_hiz_tile_fifo_size) |
1163 SC_EARLYZ_TILE_FIFO_SIZE(rdev->config.cik.sc_earlyz_tile_fifo_size)));
1165 WREG32(VGT_NUM_INSTANCES, 1);
1167 WREG32(CP_PERFMON_CNTL, 0);
1169 WREG32(SQ_CONFIG, 0);
1171 WREG32(PA_SC_FORCE_EOV_MAX_CNTS, (FORCE_EOV_MAX_CLK_CNT(4095) |
1172 FORCE_EOV_MAX_REZ_CNT(255)));
1174 WREG32(VGT_CACHE_INVALIDATION, CACHE_INVALIDATION(VC_AND_TC) |
1175 AUTO_INVLD_EN(ES_AND_GS_AUTO));
1177 WREG32(VGT_GS_VERTEX_REUSE, 16);
1178 WREG32(PA_SC_LINE_STIPPLE_STATE, 0);
1180 tmp = RREG32(HDP_MISC_CNTL);
1181 tmp |= HDP_FLUSH_INVALIDATE_CACHE;
1182 WREG32(HDP_MISC_CNTL, tmp);
1184 hdp_host_path_cntl = RREG32(HDP_HOST_PATH_CNTL);
1185 WREG32(HDP_HOST_PATH_CNTL, hdp_host_path_cntl);
1187 WREG32(PA_CL_ENHANCE, CLIP_VTX_REORDER_ENA | NUM_CLIP_SEQ(3));
1188 WREG32(PA_SC_ENHANCE, ENABLE_PA_SC_OUT_OF_ORDER);