diff options
Diffstat (limited to 'common/recipes-kernel/linux/files/0946-drm-amdgpu-ungate-SMC-clockgating-first-before-suspe.patch')
-rw-r--r-- | common/recipes-kernel/linux/files/0946-drm-amdgpu-ungate-SMC-clockgating-first-before-suspe.patch | 54 |
1 files changed, 54 insertions, 0 deletions
diff --git a/common/recipes-kernel/linux/files/0946-drm-amdgpu-ungate-SMC-clockgating-first-before-suspe.patch b/common/recipes-kernel/linux/files/0946-drm-amdgpu-ungate-SMC-clockgating-first-before-suspe.patch new file mode 100644 index 00000000..f68fb12e --- /dev/null +++ b/common/recipes-kernel/linux/files/0946-drm-amdgpu-ungate-SMC-clockgating-first-before-suspe.patch @@ -0,0 +1,54 @@ +From 92c26f2d88d2eb5330b6ff3d478f30e2fe539c5a Mon Sep 17 00:00:00 2001 +From: Flora Cui <Flora.Cui@amd.com> +Date: Fri, 26 Feb 2016 10:45:25 +0800 +Subject: [PATCH 0946/1110] drm/amdgpu: ungate SMC clockgating first before + suspend +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +46c34bcb6a15dd85329a39a5e72c62108626acdc put all block’s clockgating +support in SMC. The sequence in suspend routine should be adjusted +accordingly, otherwise it causes asic hang. + +Signed-off-by: Flora Cui <Flora.Cui@amd.com> +Reviewed-by: Eric Huang <JinHuiEric.Huang@amd.com> +--- + drivers/gpu/drm/amd/amdgpu/amdgpu_device.c | 17 +++++++++++++---- + 1 file changed, 13 insertions(+), 4 deletions(-) + +diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c +index 42d0efd..7d91a69 100644 +--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c ++++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c +@@ -1343,14 +1343,23 @@ static int amdgpu_suspend(struct amdgpu_device *adev) + { + int i, r; + ++ /* ungate SMC block first */ ++ r = amdgpu_set_clockgating_state(adev, AMD_IP_BLOCK_TYPE_SMC, ++ AMD_CG_STATE_UNGATE); ++ if (r) { ++ DRM_ERROR("set_clockgating_state(ungate) SMC failed %d\n",r); ++ } ++ + for (i = adev->num_ip_blocks - 1; i >= 0; i--) { + if (!adev->ip_block_status[i].valid) + continue; + /* ungate blocks so that suspend can properly shut them down */ +- r = adev->ip_blocks[i].funcs->set_clockgating_state((void *)adev, +- AMD_CG_STATE_UNGATE); +- if (r) { +- DRM_ERROR("set_clockgating_state(ungate) %d failed %d\n", i, r); ++ if (i != AMD_IP_BLOCK_TYPE_SMC) { ++ r = adev->ip_blocks[i].funcs->set_clockgating_state((void *)adev, ++ AMD_CG_STATE_UNGATE); ++ if (r) { ++ DRM_ERROR("set_clockgating_state(ungate) %d failed %d\n", i, r); ++ } + } + /* XXX handle errors */ + r = adev->ip_blocks[i].funcs->suspend(adev); +-- +2.7.4 + |