aboutsummaryrefslogtreecommitdiffstats
path: root/common/recipes-kernel/linux/linux-yocto-4.14.71/5450-drm-amdgpu-Halt-rlc-cp-in-rlc_safe_mode.patch
diff options
context:
space:
mode:
Diffstat (limited to 'common/recipes-kernel/linux/linux-yocto-4.14.71/5450-drm-amdgpu-Halt-rlc-cp-in-rlc_safe_mode.patch')
-rw-r--r--common/recipes-kernel/linux/linux-yocto-4.14.71/5450-drm-amdgpu-Halt-rlc-cp-in-rlc_safe_mode.patch130
1 files changed, 130 insertions, 0 deletions
diff --git a/common/recipes-kernel/linux/linux-yocto-4.14.71/5450-drm-amdgpu-Halt-rlc-cp-in-rlc_safe_mode.patch b/common/recipes-kernel/linux/linux-yocto-4.14.71/5450-drm-amdgpu-Halt-rlc-cp-in-rlc_safe_mode.patch
new file mode 100644
index 00000000..6e8eec12
--- /dev/null
+++ b/common/recipes-kernel/linux/linux-yocto-4.14.71/5450-drm-amdgpu-Halt-rlc-cp-in-rlc_safe_mode.patch
@@ -0,0 +1,130 @@
+From c1018454bdefbf260d083e897f846e8b4bdcbc90 Mon Sep 17 00:00:00 2001
+From: Rex Zhu <Rex.Zhu@amd.com>
+Date: Tue, 11 Sep 2018 10:33:38 +0800
+Subject: [PATCH 5450/5725] drm/amdgpu: Halt rlc/cp in rlc_safe_mode
+
+before halt rlc/cp, need to
+1. enter rlc safe mode
+2. wait rlc/cp idle
+
+Acked-by: Alex Deucher <alexander.deucher@amd.com>
+Signed-off-by: Hang Zhou <hang.zhou@amd.com>
+Signed-off-by: Rex Zhu <Rex.Zhu@amd.com>
+---
+ drivers/gpu/drm/amd/amdgpu/gfx_v8_0.c | 86 ++++++++++++++++++++++++-----------
+ 1 file changed, 59 insertions(+), 27 deletions(-)
+
+diff --git a/drivers/gpu/drm/amd/amdgpu/gfx_v8_0.c b/drivers/gpu/drm/amd/amdgpu/gfx_v8_0.c
+index d1c8311..a632c8d 100644
+--- a/drivers/gpu/drm/amd/amdgpu/gfx_v8_0.c
++++ b/drivers/gpu/drm/amd/amdgpu/gfx_v8_0.c
+@@ -5079,6 +5079,55 @@ static int gfx_v8_0_kcq_disable(struct amdgpu_device *adev)
+ return r;
+ }
+
++static bool gfx_v8_0_is_idle(void *handle)
++{
++ struct amdgpu_device *adev = (struct amdgpu_device *)handle;
++
++ if (REG_GET_FIELD(RREG32(mmGRBM_STATUS), GRBM_STATUS, GUI_ACTIVE)
++ || RREG32(mmGRBM_STATUS2) != 0x8)
++ return false;
++ else
++ return true;
++}
++
++static bool gfx_v8_0_rlc_is_idle(void *handle)
++{
++ struct amdgpu_device *adev = (struct amdgpu_device *)handle;
++
++ if (RREG32(mmGRBM_STATUS2) != 0x8)
++ return false;
++ else
++ return true;
++}
++
++static int gfx_v8_0_wait_for_rlc_idle(void *handle)
++{
++ unsigned int i;
++ struct amdgpu_device *adev = (struct amdgpu_device *)handle;
++
++ for (i = 0; i < adev->usec_timeout; i++) {
++ if (gfx_v8_0_rlc_is_idle(handle))
++ return 0;
++
++ udelay(1);
++ }
++ return -ETIMEDOUT;
++}
++
++static int gfx_v8_0_wait_for_idle(void *handle)
++{
++ unsigned int i;
++ struct amdgpu_device *adev = (struct amdgpu_device *)handle;
++
++ for (i = 0; i < adev->usec_timeout; i++) {
++ if (gfx_v8_0_is_idle(handle))
++ return 0;
++
++ udelay(1);
++ }
++ return -ETIMEDOUT;
++}
++
+ static int gfx_v8_0_hw_fini(void *handle)
+ {
+ struct amdgpu_device *adev = (struct amdgpu_device *)handle;
+@@ -5097,9 +5146,16 @@ static int gfx_v8_0_hw_fini(void *handle)
+ pr_debug("For SRIOV client, shouldn't do anything.\n");
+ return 0;
+ }
+- gfx_v8_0_cp_enable(adev, false);
+- gfx_v8_0_rlc_stop(adev);
+-
++ adev->gfx.rlc.funcs->enter_safe_mode(adev);
++ if (!gfx_v8_0_wait_for_idle(adev))
++ gfx_v8_0_cp_enable(adev, false);
++ else
++ pr_err("cp is busy, skip halt cp\n");
++ if (!gfx_v8_0_wait_for_rlc_idle(adev))
++ gfx_v8_0_rlc_stop(adev);
++ else
++ pr_err("rlc is busy, skip halt rlc\n");
++ adev->gfx.rlc.funcs->exit_safe_mode(adev);
+ return 0;
+ }
+
+@@ -5120,30 +5176,6 @@ static int gfx_v8_0_resume(void *handle)
+ return r;
+ }
+
+-static bool gfx_v8_0_is_idle(void *handle)
+-{
+- struct amdgpu_device *adev = (struct amdgpu_device *)handle;
+-
+- if (REG_GET_FIELD(RREG32(mmGRBM_STATUS), GRBM_STATUS, GUI_ACTIVE))
+- return false;
+- else
+- return true;
+-}
+-
+-static int gfx_v8_0_wait_for_idle(void *handle)
+-{
+- unsigned i;
+- struct amdgpu_device *adev = (struct amdgpu_device *)handle;
+-
+- for (i = 0; i < adev->usec_timeout; i++) {
+- if (gfx_v8_0_is_idle(handle))
+- return 0;
+-
+- udelay(1);
+- }
+- return -ETIMEDOUT;
+-}
+-
+ static bool gfx_v8_0_check_soft_reset(void *handle)
+ {
+ struct amdgpu_device *adev = (struct amdgpu_device *)handle;
+--
+2.7.4
+