aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/gpu/drm/amd/amdgpu/gfx_v8_0.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/gpu/drm/amd/amdgpu/gfx_v8_0.c')
-rw-r--r--drivers/gpu/drm/amd/amdgpu/gfx_v8_0.c145
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");
87MODULE_FIRMWARE("amdgpu/topaz_mec2.bin"); 87MODULE_FIRMWARE("amdgpu/topaz_mec2.bin");
88MODULE_FIRMWARE("amdgpu/topaz_rlc.bin"); 88MODULE_FIRMWARE("amdgpu/topaz_rlc.bin");
89 89
90MODULE_FIRMWARE("amdgpu/fiji_ce.bin");
91MODULE_FIRMWARE("amdgpu/fiji_pfp.bin");
92MODULE_FIRMWARE("amdgpu/fiji_me.bin");
93MODULE_FIRMWARE("amdgpu/fiji_mec.bin");
94MODULE_FIRMWARE("amdgpu/fiji_mec2.bin");
95MODULE_FIRMWARE("amdgpu/fiji_rlc.bin");
96
90static const struct amdgpu_gds_reg_offset amdgpu_gds_reg_offset[] = 97static 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
227static 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
239static 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
253static 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
220static const u32 golden_settings_iceland_a11[] = 292static 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); 661err2:
662 fence_put(f);
579 amdgpu_ib_free(adev, &ib); 663 amdgpu_ib_free(adev, &ib);
664err1:
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 {