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