[AMD Official Use Only - General] Acked-by: Jiadong Zhu <Jiadong.Zhu@xxxxxxx> -----Original Message----- From: amd-gfx <amd-gfx-bounces@xxxxxxxxxxxxxxxxxxxxx> On Behalf Of Christian König Sent: Tuesday, February 27, 2024 12:02 AM To: Alex Deucher <alexdeucher@xxxxxxxxx>; Pelloux-Prayer, Pierre-Eric <Pierre-eric.Pelloux-prayer@xxxxxxx> Cc: amd-gfx@xxxxxxxxxxxxxxxxxxxxx Subject: Re: [PATCH] drm/amdgpu: disable ring_muxer if mcbp is off Am 23.02.24 um 17:30 schrieb Alex Deucher: > On Fri, Feb 23, 2024 at 4:48 AM Pierre-Eric Pelloux-Prayer > <pierre-eric.pelloux-prayer@xxxxxxx> wrote: >> Using the ring_muxer without preemption adds overhead for no reason >> since mcbp cannot be triggered. >> >> Moving back to a single queue in this case also helps when high >> priority app are used: in this case the gpu_scheduler priority >> handling will work as expected - much better than ring_muxer with its >> 2 independant schedulers competing for the same hardware queue. >> >> This change requires moving amdgpu_device_set_mcbp above >> amdgpu_device_ip_early_init because we use adev->gfx.mcbp. >> >> Signed-off-by: Pierre-Eric Pelloux-Prayer >> <pierre-eric.pelloux-prayer@xxxxxxx> > Reviewed-by: Alex Deucher <alexander.deucher@xxxxxxx> Acked-by: Christian König <christian.koenig@xxxxxxx> > >> --- >> drivers/gpu/drm/amd/amdgpu/amdgpu_device.c | 4 ++-- >> drivers/gpu/drm/amd/amdgpu/gfx_v9_0.c | 21 ++++++++++++--------- >> 2 files changed, 14 insertions(+), 11 deletions(-) >> >> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c >> b/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c >> index d534e192e260..40516d24026c 100644 >> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c >> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c >> @@ -4054,13 +4054,13 @@ int amdgpu_device_init(struct amdgpu_device *adev, >> return r; >> } >> >> + amdgpu_device_set_mcbp(adev); >> + >> /* early init functions */ >> r = amdgpu_device_ip_early_init(adev); >> if (r) >> return r; >> >> - amdgpu_device_set_mcbp(adev); >> - >> /* Get rid of things like offb */ >> r = drm_aperture_remove_conflicting_pci_framebuffers(adev->pdev, &amdgpu_kms_driver); >> if (r) >> diff --git a/drivers/gpu/drm/amd/amdgpu/gfx_v9_0.c >> b/drivers/gpu/drm/amd/amdgpu/gfx_v9_0.c >> index 169d45268ef6..f682f830f7f6 100644 >> --- a/drivers/gpu/drm/amd/amdgpu/gfx_v9_0.c >> +++ b/drivers/gpu/drm/amd/amdgpu/gfx_v9_0.c >> @@ -2080,7 +2080,7 @@ static int gfx_v9_0_sw_init(void *handle) >> ring->doorbell_index = >> adev->doorbell_index.gfx_ring0 << 1; >> >> /* disable scheduler on the real ring */ >> - ring->no_scheduler = true; >> + ring->no_scheduler = adev->gfx.mcbp; >> ring->vm_hub = AMDGPU_GFXHUB(0); >> r = amdgpu_ring_init(adev, ring, 1024, &adev->gfx.eop_irq, >> >> AMDGPU_CP_IRQ_GFX_ME0_PIPE0_EOP, @@ -2090,7 +2090,7 @@ static int gfx_v9_0_sw_init(void *handle) >> } >> >> /* set up the software rings */ >> - if (adev->gfx.num_gfx_rings) { >> + if (adev->gfx.mcbp && adev->gfx.num_gfx_rings) { >> for (i = 0; i < GFX9_NUM_SW_GFX_RINGS; i++) { >> ring = &adev->gfx.sw_gfx_ring[i]; >> ring->ring_obj = NULL; @@ -2181,7 +2181,7 @@ >> static int gfx_v9_0_sw_fini(void *handle) >> int i; >> struct amdgpu_device *adev = (struct amdgpu_device *)handle; >> >> - if (adev->gfx.num_gfx_rings) { >> + if (adev->gfx.mcbp && adev->gfx.num_gfx_rings) { >> for (i = 0; i < GFX9_NUM_SW_GFX_RINGS; i++) >> amdgpu_ring_fini(&adev->gfx.sw_gfx_ring[i]); >> amdgpu_ring_mux_fini(&adev->gfx.muxer); >> @@ -5910,11 +5910,14 @@ static int gfx_v9_0_eop_irq(struct >> amdgpu_device *adev, >> >> switch (me_id) { >> case 0: >> - if (adev->gfx.num_gfx_rings && >> - !amdgpu_mcbp_handle_trailing_fence_irq(&adev->gfx.muxer)) { >> - /* Fence signals are handled on the software rings*/ >> - for (i = 0; i < GFX9_NUM_SW_GFX_RINGS; i++) >> - amdgpu_fence_process(&adev->gfx.sw_gfx_ring[i]); >> + if (adev->gfx.num_gfx_rings) { >> + if (!adev->gfx.mcbp) { >> + amdgpu_fence_process(&adev->gfx.gfx_ring[0]); >> + } else if (!amdgpu_mcbp_handle_trailing_fence_irq(&adev->gfx.muxer)) { >> + /* Fence signals are handled on the software rings*/ >> + for (i = 0; i < GFX9_NUM_SW_GFX_RINGS; i++) >> + amdgpu_fence_process(&adev->gfx.sw_gfx_ring[i]); >> + } >> } >> break; >> case 1: >> @@ -7051,7 +7054,7 @@ static void gfx_v9_0_set_ring_funcs(struct amdgpu_device *adev) >> for (i = 0; i < adev->gfx.num_gfx_rings; i++) >> adev->gfx.gfx_ring[i].funcs = >> &gfx_v9_0_ring_funcs_gfx; >> >> - if (adev->gfx.num_gfx_rings) { >> + if (adev->gfx.mcbp && adev->gfx.num_gfx_rings) { >> for (i = 0; i < GFX9_NUM_SW_GFX_RINGS; i++) >> adev->gfx.sw_gfx_ring[i].funcs = &gfx_v9_0_sw_ring_funcs_gfx; >> } >> -- >> 2.40.1 >>