summaryrefslogtreecommitdiff
path: root/sys/amd64
diff options
context:
space:
mode:
authorJohn Baldwin <jhb@FreeBSD.org>2017-10-27 14:57:14 +0000
committerJohn Baldwin <jhb@FreeBSD.org>2017-10-27 14:57:14 +0000
commit6db55a0f3a02bdfd516698f1a355b8e4260040a3 (patch)
treed02c2b8c448a2d4b2cd0a8c14346487223b53436 /sys/amd64
parent1c05a6ea6b849ff95e539c31adea887c644a6a01 (diff)
downloadsrc-test2-6db55a0f3a02bdfd516698f1a355b8e4260040a3.tar.gz
src-test2-6db55a0f3a02bdfd516698f1a355b8e4260040a3.zip
Notes
Diffstat (limited to 'sys/amd64')
-rw-r--r--sys/amd64/vmm/io/iommu.c12
-rw-r--r--sys/amd64/vmm/io/ppt.c5
2 files changed, 14 insertions, 3 deletions
diff --git a/sys/amd64/vmm/io/iommu.c b/sys/amd64/vmm/io/iommu.c
index 75cf1ecceecc..d1772094333a 100644
--- a/sys/amd64/vmm/io/iommu.c
+++ b/sys/amd64/vmm/io/iommu.c
@@ -174,6 +174,7 @@ iommu_init(void)
{
int error, bus, slot, func;
vm_paddr_t maxaddr;
+ devclass_t dc;
device_t dev;
if (!iommu_enable)
@@ -214,6 +215,7 @@ iommu_init(void)
add_tag = EVENTHANDLER_REGISTER(pci_add_device, iommu_pci_add, NULL, 0);
delete_tag = EVENTHANDLER_REGISTER(pci_delete_device, iommu_pci_delete,
NULL, 0);
+ dc = devclass_find("ppt");
for (bus = 0; bus <= PCI_BUSMAX; bus++) {
for (slot = 0; slot <= PCI_SLOTMAX; slot++) {
for (func = 0; func <= PCI_FUNCMAX; func++) {
@@ -221,7 +223,15 @@ iommu_init(void)
if (dev == NULL)
continue;
- /* Everything belongs to the host domain. */
+ /* Skip passthrough devices. */
+ if (dc != NULL &&
+ device_get_devclass(dev) == dc)
+ continue;
+
+ /*
+ * Everything else belongs to the host
+ * domain.
+ */
iommu_add_device(host_domain,
pci_get_rid(dev));
}
diff --git a/sys/amd64/vmm/io/ppt.c b/sys/amd64/vmm/io/ppt.c
index 4c9ff474580f..b306508e18ad 100644
--- a/sys/amd64/vmm/io/ppt.c
+++ b/sys/amd64/vmm/io/ppt.c
@@ -154,6 +154,7 @@ ppt_attach(device_t dev)
ppt = device_get_softc(dev);
+ iommu_remove_device(iommu_host_domain(), pci_get_rid(dev));
num_pptdevs++;
TAILQ_INSERT_TAIL(&pptdev_list, ppt, next);
ppt->dev = dev;
@@ -175,6 +176,8 @@ ppt_detach(device_t dev)
return (EBUSY);
num_pptdevs--;
TAILQ_REMOVE(&pptdev_list, ppt, next);
+ pci_disable_busmaster(dev);
+ iommu_add_device(iommu_host_domain(), pci_get_rid(dev));
return (0);
}
@@ -368,7 +371,6 @@ ppt_assign_device(struct vm *vm, int bus, int slot, int func)
true);
pci_restore_state(ppt->dev);
ppt->vm = vm;
- iommu_remove_device(iommu_host_domain(), pci_get_rid(ppt->dev));
iommu_add_device(vm_iommu_domain(vm), pci_get_rid(ppt->dev));
return (0);
}
@@ -397,7 +399,6 @@ ppt_unassign_device(struct vm *vm, int bus, int slot, int func)
ppt_teardown_msi(ppt);
ppt_teardown_msix(ppt);
iommu_remove_device(vm_iommu_domain(vm), pci_get_rid(ppt->dev));
- iommu_add_device(iommu_host_domain(), pci_get_rid(ppt->dev));
ppt->vm = NULL;
return (0);
}