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
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