msm: smmu: add re-route calling for specified iova when mapping
When calling smmu mapping, if iova is specified directly by user, not allocated dynamically in dma-mapping.c, smmu driver needs to provide support for this. This is needed in early display case. In this scenario, LK has set physical memory to display hardware for fetching, so if iova is not explicitly specified in kernel, but instead dynamically produced by "alloc_iova" in dma-mapping.c, display hardware has no chance to know this new iova, then smmu fault will happen if enabling the iommu stage-1 translation. To fix this smmu fault problem, add re-routing to the right path when iova specified by user is not 0 in smmu map function. Change-Id: I555fe7ae44464f25245d2d0a6740a2411a8624ba Signed-off-by: Guchun Chen <guchunc@codeaurora.org>
This commit is contained in:
parent
85baaeb2e2
commit
bdac1e68ba
1 changed files with 21 additions and 7 deletions
|
@ -120,16 +120,30 @@ static int msm_smmu_map(struct msm_mmu *mmu, uint64_t iova,
|
||||||
{
|
{
|
||||||
struct msm_smmu *smmu = to_msm_smmu(mmu);
|
struct msm_smmu *smmu = to_msm_smmu(mmu);
|
||||||
struct msm_smmu_client *client = msm_smmu_to_client(smmu);
|
struct msm_smmu_client *client = msm_smmu_to_client(smmu);
|
||||||
|
struct iommu_domain *domain;
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
if (priv)
|
if (!client || !sgt)
|
||||||
ret = msm_dma_map_sg_lazy(client->dev, sgt->sgl, sgt->nents,
|
return -EINVAL;
|
||||||
DMA_BIDIRECTIONAL, priv);
|
|
||||||
else
|
|
||||||
ret = dma_map_sg(client->dev, sgt->sgl, sgt->nents,
|
|
||||||
DMA_BIDIRECTIONAL);
|
|
||||||
|
|
||||||
return (ret != sgt->nents) ? -ENOMEM : 0;
|
if (iova != 0) {
|
||||||
|
if (!client->mmu_mapping || !client->mmu_mapping->domain)
|
||||||
|
return -EINVAL;
|
||||||
|
|
||||||
|
domain = client->mmu_mapping->domain;
|
||||||
|
|
||||||
|
return iommu_map_sg(domain, iova, sgt->sgl,
|
||||||
|
sgt->nents, flags);
|
||||||
|
} else {
|
||||||
|
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);
|
||||||
|
|
||||||
|
return (ret != sgt->nents) ? -ENOMEM : 0;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static void msm_smmu_unmap(struct msm_mmu *mmu, uint64_t iova,
|
static void msm_smmu_unmap(struct msm_mmu *mmu, uint64_t iova,
|
||||||
|
|
Loading…
Add table
Reference in a new issue