nvme.h: add ANA definitions
authorChristoph Hellwig <hch@lst.de>
Sun, 13 May 2018 16:53:57 +0000 (18:53 +0200)
committerChristoph Hellwig <hch@lst.de>
Fri, 27 Jul 2018 17:11:52 +0000 (19:11 +0200)
Add various defintions from NVMe 1.3 TP 4004.

Signed-off-by: Christoph Hellwig <hch@lst.de>
Reviewed-by: Keith Busch <keith.busch@intel.com>
Reviewed-by: Sagi Grimberg <sagi@grimberg.me>
Reviewed-by: Martin K. Petersen <martin.petersen@oracle.com>
Reviewed-by: Hannes Reinecke <hare@suse.com>
Reviewed-by: Johannes Thumshirn <jthumshirn@suse.de>
include/linux/nvme.h

index 39f05b0b8c7f7709f988596bd004eb4ea0d838fc..64c9175723de7001c3bfa558bd610b7f7d6450f7 100644 (file)
@@ -242,7 +242,12 @@ struct nvme_id_ctrl {
        __le32                  sanicap;
        __le32                  hmminds;
        __le16                  hmmaxd;
-       __u8                    rsvd338[174];
+       __u8                    rsvd338[4];
+       __u8                    anatt;
+       __u8                    anacap;
+       __le32                  anagrpmax;
+       __le32                  nanagrpid;
+       __u8                    rsvd352[160];
        __u8                    sqes;
        __u8                    cqes;
        __le16                  maxcmd;
@@ -258,7 +263,8 @@ struct nvme_id_ctrl {
        __le16                  acwu;
        __u8                    rsvd534[2];
        __le32                  sgls;
-       __u8                    rsvd540[228];
+       __le32                  mnan;
+       __u8                    rsvd544[224];
        char                    subnqn[256];
        __u8                    rsvd1024[768];
        __le32                  ioccsz;
@@ -312,7 +318,9 @@ struct nvme_id_ns {
        __le16                  nabspf;
        __le16                  noiob;
        __u8                    nvmcap[16];
-       __u8                    rsvd64[40];
+       __u8                    rsvd64[28];
+       __le32                  anagrpid;
+       __u8                    rsvd96[8];
        __u8                    nguid[16];
        __u8                    eui64[8];
        struct nvme_lbaf        lbaf[16];
@@ -425,6 +433,32 @@ struct nvme_effects_log {
        __u8   resv[2048];
 };
 
+enum nvme_ana_state {
+       NVME_ANA_OPTIMIZED              = 0x01,
+       NVME_ANA_NONOPTIMIZED           = 0x02,
+       NVME_ANA_INACCESSIBLE           = 0x03,
+       NVME_ANA_PERSISTENT_LOSS        = 0x04,
+       NVME_ANA_CHANGE                 = 0x0f,
+};
+
+struct nvme_ana_group_desc {
+       __le32  grpid;
+       __le32  nnsids;
+       __le64  chgcnt;
+       __u8    state;
+       __u8    rsvd17[7];
+       __le32  nsids[];
+};
+
+/* flag for the log specific field of the ANA log */
+#define NVME_ANA_LOG_RGO       (1 << 0)
+
+struct nvme_ana_rsp_hdr {
+       __le64  chgcnt;
+       __le16  ngrps;
+       __le16  rsvd10[3];
+};
+
 enum {
        NVME_SMART_CRIT_SPARE           = 1 << 0,
        NVME_SMART_CRIT_TEMPERATURE     = 1 << 1,
@@ -444,11 +478,13 @@ enum {
 enum {
        NVME_AER_NOTICE_NS_CHANGED      = 0x00,
        NVME_AER_NOTICE_FW_ACT_STARTING = 0x01,
+       NVME_AER_NOTICE_ANA             = 0x03,
 };
 
 enum {
        NVME_AEN_CFG_NS_ATTR            = 1 << 8,
        NVME_AEN_CFG_FW_ACT             = 1 << 9,
+       NVME_AEN_CFG_ANA_CHANGE         = 1 << 11,
 };
 
 struct nvme_lba_range_type {
@@ -763,6 +799,7 @@ enum {
        NVME_LOG_FW_SLOT        = 0x03,
        NVME_LOG_CHANGED_NS     = 0x04,
        NVME_LOG_CMD_EFFECTS    = 0x05,
+       NVME_LOG_ANA            = 0x0c,
        NVME_LOG_DISC           = 0x70,
        NVME_LOG_RESERVATION    = 0x80,
        NVME_FWACT_REPL         = (0 << 3),
@@ -1185,6 +1222,13 @@ enum {
        NVME_SC_ACCESS_DENIED           = 0x286,
        NVME_SC_UNWRITTEN_BLOCK         = 0x287,
 
+       /*
+        * Path-related Errors:
+        */
+       NVME_SC_ANA_PERSISTENT_LOSS     = 0x301,
+       NVME_SC_ANA_INACCESSIBLE        = 0x302,
+       NVME_SC_ANA_TRANSITION          = 0x303,
+
        NVME_SC_DNR                     = 0x4000,
 };