Signed-off-by: Ayush Mishra <ayush....@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


Reply via email to