From 8e45a6a76ad6f747e8f34ff3c7f7fbae81c740e0 Mon Sep 17 00:00:00 2001 From: Rick Wertenbroek Date: Thu, 17 Mar 2022 11:56:49 +0100 Subject: [PATCH] Blog example new commands --- hw/nvme/ctrl.c | 20 ++++++++++++++++++++ include/block/nvme.h | 2 ++ 2 files changed, 22 insertions(+) diff --git a/hw/nvme/ctrl.c b/hw/nvme/ctrl.c index 27dddb87bd..3de0ac2074 100644 --- a/hw/nvme/ctrl.c +++ b/hw/nvme/ctrl.c @@ -221,6 +221,8 @@ static const uint32_t nvme_cse_acs[256] = { [NVME_ADM_CMD_ASYNC_EV_REQ] = NVME_CMD_EFF_CSUPP, [NVME_ADM_CMD_NS_ATTACHMENT] = NVME_CMD_EFF_CSUPP | NVME_CMD_EFF_NIC, [NVME_ADM_CMD_FORMAT_NVM] = NVME_CMD_EFF_CSUPP | NVME_CMD_EFF_LBCC, + // Add support flag for our new command + [NVME_ADM_CMD_MY_NEW_COMMAND] = NVME_CMD_EFF_CSUPP, }; static const uint32_t nvme_cse_iocs_none[256]; @@ -234,6 +236,8 @@ static const uint32_t nvme_cse_iocs_nvm[256] = { [NVME_CMD_VERIFY] = NVME_CMD_EFF_CSUPP, [NVME_CMD_COPY] = NVME_CMD_EFF_CSUPP | NVME_CMD_EFF_LBCC, [NVME_CMD_COMPARE] = NVME_CMD_EFF_CSUPP, + // Add support flag for our new command + [NVME_CMD_MY_NEW_COMMAND] = NVME_CMD_EFF_CSUPP, }; static const uint32_t nvme_cse_iocs_zoned[256] = { @@ -3844,6 +3848,11 @@ static uint16_t nvme_zone_mgmt_recv(NvmeCtrl *n, NvmeRequest *req) return status; } +static uint16_t run_my_new_io_command(void) { + printf("Hello world through NVMe io cmd !\n"); + return NVME_SUCCESS; +} + static uint16_t nvme_io_cmd(NvmeCtrl *n, NvmeRequest *req) { NvmeNamespace *ns; @@ -3916,6 +3925,9 @@ static uint16_t nvme_io_cmd(NvmeCtrl *n, NvmeRequest *req) return nvme_zone_mgmt_send(n, req); case NVME_CMD_ZONE_MGMT_RECV: return nvme_zone_mgmt_recv(n, req); + case NVME_CMD_MY_NEW_COMMAND: + // NVME_CMD_MY_NEW_COMMAND = 0x80 for example + return run_my_new_io_command(); default: assert(false); } @@ -5456,6 +5468,11 @@ out: return status; } +static uint16_t run_my_new_admin_command(void) { + printf("Hello world through NVMe admin cmd !\n"); + return NVME_SUCCESS; +} + static uint16_t nvme_admin_cmd(NvmeCtrl *n, NvmeRequest *req) { trace_pci_nvme_admin_cmd(nvme_cid(req), nvme_sqid(req), req->cmd.opcode, @@ -5496,6 +5513,9 @@ static uint16_t nvme_admin_cmd(NvmeCtrl *n, NvmeRequest *req) return nvme_ns_attachment(n, req); case NVME_ADM_CMD_FORMAT_NVM: return nvme_format(n, req); + case NVME_ADM_CMD_MY_NEW_COMMAND: + // NVME_ADM_CMD_MY_NEW_COMMAND = 0xC0 for example + return run_my_new_admin_command(); default: assert(false); } diff --git a/include/block/nvme.h b/include/block/nvme.h index 77aae01174..07855e9936 100644 --- a/include/block/nvme.h +++ b/include/block/nvme.h @@ -598,6 +598,7 @@ enum NvmeAdminCommands { NVME_ADM_CMD_FORMAT_NVM = 0x80, NVME_ADM_CMD_SECURITY_SEND = 0x81, NVME_ADM_CMD_SECURITY_RECV = 0x82, + NVME_ADM_CMD_MY_NEW_COMMAND = 0xc0, }; enum NvmeIoCommands { @@ -613,6 +614,7 @@ enum NvmeIoCommands { NVME_CMD_ZONE_MGMT_SEND = 0x79, NVME_CMD_ZONE_MGMT_RECV = 0x7a, NVME_CMD_ZONE_APPEND = 0x7d, + NVME_CMD_MY_NEW_COMMAND = 0x80, }; typedef struct QEMU_PACKED NvmeDeleteQ { -- 2.24.3 (Apple Git-128)