23715e813c5f67042eefbf9fc5cadd17dc3c1580
[barrelfish] / devices / ahci_port.dev
1 /*
2  * Copyright (c) 2009, ETH Zurich. All rights reserved.
3  *
4  * This file is distributed under the terms in the attached LICENSE file.
5  * If you do not find this file, copies can be found by writing to:
6  * ETH Zurich D-INFK, Haldeneggsteig 4, CH-8092 Zurich. Attn: Systems Group.
7  */
8
9 /*
10  * ahci_port.dev
11  *
12  * DESCRIPTION: AHCI (SATA) Host bus adaptor, per-port registers
13  * 
14  * Section numbers refer to the Serial ATA Advanced Host Controller
15  *   Interface (AHCI) specification 1.3, June 2008
16  */
17
18 device ahci_port msbfirst (addr b) "AHCI port" {
19
20     // 3.3.1-2 
21     // Low 10 bits mbz
22     register clb rw addr(b,0x00) "Command list base address" type(uint64);
23     
24     // 3.3.3-4
25     // Low 10 bits mbz
26     register fb rw addr(b,0x08) "FIS base address" type(uint64);
27     
28     // 3.3.5
29     register is addr(b,0x10) "Interrupt status" {
30         cpds    1 rw1c "Cold port detect";
31         tfes    1 rw1c "Task file error";
32         hbfs    1 rw1c "Host bus fatal error";
33         hbds    1 rw1c "Host bus data error";
34         ifs     1 rw1c "Interface fatal error";
35         infs    1 rw1c "Interface non-fatal error";
36         _       1 rsvd;
37         ofs     1 rw1c "Overflow status";
38         ipms    1 rw1c "Incorrect port multiplier status";
39         prcs    1 ro   "PhyRdy change status";
40         _       14 rsvd;
41         dmps    1 rw1c "Device mechanical presence";
42         pcs     1 ro   "Port connect change";
43         dps     1 rw1c "Descriptor processed";
44         ufs     1 ro   "Unknown FIS interrupt";
45         sdbs    1 rw1c "Set device bits interrupt";
46         dss     1 rw1c "DMA setup FIS interrupt";
47         pss     1 rw1c "PIO setup FIS interrupt";
48         dhrs    1 rw1c "Device to host register FIS interrupt";
49     };
50     
51     // 3.3.6
52     register ie addr(b,0x14) "Interrupt enable" {
53         cpde    1 rw "Cold port detect";
54         tfee    1 rw "Task file error";
55         hbfe    1 rw "Host bus fatal error";
56         hbde    1 rw "Host bus data error";
57         ife     1 rw "Interface fatal error";
58         infe    1 rw "Interface non-fatal error";
59         _       1 rsvd;
60         ofe     1 rw "Overflow enable";
61         ipme    1 rw "Incorrect port multiplier status";
62         prce    1 ro   "PhyRdy change status";
63         _       14 rsvd;
64         dmpe    1 rw "Device mechanical presence";
65         pce     1 ro   "Port connect change";
66         dpe     1 rw "Descriptor processed";
67         ufe     1 ro   "Unknown FIS interrupt";
68         sdbe    1 rw "Set device bits interrupt";
69         dse     1 rw "DMA setup FIS interrupt";
70         pse     1 rw "PIO setup FIS interrupt";
71         dhre    1 rw "Device to host register FIS interrupt";
72     };
73     
74     // 3.3.7 
75     constants icct "Interface communication control" {
76         slumber = 0x6 "Slumber";
77         partial = 0x2 "Partial";
78         active  = 0x1 "Active";
79         idle    = 0x0 "No-Op / Idle";
80     };
81     register cmd addr(b,0x18) "Command and status" {
82         icc     4 rw type(icct) "Interface communication control";
83         asp     1 rw "Aggressive slumber / partial";
84         alpe    1 rw "Aggressive link power management enable";
85         dlae    1 rw "Drive LED on ATAPI enable";
86         atapi   1 rw "Device is ATAPI";
87         apste   1 rw "Automatic partial to slumber transitions enabled";
88         fbscp   1 ro "FIS-based switching capable port";
89         esp     1 ro "External SATA port";
90         cpd     1 ro "Cold presence detection";
91         mpsp    1 ro "Mechanical presence switch";
92         hpcp    1 ro "Hot plug capable port";
93         pma     1 rw "Port multiplier attached";
94         cps     1 ro "Cold presence state";
95         cr      1 ro "Command list running";
96         fr      1 ro "FIS receive running";
97         mpss    1 ro "Mechanical presence switch state";
98         ccs     5 ro "Current command slot";
99         _       3 rsvd;
100         fre     1 rw "FIS receive enable";
101         clo     1 rw "Command list override";
102         pod     1 rw "Power on device";
103         sud     1 rw "Spin-up device";
104         st      1 rw "Start";
105     };
106
107     // 3.3.8 
108     register tfd ro addr(b,0x20) "Task file data" {
109         _       16 rsvd;
110         err     8 "Error";
111         sts     8 "Status (task file status)";
112     };
113     
114     // 3.3.9
115     register sig ro addr(b,0x24) "Signature" {
116         lbah    8 "LBA high";
117         lbam    8 "LBA mid";
118         lbal    8 "LBA low";
119         sectors 8 "Sector count";
120     };
121     
122     // 3.3.10
123     constants speed "Interface speed" {
124         gen1    = 0b0001 "Gen 1 (1.5 Gbps)";
125         gen2    = 0b0010 "Gen 2 (3 Gbps)";
126         gen3    = 0b0011 "Gen 3 (6 Gbps)";
127     };
128     constants dets "Device detection state" {
129         nodev   = 0x0 "No device, no PHY";
130         nophy   = 0x1 "Device detected, no PHY comm. established";
131         detect  = 0x3 "Device detected and PHY comm. established";
132         offline = 0x4 "PHY in offline mode or loopback";
133     };
134     register ssts ro addr(b,0x28) "Serial ATA status" {
135         _       20 rsvd;
136         ipm     4 type(icct) "Interface power management";
137         spd     4 type(speed) "Current interface speed";
138         det     4 type(dets) "Device detection";
139     };
140     
141     // 3.3.11
142     constants ipmall "Interface transitions" {
143         noipm   = 0x0 "No interface restrictions";
144         noprtl  = 0x1 "Transitions to Partial state disabled";
145         noslmb  = 0x2 "Transitions to Slumber state disabled";
146         noboth  = 0x3 "Transitions to both Partial and Slumber disabled";
147     };
148     register sctl addr(b,0x2c) "Serial ATA control" {
149         _       12 rsvd;
150         _       4 rsvd "Port multiplier port (unused)";
151         _       4 rsvd "Select power mgmt (unused)";
152         ipm     4 rw type(ipmall) "Interface power mgmt transitions allowed";
153         spd     4 rw type(speed) "Speed allowed";
154         det     4 rw type(dets) "Device detection initialization";
155     };
156
157     // 3.3.12
158     register serr rw1c addr(b,0x30) "Serial ATA error" {
159         _       5 rsvd;
160         dx      1 "Exchanged";
161         df      1 "Unknown FIS type";
162         dt      1 "Transport state transition error";
163         ds      1 "Link sequence error";
164         dh      1 "Handshake error";
165         dc      1 "CRC error";
166         dd      1 "Disparity error";
167         db      1 "10b to 8b decode error";
168         dw      1 "Comm wake";
169         di      1 "Phy internal error";
170         dn      1 "PhyRdy change";
171         _       4 rsvd;
172         ee      1 "Internal error";
173         ep      1 "Protocol error";
174         ec      1 "Persistent communication or data integrity error";
175         et      1 "Transient data integrity error";
176         _       6 rsvd;
177         em      1 "Recovered communications error";
178         ei      1 "Recovered data integrity error";
179     };
180
181     // 3.3.13
182     register sact rw addr(b,0x34) "Serial ATA active" type(uint32);
183
184     // 3.3.14
185     register ci rw addr(b,0x38) "Command issue" type(uint32);
186     
187     // 3.3.15 
188     register sntf addr(b,0x3c) "Serial ATA notification" {
189         _       16 mbz;
190         pmn     16 rw1c "PMN notify";
191     };
192     
193     // 3.3.16
194     register fbs addr(b,0x40) "FIS-based switching control" {
195         _       12 mbz;
196         dwe     4 ro "Device with error";
197         ado     4 ro "Active device optimization";
198         dev     4 rw "Device to issue";
199         _       5 mbz;
200         sde     1 ro "Single device error";
201         dec     1 rw1c "Device error clear";
202         en      1 rw "Enable";
203     };
204
205     // 4.2.2 Command List Structure, elements are Command Headers
206     datatype chdr msbfirst(32) "Command Header" {
207         prdtl   16 "Physical region descriptor table length";
208         pmp     4  "Port multiplier port";
209         _       1;
210         c       1 "Clear busy upon R_OK";
211         b       1 "BIST";
212         r       1 "Reset";
213         p       1 "Prefetchable";
214         w       1 "Write";
215         a       1 "ATAPI";
216         cfl     5 "Command FIS length";
217         
218         prdbc   32 "Physical region descriptor byte count";
219         
220         ctba    32 "Command table descriptor base address";
221         
222         ctbau   32 "Command table descriptor base address upper";
223         _       32;
224         _       32;
225         _       32;
226         _       32;
227     };
228
229     // 4.2.3.3 Physical Region Descriptor Table
230     datatype prd msbfirst(32) "Physical region descriptor" {
231         dba     32 "Data base address";
232         dbau    32 "Data base address upper";
233         _       32;
234         i       1 "Interrupt on completion";
235         _       9;
236         dbc     22 "Data byte count";
237     };
238     
239     // 12.2
240     constants emtype "Enclosure message type" {
241         led     = 0x0 "LED";
242         saf_te  = 0x1 "SAF-TE";
243         ses_2   = 0x2 "SES-2";
244         sgpio   = 0x3 "SGPOI (register-based interface";
245     };
246     datatype encmsg "Enclosure management message" {
247         _       4;
248         mtype   4 type(emtype) "Message type";
249         dsize   8 "Data size";
250         msize   8 "Message size";
251         _       8;
252     };
253     
254     // 12.2.1
255     constants emledstate "Enclosure LED state" {
256         off     = 0b000 "LED shall be off";
257         solid   = 0b001 "LED shall be solid on";
258         vs1     = 0b100 "Vendor specific 1";
259         vs2     = 0b101 "Vendor specific 2";
260         vs3     = 0b110 "Vendor specific 3";
261         vs4     = 0b111 "Vendor specific 4";
262     };
263     datatype emledmsg "Enclosure LED message" {
264         _       7;
265         fault   3 type(emledstate) "Vendor-specific LED (e.g. fault)";
266         locate  3 type(emledstate) "Vendor-specific LED (e.g. locate)";
267         activity 3 type(emledstate) "Activity LED";
268         _       4;
269         pmi     4 "Port multiplier information";
270         _       2;
271         vsm     1 "Vendor-specific enclosure message";
272         hbapn   5 "HBA port number for update";
273     };
274 };