xref: /openbmc/qemu/include/block/nvme.h (revision 73064edf)
1a3d9a352SFam Zheng #ifndef BLOCK_NVME_H
2a3d9a352SFam Zheng #define BLOCK_NVME_H
3a3d9a352SFam Zheng 
4*73064edfSJesper Devantier #include "hw/registerfields.h"
5*73064edfSJesper 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,
636*73064edfSJesper Devantier     NVME_CMD_IO_MGMT_RECV       = 0x12,
6373862efffSKlaus Jensen     NVME_CMD_COPY               = 0x19,
638*73064edfSJesper 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;
731*73064edfSJesper Devantier     uint8_t     dsmgmt;
732*73064edfSJesper Devantier     uint8_t     rsvd;
733*73064edfSJesper 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,
8023862efffSKlaus Jensen };
8033862efffSKlaus Jensen 
8043862efffSKlaus Jensen typedef struct QEMU_PACKED NvmeCopyCmd {
8053862efffSKlaus Jensen     uint8_t     opcode;
8063862efffSKlaus Jensen     uint8_t     flags;
8073862efffSKlaus Jensen     uint16_t    cid;
8083862efffSKlaus Jensen     uint32_t    nsid;
80944219b60SNaveen Nagar     uint32_t    cdw2;
81044219b60SNaveen Nagar     uint32_t    cdw3;
81144219b60SNaveen Nagar     uint32_t    rsvd2[2];
8123862efffSKlaus Jensen     NvmeCmdDptr dptr;
8133862efffSKlaus Jensen     uint64_t    sdlba;
8143862efffSKlaus Jensen     uint8_t     nr;
8153862efffSKlaus Jensen     uint8_t     control[3];
8163862efffSKlaus Jensen     uint16_t    rsvd13;
8173862efffSKlaus Jensen     uint16_t    dspec;
8183862efffSKlaus Jensen     uint32_t    reftag;
8193862efffSKlaus Jensen     uint16_t    apptag;
8203862efffSKlaus Jensen     uint16_t    appmask;
8213862efffSKlaus Jensen } NvmeCopyCmd;
8223862efffSKlaus Jensen 
82344219b60SNaveen Nagar typedef struct QEMU_PACKED NvmeCopySourceRangeFormat0 {
8243862efffSKlaus Jensen     uint8_t  rsvd0[8];
8253862efffSKlaus Jensen     uint64_t slba;
8263862efffSKlaus Jensen     uint16_t nlb;
8273862efffSKlaus Jensen     uint8_t  rsvd18[6];
8283862efffSKlaus Jensen     uint32_t reftag;
8293862efffSKlaus Jensen     uint16_t apptag;
8303862efffSKlaus Jensen     uint16_t appmask;
83144219b60SNaveen Nagar } NvmeCopySourceRangeFormat0;
83244219b60SNaveen Nagar 
83344219b60SNaveen Nagar typedef struct QEMU_PACKED NvmeCopySourceRangeFormat1 {
83444219b60SNaveen Nagar     uint8_t  rsvd0[8];
83544219b60SNaveen Nagar     uint64_t slba;
83644219b60SNaveen Nagar     uint16_t nlb;
83744219b60SNaveen Nagar     uint8_t  rsvd18[8];
83844219b60SNaveen Nagar     uint8_t  sr[10];
83944219b60SNaveen Nagar     uint16_t apptag;
84044219b60SNaveen Nagar     uint16_t appmask;
84144219b60SNaveen Nagar } NvmeCopySourceRangeFormat1;
8423862efffSKlaus Jensen 
843a3d9a352SFam Zheng enum NvmeAsyncEventRequest {
844a3d9a352SFam Zheng     NVME_AER_TYPE_ERROR                     = 0,
845a3d9a352SFam Zheng     NVME_AER_TYPE_SMART                     = 1,
846f432fdfaSMinwoo Im     NVME_AER_TYPE_NOTICE                    = 2,
847a3d9a352SFam Zheng     NVME_AER_TYPE_IO_SPECIFIC               = 6,
848a3d9a352SFam Zheng     NVME_AER_TYPE_VENDOR_SPECIFIC           = 7,
8495d5a5330SKlaus Jensen     NVME_AER_INFO_ERR_INVALID_DB_REGISTER   = 0,
8505d5a5330SKlaus Jensen     NVME_AER_INFO_ERR_INVALID_DB_VALUE      = 1,
851a3d9a352SFam Zheng     NVME_AER_INFO_ERR_DIAG_FAIL             = 2,
852a3d9a352SFam Zheng     NVME_AER_INFO_ERR_PERS_INTERNAL_ERR     = 3,
853a3d9a352SFam Zheng     NVME_AER_INFO_ERR_TRANS_INTERNAL_ERR    = 4,
854a3d9a352SFam Zheng     NVME_AER_INFO_ERR_FW_IMG_LOAD_ERR       = 5,
855a3d9a352SFam Zheng     NVME_AER_INFO_SMART_RELIABILITY         = 0,
856a3d9a352SFam Zheng     NVME_AER_INFO_SMART_TEMP_THRESH         = 1,
857a3d9a352SFam Zheng     NVME_AER_INFO_SMART_SPARE_THRESH        = 2,
858f432fdfaSMinwoo Im     NVME_AER_INFO_NOTICE_NS_ATTR_CHANGED    = 0,
859a3d9a352SFam Zheng };
860a3d9a352SFam Zheng 
861e989738fSPhilippe Mathieu-Daudé typedef struct QEMU_PACKED NvmeAerResult {
862a3d9a352SFam Zheng     uint8_t event_type;
863a3d9a352SFam Zheng     uint8_t event_info;
864a3d9a352SFam Zheng     uint8_t log_page;
865a3d9a352SFam Zheng     uint8_t resv;
866a3d9a352SFam Zheng } NvmeAerResult;
867a3d9a352SFam Zheng 
868e9ba46eeSDmitry Fomichev typedef struct QEMU_PACKED NvmeZonedResult {
869e9ba46eeSDmitry Fomichev     uint64_t slba;
870e9ba46eeSDmitry Fomichev } NvmeZonedResult;
871e9ba46eeSDmitry Fomichev 
872e989738fSPhilippe Mathieu-Daudé typedef struct QEMU_PACKED NvmeCqe {
873a3d9a352SFam Zheng     uint32_t    result;
874e9ba46eeSDmitry Fomichev     uint32_t    dw1;
875a3d9a352SFam Zheng     uint16_t    sq_head;
876a3d9a352SFam Zheng     uint16_t    sq_id;
877a3d9a352SFam Zheng     uint16_t    cid;
878a3d9a352SFam Zheng     uint16_t    status;
879a3d9a352SFam Zheng } NvmeCqe;
880a3d9a352SFam Zheng 
881a3d9a352SFam Zheng enum NvmeStatusCodes {
882a3d9a352SFam Zheng     NVME_SUCCESS                = 0x0000,
883a3d9a352SFam Zheng     NVME_INVALID_OPCODE         = 0x0001,
884a3d9a352SFam Zheng     NVME_INVALID_FIELD          = 0x0002,
885a3d9a352SFam Zheng     NVME_CID_CONFLICT           = 0x0003,
886a3d9a352SFam Zheng     NVME_DATA_TRAS_ERROR        = 0x0004,
887a3d9a352SFam Zheng     NVME_POWER_LOSS_ABORT       = 0x0005,
888a3d9a352SFam Zheng     NVME_INTERNAL_DEV_ERROR     = 0x0006,
889a3d9a352SFam Zheng     NVME_CMD_ABORT_REQ          = 0x0007,
890a3d9a352SFam Zheng     NVME_CMD_ABORT_SQ_DEL       = 0x0008,
891a3d9a352SFam Zheng     NVME_CMD_ABORT_FAILED_FUSE  = 0x0009,
892a3d9a352SFam Zheng     NVME_CMD_ABORT_MISSING_FUSE = 0x000a,
893a3d9a352SFam Zheng     NVME_INVALID_NSID           = 0x000b,
894a3d9a352SFam Zheng     NVME_CMD_SEQ_ERROR          = 0x000c,
895c26f2173SKlaus Jensen     NVME_INVALID_SGL_SEG_DESCR  = 0x000d,
896c26f2173SKlaus Jensen     NVME_INVALID_NUM_SGL_DESCRS = 0x000e,
897c26f2173SKlaus Jensen     NVME_DATA_SGL_LEN_INVALID   = 0x000f,
898c26f2173SKlaus Jensen     NVME_MD_SGL_LEN_INVALID     = 0x0010,
899c26f2173SKlaus Jensen     NVME_SGL_DESCR_TYPE_INVALID = 0x0011,
900c26f2173SKlaus Jensen     NVME_INVALID_USE_OF_CMB     = 0x0012,
90128fee5b5SGollu Appalanaidu     NVME_INVALID_PRP_OFFSET     = 0x0013,
902141354d5SNiklas Cassel     NVME_CMD_SET_CMB_REJECTED   = 0x002b,
903e9ba46eeSDmitry Fomichev     NVME_INVALID_CMD_SET        = 0x002c,
904*73064edfSJesper Devantier     NVME_FDP_DISABLED           = 0x0029,
905*73064edfSJesper Devantier     NVME_INVALID_PHID_LIST      = 0x002a,
906a3d9a352SFam Zheng     NVME_LBA_RANGE              = 0x0080,
907a3d9a352SFam Zheng     NVME_CAP_EXCEEDED           = 0x0081,
908a3d9a352SFam Zheng     NVME_NS_NOT_READY           = 0x0082,
909a3d9a352SFam Zheng     NVME_NS_RESV_CONFLICT       = 0x0083,
910dc04d25eSMinwoo Im     NVME_FORMAT_IN_PROGRESS     = 0x0084,
911a3d9a352SFam Zheng     NVME_INVALID_CQID           = 0x0100,
912a3d9a352SFam Zheng     NVME_INVALID_QID            = 0x0101,
913a3d9a352SFam Zheng     NVME_MAX_QSIZE_EXCEEDED     = 0x0102,
914a3d9a352SFam Zheng     NVME_ACL_EXCEEDED           = 0x0103,
915a3d9a352SFam Zheng     NVME_RESERVED               = 0x0104,
916a3d9a352SFam Zheng     NVME_AER_LIMIT_EXCEEDED     = 0x0105,
917a3d9a352SFam Zheng     NVME_INVALID_FW_SLOT        = 0x0106,
918a3d9a352SFam Zheng     NVME_INVALID_FW_IMAGE       = 0x0107,
919a3d9a352SFam Zheng     NVME_INVALID_IRQ_VECTOR     = 0x0108,
920a3d9a352SFam Zheng     NVME_INVALID_LOG_ID         = 0x0109,
921a3d9a352SFam Zheng     NVME_INVALID_FORMAT         = 0x010a,
922a3d9a352SFam Zheng     NVME_FW_REQ_RESET           = 0x010b,
923a3d9a352SFam Zheng     NVME_INVALID_QUEUE_DEL      = 0x010c,
924a3d9a352SFam Zheng     NVME_FID_NOT_SAVEABLE       = 0x010d,
9251302e48eSKlaus Jensen     NVME_FEAT_NOT_CHANGEABLE    = 0x010e,
9267c46310dSKlaus Jensen     NVME_FEAT_NOT_NS_SPEC       = 0x010f,
927a3d9a352SFam Zheng     NVME_FW_REQ_SUSYSTEM_RESET  = 0x0110,
928645ce1a7SMinwoo Im     NVME_NS_ALREADY_ATTACHED    = 0x0118,
929e5489356SKlaus Jensen     NVME_NS_PRIVATE             = 0x0119,
930312c3531SGollu Appalanaidu     NVME_NS_NOT_ATTACHED        = 0x011a,
931312c3531SGollu Appalanaidu     NVME_NS_CTRL_LIST_INVALID   = 0x011c,
93211871f53SŁukasz Gieryk     NVME_INVALID_CTRL_ID        = 0x011f,
93311871f53SŁukasz Gieryk     NVME_INVALID_SEC_CTRL_STATE = 0x0120,
93411871f53SŁukasz Gieryk     NVME_INVALID_NUM_RESOURCES  = 0x0121,
93511871f53SŁukasz Gieryk     NVME_INVALID_RESOURCE_ID    = 0x0122,
936a3d9a352SFam Zheng     NVME_CONFLICTING_ATTRS      = 0x0180,
937a3d9a352SFam Zheng     NVME_INVALID_PROT_INFO      = 0x0181,
938a3d9a352SFam Zheng     NVME_WRITE_TO_RO            = 0x0182,
9393862efffSKlaus Jensen     NVME_CMD_SIZE_LIMIT         = 0x0183,
940e321b4cdSKlaus Jensen     NVME_INVALID_ZONE_OP        = 0x01b6,
941e321b4cdSKlaus Jensen     NVME_NOZRWA                 = 0x01b7,
942e9ba46eeSDmitry Fomichev     NVME_ZONE_BOUNDARY_ERROR    = 0x01b8,
943e9ba46eeSDmitry Fomichev     NVME_ZONE_FULL              = 0x01b9,
944e9ba46eeSDmitry Fomichev     NVME_ZONE_READ_ONLY         = 0x01ba,
945e9ba46eeSDmitry Fomichev     NVME_ZONE_OFFLINE           = 0x01bb,
946e9ba46eeSDmitry Fomichev     NVME_ZONE_INVALID_WRITE     = 0x01bc,
947e9ba46eeSDmitry Fomichev     NVME_ZONE_TOO_MANY_ACTIVE   = 0x01bd,
948e9ba46eeSDmitry Fomichev     NVME_ZONE_TOO_MANY_OPEN     = 0x01be,
949e9ba46eeSDmitry Fomichev     NVME_ZONE_INVAL_TRANSITION  = 0x01bf,
950a3d9a352SFam Zheng     NVME_WRITE_FAULT            = 0x0280,
951a3d9a352SFam Zheng     NVME_UNRECOVERED_READ       = 0x0281,
952a3d9a352SFam Zheng     NVME_E2E_GUARD_ERROR        = 0x0282,
953a3d9a352SFam Zheng     NVME_E2E_APP_ERROR          = 0x0283,
954a3d9a352SFam Zheng     NVME_E2E_REF_ERROR          = 0x0284,
955a3d9a352SFam Zheng     NVME_CMP_FAILURE            = 0x0285,
956a3d9a352SFam Zheng     NVME_ACCESS_DENIED          = 0x0286,
95754064e51SKlaus Jensen     NVME_DULB                   = 0x0287,
95844219b60SNaveen Nagar     NVME_E2E_STORAGE_TAG_ERROR  = 0x0288,
959a3d9a352SFam Zheng     NVME_MORE                   = 0x2000,
960a3d9a352SFam Zheng     NVME_DNR                    = 0x4000,
961a3d9a352SFam Zheng     NVME_NO_COMPLETE            = 0xffff,
962a3d9a352SFam Zheng };
963a3d9a352SFam Zheng 
964e989738fSPhilippe Mathieu-Daudé typedef struct QEMU_PACKED NvmeFwSlotInfoLog {
965a3d9a352SFam Zheng     uint8_t     afi;
966a3d9a352SFam Zheng     uint8_t     reserved1[7];
967a3d9a352SFam Zheng     uint8_t     frs1[8];
968a3d9a352SFam Zheng     uint8_t     frs2[8];
969a3d9a352SFam Zheng     uint8_t     frs3[8];
970a3d9a352SFam Zheng     uint8_t     frs4[8];
971a3d9a352SFam Zheng     uint8_t     frs5[8];
972a3d9a352SFam Zheng     uint8_t     frs6[8];
973a3d9a352SFam Zheng     uint8_t     frs7[8];
974a3d9a352SFam Zheng     uint8_t     reserved2[448];
975a3d9a352SFam Zheng } NvmeFwSlotInfoLog;
976a3d9a352SFam Zheng 
977e989738fSPhilippe Mathieu-Daudé typedef struct QEMU_PACKED NvmeErrorLog {
978a3d9a352SFam Zheng     uint64_t    error_count;
979a3d9a352SFam Zheng     uint16_t    sqid;
980a3d9a352SFam Zheng     uint16_t    cid;
981a3d9a352SFam Zheng     uint16_t    status_field;
982a3d9a352SFam Zheng     uint16_t    param_error_location;
983a3d9a352SFam Zheng     uint64_t    lba;
984a3d9a352SFam Zheng     uint32_t    nsid;
985a3d9a352SFam Zheng     uint8_t     vs;
986a3d9a352SFam Zheng     uint8_t     resv[35];
987a3d9a352SFam Zheng } NvmeErrorLog;
988a3d9a352SFam Zheng 
989e989738fSPhilippe Mathieu-Daudé typedef struct QEMU_PACKED NvmeSmartLog {
990a3d9a352SFam Zheng     uint8_t     critical_warning;
99194a7897cSKlaus Jensen     uint16_t    temperature;
992a3d9a352SFam Zheng     uint8_t     available_spare;
993a3d9a352SFam Zheng     uint8_t     available_spare_threshold;
994a3d9a352SFam Zheng     uint8_t     percentage_used;
995a3d9a352SFam Zheng     uint8_t     reserved1[26];
996a3d9a352SFam Zheng     uint64_t    data_units_read[2];
997a3d9a352SFam Zheng     uint64_t    data_units_written[2];
998a3d9a352SFam Zheng     uint64_t    host_read_commands[2];
999a3d9a352SFam Zheng     uint64_t    host_write_commands[2];
1000a3d9a352SFam Zheng     uint64_t    controller_busy_time[2];
1001a3d9a352SFam Zheng     uint64_t    power_cycles[2];
1002a3d9a352SFam Zheng     uint64_t    power_on_hours[2];
1003a3d9a352SFam Zheng     uint64_t    unsafe_shutdowns[2];
1004a3d9a352SFam Zheng     uint64_t    media_errors[2];
1005a3d9a352SFam Zheng     uint64_t    number_of_error_log_entries[2];
1006a3d9a352SFam Zheng     uint8_t     reserved2[320];
1007a3d9a352SFam Zheng } NvmeSmartLog;
1008a3d9a352SFam Zheng 
1009c62720f1Szhenwei pi #define NVME_SMART_WARN_MAX     6
1010a3d9a352SFam Zheng enum NvmeSmartWarn {
1011a3d9a352SFam Zheng     NVME_SMART_SPARE                  = 1 << 0,
1012a3d9a352SFam Zheng     NVME_SMART_TEMPERATURE            = 1 << 1,
1013a3d9a352SFam Zheng     NVME_SMART_RELIABILITY            = 1 << 2,
1014a3d9a352SFam Zheng     NVME_SMART_MEDIA_READ_ONLY        = 1 << 3,
1015a3d9a352SFam Zheng     NVME_SMART_FAILED_VOLATILE_MEDIA  = 1 << 4,
1016c6d1b5c1Szhenwei pi     NVME_SMART_PMR_UNRELIABLE         = 1 << 5,
1017a3d9a352SFam Zheng };
1018a3d9a352SFam Zheng 
101962e8faa4SDmitry Fomichev typedef struct NvmeEffectsLog {
102062e8faa4SDmitry Fomichev     uint32_t    acs[256];
102162e8faa4SDmitry Fomichev     uint32_t    iocs[256];
102262e8faa4SDmitry Fomichev     uint8_t     resv[2048];
102362e8faa4SDmitry Fomichev } NvmeEffectsLog;
102462e8faa4SDmitry Fomichev 
102562e8faa4SDmitry Fomichev enum {
102662e8faa4SDmitry Fomichev     NVME_CMD_EFF_CSUPP      = 1 << 0,
102762e8faa4SDmitry Fomichev     NVME_CMD_EFF_LBCC       = 1 << 1,
102862e8faa4SDmitry Fomichev     NVME_CMD_EFF_NCC        = 1 << 2,
102962e8faa4SDmitry Fomichev     NVME_CMD_EFF_NIC        = 1 << 3,
103062e8faa4SDmitry Fomichev     NVME_CMD_EFF_CCC        = 1 << 4,
103162e8faa4SDmitry Fomichev     NVME_CMD_EFF_CSE_MASK   = 3 << 16,
103262e8faa4SDmitry Fomichev     NVME_CMD_EFF_UUID_SEL   = 1 << 19,
103362e8faa4SDmitry Fomichev };
103462e8faa4SDmitry Fomichev 
1035c26f2173SKlaus Jensen enum NvmeLogIdentifier {
1036a3d9a352SFam Zheng     NVME_LOG_ERROR_INFO                 = 0x01,
1037a3d9a352SFam Zheng     NVME_LOG_SMART_INFO                 = 0x02,
1038a3d9a352SFam Zheng     NVME_LOG_FW_SLOT_INFO               = 0x03,
1039f432fdfaSMinwoo Im     NVME_LOG_CHANGED_NSLIST             = 0x04,
104062e8faa4SDmitry Fomichev     NVME_LOG_CMD_EFFECTS                = 0x05,
1041771dbc3aSKlaus Jensen     NVME_LOG_ENDGRP                     = 0x09,
1042*73064edfSJesper Devantier     NVME_LOG_FDP_CONFS                  = 0x20,
1043*73064edfSJesper Devantier     NVME_LOG_FDP_RUH_USAGE              = 0x21,
1044*73064edfSJesper Devantier     NVME_LOG_FDP_STATS                  = 0x22,
1045*73064edfSJesper Devantier     NVME_LOG_FDP_EVENTS                 = 0x23,
1046a3d9a352SFam Zheng };
1047a3d9a352SFam Zheng 
1048e989738fSPhilippe Mathieu-Daudé typedef struct QEMU_PACKED NvmePSD {
1049a3d9a352SFam Zheng     uint16_t    mp;
1050a3d9a352SFam Zheng     uint16_t    reserved;
1051a3d9a352SFam Zheng     uint32_t    enlat;
1052a3d9a352SFam Zheng     uint32_t    exlat;
1053a3d9a352SFam Zheng     uint8_t     rrt;
1054a3d9a352SFam Zheng     uint8_t     rrl;
1055a3d9a352SFam Zheng     uint8_t     rwt;
1056a3d9a352SFam Zheng     uint8_t     rwl;
1057a3d9a352SFam Zheng     uint8_t     resv[16];
1058a3d9a352SFam Zheng } NvmePSD;
1059a3d9a352SFam Zheng 
1060645ce1a7SMinwoo Im #define NVME_CONTROLLER_LIST_SIZE 2048
10613e829fd4SKlaus Jensen #define NVME_IDENTIFY_DATA_SIZE 4096
10623e829fd4SKlaus Jensen 
1063141354d5SNiklas Cassel enum NvmeIdCns {
1064141354d5SNiklas Cassel     NVME_ID_CNS_NS                    = 0x00,
1065141354d5SNiklas Cassel     NVME_ID_CNS_CTRL                  = 0x01,
1066141354d5SNiklas Cassel     NVME_ID_CNS_NS_ACTIVE_LIST        = 0x02,
1067141354d5SNiklas Cassel     NVME_ID_CNS_NS_DESCR_LIST         = 0x03,
1068141354d5SNiklas Cassel     NVME_ID_CNS_CS_NS                 = 0x05,
1069141354d5SNiklas Cassel     NVME_ID_CNS_CS_CTRL               = 0x06,
1070141354d5SNiklas Cassel     NVME_ID_CNS_CS_NS_ACTIVE_LIST     = 0x07,
1071922e6f4eSNiklas Cassel     NVME_ID_CNS_NS_PRESENT_LIST       = 0x10,
1072922e6f4eSNiklas Cassel     NVME_ID_CNS_NS_PRESENT            = 0x11,
107323fb7dfeSMinwoo Im     NVME_ID_CNS_NS_ATTACHED_CTRL_LIST = 0x12,
10745f4eb94dSGollu Appalanaidu     NVME_ID_CNS_CTRL_LIST             = 0x13,
10755e6f963fSLukasz Maniak     NVME_ID_CNS_PRIMARY_CTRL_CAP      = 0x14,
107699f48ae7SLukasz Maniak     NVME_ID_CNS_SECONDARY_CTRL_LIST   = 0x15,
1077922e6f4eSNiklas Cassel     NVME_ID_CNS_CS_NS_PRESENT_LIST    = 0x1a,
1078922e6f4eSNiklas Cassel     NVME_ID_CNS_CS_NS_PRESENT         = 0x1b,
1079141354d5SNiklas Cassel     NVME_ID_CNS_IO_COMMAND_SET        = 0x1c,
10803e829fd4SKlaus Jensen };
10813e829fd4SKlaus Jensen 
1082e989738fSPhilippe Mathieu-Daudé typedef struct QEMU_PACKED NvmeIdCtrl {
1083a3d9a352SFam Zheng     uint16_t    vid;
1084a3d9a352SFam Zheng     uint16_t    ssvid;
1085a3d9a352SFam Zheng     uint8_t     sn[20];
1086a3d9a352SFam Zheng     uint8_t     mn[40];
1087a3d9a352SFam Zheng     uint8_t     fr[8];
1088a3d9a352SFam Zheng     uint8_t     rab;
1089a3d9a352SFam Zheng     uint8_t     ieee[3];
1090a3d9a352SFam Zheng     uint8_t     cmic;
1091a3d9a352SFam Zheng     uint8_t     mdts;
1092c26f2173SKlaus Jensen     uint16_t    cntlid;
1093c26f2173SKlaus Jensen     uint32_t    ver;
1094c26f2173SKlaus Jensen     uint32_t    rtd3r;
1095c26f2173SKlaus Jensen     uint32_t    rtd3e;
1096c26f2173SKlaus Jensen     uint32_t    oaes;
1097c26f2173SKlaus Jensen     uint32_t    ctratt;
1098c2a3640dSKlaus Jensen     uint8_t     rsvd100[11];
1099c2a3640dSKlaus Jensen     uint8_t     cntrltype;
1100c26f2173SKlaus Jensen     uint8_t     fguid[16];
1101c26f2173SKlaus Jensen     uint8_t     rsvd128[128];
1102a3d9a352SFam Zheng     uint16_t    oacs;
1103a3d9a352SFam Zheng     uint8_t     acl;
1104a3d9a352SFam Zheng     uint8_t     aerl;
1105a3d9a352SFam Zheng     uint8_t     frmw;
1106a3d9a352SFam Zheng     uint8_t     lpa;
1107a3d9a352SFam Zheng     uint8_t     elpe;
1108a3d9a352SFam Zheng     uint8_t     npss;
1109c26f2173SKlaus Jensen     uint8_t     avscc;
1110c26f2173SKlaus Jensen     uint8_t     apsta;
1111c26f2173SKlaus Jensen     uint16_t    wctemp;
1112c26f2173SKlaus Jensen     uint16_t    cctemp;
1113c26f2173SKlaus Jensen     uint16_t    mtfa;
1114c26f2173SKlaus Jensen     uint32_t    hmpre;
1115c26f2173SKlaus Jensen     uint32_t    hmmin;
1116c26f2173SKlaus Jensen     uint8_t     tnvmcap[16];
1117c26f2173SKlaus Jensen     uint8_t     unvmcap[16];
1118c26f2173SKlaus Jensen     uint32_t    rpmbs;
1119c26f2173SKlaus Jensen     uint16_t    edstt;
1120c26f2173SKlaus Jensen     uint8_t     dsto;
1121c26f2173SKlaus Jensen     uint8_t     fwug;
1122c26f2173SKlaus Jensen     uint16_t    kas;
1123c26f2173SKlaus Jensen     uint16_t    hctma;
1124c26f2173SKlaus Jensen     uint16_t    mntmt;
1125c26f2173SKlaus Jensen     uint16_t    mxtmt;
1126c26f2173SKlaus Jensen     uint32_t    sanicap;
1127771dbc3aSKlaus Jensen     uint8_t     rsvd332[6];
1128771dbc3aSKlaus Jensen     uint16_t    nsetidmax;
1129771dbc3aSKlaus Jensen     uint16_t    endgidmax;
1130771dbc3aSKlaus Jensen     uint8_t     rsvd342[170];
1131a3d9a352SFam Zheng     uint8_t     sqes;
1132a3d9a352SFam Zheng     uint8_t     cqes;
1133c26f2173SKlaus Jensen     uint16_t    maxcmd;
1134a3d9a352SFam Zheng     uint32_t    nn;
1135a3d9a352SFam Zheng     uint16_t    oncs;
1136a3d9a352SFam Zheng     uint16_t    fuses;
1137a3d9a352SFam Zheng     uint8_t     fna;
1138a3d9a352SFam Zheng     uint8_t     vwc;
1139a3d9a352SFam Zheng     uint16_t    awun;
1140a3d9a352SFam Zheng     uint16_t    awupf;
1141c26f2173SKlaus Jensen     uint8_t     nvscc;
1142c26f2173SKlaus Jensen     uint8_t     rsvd531;
1143c26f2173SKlaus Jensen     uint16_t    acwu;
11443862efffSKlaus Jensen     uint16_t    ocfs;
1145c26f2173SKlaus Jensen     uint32_t    sgls;
1146c26f2173SKlaus Jensen     uint8_t     rsvd540[228];
1147c26f2173SKlaus Jensen     uint8_t     subnqn[256];
1148c26f2173SKlaus Jensen     uint8_t     rsvd1024[1024];
1149a3d9a352SFam Zheng     NvmePSD     psd[32];
1150a3d9a352SFam Zheng     uint8_t     vs[1024];
1151a3d9a352SFam Zheng } NvmeIdCtrl;
1152a3d9a352SFam Zheng 
1153e9ba46eeSDmitry Fomichev typedef struct NvmeIdCtrlZoned {
1154e9ba46eeSDmitry Fomichev     uint8_t     zasl;
1155e9ba46eeSDmitry Fomichev     uint8_t     rsvd1[4095];
1156e9ba46eeSDmitry Fomichev } NvmeIdCtrlZoned;
1157e9ba46eeSDmitry Fomichev 
115867ce28a1SGollu Appalanaidu typedef struct NvmeIdCtrlNvm {
115967ce28a1SGollu Appalanaidu     uint8_t     vsl;
116067ce28a1SGollu Appalanaidu     uint8_t     wzsl;
116167ce28a1SGollu Appalanaidu     uint8_t     wusl;
116267ce28a1SGollu Appalanaidu     uint8_t     dmrl;
116367ce28a1SGollu Appalanaidu     uint32_t    dmrsl;
116467ce28a1SGollu Appalanaidu     uint64_t    dmsl;
116567ce28a1SGollu Appalanaidu     uint8_t     rsvd16[4080];
116667ce28a1SGollu Appalanaidu } NvmeIdCtrlNvm;
116767ce28a1SGollu Appalanaidu 
1168f432fdfaSMinwoo Im enum NvmeIdCtrlOaes {
1169f432fdfaSMinwoo Im     NVME_OAES_NS_ATTR   = 1 << 8,
1170f432fdfaSMinwoo Im };
1171f432fdfaSMinwoo Im 
1172763c05dfSNaveen Nagar enum NvmeIdCtrlCtratt {
1173771dbc3aSKlaus Jensen     NVME_CTRATT_ENDGRPS = 1 <<  4,
1174763c05dfSNaveen Nagar     NVME_CTRATT_ELBAS   = 1 << 15,
1175*73064edfSJesper Devantier     NVME_CTRATT_FDPS    = 1 << 19,
1176763c05dfSNaveen Nagar };
1177763c05dfSNaveen Nagar 
1178a3d9a352SFam Zheng enum NvmeIdCtrlOacs {
1179a3d9a352SFam Zheng     NVME_OACS_SECURITY      = 1 << 0,
1180a3d9a352SFam Zheng     NVME_OACS_FORMAT        = 1 << 1,
1181a3d9a352SFam Zheng     NVME_OACS_FW            = 1 << 2,
1182645ce1a7SMinwoo Im     NVME_OACS_NS_MGMT       = 1 << 3,
1183e181d3daSGollu Appalanaidu     NVME_OACS_DIRECTIVES    = 1 << 5,
11843f7fe8deSJinhao Fan     NVME_OACS_DBBUF         = 1 << 8,
1185a3d9a352SFam Zheng };
1186a3d9a352SFam Zheng 
1187a3d9a352SFam Zheng enum NvmeIdCtrlOncs {
1188a3d9a352SFam Zheng     NVME_ONCS_COMPARE       = 1 << 0,
1189a3d9a352SFam Zheng     NVME_ONCS_WRITE_UNCORR  = 1 << 1,
1190a3d9a352SFam Zheng     NVME_ONCS_DSM           = 1 << 2,
119169265150SKlaus Jensen     NVME_ONCS_WRITE_ZEROES  = 1 << 3,
1192a3d9a352SFam Zheng     NVME_ONCS_FEATURES      = 1 << 4,
1193a3d9a352SFam Zheng     NVME_ONCS_RESRVATIONS   = 1 << 5,
11943036a626SKenneth Heitke     NVME_ONCS_TIMESTAMP     = 1 << 6,
11953e1da158SGollu Appalanaidu     NVME_ONCS_VERIFY        = 1 << 7,
11963862efffSKlaus Jensen     NVME_ONCS_COPY          = 1 << 8,
11973862efffSKlaus Jensen };
11983862efffSKlaus Jensen 
11993862efffSKlaus Jensen enum NvmeIdCtrlOcfs {
120044219b60SNaveen Nagar     NVME_OCFS_COPY_FORMAT_0 = 1 << NVME_COPY_FORMAT_0,
120144219b60SNaveen Nagar     NVME_OCFS_COPY_FORMAT_1 = 1 << NVME_COPY_FORMAT_1,
1202a3d9a352SFam Zheng };
1203a3d9a352SFam Zheng 
1204c9497328SGollu Appalanaidu enum NvmeIdctrlVwc {
1205c9497328SGollu Appalanaidu     NVME_VWC_PRESENT                    = 1 << 0,
1206c9497328SGollu Appalanaidu     NVME_VWC_NSID_BROADCAST_NO_SUPPORT  = 0 << 1,
1207c9497328SGollu Appalanaidu     NVME_VWC_NSID_BROADCAST_RESERVED    = 1 << 1,
1208c9497328SGollu Appalanaidu     NVME_VWC_NSID_BROADCAST_CTRL_SPEC   = 2 << 1,
1209c9497328SGollu Appalanaidu     NVME_VWC_NSID_BROADCAST_SUPPORT     = 3 << 1,
1210c9497328SGollu Appalanaidu };
1211c9497328SGollu Appalanaidu 
121242a42e46SKlaus Jensen enum NvmeIdCtrlFrmw {
121342a42e46SKlaus Jensen     NVME_FRMW_SLOT1_RO = 1 << 0,
121442a42e46SKlaus Jensen };
121542a42e46SKlaus Jensen 
121694a7897cSKlaus Jensen enum NvmeIdCtrlLpa {
12172fbbecc5SKeith Busch     NVME_LPA_NS_SMART = 1 << 0,
121862e8faa4SDmitry Fomichev     NVME_LPA_CSE      = 1 << 1,
121994a7897cSKlaus Jensen     NVME_LPA_EXTENDED = 1 << 2,
122094a7897cSKlaus Jensen };
122194a7897cSKlaus Jensen 
122266b7e9beSMinwoo Im enum NvmeIdCtrlCmic {
122366b7e9beSMinwoo Im     NVME_CMIC_MULTI_CTRL    = 1 << 1,
122466b7e9beSMinwoo Im };
122566b7e9beSMinwoo Im 
122607a3dfa7SNaveen Nagar enum NvmeNsAttachmentOperation {
122707a3dfa7SNaveen Nagar     NVME_NS_ATTACHMENT_ATTACH = 0x0,
122807a3dfa7SNaveen Nagar     NVME_NS_ATTACHMENT_DETACH = 0x1,
122907a3dfa7SNaveen Nagar };
123007a3dfa7SNaveen Nagar 
1231a3d9a352SFam Zheng #define NVME_CTRL_SQES_MIN(sqes) ((sqes) & 0xf)
1232a3d9a352SFam Zheng #define NVME_CTRL_SQES_MAX(sqes) (((sqes) >> 4) & 0xf)
1233a3d9a352SFam Zheng #define NVME_CTRL_CQES_MIN(cqes) ((cqes) & 0xf)
1234a3d9a352SFam Zheng #define NVME_CTRL_CQES_MAX(cqes) (((cqes) >> 4) & 0xf)
1235a3d9a352SFam Zheng 
1236c26f2173SKlaus Jensen #define NVME_CTRL_SGLS_SUPPORT_MASK        (0x3 <<  0)
1237c26f2173SKlaus Jensen #define NVME_CTRL_SGLS_SUPPORT_NO_ALIGN    (0x1 <<  0)
1238c26f2173SKlaus Jensen #define NVME_CTRL_SGLS_SUPPORT_DWORD_ALIGN (0x1 <<  1)
1239c26f2173SKlaus Jensen #define NVME_CTRL_SGLS_KEYED               (0x1 <<  2)
1240c26f2173SKlaus Jensen #define NVME_CTRL_SGLS_BITBUCKET           (0x1 << 16)
1241c26f2173SKlaus Jensen #define NVME_CTRL_SGLS_MPTR_CONTIGUOUS     (0x1 << 17)
1242c26f2173SKlaus Jensen #define NVME_CTRL_SGLS_EXCESS_LENGTH       (0x1 << 18)
1243c26f2173SKlaus Jensen #define NVME_CTRL_SGLS_MPTR_SGL            (0x1 << 19)
1244c26f2173SKlaus Jensen #define NVME_CTRL_SGLS_ADDR_OFFSET         (0x1 << 20)
1245c26f2173SKlaus Jensen 
1246a3d9a352SFam Zheng #define NVME_ARB_AB(arb)    (arb & 0x7)
12471302e48eSKlaus Jensen #define NVME_ARB_AB_NOLIMIT 0x7
1248a3d9a352SFam Zheng #define NVME_ARB_LPW(arb)   ((arb >> 8) & 0xff)
1249a3d9a352SFam Zheng #define NVME_ARB_MPW(arb)   ((arb >> 16) & 0xff)
1250a3d9a352SFam Zheng #define NVME_ARB_HPW(arb)   ((arb >> 24) & 0xff)
1251a3d9a352SFam Zheng 
1252a3d9a352SFam Zheng #define NVME_INTC_THR(intc)     (intc & 0xff)
1253a3d9a352SFam Zheng #define NVME_INTC_TIME(intc)    ((intc >> 8) & 0xff)
1254a3d9a352SFam Zheng 
12551302e48eSKlaus Jensen #define NVME_INTVC_NOCOALESCING (0x1 << 16)
12561302e48eSKlaus Jensen 
1257c26f2173SKlaus Jensen #define NVME_TEMP_THSEL(temp)  ((temp >> 20) & 0x3)
1258c26f2173SKlaus Jensen #define NVME_TEMP_THSEL_OVER   0x0
1259c26f2173SKlaus Jensen #define NVME_TEMP_THSEL_UNDER  0x1
1260c26f2173SKlaus Jensen 
1261c26f2173SKlaus Jensen #define NVME_TEMP_TMPSEL(temp)     ((temp >> 16) & 0xf)
1262c26f2173SKlaus Jensen #define NVME_TEMP_TMPSEL_COMPOSITE 0x0
1263c26f2173SKlaus Jensen 
1264c26f2173SKlaus Jensen #define NVME_TEMP_TMPTH(temp) (temp & 0xffff)
1265c26f2173SKlaus Jensen 
12665d5a5330SKlaus Jensen #define NVME_AEC_SMART(aec)         (aec & 0xff)
12675d5a5330SKlaus Jensen #define NVME_AEC_NS_ATTR(aec)       ((aec >> 8) & 0x1)
12685d5a5330SKlaus Jensen #define NVME_AEC_FW_ACTIVATION(aec) ((aec >> 9) & 0x1)
1269771dbc3aSKlaus Jensen #define NVME_AEC_ENDGRP_NOTICE(aec) ((aec >> 14) & 0x1)
12705d5a5330SKlaus Jensen 
127154064e51SKlaus Jensen #define NVME_ERR_REC_TLER(err_rec)  (err_rec & 0xffff)
127254064e51SKlaus Jensen #define NVME_ERR_REC_DULBE(err_rec) (err_rec & 0x10000)
127354064e51SKlaus Jensen 
1274a3d9a352SFam Zheng enum NvmeFeatureIds {
1275a3d9a352SFam Zheng     NVME_ARBITRATION                = 0x1,
1276a3d9a352SFam Zheng     NVME_POWER_MANAGEMENT           = 0x2,
1277a3d9a352SFam Zheng     NVME_LBA_RANGE_TYPE             = 0x3,
1278a3d9a352SFam Zheng     NVME_TEMPERATURE_THRESHOLD      = 0x4,
1279a3d9a352SFam Zheng     NVME_ERROR_RECOVERY             = 0x5,
1280a3d9a352SFam Zheng     NVME_VOLATILE_WRITE_CACHE       = 0x6,
1281a3d9a352SFam Zheng     NVME_NUMBER_OF_QUEUES           = 0x7,
1282a3d9a352SFam Zheng     NVME_INTERRUPT_COALESCING       = 0x8,
1283a3d9a352SFam Zheng     NVME_INTERRUPT_VECTOR_CONF      = 0x9,
1284a3d9a352SFam Zheng     NVME_WRITE_ATOMICITY            = 0xa,
1285a3d9a352SFam Zheng     NVME_ASYNCHRONOUS_EVENT_CONF    = 0xb,
12863036a626SKenneth Heitke     NVME_TIMESTAMP                  = 0xe,
1287d0c0697bSNaveen Nagar     NVME_HOST_BEHAVIOR_SUPPORT      = 0x16,
1288141354d5SNiklas Cassel     NVME_COMMAND_SET_PROFILE        = 0x19,
1289*73064edfSJesper Devantier     NVME_FDP_MODE                   = 0x1d,
1290*73064edfSJesper Devantier     NVME_FDP_EVENTS                 = 0x1e,
12911302e48eSKlaus Jensen     NVME_SOFTWARE_PROGRESS_MARKER   = 0x80,
12921302e48eSKlaus Jensen     NVME_FID_MAX                    = 0x100,
1293a3d9a352SFam Zheng };
1294a3d9a352SFam Zheng 
12957c46310dSKlaus Jensen typedef enum NvmeFeatureCap {
12967c46310dSKlaus Jensen     NVME_FEAT_CAP_SAVE      = 1 << 0,
12977c46310dSKlaus Jensen     NVME_FEAT_CAP_NS        = 1 << 1,
12987c46310dSKlaus Jensen     NVME_FEAT_CAP_CHANGE    = 1 << 2,
12997c46310dSKlaus Jensen } NvmeFeatureCap;
13007c46310dSKlaus Jensen 
13017c46310dSKlaus Jensen typedef enum NvmeGetFeatureSelect {
13027c46310dSKlaus Jensen     NVME_GETFEAT_SELECT_CURRENT = 0x0,
13037c46310dSKlaus Jensen     NVME_GETFEAT_SELECT_DEFAULT = 0x1,
13047c46310dSKlaus Jensen     NVME_GETFEAT_SELECT_SAVED   = 0x2,
13057c46310dSKlaus Jensen     NVME_GETFEAT_SELECT_CAP     = 0x3,
13067c46310dSKlaus Jensen } NvmeGetFeatureSelect;
13077c46310dSKlaus Jensen 
13081302e48eSKlaus Jensen #define NVME_GETSETFEAT_FID_MASK 0xff
13091302e48eSKlaus Jensen #define NVME_GETSETFEAT_FID(dw10) (dw10 & NVME_GETSETFEAT_FID_MASK)
13101302e48eSKlaus Jensen 
13117c46310dSKlaus Jensen #define NVME_GETFEAT_SELECT_SHIFT 8
13127c46310dSKlaus Jensen #define NVME_GETFEAT_SELECT_MASK  0x7
13137c46310dSKlaus Jensen #define NVME_GETFEAT_SELECT(dw10) \
13147c46310dSKlaus Jensen     ((dw10 >> NVME_GETFEAT_SELECT_SHIFT) & NVME_GETFEAT_SELECT_MASK)
13157c46310dSKlaus Jensen 
13167c46310dSKlaus Jensen #define NVME_SETFEAT_SAVE_SHIFT 31
13177c46310dSKlaus Jensen #define NVME_SETFEAT_SAVE_MASK  0x1
13187c46310dSKlaus Jensen #define NVME_SETFEAT_SAVE(dw10) \
13197c46310dSKlaus Jensen     ((dw10 >> NVME_SETFEAT_SAVE_SHIFT) & NVME_SETFEAT_SAVE_MASK)
13207c46310dSKlaus Jensen 
1321e989738fSPhilippe Mathieu-Daudé typedef struct QEMU_PACKED NvmeRangeType {
1322a3d9a352SFam Zheng     uint8_t     type;
1323a3d9a352SFam Zheng     uint8_t     attributes;
1324a3d9a352SFam Zheng     uint8_t     rsvd2[14];
1325a3d9a352SFam Zheng     uint64_t    slba;
1326a3d9a352SFam Zheng     uint64_t    nlb;
1327a3d9a352SFam Zheng     uint8_t     guid[16];
1328a3d9a352SFam Zheng     uint8_t     rsvd48[16];
1329a3d9a352SFam Zheng } NvmeRangeType;
1330a3d9a352SFam Zheng 
1331d0c0697bSNaveen Nagar typedef struct NvmeHostBehaviorSupport {
1332d0c0697bSNaveen Nagar     uint8_t     acre;
1333d0c0697bSNaveen Nagar     uint8_t     etdas;
1334d0c0697bSNaveen Nagar     uint8_t     lbafee;
1335d0c0697bSNaveen Nagar     uint8_t     rsvd3[509];
1336d0c0697bSNaveen Nagar } NvmeHostBehaviorSupport;
1337d0c0697bSNaveen Nagar 
1338e989738fSPhilippe Mathieu-Daudé typedef struct QEMU_PACKED NvmeLBAF {
1339a3d9a352SFam Zheng     uint16_t    ms;
1340a3d9a352SFam Zheng     uint8_t     ds;
1341a3d9a352SFam Zheng     uint8_t     rp;
1342a3d9a352SFam Zheng } NvmeLBAF;
1343a3d9a352SFam Zheng 
1344e9ba46eeSDmitry Fomichev typedef struct QEMU_PACKED NvmeLBAFE {
1345e9ba46eeSDmitry Fomichev     uint64_t    zsze;
1346e9ba46eeSDmitry Fomichev     uint8_t     zdes;
1347e9ba46eeSDmitry Fomichev     uint8_t     rsvd9[7];
1348e9ba46eeSDmitry Fomichev } NvmeLBAFE;
1349e9ba46eeSDmitry Fomichev 
13507c46310dSKlaus Jensen #define NVME_NSID_BROADCAST 0xffffffff
135144219b60SNaveen Nagar #define NVME_MAX_NLBAF 64
13527c46310dSKlaus Jensen 
1353e989738fSPhilippe Mathieu-Daudé typedef struct QEMU_PACKED NvmeIdNs {
1354a3d9a352SFam Zheng     uint64_t    nsze;
1355a3d9a352SFam Zheng     uint64_t    ncap;
1356a3d9a352SFam Zheng     uint64_t    nuse;
1357a3d9a352SFam Zheng     uint8_t     nsfeat;
1358a3d9a352SFam Zheng     uint8_t     nlbaf;
1359a3d9a352SFam Zheng     uint8_t     flbas;
1360a3d9a352SFam Zheng     uint8_t     mc;
1361a3d9a352SFam Zheng     uint8_t     dpc;
1362a3d9a352SFam Zheng     uint8_t     dps;
1363e0dd95e3SMaxim Levitsky     uint8_t     nmic;
1364e0dd95e3SMaxim Levitsky     uint8_t     rescap;
1365e0dd95e3SMaxim Levitsky     uint8_t     fpi;
1366e0dd95e3SMaxim Levitsky     uint8_t     dlfeat;
1367c26f2173SKlaus Jensen     uint16_t    nawun;
1368c26f2173SKlaus Jensen     uint16_t    nawupf;
1369c26f2173SKlaus Jensen     uint16_t    nacwu;
1370c26f2173SKlaus Jensen     uint16_t    nabsn;
1371c26f2173SKlaus Jensen     uint16_t    nabo;
1372c26f2173SKlaus Jensen     uint16_t    nabspf;
1373c26f2173SKlaus Jensen     uint16_t    noiob;
1374c26f2173SKlaus Jensen     uint8_t     nvmcap[16];
13756fd704a5SKlaus Jensen     uint16_t    npwg;
13766fd704a5SKlaus Jensen     uint16_t    npwa;
13776fd704a5SKlaus Jensen     uint16_t    npdg;
13786fd704a5SKlaus Jensen     uint16_t    npda;
13796fd704a5SKlaus Jensen     uint16_t    nows;
13803862efffSKlaus Jensen     uint16_t    mssrl;
13813862efffSKlaus Jensen     uint32_t    mcl;
13823862efffSKlaus Jensen     uint8_t     msrc;
1383771dbc3aSKlaus Jensen     uint8_t     rsvd81[18];
1384771dbc3aSKlaus Jensen     uint8_t     nsattr;
1385771dbc3aSKlaus Jensen     uint16_t    nvmsetid;
1386771dbc3aSKlaus Jensen     uint16_t    endgid;
1387c26f2173SKlaus Jensen     uint8_t     nguid[16];
1388c26f2173SKlaus Jensen     uint64_t    eui64;
138944219b60SNaveen Nagar     NvmeLBAF    lbaf[NVME_MAX_NLBAF];
1390a3d9a352SFam Zheng     uint8_t     vs[3712];
1391a3d9a352SFam Zheng } NvmeIdNs;
1392a3d9a352SFam Zheng 
139344219b60SNaveen Nagar #define NVME_ID_NS_NVM_ELBAF_PIF(elbaf) (((elbaf) >> 7) & 0x3)
139444219b60SNaveen Nagar 
139544219b60SNaveen Nagar typedef struct QEMU_PACKED NvmeIdNsNvm {
139644219b60SNaveen Nagar     uint64_t    lbstm;
139744219b60SNaveen Nagar     uint8_t     pic;
139844219b60SNaveen Nagar     uint8_t     rsvd9[3];
139944219b60SNaveen Nagar     uint32_t    elbaf[NVME_MAX_NLBAF];
140044219b60SNaveen Nagar     uint8_t     rsvd268[3828];
140144219b60SNaveen Nagar } NvmeIdNsNvm;
140244219b60SNaveen Nagar 
1403c26f2173SKlaus Jensen typedef struct QEMU_PACKED NvmeIdNsDescr {
1404c26f2173SKlaus Jensen     uint8_t nidt;
1405c26f2173SKlaus Jensen     uint8_t nidl;
1406c26f2173SKlaus Jensen     uint8_t rsvd2[2];
1407c26f2173SKlaus Jensen } NvmeIdNsDescr;
1408c26f2173SKlaus Jensen 
1409141354d5SNiklas Cassel enum NvmeNsIdentifierLength {
1410141354d5SNiklas Cassel     NVME_NIDL_EUI64             = 8,
1411141354d5SNiklas Cassel     NVME_NIDL_NGUID             = 16,
1412141354d5SNiklas Cassel     NVME_NIDL_UUID              = 16,
1413141354d5SNiklas Cassel     NVME_NIDL_CSI               = 1,
1414c26f2173SKlaus Jensen };
1415c26f2173SKlaus Jensen 
1416c26f2173SKlaus Jensen enum NvmeNsIdentifierType {
1417141354d5SNiklas Cassel     NVME_NIDT_EUI64             = 0x01,
1418141354d5SNiklas Cassel     NVME_NIDT_NGUID             = 0x02,
1419141354d5SNiklas Cassel     NVME_NIDT_UUID              = 0x03,
1420141354d5SNiklas Cassel     NVME_NIDT_CSI               = 0x04,
1421c26f2173SKlaus Jensen };
1422e0dd95e3SMaxim Levitsky 
1423adc36b8dSMinwoo Im enum NvmeIdNsNmic {
1424adc36b8dSMinwoo Im     NVME_NMIC_NS_SHARED         = 1 << 0,
1425adc36b8dSMinwoo Im };
1426adc36b8dSMinwoo Im 
1427141354d5SNiklas Cassel enum NvmeCsi {
1428141354d5SNiklas Cassel     NVME_CSI_NVM                = 0x00,
1429e9ba46eeSDmitry Fomichev     NVME_CSI_ZONED              = 0x02,
1430141354d5SNiklas Cassel };
1431141354d5SNiklas Cassel 
1432141354d5SNiklas Cassel #define NVME_SET_CSI(vec, csi) (vec |= (uint8_t)(1 << (csi)))
1433141354d5SNiklas Cassel 
1434e9ba46eeSDmitry Fomichev typedef struct QEMU_PACKED NvmeIdNsZoned {
1435e9ba46eeSDmitry Fomichev     uint16_t    zoc;
1436e9ba46eeSDmitry Fomichev     uint16_t    ozcs;
1437e9ba46eeSDmitry Fomichev     uint32_t    mar;
1438e9ba46eeSDmitry Fomichev     uint32_t    mor;
1439e9ba46eeSDmitry Fomichev     uint32_t    rrl;
1440e9ba46eeSDmitry Fomichev     uint32_t    frl;
1441e321b4cdSKlaus Jensen     uint8_t     rsvd12[24];
1442e321b4cdSKlaus Jensen     uint32_t    numzrwa;
1443e321b4cdSKlaus Jensen     uint16_t    zrwafg;
1444e321b4cdSKlaus Jensen     uint16_t    zrwas;
1445e321b4cdSKlaus Jensen     uint8_t     zrwacap;
1446e321b4cdSKlaus Jensen     uint8_t     rsvd53[2763];
1447e9ba46eeSDmitry Fomichev     NvmeLBAFE   lbafe[16];
1448e9ba46eeSDmitry Fomichev     uint8_t     rsvd3072[768];
1449e9ba46eeSDmitry Fomichev     uint8_t     vs[256];
1450e9ba46eeSDmitry Fomichev } NvmeIdNsZoned;
1451e9ba46eeSDmitry Fomichev 
145225872031SKlaus Jensen enum NvmeIdNsZonedOzcs {
145325872031SKlaus Jensen     NVME_ID_NS_ZONED_OZCS_RAZB    = 1 << 0,
1454e321b4cdSKlaus Jensen     NVME_ID_NS_ZONED_OZCS_ZRWASUP = 1 << 1,
1455e321b4cdSKlaus Jensen };
1456e321b4cdSKlaus Jensen 
1457e321b4cdSKlaus Jensen enum NvmeIdNsZonedZrwacap {
1458e321b4cdSKlaus Jensen     NVME_ID_NS_ZONED_ZRWACAP_EXPFLUSHSUP = 1 << 0,
145925872031SKlaus Jensen };
146025872031SKlaus Jensen 
1461e0dd95e3SMaxim Levitsky /*Deallocate Logical Block Features*/
1462e0dd95e3SMaxim Levitsky #define NVME_ID_NS_DLFEAT_GUARD_CRC(dlfeat)       ((dlfeat) & 0x10)
1463e0dd95e3SMaxim Levitsky #define NVME_ID_NS_DLFEAT_WRITE_ZEROES(dlfeat)    ((dlfeat) & 0x08)
1464e0dd95e3SMaxim Levitsky 
1465e0dd95e3SMaxim Levitsky #define NVME_ID_NS_DLFEAT_READ_BEHAVIOR(dlfeat)     ((dlfeat) & 0x7)
1466e0dd95e3SMaxim Levitsky #define NVME_ID_NS_DLFEAT_READ_BEHAVIOR_UNDEFINED   0
1467e0dd95e3SMaxim Levitsky #define NVME_ID_NS_DLFEAT_READ_BEHAVIOR_ZEROES      1
1468e0dd95e3SMaxim Levitsky #define NVME_ID_NS_DLFEAT_READ_BEHAVIOR_ONES        2
1469e0dd95e3SMaxim Levitsky 
1470e0dd95e3SMaxim Levitsky 
1471a3d9a352SFam Zheng #define NVME_ID_NS_NSFEAT_THIN(nsfeat)      ((nsfeat & 0x1))
147254064e51SKlaus Jensen #define NVME_ID_NS_NSFEAT_DULBE(nsfeat)     ((nsfeat >> 2) & 0x1)
1473a3d9a352SFam Zheng #define NVME_ID_NS_FLBAS_EXTENDED(flbas)    ((flbas >> 4) & 0x1)
1474a3d9a352SFam Zheng #define NVME_ID_NS_FLBAS_INDEX(flbas)       ((flbas & 0xf))
1475a3d9a352SFam Zheng #define NVME_ID_NS_MC_SEPARATE(mc)          ((mc >> 1) & 0x1)
1476a3d9a352SFam Zheng #define NVME_ID_NS_MC_EXTENDED(mc)          ((mc & 0x1))
1477a3d9a352SFam Zheng #define NVME_ID_NS_DPC_LAST_EIGHT(dpc)      ((dpc >> 4) & 0x1)
1478a3d9a352SFam Zheng #define NVME_ID_NS_DPC_FIRST_EIGHT(dpc)     ((dpc >> 3) & 0x1)
1479a3d9a352SFam Zheng #define NVME_ID_NS_DPC_TYPE_3(dpc)          ((dpc >> 2) & 0x1)
1480a3d9a352SFam Zheng #define NVME_ID_NS_DPC_TYPE_2(dpc)          ((dpc >> 1) & 0x1)
1481a3d9a352SFam Zheng #define NVME_ID_NS_DPC_TYPE_1(dpc)          ((dpc & 0x1))
1482a3d9a352SFam Zheng #define NVME_ID_NS_DPC_TYPE_MASK            0x7
1483a3d9a352SFam Zheng 
1484a3d9a352SFam Zheng enum NvmeIdNsDps {
1485146f720cSKlaus Jensen     NVME_ID_NS_DPS_TYPE_NONE   = 0,
1486146f720cSKlaus Jensen     NVME_ID_NS_DPS_TYPE_1      = 1,
1487146f720cSKlaus Jensen     NVME_ID_NS_DPS_TYPE_2      = 2,
1488146f720cSKlaus Jensen     NVME_ID_NS_DPS_TYPE_3      = 3,
1489146f720cSKlaus Jensen     NVME_ID_NS_DPS_TYPE_MASK   = 0x7,
1490146f720cSKlaus Jensen     NVME_ID_NS_DPS_FIRST_EIGHT = 8,
1491a3d9a352SFam Zheng };
1492a3d9a352SFam Zheng 
149318de1526SGollu Appalanaidu enum NvmeIdNsFlbas {
149418de1526SGollu Appalanaidu     NVME_ID_NS_FLBAS_EXTENDED = 1 << 4,
149518de1526SGollu Appalanaidu };
149618de1526SGollu Appalanaidu 
149718de1526SGollu Appalanaidu enum NvmeIdNsMc {
149818de1526SGollu Appalanaidu     NVME_ID_NS_MC_EXTENDED = 1 << 0,
149918de1526SGollu Appalanaidu     NVME_ID_NS_MC_SEPARATE = 1 << 1,
150018de1526SGollu Appalanaidu };
150118de1526SGollu Appalanaidu 
1502146f720cSKlaus Jensen #define NVME_ID_NS_DPS_TYPE(dps) (dps & NVME_ID_NS_DPS_TYPE_MASK)
1503146f720cSKlaus Jensen 
150444219b60SNaveen Nagar enum NvmePIFormat {
150544219b60SNaveen Nagar     NVME_PI_GUARD_16                 = 0,
150644219b60SNaveen Nagar     NVME_PI_GUARD_64                 = 2,
150744219b60SNaveen Nagar };
150844219b60SNaveen Nagar 
150944219b60SNaveen Nagar typedef union NvmeDifTuple {
151044219b60SNaveen Nagar     struct {
1511146f720cSKlaus Jensen         uint16_t guard;
1512146f720cSKlaus Jensen         uint16_t apptag;
1513146f720cSKlaus Jensen         uint32_t reftag;
151444219b60SNaveen Nagar     } g16;
151544219b60SNaveen Nagar 
151644219b60SNaveen Nagar     struct {
151744219b60SNaveen Nagar         uint64_t guard;
151844219b60SNaveen Nagar         uint16_t apptag;
151944219b60SNaveen Nagar         uint8_t  sr[6];
152044219b60SNaveen Nagar     } g64;
1521146f720cSKlaus Jensen } NvmeDifTuple;
1522146f720cSKlaus Jensen 
1523e9ba46eeSDmitry Fomichev enum NvmeZoneAttr {
1524e9ba46eeSDmitry Fomichev     NVME_ZA_FINISHED_BY_CTLR         = 1 << 0,
1525e9ba46eeSDmitry Fomichev     NVME_ZA_FINISH_RECOMMENDED       = 1 << 1,
1526e9ba46eeSDmitry Fomichev     NVME_ZA_RESET_RECOMMENDED        = 1 << 2,
1527e321b4cdSKlaus Jensen     NVME_ZA_ZRWA_VALID               = 1 << 3,
1528e9ba46eeSDmitry Fomichev     NVME_ZA_ZD_EXT_VALID             = 1 << 7,
1529e9ba46eeSDmitry Fomichev };
1530e9ba46eeSDmitry Fomichev 
1531e9ba46eeSDmitry Fomichev typedef struct QEMU_PACKED NvmeZoneReportHeader {
1532e9ba46eeSDmitry Fomichev     uint64_t    nr_zones;
1533e9ba46eeSDmitry Fomichev     uint8_t     rsvd[56];
1534e9ba46eeSDmitry Fomichev } NvmeZoneReportHeader;
1535e9ba46eeSDmitry Fomichev 
1536e9ba46eeSDmitry Fomichev enum NvmeZoneReceiveAction {
1537e9ba46eeSDmitry Fomichev     NVME_ZONE_REPORT                 = 0,
1538e9ba46eeSDmitry Fomichev     NVME_ZONE_REPORT_EXTENDED        = 1,
1539e9ba46eeSDmitry Fomichev };
1540e9ba46eeSDmitry Fomichev 
1541e9ba46eeSDmitry Fomichev enum NvmeZoneReportType {
1542e9ba46eeSDmitry Fomichev     NVME_ZONE_REPORT_ALL             = 0,
1543e9ba46eeSDmitry Fomichev     NVME_ZONE_REPORT_EMPTY           = 1,
1544e9ba46eeSDmitry Fomichev     NVME_ZONE_REPORT_IMPLICITLY_OPEN = 2,
1545e9ba46eeSDmitry Fomichev     NVME_ZONE_REPORT_EXPLICITLY_OPEN = 3,
1546e9ba46eeSDmitry Fomichev     NVME_ZONE_REPORT_CLOSED          = 4,
1547e9ba46eeSDmitry Fomichev     NVME_ZONE_REPORT_FULL            = 5,
1548e9ba46eeSDmitry Fomichev     NVME_ZONE_REPORT_READ_ONLY       = 6,
1549e9ba46eeSDmitry Fomichev     NVME_ZONE_REPORT_OFFLINE         = 7,
1550e9ba46eeSDmitry Fomichev };
1551e9ba46eeSDmitry Fomichev 
1552e9ba46eeSDmitry Fomichev enum NvmeZoneType {
1553e9ba46eeSDmitry Fomichev     NVME_ZONE_TYPE_RESERVED          = 0x00,
1554e9ba46eeSDmitry Fomichev     NVME_ZONE_TYPE_SEQ_WRITE         = 0x02,
1555e9ba46eeSDmitry Fomichev };
1556e9ba46eeSDmitry Fomichev 
15576190d92fSKlaus Jensen typedef struct QEMU_PACKED NvmeZoneSendCmd {
15586190d92fSKlaus Jensen     uint8_t     opcode;
15596190d92fSKlaus Jensen     uint8_t     flags;
15606190d92fSKlaus Jensen     uint16_t    cid;
15616190d92fSKlaus Jensen     uint32_t    nsid;
15626190d92fSKlaus Jensen     uint32_t    rsvd8[4];
15636190d92fSKlaus Jensen     NvmeCmdDptr dptr;
15646190d92fSKlaus Jensen     uint64_t    slba;
15656190d92fSKlaus Jensen     uint32_t    rsvd48;
15666190d92fSKlaus Jensen     uint8_t     zsa;
15676190d92fSKlaus Jensen     uint8_t     zsflags;
15686190d92fSKlaus Jensen     uint8_t     rsvd54[2];
15696190d92fSKlaus Jensen     uint32_t    rsvd56[2];
15706190d92fSKlaus Jensen } NvmeZoneSendCmd;
15716190d92fSKlaus Jensen 
1572e9ba46eeSDmitry Fomichev enum NvmeZoneSendAction {
1573e9ba46eeSDmitry Fomichev     NVME_ZONE_ACTION_RSD             = 0x00,
1574e9ba46eeSDmitry Fomichev     NVME_ZONE_ACTION_CLOSE           = 0x01,
1575e9ba46eeSDmitry Fomichev     NVME_ZONE_ACTION_FINISH          = 0x02,
1576e9ba46eeSDmitry Fomichev     NVME_ZONE_ACTION_OPEN            = 0x03,
1577e9ba46eeSDmitry Fomichev     NVME_ZONE_ACTION_RESET           = 0x04,
1578e9ba46eeSDmitry Fomichev     NVME_ZONE_ACTION_OFFLINE         = 0x05,
1579e9ba46eeSDmitry Fomichev     NVME_ZONE_ACTION_SET_ZD_EXT      = 0x10,
1580e321b4cdSKlaus Jensen     NVME_ZONE_ACTION_ZRWA_FLUSH      = 0x11,
1581e9ba46eeSDmitry Fomichev };
1582e9ba46eeSDmitry Fomichev 
15836190d92fSKlaus Jensen enum {
15846190d92fSKlaus Jensen     NVME_ZSFLAG_SELECT_ALL = 1 << 0,
1585e321b4cdSKlaus Jensen     NVME_ZSFLAG_ZRWA_ALLOC = 1 << 1,
15866190d92fSKlaus Jensen };
15876190d92fSKlaus Jensen 
1588e9ba46eeSDmitry Fomichev typedef struct QEMU_PACKED NvmeZoneDescr {
1589e9ba46eeSDmitry Fomichev     uint8_t     zt;
1590e9ba46eeSDmitry Fomichev     uint8_t     zs;
1591e9ba46eeSDmitry Fomichev     uint8_t     za;
1592e9ba46eeSDmitry Fomichev     uint8_t     rsvd3[5];
1593e9ba46eeSDmitry Fomichev     uint64_t    zcap;
1594e9ba46eeSDmitry Fomichev     uint64_t    zslba;
1595e9ba46eeSDmitry Fomichev     uint64_t    wp;
1596e9ba46eeSDmitry Fomichev     uint8_t     rsvd32[32];
1597e9ba46eeSDmitry Fomichev } NvmeZoneDescr;
1598e9ba46eeSDmitry Fomichev 
1599b05fde28SKlaus Jensen typedef enum NvmeZoneState {
1600e9ba46eeSDmitry Fomichev     NVME_ZONE_STATE_RESERVED         = 0x00,
1601e9ba46eeSDmitry Fomichev     NVME_ZONE_STATE_EMPTY            = 0x01,
1602e9ba46eeSDmitry Fomichev     NVME_ZONE_STATE_IMPLICITLY_OPEN  = 0x02,
1603e9ba46eeSDmitry Fomichev     NVME_ZONE_STATE_EXPLICITLY_OPEN  = 0x03,
1604e9ba46eeSDmitry Fomichev     NVME_ZONE_STATE_CLOSED           = 0x04,
1605312c3531SGollu Appalanaidu     NVME_ZONE_STATE_READ_ONLY        = 0x0d,
1606312c3531SGollu Appalanaidu     NVME_ZONE_STATE_FULL             = 0x0e,
1607312c3531SGollu Appalanaidu     NVME_ZONE_STATE_OFFLINE          = 0x0f,
1608b05fde28SKlaus Jensen } NvmeZoneState;
1609e9ba46eeSDmitry Fomichev 
16105e6f963fSLukasz Maniak typedef struct QEMU_PACKED NvmePriCtrlCap {
16115e6f963fSLukasz Maniak     uint16_t    cntlid;
16125e6f963fSLukasz Maniak     uint16_t    portid;
16135e6f963fSLukasz Maniak     uint8_t     crt;
16145e6f963fSLukasz Maniak     uint8_t     rsvd5[27];
16155e6f963fSLukasz Maniak     uint32_t    vqfrt;
16165e6f963fSLukasz Maniak     uint32_t    vqrfa;
16175e6f963fSLukasz Maniak     uint16_t    vqrfap;
16185e6f963fSLukasz Maniak     uint16_t    vqprt;
16195e6f963fSLukasz Maniak     uint16_t    vqfrsm;
16205e6f963fSLukasz Maniak     uint16_t    vqgran;
16215e6f963fSLukasz Maniak     uint8_t     rsvd48[16];
16225e6f963fSLukasz Maniak     uint32_t    vifrt;
16235e6f963fSLukasz Maniak     uint32_t    virfa;
16245e6f963fSLukasz Maniak     uint16_t    virfap;
16255e6f963fSLukasz Maniak     uint16_t    viprt;
16265e6f963fSLukasz Maniak     uint16_t    vifrsm;
16275e6f963fSLukasz Maniak     uint16_t    vigran;
16285e6f963fSLukasz Maniak     uint8_t     rsvd80[4016];
16295e6f963fSLukasz Maniak } NvmePriCtrlCap;
16305e6f963fSLukasz Maniak 
1631746d42b1SŁukasz Gieryk typedef enum NvmePriCtrlCapCrt {
1632746d42b1SŁukasz Gieryk     NVME_CRT_VQ             = 1 << 0,
1633746d42b1SŁukasz Gieryk     NVME_CRT_VI             = 1 << 1,
1634746d42b1SŁukasz Gieryk } NvmePriCtrlCapCrt;
1635746d42b1SŁukasz Gieryk 
163699f48ae7SLukasz Maniak typedef struct QEMU_PACKED NvmeSecCtrlEntry {
163799f48ae7SLukasz Maniak     uint16_t    scid;
163899f48ae7SLukasz Maniak     uint16_t    pcid;
163999f48ae7SLukasz Maniak     uint8_t     scs;
164099f48ae7SLukasz Maniak     uint8_t     rsvd5[3];
164199f48ae7SLukasz Maniak     uint16_t    vfn;
164299f48ae7SLukasz Maniak     uint16_t    nvq;
164399f48ae7SLukasz Maniak     uint16_t    nvi;
164499f48ae7SLukasz Maniak     uint8_t     rsvd14[18];
164599f48ae7SLukasz Maniak } NvmeSecCtrlEntry;
164699f48ae7SLukasz Maniak 
164799f48ae7SLukasz Maniak typedef struct QEMU_PACKED NvmeSecCtrlList {
164899f48ae7SLukasz Maniak     uint8_t             numcntl;
164999f48ae7SLukasz Maniak     uint8_t             rsvd1[31];
165099f48ae7SLukasz Maniak     NvmeSecCtrlEntry    sec[127];
165199f48ae7SLukasz Maniak } NvmeSecCtrlList;
165299f48ae7SLukasz Maniak 
165311871f53SŁukasz Gieryk typedef enum NvmeVirtMngmtAction {
165411871f53SŁukasz Gieryk     NVME_VIRT_MNGMT_ACTION_PRM_ALLOC    = 0x01,
165511871f53SŁukasz Gieryk     NVME_VIRT_MNGMT_ACTION_SEC_OFFLINE  = 0x07,
165611871f53SŁukasz Gieryk     NVME_VIRT_MNGMT_ACTION_SEC_ASSIGN   = 0x08,
165711871f53SŁukasz Gieryk     NVME_VIRT_MNGMT_ACTION_SEC_ONLINE   = 0x09,
165811871f53SŁukasz Gieryk } NvmeVirtMngmtAction;
165911871f53SŁukasz Gieryk 
166011871f53SŁukasz Gieryk typedef enum NvmeVirtualResourceType {
166111871f53SŁukasz Gieryk     NVME_VIRT_RES_QUEUE         = 0x00,
166211871f53SŁukasz Gieryk     NVME_VIRT_RES_INTERRUPT     = 0x01,
166311871f53SŁukasz Gieryk } NvmeVirtualResourceType;
166411871f53SŁukasz Gieryk 
1665e181d3daSGollu Appalanaidu typedef struct NvmeDirectiveIdentify {
1666e181d3daSGollu Appalanaidu     uint8_t supported;
1667e181d3daSGollu Appalanaidu     uint8_t unused1[31];
1668e181d3daSGollu Appalanaidu     uint8_t enabled;
1669e181d3daSGollu Appalanaidu     uint8_t unused33[31];
1670*73064edfSJesper Devantier     uint8_t persistent;
1671*73064edfSJesper Devantier     uint8_t unused65[31];
1672*73064edfSJesper Devantier     uint8_t rsvd64[4000];
1673e181d3daSGollu Appalanaidu } NvmeDirectiveIdentify;
1674e181d3daSGollu Appalanaidu 
1675e181d3daSGollu Appalanaidu enum NvmeDirectiveTypes {
1676e181d3daSGollu Appalanaidu     NVME_DIRECTIVE_IDENTIFY       = 0x0,
1677*73064edfSJesper Devantier     NVME_DIRECTIVE_DATA_PLACEMENT = 0x2,
1678e181d3daSGollu Appalanaidu };
1679e181d3daSGollu Appalanaidu 
1680e181d3daSGollu Appalanaidu enum NvmeDirectiveOperations {
1681e181d3daSGollu Appalanaidu     NVME_DIRECTIVE_RETURN_PARAMS = 0x1,
1682e181d3daSGollu Appalanaidu };
1683e181d3daSGollu Appalanaidu 
1684*73064edfSJesper Devantier typedef struct QEMU_PACKED NvmeFdpConfsHdr {
1685*73064edfSJesper Devantier     uint16_t num_confs;
1686*73064edfSJesper Devantier     uint8_t  version;
1687*73064edfSJesper Devantier     uint8_t  rsvd3;
1688*73064edfSJesper Devantier     uint32_t size;
1689*73064edfSJesper Devantier     uint8_t  rsvd8[8];
1690*73064edfSJesper Devantier } NvmeFdpConfsHdr;
1691*73064edfSJesper Devantier 
1692*73064edfSJesper Devantier REG8(FDPA, 0x0)
1693*73064edfSJesper Devantier     FIELD(FDPA, RGIF, 0, 4)
1694*73064edfSJesper Devantier     FIELD(FDPA, VWC, 4, 1)
1695*73064edfSJesper Devantier     FIELD(FDPA, VALID, 7, 1);
1696*73064edfSJesper Devantier 
1697*73064edfSJesper Devantier typedef struct QEMU_PACKED NvmeFdpDescrHdr {
1698*73064edfSJesper Devantier     uint16_t descr_size;
1699*73064edfSJesper Devantier     uint8_t  fdpa;
1700*73064edfSJesper Devantier     uint8_t  vss;
1701*73064edfSJesper Devantier     uint32_t nrg;
1702*73064edfSJesper Devantier     uint16_t nruh;
1703*73064edfSJesper Devantier     uint16_t maxpids;
1704*73064edfSJesper Devantier     uint32_t nnss;
1705*73064edfSJesper Devantier     uint64_t runs;
1706*73064edfSJesper Devantier     uint32_t erutl;
1707*73064edfSJesper Devantier     uint8_t  rsvd28[36];
1708*73064edfSJesper Devantier } NvmeFdpDescrHdr;
1709*73064edfSJesper Devantier 
1710*73064edfSJesper Devantier enum NvmeRuhType {
1711*73064edfSJesper Devantier     NVME_RUHT_INITIALLY_ISOLATED = 1,
1712*73064edfSJesper Devantier     NVME_RUHT_PERSISTENTLY_ISOLATED = 2,
1713*73064edfSJesper Devantier };
1714*73064edfSJesper Devantier 
1715*73064edfSJesper Devantier typedef struct QEMU_PACKED NvmeRuhDescr {
1716*73064edfSJesper Devantier     uint8_t ruht;
1717*73064edfSJesper Devantier     uint8_t rsvd1[3];
1718*73064edfSJesper Devantier } NvmeRuhDescr;
1719*73064edfSJesper Devantier 
1720*73064edfSJesper Devantier typedef struct QEMU_PACKED NvmeRuhuLog {
1721*73064edfSJesper Devantier     uint16_t nruh;
1722*73064edfSJesper Devantier     uint8_t  rsvd2[6];
1723*73064edfSJesper Devantier } NvmeRuhuLog;
1724*73064edfSJesper Devantier 
1725*73064edfSJesper Devantier enum NvmeRuhAttributes {
1726*73064edfSJesper Devantier     NVME_RUHA_UNUSED = 0,
1727*73064edfSJesper Devantier     NVME_RUHA_HOST = 1,
1728*73064edfSJesper Devantier     NVME_RUHA_CTRL = 2,
1729*73064edfSJesper Devantier };
1730*73064edfSJesper Devantier 
1731*73064edfSJesper Devantier typedef struct QEMU_PACKED NvmeRuhuDescr {
1732*73064edfSJesper Devantier     uint8_t ruha;
1733*73064edfSJesper Devantier     uint8_t rsvd1[7];
1734*73064edfSJesper Devantier } NvmeRuhuDescr;
1735*73064edfSJesper Devantier 
1736*73064edfSJesper Devantier typedef struct QEMU_PACKED NvmeFdpStatsLog {
1737*73064edfSJesper Devantier     uint64_t hbmw[2];
1738*73064edfSJesper Devantier     uint64_t mbmw[2];
1739*73064edfSJesper Devantier     uint64_t mbe[2];
1740*73064edfSJesper Devantier     uint8_t  rsvd48[16];
1741*73064edfSJesper Devantier } NvmeFdpStatsLog;
1742*73064edfSJesper Devantier 
1743*73064edfSJesper Devantier typedef struct QEMU_PACKED NvmeFdpEventsLog {
1744*73064edfSJesper Devantier     uint32_t num_events;
1745*73064edfSJesper Devantier     uint8_t  rsvd4[60];
1746*73064edfSJesper Devantier } NvmeFdpEventsLog;
1747*73064edfSJesper Devantier 
1748*73064edfSJesper Devantier enum NvmeFdpEventType {
1749*73064edfSJesper Devantier     FDP_EVT_RU_NOT_FULLY_WRITTEN = 0x0,
1750*73064edfSJesper Devantier     FDP_EVT_RU_ATL_EXCEEDED = 0x1,
1751*73064edfSJesper Devantier     FDP_EVT_CTRL_RESET_RUH = 0x2,
1752*73064edfSJesper Devantier     FDP_EVT_INVALID_PID = 0x3,
1753*73064edfSJesper Devantier     FDP_EVT_MEDIA_REALLOC = 0x80,
1754*73064edfSJesper Devantier     FDP_EVT_RUH_IMPLICIT_RU_CHANGE = 0x81,
1755*73064edfSJesper Devantier };
1756*73064edfSJesper Devantier 
1757*73064edfSJesper Devantier enum NvmeFdpEventFlags {
1758*73064edfSJesper Devantier     FDPEF_PIV = 1 << 0,
1759*73064edfSJesper Devantier     FDPEF_NSIDV = 1 << 1,
1760*73064edfSJesper Devantier     FDPEF_LV = 1 << 2,
1761*73064edfSJesper Devantier };
1762*73064edfSJesper Devantier 
1763*73064edfSJesper Devantier typedef struct QEMU_PACKED NvmeFdpEvent {
1764*73064edfSJesper Devantier     uint8_t  type;
1765*73064edfSJesper Devantier     uint8_t  flags;
1766*73064edfSJesper Devantier     uint16_t pid;
1767*73064edfSJesper Devantier     uint64_t timestamp;
1768*73064edfSJesper Devantier     uint32_t nsid;
1769*73064edfSJesper Devantier     uint64_t type_specific[2];
1770*73064edfSJesper Devantier     uint16_t rgid;
1771*73064edfSJesper Devantier     uint8_t  ruhid;
1772*73064edfSJesper Devantier     uint8_t  rsvd35[5];
1773*73064edfSJesper Devantier     uint64_t vendor[3];
1774*73064edfSJesper Devantier } NvmeFdpEvent;
1775*73064edfSJesper Devantier 
1776*73064edfSJesper Devantier typedef struct QEMU_PACKED NvmePhidList {
1777*73064edfSJesper Devantier     uint16_t nnruhd;
1778*73064edfSJesper Devantier     uint8_t  rsvd2[6];
1779*73064edfSJesper Devantier } NvmePhidList;
1780*73064edfSJesper Devantier 
1781*73064edfSJesper Devantier typedef struct QEMU_PACKED NvmePhidDescr {
1782*73064edfSJesper Devantier     uint8_t  ruht;
1783*73064edfSJesper Devantier     uint8_t  rsvd1;
1784*73064edfSJesper Devantier     uint16_t ruhid;
1785*73064edfSJesper Devantier } NvmePhidDescr;
1786*73064edfSJesper Devantier 
1787*73064edfSJesper Devantier REG32(FEAT_FDP, 0x0)
1788*73064edfSJesper Devantier     FIELD(FEAT_FDP, FDPE, 0, 1)
1789*73064edfSJesper Devantier     FIELD(FEAT_FDP, CONF_NDX, 8, 8);
1790*73064edfSJesper Devantier 
1791*73064edfSJesper Devantier typedef struct QEMU_PACKED NvmeFdpEventDescr {
1792*73064edfSJesper Devantier     uint8_t evt;
1793*73064edfSJesper Devantier     uint8_t evta;
1794*73064edfSJesper Devantier } NvmeFdpEventDescr;
1795*73064edfSJesper Devantier 
1796*73064edfSJesper Devantier REG32(NVME_IOMR, 0x0)
1797*73064edfSJesper Devantier     FIELD(NVME_IOMR, MO, 0, 8)
1798*73064edfSJesper Devantier     FIELD(NVME_IOMR, MOS, 16, 16);
1799*73064edfSJesper Devantier 
1800*73064edfSJesper Devantier enum NvmeIomr2Mo {
1801*73064edfSJesper Devantier     NVME_IOMR_MO_NOP = 0x0,
1802*73064edfSJesper Devantier     NVME_IOMR_MO_RUH_STATUS = 0x1,
1803*73064edfSJesper Devantier     NVME_IOMR_MO_VENDOR_SPECIFIC = 0x255,
1804*73064edfSJesper Devantier };
1805*73064edfSJesper Devantier 
1806*73064edfSJesper Devantier typedef struct QEMU_PACKED NvmeRuhStatus {
1807*73064edfSJesper Devantier     uint8_t  rsvd0[14];
1808*73064edfSJesper Devantier     uint16_t nruhsd;
1809*73064edfSJesper Devantier } NvmeRuhStatus;
1810*73064edfSJesper Devantier 
1811*73064edfSJesper Devantier typedef struct QEMU_PACKED NvmeRuhStatusDescr {
1812*73064edfSJesper Devantier     uint16_t pid;
1813*73064edfSJesper Devantier     uint16_t ruhid;
1814*73064edfSJesper Devantier     uint32_t earutr;
1815*73064edfSJesper Devantier     uint64_t ruamw;
1816*73064edfSJesper Devantier     uint8_t  rsvd16[16];
1817*73064edfSJesper Devantier } NvmeRuhStatusDescr;
1818*73064edfSJesper Devantier 
1819*73064edfSJesper Devantier REG32(NVME_IOMS, 0x0)
1820*73064edfSJesper Devantier     FIELD(NVME_IOMS, MO, 0, 8)
1821*73064edfSJesper Devantier     FIELD(NVME_IOMS, MOS, 16, 16);
1822*73064edfSJesper Devantier 
1823*73064edfSJesper Devantier enum NvmeIoms2Mo {
1824*73064edfSJesper Devantier     NVME_IOMS_MO_NOP = 0x0,
1825*73064edfSJesper Devantier     NVME_IOMS_MO_RUH_UPDATE = 0x1,
1826*73064edfSJesper Devantier };
1827*73064edfSJesper Devantier 
_nvme_check_size(void)1828a3d9a352SFam Zheng static inline void _nvme_check_size(void)
1829a3d9a352SFam Zheng {
183074e18435SPhilippe Mathieu-Daudé     QEMU_BUILD_BUG_ON(sizeof(NvmeBar) != 4096);
1831a3d9a352SFam Zheng     QEMU_BUILD_BUG_ON(sizeof(NvmeAerResult) != 4);
1832e9ba46eeSDmitry Fomichev     QEMU_BUILD_BUG_ON(sizeof(NvmeZonedResult) != 8);
1833a3d9a352SFam Zheng     QEMU_BUILD_BUG_ON(sizeof(NvmeCqe) != 16);
1834a3d9a352SFam Zheng     QEMU_BUILD_BUG_ON(sizeof(NvmeDsmRange) != 16);
183544219b60SNaveen Nagar     QEMU_BUILD_BUG_ON(sizeof(NvmeCopySourceRangeFormat0) != 32);
183644219b60SNaveen Nagar     QEMU_BUILD_BUG_ON(sizeof(NvmeCopySourceRangeFormat1) != 40);
1837a3d9a352SFam Zheng     QEMU_BUILD_BUG_ON(sizeof(NvmeCmd) != 64);
1838a3d9a352SFam Zheng     QEMU_BUILD_BUG_ON(sizeof(NvmeDeleteQ) != 64);
1839a3d9a352SFam Zheng     QEMU_BUILD_BUG_ON(sizeof(NvmeCreateCq) != 64);
1840a3d9a352SFam Zheng     QEMU_BUILD_BUG_ON(sizeof(NvmeCreateSq) != 64);
1841a3d9a352SFam Zheng     QEMU_BUILD_BUG_ON(sizeof(NvmeIdentify) != 64);
1842a3d9a352SFam Zheng     QEMU_BUILD_BUG_ON(sizeof(NvmeRwCmd) != 64);
1843a3d9a352SFam Zheng     QEMU_BUILD_BUG_ON(sizeof(NvmeDsmCmd) != 64);
18443862efffSKlaus Jensen     QEMU_BUILD_BUG_ON(sizeof(NvmeCopyCmd) != 64);
1845a3d9a352SFam Zheng     QEMU_BUILD_BUG_ON(sizeof(NvmeRangeType) != 64);
1846d0c0697bSNaveen Nagar     QEMU_BUILD_BUG_ON(sizeof(NvmeHostBehaviorSupport) != 512);
1847a3d9a352SFam Zheng     QEMU_BUILD_BUG_ON(sizeof(NvmeErrorLog) != 64);
1848a3d9a352SFam Zheng     QEMU_BUILD_BUG_ON(sizeof(NvmeFwSlotInfoLog) != 512);
1849a3d9a352SFam Zheng     QEMU_BUILD_BUG_ON(sizeof(NvmeSmartLog) != 512);
185062e8faa4SDmitry Fomichev     QEMU_BUILD_BUG_ON(sizeof(NvmeEffectsLog) != 4096);
1851a3d9a352SFam Zheng     QEMU_BUILD_BUG_ON(sizeof(NvmeIdCtrl) != 4096);
1852e9ba46eeSDmitry Fomichev     QEMU_BUILD_BUG_ON(sizeof(NvmeIdCtrlZoned) != 4096);
185367ce28a1SGollu Appalanaidu     QEMU_BUILD_BUG_ON(sizeof(NvmeIdCtrlNvm) != 4096);
1854e9ba46eeSDmitry Fomichev     QEMU_BUILD_BUG_ON(sizeof(NvmeLBAF) != 4);
1855e9ba46eeSDmitry Fomichev     QEMU_BUILD_BUG_ON(sizeof(NvmeLBAFE) != 16);
1856a3d9a352SFam Zheng     QEMU_BUILD_BUG_ON(sizeof(NvmeIdNs) != 4096);
185744219b60SNaveen Nagar     QEMU_BUILD_BUG_ON(sizeof(NvmeIdNsNvm) != 4096);
1858e9ba46eeSDmitry Fomichev     QEMU_BUILD_BUG_ON(sizeof(NvmeIdNsZoned) != 4096);
1859c26f2173SKlaus Jensen     QEMU_BUILD_BUG_ON(sizeof(NvmeSglDescriptor) != 16);
1860c26f2173SKlaus Jensen     QEMU_BUILD_BUG_ON(sizeof(NvmeIdNsDescr) != 4);
1861e9ba46eeSDmitry Fomichev     QEMU_BUILD_BUG_ON(sizeof(NvmeZoneDescr) != 64);
186244219b60SNaveen Nagar     QEMU_BUILD_BUG_ON(sizeof(NvmeDifTuple) != 16);
18635e6f963fSLukasz Maniak     QEMU_BUILD_BUG_ON(sizeof(NvmePriCtrlCap) != 4096);
186499f48ae7SLukasz Maniak     QEMU_BUILD_BUG_ON(sizeof(NvmeSecCtrlEntry) != 32);
186599f48ae7SLukasz Maniak     QEMU_BUILD_BUG_ON(sizeof(NvmeSecCtrlList) != 4096);
1866771dbc3aSKlaus Jensen     QEMU_BUILD_BUG_ON(sizeof(NvmeEndGrpLog) != 512);
1867e181d3daSGollu Appalanaidu     QEMU_BUILD_BUG_ON(sizeof(NvmeDirectiveIdentify) != 4096);
1868a3d9a352SFam Zheng }
1869a3d9a352SFam Zheng #endif
1870