diff options
| author | Rob Clark <robdclark@gmail.com> | 2017-02-13 10:14:10 -0700 |
|---|---|---|
| committer | Jordan Crouse <jcrouse@codeaurora.org> | 2017-02-13 15:29:47 -0700 |
| commit | 301d0d2fafaa0bb40359eb3760579f47e150c849 (patch) | |
| tree | f60d4adaf9015211987036237a81b1f99f7ad2cf /drivers/gpu | |
| parent | ea04cab92c1fa6233a7fda97c5b2548d1a846596 (diff) | |
drm/msm: add put_iova() helper
We'll need this too for shrinker/purging.
Change-Id: Ic0dedbada844d46b608c99cf3eaa3a898a6d5016
Signed-off-by: Rob Clark <robdclark@gmail.com>
Git-commit: 4fe5f65e66823dcb212a0404af47389b2b1c58f0
Git-repo: git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
[jcrouse@codeaurora.org: Modified to use different iommu map function
and merge with existing display changes]
Signed-off-by: Jordan Crouse <jcrouse@codeaurora.org>
Diffstat (limited to 'drivers/gpu')
| -rw-r--r-- | drivers/gpu/drm/msm/msm_gem.c | 44 |
1 files changed, 30 insertions, 14 deletions
diff --git a/drivers/gpu/drm/msm/msm_gem.c b/drivers/gpu/drm/msm/msm_gem.c index 351985327214..4e69fba410c3 100644 --- a/drivers/gpu/drm/msm/msm_gem.c +++ b/drivers/gpu/drm/msm/msm_gem.c @@ -268,6 +268,35 @@ uint64_t msm_gem_mmap_offset(struct drm_gem_object *obj) return offset; } +static void +put_iova(struct drm_gem_object *obj) +{ + struct drm_device *dev = obj->dev; + struct msm_drm_private *priv = obj->dev->dev_private; + struct msm_gem_object *msm_obj = to_msm_bo(obj); + int id; + + WARN_ON(!mutex_is_locked(&dev->struct_mutex)); + + for (id = 0; id < ARRAY_SIZE(msm_obj->domain); id++) { + struct msm_mmu *mmu = priv->mmus[id]; + + if (!mmu || !msm_obj->domain[id].iova) + continue; + + if (obj->import_attach) { + if (mmu->funcs->unmap_dma_buf) + mmu->funcs->unmap_dma_buf(mmu, msm_obj->sgt, + obj->import_attach->dmabuf, + DMA_BIDIRECTIONAL); + } else + mmu->funcs->unmap_sg(mmu, msm_obj->sgt, + DMA_BIDIRECTIONAL); + + msm_obj->domain[id].iova = 0; + } +} + /* should be called under struct_mutex.. although it can be called * from atomic context without struct_mutex to acquire an extra * iova ref if you know one is already held. @@ -517,9 +546,7 @@ void msm_gem_describe_objects(struct list_head *list, struct seq_file *m) void msm_gem_free_object(struct drm_gem_object *obj) { struct drm_device *dev = obj->dev; - struct msm_drm_private *priv = obj->dev->dev_private; struct msm_gem_object *msm_obj = to_msm_bo(obj); - int id; WARN_ON(!mutex_is_locked(&dev->struct_mutex)); @@ -528,18 +555,7 @@ void msm_gem_free_object(struct drm_gem_object *obj) list_del(&msm_obj->mm_list); - for (id = 0; id < ARRAY_SIZE(msm_obj->domain); id++) { - struct msm_mmu *mmu = priv->mmus[id]; - if (mmu && msm_obj->domain[id].iova) { - if (obj->import_attach && mmu->funcs->unmap_dma_buf) { - mmu->funcs->unmap_dma_buf(mmu, msm_obj->sgt, - obj->import_attach->dmabuf, - DMA_BIDIRECTIONAL); - } else - mmu->funcs->unmap_sg(mmu, msm_obj->sgt, - DMA_BIDIRECTIONAL); - } - } + put_iova(obj); if (obj->import_attach) { if (msm_obj->vaddr) |
