nvme: add FDP definitions
authorChristoph Hellwig <hch@lst.de>
Tue, 6 May 2025 12:17:30 +0000 (17:47 +0530)
committerJens Axboe <axboe@kernel.dk>
Tue, 6 May 2025 13:46:43 +0000 (07:46 -0600)
Add the config feature result, config log page, and management receive
commands needed for FDP.

Partially based on a patch from Kanchan Joshi <joshi.k@samsung.com>.

Reviewed-by: Hannes Reinecke <hare@suse.de>
Reviewed-by: Nitesh Shetty <nj.shetty@samsung.com>
Signed-off-by: Christoph Hellwig <hch@lst.de>
Signed-off-by: Keith Busch <kbusch@kernel.org>
Signed-off-by: Kanchan Joshi <joshi.k@samsung.com>
Link: https://lore.kernel.org/r/20250506121732.8211-10-joshi.k@samsung.com
Signed-off-by: Jens Axboe <axboe@kernel.dk>
include/linux/nvme.h

index 2479ed10f53e37055973ea3c899060913923fa62..51308f65b72fdd5514c84eac479abbcd0cd138e6 100644 (file)
@@ -303,6 +303,7 @@ enum nvme_ctrl_attr {
        NVME_CTRL_ATTR_TBKAS            = (1 << 6),
        NVME_CTRL_ATTR_ELBAS            = (1 << 15),
        NVME_CTRL_ATTR_RHII             = (1 << 18),
+       NVME_CTRL_ATTR_FDPS             = (1 << 19),
 };
 
 struct nvme_id_ctrl {
@@ -689,6 +690,44 @@ struct nvme_rotational_media_log {
        __u8    rsvd24[488];
 };
 
+struct nvme_fdp_config {
+       __u8                    flags;
+#define FDPCFG_FDPE    (1U << 0)
+       __u8                    fdpcidx;
+       __le16                  reserved;
+};
+
+struct nvme_fdp_ruh_desc {
+       __u8                    ruht;
+       __u8                    reserved[3];
+};
+
+struct nvme_fdp_config_desc {
+       __le16                  dsze;
+       __u8                    fdpa;
+       __u8                    vss;
+       __le32                  nrg;
+       __le16                  nruh;
+       __le16                  maxpids;
+       __le32                  nns;
+       __le64                  runs;
+       __le32                  erutl;
+       __u8                    rsvd28[36];
+       struct nvme_fdp_ruh_desc ruhs[];
+};
+
+struct nvme_fdp_config_log {
+       __le16                  numfdpc;
+       __u8                    ver;
+       __u8                    rsvd3;
+       __le32                  sze;
+       __u8                    rsvd8[8];
+       /*
+        * This is followed by variable number of nvme_fdp_config_desc
+        * structures, but sparse doesn't like nested variable sized arrays.
+        */
+};
+
 struct nvme_smart_log {
        __u8                    critical_warning;
        __u8                    temperature[2];
@@ -915,6 +954,7 @@ enum nvme_opcode {
        nvme_cmd_resv_register  = 0x0d,
        nvme_cmd_resv_report    = 0x0e,
        nvme_cmd_resv_acquire   = 0x11,
+       nvme_cmd_io_mgmt_recv   = 0x12,
        nvme_cmd_resv_release   = 0x15,
        nvme_cmd_zone_mgmt_send = 0x79,
        nvme_cmd_zone_mgmt_recv = 0x7a,
@@ -936,6 +976,7 @@ enum nvme_opcode {
                nvme_opcode_name(nvme_cmd_resv_register),       \
                nvme_opcode_name(nvme_cmd_resv_report),         \
                nvme_opcode_name(nvme_cmd_resv_acquire),        \
+               nvme_opcode_name(nvme_cmd_io_mgmt_recv),        \
                nvme_opcode_name(nvme_cmd_resv_release),        \
                nvme_opcode_name(nvme_cmd_zone_mgmt_send),      \
                nvme_opcode_name(nvme_cmd_zone_mgmt_recv),      \
@@ -1087,6 +1128,7 @@ enum {
        NVME_RW_PRINFO_PRCHK_GUARD      = 1 << 12,
        NVME_RW_PRINFO_PRACT            = 1 << 13,
        NVME_RW_DTYPE_STREAMS           = 1 << 4,
+       NVME_RW_DTYPE_DPLCMT            = 2 << 4,
        NVME_WZ_DEAC                    = 1 << 9,
 };
 
@@ -1174,6 +1216,38 @@ struct nvme_zone_mgmt_recv_cmd {
        __le32                  cdw14[2];
 };
 
+struct nvme_io_mgmt_recv_cmd {
+       __u8                    opcode;
+       __u8                    flags;
+       __u16                   command_id;
+       __le32                  nsid;
+       __le64                  rsvd2[2];
+       union nvme_data_ptr     dptr;
+       __u8                    mo;
+       __u8                    rsvd11;
+       __u16                   mos;
+       __le32                  numd;
+       __le32                  cdw12[4];
+};
+
+enum {
+       NVME_IO_MGMT_RECV_MO_RUHS       = 1,
+};
+
+struct nvme_fdp_ruh_status_desc {
+       __le16                  pid;
+       __le16                  ruhid;
+       __le32                  earutr;
+       __le64                  ruamw;
+       __u8                    reserved[16];
+};
+
+struct nvme_fdp_ruh_status {
+       __u8                    rsvd0[14];
+       __le16                  nruhsd;
+       struct nvme_fdp_ruh_status_desc ruhsd[];
+};
+
 enum {
        NVME_ZRA_ZONE_REPORT            = 0,
        NVME_ZRASF_ZONE_REPORT_ALL      = 0,
@@ -1309,6 +1383,7 @@ enum {
        NVME_FEAT_PLM_WINDOW    = 0x14,
        NVME_FEAT_HOST_BEHAVIOR = 0x16,
        NVME_FEAT_SANITIZE      = 0x17,
+       NVME_FEAT_FDP           = 0x1d,
        NVME_FEAT_SW_PROGRESS   = 0x80,
        NVME_FEAT_HOST_ID       = 0x81,
        NVME_FEAT_RESV_MASK     = 0x82,
@@ -1329,6 +1404,7 @@ enum {
        NVME_LOG_ANA            = 0x0c,
        NVME_LOG_FEATURES       = 0x12,
        NVME_LOG_RMI            = 0x16,
+       NVME_LOG_FDP_CONFIGS    = 0x20,
        NVME_LOG_DISC           = 0x70,
        NVME_LOG_RESERVATION    = 0x80,
        NVME_FWACT_REPL         = (0 << 3),
@@ -1923,6 +1999,7 @@ struct nvme_command {
                struct nvmf_auth_receive_command auth_receive;
                struct nvme_dbbuf dbbuf;
                struct nvme_directive_cmd directive;
+               struct nvme_io_mgmt_recv_cmd imr;
        };
 };