diff options
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.patch | 130 |
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 + |