diff options
Diffstat (limited to 'drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c')
| -rw-r--r-- | drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c | 23 | 
1 files changed, 21 insertions, 2 deletions
| diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c index 8a1752ff3d8e..1cbb16e15307 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c @@ -712,7 +712,7 @@ static int amdgpu_ttm_tt_populate(struct ttm_tt *ttm)  						       0, PAGE_SIZE,  						       PCI_DMA_BIDIRECTIONAL);  		if (pci_dma_mapping_error(adev->pdev, gtt->ttm.dma_address[i])) { -			while (--i) { +			while (i--) {  				pci_unmap_page(adev->pdev, gtt->ttm.dma_address[i],  					       PAGE_SIZE, PCI_DMA_BIDIRECTIONAL);  				gtt->ttm.dma_address[i] = 0; @@ -783,6 +783,25 @@ bool amdgpu_ttm_tt_has_userptr(struct ttm_tt *ttm)  	return !!gtt->userptr;  } +bool amdgpu_ttm_tt_affect_userptr(struct ttm_tt *ttm, unsigned long start, +				  unsigned long end) +{ +	struct amdgpu_ttm_tt *gtt = (void *)ttm; +	unsigned long size; + +	if (gtt == NULL) +		return false; + +	if (gtt->ttm.ttm.state != tt_bound || !gtt->userptr) +		return false; + +	size = (unsigned long)gtt->ttm.ttm.num_pages * PAGE_SIZE; +	if (gtt->userptr > end || gtt->userptr + size <= start) +		return false; + +	return true; +} +  bool amdgpu_ttm_tt_is_readonly(struct ttm_tt *ttm)  {  	struct amdgpu_ttm_tt *gtt = (void *)ttm; @@ -808,7 +827,7 @@ uint32_t amdgpu_ttm_tt_pte_flags(struct amdgpu_device *adev, struct ttm_tt *ttm,  			flags |= AMDGPU_PTE_SNOOPED;  	} -	if (adev->asic_type >= CHIP_TOPAZ) +	if (adev->asic_type >= CHIP_TONGA)  		flags |= AMDGPU_PTE_EXECUTABLE;  	flags |= AMDGPU_PTE_READABLE; | 
