<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
<style type="text/css" style="display:none;"><!-- P {margin-top:0;margin-bottom:0;} --></style>
</head>
<body dir="ltr">
<div id="divtagdefaultwrapper" style="font-size:12pt;color:#000000;font-family:Calibri,Helvetica,sans-serif;" dir="ltr">
<p style="margin-top:0;margin-bottom:0">I am Ok with the check when call vce_v3_0_hw_fini.</p>
<p style="margin-top:0;margin-bottom:0"><br>
</p>
<p style="margin-top:0;margin-bottom:0">But we may still need to call amdpug_vce_suspend/resume.</p>
<p style="margin-top:0;margin-bottom:0"><br>
and not sure whether need to do ring test when resume back.</p>
<p style="margin-top:0;margin-bottom:0"><br>
</p>
<p style="margin-top:0;margin-bottom:0">Best Regards</p>
<p style="margin-top:0;margin-bottom:0">Rex<br>
</p>
<div style="color: rgb(0, 0, 0);">
<hr style="display:inline-block;width:98%" tabindex="-1">
<div id="divRplyFwdMsg" dir="ltr"><font style="font-size:11pt" color="#000000" face="Calibri, sans-serif"><b>From:</b> S, Shirish<br>
<b>Sent:</b> Friday, August 10, 2018 2:15 PM<br>
<b>To:</b> Deucher, Alexander; Zhu, Rex; Liu, Leo<br>
<b>Cc:</b> amd-gfx@lists.freedesktop.org; S, Shirish<br>
<b>Subject:</b> [PATCH] drm/amdpu/vce_v3: skip suspend and resume if powergated</font>
<div> </div>
</div>
<div class="BodyFragment"><font size="2"><span style="font-size:11pt;">
<div class="PlainText">This patch adds a mechanism by which the VCE 3.0 block<br>
shall check if it was enabled or in use before suspending,<br>
if it was powergated while entering suspend then there<br>
is no need to repeat it in vce_3_0_suspend().<br>
Similarly, if the block was powergated while entering suspend<br>
itself then there is no need to resume it.<br>
<br>
By this we not only make the suspend and resume sequence<br>
more efficient, but also optimize the overall amdgpu suspend<br>
and resume time by reducing the ring intialize and tests<br>
for unused IP blocks.<br>
<br>
Signed-off-by: Shirish S <shirish.s@amd.com><br>
---<br>
 drivers/gpu/drm/amd/amdgpu/amdgpu.h   |  2 ++<br>
 drivers/gpu/drm/amd/amdgpu/vce_v3_0.c | 21 +++++++++++++++++++++<br>
 2 files changed, 23 insertions(+)<br>
<br>
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu.h b/drivers/gpu/drm/amd/amdgpu/amdgpu.h<br>
index 07924d4..aa85063 100644<br>
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu.h<br>
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu.h<br>
@@ -1035,6 +1035,8 @@ struct amdgpu_device {<br>
 <br>
         /* vce */<br>
         struct amdgpu_vce               vce;<br>
+       bool                            is_vce_pg;<br>
+       bool                            is_vce_disabled;<br>
 <br>
         /* vcn */<br>
         struct amdgpu_vcn               vcn;<br>
diff --git a/drivers/gpu/drm/amd/amdgpu/vce_v3_0.c b/drivers/gpu/drm/amd/amdgpu/vce_v3_0.c<br>
index cc6ce6c..822cfd6 100644<br>
--- a/drivers/gpu/drm/amd/amdgpu/vce_v3_0.c<br>
+++ b/drivers/gpu/drm/amd/amdgpu/vce_v3_0.c<br>
@@ -326,6 +326,7 @@ static int vce_v3_0_start(struct amdgpu_device *adev)<br>
         WREG32(mmGRBM_GFX_INDEX, mmGRBM_GFX_INDEX_DEFAULT);<br>
         mutex_unlock(&adev->grbm_idx_mutex);<br>
 <br>
+       adev->is_vce_pg = false;<br>
         return 0;<br>
 }<br>
 <br>
@@ -355,6 +356,7 @@ static int vce_v3_0_stop(struct amdgpu_device *adev)<br>
         WREG32(mmGRBM_GFX_INDEX, mmGRBM_GFX_INDEX_DEFAULT);<br>
         mutex_unlock(&adev->grbm_idx_mutex);<br>
 <br>
+       adev->is_vce_pg = true;<br>
         return 0;<br>
 }<br>
 <br>
@@ -506,6 +508,17 @@ static int vce_v3_0_suspend(void *handle)<br>
         int r;<br>
         struct amdgpu_device *adev = (struct amdgpu_device *)handle;<br>
 <br>
+       /* Proceed with suspend sequence only if VCE is started<br>
+        * Mark the block as being disabled if its stopped.<br>
+        */<br>
+       if (adev->is_vce_pg) {<br>
+               DRM_DEBUG("VCE is already powergated, not suspending\n");<br>
+               adev->is_vce_disabled = true;<br>
+               return 0;<br>
+       }<br>
+<br>
+       adev->is_vce_disabled = false;<br>
+<br>
         r = vce_v3_0_hw_fini(adev);<br>
         if (r)<br>
                 return r;<br>
@@ -518,6 +531,14 @@ static int vce_v3_0_resume(void *handle)<br>
         int r;<br>
         struct amdgpu_device *adev = (struct amdgpu_device *)handle;<br>
 <br>
+       /* Proceed with resume sequence if VCE was enabled<br>
+        * while suspending.<br>
+        */<br>
+       if (adev->is_vce_disabled) {<br>
+               DRM_DEBUG("VCE is powergated, not resuming the block\n");<br>
+               return 0;<br>
+       }<br>
+<br>
         r = amdgpu_vce_resume(adev);<br>
         if (r)<br>
                 return r;<br>
-- <br>
2.7.4<br>
<br>
</div>
</span></font></div>
</div>
</div>
</body>
</html>