1
0
mirror of https://gitlab.com/libvirt/libvirt.git synced 2025-01-11 09:17:52 +03:00

conf: Introduce VIR_PCI_CONNECT_INTEGRATED

This new flag can be used to convince the PCI address assignment
algorithm to place a device directly on the root bus. It will be
used to implement support for virtio-iommu, which needs to be an
integrated device in order to work correctly.

Signed-off-by: Andrea Bolognani <abologna@redhat.com>
Reviewed-by: Ján Tomko <jtomko@redhat.com>
This commit is contained in:
Andrea Bolognani 2021-09-27 15:49:23 +02:00
parent b7f5ad4610
commit afd03c21e4
2 changed files with 32 additions and 11 deletions

View File

@ -303,6 +303,23 @@ virDomainPCIAddressFlagsCompatible(virPCIDeviceAddress *addr,
virErrorNumber errType = (fromConfig
? VIR_ERR_XML_ERROR : VIR_ERR_INTERNAL_ERROR);
if (devFlags & VIR_PCI_CONNECT_INTEGRATED) {
if (addr->bus == 0) {
/* pcie-root doesn't usually allow endpoint devices to be
* plugged directly into it, but for integrated devices
* that's exactly what we want */
busFlags |= VIR_PCI_CONNECT_AUTOASSIGN;
} else {
if (reportError) {
virReportError(errType,
_("The device at PCI address %s needs to be "
"an integrated device (bus=0)"),
addrStr);
}
return false;
}
}
if (fromConfig) {
/* If the requested connection was manually specified in
* config, allow a PCI device to connect to a PCIe slot, or

View File

@ -35,24 +35,28 @@ typedef enum {
VIR_PCI_CONNECT_AUTOASSIGN = 1 << 0, /* okay to autoassign a device to this controller */
VIR_PCI_CONNECT_HOTPLUGGABLE = 1 << 1, /* is hotplug needed/supported */
/* Set for devices that can only work as integrated devices (directly
* connected to pci.0 or pcie.0, with no additional buses in between) */
VIR_PCI_CONNECT_INTEGRATED = 1 << 2,
/* set for devices that can share a single slot in auto-assignment
* (by assigning one device to each of the 8 functions on the slot)
*/
VIR_PCI_CONNECT_AGGREGATE_SLOT = 1 << 2,
VIR_PCI_CONNECT_AGGREGATE_SLOT = 1 << 3,
/* kinds of devices as a bitmap so they can be combined (some PCI
* controllers permit connecting multiple types of devices)
*/
VIR_PCI_CONNECT_TYPE_PCI_DEVICE = 1 << 3,
VIR_PCI_CONNECT_TYPE_PCIE_DEVICE = 1 << 4,
VIR_PCI_CONNECT_TYPE_PCIE_ROOT_PORT = 1 << 5,
VIR_PCI_CONNECT_TYPE_PCIE_SWITCH_UPSTREAM_PORT = 1 << 6,
VIR_PCI_CONNECT_TYPE_PCIE_SWITCH_DOWNSTREAM_PORT = 1 << 7,
VIR_PCI_CONNECT_TYPE_DMI_TO_PCI_BRIDGE = 1 << 8,
VIR_PCI_CONNECT_TYPE_PCI_EXPANDER_BUS = 1 << 9,
VIR_PCI_CONNECT_TYPE_PCIE_EXPANDER_BUS = 1 << 10,
VIR_PCI_CONNECT_TYPE_PCI_BRIDGE = 1 << 11,
VIR_PCI_CONNECT_TYPE_PCIE_TO_PCI_BRIDGE = 1 << 12,
VIR_PCI_CONNECT_TYPE_PCI_DEVICE = 1 << 4,
VIR_PCI_CONNECT_TYPE_PCIE_DEVICE = 1 << 5,
VIR_PCI_CONNECT_TYPE_PCIE_ROOT_PORT = 1 << 6,
VIR_PCI_CONNECT_TYPE_PCIE_SWITCH_UPSTREAM_PORT = 1 << 7,
VIR_PCI_CONNECT_TYPE_PCIE_SWITCH_DOWNSTREAM_PORT = 1 << 8,
VIR_PCI_CONNECT_TYPE_DMI_TO_PCI_BRIDGE = 1 << 9,
VIR_PCI_CONNECT_TYPE_PCI_EXPANDER_BUS = 1 << 10,
VIR_PCI_CONNECT_TYPE_PCIE_EXPANDER_BUS = 1 << 11,
VIR_PCI_CONNECT_TYPE_PCI_BRIDGE = 1 << 12,
VIR_PCI_CONNECT_TYPE_PCIE_TO_PCI_BRIDGE = 1 << 13,
} virDomainPCIConnectFlags;
/* a combination of all bits that describe the type of connections