diff options
Diffstat (limited to 'drivers/gpu/drm/amd/amdgpu/gfx_v8_0.c')
-rw-r--r-- | drivers/gpu/drm/amd/amdgpu/gfx_v8_0.c | 145 |
1 files changed, 127 insertions, 18 deletions
diff --git a/drivers/gpu/drm/amd/amdgpu/gfx_v8_0.c b/drivers/gpu/drm/amd/amdgpu/gfx_v8_0.c index f5a42ab1f65c..4b68e6306f40 100644 --- a/drivers/gpu/drm/amd/amdgpu/gfx_v8_0.c +++ b/drivers/gpu/drm/amd/amdgpu/gfx_v8_0.c | |||
@@ -87,6 +87,13 @@ MODULE_FIRMWARE("amdgpu/topaz_mec.bin"); | |||
87 | MODULE_FIRMWARE("amdgpu/topaz_mec2.bin"); | 87 | MODULE_FIRMWARE("amdgpu/topaz_mec2.bin"); |
88 | MODULE_FIRMWARE("amdgpu/topaz_rlc.bin"); | 88 | MODULE_FIRMWARE("amdgpu/topaz_rlc.bin"); |
89 | 89 | ||
90 | MODULE_FIRMWARE("amdgpu/fiji_ce.bin"); | ||
91 | MODULE_FIRMWARE("amdgpu/fiji_pfp.bin"); | ||
92 | MODULE_FIRMWARE("amdgpu/fiji_me.bin"); | ||
93 | MODULE_FIRMWARE("amdgpu/fiji_mec.bin"); | ||
94 | MODULE_FIRMWARE("amdgpu/fiji_mec2.bin"); | ||
95 | MODULE_FIRMWARE("amdgpu/fiji_rlc.bin"); | ||
96 | |||
90 | static const struct amdgpu_gds_reg_offset amdgpu_gds_reg_offset[] = | 97 | static const struct amdgpu_gds_reg_offset amdgpu_gds_reg_offset[] = |
91 | { | 98 | { |
92 | {mmGDS_VMID0_BASE, mmGDS_VMID0_SIZE, mmGDS_GWS_VMID0, mmGDS_OA_VMID0}, | 99 | {mmGDS_VMID0_BASE, mmGDS_VMID0_SIZE, mmGDS_GWS_VMID0, mmGDS_OA_VMID0}, |
@@ -217,6 +224,71 @@ static const u32 tonga_mgcg_cgcg_init[] = | |||
217 | mmCP_MEM_SLP_CNTL, 0x00000001, 0x00000001, | 224 | mmCP_MEM_SLP_CNTL, 0x00000001, 0x00000001, |
218 | }; | 225 | }; |
219 | 226 | ||
227 | static const u32 fiji_golden_common_all[] = | ||
228 | { | ||
229 | mmGRBM_GFX_INDEX, 0xffffffff, 0xe0000000, | ||
230 | mmPA_SC_RASTER_CONFIG, 0xffffffff, 0x3a00161a, | ||
231 | mmPA_SC_RASTER_CONFIG_1, 0xffffffff, 0x0000002e, | ||
232 | mmGB_ADDR_CONFIG, 0xffffffff, 0x12011003, | ||
233 | mmSPI_RESOURCE_RESERVE_CU_0, 0xffffffff, 0x00000800, | ||
234 | mmSPI_RESOURCE_RESERVE_CU_1, 0xffffffff, 0x00000800, | ||
235 | mmSPI_RESOURCE_RESERVE_EN_CU_0, 0xffffffff, 0x00007FBF, | ||
236 | mmSPI_RESOURCE_RESERVE_EN_CU_1, 0xffffffff, 0x00007FAF | ||
237 | }; | ||
238 | |||
239 | static const u32 golden_settings_fiji_a10[] = | ||
240 | { | ||
241 | mmCB_HW_CONTROL_3, 0x000001ff, 0x00000040, | ||
242 | mmDB_DEBUG2, 0xf00fffff, 0x00000400, | ||
243 | mmPA_SC_ENHANCE, 0xffffffff, 0x20000001, | ||
244 | mmPA_SC_FIFO_DEPTH_CNTL, 0x000003ff, 0x00000100, | ||
245 | mmPA_SC_LINE_STIPPLE_STATE, 0x0000ff0f, 0x00000000, | ||
246 | mmTA_CNTL_AUX, 0x000f000f, 0x000b0000, | ||
247 | mmTCC_CTRL, 0x00100000, 0xf30fff7f, | ||
248 | mmTCP_ADDR_CONFIG, 0x000003ff, 0x000000ff, | ||
249 | mmTCP_CHAN_STEER_HI, 0xffffffff, 0x7d6cf5e4, | ||
250 | mmTCP_CHAN_STEER_LO, 0xffffffff, 0x3928b1a0, | ||
251 | }; | ||
252 | |||
253 | static const u32 fiji_mgcg_cgcg_init[] = | ||
254 | { | ||
255 | mmRLC_CGTT_MGCG_OVERRIDE, 0xffffffff, 0xffffffc0, | ||
256 | mmGRBM_GFX_INDEX, 0xffffffff, 0xe0000000, | ||
257 | mmCB_CGTT_SCLK_CTRL, 0xffffffff, 0x00000100, | ||
258 | mmCGTT_BCI_CLK_CTRL, 0xffffffff, 0x00000100, | ||
259 | mmCGTT_CP_CLK_CTRL, 0xffffffff, 0x00000100, | ||
260 | mmCGTT_CPC_CLK_CTRL, 0xffffffff, 0x00000100, | ||
261 | mmCGTT_CPF_CLK_CTRL, 0xffffffff, 0x40000100, | ||
262 | mmCGTT_GDS_CLK_CTRL, 0xffffffff, 0x00000100, | ||
263 | mmCGTT_IA_CLK_CTRL, 0xffffffff, 0x06000100, | ||
264 | mmCGTT_PA_CLK_CTRL, 0xffffffff, 0x00000100, | ||
265 | mmCGTT_WD_CLK_CTRL, 0xffffffff, 0x06000100, | ||
266 | mmCGTT_PC_CLK_CTRL, 0xffffffff, 0x00000100, | ||
267 | mmCGTT_RLC_CLK_CTRL, 0xffffffff, 0x00000100, | ||
268 | mmCGTT_SC_CLK_CTRL, 0xffffffff, 0x00000100, | ||
269 | mmCGTT_SPI_CLK_CTRL, 0xffffffff, 0x00000100, | ||
270 | mmCGTT_SQ_CLK_CTRL, 0xffffffff, 0x00000100, | ||
271 | mmCGTT_SQG_CLK_CTRL, 0xffffffff, 0x00000100, | ||
272 | mmCGTT_SX_CLK_CTRL0, 0xffffffff, 0x00000100, | ||
273 | mmCGTT_SX_CLK_CTRL1, 0xffffffff, 0x00000100, | ||
274 | mmCGTT_SX_CLK_CTRL2, 0xffffffff, 0x00000100, | ||
275 | mmCGTT_SX_CLK_CTRL3, 0xffffffff, 0x00000100, | ||
276 | mmCGTT_SX_CLK_CTRL4, 0xffffffff, 0x00000100, | ||
277 | mmCGTT_TCI_CLK_CTRL, 0xffffffff, 0x00000100, | ||
278 | mmCGTT_TCP_CLK_CTRL, 0xffffffff, 0x00000100, | ||
279 | mmCGTT_VGT_CLK_CTRL, 0xffffffff, 0x06000100, | ||
280 | mmDB_CGTT_CLK_CTRL_0, 0xffffffff, 0x00000100, | ||
281 | mmTA_CGTT_CTRL, 0xffffffff, 0x00000100, | ||
282 | mmTCA_CGTT_SCLK_CTRL, 0xffffffff, 0x00000100, | ||
283 | mmTCC_CGTT_SCLK_CTRL, 0xffffffff, 0x00000100, | ||
284 | mmTD_CGTT_CTRL, 0xffffffff, 0x00000100, | ||
285 | mmGRBM_GFX_INDEX, 0xffffffff, 0xe0000000, | ||
286 | mmCGTS_SM_CTRL_REG, 0xffffffff, 0x96e00200, | ||
287 | mmCP_RB_WPTR_POLL_CNTL, 0xffffffff, 0x00900100, | ||
288 | mmRLC_CGCG_CGLS_CTRL, 0xffffffff, 0x0020003c, | ||
289 | mmCP_MEM_SLP_CNTL, 0x00000001, 0x00000001, | ||
290 | }; | ||
291 | |||
220 | static const u32 golden_settings_iceland_a11[] = | 292 | static const u32 golden_settings_iceland_a11[] = |
221 | { | 293 | { |
222 | mmCB_HW_CONTROL_3, 0x00000040, 0x00000040, | 294 | mmCB_HW_CONTROL_3, 0x00000040, 0x00000040, |
@@ -439,6 +511,18 @@ static void gfx_v8_0_init_golden_registers(struct amdgpu_device *adev) | |||
439 | iceland_golden_common_all, | 511 | iceland_golden_common_all, |
440 | (const u32)ARRAY_SIZE(iceland_golden_common_all)); | 512 | (const u32)ARRAY_SIZE(iceland_golden_common_all)); |
441 | break; | 513 | break; |
514 | case CHIP_FIJI: | ||
515 | amdgpu_program_register_sequence(adev, | ||
516 | fiji_mgcg_cgcg_init, | ||
517 | (const u32)ARRAY_SIZE(fiji_mgcg_cgcg_init)); | ||
518 | amdgpu_program_register_sequence(adev, | ||
519 | golden_settings_fiji_a10, | ||
520 | (const u32)ARRAY_SIZE(golden_settings_fiji_a10)); | ||
521 | amdgpu_program_register_sequence(adev, | ||
522 | fiji_golden_common_all, | ||
523 | (const u32)ARRAY_SIZE(fiji_golden_common_all)); | ||
524 | break; | ||
525 | |||
442 | case CHIP_TONGA: | 526 | case CHIP_TONGA: |
443 | amdgpu_program_register_sequence(adev, | 527 | amdgpu_program_register_sequence(adev, |
444 | tonga_mgcg_cgcg_init, | 528 | tonga_mgcg_cgcg_init, |
@@ -526,6 +610,7 @@ static int gfx_v8_0_ring_test_ib(struct amdgpu_ring *ring) | |||
526 | { | 610 | { |
527 | struct amdgpu_device *adev = ring->adev; | 611 | struct amdgpu_device *adev = ring->adev; |
528 | struct amdgpu_ib ib; | 612 | struct amdgpu_ib ib; |
613 | struct fence *f = NULL; | ||
529 | uint32_t scratch; | 614 | uint32_t scratch; |
530 | uint32_t tmp = 0; | 615 | uint32_t tmp = 0; |
531 | unsigned i; | 616 | unsigned i; |
@@ -540,26 +625,23 @@ static int gfx_v8_0_ring_test_ib(struct amdgpu_ring *ring) | |||
540 | r = amdgpu_ib_get(ring, NULL, 256, &ib); | 625 | r = amdgpu_ib_get(ring, NULL, 256, &ib); |
541 | if (r) { | 626 | if (r) { |
542 | DRM_ERROR("amdgpu: failed to get ib (%d).\n", r); | 627 | DRM_ERROR("amdgpu: failed to get ib (%d).\n", r); |
543 | amdgpu_gfx_scratch_free(adev, scratch); | 628 | goto err1; |
544 | return r; | ||
545 | } | 629 | } |
546 | ib.ptr[0] = PACKET3(PACKET3_SET_UCONFIG_REG, 1); | 630 | ib.ptr[0] = PACKET3(PACKET3_SET_UCONFIG_REG, 1); |
547 | ib.ptr[1] = ((scratch - PACKET3_SET_UCONFIG_REG_START)); | 631 | ib.ptr[1] = ((scratch - PACKET3_SET_UCONFIG_REG_START)); |
548 | ib.ptr[2] = 0xDEADBEEF; | 632 | ib.ptr[2] = 0xDEADBEEF; |
549 | ib.length_dw = 3; | 633 | ib.length_dw = 3; |
550 | r = amdgpu_ib_schedule(adev, 1, &ib, AMDGPU_FENCE_OWNER_UNDEFINED); | 634 | |
551 | if (r) { | 635 | r = amdgpu_sched_ib_submit_kernel_helper(adev, ring, &ib, 1, NULL, |
552 | amdgpu_gfx_scratch_free(adev, scratch); | 636 | AMDGPU_FENCE_OWNER_UNDEFINED, |
553 | amdgpu_ib_free(adev, &ib); | 637 | &f); |
554 | DRM_ERROR("amdgpu: failed to schedule ib (%d).\n", r); | 638 | if (r) |
555 | return r; | 639 | goto err2; |
556 | } | 640 | |
557 | r = amdgpu_fence_wait(ib.fence, false); | 641 | r = fence_wait(f, false); |
558 | if (r) { | 642 | if (r) { |
559 | DRM_ERROR("amdgpu: fence wait failed (%d).\n", r); | 643 | DRM_ERROR("amdgpu: fence wait failed (%d).\n", r); |
560 | amdgpu_gfx_scratch_free(adev, scratch); | 644 | goto err2; |
561 | amdgpu_ib_free(adev, &ib); | ||
562 | return r; | ||
563 | } | 645 | } |
564 | for (i = 0; i < adev->usec_timeout; i++) { | 646 | for (i = 0; i < adev->usec_timeout; i++) { |
565 | tmp = RREG32(scratch); | 647 | tmp = RREG32(scratch); |
@@ -569,14 +651,18 @@ static int gfx_v8_0_ring_test_ib(struct amdgpu_ring *ring) | |||
569 | } | 651 | } |
570 | if (i < adev->usec_timeout) { | 652 | if (i < adev->usec_timeout) { |
571 | DRM_INFO("ib test on ring %d succeeded in %u usecs\n", | 653 | DRM_INFO("ib test on ring %d succeeded in %u usecs\n", |
572 | ib.fence->ring->idx, i); | 654 | ring->idx, i); |
655 | goto err2; | ||
573 | } else { | 656 | } else { |
574 | DRM_ERROR("amdgpu: ib test failed (scratch(0x%04X)=0x%08X)\n", | 657 | DRM_ERROR("amdgpu: ib test failed (scratch(0x%04X)=0x%08X)\n", |
575 | scratch, tmp); | 658 | scratch, tmp); |
576 | r = -EINVAL; | 659 | r = -EINVAL; |
577 | } | 660 | } |
578 | amdgpu_gfx_scratch_free(adev, scratch); | 661 | err2: |
662 | fence_put(f); | ||
579 | amdgpu_ib_free(adev, &ib); | 663 | amdgpu_ib_free(adev, &ib); |
664 | err1: | ||
665 | amdgpu_gfx_scratch_free(adev, scratch); | ||
580 | return r; | 666 | return r; |
581 | } | 667 | } |
582 | 668 | ||
@@ -601,6 +687,9 @@ static int gfx_v8_0_init_microcode(struct amdgpu_device *adev) | |||
601 | case CHIP_CARRIZO: | 687 | case CHIP_CARRIZO: |
602 | chip_name = "carrizo"; | 688 | chip_name = "carrizo"; |
603 | break; | 689 | break; |
690 | case CHIP_FIJI: | ||
691 | chip_name = "fiji"; | ||
692 | break; | ||
604 | default: | 693 | default: |
605 | BUG(); | 694 | BUG(); |
606 | } | 695 | } |
@@ -1236,6 +1325,7 @@ static void gfx_v8_0_tiling_mode_table_init(struct amdgpu_device *adev) | |||
1236 | adev->gfx.config.macrotile_mode_array[reg_offset] = gb_tile_moden; | 1325 | adev->gfx.config.macrotile_mode_array[reg_offset] = gb_tile_moden; |
1237 | WREG32(mmGB_MACROTILE_MODE0 + reg_offset, gb_tile_moden); | 1326 | WREG32(mmGB_MACROTILE_MODE0 + reg_offset, gb_tile_moden); |
1238 | } | 1327 | } |
1328 | case CHIP_FIJI: | ||
1239 | case CHIP_TONGA: | 1329 | case CHIP_TONGA: |
1240 | for (reg_offset = 0; reg_offset < num_tile_mode_states; reg_offset++) { | 1330 | for (reg_offset = 0; reg_offset < num_tile_mode_states; reg_offset++) { |
1241 | switch (reg_offset) { | 1331 | switch (reg_offset) { |
@@ -1984,6 +2074,23 @@ static void gfx_v8_0_gpu_init(struct amdgpu_device *adev) | |||
1984 | adev->gfx.config.sc_earlyz_tile_fifo_size = 0x130; | 2074 | adev->gfx.config.sc_earlyz_tile_fifo_size = 0x130; |
1985 | gb_addr_config = TOPAZ_GB_ADDR_CONFIG_GOLDEN; | 2075 | gb_addr_config = TOPAZ_GB_ADDR_CONFIG_GOLDEN; |
1986 | break; | 2076 | break; |
2077 | case CHIP_FIJI: | ||
2078 | adev->gfx.config.max_shader_engines = 4; | ||
2079 | adev->gfx.config.max_tile_pipes = 16; | ||
2080 | adev->gfx.config.max_cu_per_sh = 16; | ||
2081 | adev->gfx.config.max_sh_per_se = 1; | ||
2082 | adev->gfx.config.max_backends_per_se = 4; | ||
2083 | adev->gfx.config.max_texture_channel_caches = 8; | ||
2084 | adev->gfx.config.max_gprs = 256; | ||
2085 | adev->gfx.config.max_gs_threads = 32; | ||
2086 | adev->gfx.config.max_hw_contexts = 8; | ||
2087 | |||
2088 | adev->gfx.config.sc_prim_fifo_size_frontend = 0x20; | ||
2089 | adev->gfx.config.sc_prim_fifo_size_backend = 0x100; | ||
2090 | adev->gfx.config.sc_hiz_tile_fifo_size = 0x30; | ||
2091 | adev->gfx.config.sc_earlyz_tile_fifo_size = 0x130; | ||
2092 | gb_addr_config = TONGA_GB_ADDR_CONFIG_GOLDEN; | ||
2093 | break; | ||
1987 | case CHIP_TONGA: | 2094 | case CHIP_TONGA: |
1988 | adev->gfx.config.max_shader_engines = 4; | 2095 | adev->gfx.config.max_shader_engines = 4; |
1989 | adev->gfx.config.max_tile_pipes = 8; | 2096 | adev->gfx.config.max_tile_pipes = 8; |
@@ -2078,7 +2185,7 @@ static void gfx_v8_0_gpu_init(struct amdgpu_device *adev) | |||
2078 | 2185 | ||
2079 | adev->gfx.config.num_tile_pipes = adev->gfx.config.max_tile_pipes; | 2186 | adev->gfx.config.num_tile_pipes = adev->gfx.config.max_tile_pipes; |
2080 | adev->gfx.config.mem_max_burst_length_bytes = 256; | 2187 | adev->gfx.config.mem_max_burst_length_bytes = 256; |
2081 | if (adev->flags & AMDGPU_IS_APU) { | 2188 | if (adev->flags & AMD_IS_APU) { |
2082 | /* Get memory bank mapping mode. */ | 2189 | /* Get memory bank mapping mode. */ |
2083 | tmp = RREG32(mmMC_FUS_DRAM0_BANK_ADDR_MAPPING); | 2190 | tmp = RREG32(mmMC_FUS_DRAM0_BANK_ADDR_MAPPING); |
2084 | dimm00_addr_map = REG_GET_FIELD(tmp, MC_FUS_DRAM0_BANK_ADDR_MAPPING, DIMM0ADDRMAP); | 2191 | dimm00_addr_map = REG_GET_FIELD(tmp, MC_FUS_DRAM0_BANK_ADDR_MAPPING, DIMM0ADDRMAP); |
@@ -2490,6 +2597,7 @@ static int gfx_v8_0_cp_gfx_start(struct amdgpu_device *adev) | |||
2490 | amdgpu_ring_write(ring, mmPA_SC_RASTER_CONFIG - PACKET3_SET_CONTEXT_REG_START); | 2597 | amdgpu_ring_write(ring, mmPA_SC_RASTER_CONFIG - PACKET3_SET_CONTEXT_REG_START); |
2491 | switch (adev->asic_type) { | 2598 | switch (adev->asic_type) { |
2492 | case CHIP_TONGA: | 2599 | case CHIP_TONGA: |
2600 | case CHIP_FIJI: | ||
2493 | amdgpu_ring_write(ring, 0x16000012); | 2601 | amdgpu_ring_write(ring, 0x16000012); |
2494 | amdgpu_ring_write(ring, 0x0000002A); | 2602 | amdgpu_ring_write(ring, 0x0000002A); |
2495 | break; | 2603 | break; |
@@ -3135,7 +3243,7 @@ static int gfx_v8_0_cp_compute_resume(struct amdgpu_device *adev) | |||
3135 | WREG32(mmCP_MEC_DOORBELL_RANGE_LOWER, | 3243 | WREG32(mmCP_MEC_DOORBELL_RANGE_LOWER, |
3136 | AMDGPU_DOORBELL_KIQ << 2); | 3244 | AMDGPU_DOORBELL_KIQ << 2); |
3137 | WREG32(mmCP_MEC_DOORBELL_RANGE_UPPER, | 3245 | WREG32(mmCP_MEC_DOORBELL_RANGE_UPPER, |
3138 | 0x7FFFF << 2); | 3246 | AMDGPU_DOORBELL_MEC_RING7 << 2); |
3139 | } | 3247 | } |
3140 | tmp = RREG32(mmCP_HQD_PQ_DOORBELL_CONTROL); | 3248 | tmp = RREG32(mmCP_HQD_PQ_DOORBELL_CONTROL); |
3141 | tmp = REG_SET_FIELD(tmp, CP_HQD_PQ_DOORBELL_CONTROL, | 3249 | tmp = REG_SET_FIELD(tmp, CP_HQD_PQ_DOORBELL_CONTROL, |
@@ -3875,7 +3983,8 @@ static bool gfx_v8_0_ring_emit_semaphore(struct amdgpu_ring *ring, | |||
3875 | unsigned sel = emit_wait ? PACKET3_SEM_SEL_WAIT : PACKET3_SEM_SEL_SIGNAL; | 3983 | unsigned sel = emit_wait ? PACKET3_SEM_SEL_WAIT : PACKET3_SEM_SEL_SIGNAL; |
3876 | 3984 | ||
3877 | if (ring->adev->asic_type == CHIP_TOPAZ || | 3985 | if (ring->adev->asic_type == CHIP_TOPAZ || |
3878 | ring->adev->asic_type == CHIP_TONGA) | 3986 | ring->adev->asic_type == CHIP_TONGA || |
3987 | ring->adev->asic_type == CHIP_FIJI) | ||
3879 | /* we got a hw semaphore bug in VI TONGA, return false to switch back to sw fence wait */ | 3988 | /* we got a hw semaphore bug in VI TONGA, return false to switch back to sw fence wait */ |
3880 | return false; | 3989 | return false; |
3881 | else { | 3990 | else { |