Commit 6a7601b4 authored by Julien Grall's avatar Julien Grall Committed by Ian Campbell

xen/iommu: Consolidate device assignment ops into a single set

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: default avatarJulien Grall <julien.grall@linaro.org>
Acked-by: default avatarJan Beulich <jbeulich@suse.com>
Acked-by: Stefano Stabellini <stefano.stabellini@eu.citrix.com>\
Acked-by: default avatarIan Campbell <ian.campbell@citrix.com>
parent 6c5d3075
......@@ -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;
......
......@@ -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));
}
/*
......@@ -1383,7 +1383,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 )
......@@ -1391,7 +1391,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),
......@@ -1426,7 +1426,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;
......@@ -1436,7 +1437,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,
......
......@@ -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,
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment