When the iort_match_node_callback is invoked for a named component
the match should be executed upon a device with an ACPI companion.

For devices with no ACPI companion set-up the ACPI device tree must be
walked in order to find the first parent node with a companion set and
check the parent node against the named component entry to check whether
there is a match and therefore an IORT node describing the in/out ID
translation for the device has been found.

Signed-off-by: Lorenzo Pieralisi <[email protected]>
Cc: Will Deacon <[email protected]>
Cc: Hanjun Guo <[email protected]>
Cc: Sudeep Holla <[email protected]>
Cc: Catalin Marinas <[email protected]>
Cc: Robin Murphy <[email protected]>
Cc: "Rafael J. Wysocki" <[email protected]>
---
 drivers/acpi/arm64/iort.c | 20 ++++++++++++++++++--
 1 file changed, 18 insertions(+), 2 deletions(-)

diff --git a/drivers/acpi/arm64/iort.c b/drivers/acpi/arm64/iort.c
index 7d04424189df..7cfd77b5e6e8 100644
--- a/drivers/acpi/arm64/iort.c
+++ b/drivers/acpi/arm64/iort.c
@@ -264,15 +264,31 @@ static acpi_status iort_match_node_callback(struct 
acpi_iort_node *node,
 
        if (node->type == ACPI_IORT_NODE_NAMED_COMPONENT) {
                struct acpi_buffer buf = { ACPI_ALLOCATE_BUFFER, NULL };
-               struct acpi_device *adev = to_acpi_device_node(dev->fwnode);
+               struct acpi_device *adev;
                struct acpi_iort_named_component *ncomp;
+               struct device *nc_dev = dev;
+
+               /*
+                * Walk the device tree to find a device with an
+                * ACPI companion; there is no point in scanning
+                * IORT for a device matching a named component if
+                * the device does not have an ACPI companion to
+                * start with.
+                */
+               do {
+                       adev = ACPI_COMPANION(nc_dev);
+                       if (adev)
+                               break;
+
+                       nc_dev = nc_dev->parent;
+               } while (nc_dev);
 
                if (!adev)
                        goto out;
 
                status = acpi_get_name(adev->handle, ACPI_FULL_PATHNAME, &buf);
                if (ACPI_FAILURE(status)) {
-                       dev_warn(dev, "Can't get device full path name\n");
+                       dev_warn(nc_dev, "Can't get device full path name\n");
                        goto out;
                }
 
-- 
2.26.1

_______________________________________________
iommu mailing list
[email protected]
https://lists.linuxfoundation.org/mailman/listinfo/iommu

Reply via email to