mirror of
https://github.com/xen-project/xen.git
synced 2026-10-28 02:01:24 +01:00
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:
1 parent
7f661b7b40
commit
8d4d6abffe
1 file changed
+20
-13
@@ -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;
|
||||
}
|
||||
|
||||