Similar to commit 0e764a01015d ("iommu/arm-smmu: Allow client devices to
select direct mapping") for arm-smmu-qcom, match GPU and display compat
strings to pick identity domain time.The drm/msm driver attaches it's own domain, which it manages directly, so we don't want an iommu managed domain interfering. Signed-off-by: Rob Clark <[email protected]> --- drivers/iommu/msm_iommu.c | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/drivers/iommu/msm_iommu.c b/drivers/iommu/msm_iommu.c index 4ef1e8c8244b..1c5011432628 100644 --- a/drivers/iommu/msm_iommu.c +++ b/drivers/iommu/msm_iommu.c @@ -12,6 +12,7 @@ #include <linux/io.h> #include <linux/io-pgtable.h> #include <linux/interrupt.h> +#include <linux/of_device.h> #include <linux/list.h> #include <linux/spinlock.h> #include <linux/slab.h> @@ -691,12 +692,27 @@ irqreturn_t msm_iommu_fault_handler(int irq, void *dev_id) return 0; } +static const struct of_device_id msm_iommu_client_of_match[] = { + { .compatible = "qcom,adreno" }, + { .compatible = "qcom,mdp4" }, + { } +}; + +static int msm_iommu_def_domain_type(struct device *dev) +{ + const struct of_device_id *match = + of_match_device(msm_iommu_client_of_match, dev); + + return match ? IOMMU_DOMAIN_IDENTITY : 0; +} + static struct iommu_ops msm_iommu_ops = { .identity_domain = &msm_iommu_identity_domain, .domain_alloc_paging = msm_iommu_domain_alloc_paging, .probe_device = msm_iommu_probe_device, .device_group = generic_device_group, .of_xlate = qcom_iommu_of_xlate, + .def_domain_type = msm_iommu_def_domain_type, .default_domain_ops = &(const struct iommu_domain_ops) { .attach_dev = msm_iommu_attach_dev, .map_pages = msm_iommu_map, -- 2.56.0
