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