forked from Minki/linux
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