drm/msm: Add msm_gem_get_and_pin_iova()
Add a new function to get and pin the iova memory in one step (basically renaming the old msm_gem_get_iova function) and switch msm_gem_get_iova() to only allocate an iova but not map it in the IOMMU. This is only currently used by msm_ioctl_gem_info() since all other users of of the iova expect that the memory be immediately available. Signed-off-by: Jordan Crouse <jcrouse@codeaurora.org> Signed-off-by: Rob Clark <robdclark@gmail.com>
This commit is contained in:
		
							parent
							
								
									575f048550
								
							
						
					
					
						commit
						9fe041f6fd
					
				| @ -209,7 +209,8 @@ int adreno_hw_init(struct msm_gpu *gpu) | ||||
| 		if (!ring) | ||||
| 			continue; | ||||
| 
 | ||||
| 		ret = msm_gem_get_iova(ring->bo, gpu->aspace, &ring->iova); | ||||
| 		ret = msm_gem_get_and_pin_iova(ring->bo, gpu->aspace, | ||||
| 			&ring->iova); | ||||
| 		if (ret) { | ||||
| 			ring->iova = 0; | ||||
| 			DRM_DEV_ERROR(gpu->dev->dev, | ||||
|  | ||||
| @ -384,7 +384,7 @@ static void update_cursor(struct drm_crtc *crtc) | ||||
| 		if (next_bo) { | ||||
| 			/* take a obj ref + iova ref when we start scanning out: */ | ||||
| 			drm_gem_object_get(next_bo); | ||||
| 			msm_gem_get_iova(next_bo, kms->aspace, &iova); | ||||
| 			msm_gem_get_and_pin_iova(next_bo, kms->aspace, &iova); | ||||
| 
 | ||||
| 			/* enable cursor: */ | ||||
| 			mdp4_write(mdp4_kms, REG_MDP4_DMA_CURSOR_SIZE(dma), | ||||
| @ -442,7 +442,7 @@ static int mdp4_crtc_cursor_set(struct drm_crtc *crtc, | ||||
| 	} | ||||
| 
 | ||||
| 	if (cursor_bo) { | ||||
| 		ret = msm_gem_get_iova(cursor_bo, kms->aspace, &iova); | ||||
| 		ret = msm_gem_get_and_pin_iova(cursor_bo, kms->aspace, &iova); | ||||
| 		if (ret) | ||||
| 			goto fail; | ||||
| 	} else { | ||||
|  | ||||
| @ -538,7 +538,7 @@ struct msm_kms *mdp4_kms_init(struct drm_device *dev) | ||||
| 		goto fail; | ||||
| 	} | ||||
| 
 | ||||
| 	ret = msm_gem_get_iova(mdp4_kms->blank_cursor_bo, kms->aspace, | ||||
| 	ret = msm_gem_get_and_pin_iova(mdp4_kms->blank_cursor_bo, kms->aspace, | ||||
| 			&mdp4_kms->blank_cursor_iova); | ||||
| 	if (ret) { | ||||
| 		DRM_DEV_ERROR(dev->dev, "could not pin blank-cursor bo: %d\n", ret); | ||||
|  | ||||
| @ -903,7 +903,7 @@ static int mdp5_crtc_cursor_set(struct drm_crtc *crtc, | ||||
| 	if (!cursor_bo) | ||||
| 		return -ENOENT; | ||||
| 
 | ||||
| 	ret = msm_gem_get_iova(cursor_bo, kms->aspace, | ||||
| 	ret = msm_gem_get_and_pin_iova(cursor_bo, kms->aspace, | ||||
| 			&mdp5_crtc->cursor.iova); | ||||
| 	if (ret) | ||||
| 		return -EINVAL; | ||||
|  | ||||
| @ -1248,7 +1248,7 @@ int dsi_dma_base_get_6g(struct msm_dsi_host *msm_host, uint64_t *dma_base) | ||||
| 	if (!dma_base) | ||||
| 		return -EINVAL; | ||||
| 
 | ||||
| 	return msm_gem_get_iova(msm_host->tx_gem_obj, | ||||
| 	return msm_gem_get_and_pin_iova(msm_host->tx_gem_obj, | ||||
| 				priv->kms->aspace, dma_base); | ||||
| } | ||||
| 
 | ||||
|  | ||||
| @ -868,6 +868,10 @@ static int msm_ioctl_gem_info_iova(struct drm_device *dev, | ||||
| 	if (!priv->gpu) | ||||
| 		return -EINVAL; | ||||
| 
 | ||||
| 	/*
 | ||||
| 	 * Don't pin the memory here - just get an address so that userspace can | ||||
| 	 * be productive | ||||
| 	 */ | ||||
| 	return msm_gem_get_iova(obj, priv->gpu->aspace, iova); | ||||
| } | ||||
| 
 | ||||
|  | ||||
| @ -271,6 +271,8 @@ vm_fault_t msm_gem_fault(struct vm_fault *vmf); | ||||
| uint64_t msm_gem_mmap_offset(struct drm_gem_object *obj); | ||||
| int msm_gem_get_iova(struct drm_gem_object *obj, | ||||
| 		struct msm_gem_address_space *aspace, uint64_t *iova); | ||||
| int msm_gem_get_and_pin_iova(struct drm_gem_object *obj, | ||||
| 		struct msm_gem_address_space *aspace, uint64_t *iova); | ||||
| uint64_t msm_gem_iova(struct drm_gem_object *obj, | ||||
| 		struct msm_gem_address_space *aspace); | ||||
| struct page **msm_gem_get_pages(struct drm_gem_object *obj); | ||||
|  | ||||
| @ -66,7 +66,7 @@ int msm_framebuffer_prepare(struct drm_framebuffer *fb, | ||||
| 	uint64_t iova; | ||||
| 
 | ||||
| 	for (i = 0; i < n; i++) { | ||||
| 		ret = msm_gem_get_iova(fb->obj[i], aspace, &iova); | ||||
| 		ret = msm_gem_get_and_pin_iova(fb->obj[i], aspace, &iova); | ||||
| 		DBG("FB[%u]: iova[%d]: %08llx (%d)", fb->base.id, i, iova, ret); | ||||
| 		if (ret) | ||||
| 			return ret; | ||||
|  | ||||
| @ -104,7 +104,7 @@ static int msm_fbdev_create(struct drm_fb_helper *helper, | ||||
| 	 * in panic (ie. lock-safe, etc) we could avoid pinning the | ||||
| 	 * buffer now: | ||||
| 	 */ | ||||
| 	ret = msm_gem_get_iova(bo, priv->kms->aspace, &paddr); | ||||
| 	ret = msm_gem_get_and_pin_iova(bo, priv->kms->aspace, &paddr); | ||||
| 	if (ret) { | ||||
| 		DRM_DEV_ERROR(dev->dev, "failed to get buffer obj iova: %d\n", ret); | ||||
| 		goto fail_unlock; | ||||
|  | ||||
| @ -408,9 +408,8 @@ static int msm_gem_pin_iova(struct drm_gem_object *obj, | ||||
| 			obj->size >> PAGE_SHIFT); | ||||
| } | ||||
| 
 | ||||
| 
 | ||||
| /* get iova, taking a reference.  Should have a matching put */ | ||||
| int msm_gem_get_iova(struct drm_gem_object *obj, | ||||
| /* get iova and pin it. Should have a matching put */ | ||||
| int msm_gem_get_and_pin_iova(struct drm_gem_object *obj, | ||||
| 		struct msm_gem_address_space *aspace, uint64_t *iova) | ||||
| { | ||||
| 	struct msm_gem_object *msm_obj = to_msm_bo(obj); | ||||
| @ -431,8 +430,23 @@ int msm_gem_get_iova(struct drm_gem_object *obj, | ||||
| 	return ret; | ||||
| } | ||||
| 
 | ||||
| /* Get an iova but don't pin the memory behind it */ | ||||
| int msm_gem_get_iova(struct drm_gem_object *obj, | ||||
| 		struct msm_gem_address_space *aspace, uint64_t *iova) | ||||
| { | ||||
| 	struct msm_gem_object *msm_obj = to_msm_bo(obj); | ||||
| 	int ret; | ||||
| 
 | ||||
| 	mutex_lock(&msm_obj->lock); | ||||
| 	ret = msm_gem_get_iova_locked(obj, aspace, iova); | ||||
| 	mutex_unlock(&msm_obj->lock); | ||||
| 
 | ||||
| 	return ret; | ||||
| } | ||||
| 
 | ||||
| 
 | ||||
| /* get iova without taking a reference, used in places where you have
 | ||||
|  * already done a 'msm_gem_get_iova()'. | ||||
|  * already done a 'msm_gem_get_and_pin_iova' or 'msm_gem_get_iova' | ||||
|  */ | ||||
| uint64_t msm_gem_iova(struct drm_gem_object *obj, | ||||
| 		struct msm_gem_address_space *aspace) | ||||
| @ -1072,7 +1086,7 @@ static void *_msm_gem_kernel_new(struct drm_device *dev, uint32_t size, | ||||
| 		return ERR_CAST(obj); | ||||
| 
 | ||||
| 	if (iova) { | ||||
| 		ret = msm_gem_get_iova(obj, aspace, iova); | ||||
| 		ret = msm_gem_get_and_pin_iova(obj, aspace, iova); | ||||
| 		if (ret) | ||||
| 			goto err; | ||||
| 	} | ||||
|  | ||||
| @ -270,7 +270,7 @@ static int submit_pin_objects(struct msm_gem_submit *submit) | ||||
| 		uint64_t iova; | ||||
| 
 | ||||
| 		/* if locking succeeded, pin bo: */ | ||||
| 		ret = msm_gem_get_iova(&msm_obj->base, | ||||
| 		ret = msm_gem_get_and_pin_iova(&msm_obj->base, | ||||
| 				submit->gpu->aspace, &iova); | ||||
| 
 | ||||
| 		if (ret) | ||||
|  | ||||
| @ -773,7 +773,7 @@ void msm_gpu_submit(struct msm_gpu *gpu, struct msm_gem_submit *submit, | ||||
| 
 | ||||
| 		/* submit takes a reference to the bo and iova until retired: */ | ||||
| 		drm_gem_object_get(&msm_obj->base); | ||||
| 		msm_gem_get_iova(&msm_obj->base, | ||||
| 		msm_gem_get_and_pin_iova(&msm_obj->base, | ||||
| 				submit->gpu->aspace, &iova); | ||||
| 
 | ||||
| 		if (submit->bos[i].flags & MSM_SUBMIT_BO_WRITE) | ||||
|  | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user