]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
drm/amdgpu: Save VCN shared memory with init reset
authorLijo Lazar <lijo.lazar@amd.com>
Tue, 15 Oct 2024 03:13:45 +0000 (08:43 +0530)
committerAlex Deucher <alexander.deucher@amd.com>
Tue, 22 Oct 2024 21:51:19 +0000 (17:51 -0400)
VCN shared memory is in framebuffer and there are some flags initialized
during sw_init. Ideally, such programming should be during hw_init.

Make sure the flags are saved during reset on initialization since that
reset will affect frame buffer region. For clarity, separate it out to
another function.

Fixes: 1e4acf4d93cd ("drm/amdgpu: Add reset on init handler for XGMI")
Signed-off-by: Lijo Lazar <lijo.lazar@amd.com>
Reported-by: Hao Zhou <hao.zhou@amd.com>
Reviewed-by: Leo Liu <leo.liu@amd.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
drivers/gpu/drm/amd/amdgpu/amdgpu_reset.c
drivers/gpu/drm/amd/amdgpu/amdgpu_vcn.c
drivers/gpu/drm/amd/amdgpu/amdgpu_vcn.h

index 99e75d899c9f8e0371b9ea78da845e74ac8d16ca..24dae7cdbe9547ed76b7bcd69ab2a87072235dd9 100644 (file)
@@ -44,6 +44,12 @@ static int amdgpu_reset_xgmi_reset_on_init_suspend(struct amdgpu_device *adev)
                adev->ip_blocks[i].status.hw = false;
        }
 
+       /* VCN FW shared region is in frambuffer, there are some flags
+        * initialized in that region during sw_init. Make sure the region is
+        * backed up.
+        */
+       amdgpu_vcn_save_vcpu_bo(adev);
+
        return 0;
 }
 
index 43f44cc201cb808dc9313a27c02db1735e2063a3..aecb78e0519f67e53e3e3643898ba27c12e98757 100644 (file)
@@ -294,21 +294,12 @@ bool amdgpu_vcn_is_disabled_vcn(struct amdgpu_device *adev, enum vcn_ring_type t
        return ret;
 }
 
-int amdgpu_vcn_suspend(struct amdgpu_device *adev)
+int amdgpu_vcn_save_vcpu_bo(struct amdgpu_device *adev)
 {
        unsigned int size;
        void *ptr;
        int i, idx;
 
-       bool in_ras_intr = amdgpu_ras_intr_triggered();
-
-       cancel_delayed_work_sync(&adev->vcn.idle_work);
-
-       /* err_event_athub will corrupt VCPU buffer, so we need to
-        * restore fw data and clear buffer in amdgpu_vcn_resume() */
-       if (in_ras_intr)
-               return 0;
-
        for (i = 0; i < adev->vcn.num_vcn_inst; ++i) {
                if (adev->vcn.harvest_config & (1 << i))
                        continue;
@@ -327,9 +318,24 @@ int amdgpu_vcn_suspend(struct amdgpu_device *adev)
                        drm_dev_exit(idx);
                }
        }
+
        return 0;
 }
 
+int amdgpu_vcn_suspend(struct amdgpu_device *adev)
+{
+       bool in_ras_intr = amdgpu_ras_intr_triggered();
+
+       cancel_delayed_work_sync(&adev->vcn.idle_work);
+
+       /* err_event_athub will corrupt VCPU buffer, so we need to
+        * restore fw data and clear buffer in amdgpu_vcn_resume() */
+       if (in_ras_intr)
+               return 0;
+
+       return amdgpu_vcn_save_vcpu_bo(adev);
+}
+
 int amdgpu_vcn_resume(struct amdgpu_device *adev)
 {
        unsigned int size;
index 2a1f3dbb14d3f46030d70ce56aaad76911711176..765b809d48a2573447c5b4278440f8be74fc8bf1 100644 (file)
@@ -518,5 +518,6 @@ int amdgpu_vcn_ras_sw_init(struct amdgpu_device *adev);
 
 int amdgpu_vcn_psp_update_sram(struct amdgpu_device *adev, int inst_idx,
                               enum AMDGPU_UCODE_ID ucode_id);
+int amdgpu_vcn_save_vcpu_bo(struct amdgpu_device *adev);
 
 #endif