mirror of
https://gitlab.com/libvirt/libvirt.git
synced 2025-01-25 10:03:49 +03:00
qemu: move qemuDomainDeviceDefValidateVideo() to qemu_validate.c
Signed-off-by: Daniel Henrique Barboza <danielhb413@gmail.com> Reviewed-by: Ján Tomko <jtomko@redhat.com> Signed-off-by: Ján Tomko <jtomko@redhat.com>
This commit is contained in:
parent
94410ded3d
commit
5d80af2cf3
@ -5245,102 +5245,6 @@ qemuDomainValidateActualNetDef(const virDomainNetDef *net,
|
||||
}
|
||||
|
||||
|
||||
static int
|
||||
qemuDomainDeviceDefValidateVideo(const virDomainVideoDef *video,
|
||||
virQEMUCapsPtr qemuCaps)
|
||||
{
|
||||
/* there's no properties to validate for NONE video devices */
|
||||
if (video->type == VIR_DOMAIN_VIDEO_TYPE_NONE)
|
||||
return 0;
|
||||
|
||||
if (!video->primary &&
|
||||
video->type != VIR_DOMAIN_VIDEO_TYPE_QXL &&
|
||||
video->type != VIR_DOMAIN_VIDEO_TYPE_VIRTIO) {
|
||||
virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
|
||||
_("video type '%s' is only valid as primary "
|
||||
"video device"),
|
||||
virDomainVideoTypeToString(video->type));
|
||||
return -1;
|
||||
}
|
||||
|
||||
if (video->accel && video->accel->accel2d == VIR_TRISTATE_SWITCH_ON) {
|
||||
virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
|
||||
_("qemu does not support the accel2d setting"));
|
||||
return -1;
|
||||
}
|
||||
|
||||
if (video->type == VIR_DOMAIN_VIDEO_TYPE_QXL) {
|
||||
if (video->vram > (UINT_MAX / 1024)) {
|
||||
virReportError(VIR_ERR_OVERFLOW,
|
||||
_("value for 'vram' must be less than '%u'"),
|
||||
UINT_MAX / 1024);
|
||||
return -1;
|
||||
}
|
||||
if (video->ram > (UINT_MAX / 1024)) {
|
||||
virReportError(VIR_ERR_OVERFLOW,
|
||||
_("value for 'ram' must be less than '%u'"),
|
||||
UINT_MAX / 1024);
|
||||
return -1;
|
||||
}
|
||||
if (video->vgamem) {
|
||||
if (video->vgamem < 1024) {
|
||||
virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
|
||||
_("value for 'vgamem' must be at least 1 MiB "
|
||||
"(1024 KiB)"));
|
||||
return -1;
|
||||
}
|
||||
|
||||
if (video->vgamem != VIR_ROUND_UP_POWER_OF_TWO(video->vgamem)) {
|
||||
virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
|
||||
_("value for 'vgamem' must be power of two"));
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (video->type != VIR_DOMAIN_VIDEO_TYPE_VGA &&
|
||||
video->type != VIR_DOMAIN_VIDEO_TYPE_QXL &&
|
||||
video->type != VIR_DOMAIN_VIDEO_TYPE_VIRTIO &&
|
||||
video->type != VIR_DOMAIN_VIDEO_TYPE_BOCHS) {
|
||||
if (video->res) {
|
||||
virReportError(VIR_ERR_XML_ERROR, "%s",
|
||||
_("model resolution is not supported"));
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
|
||||
if (video->type == VIR_DOMAIN_VIDEO_TYPE_VGA ||
|
||||
video->type == VIR_DOMAIN_VIDEO_TYPE_VMVGA) {
|
||||
if (video->vram && video->vram < 1024) {
|
||||
virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
|
||||
"%s", _("value for 'vram' must be at least "
|
||||
"1 MiB (1024 KiB)"));
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
|
||||
if (video->backend == VIR_DOMAIN_VIDEO_BACKEND_TYPE_VHOSTUSER) {
|
||||
if (video->type == VIR_DOMAIN_VIDEO_TYPE_VIRTIO &&
|
||||
!virQEMUCapsGet(qemuCaps, QEMU_CAPS_DEVICE_VHOST_USER_GPU)) {
|
||||
virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
|
||||
_("this QEMU does not support 'vhost-user' video device"));
|
||||
return -1;
|
||||
}
|
||||
} else if (video->accel) {
|
||||
if (video->accel->accel3d == VIR_TRISTATE_SWITCH_ON &&
|
||||
(video->type != VIR_DOMAIN_VIDEO_TYPE_VIRTIO ||
|
||||
!virQEMUCapsGet(qemuCaps, QEMU_CAPS_VIRTIO_GPU_VIRGL))) {
|
||||
virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
|
||||
_("%s 3d acceleration is not supported"),
|
||||
virDomainVideoTypeToString(video->type));
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
int
|
||||
qemuDomainValidateStorageSource(virStorageSourcePtr src,
|
||||
virQEMUCapsPtr qemuCaps)
|
||||
@ -7082,7 +6986,7 @@ qemuDomainDeviceDefValidate(const virDomainDeviceDef *dev,
|
||||
break;
|
||||
|
||||
case VIR_DOMAIN_DEVICE_VIDEO:
|
||||
ret = qemuDomainDeviceDefValidateVideo(dev->data.video, qemuCaps);
|
||||
ret = qemuValidateDomainDeviceDefVideo(dev->data.video, qemuCaps);
|
||||
break;
|
||||
|
||||
case VIR_DOMAIN_DEVICE_DISK:
|
||||
|
@ -1720,3 +1720,99 @@ qemuValidateDomainDeviceDefHostdev(const virDomainHostdevDef *hostdev,
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
int
|
||||
qemuValidateDomainDeviceDefVideo(const virDomainVideoDef *video,
|
||||
virQEMUCapsPtr qemuCaps)
|
||||
{
|
||||
/* there's no properties to validate for NONE video devices */
|
||||
if (video->type == VIR_DOMAIN_VIDEO_TYPE_NONE)
|
||||
return 0;
|
||||
|
||||
if (!video->primary &&
|
||||
video->type != VIR_DOMAIN_VIDEO_TYPE_QXL &&
|
||||
video->type != VIR_DOMAIN_VIDEO_TYPE_VIRTIO) {
|
||||
virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
|
||||
_("video type '%s' is only valid as primary "
|
||||
"video device"),
|
||||
virDomainVideoTypeToString(video->type));
|
||||
return -1;
|
||||
}
|
||||
|
||||
if (video->accel && video->accel->accel2d == VIR_TRISTATE_SWITCH_ON) {
|
||||
virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
|
||||
_("qemu does not support the accel2d setting"));
|
||||
return -1;
|
||||
}
|
||||
|
||||
if (video->type == VIR_DOMAIN_VIDEO_TYPE_QXL) {
|
||||
if (video->vram > (UINT_MAX / 1024)) {
|
||||
virReportError(VIR_ERR_OVERFLOW,
|
||||
_("value for 'vram' must be less than '%u'"),
|
||||
UINT_MAX / 1024);
|
||||
return -1;
|
||||
}
|
||||
if (video->ram > (UINT_MAX / 1024)) {
|
||||
virReportError(VIR_ERR_OVERFLOW,
|
||||
_("value for 'ram' must be less than '%u'"),
|
||||
UINT_MAX / 1024);
|
||||
return -1;
|
||||
}
|
||||
if (video->vgamem) {
|
||||
if (video->vgamem < 1024) {
|
||||
virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
|
||||
_("value for 'vgamem' must be at least 1 MiB "
|
||||
"(1024 KiB)"));
|
||||
return -1;
|
||||
}
|
||||
|
||||
if (video->vgamem != VIR_ROUND_UP_POWER_OF_TWO(video->vgamem)) {
|
||||
virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
|
||||
_("value for 'vgamem' must be power of two"));
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (video->type != VIR_DOMAIN_VIDEO_TYPE_VGA &&
|
||||
video->type != VIR_DOMAIN_VIDEO_TYPE_QXL &&
|
||||
video->type != VIR_DOMAIN_VIDEO_TYPE_VIRTIO &&
|
||||
video->type != VIR_DOMAIN_VIDEO_TYPE_BOCHS) {
|
||||
if (video->res) {
|
||||
virReportError(VIR_ERR_XML_ERROR, "%s",
|
||||
_("model resolution is not supported"));
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
|
||||
if (video->type == VIR_DOMAIN_VIDEO_TYPE_VGA ||
|
||||
video->type == VIR_DOMAIN_VIDEO_TYPE_VMVGA) {
|
||||
if (video->vram && video->vram < 1024) {
|
||||
virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
|
||||
"%s", _("value for 'vram' must be at least "
|
||||
"1 MiB (1024 KiB)"));
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
|
||||
if (video->backend == VIR_DOMAIN_VIDEO_BACKEND_TYPE_VHOSTUSER) {
|
||||
if (video->type == VIR_DOMAIN_VIDEO_TYPE_VIRTIO &&
|
||||
!virQEMUCapsGet(qemuCaps, QEMU_CAPS_DEVICE_VHOST_USER_GPU)) {
|
||||
virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
|
||||
_("this QEMU does not support 'vhost-user' video device"));
|
||||
return -1;
|
||||
}
|
||||
} else if (video->accel) {
|
||||
if (video->accel->accel3d == VIR_TRISTATE_SWITCH_ON &&
|
||||
(video->type != VIR_DOMAIN_VIDEO_TYPE_VIRTIO ||
|
||||
!virQEMUCapsGet(qemuCaps, QEMU_CAPS_VIRTIO_GPU_VIRGL))) {
|
||||
virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
|
||||
_("%s 3d acceleration is not supported"),
|
||||
virDomainVideoTypeToString(video->type));
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
@ -44,3 +44,5 @@ int qemuValidateDomainWatchdogDef(const virDomainWatchdogDef *dev,
|
||||
int qemuValidateDomainDeviceDefHostdev(const virDomainHostdevDef *hostdev,
|
||||
const virDomainDef *def,
|
||||
virQEMUCapsPtr qemuCaps);
|
||||
int qemuValidateDomainDeviceDefVideo(const virDomainVideoDef *video,
|
||||
virQEMUCapsPtr qemuCaps);
|
||||
|
Loading…
x
Reference in New Issue
Block a user