diff --git a/xen/drivers/passthrough/vtd/extern.h b/xen/drivers/passthrough/vtd/extern.h index 8ca1f7ee78..6e1dc4fa25 100644 --- a/xen/drivers/passthrough/vtd/extern.h +++ b/xen/drivers/passthrough/vtd/extern.h @@ -99,7 +99,7 @@ void platform_quirks_init(void); void vtd_ops_preamble_quirk(struct iommu* iommu); void vtd_ops_postamble_quirk(struct iommu* iommu); void me_wifi_quirk(struct domain *domain, u8 bus, u8 devfn, int map); -void pci_vtd_quirk(struct pci_dev *pdev); +void pci_vtd_quirk(const struct pci_dev *); int platform_supports_intremap(void); int platform_supports_x2apic(void); diff --git a/xen/drivers/passthrough/vtd/iommu.c b/xen/drivers/passthrough/vtd/iommu.c index 9a9c1b4d5c..be6d324daf 100644 --- a/xen/drivers/passthrough/vtd/iommu.c +++ b/xen/drivers/passthrough/vtd/iommu.c @@ -1483,6 +1483,9 @@ static int domain_context_mapping( break; } + if ( !ret && devfn == pdev->devfn ) + pci_vtd_quirk(pdev); + return ret; } @@ -1922,6 +1925,8 @@ static int intel_iommu_enable_device(struct pci_dev *pdev) struct acpi_drhd_unit *drhd = acpi_find_matched_drhd_unit(pdev); int ret = drhd ? ats_device(pdev, drhd) : -ENODEV; + pci_vtd_quirk(pdev); + if ( ret <= 0 ) return ret; @@ -1994,12 +1999,7 @@ static int intel_iommu_remove_device(u8 devfn, struct pci_dev *pdev) static int __hwdom_init setup_hwdom_device(u8 devfn, struct pci_dev *pdev) { - int err; - - err = domain_context_mapping(pdev->domain, devfn, pdev); - if ( !err && devfn == pdev->devfn ) - pci_vtd_quirk(pdev); - return err; + return domain_context_mapping(pdev->domain, devfn, pdev); } void clear_fault_bits(struct iommu *iommu) diff --git a/xen/drivers/passthrough/vtd/quirks.c b/xen/drivers/passthrough/vtd/quirks.c index 56ffd6bf35..7cbe0ad8ec 100644 --- a/xen/drivers/passthrough/vtd/quirks.c +++ b/xen/drivers/passthrough/vtd/quirks.c @@ -385,7 +385,7 @@ void me_wifi_quirk(struct domain *domain, u8 bus, u8 devfn, int map) * - This can cause system failure upon non-fatal VT-d faults * - Potential security issue if malicious guest trigger VT-d faults */ -void __hwdom_init pci_vtd_quirk(struct pci_dev *pdev) +void pci_vtd_quirk(const struct pci_dev *pdev) { int seg = pdev->seg; int bus = pdev->bus;