2 * Copyright 2015 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.
23 #include <linux/firmware.h>
25 #include "amdgpu_ih.h"
26 #include "amdgpu_gfx.h"
27 #include "amdgpu_ucode.h"
28 #include "clearstate_si.h"
29 #include "bif/bif_3_0_d.h"
30 #include "bif/bif_3_0_sh_mask.h"
31 #include "oss/oss_1_0_d.h"
32 #include "oss/oss_1_0_sh_mask.h"
33 #include "gca/gfx_6_0_d.h"
34 #include "gca/gfx_6_0_sh_mask.h"
35 #include "gmc/gmc_6_0_d.h"
36 #include "gmc/gmc_6_0_sh_mask.h"
37 #include "dce/dce_6_0_d.h"
38 #include "dce/dce_6_0_sh_mask.h"
39 #include "gca/gfx_7_2_enum.h"
42 static void gfx_v6_0_set_ring_funcs(struct amdgpu_device
*adev
);
43 static void gfx_v6_0_set_irq_funcs(struct amdgpu_device
*adev
);
44 static void gfx_v6_0_get_cu_info(struct amdgpu_device
*adev
);
46 MODULE_FIRMWARE("radeon/tahiti_pfp.bin");
47 MODULE_FIRMWARE("radeon/tahiti_me.bin");
48 MODULE_FIRMWARE("radeon/tahiti_ce.bin");
49 MODULE_FIRMWARE("radeon/tahiti_rlc.bin");
51 MODULE_FIRMWARE("radeon/pitcairn_pfp.bin");
52 MODULE_FIRMWARE("radeon/pitcairn_me.bin");
53 MODULE_FIRMWARE("radeon/pitcairn_ce.bin");
54 MODULE_FIRMWARE("radeon/pitcairn_rlc.bin");
56 MODULE_FIRMWARE("radeon/verde_pfp.bin");
57 MODULE_FIRMWARE("radeon/verde_me.bin");
58 MODULE_FIRMWARE("radeon/verde_ce.bin");
59 MODULE_FIRMWARE("radeon/verde_rlc.bin");
61 MODULE_FIRMWARE("radeon/oland_pfp.bin");
62 MODULE_FIRMWARE("radeon/oland_me.bin");
63 MODULE_FIRMWARE("radeon/oland_ce.bin");
64 MODULE_FIRMWARE("radeon/oland_rlc.bin");
66 MODULE_FIRMWARE("radeon/hainan_pfp.bin");
67 MODULE_FIRMWARE("radeon/hainan_me.bin");
68 MODULE_FIRMWARE("radeon/hainan_ce.bin");
69 MODULE_FIRMWARE("radeon/hainan_rlc.bin");
71 static u32
gfx_v6_0_get_csb_size(struct amdgpu_device
*adev
);
72 static void gfx_v6_0_get_csb_buffer(struct amdgpu_device
*adev
, volatile u32
*buffer
);
73 //static void gfx_v6_0_init_cp_pg_table(struct amdgpu_device *adev);
74 static void gfx_v6_0_init_pg(struct amdgpu_device
*adev
);
76 #define ARRAY_MODE(x) ((x) << GB_TILE_MODE0__ARRAY_MODE__SHIFT)
77 #define PIPE_CONFIG(x) ((x) << GB_TILE_MODE0__PIPE_CONFIG__SHIFT)
78 #define TILE_SPLIT(x) ((x) << GB_TILE_MODE0__TILE_SPLIT__SHIFT)
79 #define MICRO_TILE_MODE(x) ((x) << 0)
80 #define SAMPLE_SPLIT(x) ((x) << GB_TILE_MODE0__SAMPLE_SPLIT__SHIFT)
81 #define BANK_WIDTH(x) ((x) << 14)
82 #define BANK_HEIGHT(x) ((x) << 16)
83 #define MACRO_TILE_ASPECT(x) ((x) << 18)
84 #define NUM_BANKS(x) ((x) << 20)
86 static const u32 verde_rlc_save_restore_register_list
[] =
88 (0x8000 << 16) | (0x98f4 >> 2),
90 (0x8040 << 16) | (0x98f4 >> 2),
92 (0x8000 << 16) | (0xe80 >> 2),
94 (0x8040 << 16) | (0xe80 >> 2),
96 (0x8000 << 16) | (0x89bc >> 2),
98 (0x8040 << 16) | (0x89bc >> 2),
100 (0x8000 << 16) | (0x8c1c >> 2),
102 (0x8040 << 16) | (0x8c1c >> 2),
104 (0x9c00 << 16) | (0x98f0 >> 2),
106 (0x9c00 << 16) | (0xe7c >> 2),
108 (0x8000 << 16) | (0x9148 >> 2),
110 (0x8040 << 16) | (0x9148 >> 2),
112 (0x9c00 << 16) | (0x9150 >> 2),
114 (0x9c00 << 16) | (0x897c >> 2),
116 (0x9c00 << 16) | (0x8d8c >> 2),
118 (0x9c00 << 16) | (0xac54 >> 2),
121 (0x9c00 << 16) | (0x98f8 >> 2),
123 (0x9c00 << 16) | (0x9910 >> 2),
125 (0x9c00 << 16) | (0x9914 >> 2),
127 (0x9c00 << 16) | (0x9918 >> 2),
129 (0x9c00 << 16) | (0x991c >> 2),
131 (0x9c00 << 16) | (0x9920 >> 2),
133 (0x9c00 << 16) | (0x9924 >> 2),
135 (0x9c00 << 16) | (0x9928 >> 2),
137 (0x9c00 << 16) | (0x992c >> 2),
139 (0x9c00 << 16) | (0x9930 >> 2),
141 (0x9c00 << 16) | (0x9934 >> 2),
143 (0x9c00 << 16) | (0x9938 >> 2),
145 (0x9c00 << 16) | (0x993c >> 2),
147 (0x9c00 << 16) | (0x9940 >> 2),
149 (0x9c00 << 16) | (0x9944 >> 2),
151 (0x9c00 << 16) | (0x9948 >> 2),
153 (0x9c00 << 16) | (0x994c >> 2),
155 (0x9c00 << 16) | (0x9950 >> 2),
157 (0x9c00 << 16) | (0x9954 >> 2),
159 (0x9c00 << 16) | (0x9958 >> 2),
161 (0x9c00 << 16) | (0x995c >> 2),
163 (0x9c00 << 16) | (0x9960 >> 2),
165 (0x9c00 << 16) | (0x9964 >> 2),
167 (0x9c00 << 16) | (0x9968 >> 2),
169 (0x9c00 << 16) | (0x996c >> 2),
171 (0x9c00 << 16) | (0x9970 >> 2),
173 (0x9c00 << 16) | (0x9974 >> 2),
175 (0x9c00 << 16) | (0x9978 >> 2),
177 (0x9c00 << 16) | (0x997c >> 2),
179 (0x9c00 << 16) | (0x9980 >> 2),
181 (0x9c00 << 16) | (0x9984 >> 2),
183 (0x9c00 << 16) | (0x9988 >> 2),
185 (0x9c00 << 16) | (0x998c >> 2),
187 (0x9c00 << 16) | (0x8c00 >> 2),
189 (0x9c00 << 16) | (0x8c14 >> 2),
191 (0x9c00 << 16) | (0x8c04 >> 2),
193 (0x9c00 << 16) | (0x8c08 >> 2),
195 (0x8000 << 16) | (0x9b7c >> 2),
197 (0x8040 << 16) | (0x9b7c >> 2),
199 (0x8000 << 16) | (0xe84 >> 2),
201 (0x8040 << 16) | (0xe84 >> 2),
203 (0x8000 << 16) | (0x89c0 >> 2),
205 (0x8040 << 16) | (0x89c0 >> 2),
207 (0x8000 << 16) | (0x914c >> 2),
209 (0x8040 << 16) | (0x914c >> 2),
211 (0x8000 << 16) | (0x8c20 >> 2),
213 (0x8040 << 16) | (0x8c20 >> 2),
215 (0x8000 << 16) | (0x9354 >> 2),
217 (0x8040 << 16) | (0x9354 >> 2),
219 (0x9c00 << 16) | (0x9060 >> 2),
221 (0x9c00 << 16) | (0x9364 >> 2),
223 (0x9c00 << 16) | (0x9100 >> 2),
225 (0x9c00 << 16) | (0x913c >> 2),
227 (0x8000 << 16) | (0x90e0 >> 2),
229 (0x8000 << 16) | (0x90e4 >> 2),
231 (0x8000 << 16) | (0x90e8 >> 2),
233 (0x8040 << 16) | (0x90e0 >> 2),
235 (0x8040 << 16) | (0x90e4 >> 2),
237 (0x8040 << 16) | (0x90e8 >> 2),
239 (0x9c00 << 16) | (0x8bcc >> 2),
241 (0x9c00 << 16) | (0x8b24 >> 2),
243 (0x9c00 << 16) | (0x88c4 >> 2),
245 (0x9c00 << 16) | (0x8e50 >> 2),
247 (0x9c00 << 16) | (0x8c0c >> 2),
249 (0x9c00 << 16) | (0x8e58 >> 2),
251 (0x9c00 << 16) | (0x8e5c >> 2),
253 (0x9c00 << 16) | (0x9508 >> 2),
255 (0x9c00 << 16) | (0x950c >> 2),
257 (0x9c00 << 16) | (0x9494 >> 2),
259 (0x9c00 << 16) | (0xac0c >> 2),
261 (0x9c00 << 16) | (0xac10 >> 2),
263 (0x9c00 << 16) | (0xac14 >> 2),
265 (0x9c00 << 16) | (0xae00 >> 2),
267 (0x9c00 << 16) | (0xac08 >> 2),
269 (0x9c00 << 16) | (0x88d4 >> 2),
271 (0x9c00 << 16) | (0x88c8 >> 2),
273 (0x9c00 << 16) | (0x88cc >> 2),
275 (0x9c00 << 16) | (0x89b0 >> 2),
277 (0x9c00 << 16) | (0x8b10 >> 2),
279 (0x9c00 << 16) | (0x8a14 >> 2),
281 (0x9c00 << 16) | (0x9830 >> 2),
283 (0x9c00 << 16) | (0x9834 >> 2),
285 (0x9c00 << 16) | (0x9838 >> 2),
287 (0x9c00 << 16) | (0x9a10 >> 2),
289 (0x8000 << 16) | (0x9870 >> 2),
291 (0x8000 << 16) | (0x9874 >> 2),
293 (0x8001 << 16) | (0x9870 >> 2),
295 (0x8001 << 16) | (0x9874 >> 2),
297 (0x8040 << 16) | (0x9870 >> 2),
299 (0x8040 << 16) | (0x9874 >> 2),
301 (0x8041 << 16) | (0x9870 >> 2),
303 (0x8041 << 16) | (0x9874 >> 2),
308 static int gfx_v6_0_init_microcode(struct amdgpu_device
*adev
)
310 const char *chip_name
;
313 const struct gfx_firmware_header_v1_0
*cp_hdr
;
314 const struct rlc_firmware_header_v1_0
*rlc_hdr
;
318 switch (adev
->asic_type
) {
320 chip_name
= "tahiti";
323 chip_name
= "pitcairn";
332 chip_name
= "hainan";
337 snprintf(fw_name
, sizeof(fw_name
), "radeon/%s_pfp.bin", chip_name
);
338 err
= request_firmware(&adev
->gfx
.pfp_fw
, fw_name
, adev
->dev
);
341 err
= amdgpu_ucode_validate(adev
->gfx
.pfp_fw
);
344 cp_hdr
= (const struct gfx_firmware_header_v1_0
*)adev
->gfx
.pfp_fw
->data
;
345 adev
->gfx
.pfp_fw_version
= le32_to_cpu(cp_hdr
->header
.ucode_version
);
346 adev
->gfx
.pfp_feature_version
= le32_to_cpu(cp_hdr
->ucode_feature_version
);
348 snprintf(fw_name
, sizeof(fw_name
), "radeon/%s_me.bin", chip_name
);
349 err
= request_firmware(&adev
->gfx
.me_fw
, fw_name
, adev
->dev
);
352 err
= amdgpu_ucode_validate(adev
->gfx
.me_fw
);
355 cp_hdr
= (const struct gfx_firmware_header_v1_0
*)adev
->gfx
.me_fw
->data
;
356 adev
->gfx
.me_fw_version
= le32_to_cpu(cp_hdr
->header
.ucode_version
);
357 adev
->gfx
.me_feature_version
= le32_to_cpu(cp_hdr
->ucode_feature_version
);
359 snprintf(fw_name
, sizeof(fw_name
), "radeon/%s_ce.bin", chip_name
);
360 err
= request_firmware(&adev
->gfx
.ce_fw
, fw_name
, adev
->dev
);
363 err
= amdgpu_ucode_validate(adev
->gfx
.ce_fw
);
366 cp_hdr
= (const struct gfx_firmware_header_v1_0
*)adev
->gfx
.ce_fw
->data
;
367 adev
->gfx
.ce_fw_version
= le32_to_cpu(cp_hdr
->header
.ucode_version
);
368 adev
->gfx
.ce_feature_version
= le32_to_cpu(cp_hdr
->ucode_feature_version
);
370 snprintf(fw_name
, sizeof(fw_name
), "radeon/%s_rlc.bin", chip_name
);
371 err
= request_firmware(&adev
->gfx
.rlc_fw
, fw_name
, adev
->dev
);
374 err
= amdgpu_ucode_validate(adev
->gfx
.rlc_fw
);
375 rlc_hdr
= (const struct rlc_firmware_header_v1_0
*)adev
->gfx
.rlc_fw
->data
;
376 adev
->gfx
.rlc_fw_version
= le32_to_cpu(rlc_hdr
->header
.ucode_version
);
377 adev
->gfx
.rlc_feature_version
= le32_to_cpu(rlc_hdr
->ucode_feature_version
);
381 pr_err("gfx6: Failed to load firmware \"%s\"\n", fw_name
);
382 release_firmware(adev
->gfx
.pfp_fw
);
383 adev
->gfx
.pfp_fw
= NULL
;
384 release_firmware(adev
->gfx
.me_fw
);
385 adev
->gfx
.me_fw
= NULL
;
386 release_firmware(adev
->gfx
.ce_fw
);
387 adev
->gfx
.ce_fw
= NULL
;
388 release_firmware(adev
->gfx
.rlc_fw
);
389 adev
->gfx
.rlc_fw
= NULL
;
394 static void gfx_v6_0_tiling_mode_table_init(struct amdgpu_device
*adev
)
396 const u32 num_tile_mode_states
= 32;
397 u32 reg_offset
, gb_tile_moden
, split_equal_to_row_size
;
399 switch (adev
->gfx
.config
.mem_row_size_in_kb
) {
401 split_equal_to_row_size
= ADDR_SURF_TILE_SPLIT_1KB
;
405 split_equal_to_row_size
= ADDR_SURF_TILE_SPLIT_2KB
;
408 split_equal_to_row_size
= ADDR_SURF_TILE_SPLIT_4KB
;
412 if (adev
->asic_type
== CHIP_VERDE
) {
413 for (reg_offset
= 0; reg_offset
< num_tile_mode_states
; reg_offset
++) {
414 switch (reg_offset
) {
416 gb_tile_moden
= (MICRO_TILE_MODE(ADDR_SURF_DEPTH_MICRO_TILING
) |
417 ARRAY_MODE(ARRAY_2D_TILED_THIN1
) |
418 PIPE_CONFIG(ADDR_SURF_P4_8x16
) |
419 TILE_SPLIT(ADDR_SURF_TILE_SPLIT_64B
) |
420 BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1
) |
421 BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_4
) |
422 MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_4
) |
423 NUM_BANKS(ADDR_SURF_16_BANK
));
426 gb_tile_moden
= (MICRO_TILE_MODE(ADDR_SURF_DEPTH_MICRO_TILING
) |
427 ARRAY_MODE(ARRAY_2D_TILED_THIN1
) |
428 PIPE_CONFIG(ADDR_SURF_P4_8x16
) |
429 TILE_SPLIT(ADDR_SURF_TILE_SPLIT_128B
) |
430 BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1
) |
431 BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_4
) |
432 MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_4
) |
433 NUM_BANKS(ADDR_SURF_16_BANK
));
436 gb_tile_moden
= (MICRO_TILE_MODE(ADDR_SURF_DEPTH_MICRO_TILING
) |
437 ARRAY_MODE(ARRAY_2D_TILED_THIN1
) |
438 PIPE_CONFIG(ADDR_SURF_P4_8x16
) |
439 TILE_SPLIT(ADDR_SURF_TILE_SPLIT_256B
) |
440 BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1
) |
441 BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_4
) |
442 MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_4
) |
443 NUM_BANKS(ADDR_SURF_16_BANK
));
446 gb_tile_moden
= (MICRO_TILE_MODE(ADDR_SURF_DEPTH_MICRO_TILING
) |
447 ARRAY_MODE(ARRAY_2D_TILED_THIN1
) |
448 PIPE_CONFIG(ADDR_SURF_P4_8x16
) |
449 BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1
) |
450 BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_2
) |
451 MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_1
) |
452 NUM_BANKS(ADDR_SURF_8_BANK
) |
453 TILE_SPLIT(split_equal_to_row_size
));
456 gb_tile_moden
= (MICRO_TILE_MODE(ADDR_SURF_DEPTH_MICRO_TILING
) |
457 ARRAY_MODE(ARRAY_1D_TILED_THIN1
) |
458 PIPE_CONFIG(ADDR_SURF_P4_8x16
));
461 gb_tile_moden
= (MICRO_TILE_MODE(ADDR_SURF_DEPTH_MICRO_TILING
) |
462 ARRAY_MODE(ARRAY_2D_TILED_THIN1
) |
463 PIPE_CONFIG(ADDR_SURF_P4_8x16
) |
464 TILE_SPLIT(ADDR_SURF_TILE_SPLIT_512B
) |
465 BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1
) |
466 BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_2
) |
467 MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_1
) |
468 NUM_BANKS(ADDR_SURF_4_BANK
));
471 gb_tile_moden
= (MICRO_TILE_MODE(ADDR_SURF_DEPTH_MICRO_TILING
) |
472 ARRAY_MODE(ARRAY_2D_TILED_THIN1
) |
473 PIPE_CONFIG(ADDR_SURF_P4_8x16
) |
474 TILE_SPLIT(ADDR_SURF_TILE_SPLIT_256B
) |
475 BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1
) |
476 BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_4
) |
477 MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_1
) |
478 NUM_BANKS(ADDR_SURF_4_BANK
));
481 gb_tile_moden
= (MICRO_TILE_MODE(ADDR_SURF_DEPTH_MICRO_TILING
) |
482 ARRAY_MODE(ARRAY_2D_TILED_THIN1
) |
483 PIPE_CONFIG(ADDR_SURF_P4_8x16
) |
484 TILE_SPLIT(ADDR_SURF_TILE_SPLIT_1KB
) |
485 BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1
) |
486 BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_4
) |
487 MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_1
) |
488 NUM_BANKS(ADDR_SURF_2_BANK
));
491 gb_tile_moden
= (ARRAY_MODE(ARRAY_LINEAR_ALIGNED
));
494 gb_tile_moden
= (MICRO_TILE_MODE(ADDR_SURF_DISPLAY_MICRO_TILING
) |
495 ARRAY_MODE(ARRAY_1D_TILED_THIN1
) |
496 PIPE_CONFIG(ADDR_SURF_P4_8x16
));
499 gb_tile_moden
= (MICRO_TILE_MODE(ADDR_SURF_DISPLAY_MICRO_TILING
) |
500 ARRAY_MODE(ARRAY_2D_TILED_THIN1
) |
501 PIPE_CONFIG(ADDR_SURF_P4_8x16
) |
502 TILE_SPLIT(ADDR_SURF_TILE_SPLIT_256B
) |
503 BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1
) |
504 BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_4
) |
505 MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_4
) |
506 NUM_BANKS(ADDR_SURF_16_BANK
));
509 gb_tile_moden
= (MICRO_TILE_MODE(ADDR_SURF_DISPLAY_MICRO_TILING
) |
510 ARRAY_MODE(ARRAY_2D_TILED_THIN1
) |
511 PIPE_CONFIG(ADDR_SURF_P4_8x16
) |
512 TILE_SPLIT(ADDR_SURF_TILE_SPLIT_256B
) |
513 BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1
) |
514 BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_2
) |
515 MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_2
) |
516 NUM_BANKS(ADDR_SURF_16_BANK
));
519 gb_tile_moden
= (MICRO_TILE_MODE(ADDR_SURF_DISPLAY_MICRO_TILING
) |
520 ARRAY_MODE(ARRAY_2D_TILED_THIN1
) |
521 PIPE_CONFIG(ADDR_SURF_P4_8x16
) |
522 TILE_SPLIT(ADDR_SURF_TILE_SPLIT_512B
) |
523 BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1
) |
524 BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_1
) |
525 MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_2
) |
526 NUM_BANKS(ADDR_SURF_16_BANK
));
529 gb_tile_moden
= (MICRO_TILE_MODE(ADDR_SURF_THIN_MICRO_TILING
) |
530 ARRAY_MODE(ARRAY_1D_TILED_THIN1
) |
531 PIPE_CONFIG(ADDR_SURF_P4_8x16
));
534 gb_tile_moden
= (MICRO_TILE_MODE(ADDR_SURF_THIN_MICRO_TILING
) |
535 ARRAY_MODE(ARRAY_2D_TILED_THIN1
) |
536 PIPE_CONFIG(ADDR_SURF_P4_8x16
) |
537 TILE_SPLIT(ADDR_SURF_TILE_SPLIT_256B
) |
538 BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1
) |
539 BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_4
) |
540 MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_2
) |
541 NUM_BANKS(ADDR_SURF_16_BANK
));
544 gb_tile_moden
= (MICRO_TILE_MODE(ADDR_SURF_THIN_MICRO_TILING
) |
545 ARRAY_MODE(ARRAY_2D_TILED_THIN1
) |
546 PIPE_CONFIG(ADDR_SURF_P4_8x16
) |
547 TILE_SPLIT(ADDR_SURF_TILE_SPLIT_256B
) |
548 BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1
) |
549 BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_2
) |
550 MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_2
) |
551 NUM_BANKS(ADDR_SURF_16_BANK
));
554 gb_tile_moden
= (MICRO_TILE_MODE(ADDR_SURF_THIN_MICRO_TILING
) |
555 ARRAY_MODE(ARRAY_2D_TILED_THIN1
) |
556 PIPE_CONFIG(ADDR_SURF_P4_8x16
) |
557 TILE_SPLIT(ADDR_SURF_TILE_SPLIT_512B
) |
558 BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1
) |
559 BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_1
) |
560 MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_2
) |
561 NUM_BANKS(ADDR_SURF_16_BANK
));
564 gb_tile_moden
= (MICRO_TILE_MODE(ADDR_SURF_THIN_MICRO_TILING
) |
565 ARRAY_MODE(ARRAY_2D_TILED_THIN1
) |
566 PIPE_CONFIG(ADDR_SURF_P4_8x16
) |
567 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
) |
571 TILE_SPLIT(split_equal_to_row_size
));
574 gb_tile_moden
= (MICRO_TILE_MODE(ADDR_SURF_THIN_MICRO_TILING
) |
575 ARRAY_MODE(ARRAY_1D_TILED_THICK
) |
576 PIPE_CONFIG(ADDR_SURF_P4_8x16
));
579 gb_tile_moden
= (MICRO_TILE_MODE(ADDR_SURF_THIN_MICRO_TILING
) |
580 ARRAY_MODE(ARRAY_2D_TILED_XTHICK
) |
581 PIPE_CONFIG(ADDR_SURF_P4_8x16
) |
582 BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1
) |
583 BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_1
) |
584 MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_2
) |
585 NUM_BANKS(ADDR_SURF_16_BANK
) |
586 TILE_SPLIT(split_equal_to_row_size
));
589 gb_tile_moden
= (MICRO_TILE_MODE(ADDR_SURF_THIN_MICRO_TILING
) |
590 ARRAY_MODE(ARRAY_2D_TILED_THICK
) |
591 PIPE_CONFIG(ADDR_SURF_P4_8x16
) |
592 BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1
) |
593 BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_1
) |
594 MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_2
) |
595 NUM_BANKS(ADDR_SURF_16_BANK
) |
596 TILE_SPLIT(split_equal_to_row_size
));
599 gb_tile_moden
= (MICRO_TILE_MODE(ADDR_SURF_THIN_MICRO_TILING
) |
600 ARRAY_MODE(ARRAY_2D_TILED_THIN1
) |
601 PIPE_CONFIG(ADDR_SURF_P4_8x16
) |
602 TILE_SPLIT(ADDR_SURF_TILE_SPLIT_256B
) |
603 BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1
) |
604 BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_4
) |
605 MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_1
) |
606 NUM_BANKS(ADDR_SURF_8_BANK
));
609 gb_tile_moden
= (MICRO_TILE_MODE(ADDR_SURF_THIN_MICRO_TILING
) |
610 ARRAY_MODE(ARRAY_2D_TILED_THIN1
) |
611 PIPE_CONFIG(ADDR_SURF_P4_8x16
) |
612 TILE_SPLIT(ADDR_SURF_TILE_SPLIT_256B
) |
613 BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1
) |
614 BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_2
) |
615 MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_1
) |
616 NUM_BANKS(ADDR_SURF_8_BANK
));
619 gb_tile_moden
= (MICRO_TILE_MODE(ADDR_SURF_THIN_MICRO_TILING
) |
620 ARRAY_MODE(ARRAY_2D_TILED_THIN1
) |
621 PIPE_CONFIG(ADDR_SURF_P4_8x16
) |
622 TILE_SPLIT(ADDR_SURF_TILE_SPLIT_256B
) |
623 BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1
) |
624 BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_4
) |
625 MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_1
) |
626 NUM_BANKS(ADDR_SURF_4_BANK
));
629 gb_tile_moden
= (MICRO_TILE_MODE(ADDR_SURF_THIN_MICRO_TILING
) |
630 ARRAY_MODE(ARRAY_2D_TILED_THIN1
) |
631 PIPE_CONFIG(ADDR_SURF_P4_8x16
) |
632 TILE_SPLIT(ADDR_SURF_TILE_SPLIT_512B
) |
633 BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1
) |
634 BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_2
) |
635 MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_1
) |
636 NUM_BANKS(ADDR_SURF_4_BANK
));
639 gb_tile_moden
= (MICRO_TILE_MODE(ADDR_SURF_THIN_MICRO_TILING
) |
640 ARRAY_MODE(ARRAY_2D_TILED_THIN1
) |
641 PIPE_CONFIG(ADDR_SURF_P4_8x16
) |
642 TILE_SPLIT(ADDR_SURF_TILE_SPLIT_1KB
) |
643 BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1
) |
644 BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_4
) |
645 MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_1
) |
646 NUM_BANKS(ADDR_SURF_2_BANK
));
649 gb_tile_moden
= (MICRO_TILE_MODE(ADDR_SURF_THIN_MICRO_TILING
) |
650 ARRAY_MODE(ARRAY_2D_TILED_THIN1
) |
651 PIPE_CONFIG(ADDR_SURF_P4_8x16
) |
652 TILE_SPLIT(ADDR_SURF_TILE_SPLIT_1KB
) |
653 BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1
) |
654 BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_4
) |
655 MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_1
) |
656 NUM_BANKS(ADDR_SURF_2_BANK
));
659 gb_tile_moden
= (MICRO_TILE_MODE(ADDR_SURF_THIN_MICRO_TILING
) |
660 ARRAY_MODE(ARRAY_2D_TILED_THIN1
) |
661 PIPE_CONFIG(ADDR_SURF_P4_8x16
) |
662 TILE_SPLIT(ADDR_SURF_TILE_SPLIT_1KB
) |
663 BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1
) |
664 BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_4
) |
665 MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_1
) |
666 NUM_BANKS(ADDR_SURF_2_BANK
));
669 gb_tile_moden
= (MICRO_TILE_MODE(ADDR_SURF_THIN_MICRO_TILING
) |
670 ARRAY_MODE(ARRAY_2D_TILED_THIN1
) |
671 PIPE_CONFIG(ADDR_SURF_P4_8x16
) |
672 TILE_SPLIT(ADDR_SURF_TILE_SPLIT_1KB
) |
673 BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1
) |
674 BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_4
) |
675 MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_1
) |
676 NUM_BANKS(ADDR_SURF_2_BANK
));
679 gb_tile_moden
= (MICRO_TILE_MODE(ADDR_SURF_THIN_MICRO_TILING
) |
680 ARRAY_MODE(ARRAY_2D_TILED_THIN1
) |
681 PIPE_CONFIG(ADDR_SURF_P4_8x16
) |
682 TILE_SPLIT(ADDR_SURF_TILE_SPLIT_1KB
) |
683 BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1
) |
684 BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_4
) |
685 MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_1
) |
686 NUM_BANKS(ADDR_SURF_2_BANK
));
689 gb_tile_moden
= (MICRO_TILE_MODE(ADDR_SURF_THIN_MICRO_TILING
) |
690 ARRAY_MODE(ARRAY_2D_TILED_THIN1
) |
691 PIPE_CONFIG(ADDR_SURF_P4_8x16
) |
692 TILE_SPLIT(ADDR_SURF_TILE_SPLIT_2KB
) |
693 BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1
) |
694 BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_2
) |
695 MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_1
) |
696 NUM_BANKS(ADDR_SURF_2_BANK
));
701 adev
->gfx
.config
.tile_mode_array
[reg_offset
] = gb_tile_moden
;
702 WREG32(mmGB_TILE_MODE0
+ reg_offset
, gb_tile_moden
);
704 } else if (adev
->asic_type
== CHIP_OLAND
||
705 adev
->asic_type
== CHIP_HAINAN
) {
706 for (reg_offset
= 0; reg_offset
< num_tile_mode_states
; reg_offset
++) {
707 switch (reg_offset
) {
709 gb_tile_moden
= (MICRO_TILE_MODE(ADDR_SURF_DEPTH_MICRO_TILING
) |
710 ARRAY_MODE(ARRAY_2D_TILED_THIN1
) |
711 PIPE_CONFIG(ADDR_SURF_P2
) |
712 TILE_SPLIT(ADDR_SURF_TILE_SPLIT_64B
) |
713 BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1
) |
714 BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_4
) |
715 MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_4
) |
716 NUM_BANKS(ADDR_SURF_16_BANK
));
719 gb_tile_moden
= (MICRO_TILE_MODE(ADDR_SURF_DEPTH_MICRO_TILING
) |
720 ARRAY_MODE(ARRAY_2D_TILED_THIN1
) |
721 PIPE_CONFIG(ADDR_SURF_P2
) |
722 TILE_SPLIT(ADDR_SURF_TILE_SPLIT_128B
) |
723 BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1
) |
724 BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_4
) |
725 MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_4
) |
726 NUM_BANKS(ADDR_SURF_16_BANK
));
729 gb_tile_moden
= (MICRO_TILE_MODE(ADDR_SURF_DEPTH_MICRO_TILING
) |
730 ARRAY_MODE(ARRAY_2D_TILED_THIN1
) |
731 PIPE_CONFIG(ADDR_SURF_P2
) |
732 TILE_SPLIT(ADDR_SURF_TILE_SPLIT_256B
) |
733 BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1
) |
734 BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_4
) |
735 MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_4
) |
736 NUM_BANKS(ADDR_SURF_16_BANK
));
739 gb_tile_moden
= (MICRO_TILE_MODE(ADDR_SURF_DEPTH_MICRO_TILING
) |
740 ARRAY_MODE(ARRAY_2D_TILED_THIN1
) |
741 PIPE_CONFIG(ADDR_SURF_P2
) |
742 BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1
) |
743 BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_2
) |
744 MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_1
) |
745 NUM_BANKS(ADDR_SURF_8_BANK
) |
746 TILE_SPLIT(split_equal_to_row_size
));
749 gb_tile_moden
= (MICRO_TILE_MODE(ADDR_SURF_DEPTH_MICRO_TILING
) |
750 ARRAY_MODE(ARRAY_1D_TILED_THIN1
) |
751 PIPE_CONFIG(ADDR_SURF_P2
));
754 gb_tile_moden
= (MICRO_TILE_MODE(ADDR_SURF_DEPTH_MICRO_TILING
) |
755 ARRAY_MODE(ARRAY_2D_TILED_THIN1
) |
756 PIPE_CONFIG(ADDR_SURF_P2
) |
757 TILE_SPLIT(ADDR_SURF_TILE_SPLIT_512B
) |
758 BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1
) |
759 BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_1
) |
760 MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_1
) |
761 NUM_BANKS(ADDR_SURF_8_BANK
));
764 gb_tile_moden
= (MICRO_TILE_MODE(ADDR_SURF_DEPTH_MICRO_TILING
) |
765 ARRAY_MODE(ARRAY_2D_TILED_THIN1
) |
766 PIPE_CONFIG(ADDR_SURF_P2
) |
767 TILE_SPLIT(ADDR_SURF_TILE_SPLIT_256B
) |
768 BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1
) |
769 BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_2
) |
770 MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_1
) |
771 NUM_BANKS(ADDR_SURF_8_BANK
));
774 gb_tile_moden
= (MICRO_TILE_MODE(ADDR_SURF_DEPTH_MICRO_TILING
) |
775 ARRAY_MODE(ARRAY_2D_TILED_THIN1
) |
776 PIPE_CONFIG(ADDR_SURF_P2
) |
777 TILE_SPLIT(ADDR_SURF_TILE_SPLIT_1KB
) |
778 BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1
) |
779 BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_2
) |
780 MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_1
) |
781 NUM_BANKS(ADDR_SURF_4_BANK
));
784 gb_tile_moden
= (ARRAY_MODE(ARRAY_LINEAR_ALIGNED
));
787 gb_tile_moden
= (MICRO_TILE_MODE(ADDR_SURF_DISPLAY_MICRO_TILING
) |
788 ARRAY_MODE(ARRAY_1D_TILED_THIN1
) |
789 PIPE_CONFIG(ADDR_SURF_P2
));
792 gb_tile_moden
= (MICRO_TILE_MODE(ADDR_SURF_DISPLAY_MICRO_TILING
) |
793 ARRAY_MODE(ARRAY_2D_TILED_THIN1
) |
794 PIPE_CONFIG(ADDR_SURF_P2
) |
795 TILE_SPLIT(ADDR_SURF_TILE_SPLIT_256B
) |
796 BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1
) |
797 BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_4
) |
798 MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_4
) |
799 NUM_BANKS(ADDR_SURF_16_BANK
));
802 gb_tile_moden
= (MICRO_TILE_MODE(ADDR_SURF_DISPLAY_MICRO_TILING
) |
803 ARRAY_MODE(ARRAY_2D_TILED_THIN1
) |
804 PIPE_CONFIG(ADDR_SURF_P2
) |
805 TILE_SPLIT(ADDR_SURF_TILE_SPLIT_256B
) |
806 BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1
) |
807 BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_2
) |
808 MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_2
) |
809 NUM_BANKS(ADDR_SURF_16_BANK
));
812 gb_tile_moden
= (MICRO_TILE_MODE(ADDR_SURF_DISPLAY_MICRO_TILING
) |
813 ARRAY_MODE(ARRAY_2D_TILED_THIN1
) |
814 PIPE_CONFIG(ADDR_SURF_P2
) |
815 TILE_SPLIT(ADDR_SURF_TILE_SPLIT_512B
) |
816 BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1
) |
817 BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_1
) |
818 MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_2
) |
819 NUM_BANKS(ADDR_SURF_16_BANK
));
822 gb_tile_moden
= (MICRO_TILE_MODE(ADDR_SURF_THIN_MICRO_TILING
) |
823 ARRAY_MODE(ARRAY_1D_TILED_THIN1
) |
824 PIPE_CONFIG(ADDR_SURF_P2
));
827 gb_tile_moden
= (MICRO_TILE_MODE(ADDR_SURF_THIN_MICRO_TILING
) |
828 ARRAY_MODE(ARRAY_2D_TILED_THIN1
) |
829 PIPE_CONFIG(ADDR_SURF_P2
) |
830 TILE_SPLIT(ADDR_SURF_TILE_SPLIT_256B
) |
831 BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1
) |
832 BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_4
) |
833 MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_2
) |
834 NUM_BANKS(ADDR_SURF_16_BANK
));
837 gb_tile_moden
= (MICRO_TILE_MODE(ADDR_SURF_THIN_MICRO_TILING
) |
838 ARRAY_MODE(ARRAY_2D_TILED_THIN1
) |
839 PIPE_CONFIG(ADDR_SURF_P2
) |
840 TILE_SPLIT(ADDR_SURF_TILE_SPLIT_256B
) |
841 BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1
) |
842 BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_2
) |
843 MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_2
) |
844 NUM_BANKS(ADDR_SURF_16_BANK
));
847 gb_tile_moden
= (MICRO_TILE_MODE(ADDR_SURF_THIN_MICRO_TILING
) |
848 ARRAY_MODE(ARRAY_2D_TILED_THIN1
) |
849 PIPE_CONFIG(ADDR_SURF_P2
) |
850 TILE_SPLIT(ADDR_SURF_TILE_SPLIT_512B
) |
851 BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1
) |
852 BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_1
) |
853 MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_2
) |
854 NUM_BANKS(ADDR_SURF_16_BANK
));
857 gb_tile_moden
= (MICRO_TILE_MODE(ADDR_SURF_THIN_MICRO_TILING
) |
858 ARRAY_MODE(ARRAY_2D_TILED_THIN1
) |
859 PIPE_CONFIG(ADDR_SURF_P2
) |
860 BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1
) |
861 BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_1
) |
862 MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_2
) |
863 NUM_BANKS(ADDR_SURF_16_BANK
) |
864 TILE_SPLIT(split_equal_to_row_size
));
867 gb_tile_moden
= (MICRO_TILE_MODE(ADDR_SURF_THIN_MICRO_TILING
) |
868 ARRAY_MODE(ARRAY_1D_TILED_THICK
) |
869 PIPE_CONFIG(ADDR_SURF_P2
));
872 gb_tile_moden
= (MICRO_TILE_MODE(ADDR_SURF_THIN_MICRO_TILING
) |
873 ARRAY_MODE(ARRAY_2D_TILED_XTHICK
) |
874 PIPE_CONFIG(ADDR_SURF_P2
) |
875 BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1
) |
876 BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_1
) |
877 MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_2
) |
878 NUM_BANKS(ADDR_SURF_16_BANK
) |
879 TILE_SPLIT(split_equal_to_row_size
));
882 gb_tile_moden
= (MICRO_TILE_MODE(ADDR_SURF_THIN_MICRO_TILING
) |
883 ARRAY_MODE(ARRAY_2D_TILED_THICK
) |
884 PIPE_CONFIG(ADDR_SURF_P2
) |
885 BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1
) |
886 BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_1
) |
887 MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_2
) |
888 NUM_BANKS(ADDR_SURF_16_BANK
) |
889 TILE_SPLIT(split_equal_to_row_size
));
892 gb_tile_moden
= (MICRO_TILE_MODE(ADDR_SURF_THIN_MICRO_TILING
) |
893 ARRAY_MODE(ARRAY_2D_TILED_THIN1
) |
894 PIPE_CONFIG(ADDR_SURF_P2
) |
895 TILE_SPLIT(ADDR_SURF_TILE_SPLIT_256B
) |
896 BANK_WIDTH(ADDR_SURF_BANK_WIDTH_2
) |
897 BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_4
) |
898 MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_1
) |
899 NUM_BANKS(ADDR_SURF_8_BANK
));
902 gb_tile_moden
= (MICRO_TILE_MODE(ADDR_SURF_THIN_MICRO_TILING
) |
903 ARRAY_MODE(ARRAY_2D_TILED_THIN1
) |
904 PIPE_CONFIG(ADDR_SURF_P2
) |
905 TILE_SPLIT(ADDR_SURF_TILE_SPLIT_256B
) |
906 BANK_WIDTH(ADDR_SURF_BANK_WIDTH_2
) |
907 BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_2
) |
908 MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_1
) |
909 NUM_BANKS(ADDR_SURF_8_BANK
));
912 gb_tile_moden
= (MICRO_TILE_MODE(ADDR_SURF_THIN_MICRO_TILING
) |
913 ARRAY_MODE(ARRAY_2D_TILED_THIN1
) |
914 PIPE_CONFIG(ADDR_SURF_P2
) |
915 TILE_SPLIT(ADDR_SURF_TILE_SPLIT_256B
) |
916 BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1
) |
917 BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_2
) |
918 MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_1
) |
919 NUM_BANKS(ADDR_SURF_8_BANK
));
922 gb_tile_moden
= (MICRO_TILE_MODE(ADDR_SURF_THIN_MICRO_TILING
) |
923 ARRAY_MODE(ARRAY_2D_TILED_THIN1
) |
924 PIPE_CONFIG(ADDR_SURF_P2
) |
925 TILE_SPLIT(ADDR_SURF_TILE_SPLIT_512B
) |
926 BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1
) |
927 BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_1
) |
928 MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_1
) |
929 NUM_BANKS(ADDR_SURF_8_BANK
));
932 gb_tile_moden
= (MICRO_TILE_MODE(ADDR_SURF_THIN_MICRO_TILING
) |
933 ARRAY_MODE(ARRAY_2D_TILED_THIN1
) |
934 PIPE_CONFIG(ADDR_SURF_P2
) |
935 TILE_SPLIT(ADDR_SURF_TILE_SPLIT_1KB
) |
936 BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1
) |
937 BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_2
) |
938 MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_1
) |
939 NUM_BANKS(ADDR_SURF_4_BANK
));
942 gb_tile_moden
= (MICRO_TILE_MODE(ADDR_SURF_THIN_MICRO_TILING
) |
943 ARRAY_MODE(ARRAY_2D_TILED_THIN1
) |
944 PIPE_CONFIG(ADDR_SURF_P2
) |
945 TILE_SPLIT(ADDR_SURF_TILE_SPLIT_1KB
) |
946 BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1
) |
947 BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_2
) |
948 MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_1
) |
949 NUM_BANKS(ADDR_SURF_4_BANK
));
952 gb_tile_moden
= (MICRO_TILE_MODE(ADDR_SURF_THIN_MICRO_TILING
) |
953 ARRAY_MODE(ARRAY_2D_TILED_THIN1
) |
954 PIPE_CONFIG(ADDR_SURF_P2
) |
955 TILE_SPLIT(ADDR_SURF_TILE_SPLIT_1KB
) |
956 BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1
) |
957 BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_2
) |
958 MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_1
) |
959 NUM_BANKS(ADDR_SURF_4_BANK
));
962 gb_tile_moden
= (MICRO_TILE_MODE(ADDR_SURF_THIN_MICRO_TILING
) |
963 ARRAY_MODE(ARRAY_2D_TILED_THIN1
) |
964 PIPE_CONFIG(ADDR_SURF_P2
) |
965 TILE_SPLIT(ADDR_SURF_TILE_SPLIT_1KB
) |
966 BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1
) |
967 BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_2
) |
968 MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_1
) |
969 NUM_BANKS(ADDR_SURF_4_BANK
));
972 gb_tile_moden
= (MICRO_TILE_MODE(ADDR_SURF_THIN_MICRO_TILING
) |
973 ARRAY_MODE(ARRAY_2D_TILED_THIN1
) |
974 PIPE_CONFIG(ADDR_SURF_P2
) |
975 TILE_SPLIT(ADDR_SURF_TILE_SPLIT_1KB
) |
976 BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1
) |
977 BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_2
) |
978 MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_1
) |
979 NUM_BANKS(ADDR_SURF_4_BANK
));
982 gb_tile_moden
= (MICRO_TILE_MODE(ADDR_SURF_THIN_MICRO_TILING
) |
983 ARRAY_MODE(ARRAY_2D_TILED_THIN1
) |
984 PIPE_CONFIG(ADDR_SURF_P2
) |
985 TILE_SPLIT(ADDR_SURF_TILE_SPLIT_2KB
) |
986 BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1
) |
987 BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_1
) |
988 MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_1
) |
989 NUM_BANKS(ADDR_SURF_4_BANK
));
994 adev
->gfx
.config
.tile_mode_array
[reg_offset
] = gb_tile_moden
;
995 WREG32(mmGB_TILE_MODE0
+ reg_offset
, gb_tile_moden
);
997 } else if ((adev
->asic_type
== CHIP_TAHITI
) || (adev
->asic_type
== CHIP_PITCAIRN
)) {
998 for (reg_offset
= 0; reg_offset
< num_tile_mode_states
; reg_offset
++) {
999 switch (reg_offset
) {
1001 gb_tile_moden
= (MICRO_TILE_MODE(ADDR_SURF_DEPTH_MICRO_TILING
) |
1002 ARRAY_MODE(ARRAY_2D_TILED_THIN1
) |
1003 PIPE_CONFIG(ADDR_SURF_P8_32x32_8x16
) |
1004 TILE_SPLIT(ADDR_SURF_TILE_SPLIT_64B
) |
1005 BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1
) |
1006 BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_4
) |
1007 MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_2
) |
1008 NUM_BANKS(ADDR_SURF_16_BANK
));
1011 gb_tile_moden
= (MICRO_TILE_MODE(ADDR_SURF_DEPTH_MICRO_TILING
) |
1012 ARRAY_MODE(ARRAY_2D_TILED_THIN1
) |
1013 PIPE_CONFIG(ADDR_SURF_P8_32x32_8x16
) |
1014 TILE_SPLIT(ADDR_SURF_TILE_SPLIT_128B
) |
1015 BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1
) |
1016 BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_4
) |
1017 MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_2
) |
1018 NUM_BANKS(ADDR_SURF_16_BANK
));
1021 gb_tile_moden
= (MICRO_TILE_MODE(ADDR_SURF_DEPTH_MICRO_TILING
) |
1022 ARRAY_MODE(ARRAY_2D_TILED_THIN1
) |
1023 PIPE_CONFIG(ADDR_SURF_P8_32x32_8x16
) |
1024 TILE_SPLIT(ADDR_SURF_TILE_SPLIT_256B
) |
1025 BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1
) |
1026 BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_4
) |
1027 MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_2
) |
1028 NUM_BANKS(ADDR_SURF_16_BANK
));
1031 gb_tile_moden
= (MICRO_TILE_MODE(ADDR_SURF_DEPTH_MICRO_TILING
) |
1032 ARRAY_MODE(ARRAY_2D_TILED_THIN1
) |
1033 PIPE_CONFIG(ADDR_SURF_P8_32x32_8x16
) |
1034 BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1
) |
1035 BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_4
) |
1036 MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_1
) |
1037 NUM_BANKS(ADDR_SURF_4_BANK
) |
1038 TILE_SPLIT(split_equal_to_row_size
));
1041 gb_tile_moden
= (MICRO_TILE_MODE(ADDR_SURF_DEPTH_MICRO_TILING
) |
1042 ARRAY_MODE(ARRAY_1D_TILED_THIN1
) |
1043 PIPE_CONFIG(ADDR_SURF_P8_32x32_8x16
));
1046 gb_tile_moden
= (MICRO_TILE_MODE(ADDR_SURF_DEPTH_MICRO_TILING
) |
1047 ARRAY_MODE(ARRAY_2D_TILED_THIN1
) |
1048 PIPE_CONFIG(ADDR_SURF_P8_32x32_8x16
) |
1049 TILE_SPLIT(ADDR_SURF_TILE_SPLIT_512B
) |
1050 BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1
) |
1051 BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_4
) |
1052 MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_1
) |
1053 NUM_BANKS(ADDR_SURF_2_BANK
));
1056 gb_tile_moden
= (MICRO_TILE_MODE(ADDR_SURF_DEPTH_MICRO_TILING
) |
1057 ARRAY_MODE(ARRAY_2D_TILED_THIN1
) |
1058 PIPE_CONFIG(ADDR_SURF_P8_32x32_8x16
) |
1059 TILE_SPLIT(ADDR_SURF_TILE_SPLIT_256B
) |
1060 BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1
) |
1061 BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_8
) |
1062 MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_1
) |
1063 NUM_BANKS(ADDR_SURF_2_BANK
));
1066 gb_tile_moden
= (MICRO_TILE_MODE(ADDR_SURF_DEPTH_MICRO_TILING
) |
1067 ARRAY_MODE(ARRAY_2D_TILED_THIN1
) |
1068 PIPE_CONFIG(ADDR_SURF_P4_8x16
) |
1069 TILE_SPLIT(ADDR_SURF_TILE_SPLIT_1KB
) |
1070 BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1
) |
1071 BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_4
) |
1072 MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_1
) |
1073 NUM_BANKS(ADDR_SURF_2_BANK
));
1076 gb_tile_moden
= (ARRAY_MODE(ARRAY_LINEAR_ALIGNED
));
1079 gb_tile_moden
= (MICRO_TILE_MODE(ADDR_SURF_DISPLAY_MICRO_TILING
) |
1080 ARRAY_MODE(ARRAY_1D_TILED_THIN1
) |
1081 PIPE_CONFIG(ADDR_SURF_P8_32x32_8x16
));
1084 gb_tile_moden
= (MICRO_TILE_MODE(ADDR_SURF_DISPLAY_MICRO_TILING
) |
1085 ARRAY_MODE(ARRAY_2D_TILED_THIN1
) |
1086 PIPE_CONFIG(ADDR_SURF_P8_32x32_8x16
) |
1087 TILE_SPLIT(ADDR_SURF_TILE_SPLIT_256B
) |
1088 BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1
) |
1089 BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_4
) |
1090 MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_2
) |
1091 NUM_BANKS(ADDR_SURF_16_BANK
));
1094 gb_tile_moden
= (MICRO_TILE_MODE(ADDR_SURF_DISPLAY_MICRO_TILING
) |
1095 ARRAY_MODE(ARRAY_2D_TILED_THIN1
) |
1096 PIPE_CONFIG(ADDR_SURF_P8_32x32_8x16
) |
1097 TILE_SPLIT(ADDR_SURF_TILE_SPLIT_256B
) |
1098 BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1
) |
1099 BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_2
) |
1100 MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_2
) |
1101 NUM_BANKS(ADDR_SURF_16_BANK
));
1104 gb_tile_moden
= (MICRO_TILE_MODE(ADDR_SURF_DISPLAY_MICRO_TILING
) |
1105 ARRAY_MODE(ARRAY_2D_TILED_THIN1
) |
1106 PIPE_CONFIG(ADDR_SURF_P8_32x32_8x16
) |
1107 TILE_SPLIT(ADDR_SURF_TILE_SPLIT_512B
) |
1108 BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1
) |
1109 BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_1
) |
1110 MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_1
) |
1111 NUM_BANKS(ADDR_SURF_16_BANK
));
1114 gb_tile_moden
= (MICRO_TILE_MODE(ADDR_SURF_THIN_MICRO_TILING
) |
1115 ARRAY_MODE(ARRAY_1D_TILED_THIN1
) |
1116 PIPE_CONFIG(ADDR_SURF_P8_32x32_8x16
));
1119 gb_tile_moden
= (MICRO_TILE_MODE(ADDR_SURF_THIN_MICRO_TILING
) |
1120 ARRAY_MODE(ARRAY_2D_TILED_THIN1
) |
1121 PIPE_CONFIG(ADDR_SURF_P8_32x32_8x16
) |
1122 TILE_SPLIT(ADDR_SURF_TILE_SPLIT_256B
) |
1123 BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1
) |
1124 BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_4
) |
1125 MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_1
) |
1126 NUM_BANKS(ADDR_SURF_16_BANK
));
1129 gb_tile_moden
= (MICRO_TILE_MODE(ADDR_SURF_THIN_MICRO_TILING
) |
1130 ARRAY_MODE(ARRAY_2D_TILED_THIN1
) |
1131 PIPE_CONFIG(ADDR_SURF_P8_32x32_8x16
) |
1132 TILE_SPLIT(ADDR_SURF_TILE_SPLIT_256B
) |
1133 BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1
) |
1134 BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_2
) |
1135 MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_1
) |
1136 NUM_BANKS(ADDR_SURF_16_BANK
));
1139 gb_tile_moden
= (MICRO_TILE_MODE(ADDR_SURF_THIN_MICRO_TILING
) |
1140 ARRAY_MODE(ARRAY_2D_TILED_THIN1
) |
1141 PIPE_CONFIG(ADDR_SURF_P8_32x32_8x16
) |
1142 TILE_SPLIT(ADDR_SURF_TILE_SPLIT_512B
) |
1143 BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1
) |
1144 BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_1
) |
1145 MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_1
) |
1146 NUM_BANKS(ADDR_SURF_16_BANK
));
1149 gb_tile_moden
= (MICRO_TILE_MODE(ADDR_SURF_THIN_MICRO_TILING
) |
1150 ARRAY_MODE(ARRAY_2D_TILED_THIN1
) |
1151 PIPE_CONFIG(ADDR_SURF_P8_32x32_8x16
) |
1152 BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1
) |
1153 BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_1
) |
1154 MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_1
) |
1155 NUM_BANKS(ADDR_SURF_16_BANK
) |
1156 TILE_SPLIT(split_equal_to_row_size
));
1159 gb_tile_moden
= (MICRO_TILE_MODE(ADDR_SURF_THIN_MICRO_TILING
) |
1160 ARRAY_MODE(ARRAY_1D_TILED_THICK
) |
1161 PIPE_CONFIG(ADDR_SURF_P8_32x32_8x16
));
1164 gb_tile_moden
= (MICRO_TILE_MODE(ADDR_SURF_THIN_MICRO_TILING
) |
1165 ARRAY_MODE(ARRAY_2D_TILED_XTHICK
) |
1166 PIPE_CONFIG(ADDR_SURF_P8_32x32_8x16
) |
1167 BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1
) |
1168 BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_1
) |
1169 MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_1
) |
1170 NUM_BANKS(ADDR_SURF_16_BANK
) |
1171 TILE_SPLIT(split_equal_to_row_size
));
1174 gb_tile_moden
= (MICRO_TILE_MODE(ADDR_SURF_THIN_MICRO_TILING
) |
1175 ARRAY_MODE(ARRAY_2D_TILED_THICK
) |
1176 PIPE_CONFIG(ADDR_SURF_P8_32x32_8x16
) |
1177 BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1
) |
1178 BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_1
) |
1179 MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_1
) |
1180 NUM_BANKS(ADDR_SURF_16_BANK
) |
1181 TILE_SPLIT(split_equal_to_row_size
));
1184 gb_tile_moden
= (MICRO_TILE_MODE(ADDR_SURF_THIN_MICRO_TILING
) |
1185 ARRAY_MODE(ARRAY_2D_TILED_THIN1
) |
1186 PIPE_CONFIG(ADDR_SURF_P8_32x32_8x16
) |
1187 TILE_SPLIT(ADDR_SURF_TILE_SPLIT_256B
) |
1188 BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1
) |
1189 BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_8
) |
1190 MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_1
) |
1191 NUM_BANKS(ADDR_SURF_4_BANK
));
1194 gb_tile_moden
= (MICRO_TILE_MODE(ADDR_SURF_THIN_MICRO_TILING
) |
1195 ARRAY_MODE(ARRAY_2D_TILED_THIN1
) |
1196 PIPE_CONFIG(ADDR_SURF_P8_32x32_8x16
) |
1197 TILE_SPLIT(ADDR_SURF_TILE_SPLIT_256B
) |
1198 BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1
) |
1199 BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_4
) |
1200 MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_1
) |
1201 NUM_BANKS(ADDR_SURF_4_BANK
));
1204 gb_tile_moden
= (MICRO_TILE_MODE(ADDR_SURF_THIN_MICRO_TILING
) |
1205 ARRAY_MODE(ARRAY_2D_TILED_THIN1
) |
1206 PIPE_CONFIG(ADDR_SURF_P8_32x32_8x16
) |
1207 TILE_SPLIT(ADDR_SURF_TILE_SPLIT_256B
) |
1208 BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1
) |
1209 BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_8
) |
1210 MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_1
) |
1211 NUM_BANKS(ADDR_SURF_2_BANK
));
1214 gb_tile_moden
= (MICRO_TILE_MODE(ADDR_SURF_THIN_MICRO_TILING
) |
1215 ARRAY_MODE(ARRAY_2D_TILED_THIN1
) |
1216 PIPE_CONFIG(ADDR_SURF_P8_32x32_8x16
) |
1217 TILE_SPLIT(ADDR_SURF_TILE_SPLIT_512B
) |
1218 BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1
) |
1219 BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_4
) |
1220 MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_1
) |
1221 NUM_BANKS(ADDR_SURF_2_BANK
));
1224 gb_tile_moden
= (MICRO_TILE_MODE(ADDR_SURF_THIN_MICRO_TILING
) |
1225 ARRAY_MODE(ARRAY_2D_TILED_THIN1
) |
1226 PIPE_CONFIG(ADDR_SURF_P4_8x16
) |
1227 TILE_SPLIT(ADDR_SURF_TILE_SPLIT_1KB
) |
1228 BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1
) |
1229 BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_4
) |
1230 MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_1
) |
1231 NUM_BANKS(ADDR_SURF_2_BANK
));
1234 gb_tile_moden
= (MICRO_TILE_MODE(ADDR_SURF_THIN_MICRO_TILING
) |
1235 ARRAY_MODE(ARRAY_2D_TILED_THIN1
) |
1236 PIPE_CONFIG(ADDR_SURF_P4_8x16
) |
1237 TILE_SPLIT(ADDR_SURF_TILE_SPLIT_1KB
) |
1238 BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1
) |
1239 BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_4
) |
1240 MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_1
) |
1241 NUM_BANKS(ADDR_SURF_2_BANK
));
1244 gb_tile_moden
= (MICRO_TILE_MODE(ADDR_SURF_THIN_MICRO_TILING
) |
1245 ARRAY_MODE(ARRAY_2D_TILED_THIN1
) |
1246 PIPE_CONFIG(ADDR_SURF_P4_8x16
) |
1247 TILE_SPLIT(ADDR_SURF_TILE_SPLIT_1KB
) |
1248 BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1
) |
1249 BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_4
) |
1250 MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_1
) |
1251 NUM_BANKS(ADDR_SURF_2_BANK
));
1254 gb_tile_moden
= (MICRO_TILE_MODE(ADDR_SURF_THIN_MICRO_TILING
) |
1255 ARRAY_MODE(ARRAY_2D_TILED_THIN1
) |
1256 PIPE_CONFIG(ADDR_SURF_P4_8x16
) |
1257 TILE_SPLIT(ADDR_SURF_TILE_SPLIT_1KB
) |
1258 BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1
) |
1259 BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_4
) |
1260 MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_1
) |
1261 NUM_BANKS(ADDR_SURF_2_BANK
));
1264 gb_tile_moden
= (MICRO_TILE_MODE(ADDR_SURF_THIN_MICRO_TILING
) |
1265 ARRAY_MODE(ARRAY_2D_TILED_THIN1
) |
1266 PIPE_CONFIG(ADDR_SURF_P4_8x16
) |
1267 TILE_SPLIT(ADDR_SURF_TILE_SPLIT_1KB
) |
1268 BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1
) |
1269 BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_4
) |
1270 MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_1
) |
1271 NUM_BANKS(ADDR_SURF_2_BANK
));
1274 gb_tile_moden
= (MICRO_TILE_MODE(ADDR_SURF_THIN_MICRO_TILING
) |
1275 ARRAY_MODE(ARRAY_2D_TILED_THIN1
) |
1276 PIPE_CONFIG(ADDR_SURF_P4_8x16
) |
1277 TILE_SPLIT(ADDR_SURF_TILE_SPLIT_2KB
) |
1278 BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1
) |
1279 BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_2
) |
1280 MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_1
) |
1281 NUM_BANKS(ADDR_SURF_2_BANK
));
1286 adev
->gfx
.config
.tile_mode_array
[reg_offset
] = gb_tile_moden
;
1287 WREG32(mmGB_TILE_MODE0
+ reg_offset
, gb_tile_moden
);
1291 DRM_ERROR("unknown asic: 0x%x\n", adev
->asic_type
);
1296 static void gfx_v6_0_select_se_sh(struct amdgpu_device
*adev
, u32 se_num
,
1297 u32 sh_num
, u32 instance
)
1301 if (instance
== 0xffffffff)
1302 data
= REG_SET_FIELD(0, GRBM_GFX_INDEX
, INSTANCE_BROADCAST_WRITES
, 1);
1304 data
= REG_SET_FIELD(0, GRBM_GFX_INDEX
, INSTANCE_INDEX
, instance
);
1306 if ((se_num
== 0xffffffff) && (sh_num
== 0xffffffff))
1307 data
|= GRBM_GFX_INDEX__SH_BROADCAST_WRITES_MASK
|
1308 GRBM_GFX_INDEX__SE_BROADCAST_WRITES_MASK
;
1309 else if (se_num
== 0xffffffff)
1310 data
|= GRBM_GFX_INDEX__SE_BROADCAST_WRITES_MASK
|
1311 (sh_num
<< GRBM_GFX_INDEX__SH_INDEX__SHIFT
);
1312 else if (sh_num
== 0xffffffff)
1313 data
|= GRBM_GFX_INDEX__SH_BROADCAST_WRITES_MASK
|
1314 (se_num
<< GRBM_GFX_INDEX__SE_INDEX__SHIFT
);
1316 data
|= (sh_num
<< GRBM_GFX_INDEX__SH_INDEX__SHIFT
) |
1317 (se_num
<< GRBM_GFX_INDEX__SE_INDEX__SHIFT
);
1318 WREG32(mmGRBM_GFX_INDEX
, data
);
1321 static u32
gfx_v6_0_create_bitmask(u32 bit_width
)
1323 return (u32
)(((u64
)1 << bit_width
) - 1);
1326 static u32
gfx_v6_0_get_rb_active_bitmap(struct amdgpu_device
*adev
)
1330 data
= RREG32(mmCC_RB_BACKEND_DISABLE
) |
1331 RREG32(mmGC_USER_RB_BACKEND_DISABLE
);
1333 data
= REG_GET_FIELD(data
, GC_USER_RB_BACKEND_DISABLE
, BACKEND_DISABLE
);
1335 mask
= gfx_v6_0_create_bitmask(adev
->gfx
.config
.max_backends_per_se
/
1336 adev
->gfx
.config
.max_sh_per_se
);
1338 return ~data
& mask
;
1341 static void gfx_v6_0_raster_config(struct amdgpu_device
*adev
, u32
*rconf
)
1343 switch (adev
->asic_type
) {
1347 (2 << PA_SC_RASTER_CONFIG__RB_XSEL2__SHIFT
) |
1348 (1 << PA_SC_RASTER_CONFIG__RB_XSEL__SHIFT
) |
1349 (2 << PA_SC_RASTER_CONFIG__PKR_MAP__SHIFT
) |
1350 (1 << PA_SC_RASTER_CONFIG__PKR_YSEL__SHIFT
) |
1351 (2 << PA_SC_RASTER_CONFIG__SE_MAP__SHIFT
) |
1352 (2 << PA_SC_RASTER_CONFIG__SE_XSEL__SHIFT
) |
1353 (2 << PA_SC_RASTER_CONFIG__SE_YSEL__SHIFT
);
1357 (1 << PA_SC_RASTER_CONFIG__RB_XSEL__SHIFT
) |
1358 (2 << PA_SC_RASTER_CONFIG__PKR_MAP__SHIFT
) |
1359 (1 << PA_SC_RASTER_CONFIG__PKR_YSEL__SHIFT
);
1362 *rconf
|= (1 << PA_SC_RASTER_CONFIG__RB_YSEL__SHIFT
);
1368 DRM_ERROR("unknown asic: 0x%x\n", adev
->asic_type
);
1373 static void gfx_v6_0_write_harvested_raster_configs(struct amdgpu_device
*adev
,
1374 u32 raster_config
, unsigned rb_mask
,
1377 unsigned sh_per_se
= max_t(unsigned, adev
->gfx
.config
.max_sh_per_se
, 1);
1378 unsigned num_se
= max_t(unsigned, adev
->gfx
.config
.max_shader_engines
, 1);
1379 unsigned rb_per_pkr
= min_t(unsigned, num_rb
/ num_se
/ sh_per_se
, 2);
1380 unsigned rb_per_se
= num_rb
/ num_se
;
1381 unsigned se_mask
[4];
1384 se_mask
[0] = ((1 << rb_per_se
) - 1) & rb_mask
;
1385 se_mask
[1] = (se_mask
[0] << rb_per_se
) & rb_mask
;
1386 se_mask
[2] = (se_mask
[1] << rb_per_se
) & rb_mask
;
1387 se_mask
[3] = (se_mask
[2] << rb_per_se
) & rb_mask
;
1389 WARN_ON(!(num_se
== 1 || num_se
== 2 || num_se
== 4));
1390 WARN_ON(!(sh_per_se
== 1 || sh_per_se
== 2));
1391 WARN_ON(!(rb_per_pkr
== 1 || rb_per_pkr
== 2));
1393 for (se
= 0; se
< num_se
; se
++) {
1394 unsigned raster_config_se
= raster_config
;
1395 unsigned pkr0_mask
= ((1 << rb_per_pkr
) - 1) << (se
* rb_per_se
);
1396 unsigned pkr1_mask
= pkr0_mask
<< rb_per_pkr
;
1397 int idx
= (se
/ 2) * 2;
1399 if ((num_se
> 1) && (!se_mask
[idx
] || !se_mask
[idx
+ 1])) {
1400 raster_config_se
&= ~PA_SC_RASTER_CONFIG__SE_MAP_MASK
;
1402 if (!se_mask
[idx
]) {
1403 raster_config_se
|= RASTER_CONFIG_SE_MAP_3
<< PA_SC_RASTER_CONFIG__SE_MAP__SHIFT
;
1405 raster_config_se
|= RASTER_CONFIG_SE_MAP_0
<< PA_SC_RASTER_CONFIG__SE_MAP__SHIFT
;
1409 pkr0_mask
&= rb_mask
;
1410 pkr1_mask
&= rb_mask
;
1411 if (rb_per_se
> 2 && (!pkr0_mask
|| !pkr1_mask
)) {
1412 raster_config_se
&= ~PA_SC_RASTER_CONFIG__PKR_MAP_MASK
;
1415 raster_config_se
|= RASTER_CONFIG_PKR_MAP_3
<< PA_SC_RASTER_CONFIG__PKR_MAP__SHIFT
;
1417 raster_config_se
|= RASTER_CONFIG_PKR_MAP_0
<< PA_SC_RASTER_CONFIG__PKR_MAP__SHIFT
;
1421 if (rb_per_se
>= 2) {
1422 unsigned rb0_mask
= 1 << (se
* rb_per_se
);
1423 unsigned rb1_mask
= rb0_mask
<< 1;
1425 rb0_mask
&= rb_mask
;
1426 rb1_mask
&= rb_mask
;
1427 if (!rb0_mask
|| !rb1_mask
) {
1428 raster_config_se
&= ~PA_SC_RASTER_CONFIG__RB_MAP_PKR0_MASK
;
1432 RASTER_CONFIG_RB_MAP_3
<< PA_SC_RASTER_CONFIG__RB_MAP_PKR0__SHIFT
;
1435 RASTER_CONFIG_RB_MAP_0
<< PA_SC_RASTER_CONFIG__RB_MAP_PKR0__SHIFT
;
1439 if (rb_per_se
> 2) {
1440 rb0_mask
= 1 << (se
* rb_per_se
+ rb_per_pkr
);
1441 rb1_mask
= rb0_mask
<< 1;
1442 rb0_mask
&= rb_mask
;
1443 rb1_mask
&= rb_mask
;
1444 if (!rb0_mask
|| !rb1_mask
) {
1445 raster_config_se
&= ~PA_SC_RASTER_CONFIG__RB_MAP_PKR1_MASK
;
1449 RASTER_CONFIG_RB_MAP_3
<< PA_SC_RASTER_CONFIG__RB_MAP_PKR1__SHIFT
;
1452 RASTER_CONFIG_RB_MAP_0
<< PA_SC_RASTER_CONFIG__RB_MAP_PKR1__SHIFT
;
1458 /* GRBM_GFX_INDEX has a different offset on SI */
1459 gfx_v6_0_select_se_sh(adev
, se
, 0xffffffff, 0xffffffff);
1460 WREG32(mmPA_SC_RASTER_CONFIG
, raster_config_se
);
1463 /* GRBM_GFX_INDEX has a different offset on SI */
1464 gfx_v6_0_select_se_sh(adev
, 0xffffffff, 0xffffffff, 0xffffffff);
1467 static void gfx_v6_0_setup_rb(struct amdgpu_device
*adev
)
1471 u32 raster_config
= 0;
1473 u32 rb_bitmap_width_per_sh
= adev
->gfx
.config
.max_backends_per_se
/
1474 adev
->gfx
.config
.max_sh_per_se
;
1475 unsigned num_rb_pipes
;
1477 mutex_lock(&adev
->grbm_idx_mutex
);
1478 for (i
= 0; i
< adev
->gfx
.config
.max_shader_engines
; i
++) {
1479 for (j
= 0; j
< adev
->gfx
.config
.max_sh_per_se
; j
++) {
1480 gfx_v6_0_select_se_sh(adev
, i
, j
, 0xffffffff);
1481 data
= gfx_v6_0_get_rb_active_bitmap(adev
);
1482 active_rbs
|= data
<< ((i
* adev
->gfx
.config
.max_sh_per_se
+ j
) *
1483 rb_bitmap_width_per_sh
);
1486 gfx_v6_0_select_se_sh(adev
, 0xffffffff, 0xffffffff, 0xffffffff);
1488 adev
->gfx
.config
.backend_enable_mask
= active_rbs
;
1489 adev
->gfx
.config
.num_rbs
= hweight32(active_rbs
);
1491 num_rb_pipes
= min_t(unsigned, adev
->gfx
.config
.max_backends_per_se
*
1492 adev
->gfx
.config
.max_shader_engines
, 16);
1494 gfx_v6_0_raster_config(adev
, &raster_config
);
1496 if (!adev
->gfx
.config
.backend_enable_mask
||
1497 adev
->gfx
.config
.num_rbs
>= num_rb_pipes
) {
1498 WREG32(mmPA_SC_RASTER_CONFIG
, raster_config
);
1500 gfx_v6_0_write_harvested_raster_configs(adev
, raster_config
,
1501 adev
->gfx
.config
.backend_enable_mask
,
1505 /* cache the values for userspace */
1506 for (i
= 0; i
< adev
->gfx
.config
.max_shader_engines
; i
++) {
1507 for (j
= 0; j
< adev
->gfx
.config
.max_sh_per_se
; j
++) {
1508 gfx_v6_0_select_se_sh(adev
, i
, j
, 0xffffffff);
1509 adev
->gfx
.config
.rb_config
[i
][j
].rb_backend_disable
=
1510 RREG32(mmCC_RB_BACKEND_DISABLE
);
1511 adev
->gfx
.config
.rb_config
[i
][j
].user_rb_backend_disable
=
1512 RREG32(mmGC_USER_RB_BACKEND_DISABLE
);
1513 adev
->gfx
.config
.rb_config
[i
][j
].raster_config
=
1514 RREG32(mmPA_SC_RASTER_CONFIG
);
1517 gfx_v6_0_select_se_sh(adev
, 0xffffffff, 0xffffffff, 0xffffffff);
1518 mutex_unlock(&adev
->grbm_idx_mutex
);
1521 static void gmc_v6_0_init_compute_vmid(struct amdgpu_device *adev)
1526 static void gfx_v6_0_set_user_cu_inactive_bitmap(struct amdgpu_device
*adev
,
1534 data
= bitmap
<< GC_USER_SHADER_ARRAY_CONFIG__INACTIVE_CUS__SHIFT
;
1535 data
&= GC_USER_SHADER_ARRAY_CONFIG__INACTIVE_CUS_MASK
;
1537 WREG32(mmGC_USER_SHADER_ARRAY_CONFIG
, data
);
1540 static u32
gfx_v6_0_get_cu_enabled(struct amdgpu_device
*adev
)
1544 data
= RREG32(mmCC_GC_SHADER_ARRAY_CONFIG
) |
1545 RREG32(mmGC_USER_SHADER_ARRAY_CONFIG
);
1547 mask
= gfx_v6_0_create_bitmask(adev
->gfx
.config
.max_cu_per_sh
);
1548 return ~REG_GET_FIELD(data
, CC_GC_SHADER_ARRAY_CONFIG
, INACTIVE_CUS
) & mask
;
1552 static void gfx_v6_0_setup_spi(struct amdgpu_device
*adev
)
1558 mutex_lock(&adev
->grbm_idx_mutex
);
1559 for (i
= 0; i
< adev
->gfx
.config
.max_shader_engines
; i
++) {
1560 for (j
= 0; j
< adev
->gfx
.config
.max_sh_per_se
; j
++) {
1561 gfx_v6_0_select_se_sh(adev
, i
, j
, 0xffffffff);
1562 data
= RREG32(mmSPI_STATIC_THREAD_MGMT_3
);
1563 active_cu
= gfx_v6_0_get_cu_enabled(adev
);
1566 for (k
= 0; k
< 16; k
++) {
1568 if (active_cu
& mask
) {
1570 WREG32(mmSPI_STATIC_THREAD_MGMT_3
, data
);
1576 gfx_v6_0_select_se_sh(adev
, 0xffffffff, 0xffffffff, 0xffffffff);
1577 mutex_unlock(&adev
->grbm_idx_mutex
);
1580 static void gfx_v6_0_config_init(struct amdgpu_device
*adev
)
1582 adev
->gfx
.config
.double_offchip_lds_buf
= 0;
1585 static void gfx_v6_0_gpu_init(struct amdgpu_device
*adev
)
1587 u32 gb_addr_config
= 0;
1588 u32 mc_shared_chmap
, mc_arb_ramcfg
;
1590 u32 hdp_host_path_cntl
;
1593 switch (adev
->asic_type
) {
1595 adev
->gfx
.config
.max_shader_engines
= 2;
1596 adev
->gfx
.config
.max_tile_pipes
= 12;
1597 adev
->gfx
.config
.max_cu_per_sh
= 8;
1598 adev
->gfx
.config
.max_sh_per_se
= 2;
1599 adev
->gfx
.config
.max_backends_per_se
= 4;
1600 adev
->gfx
.config
.max_texture_channel_caches
= 12;
1601 adev
->gfx
.config
.max_gprs
= 256;
1602 adev
->gfx
.config
.max_gs_threads
= 32;
1603 adev
->gfx
.config
.max_hw_contexts
= 8;
1605 adev
->gfx
.config
.sc_prim_fifo_size_frontend
= 0x20;
1606 adev
->gfx
.config
.sc_prim_fifo_size_backend
= 0x100;
1607 adev
->gfx
.config
.sc_hiz_tile_fifo_size
= 0x30;
1608 adev
->gfx
.config
.sc_earlyz_tile_fifo_size
= 0x130;
1609 gb_addr_config
= TAHITI_GB_ADDR_CONFIG_GOLDEN
;
1612 adev
->gfx
.config
.max_shader_engines
= 2;
1613 adev
->gfx
.config
.max_tile_pipes
= 8;
1614 adev
->gfx
.config
.max_cu_per_sh
= 5;
1615 adev
->gfx
.config
.max_sh_per_se
= 2;
1616 adev
->gfx
.config
.max_backends_per_se
= 4;
1617 adev
->gfx
.config
.max_texture_channel_caches
= 8;
1618 adev
->gfx
.config
.max_gprs
= 256;
1619 adev
->gfx
.config
.max_gs_threads
= 32;
1620 adev
->gfx
.config
.max_hw_contexts
= 8;
1622 adev
->gfx
.config
.sc_prim_fifo_size_frontend
= 0x20;
1623 adev
->gfx
.config
.sc_prim_fifo_size_backend
= 0x100;
1624 adev
->gfx
.config
.sc_hiz_tile_fifo_size
= 0x30;
1625 adev
->gfx
.config
.sc_earlyz_tile_fifo_size
= 0x130;
1626 gb_addr_config
= TAHITI_GB_ADDR_CONFIG_GOLDEN
;
1629 adev
->gfx
.config
.max_shader_engines
= 1;
1630 adev
->gfx
.config
.max_tile_pipes
= 4;
1631 adev
->gfx
.config
.max_cu_per_sh
= 5;
1632 adev
->gfx
.config
.max_sh_per_se
= 2;
1633 adev
->gfx
.config
.max_backends_per_se
= 4;
1634 adev
->gfx
.config
.max_texture_channel_caches
= 4;
1635 adev
->gfx
.config
.max_gprs
= 256;
1636 adev
->gfx
.config
.max_gs_threads
= 32;
1637 adev
->gfx
.config
.max_hw_contexts
= 8;
1639 adev
->gfx
.config
.sc_prim_fifo_size_frontend
= 0x20;
1640 adev
->gfx
.config
.sc_prim_fifo_size_backend
= 0x40;
1641 adev
->gfx
.config
.sc_hiz_tile_fifo_size
= 0x30;
1642 adev
->gfx
.config
.sc_earlyz_tile_fifo_size
= 0x130;
1643 gb_addr_config
= VERDE_GB_ADDR_CONFIG_GOLDEN
;
1646 adev
->gfx
.config
.max_shader_engines
= 1;
1647 adev
->gfx
.config
.max_tile_pipes
= 4;
1648 adev
->gfx
.config
.max_cu_per_sh
= 6;
1649 adev
->gfx
.config
.max_sh_per_se
= 1;
1650 adev
->gfx
.config
.max_backends_per_se
= 2;
1651 adev
->gfx
.config
.max_texture_channel_caches
= 4;
1652 adev
->gfx
.config
.max_gprs
= 256;
1653 adev
->gfx
.config
.max_gs_threads
= 16;
1654 adev
->gfx
.config
.max_hw_contexts
= 8;
1656 adev
->gfx
.config
.sc_prim_fifo_size_frontend
= 0x20;
1657 adev
->gfx
.config
.sc_prim_fifo_size_backend
= 0x40;
1658 adev
->gfx
.config
.sc_hiz_tile_fifo_size
= 0x30;
1659 adev
->gfx
.config
.sc_earlyz_tile_fifo_size
= 0x130;
1660 gb_addr_config
= VERDE_GB_ADDR_CONFIG_GOLDEN
;
1663 adev
->gfx
.config
.max_shader_engines
= 1;
1664 adev
->gfx
.config
.max_tile_pipes
= 4;
1665 adev
->gfx
.config
.max_cu_per_sh
= 5;
1666 adev
->gfx
.config
.max_sh_per_se
= 1;
1667 adev
->gfx
.config
.max_backends_per_se
= 1;
1668 adev
->gfx
.config
.max_texture_channel_caches
= 2;
1669 adev
->gfx
.config
.max_gprs
= 256;
1670 adev
->gfx
.config
.max_gs_threads
= 16;
1671 adev
->gfx
.config
.max_hw_contexts
= 8;
1673 adev
->gfx
.config
.sc_prim_fifo_size_frontend
= 0x20;
1674 adev
->gfx
.config
.sc_prim_fifo_size_backend
= 0x40;
1675 adev
->gfx
.config
.sc_hiz_tile_fifo_size
= 0x30;
1676 adev
->gfx
.config
.sc_earlyz_tile_fifo_size
= 0x130;
1677 gb_addr_config
= HAINAN_GB_ADDR_CONFIG_GOLDEN
;
1684 WREG32(mmGRBM_CNTL
, (0xff << GRBM_CNTL__READ_TIMEOUT__SHIFT
));
1685 WREG32(mmSRBM_INT_CNTL
, 1);
1686 WREG32(mmSRBM_INT_ACK
, 1);
1688 WREG32(mmBIF_FB_EN
, BIF_FB_EN__FB_READ_EN_MASK
| BIF_FB_EN__FB_WRITE_EN_MASK
);
1690 mc_shared_chmap
= RREG32(mmMC_SHARED_CHMAP
);
1691 mc_arb_ramcfg
= RREG32(mmMC_ARB_RAMCFG
);
1693 adev
->gfx
.config
.num_tile_pipes
= adev
->gfx
.config
.max_tile_pipes
;
1694 adev
->gfx
.config
.mem_max_burst_length_bytes
= 256;
1695 tmp
= (mc_arb_ramcfg
& MC_ARB_RAMCFG__NOOFCOLS_MASK
) >> MC_ARB_RAMCFG__NOOFCOLS__SHIFT
;
1696 adev
->gfx
.config
.mem_row_size_in_kb
= (4 * (1 << (8 + tmp
))) / 1024;
1697 if (adev
->gfx
.config
.mem_row_size_in_kb
> 4)
1698 adev
->gfx
.config
.mem_row_size_in_kb
= 4;
1699 adev
->gfx
.config
.shader_engine_tile_size
= 32;
1700 adev
->gfx
.config
.num_gpus
= 1;
1701 adev
->gfx
.config
.multi_gpu_tile_size
= 64;
1703 gb_addr_config
&= ~GB_ADDR_CONFIG__ROW_SIZE_MASK
;
1704 switch (adev
->gfx
.config
.mem_row_size_in_kb
) {
1707 gb_addr_config
|= 0 << GB_ADDR_CONFIG__ROW_SIZE__SHIFT
;
1710 gb_addr_config
|= 1 << GB_ADDR_CONFIG__ROW_SIZE__SHIFT
;
1713 gb_addr_config
|= 2 << GB_ADDR_CONFIG__ROW_SIZE__SHIFT
;
1716 gb_addr_config
&= ~GB_ADDR_CONFIG__NUM_SHADER_ENGINES_MASK
;
1717 if (adev
->gfx
.config
.max_shader_engines
== 2)
1718 gb_addr_config
|= 1 << GB_ADDR_CONFIG__NUM_SHADER_ENGINES__SHIFT
;
1719 adev
->gfx
.config
.gb_addr_config
= gb_addr_config
;
1721 WREG32(mmGB_ADDR_CONFIG
, gb_addr_config
);
1722 WREG32(mmDMIF_ADDR_CONFIG
, gb_addr_config
);
1723 WREG32(mmDMIF_ADDR_CALC
, gb_addr_config
);
1724 WREG32(mmHDP_ADDR_CONFIG
, gb_addr_config
);
1725 WREG32(mmDMA_TILING_CONFIG
+ DMA0_REGISTER_OFFSET
, gb_addr_config
);
1726 WREG32(mmDMA_TILING_CONFIG
+ DMA1_REGISTER_OFFSET
, gb_addr_config
);
1729 if (adev
->has_uvd
) {
1730 WREG32(mmUVD_UDEC_ADDR_CONFIG
, gb_addr_config
);
1731 WREG32(mmUVD_UDEC_DB_ADDR_CONFIG
, gb_addr_config
);
1732 WREG32(mmUVD_UDEC_DBW_ADDR_CONFIG
, gb_addr_config
);
1735 gfx_v6_0_tiling_mode_table_init(adev
);
1737 gfx_v6_0_setup_rb(adev
);
1739 gfx_v6_0_setup_spi(adev
);
1741 gfx_v6_0_get_cu_info(adev
);
1742 gfx_v6_0_config_init(adev
);
1744 WREG32(mmCP_QUEUE_THRESHOLDS
, ((0x16 << CP_QUEUE_THRESHOLDS__ROQ_IB1_START__SHIFT
) |
1745 (0x2b << CP_QUEUE_THRESHOLDS__ROQ_IB2_START__SHIFT
)));
1746 WREG32(mmCP_MEQ_THRESHOLDS
, (0x30 << CP_MEQ_THRESHOLDS__MEQ1_START__SHIFT
) |
1747 (0x60 << CP_MEQ_THRESHOLDS__MEQ2_START__SHIFT
));
1749 sx_debug_1
= RREG32(mmSX_DEBUG_1
);
1750 WREG32(mmSX_DEBUG_1
, sx_debug_1
);
1752 WREG32(mmSPI_CONFIG_CNTL_1
, (4 << SPI_CONFIG_CNTL_1__VTX_DONE_DELAY__SHIFT
));
1754 WREG32(mmPA_SC_FIFO_SIZE
, ((adev
->gfx
.config
.sc_prim_fifo_size_frontend
<< PA_SC_FIFO_SIZE__SC_FRONTEND_PRIM_FIFO_SIZE__SHIFT
) |
1755 (adev
->gfx
.config
.sc_prim_fifo_size_backend
<< PA_SC_FIFO_SIZE__SC_BACKEND_PRIM_FIFO_SIZE__SHIFT
) |
1756 (adev
->gfx
.config
.sc_hiz_tile_fifo_size
<< PA_SC_FIFO_SIZE__SC_HIZ_TILE_FIFO_SIZE__SHIFT
) |
1757 (adev
->gfx
.config
.sc_earlyz_tile_fifo_size
<< PA_SC_FIFO_SIZE__SC_EARLYZ_TILE_FIFO_SIZE__SHIFT
)));
1759 WREG32(mmVGT_NUM_INSTANCES
, 1);
1760 WREG32(mmCP_PERFMON_CNTL
, 0);
1761 WREG32(mmSQ_CONFIG
, 0);
1762 WREG32(mmPA_SC_FORCE_EOV_MAX_CNTS
, ((4095 << PA_SC_FORCE_EOV_MAX_CNTS__FORCE_EOV_MAX_CLK_CNT__SHIFT
) |
1763 (255 << PA_SC_FORCE_EOV_MAX_CNTS__FORCE_EOV_MAX_REZ_CNT__SHIFT
)));
1765 WREG32(mmVGT_CACHE_INVALIDATION
,
1766 (VC_AND_TC
<< VGT_CACHE_INVALIDATION__CACHE_INVALIDATION__SHIFT
) |
1767 (ES_AND_GS_AUTO
<< VGT_CACHE_INVALIDATION__AUTO_INVLD_EN__SHIFT
));
1769 WREG32(mmVGT_GS_VERTEX_REUSE
, 16);
1770 WREG32(mmPA_SC_LINE_STIPPLE_STATE
, 0);
1772 WREG32(mmCB_PERFCOUNTER0_SELECT0
, 0);
1773 WREG32(mmCB_PERFCOUNTER0_SELECT1
, 0);
1774 WREG32(mmCB_PERFCOUNTER1_SELECT0
, 0);
1775 WREG32(mmCB_PERFCOUNTER1_SELECT1
, 0);
1776 WREG32(mmCB_PERFCOUNTER2_SELECT0
, 0);
1777 WREG32(mmCB_PERFCOUNTER2_SELECT1
, 0);
1778 WREG32(mmCB_PERFCOUNTER3_SELECT0
, 0);
1779 WREG32(mmCB_PERFCOUNTER3_SELECT1
, 0);
1781 hdp_host_path_cntl
= RREG32(mmHDP_HOST_PATH_CNTL
);
1782 WREG32(mmHDP_HOST_PATH_CNTL
, hdp_host_path_cntl
);
1784 WREG32(mmPA_CL_ENHANCE
, PA_CL_ENHANCE__CLIP_VTX_REORDER_ENA_MASK
|
1785 (3 << PA_CL_ENHANCE__NUM_CLIP_SEQ__SHIFT
));
1791 static void gfx_v6_0_scratch_init(struct amdgpu_device
*adev
)
1793 adev
->gfx
.scratch
.num_reg
= 7;
1794 adev
->gfx
.scratch
.reg_base
= mmSCRATCH_REG0
;
1795 adev
->gfx
.scratch
.free_mask
= (1u << adev
->gfx
.scratch
.num_reg
) - 1;
1798 static int gfx_v6_0_ring_test_ring(struct amdgpu_ring
*ring
)
1800 struct amdgpu_device
*adev
= ring
->adev
;
1806 r
= amdgpu_gfx_scratch_get(adev
, &scratch
);
1808 DRM_ERROR("amdgpu: cp failed to get scratch reg (%d).\n", r
);
1811 WREG32(scratch
, 0xCAFEDEAD);
1813 r
= amdgpu_ring_alloc(ring
, 3);
1815 DRM_ERROR("amdgpu: cp failed to lock ring %d (%d).\n", ring
->idx
, r
);
1816 amdgpu_gfx_scratch_free(adev
, scratch
);
1819 amdgpu_ring_write(ring
, PACKET3(PACKET3_SET_CONFIG_REG
, 1));
1820 amdgpu_ring_write(ring
, (scratch
- PACKET3_SET_CONFIG_REG_START
));
1821 amdgpu_ring_write(ring
, 0xDEADBEEF);
1822 amdgpu_ring_commit(ring
);
1824 for (i
= 0; i
< adev
->usec_timeout
; i
++) {
1825 tmp
= RREG32(scratch
);
1826 if (tmp
== 0xDEADBEEF)
1830 if (i
< adev
->usec_timeout
) {
1831 DRM_INFO("ring test on %d succeeded in %d usecs\n", ring
->idx
, i
);
1833 DRM_ERROR("amdgpu: ring %d test failed (scratch(0x%04X)=0x%08X)\n",
1834 ring
->idx
, scratch
, tmp
);
1837 amdgpu_gfx_scratch_free(adev
, scratch
);
1841 static void gfx_v6_0_ring_emit_hdp_flush(struct amdgpu_ring
*ring
)
1843 /* flush hdp cache */
1844 amdgpu_ring_write(ring
, PACKET3(PACKET3_WRITE_DATA
, 3));
1845 amdgpu_ring_write(ring
, (WRITE_DATA_ENGINE_SEL(1) |
1846 WRITE_DATA_DST_SEL(0)));
1847 amdgpu_ring_write(ring
, mmHDP_MEM_COHERENCY_FLUSH_CNTL
);
1848 amdgpu_ring_write(ring
, 0);
1849 amdgpu_ring_write(ring
, 0x1);
1852 static void gfx_v6_0_ring_emit_vgt_flush(struct amdgpu_ring
*ring
)
1854 amdgpu_ring_write(ring
, PACKET3(PACKET3_EVENT_WRITE
, 0));
1855 amdgpu_ring_write(ring
, EVENT_TYPE(VGT_FLUSH
) |
1860 * gfx_v6_0_ring_emit_hdp_invalidate - emit an hdp invalidate on the cp
1862 * @adev: amdgpu_device pointer
1863 * @ridx: amdgpu ring index
1865 * Emits an hdp invalidate on the cp.
1867 static void gfx_v6_0_ring_emit_hdp_invalidate(struct amdgpu_ring
*ring
)
1869 amdgpu_ring_write(ring
, PACKET3(PACKET3_WRITE_DATA
, 3));
1870 amdgpu_ring_write(ring
, (WRITE_DATA_ENGINE_SEL(1) |
1871 WRITE_DATA_DST_SEL(0)));
1872 amdgpu_ring_write(ring
, mmHDP_DEBUG0
);
1873 amdgpu_ring_write(ring
, 0);
1874 amdgpu_ring_write(ring
, 0x1);
1877 static void gfx_v6_0_ring_emit_fence(struct amdgpu_ring
*ring
, u64 addr
,
1878 u64 seq
, unsigned flags
)
1880 bool write64bit
= flags
& AMDGPU_FENCE_FLAG_64BIT
;
1881 bool int_sel
= flags
& AMDGPU_FENCE_FLAG_INT
;
1882 /* flush read cache over gart */
1883 amdgpu_ring_write(ring
, PACKET3(PACKET3_SET_CONFIG_REG
, 1));
1884 amdgpu_ring_write(ring
, (mmCP_COHER_CNTL2
- PACKET3_SET_CONFIG_REG_START
));
1885 amdgpu_ring_write(ring
, 0);
1886 amdgpu_ring_write(ring
, PACKET3(PACKET3_SURFACE_SYNC
, 3));
1887 amdgpu_ring_write(ring
, PACKET3_TCL1_ACTION_ENA
|
1888 PACKET3_TC_ACTION_ENA
|
1889 PACKET3_SH_KCACHE_ACTION_ENA
|
1890 PACKET3_SH_ICACHE_ACTION_ENA
);
1891 amdgpu_ring_write(ring
, 0xFFFFFFFF);
1892 amdgpu_ring_write(ring
, 0);
1893 amdgpu_ring_write(ring
, 10); /* poll interval */
1894 /* EVENT_WRITE_EOP - flush caches, send int */
1895 amdgpu_ring_write(ring
, PACKET3(PACKET3_EVENT_WRITE_EOP
, 4));
1896 amdgpu_ring_write(ring
, EVENT_TYPE(CACHE_FLUSH_AND_INV_TS_EVENT
) | EVENT_INDEX(5));
1897 amdgpu_ring_write(ring
, addr
& 0xfffffffc);
1898 amdgpu_ring_write(ring
, (upper_32_bits(addr
) & 0xffff) |
1899 ((write64bit
? 2 : 1) << CP_EOP_DONE_DATA_CNTL__DATA_SEL__SHIFT
) |
1900 ((int_sel
? 2 : 0) << CP_EOP_DONE_DATA_CNTL__INT_SEL__SHIFT
));
1901 amdgpu_ring_write(ring
, lower_32_bits(seq
));
1902 amdgpu_ring_write(ring
, upper_32_bits(seq
));
1905 static void gfx_v6_0_ring_emit_ib(struct amdgpu_ring
*ring
,
1906 struct amdgpu_ib
*ib
,
1907 unsigned vm_id
, bool ctx_switch
)
1909 u32 header
, control
= 0;
1911 /* insert SWITCH_BUFFER packet before first IB in the ring frame */
1913 amdgpu_ring_write(ring
, PACKET3(PACKET3_SWITCH_BUFFER
, 0));
1914 amdgpu_ring_write(ring
, 0);
1917 if (ib
->flags
& AMDGPU_IB_FLAG_CE
)
1918 header
= PACKET3(PACKET3_INDIRECT_BUFFER_CONST
, 2);
1920 header
= PACKET3(PACKET3_INDIRECT_BUFFER
, 2);
1922 control
|= ib
->length_dw
| (vm_id
<< 24);
1924 amdgpu_ring_write(ring
, header
);
1925 amdgpu_ring_write(ring
,
1929 (ib
->gpu_addr
& 0xFFFFFFFC));
1930 amdgpu_ring_write(ring
, upper_32_bits(ib
->gpu_addr
) & 0xFFFF);
1931 amdgpu_ring_write(ring
, control
);
1935 * gfx_v6_0_ring_test_ib - basic ring IB test
1937 * @ring: amdgpu_ring structure holding ring information
1939 * Allocate an IB and execute it on the gfx ring (SI).
1940 * Provides a basic gfx ring test to verify that IBs are working.
1941 * Returns 0 on success, error on failure.
1943 static int gfx_v6_0_ring_test_ib(struct amdgpu_ring
*ring
, long timeout
)
1945 struct amdgpu_device
*adev
= ring
->adev
;
1946 struct amdgpu_ib ib
;
1947 struct dma_fence
*f
= NULL
;
1952 r
= amdgpu_gfx_scratch_get(adev
, &scratch
);
1954 DRM_ERROR("amdgpu: failed to get scratch reg (%ld).\n", r
);
1957 WREG32(scratch
, 0xCAFEDEAD);
1958 memset(&ib
, 0, sizeof(ib
));
1959 r
= amdgpu_ib_get(adev
, NULL
, 256, &ib
);
1961 DRM_ERROR("amdgpu: failed to get ib (%ld).\n", r
);
1964 ib
.ptr
[0] = PACKET3(PACKET3_SET_CONFIG_REG
, 1);
1965 ib
.ptr
[1] = ((scratch
- PACKET3_SET_CONFIG_REG_START
));
1966 ib
.ptr
[2] = 0xDEADBEEF;
1969 r
= amdgpu_ib_schedule(ring
, 1, &ib
, NULL
, &f
);
1973 r
= dma_fence_wait_timeout(f
, false, timeout
);
1975 DRM_ERROR("amdgpu: IB test timed out\n");
1979 DRM_ERROR("amdgpu: fence wait failed (%ld).\n", r
);
1982 tmp
= RREG32(scratch
);
1983 if (tmp
== 0xDEADBEEF) {
1984 DRM_INFO("ib test on ring %d succeeded\n", ring
->idx
);
1987 DRM_ERROR("amdgpu: ib test failed (scratch(0x%04X)=0x%08X)\n",
1993 amdgpu_ib_free(adev
, &ib
, NULL
);
1996 amdgpu_gfx_scratch_free(adev
, scratch
);
2000 static void gfx_v6_0_cp_gfx_enable(struct amdgpu_device
*adev
, bool enable
)
2004 WREG32(mmCP_ME_CNTL
, 0);
2006 WREG32(mmCP_ME_CNTL
, (CP_ME_CNTL__ME_HALT_MASK
|
2007 CP_ME_CNTL__PFP_HALT_MASK
|
2008 CP_ME_CNTL__CE_HALT_MASK
));
2009 WREG32(mmSCRATCH_UMSK
, 0);
2010 for (i
= 0; i
< adev
->gfx
.num_gfx_rings
; i
++)
2011 adev
->gfx
.gfx_ring
[i
].ready
= false;
2012 for (i
= 0; i
< adev
->gfx
.num_compute_rings
; i
++)
2013 adev
->gfx
.compute_ring
[i
].ready
= false;
2018 static int gfx_v6_0_cp_gfx_load_microcode(struct amdgpu_device
*adev
)
2021 const struct gfx_firmware_header_v1_0
*pfp_hdr
;
2022 const struct gfx_firmware_header_v1_0
*ce_hdr
;
2023 const struct gfx_firmware_header_v1_0
*me_hdr
;
2024 const __le32
*fw_data
;
2027 if (!adev
->gfx
.me_fw
|| !adev
->gfx
.pfp_fw
|| !adev
->gfx
.ce_fw
)
2030 gfx_v6_0_cp_gfx_enable(adev
, false);
2031 pfp_hdr
= (const struct gfx_firmware_header_v1_0
*)adev
->gfx
.pfp_fw
->data
;
2032 ce_hdr
= (const struct gfx_firmware_header_v1_0
*)adev
->gfx
.ce_fw
->data
;
2033 me_hdr
= (const struct gfx_firmware_header_v1_0
*)adev
->gfx
.me_fw
->data
;
2035 amdgpu_ucode_print_gfx_hdr(&pfp_hdr
->header
);
2036 amdgpu_ucode_print_gfx_hdr(&ce_hdr
->header
);
2037 amdgpu_ucode_print_gfx_hdr(&me_hdr
->header
);
2040 fw_data
= (const __le32
*)
2041 (adev
->gfx
.pfp_fw
->data
+ le32_to_cpu(pfp_hdr
->header
.ucode_array_offset_bytes
));
2042 fw_size
= le32_to_cpu(pfp_hdr
->header
.ucode_size_bytes
) / 4;
2043 WREG32(mmCP_PFP_UCODE_ADDR
, 0);
2044 for (i
= 0; i
< fw_size
; i
++)
2045 WREG32(mmCP_PFP_UCODE_DATA
, le32_to_cpup(fw_data
++));
2046 WREG32(mmCP_PFP_UCODE_ADDR
, 0);
2049 fw_data
= (const __le32
*)
2050 (adev
->gfx
.ce_fw
->data
+ le32_to_cpu(ce_hdr
->header
.ucode_array_offset_bytes
));
2051 fw_size
= le32_to_cpu(ce_hdr
->header
.ucode_size_bytes
) / 4;
2052 WREG32(mmCP_CE_UCODE_ADDR
, 0);
2053 for (i
= 0; i
< fw_size
; i
++)
2054 WREG32(mmCP_CE_UCODE_DATA
, le32_to_cpup(fw_data
++));
2055 WREG32(mmCP_CE_UCODE_ADDR
, 0);
2058 fw_data
= (const __be32
*)
2059 (adev
->gfx
.me_fw
->data
+ le32_to_cpu(me_hdr
->header
.ucode_array_offset_bytes
));
2060 fw_size
= le32_to_cpu(me_hdr
->header
.ucode_size_bytes
) / 4;
2061 WREG32(mmCP_ME_RAM_WADDR
, 0);
2062 for (i
= 0; i
< fw_size
; i
++)
2063 WREG32(mmCP_ME_RAM_DATA
, le32_to_cpup(fw_data
++));
2064 WREG32(mmCP_ME_RAM_WADDR
, 0);
2066 WREG32(mmCP_PFP_UCODE_ADDR
, 0);
2067 WREG32(mmCP_CE_UCODE_ADDR
, 0);
2068 WREG32(mmCP_ME_RAM_WADDR
, 0);
2069 WREG32(mmCP_ME_RAM_RADDR
, 0);
2073 static int gfx_v6_0_cp_gfx_start(struct amdgpu_device
*adev
)
2075 const struct cs_section_def
*sect
= NULL
;
2076 const struct cs_extent_def
*ext
= NULL
;
2077 struct amdgpu_ring
*ring
= &adev
->gfx
.gfx_ring
[0];
2080 r
= amdgpu_ring_alloc(ring
, 7 + 4);
2082 DRM_ERROR("amdgpu: cp failed to lock ring (%d).\n", r
);
2085 amdgpu_ring_write(ring
, PACKET3(PACKET3_ME_INITIALIZE
, 5));
2086 amdgpu_ring_write(ring
, 0x1);
2087 amdgpu_ring_write(ring
, 0x0);
2088 amdgpu_ring_write(ring
, adev
->gfx
.config
.max_hw_contexts
- 1);
2089 amdgpu_ring_write(ring
, PACKET3_ME_INITIALIZE_DEVICE_ID(1));
2090 amdgpu_ring_write(ring
, 0);
2091 amdgpu_ring_write(ring
, 0);
2093 amdgpu_ring_write(ring
, PACKET3(PACKET3_SET_BASE
, 2));
2094 amdgpu_ring_write(ring
, PACKET3_BASE_INDEX(CE_PARTITION_BASE
));
2095 amdgpu_ring_write(ring
, 0xc000);
2096 amdgpu_ring_write(ring
, 0xe000);
2097 amdgpu_ring_commit(ring
);
2099 gfx_v6_0_cp_gfx_enable(adev
, true);
2101 r
= amdgpu_ring_alloc(ring
, gfx_v6_0_get_csb_size(adev
) + 10);
2103 DRM_ERROR("amdgpu: cp failed to lock ring (%d).\n", r
);
2107 amdgpu_ring_write(ring
, PACKET3(PACKET3_PREAMBLE_CNTL
, 0));
2108 amdgpu_ring_write(ring
, PACKET3_PREAMBLE_BEGIN_CLEAR_STATE
);
2110 for (sect
= adev
->gfx
.rlc
.cs_data
; sect
->section
!= NULL
; ++sect
) {
2111 for (ext
= sect
->section
; ext
->extent
!= NULL
; ++ext
) {
2112 if (sect
->id
== SECT_CONTEXT
) {
2113 amdgpu_ring_write(ring
,
2114 PACKET3(PACKET3_SET_CONTEXT_REG
, ext
->reg_count
));
2115 amdgpu_ring_write(ring
, ext
->reg_index
- PACKET3_SET_CONTEXT_REG_START
);
2116 for (i
= 0; i
< ext
->reg_count
; i
++)
2117 amdgpu_ring_write(ring
, ext
->extent
[i
]);
2122 amdgpu_ring_write(ring
, PACKET3(PACKET3_PREAMBLE_CNTL
, 0));
2123 amdgpu_ring_write(ring
, PACKET3_PREAMBLE_END_CLEAR_STATE
);
2125 amdgpu_ring_write(ring
, PACKET3(PACKET3_CLEAR_STATE
, 0));
2126 amdgpu_ring_write(ring
, 0);
2128 amdgpu_ring_write(ring
, PACKET3(PACKET3_SET_CONTEXT_REG
, 2));
2129 amdgpu_ring_write(ring
, 0x00000316);
2130 amdgpu_ring_write(ring
, 0x0000000e);
2131 amdgpu_ring_write(ring
, 0x00000010);
2133 amdgpu_ring_commit(ring
);
2138 static int gfx_v6_0_cp_gfx_resume(struct amdgpu_device
*adev
)
2140 struct amdgpu_ring
*ring
;
2146 WREG32(mmCP_SEM_WAIT_TIMER
, 0x0);
2147 WREG32(mmCP_SEM_INCOMPLETE_TIMER_CNTL
, 0x0);
2149 /* Set the write pointer delay */
2150 WREG32(mmCP_RB_WPTR_DELAY
, 0);
2152 WREG32(mmCP_DEBUG
, 0);
2153 WREG32(mmSCRATCH_ADDR
, 0);
2155 /* ring 0 - compute and gfx */
2156 /* Set ring buffer size */
2157 ring
= &adev
->gfx
.gfx_ring
[0];
2158 rb_bufsz
= order_base_2(ring
->ring_size
/ 8);
2159 tmp
= (order_base_2(AMDGPU_GPU_PAGE_SIZE
/8) << 8) | rb_bufsz
;
2162 tmp
|= BUF_SWAP_32BIT
;
2164 WREG32(mmCP_RB0_CNTL
, tmp
);
2166 /* Initialize the ring buffer's read and write pointers */
2167 WREG32(mmCP_RB0_CNTL
, tmp
| CP_RB0_CNTL__RB_RPTR_WR_ENA_MASK
);
2169 WREG32(mmCP_RB0_WPTR
, ring
->wptr
);
2171 /* set the wb address whether it's enabled or not */
2172 rptr_addr
= adev
->wb
.gpu_addr
+ (ring
->rptr_offs
* 4);
2173 WREG32(mmCP_RB0_RPTR_ADDR
, lower_32_bits(rptr_addr
));
2174 WREG32(mmCP_RB0_RPTR_ADDR_HI
, upper_32_bits(rptr_addr
) & 0xFF);
2176 WREG32(mmSCRATCH_UMSK
, 0);
2179 WREG32(mmCP_RB0_CNTL
, tmp
);
2181 WREG32(mmCP_RB0_BASE
, ring
->gpu_addr
>> 8);
2183 /* start the rings */
2184 gfx_v6_0_cp_gfx_start(adev
);
2186 r
= amdgpu_ring_test_ring(ring
);
2188 ring
->ready
= false;
2195 static u64
gfx_v6_0_ring_get_rptr(struct amdgpu_ring
*ring
)
2197 return ring
->adev
->wb
.wb
[ring
->rptr_offs
];
2200 static u64
gfx_v6_0_ring_get_wptr(struct amdgpu_ring
*ring
)
2202 struct amdgpu_device
*adev
= ring
->adev
;
2204 if (ring
== &adev
->gfx
.gfx_ring
[0])
2205 return RREG32(mmCP_RB0_WPTR
);
2206 else if (ring
== &adev
->gfx
.compute_ring
[0])
2207 return RREG32(mmCP_RB1_WPTR
);
2208 else if (ring
== &adev
->gfx
.compute_ring
[1])
2209 return RREG32(mmCP_RB2_WPTR
);
2214 static void gfx_v6_0_ring_set_wptr_gfx(struct amdgpu_ring
*ring
)
2216 struct amdgpu_device
*adev
= ring
->adev
;
2218 WREG32(mmCP_RB0_WPTR
, lower_32_bits(ring
->wptr
));
2219 (void)RREG32(mmCP_RB0_WPTR
);
2222 static void gfx_v6_0_ring_set_wptr_compute(struct amdgpu_ring
*ring
)
2224 struct amdgpu_device
*adev
= ring
->adev
;
2226 if (ring
== &adev
->gfx
.compute_ring
[0]) {
2227 WREG32(mmCP_RB1_WPTR
, lower_32_bits(ring
->wptr
));
2228 (void)RREG32(mmCP_RB1_WPTR
);
2229 } else if (ring
== &adev
->gfx
.compute_ring
[1]) {
2230 WREG32(mmCP_RB2_WPTR
, lower_32_bits(ring
->wptr
));
2231 (void)RREG32(mmCP_RB2_WPTR
);
2238 static int gfx_v6_0_cp_compute_resume(struct amdgpu_device
*adev
)
2240 struct amdgpu_ring
*ring
;
2246 /* ring1 - compute only */
2247 /* Set ring buffer size */
2249 ring
= &adev
->gfx
.compute_ring
[0];
2250 rb_bufsz
= order_base_2(ring
->ring_size
/ 8);
2251 tmp
= (order_base_2(AMDGPU_GPU_PAGE_SIZE
/8) << 8) | rb_bufsz
;
2253 tmp
|= BUF_SWAP_32BIT
;
2255 WREG32(mmCP_RB1_CNTL
, tmp
);
2257 WREG32(mmCP_RB1_CNTL
, tmp
| CP_RB1_CNTL__RB_RPTR_WR_ENA_MASK
);
2259 WREG32(mmCP_RB1_WPTR
, ring
->wptr
);
2261 rptr_addr
= adev
->wb
.gpu_addr
+ (ring
->rptr_offs
* 4);
2262 WREG32(mmCP_RB1_RPTR_ADDR
, lower_32_bits(rptr_addr
));
2263 WREG32(mmCP_RB1_RPTR_ADDR_HI
, upper_32_bits(rptr_addr
) & 0xFF);
2266 WREG32(mmCP_RB1_CNTL
, tmp
);
2267 WREG32(mmCP_RB1_BASE
, ring
->gpu_addr
>> 8);
2269 ring
= &adev
->gfx
.compute_ring
[1];
2270 rb_bufsz
= order_base_2(ring
->ring_size
/ 8);
2271 tmp
= (order_base_2(AMDGPU_GPU_PAGE_SIZE
/8) << 8) | rb_bufsz
;
2273 tmp
|= BUF_SWAP_32BIT
;
2275 WREG32(mmCP_RB2_CNTL
, tmp
);
2277 WREG32(mmCP_RB2_CNTL
, tmp
| CP_RB2_CNTL__RB_RPTR_WR_ENA_MASK
);
2279 WREG32(mmCP_RB2_WPTR
, ring
->wptr
);
2280 rptr_addr
= adev
->wb
.gpu_addr
+ (ring
->rptr_offs
* 4);
2281 WREG32(mmCP_RB2_RPTR_ADDR
, lower_32_bits(rptr_addr
));
2282 WREG32(mmCP_RB2_RPTR_ADDR_HI
, upper_32_bits(rptr_addr
) & 0xFF);
2285 WREG32(mmCP_RB2_CNTL
, tmp
);
2286 WREG32(mmCP_RB2_BASE
, ring
->gpu_addr
>> 8);
2288 adev
->gfx
.compute_ring
[0].ready
= false;
2289 adev
->gfx
.compute_ring
[1].ready
= false;
2291 for (i
= 0; i
< 2; i
++) {
2292 r
= amdgpu_ring_test_ring(&adev
->gfx
.compute_ring
[i
]);
2295 adev
->gfx
.compute_ring
[i
].ready
= true;
2301 static void gfx_v6_0_cp_enable(struct amdgpu_device
*adev
, bool enable
)
2303 gfx_v6_0_cp_gfx_enable(adev
, enable
);
2306 static int gfx_v6_0_cp_load_microcode(struct amdgpu_device
*adev
)
2308 return gfx_v6_0_cp_gfx_load_microcode(adev
);
2311 static void gfx_v6_0_enable_gui_idle_interrupt(struct amdgpu_device
*adev
,
2314 u32 tmp
= RREG32(mmCP_INT_CNTL_RING0
);
2319 tmp
|= (CP_INT_CNTL__CNTX_BUSY_INT_ENABLE_MASK
|
2320 CP_INT_CNTL__CNTX_EMPTY_INT_ENABLE_MASK
);
2322 tmp
&= ~(CP_INT_CNTL__CNTX_BUSY_INT_ENABLE_MASK
|
2323 CP_INT_CNTL__CNTX_EMPTY_INT_ENABLE_MASK
);
2324 WREG32(mmCP_INT_CNTL_RING0
, tmp
);
2327 /* read a gfx register */
2328 tmp
= RREG32(mmDB_DEPTH_INFO
);
2330 mask
= RLC_BUSY_STATUS
| GFX_POWER_STATUS
| GFX_CLOCK_STATUS
| GFX_LS_STATUS
;
2331 for (i
= 0; i
< adev
->usec_timeout
; i
++) {
2332 if ((RREG32(mmRLC_STAT
) & mask
) == (GFX_CLOCK_STATUS
| GFX_POWER_STATUS
))
2339 static int gfx_v6_0_cp_resume(struct amdgpu_device
*adev
)
2343 gfx_v6_0_enable_gui_idle_interrupt(adev
, false);
2345 r
= gfx_v6_0_cp_load_microcode(adev
);
2349 r
= gfx_v6_0_cp_gfx_resume(adev
);
2352 r
= gfx_v6_0_cp_compute_resume(adev
);
2356 gfx_v6_0_enable_gui_idle_interrupt(adev
, true);
2361 static void gfx_v6_0_ring_emit_pipeline_sync(struct amdgpu_ring
*ring
)
2363 int usepfp
= (ring
->funcs
->type
== AMDGPU_RING_TYPE_GFX
);
2364 uint32_t seq
= ring
->fence_drv
.sync_seq
;
2365 uint64_t addr
= ring
->fence_drv
.gpu_addr
;
2367 amdgpu_ring_write(ring
, PACKET3(PACKET3_WAIT_REG_MEM
, 5));
2368 amdgpu_ring_write(ring
, (WAIT_REG_MEM_MEM_SPACE(1) | /* memory */
2369 WAIT_REG_MEM_FUNCTION(3) | /* equal */
2370 WAIT_REG_MEM_ENGINE(usepfp
))); /* pfp or me */
2371 amdgpu_ring_write(ring
, addr
& 0xfffffffc);
2372 amdgpu_ring_write(ring
, upper_32_bits(addr
) & 0xffffffff);
2373 amdgpu_ring_write(ring
, seq
);
2374 amdgpu_ring_write(ring
, 0xffffffff);
2375 amdgpu_ring_write(ring
, 4); /* poll interval */
2378 /* synce CE with ME to prevent CE fetch CEIB before context switch done */
2379 amdgpu_ring_write(ring
, PACKET3(PACKET3_SWITCH_BUFFER
, 0));
2380 amdgpu_ring_write(ring
, 0);
2381 amdgpu_ring_write(ring
, PACKET3(PACKET3_SWITCH_BUFFER
, 0));
2382 amdgpu_ring_write(ring
, 0);
2386 static void gfx_v6_0_ring_emit_vm_flush(struct amdgpu_ring
*ring
,
2387 unsigned vm_id
, uint64_t pd_addr
)
2389 int usepfp
= (ring
->funcs
->type
== AMDGPU_RING_TYPE_GFX
);
2391 /* write new base address */
2392 amdgpu_ring_write(ring
, PACKET3(PACKET3_WRITE_DATA
, 3));
2393 amdgpu_ring_write(ring
, (WRITE_DATA_ENGINE_SEL(1) |
2394 WRITE_DATA_DST_SEL(0)));
2396 amdgpu_ring_write(ring
, (mmVM_CONTEXT0_PAGE_TABLE_BASE_ADDR
+ vm_id
));
2398 amdgpu_ring_write(ring
, (mmVM_CONTEXT8_PAGE_TABLE_BASE_ADDR
+ (vm_id
- 8)));
2400 amdgpu_ring_write(ring
, 0);
2401 amdgpu_ring_write(ring
, pd_addr
>> 12);
2403 /* bits 0-15 are the VM contexts0-15 */
2404 amdgpu_ring_write(ring
, PACKET3(PACKET3_WRITE_DATA
, 3));
2405 amdgpu_ring_write(ring
, (WRITE_DATA_ENGINE_SEL(1) |
2406 WRITE_DATA_DST_SEL(0)));
2407 amdgpu_ring_write(ring
, mmVM_INVALIDATE_REQUEST
);
2408 amdgpu_ring_write(ring
, 0);
2409 amdgpu_ring_write(ring
, 1 << vm_id
);
2411 /* wait for the invalidate to complete */
2412 amdgpu_ring_write(ring
, PACKET3(PACKET3_WAIT_REG_MEM
, 5));
2413 amdgpu_ring_write(ring
, (WAIT_REG_MEM_FUNCTION(0) | /* always */
2414 WAIT_REG_MEM_ENGINE(0))); /* me */
2415 amdgpu_ring_write(ring
, mmVM_INVALIDATE_REQUEST
);
2416 amdgpu_ring_write(ring
, 0);
2417 amdgpu_ring_write(ring
, 0); /* ref */
2418 amdgpu_ring_write(ring
, 0); /* mask */
2419 amdgpu_ring_write(ring
, 0x20); /* poll interval */
2422 /* sync PFP to ME, otherwise we might get invalid PFP reads */
2423 amdgpu_ring_write(ring
, PACKET3(PACKET3_PFP_SYNC_ME
, 0));
2424 amdgpu_ring_write(ring
, 0x0);
2426 /* synce CE with ME to prevent CE fetch CEIB before context switch done */
2427 amdgpu_ring_write(ring
, PACKET3(PACKET3_SWITCH_BUFFER
, 0));
2428 amdgpu_ring_write(ring
, 0);
2429 amdgpu_ring_write(ring
, PACKET3(PACKET3_SWITCH_BUFFER
, 0));
2430 amdgpu_ring_write(ring
, 0);
2435 static void gfx_v6_0_rlc_fini(struct amdgpu_device
*adev
)
2439 if (adev
->gfx
.rlc
.save_restore_obj
) {
2440 r
= amdgpu_bo_reserve(adev
->gfx
.rlc
.save_restore_obj
, true);
2441 if (unlikely(r
!= 0))
2442 dev_warn(adev
->dev
, "(%d) reserve RLC sr bo failed\n", r
);
2443 amdgpu_bo_unpin(adev
->gfx
.rlc
.save_restore_obj
);
2444 amdgpu_bo_unreserve(adev
->gfx
.rlc
.save_restore_obj
);
2446 amdgpu_bo_unref(&adev
->gfx
.rlc
.save_restore_obj
);
2447 adev
->gfx
.rlc
.save_restore_obj
= NULL
;
2450 if (adev
->gfx
.rlc
.clear_state_obj
) {
2451 r
= amdgpu_bo_reserve(adev
->gfx
.rlc
.clear_state_obj
, true);
2452 if (unlikely(r
!= 0))
2453 dev_warn(adev
->dev
, "(%d) reserve RLC c bo failed\n", r
);
2454 amdgpu_bo_unpin(adev
->gfx
.rlc
.clear_state_obj
);
2455 amdgpu_bo_unreserve(adev
->gfx
.rlc
.clear_state_obj
);
2457 amdgpu_bo_unref(&adev
->gfx
.rlc
.clear_state_obj
);
2458 adev
->gfx
.rlc
.clear_state_obj
= NULL
;
2461 if (adev
->gfx
.rlc
.cp_table_obj
) {
2462 r
= amdgpu_bo_reserve(adev
->gfx
.rlc
.cp_table_obj
, true);
2463 if (unlikely(r
!= 0))
2464 dev_warn(adev
->dev
, "(%d) reserve RLC cp table bo failed\n", r
);
2465 amdgpu_bo_unpin(adev
->gfx
.rlc
.cp_table_obj
);
2466 amdgpu_bo_unreserve(adev
->gfx
.rlc
.cp_table_obj
);
2468 amdgpu_bo_unref(&adev
->gfx
.rlc
.cp_table_obj
);
2469 adev
->gfx
.rlc
.cp_table_obj
= NULL
;
2473 static int gfx_v6_0_rlc_init(struct amdgpu_device
*adev
)
2476 volatile u32
*dst_ptr
;
2478 u64 reg_list_mc_addr
;
2479 const struct cs_section_def
*cs_data
;
2482 adev
->gfx
.rlc
.reg_list
= verde_rlc_save_restore_register_list
;
2483 adev
->gfx
.rlc
.reg_list_size
=
2484 (u32
)ARRAY_SIZE(verde_rlc_save_restore_register_list
);
2486 adev
->gfx
.rlc
.cs_data
= si_cs_data
;
2487 src_ptr
= adev
->gfx
.rlc
.reg_list
;
2488 dws
= adev
->gfx
.rlc
.reg_list_size
;
2489 cs_data
= adev
->gfx
.rlc
.cs_data
;
2492 /* save restore block */
2493 if (adev
->gfx
.rlc
.save_restore_obj
== NULL
) {
2494 r
= amdgpu_bo_create(adev
, dws
* 4, PAGE_SIZE
, true,
2495 AMDGPU_GEM_DOMAIN_VRAM
,
2496 AMDGPU_GEM_CREATE_CPU_ACCESS_REQUIRED
,
2498 &adev
->gfx
.rlc
.save_restore_obj
);
2501 dev_warn(adev
->dev
, "(%d) create RLC sr bo failed\n", r
);
2506 r
= amdgpu_bo_reserve(adev
->gfx
.rlc
.save_restore_obj
, false);
2507 if (unlikely(r
!= 0)) {
2508 gfx_v6_0_rlc_fini(adev
);
2511 r
= amdgpu_bo_pin(adev
->gfx
.rlc
.save_restore_obj
, AMDGPU_GEM_DOMAIN_VRAM
,
2512 &adev
->gfx
.rlc
.save_restore_gpu_addr
);
2514 amdgpu_bo_unreserve(adev
->gfx
.rlc
.save_restore_obj
);
2515 dev_warn(adev
->dev
, "(%d) pin RLC sr bo failed\n", r
);
2516 gfx_v6_0_rlc_fini(adev
);
2520 r
= amdgpu_bo_kmap(adev
->gfx
.rlc
.save_restore_obj
, (void **)&adev
->gfx
.rlc
.sr_ptr
);
2522 dev_warn(adev
->dev
, "(%d) map RLC sr bo failed\n", r
);
2523 gfx_v6_0_rlc_fini(adev
);
2526 /* write the sr buffer */
2527 dst_ptr
= adev
->gfx
.rlc
.sr_ptr
;
2528 for (i
= 0; i
< adev
->gfx
.rlc
.reg_list_size
; i
++)
2529 dst_ptr
[i
] = cpu_to_le32(src_ptr
[i
]);
2530 amdgpu_bo_kunmap(adev
->gfx
.rlc
.save_restore_obj
);
2531 amdgpu_bo_unreserve(adev
->gfx
.rlc
.save_restore_obj
);
2535 /* clear state block */
2536 adev
->gfx
.rlc
.clear_state_size
= gfx_v6_0_get_csb_size(adev
);
2537 dws
= adev
->gfx
.rlc
.clear_state_size
+ (256 / 4);
2539 if (adev
->gfx
.rlc
.clear_state_obj
== NULL
) {
2540 r
= amdgpu_bo_create(adev
, dws
* 4, PAGE_SIZE
, true,
2541 AMDGPU_GEM_DOMAIN_VRAM
,
2542 AMDGPU_GEM_CREATE_CPU_ACCESS_REQUIRED
,
2544 &adev
->gfx
.rlc
.clear_state_obj
);
2547 dev_warn(adev
->dev
, "(%d) create RLC c bo failed\n", r
);
2548 gfx_v6_0_rlc_fini(adev
);
2552 r
= amdgpu_bo_reserve(adev
->gfx
.rlc
.clear_state_obj
, false);
2553 if (unlikely(r
!= 0)) {
2554 gfx_v6_0_rlc_fini(adev
);
2557 r
= amdgpu_bo_pin(adev
->gfx
.rlc
.clear_state_obj
, AMDGPU_GEM_DOMAIN_VRAM
,
2558 &adev
->gfx
.rlc
.clear_state_gpu_addr
);
2560 amdgpu_bo_unreserve(adev
->gfx
.rlc
.clear_state_obj
);
2561 dev_warn(adev
->dev
, "(%d) pin RLC c bo failed\n", r
);
2562 gfx_v6_0_rlc_fini(adev
);
2566 r
= amdgpu_bo_kmap(adev
->gfx
.rlc
.clear_state_obj
, (void **)&adev
->gfx
.rlc
.cs_ptr
);
2568 dev_warn(adev
->dev
, "(%d) map RLC c bo failed\n", r
);
2569 gfx_v6_0_rlc_fini(adev
);
2572 /* set up the cs buffer */
2573 dst_ptr
= adev
->gfx
.rlc
.cs_ptr
;
2574 reg_list_mc_addr
= adev
->gfx
.rlc
.clear_state_gpu_addr
+ 256;
2575 dst_ptr
[0] = cpu_to_le32(upper_32_bits(reg_list_mc_addr
));
2576 dst_ptr
[1] = cpu_to_le32(lower_32_bits(reg_list_mc_addr
));
2577 dst_ptr
[2] = cpu_to_le32(adev
->gfx
.rlc
.clear_state_size
);
2578 gfx_v6_0_get_csb_buffer(adev
, &dst_ptr
[(256/4)]);
2579 amdgpu_bo_kunmap(adev
->gfx
.rlc
.clear_state_obj
);
2580 amdgpu_bo_unreserve(adev
->gfx
.rlc
.clear_state_obj
);
2586 static void gfx_v6_0_enable_lbpw(struct amdgpu_device
*adev
, bool enable
)
2588 WREG32_FIELD(RLC_LB_CNTL
, LOAD_BALANCE_ENABLE
, enable
? 1 : 0);
2591 gfx_v6_0_select_se_sh(adev
, 0xffffffff, 0xffffffff, 0xffffffff);
2592 WREG32(mmSPI_LB_CU_MASK
, 0x00ff);
2596 static void gfx_v6_0_wait_for_rlc_serdes(struct amdgpu_device
*adev
)
2600 for (i
= 0; i
< adev
->usec_timeout
; i
++) {
2601 if (RREG32(mmRLC_SERDES_MASTER_BUSY_0
) == 0)
2606 for (i
= 0; i
< adev
->usec_timeout
; i
++) {
2607 if (RREG32(mmRLC_SERDES_MASTER_BUSY_1
) == 0)
2613 static void gfx_v6_0_update_rlc(struct amdgpu_device
*adev
, u32 rlc
)
2617 tmp
= RREG32(mmRLC_CNTL
);
2619 WREG32(mmRLC_CNTL
, rlc
);
2622 static u32
gfx_v6_0_halt_rlc(struct amdgpu_device
*adev
)
2626 orig
= data
= RREG32(mmRLC_CNTL
);
2628 if (data
& RLC_CNTL__RLC_ENABLE_F32_MASK
) {
2629 data
&= ~RLC_CNTL__RLC_ENABLE_F32_MASK
;
2630 WREG32(mmRLC_CNTL
, data
);
2632 gfx_v6_0_wait_for_rlc_serdes(adev
);
2638 static void gfx_v6_0_rlc_stop(struct amdgpu_device
*adev
)
2640 WREG32(mmRLC_CNTL
, 0);
2642 gfx_v6_0_enable_gui_idle_interrupt(adev
, false);
2643 gfx_v6_0_wait_for_rlc_serdes(adev
);
2646 static void gfx_v6_0_rlc_start(struct amdgpu_device
*adev
)
2648 WREG32(mmRLC_CNTL
, RLC_CNTL__RLC_ENABLE_F32_MASK
);
2650 gfx_v6_0_enable_gui_idle_interrupt(adev
, true);
2655 static void gfx_v6_0_rlc_reset(struct amdgpu_device
*adev
)
2657 WREG32_FIELD(GRBM_SOFT_RESET
, SOFT_RESET_RLC
, 1);
2659 WREG32_FIELD(GRBM_SOFT_RESET
, SOFT_RESET_RLC
, 0);
2663 static bool gfx_v6_0_lbpw_supported(struct amdgpu_device
*adev
)
2667 /* Enable LBPW only for DDR3 */
2668 tmp
= RREG32(mmMC_SEQ_MISC0
);
2669 if ((tmp
& 0xF0000000) == 0xB0000000)
2674 static void gfx_v6_0_init_cg(struct amdgpu_device
*adev
)
2678 static int gfx_v6_0_rlc_resume(struct amdgpu_device
*adev
)
2681 const struct rlc_firmware_header_v1_0
*hdr
;
2682 const __le32
*fw_data
;
2686 if (!adev
->gfx
.rlc_fw
)
2689 gfx_v6_0_rlc_stop(adev
);
2690 gfx_v6_0_rlc_reset(adev
);
2691 gfx_v6_0_init_pg(adev
);
2692 gfx_v6_0_init_cg(adev
);
2694 WREG32(mmRLC_RL_BASE
, 0);
2695 WREG32(mmRLC_RL_SIZE
, 0);
2696 WREG32(mmRLC_LB_CNTL
, 0);
2697 WREG32(mmRLC_LB_CNTR_MAX
, 0xffffffff);
2698 WREG32(mmRLC_LB_CNTR_INIT
, 0);
2699 WREG32(mmRLC_LB_INIT_CU_MASK
, 0xffffffff);
2701 WREG32(mmRLC_MC_CNTL
, 0);
2702 WREG32(mmRLC_UCODE_CNTL
, 0);
2704 hdr
= (const struct rlc_firmware_header_v1_0
*)adev
->gfx
.rlc_fw
->data
;
2705 fw_size
= le32_to_cpu(hdr
->header
.ucode_size_bytes
) / 4;
2706 fw_data
= (const __le32
*)
2707 (adev
->gfx
.rlc_fw
->data
+ le32_to_cpu(hdr
->header
.ucode_array_offset_bytes
));
2709 amdgpu_ucode_print_rlc_hdr(&hdr
->header
);
2711 for (i
= 0; i
< fw_size
; i
++) {
2712 WREG32(mmRLC_UCODE_ADDR
, i
);
2713 WREG32(mmRLC_UCODE_DATA
, le32_to_cpup(fw_data
++));
2715 WREG32(mmRLC_UCODE_ADDR
, 0);
2717 gfx_v6_0_enable_lbpw(adev
, gfx_v6_0_lbpw_supported(adev
));
2718 gfx_v6_0_rlc_start(adev
);
2723 static void gfx_v6_0_enable_cgcg(struct amdgpu_device
*adev
, bool enable
)
2725 u32 data
, orig
, tmp
;
2727 orig
= data
= RREG32(mmRLC_CGCG_CGLS_CTRL
);
2729 if (enable
&& (adev
->cg_flags
& AMD_CG_SUPPORT_GFX_CGCG
)) {
2730 gfx_v6_0_enable_gui_idle_interrupt(adev
, true);
2732 WREG32(mmRLC_GCPM_GENERAL_3
, 0x00000080);
2734 tmp
= gfx_v6_0_halt_rlc(adev
);
2736 WREG32(mmRLC_SERDES_WR_MASTER_MASK_0
, 0xffffffff);
2737 WREG32(mmRLC_SERDES_WR_MASTER_MASK_1
, 0xffffffff);
2738 WREG32(mmRLC_SERDES_WR_CTRL
, 0x00b000ff);
2740 gfx_v6_0_wait_for_rlc_serdes(adev
);
2741 gfx_v6_0_update_rlc(adev
, tmp
);
2743 WREG32(mmRLC_SERDES_WR_CTRL
, 0x007000ff);
2745 data
|= RLC_CGCG_CGLS_CTRL__CGCG_EN_MASK
| RLC_CGCG_CGLS_CTRL__CGLS_EN_MASK
;
2747 gfx_v6_0_enable_gui_idle_interrupt(adev
, false);
2749 RREG32(mmCB_CGTT_SCLK_CTRL
);
2750 RREG32(mmCB_CGTT_SCLK_CTRL
);
2751 RREG32(mmCB_CGTT_SCLK_CTRL
);
2752 RREG32(mmCB_CGTT_SCLK_CTRL
);
2754 data
&= ~(RLC_CGCG_CGLS_CTRL__CGCG_EN_MASK
| RLC_CGCG_CGLS_CTRL__CGLS_EN_MASK
);
2758 WREG32(mmRLC_CGCG_CGLS_CTRL
, data
);
2762 static void gfx_v6_0_enable_mgcg(struct amdgpu_device
*adev
, bool enable
)
2765 u32 data
, orig
, tmp
= 0;
2767 if (enable
&& (adev
->cg_flags
& AMD_CG_SUPPORT_GFX_MGCG
)) {
2768 orig
= data
= RREG32(mmCGTS_SM_CTRL_REG
);
2771 WREG32(mmCGTS_SM_CTRL_REG
, data
);
2773 if (adev
->cg_flags
& AMD_CG_SUPPORT_GFX_CP_LS
) {
2774 orig
= data
= RREG32(mmCP_MEM_SLP_CNTL
);
2775 data
|= CP_MEM_SLP_CNTL__CP_MEM_LS_EN_MASK
;
2777 WREG32(mmCP_MEM_SLP_CNTL
, data
);
2780 orig
= data
= RREG32(mmRLC_CGTT_MGCG_OVERRIDE
);
2783 WREG32(mmRLC_CGTT_MGCG_OVERRIDE
, data
);
2785 tmp
= gfx_v6_0_halt_rlc(adev
);
2787 WREG32(mmRLC_SERDES_WR_MASTER_MASK_0
, 0xffffffff);
2788 WREG32(mmRLC_SERDES_WR_MASTER_MASK_1
, 0xffffffff);
2789 WREG32(mmRLC_SERDES_WR_CTRL
, 0x00d000ff);
2791 gfx_v6_0_update_rlc(adev
, tmp
);
2793 orig
= data
= RREG32(mmRLC_CGTT_MGCG_OVERRIDE
);
2796 WREG32(mmRLC_CGTT_MGCG_OVERRIDE
, data
);
2798 data
= RREG32(mmCP_MEM_SLP_CNTL
);
2799 if (data
& CP_MEM_SLP_CNTL__CP_MEM_LS_EN_MASK
) {
2800 data
&= ~CP_MEM_SLP_CNTL__CP_MEM_LS_EN_MASK
;
2801 WREG32(mmCP_MEM_SLP_CNTL
, data
);
2803 orig
= data
= RREG32(mmCGTS_SM_CTRL_REG
);
2804 data
|= CGTS_SM_CTRL_REG__LS_OVERRIDE_MASK
| CGTS_SM_CTRL_REG__OVERRIDE_MASK
;
2806 WREG32(mmCGTS_SM_CTRL_REG
, data
);
2808 tmp
= gfx_v6_0_halt_rlc(adev
);
2810 WREG32(mmRLC_SERDES_WR_MASTER_MASK_0
, 0xffffffff);
2811 WREG32(mmRLC_SERDES_WR_MASTER_MASK_1
, 0xffffffff);
2812 WREG32(mmRLC_SERDES_WR_CTRL
, 0x00e000ff);
2814 gfx_v6_0_update_rlc(adev
, tmp
);
2818 static void gfx_v6_0_update_cg(struct amdgpu_device *adev,
2821 gfx_v6_0_enable_gui_idle_interrupt(adev, false);
2823 gfx_v6_0_enable_mgcg(adev, true);
2824 gfx_v6_0_enable_cgcg(adev, true);
2826 gfx_v6_0_enable_cgcg(adev, false);
2827 gfx_v6_0_enable_mgcg(adev, false);
2829 gfx_v6_0_enable_gui_idle_interrupt(adev, true);
2833 static void gfx_v6_0_enable_sclk_slowdown_on_pu(struct amdgpu_device
*adev
,
2838 static void gfx_v6_0_enable_sclk_slowdown_on_pd(struct amdgpu_device
*adev
,
2843 static void gfx_v6_0_enable_cp_pg(struct amdgpu_device
*adev
, bool enable
)
2847 orig
= data
= RREG32(mmRLC_PG_CNTL
);
2848 if (enable
&& (adev
->pg_flags
& AMD_PG_SUPPORT_CP
))
2853 WREG32(mmRLC_PG_CNTL
, data
);
2856 static void gfx_v6_0_enable_gds_pg(struct amdgpu_device
*adev
, bool enable
)
2860 static void gfx_v6_0_init_cp_pg_table(struct amdgpu_device *adev)
2862 const __le32 *fw_data;
2863 volatile u32 *dst_ptr;
2864 int me, i, max_me = 4;
2866 u32 table_offset, table_size;
2868 if (adev->asic_type == CHIP_KAVERI)
2871 if (adev->gfx.rlc.cp_table_ptr == NULL)
2874 dst_ptr = adev->gfx.rlc.cp_table_ptr;
2875 for (me = 0; me < max_me; me++) {
2877 const struct gfx_firmware_header_v1_0 *hdr =
2878 (const struct gfx_firmware_header_v1_0 *)adev->gfx.ce_fw->data;
2879 fw_data = (const __le32 *)
2880 (adev->gfx.ce_fw->data +
2881 le32_to_cpu(hdr->header.ucode_array_offset_bytes));
2882 table_offset = le32_to_cpu(hdr->jt_offset);
2883 table_size = le32_to_cpu(hdr->jt_size);
2884 } else if (me == 1) {
2885 const struct gfx_firmware_header_v1_0 *hdr =
2886 (const struct gfx_firmware_header_v1_0 *)adev->gfx.pfp_fw->data;
2887 fw_data = (const __le32 *)
2888 (adev->gfx.pfp_fw->data +
2889 le32_to_cpu(hdr->header.ucode_array_offset_bytes));
2890 table_offset = le32_to_cpu(hdr->jt_offset);
2891 table_size = le32_to_cpu(hdr->jt_size);
2892 } else if (me == 2) {
2893 const struct gfx_firmware_header_v1_0 *hdr =
2894 (const struct gfx_firmware_header_v1_0 *)adev->gfx.me_fw->data;
2895 fw_data = (const __le32 *)
2896 (adev->gfx.me_fw->data +
2897 le32_to_cpu(hdr->header.ucode_array_offset_bytes));
2898 table_offset = le32_to_cpu(hdr->jt_offset);
2899 table_size = le32_to_cpu(hdr->jt_size);
2900 } else if (me == 3) {
2901 const struct gfx_firmware_header_v1_0 *hdr =
2902 (const struct gfx_firmware_header_v1_0 *)adev->gfx.mec_fw->data;
2903 fw_data = (const __le32 *)
2904 (adev->gfx.mec_fw->data +
2905 le32_to_cpu(hdr->header.ucode_array_offset_bytes));
2906 table_offset = le32_to_cpu(hdr->jt_offset);
2907 table_size = le32_to_cpu(hdr->jt_size);
2909 const struct gfx_firmware_header_v1_0 *hdr =
2910 (const struct gfx_firmware_header_v1_0 *)adev->gfx.mec2_fw->data;
2911 fw_data = (const __le32 *)
2912 (adev->gfx.mec2_fw->data +
2913 le32_to_cpu(hdr->header.ucode_array_offset_bytes));
2914 table_offset = le32_to_cpu(hdr->jt_offset);
2915 table_size = le32_to_cpu(hdr->jt_size);
2918 for (i = 0; i < table_size; i ++) {
2919 dst_ptr[bo_offset + i] =
2920 cpu_to_le32(le32_to_cpu(fw_data[table_offset + i]));
2923 bo_offset += table_size;
2927 static void gfx_v6_0_enable_gfx_cgpg(struct amdgpu_device
*adev
,
2930 if (enable
&& (adev
->pg_flags
& AMD_PG_SUPPORT_GFX_PG
)) {
2931 WREG32(mmRLC_TTOP_D
, RLC_PUD(0x10) | RLC_PDD(0x10) | RLC_TTPD(0x10) | RLC_MSD(0x10));
2932 WREG32_FIELD(RLC_PG_CNTL
, GFX_POWER_GATING_ENABLE
, 1);
2933 WREG32_FIELD(RLC_AUTO_PG_CTRL
, AUTO_PG_EN
, 1);
2935 WREG32_FIELD(RLC_AUTO_PG_CTRL
, AUTO_PG_EN
, 0);
2936 (void)RREG32(mmDB_RENDER_CONTROL
);
2940 static void gfx_v6_0_init_ao_cu_mask(struct amdgpu_device
*adev
)
2944 WREG32(mmRLC_PG_ALWAYS_ON_CU_MASK
, adev
->gfx
.cu_info
.ao_cu_mask
);
2946 tmp
= RREG32(mmRLC_MAX_PG_CU
);
2947 tmp
&= ~RLC_MAX_PG_CU__MAX_POWERED_UP_CU_MASK
;
2948 tmp
|= (adev
->gfx
.cu_info
.number
<< RLC_MAX_PG_CU__MAX_POWERED_UP_CU__SHIFT
);
2949 WREG32(mmRLC_MAX_PG_CU
, tmp
);
2952 static void gfx_v6_0_enable_gfx_static_mgpg(struct amdgpu_device
*adev
,
2957 orig
= data
= RREG32(mmRLC_PG_CNTL
);
2958 if (enable
&& (adev
->pg_flags
& AMD_PG_SUPPORT_GFX_SMG
))
2959 data
|= RLC_PG_CNTL__STATIC_PER_CU_PG_ENABLE_MASK
;
2961 data
&= ~RLC_PG_CNTL__STATIC_PER_CU_PG_ENABLE_MASK
;
2963 WREG32(mmRLC_PG_CNTL
, data
);
2966 static void gfx_v6_0_enable_gfx_dynamic_mgpg(struct amdgpu_device
*adev
,
2971 orig
= data
= RREG32(mmRLC_PG_CNTL
);
2972 if (enable
&& (adev
->pg_flags
& AMD_PG_SUPPORT_GFX_DMG
))
2973 data
|= RLC_PG_CNTL__DYN_PER_CU_PG_ENABLE_MASK
;
2975 data
&= ~RLC_PG_CNTL__DYN_PER_CU_PG_ENABLE_MASK
;
2977 WREG32(mmRLC_PG_CNTL
, data
);
2980 static void gfx_v6_0_init_gfx_cgpg(struct amdgpu_device
*adev
)
2984 WREG32(mmRLC_SAVE_AND_RESTORE_BASE
, adev
->gfx
.rlc
.save_restore_gpu_addr
>> 8);
2985 WREG32_FIELD(RLC_PG_CNTL
, GFX_POWER_GATING_SRC
, 1);
2986 WREG32(mmRLC_CLEAR_STATE_RESTORE_BASE
, adev
->gfx
.rlc
.clear_state_gpu_addr
>> 8);
2988 tmp
= RREG32(mmRLC_AUTO_PG_CTRL
);
2989 tmp
&= ~RLC_AUTO_PG_CTRL__GRBM_REG_SAVE_GFX_IDLE_THRESHOLD_MASK
;
2990 tmp
|= (0x700 << RLC_AUTO_PG_CTRL__GRBM_REG_SAVE_GFX_IDLE_THRESHOLD__SHIFT
);
2991 tmp
&= ~RLC_AUTO_PG_CTRL__PG_AFTER_GRBM_REG_SAVE_THRESHOLD_MASK
;
2992 WREG32(mmRLC_AUTO_PG_CTRL
, tmp
);
2995 static void gfx_v6_0_update_gfx_pg(struct amdgpu_device
*adev
, bool enable
)
2997 gfx_v6_0_enable_gfx_cgpg(adev
, enable
);
2998 gfx_v6_0_enable_gfx_static_mgpg(adev
, enable
);
2999 gfx_v6_0_enable_gfx_dynamic_mgpg(adev
, enable
);
3002 static u32
gfx_v6_0_get_csb_size(struct amdgpu_device
*adev
)
3005 const struct cs_section_def
*sect
= NULL
;
3006 const struct cs_extent_def
*ext
= NULL
;
3008 if (adev
->gfx
.rlc
.cs_data
== NULL
)
3011 /* begin clear state */
3013 /* context control state */
3016 for (sect
= adev
->gfx
.rlc
.cs_data
; sect
->section
!= NULL
; ++sect
) {
3017 for (ext
= sect
->section
; ext
->extent
!= NULL
; ++ext
) {
3018 if (sect
->id
== SECT_CONTEXT
)
3019 count
+= 2 + ext
->reg_count
;
3024 /* pa_sc_raster_config */
3026 /* end clear state */
3034 static void gfx_v6_0_get_csb_buffer(struct amdgpu_device
*adev
,
3035 volatile u32
*buffer
)
3038 const struct cs_section_def
*sect
= NULL
;
3039 const struct cs_extent_def
*ext
= NULL
;
3041 if (adev
->gfx
.rlc
.cs_data
== NULL
)
3046 buffer
[count
++] = cpu_to_le32(PACKET3(PACKET3_PREAMBLE_CNTL
, 0));
3047 buffer
[count
++] = cpu_to_le32(PACKET3_PREAMBLE_BEGIN_CLEAR_STATE
);
3048 buffer
[count
++] = cpu_to_le32(PACKET3(PACKET3_CONTEXT_CONTROL
, 1));
3049 buffer
[count
++] = cpu_to_le32(0x80000000);
3050 buffer
[count
++] = cpu_to_le32(0x80000000);
3052 for (sect
= adev
->gfx
.rlc
.cs_data
; sect
->section
!= NULL
; ++sect
) {
3053 for (ext
= sect
->section
; ext
->extent
!= NULL
; ++ext
) {
3054 if (sect
->id
== SECT_CONTEXT
) {
3056 cpu_to_le32(PACKET3(PACKET3_SET_CONTEXT_REG
, ext
->reg_count
));
3057 buffer
[count
++] = cpu_to_le32(ext
->reg_index
- 0xa000);
3058 for (i
= 0; i
< ext
->reg_count
; i
++)
3059 buffer
[count
++] = cpu_to_le32(ext
->extent
[i
]);
3066 buffer
[count
++] = cpu_to_le32(PACKET3(PACKET3_SET_CONTEXT_REG
, 1));
3067 buffer
[count
++] = cpu_to_le32(mmPA_SC_RASTER_CONFIG
- PACKET3_SET_CONTEXT_REG_START
);
3069 switch (adev
->asic_type
) {
3072 buffer
[count
++] = cpu_to_le32(0x2a00126a);
3075 buffer
[count
++] = cpu_to_le32(0x0000124a);
3078 buffer
[count
++] = cpu_to_le32(0x00000082);
3081 buffer
[count
++] = cpu_to_le32(0x00000000);
3084 buffer
[count
++] = cpu_to_le32(0x00000000);
3088 buffer
[count
++] = cpu_to_le32(PACKET3(PACKET3_PREAMBLE_CNTL
, 0));
3089 buffer
[count
++] = cpu_to_le32(PACKET3_PREAMBLE_END_CLEAR_STATE
);
3091 buffer
[count
++] = cpu_to_le32(PACKET3(PACKET3_CLEAR_STATE
, 0));
3092 buffer
[count
++] = cpu_to_le32(0);
3095 static void gfx_v6_0_init_pg(struct amdgpu_device
*adev
)
3097 if (adev
->pg_flags
& (AMD_PG_SUPPORT_GFX_PG
|
3098 AMD_PG_SUPPORT_GFX_SMG
|
3099 AMD_PG_SUPPORT_GFX_DMG
|
3101 AMD_PG_SUPPORT_GDS
|
3102 AMD_PG_SUPPORT_RLC_SMU_HS
)) {
3103 gfx_v6_0_enable_sclk_slowdown_on_pu(adev
, true);
3104 gfx_v6_0_enable_sclk_slowdown_on_pd(adev
, true);
3105 if (adev
->pg_flags
& AMD_PG_SUPPORT_GFX_PG
) {
3106 gfx_v6_0_init_gfx_cgpg(adev
);
3107 gfx_v6_0_enable_cp_pg(adev
, true);
3108 gfx_v6_0_enable_gds_pg(adev
, true);
3110 WREG32(mmRLC_SAVE_AND_RESTORE_BASE
, adev
->gfx
.rlc
.save_restore_gpu_addr
>> 8);
3111 WREG32(mmRLC_CLEAR_STATE_RESTORE_BASE
, adev
->gfx
.rlc
.clear_state_gpu_addr
>> 8);
3114 gfx_v6_0_init_ao_cu_mask(adev
);
3115 gfx_v6_0_update_gfx_pg(adev
, true);
3118 WREG32(mmRLC_SAVE_AND_RESTORE_BASE
, adev
->gfx
.rlc
.save_restore_gpu_addr
>> 8);
3119 WREG32(mmRLC_CLEAR_STATE_RESTORE_BASE
, adev
->gfx
.rlc
.clear_state_gpu_addr
>> 8);
3123 static void gfx_v6_0_fini_pg(struct amdgpu_device
*adev
)
3125 if (adev
->pg_flags
& (AMD_PG_SUPPORT_GFX_PG
|
3126 AMD_PG_SUPPORT_GFX_SMG
|
3127 AMD_PG_SUPPORT_GFX_DMG
|
3129 AMD_PG_SUPPORT_GDS
|
3130 AMD_PG_SUPPORT_RLC_SMU_HS
)) {
3131 gfx_v6_0_update_gfx_pg(adev
, false);
3132 if (adev
->pg_flags
& AMD_PG_SUPPORT_GFX_PG
) {
3133 gfx_v6_0_enable_cp_pg(adev
, false);
3134 gfx_v6_0_enable_gds_pg(adev
, false);
3139 static uint64_t gfx_v6_0_get_gpu_clock_counter(struct amdgpu_device
*adev
)
3143 mutex_lock(&adev
->gfx
.gpu_clock_mutex
);
3144 WREG32(mmRLC_CAPTURE_GPU_CLOCK_COUNT
, 1);
3145 clock
= (uint64_t)RREG32(mmRLC_GPU_CLOCK_COUNT_LSB
) |
3146 ((uint64_t)RREG32(mmRLC_GPU_CLOCK_COUNT_MSB
) << 32ULL);
3147 mutex_unlock(&adev
->gfx
.gpu_clock_mutex
);
3151 static void gfx_v6_ring_emit_cntxcntl(struct amdgpu_ring
*ring
, uint32_t flags
)
3153 if (flags
& AMDGPU_HAVE_CTX_SWITCH
)
3154 gfx_v6_0_ring_emit_vgt_flush(ring
);
3155 amdgpu_ring_write(ring
, PACKET3(PACKET3_CONTEXT_CONTROL
, 1));
3156 amdgpu_ring_write(ring
, 0x80000000);
3157 amdgpu_ring_write(ring
, 0);
3161 static uint32_t wave_read_ind(struct amdgpu_device
*adev
, uint32_t simd
, uint32_t wave
, uint32_t address
)
3163 WREG32(mmSQ_IND_INDEX
,
3164 (wave
<< SQ_IND_INDEX__WAVE_ID__SHIFT
) |
3165 (simd
<< SQ_IND_INDEX__SIMD_ID__SHIFT
) |
3166 (address
<< SQ_IND_INDEX__INDEX__SHIFT
) |
3167 (SQ_IND_INDEX__FORCE_READ_MASK
));
3168 return RREG32(mmSQ_IND_DATA
);
3171 static void wave_read_regs(struct amdgpu_device
*adev
, uint32_t simd
,
3172 uint32_t wave
, uint32_t thread
,
3173 uint32_t regno
, uint32_t num
, uint32_t *out
)
3175 WREG32(mmSQ_IND_INDEX
,
3176 (wave
<< SQ_IND_INDEX__WAVE_ID__SHIFT
) |
3177 (simd
<< SQ_IND_INDEX__SIMD_ID__SHIFT
) |
3178 (regno
<< SQ_IND_INDEX__INDEX__SHIFT
) |
3179 (thread
<< SQ_IND_INDEX__THREAD_ID__SHIFT
) |
3180 (SQ_IND_INDEX__FORCE_READ_MASK
) |
3181 (SQ_IND_INDEX__AUTO_INCR_MASK
));
3183 *(out
++) = RREG32(mmSQ_IND_DATA
);
3186 static void gfx_v6_0_read_wave_data(struct amdgpu_device
*adev
, uint32_t simd
, uint32_t wave
, uint32_t *dst
, int *no_fields
)
3188 /* type 0 wave data */
3189 dst
[(*no_fields
)++] = 0;
3190 dst
[(*no_fields
)++] = wave_read_ind(adev
, simd
, wave
, ixSQ_WAVE_STATUS
);
3191 dst
[(*no_fields
)++] = wave_read_ind(adev
, simd
, wave
, ixSQ_WAVE_PC_LO
);
3192 dst
[(*no_fields
)++] = wave_read_ind(adev
, simd
, wave
, ixSQ_WAVE_PC_HI
);
3193 dst
[(*no_fields
)++] = wave_read_ind(adev
, simd
, wave
, ixSQ_WAVE_EXEC_LO
);
3194 dst
[(*no_fields
)++] = wave_read_ind(adev
, simd
, wave
, ixSQ_WAVE_EXEC_HI
);
3195 dst
[(*no_fields
)++] = wave_read_ind(adev
, simd
, wave
, ixSQ_WAVE_HW_ID
);
3196 dst
[(*no_fields
)++] = wave_read_ind(adev
, simd
, wave
, ixSQ_WAVE_INST_DW0
);
3197 dst
[(*no_fields
)++] = wave_read_ind(adev
, simd
, wave
, ixSQ_WAVE_INST_DW1
);
3198 dst
[(*no_fields
)++] = wave_read_ind(adev
, simd
, wave
, ixSQ_WAVE_GPR_ALLOC
);
3199 dst
[(*no_fields
)++] = wave_read_ind(adev
, simd
, wave
, ixSQ_WAVE_LDS_ALLOC
);
3200 dst
[(*no_fields
)++] = wave_read_ind(adev
, simd
, wave
, ixSQ_WAVE_TRAPSTS
);
3201 dst
[(*no_fields
)++] = wave_read_ind(adev
, simd
, wave
, ixSQ_WAVE_IB_STS
);
3202 dst
[(*no_fields
)++] = wave_read_ind(adev
, simd
, wave
, ixSQ_WAVE_TBA_LO
);
3203 dst
[(*no_fields
)++] = wave_read_ind(adev
, simd
, wave
, ixSQ_WAVE_TBA_HI
);
3204 dst
[(*no_fields
)++] = wave_read_ind(adev
, simd
, wave
, ixSQ_WAVE_TMA_LO
);
3205 dst
[(*no_fields
)++] = wave_read_ind(adev
, simd
, wave
, ixSQ_WAVE_TMA_HI
);
3206 dst
[(*no_fields
)++] = wave_read_ind(adev
, simd
, wave
, ixSQ_WAVE_IB_DBG0
);
3207 dst
[(*no_fields
)++] = wave_read_ind(adev
, simd
, wave
, ixSQ_WAVE_M0
);
3210 static void gfx_v6_0_read_wave_sgprs(struct amdgpu_device
*adev
, uint32_t simd
,
3211 uint32_t wave
, uint32_t start
,
3212 uint32_t size
, uint32_t *dst
)
3215 adev
, simd
, wave
, 0,
3216 start
+ SQIND_WAVE_SGPRS_OFFSET
, size
, dst
);
3219 static const struct amdgpu_gfx_funcs gfx_v6_0_gfx_funcs
= {
3220 .get_gpu_clock_counter
= &gfx_v6_0_get_gpu_clock_counter
,
3221 .select_se_sh
= &gfx_v6_0_select_se_sh
,
3222 .read_wave_data
= &gfx_v6_0_read_wave_data
,
3223 .read_wave_sgprs
= &gfx_v6_0_read_wave_sgprs
,
3226 static int gfx_v6_0_early_init(void *handle
)
3228 struct amdgpu_device
*adev
= (struct amdgpu_device
*)handle
;
3230 adev
->gfx
.num_gfx_rings
= GFX6_NUM_GFX_RINGS
;
3231 adev
->gfx
.num_compute_rings
= GFX6_NUM_COMPUTE_RINGS
;
3232 adev
->gfx
.funcs
= &gfx_v6_0_gfx_funcs
;
3233 gfx_v6_0_set_ring_funcs(adev
);
3234 gfx_v6_0_set_irq_funcs(adev
);
3239 static int gfx_v6_0_sw_init(void *handle
)
3241 struct amdgpu_ring
*ring
;
3242 struct amdgpu_device
*adev
= (struct amdgpu_device
*)handle
;
3245 r
= amdgpu_irq_add_id(adev
, AMDGPU_IH_CLIENTID_LEGACY
, 181, &adev
->gfx
.eop_irq
);
3249 r
= amdgpu_irq_add_id(adev
, AMDGPU_IH_CLIENTID_LEGACY
, 184, &adev
->gfx
.priv_reg_irq
);
3253 r
= amdgpu_irq_add_id(adev
, AMDGPU_IH_CLIENTID_LEGACY
, 185, &adev
->gfx
.priv_inst_irq
);
3257 gfx_v6_0_scratch_init(adev
);
3259 r
= gfx_v6_0_init_microcode(adev
);
3261 DRM_ERROR("Failed to load gfx firmware!\n");
3265 r
= gfx_v6_0_rlc_init(adev
);
3267 DRM_ERROR("Failed to init rlc BOs!\n");
3271 for (i
= 0; i
< adev
->gfx
.num_gfx_rings
; i
++) {
3272 ring
= &adev
->gfx
.gfx_ring
[i
];
3273 ring
->ring_obj
= NULL
;
3274 sprintf(ring
->name
, "gfx");
3275 r
= amdgpu_ring_init(adev
, ring
, 1024,
3276 &adev
->gfx
.eop_irq
, AMDGPU_CP_IRQ_GFX_EOP
);
3281 for (i
= 0; i
< adev
->gfx
.num_compute_rings
; i
++) {
3284 if ((i
>= 32) || (i
>= AMDGPU_MAX_COMPUTE_RINGS
)) {
3285 DRM_ERROR("Too many (%d) compute rings!\n", i
);
3288 ring
= &adev
->gfx
.compute_ring
[i
];
3289 ring
->ring_obj
= NULL
;
3290 ring
->use_doorbell
= false;
3291 ring
->doorbell_index
= 0;
3295 sprintf(ring
->name
, "comp_%d.%d.%d", ring
->me
, ring
->pipe
, ring
->queue
);
3296 irq_type
= AMDGPU_CP_IRQ_COMPUTE_MEC1_PIPE0_EOP
+ ring
->pipe
;
3297 r
= amdgpu_ring_init(adev
, ring
, 1024,
3298 &adev
->gfx
.eop_irq
, irq_type
);
3306 static int gfx_v6_0_sw_fini(void *handle
)
3309 struct amdgpu_device
*adev
= (struct amdgpu_device
*)handle
;
3311 for (i
= 0; i
< adev
->gfx
.num_gfx_rings
; i
++)
3312 amdgpu_ring_fini(&adev
->gfx
.gfx_ring
[i
]);
3313 for (i
= 0; i
< adev
->gfx
.num_compute_rings
; i
++)
3314 amdgpu_ring_fini(&adev
->gfx
.compute_ring
[i
]);
3316 gfx_v6_0_rlc_fini(adev
);
3321 static int gfx_v6_0_hw_init(void *handle
)
3324 struct amdgpu_device
*adev
= (struct amdgpu_device
*)handle
;
3326 gfx_v6_0_gpu_init(adev
);
3328 r
= gfx_v6_0_rlc_resume(adev
);
3332 r
= gfx_v6_0_cp_resume(adev
);
3336 adev
->gfx
.ce_ram_size
= 0x8000;
3341 static int gfx_v6_0_hw_fini(void *handle
)
3343 struct amdgpu_device
*adev
= (struct amdgpu_device
*)handle
;
3345 gfx_v6_0_cp_enable(adev
, false);
3346 gfx_v6_0_rlc_stop(adev
);
3347 gfx_v6_0_fini_pg(adev
);
3352 static int gfx_v6_0_suspend(void *handle
)
3354 struct amdgpu_device
*adev
= (struct amdgpu_device
*)handle
;
3356 return gfx_v6_0_hw_fini(adev
);
3359 static int gfx_v6_0_resume(void *handle
)
3361 struct amdgpu_device
*adev
= (struct amdgpu_device
*)handle
;
3363 return gfx_v6_0_hw_init(adev
);
3366 static bool gfx_v6_0_is_idle(void *handle
)
3368 struct amdgpu_device
*adev
= (struct amdgpu_device
*)handle
;
3370 if (RREG32(mmGRBM_STATUS
) & GRBM_STATUS__GUI_ACTIVE_MASK
)
3376 static int gfx_v6_0_wait_for_idle(void *handle
)
3379 struct amdgpu_device
*adev
= (struct amdgpu_device
*)handle
;
3381 for (i
= 0; i
< adev
->usec_timeout
; i
++) {
3382 if (gfx_v6_0_is_idle(handle
))
3389 static int gfx_v6_0_soft_reset(void *handle
)
3394 static void gfx_v6_0_set_gfx_eop_interrupt_state(struct amdgpu_device
*adev
,
3395 enum amdgpu_interrupt_state state
)
3400 case AMDGPU_IRQ_STATE_DISABLE
:
3401 cp_int_cntl
= RREG32(mmCP_INT_CNTL_RING0
);
3402 cp_int_cntl
&= ~CP_INT_CNTL_RING0__TIME_STAMP_INT_ENABLE_MASK
;
3403 WREG32(mmCP_INT_CNTL_RING0
, cp_int_cntl
);
3405 case AMDGPU_IRQ_STATE_ENABLE
:
3406 cp_int_cntl
= RREG32(mmCP_INT_CNTL_RING0
);
3407 cp_int_cntl
|= CP_INT_CNTL_RING0__TIME_STAMP_INT_ENABLE_MASK
;
3408 WREG32(mmCP_INT_CNTL_RING0
, cp_int_cntl
);
3415 static void gfx_v6_0_set_compute_eop_interrupt_state(struct amdgpu_device
*adev
,
3417 enum amdgpu_interrupt_state state
)
3421 case AMDGPU_IRQ_STATE_DISABLE
:
3423 cp_int_cntl
= RREG32(mmCP_INT_CNTL_RING1
);
3424 cp_int_cntl
&= ~CP_INT_CNTL_RING1__TIME_STAMP_INT_ENABLE_MASK
;
3425 WREG32(mmCP_INT_CNTL_RING1
, cp_int_cntl
);
3428 cp_int_cntl
= RREG32(mmCP_INT_CNTL_RING2
);
3429 cp_int_cntl
&= ~CP_INT_CNTL_RING2__TIME_STAMP_INT_ENABLE_MASK
;
3430 WREG32(mmCP_INT_CNTL_RING2
, cp_int_cntl
);
3434 case AMDGPU_IRQ_STATE_ENABLE
:
3436 cp_int_cntl
= RREG32(mmCP_INT_CNTL_RING1
);
3437 cp_int_cntl
|= CP_INT_CNTL_RING1__TIME_STAMP_INT_ENABLE_MASK
;
3438 WREG32(mmCP_INT_CNTL_RING1
, cp_int_cntl
);
3441 cp_int_cntl
= RREG32(mmCP_INT_CNTL_RING2
);
3442 cp_int_cntl
|= CP_INT_CNTL_RING2__TIME_STAMP_INT_ENABLE_MASK
;
3443 WREG32(mmCP_INT_CNTL_RING2
, cp_int_cntl
);
3455 static int gfx_v6_0_set_priv_reg_fault_state(struct amdgpu_device
*adev
,
3456 struct amdgpu_irq_src
*src
,
3458 enum amdgpu_interrupt_state state
)
3463 case AMDGPU_IRQ_STATE_DISABLE
:
3464 cp_int_cntl
= RREG32(mmCP_INT_CNTL_RING0
);
3465 cp_int_cntl
&= ~CP_INT_CNTL_RING0__PRIV_REG_INT_ENABLE_MASK
;
3466 WREG32(mmCP_INT_CNTL_RING0
, cp_int_cntl
);
3468 case AMDGPU_IRQ_STATE_ENABLE
:
3469 cp_int_cntl
= RREG32(mmCP_INT_CNTL_RING0
);
3470 cp_int_cntl
|= CP_INT_CNTL_RING0__PRIV_REG_INT_ENABLE_MASK
;
3471 WREG32(mmCP_INT_CNTL_RING0
, cp_int_cntl
);
3480 static int gfx_v6_0_set_priv_inst_fault_state(struct amdgpu_device
*adev
,
3481 struct amdgpu_irq_src
*src
,
3483 enum amdgpu_interrupt_state state
)
3488 case AMDGPU_IRQ_STATE_DISABLE
:
3489 cp_int_cntl
= RREG32(mmCP_INT_CNTL_RING0
);
3490 cp_int_cntl
&= ~CP_INT_CNTL_RING0__PRIV_INSTR_INT_ENABLE_MASK
;
3491 WREG32(mmCP_INT_CNTL_RING0
, cp_int_cntl
);
3493 case AMDGPU_IRQ_STATE_ENABLE
:
3494 cp_int_cntl
= RREG32(mmCP_INT_CNTL_RING0
);
3495 cp_int_cntl
|= CP_INT_CNTL_RING0__PRIV_INSTR_INT_ENABLE_MASK
;
3496 WREG32(mmCP_INT_CNTL_RING0
, cp_int_cntl
);
3505 static int gfx_v6_0_set_eop_interrupt_state(struct amdgpu_device
*adev
,
3506 struct amdgpu_irq_src
*src
,
3508 enum amdgpu_interrupt_state state
)
3511 case AMDGPU_CP_IRQ_GFX_EOP
:
3512 gfx_v6_0_set_gfx_eop_interrupt_state(adev
, state
);
3514 case AMDGPU_CP_IRQ_COMPUTE_MEC1_PIPE0_EOP
:
3515 gfx_v6_0_set_compute_eop_interrupt_state(adev
, 0, state
);
3517 case AMDGPU_CP_IRQ_COMPUTE_MEC1_PIPE1_EOP
:
3518 gfx_v6_0_set_compute_eop_interrupt_state(adev
, 1, state
);
3526 static int gfx_v6_0_eop_irq(struct amdgpu_device
*adev
,
3527 struct amdgpu_irq_src
*source
,
3528 struct amdgpu_iv_entry
*entry
)
3530 switch (entry
->ring_id
) {
3532 amdgpu_fence_process(&adev
->gfx
.gfx_ring
[0]);
3536 amdgpu_fence_process(&adev
->gfx
.compute_ring
[entry
->ring_id
- 1]);
3544 static int gfx_v6_0_priv_reg_irq(struct amdgpu_device
*adev
,
3545 struct amdgpu_irq_src
*source
,
3546 struct amdgpu_iv_entry
*entry
)
3548 DRM_ERROR("Illegal register access in command stream\n");
3549 schedule_work(&adev
->reset_work
);
3553 static int gfx_v6_0_priv_inst_irq(struct amdgpu_device
*adev
,
3554 struct amdgpu_irq_src
*source
,
3555 struct amdgpu_iv_entry
*entry
)
3557 DRM_ERROR("Illegal instruction in command stream\n");
3558 schedule_work(&adev
->reset_work
);
3562 static int gfx_v6_0_set_clockgating_state(void *handle
,
3563 enum amd_clockgating_state state
)
3566 struct amdgpu_device
*adev
= (struct amdgpu_device
*)handle
;
3568 if (state
== AMD_CG_STATE_GATE
)
3571 gfx_v6_0_enable_gui_idle_interrupt(adev
, false);
3573 gfx_v6_0_enable_mgcg(adev
, true);
3574 gfx_v6_0_enable_cgcg(adev
, true);
3576 gfx_v6_0_enable_cgcg(adev
, false);
3577 gfx_v6_0_enable_mgcg(adev
, false);
3579 gfx_v6_0_enable_gui_idle_interrupt(adev
, true);
3584 static int gfx_v6_0_set_powergating_state(void *handle
,
3585 enum amd_powergating_state state
)
3588 struct amdgpu_device
*adev
= (struct amdgpu_device
*)handle
;
3590 if (state
== AMD_PG_STATE_GATE
)
3593 if (adev
->pg_flags
& (AMD_PG_SUPPORT_GFX_PG
|
3594 AMD_PG_SUPPORT_GFX_SMG
|
3595 AMD_PG_SUPPORT_GFX_DMG
|
3597 AMD_PG_SUPPORT_GDS
|
3598 AMD_PG_SUPPORT_RLC_SMU_HS
)) {
3599 gfx_v6_0_update_gfx_pg(adev
, gate
);
3600 if (adev
->pg_flags
& AMD_PG_SUPPORT_GFX_PG
) {
3601 gfx_v6_0_enable_cp_pg(adev
, gate
);
3602 gfx_v6_0_enable_gds_pg(adev
, gate
);
3609 static const struct amd_ip_funcs gfx_v6_0_ip_funcs
= {
3611 .early_init
= gfx_v6_0_early_init
,
3613 .sw_init
= gfx_v6_0_sw_init
,
3614 .sw_fini
= gfx_v6_0_sw_fini
,
3615 .hw_init
= gfx_v6_0_hw_init
,
3616 .hw_fini
= gfx_v6_0_hw_fini
,
3617 .suspend
= gfx_v6_0_suspend
,
3618 .resume
= gfx_v6_0_resume
,
3619 .is_idle
= gfx_v6_0_is_idle
,
3620 .wait_for_idle
= gfx_v6_0_wait_for_idle
,
3621 .soft_reset
= gfx_v6_0_soft_reset
,
3622 .set_clockgating_state
= gfx_v6_0_set_clockgating_state
,
3623 .set_powergating_state
= gfx_v6_0_set_powergating_state
,
3626 static const struct amdgpu_ring_funcs gfx_v6_0_ring_funcs_gfx
= {
3627 .type
= AMDGPU_RING_TYPE_GFX
,
3630 .support_64bit_ptrs
= false,
3631 .get_rptr
= gfx_v6_0_ring_get_rptr
,
3632 .get_wptr
= gfx_v6_0_ring_get_wptr
,
3633 .set_wptr
= gfx_v6_0_ring_set_wptr_gfx
,
3635 5 + /* gfx_v6_0_ring_emit_hdp_flush */
3636 5 + /* gfx_v6_0_ring_emit_hdp_invalidate */
3637 14 + 14 + 14 + /* gfx_v6_0_ring_emit_fence x3 for user fence, vm fence */
3638 7 + 4 + /* gfx_v6_0_ring_emit_pipeline_sync */
3639 17 + 6 + /* gfx_v6_0_ring_emit_vm_flush */
3640 3 + 2, /* gfx_v6_ring_emit_cntxcntl including vgt flush */
3641 .emit_ib_size
= 6, /* gfx_v6_0_ring_emit_ib */
3642 .emit_ib
= gfx_v6_0_ring_emit_ib
,
3643 .emit_fence
= gfx_v6_0_ring_emit_fence
,
3644 .emit_pipeline_sync
= gfx_v6_0_ring_emit_pipeline_sync
,
3645 .emit_vm_flush
= gfx_v6_0_ring_emit_vm_flush
,
3646 .emit_hdp_flush
= gfx_v6_0_ring_emit_hdp_flush
,
3647 .emit_hdp_invalidate
= gfx_v6_0_ring_emit_hdp_invalidate
,
3648 .test_ring
= gfx_v6_0_ring_test_ring
,
3649 .test_ib
= gfx_v6_0_ring_test_ib
,
3650 .insert_nop
= amdgpu_ring_insert_nop
,
3651 .emit_cntxcntl
= gfx_v6_ring_emit_cntxcntl
,
3654 static const struct amdgpu_ring_funcs gfx_v6_0_ring_funcs_compute
= {
3655 .type
= AMDGPU_RING_TYPE_COMPUTE
,
3658 .get_rptr
= gfx_v6_0_ring_get_rptr
,
3659 .get_wptr
= gfx_v6_0_ring_get_wptr
,
3660 .set_wptr
= gfx_v6_0_ring_set_wptr_compute
,
3662 5 + /* gfx_v6_0_ring_emit_hdp_flush */
3663 5 + /* gfx_v6_0_ring_emit_hdp_invalidate */
3664 7 + /* gfx_v6_0_ring_emit_pipeline_sync */
3665 17 + /* gfx_v6_0_ring_emit_vm_flush */
3666 14 + 14 + 14, /* gfx_v6_0_ring_emit_fence x3 for user fence, vm fence */
3667 .emit_ib_size
= 6, /* gfx_v6_0_ring_emit_ib */
3668 .emit_ib
= gfx_v6_0_ring_emit_ib
,
3669 .emit_fence
= gfx_v6_0_ring_emit_fence
,
3670 .emit_pipeline_sync
= gfx_v6_0_ring_emit_pipeline_sync
,
3671 .emit_vm_flush
= gfx_v6_0_ring_emit_vm_flush
,
3672 .emit_hdp_flush
= gfx_v6_0_ring_emit_hdp_flush
,
3673 .emit_hdp_invalidate
= gfx_v6_0_ring_emit_hdp_invalidate
,
3674 .test_ring
= gfx_v6_0_ring_test_ring
,
3675 .test_ib
= gfx_v6_0_ring_test_ib
,
3676 .insert_nop
= amdgpu_ring_insert_nop
,
3679 static void gfx_v6_0_set_ring_funcs(struct amdgpu_device
*adev
)
3683 for (i
= 0; i
< adev
->gfx
.num_gfx_rings
; i
++)
3684 adev
->gfx
.gfx_ring
[i
].funcs
= &gfx_v6_0_ring_funcs_gfx
;
3685 for (i
= 0; i
< adev
->gfx
.num_compute_rings
; i
++)
3686 adev
->gfx
.compute_ring
[i
].funcs
= &gfx_v6_0_ring_funcs_compute
;
3689 static const struct amdgpu_irq_src_funcs gfx_v6_0_eop_irq_funcs
= {
3690 .set
= gfx_v6_0_set_eop_interrupt_state
,
3691 .process
= gfx_v6_0_eop_irq
,
3694 static const struct amdgpu_irq_src_funcs gfx_v6_0_priv_reg_irq_funcs
= {
3695 .set
= gfx_v6_0_set_priv_reg_fault_state
,
3696 .process
= gfx_v6_0_priv_reg_irq
,
3699 static const struct amdgpu_irq_src_funcs gfx_v6_0_priv_inst_irq_funcs
= {
3700 .set
= gfx_v6_0_set_priv_inst_fault_state
,
3701 .process
= gfx_v6_0_priv_inst_irq
,
3704 static void gfx_v6_0_set_irq_funcs(struct amdgpu_device
*adev
)
3706 adev
->gfx
.eop_irq
.num_types
= AMDGPU_CP_IRQ_LAST
;
3707 adev
->gfx
.eop_irq
.funcs
= &gfx_v6_0_eop_irq_funcs
;
3709 adev
->gfx
.priv_reg_irq
.num_types
= 1;
3710 adev
->gfx
.priv_reg_irq
.funcs
= &gfx_v6_0_priv_reg_irq_funcs
;
3712 adev
->gfx
.priv_inst_irq
.num_types
= 1;
3713 adev
->gfx
.priv_inst_irq
.funcs
= &gfx_v6_0_priv_inst_irq_funcs
;
3716 static void gfx_v6_0_get_cu_info(struct amdgpu_device
*adev
)
3718 int i
, j
, k
, counter
, active_cu_number
= 0;
3719 u32 mask
, bitmap
, ao_bitmap
, ao_cu_mask
= 0;
3720 struct amdgpu_cu_info
*cu_info
= &adev
->gfx
.cu_info
;
3721 unsigned disable_masks
[4 * 2];
3723 memset(cu_info
, 0, sizeof(*cu_info
));
3725 amdgpu_gfx_parse_disable_cu(disable_masks
, 4, 2);
3727 mutex_lock(&adev
->grbm_idx_mutex
);
3728 for (i
= 0; i
< adev
->gfx
.config
.max_shader_engines
; i
++) {
3729 for (j
= 0; j
< adev
->gfx
.config
.max_sh_per_se
; j
++) {
3733 gfx_v6_0_select_se_sh(adev
, i
, j
, 0xffffffff);
3735 gfx_v6_0_set_user_cu_inactive_bitmap(
3736 adev
, disable_masks
[i
* 2 + j
]);
3737 bitmap
= gfx_v6_0_get_cu_enabled(adev
);
3738 cu_info
->bitmap
[i
][j
] = bitmap
;
3740 for (k
= 0; k
< 16; k
++) {
3741 if (bitmap
& mask
) {
3748 active_cu_number
+= counter
;
3749 ao_cu_mask
|= (ao_bitmap
<< (i
* 16 + j
* 8));
3753 gfx_v6_0_select_se_sh(adev
, 0xffffffff, 0xffffffff, 0xffffffff);
3754 mutex_unlock(&adev
->grbm_idx_mutex
);
3756 cu_info
->number
= active_cu_number
;
3757 cu_info
->ao_cu_mask
= ao_cu_mask
;
3760 const struct amdgpu_ip_block_version gfx_v6_0_ip_block
=
3762 .type
= AMD_IP_BLOCK_TYPE_GFX
,
3766 .funcs
= &gfx_v6_0_ip_funcs
,