diff options
author | Joerg Roedel <joerg.roedel@amd.com> | 2008-12-08 12:07:44 +0100 |
---|---|---|
committer | Joerg Roedel <joerg.roedel@amd.com> | 2009-01-03 14:11:55 +0100 |
commit | 684f2888847b896faafed87ce4733501d2cc283c (patch) | |
tree | 81ec9b19379b95536b61e98dca1ee4dc3c1596f6 /arch/x86/kernel/amd_iommu.c | |
parent | 98383fc301c6546af0f3a8a1d3cb8bf218f7e940 (diff) | |
download | lwn-684f2888847b896faafed87ce4733501d2cc283c.tar.gz lwn-684f2888847b896faafed87ce4733501d2cc283c.zip |
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.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) dom->priv = NULL; } +static void amd_iommu_detach_device(struct iommu_domain *dom, + struct device *dev) +{ + struct protection_domain *domain = dom->priv; + struct amd_iommu *iommu; + struct pci_dev *pdev; + u16 devid; + + if (dev->bus != &pci_bus_type) + return; + + pdev = to_pci_dev(dev); + + devid = calc_devid(pdev->bus->number, pdev->devfn); + + if (devid > 0) + detach_device(domain, devid); + + iommu = amd_iommu_rlookup_table[devid]; + if (!iommu) + return; + + iommu_queue_inv_dev_entry(iommu, devid); + iommu_completion_wait(iommu); +} + #endif |