On Thu 10 Jun 16:44 CDT 2021, Rob Clark wrote: [..]
diff --git a/drivers/gpu/drm/msm/msm_iommu.c b/drivers/gpu/drm/msm/msm_iommu.c index 50d881794758..6975b95c3c29 100644 --- a/drivers/gpu/drm/msm/msm_iommu.c +++ b/drivers/gpu/drm/msm/msm_iommu.c @@ -211,8 +211,17 @@ static int msm_fault_handler(struct iommu_domain *domain, struct device *dev, unsigned long iova, int flags, void *arg) { struct msm_iommu *iommu = arg;
- struct adreno_smmu_priv *adreno_smmu = dev_get_drvdata(iommu->base.dev);
- struct adreno_smmu_fault_info info, *ptr = NULL;
- if (adreno_smmu->get_fault_info) {
This seemed reasonable when I read it last time, but I didn't realize that the msm_fault_handler() is installed for all msm_iommu instances.
So while we're trying to recover from the boot splash and setup the new framebuffer we end up here with iommu->base.dev being the mdss device. Naturally drvdata of mdss is not a struct adreno_smmu_priv.
adreno_smmu->get_fault_info(adreno_smmu->cookie, &info);
So here we just jump straight out into hyperspace, never to return.
Not sure how to wire this up to avoid the problem, but right now I don't think we can boot any device with a boot splash.
Regards, Bjorn
ptr = &info;
- }
- if (iommu->base.handler)
return iommu->base.handler(iommu->base.arg, iova, flags);
return iommu->base.handler(iommu->base.arg, iova, flags, ptr);
- pr_warn_ratelimited("*** fault: iova=%16lx, flags=%d\n", iova, flags); return 0;
}