xref: /openbmc/qemu/include/block/nvme.h (revision 44a9394b1d272b53306d097d4bc20ff7ad14b159)
1a3d9a352SFam Zheng #ifndef BLOCK_NVME_H
2a3d9a352SFam Zheng #define BLOCK_NVME_H
3a3d9a352SFam Zheng 
473064edfSJesper Devantier #include "hw/registerfields.h"
573064edfSJesper Devantier 
6e989738fSPhilippe Mathieu-Daudé typedef struct QEMU_PACKED NvmeBar {
7a3d9a352SFam Zheng     uint64_t    cap;
8a3d9a352SFam Zheng     uint32_t    vs;
9a3d9a352SFam Zheng     uint32_t    intms;
10a3d9a352SFam Zheng     uint32_t    intmc;
11a3d9a352SFam Zheng     uint32_t    cc;
129a31c615SGollu Appalanaidu     uint8_t     rsvd24[4];
13a3d9a352SFam Zheng     uint32_t    csts;
14a316aa50SKlaus Jensen     uint32_t    nssr;
15a3d9a352SFam Zheng     uint32_t    aqa;
16a3d9a352SFam Zheng     uint64_t    asq;
17a3d9a352SFam Zheng     uint64_t    acq;
18a3d9a352SFam Zheng     uint32_t    cmbloc;
19a3d9a352SFam Zheng     uint32_t    cmbsz;
20f4319477SPadmakar Kalghatgi     uint32_t    bpinfo;
21f4319477SPadmakar Kalghatgi     uint32_t    bprsel;
22f4319477SPadmakar Kalghatgi     uint64_t    bpmbl;
23f4319477SPadmakar Kalghatgi     uint64_t    cmbmsc;
24f4319477SPadmakar Kalghatgi     uint32_t    cmbsts;
25f4319477SPadmakar Kalghatgi     uint8_t     rsvd92[3492];
266cf94132SAndrzej Jakowski     uint32_t    pmrcap;
276cf94132SAndrzej Jakowski     uint32_t    pmrctl;
286cf94132SAndrzej Jakowski     uint32_t    pmrsts;
296cf94132SAndrzej Jakowski     uint32_t    pmrebs;
306cf94132SAndrzej Jakowski     uint32_t    pmrswtp;
315d45edbeSKlaus Jensen     uint32_t    pmrmscl;
325d45edbeSKlaus Jensen     uint32_t    pmrmscu;
33f4319477SPadmakar Kalghatgi     uint8_t     css[484];
34a3d9a352SFam Zheng } NvmeBar;
35a3d9a352SFam Zheng 
36a316aa50SKlaus Jensen enum NvmeBarRegs {
37a316aa50SKlaus Jensen     NVME_REG_CAP     = offsetof(NvmeBar, cap),
38a316aa50SKlaus Jensen     NVME_REG_VS      = offsetof(NvmeBar, vs),
39a316aa50SKlaus Jensen     NVME_REG_INTMS   = offsetof(NvmeBar, intms),
40a316aa50SKlaus Jensen     NVME_REG_INTMC   = offsetof(NvmeBar, intmc),
41a316aa50SKlaus Jensen     NVME_REG_CC      = offsetof(NvmeBar, cc),
42a316aa50SKlaus Jensen     NVME_REG_CSTS    = offsetof(NvmeBar, csts),
43a316aa50SKlaus Jensen     NVME_REG_NSSR    = offsetof(NvmeBar, nssr),
44a316aa50SKlaus Jensen     NVME_REG_AQA     = offsetof(NvmeBar, aqa),
45a316aa50SKlaus Jensen     NVME_REG_ASQ     = offsetof(NvmeBar, asq),
46a316aa50SKlaus Jensen     NVME_REG_ACQ     = offsetof(NvmeBar, acq),
47a316aa50SKlaus Jensen     NVME_REG_CMBLOC  = offsetof(NvmeBar, cmbloc),
48a316aa50SKlaus Jensen     NVME_REG_CMBSZ   = offsetof(NvmeBar, cmbsz),
49a316aa50SKlaus Jensen     NVME_REG_BPINFO  = offsetof(NvmeBar, bpinfo),
50a316aa50SKlaus Jensen     NVME_REG_BPRSEL  = offsetof(NvmeBar, bprsel),
51a316aa50SKlaus Jensen     NVME_REG_BPMBL   = offsetof(NvmeBar, bpmbl),
52a316aa50SKlaus Jensen     NVME_REG_CMBMSC  = offsetof(NvmeBar, cmbmsc),
53a316aa50SKlaus Jensen     NVME_REG_CMBSTS  = offsetof(NvmeBar, cmbsts),
54a316aa50SKlaus Jensen     NVME_REG_PMRCAP  = offsetof(NvmeBar, pmrcap),
55a316aa50SKlaus Jensen     NVME_REG_PMRCTL  = offsetof(NvmeBar, pmrctl),
56a316aa50SKlaus Jensen     NVME_REG_PMRSTS  = offsetof(NvmeBar, pmrsts),
57a316aa50SKlaus Jensen     NVME_REG_PMREBS  = offsetof(NvmeBar, pmrebs),
58a316aa50SKlaus Jensen     NVME_REG_PMRSWTP = offsetof(NvmeBar, pmrswtp),
59a316aa50SKlaus Jensen     NVME_REG_PMRMSCL = offsetof(NvmeBar, pmrmscl),
60a316aa50SKlaus Jensen     NVME_REG_PMRMSCU = offsetof(NvmeBar, pmrmscu),
61a316aa50SKlaus Jensen };
62a316aa50SKlaus Jensen 
63771dbc3aSKlaus Jensen typedef struct QEMU_PACKED NvmeEndGrpLog {
64771dbc3aSKlaus Jensen     uint8_t  critical_warning;
65771dbc3aSKlaus Jensen     uint8_t  rsvd[2];
66771dbc3aSKlaus Jensen     uint8_t  avail_spare;
67771dbc3aSKlaus Jensen     uint8_t  avail_spare_thres;
68771dbc3aSKlaus Jensen     uint8_t  percet_used;
69771dbc3aSKlaus Jensen     uint8_t  rsvd1[26];
70771dbc3aSKlaus Jensen     uint64_t end_estimate[2];
71771dbc3aSKlaus Jensen     uint64_t data_units_read[2];
72771dbc3aSKlaus Jensen     uint64_t data_units_written[2];
73771dbc3aSKlaus Jensen     uint64_t media_units_written[2];
74771dbc3aSKlaus Jensen     uint64_t host_read_commands[2];
75771dbc3aSKlaus Jensen     uint64_t host_write_commands[2];
76771dbc3aSKlaus Jensen     uint64_t media_integrity_errors[2];
77771dbc3aSKlaus Jensen     uint64_t no_err_info_log_entries[2];
78771dbc3aSKlaus Jensen     uint8_t rsvd2[352];
79771dbc3aSKlaus Jensen } NvmeEndGrpLog;
80771dbc3aSKlaus Jensen 
81a3d9a352SFam Zheng enum NvmeCapShift {
82a3d9a352SFam Zheng     CAP_MQES_SHIFT     = 0,
83a3d9a352SFam Zheng     CAP_CQR_SHIFT      = 16,
84a3d9a352SFam Zheng     CAP_AMS_SHIFT      = 17,
85a3d9a352SFam Zheng     CAP_TO_SHIFT       = 24,
86a3d9a352SFam Zheng     CAP_DSTRD_SHIFT    = 32,
87407d22ebSKlaus Jensen     CAP_NSSRS_SHIFT    = 36,
88a3d9a352SFam Zheng     CAP_CSS_SHIFT      = 37,
89a3d9a352SFam Zheng     CAP_MPSMIN_SHIFT   = 48,
90a3d9a352SFam Zheng     CAP_MPSMAX_SHIFT   = 52,
918e9e8b48SKlaus Jensen     CAP_PMRS_SHIFT     = 56,
928e9e8b48SKlaus Jensen     CAP_CMBS_SHIFT     = 57,
93a3d9a352SFam Zheng };
94a3d9a352SFam Zheng 
95a3d9a352SFam Zheng enum NvmeCapMask {
96a3d9a352SFam Zheng     CAP_MQES_MASK      = 0xffff,
97a3d9a352SFam Zheng     CAP_CQR_MASK       = 0x1,
98a3d9a352SFam Zheng     CAP_AMS_MASK       = 0x3,
99a3d9a352SFam Zheng     CAP_TO_MASK        = 0xff,
100a3d9a352SFam Zheng     CAP_DSTRD_MASK     = 0xf,
101a3d9a352SFam Zheng     CAP_NSSRS_MASK     = 0x1,
102a3d9a352SFam Zheng     CAP_CSS_MASK       = 0xff,
103a3d9a352SFam Zheng     CAP_MPSMIN_MASK    = 0xf,
104a3d9a352SFam Zheng     CAP_MPSMAX_MASK    = 0xf,
1058e9e8b48SKlaus Jensen     CAP_PMRS_MASK      = 0x1,
1068e9e8b48SKlaus Jensen     CAP_CMBS_MASK      = 0x1,
107a3d9a352SFam Zheng };
108a3d9a352SFam Zheng 
109a3d9a352SFam Zheng #define NVME_CAP_MQES(cap)  (((cap) >> CAP_MQES_SHIFT)   & CAP_MQES_MASK)
110a3d9a352SFam Zheng #define NVME_CAP_CQR(cap)   (((cap) >> CAP_CQR_SHIFT)    & CAP_CQR_MASK)
111a3d9a352SFam Zheng #define NVME_CAP_AMS(cap)   (((cap) >> CAP_AMS_SHIFT)    & CAP_AMS_MASK)
112a3d9a352SFam Zheng #define NVME_CAP_TO(cap)    (((cap) >> CAP_TO_SHIFT)     & CAP_TO_MASK)
113a3d9a352SFam Zheng #define NVME_CAP_DSTRD(cap) (((cap) >> CAP_DSTRD_SHIFT)  & CAP_DSTRD_MASK)
114a3d9a352SFam Zheng #define NVME_CAP_NSSRS(cap) (((cap) >> CAP_NSSRS_SHIFT)  & CAP_NSSRS_MASK)
115a3d9a352SFam Zheng #define NVME_CAP_CSS(cap)   (((cap) >> CAP_CSS_SHIFT)    & CAP_CSS_MASK)
116a3d9a352SFam Zheng #define NVME_CAP_MPSMIN(cap)(((cap) >> CAP_MPSMIN_SHIFT) & CAP_MPSMIN_MASK)
117a3d9a352SFam Zheng #define NVME_CAP_MPSMAX(cap)(((cap) >> CAP_MPSMAX_SHIFT) & CAP_MPSMAX_MASK)
1188e9e8b48SKlaus Jensen #define NVME_CAP_PMRS(cap)  (((cap) >> CAP_PMRS_SHIFT)   & CAP_PMRS_MASK)
119f4319477SPadmakar Kalghatgi #define NVME_CAP_CMBS(cap)  (((cap) >> CAP_CMBS_SHIFT)   & CAP_CMBS_MASK)
120a3d9a352SFam Zheng 
12143f76aacSDarren Kenny #define NVME_CAP_SET_MQES(cap, val)   \
12243f76aacSDarren Kenny     ((cap) |= (uint64_t)((val) & CAP_MQES_MASK)   << CAP_MQES_SHIFT)
12343f76aacSDarren Kenny #define NVME_CAP_SET_CQR(cap, val)    \
12443f76aacSDarren Kenny     ((cap) |= (uint64_t)((val) & CAP_CQR_MASK)    << CAP_CQR_SHIFT)
12543f76aacSDarren Kenny #define NVME_CAP_SET_AMS(cap, val)    \
12643f76aacSDarren Kenny     ((cap) |= (uint64_t)((val) & CAP_AMS_MASK)    << CAP_AMS_SHIFT)
12743f76aacSDarren Kenny #define NVME_CAP_SET_TO(cap, val)     \
12843f76aacSDarren Kenny     ((cap) |= (uint64_t)((val) & CAP_TO_MASK)     << CAP_TO_SHIFT)
12943f76aacSDarren Kenny #define NVME_CAP_SET_DSTRD(cap, val)  \
13043f76aacSDarren Kenny     ((cap) |= (uint64_t)((val) & CAP_DSTRD_MASK)  << CAP_DSTRD_SHIFT)
13143f76aacSDarren Kenny #define NVME_CAP_SET_NSSRS(cap, val)  \
13243f76aacSDarren Kenny     ((cap) |= (uint64_t)((val) & CAP_NSSRS_MASK)  << CAP_NSSRS_SHIFT)
13343f76aacSDarren Kenny #define NVME_CAP_SET_CSS(cap, val)    \
13443f76aacSDarren Kenny     ((cap) |= (uint64_t)((val) & CAP_CSS_MASK)    << CAP_CSS_SHIFT)
13543f76aacSDarren Kenny #define NVME_CAP_SET_MPSMIN(cap, val) \
13643f76aacSDarren Kenny     ((cap) |= (uint64_t)((val) & CAP_MPSMIN_MASK) << CAP_MPSMIN_SHIFT)
13743f76aacSDarren Kenny #define NVME_CAP_SET_MPSMAX(cap, val) \
13843f76aacSDarren Kenny     ((cap) |= (uint64_t)((val) & CAP_MPSMAX_MASK) << CAP_MPSMAX_SHIFT)
13943f76aacSDarren Kenny #define NVME_CAP_SET_PMRS(cap, val)   \
14043f76aacSDarren Kenny     ((cap) |= (uint64_t)((val) & CAP_PMRS_MASK)   << CAP_PMRS_SHIFT)
14143f76aacSDarren Kenny #define NVME_CAP_SET_CMBS(cap, val)   \
14243f76aacSDarren Kenny     ((cap) |= (uint64_t)((val) & CAP_CMBS_MASK)   << CAP_CMBS_SHIFT)
143a3d9a352SFam Zheng 
144492f9a8dSKeith Busch enum NvmeCapCss {
145492f9a8dSKeith Busch     NVME_CAP_CSS_NVM        = 1 << 0,
146141354d5SNiklas Cassel     NVME_CAP_CSS_CSI_SUPP   = 1 << 6,
1478c5cea85SKeith Busch     NVME_CAP_CSS_ADMIN_ONLY = 1 << 7,
148492f9a8dSKeith Busch };
149492f9a8dSKeith Busch 
150a3d9a352SFam Zheng enum NvmeCcShift {
151a3d9a352SFam Zheng     CC_EN_SHIFT     = 0,
152a3d9a352SFam Zheng     CC_CSS_SHIFT    = 4,
153a3d9a352SFam Zheng     CC_MPS_SHIFT    = 7,
154a3d9a352SFam Zheng     CC_AMS_SHIFT    = 11,
155a3d9a352SFam Zheng     CC_SHN_SHIFT    = 14,
156a3d9a352SFam Zheng     CC_IOSQES_SHIFT = 16,
157a3d9a352SFam Zheng     CC_IOCQES_SHIFT = 20,
158a3d9a352SFam Zheng };
159a3d9a352SFam Zheng 
160a3d9a352SFam Zheng enum NvmeCcMask {
161a3d9a352SFam Zheng     CC_EN_MASK      = 0x1,
162a3d9a352SFam Zheng     CC_CSS_MASK     = 0x7,
163a3d9a352SFam Zheng     CC_MPS_MASK     = 0xf,
164a3d9a352SFam Zheng     CC_AMS_MASK     = 0x7,
165a3d9a352SFam Zheng     CC_SHN_MASK     = 0x3,
166a3d9a352SFam Zheng     CC_IOSQES_MASK  = 0xf,
167a3d9a352SFam Zheng     CC_IOCQES_MASK  = 0xf,
168a3d9a352SFam Zheng };
169a3d9a352SFam Zheng 
170a3d9a352SFam Zheng #define NVME_CC_EN(cc)     ((cc >> CC_EN_SHIFT)     & CC_EN_MASK)
171a3d9a352SFam Zheng #define NVME_CC_CSS(cc)    ((cc >> CC_CSS_SHIFT)    & CC_CSS_MASK)
172a3d9a352SFam Zheng #define NVME_CC_MPS(cc)    ((cc >> CC_MPS_SHIFT)    & CC_MPS_MASK)
173a3d9a352SFam Zheng #define NVME_CC_AMS(cc)    ((cc >> CC_AMS_SHIFT)    & CC_AMS_MASK)
174a3d9a352SFam Zheng #define NVME_CC_SHN(cc)    ((cc >> CC_SHN_SHIFT)    & CC_SHN_MASK)
175a3d9a352SFam Zheng #define NVME_CC_IOSQES(cc) ((cc >> CC_IOSQES_SHIFT) & CC_IOSQES_MASK)
176a3d9a352SFam Zheng #define NVME_CC_IOCQES(cc) ((cc >> CC_IOCQES_SHIFT) & CC_IOCQES_MASK)
177a3d9a352SFam Zheng 
1781b48e461SKlaus Jensen enum NvmeCcCss {
1791b48e461SKlaus Jensen     NVME_CC_CSS_NVM        = 0x0,
180141354d5SNiklas Cassel     NVME_CC_CSS_CSI        = 0x6,
1811b48e461SKlaus Jensen     NVME_CC_CSS_ADMIN_ONLY = 0x7,
1821b48e461SKlaus Jensen };
1831b48e461SKlaus Jensen 
184141354d5SNiklas Cassel #define NVME_SET_CC_EN(cc, val)     \
185141354d5SNiklas Cassel     (cc |= (uint32_t)((val) & CC_EN_MASK) << CC_EN_SHIFT)
186141354d5SNiklas Cassel #define NVME_SET_CC_CSS(cc, val)    \
187141354d5SNiklas Cassel     (cc |= (uint32_t)((val) & CC_CSS_MASK) << CC_CSS_SHIFT)
188141354d5SNiklas Cassel #define NVME_SET_CC_MPS(cc, val)    \
189141354d5SNiklas Cassel     (cc |= (uint32_t)((val) & CC_MPS_MASK) << CC_MPS_SHIFT)
190141354d5SNiklas Cassel #define NVME_SET_CC_AMS(cc, val)    \
191141354d5SNiklas Cassel     (cc |= (uint32_t)((val) & CC_AMS_MASK) << CC_AMS_SHIFT)
192141354d5SNiklas Cassel #define NVME_SET_CC_SHN(cc, val)    \
193141354d5SNiklas Cassel     (cc |= (uint32_t)((val) & CC_SHN_MASK) << CC_SHN_SHIFT)
194141354d5SNiklas Cassel #define NVME_SET_CC_IOSQES(cc, val) \
195141354d5SNiklas Cassel     (cc |= (uint32_t)((val) & CC_IOSQES_MASK) << CC_IOSQES_SHIFT)
196141354d5SNiklas Cassel #define NVME_SET_CC_IOCQES(cc, val) \
197141354d5SNiklas Cassel     (cc |= (uint32_t)((val) & CC_IOCQES_MASK) << CC_IOCQES_SHIFT)
198141354d5SNiklas Cassel 
199a3d9a352SFam Zheng enum NvmeCstsShift {
200a3d9a352SFam Zheng     CSTS_RDY_SHIFT      = 0,
201a3d9a352SFam Zheng     CSTS_CFS_SHIFT      = 1,
202a3d9a352SFam Zheng     CSTS_SHST_SHIFT     = 2,
203a3d9a352SFam Zheng     CSTS_NSSRO_SHIFT    = 4,
204a3d9a352SFam Zheng };
205a3d9a352SFam Zheng 
206a3d9a352SFam Zheng enum NvmeCstsMask {
207a3d9a352SFam Zheng     CSTS_RDY_MASK   = 0x1,
208a3d9a352SFam Zheng     CSTS_CFS_MASK   = 0x1,
209a3d9a352SFam Zheng     CSTS_SHST_MASK  = 0x3,
210a3d9a352SFam Zheng     CSTS_NSSRO_MASK = 0x1,
211a3d9a352SFam Zheng };
212a3d9a352SFam Zheng 
213a3d9a352SFam Zheng enum NvmeCsts {
214a3d9a352SFam Zheng     NVME_CSTS_READY         = 1 << CSTS_RDY_SHIFT,
215a3d9a352SFam Zheng     NVME_CSTS_FAILED        = 1 << CSTS_CFS_SHIFT,
216a3d9a352SFam Zheng     NVME_CSTS_SHST_NORMAL   = 0 << CSTS_SHST_SHIFT,
217a3d9a352SFam Zheng     NVME_CSTS_SHST_PROGRESS = 1 << CSTS_SHST_SHIFT,
218a3d9a352SFam Zheng     NVME_CSTS_SHST_COMPLETE = 2 << CSTS_SHST_SHIFT,
219a3d9a352SFam Zheng     NVME_CSTS_NSSRO         = 1 << CSTS_NSSRO_SHIFT,
220a3d9a352SFam Zheng };
221a3d9a352SFam Zheng 
222a3d9a352SFam Zheng #define NVME_CSTS_RDY(csts)     ((csts >> CSTS_RDY_SHIFT)   & CSTS_RDY_MASK)
223a3d9a352SFam Zheng #define NVME_CSTS_CFS(csts)     ((csts >> CSTS_CFS_SHIFT)   & CSTS_CFS_MASK)
224a3d9a352SFam Zheng #define NVME_CSTS_SHST(csts)    ((csts >> CSTS_SHST_SHIFT)  & CSTS_SHST_MASK)
225a3d9a352SFam Zheng #define NVME_CSTS_NSSRO(csts)   ((csts >> CSTS_NSSRO_SHIFT) & CSTS_NSSRO_MASK)
226a3d9a352SFam Zheng 
227a3d9a352SFam Zheng enum NvmeAqaShift {
228a3d9a352SFam Zheng     AQA_ASQS_SHIFT  = 0,
229a3d9a352SFam Zheng     AQA_ACQS_SHIFT  = 16,
230a3d9a352SFam Zheng };
231a3d9a352SFam Zheng 
232a3d9a352SFam Zheng enum NvmeAqaMask {
233a3d9a352SFam Zheng     AQA_ASQS_MASK   = 0xfff,
234a3d9a352SFam Zheng     AQA_ACQS_MASK   = 0xfff,
235a3d9a352SFam Zheng };
236a3d9a352SFam Zheng 
237a3d9a352SFam Zheng #define NVME_AQA_ASQS(aqa) ((aqa >> AQA_ASQS_SHIFT) & AQA_ASQS_MASK)
238a3d9a352SFam Zheng #define NVME_AQA_ACQS(aqa) ((aqa >> AQA_ACQS_SHIFT) & AQA_ACQS_MASK)
239a3d9a352SFam Zheng 
240a3d9a352SFam Zheng enum NvmeCmblocShift {
241a3d9a352SFam Zheng     CMBLOC_BIR_SHIFT     = 0,
242f4319477SPadmakar Kalghatgi     CMBLOC_CQMMS_SHIFT   = 3,
243f4319477SPadmakar Kalghatgi     CMBLOC_CQPDS_SHIFT   = 4,
244f4319477SPadmakar Kalghatgi     CMBLOC_CDPMLS_SHIFT  = 5,
245f4319477SPadmakar Kalghatgi     CMBLOC_CDPCILS_SHIFT = 6,
246f4319477SPadmakar Kalghatgi     CMBLOC_CDMMMS_SHIFT  = 7,
247f4319477SPadmakar Kalghatgi     CMBLOC_CQDA_SHIFT    = 8,
248a3d9a352SFam Zheng     CMBLOC_OFST_SHIFT    = 12,
249a3d9a352SFam Zheng };
250a3d9a352SFam Zheng 
251a3d9a352SFam Zheng enum NvmeCmblocMask {
252a3d9a352SFam Zheng     CMBLOC_BIR_MASK     = 0x7,
253f4319477SPadmakar Kalghatgi     CMBLOC_CQMMS_MASK   = 0x1,
254f4319477SPadmakar Kalghatgi     CMBLOC_CQPDS_MASK   = 0x1,
255f4319477SPadmakar Kalghatgi     CMBLOC_CDPMLS_MASK  = 0x1,
256f4319477SPadmakar Kalghatgi     CMBLOC_CDPCILS_MASK = 0x1,
257f4319477SPadmakar Kalghatgi     CMBLOC_CDMMMS_MASK  = 0x1,
258f4319477SPadmakar Kalghatgi     CMBLOC_CQDA_MASK    = 0x1,
259a3d9a352SFam Zheng     CMBLOC_OFST_MASK    = 0xfffff,
260a3d9a352SFam Zheng };
261a3d9a352SFam Zheng 
262f4319477SPadmakar Kalghatgi #define NVME_CMBLOC_BIR(cmbloc) \
263f4319477SPadmakar Kalghatgi     ((cmbloc >> CMBLOC_BIR_SHIFT) & CMBLOC_BIR_MASK)
264f4319477SPadmakar Kalghatgi #define NVME_CMBLOC_CQMMS(cmbloc) \
265f4319477SPadmakar Kalghatgi     ((cmbloc >> CMBLOC_CQMMS_SHIFT) & CMBLOC_CQMMS_MASK)
266f4319477SPadmakar Kalghatgi #define NVME_CMBLOC_CQPDS(cmbloc) \
267f4319477SPadmakar Kalghatgi     ((cmbloc >> CMBLOC_CQPDS_SHIFT) & CMBLOC_CQPDS_MASK)
268f4319477SPadmakar Kalghatgi #define NVME_CMBLOC_CDPMLS(cmbloc) \
269f4319477SPadmakar Kalghatgi     ((cmbloc >> CMBLOC_CDPMLS_SHIFT) & CMBLOC_CDPMLS_MASK)
270f4319477SPadmakar Kalghatgi #define NVME_CMBLOC_CDPCILS(cmbloc) \
271f4319477SPadmakar Kalghatgi     ((cmbloc >> CMBLOC_CDPCILS_SHIFT) & CMBLOC_CDPCILS_MASK)
272f4319477SPadmakar Kalghatgi #define NVME_CMBLOC_CDMMMS(cmbloc) \
273f4319477SPadmakar Kalghatgi     ((cmbloc >> CMBLOC_CDMMMS_SHIFT) & CMBLOC_CDMMMS_MASK)
274f4319477SPadmakar Kalghatgi #define NVME_CMBLOC_CQDA(cmbloc) \
275f4319477SPadmakar Kalghatgi     ((cmbloc >> CMBLOC_CQDA_SHIFT) & CMBLOC_CQDA_MASK)
276f4319477SPadmakar Kalghatgi #define NVME_CMBLOC_OFST(cmbloc) \
277f4319477SPadmakar Kalghatgi     ((cmbloc >> CMBLOC_OFST_SHIFT) & CMBLOC_OFST_MASK)
278a3d9a352SFam Zheng 
279a3d9a352SFam Zheng #define NVME_CMBLOC_SET_BIR(cmbloc, val) \
280a3d9a352SFam Zheng     (cmbloc |= (uint64_t)(val & CMBLOC_BIR_MASK) << CMBLOC_BIR_SHIFT)
281f4319477SPadmakar Kalghatgi #define NVME_CMBLOC_SET_CQMMS(cmbloc, val) \
282f4319477SPadmakar Kalghatgi     (cmbloc |= (uint64_t)(val & CMBLOC_CQMMS_MASK) << CMBLOC_CQMMS_SHIFT)
283f4319477SPadmakar Kalghatgi #define NVME_CMBLOC_SET_CQPDS(cmbloc, val) \
284f4319477SPadmakar Kalghatgi     (cmbloc |= (uint64_t)(val & CMBLOC_CQPDS_MASK) << CMBLOC_CQPDS_SHIFT)
285f4319477SPadmakar Kalghatgi #define NVME_CMBLOC_SET_CDPMLS(cmbloc, val) \
286f4319477SPadmakar Kalghatgi     (cmbloc |= (uint64_t)(val & CMBLOC_CDPMLS_MASK) << CMBLOC_CDPMLS_SHIFT)
287f4319477SPadmakar Kalghatgi #define NVME_CMBLOC_SET_CDPCILS(cmbloc, val) \
288f4319477SPadmakar Kalghatgi     (cmbloc |= (uint64_t)(val & CMBLOC_CDPCILS_MASK) << CMBLOC_CDPCILS_SHIFT)
289f4319477SPadmakar Kalghatgi #define NVME_CMBLOC_SET_CDMMMS(cmbloc, val) \
290f4319477SPadmakar Kalghatgi     (cmbloc |= (uint64_t)(val & CMBLOC_CDMMMS_MASK) << CMBLOC_CDMMMS_SHIFT)
291f4319477SPadmakar Kalghatgi #define NVME_CMBLOC_SET_CQDA(cmbloc, val) \
292f4319477SPadmakar Kalghatgi     (cmbloc |= (uint64_t)(val & CMBLOC_CQDA_MASK) << CMBLOC_CQDA_SHIFT)
293a3d9a352SFam Zheng #define NVME_CMBLOC_SET_OFST(cmbloc, val) \
294a3d9a352SFam Zheng     (cmbloc |= (uint64_t)(val & CMBLOC_OFST_MASK) << CMBLOC_OFST_SHIFT)
295a3d9a352SFam Zheng 
296f4319477SPadmakar Kalghatgi #define NVME_CMBMSMC_SET_CRE (cmbmsc, val) \
297f4319477SPadmakar Kalghatgi     (cmbmsc |= (uint64_t)(val & CMBLOC_OFST_MASK) << CMBMSC_CRE_SHIFT)
298f4319477SPadmakar Kalghatgi 
299a3d9a352SFam Zheng enum NvmeCmbszShift {
300a3d9a352SFam Zheng     CMBSZ_SQS_SHIFT   = 0,
301a3d9a352SFam Zheng     CMBSZ_CQS_SHIFT   = 1,
302a3d9a352SFam Zheng     CMBSZ_LISTS_SHIFT = 2,
303a3d9a352SFam Zheng     CMBSZ_RDS_SHIFT   = 3,
304a3d9a352SFam Zheng     CMBSZ_WDS_SHIFT   = 4,
305a3d9a352SFam Zheng     CMBSZ_SZU_SHIFT   = 8,
306a3d9a352SFam Zheng     CMBSZ_SZ_SHIFT    = 12,
307a3d9a352SFam Zheng };
308a3d9a352SFam Zheng 
309a3d9a352SFam Zheng enum NvmeCmbszMask {
310a3d9a352SFam Zheng     CMBSZ_SQS_MASK   = 0x1,
311a3d9a352SFam Zheng     CMBSZ_CQS_MASK   = 0x1,
312a3d9a352SFam Zheng     CMBSZ_LISTS_MASK = 0x1,
313a3d9a352SFam Zheng     CMBSZ_RDS_MASK   = 0x1,
314a3d9a352SFam Zheng     CMBSZ_WDS_MASK   = 0x1,
315a3d9a352SFam Zheng     CMBSZ_SZU_MASK   = 0xf,
316a3d9a352SFam Zheng     CMBSZ_SZ_MASK    = 0xfffff,
317a3d9a352SFam Zheng };
318a3d9a352SFam Zheng 
319a3d9a352SFam Zheng #define NVME_CMBSZ_SQS(cmbsz)  ((cmbsz >> CMBSZ_SQS_SHIFT)   & CMBSZ_SQS_MASK)
320a3d9a352SFam Zheng #define NVME_CMBSZ_CQS(cmbsz)  ((cmbsz >> CMBSZ_CQS_SHIFT)   & CMBSZ_CQS_MASK)
321a3d9a352SFam Zheng #define NVME_CMBSZ_LISTS(cmbsz)((cmbsz >> CMBSZ_LISTS_SHIFT) & CMBSZ_LISTS_MASK)
322a3d9a352SFam Zheng #define NVME_CMBSZ_RDS(cmbsz)  ((cmbsz >> CMBSZ_RDS_SHIFT)   & CMBSZ_RDS_MASK)
323a3d9a352SFam Zheng #define NVME_CMBSZ_WDS(cmbsz)  ((cmbsz >> CMBSZ_WDS_SHIFT)   & CMBSZ_WDS_MASK)
324a3d9a352SFam Zheng #define NVME_CMBSZ_SZU(cmbsz)  ((cmbsz >> CMBSZ_SZU_SHIFT)   & CMBSZ_SZU_MASK)
325a3d9a352SFam Zheng #define NVME_CMBSZ_SZ(cmbsz)   ((cmbsz >> CMBSZ_SZ_SHIFT)    & CMBSZ_SZ_MASK)
326a3d9a352SFam Zheng 
327a3d9a352SFam Zheng #define NVME_CMBSZ_SET_SQS(cmbsz, val)   \
328a3d9a352SFam Zheng     (cmbsz |= (uint64_t)(val &  CMBSZ_SQS_MASK)  << CMBSZ_SQS_SHIFT)
329a3d9a352SFam Zheng #define NVME_CMBSZ_SET_CQS(cmbsz, val)   \
330a3d9a352SFam Zheng     (cmbsz |= (uint64_t)(val & CMBSZ_CQS_MASK) << CMBSZ_CQS_SHIFT)
331a3d9a352SFam Zheng #define NVME_CMBSZ_SET_LISTS(cmbsz, val) \
332a3d9a352SFam Zheng     (cmbsz |= (uint64_t)(val & CMBSZ_LISTS_MASK) << CMBSZ_LISTS_SHIFT)
333a3d9a352SFam Zheng #define NVME_CMBSZ_SET_RDS(cmbsz, val)   \
334a3d9a352SFam Zheng     (cmbsz |= (uint64_t)(val & CMBSZ_RDS_MASK) << CMBSZ_RDS_SHIFT)
335a3d9a352SFam Zheng #define NVME_CMBSZ_SET_WDS(cmbsz, val)   \
336a3d9a352SFam Zheng     (cmbsz |= (uint64_t)(val & CMBSZ_WDS_MASK) << CMBSZ_WDS_SHIFT)
337a3d9a352SFam Zheng #define NVME_CMBSZ_SET_SZU(cmbsz, val)   \
338a3d9a352SFam Zheng     (cmbsz |= (uint64_t)(val & CMBSZ_SZU_MASK) << CMBSZ_SZU_SHIFT)
339a3d9a352SFam Zheng #define NVME_CMBSZ_SET_SZ(cmbsz, val)    \
340a3d9a352SFam Zheng     (cmbsz |= (uint64_t)(val & CMBSZ_SZ_MASK) << CMBSZ_SZ_SHIFT)
341a3d9a352SFam Zheng 
342a3d9a352SFam Zheng #define NVME_CMBSZ_GETSIZE(cmbsz) \
343a3d9a352SFam Zheng     (NVME_CMBSZ_SZ(cmbsz) * (1 << (12 + 4 * NVME_CMBSZ_SZU(cmbsz))))
344a3d9a352SFam Zheng 
345f4319477SPadmakar Kalghatgi enum NvmeCmbmscShift {
346f4319477SPadmakar Kalghatgi     CMBMSC_CRE_SHIFT  = 0,
347f4319477SPadmakar Kalghatgi     CMBMSC_CMSE_SHIFT = 1,
348f4319477SPadmakar Kalghatgi     CMBMSC_CBA_SHIFT  = 12,
349f4319477SPadmakar Kalghatgi };
350f4319477SPadmakar Kalghatgi 
351f4319477SPadmakar Kalghatgi enum NvmeCmbmscMask {
352f4319477SPadmakar Kalghatgi     CMBMSC_CRE_MASK  = 0x1,
353f4319477SPadmakar Kalghatgi     CMBMSC_CMSE_MASK = 0x1,
354f4319477SPadmakar Kalghatgi     CMBMSC_CBA_MASK  = ((1ULL << 52) - 1),
355f4319477SPadmakar Kalghatgi };
356f4319477SPadmakar Kalghatgi 
357f4319477SPadmakar Kalghatgi #define NVME_CMBMSC_CRE(cmbmsc) \
358f4319477SPadmakar Kalghatgi     ((cmbmsc >> CMBMSC_CRE_SHIFT)  & CMBMSC_CRE_MASK)
359f4319477SPadmakar Kalghatgi #define NVME_CMBMSC_CMSE(cmbmsc) \
360f4319477SPadmakar Kalghatgi     ((cmbmsc >> CMBMSC_CMSE_SHIFT) & CMBMSC_CMSE_MASK)
361f4319477SPadmakar Kalghatgi #define NVME_CMBMSC_CBA(cmbmsc) \
362f4319477SPadmakar Kalghatgi     ((cmbmsc >> CMBMSC_CBA_SHIFT) & CMBMSC_CBA_MASK)
363f4319477SPadmakar Kalghatgi 
364f4319477SPadmakar Kalghatgi 
365f4319477SPadmakar Kalghatgi #define NVME_CMBMSC_SET_CRE(cmbmsc, val)  \
366f4319477SPadmakar Kalghatgi     (cmbmsc |= (uint64_t)(val & CMBMSC_CRE_MASK) << CMBMSC_CRE_SHIFT)
367f4319477SPadmakar Kalghatgi #define NVME_CMBMSC_SET_CMSE(cmbmsc, val) \
368f4319477SPadmakar Kalghatgi     (cmbmsc |= (uint64_t)(val & CMBMSC_CMSE_MASK) << CMBMSC_CMSE_SHIFT)
369f4319477SPadmakar Kalghatgi #define NVME_CMBMSC_SET_CBA(cmbmsc, val) \
370f4319477SPadmakar Kalghatgi     (cmbmsc |= (uint64_t)(val & CMBMSC_CBA_MASK) << CMBMSC_CBA_SHIFT)
371f4319477SPadmakar Kalghatgi 
372f4319477SPadmakar Kalghatgi enum NvmeCmbstsShift {
373f4319477SPadmakar Kalghatgi     CMBSTS_CBAI_SHIFT = 0,
374f4319477SPadmakar Kalghatgi };
375f4319477SPadmakar Kalghatgi enum NvmeCmbstsMask {
376f4319477SPadmakar Kalghatgi     CMBSTS_CBAI_MASK = 0x1,
377f4319477SPadmakar Kalghatgi };
378f4319477SPadmakar Kalghatgi 
379f4319477SPadmakar Kalghatgi #define NVME_CMBSTS_CBAI(cmbsts) \
380f4319477SPadmakar Kalghatgi     ((cmbsts >> CMBSTS_CBAI_SHIFT) & CMBSTS_CBAI_MASK)
381f4319477SPadmakar Kalghatgi 
382f4319477SPadmakar Kalghatgi #define NVME_CMBSTS_SET_CBAI(cmbsts, val)  \
383f4319477SPadmakar Kalghatgi     (cmbsts |= (uint64_t)(val & CMBSTS_CBAI_MASK) << CMBSTS_CBAI_SHIFT)
384f4319477SPadmakar Kalghatgi 
3856cf94132SAndrzej Jakowski enum NvmePmrcapShift {
3866cf94132SAndrzej Jakowski     PMRCAP_RDS_SHIFT      = 3,
3876cf94132SAndrzej Jakowski     PMRCAP_WDS_SHIFT      = 4,
3886cf94132SAndrzej Jakowski     PMRCAP_BIR_SHIFT      = 5,
3896cf94132SAndrzej Jakowski     PMRCAP_PMRTU_SHIFT    = 8,
3906cf94132SAndrzej Jakowski     PMRCAP_PMRWBM_SHIFT   = 10,
3916cf94132SAndrzej Jakowski     PMRCAP_PMRTO_SHIFT    = 16,
3926cf94132SAndrzej Jakowski     PMRCAP_CMSS_SHIFT     = 24,
3936cf94132SAndrzej Jakowski };
3946cf94132SAndrzej Jakowski 
3956cf94132SAndrzej Jakowski enum NvmePmrcapMask {
3966cf94132SAndrzej Jakowski     PMRCAP_RDS_MASK      = 0x1,
3976cf94132SAndrzej Jakowski     PMRCAP_WDS_MASK      = 0x1,
3986cf94132SAndrzej Jakowski     PMRCAP_BIR_MASK      = 0x7,
3996cf94132SAndrzej Jakowski     PMRCAP_PMRTU_MASK    = 0x3,
4006cf94132SAndrzej Jakowski     PMRCAP_PMRWBM_MASK   = 0xf,
4016cf94132SAndrzej Jakowski     PMRCAP_PMRTO_MASK    = 0xff,
4026cf94132SAndrzej Jakowski     PMRCAP_CMSS_MASK     = 0x1,
4036cf94132SAndrzej Jakowski };
4046cf94132SAndrzej Jakowski 
4056cf94132SAndrzej Jakowski #define NVME_PMRCAP_RDS(pmrcap)    \
4066cf94132SAndrzej Jakowski     ((pmrcap >> PMRCAP_RDS_SHIFT)   & PMRCAP_RDS_MASK)
4076cf94132SAndrzej Jakowski #define NVME_PMRCAP_WDS(pmrcap)    \
4086cf94132SAndrzej Jakowski     ((pmrcap >> PMRCAP_WDS_SHIFT)   & PMRCAP_WDS_MASK)
4096cf94132SAndrzej Jakowski #define NVME_PMRCAP_BIR(pmrcap)    \
4106cf94132SAndrzej Jakowski     ((pmrcap >> PMRCAP_BIR_SHIFT)   & PMRCAP_BIR_MASK)
4116cf94132SAndrzej Jakowski #define NVME_PMRCAP_PMRTU(pmrcap)    \
4126cf94132SAndrzej Jakowski     ((pmrcap >> PMRCAP_PMRTU_SHIFT)   & PMRCAP_PMRTU_MASK)
4136cf94132SAndrzej Jakowski #define NVME_PMRCAP_PMRWBM(pmrcap)    \
4146cf94132SAndrzej Jakowski     ((pmrcap >> PMRCAP_PMRWBM_SHIFT)   & PMRCAP_PMRWBM_MASK)
4156cf94132SAndrzej Jakowski #define NVME_PMRCAP_PMRTO(pmrcap)    \
4166cf94132SAndrzej Jakowski     ((pmrcap >> PMRCAP_PMRTO_SHIFT)   & PMRCAP_PMRTO_MASK)
4176cf94132SAndrzej Jakowski #define NVME_PMRCAP_CMSS(pmrcap)    \
4186cf94132SAndrzej Jakowski     ((pmrcap >> PMRCAP_CMSS_SHIFT)   & PMRCAP_CMSS_MASK)
4196cf94132SAndrzej Jakowski 
4206cf94132SAndrzej Jakowski #define NVME_PMRCAP_SET_RDS(pmrcap, val)   \
4216cf94132SAndrzej Jakowski     (pmrcap |= (uint64_t)(val & PMRCAP_RDS_MASK) << PMRCAP_RDS_SHIFT)
4226cf94132SAndrzej Jakowski #define NVME_PMRCAP_SET_WDS(pmrcap, val)   \
4236cf94132SAndrzej Jakowski     (pmrcap |= (uint64_t)(val & PMRCAP_WDS_MASK) << PMRCAP_WDS_SHIFT)
4246cf94132SAndrzej Jakowski #define NVME_PMRCAP_SET_BIR(pmrcap, val)   \
4256cf94132SAndrzej Jakowski     (pmrcap |= (uint64_t)(val & PMRCAP_BIR_MASK) << PMRCAP_BIR_SHIFT)
4266cf94132SAndrzej Jakowski #define NVME_PMRCAP_SET_PMRTU(pmrcap, val)   \
4276cf94132SAndrzej Jakowski     (pmrcap |= (uint64_t)(val & PMRCAP_PMRTU_MASK) << PMRCAP_PMRTU_SHIFT)
4286cf94132SAndrzej Jakowski #define NVME_PMRCAP_SET_PMRWBM(pmrcap, val)   \
4296cf94132SAndrzej Jakowski     (pmrcap |= (uint64_t)(val & PMRCAP_PMRWBM_MASK) << PMRCAP_PMRWBM_SHIFT)
4306cf94132SAndrzej Jakowski #define NVME_PMRCAP_SET_PMRTO(pmrcap, val)   \
4316cf94132SAndrzej Jakowski     (pmrcap |= (uint64_t)(val & PMRCAP_PMRTO_MASK) << PMRCAP_PMRTO_SHIFT)
4326cf94132SAndrzej Jakowski #define NVME_PMRCAP_SET_CMSS(pmrcap, val)   \
4336cf94132SAndrzej Jakowski     (pmrcap |= (uint64_t)(val & PMRCAP_CMSS_MASK) << PMRCAP_CMSS_SHIFT)
4346cf94132SAndrzej Jakowski 
4356cf94132SAndrzej Jakowski enum NvmePmrctlShift {
4366cf94132SAndrzej Jakowski     PMRCTL_EN_SHIFT   = 0,
4376cf94132SAndrzej Jakowski };
4386cf94132SAndrzej Jakowski 
4396cf94132SAndrzej Jakowski enum NvmePmrctlMask {
4406cf94132SAndrzej Jakowski     PMRCTL_EN_MASK   = 0x1,
4416cf94132SAndrzej Jakowski };
4426cf94132SAndrzej Jakowski 
4436cf94132SAndrzej Jakowski #define NVME_PMRCTL_EN(pmrctl)  ((pmrctl >> PMRCTL_EN_SHIFT)   & PMRCTL_EN_MASK)
4446cf94132SAndrzej Jakowski 
4456cf94132SAndrzej Jakowski #define NVME_PMRCTL_SET_EN(pmrctl, val)   \
4466cf94132SAndrzej Jakowski     (pmrctl |= (uint64_t)(val & PMRCTL_EN_MASK) << PMRCTL_EN_SHIFT)
4476cf94132SAndrzej Jakowski 
4486cf94132SAndrzej Jakowski enum NvmePmrstsShift {
4496cf94132SAndrzej Jakowski     PMRSTS_ERR_SHIFT    = 0,
4506cf94132SAndrzej Jakowski     PMRSTS_NRDY_SHIFT   = 8,
4516cf94132SAndrzej Jakowski     PMRSTS_HSTS_SHIFT   = 9,
4526cf94132SAndrzej Jakowski     PMRSTS_CBAI_SHIFT   = 12,
4536cf94132SAndrzej Jakowski };
4546cf94132SAndrzej Jakowski 
4556cf94132SAndrzej Jakowski enum NvmePmrstsMask {
4566cf94132SAndrzej Jakowski     PMRSTS_ERR_MASK    = 0xff,
4576cf94132SAndrzej Jakowski     PMRSTS_NRDY_MASK   = 0x1,
4586cf94132SAndrzej Jakowski     PMRSTS_HSTS_MASK   = 0x7,
4596cf94132SAndrzej Jakowski     PMRSTS_CBAI_MASK   = 0x1,
4606cf94132SAndrzej Jakowski };
4616cf94132SAndrzej Jakowski 
4626cf94132SAndrzej Jakowski #define NVME_PMRSTS_ERR(pmrsts)     \
4636cf94132SAndrzej Jakowski     ((pmrsts >> PMRSTS_ERR_SHIFT)   & PMRSTS_ERR_MASK)
4646cf94132SAndrzej Jakowski #define NVME_PMRSTS_NRDY(pmrsts)    \
4656cf94132SAndrzej Jakowski     ((pmrsts >> PMRSTS_NRDY_SHIFT)   & PMRSTS_NRDY_MASK)
4666cf94132SAndrzej Jakowski #define NVME_PMRSTS_HSTS(pmrsts)    \
4676cf94132SAndrzej Jakowski     ((pmrsts >> PMRSTS_HSTS_SHIFT)   & PMRSTS_HSTS_MASK)
4686cf94132SAndrzej Jakowski #define NVME_PMRSTS_CBAI(pmrsts)    \
4696cf94132SAndrzej Jakowski     ((pmrsts >> PMRSTS_CBAI_SHIFT)   & PMRSTS_CBAI_MASK)
4706cf94132SAndrzej Jakowski 
4716cf94132SAndrzej Jakowski #define NVME_PMRSTS_SET_ERR(pmrsts, val)   \
4726cf94132SAndrzej Jakowski     (pmrsts |= (uint64_t)(val & PMRSTS_ERR_MASK) << PMRSTS_ERR_SHIFT)
4736cf94132SAndrzej Jakowski #define NVME_PMRSTS_SET_NRDY(pmrsts, val)   \
4746cf94132SAndrzej Jakowski     (pmrsts |= (uint64_t)(val & PMRSTS_NRDY_MASK) << PMRSTS_NRDY_SHIFT)
4756cf94132SAndrzej Jakowski #define NVME_PMRSTS_SET_HSTS(pmrsts, val)   \
4766cf94132SAndrzej Jakowski     (pmrsts |= (uint64_t)(val & PMRSTS_HSTS_MASK) << PMRSTS_HSTS_SHIFT)
4776cf94132SAndrzej Jakowski #define NVME_PMRSTS_SET_CBAI(pmrsts, val)   \
4786cf94132SAndrzej Jakowski     (pmrsts |= (uint64_t)(val & PMRSTS_CBAI_MASK) << PMRSTS_CBAI_SHIFT)
4796cf94132SAndrzej Jakowski 
4806cf94132SAndrzej Jakowski enum NvmePmrebsShift {
4816cf94132SAndrzej Jakowski     PMREBS_PMRSZU_SHIFT   = 0,
4826cf94132SAndrzej Jakowski     PMREBS_RBB_SHIFT      = 4,
4836cf94132SAndrzej Jakowski     PMREBS_PMRWBZ_SHIFT   = 8,
4846cf94132SAndrzej Jakowski };
4856cf94132SAndrzej Jakowski 
4866cf94132SAndrzej Jakowski enum NvmePmrebsMask {
4876cf94132SAndrzej Jakowski     PMREBS_PMRSZU_MASK   = 0xf,
4886cf94132SAndrzej Jakowski     PMREBS_RBB_MASK      = 0x1,
4896cf94132SAndrzej Jakowski     PMREBS_PMRWBZ_MASK   = 0xffffff,
4906cf94132SAndrzej Jakowski };
4916cf94132SAndrzej Jakowski 
4926cf94132SAndrzej Jakowski #define NVME_PMREBS_PMRSZU(pmrebs)  \
4936cf94132SAndrzej Jakowski     ((pmrebs >> PMREBS_PMRSZU_SHIFT)   & PMREBS_PMRSZU_MASK)
4946cf94132SAndrzej Jakowski #define NVME_PMREBS_RBB(pmrebs)     \
4956cf94132SAndrzej Jakowski     ((pmrebs >> PMREBS_RBB_SHIFT)   & PMREBS_RBB_MASK)
4966cf94132SAndrzej Jakowski #define NVME_PMREBS_PMRWBZ(pmrebs)  \
4976cf94132SAndrzej Jakowski     ((pmrebs >> PMREBS_PMRWBZ_SHIFT)   & PMREBS_PMRWBZ_MASK)
4986cf94132SAndrzej Jakowski 
4996cf94132SAndrzej Jakowski #define NVME_PMREBS_SET_PMRSZU(pmrebs, val)   \
5006cf94132SAndrzej Jakowski     (pmrebs |= (uint64_t)(val & PMREBS_PMRSZU_MASK) << PMREBS_PMRSZU_SHIFT)
5016cf94132SAndrzej Jakowski #define NVME_PMREBS_SET_RBB(pmrebs, val)   \
5026cf94132SAndrzej Jakowski     (pmrebs |= (uint64_t)(val & PMREBS_RBB_MASK) << PMREBS_RBB_SHIFT)
5036cf94132SAndrzej Jakowski #define NVME_PMREBS_SET_PMRWBZ(pmrebs, val)   \
5046cf94132SAndrzej Jakowski     (pmrebs |= (uint64_t)(val & PMREBS_PMRWBZ_MASK) << PMREBS_PMRWBZ_SHIFT)
5056cf94132SAndrzej Jakowski 
5066cf94132SAndrzej Jakowski enum NvmePmrswtpShift {
5076cf94132SAndrzej Jakowski     PMRSWTP_PMRSWTU_SHIFT   = 0,
5086cf94132SAndrzej Jakowski     PMRSWTP_PMRSWTV_SHIFT   = 8,
5096cf94132SAndrzej Jakowski };
5106cf94132SAndrzej Jakowski 
5116cf94132SAndrzej Jakowski enum NvmePmrswtpMask {
5126cf94132SAndrzej Jakowski     PMRSWTP_PMRSWTU_MASK   = 0xf,
5136cf94132SAndrzej Jakowski     PMRSWTP_PMRSWTV_MASK   = 0xffffff,
5146cf94132SAndrzej Jakowski };
5156cf94132SAndrzej Jakowski 
5166cf94132SAndrzej Jakowski #define NVME_PMRSWTP_PMRSWTU(pmrswtp)   \
5176cf94132SAndrzej Jakowski     ((pmrswtp >> PMRSWTP_PMRSWTU_SHIFT)   & PMRSWTP_PMRSWTU_MASK)
5186cf94132SAndrzej Jakowski #define NVME_PMRSWTP_PMRSWTV(pmrswtp)   \
5196cf94132SAndrzej Jakowski     ((pmrswtp >> PMRSWTP_PMRSWTV_SHIFT)   & PMRSWTP_PMRSWTV_MASK)
5206cf94132SAndrzej Jakowski 
5216cf94132SAndrzej Jakowski #define NVME_PMRSWTP_SET_PMRSWTU(pmrswtp, val)   \
5226cf94132SAndrzej Jakowski     (pmrswtp |= (uint64_t)(val & PMRSWTP_PMRSWTU_MASK) << PMRSWTP_PMRSWTU_SHIFT)
5236cf94132SAndrzej Jakowski #define NVME_PMRSWTP_SET_PMRSWTV(pmrswtp, val)   \
5246cf94132SAndrzej Jakowski     (pmrswtp |= (uint64_t)(val & PMRSWTP_PMRSWTV_MASK) << PMRSWTP_PMRSWTV_SHIFT)
5256cf94132SAndrzej Jakowski 
5265d45edbeSKlaus Jensen enum NvmePmrmsclShift {
5275d45edbeSKlaus Jensen     PMRMSCL_CMSE_SHIFT   = 1,
5285d45edbeSKlaus Jensen     PMRMSCL_CBA_SHIFT    = 12,
5296cf94132SAndrzej Jakowski };
5306cf94132SAndrzej Jakowski 
5315d45edbeSKlaus Jensen enum NvmePmrmsclMask {
5325d45edbeSKlaus Jensen     PMRMSCL_CMSE_MASK   = 0x1,
5335d45edbeSKlaus Jensen     PMRMSCL_CBA_MASK    = 0xfffff,
5346cf94132SAndrzej Jakowski };
5356cf94132SAndrzej Jakowski 
5365d45edbeSKlaus Jensen #define NVME_PMRMSCL_CMSE(pmrmscl)    \
5375d45edbeSKlaus Jensen     ((pmrmscl >> PMRMSCL_CMSE_SHIFT)   & PMRMSCL_CMSE_MASK)
5385d45edbeSKlaus Jensen #define NVME_PMRMSCL_CBA(pmrmscl)     \
5395d45edbeSKlaus Jensen     ((pmrmscl >> PMRMSCL_CBA_SHIFT)   & PMRMSCL_CBA_MASK)
5406cf94132SAndrzej Jakowski 
5415d45edbeSKlaus Jensen #define NVME_PMRMSCL_SET_CMSE(pmrmscl, val)   \
5425d45edbeSKlaus Jensen     (pmrmscl |= (uint32_t)(val & PMRMSCL_CMSE_MASK) << PMRMSCL_CMSE_SHIFT)
5435d45edbeSKlaus Jensen #define NVME_PMRMSCL_SET_CBA(pmrmscl, val)   \
5445d45edbeSKlaus Jensen     (pmrmscl |= (uint32_t)(val & PMRMSCL_CBA_MASK) << PMRMSCL_CBA_SHIFT)
5456cf94132SAndrzej Jakowski 
546c26f2173SKlaus Jensen enum NvmeSglDescriptorType {
547c26f2173SKlaus Jensen     NVME_SGL_DESCR_TYPE_DATA_BLOCK          = 0x0,
548c26f2173SKlaus Jensen     NVME_SGL_DESCR_TYPE_BIT_BUCKET          = 0x1,
549c26f2173SKlaus Jensen     NVME_SGL_DESCR_TYPE_SEGMENT             = 0x2,
550c26f2173SKlaus Jensen     NVME_SGL_DESCR_TYPE_LAST_SEGMENT        = 0x3,
551c26f2173SKlaus Jensen     NVME_SGL_DESCR_TYPE_KEYED_DATA_BLOCK    = 0x4,
552c26f2173SKlaus Jensen 
553c26f2173SKlaus Jensen     NVME_SGL_DESCR_TYPE_VENDOR_SPECIFIC     = 0xf,
554c26f2173SKlaus Jensen };
555c26f2173SKlaus Jensen 
556c26f2173SKlaus Jensen enum NvmeSglDescriptorSubtype {
557c26f2173SKlaus Jensen     NVME_SGL_DESCR_SUBTYPE_ADDRESS = 0x0,
558c26f2173SKlaus Jensen };
559c26f2173SKlaus Jensen 
560c26f2173SKlaus Jensen typedef struct QEMU_PACKED NvmeSglDescriptor {
561c26f2173SKlaus Jensen     uint64_t addr;
562c26f2173SKlaus Jensen     uint32_t len;
563c26f2173SKlaus Jensen     uint8_t  rsvd[3];
564c26f2173SKlaus Jensen     uint8_t  type;
565c26f2173SKlaus Jensen } NvmeSglDescriptor;
566c26f2173SKlaus Jensen 
567c26f2173SKlaus Jensen #define NVME_SGL_TYPE(type)     ((type >> 4) & 0xf)
568c26f2173SKlaus Jensen #define NVME_SGL_SUBTYPE(type)  (type & 0xf)
569c26f2173SKlaus Jensen 
570c26f2173SKlaus Jensen typedef union NvmeCmdDptr {
571c26f2173SKlaus Jensen     struct {
572c26f2173SKlaus Jensen         uint64_t    prp1;
573c26f2173SKlaus Jensen         uint64_t    prp2;
574c26f2173SKlaus Jensen     };
575c26f2173SKlaus Jensen 
576c26f2173SKlaus Jensen     NvmeSglDescriptor sgl;
577c26f2173SKlaus Jensen } NvmeCmdDptr;
578c26f2173SKlaus Jensen 
579c26f2173SKlaus Jensen enum NvmePsdt {
580cba0a8a3SKlaus Jensen     NVME_PSDT_PRP                 = 0x0,
581cba0a8a3SKlaus Jensen     NVME_PSDT_SGL_MPTR_CONTIGUOUS = 0x1,
582cba0a8a3SKlaus Jensen     NVME_PSDT_SGL_MPTR_SGL        = 0x2,
583c26f2173SKlaus Jensen };
584c26f2173SKlaus Jensen 
585e989738fSPhilippe Mathieu-Daudé typedef struct QEMU_PACKED NvmeCmd {
586a3d9a352SFam Zheng     uint8_t     opcode;
587c26f2173SKlaus Jensen     uint8_t     flags;
588a3d9a352SFam Zheng     uint16_t    cid;
589a3d9a352SFam Zheng     uint32_t    nsid;
590a3d9a352SFam Zheng     uint64_t    res1;
591a3d9a352SFam Zheng     uint64_t    mptr;
592c26f2173SKlaus Jensen     NvmeCmdDptr dptr;
593a3d9a352SFam Zheng     uint32_t    cdw10;
594a3d9a352SFam Zheng     uint32_t    cdw11;
595a3d9a352SFam Zheng     uint32_t    cdw12;
596a3d9a352SFam Zheng     uint32_t    cdw13;
597a3d9a352SFam Zheng     uint32_t    cdw14;
598a3d9a352SFam Zheng     uint32_t    cdw15;
599a3d9a352SFam Zheng } NvmeCmd;
600a3d9a352SFam Zheng 
601c26f2173SKlaus Jensen #define NVME_CMD_FLAGS_FUSE(flags) (flags & 0x3)
602c26f2173SKlaus Jensen #define NVME_CMD_FLAGS_PSDT(flags) ((flags >> 6) & 0x3)
603c26f2173SKlaus Jensen 
604a3d9a352SFam Zheng enum NvmeAdminCommands {
605a3d9a352SFam Zheng     NVME_ADM_CMD_DELETE_SQ      = 0x00,
606a3d9a352SFam Zheng     NVME_ADM_CMD_CREATE_SQ      = 0x01,
607a3d9a352SFam Zheng     NVME_ADM_CMD_GET_LOG_PAGE   = 0x02,
608a3d9a352SFam Zheng     NVME_ADM_CMD_DELETE_CQ      = 0x04,
609a3d9a352SFam Zheng     NVME_ADM_CMD_CREATE_CQ      = 0x05,
610a3d9a352SFam Zheng     NVME_ADM_CMD_IDENTIFY       = 0x06,
611a3d9a352SFam Zheng     NVME_ADM_CMD_ABORT          = 0x08,
612a3d9a352SFam Zheng     NVME_ADM_CMD_SET_FEATURES   = 0x09,
613a3d9a352SFam Zheng     NVME_ADM_CMD_GET_FEATURES   = 0x0a,
614a3d9a352SFam Zheng     NVME_ADM_CMD_ASYNC_EV_REQ   = 0x0c,
615a3d9a352SFam Zheng     NVME_ADM_CMD_ACTIVATE_FW    = 0x10,
616a3d9a352SFam Zheng     NVME_ADM_CMD_DOWNLOAD_FW    = 0x11,
617645ce1a7SMinwoo Im     NVME_ADM_CMD_NS_ATTACHMENT  = 0x15,
618e181d3daSGollu Appalanaidu     NVME_ADM_CMD_DIRECTIVE_SEND = 0x19,
61911871f53SŁukasz Gieryk     NVME_ADM_CMD_VIRT_MNGMT     = 0x1c,
620e181d3daSGollu Appalanaidu     NVME_ADM_CMD_DIRECTIVE_RECV = 0x1a,
6213f7fe8deSJinhao Fan     NVME_ADM_CMD_DBBUF_CONFIG   = 0x7c,
622a3d9a352SFam Zheng     NVME_ADM_CMD_FORMAT_NVM     = 0x80,
623a3d9a352SFam Zheng     NVME_ADM_CMD_SECURITY_SEND  = 0x81,
624a3d9a352SFam Zheng     NVME_ADM_CMD_SECURITY_RECV  = 0x82,
625a3d9a352SFam Zheng };
626a3d9a352SFam Zheng 
627a3d9a352SFam Zheng enum NvmeIoCommands {
628a3d9a352SFam Zheng     NVME_CMD_FLUSH              = 0x00,
629a3d9a352SFam Zheng     NVME_CMD_WRITE              = 0x01,
630a3d9a352SFam Zheng     NVME_CMD_READ               = 0x02,
631a3d9a352SFam Zheng     NVME_CMD_WRITE_UNCOR        = 0x04,
632a3d9a352SFam Zheng     NVME_CMD_COMPARE            = 0x05,
63369265150SKlaus Jensen     NVME_CMD_WRITE_ZEROES       = 0x08,
634a3d9a352SFam Zheng     NVME_CMD_DSM                = 0x09,
6353e1da158SGollu Appalanaidu     NVME_CMD_VERIFY             = 0x0c,
63673064edfSJesper Devantier     NVME_CMD_IO_MGMT_RECV       = 0x12,
6373862efffSKlaus Jensen     NVME_CMD_COPY               = 0x19,
63873064edfSJesper Devantier     NVME_CMD_IO_MGMT_SEND       = 0x1d,
639e9ba46eeSDmitry Fomichev     NVME_CMD_ZONE_MGMT_SEND     = 0x79,
640e9ba46eeSDmitry Fomichev     NVME_CMD_ZONE_MGMT_RECV     = 0x7a,
641e9ba46eeSDmitry Fomichev     NVME_CMD_ZONE_APPEND        = 0x7d,
642a3d9a352SFam Zheng };
643a3d9a352SFam Zheng 
644e989738fSPhilippe Mathieu-Daudé typedef struct QEMU_PACKED NvmeDeleteQ {
645a3d9a352SFam Zheng     uint8_t     opcode;
646a3d9a352SFam Zheng     uint8_t     flags;
647a3d9a352SFam Zheng     uint16_t    cid;
648a3d9a352SFam Zheng     uint32_t    rsvd1[9];
649a3d9a352SFam Zheng     uint16_t    qid;
650a3d9a352SFam Zheng     uint16_t    rsvd10;
651a3d9a352SFam Zheng     uint32_t    rsvd11[5];
652a3d9a352SFam Zheng } NvmeDeleteQ;
653a3d9a352SFam Zheng 
654e989738fSPhilippe Mathieu-Daudé typedef struct QEMU_PACKED NvmeCreateCq {
655a3d9a352SFam Zheng     uint8_t     opcode;
656a3d9a352SFam Zheng     uint8_t     flags;
657a3d9a352SFam Zheng     uint16_t    cid;
658a3d9a352SFam Zheng     uint32_t    rsvd1[5];
659a3d9a352SFam Zheng     uint64_t    prp1;
660a3d9a352SFam Zheng     uint64_t    rsvd8;
661a3d9a352SFam Zheng     uint16_t    cqid;
662a3d9a352SFam Zheng     uint16_t    qsize;
663a3d9a352SFam Zheng     uint16_t    cq_flags;
664a3d9a352SFam Zheng     uint16_t    irq_vector;
665a3d9a352SFam Zheng     uint32_t    rsvd12[4];
666a3d9a352SFam Zheng } NvmeCreateCq;
667a3d9a352SFam Zheng 
668a3d9a352SFam Zheng #define NVME_CQ_FLAGS_PC(cq_flags)  (cq_flags & 0x1)
669a3d9a352SFam Zheng #define NVME_CQ_FLAGS_IEN(cq_flags) ((cq_flags >> 1) & 0x1)
670a3d9a352SFam Zheng 
67154248d4dSPhilippe Mathieu-Daudé enum NvmeFlagsCq {
67254248d4dSPhilippe Mathieu-Daudé     NVME_CQ_PC          = 1,
67354248d4dSPhilippe Mathieu-Daudé     NVME_CQ_IEN         = 2,
67454248d4dSPhilippe Mathieu-Daudé };
67554248d4dSPhilippe Mathieu-Daudé 
676e989738fSPhilippe Mathieu-Daudé typedef struct QEMU_PACKED NvmeCreateSq {
677a3d9a352SFam Zheng     uint8_t     opcode;
678a3d9a352SFam Zheng     uint8_t     flags;
679a3d9a352SFam Zheng     uint16_t    cid;
680a3d9a352SFam Zheng     uint32_t    rsvd1[5];
681a3d9a352SFam Zheng     uint64_t    prp1;
682a3d9a352SFam Zheng     uint64_t    rsvd8;
683a3d9a352SFam Zheng     uint16_t    sqid;
684a3d9a352SFam Zheng     uint16_t    qsize;
685a3d9a352SFam Zheng     uint16_t    sq_flags;
686a3d9a352SFam Zheng     uint16_t    cqid;
687a3d9a352SFam Zheng     uint32_t    rsvd12[4];
688a3d9a352SFam Zheng } NvmeCreateSq;
689a3d9a352SFam Zheng 
690a3d9a352SFam Zheng #define NVME_SQ_FLAGS_PC(sq_flags)      (sq_flags & 0x1)
691a3d9a352SFam Zheng #define NVME_SQ_FLAGS_QPRIO(sq_flags)   ((sq_flags >> 1) & 0x3)
692a3d9a352SFam Zheng 
69354248d4dSPhilippe Mathieu-Daudé enum NvmeFlagsSq {
69454248d4dSPhilippe Mathieu-Daudé     NVME_SQ_PC          = 1,
69554248d4dSPhilippe Mathieu-Daudé 
69654248d4dSPhilippe Mathieu-Daudé     NVME_SQ_PRIO_URGENT = 0,
69754248d4dSPhilippe Mathieu-Daudé     NVME_SQ_PRIO_HIGH   = 1,
69854248d4dSPhilippe Mathieu-Daudé     NVME_SQ_PRIO_NORMAL = 2,
69954248d4dSPhilippe Mathieu-Daudé     NVME_SQ_PRIO_LOW    = 3,
700a3d9a352SFam Zheng };
701a3d9a352SFam Zheng 
702e989738fSPhilippe Mathieu-Daudé typedef struct QEMU_PACKED NvmeIdentify {
703a3d9a352SFam Zheng     uint8_t     opcode;
704a3d9a352SFam Zheng     uint8_t     flags;
705a3d9a352SFam Zheng     uint16_t    cid;
706a3d9a352SFam Zheng     uint32_t    nsid;
707a3d9a352SFam Zheng     uint64_t    rsvd2[2];
708a3d9a352SFam Zheng     uint64_t    prp1;
709a3d9a352SFam Zheng     uint64_t    prp2;
710141354d5SNiklas Cassel     uint8_t     cns;
711141354d5SNiklas Cassel     uint8_t     rsvd10;
712141354d5SNiklas Cassel     uint16_t    ctrlid;
713141354d5SNiklas Cassel     uint16_t    nvmsetid;
714141354d5SNiklas Cassel     uint8_t     rsvd11;
715141354d5SNiklas Cassel     uint8_t     csi;
716141354d5SNiklas Cassel     uint32_t    rsvd12[4];
717a3d9a352SFam Zheng } NvmeIdentify;
718a3d9a352SFam Zheng 
719e989738fSPhilippe Mathieu-Daudé typedef struct QEMU_PACKED NvmeRwCmd {
720a3d9a352SFam Zheng     uint8_t     opcode;
721a3d9a352SFam Zheng     uint8_t     flags;
722a3d9a352SFam Zheng     uint16_t    cid;
723a3d9a352SFam Zheng     uint32_t    nsid;
72444219b60SNaveen Nagar     uint32_t    cdw2;
72544219b60SNaveen Nagar     uint32_t    cdw3;
726a3d9a352SFam Zheng     uint64_t    mptr;
727c26f2173SKlaus Jensen     NvmeCmdDptr dptr;
728a3d9a352SFam Zheng     uint64_t    slba;
729a3d9a352SFam Zheng     uint16_t    nlb;
730a3d9a352SFam Zheng     uint16_t    control;
73173064edfSJesper Devantier     uint8_t     dsmgmt;
73273064edfSJesper Devantier     uint8_t     rsvd;
73373064edfSJesper Devantier     uint16_t    dspec;
734a3d9a352SFam Zheng     uint32_t    reftag;
735a3d9a352SFam Zheng     uint16_t    apptag;
736a3d9a352SFam Zheng     uint16_t    appmask;
737a3d9a352SFam Zheng } NvmeRwCmd;
738a3d9a352SFam Zheng 
739a3d9a352SFam Zheng enum {
740a3d9a352SFam Zheng     NVME_RW_LR                  = 1 << 15,
741a3d9a352SFam Zheng     NVME_RW_FUA                 = 1 << 14,
742a3d9a352SFam Zheng     NVME_RW_DSM_FREQ_UNSPEC     = 0,
743a3d9a352SFam Zheng     NVME_RW_DSM_FREQ_TYPICAL    = 1,
744a3d9a352SFam Zheng     NVME_RW_DSM_FREQ_RARE       = 2,
745a3d9a352SFam Zheng     NVME_RW_DSM_FREQ_READS      = 3,
746a3d9a352SFam Zheng     NVME_RW_DSM_FREQ_WRITES     = 4,
747a3d9a352SFam Zheng     NVME_RW_DSM_FREQ_RW         = 5,
748a3d9a352SFam Zheng     NVME_RW_DSM_FREQ_ONCE       = 6,
749a3d9a352SFam Zheng     NVME_RW_DSM_FREQ_PREFETCH   = 7,
750a3d9a352SFam Zheng     NVME_RW_DSM_FREQ_TEMP       = 8,
751a3d9a352SFam Zheng     NVME_RW_DSM_LATENCY_NONE    = 0 << 4,
752a3d9a352SFam Zheng     NVME_RW_DSM_LATENCY_IDLE    = 1 << 4,
753a3d9a352SFam Zheng     NVME_RW_DSM_LATENCY_NORM    = 2 << 4,
754a3d9a352SFam Zheng     NVME_RW_DSM_LATENCY_LOW     = 3 << 4,
755a3d9a352SFam Zheng     NVME_RW_DSM_SEQ_REQ         = 1 << 6,
756a3d9a352SFam Zheng     NVME_RW_DSM_COMPRESSED      = 1 << 7,
757146f720cSKlaus Jensen     NVME_RW_PIREMAP             = 1 << 9,
758a3d9a352SFam Zheng     NVME_RW_PRINFO_PRACT        = 1 << 13,
759a3d9a352SFam Zheng     NVME_RW_PRINFO_PRCHK_GUARD  = 1 << 12,
760a3d9a352SFam Zheng     NVME_RW_PRINFO_PRCHK_APP    = 1 << 11,
761a3d9a352SFam Zheng     NVME_RW_PRINFO_PRCHK_REF    = 1 << 10,
762146f720cSKlaus Jensen     NVME_RW_PRINFO_PRCHK_MASK   = 7 << 10,
763a3d9a352SFam Zheng };
764a3d9a352SFam Zheng 
765146f720cSKlaus Jensen #define NVME_RW_PRINFO(control) ((control >> 10) & 0xf)
766146f720cSKlaus Jensen 
7672a132309SKlaus Jensen enum {
7682a132309SKlaus Jensen     NVME_PRINFO_PRACT       = 1 << 3,
7692a132309SKlaus Jensen     NVME_PRINFO_PRCHK_GUARD = 1 << 2,
7702a132309SKlaus Jensen     NVME_PRINFO_PRCHK_APP   = 1 << 1,
7712a132309SKlaus Jensen     NVME_PRINFO_PRCHK_REF   = 1 << 0,
7722a132309SKlaus Jensen     NVME_PRINFO_PRCHK_MASK  = 7 << 0,
7732a132309SKlaus Jensen };
7742a132309SKlaus Jensen 
775e989738fSPhilippe Mathieu-Daudé typedef struct QEMU_PACKED NvmeDsmCmd {
776a3d9a352SFam Zheng     uint8_t     opcode;
777a3d9a352SFam Zheng     uint8_t     flags;
778a3d9a352SFam Zheng     uint16_t    cid;
779a3d9a352SFam Zheng     uint32_t    nsid;
780a3d9a352SFam Zheng     uint64_t    rsvd2[2];
781c26f2173SKlaus Jensen     NvmeCmdDptr dptr;
782a3d9a352SFam Zheng     uint32_t    nr;
783a3d9a352SFam Zheng     uint32_t    attributes;
784a3d9a352SFam Zheng     uint32_t    rsvd12[4];
785a3d9a352SFam Zheng } NvmeDsmCmd;
786a3d9a352SFam Zheng 
787a3d9a352SFam Zheng enum {
788a3d9a352SFam Zheng     NVME_DSMGMT_IDR = 1 << 0,
789a3d9a352SFam Zheng     NVME_DSMGMT_IDW = 1 << 1,
790a3d9a352SFam Zheng     NVME_DSMGMT_AD  = 1 << 2,
791a3d9a352SFam Zheng };
792a3d9a352SFam Zheng 
793e989738fSPhilippe Mathieu-Daudé typedef struct QEMU_PACKED NvmeDsmRange {
794a3d9a352SFam Zheng     uint32_t    cattr;
795a3d9a352SFam Zheng     uint32_t    nlb;
796a3d9a352SFam Zheng     uint64_t    slba;
797a3d9a352SFam Zheng } NvmeDsmRange;
798a3d9a352SFam Zheng 
7993862efffSKlaus Jensen enum {
8003862efffSKlaus Jensen     NVME_COPY_FORMAT_0 = 0x0,
80144219b60SNaveen Nagar     NVME_COPY_FORMAT_1 = 0x1,
802d522aef8SArun Kumar     NVME_COPY_FORMAT_2 = 0x2,
803d522aef8SArun Kumar     NVME_COPY_FORMAT_3 = 0x3,
8043862efffSKlaus Jensen };
8053862efffSKlaus Jensen 
8063862efffSKlaus Jensen typedef struct QEMU_PACKED NvmeCopyCmd {
8073862efffSKlaus Jensen     uint8_t     opcode;
8083862efffSKlaus Jensen     uint8_t     flags;
8093862efffSKlaus Jensen     uint16_t    cid;
8103862efffSKlaus Jensen     uint32_t    nsid;
81144219b60SNaveen Nagar     uint32_t    cdw2;
81244219b60SNaveen Nagar     uint32_t    cdw3;
81344219b60SNaveen Nagar     uint32_t    rsvd2[2];
8143862efffSKlaus Jensen     NvmeCmdDptr dptr;
8153862efffSKlaus Jensen     uint64_t    sdlba;
8163862efffSKlaus Jensen     uint8_t     nr;
8173862efffSKlaus Jensen     uint8_t     control[3];
8183862efffSKlaus Jensen     uint16_t    rsvd13;
8193862efffSKlaus Jensen     uint16_t    dspec;
8203862efffSKlaus Jensen     uint32_t    reftag;
8213862efffSKlaus Jensen     uint16_t    apptag;
8223862efffSKlaus Jensen     uint16_t    appmask;
8233862efffSKlaus Jensen } NvmeCopyCmd;
8243862efffSKlaus Jensen 
825d522aef8SArun Kumar typedef struct QEMU_PACKED NvmeCopySourceRangeFormat0_2 {
826d522aef8SArun Kumar     uint32_t sparams;
827d522aef8SArun Kumar     uint8_t  rsvd4[4];
8283862efffSKlaus Jensen     uint64_t slba;
8293862efffSKlaus Jensen     uint16_t nlb;
830d522aef8SArun Kumar     uint8_t  rsvd18[4];
831d522aef8SArun Kumar     uint16_t sopt;
8323862efffSKlaus Jensen     uint32_t reftag;
8333862efffSKlaus Jensen     uint16_t apptag;
8343862efffSKlaus Jensen     uint16_t appmask;
835d522aef8SArun Kumar } NvmeCopySourceRangeFormat0_2;
83644219b60SNaveen Nagar 
837d522aef8SArun Kumar typedef struct QEMU_PACKED NvmeCopySourceRangeFormat1_3 {
838d522aef8SArun Kumar     uint32_t sparams;
839d522aef8SArun Kumar     uint8_t  rsvd4[4];
84044219b60SNaveen Nagar     uint64_t slba;
84144219b60SNaveen Nagar     uint16_t nlb;
842d522aef8SArun Kumar     uint8_t  rsvd18[4];
843d522aef8SArun Kumar     uint16_t sopt;
844d522aef8SArun Kumar     uint8_t  rsvd24[2];
84544219b60SNaveen Nagar     uint8_t  sr[10];
84644219b60SNaveen Nagar     uint16_t apptag;
84744219b60SNaveen Nagar     uint16_t appmask;
848d522aef8SArun Kumar } NvmeCopySourceRangeFormat1_3;
8493862efffSKlaus Jensen 
850a3d9a352SFam Zheng enum NvmeAsyncEventRequest {
851a3d9a352SFam Zheng     NVME_AER_TYPE_ERROR                     = 0,
852a3d9a352SFam Zheng     NVME_AER_TYPE_SMART                     = 1,
853f432fdfaSMinwoo Im     NVME_AER_TYPE_NOTICE                    = 2,
854a3d9a352SFam Zheng     NVME_AER_TYPE_IO_SPECIFIC               = 6,
855a3d9a352SFam Zheng     NVME_AER_TYPE_VENDOR_SPECIFIC           = 7,
8565d5a5330SKlaus Jensen     NVME_AER_INFO_ERR_INVALID_DB_REGISTER   = 0,
8575d5a5330SKlaus Jensen     NVME_AER_INFO_ERR_INVALID_DB_VALUE      = 1,
858a3d9a352SFam Zheng     NVME_AER_INFO_ERR_DIAG_FAIL             = 2,
859a3d9a352SFam Zheng     NVME_AER_INFO_ERR_PERS_INTERNAL_ERR     = 3,
860a3d9a352SFam Zheng     NVME_AER_INFO_ERR_TRANS_INTERNAL_ERR    = 4,
861a3d9a352SFam Zheng     NVME_AER_INFO_ERR_FW_IMG_LOAD_ERR       = 5,
862a3d9a352SFam Zheng     NVME_AER_INFO_SMART_RELIABILITY         = 0,
863a3d9a352SFam Zheng     NVME_AER_INFO_SMART_TEMP_THRESH         = 1,
864a3d9a352SFam Zheng     NVME_AER_INFO_SMART_SPARE_THRESH        = 2,
865f432fdfaSMinwoo Im     NVME_AER_INFO_NOTICE_NS_ATTR_CHANGED    = 0,
866a3d9a352SFam Zheng };
867a3d9a352SFam Zheng 
868e989738fSPhilippe Mathieu-Daudé typedef struct QEMU_PACKED NvmeAerResult {
869a3d9a352SFam Zheng     uint8_t event_type;
870a3d9a352SFam Zheng     uint8_t event_info;
871a3d9a352SFam Zheng     uint8_t log_page;
872a3d9a352SFam Zheng     uint8_t resv;
873a3d9a352SFam Zheng } NvmeAerResult;
874a3d9a352SFam Zheng 
875e9ba46eeSDmitry Fomichev typedef struct QEMU_PACKED NvmeZonedResult {
876e9ba46eeSDmitry Fomichev     uint64_t slba;
877e9ba46eeSDmitry Fomichev } NvmeZonedResult;
878e9ba46eeSDmitry Fomichev 
879e989738fSPhilippe Mathieu-Daudé typedef struct QEMU_PACKED NvmeCqe {
880a3d9a352SFam Zheng     uint32_t    result;
881e9ba46eeSDmitry Fomichev     uint32_t    dw1;
882a3d9a352SFam Zheng     uint16_t    sq_head;
883a3d9a352SFam Zheng     uint16_t    sq_id;
884a3d9a352SFam Zheng     uint16_t    cid;
885a3d9a352SFam Zheng     uint16_t    status;
886a3d9a352SFam Zheng } NvmeCqe;
887a3d9a352SFam Zheng 
888a3d9a352SFam Zheng enum NvmeStatusCodes {
889a3d9a352SFam Zheng     NVME_SUCCESS                = 0x0000,
890a3d9a352SFam Zheng     NVME_INVALID_OPCODE         = 0x0001,
891a3d9a352SFam Zheng     NVME_INVALID_FIELD          = 0x0002,
892a3d9a352SFam Zheng     NVME_CID_CONFLICT           = 0x0003,
893a3d9a352SFam Zheng     NVME_DATA_TRAS_ERROR        = 0x0004,
894a3d9a352SFam Zheng     NVME_POWER_LOSS_ABORT       = 0x0005,
895a3d9a352SFam Zheng     NVME_INTERNAL_DEV_ERROR     = 0x0006,
896a3d9a352SFam Zheng     NVME_CMD_ABORT_REQ          = 0x0007,
897a3d9a352SFam Zheng     NVME_CMD_ABORT_SQ_DEL       = 0x0008,
898a3d9a352SFam Zheng     NVME_CMD_ABORT_FAILED_FUSE  = 0x0009,
899a3d9a352SFam Zheng     NVME_CMD_ABORT_MISSING_FUSE = 0x000a,
900a3d9a352SFam Zheng     NVME_INVALID_NSID           = 0x000b,
901a3d9a352SFam Zheng     NVME_CMD_SEQ_ERROR          = 0x000c,
902c26f2173SKlaus Jensen     NVME_INVALID_SGL_SEG_DESCR  = 0x000d,
903c26f2173SKlaus Jensen     NVME_INVALID_NUM_SGL_DESCRS = 0x000e,
904c26f2173SKlaus Jensen     NVME_DATA_SGL_LEN_INVALID   = 0x000f,
905c26f2173SKlaus Jensen     NVME_MD_SGL_LEN_INVALID     = 0x0010,
906c26f2173SKlaus Jensen     NVME_SGL_DESCR_TYPE_INVALID = 0x0011,
907c26f2173SKlaus Jensen     NVME_INVALID_USE_OF_CMB     = 0x0012,
90828fee5b5SGollu Appalanaidu     NVME_INVALID_PRP_OFFSET     = 0x0013,
909141354d5SNiklas Cassel     NVME_CMD_SET_CMB_REJECTED   = 0x002b,
910e9ba46eeSDmitry Fomichev     NVME_INVALID_CMD_SET        = 0x002c,
91173064edfSJesper Devantier     NVME_FDP_DISABLED           = 0x0029,
91273064edfSJesper Devantier     NVME_INVALID_PHID_LIST      = 0x002a,
913a3d9a352SFam Zheng     NVME_LBA_RANGE              = 0x0080,
914a3d9a352SFam Zheng     NVME_CAP_EXCEEDED           = 0x0081,
915a3d9a352SFam Zheng     NVME_NS_NOT_READY           = 0x0082,
916a3d9a352SFam Zheng     NVME_NS_RESV_CONFLICT       = 0x0083,
917dc04d25eSMinwoo Im     NVME_FORMAT_IN_PROGRESS     = 0x0084,
918a3d9a352SFam Zheng     NVME_INVALID_CQID           = 0x0100,
919a3d9a352SFam Zheng     NVME_INVALID_QID            = 0x0101,
920a3d9a352SFam Zheng     NVME_MAX_QSIZE_EXCEEDED     = 0x0102,
921a3d9a352SFam Zheng     NVME_ACL_EXCEEDED           = 0x0103,
922a3d9a352SFam Zheng     NVME_RESERVED               = 0x0104,
923a3d9a352SFam Zheng     NVME_AER_LIMIT_EXCEEDED     = 0x0105,
924a3d9a352SFam Zheng     NVME_INVALID_FW_SLOT        = 0x0106,
925a3d9a352SFam Zheng     NVME_INVALID_FW_IMAGE       = 0x0107,
926a3d9a352SFam Zheng     NVME_INVALID_IRQ_VECTOR     = 0x0108,
927a3d9a352SFam Zheng     NVME_INVALID_LOG_ID         = 0x0109,
928a3d9a352SFam Zheng     NVME_INVALID_FORMAT         = 0x010a,
929a3d9a352SFam Zheng     NVME_FW_REQ_RESET           = 0x010b,
930a3d9a352SFam Zheng     NVME_INVALID_QUEUE_DEL      = 0x010c,
931a3d9a352SFam Zheng     NVME_FID_NOT_SAVEABLE       = 0x010d,
9321302e48eSKlaus Jensen     NVME_FEAT_NOT_CHANGEABLE    = 0x010e,
9337c46310dSKlaus Jensen     NVME_FEAT_NOT_NS_SPEC       = 0x010f,
934a3d9a352SFam Zheng     NVME_FW_REQ_SUSYSTEM_RESET  = 0x0110,
935645ce1a7SMinwoo Im     NVME_NS_ALREADY_ATTACHED    = 0x0118,
936e5489356SKlaus Jensen     NVME_NS_PRIVATE             = 0x0119,
937312c3531SGollu Appalanaidu     NVME_NS_NOT_ATTACHED        = 0x011a,
938312c3531SGollu Appalanaidu     NVME_NS_CTRL_LIST_INVALID   = 0x011c,
93911871f53SŁukasz Gieryk     NVME_INVALID_CTRL_ID        = 0x011f,
94011871f53SŁukasz Gieryk     NVME_INVALID_SEC_CTRL_STATE = 0x0120,
94111871f53SŁukasz Gieryk     NVME_INVALID_NUM_RESOURCES  = 0x0121,
94211871f53SŁukasz Gieryk     NVME_INVALID_RESOURCE_ID    = 0x0122,
943a3d9a352SFam Zheng     NVME_CONFLICTING_ATTRS      = 0x0180,
944a3d9a352SFam Zheng     NVME_INVALID_PROT_INFO      = 0x0181,
945a3d9a352SFam Zheng     NVME_WRITE_TO_RO            = 0x0182,
9463862efffSKlaus Jensen     NVME_CMD_SIZE_LIMIT         = 0x0183,
947d522aef8SArun Kumar     NVME_CMD_INCOMP_NS_OR_FMT   = 0x0185,
948d522aef8SArun Kumar     NVME_CMD_OVERLAP_IO_RANGE   = 0x0187,
949e321b4cdSKlaus Jensen     NVME_INVALID_ZONE_OP        = 0x01b6,
950e321b4cdSKlaus Jensen     NVME_NOZRWA                 = 0x01b7,
951e9ba46eeSDmitry Fomichev     NVME_ZONE_BOUNDARY_ERROR    = 0x01b8,
952e9ba46eeSDmitry Fomichev     NVME_ZONE_FULL              = 0x01b9,
953e9ba46eeSDmitry Fomichev     NVME_ZONE_READ_ONLY         = 0x01ba,
954e9ba46eeSDmitry Fomichev     NVME_ZONE_OFFLINE           = 0x01bb,
955e9ba46eeSDmitry Fomichev     NVME_ZONE_INVALID_WRITE     = 0x01bc,
956e9ba46eeSDmitry Fomichev     NVME_ZONE_TOO_MANY_ACTIVE   = 0x01bd,
957e9ba46eeSDmitry Fomichev     NVME_ZONE_TOO_MANY_OPEN     = 0x01be,
958e9ba46eeSDmitry Fomichev     NVME_ZONE_INVAL_TRANSITION  = 0x01bf,
959a3d9a352SFam Zheng     NVME_WRITE_FAULT            = 0x0280,
960a3d9a352SFam Zheng     NVME_UNRECOVERED_READ       = 0x0281,
961a3d9a352SFam Zheng     NVME_E2E_GUARD_ERROR        = 0x0282,
962a3d9a352SFam Zheng     NVME_E2E_APP_ERROR          = 0x0283,
963a3d9a352SFam Zheng     NVME_E2E_REF_ERROR          = 0x0284,
964a3d9a352SFam Zheng     NVME_CMP_FAILURE            = 0x0285,
965a3d9a352SFam Zheng     NVME_ACCESS_DENIED          = 0x0286,
96654064e51SKlaus Jensen     NVME_DULB                   = 0x0287,
96744219b60SNaveen Nagar     NVME_E2E_STORAGE_TAG_ERROR  = 0x0288,
968a3d9a352SFam Zheng     NVME_MORE                   = 0x2000,
969a3d9a352SFam Zheng     NVME_DNR                    = 0x4000,
970a3d9a352SFam Zheng     NVME_NO_COMPLETE            = 0xffff,
971a3d9a352SFam Zheng };
972a3d9a352SFam Zheng 
973e989738fSPhilippe Mathieu-Daudé typedef struct QEMU_PACKED NvmeFwSlotInfoLog {
974a3d9a352SFam Zheng     uint8_t     afi;
975a3d9a352SFam Zheng     uint8_t     reserved1[7];
976a3d9a352SFam Zheng     uint8_t     frs1[8];
977a3d9a352SFam Zheng     uint8_t     frs2[8];
978a3d9a352SFam Zheng     uint8_t     frs3[8];
979a3d9a352SFam Zheng     uint8_t     frs4[8];
980a3d9a352SFam Zheng     uint8_t     frs5[8];
981a3d9a352SFam Zheng     uint8_t     frs6[8];
982a3d9a352SFam Zheng     uint8_t     frs7[8];
983a3d9a352SFam Zheng     uint8_t     reserved2[448];
984a3d9a352SFam Zheng } NvmeFwSlotInfoLog;
985a3d9a352SFam Zheng 
986e989738fSPhilippe Mathieu-Daudé typedef struct QEMU_PACKED NvmeErrorLog {
987a3d9a352SFam Zheng     uint64_t    error_count;
988a3d9a352SFam Zheng     uint16_t    sqid;
989a3d9a352SFam Zheng     uint16_t    cid;
990a3d9a352SFam Zheng     uint16_t    status_field;
991a3d9a352SFam Zheng     uint16_t    param_error_location;
992a3d9a352SFam Zheng     uint64_t    lba;
993a3d9a352SFam Zheng     uint32_t    nsid;
994a3d9a352SFam Zheng     uint8_t     vs;
995a3d9a352SFam Zheng     uint8_t     resv[35];
996a3d9a352SFam Zheng } NvmeErrorLog;
997a3d9a352SFam Zheng 
998e989738fSPhilippe Mathieu-Daudé typedef struct QEMU_PACKED NvmeSmartLog {
999a3d9a352SFam Zheng     uint8_t     critical_warning;
100094a7897cSKlaus Jensen     uint16_t    temperature;
1001a3d9a352SFam Zheng     uint8_t     available_spare;
1002a3d9a352SFam Zheng     uint8_t     available_spare_threshold;
1003a3d9a352SFam Zheng     uint8_t     percentage_used;
1004a3d9a352SFam Zheng     uint8_t     reserved1[26];
1005a3d9a352SFam Zheng     uint64_t    data_units_read[2];
1006a3d9a352SFam Zheng     uint64_t    data_units_written[2];
1007a3d9a352SFam Zheng     uint64_t    host_read_commands[2];
1008a3d9a352SFam Zheng     uint64_t    host_write_commands[2];
1009a3d9a352SFam Zheng     uint64_t    controller_busy_time[2];
1010a3d9a352SFam Zheng     uint64_t    power_cycles[2];
1011a3d9a352SFam Zheng     uint64_t    power_on_hours[2];
1012a3d9a352SFam Zheng     uint64_t    unsafe_shutdowns[2];
1013a3d9a352SFam Zheng     uint64_t    media_errors[2];
1014a3d9a352SFam Zheng     uint64_t    number_of_error_log_entries[2];
1015a3d9a352SFam Zheng     uint8_t     reserved2[320];
1016a3d9a352SFam Zheng } NvmeSmartLog;
1017a3d9a352SFam Zheng 
1018c62720f1Szhenwei pi #define NVME_SMART_WARN_MAX     6
1019a3d9a352SFam Zheng enum NvmeSmartWarn {
1020a3d9a352SFam Zheng     NVME_SMART_SPARE                  = 1 << 0,
1021a3d9a352SFam Zheng     NVME_SMART_TEMPERATURE            = 1 << 1,
1022a3d9a352SFam Zheng     NVME_SMART_RELIABILITY            = 1 << 2,
1023a3d9a352SFam Zheng     NVME_SMART_MEDIA_READ_ONLY        = 1 << 3,
1024a3d9a352SFam Zheng     NVME_SMART_FAILED_VOLATILE_MEDIA  = 1 << 4,
1025c6d1b5c1Szhenwei pi     NVME_SMART_PMR_UNRELIABLE         = 1 << 5,
1026a3d9a352SFam Zheng };
1027a3d9a352SFam Zheng 
102862e8faa4SDmitry Fomichev typedef struct NvmeEffectsLog {
102962e8faa4SDmitry Fomichev     uint32_t    acs[256];
103062e8faa4SDmitry Fomichev     uint32_t    iocs[256];
103162e8faa4SDmitry Fomichev     uint8_t     resv[2048];
103262e8faa4SDmitry Fomichev } NvmeEffectsLog;
103362e8faa4SDmitry Fomichev 
103462e8faa4SDmitry Fomichev enum {
103562e8faa4SDmitry Fomichev     NVME_CMD_EFF_CSUPP      = 1 << 0,
103662e8faa4SDmitry Fomichev     NVME_CMD_EFF_LBCC       = 1 << 1,
103762e8faa4SDmitry Fomichev     NVME_CMD_EFF_NCC        = 1 << 2,
103862e8faa4SDmitry Fomichev     NVME_CMD_EFF_NIC        = 1 << 3,
103962e8faa4SDmitry Fomichev     NVME_CMD_EFF_CCC        = 1 << 4,
104062e8faa4SDmitry Fomichev     NVME_CMD_EFF_CSE_MASK   = 3 << 16,
104162e8faa4SDmitry Fomichev     NVME_CMD_EFF_UUID_SEL   = 1 << 19,
104262e8faa4SDmitry Fomichev };
104362e8faa4SDmitry Fomichev 
1044c26f2173SKlaus Jensen enum NvmeLogIdentifier {
1045a3d9a352SFam Zheng     NVME_LOG_ERROR_INFO                 = 0x01,
1046a3d9a352SFam Zheng     NVME_LOG_SMART_INFO                 = 0x02,
1047a3d9a352SFam Zheng     NVME_LOG_FW_SLOT_INFO               = 0x03,
1048f432fdfaSMinwoo Im     NVME_LOG_CHANGED_NSLIST             = 0x04,
104962e8faa4SDmitry Fomichev     NVME_LOG_CMD_EFFECTS                = 0x05,
1050771dbc3aSKlaus Jensen     NVME_LOG_ENDGRP                     = 0x09,
105173064edfSJesper Devantier     NVME_LOG_FDP_CONFS                  = 0x20,
105273064edfSJesper Devantier     NVME_LOG_FDP_RUH_USAGE              = 0x21,
105373064edfSJesper Devantier     NVME_LOG_FDP_STATS                  = 0x22,
105473064edfSJesper Devantier     NVME_LOG_FDP_EVENTS                 = 0x23,
1055a3d9a352SFam Zheng };
1056a3d9a352SFam Zheng 
1057e989738fSPhilippe Mathieu-Daudé typedef struct QEMU_PACKED NvmePSD {
1058a3d9a352SFam Zheng     uint16_t    mp;
1059a3d9a352SFam Zheng     uint16_t    reserved;
1060a3d9a352SFam Zheng     uint32_t    enlat;
1061a3d9a352SFam Zheng     uint32_t    exlat;
1062a3d9a352SFam Zheng     uint8_t     rrt;
1063a3d9a352SFam Zheng     uint8_t     rrl;
1064a3d9a352SFam Zheng     uint8_t     rwt;
1065a3d9a352SFam Zheng     uint8_t     rwl;
1066a3d9a352SFam Zheng     uint8_t     resv[16];
1067a3d9a352SFam Zheng } NvmePSD;
1068a3d9a352SFam Zheng 
1069645ce1a7SMinwoo Im #define NVME_CONTROLLER_LIST_SIZE 2048
10703e829fd4SKlaus Jensen #define NVME_IDENTIFY_DATA_SIZE 4096
10713e829fd4SKlaus Jensen 
1072141354d5SNiklas Cassel enum NvmeIdCns {
1073141354d5SNiklas Cassel     NVME_ID_CNS_NS                    = 0x00,
1074141354d5SNiklas Cassel     NVME_ID_CNS_CTRL                  = 0x01,
1075141354d5SNiklas Cassel     NVME_ID_CNS_NS_ACTIVE_LIST        = 0x02,
1076141354d5SNiklas Cassel     NVME_ID_CNS_NS_DESCR_LIST         = 0x03,
1077141354d5SNiklas Cassel     NVME_ID_CNS_CS_NS                 = 0x05,
1078141354d5SNiklas Cassel     NVME_ID_CNS_CS_CTRL               = 0x06,
1079141354d5SNiklas Cassel     NVME_ID_CNS_CS_NS_ACTIVE_LIST     = 0x07,
108079e49005SArun Kumar     NVME_ID_CNS_CS_IND_NS             = 0x08,
1081922e6f4eSNiklas Cassel     NVME_ID_CNS_NS_PRESENT_LIST       = 0x10,
1082922e6f4eSNiklas Cassel     NVME_ID_CNS_NS_PRESENT            = 0x11,
108323fb7dfeSMinwoo Im     NVME_ID_CNS_NS_ATTACHED_CTRL_LIST = 0x12,
10845f4eb94dSGollu Appalanaidu     NVME_ID_CNS_CTRL_LIST             = 0x13,
10855e6f963fSLukasz Maniak     NVME_ID_CNS_PRIMARY_CTRL_CAP      = 0x14,
108699f48ae7SLukasz Maniak     NVME_ID_CNS_SECONDARY_CTRL_LIST   = 0x15,
108764715565SMinwoo Im     NVME_ID_CNS_ENDURANCE_GROUP_LIST  = 0x19,
1088922e6f4eSNiklas Cassel     NVME_ID_CNS_CS_NS_PRESENT_LIST    = 0x1a,
1089922e6f4eSNiklas Cassel     NVME_ID_CNS_CS_NS_PRESENT         = 0x1b,
1090141354d5SNiklas Cassel     NVME_ID_CNS_IO_COMMAND_SET        = 0x1c,
109179e49005SArun Kumar     NVME_ID_CNS_CS_IND_NS_ALLOCATED   = 0x1f,
10923e829fd4SKlaus Jensen };
10933e829fd4SKlaus Jensen 
1094e989738fSPhilippe Mathieu-Daudé typedef struct QEMU_PACKED NvmeIdCtrl {
1095a3d9a352SFam Zheng     uint16_t    vid;
1096a3d9a352SFam Zheng     uint16_t    ssvid;
1097a3d9a352SFam Zheng     uint8_t     sn[20];
1098a3d9a352SFam Zheng     uint8_t     mn[40];
1099a3d9a352SFam Zheng     uint8_t     fr[8];
1100a3d9a352SFam Zheng     uint8_t     rab;
1101a3d9a352SFam Zheng     uint8_t     ieee[3];
1102a3d9a352SFam Zheng     uint8_t     cmic;
1103a3d9a352SFam Zheng     uint8_t     mdts;
1104c26f2173SKlaus Jensen     uint16_t    cntlid;
1105c26f2173SKlaus Jensen     uint32_t    ver;
1106c26f2173SKlaus Jensen     uint32_t    rtd3r;
1107c26f2173SKlaus Jensen     uint32_t    rtd3e;
1108c26f2173SKlaus Jensen     uint32_t    oaes;
1109c26f2173SKlaus Jensen     uint32_t    ctratt;
1110c2a3640dSKlaus Jensen     uint8_t     rsvd100[11];
1111c2a3640dSKlaus Jensen     uint8_t     cntrltype;
1112c26f2173SKlaus Jensen     uint8_t     fguid[16];
1113c26f2173SKlaus Jensen     uint8_t     rsvd128[128];
1114a3d9a352SFam Zheng     uint16_t    oacs;
1115a3d9a352SFam Zheng     uint8_t     acl;
1116a3d9a352SFam Zheng     uint8_t     aerl;
1117a3d9a352SFam Zheng     uint8_t     frmw;
1118a3d9a352SFam Zheng     uint8_t     lpa;
1119a3d9a352SFam Zheng     uint8_t     elpe;
1120a3d9a352SFam Zheng     uint8_t     npss;
1121c26f2173SKlaus Jensen     uint8_t     avscc;
1122c26f2173SKlaus Jensen     uint8_t     apsta;
1123c26f2173SKlaus Jensen     uint16_t    wctemp;
1124c26f2173SKlaus Jensen     uint16_t    cctemp;
1125c26f2173SKlaus Jensen     uint16_t    mtfa;
1126c26f2173SKlaus Jensen     uint32_t    hmpre;
1127c26f2173SKlaus Jensen     uint32_t    hmmin;
1128c26f2173SKlaus Jensen     uint8_t     tnvmcap[16];
1129c26f2173SKlaus Jensen     uint8_t     unvmcap[16];
1130c26f2173SKlaus Jensen     uint32_t    rpmbs;
1131c26f2173SKlaus Jensen     uint16_t    edstt;
1132c26f2173SKlaus Jensen     uint8_t     dsto;
1133c26f2173SKlaus Jensen     uint8_t     fwug;
1134c26f2173SKlaus Jensen     uint16_t    kas;
1135c26f2173SKlaus Jensen     uint16_t    hctma;
1136c26f2173SKlaus Jensen     uint16_t    mntmt;
1137c26f2173SKlaus Jensen     uint16_t    mxtmt;
1138c26f2173SKlaus Jensen     uint32_t    sanicap;
1139771dbc3aSKlaus Jensen     uint8_t     rsvd332[6];
1140771dbc3aSKlaus Jensen     uint16_t    nsetidmax;
1141771dbc3aSKlaus Jensen     uint16_t    endgidmax;
1142771dbc3aSKlaus Jensen     uint8_t     rsvd342[170];
1143a3d9a352SFam Zheng     uint8_t     sqes;
1144a3d9a352SFam Zheng     uint8_t     cqes;
1145c26f2173SKlaus Jensen     uint16_t    maxcmd;
1146a3d9a352SFam Zheng     uint32_t    nn;
1147a3d9a352SFam Zheng     uint16_t    oncs;
1148a3d9a352SFam Zheng     uint16_t    fuses;
1149a3d9a352SFam Zheng     uint8_t     fna;
1150a3d9a352SFam Zheng     uint8_t     vwc;
1151a3d9a352SFam Zheng     uint16_t    awun;
1152a3d9a352SFam Zheng     uint16_t    awupf;
1153c26f2173SKlaus Jensen     uint8_t     nvscc;
1154c26f2173SKlaus Jensen     uint8_t     rsvd531;
1155c26f2173SKlaus Jensen     uint16_t    acwu;
11563862efffSKlaus Jensen     uint16_t    ocfs;
1157c26f2173SKlaus Jensen     uint32_t    sgls;
1158c26f2173SKlaus Jensen     uint8_t     rsvd540[228];
1159c26f2173SKlaus Jensen     uint8_t     subnqn[256];
1160c26f2173SKlaus Jensen     uint8_t     rsvd1024[1024];
1161a3d9a352SFam Zheng     NvmePSD     psd[32];
1162a3d9a352SFam Zheng     uint8_t     vs[1024];
1163a3d9a352SFam Zheng } NvmeIdCtrl;
1164a3d9a352SFam Zheng 
1165e9ba46eeSDmitry Fomichev typedef struct NvmeIdCtrlZoned {
1166e9ba46eeSDmitry Fomichev     uint8_t     zasl;
1167e9ba46eeSDmitry Fomichev     uint8_t     rsvd1[4095];
1168e9ba46eeSDmitry Fomichev } NvmeIdCtrlZoned;
1169e9ba46eeSDmitry Fomichev 
117067ce28a1SGollu Appalanaidu typedef struct NvmeIdCtrlNvm {
117167ce28a1SGollu Appalanaidu     uint8_t     vsl;
117267ce28a1SGollu Appalanaidu     uint8_t     wzsl;
117367ce28a1SGollu Appalanaidu     uint8_t     wusl;
117467ce28a1SGollu Appalanaidu     uint8_t     dmrl;
117567ce28a1SGollu Appalanaidu     uint32_t    dmrsl;
117667ce28a1SGollu Appalanaidu     uint64_t    dmsl;
117767ce28a1SGollu Appalanaidu     uint8_t     rsvd16[4080];
117867ce28a1SGollu Appalanaidu } NvmeIdCtrlNvm;
117967ce28a1SGollu Appalanaidu 
1180f432fdfaSMinwoo Im enum NvmeIdCtrlOaes {
1181f432fdfaSMinwoo Im     NVME_OAES_NS_ATTR   = 1 << 8,
1182f432fdfaSMinwoo Im };
1183f432fdfaSMinwoo Im 
1184763c05dfSNaveen Nagar enum NvmeIdCtrlCtratt {
1185771dbc3aSKlaus Jensen     NVME_CTRATT_ENDGRPS = 1 <<  4,
1186763c05dfSNaveen Nagar     NVME_CTRATT_ELBAS   = 1 << 15,
1187a1ab6788SArun Kumar     NVME_CTRATT_MEM     = 1 << 16,
118873064edfSJesper Devantier     NVME_CTRATT_FDPS    = 1 << 19,
1189763c05dfSNaveen Nagar };
1190763c05dfSNaveen Nagar 
1191a3d9a352SFam Zheng enum NvmeIdCtrlOacs {
1192a3d9a352SFam Zheng     NVME_OACS_SECURITY      = 1 << 0,
1193a3d9a352SFam Zheng     NVME_OACS_FORMAT        = 1 << 1,
1194a3d9a352SFam Zheng     NVME_OACS_FW            = 1 << 2,
1195645ce1a7SMinwoo Im     NVME_OACS_NS_MGMT       = 1 << 3,
1196e181d3daSGollu Appalanaidu     NVME_OACS_DIRECTIVES    = 1 << 5,
11973f7fe8deSJinhao Fan     NVME_OACS_DBBUF         = 1 << 8,
1198a3d9a352SFam Zheng };
1199a3d9a352SFam Zheng 
1200a3d9a352SFam Zheng enum NvmeIdCtrlOncs {
1201a3d9a352SFam Zheng     NVME_ONCS_COMPARE       = 1 << 0,
1202a3d9a352SFam Zheng     NVME_ONCS_WRITE_UNCORR  = 1 << 1,
1203a3d9a352SFam Zheng     NVME_ONCS_DSM           = 1 << 2,
120469265150SKlaus Jensen     NVME_ONCS_WRITE_ZEROES  = 1 << 3,
1205a3d9a352SFam Zheng     NVME_ONCS_FEATURES      = 1 << 4,
1206a3d9a352SFam Zheng     NVME_ONCS_RESRVATIONS   = 1 << 5,
12073036a626SKenneth Heitke     NVME_ONCS_TIMESTAMP     = 1 << 6,
12083e1da158SGollu Appalanaidu     NVME_ONCS_VERIFY        = 1 << 7,
12093862efffSKlaus Jensen     NVME_ONCS_COPY          = 1 << 8,
1210d522aef8SArun Kumar     NVME_ONCS_NVMCSA        = 1 << 9,
1211d522aef8SArun Kumar     NVME_ONCS_NVMAFC        = 1 << 10,
12123862efffSKlaus Jensen };
12133862efffSKlaus Jensen 
12143862efffSKlaus Jensen enum NvmeIdCtrlOcfs {
121544219b60SNaveen Nagar     NVME_OCFS_COPY_FORMAT_0 = 1 << NVME_COPY_FORMAT_0,
121644219b60SNaveen Nagar     NVME_OCFS_COPY_FORMAT_1 = 1 << NVME_COPY_FORMAT_1,
1217d522aef8SArun Kumar     NVME_OCFS_COPY_FORMAT_2 = 1 << NVME_COPY_FORMAT_2,
1218d522aef8SArun Kumar     NVME_OCFS_COPY_FORMAT_3 = 1 << NVME_COPY_FORMAT_3,
1219a3d9a352SFam Zheng };
1220a3d9a352SFam Zheng 
1221c9497328SGollu Appalanaidu enum NvmeIdctrlVwc {
1222c9497328SGollu Appalanaidu     NVME_VWC_PRESENT                    = 1 << 0,
1223c9497328SGollu Appalanaidu     NVME_VWC_NSID_BROADCAST_NO_SUPPORT  = 0 << 1,
1224c9497328SGollu Appalanaidu     NVME_VWC_NSID_BROADCAST_RESERVED    = 1 << 1,
1225c9497328SGollu Appalanaidu     NVME_VWC_NSID_BROADCAST_CTRL_SPEC   = 2 << 1,
1226c9497328SGollu Appalanaidu     NVME_VWC_NSID_BROADCAST_SUPPORT     = 3 << 1,
1227c9497328SGollu Appalanaidu };
1228c9497328SGollu Appalanaidu 
122942a42e46SKlaus Jensen enum NvmeIdCtrlFrmw {
123042a42e46SKlaus Jensen     NVME_FRMW_SLOT1_RO = 1 << 0,
123142a42e46SKlaus Jensen };
123242a42e46SKlaus Jensen 
123394a7897cSKlaus Jensen enum NvmeIdCtrlLpa {
12342fbbecc5SKeith Busch     NVME_LPA_NS_SMART = 1 << 0,
123562e8faa4SDmitry Fomichev     NVME_LPA_CSE      = 1 << 1,
123694a7897cSKlaus Jensen     NVME_LPA_EXTENDED = 1 << 2,
123794a7897cSKlaus Jensen };
123894a7897cSKlaus Jensen 
123966b7e9beSMinwoo Im enum NvmeIdCtrlCmic {
124066b7e9beSMinwoo Im     NVME_CMIC_MULTI_CTRL    = 1 << 1,
124166b7e9beSMinwoo Im };
124266b7e9beSMinwoo Im 
124307a3dfa7SNaveen Nagar enum NvmeNsAttachmentOperation {
124407a3dfa7SNaveen Nagar     NVME_NS_ATTACHMENT_ATTACH = 0x0,
124507a3dfa7SNaveen Nagar     NVME_NS_ATTACHMENT_DETACH = 0x1,
124607a3dfa7SNaveen Nagar };
124707a3dfa7SNaveen Nagar 
1248a3d9a352SFam Zheng #define NVME_CTRL_SQES_MIN(sqes) ((sqes) & 0xf)
1249a3d9a352SFam Zheng #define NVME_CTRL_SQES_MAX(sqes) (((sqes) >> 4) & 0xf)
1250a3d9a352SFam Zheng #define NVME_CTRL_CQES_MIN(cqes) ((cqes) & 0xf)
1251a3d9a352SFam Zheng #define NVME_CTRL_CQES_MAX(cqes) (((cqes) >> 4) & 0xf)
1252a3d9a352SFam Zheng 
1253c26f2173SKlaus Jensen #define NVME_CTRL_SGLS_SUPPORT_MASK        (0x3 <<  0)
1254c26f2173SKlaus Jensen #define NVME_CTRL_SGLS_SUPPORT_NO_ALIGN    (0x1 <<  0)
1255c26f2173SKlaus Jensen #define NVME_CTRL_SGLS_SUPPORT_DWORD_ALIGN (0x1 <<  1)
1256c26f2173SKlaus Jensen #define NVME_CTRL_SGLS_KEYED               (0x1 <<  2)
1257c26f2173SKlaus Jensen #define NVME_CTRL_SGLS_BITBUCKET           (0x1 << 16)
1258c26f2173SKlaus Jensen #define NVME_CTRL_SGLS_MPTR_CONTIGUOUS     (0x1 << 17)
1259c26f2173SKlaus Jensen #define NVME_CTRL_SGLS_EXCESS_LENGTH       (0x1 << 18)
1260c26f2173SKlaus Jensen #define NVME_CTRL_SGLS_MPTR_SGL            (0x1 << 19)
1261c26f2173SKlaus Jensen #define NVME_CTRL_SGLS_ADDR_OFFSET         (0x1 << 20)
1262c26f2173SKlaus Jensen 
1263a3d9a352SFam Zheng #define NVME_ARB_AB(arb)    (arb & 0x7)
12641302e48eSKlaus Jensen #define NVME_ARB_AB_NOLIMIT 0x7
1265a3d9a352SFam Zheng #define NVME_ARB_LPW(arb)   ((arb >> 8) & 0xff)
1266a3d9a352SFam Zheng #define NVME_ARB_MPW(arb)   ((arb >> 16) & 0xff)
1267a3d9a352SFam Zheng #define NVME_ARB_HPW(arb)   ((arb >> 24) & 0xff)
1268a3d9a352SFam Zheng 
1269a3d9a352SFam Zheng #define NVME_INTC_THR(intc)     (intc & 0xff)
1270a3d9a352SFam Zheng #define NVME_INTC_TIME(intc)    ((intc >> 8) & 0xff)
1271a3d9a352SFam Zheng 
12721302e48eSKlaus Jensen #define NVME_INTVC_NOCOALESCING (0x1 << 16)
12731302e48eSKlaus Jensen 
1274c26f2173SKlaus Jensen #define NVME_TEMP_THSEL(temp)  ((temp >> 20) & 0x3)
1275c26f2173SKlaus Jensen #define NVME_TEMP_THSEL_OVER   0x0
1276c26f2173SKlaus Jensen #define NVME_TEMP_THSEL_UNDER  0x1
1277c26f2173SKlaus Jensen 
1278c26f2173SKlaus Jensen #define NVME_TEMP_TMPSEL(temp)     ((temp >> 16) & 0xf)
1279c26f2173SKlaus Jensen #define NVME_TEMP_TMPSEL_COMPOSITE 0x0
1280c26f2173SKlaus Jensen 
1281c26f2173SKlaus Jensen #define NVME_TEMP_TMPTH(temp) (temp & 0xffff)
1282c26f2173SKlaus Jensen 
12835d5a5330SKlaus Jensen #define NVME_AEC_SMART(aec)         (aec & 0xff)
12845d5a5330SKlaus Jensen #define NVME_AEC_NS_ATTR(aec)       ((aec >> 8) & 0x1)
12855d5a5330SKlaus Jensen #define NVME_AEC_FW_ACTIVATION(aec) ((aec >> 9) & 0x1)
1286771dbc3aSKlaus Jensen #define NVME_AEC_ENDGRP_NOTICE(aec) ((aec >> 14) & 0x1)
12875d5a5330SKlaus Jensen 
128854064e51SKlaus Jensen #define NVME_ERR_REC_TLER(err_rec)  (err_rec & 0xffff)
128954064e51SKlaus Jensen #define NVME_ERR_REC_DULBE(err_rec) (err_rec & 0x10000)
129054064e51SKlaus Jensen 
1291a1ab6788SArun Kumar #define NVME_ID_CTRL_CTRATT_MEM(ctratt) (ctratt & NVME_CTRATT_MEM)
1292a1ab6788SArun Kumar 
1293a3d9a352SFam Zheng enum NvmeFeatureIds {
1294a3d9a352SFam Zheng     NVME_ARBITRATION                = 0x1,
1295a3d9a352SFam Zheng     NVME_POWER_MANAGEMENT           = 0x2,
1296a3d9a352SFam Zheng     NVME_LBA_RANGE_TYPE             = 0x3,
1297a3d9a352SFam Zheng     NVME_TEMPERATURE_THRESHOLD      = 0x4,
1298a3d9a352SFam Zheng     NVME_ERROR_RECOVERY             = 0x5,
1299a3d9a352SFam Zheng     NVME_VOLATILE_WRITE_CACHE       = 0x6,
1300a3d9a352SFam Zheng     NVME_NUMBER_OF_QUEUES           = 0x7,
1301a3d9a352SFam Zheng     NVME_INTERRUPT_COALESCING       = 0x8,
1302a3d9a352SFam Zheng     NVME_INTERRUPT_VECTOR_CONF      = 0x9,
1303a3d9a352SFam Zheng     NVME_WRITE_ATOMICITY            = 0xa,
1304a3d9a352SFam Zheng     NVME_ASYNCHRONOUS_EVENT_CONF    = 0xb,
13053036a626SKenneth Heitke     NVME_TIMESTAMP                  = 0xe,
1306d0c0697bSNaveen Nagar     NVME_HOST_BEHAVIOR_SUPPORT      = 0x16,
1307141354d5SNiklas Cassel     NVME_COMMAND_SET_PROFILE        = 0x19,
130873064edfSJesper Devantier     NVME_FDP_MODE                   = 0x1d,
130973064edfSJesper Devantier     NVME_FDP_EVENTS                 = 0x1e,
13101302e48eSKlaus Jensen     NVME_SOFTWARE_PROGRESS_MARKER   = 0x80,
13111302e48eSKlaus Jensen     NVME_FID_MAX                    = 0x100,
1312a3d9a352SFam Zheng };
1313a3d9a352SFam Zheng 
13147c46310dSKlaus Jensen typedef enum NvmeFeatureCap {
13157c46310dSKlaus Jensen     NVME_FEAT_CAP_SAVE      = 1 << 0,
13167c46310dSKlaus Jensen     NVME_FEAT_CAP_NS        = 1 << 1,
13177c46310dSKlaus Jensen     NVME_FEAT_CAP_CHANGE    = 1 << 2,
13187c46310dSKlaus Jensen } NvmeFeatureCap;
13197c46310dSKlaus Jensen 
13207c46310dSKlaus Jensen typedef enum NvmeGetFeatureSelect {
13217c46310dSKlaus Jensen     NVME_GETFEAT_SELECT_CURRENT = 0x0,
13227c46310dSKlaus Jensen     NVME_GETFEAT_SELECT_DEFAULT = 0x1,
13237c46310dSKlaus Jensen     NVME_GETFEAT_SELECT_SAVED   = 0x2,
13247c46310dSKlaus Jensen     NVME_GETFEAT_SELECT_CAP     = 0x3,
13257c46310dSKlaus Jensen } NvmeGetFeatureSelect;
13267c46310dSKlaus Jensen 
13271302e48eSKlaus Jensen #define NVME_GETSETFEAT_FID_MASK 0xff
13281302e48eSKlaus Jensen #define NVME_GETSETFEAT_FID(dw10) (dw10 & NVME_GETSETFEAT_FID_MASK)
13291302e48eSKlaus Jensen 
13307c46310dSKlaus Jensen #define NVME_GETFEAT_SELECT_SHIFT 8
13317c46310dSKlaus Jensen #define NVME_GETFEAT_SELECT_MASK  0x7
13327c46310dSKlaus Jensen #define NVME_GETFEAT_SELECT(dw10) \
13337c46310dSKlaus Jensen     ((dw10 >> NVME_GETFEAT_SELECT_SHIFT) & NVME_GETFEAT_SELECT_MASK)
13347c46310dSKlaus Jensen 
13357c46310dSKlaus Jensen #define NVME_SETFEAT_SAVE_SHIFT 31
13367c46310dSKlaus Jensen #define NVME_SETFEAT_SAVE_MASK  0x1
13377c46310dSKlaus Jensen #define NVME_SETFEAT_SAVE(dw10) \
13387c46310dSKlaus Jensen     ((dw10 >> NVME_SETFEAT_SAVE_SHIFT) & NVME_SETFEAT_SAVE_MASK)
13397c46310dSKlaus Jensen 
1340e989738fSPhilippe Mathieu-Daudé typedef struct QEMU_PACKED NvmeRangeType {
1341a3d9a352SFam Zheng     uint8_t     type;
1342a3d9a352SFam Zheng     uint8_t     attributes;
1343a3d9a352SFam Zheng     uint8_t     rsvd2[14];
1344a3d9a352SFam Zheng     uint64_t    slba;
1345a3d9a352SFam Zheng     uint64_t    nlb;
1346a3d9a352SFam Zheng     uint8_t     guid[16];
1347a3d9a352SFam Zheng     uint8_t     rsvd48[16];
1348a3d9a352SFam Zheng } NvmeRangeType;
1349a3d9a352SFam Zheng 
1350d0c0697bSNaveen Nagar typedef struct NvmeHostBehaviorSupport {
1351d0c0697bSNaveen Nagar     uint8_t     acre;
1352d0c0697bSNaveen Nagar     uint8_t     etdas;
1353d0c0697bSNaveen Nagar     uint8_t     lbafee;
1354d522aef8SArun Kumar     uint8_t     rsvd3;
1355d522aef8SArun Kumar     uint16_t    cdfe;
1356d522aef8SArun Kumar     uint8_t     rsvd6[506];
1357d0c0697bSNaveen Nagar } NvmeHostBehaviorSupport;
1358d0c0697bSNaveen Nagar 
1359e989738fSPhilippe Mathieu-Daudé typedef struct QEMU_PACKED NvmeLBAF {
1360a3d9a352SFam Zheng     uint16_t    ms;
1361a3d9a352SFam Zheng     uint8_t     ds;
1362a3d9a352SFam Zheng     uint8_t     rp;
1363a3d9a352SFam Zheng } NvmeLBAF;
1364a3d9a352SFam Zheng 
1365e9ba46eeSDmitry Fomichev typedef struct QEMU_PACKED NvmeLBAFE {
1366e9ba46eeSDmitry Fomichev     uint64_t    zsze;
1367e9ba46eeSDmitry Fomichev     uint8_t     zdes;
1368e9ba46eeSDmitry Fomichev     uint8_t     rsvd9[7];
1369e9ba46eeSDmitry Fomichev } NvmeLBAFE;
1370e9ba46eeSDmitry Fomichev 
13717c46310dSKlaus Jensen #define NVME_NSID_BROADCAST 0xffffffff
137244219b60SNaveen Nagar #define NVME_MAX_NLBAF 64
13737c46310dSKlaus Jensen 
1374e989738fSPhilippe Mathieu-Daudé typedef struct QEMU_PACKED NvmeIdNs {
1375a3d9a352SFam Zheng     uint64_t    nsze;
1376a3d9a352SFam Zheng     uint64_t    ncap;
1377a3d9a352SFam Zheng     uint64_t    nuse;
1378a3d9a352SFam Zheng     uint8_t     nsfeat;
1379a3d9a352SFam Zheng     uint8_t     nlbaf;
1380a3d9a352SFam Zheng     uint8_t     flbas;
1381a3d9a352SFam Zheng     uint8_t     mc;
1382a3d9a352SFam Zheng     uint8_t     dpc;
1383a3d9a352SFam Zheng     uint8_t     dps;
1384e0dd95e3SMaxim Levitsky     uint8_t     nmic;
1385e0dd95e3SMaxim Levitsky     uint8_t     rescap;
1386e0dd95e3SMaxim Levitsky     uint8_t     fpi;
1387e0dd95e3SMaxim Levitsky     uint8_t     dlfeat;
1388c26f2173SKlaus Jensen     uint16_t    nawun;
1389c26f2173SKlaus Jensen     uint16_t    nawupf;
1390c26f2173SKlaus Jensen     uint16_t    nacwu;
1391c26f2173SKlaus Jensen     uint16_t    nabsn;
1392c26f2173SKlaus Jensen     uint16_t    nabo;
1393c26f2173SKlaus Jensen     uint16_t    nabspf;
1394c26f2173SKlaus Jensen     uint16_t    noiob;
1395c26f2173SKlaus Jensen     uint8_t     nvmcap[16];
13966fd704a5SKlaus Jensen     uint16_t    npwg;
13976fd704a5SKlaus Jensen     uint16_t    npwa;
13986fd704a5SKlaus Jensen     uint16_t    npdg;
13996fd704a5SKlaus Jensen     uint16_t    npda;
14006fd704a5SKlaus Jensen     uint16_t    nows;
14013862efffSKlaus Jensen     uint16_t    mssrl;
14023862efffSKlaus Jensen     uint32_t    mcl;
14033862efffSKlaus Jensen     uint8_t     msrc;
1404771dbc3aSKlaus Jensen     uint8_t     rsvd81[18];
1405771dbc3aSKlaus Jensen     uint8_t     nsattr;
1406771dbc3aSKlaus Jensen     uint16_t    nvmsetid;
1407771dbc3aSKlaus Jensen     uint16_t    endgid;
1408c26f2173SKlaus Jensen     uint8_t     nguid[16];
1409c26f2173SKlaus Jensen     uint64_t    eui64;
141044219b60SNaveen Nagar     NvmeLBAF    lbaf[NVME_MAX_NLBAF];
1411a3d9a352SFam Zheng     uint8_t     vs[3712];
1412a3d9a352SFam Zheng } NvmeIdNs;
1413a3d9a352SFam Zheng 
141444219b60SNaveen Nagar #define NVME_ID_NS_NVM_ELBAF_PIF(elbaf) (((elbaf) >> 7) & 0x3)
141544219b60SNaveen Nagar 
141644219b60SNaveen Nagar typedef struct QEMU_PACKED NvmeIdNsNvm {
141744219b60SNaveen Nagar     uint64_t    lbstm;
141844219b60SNaveen Nagar     uint8_t     pic;
141944219b60SNaveen Nagar     uint8_t     rsvd9[3];
142044219b60SNaveen Nagar     uint32_t    elbaf[NVME_MAX_NLBAF];
1421*dbaa2936SAyush Mishra     uint32_t    npdgl;
1422*dbaa2936SAyush Mishra     uint32_t    nprg;
1423*dbaa2936SAyush Mishra     uint32_t    npra;
1424*dbaa2936SAyush Mishra     uint32_t    nors;
1425*dbaa2936SAyush Mishra     uint32_t    npdal;
1426*dbaa2936SAyush Mishra     uint8_t     rsvd288[3808];
142744219b60SNaveen Nagar } NvmeIdNsNvm;
142844219b60SNaveen Nagar 
142979e49005SArun Kumar typedef struct QEMU_PACKED NvmeIdNsInd {
143079e49005SArun Kumar     uint8_t     nsfeat;
143179e49005SArun Kumar     uint8_t     nmic;
143279e49005SArun Kumar     uint8_t     rescap;
143379e49005SArun Kumar     uint8_t     fpi;
143479e49005SArun Kumar     uint32_t    anagrpid;
143579e49005SArun Kumar     uint8_t     nsattr;
143679e49005SArun Kumar     uint8_t     rsvd9;
143779e49005SArun Kumar     uint16_t    nvmsetid;
143879e49005SArun Kumar     uint16_t    endgrpid;
143979e49005SArun Kumar     uint8_t     nstat;
144079e49005SArun Kumar     uint8_t     rsvd15[4081];
144179e49005SArun Kumar } NvmeIdNsInd;
144279e49005SArun Kumar 
1443c26f2173SKlaus Jensen typedef struct QEMU_PACKED NvmeIdNsDescr {
1444c26f2173SKlaus Jensen     uint8_t nidt;
1445c26f2173SKlaus Jensen     uint8_t nidl;
1446c26f2173SKlaus Jensen     uint8_t rsvd2[2];
1447c26f2173SKlaus Jensen } NvmeIdNsDescr;
1448c26f2173SKlaus Jensen 
1449141354d5SNiklas Cassel enum NvmeNsIdentifierLength {
1450141354d5SNiklas Cassel     NVME_NIDL_EUI64             = 8,
1451141354d5SNiklas Cassel     NVME_NIDL_NGUID             = 16,
1452141354d5SNiklas Cassel     NVME_NIDL_UUID              = 16,
1453141354d5SNiklas Cassel     NVME_NIDL_CSI               = 1,
1454c26f2173SKlaus Jensen };
1455c26f2173SKlaus Jensen 
1456c26f2173SKlaus Jensen enum NvmeNsIdentifierType {
1457141354d5SNiklas Cassel     NVME_NIDT_EUI64             = 0x01,
1458141354d5SNiklas Cassel     NVME_NIDT_NGUID             = 0x02,
1459141354d5SNiklas Cassel     NVME_NIDT_UUID              = 0x03,
1460141354d5SNiklas Cassel     NVME_NIDT_CSI               = 0x04,
1461c26f2173SKlaus Jensen };
1462e0dd95e3SMaxim Levitsky 
146379e49005SArun Kumar enum NvmeIdNsIndependent {
146479e49005SArun Kumar     NVME_ID_NS_IND_NMIC_SHRNS   = 1 << 0,
146579e49005SArun Kumar     NVME_ID_NS_IND_NMIC_DISNS   = 1 << 1,
146679e49005SArun Kumar     NVME_ID_NS_IND_NSTAT_NRDY   = 1 << 0,
1467adc36b8dSMinwoo Im };
1468adc36b8dSMinwoo Im 
1469141354d5SNiklas Cassel enum NvmeCsi {
1470141354d5SNiklas Cassel     NVME_CSI_NVM                = 0x00,
1471e9ba46eeSDmitry Fomichev     NVME_CSI_ZONED              = 0x02,
1472141354d5SNiklas Cassel };
1473141354d5SNiklas Cassel 
1474141354d5SNiklas Cassel #define NVME_SET_CSI(vec, csi) (vec |= (uint8_t)(1 << (csi)))
1475141354d5SNiklas Cassel 
1476e9ba46eeSDmitry Fomichev typedef struct QEMU_PACKED NvmeIdNsZoned {
1477e9ba46eeSDmitry Fomichev     uint16_t    zoc;
1478e9ba46eeSDmitry Fomichev     uint16_t    ozcs;
1479e9ba46eeSDmitry Fomichev     uint32_t    mar;
1480e9ba46eeSDmitry Fomichev     uint32_t    mor;
1481e9ba46eeSDmitry Fomichev     uint32_t    rrl;
1482e9ba46eeSDmitry Fomichev     uint32_t    frl;
1483e321b4cdSKlaus Jensen     uint8_t     rsvd12[24];
1484e321b4cdSKlaus Jensen     uint32_t    numzrwa;
1485e321b4cdSKlaus Jensen     uint16_t    zrwafg;
1486e321b4cdSKlaus Jensen     uint16_t    zrwas;
1487e321b4cdSKlaus Jensen     uint8_t     zrwacap;
1488e321b4cdSKlaus Jensen     uint8_t     rsvd53[2763];
1489e9ba46eeSDmitry Fomichev     NvmeLBAFE   lbafe[16];
1490e9ba46eeSDmitry Fomichev     uint8_t     rsvd3072[768];
1491e9ba46eeSDmitry Fomichev     uint8_t     vs[256];
1492e9ba46eeSDmitry Fomichev } NvmeIdNsZoned;
1493e9ba46eeSDmitry Fomichev 
149425872031SKlaus Jensen enum NvmeIdNsZonedOzcs {
149525872031SKlaus Jensen     NVME_ID_NS_ZONED_OZCS_RAZB    = 1 << 0,
1496e321b4cdSKlaus Jensen     NVME_ID_NS_ZONED_OZCS_ZRWASUP = 1 << 1,
1497e321b4cdSKlaus Jensen };
1498e321b4cdSKlaus Jensen 
1499e321b4cdSKlaus Jensen enum NvmeIdNsZonedZrwacap {
1500e321b4cdSKlaus Jensen     NVME_ID_NS_ZONED_ZRWACAP_EXPFLUSHSUP = 1 << 0,
150125872031SKlaus Jensen };
150225872031SKlaus Jensen 
1503e0dd95e3SMaxim Levitsky /*Deallocate Logical Block Features*/
1504e0dd95e3SMaxim Levitsky #define NVME_ID_NS_DLFEAT_GUARD_CRC(dlfeat)       ((dlfeat) & 0x10)
1505e0dd95e3SMaxim Levitsky #define NVME_ID_NS_DLFEAT_WRITE_ZEROES(dlfeat)    ((dlfeat) & 0x08)
1506e0dd95e3SMaxim Levitsky 
1507e0dd95e3SMaxim Levitsky #define NVME_ID_NS_DLFEAT_READ_BEHAVIOR(dlfeat)     ((dlfeat) & 0x7)
1508e0dd95e3SMaxim Levitsky #define NVME_ID_NS_DLFEAT_READ_BEHAVIOR_UNDEFINED   0
1509e0dd95e3SMaxim Levitsky #define NVME_ID_NS_DLFEAT_READ_BEHAVIOR_ZEROES      1
1510e0dd95e3SMaxim Levitsky #define NVME_ID_NS_DLFEAT_READ_BEHAVIOR_ONES        2
1511e0dd95e3SMaxim Levitsky 
1512e0dd95e3SMaxim Levitsky 
1513a3d9a352SFam Zheng #define NVME_ID_NS_NSFEAT_THIN(nsfeat)      ((nsfeat & 0x1))
151454064e51SKlaus Jensen #define NVME_ID_NS_NSFEAT_DULBE(nsfeat)     ((nsfeat >> 2) & 0x1)
1515a3d9a352SFam Zheng #define NVME_ID_NS_FLBAS_EXTENDED(flbas)    ((flbas >> 4) & 0x1)
1516a3d9a352SFam Zheng #define NVME_ID_NS_FLBAS_INDEX(flbas)       ((flbas & 0xf))
1517a3d9a352SFam Zheng #define NVME_ID_NS_MC_SEPARATE(mc)          ((mc >> 1) & 0x1)
1518a3d9a352SFam Zheng #define NVME_ID_NS_MC_EXTENDED(mc)          ((mc & 0x1))
1519a3d9a352SFam Zheng #define NVME_ID_NS_DPC_LAST_EIGHT(dpc)      ((dpc >> 4) & 0x1)
1520a3d9a352SFam Zheng #define NVME_ID_NS_DPC_FIRST_EIGHT(dpc)     ((dpc >> 3) & 0x1)
1521a3d9a352SFam Zheng #define NVME_ID_NS_DPC_TYPE_3(dpc)          ((dpc >> 2) & 0x1)
1522a3d9a352SFam Zheng #define NVME_ID_NS_DPC_TYPE_2(dpc)          ((dpc >> 1) & 0x1)
1523a3d9a352SFam Zheng #define NVME_ID_NS_DPC_TYPE_1(dpc)          ((dpc & 0x1))
1524a3d9a352SFam Zheng #define NVME_ID_NS_DPC_TYPE_MASK            0x7
1525a3d9a352SFam Zheng 
1526a3d9a352SFam Zheng enum NvmeIdNsDps {
1527146f720cSKlaus Jensen     NVME_ID_NS_DPS_TYPE_NONE   = 0,
1528146f720cSKlaus Jensen     NVME_ID_NS_DPS_TYPE_1      = 1,
1529146f720cSKlaus Jensen     NVME_ID_NS_DPS_TYPE_2      = 2,
1530146f720cSKlaus Jensen     NVME_ID_NS_DPS_TYPE_3      = 3,
1531146f720cSKlaus Jensen     NVME_ID_NS_DPS_TYPE_MASK   = 0x7,
1532146f720cSKlaus Jensen     NVME_ID_NS_DPS_FIRST_EIGHT = 8,
1533a3d9a352SFam Zheng };
1534a3d9a352SFam Zheng 
153518de1526SGollu Appalanaidu enum NvmeIdNsFlbas {
153618de1526SGollu Appalanaidu     NVME_ID_NS_FLBAS_EXTENDED = 1 << 4,
153718de1526SGollu Appalanaidu };
153818de1526SGollu Appalanaidu 
153918de1526SGollu Appalanaidu enum NvmeIdNsMc {
154018de1526SGollu Appalanaidu     NVME_ID_NS_MC_EXTENDED = 1 << 0,
154118de1526SGollu Appalanaidu     NVME_ID_NS_MC_SEPARATE = 1 << 1,
154218de1526SGollu Appalanaidu };
154318de1526SGollu Appalanaidu 
1544*dbaa2936SAyush Mishra enum NvmeIdNsNsfeat {
1545*dbaa2936SAyush Mishra     NVME_ID_NS_NSFEAT_THINP         = 1 << 0,
1546*dbaa2936SAyush Mishra     NVME_ID_NS_NSFEAT_NSABPNS       = 1 << 1,
1547*dbaa2936SAyush Mishra     NVME_ID_NS_NSFEAT_DAE           = 1 << 2,
1548*dbaa2936SAyush Mishra     NVME_ID_NS_NSFEAT_UIDREUSE      = 1 << 3,
1549*dbaa2936SAyush Mishra     NVME_ID_NS_NSFEAT_OPTPERF_ALL   = 3 << 4,
1550*dbaa2936SAyush Mishra     NVME_ID_NS_NSFEAT_MAM           = 1 << 6,
1551*dbaa2936SAyush Mishra     NVME_ID_NS_NSFEAT_OPTRPERF      = 1 << 7,
1552*dbaa2936SAyush Mishra };
1553*dbaa2936SAyush Mishra 
1554146f720cSKlaus Jensen #define NVME_ID_NS_DPS_TYPE(dps) (dps & NVME_ID_NS_DPS_TYPE_MASK)
1555146f720cSKlaus Jensen 
155644219b60SNaveen Nagar enum NvmePIFormat {
155744219b60SNaveen Nagar     NVME_PI_GUARD_16                 = 0,
155844219b60SNaveen Nagar     NVME_PI_GUARD_64                 = 2,
155944219b60SNaveen Nagar };
156044219b60SNaveen Nagar 
156144219b60SNaveen Nagar typedef union NvmeDifTuple {
156244219b60SNaveen Nagar     struct {
1563146f720cSKlaus Jensen         uint16_t guard;
1564146f720cSKlaus Jensen         uint16_t apptag;
1565146f720cSKlaus Jensen         uint32_t reftag;
156644219b60SNaveen Nagar     } g16;
156744219b60SNaveen Nagar 
156844219b60SNaveen Nagar     struct {
156944219b60SNaveen Nagar         uint64_t guard;
157044219b60SNaveen Nagar         uint16_t apptag;
157144219b60SNaveen Nagar         uint8_t  sr[6];
157244219b60SNaveen Nagar     } g64;
1573146f720cSKlaus Jensen } NvmeDifTuple;
1574146f720cSKlaus Jensen 
1575e9ba46eeSDmitry Fomichev enum NvmeZoneAttr {
1576e9ba46eeSDmitry Fomichev     NVME_ZA_FINISHED_BY_CTLR         = 1 << 0,
1577e9ba46eeSDmitry Fomichev     NVME_ZA_FINISH_RECOMMENDED       = 1 << 1,
1578e9ba46eeSDmitry Fomichev     NVME_ZA_RESET_RECOMMENDED        = 1 << 2,
1579e321b4cdSKlaus Jensen     NVME_ZA_ZRWA_VALID               = 1 << 3,
1580e9ba46eeSDmitry Fomichev     NVME_ZA_ZD_EXT_VALID             = 1 << 7,
1581e9ba46eeSDmitry Fomichev };
1582e9ba46eeSDmitry Fomichev 
1583e9ba46eeSDmitry Fomichev typedef struct QEMU_PACKED NvmeZoneReportHeader {
1584e9ba46eeSDmitry Fomichev     uint64_t    nr_zones;
1585e9ba46eeSDmitry Fomichev     uint8_t     rsvd[56];
1586e9ba46eeSDmitry Fomichev } NvmeZoneReportHeader;
1587e9ba46eeSDmitry Fomichev 
1588e9ba46eeSDmitry Fomichev enum NvmeZoneReceiveAction {
1589e9ba46eeSDmitry Fomichev     NVME_ZONE_REPORT                 = 0,
1590e9ba46eeSDmitry Fomichev     NVME_ZONE_REPORT_EXTENDED        = 1,
1591e9ba46eeSDmitry Fomichev };
1592e9ba46eeSDmitry Fomichev 
1593e9ba46eeSDmitry Fomichev enum NvmeZoneReportType {
1594e9ba46eeSDmitry Fomichev     NVME_ZONE_REPORT_ALL             = 0,
1595e9ba46eeSDmitry Fomichev     NVME_ZONE_REPORT_EMPTY           = 1,
1596e9ba46eeSDmitry Fomichev     NVME_ZONE_REPORT_IMPLICITLY_OPEN = 2,
1597e9ba46eeSDmitry Fomichev     NVME_ZONE_REPORT_EXPLICITLY_OPEN = 3,
1598e9ba46eeSDmitry Fomichev     NVME_ZONE_REPORT_CLOSED          = 4,
1599e9ba46eeSDmitry Fomichev     NVME_ZONE_REPORT_FULL            = 5,
1600e9ba46eeSDmitry Fomichev     NVME_ZONE_REPORT_READ_ONLY       = 6,
1601e9ba46eeSDmitry Fomichev     NVME_ZONE_REPORT_OFFLINE         = 7,
1602e9ba46eeSDmitry Fomichev };
1603e9ba46eeSDmitry Fomichev 
1604e9ba46eeSDmitry Fomichev enum NvmeZoneType {
1605e9ba46eeSDmitry Fomichev     NVME_ZONE_TYPE_RESERVED          = 0x00,
1606e9ba46eeSDmitry Fomichev     NVME_ZONE_TYPE_SEQ_WRITE         = 0x02,
1607e9ba46eeSDmitry Fomichev };
1608e9ba46eeSDmitry Fomichev 
16096190d92fSKlaus Jensen typedef struct QEMU_PACKED NvmeZoneSendCmd {
16106190d92fSKlaus Jensen     uint8_t     opcode;
16116190d92fSKlaus Jensen     uint8_t     flags;
16126190d92fSKlaus Jensen     uint16_t    cid;
16136190d92fSKlaus Jensen     uint32_t    nsid;
16146190d92fSKlaus Jensen     uint32_t    rsvd8[4];
16156190d92fSKlaus Jensen     NvmeCmdDptr dptr;
16166190d92fSKlaus Jensen     uint64_t    slba;
16176190d92fSKlaus Jensen     uint32_t    rsvd48;
16186190d92fSKlaus Jensen     uint8_t     zsa;
16196190d92fSKlaus Jensen     uint8_t     zsflags;
16206190d92fSKlaus Jensen     uint8_t     rsvd54[2];
16216190d92fSKlaus Jensen     uint32_t    rsvd56[2];
16226190d92fSKlaus Jensen } NvmeZoneSendCmd;
16236190d92fSKlaus Jensen 
1624e9ba46eeSDmitry Fomichev enum NvmeZoneSendAction {
1625e9ba46eeSDmitry Fomichev     NVME_ZONE_ACTION_RSD             = 0x00,
1626e9ba46eeSDmitry Fomichev     NVME_ZONE_ACTION_CLOSE           = 0x01,
1627e9ba46eeSDmitry Fomichev     NVME_ZONE_ACTION_FINISH          = 0x02,
1628e9ba46eeSDmitry Fomichev     NVME_ZONE_ACTION_OPEN            = 0x03,
1629e9ba46eeSDmitry Fomichev     NVME_ZONE_ACTION_RESET           = 0x04,
1630e9ba46eeSDmitry Fomichev     NVME_ZONE_ACTION_OFFLINE         = 0x05,
1631e9ba46eeSDmitry Fomichev     NVME_ZONE_ACTION_SET_ZD_EXT      = 0x10,
1632e321b4cdSKlaus Jensen     NVME_ZONE_ACTION_ZRWA_FLUSH      = 0x11,
1633e9ba46eeSDmitry Fomichev };
1634e9ba46eeSDmitry Fomichev 
16356190d92fSKlaus Jensen enum {
16366190d92fSKlaus Jensen     NVME_ZSFLAG_SELECT_ALL = 1 << 0,
1637e321b4cdSKlaus Jensen     NVME_ZSFLAG_ZRWA_ALLOC = 1 << 1,
16386190d92fSKlaus Jensen };
16396190d92fSKlaus Jensen 
1640e9ba46eeSDmitry Fomichev typedef struct QEMU_PACKED NvmeZoneDescr {
1641e9ba46eeSDmitry Fomichev     uint8_t     zt;
1642e9ba46eeSDmitry Fomichev     uint8_t     zs;
1643e9ba46eeSDmitry Fomichev     uint8_t     za;
1644e9ba46eeSDmitry Fomichev     uint8_t     rsvd3[5];
1645e9ba46eeSDmitry Fomichev     uint64_t    zcap;
1646e9ba46eeSDmitry Fomichev     uint64_t    zslba;
1647e9ba46eeSDmitry Fomichev     uint64_t    wp;
1648e9ba46eeSDmitry Fomichev     uint8_t     rsvd32[32];
1649e9ba46eeSDmitry Fomichev } NvmeZoneDescr;
1650e9ba46eeSDmitry Fomichev 
1651b05fde28SKlaus Jensen typedef enum NvmeZoneState {
1652e9ba46eeSDmitry Fomichev     NVME_ZONE_STATE_RESERVED         = 0x00,
1653e9ba46eeSDmitry Fomichev     NVME_ZONE_STATE_EMPTY            = 0x01,
1654e9ba46eeSDmitry Fomichev     NVME_ZONE_STATE_IMPLICITLY_OPEN  = 0x02,
1655e9ba46eeSDmitry Fomichev     NVME_ZONE_STATE_EXPLICITLY_OPEN  = 0x03,
1656e9ba46eeSDmitry Fomichev     NVME_ZONE_STATE_CLOSED           = 0x04,
1657312c3531SGollu Appalanaidu     NVME_ZONE_STATE_READ_ONLY        = 0x0d,
1658312c3531SGollu Appalanaidu     NVME_ZONE_STATE_FULL             = 0x0e,
1659312c3531SGollu Appalanaidu     NVME_ZONE_STATE_OFFLINE          = 0x0f,
1660b05fde28SKlaus Jensen } NvmeZoneState;
1661e9ba46eeSDmitry Fomichev 
16625e6f963fSLukasz Maniak typedef struct QEMU_PACKED NvmePriCtrlCap {
16635e6f963fSLukasz Maniak     uint16_t    cntlid;
16645e6f963fSLukasz Maniak     uint16_t    portid;
16655e6f963fSLukasz Maniak     uint8_t     crt;
16665e6f963fSLukasz Maniak     uint8_t     rsvd5[27];
16675e6f963fSLukasz Maniak     uint32_t    vqfrt;
16685e6f963fSLukasz Maniak     uint32_t    vqrfa;
16695e6f963fSLukasz Maniak     uint16_t    vqrfap;
16705e6f963fSLukasz Maniak     uint16_t    vqprt;
16715e6f963fSLukasz Maniak     uint16_t    vqfrsm;
16725e6f963fSLukasz Maniak     uint16_t    vqgran;
16735e6f963fSLukasz Maniak     uint8_t     rsvd48[16];
16745e6f963fSLukasz Maniak     uint32_t    vifrt;
16755e6f963fSLukasz Maniak     uint32_t    virfa;
16765e6f963fSLukasz Maniak     uint16_t    virfap;
16775e6f963fSLukasz Maniak     uint16_t    viprt;
16785e6f963fSLukasz Maniak     uint16_t    vifrsm;
16795e6f963fSLukasz Maniak     uint16_t    vigran;
16805e6f963fSLukasz Maniak     uint8_t     rsvd80[4016];
16815e6f963fSLukasz Maniak } NvmePriCtrlCap;
16825e6f963fSLukasz Maniak 
1683746d42b1SŁukasz Gieryk typedef enum NvmePriCtrlCapCrt {
1684746d42b1SŁukasz Gieryk     NVME_CRT_VQ             = 1 << 0,
1685746d42b1SŁukasz Gieryk     NVME_CRT_VI             = 1 << 1,
1686746d42b1SŁukasz Gieryk } NvmePriCtrlCapCrt;
1687746d42b1SŁukasz Gieryk 
168899f48ae7SLukasz Maniak typedef struct QEMU_PACKED NvmeSecCtrlEntry {
168999f48ae7SLukasz Maniak     uint16_t    scid;
169099f48ae7SLukasz Maniak     uint16_t    pcid;
169199f48ae7SLukasz Maniak     uint8_t     scs;
169299f48ae7SLukasz Maniak     uint8_t     rsvd5[3];
169399f48ae7SLukasz Maniak     uint16_t    vfn;
169499f48ae7SLukasz Maniak     uint16_t    nvq;
169599f48ae7SLukasz Maniak     uint16_t    nvi;
169699f48ae7SLukasz Maniak     uint8_t     rsvd14[18];
169799f48ae7SLukasz Maniak } NvmeSecCtrlEntry;
169899f48ae7SLukasz Maniak 
169999f48ae7SLukasz Maniak typedef struct QEMU_PACKED NvmeSecCtrlList {
170099f48ae7SLukasz Maniak     uint8_t             numcntl;
170199f48ae7SLukasz Maniak     uint8_t             rsvd1[31];
170299f48ae7SLukasz Maniak     NvmeSecCtrlEntry    sec[127];
170399f48ae7SLukasz Maniak } NvmeSecCtrlList;
170499f48ae7SLukasz Maniak 
170511871f53SŁukasz Gieryk typedef enum NvmeVirtMngmtAction {
170611871f53SŁukasz Gieryk     NVME_VIRT_MNGMT_ACTION_PRM_ALLOC    = 0x01,
170711871f53SŁukasz Gieryk     NVME_VIRT_MNGMT_ACTION_SEC_OFFLINE  = 0x07,
170811871f53SŁukasz Gieryk     NVME_VIRT_MNGMT_ACTION_SEC_ASSIGN   = 0x08,
170911871f53SŁukasz Gieryk     NVME_VIRT_MNGMT_ACTION_SEC_ONLINE   = 0x09,
171011871f53SŁukasz Gieryk } NvmeVirtMngmtAction;
171111871f53SŁukasz Gieryk 
171211871f53SŁukasz Gieryk typedef enum NvmeVirtualResourceType {
171311871f53SŁukasz Gieryk     NVME_VIRT_RES_QUEUE         = 0x00,
171411871f53SŁukasz Gieryk     NVME_VIRT_RES_INTERRUPT     = 0x01,
171511871f53SŁukasz Gieryk } NvmeVirtualResourceType;
171611871f53SŁukasz Gieryk 
1717e181d3daSGollu Appalanaidu typedef struct NvmeDirectiveIdentify {
1718e181d3daSGollu Appalanaidu     uint8_t supported;
1719e181d3daSGollu Appalanaidu     uint8_t unused1[31];
1720e181d3daSGollu Appalanaidu     uint8_t enabled;
1721e181d3daSGollu Appalanaidu     uint8_t unused33[31];
172273064edfSJesper Devantier     uint8_t persistent;
172373064edfSJesper Devantier     uint8_t unused65[31];
172473064edfSJesper Devantier     uint8_t rsvd64[4000];
1725e181d3daSGollu Appalanaidu } NvmeDirectiveIdentify;
1726e181d3daSGollu Appalanaidu 
1727e181d3daSGollu Appalanaidu enum NvmeDirectiveTypes {
1728e181d3daSGollu Appalanaidu     NVME_DIRECTIVE_IDENTIFY       = 0x0,
172973064edfSJesper Devantier     NVME_DIRECTIVE_DATA_PLACEMENT = 0x2,
1730e181d3daSGollu Appalanaidu };
1731e181d3daSGollu Appalanaidu 
1732e181d3daSGollu Appalanaidu enum NvmeDirectiveOperations {
1733e181d3daSGollu Appalanaidu     NVME_DIRECTIVE_RETURN_PARAMS = 0x1,
1734e181d3daSGollu Appalanaidu };
1735e181d3daSGollu Appalanaidu 
173673064edfSJesper Devantier typedef struct QEMU_PACKED NvmeFdpConfsHdr {
173773064edfSJesper Devantier     uint16_t num_confs;
173873064edfSJesper Devantier     uint8_t  version;
173973064edfSJesper Devantier     uint8_t  rsvd3;
174073064edfSJesper Devantier     uint32_t size;
174173064edfSJesper Devantier     uint8_t  rsvd8[8];
174273064edfSJesper Devantier } NvmeFdpConfsHdr;
174373064edfSJesper Devantier 
174473064edfSJesper Devantier REG8(FDPA, 0x0)
174573064edfSJesper Devantier     FIELD(FDPA, RGIF, 0, 4)
174673064edfSJesper Devantier     FIELD(FDPA, VWC, 4, 1)
174773064edfSJesper Devantier     FIELD(FDPA, VALID, 7, 1);
174873064edfSJesper Devantier 
174973064edfSJesper Devantier typedef struct QEMU_PACKED NvmeFdpDescrHdr {
175073064edfSJesper Devantier     uint16_t descr_size;
175173064edfSJesper Devantier     uint8_t  fdpa;
175273064edfSJesper Devantier     uint8_t  vss;
175373064edfSJesper Devantier     uint32_t nrg;
175473064edfSJesper Devantier     uint16_t nruh;
175573064edfSJesper Devantier     uint16_t maxpids;
175673064edfSJesper Devantier     uint32_t nnss;
175773064edfSJesper Devantier     uint64_t runs;
175873064edfSJesper Devantier     uint32_t erutl;
175973064edfSJesper Devantier     uint8_t  rsvd28[36];
176073064edfSJesper Devantier } NvmeFdpDescrHdr;
176173064edfSJesper Devantier 
176273064edfSJesper Devantier enum NvmeRuhType {
176373064edfSJesper Devantier     NVME_RUHT_INITIALLY_ISOLATED = 1,
176473064edfSJesper Devantier     NVME_RUHT_PERSISTENTLY_ISOLATED = 2,
176573064edfSJesper Devantier };
176673064edfSJesper Devantier 
176773064edfSJesper Devantier typedef struct QEMU_PACKED NvmeRuhDescr {
176873064edfSJesper Devantier     uint8_t ruht;
176973064edfSJesper Devantier     uint8_t rsvd1[3];
177073064edfSJesper Devantier } NvmeRuhDescr;
177173064edfSJesper Devantier 
177273064edfSJesper Devantier typedef struct QEMU_PACKED NvmeRuhuLog {
177373064edfSJesper Devantier     uint16_t nruh;
177473064edfSJesper Devantier     uint8_t  rsvd2[6];
177573064edfSJesper Devantier } NvmeRuhuLog;
177673064edfSJesper Devantier 
177773064edfSJesper Devantier enum NvmeRuhAttributes {
177873064edfSJesper Devantier     NVME_RUHA_UNUSED = 0,
177973064edfSJesper Devantier     NVME_RUHA_HOST = 1,
178073064edfSJesper Devantier     NVME_RUHA_CTRL = 2,
178173064edfSJesper Devantier };
178273064edfSJesper Devantier 
178373064edfSJesper Devantier typedef struct QEMU_PACKED NvmeRuhuDescr {
178473064edfSJesper Devantier     uint8_t ruha;
178573064edfSJesper Devantier     uint8_t rsvd1[7];
178673064edfSJesper Devantier } NvmeRuhuDescr;
178773064edfSJesper Devantier 
178873064edfSJesper Devantier typedef struct QEMU_PACKED NvmeFdpStatsLog {
178973064edfSJesper Devantier     uint64_t hbmw[2];
179073064edfSJesper Devantier     uint64_t mbmw[2];
179173064edfSJesper Devantier     uint64_t mbe[2];
179273064edfSJesper Devantier     uint8_t  rsvd48[16];
179373064edfSJesper Devantier } NvmeFdpStatsLog;
179473064edfSJesper Devantier 
179573064edfSJesper Devantier typedef struct QEMU_PACKED NvmeFdpEventsLog {
179673064edfSJesper Devantier     uint32_t num_events;
179773064edfSJesper Devantier     uint8_t  rsvd4[60];
179873064edfSJesper Devantier } NvmeFdpEventsLog;
179973064edfSJesper Devantier 
180073064edfSJesper Devantier enum NvmeFdpEventType {
180173064edfSJesper Devantier     FDP_EVT_RU_NOT_FULLY_WRITTEN = 0x0,
180273064edfSJesper Devantier     FDP_EVT_RU_ATL_EXCEEDED = 0x1,
180373064edfSJesper Devantier     FDP_EVT_CTRL_RESET_RUH = 0x2,
180473064edfSJesper Devantier     FDP_EVT_INVALID_PID = 0x3,
180573064edfSJesper Devantier     FDP_EVT_MEDIA_REALLOC = 0x80,
180673064edfSJesper Devantier     FDP_EVT_RUH_IMPLICIT_RU_CHANGE = 0x81,
180773064edfSJesper Devantier };
180873064edfSJesper Devantier 
180973064edfSJesper Devantier enum NvmeFdpEventFlags {
181073064edfSJesper Devantier     FDPEF_PIV = 1 << 0,
181173064edfSJesper Devantier     FDPEF_NSIDV = 1 << 1,
181273064edfSJesper Devantier     FDPEF_LV = 1 << 2,
181373064edfSJesper Devantier };
181473064edfSJesper Devantier 
181573064edfSJesper Devantier typedef struct QEMU_PACKED NvmeFdpEvent {
181673064edfSJesper Devantier     uint8_t  type;
181773064edfSJesper Devantier     uint8_t  flags;
181873064edfSJesper Devantier     uint16_t pid;
181973064edfSJesper Devantier     uint64_t timestamp;
182073064edfSJesper Devantier     uint32_t nsid;
182173064edfSJesper Devantier     uint64_t type_specific[2];
182273064edfSJesper Devantier     uint16_t rgid;
182373064edfSJesper Devantier     uint8_t  ruhid;
182473064edfSJesper Devantier     uint8_t  rsvd35[5];
182573064edfSJesper Devantier     uint64_t vendor[3];
182673064edfSJesper Devantier } NvmeFdpEvent;
182773064edfSJesper Devantier 
182873064edfSJesper Devantier typedef struct QEMU_PACKED NvmePhidList {
182973064edfSJesper Devantier     uint16_t nnruhd;
183073064edfSJesper Devantier     uint8_t  rsvd2[6];
183173064edfSJesper Devantier } NvmePhidList;
183273064edfSJesper Devantier 
183373064edfSJesper Devantier typedef struct QEMU_PACKED NvmePhidDescr {
183473064edfSJesper Devantier     uint8_t  ruht;
183573064edfSJesper Devantier     uint8_t  rsvd1;
183673064edfSJesper Devantier     uint16_t ruhid;
183773064edfSJesper Devantier } NvmePhidDescr;
183873064edfSJesper Devantier 
183973064edfSJesper Devantier REG32(FEAT_FDP, 0x0)
184073064edfSJesper Devantier     FIELD(FEAT_FDP, FDPE, 0, 1)
184173064edfSJesper Devantier     FIELD(FEAT_FDP, CONF_NDX, 8, 8);
184273064edfSJesper Devantier 
184373064edfSJesper Devantier typedef struct QEMU_PACKED NvmeFdpEventDescr {
184473064edfSJesper Devantier     uint8_t evt;
184573064edfSJesper Devantier     uint8_t evta;
184673064edfSJesper Devantier } NvmeFdpEventDescr;
184773064edfSJesper Devantier 
184873064edfSJesper Devantier REG32(NVME_IOMR, 0x0)
184973064edfSJesper Devantier     FIELD(NVME_IOMR, MO, 0, 8)
185073064edfSJesper Devantier     FIELD(NVME_IOMR, MOS, 16, 16);
185173064edfSJesper Devantier 
185273064edfSJesper Devantier enum NvmeIomr2Mo {
185373064edfSJesper Devantier     NVME_IOMR_MO_NOP = 0x0,
185473064edfSJesper Devantier     NVME_IOMR_MO_RUH_STATUS = 0x1,
185573064edfSJesper Devantier     NVME_IOMR_MO_VENDOR_SPECIFIC = 0x255,
185673064edfSJesper Devantier };
185773064edfSJesper Devantier 
185873064edfSJesper Devantier typedef struct QEMU_PACKED NvmeRuhStatus {
185973064edfSJesper Devantier     uint8_t  rsvd0[14];
186073064edfSJesper Devantier     uint16_t nruhsd;
186173064edfSJesper Devantier } NvmeRuhStatus;
186273064edfSJesper Devantier 
186373064edfSJesper Devantier typedef struct QEMU_PACKED NvmeRuhStatusDescr {
186473064edfSJesper Devantier     uint16_t pid;
186573064edfSJesper Devantier     uint16_t ruhid;
186673064edfSJesper Devantier     uint32_t earutr;
186773064edfSJesper Devantier     uint64_t ruamw;
186873064edfSJesper Devantier     uint8_t  rsvd16[16];
186973064edfSJesper Devantier } NvmeRuhStatusDescr;
187073064edfSJesper Devantier 
187173064edfSJesper Devantier REG32(NVME_IOMS, 0x0)
187273064edfSJesper Devantier     FIELD(NVME_IOMS, MO, 0, 8)
187373064edfSJesper Devantier     FIELD(NVME_IOMS, MOS, 16, 16);
187473064edfSJesper Devantier 
187573064edfSJesper Devantier enum NvmeIoms2Mo {
187673064edfSJesper Devantier     NVME_IOMS_MO_NOP = 0x0,
187773064edfSJesper Devantier     NVME_IOMS_MO_RUH_UPDATE = 0x1,
187873064edfSJesper Devantier };
187973064edfSJesper Devantier 
_nvme_check_size(void)1880a3d9a352SFam Zheng static inline void _nvme_check_size(void)
1881a3d9a352SFam Zheng {
188274e18435SPhilippe Mathieu-Daudé     QEMU_BUILD_BUG_ON(sizeof(NvmeBar) != 4096);
1883a3d9a352SFam Zheng     QEMU_BUILD_BUG_ON(sizeof(NvmeAerResult) != 4);
1884e9ba46eeSDmitry Fomichev     QEMU_BUILD_BUG_ON(sizeof(NvmeZonedResult) != 8);
1885a3d9a352SFam Zheng     QEMU_BUILD_BUG_ON(sizeof(NvmeCqe) != 16);
1886a3d9a352SFam Zheng     QEMU_BUILD_BUG_ON(sizeof(NvmeDsmRange) != 16);
1887d522aef8SArun Kumar     QEMU_BUILD_BUG_ON(sizeof(NvmeCopySourceRangeFormat0_2) != 32);
1888d522aef8SArun Kumar     QEMU_BUILD_BUG_ON(sizeof(NvmeCopySourceRangeFormat1_3) != 40);
1889a3d9a352SFam Zheng     QEMU_BUILD_BUG_ON(sizeof(NvmeCmd) != 64);
1890a3d9a352SFam Zheng     QEMU_BUILD_BUG_ON(sizeof(NvmeDeleteQ) != 64);
1891a3d9a352SFam Zheng     QEMU_BUILD_BUG_ON(sizeof(NvmeCreateCq) != 64);
1892a3d9a352SFam Zheng     QEMU_BUILD_BUG_ON(sizeof(NvmeCreateSq) != 64);
1893a3d9a352SFam Zheng     QEMU_BUILD_BUG_ON(sizeof(NvmeIdentify) != 64);
1894a3d9a352SFam Zheng     QEMU_BUILD_BUG_ON(sizeof(NvmeRwCmd) != 64);
1895a3d9a352SFam Zheng     QEMU_BUILD_BUG_ON(sizeof(NvmeDsmCmd) != 64);
18963862efffSKlaus Jensen     QEMU_BUILD_BUG_ON(sizeof(NvmeCopyCmd) != 64);
1897a3d9a352SFam Zheng     QEMU_BUILD_BUG_ON(sizeof(NvmeRangeType) != 64);
1898d0c0697bSNaveen Nagar     QEMU_BUILD_BUG_ON(sizeof(NvmeHostBehaviorSupport) != 512);
1899a3d9a352SFam Zheng     QEMU_BUILD_BUG_ON(sizeof(NvmeErrorLog) != 64);
1900a3d9a352SFam Zheng     QEMU_BUILD_BUG_ON(sizeof(NvmeFwSlotInfoLog) != 512);
1901a3d9a352SFam Zheng     QEMU_BUILD_BUG_ON(sizeof(NvmeSmartLog) != 512);
190262e8faa4SDmitry Fomichev     QEMU_BUILD_BUG_ON(sizeof(NvmeEffectsLog) != 4096);
1903a3d9a352SFam Zheng     QEMU_BUILD_BUG_ON(sizeof(NvmeIdCtrl) != 4096);
1904e9ba46eeSDmitry Fomichev     QEMU_BUILD_BUG_ON(sizeof(NvmeIdCtrlZoned) != 4096);
190567ce28a1SGollu Appalanaidu     QEMU_BUILD_BUG_ON(sizeof(NvmeIdCtrlNvm) != 4096);
1906e9ba46eeSDmitry Fomichev     QEMU_BUILD_BUG_ON(sizeof(NvmeLBAF) != 4);
1907e9ba46eeSDmitry Fomichev     QEMU_BUILD_BUG_ON(sizeof(NvmeLBAFE) != 16);
1908a3d9a352SFam Zheng     QEMU_BUILD_BUG_ON(sizeof(NvmeIdNs) != 4096);
190979e49005SArun Kumar     QEMU_BUILD_BUG_ON(sizeof(NvmeIdNsInd) != 4096);
191044219b60SNaveen Nagar     QEMU_BUILD_BUG_ON(sizeof(NvmeIdNsNvm) != 4096);
1911e9ba46eeSDmitry Fomichev     QEMU_BUILD_BUG_ON(sizeof(NvmeIdNsZoned) != 4096);
1912c26f2173SKlaus Jensen     QEMU_BUILD_BUG_ON(sizeof(NvmeSglDescriptor) != 16);
1913c26f2173SKlaus Jensen     QEMU_BUILD_BUG_ON(sizeof(NvmeIdNsDescr) != 4);
1914e9ba46eeSDmitry Fomichev     QEMU_BUILD_BUG_ON(sizeof(NvmeZoneDescr) != 64);
191544219b60SNaveen Nagar     QEMU_BUILD_BUG_ON(sizeof(NvmeDifTuple) != 16);
19165e6f963fSLukasz Maniak     QEMU_BUILD_BUG_ON(sizeof(NvmePriCtrlCap) != 4096);
191799f48ae7SLukasz Maniak     QEMU_BUILD_BUG_ON(sizeof(NvmeSecCtrlEntry) != 32);
191899f48ae7SLukasz Maniak     QEMU_BUILD_BUG_ON(sizeof(NvmeSecCtrlList) != 4096);
1919771dbc3aSKlaus Jensen     QEMU_BUILD_BUG_ON(sizeof(NvmeEndGrpLog) != 512);
1920e181d3daSGollu Appalanaidu     QEMU_BUILD_BUG_ON(sizeof(NvmeDirectiveIdentify) != 4096);
1921a3d9a352SFam Zheng }
1922a3d9a352SFam Zheng #endif
1923