iommu/arm: iommu_add_dt_pci_sideband_ids phantom handling

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@amd.com>
Reviewed-by: Stefano Stabellini <sstabellini@kernel.org>
This commit is contained in:
Stewart Hildebrand authored and Stefano Stabellini committed 2025-07-03 14:45:45 -07:00
1 parent 7f661b7b40
commit 8d4d6abffe
1 file changed
+20 -13
+20 -13
View File
@@ -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;
}
Reference in new issue
Block a user
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.