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