Skip to content

Commit 2748868

Browse files
Graham Sideralexdeucher
authored andcommitted
drm/amdgpu: Enable GFX11 SDMA context empty interrupt
Enable SDMA queue empty context switching. SDMA context switch due to quantum programming no longer done here (as of sdma v6), so re-name sdma_v6_0_ctx_switch_enable to sdma_v6_0_ctxempty_int_enable to reflect this. Also program SDMAx_QUEUEx_SCHEDULE_CNTL for context switch due to quantum in KFD. Set to amdgpu_sdma_phase_quantum (defaults to 32 i.e. 3200us). Signed-off-by: Graham Sider <Graham.Sider@amd.com> Reviewed-by: Harish Kasiviswanathan <Harish.Kasiviswanathan@amd.com> Reviewed-by: Stanley Yang <Stanley.Yang@amd.com> Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
1 parent 00fa403 commit 2748868

2 files changed

Lines changed: 22 additions & 10 deletions

File tree

drivers/gpu/drm/amd/amdgpu/sdma_v6_0.c

Lines changed: 18 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -403,15 +403,26 @@ static void sdma_v6_0_rlc_stop(struct amdgpu_device *adev)
403403
}
404404

405405
/**
406-
* sdma_v6_0_ctx_switch_enable - stop the async dma engines context switch
406+
* sdma_v6_0_ctxempty_int_enable - enable or disable context empty interrupts
407407
*
408408
* @adev: amdgpu_device pointer
409-
* @enable: enable/disable the DMA MEs context switch.
409+
* @enable: enable/disable context switching due to queue empty conditions
410410
*
411-
* Halt or unhalt the async dma engines context switch.
411+
* Enable or disable the async dma engines queue empty context switch.
412412
*/
413-
static void sdma_v6_0_ctx_switch_enable(struct amdgpu_device *adev, bool enable)
413+
static void sdma_v6_0_ctxempty_int_enable(struct amdgpu_device *adev, bool enable)
414414
{
415+
u32 f32_cntl;
416+
int i;
417+
418+
if (!amdgpu_sriov_vf(adev)) {
419+
for (i = 0; i < adev->sdma.num_instances; i++) {
420+
f32_cntl = RREG32(sdma_v6_0_get_reg_offset(adev, i, regSDMA0_CNTL));
421+
f32_cntl = REG_SET_FIELD(f32_cntl, SDMA0_CNTL,
422+
CTXEMPTY_INT_ENABLE, enable ? 1 : 0);
423+
WREG32(sdma_v6_0_get_reg_offset(adev, i, regSDMA0_CNTL), f32_cntl);
424+
}
425+
}
415426
}
416427

417428
/**
@@ -579,10 +590,8 @@ static int sdma_v6_0_gfx_resume(struct amdgpu_device *adev)
579590

580591
ring->sched.ready = true;
581592

582-
if (amdgpu_sriov_vf(adev)) { /* bare-metal sequence doesn't need below to lines */
583-
sdma_v6_0_ctx_switch_enable(adev, true);
593+
if (amdgpu_sriov_vf(adev))
584594
sdma_v6_0_enable(adev, true);
585-
}
586595

587596
r = amdgpu_ring_test_helper(ring);
588597
if (r) {
@@ -778,7 +787,6 @@ static int sdma_v6_0_start(struct amdgpu_device *adev)
778787
int r = 0;
779788

780789
if (amdgpu_sriov_vf(adev)) {
781-
sdma_v6_0_ctx_switch_enable(adev, false);
782790
sdma_v6_0_enable(adev, false);
783791

784792
/* set RB registers */
@@ -799,7 +807,7 @@ static int sdma_v6_0_start(struct amdgpu_device *adev)
799807
/* unhalt the MEs */
800808
sdma_v6_0_enable(adev, true);
801809
/* enable sdma ring preemption */
802-
sdma_v6_0_ctx_switch_enable(adev, true);
810+
sdma_v6_0_ctxempty_int_enable(adev, true);
803811

804812
/* start the gfx rings and rlc compute queues */
805813
r = sdma_v6_0_gfx_resume(adev);
@@ -1340,7 +1348,7 @@ static int sdma_v6_0_hw_fini(void *handle)
13401348
return 0;
13411349
}
13421350

1343-
sdma_v6_0_ctx_switch_enable(adev, false);
1351+
sdma_v6_0_ctxempty_int_enable(adev, false);
13441352
sdma_v6_0_enable(adev, false);
13451353

13461354
return 0;

drivers/gpu/drm/amd/amdkfd/kfd_mqd_manager_v11.c

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -357,6 +357,10 @@ static void update_mqd_sdma(struct mqd_manager *mm, void *mqd,
357357
m->sdmax_rlcx_doorbell_offset =
358358
q->doorbell_off << SDMA0_QUEUE0_DOORBELL_OFFSET__OFFSET__SHIFT;
359359

360+
m->sdmax_rlcx_sched_cntl = (amdgpu_sdma_phase_quantum
361+
<< SDMA0_QUEUE0_SCHEDULE_CNTL__CONTEXT_QUANTUM__SHIFT)
362+
& SDMA0_QUEUE0_SCHEDULE_CNTL__CONTEXT_QUANTUM_MASK;
363+
360364
m->sdma_engine_id = q->sdma_engine_id;
361365
m->sdma_queue_id = q->sdma_queue_id;
362366
m->sdmax_rlcx_dummy_reg = SDMA_RLC_DUMMY_DEFAULT;

0 commit comments

Comments
 (0)