[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
> 



 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.