drm/amdgpu: set sw state to gfxoff after SR-IOV reset
authorHorace Chen <horace.chen@amd.com>
Wed, 19 Jul 2023 07:55:04 +0000 (15:55 +0800)
committerAlex Deucher <alexander.deucher@amd.com>
Tue, 25 Jul 2023 17:35:23 +0000 (13:35 -0400)
[Why]
Current SR-IOV will not set GC to off state, while it is a real
GC hard reset. Whthout GFX off flag, driver may do gfxhub invalidation
before firmware load and gfxhub gart enable. This operation may cause
CP to become busy because GC is not in the right state for invalidation.

[How]
Add a function for SR-IOV to clean up some sw state before recover. Set
adev->gfx.is_poweron to false to prevent gfxhub invalidation before gfx
firmware autoload complete.

Signed-off-by: Horace Chen <horace.chen@amd.com>
Reviewed-by: HaiJun Chang <HaiJun.Chang@amd.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
drivers/gpu/drm/amd/amdgpu/amdgpu_device.c
drivers/gpu/drm/amd/amdgpu/amdgpu_virt.c
drivers/gpu/drm/amd/amdgpu/amdgpu_virt.h

index 28e6419023b7bbe86380a28cc2cb432c4fdf09d5..1c786190a84e92496f38b81d80a5cab311551773 100644 (file)
@@ -4575,6 +4575,9 @@ retry:
        if (r)
                return r;
 
+       /* some sw clean up VF needs to do before recover */
+       amdgpu_virt_post_reset(adev);
+
        /* Resume IP prior to SMC */
        r = amdgpu_device_ip_reinit_early_sriov(adev);
        if (r)
index 770eb9725ec1302bdbad836c744169e430449eff..c712d027d62d82f48d156dd47853b23bd8a8cbbe 100644 (file)
@@ -835,6 +835,16 @@ enum amdgpu_sriov_vf_mode amdgpu_virt_get_sriov_vf_mode(struct amdgpu_device *ad
        return mode;
 }
 
+void amdgpu_virt_post_reset(struct amdgpu_device *adev)
+{
+       if (adev->ip_versions[GC_HWIP][0] == IP_VERSION(11, 0, 3)) {
+               /* force set to GFXOFF state after reset,
+                * to avoid some invalid operation before GC enable
+                */
+               adev->gfx.is_poweron = false;
+       }
+}
+
 bool amdgpu_virt_fw_load_skip_check(struct amdgpu_device *adev, uint32_t ucode_id)
 {
        switch (adev->ip_versions[MP0_HWIP][0]) {
index d1f7509a44cb79dd65d251ffa4f480e64681c4a0..fabb83e9d9aec701f1105ffc471480db07f6bb4b 100644 (file)
@@ -360,4 +360,5 @@ u32 amdgpu_sriov_rreg(struct amdgpu_device *adev,
                      u32 offset, u32 acc_flags, u32 hwip, u32 xcc_id);
 bool amdgpu_virt_fw_load_skip_check(struct amdgpu_device *adev,
                        uint32_t ucode_id);
+void amdgpu_virt_post_reset(struct amdgpu_device *adev);
 #endif