[PATCH 9/9] drm/amdgpu: try to avoid runtime PM in amdgpu_driver_close_kms

Christian König ckoenig.leichtzumerken at gmail.com
Mon Jun 10 09:26:11 UTC 2024


That's a bit more trickier since we really need hw access for UVD and
VCE and eventually when the VM was in use.

Signed-off-by: Christian König <christian.koenig at amd.com>
---
 drivers/gpu/drm/amd/amdgpu/amdgpu_kms.c | 20 +++++++++++++++-----
 1 file changed, 15 insertions(+), 5 deletions(-)

diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_kms.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_kms.c
index 1e8c8d9c0c67..1163ece2a757 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_kms.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_kms.c
@@ -1395,18 +1395,26 @@ void amdgpu_driver_postclose_kms(struct drm_device *dev,
 	struct amdgpu_device *adev = drm_to_adev(dev);
 	struct amdgpu_fpriv *fpriv = file_priv->driver_priv;
 	struct amdgpu_bo_list *list;
+	struct amdgpu_ip_block *uvd;
+	struct amdgpu_ip_block *vce;
 	struct amdgpu_bo *pd;
+	bool vm_ready;
 	u32 pasid;
 	int handle;
 
 	if (!fpriv)
 		return;
 
-	pm_runtime_get_sync(dev->dev);
+	vm_ready = amdgpu_vm_ready(&fpriv->vm);
+	uvd = amdgpu_device_ip_get_ip_block(adev, AMD_IP_BLOCK_TYPE_UVD);
+	vce = amdgpu_device_ip_get_ip_block(adev, AMD_IP_BLOCK_TYPE_VCE);
 
-	if (amdgpu_device_ip_get_ip_block(adev, AMD_IP_BLOCK_TYPE_UVD) != NULL)
+	if (vm_ready || uvd || vce)
+		pm_runtime_get_sync(dev->dev);
+
+	if (uvd)
 		amdgpu_uvd_free_handles(adev, file_priv);
-	if (amdgpu_device_ip_get_ip_block(adev, AMD_IP_BLOCK_TYPE_VCE) != NULL)
+	if (vce)
 		amdgpu_vce_free_handles(adev, file_priv);
 
 	if (fpriv->csa_va) {
@@ -1442,8 +1450,10 @@ void amdgpu_driver_postclose_kms(struct drm_device *dev,
 	kfree(fpriv);
 	file_priv->driver_priv = NULL;
 
-	pm_runtime_mark_last_busy(dev->dev);
-	pm_runtime_put_autosuspend(dev->dev);
+	if (vm_ready || uvd || vce) {
+		pm_runtime_mark_last_busy(dev->dev);
+		pm_runtime_put_autosuspend(dev->dev);
+	}
 }
 
 
-- 
2.34.1



More information about the amd-gfx mailing list