aboutsummaryrefslogtreecommitdiffstats
path: root/common/recipes-kernel/linux/files/0946-drm-amdgpu-ungate-SMC-clockgating-first-before-suspe.patch
diff options
context:
space:
mode:
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.patch54
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
+