[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-devel] [PATCH for 4.6 08/13] 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 "struct device'. Therefore there is no need to add separate ops. Signed-off-by: Julien Grall <julien.grall@xxxxxxxxxx> CC: Suravee Suthikulpanit <suravee.suthikulpanit@xxxxxxx> CC: Aravind Gopalakrishnan <Aravind.Gopalakrishnan@xxxxxxx> CC: Jan Beulich <jbeulich@xxxxxxxx> CC: Yang Zhang <yang.z.zhang@xxxxxxxxx> CC: Kevin Tian <kevin.tian@xxxxxxxxx> --- xen/drivers/passthrough/amd/pci_amd_iommu.c | 14 +++++++++----- xen/drivers/passthrough/device_tree.c | 5 +++-- xen/drivers/passthrough/pci.c | 20 +++++++++++--------- xen/drivers/passthrough/vtd/iommu.c | 19 ++++++++++++------- xen/include/xen/iommu.h | 18 +++++++----------- 5 files changed, 42 insertions(+), 34 deletions(-) diff --git a/xen/drivers/passthrough/amd/pci_amd_iommu.c b/xen/drivers/passthrough/amd/pci_amd_iommu.c index e83bb35..0af13fb 100644 --- a/xen/drivers/passthrough/amd/pci_amd_iommu.c +++ b/xen/drivers/passthrough/amd/pci_amd_iommu.c @@ -355,8 +355,9 @@ void amd_iommu_disable_domain_device(struct domain *domain, } static int reassign_device(struct domain *source, struct domain *target, - u8 devfn, struct pci_dev *pdev) + u8 devfn, struct device *dev) { + struct pci_dev *pdev = dev_to_pci(dev); struct amd_iommu *iommu; int bdf; struct hvm_iommu *t = domain_hvm_iommu(target); @@ -394,8 +395,9 @@ static int reassign_device(struct domain *source, struct domain *target, } static int amd_iommu_assign_device(struct domain *d, u8 devfn, - struct pci_dev *pdev) + struct device *dev) { + struct pci_dev *pdev = dev_to_pci(dev); struct ivrs_mappings *ivrs_mappings = get_ivrs_mappings(pdev->seg); int bdf = PCI_BDF2(pdev->bus, devfn); int req_id = get_dma_requestor_id(pdev->seg, bdf); @@ -410,7 +412,7 @@ static int amd_iommu_assign_device(struct domain *d, u8 devfn, ivrs_mappings[req_id].read_permission); } - return reassign_device(hardware_domain, d, devfn, pdev); + return reassign_device(hardware_domain, d, devfn, dev); } static void deallocate_next_page_table(struct page_info *pg, int level) @@ -481,8 +483,9 @@ static void amd_iommu_domain_destroy(struct domain *d) amd_iommu_flush_all_pages(d); } -static int amd_iommu_add_device(u8 devfn, struct pci_dev *pdev) +static int amd_iommu_add_device(u8 devfn, struct device *dev) { + struct pci_dev *pdev = dev_to_pci(dev); struct amd_iommu *iommu; u16 bdf; if ( !pdev->domain ) @@ -503,8 +506,9 @@ static int amd_iommu_add_device(u8 devfn, struct pci_dev *pdev) return 0; } -static int amd_iommu_remove_device(u8 devfn, struct pci_dev *pdev) +static int amd_iommu_remove_device(u8 devfn, struct device *dev) { + struct pci_dev *pdev = dev_to_pci(dev); struct amd_iommu *iommu; u16 bdf; if ( !pdev->domain ) 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 9fbd2a2..43ce5dc 100644 --- a/xen/drivers/passthrough/pci.c +++ b/xen/drivers/passthrough/pci.c @@ -1256,7 +1256,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; @@ -1265,7 +1265,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); @@ -1286,7 +1286,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) @@ -1308,7 +1308,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; @@ -1317,7 +1317,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)); } /* @@ -1378,7 +1378,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 ) @@ -1386,7 +1386,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), @@ -1421,7 +1421,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; @@ -1431,7 +1432,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/drivers/passthrough/vtd/iommu.c b/xen/drivers/passthrough/vtd/iommu.c index 19d8165..213a471 100644 --- a/xen/drivers/passthrough/vtd/iommu.c +++ b/xen/drivers/passthrough/vtd/iommu.c @@ -1875,8 +1875,9 @@ static int rmrr_identity_mapping(struct domain *d, bool_t map, return 0; } -static int intel_iommu_add_device(u8 devfn, struct pci_dev *pdev) +static int intel_iommu_add_device(u8 devfn, struct device *dev) { + struct pci_dev *pdev = dev_to_pci(dev); struct acpi_rmrr_unit *rmrr; u16 bdf; int ret, i; @@ -1910,8 +1911,9 @@ static int intel_iommu_add_device(u8 devfn, struct pci_dev *pdev) return 0; } -static int intel_iommu_enable_device(struct pci_dev *pdev) +static int intel_iommu_enable_device(struct device *dev) { + struct pci_dev *pdev = dev_to_pci(dev); struct acpi_drhd_unit *drhd = acpi_find_matched_drhd_unit(pdev); int ret = drhd ? ats_device(pdev, drhd) : -ENODEV; @@ -1925,8 +1927,9 @@ static int intel_iommu_enable_device(struct pci_dev *pdev) return ret >= 0 ? 0 : ret; } -static int intel_iommu_remove_device(u8 devfn, struct pci_dev *pdev) +static int intel_iommu_remove_device(u8 devfn, struct device *dev) { + struct pci_dev *pdev = dev_to_pci(dev); struct acpi_rmrr_unit *rmrr; u16 bdf; int i; @@ -2212,8 +2215,9 @@ int __init intel_vtd_setup(void) static int reassign_device_ownership( struct domain *source, struct domain *target, - u8 devfn, struct pci_dev *pdev) + u8 devfn, struct device *dev) { + struct pci_dev *pdev = dev_to_pci(dev); int ret; /* @@ -2266,8 +2270,9 @@ static int reassign_device_ownership( } static int intel_iommu_assign_device( - struct domain *d, u8 devfn, struct pci_dev *pdev) + struct domain *d, u8 devfn, struct device *dev) { + struct pci_dev *pdev = dev_to_pci(dev); struct acpi_rmrr_unit *rmrr; int ret = 0, i; u16 bdf, seg; @@ -2276,7 +2281,7 @@ static int intel_iommu_assign_device( if ( list_empty(&acpi_drhd_units) ) return -ENODEV; - ret = reassign_device_ownership(hardware_domain, d, devfn, pdev); + ret = reassign_device_ownership(hardware_domain, d, devfn, dev); if ( ret ) return ret; @@ -2298,7 +2303,7 @@ static int intel_iommu_assign_device( ret = rmrr_identity_mapping(d, 1, rmrr); if ( ret ) { - reassign_device_ownership(d, hardware_domain, devfn, pdev); + reassign_device_ownership(d, hardware_domain, devfn, dev); printk(XENLOG_G_ERR VTDPREFIX " cannot map reserved region (%"PRIx64",%"PRIx64"] for Dom%d (%d)\n", rmrr->base_address, rmrr->end_address, diff --git a/xen/include/xen/iommu.h b/xen/include/xen/iommu.h index 8eb764a..d0f99ef 100644 --- a/xen/include/xen/iommu.h +++ b/xen/include/xen/iommu.h @@ -23,6 +23,7 @@ #include <xen/init.h> #include <xen/spinlock.h> #include <xen/pci.h> +#include <xen/device.h> #include <public/hvm/ioreq.h> #include <public/domctl.h> #include <asm/iommu.h> @@ -123,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, struct device *); + int (*enable_device)(struct device *dev); + int (*remove_device)(u8 devfn, struct device *); + int (*assign_device)(struct domain *, u8 devfn, struct device *); int (*reassign_device)(struct domain *s, struct domain *t, - u8 devfn, struct pci_dev *); + u8 devfn, struct device *); +#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.3 _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxx http://lists.xen.org/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |