starting the guest or hot-plugging the device and
``virNodeDeviceReAttach`` (or ``virsh nodedev-reattach``) after hot-unplug
or stopping the guest.
+ :since:`Since 10.3.0` an optional ``display`` attribute may be used to
+ enable using a vgpu device as a display device for the guest. Supported
+ values are either ``on`` or ``off`` (default). There is also an optional
+ ``ramfb`` attribute with values of either ``on`` or ``off`` (default).
+ When enabled, the ``ramfb`` attribute provides a memory framebuffer device
+ to the guest. This framebuffer allows the vgpu to be used as a boot display
+ before the gpu driver is loaded within the guest. ``ramfb`` requires the
+ ``display`` attribute to be set to ``on``.
``scsi``
For SCSI devices, user is responsible to make sure the device is not used
by host. If supported by the hypervisor and OS, the optional ``sgio`` (
VIR_XML_PROP_NONE,
&mdevsrc->ramfb) < 0)
return -1;
+ } else if (def->source.subsys.type == VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_PCI) {
+ if (virXMLPropTristateSwitch(node, "display",
+ VIR_XML_PROP_NONE,
+ &pcisrc->display) < 0)
+ return -1;
+
+ if (virXMLPropTristateSwitch(node, "ramfb",
+ VIR_XML_PROP_NONE,
+ &pcisrc->ramfb) < 0)
+ return -1;
}
switch (def->source.subsys.type) {
const char *mode = virDomainHostdevModeTypeToString(def->mode);
virDomainHostdevSubsysSCSI *scsisrc = &def->source.subsys.u.scsi;
virDomainHostdevSubsysMediatedDev *mdevsrc = &def->source.subsys.u.mdev;
+ virDomainHostdevSubsysPCI *pcisrc = &def->source.subsys.u.pci;
virDomainHostdevSubsysSCSIVHost *scsihostsrc = &def->source.subsys.u.scsi_host;
const char *type;
virBufferAsprintf(buf, " ramfb='%s'",
virTristateSwitchTypeToString(mdevsrc->ramfb));
}
-
+ if (def->source.subsys.type == VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_PCI) {
+ if (pcisrc->display != VIR_TRISTATE_SWITCH_ABSENT)
+ virBufferAsprintf(buf, " display='%s'",
+ virTristateSwitchTypeToString(pcisrc->display));
+ if (pcisrc->ramfb != VIR_TRISTATE_SWITCH_ABSENT)
+ virBufferAsprintf(buf, " ramfb='%s'",
+ virTristateSwitchTypeToString(pcisrc->ramfb));
+ }
}
virBufferAddLit(buf, ">\n");
virBufferAdjustIndent(buf, 2);
struct _virDomainHostdevSubsysPCI {
virPCIDeviceAddress addr; /* host address */
virDeviceHostdevPCIDriverInfo driver;
+ virTristateSwitch display;
+ virTristateSwitch ramfb;
virBitmap *origstates;
};
}
}
- if (dev->mode == VIR_DOMAIN_HOSTDEV_MODE_SUBSYS &&
- dev->source.subsys.type == VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_MDEV &&
- dev->source.subsys.u.mdev.ramfb == VIR_TRISTATE_SWITCH_ON) {
- if (ramfbEnabled) {
- virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
- _("Only one vgpu device can have 'ramfb' enabled"));
- return -1;
+ if (dev->mode == VIR_DOMAIN_HOSTDEV_MODE_SUBSYS) {
+ virTristateSwitch *ramfbsetting = NULL;
+ if (dev->source.subsys.type == VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_MDEV)
+ ramfbsetting = &dev->source.subsys.u.mdev.ramfb;
+ else if (dev->source.subsys.type == VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_PCI)
+ ramfbsetting = &dev->source.subsys.u.pci.ramfb;
+ if (ramfbsetting && *ramfbsetting == VIR_TRISTATE_SWITCH_ON) {
+ if (ramfbEnabled) {
+ virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
+ _("Only one vgpu device can have 'ramfb' enabled"));
+ return -1;
+ }
+ ramfbEnabled = true;
}
- ramfbEnabled = true;
}
}
<ref name="pciaddress"/>
</element>
</element>
+ <ref name="hostdevsubsysvfiodisplay"/>
</interleave>
</define>
</element>
</define>
+ <define name="hostdevsubsysvfiodisplay">
+ <optional>
+ <attribute name="ramfb">
+ <ref name="virOnOff"/>
+ </attribute>
+ </optional>
+ <optional>
+ <attribute name="display">
+ <ref name="virOnOff"/>
+ </attribute>
+ </optional>
+ </define>
+
<define name="hostdevsubsysmdev">
<attribute name="type">
<value>mdev</value>
<value>vfio-ap</value>
</choice>
</attribute>
- <optional>
- <attribute name="ramfb">
- <ref name="virOnOff"/>
- </attribute>
- </optional>
- <optional>
- <attribute name="display">
- <ref name="virOnOff"/>
- </attribute>
- </optional>
+ <ref name="hostdevsubsysvfiodisplay"/>
<element name="source">
<ref name="mdevaddress"/>
</element>