On 07.06.2016 15:31, Lorenzo Pieralisi wrote:
+static int __get_pci_rid(struct pci_dev *pdev, u16 alias, void *data) +{ + u32 *rid = data; + + *rid = alias; + return 0; +} + +/** + * iort_iommu_configure - Set-up IOMMU configuration for a device. + * + * @dev: device to configure + * + * Returns: iommu_ops pointer on configuration success + * NULL on configuration failure + */ +const struct iommu_ops *iort_iommu_configure(struct device *dev) +{ + struct acpi_iort_node *node, *parent; + const struct iort_ops_node *iort_ops; + u32 rid = 0, devid = 0; + + if (dev_is_pci(dev)) { + struct pci_bus *bus = to_pci_dev(dev)->bus; + + pci_for_each_dma_alias(to_pci_dev(dev), __get_pci_rid, + &rid);
I think we should find here the root bus which is connected to RC IORT node.
+ + node = iort_scan_node(ACPI_IORT_NODE_PCI_ROOT_COMPLEX, + iort_find_dev_callback, &bus->dev); + } else { + node = iort_scan_node(ACPI_IORT_NODE_NAMED_COMPONENT, + iort_find_dev_callback, dev); + } + + if (!node) + return NULL; + + parent = iort_find_parent_node(node); + + if (!parent) + return NULL; + + iort_ops = iort_smmu_get_ops_node(parent); + + if (iort_ops && iort_ops->iommu_xlate) { + iort_dev_map_rid(node, rid, &devid, parent->type); + iort_ops->iommu_xlate(dev, devid, parent); + return iort_ops->ops; + } + + return NULL; +} +
Thanks, Tomasz -- To unsubscribe from this list: send the line "unsubscribe linux-pci" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html