This enables overriding the built in default "QEMU NVMe Ctrl" string with a user specified string. The value can be at most 40 characters in length.
Signed-off-by: Daniel P. Berrangé <[email protected]> --- docs/system/devices/nvme.rst | 5 +++++ hw/nvme/ctrl.c | 14 ++++++++++++-- hw/nvme/nvme.h | 1 + 3 files changed, 18 insertions(+), 2 deletions(-) diff --git a/docs/system/devices/nvme.rst b/docs/system/devices/nvme.rst index 6509b35fcb..109c01a70d 100644 --- a/docs/system/devices/nvme.rst +++ b/docs/system/devices/nvme.rst @@ -60,6 +60,11 @@ parameters. the SMART / Health information extended log become available in the controller. We emulate version 5 of this log page. +``model`` (default: ``QEMU NVMe Ctrl``) + Override the default reported model, which can be used when needing + to more closely impersonate a particular device type. The model name + can be a maximum of 40 characters in length. + Additional Namespaces --------------------- diff --git a/hw/nvme/ctrl.c b/hw/nvme/ctrl.c index e6b2e3b70a..4067443309 100644 --- a/hw/nvme/ctrl.c +++ b/hw/nvme/ctrl.c @@ -43,7 +43,8 @@ * atomic.dn=<on|off[optional]>, \ * atomic.awun<N[optional]>, \ * atomic.awupf<N[optional]>, \ - * subsys=<subsys_id> + * subsys=<subsys_id>, \ + * model=<model-str> * -device nvme-ns,drive=<drive_id>,bus=<bus_name>,nsid=<nsid>,\ * zoned=<true|false[optional]>, \ * subsys=<subsys_id>,shared=<true|false[optional]>, \ @@ -8606,6 +8607,13 @@ static bool nvme_check_params(NvmeCtrl *n, Error **errp) return false; } + if (params->model && + strlen(params->model) > NVME_ID_CTRL_MN_MAX_LEN) { + error_setg(errp, "'model' parameter '%s' can be at most '%d' characters", + params->model, NVME_ID_CTRL_MN_MAX_LEN); + return false; + } + if (params->mqes < 1) { error_setg(errp, "mqes property cannot be less than 1"); return false; @@ -9099,7 +9107,8 @@ static void nvme_init_ctrl(NvmeCtrl *n, PCIDevice *pci_dev) id->vid = cpu_to_le16(pci_get_word(pci_conf + PCI_VENDOR_ID)); id->ssvid = cpu_to_le16(pci_get_word(pci_conf + PCI_SUBSYSTEM_VENDOR_ID)); - strpadcpy((char *)id->mn, sizeof(id->mn), "QEMU NVMe Ctrl", ' '); + strpadcpy((char *)id->mn, sizeof(id->mn), + n->params.model ? n->params.model : "QEMU NVMe Ctrl", ' '); strpadcpy((char *)id->fr, sizeof(id->fr), QEMU_VERSION, ' '); strpadcpy((char *)id->sn, sizeof(id->sn), n->params.serial, ' '); @@ -9379,6 +9388,7 @@ static const Property nvme_props[] = { DEFINE_PROP_LINK("subsys", NvmeCtrl, subsys, TYPE_NVME_SUBSYS, NvmeSubsystem *), DEFINE_PROP_STRING("serial", NvmeCtrl, params.serial), + DEFINE_PROP_STRING("model", NvmeCtrl, params.model), DEFINE_PROP_UINT32("cmb_size_mb", NvmeCtrl, params.cmb_size_mb, 0), DEFINE_PROP_UINT32("num_queues", NvmeCtrl, params.num_queues, 0), DEFINE_PROP_UINT32("max_ioqpairs", NvmeCtrl, params.max_ioqpairs, 64), diff --git a/hw/nvme/nvme.h b/hw/nvme/nvme.h index d66f7dc82d..ebf1fcfdcd 100644 --- a/hw/nvme/nvme.h +++ b/hw/nvme/nvme.h @@ -542,6 +542,7 @@ typedef struct NvmeCQueue { typedef struct NvmeParams { char *serial; + char *model; uint32_t num_queues; /* deprecated since 5.1 */ uint32_t max_ioqpairs; uint16_t msix_qsize; -- 2.53.0
