Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 301d0d2f authored by Rob Clark's avatar Rob Clark Committed by Jordan Crouse
Browse files

drm/msm: add put_iova() helper



We'll need this too for shrinker/purging.

Change-Id: Ic0dedbada844d46b608c99cf3eaa3a898a6d5016
Signed-off-by: default avatarRob 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: default avatarJordan Crouse <jcrouse@codeaurora.org>
parent ea04cab9
Loading
Loading
Loading
Loading
+30 −14
Original line number Diff line number Diff line
@@ -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)