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

Commit 438cdcda authored by Jordan Crouse's avatar Jordan Crouse
Browse files

drm/msm: Get rid of the MMU ->map_dma_buf and ->unmap_dma_buf funcs



Finish consolidating the MMU map and unmap operations into a single
function. By passing in the meta token to map/unmap the specific
SMMU operations can make a local decision as to which function to
call.

Change-Id: Ic0dedbad52aac6ed1317411b2667755794d1818f
Signed-off-by: default avatarJordan Crouse <jcrouse@codeaurora.org>
parent 82fbc52e
Loading
Loading
Loading
Loading
+8 −18
Original line number Diff line number Diff line
@@ -42,13 +42,8 @@ static void smmu_aspace_unmap_vma(struct msm_gem_address_space *aspace,
		struct msm_gem_vma *vma, struct sg_table *sgt,
		void *priv)
{
	struct dma_buf *buf = priv;

	if (buf)
		aspace->mmu->funcs->unmap_dma_buf(aspace->mmu,
			sgt, buf, DMA_BIDIRECTIONAL);
	else
		aspace->mmu->funcs->unmap(aspace->mmu, 0, sgt);
	aspace->mmu->funcs->unmap(aspace->mmu, 0, sgt, priv);

	vma->iova = 0;

@@ -60,20 +55,15 @@ static int smmu_aspace_map_vma(struct msm_gem_address_space *aspace,
		struct msm_gem_vma *vma, struct sg_table *sgt,
		void *priv, unsigned int flags)
{
	struct dma_buf *buf = priv;
	int ret;

	if (buf)
		ret = aspace->mmu->funcs->map_dma_buf(aspace->mmu, sgt, buf,
			DMA_BIDIRECTIONAL);
	else
		ret = aspace->mmu->funcs->map(aspace->mmu, 0, sgt, flags);

	if (!ret)
	ret = aspace->mmu->funcs->map(aspace->mmu, 0, sgt, flags, priv);
	if (!ret) {
		vma->iova = sg_dma_address(sgt->sgl);

		/* Get a reference to the aspace to keep it around */
		kref_get(&aspace->kref);
	}

	return ret;
}
@@ -122,7 +112,7 @@ static void iommu_aspace_unmap_vma(struct msm_gem_address_space *aspace,
		return;

	if (aspace->mmu)
		aspace->mmu->funcs->unmap(aspace->mmu, vma->iova, sgt);
		aspace->mmu->funcs->unmap(aspace->mmu, vma->iova, sgt, NULL);

	drm_mm_remove_node(&vma->node);

@@ -155,7 +145,7 @@ static int iommu_aspace_map_vma(struct msm_gem_address_space *aspace,

	if (aspace->mmu)
		ret = aspace->mmu->funcs->map(aspace->mmu, vma->iova, sgt,
			flags);
			flags, NULL);

	/* Get a reference to the aspace to keep it around */
	kref_get(&aspace->kref);
+2 −2
Original line number Diff line number Diff line
@@ -196,7 +196,7 @@ static void msm_iommu_detach_dynamic(struct msm_mmu *mmu)
}

static int msm_iommu_map(struct msm_mmu *mmu, uint64_t iova,
		struct sg_table *sgt, u32 flags)
		struct sg_table *sgt, u32 flags, void *priv)
{
	struct msm_iommu *iommu = to_msm_iommu(mmu);
	struct iommu_domain *domain = iommu->domain;
@@ -224,7 +224,7 @@ static int msm_iommu_map(struct msm_mmu *mmu, uint64_t iova,
}

static void msm_iommu_unmap(struct msm_mmu *mmu, uint64_t iova,
		struct sg_table *sgt)
		struct sg_table *sgt, void *priv)
{
	struct msm_iommu *iommu = to_msm_iommu(mmu);
	struct iommu_domain *domain = iommu->domain;
+3 −6
Original line number Diff line number Diff line
@@ -34,12 +34,9 @@ struct msm_mmu_funcs {
	int (*attach)(struct msm_mmu *mmu, const char **names, int cnt);
	void (*detach)(struct msm_mmu *mmu);
	int (*map)(struct msm_mmu *mmu, uint64_t iova, struct sg_table *sgt,
			u32 flags);
	void (*unmap)(struct msm_mmu *mmu, uint64_t iova, struct sg_table *sgt);
	int (*map_dma_buf)(struct msm_mmu *mmu, struct sg_table *sgt,
			struct dma_buf *dma_buf, int dir);
	void (*unmap_dma_buf)(struct msm_mmu *mmu, struct sg_table *sgt,
			struct dma_buf *dma_buf, int dir);
			u32 flags, void *priv);
	void (*unmap)(struct msm_mmu *mmu, uint64_t iova, struct sg_table *sgt,
			void *priv);
	void (*destroy)(struct msm_mmu *mmu);
};

+13 −33
Original line number Diff line number Diff line
@@ -105,12 +105,16 @@ static void msm_smmu_detach(struct msm_mmu *mmu)
}

static int msm_smmu_map(struct msm_mmu *mmu, uint64_t iova,
		struct sg_table *sgt, u32 flags)
		struct sg_table *sgt, u32 flags, void *priv)
{
	struct msm_smmu *smmu = to_msm_smmu(mmu);
	struct msm_smmu_client *client = msm_smmu_to_client(smmu);
	int ret;

	if (priv)
		ret = msm_dma_map_sg_lazy(client->dev, sgt->sgl, sgt->nents,
			DMA_BIDIRECTIONAL, priv);
	else
		ret = dma_map_sg(client->dev, sgt->sgl, sgt->nents,
			DMA_BIDIRECTIONAL);

@@ -118,12 +122,17 @@ static int msm_smmu_map(struct msm_mmu *mmu, uint64_t iova,
}

static void msm_smmu_unmap(struct msm_mmu *mmu, uint64_t iova,
		struct sg_table *sgt)
		struct sg_table *sgt, void *priv)
{
	struct msm_smmu *smmu = to_msm_smmu(mmu);
	struct msm_smmu_client *client = msm_smmu_to_client(smmu);

	dma_unmap_sg(client->dev, sgt->sgl, sgt->nents, DMA_BIDIRECTIONAL);
	if (priv)
		msm_dma_unmap_sg(client->dev, sgt->sgl, sgt->nents,
			DMA_BIDIRECTIONAL, priv);
	else
		dma_unmap_sg(client->dev, sgt->sgl, sgt->nents,
			DMA_BIDIRECTIONAL);
}

static void msm_smmu_destroy(struct msm_mmu *mmu)
@@ -136,40 +145,11 @@ static void msm_smmu_destroy(struct msm_mmu *mmu)
	kfree(smmu);
}

static int msm_smmu_map_dma_buf(struct msm_mmu *mmu, struct sg_table *sgt,
			struct dma_buf *dma_buf, int dir)
{
	struct msm_smmu *smmu = to_msm_smmu(mmu);
	struct msm_smmu_client *client = msm_smmu_to_client(smmu);
	int ret;

	ret = msm_dma_map_sg_lazy(client->dev, sgt->sgl, sgt->nents, dir,
			dma_buf);
	if (ret != sgt->nents) {
		DRM_ERROR("dma map sg failed\n");
		return -ENOMEM;
	}

	return 0;
}


static void msm_smmu_unmap_dma_buf(struct msm_mmu *mmu, struct sg_table *sgt,
			struct dma_buf *dma_buf, int dir)
{
	struct msm_smmu *smmu = to_msm_smmu(mmu);
	struct msm_smmu_client *client = msm_smmu_to_client(smmu);

	msm_dma_unmap_sg(client->dev, sgt->sgl, sgt->nents, dir, dma_buf);
}

static const struct msm_mmu_funcs funcs = {
	.attach = msm_smmu_attach,
	.detach = msm_smmu_detach,
	.map = msm_smmu_map,
	.unmap = msm_smmu_unmap,
	.map_dma_buf = msm_smmu_map_dma_buf,
	.unmap_dma_buf = msm_smmu_unmap_dma_buf,
	.destroy = msm_smmu_destroy,
};