mirror of https://gitee.com/openkylin/libvirt.git
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
|
int
|
||||||
qemuDomainValidateStorageSource(virStorageSourcePtr src,
|
qemuDomainValidateStorageSource(virStorageSourcePtr src,
|
||||||
virQEMUCapsPtr qemuCaps)
|
virQEMUCapsPtr qemuCaps)
|
||||||
|
@ -7082,7 +6986,7 @@ qemuDomainDeviceDefValidate(const virDomainDeviceDef *dev,
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case VIR_DOMAIN_DEVICE_VIDEO:
|
case VIR_DOMAIN_DEVICE_VIDEO:
|
||||||
ret = qemuDomainDeviceDefValidateVideo(dev->data.video, qemuCaps);
|
ret = qemuValidateDomainDeviceDefVideo(dev->data.video, qemuCaps);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case VIR_DOMAIN_DEVICE_DISK:
|
case VIR_DOMAIN_DEVICE_DISK:
|
||||||
|
|
|
@ -1720,3 +1720,99 @@ qemuValidateDomainDeviceDefHostdev(const virDomainHostdevDef *hostdev,
|
||||||
|
|
||||||
return 0;
|
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,
|
int qemuValidateDomainDeviceDefHostdev(const virDomainHostdevDef *hostdev,
|
||||||
const virDomainDef *def,
|
const virDomainDef *def,
|
||||||
virQEMUCapsPtr qemuCaps);
|
virQEMUCapsPtr qemuCaps);
|
||||||
|
int qemuValidateDomainDeviceDefVideo(const virDomainVideoDef *video,
|
||||||
|
virQEMUCapsPtr qemuCaps);
|
||||||
|
|
Loading…
Reference in New Issue