lkml.org 
[lkml]   [2008]   [Dec]   [4]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 14/19] AMD IOMMU: add device detach function for IOMMU API
    Date
    Impact: add a generic function to detach devices from protection domains

    Signed-off-by: Joerg Roedel <joerg.roedel@amd.com>
    ---
    arch/x86/kernel/amd_iommu.c | 51 +++++++++++++++++++++++++++++++++++++++++++
    1 files changed, 51 insertions(+), 0 deletions(-)

    diff --git a/arch/x86/kernel/amd_iommu.c b/arch/x86/kernel/amd_iommu.c
    index fd42926..0ded6f4 100644
    --- a/arch/x86/kernel/amd_iommu.c
    +++ b/arch/x86/kernel/amd_iommu.c
    @@ -1529,3 +1529,54 @@ static void amd_iommu_domain_destroy(struct iommu_domain *dom)

    dom->priv = NULL;
    }
    +
    +static void __detach_device(struct protection_domain *domain, u16 devid)
    +{
    + unsigned long flags;
    +
    + /* lock domain and device table */
    + write_lock_irqsave(&amd_iommu_devtable_lock, flags);
    + spin_lock(&domain->lock);
    +
    + /* remove domain from the lookup table */
    + amd_iommu_pd_table[devid] = NULL;
    +
    + /* remove entry from the device table seen by the hardware */
    + amd_iommu_dev_table[devid].data[0] = IOMMU_PTE_P | IOMMU_PTE_TV;
    + amd_iommu_dev_table[devid].data[1] = 0;
    + amd_iommu_dev_table[devid].data[2] = 0;
    +
    + /* decrease reference counter */
    + domain->dev_cnt -= 1;
    +
    + /* ready */
    + spin_unlock(&domain->lock);
    + write_unlock_irqrestore(&amd_iommu_devtable_lock, flags);
    +}
    +
    +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);
    +}
    +
    --
    1.5.6.4



    \
     
     \ /
      Last update: 2008-12-04 19:13    [W:4.861 / U:0.000 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site