@@ -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;
}
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@amd.com> --- v1->v2: * new patch --- xen/drivers/passthrough/device_tree.c | 23 ++++++++++++++++++++++- 1 file changed, 22 insertions(+), 1 deletion(-)