• Robin Murphy's avatar
    iommu/of: Fix of_iommu_configure() for disabled IOMMUs · da4b0275
    Robin Murphy authored
    Sudeep reports that the logic got slightly broken when a PCI iommu-map
    entry targets an IOMMU marked as disabled in DT, since of_pci_map_rid()
    succeeds in following a phandle, and of_iommu_xlate() doesn't return an
    error value, but we miss checking whether ops was actually non-NULL.
    Whilst this could be solved with a point fix in of_pci_iommu_init(), it
    suggests that all the juggling of ERR_PTR values through the ops pointer
    is proving rather too complicated for its own good, so let's instead
    simplify the whole flow (with a side-effect of eliminating the cause of
    the bug).
    
    The fact that we now rely on iommu_fwspec means that we no longer need
    to pass around an iommu_ops pointer at all - we can simply propagate a
    regular int return value until we know whether we have a viable IOMMU,
    then retrieve the ops from the fwspec if and when we actually need them.
    This makes everything a bit more uniform and certainly easier to follow.
    
    Fixes: d87beb74 ("iommu/of: Handle PCI aliases properly")
    Reported-by: default avatarSudeep Holla <sudeep.holla@arm.com>
    Tested-by: default avatarSudeep Holla <sudeep.holla@arm.com>
    Signed-off-by: default avatarRobin Murphy <robin.murphy@arm.com>
    Signed-off-by: default avatarJoerg Roedel <jroedel@suse.de>
    da4b0275
of_iommu.c 6.7 KB