On Mon 08 Jul 08:12 PDT 2019, Jeffrey Hugo wrote: > 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@xxxxxxxxx> Tested-by: Bjorn Andersson <bjorn.andersson@xxxxxxxxxx> > --- > > v2: It turns out there isn't a universal way to get the iommu device, so > check to see if its in the current node or parent > > drivers/gpu/drm/msm/disp/mdp5/mdp5_kms.c | 7 ++++++- > 1 file changed, 6 insertions(+), 1 deletion(-) > > diff --git a/drivers/gpu/drm/msm/disp/mdp5/mdp5_kms.c b/drivers/gpu/drm/msm/disp/mdp5/mdp5_kms.c > index 4a60f5fca6b0..02dc7d426cb0 100644 > --- a/drivers/gpu/drm/msm/disp/mdp5/mdp5_kms.c > +++ b/drivers/gpu/drm/msm/disp/mdp5/mdp5_kms.c > @@ -663,6 +663,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; > @@ -702,7 +703,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); > -- > 2.17.1 >