@samitouri / QOSamiQemu / commits / bcafeccd5b

hw/nvme: add user controlled 'firmware-version' property

This enables overriding the built in default QEMU project version string with a user specified string. The value can be at most 8 characters in length. Signed-off-by: Daniel P. Berrangé <berrange@redhat.com> Signed-off-by: Klaus Jensen <k.jensen@samsung.com>

Daniel P. Berrangé committed Mar 6, 2026 at 16:57 UTC bcafeccd5b8e242851ed0d9e7a7231b0aac9f7cc
3 files changed +18 -2
docs/system/devices/nvme.rst
+5
@@ -65,6 +65,11 @@ parameters.
65 to more closely impersonate a particular device type. The model name
66 can be a maximum of 40 characters in length.
67
68 +``firmware-version`` (default: current QEMU version number)
69 + Override the default reported firmware version, which can be used when
70 + needing to more closely impersonate a particular device type. The version
71 + can be a maximum of 8 characters in length.
72 +
73 Additional Namespaces
74 ---------------------
75
hw/nvme/ctrl.c
+12 -2
@@ -44,7 +44,8 @@
44 * atomic.awun<N[optional]>, \
45 * atomic.awupf<N[optional]>, \
46 * subsys=<subsys_id>, \
47 - * model=<model-str>
47 + * model=<model-str>, \
48 + * firmware-version=<version-str>
49 * -device nvme-ns,drive=<drive_id>,bus=<bus_name>,nsid=<nsid>,\
50 * zoned=<true|false[optional]>, \
51 * subsys=<subsys_id>,shared=<true|false[optional]>, \
@@ -8616,6 +8617,13 @@ static bool nvme_check_params(NvmeCtrl *n, Error **errp)
8617 return false;
8618 }
8619
8620 + if (params->firmware_version &&
8621 + strlen(params->firmware_version) > NVME_ID_CTRL_FR_MAX_LEN) {
8622 + error_setg(errp, "'firmware-version' parameter '%s' can be at most '%d' characters",
8623 + params->firmware_version, NVME_ID_CTRL_FR_MAX_LEN);
8624 + return false;
8625 + }
8626 +
8627 if (params->mqes < 1) {
8628 error_setg(errp, "mqes property cannot be less than 1");
8629 return false;
@@ -9111,7 +9119,8 @@ static void nvme_init_ctrl(NvmeCtrl *n, PCIDevice *pci_dev)
9119 id->ssvid = cpu_to_le16(pci_get_word(pci_conf + PCI_SUBSYSTEM_VENDOR_ID));
9120 strpadcpy((char *)id->mn, sizeof(id->mn),
9121 n->params.model ? n->params.model : "QEMU NVMe Ctrl", ' ');
9114 - strpadcpy((char *)id->fr, sizeof(id->fr), QEMU_VERSION, ' ');
9122 + strpadcpy((char *)id->fr, sizeof(id->fr),
9123 + n->params.firmware_version ? n->params.firmware_version : QEMU_VERSION, ' ');
9124 strpadcpy((char *)id->sn, sizeof(id->sn), n->params.serial, ' ');
9125
9126 id->cntlid = cpu_to_le16(n->cntlid);
@@ -9391,6 +9400,7 @@ static const Property nvme_props[] = {
9400 NvmeSubsystem *),
9401 DEFINE_PROP_STRING("serial", NvmeCtrl, params.serial),
9402 DEFINE_PROP_STRING("model", NvmeCtrl, params.model),
9403 + DEFINE_PROP_STRING("firmware-version", NvmeCtrl, params.firmware_version),
9404 DEFINE_PROP_UINT32("cmb_size_mb", NvmeCtrl, params.cmb_size_mb, 0),
9405 DEFINE_PROP_UINT32("num_queues", NvmeCtrl, params.num_queues, 0),
9406 DEFINE_PROP_UINT32("max_ioqpairs", NvmeCtrl, params.max_ioqpairs, 64),
hw/nvme/nvme.h
+1
@@ -543,6 +543,7 @@ typedef struct NvmeCQueue {
543 typedef struct NvmeParams {
544 char *serial;
545 char *model;
546 + char *firmware_version;
547 uint32_t num_queues; /* deprecated since 5.1 */
548 uint32_t max_ioqpairs;
549 uint16_t msix_qsize;