2 * Copyright (c) 2009, ETH Zurich. All rights reserved.
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.
12 * DESCRIPTION: AHCI (SATA) Host bus adaptor, per-port registers
14 * Section numbers refer to the Serial ATA Advanced Host Controller
15 * Interface (AHCI) specification 1.3, June 2008
18 device ahci_port msbfirst (addr b) "AHCI port" {
22 register clb rw addr(b,0x00) "Command list base address" type(uint64);
26 register fb rw addr(b,0x08) "FIS base address" type(uint64);
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";
37 ofs 1 rw1c "Overflow status";
38 ipms 1 rw1c "Incorrect port multiplier status";
39 prcs 1 ro "PhyRdy change status";
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";
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";
60 ofe 1 rw "Overflow enable";
61 ipme 1 rw "Incorrect port multiplier status";
62 prce 1 ro "PhyRdy change status";
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";
75 constants icct "Interface communication control" {
76 slumber = 0x6 "Slumber";
77 partial = 0x2 "Partial";
78 active = 0x1 "Active";
79 idle = 0x0 "No-Op / Idle";
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";
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";
108 register tfd ro addr(b,0x20) "Task file data" {
111 sts 8 "Status (task file status)";
115 register sig ro addr(b,0x24) "Signature" {
119 sectors 8 "Sector count";
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)";
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";
134 register ssts ro addr(b,0x28) "Serial ATA status" {
136 ipm 4 type(icct) "Interface power management";
137 spd 4 type(speed) "Current interface speed";
138 det 4 type(dets) "Device detection";
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";
148 register sctl addr(b,0x2c) "Serial ATA control" {
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";
158 register serr rw1c addr(b,0x30) "Serial ATA error" {
161 df 1 "Unknown FIS type";
162 dt 1 "Transport state transition error";
163 ds 1 "Link sequence error";
164 dh 1 "Handshake error";
166 dd 1 "Disparity error";
167 db 1 "10b to 8b decode error";
169 di 1 "Phy internal error";
170 dn 1 "PhyRdy change";
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";
177 em 1 "Recovered communications error";
178 ei 1 "Recovered data integrity error";
182 register sact rw addr(b,0x34) "Serial ATA active" type(uint32);
185 register ci rw addr(b,0x38) "Command issue" type(uint32);
188 register sntf addr(b,0x3c) "Serial ATA notification" {
190 pmn 16 rw1c "PMN notify";
194 register fbs addr(b,0x40) "FIS-based switching control" {
196 dwe 4 ro "Device with error";
197 ado 4 ro "Active device optimization";
198 dev 4 rw "Device to issue";
200 sde 1 ro "Single device error";
201 dec 1 rw1c "Device error clear";
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";
210 c 1 "Clear busy upon R_OK";
216 cfl 5 "Command FIS length";
218 prdbc 32 "Physical region descriptor byte count";
220 ctba 32 "Command table descriptor base address";
222 ctbau 32 "Command table descriptor base address upper";
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";
234 i 1 "Interrupt on completion";
236 dbc 22 "Data byte count";
240 constants emtype "Enclosure message type" {
242 saf_te = 0x1 "SAF-TE";
244 sgpio = 0x3 "SGPOI (register-based interface";
246 datatype encmsg "Enclosure management message" {
248 mtype 4 type(emtype) "Message type";
250 msize 8 "Message size";
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";
263 datatype emledmsg "Enclosure LED message" {
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";
269 pmi 4 "Port multiplier information";
271 vsm 1 "Vendor-specific enclosure message";
272 hbapn 5 "HBA port number for update";