aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--arch/x86/kernel/amd_iommu.c26
1 files changed, 26 insertions, 0 deletions
diff --git a/arch/x86/kernel/amd_iommu.c b/arch/x86/kernel/amd_iommu.c
index 891d713d9c96..ef9b309e8e09 100644
--- a/arch/x86/kernel/amd_iommu.c
+++ b/arch/x86/kernel/amd_iommu.c
@@ -1657,4 +1657,30 @@ static void amd_iommu_domain_destroy(struct iommu_domain *dom)
1657 dom->priv = NULL; 1657 dom->priv = NULL;
1658} 1658}
1659 1659
1660static void amd_iommu_detach_device(struct iommu_domain *dom,
1661 struct device *dev)
1662{
1663 struct protection_domain *domain = dom->priv;
1664 struct amd_iommu *iommu;
1665 struct pci_dev *pdev;
1666 u16 devid;
1667
1668 if (dev->bus != &pci_bus_type)
1669 return;
1670
1671 pdev = to_pci_dev(dev);
1672
1673 devid = calc_devid(pdev->bus->number, pdev->devfn);
1674
1675 if (devid > 0)
1676 detach_device(domain, devid);
1677
1678 iommu = amd_iommu_rlookup_table[devid];
1679 if (!iommu)
1680 return;
1681
1682 iommu_queue_inv_dev_entry(iommu, devid);
1683 iommu_completion_wait(iommu);
1684}
1685
1660#endif 1686#endif