summaryrefslogtreecommitdiff
path: root/drivers/gpu
diff options
context:
space:
mode:
authorRob Clark <robdclark@gmail.com>2017-02-13 10:14:10 -0700
committerJordan Crouse <jcrouse@codeaurora.org>2017-02-13 15:29:47 -0700
commit301d0d2fafaa0bb40359eb3760579f47e150c849 (patch)
treef60d4adaf9015211987036237a81b1f99f7ad2cf /drivers/gpu
parentea04cab92c1fa6233a7fda97c5b2548d1a846596 (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.c44
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)