2 * advanced host controller interface (sata)
6 /* pci configuration */
12 * ahci memory configuration
14 * 0000-0023 generic host control
16 * 00a0-00ff vendor specific.
22 /* cap bits: supported features */
24 H64a = 1<<31, /* 64-bit addressing */
25 Hncq = 1<<30, /* ncq */
26 Hsntf = 1<<29, /* snotification reg. */
27 Hmps = 1<<28, /* mech pres switch */
28 Hss = 1<<27, /* staggered spinup */
29 Halp = 1<<26, /* aggressive link pm */
30 Hal = 1<<25, /* activity led */
31 Hclo = 1<<24, /* command-list override */
32 Hiss = 1<<20, /* for interface speed */
33 Ham = 1<<18, /* ahci-mode only */
34 Hpm = 1<<17, /* port multiplier */
35 Hfbs = 1<<16, /* fis-based switching */
36 Hpmb = 1<<15, /* multiple-block pio */
37 Hssc = 1<<14, /* slumber state */
38 Hpsc = 1<<13, /* partial-slumber state */
39 Hncs = 1<<8, /* n command slots */
40 Hcccs = 1<<7, /* coal */
41 Hems = 1<<6, /* enclosure mgmt. */
42 Hxs = 1<<5, /* external sata */
43 Hnp = 1<<0, /* n ports */
48 Hae = 1<<31, /* enable ahci */
49 Hie = 1<<1, /* " interrupts */
50 Hhr = 1<<0, /* hba reset */
55 Apts = 1<<2, /* automatic partial to slumber */
56 Nvmp = 1<<1, /* nvmhci present; nvram */
57 Boh = 1<<0, /* bios/os handoff supported */
68 Pm = 1<<27, /* port multiplier support */
69 Alhd = 1<<26, /* activity led hardware driven */
70 Xonly = 1<<25, /* rx messages not supported */
71 Smb = 1<<24, /* single msg buffer; rx limited */
72 Esgpio = 1<<19, /* sgpio messages supported */
73 Eses2 = 1<<18, /* ses-2 supported */
74 Esafte = 1<<17, /* saf-te supported */
75 Elmt = 1<<16, /* led msg types support */
76 Emrst = 1<<9, /* reset all em logic */
77 Tmsg = 1<<8, /* transmit message */
78 Mr = 1<<0, /* message rx'd */
79 Emtype = Esgpio | Eses2 | Esafte | Elmt,
86 ulong pi; /* ports implemented */
88 ulong ccc; /* coaleasing control */
97 Acpds = 1<<31, /* cold port detect status */
98 Atfes = 1<<30, /* task file error status */
99 Ahbfs = 1<<29, /* hba fatal */
100 Ahbds = 1<<28, /* hba error (parity error) */
101 Aifs = 1<<27, /* interface fatal §6.1.2 */
102 Ainfs = 1<<26, /* interface error (recovered) */
103 Aofs = 1<<24, /* too many bytes from disk */
104 Aipms = 1<<23, /* incorrect prt mul status */
105 Aprcs = 1<<22, /* PhyRdy change status Pxserr.diag.n */
106 Adpms = 1<<7, /* mechanical presence status */
107 Apcs = 1<<6, /* port connect diag.x */
108 Adps = 1<<5, /* descriptor processed */
109 Aufs = 1<<4, /* unknown fis diag.f */
110 Asdbs = 1<<3, /* set device bits fis received w/ i bit set */
111 Adss = 1<<2, /* dma setup */
112 Apio = 1<<1, /* pio setup fis */
113 Adhrs = 1<<0, /* device to host register fis */
115 IEM = Acpds|Atfes|Ahbds|Ahbfs|Ahbds|Aifs|Ainfs|Aprcs|Apcs|Adps|
116 Aufs|Asdbs|Adss|Adhrs,
117 Ifatal = Ahbfs|Ahbds|Aifs,
122 SerrX = 1<<26, /* exchanged */
123 SerrF = 1<<25, /* unknown fis */
124 SerrT = 1<<24, /* transition error */
125 SerrS = 1<<23, /* link sequence */
126 SerrH = 1<<22, /* handshake */
127 SerrC = 1<<21, /* crc */
128 SerrD = 1<<20, /* not used by ahci */
129 SerrB = 1<<19, /* 10-tp-8 decode */
130 SerrW = 1<<18, /* comm wake */
131 SerrI = 1<<17, /* phy internal */
132 SerrN = 1<<16, /* phyrdy change */
134 ErrE = 1<<11, /* internal */
135 ErrP = 1<<10, /* ata protocol violation */
136 ErrC = 1<<9, /* communication */
137 ErrT = 1<<8, /* transient */
138 ErrM = 1<<1, /* recoverd comm */
139 ErrI = 1<<0, /* recovered data integrety */
141 ErrAll = ErrE|ErrP|ErrC|ErrT|ErrM|ErrI,
142 SerrAll = SerrX|SerrF|SerrT|SerrS|SerrH|SerrC|SerrD|SerrB|SerrW|
147 /* cmd register bits */
149 Aicc = 1<<28, /* interface communcations control. 4 bits */
150 Aasp = 1<<27, /* aggressive slumber & partial sleep */
151 Aalpe = 1<<26, /* aggressive link pm enable */
152 Adlae = 1<<25, /* drive led on atapi */
153 Aatapi = 1<<24, /* device is atapi */
154 Apste = 1<<23, /* automatic slumber to partial cap */
155 Afbsc = 1<<22, /* fis-based switching capable */
156 Aesp = 1<<21, /* external sata port */
157 Acpd = 1<<20, /* cold presence detect */
158 Ampsp = 1<<19, /* mechanical pres. */
159 Ahpcp = 1<<18, /* hot plug capable */
160 Apma = 1<<17, /* pm attached */
161 Acps = 1<<16, /* cold presence state */
162 Acr = 1<<15, /* cmdlist running */
163 Afr = 1<<14, /* fis running */
164 Ampss = 1<<13, /* mechanical presence switch state */
165 Accs = 1<<8, /* current command slot 12:08 */
166 Afre = 1<<4, /* fis enable receive */
167 Aclo = 1<<3, /* command list override */
168 Apod = 1<<2, /* power on dev (requires cold-pres. detect) */
169 Asud = 1<<1, /* spin-up device; requires ss capability */
170 Ast = 1<<0, /* start */
172 Arun = Ast|Acr|Afre|Afr,
176 /* ctl register bits */
178 Aipm = 1<<8, /* interface power mgmt. 3=off */
180 Adet = 1<<0, /* device detection */
183 /* sstatus register bits */
206 SImask = Smask | Imask,
207 SSmask = Smask | Isleepy,
217 ulong list; /* PxCLB must be 1kb aligned */
219 ulong fis; /* 256-byte aligned */
222 ulong ie; /* interrupt enable */
231 ulong ci; /* command issue */
238 /* in host's memory; not memory mapped */
249 Lprdtl = 1<<16, /* physical region descriptor table len */
250 Lpmp = 1<<12, /* port multiplier port */
251 Lclear = 1<<10, /* clear busy on R_OK */
254 Lpref = 1<<7, /* prefetchable */
257 Lcfl = 1<<0, /* command fis length in double words */
260 /* in hosts memory; memory mapped */
283 /* enclosure message header */
296 uchar hba; /* bits 0:4 are the port */