drm/amdgpu: port SRIOV VF missed changes
authorZhigang Luo <Zhigang.Luo@amd.com>
Thu, 18 May 2023 20:10:00 +0000 (16:10 -0400)
committerAlex Deucher <alexander.deucher@amd.com>
Fri, 30 Jun 2023 17:11:35 +0000 (13:11 -0400)
port SRIOV VF missed changes from gfx_v9_0 to gfx_v9_4_3.

Reviewed-by: Alex Deucher <alexander.deucher@amd.com>
Signed-off-by: Zhigang Luo <Zhigang.Luo@amd.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
drivers/gpu/drm/amd/amdgpu/gfx_v9_4_3.c

index c1ee54d..76b189b 100644 (file)
@@ -1762,6 +1762,8 @@ static int gfx_v9_4_3_xcc_kiq_init_queue(struct amdgpu_ring *ring, int xcc_id)
                ((struct v9_mqd_allocation *)mqd)->dynamic_cu_mask = 0xFFFFFFFF;
                ((struct v9_mqd_allocation *)mqd)->dynamic_rb_mask = 0xFFFFFFFF;
                mutex_lock(&adev->srbm_mutex);
+               if (amdgpu_sriov_vf(adev) && adev->in_suspend)
+                       amdgpu_ring_clear_ring(ring);
                soc15_grbm_select(adev, ring->me, ring->pipe, ring->queue, 0, GET_INST(GC, xcc_id));
                gfx_v9_4_3_xcc_mqd_init(ring, xcc_id);
                gfx_v9_4_3_xcc_kiq_init_register(ring, xcc_id);
@@ -1960,6 +1962,16 @@ static void gfx_v9_4_3_xcc_fini(struct amdgpu_device *adev, int xcc_id)
        if (amdgpu_gfx_disable_kcq(adev, xcc_id))
                DRM_ERROR("XCD %d KCQ disable failed\n", xcc_id);
 
+       if (amdgpu_sriov_vf(adev)) {
+               /* must disable polling for SRIOV when hw finished, otherwise
+                * CPC engine may still keep fetching WB address which is already
+                * invalid after sw finished and trigger DMAR reading error in
+                * hypervisor side.
+                */
+               WREG32_FIELD15_PREREG(GC, GET_INST(GC, xcc_id), CP_PQ_WPTR_POLL_CNTL, EN, 0);
+               return;
+       }
+
        /* Use deinitialize sequence from CAIL when unbinding device
         * from driver, otherwise KIQ is hanging when binding back
         */
@@ -1984,7 +1996,8 @@ static int gfx_v9_4_3_hw_init(void *handle)
        int r;
        struct amdgpu_device *adev = (struct amdgpu_device *)handle;
 
-       gfx_v9_4_3_init_golden_registers(adev);
+       if (!amdgpu_sriov_vf(adev))
+               gfx_v9_4_3_init_golden_registers(adev);
 
        gfx_v9_4_3_constants_init(adev);