vmm/amd: add ivhd device with a higher order

ivhd should attach after the root PCI bus and, thus, after the ACPI
Host-PCI bridge off which the bus hangs.  This is because ivhd changes
PCI configuration of a PCI IOMMU device that is located on the root bus.
If the bus attaches after ivhd it clears the MSI portion of the
configuration.  As a result IOMMU event interrupts would never be
delivered.

For regular ACPI devices the order is calculated as
    ACPI_DEV_BASE_ORDER + level * 10
where level is a depth of the device in the ACPI namespace.
I expect the depth of the Host-PCI bridge to be two or three,
so ACPI_DEV_BASE_ORDER + 10 * 10 should be a sufficiently safe order
for ivhd.

This should fix the setup of the AMD-Vi event interrupt when vmm is
preloaded (as opposed to kldload-ed).
This commit is contained in:
Andriy Gapon 2017-12-04 17:08:03 +00:00
parent 8f09494d1e
commit df92c28d6a

View File

@ -324,7 +324,13 @@ ivhd_identify(driver_t *driver, device_t parent)
continue;
}
ivhd_devs[i] = BUS_ADD_CHILD(parent, 1, "ivhd", i);
/*
* Use a high order to ensure that this driver is probed after
* the Host-PCI bridge and the root PCI bus.
*/
ivhd_devs[i] = BUS_ADD_CHILD(parent,
ACPI_DEV_BASE_ORDER + 10 * 10, "ivhd", i);
/*
* XXX: In case device was not destroyed before, add will fail.
* locate the old device instance.