drm/msm/mdp5: Find correct node for creating gem address space
authorJeffrey Hugo <jeffrey.l.hugo@gmail.com>
Mon, 8 Jul 2019 15:12:24 +0000 (08:12 -0700)
committerRob Clark <robdclark@chromium.org>
Tue, 3 Sep 2019 23:16:58 +0000 (16:16 -0700)
Creating the msm gem address space requires a reference to the dev where
the iommu is located.  The driver currently assumes this is the same as
the platform device, which breaks when the iommu is outside of the
platform device (ie in the parent).  Default to using the platform device,
but check to see if that has an iommu reference, and if not, use the parent
device instead.  This should handle all the various iommu designs for
mdp5 supported systems.

Signed-off-by: Jeffrey Hugo <jeffrey.l.hugo@gmail.com>
Tested-by: Bjorn Andersson <bjorn.andersson@linaro.org>
Signed-off-by: Rob Clark <robdclark@chromium.org>
drivers/gpu/drm/msm/disp/mdp5/mdp5_kms.c

index 13416dc229c0757dc0a17c09397482ee29c61805..0beca82661c58c9ebb0e3281dbcf82020e643292 100644 (file)
@@ -669,6 +669,7 @@ struct msm_kms *mdp5_kms_init(struct drm_device *dev)
        struct msm_kms *kms;
        struct msm_gem_address_space *aspace;
        int irq, i, ret;
+       struct device *iommu_dev;
 
        /* priv->kms would have been populated by the MDP5 driver */
        kms = priv->kms;
@@ -708,7 +709,11 @@ struct msm_kms *mdp5_kms_init(struct drm_device *dev)
        mdelay(16);
 
        if (config->platform.iommu) {
-               aspace = msm_gem_address_space_create(&pdev->dev,
+               iommu_dev = &pdev->dev;
+               if (!iommu_dev->iommu_fwspec)
+                       iommu_dev = iommu_dev->parent;
+
+               aspace = msm_gem_address_space_create(iommu_dev,
                                config->platform.iommu, "mdp5");
                if (IS_ERR(aspace)) {
                        ret = PTR_ERR(aspace);