]> www.infradead.org Git - users/hch/misc.git/commitdiff
nvme.h: add FDP definitions
authorChristoph Hellwig <hch@lst.de>
Tue, 19 Nov 2024 10:29:49 +0000 (11:29 +0100)
committerChristoph Hellwig <hch@lst.de>
Tue, 19 Nov 2024 11:18:01 +0000 (12:18 +0100)
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>.

Signed-off-by: Christoph Hellwig <hch@lst.de>
include/linux/nvme.h

index 0a6e22038ce361e678326d16677045c2b9b6fcc5..0c4a81bf878e2fb6a2e86406b42dfc091ff370a1 100644 (file)
@@ -275,6 +275,7 @@ enum nvme_ctrl_attr {
        NVME_CTRL_ATTR_HID_128_BIT      = (1 << 0),
        NVME_CTRL_ATTR_TBKAS            = (1 << 6),
        NVME_CTRL_ATTR_ELBAS            = (1 << 15),
+       NVME_CTRL_ATTR_FDPS             = (1 << 19),
 };
 
 struct nvme_id_ctrl {
@@ -656,6 +657,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                  size;
+       __u8                    fdpa;
+       __u8                    vss;
+       __le32                  nrg;
+       __le16                  nruh;
+       __le16                  maxpids;
+       __le32                  nnss;
+       __le64                  runs;
+       __le32                  erutl;
+       __u8                    reserved[36];
+       struct nvme_fdp_ruh_desc ruhs[];
+};
+
+struct nvme_fdp_config_log {
+       __le16                  n;
+       __u8                    version;
+       __u8                    reserved;
+       __le32                  size;
+       __u8                    reserved2[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];
@@ -882,6 +921,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,
@@ -903,6 +943,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),      \
@@ -1054,6 +1095,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,
 };
 
@@ -1141,6 +1183,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,
@@ -1276,6 +1350,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,
@@ -1296,6 +1371,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),
@@ -1883,6 +1959,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;
        };
 };