[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [PATCH v9 3/8] iommu/arm: iommu_add_dt_pci_sideband_ids phantom handling
On Fri, 14 Mar 2025, Mykyta Poturai wrote: > From: Stewart Hildebrand <stewart.hildebrand@xxxxxxx> > > Handle phantom functions in iommu_add_dt_pci_sideband_ids(). 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> Reviewed-by: Stefano Stabellini <sstabellini@xxxxxxxxxx> > --- > v8->v9: > * replace DT_NO_IOMMU with 1 > > v7->v8: > * no change > > v6->v7: > * no change > > v5->v6: > * no change > > v4->v5: > * no change > > v3->v4: > * s/iommu_dt_pci_map_id/dt_map_id/ > > v2->v3: > * new patch title (was: iommu/arm: iommu_add_dt_pci_device phantom handling) > * rework loop to reduce duplication > * s/iommu_fwspec_free(pci_to_dev(pdev))/iommu_fwspec_free(dev)/ > > v1->v2: > * new patch > > --- > TODO: investigate Jan's comment [2] > [2] > https://lore.kernel.org/xen-devel/806a2978-19fb-4d31-ab6a-35ea7317c8de@xxxxxxxx/ > --- > xen/drivers/passthrough/device_tree.c | 33 ++++++++++++++++----------- > 1 file changed, 20 insertions(+), 13 deletions(-) > > diff --git a/xen/drivers/passthrough/device_tree.c > b/xen/drivers/passthrough/device_tree.c > index 37e1437b65..f5850a2607 100644 > --- a/xen/drivers/passthrough/device_tree.c > +++ b/xen/drivers/passthrough/device_tree.c > @@ -169,6 +169,7 @@ int iommu_add_dt_pci_sideband_ids(struct pci_dev *pdev) > struct device *dev = pci_to_dev(pdev); > const struct dt_device_node *np; > int rc; > + unsigned int devfn = pdev->devfn; > > if ( !iommu_enabled ) > return 1; > @@ -183,21 +184,27 @@ int iommu_add_dt_pci_sideband_ids(struct pci_dev *pdev) > if ( !np ) > return -ENODEV; > > - /* > - * According to the Documentation/devicetree/bindings/pci/pci-iommu.txt > - * from Linux. > - */ > - rc = dt_map_id(np, PCI_BDF(pdev->bus, pdev->devfn), "iommu-map", > - "iommu-map-mask", &iommu_spec.np, iommu_spec.args); > - if ( rc ) > - return (rc == -ENODEV) ? 1 : rc; > + do { > + /* > + * According to the > Documentation/devicetree/bindings/pci/pci-iommu.txt > + * from Linux. > + */ > + rc = dt_map_id(np, PCI_BDF(pdev->bus, devfn), "iommu-map", > + "iommu-map-mask", &iommu_spec.np, iommu_spec.args); > + if ( rc ) > + return (rc == -ENODEV) ? 1 : rc; > > - rc = iommu_dt_xlate(dev, &iommu_spec, ops); > - if ( rc < 0 ) > - { > - iommu_fwspec_free(dev); > - return -EINVAL; > + rc = iommu_dt_xlate(dev, &iommu_spec, ops); > + if ( rc < 0 ) > + { > + iommu_fwspec_free(dev); > + return -EINVAL; > + } > + > + devfn += pdev->phantom_stride; > } > + while ( (devfn != pdev->devfn) && > + (PCI_SLOT(devfn) == PCI_SLOT(pdev->devfn)) ); > > return rc; > } > -- > 2.34.1 >
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |