[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [PATCH v2 4/8] iommu/arm: iommu_add_dt_pci_device phantom handling
Handle phantom functions in iommu_add_dt_pci_device(). Each phantom function will have a unique requestor ID (RID)/BDF. On ARM, we need to map/translate the RID/BDF to an AXI stream ID for each phantom function according to the pci-iommu device tree mapping [1]. The RID/BDF -> AXI stream ID mapping in DT could allow phantom devices (i.e. devices with phantom functions) to use different AXI stream IDs based on the (phantom) function. [1] https://www.kernel.org/doc/Documentation/devicetree/bindings/pci/pci-iommu.txt Signed-off-by: Stewart Hildebrand <stewart.hildebrand@xxxxxxx> --- v1->v2: * new patch --- xen/drivers/passthrough/device_tree.c | 23 ++++++++++++++++++++++- 1 file changed, 22 insertions(+), 1 deletion(-) diff --git a/xen/drivers/passthrough/device_tree.c b/xen/drivers/passthrough/device_tree.c index 5e462e5c2ca8..ced911f4fb31 100644 --- a/xen/drivers/passthrough/device_tree.c +++ b/xen/drivers/passthrough/device_tree.c @@ -247,6 +247,7 @@ int iommu_add_dt_pci_device(struct pci_dev *pdev) struct device *dev = pci_to_dev(pdev); const struct dt_device_node *np; int rc = NO_IOMMU; + unsigned int devfn = pdev->devfn; if ( !iommu_enabled ) return NO_IOMMU; @@ -275,7 +276,7 @@ int iommu_add_dt_pci_device(struct pci_dev *pdev) * According to the Documentation/devicetree/bindings/pci/pci-iommu.txt * from Linux. */ - rc = iommu_dt_pci_map_id(np, PCI_BDF(pdev->bus, pdev->devfn), "iommu-map", + rc = iommu_dt_pci_map_id(np, PCI_BDF(pdev->bus, devfn), "iommu-map", "iommu-map-mask", &iommu_spec.np, iommu_spec.args); if ( rc ) return rc == -ENODEV ? NO_IOMMU : rc; @@ -286,6 +287,26 @@ int iommu_add_dt_pci_device(struct pci_dev *pdev) iommu_fwspec_free(pci_to_dev(pdev)); return -EINVAL; } + for ( ; pdev->phantom_stride ; ) + { + devfn += pdev->phantom_stride; + if ( PCI_SLOT(devfn) != PCI_SLOT(pdev->devfn) ) + break; + rc = iommu_dt_pci_map_id(np, PCI_BDF(pdev->bus, devfn), "iommu-map", + "iommu-map-mask", &iommu_spec.np, iommu_spec.args); + if ( rc ) + { + printk(XENLOG_WARNING "IOMMU: add %pp failed (%d)\n", + &PCI_SBDF(pdev->seg, pdev->bus, devfn), rc); + return rc == -ENODEV ? NO_IOMMU : rc; + } + rc = iommu_dt_xlate(dev, &iommu_spec); + if ( rc < 0 ) + { + iommu_fwspec_free(pci_to_dev(pdev)); + return -EINVAL; + } + } return rc; } -- 2.40.1
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |