| 1 | /* TODO: spec citations (AHCI 1.3.1) per structure */ |
| 2 | |
| 3 | #include <drivers/ahci.h> |
| 4 | #include <drivers/verifier.h> |
| 5 | |
| 6 | #define DV_STRUCT ahci_prdt_entry |
| 7 | dv_size(0x10); |
| 8 | dv_align(1); |
| 9 | dv_field(uint32_t, dba, 0x00); |
| 10 | dv_field(uint32_t, dbau, 0x04); |
| 11 | dv_field(uint32_t, reserved, 0x08); |
| 12 | #undef DV_STRUCT |
| 13 | |
| 14 | #define DV_STRUCT ahci_cmd_table |
| 15 | dv_size(0x80); |
| 16 | dv_align(1); |
| 17 | dv_field(uint8_t[64], cfis, 0x00); |
| 18 | dv_field(uint8_t[16], acmd, 0x40); |
| 19 | dv_field(uint8_t[48], reserved, 0x50); |
| 20 | dv_field_at(prdt_entry, 0x80); |
| 21 | #undef DV_STRUCT |
| 22 | |
| 23 | #define DV_STRUCT ahci_cmd_header |
| 24 | dv_size(0x20); |
| 25 | dv_align(1); |
| 26 | dv_field(uint16_t, prdtl, 0x02); |
| 27 | dv_field(uint32_t, prdbc, 0x04); |
| 28 | dv_field(uint32_t, ctba, 0x08); |
| 29 | dv_field(uint32_t, ctbau, 0x0C); |
| 30 | dv_field(uint32_t[4], rsv1, 0x10); |
| 31 | #undef DV_STRUCT |
| 32 | |
| 33 | #define DV_STRUCT ahci_fis_reg_h2d |
| 34 | dv_size(0x14); |
| 35 | dv_field(uint8_t, fis_type, 0x00); |
| 36 | dv_field(uint8_t, command, 0x02); |
| 37 | dv_field(uint8_t, featurel, 0x03); |
| 38 | dv_field(uint8_t, lba0, 0x04); |
| 39 | dv_field(uint8_t, lba1, 0x05); |
| 40 | dv_field(uint8_t, lba2, 0x06); |
| 41 | dv_field(uint8_t, device, 0x07); |
| 42 | dv_field(uint8_t, lba3, 0x08); |
| 43 | dv_field(uint8_t, lba4, 0x09); |
| 44 | dv_field(uint8_t, lba5, 0x0A); |
| 45 | dv_field(uint8_t, featureh, 0x0B); |
| 46 | dv_field(uint8_t, countl, 0x0C); |
| 47 | dv_field(uint8_t, counth, 0x0D); |
| 48 | dv_field(uint8_t, icc, 0x0E); |
| 49 | dv_field(uint8_t, control, 0x0F); |
| 50 | dv_field(uint8_t[4], reserved2, 0x10); |
| 51 | #undef DV_STRUCT |
| 52 | |
| 53 | /* ahci_fis_reg_d2h is unused, so absent from debug info; written by hand */ |
| 54 | #define DV_STRUCT ahci_fis_reg_d2h |
| 55 | dv_size(0x14); |
| 56 | dv_field(uint8_t, fis_type, 0x00); |
| 57 | dv_field(uint8_t, status, 0x02); |
| 58 | dv_field(uint8_t, error, 0x03); |
| 59 | dv_field(uint8_t, lba0, 0x04); |
| 60 | dv_field(uint8_t, lba1, 0x05); |
| 61 | dv_field(uint8_t, lba2, 0x06); |
| 62 | dv_field(uint8_t, device, 0x07); |
| 63 | dv_field(uint8_t, lba3, 0x08); |
| 64 | dv_field(uint8_t, lba4, 0x09); |
| 65 | dv_field(uint8_t, lba5, 0x0A); |
| 66 | dv_field(uint8_t, rsv2, 0x0B); |
| 67 | dv_field(uint8_t, countl, 0x0C); |
| 68 | dv_field(uint8_t, counth, 0x0D); |
| 69 | dv_field(uint8_t[2], rsv3, 0x0E); |
| 70 | dv_field(uint8_t[4], rsv4, 0x10); |
| 71 | #undef DV_STRUCT |
| 72 | |
| 73 | #define DV_STRUCT ahci_port |
| 74 | dv_size(0x80); |
| 75 | dv_field(uint32_t, clb, 0x00); |
| 76 | dv_field(uint32_t, clbu, 0x04); |
| 77 | dv_field(uint32_t, fb, 0x08); |
| 78 | dv_field(uint32_t, fbu, 0x0C); |
| 79 | dv_field(uint32_t, is, 0x10); |
| 80 | dv_field(uint32_t, ie, 0x14); |
| 81 | dv_field(uint32_t, cmd, 0x18); |
| 82 | dv_field(uint32_t, rsv0, 0x1C); |
| 83 | dv_field(uint32_t, tfd, 0x20); |
| 84 | dv_field(uint32_t, sig, 0x24); |
| 85 | dv_field(uint32_t, ssts, 0x28); |
| 86 | dv_field(uint32_t, sctl, 0x2C); |
| 87 | dv_field(uint32_t, serr, 0x30); |
| 88 | dv_field(uint32_t, sact, 0x34); |
| 89 | dv_field(uint32_t, ci, 0x38); |
| 90 | dv_field(uint32_t, sntf, 0x3C); |
| 91 | dv_field(uint32_t, fbs, 0x40); |
| 92 | dv_field(uint32_t[11], rsv1, 0x44); |
| 93 | dv_field(uint32_t[4], vendor, 0x70); |
| 94 | #undef DV_STRUCT |
| 95 | |