Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 4dac3210 authored by Lorenzo Pieralisi's avatar Lorenzo Pieralisi Committed by Joerg Roedel
Browse files

ACPI/IORT: Move the check to get iommu_ops from translated fwspec



With IOMMU probe deferral, iort_iommu_configure can be called
multiple times for the same device. Hence we have a check
to see if the device's fwspec is already translated and return
the iommu_ops from that directly. But the check is wrongly
placed in iort_iommu_xlate, which breaks devices with multiple
sids. Move the check to iort_iommu_configure.

Fixes: 5a1bb638 ("drivers: acpi: Handle IOMMU lookup failure with deferred probing or error")
Tested-by: default avatarNate Watterson <nwatters@codeaurora.org>
Signed-off-by: default avatarLorenzo Pieralisi <lorenzo.pieralisi@arm.com>
Signed-off-by: default avatarJoerg Roedel <jroedel@suse.de>
parent a93a121a
Loading
Loading
Loading
Loading
+8 −8
Original line number Original line Diff line number Diff line
@@ -666,14 +666,6 @@ static const struct iommu_ops *iort_iommu_xlate(struct device *dev,
	int ret = -ENODEV;
	int ret = -ENODEV;
	struct fwnode_handle *iort_fwnode;
	struct fwnode_handle *iort_fwnode;


	/*
	 * If we already translated the fwspec there
	 * is nothing left to do, return the iommu_ops.
	 */
	ops = iort_fwspec_iommu_ops(dev->iommu_fwspec);
	if (ops)
		return ops;

	if (node) {
	if (node) {
		iort_fwnode = iort_get_fwnode(node);
		iort_fwnode = iort_get_fwnode(node);
		if (!iort_fwnode)
		if (!iort_fwnode)
@@ -735,6 +727,14 @@ const struct iommu_ops *iort_iommu_configure(struct device *dev)
	u32 streamid = 0;
	u32 streamid = 0;
	int err;
	int err;


	/*
	 * If we already translated the fwspec there
	 * is nothing left to do, return the iommu_ops.
	 */
	ops = iort_fwspec_iommu_ops(dev->iommu_fwspec);
	if (ops)
		return ops;

	if (dev_is_pci(dev)) {
	if (dev_is_pci(dev)) {
		struct pci_bus *bus = to_pci_dev(dev)->bus;
		struct pci_bus *bus = to_pci_dev(dev)->bus;
		u32 rid;
		u32 rid;