Re: [RFC PATCH v2 13/15] drivers: acpi: iort: introduce iort_iommu_configure

From: Tomasz Nowicki
Date: Fri Jun 10 2016 - 08:47:05 EST


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