[PATCH] drm/amdpu/vce_v3: skip suspend and resume if powergated

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



This patch adds a mechanism by which the VCE 3.0 block
shall check if it was enabled or in use before suspending,
if it was powergated while entering suspend then there
is no need to repeat it in vce_3_0_suspend().
Similarly, if the block was powergated while entering suspend
itself then there is no need to resume it.

By this we not only make the suspend and resume sequence
more efficient, but also optimize the overall amdgpu suspend
and resume time by reducing the ring intialize and tests
for unused IP blocks.

Signed-off-by: Shirish S <shirish.s at amd.com>
---
 drivers/gpu/drm/amd/amdgpu/amdgpu.h   |  2 ++
 drivers/gpu/drm/amd/amdgpu/vce_v3_0.c | 21 +++++++++++++++++++++
 2 files changed, 23 insertions(+)

diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu.h b/drivers/gpu/drm/amd/amdgpu/amdgpu.h
index 07924d4..aa85063 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu.h
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu.h
@@ -1035,6 +1035,8 @@ struct amdgpu_device {
 
 	/* vce */
 	struct amdgpu_vce		vce;
+	bool				is_vce_pg;
+	bool				is_vce_disabled;
 
 	/* vcn */
 	struct amdgpu_vcn		vcn;
diff --git a/drivers/gpu/drm/amd/amdgpu/vce_v3_0.c b/drivers/gpu/drm/amd/amdgpu/vce_v3_0.c
index cc6ce6c..822cfd6 100644
--- a/drivers/gpu/drm/amd/amdgpu/vce_v3_0.c
+++ b/drivers/gpu/drm/amd/amdgpu/vce_v3_0.c
@@ -326,6 +326,7 @@ static int vce_v3_0_start(struct amdgpu_device *adev)
 	WREG32(mmGRBM_GFX_INDEX, mmGRBM_GFX_INDEX_DEFAULT);
 	mutex_unlock(&adev->grbm_idx_mutex);
 
+	adev->is_vce_pg = false;
 	return 0;
 }
 
@@ -355,6 +356,7 @@ static int vce_v3_0_stop(struct amdgpu_device *adev)
 	WREG32(mmGRBM_GFX_INDEX, mmGRBM_GFX_INDEX_DEFAULT);
 	mutex_unlock(&adev->grbm_idx_mutex);
 
+	adev->is_vce_pg = true;
 	return 0;
 }
 
@@ -506,6 +508,17 @@ static int vce_v3_0_suspend(void *handle)
 	int r;
 	struct amdgpu_device *adev = (struct amdgpu_device *)handle;
 
+	/* Proceed with suspend sequence only if VCE is started
+	 * Mark the block as being disabled if its stopped.
+	 */
+	if (adev->is_vce_pg) {
+		DRM_DEBUG("VCE is already powergated, not suspending\n");
+		adev->is_vce_disabled = true;
+		return 0;
+	}
+
+	adev->is_vce_disabled = false;
+
 	r = vce_v3_0_hw_fini(adev);
 	if (r)
 		return r;
@@ -518,6 +531,14 @@ static int vce_v3_0_resume(void *handle)
 	int r;
 	struct amdgpu_device *adev = (struct amdgpu_device *)handle;
 
+	/* Proceed with resume sequence if VCE was enabled
+	 * while suspending.
+	 */
+	if (adev->is_vce_disabled) {
+		DRM_DEBUG("VCE is powergated, not resuming the block\n");
+		return 0;
+	}
+
 	r = amdgpu_vce_resume(adev);
 	if (r)
 		return r;
-- 
2.7.4



[Index of Archives]     [Linux USB Devel]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux