forked from mirrors/linux
		
	drm/amdgpu: take runtime pm reference when we attach a buffer
And drop it when we detach. If the shared buffer is in vram, we need to make sure we don't put the device into runtime suspend. Acked-by: Shashank Sharma <shashank.sharma@amd.com> Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
This commit is contained in:
		
							parent
							
								
									65e05ca7c4
								
							
						
					
					
						commit
						b8c415e3bf
					
				
					 1 changed files with 14 additions and 2 deletions
				
			
		|  | @ -40,6 +40,7 @@ | |||
| #include <linux/dma-buf.h> | ||||
| #include <linux/dma-fence-array.h> | ||||
| #include <linux/pci-p2pdma.h> | ||||
| #include <linux/pm_runtime.h> | ||||
| 
 | ||||
| /**
 | ||||
|  * amdgpu_gem_prime_mmap - &drm_driver.gem_prime_mmap implementation | ||||
|  | @ -151,9 +152,13 @@ static int amdgpu_dma_buf_attach(struct dma_buf *dmabuf, | |||
| 	if (attach->dev->driver == adev->dev->driver) | ||||
| 		return 0; | ||||
| 
 | ||||
| 	r = pm_runtime_get_sync(adev_to_drm(adev)->dev); | ||||
| 	if (r < 0) | ||||
| 		goto out; | ||||
| 
 | ||||
| 	r = amdgpu_bo_reserve(bo, false); | ||||
| 	if (unlikely(r != 0)) | ||||
| 		return r; | ||||
| 		goto out; | ||||
| 
 | ||||
| 	/*
 | ||||
| 	 * We only create shared fences for internal use, but importers | ||||
|  | @ -165,11 +170,15 @@ static int amdgpu_dma_buf_attach(struct dma_buf *dmabuf, | |||
| 	 */ | ||||
| 	r = __dma_resv_make_exclusive(bo->tbo.base.resv); | ||||
| 	if (r) | ||||
| 		return r; | ||||
| 		goto out; | ||||
| 
 | ||||
| 	bo->prime_shared_count++; | ||||
| 	amdgpu_bo_unreserve(bo); | ||||
| 	return 0; | ||||
| 
 | ||||
| out: | ||||
| 	pm_runtime_put_autosuspend(adev_to_drm(adev)->dev); | ||||
| 	return r; | ||||
| } | ||||
| 
 | ||||
| /**
 | ||||
|  | @ -189,6 +198,9 @@ static void amdgpu_dma_buf_detach(struct dma_buf *dmabuf, | |||
| 
 | ||||
| 	if (attach->dev->driver != adev->dev->driver && bo->prime_shared_count) | ||||
| 		bo->prime_shared_count--; | ||||
| 
 | ||||
| 	pm_runtime_mark_last_busy(adev_to_drm(adev)->dev); | ||||
| 	pm_runtime_put_autosuspend(adev_to_drm(adev)->dev); | ||||
| } | ||||
| 
 | ||||
| /**
 | ||||
|  |  | |||
		Loading…
	
		Reference in a new issue
	
	 Alex Deucher
						Alex Deucher