diff options
author | Joerg Roedel <joerg.roedel@amd.com> | 2008-12-08 06:07:44 -0500 |
---|---|---|
committer | Joerg Roedel <joerg.roedel@amd.com> | 2009-01-03 08:11:55 -0500 |
commit | 684f2888847b896faafed87ce4733501d2cc283c (patch) | |
tree | 81ec9b19379b95536b61e98dca1ee4dc3c1596f6 /arch/x86 | |
parent | 98383fc301c6546af0f3a8a1d3cb8bf218f7e940 (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')
-rw-r--r-- | arch/x86/kernel/amd_iommu.c | 26 |
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 | ||
1660 | static 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 |