aboutsummaryrefslogtreecommitdiffstats
path: root/arch/x86/kernel/amd_iommu.c
diff options
context:
space:
mode:
authorJoerg Roedel <joerg.roedel@amd.com>2008-12-08 06:07:44 -0500
committerJoerg Roedel <joerg.roedel@amd.com>2009-01-03 08:11:55 -0500
commit684f2888847b896faafed87ce4733501d2cc283c (patch)
tree81ec9b19379b95536b61e98dca1ee4dc3c1596f6 /arch/x86/kernel/amd_iommu.c
parent98383fc301c6546af0f3a8a1d3cb8bf218f7e940 (diff)
AMD IOMMU: add device detach function for IOMMU API
Impact: add a generic function to detach devices from protection domains Signed-off-by: Joerg Roedel <joerg.roedel@amd.com>
Diffstat (limited to 'arch/x86/kernel/amd_iommu.c')
-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