virDomainControllerDefPtr cont = def->controllers[i];
int idx = cont->idx;
virDevicePCIAddressPtr addr;
+ virDomainPCIControllerOptsPtr options;
if (cont->type != VIR_DOMAIN_CONTROLLER_TYPE_PCI)
continue;
addr = &cont->info.addr.pci;
+ options = &cont->opts.pciopts;
+
+ /* set defaults for any other auto-generated config
+ * options for this controller that haven't been
+ * specified in config.
+ */
+ switch ((virDomainControllerModelPCI)cont->model) {
+ case VIR_DOMAIN_CONTROLLER_MODEL_PCI_BRIDGE:
+ if (options->modelName == VIR_DOMAIN_CONTROLLER_PCI_MODEL_NAME_NONE)
+ options->modelName = VIR_DOMAIN_CONTROLLER_PCI_MODEL_NAME_PCI_BRIDGE;
+ break;
+ case VIR_DOMAIN_CONTROLLER_MODEL_DMI_TO_PCI_BRIDGE:
+ if (options->modelName == VIR_DOMAIN_CONTROLLER_PCI_MODEL_NAME_NONE)
+ options->modelName = VIR_DOMAIN_CONTROLLER_PCI_MODEL_NAME_I82801B11_BRIDGE;
+ break;
+ case VIR_DOMAIN_CONTROLLER_MODEL_PCI_ROOT:
+ case VIR_DOMAIN_CONTROLLER_MODEL_PCIE_ROOT:
+ case VIR_DOMAIN_CONTROLLER_MODEL_PCI_LAST:
+ break;
+ }
+
/* check if every PCI bridge controller's ID is greater than
* the bus it is placed onto
*/
{
virBuffer buf = VIR_BUFFER_INITIALIZER;
int model = def->model;
+ const char *modelName = NULL;
if (def->type == VIR_DOMAIN_CONTROLLER_TYPE_SCSI) {
if ((qemuSetSCSIControllerModel(domainDef, qemuCaps, &model)) < 0)
}
switch (def->model) {
case VIR_DOMAIN_CONTROLLER_MODEL_PCI_BRIDGE:
- virBufferAsprintf(&buf, "pci-bridge,chassis_nr=%d,id=%s",
- def->idx, def->info.alias);
+ if (def->opts.pciopts.modelName
+ == VIR_DOMAIN_CONTROLLER_PCI_MODEL_NAME_NONE) {
+ virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
+ _("autogenerated pci-bridge options not set"));
+ goto error;
+ }
+
+ modelName = virDomainControllerPCIModelNameTypeToString(def->opts.pciopts.modelName);
+ if (!modelName) {
+ virReportError(VIR_ERR_INTERNAL_ERROR,
+ _("unknown pci-bridge model name value %d"),
+ def->opts.pciopts.modelName);
+ goto error;
+ }
+ if (def->opts.pciopts.modelName
+ != VIR_DOMAIN_CONTROLLER_PCI_MODEL_NAME_PCI_BRIDGE) {
+ virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
+ _("PCI controller model name '%s' "
+ "is not valid for a pci-bridge"),
+ modelName);
+ goto error;
+ }
+ if (!virQEMUCapsGet(qemuCaps, QEMU_CAPS_DEVICE_PCI_BRIDGE)) {
+ virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
+ _("the pci-bridge controller "
+ "is not supported in this QEMU binary"));
+ goto error;
+ }
+ virBufferAsprintf(&buf, "%s,chassis_nr=%d,id=%s",
+ modelName, def->idx, def->info.alias);
break;
case VIR_DOMAIN_CONTROLLER_MODEL_DMI_TO_PCI_BRIDGE:
+ if (def->opts.pciopts.modelName
+ == VIR_DOMAIN_CONTROLLER_PCI_MODEL_NAME_NONE) {
+ virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
+ _("autogenerated dmi-to-pci-bridge options not set"));
+ goto error;
+ }
+
+ modelName = virDomainControllerPCIModelNameTypeToString(def->opts.pciopts.modelName);
+ if (!modelName) {
+ virReportError(VIR_ERR_INTERNAL_ERROR,
+ _("unknown dmi-to-pci-bridge model name value %d"),
+ def->opts.pciopts.modelName);
+ goto error;
+ }
+ if (def->opts.pciopts.modelName
+ != VIR_DOMAIN_CONTROLLER_PCI_MODEL_NAME_I82801B11_BRIDGE) {
+ virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
+ _("PCI controller model name '%s' "
+ "is not valid for a dmi-to-pci-bridge"),
+ modelName);
+ goto error;
+ }
if (!virQEMUCapsGet(qemuCaps, QEMU_CAPS_DEVICE_DMI_TO_PCI_BRIDGE)) {
virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
- _("The dmi-to-pci-bridge (i82801b11-bridge) "
+ _("the dmi-to-pci-bridge (i82801b11-bridge) "
"controller is not supported in this QEMU binary"));
goto error;
}
- virBufferAsprintf(&buf, "i82801b11-bridge,id=%s", def->info.alias);
+ virBufferAsprintf(&buf, "%s,id=%s", modelName, def->info.alias);
break;
}
break;