From 5b80e93e42a1d89ee64420debd2b4b785a144c40 Mon Sep 17 00:00:00 2001 From: Martin Kletzander Date: Fri, 20 Jan 2023 10:26:21 +0100 Subject: [PATCH] Add iTCO watchdog support Supported only with q35 machine types. Signed-off-by: Martin Kletzander Reviewed-by: Michal Privoznik --- src/conf/domain_conf.c | 1 + src/conf/domain_conf.h | 1 + src/conf/schemas/domaincommon.rng | 1 + src/qemu/qemu_domain_address.c | 1 + src/qemu/qemu_validate.c | 25 +++++++++++++++++++++++++ 5 files changed, 29 insertions(+) diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c index 00a42abd30..0cd6020ea3 100644 --- a/src/conf/domain_conf.c +++ b/src/conf/domain_conf.c @@ -838,6 +838,7 @@ VIR_ENUM_IMPL(virDomainWatchdogModel, "i6300esb", "ib700", "diag288", + "itco", ); VIR_ENUM_IMPL(virDomainWatchdogAction, diff --git a/src/conf/domain_conf.h b/src/conf/domain_conf.h index 2b04e0c3e0..631cef03fd 100644 --- a/src/conf/domain_conf.h +++ b/src/conf/domain_conf.h @@ -1747,6 +1747,7 @@ typedef enum { VIR_DOMAIN_WATCHDOG_MODEL_I6300ESB, VIR_DOMAIN_WATCHDOG_MODEL_IB700, VIR_DOMAIN_WATCHDOG_MODEL_DIAG288, + VIR_DOMAIN_WATCHDOG_MODEL_ITCO, VIR_DOMAIN_WATCHDOG_MODEL_LAST } virDomainWatchdogModel; diff --git a/src/conf/schemas/domaincommon.rng b/src/conf/schemas/domaincommon.rng index 524d57884c..b4731f0d8d 100644 --- a/src/conf/schemas/domaincommon.rng +++ b/src/conf/schemas/domaincommon.rng @@ -5345,6 +5345,7 @@ i6300esb ib700 diag288 + itco diff --git a/src/qemu/qemu_domain_address.c b/src/qemu/qemu_domain_address.c index e26ce9c0e6..20b648354b 100644 --- a/src/qemu/qemu_domain_address.c +++ b/src/qemu/qemu_domain_address.c @@ -932,6 +932,7 @@ qemuDomainDeviceCalculatePCIConnectFlags(virDomainDeviceDef *dev, case VIR_DOMAIN_WATCHDOG_MODEL_IB700: case VIR_DOMAIN_WATCHDOG_MODEL_DIAG288: + case VIR_DOMAIN_WATCHDOG_MODEL_ITCO: case VIR_DOMAIN_WATCHDOG_MODEL_LAST: return 0; } diff --git a/src/qemu/qemu_validate.c b/src/qemu/qemu_validate.c index 134ab0437c..c8c289ebb4 100644 --- a/src/qemu/qemu_validate.c +++ b/src/qemu/qemu_validate.c @@ -1191,6 +1191,7 @@ qemuValidateDomainDefTPMs(const virDomainDef *def) static int qemuValidateDomainDefWatchdogs(const virDomainDef *def) { + bool found_itco = false; ssize_t i = 0; for (i = 1; i < def->nwatchdogs; i++) { @@ -1204,6 +1205,15 @@ qemuValidateDomainDefWatchdogs(const virDomainDef *def) "with this QEMU binary")); return -1; } + + if (def->watchdogs[i]->model == VIR_DOMAIN_WATCHDOG_MODEL_ITCO) { + if (found_itco) { + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", + _("Multiple iTCO watchdogs are not supported")); + return -1; + } + found_itco = true; + } } return 0; @@ -2410,6 +2420,21 @@ qemuValidateDomainWatchdogDef(const virDomainWatchdogDef *dev, } break; + case VIR_DOMAIN_WATCHDOG_MODEL_ITCO: + if (dev->info.type != VIR_DOMAIN_DEVICE_ADDRESS_TYPE_NONE) { + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, + _("%s model of watchdog is part of the machine and cannot have any address set."), + virDomainWatchdogModelTypeToString(dev->model)); + return -1; + } + if (!qemuDomainIsQ35(def)) { + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, + _("%s model of watchdog is only part of q35 machine"), + virDomainWatchdogModelTypeToString(dev->model)); + return -1; + } + break; + case VIR_DOMAIN_WATCHDOG_MODEL_LAST: default: virReportEnumRangeError(virDomainWatchdogModel, dev->model); -- 2.47.2