# HG changeset patch
# User Keir Fraser <keir.fraser@xxxxxxxxxx>
# Date 1216381612 -3600
# Node ID 066ac1adb70c50df4309815c4821283db830cabe
# Parent 27078831a864c38172587d9abd42b50f81fd6b58
amd iommu: support device add and remove for recent dom0 kernel
Signed-off-by: Wei Wang <wei.wang2@xxxxxxx>
---
xen/drivers/passthrough/amd/pci_amd_iommu.c | 38 ++++++++++++++++++++++++++++
1 files changed, 38 insertions(+)
diff -r 27078831a864 -r 066ac1adb70c xen/drivers/passthrough/amd/pci_amd_iommu.c
--- a/xen/drivers/passthrough/amd/pci_amd_iommu.c Fri Jul 18 12:44:58
2008 +0100
+++ b/xen/drivers/passthrough/amd/pci_amd_iommu.c Fri Jul 18 12:46:52
2008 +0100
@@ -620,11 +620,49 @@ static int amd_iommu_return_device(
static int amd_iommu_add_device(struct pci_dev *pdev)
{
+ struct amd_iommu *iommu;
+ u16 bdf;
+ if ( !pdev->domain )
+ return -EINVAL;
+
+ bdf = (pdev->bus << 8) | pdev->devfn;
+ iommu = (bdf < ivrs_bdf_entries) ?
+ find_iommu_for_device(pdev->bus, pdev->devfn) : NULL;
+
+ if ( !iommu )
+ {
+ amd_iov_error("Fail to find iommu."
+ " %x:%x.%x cannot be assigned to domain %d\n",
+ pdev->bus, PCI_SLOT(pdev->devfn),
+ PCI_FUNC(pdev->devfn), pdev->domain->domain_id);
+ return -ENODEV;
+ }
+
+ amd_iommu_setup_domain_device(pdev->domain, iommu, bdf);
return 0;
}
static int amd_iommu_remove_device(struct pci_dev *pdev)
{
+ struct amd_iommu *iommu;
+ u16 bdf;
+ if ( !pdev->domain )
+ return -EINVAL;
+
+ bdf = (pdev->bus << 8) | pdev->devfn;
+ iommu = (bdf < ivrs_bdf_entries) ?
+ find_iommu_for_device(pdev->bus, pdev->devfn) : NULL;
+
+ if ( !iommu )
+ {
+ amd_iov_error("Fail to find iommu."
+ " %x:%x.%x cannot be removed from domain %d\n",
+ pdev->bus, PCI_SLOT(pdev->devfn),
+ PCI_FUNC(pdev->devfn), pdev->domain->domain_id);
+ return -ENODEV;
+ }
+
+ amd_iommu_disable_domain_device(pdev->domain, iommu, bdf);
return 0;
}
_______________________________________________
Xen-changelog mailing list
Xen-changelog@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-changelog
|