[PATCH RFC v2 02/14] nvme: Add NVMe Controller Data Queue command
From: Joel Granados
Date: Fri Jul 24 2026 - 07:30:56 EST
Add the struct (nvme_cdq_cmd) and define the relative values to support
NVMe Controller Data Queue management.
* struct nvme_cdq_cmd: Is the CDQ mgmt command
* nvme_cdq_cmd_mgmt_op: Specifies create or delete
* NVME_CDQ_CMD_MGMT_CREATE_*: Specifies the create operation.
No functional changes are included as this is a preparation commit.
Signed-off-by: Joel Granados <joel.granados@xxxxxxxxxx>
---
drivers/nvme/host/core.c | 1 +
include/linux/nvme.h | 45 ++++++++++++++++++++++++++++++++++++++++++++-
2 files changed, 45 insertions(+), 1 deletion(-)
diff --git a/drivers/nvme/host/core.c b/drivers/nvme/host/core.c
index 6e7533ccf24bfe3df7188f442986ec18a3200660..d11858300ad43f3e229eab7f2dd77563075b801e 100644
--- a/drivers/nvme/host/core.c
+++ b/drivers/nvme/host/core.c
@@ -5387,6 +5387,7 @@ static inline void _nvme_check_size(void)
BUILD_BUG_ON(sizeof(struct nvme_directive_cmd) != 64);
BUILD_BUG_ON(sizeof(struct nvme_lm_send_cmd) != 64);
BUILD_BUG_ON(sizeof(struct nvme_lm_recv_cmd) != 64);
+ BUILD_BUG_ON(sizeof(struct nvme_cdq_command) != 64);
BUILD_BUG_ON(sizeof(struct nvme_feat_host_behavior) != 512);
}
diff --git a/include/linux/nvme.h b/include/linux/nvme.h
index 60fb5b6808615ff7388f30e12ffe6ed5da2ef4f6..1c20ddc06a46066b5ab9acf1dc44b03d941592a9 100644
--- a/include/linux/nvme.h
+++ b/include/linux/nvme.h
@@ -1639,6 +1639,7 @@ enum nvme_admin_opcode {
nvme_admin_nvme_mi_recv = 0x1e,
nvme_admin_lm_send = 0x41,
nvme_admin_lm_recv = 0x42,
+ nvme_admin_cdq = 0x45,
nvme_admin_dbbuf = 0x7C,
nvme_admin_format_nvm = 0x80,
nvme_admin_security_send = 0x81,
@@ -1679,7 +1680,8 @@ enum nvme_admin_opcode {
nvme_admin_opcode_name(nvme_admin_security_send), \
nvme_admin_opcode_name(nvme_admin_security_recv), \
nvme_admin_opcode_name(nvme_admin_sanitize_nvm), \
- nvme_admin_opcode_name(nvme_admin_get_lba_status))
+ nvme_admin_opcode_name(nvme_admin_get_lba_status), \
+ nvme_admin_opcode_name(nvme_admin_cdq))
enum {
NVME_QUEUE_PHYS_CONTIG = (1 << 0),
@@ -1710,6 +1712,7 @@ enum {
NVME_FEAT_PLM_WINDOW = 0x14,
NVME_FEAT_HOST_BEHAVIOR = 0x16,
NVME_FEAT_SANITIZE = 0x17,
+ NVME_FEAT_CDQ = 0x21,
NVME_FEAT_FDP = 0x1d,
NVME_FEAT_SW_PROGRESS = 0x80,
NVME_FEAT_HOST_ID = 0x81,
@@ -1739,6 +1742,10 @@ enum {
NVME_FWACT_ACTV = (2 << 3),
};
+enum {
+ NVME_FEAT_CDQ_ID_MASK = GENMASK(15, 0),
+};
+
struct nvme_supported_log {
__le32 lids[256];
};
@@ -1917,6 +1924,41 @@ struct nvme_directive_cmd {
__u32 rsvd16[3];
};
+//Select values for dword 10
+enum nvme_cdq_cmd_mgmt_op {
+ NVME_CDQ_CMD_MGMT_CREATE = 0x0,
+ NVME_CDQ_CMD_MGMT_DELETE = 0x1
+};
+#define NVME_CDQ_CMD_MGMT_CREATE_MOS_QT_UDMQ 0x0
+#define NVME_CDQ_CMD_MGMT_CREATE_PC_CONT 0x1
+#define NVME_CDQ_CMD_MGMT_CREATE_PC_DISCONT 0x0
+
+union nvme_cdq_cmd_dw11 {
+ struct {
+ __le16 flags;
+ __le16 cqs;
+ };
+ struct {
+ __le16 cdqid;
+ __le16 rsvd;
+ };
+};
+
+struct nvme_cdq_command {
+ __u8 opcode;
+ __u8 flags;
+ __u16 command_id;
+ __u32 rsvd1[5];
+ __le64 prp1;
+ __le32 rsvd8[2];
+ __u8 sel;
+ __u8 rsvd10;
+ __le16 mos;
+ union nvme_cdq_cmd_dw11 dw11;
+ __le32 cdqsize;
+ __u32 rsvd13[3];
+};
+
/*
* Fabrics subcommands.
*/
@@ -2335,6 +2377,7 @@ struct nvme_command {
struct nvme_directive_cmd directive;
struct nvme_lm_command lm;
struct nvme_io_mgmt_recv_cmd imr;
+ struct nvme_cdq_command cdq;
};
};
--
2.50.1