]> www.infradead.org Git - qemu-nvme.git/commitdiff
hw/block/nvme: reject io commands if only admin command set selected
authorKlaus Jensen <k.jensen@samsung.com>
Tue, 29 Sep 2020 23:19:07 +0000 (01:19 +0200)
committerKeith Busch <kbusch@kernel.org>
Wed, 30 Sep 2020 21:28:27 +0000 (14:28 -0700)
If the host sets CC.CSS to 111b, all commands submitted to I/O queues
should be completed with status Invalid Command Opcode.

Note that this is technically a v1.4 feature, but it does not hurt to
implement before we finally bump the reported version implemented.

Signed-off-by: Klaus Jensen <k.jensen@samsung.com>
hw/block/nvme.c
include/block/nvme.h

index ec7363ea40629e5878563ef7167bad208920656e..80730e1c0309796f8790bf09bba4a2c7a4b7cd20 100644 (file)
@@ -1026,6 +1026,10 @@ static uint16_t nvme_io_cmd(NvmeCtrl *n, NvmeRequest *req)
     trace_pci_nvme_io_cmd(nvme_cid(req), nsid, nvme_sqid(req),
                           req->cmd.opcode, nvme_io_opc_str(req->cmd.opcode));
 
+    if (NVME_CC_CSS(n->bar.cc) == NVME_CC_CSS_ADMIN_ONLY) {
+        return NVME_INVALID_OPCODE | NVME_DNR;
+    }
+
     if (!nvme_nsid_valid(n, nsid)) {
         return NVME_INVALID_NSID | NVME_DNR;
     }
index 521533fd2a1063e70116b1a2e7e1ca1b70df6b66..6de2d5aa75a92c2817ee005e808aa86d42116be8 100644 (file)
@@ -115,6 +115,11 @@ enum NvmeCcMask {
 #define NVME_CC_IOSQES(cc) ((cc >> CC_IOSQES_SHIFT) & CC_IOSQES_MASK)
 #define NVME_CC_IOCQES(cc) ((cc >> CC_IOCQES_SHIFT) & CC_IOCQES_MASK)
 
+enum NvmeCcCss {
+    NVME_CC_CSS_NVM        = 0x0,
+    NVME_CC_CSS_ADMIN_ONLY = 0x7,
+};
+
 enum NvmeCstsShift {
     CSTS_RDY_SHIFT      = 0,
     CSTS_CFS_SHIFT      = 1,