diff options
Diffstat (limited to 'drivers/gpu/drm/msm/msm_iommu.c')
| -rw-r--r-- | drivers/gpu/drm/msm/msm_iommu.c | 20 | 
1 files changed, 17 insertions, 3 deletions
diff --git a/drivers/gpu/drm/msm/msm_iommu.c b/drivers/gpu/drm/msm/msm_iommu.c index 5577cea7c009..c2507582ecf3 100644 --- a/drivers/gpu/drm/msm/msm_iommu.c +++ b/drivers/gpu/drm/msm/msm_iommu.c @@ -186,6 +186,13 @@ int msm_iommu_pagetable_params(struct msm_mmu *mmu,  	return 0;  } +struct iommu_domain_geometry *msm_iommu_get_geometry(struct msm_mmu *mmu) +{ +	struct msm_iommu *iommu = to_msm_iommu(mmu); + +	return &iommu->domain->geometry; +} +  static const struct msm_mmu_funcs pagetable_funcs = {  		.map = msm_iommu_pagetable_map,  		.unmap = msm_iommu_pagetable_unmap, @@ -367,17 +374,23 @@ static const struct msm_mmu_funcs funcs = {  		.resume_translation = msm_iommu_resume_translation,  }; -struct msm_mmu *msm_iommu_new(struct device *dev, struct iommu_domain *domain) +struct msm_mmu *msm_iommu_new(struct device *dev, unsigned long quirks)  { +	struct iommu_domain *domain;  	struct msm_iommu *iommu;  	int ret; +	domain = iommu_domain_alloc(dev->bus);  	if (!domain) -		return ERR_PTR(-ENODEV); +		return NULL; + +	iommu_set_pgtable_quirks(domain, quirks);  	iommu = kzalloc(sizeof(*iommu), GFP_KERNEL); -	if (!iommu) +	if (!iommu) { +		iommu_domain_free(domain);  		return ERR_PTR(-ENOMEM); +	}  	iommu->domain = domain;  	msm_mmu_init(&iommu->base, dev, &funcs, MSM_MMU_IOMMU); @@ -386,6 +399,7 @@ struct msm_mmu *msm_iommu_new(struct device *dev, struct iommu_domain *domain)  	ret = iommu_attach_device(iommu->domain, dev);  	if (ret) { +		iommu_domain_free(domain);  		kfree(iommu);  		return ERR_PTR(ret);  	}  |