Signed-off-by: Ayush Mishra <ayush.m55@samsung.com>
---
hw/nvme/ctrl.c | 32 ++++++++++++++++++++++++++++++++
hw/nvme/nvme.h | 2 ++
include/block/nvme.h | 11 +++++++++++
3 files changed, 45 insertions(+)
diff --git a/hw/nvme/ctrl.c b/hw/nvme/ctrl.c
index e62c6a3588..93c950b5b2 100644
--- a/hw/nvme/ctrl.c
+++ b/hw/nvme/ctrl.c
@@ -5105,6 +5105,22 @@ static uint16_t nvme_fw_log_info(NvmeCtrl *n, uint32_t buf_len, uint64_t off,
return nvme_c2h(n, (uint8_t *) &fw_log + off, trans_len, req);
}
+static uint16_t nvme_supp_log_page(NvmeCtrl *n, uint8_t rae, uint32_t buf_len,
+ uint64_t off, NvmeRequest *req)
+{
+ uint32_t supplogpagesize = sizeof(n->supplogpage);
+ uint32_t trans_len;
+
+ if (off >= supplogpagesize) {
+ trace_pci_nvme_err_invalid_log_page_offset(off, supplogpagesize);
+ return NVME_INVALID_FIELD | NVME_DNR;
+ }
+
+ trans_len = MIN(supplogpagesize - off, buf_len);
+
+ return nvme_c2h(n, ((uint8_t *)n->supplogpage) + off, trans_len, req);
+}
+
static uint16_t nvme_error_info(NvmeCtrl *n, uint8_t rae, uint32_t buf_len,
uint64_t off, NvmeRequest *req)
{
@@ -5474,6 +5490,8 @@ static uint16_t nvme_get_log(NvmeCtrl *n, NvmeRequest *req)
}
switch (lid) {
+ case NVME_SUPP_LOG_PAGE:
+ return nvme_supp_log_page(n, rae, len, off, req);
case NVME_LOG_ERROR_INFO:
return nvme_error_info(n, rae, len, off, req);
case NVME_LOG_SMART_INFO:
@@ -8904,6 +8922,20 @@ static void nvme_init_ctrl(NvmeCtrl *n, PCIDevice *pci_dev)
if (pci_is_vf(pci_dev) && !sctrl->scs) {
stl_le_p(&n->bar.csts, NVME_CSTS_FAILED);
}
+
+ n->supplogpage[NVME_SUPP_LOG_PAGE].lsupp_ios = NVME_LID_SUPP;
+ n->supplogpage[NVME_LOG_ERROR_INFO].lsupp_ios = NVME_LID_SUPP;
+ n->supplogpage[NVME_LOG_SMART_INFO].lsupp_ios = NVME_LID_SUPP;
+ n->supplogpage[NVME_LOG_FW_SLOT_INFO].lsupp_ios = NVME_LID_SUPP;
+ n->supplogpage[NVME_LOG_CHANGED_NSLIST].lsupp_ios = NVME_LID_SUPP;
+ n->supplogpage[NVME_LOG_CMD_EFFECTS].lsupp_ios = NVME_LID_SUPP;
+ n->supplogpage[NVME_LOG_ENDGRP].lsupp_ios = NVME_LID_SUPP;
+ n->supplogpage[NVME_LOG_FDP_CONFS].lsupp_ios = NVME_LID_SUPP;
+ n->supplogpage[NVME_LOG_FDP_RUH_USAGE].lsupp_ios = NVME_LID_SUPP;
+ n->supplogpage[NVME_LOG_FDP_STATS].lsupp_ios = NVME_LID_SUPP;
+ n->supplogpage[NVME_LOG_FDP_EVENTS].lsupp_ios = NVME_LID_SUPP;
+ n->supplogpage[NVME_LOG_VENDOR_START].lsupp_ios = NVME_LID_SUPP;
+ n->supplogpage[NVME_LOG_VENDOR_END].lsupp_ios = NVME_LID_SUPP;
}
static int nvme_init_subsys(NvmeCtrl *n, Error **errp)
diff --git a/hw/nvme/nvme.h b/hw/nvme/nvme.h
index 6f782ba188..660420c95a 100644
--- a/hw/nvme/nvme.h
+++ b/hw/nvme/nvme.h
@@ -26,6 +26,7 @@
#define NVME_MAX_CONTROLLERS 256
#define NVME_MAX_NAMESPACES 256
+#define NVME_MAX_LOG_PAGES 256
#define NVME_EUI64_DEFAULT ((uint64_t)0x5254000000000000)
#define NVME_FDP_MAX_EVENTS 63
#define NVME_FDP_MAXPIDS 128
@@ -625,6 +626,7 @@ typedef struct NvmeCtrl {
NvmeSQueue admin_sq;
NvmeCQueue admin_cq;
NvmeIdCtrl id_ctrl;
+ NvmeSuppLogpage supplogpage[NVME_MAX_LOG_PAGES];
struct {
struct {
diff --git a/include/block/nvme.h b/include/block/nvme.h
index 358e516e38..c38422b38d 100644
--- a/include/block/nvme.h
+++ b/include/block/nvme.h
@@ -1079,6 +1079,7 @@ enum {
};
enum NvmeLogIdentifier {
+ NVME_SUPP_LOG_PAGE = 0x00,
NVME_LOG_ERROR_INFO = 0x01,
NVME_LOG_SMART_INFO = 0x02,
NVME_LOG_FW_SLOT_INFO = 0x03,
@@ -1705,6 +1706,16 @@ typedef enum NvmeZoneState {
NVME_ZONE_STATE_OFFLINE = 0x0f,
} NvmeZoneState;
+enum {
+ NVME_LID_SUPP = 1 << 0,
+ NVME_INDEX_OFF_SUPP = 1 << 1,
+};
+
+typedef struct QEMU_PACKED NvmeSuppLogpage {
+ uint16_t lsupp_ios;
+ uint16_t lidspec;
+} NvmeSuppLogpage;
+
typedef struct QEMU_PACKED NvmePriCtrlCap {
uint16_t cntlid;
uint16_t portid;
--
2.43.0