1/* TODO: spec citations per structure */
2
3#include <drivers/nvme.h>
4#include <drivers/verifier.h>
5
6#define DV_STRUCT nvme_regs
7dv_size(0x1020);
8dv_field(uint32_t, cap_lo, 0x00);
9dv_field(uint32_t, cap_hi, 0x04);
10dv_field(uint32_t, version, 0x08);
11dv_field(uint32_t, intms, 0x0C);
12dv_field(uint32_t, intmc, 0x10);
13dv_field(struct nvme_cc, cc, 0x14);
14dv_field(uint32_t, nssr, 0x18);
15dv_field(uint32_t, csts, 0x1C);
16dv_field(uint32_t, reserved1, 0x20);
17dv_field(uint32_t, aqa, 0x24);
18dv_field(uint32_t, asq_lo, 0x28);
19dv_field(uint32_t, asq_hi, 0x2C);
20dv_field(uint32_t, acq_lo, 0x30);
21dv_field(uint32_t, acq_hi, 0x34);
22dv_field(uint32_t[1018], reserved4, 0x38);
23#undef DV_STRUCT
24
25#define DV_STRUCT nvme_command
26dv_size(0x40);
27dv_align(1);
28dv_field(uint8_t, opc, 0x00);
29dv_field(uint8_t, fuse, 0x01);
30dv_field(uint16_t, cid, 0x02);
31dv_field(uint32_t, nsid, 0x04);
32dv_field(uint64_t, rsvd2, 0x08);
33dv_field(uint64_t, mptr, 0x10);
34dv_field(uint64_t, prp1, 0x18);
35dv_field(uint64_t, prp2, 0x20);
36dv_field(uint32_t, cdw10, 0x28);
37dv_field(uint32_t, cdw11, 0x2C);
38dv_field(uint32_t, cdw12, 0x30);
39dv_field(uint32_t, cdw13, 0x34);
40dv_field(uint32_t, cdw14, 0x38);
41dv_field(uint32_t, cdw15, 0x3C);
42#undef DV_STRUCT
43
44#define DV_STRUCT nvme_completion
45dv_size(0x10);
46dv_align(1);
47dv_field(uint32_t, result, 0x00);
48dv_field(uint32_t, rsvd, 0x04);
49dv_field(uint16_t, sq_head, 0x08);
50dv_field(uint16_t, sq_id, 0x0A);
51dv_field(uint16_t, cid, 0x0C);
52dv_field(uint16_t, status, 0x0E);
53#undef DV_STRUCT
54
55#define DV_STRUCT nvme_cc
56dv_size(0x04);
57dv_align(1);
58#undef DV_STRUCT
59
60#define DV_STRUCT nvme_lbaf
61dv_size(0x04);
62dv_align(1);
63dv_field(uint16_t, ms, 0x00);
64dv_field(uint8_t, lbads, 0x02);
65/* bitfields: rp, reserved */
66#undef DV_STRUCT
67
68#define DV_STRUCT nvme_identify_namespace
69dv_size(0x1000);
70dv_align(1);
71dv_field(uint64_t, nsze, 0x00);
72dv_field(uint64_t, ncap, 0x08);
73dv_field(uint64_t, nuse, 0x10);
74dv_field(uint8_t, nsfeat, 0x18);
75dv_field(uint8_t, nlbaf, 0x19);
76dv_field(uint8_t, flbas, 0x1A);
77dv_field(uint8_t, mc, 0x1B);
78dv_field(uint8_t, dpc, 0x1C);
79dv_field(uint8_t, dps, 0x1D);
80dv_field(uint8_t, nmic, 0x1E);
81dv_field(uint8_t, rescap, 0x1F);
82dv_field(uint8_t, fpi, 0x20);
83dv_field(uint8_t, dlfeat, 0x21);
84dv_field(uint16_t, nawun, 0x22);
85dv_field(uint16_t, nawupf, 0x24);
86dv_field(uint16_t, nacwu, 0x26);
87dv_field(uint16_t, nabsn, 0x28);
88dv_field(uint16_t, nabo, 0x2A);
89dv_field(uint16_t, nabspf, 0x2C);
90dv_field(uint16_t, noiob, 0x2E);
91dv_field(uint64_t[2], nvmcap, 0x30);
92dv_field(uint16_t, npwg, 0x40);
93dv_field(uint16_t, npwa, 0x42);
94dv_field(uint16_t, npdg, 0x44);
95dv_field(uint16_t, npda, 0x46);
96dv_field(uint16_t, nows, 0x48);
97dv_field(uint16_t, mssrl, 0x4A);
98dv_field(uint32_t, mcl, 0x4C);
99dv_field(uint8_t, msrc, 0x50);
100dv_field(uint8_t[11], reserved0, 0x51);
101dv_field(uint32_t, adagrpid, 0x5C);
102dv_field(uint8_t[3], reserved1, 0x60);
103dv_field(uint8_t, nsattr, 0x63);
104dv_field(uint16_t, nvmsetid, 0x64);
105dv_field(uint16_t, endgid, 0x66);
106dv_field(uint64_t[2], nguid, 0x68);
107dv_field(uint64_t, eui64, 0x78);
108dv_field(struct nvme_lbaf[64], lbaf, 0x80);
109dv_field(uint8_t[3712], vendor_specific, 0x180);
110#undef DV_STRUCT
111
112#define DV_STRUCT nvme_identify_controller
113dv_size(0x202);
114dv_align(1);
115dv_field(uint16_t, vid, 0x00);
116dv_field(uint16_t, ssvid, 0x02);
117dv_field(char[20], sn, 0x04);
118dv_field(char[40], mn, 0x18);
119dv_field(char[8], fr, 0x40);
120dv_field(uint8_t, rab, 0x48);
121dv_field(uint8_t[3], ieee, 0x49);
122dv_field(uint8_t, mic, 0x4C);
123dv_field(uint8_t, mdts, 0x4D);
124dv_field(uint16_t, cntlid, 0x4E);
125dv_field(uint32_t, ver, 0x50);
126dv_field(uint32_t, rtd3r, 0x54);
127dv_field(uint32_t, rtd3e, 0x58);
128dv_field(uint32_t, oaes, 0x5C);
129dv_field(uint32_t, ctratt, 0x60);
130dv_field(uint8_t[156], rsvd96, 0x64);
131dv_field(uint16_t, oacs, 0x100);
132dv_field(uint8_t, acl, 0x102);
133dv_field(uint8_t, aerl, 0x103);
134dv_field(uint8_t, frmw, 0x104);
135dv_field(uint8_t, lpa, 0x105);
136dv_field(uint8_t, elpe, 0x106);
137dv_field(uint8_t, npss, 0x107);
138dv_field(uint8_t, avscc, 0x108);
139dv_field(uint8_t, apsta, 0x109);
140dv_field(uint16_t, wctemp, 0x10A);
141dv_field(uint16_t, cctemp, 0x10C);
142dv_field(uint16_t, mtfa, 0x10E);
143dv_field(uint32_t, hmpre, 0x110);
144dv_field(uint32_t, hmmin, 0x114);
145dv_field(uint64_t[2], tnvmcap, 0x118);
146dv_field(uint64_t[2], unvmcap, 0x128);
147dv_field(uint32_t, rpmbs, 0x138);
148dv_field(uint16_t, edstt, 0x13C);
149dv_field(uint8_t, dsto, 0x13E);
150dv_field(uint8_t, fwug, 0x13F);
151dv_field(uint16_t, kas, 0x140);
152dv_field(uint16_t, hctma, 0x142);
153dv_field(uint16_t, mntmt, 0x144);
154dv_field(uint16_t, mxtmt, 0x146);
155dv_field(uint32_t, sanicap, 0x148);
156dv_field(uint8_t[180], rsvd228, 0x14C);
157dv_field(uint8_t, sqes, 0x200);
158dv_field(uint8_t, cqes, 0x201);
159#undef DV_STRUCT
160