[PATCH 1/4] drm/amdgpu: Halt rlc/cp in rlc_safe_mode

Deucher, Alexander Alexander.Deucher at amd.com
Thu Sep 20 14:02:10 UTC 2018


Series is:

Acked-by: Alex Deucher <alexander.deucher at amd.com>

________________________________
From: amd-gfx <amd-gfx-bounces at lists.freedesktop.org> on behalf of Rex Zhu <Rex.Zhu at amd.com>
Sent: Thursday, September 20, 2018 6:07:28 AM
To: amd-gfx at lists.freedesktop.org; Zhou, Hang
Cc: Zhu, Rex
Subject: [PATCH 1/4] 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

Signed-off-by: Hang Zhou <hang.zhou at amd.com>
Signed-off-by: Rex Zhu <Rex.Zhu at 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 05b5bba..93d7fe5 100644
--- a/drivers/gpu/drm/amd/amdgpu/gfx_v8_0.c
+++ b/drivers/gpu/drm/amd/amdgpu/gfx_v8_0.c
@@ -5080,6 +5080,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;
@@ -5098,9 +5147,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;
 }

@@ -5121,30 +5177,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;
--
1.9.1

_______________________________________________
amd-gfx mailing list
amd-gfx at lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/amd-gfx
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://lists.freedesktop.org/archives/amd-gfx/attachments/20180920/b80d0037/attachment.html>


More information about the amd-gfx mailing list