diff options
Diffstat (limited to 'drivers/gpu/drm/radeon/radeon_kms.c')
| -rw-r--r-- | drivers/gpu/drm/radeon/radeon_kms.c | 22 | 
1 files changed, 21 insertions, 1 deletions
diff --git a/drivers/gpu/drm/radeon/radeon_kms.c b/drivers/gpu/drm/radeon/radeon_kms.c index 83b8d8aa71c..dc781c49b96 100644 --- a/drivers/gpu/drm/radeon/radeon_kms.c +++ b/drivers/gpu/drm/radeon/radeon_kms.c @@ -419,6 +419,7 @@ int radeon_driver_open_kms(struct drm_device *dev, struct drm_file *file_priv)  	/* new gpu have virtual address space support */  	if (rdev->family >= CHIP_CAYMAN) {  		struct radeon_fpriv *fpriv; +		struct radeon_bo_va *bo_va;  		int r;  		fpriv = kzalloc(sizeof(*fpriv), GFP_KERNEL); @@ -426,7 +427,15 @@ int radeon_driver_open_kms(struct drm_device *dev, struct drm_file *file_priv)  			return -ENOMEM;  		} -		r = radeon_vm_init(rdev, &fpriv->vm); +		radeon_vm_init(rdev, &fpriv->vm); + +		/* map the ib pool buffer read only into +		 * virtual address space */ +		bo_va = radeon_vm_bo_add(rdev, &fpriv->vm, +					 rdev->ring_tmp_bo.bo); +		r = radeon_vm_bo_set_addr(rdev, bo_va, RADEON_VA_IB_OFFSET, +					  RADEON_VM_PAGE_READABLE | +					  RADEON_VM_PAGE_SNOOPED);  		if (r) {  			radeon_vm_fini(rdev, &fpriv->vm);  			kfree(fpriv); @@ -454,6 +463,17 @@ void radeon_driver_postclose_kms(struct drm_device *dev,  	/* new gpu have virtual address space support */  	if (rdev->family >= CHIP_CAYMAN && file_priv->driver_priv) {  		struct radeon_fpriv *fpriv = file_priv->driver_priv; +		struct radeon_bo_va *bo_va; +		int r; + +		r = radeon_bo_reserve(rdev->ring_tmp_bo.bo, false); +		if (!r) { +			bo_va = radeon_vm_bo_find(&fpriv->vm, +						  rdev->ring_tmp_bo.bo); +			if (bo_va) +				radeon_vm_bo_rmv(rdev, bo_va); +			radeon_bo_unreserve(rdev->ring_tmp_bo.bo); +		}  		radeon_vm_fini(rdev, &fpriv->vm);  		kfree(fpriv);  |