OSDN Git Service

drm/amdgpu: Add MES KIQ clear to tell RLC that KIQ is dequeued
authorYifan Zha <Yifan.Zha@amd.com>
Wed, 29 Mar 2023 09:18:47 +0000 (17:18 +0800)
committerAlex Deucher <alexander.deucher@amd.com>
Tue, 11 Apr 2023 22:03:35 +0000 (18:03 -0400)
[Why]
As MES KIQ is dequeued, tell RLC that KIQ is inactive

[How]
Clear the RLC_CP_SCHEDULERS Active bit which RLC checks KIQ status
In addition, driver can halt MES under SRIOV when unloading driver

v2:
Use scheduler0 mask to clear KIQ portion of RLC_CP_SCHEDULERS

Signed-off-by: Yifan Zha <Yifan.Zha@amd.com>
Reviewed-by: Horace Chen <horace.chen@amd.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
drivers/gpu/drm/amd/amdgpu/mes_v11_0.c

index b48666d..7e8c15c 100644 (file)
@@ -1138,6 +1138,16 @@ static void mes_v11_0_kiq_setting(struct amdgpu_ring *ring)
        WREG32_SOC15(GC, 0, regRLC_CP_SCHEDULERS, tmp);
 }
 
+static void mes_v11_0_kiq_clear(struct amdgpu_device *adev)
+{
+       uint32_t tmp;
+
+       /* tell RLC which is KIQ dequeue */
+       tmp = RREG32_SOC15(GC, 0, regRLC_CP_SCHEDULERS);
+       tmp &= ~RLC_CP_SCHEDULERS__scheduler0_MASK;
+       WREG32_SOC15(GC, 0, regRLC_CP_SCHEDULERS, tmp);
+}
+
 static int mes_v11_0_kiq_hw_init(struct amdgpu_device *adev)
 {
        int r = 0;
@@ -1182,10 +1192,10 @@ static int mes_v11_0_kiq_hw_fini(struct amdgpu_device *adev)
 
        if (amdgpu_sriov_vf(adev)) {
                mes_v11_0_kiq_dequeue(&adev->gfx.kiq.ring);
+               mes_v11_0_kiq_clear(adev);
        }
 
-       if (!amdgpu_sriov_vf(adev))
-               mes_v11_0_enable(adev, false);
+       mes_v11_0_enable(adev, false);
 
        return 0;
 }