]> git.proxmox.com Git - mirror_ubuntu-hirsute-kernel.git/commitdiff
drm/amdgpu: update amdgpu device suspend/resume sequence for s0i3 support
authorPrike Liang <Prike.Liang@amd.com>
Wed, 9 Sep 2020 06:40:24 +0000 (14:40 +0800)
committerAlex Deucher <alexander.deucher@amd.com>
Fri, 13 Nov 2020 22:29:45 +0000 (17:29 -0500)
- Need skip the RLC/CP/GFX disable for let GFXOFF enter during suspend period.
- For s0i3 suspend only need suspend DCE and each IP interrupt.
- Before VBIOS POSTed check and atom HW INT need set the GPU power status change
  to D0 in the resume period, otherwise the HW will be mess up and see the SDMA hang.
- Need handle the GPU reset path during amdgpu device suspend.

Signed-off-by: Prike Liang <Prike.Liang@amd.com>
Reviewed-by: Alex Deucher <alexander.deucher@amd.com>
Acked-by: Huang Rui <ray.huang@amd.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
drivers/gpu/drm/amd/amdgpu/amdgpu_device.c

index f78aaced3973f263ba0685a4d2c2ae03adb859a0..2f60b7084f4d56b77fdf1e3f936cd386e945ed0a 100644 (file)
@@ -2650,8 +2650,10 @@ static int amdgpu_device_ip_suspend_phase1(struct amdgpu_device *adev)
 {
        int i, r;
 
-       amdgpu_device_set_pg_state(adev, AMD_PG_STATE_UNGATE);
-       amdgpu_device_set_cg_state(adev, AMD_CG_STATE_UNGATE);
+       if (!amdgpu_acpi_is_s0ix_supported() || amdgpu_in_reset(adev)) {
+               amdgpu_device_set_pg_state(adev, AMD_PG_STATE_UNGATE);
+               amdgpu_device_set_cg_state(adev, AMD_CG_STATE_UNGATE);
+       }
 
        for (i = adev->num_ip_blocks - 1; i >= 0; i--) {
                if (!adev->ip_blocks[i].status.valid)
@@ -3706,8 +3708,10 @@ int amdgpu_device_suspend(struct drm_device *dev, bool fbcon)
 
        amdgpu_fence_driver_suspend(adev);
 
-       r = amdgpu_device_ip_suspend_phase2(adev);
-
+       if (!amdgpu_acpi_is_s0ix_supported() || amdgpu_in_reset(adev))
+               r = amdgpu_device_ip_suspend_phase2(adev);
+       else
+               amdgpu_gfx_state_change_set(adev, sGpuChangeState_D3Entry);
        /* evict remaining vram memory
         * This second call to evict vram is to evict the gart page table
         * using the CPU.
@@ -3738,6 +3742,9 @@ int amdgpu_device_resume(struct drm_device *dev, bool fbcon)
        if (dev->switch_power_state == DRM_SWITCH_POWER_OFF)
                return 0;
 
+       if (amdgpu_acpi_is_s0ix_supported())
+               amdgpu_gfx_state_change_set(adev, sGpuChangeState_D0Entry);
+
        /* post card */
        if (amdgpu_device_need_post(adev)) {
                r = amdgpu_device_asic_init(adev);