[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Xen-devel] [PATCH v2 07/12] xen/iommu: Consolidate device assignment ops into a single set



On Fri, 16 Jan 2015, Julien Grall wrote:
> On ARM, the way to assign device tree node is exactly the same as PCI.
> Futhermore, all devices can be represented by a 'device_t'.
> Therefore there is no need to add separate ops.
> 
> The x86 iommu drivers has not been modified to replace 'struct pci_dev'
> by "device_t" because the latter is an alias of the former.
> 
> Signed-off-by: Julien Grall <julien.grall@xxxxxxxxxx>
> CC: Jan Beulich <jbeulich@xxxxxxxx>
> 
Acked-by: Stefano Stabellini <stefano.stabellini@xxxxxxxxxxxxx>


>     Changes in v2:
>         - Use the newly type device_t
>         - It's not neccessary to modify the x86 iommu drivers
> ---
>  xen/drivers/passthrough/device_tree.c |  5 +++--
>  xen/drivers/passthrough/pci.c         | 20 +++++++++++---------
>  xen/include/xen/iommu.h               | 17 ++++++-----------
>  3 files changed, 20 insertions(+), 22 deletions(-)
> 
> diff --git a/xen/drivers/passthrough/device_tree.c 
> b/xen/drivers/passthrough/device_tree.c
> index 3e47df5..377d41d 100644
> --- a/xen/drivers/passthrough/device_tree.c
> +++ b/xen/drivers/passthrough/device_tree.c
> @@ -41,7 +41,7 @@ int iommu_assign_dt_device(struct domain *d, struct 
> dt_device_node *dev)
>      if ( !list_empty(&dev->domain_list) )
>          goto fail;
>  
> -    rc = hd->platform_ops->assign_dt_device(d, dev);
> +    rc = hd->platform_ops->assign_device(d, 0, dt_to_dev(dev));
>  
>      if ( rc )
>          goto fail;
> @@ -68,7 +68,8 @@ int iommu_deassign_dt_device(struct domain *d, struct 
> dt_device_node *dev)
>  
>      spin_lock(&dtdevs_lock);
>  
> -    rc = hd->platform_ops->reassign_dt_device(d, hardware_domain, dev);
> +    rc = hd->platform_ops->reassign_device(d, hardware_domain,
> +                                           0, dt_to_dev(dev));
>      if ( rc )
>          goto fail;
>  
> diff --git a/xen/drivers/passthrough/pci.c b/xen/drivers/passthrough/pci.c
> index 78c6977..71415d1 100644
> --- a/xen/drivers/passthrough/pci.c
> +++ b/xen/drivers/passthrough/pci.c
> @@ -1254,7 +1254,7 @@ int iommu_add_device(struct pci_dev *pdev)
>      if ( !iommu_enabled || !hd->platform_ops )
>          return 0;
>  
> -    rc = hd->platform_ops->add_device(pdev->devfn, pdev);
> +    rc = hd->platform_ops->add_device(pdev->devfn, pci_to_dev(pdev));
>      if ( rc || !pdev->phantom_stride )
>          return rc;
>  
> @@ -1263,7 +1263,7 @@ int iommu_add_device(struct pci_dev *pdev)
>          devfn += pdev->phantom_stride;
>          if ( PCI_SLOT(devfn) != PCI_SLOT(pdev->devfn) )
>              return 0;
> -        rc = hd->platform_ops->add_device(devfn, pdev);
> +        rc = hd->platform_ops->add_device(devfn, pci_to_dev(pdev));
>          if ( rc )
>              printk(XENLOG_WARNING "IOMMU: add %04x:%02x:%02x.%u failed 
> (%d)\n",
>                     pdev->seg, pdev->bus, PCI_SLOT(devfn), PCI_FUNC(devfn), 
> rc);
> @@ -1284,7 +1284,7 @@ int iommu_enable_device(struct pci_dev *pdev)
>           !hd->platform_ops->enable_device )
>          return 0;
>  
> -    return hd->platform_ops->enable_device(pdev);
> +    return hd->platform_ops->enable_device(pci_to_dev(pdev));
>  }
>  
>  int iommu_remove_device(struct pci_dev *pdev)
> @@ -1306,7 +1306,7 @@ int iommu_remove_device(struct pci_dev *pdev)
>          devfn += pdev->phantom_stride;
>          if ( PCI_SLOT(devfn) != PCI_SLOT(pdev->devfn) )
>              break;
> -        rc = hd->platform_ops->remove_device(devfn, pdev);
> +        rc = hd->platform_ops->remove_device(devfn, pci_to_dev(pdev));
>          if ( !rc )
>              continue;
>  
> @@ -1315,7 +1315,7 @@ int iommu_remove_device(struct pci_dev *pdev)
>          return rc;
>      }
>  
> -    return hd->platform_ops->remove_device(pdev->devfn, pdev);
> +    return hd->platform_ops->remove_device(pdev->devfn, pci_to_dev(pdev));
>  }
>  
>  /*
> @@ -1376,7 +1376,7 @@ static int assign_device(struct domain *d, u16 seg, u8 
> bus, u8 devfn)
>  
>      pdev->fault.count = 0;
>  
> -    if ( (rc = hd->platform_ops->assign_device(d, devfn, pdev)) )
> +    if ( (rc = hd->platform_ops->assign_device(d, devfn, pci_to_dev(pdev))) )
>          goto done;
>  
>      for ( ; pdev->phantom_stride; rc = 0 )
> @@ -1384,7 +1384,7 @@ static int assign_device(struct domain *d, u16 seg, u8 
> bus, u8 devfn)
>          devfn += pdev->phantom_stride;
>          if ( PCI_SLOT(devfn) != PCI_SLOT(pdev->devfn) )
>              break;
> -        rc = hd->platform_ops->assign_device(d, devfn, pdev);
> +        rc = hd->platform_ops->assign_device(d, devfn, pci_to_dev(pdev));
>          if ( rc )
>              printk(XENLOG_G_WARNING "d%d: assign %04x:%02x:%02x.%u failed 
> (%d)\n",
>                     d->domain_id, seg, bus, PCI_SLOT(devfn), PCI_FUNC(devfn),
> @@ -1419,7 +1419,8 @@ int deassign_device(struct domain *d, u16 seg, u8 bus, 
> u8 devfn)
>          devfn += pdev->phantom_stride;
>          if ( PCI_SLOT(devfn) != PCI_SLOT(pdev->devfn) )
>              break;
> -        ret = hd->platform_ops->reassign_device(d, hardware_domain, devfn, 
> pdev);
> +        ret = hd->platform_ops->reassign_device(d, hardware_domain, devfn,
> +                                                pci_to_dev(pdev));
>          if ( !ret )
>              continue;
>  
> @@ -1429,7 +1430,8 @@ int deassign_device(struct domain *d, u16 seg, u8 bus, 
> u8 devfn)
>      }
>  
>      devfn = pdev->devfn;
> -    ret = hd->platform_ops->reassign_device(d, hardware_domain, devfn, pdev);
> +    ret = hd->platform_ops->reassign_device(d, hardware_domain, devfn,
> +                                            pci_to_dev(pdev));
>      if ( ret )
>      {
>          dprintk(XENLOG_G_ERR,
> diff --git a/xen/include/xen/iommu.h b/xen/include/xen/iommu.h
> index ecb2627..bf4aff0 100644
> --- a/xen/include/xen/iommu.h
> +++ b/xen/include/xen/iommu.h
> @@ -124,22 +124,17 @@ struct page_info;
>  struct iommu_ops {
>      int (*init)(struct domain *d);
>      void (*hwdom_init)(struct domain *d);
> -#ifdef HAS_PCI
> -    int (*add_device)(u8 devfn, struct pci_dev *);
> -    int (*enable_device)(struct pci_dev *pdev);
> -    int (*remove_device)(u8 devfn, struct pci_dev *);
> -    int (*assign_device)(struct domain *, u8 devfn, struct pci_dev *);
> +    int (*add_device)(u8 devfn, device_t *dev);
> +    int (*enable_device)(device_t *dev);
> +    int (*remove_device)(u8 devfn, device_t *dev);
> +    int (*assign_device)(struct domain *, u8 devfn, device_t *dev);
>      int (*reassign_device)(struct domain *s, struct domain *t,
> -                        u8 devfn, struct pci_dev *);
> +                           u8 devfn, device_t *dev);
> +#ifdef HAS_PCI
>      int (*get_device_group_id)(u16 seg, u8 bus, u8 devfn);
>      int (*update_ire_from_msi)(struct msi_desc *msi_desc, struct msi_msg 
> *msg);
>      void (*read_msi_from_ire)(struct msi_desc *msi_desc, struct msi_msg 
> *msg);
>  #endif /* HAS_PCI */
> -#ifdef HAS_DEVICE_TREE
> -    int (*assign_dt_device)(struct domain *d, const struct dt_device_node 
> *dev);
> -    int (*reassign_dt_device)(struct domain *s, struct domain *t,
> -                              const struct dt_device_node *dev);
> -#endif
>  
>      void (*teardown)(struct domain *d);
>      int (*map_page)(struct domain *d, unsigned long gfn, unsigned long mfn,
> -- 
> 2.1.4
> 

_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxx
http://lists.xen.org/xen-devel


 


Rackspace

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