qemuDomainCollectPCIAddress is renamed to virDomainCollectPCIAddress
and moved from qemu_domain_address.c to domain_addr.c
All these functions are being moved because they don't depend on
qemu, so they have the potential to be reused for more hypervisors.
---
src/conf/domain_addr.c | 141 +++++++++++++++++++++++++++++++++++++++
src/conf/domain_addr.h | 6 ++
src/libvirt_private.syms | 1 +
src/qemu/qemu_domain_address.c | 148 ++---------------------------------------
4 files changed, 152 insertions(+), 144 deletions(-)
diff --git a/src/conf/domain_addr.c b/src/conf/domain_addr.c
index 4b7fead..fcfd84a 100644
--- a/src/conf/domain_addr.c
+++ b/src/conf/domain_addr.c
@@ -1228,3 +1228,144 @@ virDomainAssignVirtioSerialAddresses(virDomainDefPtr def)
virDomainVirtioSerialAddrSetFree(addrs);
return ret;
}
+
+
+int
+virDomainCollectPCIAddress(virDomainDefPtr def ATTRIBUTE_UNUSED,
+ virDomainDeviceDefPtr device,
+ virDomainDeviceInfoPtr info,
+ void *opaque)
+{
+ virDomainPCIAddressSetPtr addrs = opaque;
+ int ret = -1;
+ virPCIDeviceAddressPtr addr = &info->addr.pci;
+ bool entireSlot;
+ /* flags may be changed from default below */
+ virDomainPCIConnectFlags flags = (VIR_PCI_CONNECT_HOTPLUGGABLE |
+ VIR_PCI_CONNECT_TYPE_PCI_DEVICE);
+
+ if (!virDeviceInfoPCIAddressPresent(info) ||
+ ((device->type == VIR_DOMAIN_DEVICE_HOSTDEV) &&
+ (device->data.hostdev->parent.type != VIR_DOMAIN_DEVICE_NONE))) {
+ /* If a hostdev has a parent, its info will be a part of the
+ * parent, and will have its address collected during the scan
+ * of the parent's device type.
+ */
+ return 0;
+ }
+
+ /* Change flags according to differing requirements of different
+ * devices.
+ */
+ switch (device->type) {
+ case VIR_DOMAIN_DEVICE_CONTROLLER:
+ switch (device->data.controller->type) {
+ case VIR_DOMAIN_CONTROLLER_TYPE_PCI:
+ flags =
virDomainPCIControllerModelToConnectType(device->data.controller->model);
+ break;
+
+ case VIR_DOMAIN_CONTROLLER_TYPE_SATA:
+ /* SATA controllers aren't hot-plugged, and can be put in
+ * either a PCI or PCIe slot
+ */
+ flags = (VIR_PCI_CONNECT_TYPE_PCI_DEVICE
+ | VIR_PCI_CONNECT_TYPE_PCIE_DEVICE);
+ break;
+
+ case VIR_DOMAIN_CONTROLLER_TYPE_USB:
+ /* allow UHCI and EHCI controllers to be manually placed on
+ * the PCIe bus (but don't put them there automatically)
+ */
+ switch (device->data.controller->model) {
+ case VIR_DOMAIN_CONTROLLER_MODEL_USB_EHCI:
+ case VIR_DOMAIN_CONTROLLER_MODEL_USB_ICH9_EHCI1:
+ case VIR_DOMAIN_CONTROLLER_MODEL_USB_ICH9_UHCI1:
+ case VIR_DOMAIN_CONTROLLER_MODEL_USB_ICH9_UHCI2:
+ case VIR_DOMAIN_CONTROLLER_MODEL_USB_ICH9_UHCI3:
+ case VIR_DOMAIN_CONTROLLER_MODEL_USB_VT82C686B_UHCI:
+ flags = VIR_PCI_CONNECT_TYPE_PCI_DEVICE;
+ break;
+ case VIR_DOMAIN_CONTROLLER_MODEL_USB_NEC_XHCI:
+ /* should this be PCIE-only? Or do we need to allow PCI
+ * for backward compatibility?
+ */
+ flags = (VIR_PCI_CONNECT_TYPE_PCI_DEVICE
+ | VIR_PCI_CONNECT_TYPE_PCIE_DEVICE);
+ break;
+ case VIR_DOMAIN_CONTROLLER_MODEL_USB_PCI_OHCI:
+ case VIR_DOMAIN_CONTROLLER_MODEL_USB_PIIX3_UHCI:
+ case VIR_DOMAIN_CONTROLLER_MODEL_USB_PIIX4_UHCI:
+ /* Allow these for PCI only */
+ break;
+ }
+ }
+ break;
+
+ case VIR_DOMAIN_DEVICE_SOUND:
+ switch (device->data.sound->model) {
+ case VIR_DOMAIN_SOUND_MODEL_ICH6:
+ case VIR_DOMAIN_SOUND_MODEL_ICH9:
+ flags = VIR_PCI_CONNECT_TYPE_PCI_DEVICE;
+ break;
+ }
+ break;
+
+ case VIR_DOMAIN_DEVICE_VIDEO:
+ /* video cards aren't hot-plugged, and can be put in either a
+ * PCI or PCIe slot
+ */
+ flags = (VIR_PCI_CONNECT_TYPE_PCI_DEVICE
+ | VIR_PCI_CONNECT_TYPE_PCIE_DEVICE);
+ break;
+ }
+
+ /* Ignore implicit controllers on slot 0:0:1.0:
+ * implicit IDE controller on 0:0:1.1 (no qemu command line)
+ * implicit USB controller on 0:0:1.2 (-usb)
+ *
+ * If the machine does have a PCI bus, they will get reserved
+ * in qemuDomainAssignDevicePCISlots().
+ */
+
+ /* These are the IDE and USB controllers in the PIIX3, hardcoded
+ * to bus 0 slot 1. They cannot be attached to a PCIe slot, only
+ * PCI.
+ */
+ if (device->type == VIR_DOMAIN_DEVICE_CONTROLLER && addr->domain == 0
&&
+ addr->bus == 0 && addr->slot == 1) {
+ virDomainControllerDefPtr cont = device->data.controller;
+
+ if ((cont->type == VIR_DOMAIN_CONTROLLER_TYPE_IDE && cont->idx == 0
&&
+ addr->function == 1) ||
+ (cont->type == VIR_DOMAIN_CONTROLLER_TYPE_USB && cont->idx == 0
&&
+ (cont->model == VIR_DOMAIN_CONTROLLER_MODEL_USB_PIIX3_UHCI ||
+ cont->model == -1) && addr->function == 2)) {
+ /* Note the check for nbuses > 0 - if there are no PCI
+ * buses, we skip this check. This is a quirk required for
+ * some machinetypes such as s390, which pretend to have a
+ * PCI bus for long enough to generate the "-usb" on the
+ * commandline, but that don't really care if a PCI bus
+ * actually exists. */
+ if (addrs->nbuses > 0 &&
+ !(addrs->buses[0].flags & VIR_PCI_CONNECT_TYPE_PCI_DEVICE)) {
+ virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
+ _("Bus 0 must be PCI for integrated PIIX3 "
+ "USB or IDE controllers"));
+ return -1;
+ } else {
+ return 0;
+ }
+ }
+ }
+
+ entireSlot = (addr->function == 0 &&
+ addr->multi != VIR_TRISTATE_SWITCH_ON);
+
+ if (virDomainPCIAddressReserveAddr(addrs, addr, flags,
+ entireSlot, true) < 0)
+ goto cleanup;
+
+ ret = 0;
+ cleanup:
+ return ret;
+}
diff --git a/src/conf/domain_addr.h b/src/conf/domain_addr.h
index 74ae3ab..273ec0d 100644
--- a/src/conf/domain_addr.h
+++ b/src/conf/domain_addr.h
@@ -232,4 +232,10 @@ int
virDomainAssignVirtioSerialAddresses(virDomainDefPtr def)
ATTRIBUTE_NONNULL(1);
+int
+virDomainCollectPCIAddress(virDomainDefPtr def,
+ virDomainDeviceDefPtr device,
+ virDomainDeviceInfoPtr info,
+ void *opaque);
+
#endif /* __DOMAIN_ADDR_H__ */
diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms
index e1bfce9..51b3a3f 100644
--- a/src/libvirt_private.syms
+++ b/src/libvirt_private.syms
@@ -91,6 +91,7 @@ virDomainCCWAddressAssign;
virDomainCCWAddressSetCreate;
virDomainCCWAddressSetFree;
virDomainCCWAddressValidate;
+virDomainCollectPCIAddress;
virDomainGetBlkioParametersAssignFromDef;
virDomainPCIAddressAsString;
virDomainPCIAddressBusSetModel;
diff --git a/src/qemu/qemu_domain_address.c b/src/qemu/qemu_domain_address.c
index b6a0b83..777aab5 100644
--- a/src/qemu/qemu_domain_address.c
+++ b/src/qemu/qemu_domain_address.c
@@ -360,146 +360,6 @@ qemuDomainAssignARMVirtioMMIOAddresses(virDomainDefPtr def,
}
-static int
-qemuDomainCollectPCIAddress(virDomainDefPtr def ATTRIBUTE_UNUSED,
- virDomainDeviceDefPtr device,
- virDomainDeviceInfoPtr info,
- void *opaque)
-{
- virDomainPCIAddressSetPtr addrs = opaque;
- int ret = -1;
- virPCIDeviceAddressPtr addr = &info->addr.pci;
- bool entireSlot;
- /* flags may be changed from default below */
- virDomainPCIConnectFlags flags = (VIR_PCI_CONNECT_HOTPLUGGABLE |
- VIR_PCI_CONNECT_TYPE_PCI_DEVICE);
-
- if (!virDeviceInfoPCIAddressPresent(info) ||
- ((device->type == VIR_DOMAIN_DEVICE_HOSTDEV) &&
- (device->data.hostdev->parent.type != VIR_DOMAIN_DEVICE_NONE))) {
- /* If a hostdev has a parent, its info will be a part of the
- * parent, and will have its address collected during the scan
- * of the parent's device type.
- */
- return 0;
- }
-
- /* Change flags according to differing requirements of different
- * devices.
- */
- switch (device->type) {
- case VIR_DOMAIN_DEVICE_CONTROLLER:
- switch (device->data.controller->type) {
- case VIR_DOMAIN_CONTROLLER_TYPE_PCI:
- flags =
virDomainPCIControllerModelToConnectType(device->data.controller->model);
- break;
-
- case VIR_DOMAIN_CONTROLLER_TYPE_SATA:
- /* SATA controllers aren't hot-plugged, and can be put in
- * either a PCI or PCIe slot
- */
- flags = (VIR_PCI_CONNECT_TYPE_PCI_DEVICE
- | VIR_PCI_CONNECT_TYPE_PCIE_DEVICE);
- break;
-
- case VIR_DOMAIN_CONTROLLER_TYPE_USB:
- /* allow UHCI and EHCI controllers to be manually placed on
- * the PCIe bus (but don't put them there automatically)
- */
- switch (device->data.controller->model) {
- case VIR_DOMAIN_CONTROLLER_MODEL_USB_EHCI:
- case VIR_DOMAIN_CONTROLLER_MODEL_USB_ICH9_EHCI1:
- case VIR_DOMAIN_CONTROLLER_MODEL_USB_ICH9_UHCI1:
- case VIR_DOMAIN_CONTROLLER_MODEL_USB_ICH9_UHCI2:
- case VIR_DOMAIN_CONTROLLER_MODEL_USB_ICH9_UHCI3:
- case VIR_DOMAIN_CONTROLLER_MODEL_USB_VT82C686B_UHCI:
- flags = VIR_PCI_CONNECT_TYPE_PCI_DEVICE;
- break;
- case VIR_DOMAIN_CONTROLLER_MODEL_USB_NEC_XHCI:
- /* should this be PCIE-only? Or do we need to allow PCI
- * for backward compatibility?
- */
- flags = (VIR_PCI_CONNECT_TYPE_PCI_DEVICE
- | VIR_PCI_CONNECT_TYPE_PCIE_DEVICE);
- break;
- case VIR_DOMAIN_CONTROLLER_MODEL_USB_PCI_OHCI:
- case VIR_DOMAIN_CONTROLLER_MODEL_USB_PIIX3_UHCI:
- case VIR_DOMAIN_CONTROLLER_MODEL_USB_PIIX4_UHCI:
- /* Allow these for PCI only */
- break;
- }
- }
- break;
-
- case VIR_DOMAIN_DEVICE_SOUND:
- switch (device->data.sound->model) {
- case VIR_DOMAIN_SOUND_MODEL_ICH6:
- case VIR_DOMAIN_SOUND_MODEL_ICH9:
- flags = VIR_PCI_CONNECT_TYPE_PCI_DEVICE;
- break;
- }
- break;
-
- case VIR_DOMAIN_DEVICE_VIDEO:
- /* video cards aren't hot-plugged, and can be put in either a
- * PCI or PCIe slot
- */
- flags = (VIR_PCI_CONNECT_TYPE_PCI_DEVICE
- | VIR_PCI_CONNECT_TYPE_PCIE_DEVICE);
- break;
- }
-
- /* Ignore implicit controllers on slot 0:0:1.0:
- * implicit IDE controller on 0:0:1.1 (no qemu command line)
- * implicit USB controller on 0:0:1.2 (-usb)
- *
- * If the machine does have a PCI bus, they will get reserved
- * in qemuDomainAssignDevicePCISlots().
- */
-
- /* These are the IDE and USB controllers in the PIIX3, hardcoded
- * to bus 0 slot 1. They cannot be attached to a PCIe slot, only
- * PCI.
- */
- if (device->type == VIR_DOMAIN_DEVICE_CONTROLLER && addr->domain == 0
&&
- addr->bus == 0 && addr->slot == 1) {
- virDomainControllerDefPtr cont = device->data.controller;
-
- if ((cont->type == VIR_DOMAIN_CONTROLLER_TYPE_IDE && cont->idx == 0
&&
- addr->function == 1) ||
- (cont->type == VIR_DOMAIN_CONTROLLER_TYPE_USB && cont->idx == 0
&&
- (cont->model == VIR_DOMAIN_CONTROLLER_MODEL_USB_PIIX3_UHCI ||
- cont->model == -1) && addr->function == 2)) {
- /* Note the check for nbuses > 0 - if there are no PCI
- * buses, we skip this check. This is a quirk required for
- * some machinetypes such as s390, which pretend to have a
- * PCI bus for long enough to generate the "-usb" on the
- * commandline, but that don't really care if a PCI bus
- * actually exists. */
- if (addrs->nbuses > 0 &&
- !(addrs->buses[0].flags & VIR_PCI_CONNECT_TYPE_PCI_DEVICE)) {
- virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
- _("Bus 0 must be PCI for integrated PIIX3 "
- "USB or IDE controllers"));
- return -1;
- } else {
- return 0;
- }
- }
- }
-
- entireSlot = (addr->function == 0 &&
- addr->multi != VIR_TRISTATE_SWITCH_ON);
-
- if (virDomainPCIAddressReserveAddr(addrs, addr, flags,
- entireSlot, true) < 0)
- goto cleanup;
-
- ret = 0;
- cleanup:
- return ret;
-}
-
static virDomainPCIAddressSetPtr
qemuDomainPCIAddressSetCreate(virDomainDefPtr def,
unsigned int nbuses,
@@ -547,7 +407,7 @@ qemuDomainPCIAddressSetCreate(virDomainDefPtr def,
goto error;
}
- if (virDomainDeviceInfoIterate(def, qemuDomainCollectPCIAddress, addrs) < 0)
+ if (virDomainDeviceInfoIterate(def, virDomainCollectPCIAddress, addrs) < 0)
goto error;
return addrs;
@@ -669,7 +529,7 @@ qemuDomainValidateDevicePCISlotsPIIX3(virDomainDefPtr def,
_("Primary video card must have PCI address
0:0:2.0"));
goto cleanup;
}
- /* If TYPE == PCI, then qemuDomainCollectPCIAddress() function
+ /* If TYPE == PCI, then virDomainCollectPCIAddress() function
* has already reserved the address, so we must skip */
}
} else if (addrs->nbuses && !videoPrimaryEnabled) {
@@ -859,7 +719,7 @@ qemuDomainValidateDevicePCISlotsQ35(virDomainDefPtr def,
_("Primary video card must have PCI address
0:0:1.0"));
goto cleanup;
}
- /* If TYPE == PCI, then qemuDomainCollectPCIAddress() function
+ /* If TYPE == PCI, then virDomainCollectPCIAddress() function
* has already reserved the address, so we must skip */
}
} else if (addrs->nbuses && !videoPrimaryEnabled) {
@@ -945,7 +805,7 @@ qemuDomainPCIBusFullyReserved(virDomainPCIAddressBusPtr bus)
* - Watchdog
* - pci serial devices
*
- * Prior to this function being invoked, qemuDomainCollectPCIAddress() will have
+ * Prior to this function being invoked, virDomainCollectPCIAddress() will have
* added all existing PCI addresses from the 'def' to 'addrs'. Thus this
* function must only try to reserve addresses if info.type == NONE and
* skip over info.type == PCI
--
2.7.4 (Apple Git-66)