diff options
Diffstat (limited to 'drivers/gpu/drm/amd/amdgpu')
| -rw-r--r-- | drivers/gpu/drm/amd/amdgpu/amdgpu.h | 2 | ||||
| -rw-r--r-- | drivers/gpu/drm/amd/amdgpu/amdgpu_mn.c | 3 | ||||
| -rw-r--r-- | drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c | 19 | 
3 files changed, 23 insertions, 1 deletions
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu.h b/drivers/gpu/drm/amd/amdgpu/amdgpu.h index 82edf95b7740..d0fee29ebeba 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu.h +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu.h @@ -2360,6 +2360,8 @@ bool amdgpu_ttm_bo_is_amdgpu_bo(struct ttm_buffer_object *bo);  int amdgpu_ttm_tt_set_userptr(struct ttm_tt *ttm, uint64_t addr,  				     uint32_t flags);  bool amdgpu_ttm_tt_has_userptr(struct ttm_tt *ttm); +bool amdgpu_ttm_tt_affect_userptr(struct ttm_tt *ttm, unsigned long start, +				  unsigned long end);  bool amdgpu_ttm_tt_is_readonly(struct ttm_tt *ttm);  uint32_t amdgpu_ttm_tt_pte_flags(struct amdgpu_device *adev, struct ttm_tt *ttm,  				 struct ttm_mem_reg *mem); diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_mn.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_mn.c index b1969f2b2038..d4e2780c0796 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_mn.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_mn.c @@ -142,7 +142,8 @@ static void amdgpu_mn_invalidate_range_start(struct mmu_notifier *mn,  		list_for_each_entry(bo, &node->bos, mn_list) { -			if (!bo->tbo.ttm || bo->tbo.ttm->state != tt_bound) +			if (!amdgpu_ttm_tt_affect_userptr(bo->tbo.ttm, start, +							  end))  				continue;  			r = amdgpu_bo_reserve(bo, true); diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c index 55cf05e1c81c..6442a06d6fdc 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c @@ -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;  | 

