aboutsummaryrefslogtreecommitdiffstats
path: root/virt/kvm/vtd.c
diff options
context:
space:
mode:
Diffstat (limited to 'virt/kvm/vtd.c')
-rw-r--r--virt/kvm/vtd.c24
1 files changed, 24 insertions, 0 deletions
diff --git a/virt/kvm/vtd.c b/virt/kvm/vtd.c
index 44bb58a395a5..174ea1f8cee5 100644
--- a/virt/kvm/vtd.c
+++ b/virt/kvm/vtd.c
@@ -116,6 +116,30 @@ int kvm_assign_device(struct kvm *kvm,
116 return 0; 116 return 0;
117} 117}
118 118
119int kvm_deassign_device(struct kvm *kvm,
120 struct kvm_assigned_dev_kernel *assigned_dev)
121{
122 struct dmar_domain *domain = kvm->arch.intel_iommu_domain;
123 struct pci_dev *pdev = NULL;
124
125 /* check if iommu exists and in use */
126 if (!domain)
127 return 0;
128
129 pdev = assigned_dev->dev;
130 if (pdev == NULL)
131 return -ENODEV;
132
133 intel_iommu_detach_device(domain, pdev);
134
135 printk(KERN_DEBUG "deassign device: host bdf = %x:%x:%x\n",
136 assigned_dev->host_busnr,
137 PCI_SLOT(assigned_dev->host_devfn),
138 PCI_FUNC(assigned_dev->host_devfn));
139
140 return 0;
141}
142
119int kvm_iommu_map_guest(struct kvm *kvm) 143int kvm_iommu_map_guest(struct kvm *kvm)
120{ 144{
121 int r; 145 int r;