source: trunk/src/os2ahci/ahci.c@ 174

Last change on this file since 174 was 174, checked in by David Azarewicz, 12 years ago

Fix for hardware that reports incorrect status.
Now report both real and fake devices when SCSI emulation is enabled.

File size: 65.2 KB
Line 
1/******************************************************************************
2 * ahci.c - ahci hardware access functions
3 *
4 * Copyright (c) 2011 thi.guten Software Development
5 * Copyright (c) 2011 Mensys B.V.
6 * Copyright (c) 2013 David Azarewicz
7 *
8 * Authors: Christian Mueller, Markus Thielen
9 *
10 * Parts copied from/inspired by the Linux AHCI driver;
11 * those parts are (c) Linux AHCI/ATA maintainers
12 *
13 * This program is free software; you can redistribute it and/or modify
14 * it under the terms of the GNU General Public License as published by
15 * the Free Software Foundation; either version 2 of the License, or
16 * (at your option) any later version.
17 *
18 * This program is distributed in the hope that it will be useful,
19 * but WITHOUT ANY WARRANTY; without even the implied warranty of
20 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
21 * GNU General Public License for more details.
22 *
23 * You should have received a copy of the GNU General Public License
24 * along with this program; if not, write to the Free Software
25 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
26 */
27
28#include "os2ahci.h"
29#include "ata.h"
30#include "atapi.h"
31
32/* -------------------------- macros and constants ------------------------- */
33
34/* produce ata/atapi function pointer with the given func name */
35#define cmd_func(iorb, func) ad_infos[iorb_unit_adapter(iorb)]. \
36 ports[iorb_unit_port(iorb)]. \
37 devs[iorb_unit_device(iorb)].atapi \
38 ? atapi_##func : ata_##func
39
40
41/* ------------------------ typedefs and structures ------------------------ */
42
43/* -------------------------- function prototypes -------------------------- */
44
45static void ahci_setup_device (AD_INFO *ai, int p, int d, u16 *id_buf);
46
47/* ------------------------ global/static variables ------------------------ */
48
49/* Initial driver status flags indexed by the board_* constants in os2ahci.h
50 *
51 * NOTE: The Linux AHCI driver uses a combination of board-specific quirk
52 * flags and overriding certain libata service functions to handle
53 * adapter flaws. However, there were only three overrides at the time
54 * os2ahci was written, one for hard adapter resets and two for port
55 * resets, and we can easily implement those within the corresponding
56 * reset handlers. If this becomes more complex, this array of flags
57 * should be converted into a structure array which contains function
58 * pointers to all handler functions which may need to be overridden.
59 */
60u16 initial_flags[] = {
61 0, /* board_ahci */
62 AHCI_HFLAG_NO_NCQ | /* board_ahci_vt8251 */
63 AHCI_HFLAG_NO_PMP,
64 AHCI_HFLAG_IGN_IRQ_IF_ERR, /* board_ahci_ign_iferr */
65 AHCI_HFLAG_IGN_SERR_INTERNAL | /* board_ahci_sb600 */
66 AHCI_HFLAG_NO_MSI |
67 AHCI_HFLAG_SECT255 |
68 AHCI_HFLAG_32BIT_ONLY,
69 AHCI_HFLAG_NO_NCQ | /* board_ahci_mv */
70 AHCI_HFLAG_NO_MSI |
71 AHCI_HFLAG_MV_PATA |
72 AHCI_HFLAG_NO_PMP,
73 AHCI_HFLAG_IGN_SERR_INTERNAL, /* board_ahci_sb700 */
74 AHCI_HFLAG_YES_NCQ, /* board_ahci_mcp65 */
75 AHCI_HFLAG_NO_PMP, /* board_ahci_nopmp */
76 AHCI_HFLAG_YES_NCQ, /* board_ahci_yesncq */
77 AHCI_HFLAG_NO_SNTF, /* board_ahci_nosntf */
78};
79
80/* IRQ levels for stub interrupt handlers. OS/2 calls interrupt handlers
81 * without passing the IRQ level, yet it expects the interrupt handler to
82 * know the IRQ level for EOI processing. Thus we need multiple interrupt
83 * handlers, one for each IRQ, and some mapping from the interrupt handler
84 * index to the corresponding IRQ.
85 */
86static u16 irq_map[MAX_AD]; /* IRQ level for each stub IRQ func */
87static int irq_map_cnt; /* number of IRQ stub funcs used */
88
89/* ----------------------------- start of code ----------------------------- */
90
91/******************************************************************************
92 * Interrupt handlers. Those are stubs which call the real interrupt handler
93 * with the IRQ level as parameter. This mapping is required because OS/2
94 * calls interrupt handlers without any parameters, yet expects them to know
95 * which IRQ level to complete when calling DevHelp_EOI().
96 *
97 * This array of functions needs to be extended when increasing MAX_AD.
98 */
99#if MAX_AD > 8
100#error must extend irq_handler_xx and irq_handlers[] when increasing MAX_AD
101#endif
102
103/* Macro to call AHCI interrupt handler and set/clear carry flag accordingly.
104 * We need to set the carry flag if the interrupt was not handled. This is
105 * done by shifting the return value of ahci_intr() to the right, implying
106 * bit 0 will be set when the interrupt was not handled.
107 */
108#define call_ahci_intr(i) return(ahci_intr(irq_map[i]) >> 1)
109
110static USHORT _cdecl _far irq_handler_00(void) { call_ahci_intr(0); }
111static USHORT _cdecl _far irq_handler_01(void) { call_ahci_intr(1); }
112static USHORT _cdecl _far irq_handler_02(void) { call_ahci_intr(2); }
113static USHORT _cdecl _far irq_handler_03(void) { call_ahci_intr(3); }
114static USHORT _cdecl _far irq_handler_04(void) { call_ahci_intr(4); }
115static USHORT _cdecl _far irq_handler_05(void) { call_ahci_intr(5); }
116static USHORT _cdecl _far irq_handler_06(void) { call_ahci_intr(6); }
117static USHORT _cdecl _far irq_handler_07(void) { call_ahci_intr(7); }
118
119PFN irq_handlers[] = {
120 (PFN) irq_handler_00, (PFN) irq_handler_01, (PFN) irq_handler_02,
121 (PFN) irq_handler_03, (PFN) irq_handler_04, (PFN) irq_handler_05,
122 (PFN) irq_handler_06, (PFN) irq_handler_07
123};
124
125void ahci_dump_host_regs(AD_INFO *ai, int bios_regs)
126{
127 #ifdef DEBUG
128 int i;
129 u32 version;
130
131 aprintf("AHCI global registers for adapter %d %d:%d:%d irq=%d addr=0x%lx\n",
132 ad_no(ai), ai->bus, ai->dev_func>>3, ai->dev_func&7, ai->irq, ai->mmio_phys);
133
134 for (i = 0; i <= HOST_CAP2; i += sizeof(u32)) {
135 u32 val;
136
137 if (bios_regs) val = ai->bios_config[i/sizeof(u32)];
138 else
139 {
140 /* HOST_CAP2 only exists for AHCI V1.2 and later */
141 if ((i == HOST_CAP2) && (version < 0x00010200L)) val = 0;
142 else val = readl(ai->mmio + i);
143 }
144 if (i == HOST_VERSION) version = val;
145
146 ntprintf(" %02x: %08lx", i, val);
147
148 if (i == HOST_CAP) {
149 ntprintf(" -");
150 if (val & HOST_CAP_64) ntprintf(" 64bit");
151 if (val & HOST_CAP_NCQ) ntprintf(" ncq");
152 if (val & HOST_CAP_SNTF) ntprintf(" sntf");
153 if (val & HOST_CAP_MPS) ntprintf(" mps");
154 if (val & HOST_CAP_SSS) ntprintf(" sss");
155 if (val & HOST_CAP_ALPM) ntprintf(" alpm");
156 if (val & HOST_CAP_LED) ntprintf(" led");
157 if (val & HOST_CAP_CLO) ntprintf(" clo");
158 if (val & HOST_CAP_ONLY) ntprintf(" ahci_only");
159 if (val & HOST_CAP_PMP) ntprintf(" pmp");
160 if (val & HOST_CAP_FBS) ntprintf(" fbs");
161 if (val & HOST_CAP_PIO_MULTI) ntprintf(" pio_multi");
162 if (val & HOST_CAP_SSC) ntprintf(" ssc");
163 if (val & HOST_CAP_PART) ntprintf(" part");
164 if (val & HOST_CAP_CCC) ntprintf(" ccc");
165 if (val & HOST_CAP_EMS) ntprintf(" ems");
166 if (val & HOST_CAP_SXS) ntprintf(" sxs");
167 ntprintf(" cmd_slots:%d", (u16) ((val >> 8) & 0x1f) + 1);
168 ntprintf(" ports:%d", (u16) (val & 0x1f) + 1);
169 } else if (i == HOST_CTL) {
170 ntprintf(" -");
171 if (val & HOST_AHCI_EN) ntprintf(" ahci_enabled");
172 if (val & HOST_IRQ_EN) ntprintf(" irq_enabled");
173 if (val & HOST_RESET) ntprintf(" resetting");
174 } else if (i == HOST_CAP2) {
175 ntprintf(" -");
176 if (val & HOST_CAP2_BOH) ntprintf(" boh");
177 if (val & HOST_CAP2_NVMHCI) ntprintf(" nvmhci");
178 if (val & HOST_CAP2_APST) ntprintf(" apst");
179 }
180 ntprintf("\n");
181 }
182 #endif
183}
184
185void ahci_dump_port_regs(AD_INFO *ai, int p)
186{
187 #ifdef DEBUG
188 u8 _far *port_mmio = port_base(ai, p);
189
190 aprintf("AHCI port %d registers:\n", p);
191 ntprintf(" PORT_CMD = 0x%lx\n", readl(port_mmio + PORT_CMD));
192 ntprintf("command engine status:\n");
193 ntprintf(" PORT_SCR_ACT = 0x%lx\n", readl(port_mmio + PORT_SCR_ACT));
194 ntprintf(" PORT_CMD_ISSUE = 0x%lx\n", readl(port_mmio + PORT_CMD_ISSUE));
195 ntprintf("link/device status:\n");
196 ntprintf(" PORT_SCR_STAT = 0x%lx\n", readl(port_mmio + PORT_SCR_STAT));
197 ntprintf(" PORT_SCR_CTL = 0x%lx\n", readl(port_mmio + PORT_SCR_CTL));
198 ntprintf(" PORT_SCR_ERR = 0x%lx\n", readl(port_mmio + PORT_SCR_ERR));
199 ntprintf(" PORT_TFDATA = 0x%lx\n", readl(port_mmio + PORT_TFDATA));
200 ntprintf("interrupt status:\n");
201 ntprintf(" PORT_IRQ_STAT = 0x%lx\n", readl(port_mmio + PORT_IRQ_STAT));
202 ntprintf(" PORT_IRQ_MASK = 0x%lx\n", readl(port_mmio + PORT_IRQ_MASK));
203 ntprintf(" HOST_IRQ_STAT = 0x%lx\n", readl(ai->mmio + HOST_IRQ_STAT));
204 #endif
205}
206
207/******************************************************************************
208 * Save BIOS configuration of AHCI adapter. As a side effect, this also saves
209 * generic configuration information which we may have to restore after an
210 * adapter reset.
211 *
212 * NOTE: This function also saves working copies of the CAP and CAP2 registers
213 * as well as the initial port map in the AD_INFO structure after
214 * removing features which are known to cause trouble on this specific
215 * piece of hardware.
216 */
217int ahci_save_bios_config(AD_INFO *ai)
218{
219 int ports;
220 int i;
221
222 /* save BIOS configuration */
223 for (i = 0; i < HOST_CAP2; i += sizeof(u32)) {
224 ai->bios_config[i / sizeof(u32)] = readl(ai->mmio + i);
225 }
226
227 ddprintf("ahci_save_bios_config: BIOS AHCI mode is %d\n", ai->bios_config[HOST_CTL / sizeof(u32)] & HOST_AHCI_EN);
228
229 /* HOST_CAP2 only exists for AHCI V1.2 and later */
230 if (ai->bios_config[HOST_VERSION / sizeof(u32)] >= 0x00010200L) {
231 ai->bios_config[HOST_CAP2 / sizeof(u32)] = readl(ai->mmio + HOST_CAP2);
232 } else {
233 ai->bios_config[HOST_CAP2 / sizeof(u32)] = 0;
234 }
235
236 if ((ai->bios_config[HOST_CTL / sizeof(u32)] & HOST_AHCI_EN) == 0 &&
237 ai->pci_vendor == PCI_VENDOR_ID_INTEL) {
238 /* Adapter is not in AHCI mode and the spec says a COMRESET is
239 * required when switching from SATA to AHCI mode and vice versa.
240 */
241 init_reset = 1;
242 }
243
244 #ifdef DEBUG
245 /* print AHCI register debug information */
246 if (debug) ahci_dump_host_regs(ai, 1);
247 #endif
248
249 /* Save working copies of CAP, CAP2 and port_map and remove broken feature
250 * bits. This is largely copied from the Linux AHCI driver -- the wisdom
251 * around quirks and faulty hardware is hard to come by...
252 */
253 ai->cap = ai->bios_config[HOST_CAP / sizeof(u32)];
254 ai->cap2 = ai->bios_config[HOST_CAP2 / sizeof(u32)];
255 ai->port_map = ai->bios_config[HOST_PORTS_IMPL / sizeof(u32)];
256
257 if (ai->pci->board >= sizeof(initial_flags) / sizeof(*initial_flags)) {
258 dprintf("error: invalid board index in PCI info\n");
259 return(-1);
260 }
261 ai->flags = initial_flags[ai->pci->board];
262 ai->hw_ports = (ai->cap & 0x1f) + 1;
263
264 if ((ai->cap & HOST_CAP_64) && (ai->flags & AHCI_HFLAG_32BIT_ONLY)) {
265 /* disable 64-bit support for faulty controllers; OS/2 can't do 64 bits at
266 * this point, of course, but who knows where all this will be in a few
267 * years...
268 */
269 ai->cap &= ~HOST_CAP_64;
270 }
271
272 if ((ai->cap & HOST_CAP_NCQ) && (ai->flags & AHCI_HFLAG_NO_NCQ)) {
273 dprintf("controller can't do NCQ, turning off CAP_NCQ\n");
274 ai->cap &= ~HOST_CAP_NCQ;
275 }
276
277 if (!(ai->cap & HOST_CAP_NCQ) && (ai->flags & AHCI_HFLAG_YES_NCQ)) {
278 dprintf("controller can do NCQ, turning on CAP_NCQ\n");
279 ai->cap |= HOST_CAP_NCQ;
280 }
281
282 if ((ai->cap & HOST_CAP_PMP) && (ai->flags & AHCI_HFLAG_NO_PMP)) {
283 dprintf("controller can't do PMP, turning off CAP_PMP\n");
284 ai->cap |= HOST_CAP_PMP;
285 }
286
287 if ((ai->cap & HOST_CAP_SNTF) && (ai->flags & AHCI_HFLAG_NO_SNTF)) {
288 dprintf("controller can't do SNTF, turning off CAP_SNTF\n");
289 ai->cap &= ~HOST_CAP_SNTF;
290 }
291
292 if (ai->pci_vendor == PCI_VENDOR_ID_JMICRON &&
293 ai->pci_device == 0x2361 && ai->port_map != 1) {
294 dprintf("JMB361 has only one port, port_map 0x%lx -> 0x%lx\n", ai->port_map, 1);
295 ai->port_map = 1;
296 ai->hw_ports = 1;
297 }
298
299 /* Correlate port map to number of ports reported in HOST_CAP
300 *
301 * NOTE: Port map and number of ports handling differs a bit from the
302 * Linux AHCI driver because we're storing both in AI_INFO. As in the
303 * Linux driver, the port map is the main driver for port scanning but
304 * we're also saving a maximum port number in AI_INFO to reduce the
305 * number of IORB queues to look at in trigger_engine(). This is done
306 * in ahci_scan_ports().
307 */
308 ports = ai->hw_ports;
309 for (i = 0; i < AHCI_MAX_PORTS; i++) {
310 if (ai->port_map & (1UL << i)) {
311 ports--;
312 }
313 }
314 if (ports < 0) {
315 /* more ports in port_map than in HOST_CAP & 0x1f */
316 ports = ai->hw_ports;
317 dprintf("implemented port map (0x%lx) contains more ports than nr_ports (%d), using nr_ports\n", ai->port_map, ports);
318 ai->port_map = (1UL << ports) - 1UL;
319 }
320
321 /* set maximum command slot number */
322 ai->cmd_max = (u16) ((ai->cap >> 8) & 0x1f);
323
324 return(0);
325}
326
327/******************************************************************************
328 * Restore BIOS configuration of AHCI adapter. This is needed after scanning
329 * for devices because we still need the BIOS until the initial boot sequence
330 * has completed.
331 */
332int ahci_restore_bios_config(AD_INFO *ai)
333{
334 ddprintf("ahci_restore_bios_config: restoring AHCI BIOS configuration on adapter %d\n", ad_no(ai));
335
336 /* Restore saved BIOS configuration; please note that HOST_CTL is restored
337 * last because it may cause AHCI mode to be turned off again.
338 */
339 writel(ai->mmio + HOST_CCC, ai->bios_config[HOST_CCC / sizeof(u32)]);
340 writel(ai->mmio + HOST_CCC_PORTS, ai->bios_config[HOST_CCC_PORTS / sizeof(u32)]);
341 writel(ai->mmio + HOST_EM_CTL, ai->bios_config[HOST_EM_CTL / sizeof(u32)]);
342 writel(ai->mmio + HOST_CTL, ai->bios_config[HOST_CTL / sizeof(u32)]);
343
344 /* flush PCI MMIO delayed write buffers */
345 readl(ai->mmio + HOST_CTL);
346
347 if ((ai->bios_config[HOST_CTL / sizeof(u32)] & HOST_AHCI_EN) == 0 && ai->pci_vendor == PCI_VENDOR_ID_INTEL) {
348
349 /* This BIOS apparently accesses the controller via SATA registers and
350 * the AHCI spec says that we should issue a COMRESET on each port after
351 * disabling AHCI mode to allow the SATA controller to re-recognize attached
352 * devices. How to do this depends on the controller, of course, but so
353 * far I've only seen Dell notebook BIOSs with Intel chipsets to behave
354 * like this; all other BIOS implementations I've seen so far seem to take
355 * AHCI mode literally and operate the controller in AHCI mode from the
356 * beginning.
357 *
358 * We'll use a feature on Intel ICH7/8 controllers which provides MMIO
359 * mappings for the AHCI SCR registers even when not in AHCI mode.
360 */
361 int p;
362
363 for (p = 0; p < AHCI_MAX_PORTS; p++) {
364 if (ai->port_map & (1UL << p)) {
365 u8 _far *port_mmio = port_base(ai, p);
366 u32 tmp;
367
368 tmp = readl(port_mmio + PORT_SCR_CTL) & ~0x0000000fUL;
369 writel(port_mmio + PORT_SCR_CTL, tmp | 1);
370 readl(port_mmio + PORT_SCR_CTL); /* flush */
371
372 /* spec says "leave reset bit on for at least 1ms"; make it 2ms */
373 udelay(2000);
374
375 writel(port_mmio + PORT_SCR_CTL, tmp);
376 readl(port_mmio + PORT_SCR_CTL); /* flush */
377 }
378 }
379 }
380
381 return(0);
382}
383
384/******************************************************************************
385 * Restore initial configuration (e.g. after an adapter reset). This relies
386 * on information saved by 'ahci_save_bios_config()'.
387 */
388int ahci_restore_initial_config(AD_INFO *ai)
389{
390 ddprintf("ahci_restore_initial_config: restoring initial configuration on adapter %d\n", ad_no(ai));
391
392 /* restore saved BIOS configuration */
393 //writel(ai->mmio + HOST_CCC, ai->bios_config[HOST_CCC / sizeof(u32)]);
394 //writel(ai->mmio + HOST_CCC_PORTS, ai->bios_config[HOST_CCC_PORTS / sizeof(u32)]);
395 //writel(ai->mmio + HOST_EM_CTL, ai->bios_config[HOST_EM_CTL / sizeof(u32)]);
396 //writel(ai->mmio + HOST_CTL, ai->bios_config[HOST_CTL / sizeof(u32)]);
397
398 writel(ai->mmio + HOST_CAP, ai->bios_config[HOST_CAP / sizeof(u32)]);
399 if (ai->bios_config[HOST_CAP2 / sizeof(u32)])
400 writel(ai->mmio + HOST_CAP2, ai->bios_config[HOST_CAP2 / sizeof(u32)]);
401 writel(ai->mmio + HOST_PORTS_IMPL, ai->bios_config[HOST_PORTS_IMPL / sizeof(u32)]);
402
403 /* flush PCI MMIO delayed write buffers */
404 readl(ai->mmio + HOST_PORTS_IMPL);
405
406 return(0);
407}
408
409#ifdef NOT_USED
410int ahci_reset_controller(AD_INFO *ai)
411{
412 u32 tmp;
413 TIMER Timer;
414
415 dprintf("controller reset starting on adapter %d\n", ad_no(ai));
416
417 /* we must be in AHCI mode, before using anything AHCI-specific, such as HOST_RESET. */
418 ahci_enable_ahci(ai);
419
420 /* global controller reset */
421 tmp = readl(ai->mmio + HOST_CTL);
422 if ((tmp & HOST_RESET) == 0) {
423 writel(ai->mmio + HOST_CTL, tmp | HOST_RESET);
424 readl(ai->mmio + HOST_CTL); /* flush */
425 }
426
427 /*
428 * to perform host reset, OS should set HOST_RESET
429 * and poll until this bit is read to be "0".
430 * reset must complete within 1 second, or
431 * the hardware should be considered fried.
432 */
433 timer_init(&Timer, 1000);
434 while (((tmp = readl(ai->mmio + HOST_CTL)) & HOST_RESET) != 0) {
435 if (timer_check_and_block(&Timer)) {
436 dprintf("controller reset failed (0x%lx)\n", tmp);
437 return(-1);
438 }
439 }
440
441 /* turn on AHCI mode */
442 ahci_enable_ahci(ai);
443
444 /* Some registers might be cleared on reset. Restore initial values. */
445 ahci_restore_initial_config(ai);
446
447 if (ai->pci_vendor == PCI_VENDOR_ID_INTEL) {
448 u32 tmp16 = 0;
449
450 ddprintf("ahci_reset_controller: intel detected\n");
451 /* configure PCS */
452 pci_read_conf(ai->bus, ai->dev_func, 0x92, sizeof(u16), &tmp16);
453 if ((tmp16 & ai->port_map) != ai->port_map) {
454 ddprintf("ahci_reset_controller: updating PCS %x/%x\n", (u16)tmp16, ai->port_map);
455 tmp16 |= ai->port_map;
456 pci_write_conf(ai->bus, ai->dev_func, 0x92, sizeof(u16), tmp16);
457 }
458 }
459
460 return 0;
461}
462#endif
463
464/******************************************************************************
465 * Save port configuration. This is primarily used to save the BIOS port
466 * configuration (command list and FIS buffers and the IRQ mask).
467 *
468 * The port configuration returned by this function is dynamically allocated
469 * and automatically freed when calling ahci_restore_port_config().
470 */
471AHCI_PORT_CFG *ahci_save_port_config(AD_INFO *ai, int p)
472{
473 AHCI_PORT_CFG *pc;
474 u8 _far *port_mmio = port_base(ai, p);
475
476 if ((pc = malloc(sizeof(*pc))) == NULL) {
477 return(NULL);
478 }
479
480 pc->cmd_list = readl(port_mmio + PORT_LST_ADDR);
481 pc->cmd_list_h = readl(port_mmio + PORT_LST_ADDR_HI);
482 pc->fis_rx = readl(port_mmio + PORT_FIS_ADDR);
483 pc->fis_rx_h = readl(port_mmio + PORT_FIS_ADDR_HI);
484 pc->irq_mask = readl(port_mmio + PORT_IRQ_MASK);
485 pc->port_cmd = readl(port_mmio + PORT_CMD);
486
487 return(pc);
488}
489
490/******************************************************************************
491 * Restore port configuration. This is primarily used to restore the BIOS port
492 * configuration (command list and FIS buffers and the IRQ mask).
493 *
494 * The port configuration is automatically freed.
495 */
496void ahci_restore_port_config(AD_INFO *ai, int p, AHCI_PORT_CFG *pc)
497{
498 u8 _far *port_mmio = port_base(ai, p);
499
500 /* stop the port, first */
501 ahci_stop_port(ai, p);
502
503 if (ai->bios_config[HOST_CTL / sizeof(u32)] & HOST_AHCI_EN) {
504 /* BIOS uses AHCI, too, so we need to restore the port settings;
505 * restoring PORT_CMD may well start the port again but that's what
506 * this function is all about.
507 */
508 writel(port_mmio + PORT_LST_ADDR, pc->cmd_list);
509 writel(port_mmio + PORT_LST_ADDR_HI, pc->cmd_list_h);
510 writel(port_mmio + PORT_FIS_ADDR, pc->fis_rx);
511 writel(port_mmio + PORT_FIS_ADDR_HI, pc->fis_rx_h);
512 writel(port_mmio + PORT_IRQ_MASK, pc->irq_mask);
513 writel(port_mmio + PORT_CMD, pc->port_cmd);
514
515 readl(port_base(ai, p) + PORT_IRQ_MASK); /* flush */
516 }
517
518 free(pc);
519}
520
521/******************************************************************************
522 * Enable AHCI mode on this controller.
523 */
524int ahci_enable_ahci(AD_INFO *ai)
525{
526 u32 ctl = readl(ai->mmio + HOST_CTL);
527 int i;
528
529 if (ctl & HOST_AHCI_EN) {
530 /* AHCI mode already enabled */
531 return(0);
532 }
533
534 /* some controllers need AHCI_EN to be written multiple times */
535 for (i = 0; i < 5; i++) {
536 ctl |= HOST_AHCI_EN;
537 writel(ai->mmio + HOST_CTL, ctl);
538 ctl = readl(ai->mmio + HOST_CTL); /* flush && sanity check */
539 if (ctl & HOST_AHCI_EN) {
540 return(0);
541 }
542 msleep(10);
543 }
544
545 /* couldn't enable AHCI mode */
546 dprintf("failed to enable AHCI mode on adapter %d\n", ad_no(ai));
547 return(1);
548}
549
550/******************************************************************************
551 * Scan all ports for connected devices and fill in the corresponding device
552 * information.
553 *
554 * NOTES:
555 *
556 * - The adapter is temporarily configured for os2ahci but the original BIOS
557 * configuration will be restored when done. This happens only until we
558 * have received the IOCC_COMPLETE_INIT command.
559 *
560 * - Subsequent calls are currently not planned but may be required for
561 * suspend/resume handling, hot swap functionality, etc.
562 *
563 * - This function is expected to be called with the spinlock released but
564 * the corresponding adapter's busy flag set. It will aquire the spinlock
565 * temporarily to allocate/free memory for the ATA identify buffer.
566 */
567int ahci_scan_ports(AD_INFO *ai)
568{
569 AHCI_PORT_CFG *pc = NULL;
570 u16 *id_buf;
571 int is_ata;
572 int rc;
573 int p;
574 int i;
575 TIMER Timer;
576
577 if ((id_buf = malloc(ATA_ID_WORDS * sizeof(u16))) == NULL) {
578 return(-1);
579 }
580
581 if (ai->bios_config[0] == 0) {
582 /* first call */
583 ahci_save_bios_config(ai);
584 }
585
586 if (ahci_enable_ahci(ai)) {
587 goto exit_port_scan;
588 }
589
590 /* perform port scan */
591 dprintf("ahci_scan_ports: scanning ports on adapter %d\n", ad_no(ai));
592 for (p = 0; p < AHCI_MAX_PORTS; p++) {
593 if (!(ai->port_map & (1UL << p))) continue;
594 if (port_ignore[ad_no(ai)][p]) continue;
595
596 ddprintf("ahci_scan_ports: Wait till not busy on port %d\n", p);
597 /* wait until all active commands have completed on this port */
598 timer_init(&Timer, 250);
599 while (ahci_port_busy(ai, p)) {
600 if (timer_check_and_block(&Timer)) break;
601 }
602
603 if (!init_complete) {
604 if ((pc = ahci_save_port_config(ai, p)) == NULL) {
605 goto exit_port_scan;
606 }
607 }
608
609 /* start/reset port; if no device is attached, this is expected to fail */
610 if (init_reset) {
611 rc = ahci_reset_port(ai, p, 0);
612 } else {
613 ddprintf("ahci_scan_ports: (re)starting port %d\n", p);
614 ahci_stop_port(ai, p);
615 rc = ahci_start_port(ai, p, 0);
616 }
617 if (rc) {
618 /* no device attached to this port */
619 ai->port_map &= ~(1UL << p);
620 goto restore_port_config;
621 }
622
623 /* this port seems to have a device attached and ready for commands */
624 ddprintf("ahci_scan_ports: port %d seems to be attached to a device; probing...\n", p);
625
626 /* Get ATA(PI) identity. The so-called signature gives us a hint whether
627 * this is an ATA or an ATAPI device but we'll try both in either case;
628 * the signature will merely determine whether we're going to probe for
629 * an ATA or ATAPI device, first, in order to reduce the chance of sending
630 * the wrong command (which would result in a port reset given the way
631 * ahci_exec_polled_cmd() was implemented).
632 */
633 is_ata = readl(port_base(ai, p) + PORT_SIG) == 0x00000101UL;
634 for (i = 0; i < 2; i++) {
635 rc = ahci_exec_polled_cmd(ai, p, 0, 500,
636 (is_ata) ? ATA_CMD_ID_ATA : ATA_CMD_ID_ATAPI,
637 AP_VADDR, (void _far *) id_buf, 512,
638 AP_END);
639 if (rc == 0) {
640 break;
641 }
642
643 /* try again with ATA/ATAPI swapped */
644 is_ata = !is_ata;
645 }
646
647 if (rc == 0) {
648 /* we have a valid IDENTIFY or IDENTIFY_PACKET response */
649 ddphex(id_buf, 512, "ATA_IDENTIFY%s results:\n", (is_ata) ? "" : "_PACKET");
650 ahci_setup_device(ai, p, 0, id_buf);
651 } else {
652 /* no device attached to this port */
653 ai->port_map &= ~(1UL << p);
654 }
655
656 restore_port_config:
657 if (pc != NULL) {
658 ahci_restore_port_config(ai, p, pc);
659 }
660 }
661
662exit_port_scan:
663 if (!init_complete) {
664 ahci_restore_bios_config(ai);
665 }
666 free(id_buf);
667 return(0);
668}
669
670/******************************************************************************
671 * Complete initialization of adapter. This includes restarting all active
672 * ports and initializing interrupt processing. This is called when receiving
673 * the IOCM_COMPLETE_INIT request.
674 */
675int ahci_complete_init(AD_INFO *ai)
676{
677 int rc;
678 int p;
679 int i;
680
681 dprintf("ahci_complete_init: completing initialization of adapter #%d\n", ad_no(ai));
682
683 /* register IRQ handlers; each IRQ level is registered only once */
684 for (i = 0; i < irq_map_cnt; i++) {
685 if (irq_map[i] == ai->irq) {
686 /* we already have this IRQ registered */
687 break;
688 }
689 }
690 if (i >= irq_map_cnt) {
691 dprintf("registering interrupt #%d\n", ai->irq);
692 if (DevHelp_SetIRQ(mk_NPFN(irq_handlers[irq_map_cnt]), ai->irq, 1) != 0) {
693 dprintf("failed to register shared interrupt\n");
694 if (DevHelp_SetIRQ(mk_NPFN(irq_handlers[irq_map_cnt]), ai->irq, 0) != 0) {
695 dprintf("failed to register exclusive interrupt\n");
696 return(-1);
697 }
698 }
699 irq_map[irq_map_cnt++] = ai->irq;
700 }
701
702 /* enable AHCI mode */
703 if ((rc = ahci_enable_ahci(ai)) != 0) {
704 return(rc);
705 }
706
707 /* Start all ports. The main purpose is to set the command list and FIS
708 * receive area addresses properly and to enable port-level interrupts; we
709 * don't really care about the return status because we'll find out soon
710 * enough if a previously detected device has problems.
711 */
712 for (p = 0; p < AHCI_MAX_PORTS; p++) {
713 if (ai->port_map & (1UL << p)) {
714 if (init_reset) {
715 ddprintf("ahci_complete_init: resetting port %d\n", p);
716 ahci_reset_port(ai, p, 1);
717 } else {
718 ddprintf("ahci_complete_init: restarting port #%d\n", p);
719 ahci_stop_port(ai, p);
720 ahci_start_port(ai, p, 1);
721 }
722 }
723 }
724
725 /* clear pending interrupt status */
726 writel(ai->mmio + HOST_IRQ_STAT, readl(ai->mmio + HOST_IRQ_STAT));
727 readl(ai->mmio + HOST_IRQ_STAT); /* flush */
728
729 /* enable adapter-level interrupts */
730 writel(ai->mmio + HOST_CTL, readl(ai->mmio + HOST_CTL) | HOST_IRQ_EN);
731 readl(ai->mmio + HOST_CTL); /* flush */
732
733 /* enable interrupts on PCI-level (PCI 2.3 added a feature to disable INTs) */
734 /* pci_enable_int(ai->bus, ai->dev_func); */
735
736 return(0);
737}
738
739/******************************************************************************
740 * Reset specified port. This function is typically called during adapter
741 * initialization and first gets the port into a defined status, then resets
742 * the port by sending a COMRESET signal.
743 *
744 * This function is also the location of the link speed initialization (link
745 * needs to be restablished after changing link speed, anyway).
746 *
747 * NOTE: This function uses a busy loop to wait for DMA engines to stop and
748 * the COMRESET to complete. It should only be called at task time
749 * during initialization or in a context hook.
750 */
751int ahci_reset_port(AD_INFO *ai, int p, int ei)
752{
753 u8 _far *port_mmio = port_base(ai, p);
754 u32 tmp;
755 TIMER Timer;
756
757 dprintf("ahci_reset_port: resetting port %d.%d\n", ad_no(ai), p);
758 if (debug > 1) ahci_dump_port_regs(ai, p);
759
760 /* stop port engines (we don't care whether there is an error doing so) */
761 ahci_stop_port(ai, p);
762
763 /* clear SError */
764 tmp = readl(port_mmio + PORT_SCR_ERR);
765 writel(port_mmio + PORT_SCR_ERR, tmp);
766
767 /* Some hardware reports incorrect status so just set these bits unconditionally */
768 tmp = readl(port_mmio + PORT_CMD);
769 tmp &= ~PORT_CMD_ALPE; /* turn off agressive power management */
770 tmp |= (PORT_CMD_SPIN_UP | PORT_CMD_POWER_ON); /* power up and spin up the drive */
771 writel(port_mmio + PORT_CMD, tmp);
772
773 /* set link speed and power management options */
774 ddprintf("ahci_reset_port: setting link speed and power management options\n");
775 tmp = readl(port_mmio + PORT_SCR_CTL) & ~0x00000fffUL;
776 tmp |= ((u32) link_speed[ad_no(ai)][p] & 0x0f) << 4;
777 tmp |= ((u32) link_power[ad_no(ai)][p] & 0x0f) << 8;
778 writel(port_mmio + PORT_SCR_CTL, tmp);
779
780 /* issue COMRESET on the port */
781 ddprintf("ahci_reset_port: issuing COMRESET on port %d\n", p);
782 writel(port_mmio + PORT_SCR_CTL, tmp | 1);
783 readl(port_mmio + PORT_SCR_CTL); /* flush */
784
785 /* spec says "leave reset bit on for at least 1ms"; make it 2ms */
786 udelay(2000);
787
788 writel(port_mmio + PORT_SCR_CTL, tmp);
789 readl(port_mmio + PORT_SCR_CTL); /* flush */
790
791 /* wait for communication to be re-established after port reset */
792 dprintf("Wait for communication...\n");
793 timer_init(&Timer, 500);
794 while (((tmp = readl(port_mmio + PORT_SCR_STAT)) & 3) != 3) {
795 if (timer_check_and_block(&Timer)) {
796 dprintf("no device present after resetting port #%d (PORT_SCR_STAT = 0x%lx)\n", p, tmp);
797 return(-1);
798 }
799 }
800
801 /* clear SError again (recommended by AHCI spec) */
802 tmp = readl(port_mmio + PORT_SCR_ERR);
803 writel(port_mmio + PORT_SCR_ERR, tmp);
804
805 /* start port so we can receive the COMRESET FIS */
806 dprintf("ahci_reset_port: starting port %d again\n", p);
807 ahci_start_port(ai, p, ei);
808
809 /* wait for device to be ready ((PxTFD & (BSY | DRQ | ERR)) == 0) */
810 timer_init(&Timer, 1000);
811 while (((tmp = readl(port_mmio + PORT_TFDATA)) & 0x89) != 0) {
812 if (timer_check_and_block(&Timer)) {
813 dprintf("device not ready on port #%d (PORT_TFDATA = 0x%lx)\n", p, tmp);
814 ahci_stop_port(ai, p);
815 return(-1);
816 }
817 }
818 ddprintf("ahci_reset_port: PORT_TFDATA = 0x%lx\n", readl(port_mmio + PORT_TFDATA));
819
820 return(0);
821}
822
823/******************************************************************************
824 * Start specified port.
825 */
826int ahci_start_port(AD_INFO *ai, int p, int ei)
827{
828 u8 _far *port_mmio = port_base(ai, p);
829 u32 status;
830
831 ddprintf("ahci_start_port %d.%d\n", ad_no(ai), p);
832 /* check whether device presence is detected and link established */
833
834 status = readl(port_mmio + PORT_SCR_STAT);
835 ddprintf("ahci_start_port: PORT_SCR_STAT = 0x%lx\n", status);
836 if ((status & 0xf) != 3) {
837 return(-1);
838 }
839
840 /* clear SError, if any */
841 status = readl(port_mmio + PORT_SCR_ERR);
842 ddprintf("ahci_start_port: PORT_SCR_ERR = 0x%lx\n", status);
843 writel(port_mmio + PORT_SCR_ERR, status);
844
845 /* enable FIS reception */
846 ahci_start_fis_rx(ai, p);
847
848 /* enable command engine */
849 ahci_start_engine(ai, p);
850
851 if (ei) {
852 /* clear any pending interrupts on this port */
853 if ((status = readl(port_mmio + PORT_IRQ_STAT)) != 0) {
854 writel(port_mmio + PORT_IRQ_STAT, status);
855 }
856
857 /* enable port interrupts */
858 writel(port_mmio + PORT_IRQ_MASK, PORT_IRQ_TF_ERR |
859 PORT_IRQ_HBUS_ERR |
860 PORT_IRQ_HBUS_DATA_ERR |
861 PORT_IRQ_IF_ERR |
862 PORT_IRQ_OVERFLOW |
863 PORT_IRQ_BAD_PMP |
864 PORT_IRQ_UNK_FIS |
865 PORT_IRQ_SDB_FIS |
866 PORT_IRQ_DMAS_FIS |
867 PORT_IRQ_PIOS_FIS |
868 PORT_IRQ_D2H_REG_FIS);
869 } else {
870 writel(port_mmio + PORT_IRQ_MASK, 0);
871 }
872 readl(port_mmio + PORT_IRQ_MASK); /* flush */
873
874 return(0);
875}
876
877/******************************************************************************
878 * Start port FIS reception. Copied from Linux AHCI driver and adopted to
879 * OS2AHCI.
880 */
881void ahci_start_fis_rx(AD_INFO *ai, int p)
882{
883 u8 _far *port_mmio = port_base(ai, p);
884 u32 port_dma = port_dma_base_phys(ai, p);
885 u32 tmp;
886
887 /* set command header and FIS address registers */
888 writel(port_mmio + PORT_LST_ADDR, port_dma + offsetof(AHCI_PORT_DMA, cmd_hdr));
889 writel(port_mmio + PORT_LST_ADDR_HI, 0);
890 writel(port_mmio + PORT_FIS_ADDR, port_dma + offsetof(AHCI_PORT_DMA, rx_fis));
891 writel(port_mmio + PORT_FIS_ADDR_HI, 0);
892
893 /* enable FIS reception */
894 tmp = readl(port_mmio + PORT_CMD);
895 tmp |= PORT_CMD_FIS_RX;
896 writel(port_mmio + PORT_CMD, tmp);
897
898 /* flush */
899 readl(port_mmio + PORT_CMD);
900}
901
902/******************************************************************************
903 * Start port HW engine. Copied from Linux AHCI driver and adopted to OS2AHCI.
904 */
905void ahci_start_engine(AD_INFO *ai, int p)
906{
907 u8 _far *port_mmio = port_base(ai, p);
908 u32 tmp;
909
910 /* start DMA */
911 tmp = readl(port_mmio + PORT_CMD);
912 tmp |= PORT_CMD_START;
913 writel(port_mmio + PORT_CMD, tmp);
914 readl(port_mmio + PORT_CMD); /* flush */
915}
916
917/******************************************************************************
918 * Stop specified port
919 */
920int ahci_stop_port(AD_INFO *ai, int p)
921{
922 u8 _far *port_mmio = port_base(ai, p);
923 u32 tmp;
924 int rc;
925
926 ddprintf("ahci_stop_port %d.%d\n", ad_no(ai), p);
927
928 /* disable port interrupts */
929 writel(port_mmio + PORT_IRQ_MASK, 0);
930
931 /* disable FIS reception */
932 if ((rc = ahci_stop_fis_rx(ai, p)) != 0) {
933 dprintf("error: failed to stop FIS receive (%d)\n", rc);
934 return(rc);
935 }
936
937 /* disable command engine */
938 if ((rc = ahci_stop_engine(ai, p)) != 0) {
939 dprintf("error: failed to stop port HW engine (%d)\n", rc);
940 return(rc);
941 }
942
943 /* clear any pending port IRQs */
944 tmp = readl(port_mmio + PORT_IRQ_STAT);
945 if (tmp) {
946 writel(port_mmio + PORT_IRQ_STAT, tmp);
947 }
948 writel(ai->mmio + HOST_IRQ_STAT, 1UL << p);
949
950 /* reset PxSACT register (tagged command queues, not reset by COMRESET) */
951 writel(port_mmio + PORT_SCR_ACT, 0);
952 readl(port_mmio + PORT_SCR_ACT); /* flush */
953
954 return(0);
955}
956
957/******************************************************************************
958 * Stop port FIS reception. Copied from Linux AHCI driver and adopted to
959 * OS2AHCI.
960 *
961 * NOTE: This function uses a busy loop to wait for the DMA engine to stop. It
962 * should only be called at task time during initialization or in a
963 * context hook (e.g. when resetting a port).
964 */
965int ahci_stop_fis_rx(AD_INFO *ai, int p)
966{
967 u8 _far *port_mmio = port_base(ai, p);
968 TIMER Timer;
969 u32 tmp;
970 int status;
971
972 /* disable FIS reception */
973 tmp = readl(port_mmio + PORT_CMD);
974 tmp &= ~PORT_CMD_FIS_RX;
975 writel(port_mmio + PORT_CMD, tmp);
976
977 /* wait for completion, spec says 500ms, give it 1000ms */
978 status = 0;
979 timer_init(&Timer, 1000);
980 while (readl(port_mmio + PORT_CMD) & PORT_CMD_FIS_ON) {
981 status = timer_check_and_block(&Timer);
982 if (status) break;
983 }
984
985 return(status ? -1 : 0);
986}
987
988/******************************************************************************
989 * Stop port HW engine. Copied from Linux AHCI driver and adopted to OS2AHCI.
990 *
991 * NOTE: This function uses a busy loop to wait for the DMA engine to stop. It
992 * should only be called at task time during initialization or in a
993 * context hook (e.g. when resetting a port).
994 */
995int ahci_stop_engine(AD_INFO *ai, int p)
996{
997 u8 _far *port_mmio = port_base(ai, p);
998 TIMER Timer;
999 int status;
1000 u32 tmp;
1001
1002 tmp = readl(port_mmio + PORT_CMD);
1003
1004 /* check if the port is already stopped */
1005 if ((tmp & (PORT_CMD_START | PORT_CMD_LIST_ON)) == 0) {
1006 return 0;
1007 }
1008
1009 /* set port to idle */
1010 tmp &= ~PORT_CMD_START;
1011 writel(port_mmio + PORT_CMD, tmp);
1012
1013 /* wait for engine to stop. This could be as long as 500 msec */
1014 status = 0;
1015 timer_init(&Timer, 500);
1016 while (readl(port_mmio + PORT_CMD) & PORT_CMD_LIST_ON) {
1017 status = timer_check_and_block(&Timer);
1018 if (status) break;
1019 }
1020
1021 return(status ? -1 : 0);
1022}
1023
1024/******************************************************************************
1025 * Determine whether a port is busy executing commands.
1026 */
1027int ahci_port_busy(AD_INFO *ai, int p)
1028{
1029 u8 _far *port_mmio = port_base(ai, p);
1030
1031 return(readl(port_mmio + PORT_SCR_ACT) != 0 ||
1032 readl(port_mmio + PORT_CMD_ISSUE) != 0);
1033}
1034
1035/******************************************************************************
1036 * Execute AHCI command for given IORB. This includes all steps typically
1037 * required by any of the ahci_*() IORB processing functions.
1038 *
1039 * NOTE: In order to prevent race conditions with port restart and reset
1040 * handlers, we either need to keep the spinlock during the whole
1041 * operation or set the adapter's busy flag. Since the expectation
1042 * is that command preparation will be quick (it certainly doesn't
1043 * involve delays), we're going with the spinlock for the time being.
1044 */
1045void ahci_exec_iorb(IORBH _far *iorb, int ncq_capable,
1046 int (*func)(IORBH _far *, int))
1047{
1048 volatile u32 *cmds;
1049 ADD_WORKSPACE _far *aws = add_workspace(iorb);
1050 AD_INFO *ai = ad_infos + iorb_unit_adapter(iorb);
1051 P_INFO *port = ai->ports + iorb_unit_port(iorb);
1052 ULONG timeout;
1053 u8 _far *port_mmio = port_base(ai, iorb_unit_port(iorb));
1054 u16 cmd_max = ai->cmd_max;
1055 int i;
1056
1057 /* determine timeout in milliseconds */
1058 switch (iorb->Timeout) {
1059 case 0:
1060 timeout = DEFAULT_TIMEOUT;
1061 break;
1062 case 0xffffffffUL:
1063 timeout = 0xffffffffUL;
1064 break;
1065 default:
1066 timeout = iorb->Timeout * 1000;
1067 break;
1068 }
1069
1070 /* Enable AHCI mode; apparently, the AHCI mode may end up becoming
1071 * disabled, either during the boot sequence (by the BIOS) or by
1072 * something else. The Linux AHCI drivers have this call in the
1073 * command processing chain, and apparently for a good reason because
1074 * without this, commands won't be executed.
1075 */
1076 ahci_enable_ahci(ai);
1077
1078 /* determine whether this will be an NCQ request */
1079 aws->is_ncq = 0;
1080 if (ncq_capable && port->devs[iorb_unit_device(iorb)].ncq_max > 1 &&
1081 (ai->cap & HOST_CAP_NCQ) && !aws->no_ncq && init_complete) {
1082
1083 /* We can make this an NCQ request; limit command slots to the maximum
1084 * NCQ tag number reported by the device - 1. Why "minus one"? I seem to
1085 * recall an issue related to using all 32 tag numbers but can't quite
1086 * pinpoint it right now. One less won't make much of a difference...
1087 */
1088 aws->is_ncq = 1;
1089 if ((cmd_max = port->devs[iorb_unit_device(iorb)].ncq_max - 1) > ai->cmd_max) {
1090 cmd_max = ai->cmd_max;
1091 }
1092 ddprintf("NCQ command; cmd_max = %d->%d\n", (u16) ai->cmd_max, cmd_max);
1093 }
1094
1095 /* make sure adapter is available */
1096 spin_lock(drv_lock);
1097 if (!ai->busy) {
1098
1099 if (!init_complete) {
1100 /* no IRQ handlers or context hooks availabe at this point */
1101 ai->busy = 1;
1102 spin_unlock(drv_lock);
1103 ahci_exec_polled_iorb(iorb, func, timeout);
1104 ai->busy = 0;
1105 return;
1106 }
1107
1108 /* make sure we don't mix NCQ and regular commands */
1109 if (aws->is_ncq && port->reg_cmds == 0 || !aws->is_ncq && port->ncq_cmds == 0) {
1110
1111 /* Find next available command slot. We use a simple round-robin
1112 * algorithm for this to prevent commands with higher slot indexes
1113 * from stalling when new commands are coming in frequently.
1114 */
1115 cmds = (aws->is_ncq) ? &port->ncq_cmds : &port->reg_cmds;
1116 for (i = 0; i <= cmd_max; i++) {
1117 if (++(port->cmd_slot) > cmd_max) {
1118 port->cmd_slot = 0;
1119 }
1120 if ((*cmds & (1UL << port->cmd_slot)) == 0) {
1121 break;
1122 }
1123 }
1124
1125 if ((*cmds & (1UL << port->cmd_slot)) == 0) {
1126 /* found idle command slot; prepare command */
1127 if (func(iorb, port->cmd_slot)) {
1128 /* Command preparation failed, or no HW command required; IORB
1129 * will already have the error code if there was an error.
1130 */
1131 spin_unlock(drv_lock);
1132 iorb_done(iorb);
1133 return;
1134 }
1135
1136 /* start timer for this IORB */
1137 ADD_StartTimerMS(&aws->timer, timeout, (PFN) timeout_callback, iorb, 0);
1138
1139 /* issue command to hardware */
1140 *cmds |= (1UL << port->cmd_slot);
1141 aws->queued_hw = 1;
1142 aws->cmd_slot = port->cmd_slot;
1143
1144 ddprintf("issuing command on slot %d\n", port->cmd_slot);
1145 if (aws->is_ncq) {
1146 writel(port_mmio + PORT_SCR_ACT, (1UL << port->cmd_slot));
1147 readl(port_mmio + PORT_SCR_ACT); /* flush */
1148 }
1149 writel(port_mmio + PORT_CMD_ISSUE, (1UL << port->cmd_slot));
1150 readl(port_mmio + PORT_CMD_ISSUE); /* flush */
1151
1152 spin_unlock(drv_lock);
1153 return;
1154 }
1155 }
1156 }
1157
1158 /* requeue this IORB; it will be picked up again in trigger_engine() */
1159 aws->processing = 0;
1160 spin_unlock(drv_lock);
1161}
1162
1163/******************************************************************************
1164 * Execute polled IORB command. This function is called by ahci_exec_iorb()
1165 * when the initialization has not yet completed. The reasons for polling until
1166 * initialization has completed are:
1167 *
1168 * - We need to restore the BIOS configuration after we're done with this
1169 * command because someone might still call int 13h routines; sending
1170 * asynchronous commands and waiting for interrupts to indicate completion
1171 * won't work in such a scenario.
1172 * - Our context hooks won't work while the device managers are initializing
1173 * (they can't yield at init time).
1174 * - The device managers typically poll for command completion during
1175 * initialization so it won't make much of a difference, anyway.
1176 *
1177 * NOTE: This function must be called with the adapter-level busy flag set but
1178 * without the driver-level spinlock held.
1179 */
1180void ahci_exec_polled_iorb(IORBH _far *iorb, int (*func)(IORBH _far *, int),
1181 ULONG timeout)
1182{
1183 AHCI_PORT_CFG *pc = NULL;
1184 AD_INFO *ai = ad_infos + iorb_unit_adapter(iorb);
1185 int p = iorb_unit_port(iorb);
1186 u8 _far *port_mmio = port_base(ai, p);
1187 TIMER Timer;
1188 int rc;
1189
1190 /* enable AHCI mode */
1191 if (ahci_enable_ahci(ai) != 0) {
1192 iorb_seterr(iorb, IOERR_ADAPTER_NONSPECIFIC);
1193 goto restore_bios_config;
1194 }
1195
1196 /* check whether command slot 0 is available */
1197 if ((readl(port_mmio + PORT_CMD_ISSUE) & 1) != 0) {
1198 iorb_seterr(iorb, IOERR_DEVICE_BUSY);
1199 goto restore_bios_config;
1200 }
1201
1202 /* save port configuration */
1203 if ((pc = ahci_save_port_config(ai, p)) == NULL) {
1204 iorb_seterr(iorb, IOERR_CMD_SW_RESOURCE);
1205 goto restore_bios_config;
1206 }
1207
1208 /* restart/reset port (includes the necessary port configuration) */
1209 if (init_reset) {
1210 /* As outlined in ahci_restore_bios_config(), switching back and
1211 * forth between SATA and AHCI mode requires a COMRESET to force
1212 * the corresponding controller subsystem to rediscover attached
1213 * devices. Thus, we'll reset the port instead of stopping and
1214 * starting it.
1215 */
1216 if (ahci_reset_port(ai, p, 0)) {
1217 iorb_seterr(iorb, IOERR_ADAPTER_NONSPECIFIC);
1218 goto restore_bios_config;
1219 }
1220
1221 } else if (ahci_stop_port(ai, p) || ahci_start_port(ai, p, 0)) {
1222 iorb_seterr(iorb, IOERR_ADAPTER_NONSPECIFIC);
1223 goto restore_bios_config;
1224 }
1225
1226 /* prepare command */
1227 if (func(iorb, 0) == 0) {
1228 /* successfully prepared cmd; issue cmd and wait for completion */
1229 ddprintf("executing polled cmd on slot 0...");
1230 writel(port_mmio + PORT_CMD_ISSUE, 1);
1231 timer_init(&Timer, timeout);
1232 while (readl(port_mmio + PORT_CMD_ISSUE) & 1) {
1233 rc = timer_check_and_block(&Timer);
1234 if (rc) break;
1235 }
1236
1237 /* 0x89 = BSY(0x80) | DRQ(0x08) | ERR(0x01) */
1238 if (rc) {
1239 dprintf(" timeout for IORB %Fp", iorb);
1240 iorb_seterr(iorb, IOERR_ADAPTER_TIMEOUT);
1241 } else if (readl(port_mmio + PORT_SCR_ERR) != 0 || readl(port_mmio + PORT_TFDATA) & 0x89) {
1242 dprintf(" polled cmd error for IORB %Fp", iorb);
1243 iorb_seterr(iorb, IOERR_DEVICE_NONSPECIFIC);
1244 ahci_reset_port(ai, iorb_unit_port(iorb), 0);
1245 } else {
1246 /* successfully executed command */
1247 if (add_workspace(iorb)->ppfunc != NULL) {
1248 add_workspace(iorb)->ppfunc(iorb);
1249 } else {
1250 add_workspace(iorb)->complete = 1;
1251 }
1252 }
1253 ddprintf("\n");
1254 }
1255
1256restore_bios_config:
1257 /* restore BIOS configuration */
1258 if (pc != NULL) {
1259 ahci_restore_port_config(ai, p, pc);
1260 }
1261 ahci_restore_bios_config(ai);
1262
1263 if (add_workspace(iorb)->complete | (iorb->Status | IORB_ERROR)) {
1264 iorb_done(iorb);
1265 }
1266 return;
1267}
1268
1269/******************************************************************************
1270 * Execute polled ATA/ATAPI command. This function will block until the command
1271 * has completed or the timeout has expired, thus it should only be used during
1272 * initialization. Furthermore, it will always use command slot zero.
1273 *
1274 * The difference to ahci_exec_polled_iorb() is that this function executes
1275 * arbitrary ATA/ATAPI commands outside the context of an IORB. It's typically
1276 * used when scanning for devices during initialization.
1277 */
1278int ahci_exec_polled_cmd(AD_INFO *ai, int p, int d, int timeout, int cmd, ...)
1279{
1280 va_list va;
1281 u8 _far *port_mmio = port_base(ai, p);
1282 u32 tmp;
1283 int rc;
1284 TIMER Timer;
1285
1286 /* verify that command slot 0 is idle */
1287 if (readl(port_mmio + PORT_CMD_ISSUE) & 1) {
1288 ddprintf("port %d slot 0 is not idle; not executing polled cmd\n", p);
1289 return(-1);
1290 }
1291
1292 /* fill in command slot 0 */
1293 va_start(va, cmd);
1294 if ((rc = v_ata_cmd(ai, p, d, 0, cmd, va)) != 0) {
1295 return(rc);
1296 }
1297
1298 /* start command execution for slot 0 */
1299 ddprintf("executing polled cmd...");
1300 writel(port_mmio + PORT_CMD_ISSUE, 1);
1301
1302 /* wait until command has completed */
1303 timer_init(&Timer, timeout);
1304 rc = 0;
1305 while (readl(port_mmio + PORT_CMD_ISSUE) & 1) {
1306 rc = timer_check_and_block(&Timer);
1307 if (rc) {
1308 dprintf(" Timeout");
1309 break;
1310 }
1311 }
1312
1313 tmp = readl(port_mmio + PORT_SCR_ERR);
1314 if (tmp & PORT_ERR_FAIL_BITS) {
1315 dprintf(" SERR = 0x%08lx", tmp);
1316 rc = 1;
1317 }
1318 /* 0x89 = BSY(0x80) | DRQ(0x08) | ERR(0x01) */
1319 if (((tmp = readl(port_mmio + PORT_TFDATA)) & 0x89) != 0) {
1320 dprintf(" TFDATA = 0x%08lx", tmp);
1321 rc = 1;
1322 }
1323
1324 if (rc) {
1325 ddprintf("failed\n");
1326 ahci_reset_port(ai, p, 0);
1327 return(-1);
1328 }
1329 ddprintf("success\n");
1330 return(0);
1331}
1332
1333/******************************************************************************
1334 * Flush write cache of the specified device. Since there's no equivalent IORB
1335 * command, we'll execute this command directly using polling. Otherwise, we
1336 * would have to create a fake IORB, add it to the port's IORB queue, ...
1337 *
1338 * Besides, this function is only called when shutting down and the code there
1339 * would have to wait for the flush cache command to complete as well, using
1340 * polling just the same...
1341 */
1342int ahci_flush_cache(AD_INFO *ai, int p, int d)
1343{
1344 if (!ai->ports[p].devs[d].atapi) {
1345 dprintf("flushing cache on %d.%d.%d\n", ad_no(ai), p, d);
1346 return(ahci_exec_polled_cmd(ai, p, d, 30000,
1347 ai->ports[p].devs[d].lba48 ? ATA_CMD_FLUSH_EXT : ATA_CMD_FLUSH, AP_END));
1348 }
1349 return 0;
1350}
1351
1352/******************************************************************************
1353 * Set device into IDLE mode (spin down); this was used during
1354 * debugging/testing and is now unused; it's still there in case we need it
1355 * again...
1356 *
1357 * If 'idle' is != 0, the idle timeout is set to 5 seconds, otherwise it
1358 * is turned off.
1359 */
1360int ahci_set_dev_idle(AD_INFO *ai, int p, int d, int idle)
1361{
1362 ddprintf("sending IDLE=%d command to port %d\n", idle, p);
1363 return ahci_exec_polled_cmd(ai, p, d, 500, ATA_CMD_IDLE, AP_COUNT,
1364 idle ? 1 : 0, AP_END);
1365}
1366
1367/******************************************************************************
1368 * AHCI top-level hardware interrupt handler. This handler finds the adapters
1369 * and ports which have issued the interrupt and calls the corresponding
1370 * port interrupt handler.
1371 *
1372 * On entry, OS/2 will have processor interrupts enabled because we're using
1373 * shared IRQs but we won't be preempted by another interrupt on the same
1374 * IRQ level until we indicated EOI. We'll keep it this way, only requesting
1375 * the driver-level spinlock when actually changing the driver state (IORB
1376 * queues, ...)
1377 *
1378 * NOTE: OS/2 expects the carry flag set upon return from an interrupt
1379 * handler if the interrupt has not been handled. We do this by
1380 * shifting the return code from this function one bit to the right,
1381 * thus the return code must set bit 0 in this case.
1382 */
1383int ahci_intr(u16 irq)
1384{
1385 u32 irq_stat;
1386 int handled = 0;
1387 int a;
1388 int p;
1389
1390 /* find adapter(s) with pending interrupts */
1391 for (a = 0; a < ad_info_cnt; a++) {
1392 AD_INFO *ai = ad_infos + a;
1393
1394 if (ai->irq == irq && (irq_stat = readl(ai->mmio + HOST_IRQ_STAT)) != 0) {
1395 /* this adapter has interrupts pending */
1396 u32 irq_masked = irq_stat & ai->port_map;
1397
1398 for (p = 0; p <= ai->port_max; p++) {
1399 if (irq_masked & (1UL << p)) {
1400 ahci_port_intr(ai, p);
1401 }
1402 }
1403
1404 /* clear interrupt condition on the adapter */
1405 writel(ai->mmio + HOST_IRQ_STAT, irq_stat);
1406 readl(ai->mmio + HOST_IRQ_STAT); /* flush */
1407 handled = 1;
1408 }
1409 }
1410
1411 if (handled) {
1412 /* Trigger state machine to process next IORBs, if any. Due to excessive
1413 * IORB requeue operations (e.g. when processing large unaligned reads or
1414 * writes), we may be stacking interrupts on top of each other. If we
1415 * detect this, we'll pass this on to the engine context hook.
1416 *
1417 * Rousseau:
1418 * The "Physycal Device Driver Reference" states that it's a good idea
1419 * to disable interrupts before doing EOI so that it can proceed for this
1420 * level without being interrupted, which could cause stacked interrupts,
1421 * possibly exhausting the interrupt stack.
1422 * (?:\IBMDDK\DOCS\PDDREF.INF->Device Helper (DevHlp) Services)->EOI)
1423 *
1424 * This is what seemed to happen when running in VirtualBox.
1425 * Since in VBox the AHCI-controller is a software implementation, it is
1426 * just not fast enough to handle a large bulk of requests, like when JFS
1427 * flushes it's caches.
1428 *
1429 * Cross referencing with DANIS506 shows she does the same in the
1430 * state-machine code in s506sm.c around line 244; disable interrupts
1431 * before doing the EOI.
1432 *
1433 * Comments on the disable() function state that SMP systems should use
1434 * a spinlock, but putting the EOI before spin_unlock() did not solve the
1435 * VBox ussue. This is probably because spin_unlock() enables interrupts,
1436 * which implies we need to return from this handler with interrupts
1437 * disabled.
1438 */
1439 if ((u16) (u32) (void _far *) &irq_stat < 0xf000) {
1440 ddprintf("IRQ stack running low; arming engine context hook\n");
1441 /* Rousseau:
1442 * A context hook cannot be re-armed before it has completed.
1443 * (?:\IBMDDK\DOCS\PDDREF.INF->Device Helper (DevHlp) Services)->ArmCtxHook)
1444 * Also, it is executed at task-time, thus in the context of some
1445 * application thread. Stacked interrupts with a stack below the
1446 * threshold specified above, (0xf000), will repeatly try to arm the
1447 * context hook, but since we are in an interrupted interrupt handler,
1448 * it's highly unlikely the hook has completed.
1449 * So, possibly only the first arming is succesful and subsequent armings
1450 * will fail because no task-time thread has run between the stacked
1451 * interrupts. One hint would be that if the dispatching truely worked,
1452 * excessive stacked interrupts in VBox would not be a problem.
1453 * This needs some more investigation.
1454 */
1455 DevHelp_ArmCtxHook(0, engine_ctxhook_h);
1456 } else {
1457 spin_lock(drv_lock);
1458 trigger_engine();
1459 spin_unlock(drv_lock);
1460 }
1461 /* disable interrupts to prevent stacking. (See comments above) */
1462 disable();
1463 /* complete the interrupt */
1464 DevHelp_EOI(irq);
1465 return(0);
1466 } else {
1467 return(1);
1468 }
1469}
1470
1471/******************************************************************************
1472 * AHCI port-level interrupt handler. As described above, processor interrupts
1473 * are enabled on entry thus we have to protect shared resources with a
1474 * spinlock.
1475 */
1476void ahci_port_intr(AD_INFO *ai, int p)
1477{
1478 IORB_QUEUE done_queue;
1479 IORBH _far *iorb;
1480 IORBH _far *next = NULL;
1481 u8 _far *port_mmio = port_base(ai, p);
1482 u32 irq_stat;
1483 u32 active_cmds;
1484 u32 done_mask;
1485
1486 /* get interrupt status and clear it right away */
1487 irq_stat = readl(port_mmio + PORT_IRQ_STAT);
1488 writel(port_mmio + PORT_IRQ_STAT, irq_stat);
1489 readl(port_mmio + PORT_IRQ_STAT); /* flush */
1490
1491 ddprintf("port interrupt for adapter %d port %d stat %lx stack frame %Fp\n",
1492 ad_no(ai), p, irq_stat, (void _far *)&done_queue);
1493 memset(&done_queue, 0x00, sizeof(done_queue));
1494
1495 if (irq_stat & PORT_IRQ_ERROR) {
1496 /* this is an error interrupt;
1497 * disable port interrupts to avoid IRQ storm until error condition
1498 * has been cleared by the restart handler
1499 */
1500 writel(port_mmio + PORT_IRQ_MASK, 0);
1501 ahci_error_intr(ai, p, irq_stat);
1502 return;
1503 }
1504
1505 spin_lock(drv_lock);
1506
1507 /* Find out which command slots have completed. Since error recovery for
1508 * NCQ commands interfers with non-NCQ commands, the upper layers will
1509 * make sure there's never a mixture of NCQ and non-NCQ commands active
1510 * on any port at any given time. This makes it easier to find out which
1511 * commands have completed, too.
1512 */
1513 if (ai->ports[p].ncq_cmds != 0) {
1514 active_cmds = readl(port_mmio + PORT_SCR_ACT);
1515 done_mask = ai->ports[p].ncq_cmds ^ active_cmds;
1516 ddprintf("[ncq_cmds]: active_cmds = 0x%08lx, done_mask = 0x%08lx\n",
1517 active_cmds, done_mask);
1518 } else {
1519 active_cmds = readl(port_mmio + PORT_CMD_ISSUE);
1520 done_mask = ai->ports[p].reg_cmds ^ active_cmds;
1521 ddprintf("[reg_cmds]: active_cmds = 0x%08lx, done_mask = 0x%08lx\n",
1522 active_cmds, done_mask);
1523 }
1524
1525 /* Find the IORBs related to the completed commands and complete them.
1526 *
1527 * NOTES: The spinlock must not be released while in this loop to prevent
1528 * race conditions with timeout handlers or other threads in SMP
1529 * systems.
1530 *
1531 * Since we hold the spinlock when IORBs complete, we can't call the
1532 * IORB notification routine right away because this routine might
1533 * schedule another IORB which could cause a deadlock. Thus, we'll
1534 * add all IORBs to be completed to a temporary queue which will be
1535 * processed after releasing the spinlock.
1536 */
1537 for (iorb = ai->ports[p].iorb_queue.root; iorb != NULL; iorb = next) {
1538 ADD_WORKSPACE _far *aws = (ADD_WORKSPACE _far *) &iorb->ADDWorkSpace;
1539 next = iorb->pNxtIORB;
1540 if (aws->queued_hw && (done_mask & (1UL << aws->cmd_slot))) {
1541 /* this hardware command has completed */
1542 ai->ports[p].ncq_cmds &= ~(1UL << aws->cmd_slot);
1543 ai->ports[p].reg_cmds &= ~(1UL << aws->cmd_slot);
1544
1545 /* call post-processing function, if any */
1546 if (aws->ppfunc != NULL) {
1547 aws->ppfunc(iorb);
1548 } else {
1549 aws->complete = 1;
1550 }
1551
1552 if (aws->complete) {
1553 /* this IORB is complete; move IORB to our temporary done queue */
1554 iorb_queue_del(&ai->ports[p].iorb_queue, iorb);
1555 iorb_queue_add(&done_queue, iorb);
1556 aws_free(add_workspace(iorb));
1557 }
1558 }
1559 }
1560
1561 spin_unlock(drv_lock);
1562
1563 /* complete all IORBs in the done queue */
1564 for (iorb = done_queue.root; iorb != NULL; iorb = next) {
1565 next = iorb->pNxtIORB;
1566 iorb_complete(iorb);
1567 }
1568}
1569
1570/******************************************************************************
1571 * AHCI error interrupt handler. Errors include interface errors and device
1572 * errors (usually triggered by the error bit in the AHCI task file register).
1573 *
1574 * Since this involves long-running operations such as restarting or even
1575 * resetting a port, this function is invoked at task time via a context
1576 * hook.
1577 *
1578 * NOTE: AHCI controllers stop all processing when encountering an error
1579 * condition in order to give the driver time to find out what exactly
1580 * went wrong. This means no new commands will be processed until we
1581 * clear the error register and restore the "commands issued" register.
1582 */
1583void ahci_error_intr(AD_INFO *ai, int p, u32 irq_stat)
1584{
1585 int reset_port = 0;
1586
1587 /* Handle adapter and interface errors. Those typically require a port
1588 * reset, or worse.
1589 */
1590 if (irq_stat & PORT_IRQ_UNK_FIS) {
1591 #ifdef DEBUG
1592 u32 _far *unk = (u32 _far *) (port_dma_base(ai, p)->rx_fis + RX_FIS_UNK);
1593 dprintf("warning: unknown FIS %08lx %08lx %08lx %08lx\n", unk[0], unk[1], unk[2], unk[3]);
1594 #endif
1595 reset_port = 1;
1596 }
1597 if (irq_stat & (PORT_IRQ_HBUS_ERR | PORT_IRQ_HBUS_DATA_ERR)) {
1598 dprintf("warning: host bus [data] error for port #%d\n", p);
1599 reset_port = 1;
1600 }
1601 if (irq_stat & PORT_IRQ_IF_ERR && !(ai->flags & AHCI_HFLAG_IGN_IRQ_IF_ERR)) {
1602 dprintf("warning: interface fatal error for port #%d\n", p);
1603 reset_port = 1;
1604 }
1605 if (reset_port) {
1606 /* need to reset the port; leave this to the reset context hook */
1607
1608 ports_to_reset[ad_no(ai)] |= 1UL << p;
1609 DevHelp_ArmCtxHook(0, reset_ctxhook_h);
1610
1611 /* no point analyzing device errors after a reset... */
1612 return;
1613 }
1614
1615 dprintf("port #%d interrupt error status: 0x%08lx; restarting port\n",
1616 p, irq_stat);
1617
1618 /* Handle device-specific errors. Those errors typically involve restarting
1619 * the corresponding port to resume operations which can take some time,
1620 * thus we need to offload this functionality to the restart context hook.
1621 */
1622 ports_to_restart[ad_no(ai)] |= 1UL << p;
1623 DevHelp_ArmCtxHook(0, restart_ctxhook_h);
1624}
1625
1626/******************************************************************************
1627 * Get device or media geometry. Device and media geometry are expected to be
1628 * the same for non-removable devices.
1629 */
1630void ahci_get_geometry(IORBH _far *iorb)
1631{
1632 dprintf("ahci_get_geometry(%d.%d.%d)\n", (int) iorb_unit_adapter(iorb),
1633 (int) iorb_unit_port(iorb), (int) iorb_unit_device(iorb));
1634
1635 ahci_exec_iorb(iorb, 0, cmd_func(iorb, get_geometry));
1636}
1637
1638/******************************************************************************
1639 * Test whether unit is ready.
1640 */
1641void ahci_unit_ready(IORBH _far *iorb)
1642{
1643 dprintf("ahci_unit_ready(%d.%d.%d)\n", (int) iorb_unit_adapter(iorb),
1644 (int) iorb_unit_port(iorb), (int) iorb_unit_device(iorb));
1645
1646 ahci_exec_iorb(iorb, 0, cmd_func(iorb, unit_ready));
1647}
1648
1649/******************************************************************************
1650 * Read sectors from AHCI device.
1651 */
1652void ahci_read(IORBH _far *iorb)
1653{
1654 dprintf("ahci_read(%d.%d.%d, %ld, %ld)\n", (int) iorb_unit_adapter(iorb),
1655 (int) iorb_unit_port(iorb), (int) iorb_unit_device(iorb),
1656 (long) ((IORB_EXECUTEIO _far *) iorb)->RBA,
1657 (long) ((IORB_EXECUTEIO _far *) iorb)->BlockCount);
1658
1659 ahci_exec_iorb(iorb, 1, cmd_func(iorb, read));
1660}
1661
1662/******************************************************************************
1663 * Verify readability of sectors on AHCI device.
1664 */
1665void ahci_verify(IORBH _far *iorb)
1666{
1667 dprintf("ahci_verify(%d.%d.%d, %ld, %ld)\n", (int) iorb_unit_adapter(iorb),
1668 (int) iorb_unit_port(iorb), (int) iorb_unit_device(iorb),
1669 (long) ((IORB_EXECUTEIO _far *) iorb)->RBA,
1670 (long) ((IORB_EXECUTEIO _far *) iorb)->BlockCount);
1671
1672 ahci_exec_iorb(iorb, 0, cmd_func(iorb, verify));
1673}
1674
1675/******************************************************************************
1676 * Write sectors to AHCI device.
1677 */
1678void ahci_write(IORBH _far *iorb)
1679{
1680 dprintf("ahci_write(%d.%d.%d, %ld, %ld)\n", (int) iorb_unit_adapter(iorb),
1681 (int) iorb_unit_port(iorb), (int) iorb_unit_device(iorb),
1682 (long) ((IORB_EXECUTEIO _far *) iorb)->RBA,
1683 (long) ((IORB_EXECUTEIO _far *) iorb)->BlockCount);
1684
1685 ahci_exec_iorb(iorb, 1, cmd_func(iorb, write));
1686}
1687
1688/******************************************************************************
1689 * Execute SCSI (ATAPI) command.
1690 */
1691void ahci_execute_cdb(IORBH _far *iorb)
1692{
1693 int a = iorb_unit_adapter(iorb);
1694 int p = iorb_unit_port(iorb);
1695 int d = iorb_unit_device(iorb);
1696
1697 dphex(((IORB_ADAPTER_PASSTHRU _far *) iorb)->pControllerCmd,
1698 ((IORB_ADAPTER_PASSTHRU _far *) iorb)->ControllerCmdLen,
1699 "ahci_execute_cdb(%d.%d.%d): ", a, p, d);
1700
1701 if (ad_infos[a].ports[p].devs[d].atapi) {
1702 ahci_exec_iorb(iorb, 0, atapi_execute_cdb);
1703 } else {
1704 iorb_seterr(iorb, IOERR_CMD_NOT_SUPPORTED);
1705 iorb_done(iorb);
1706 }
1707}
1708
1709/******************************************************************************
1710 * Execute ATA command. Please note that this is allowed for both ATA and
1711 * ATAPI devices because ATAPI devices will process some ATA commands as well.
1712 */
1713void ahci_execute_ata(IORBH _far *iorb)
1714{
1715 #ifdef DEBUG
1716 int a = iorb_unit_adapter(iorb);
1717 int p = iorb_unit_port(iorb);
1718 int d = iorb_unit_device(iorb);
1719 #endif
1720
1721 dphex(((IORB_ADAPTER_PASSTHRU _far *) iorb)->pControllerCmd,
1722 ((IORB_ADAPTER_PASSTHRU _far *) iorb)->ControllerCmdLen,
1723 "ahci_execute_ata(%d.%d.%d): ", a, p, d);
1724
1725 ahci_exec_iorb(iorb, 0, ata_execute_ata);
1726}
1727
1728/******************************************************************************
1729 * Set up device attached to the specified port based on ATA_IDENTFY_DEVICE or
1730 * ATA_IDENTFY_PACKET_DEVICE data.
1731 *
1732 * NOTE: Port multipliers are not supported, yet, thus the device number is
1733 * expected to be 0 for the time being.
1734 */
1735static void ahci_setup_device(AD_INFO *ai, int p, int d, u16 *id_buf)
1736{
1737 DEVICESTRUCT ds;
1738 ADJUNCT adj;
1739 HDEVICE dh;
1740 char dev_name[RM_MAX_PREFIX_LEN+ATA_ID_PROD_LEN+1];
1741 static u8 total_dev_cnt;
1742
1743 if (p >= AHCI_MAX_PORTS) return;
1744 if (d >= AHCI_MAX_DEVS) return;
1745
1746 if (ai->port_max < p) {
1747 ai->port_max = p;
1748 }
1749 if (ai->ports[p].dev_max < d) {
1750 ai->ports[p].dev_max = d;
1751 }
1752 memset(ai->ports[p].devs + d, 0x00, sizeof(*ai->ports[p].devs));
1753
1754 /* set generic device information (assuming an ATA disk device for now) */
1755 ai->ports[p].devs[d].present = 1;
1756 ai->ports[p].devs[d].removable = (id_buf[ATA_ID_CONFIG] & 0x0080U) != 0;
1757 ai->ports[p].devs[d].dev_type = UIB_TYPE_DISK;
1758
1759 if (id_buf[ATA_ID_CONFIG] & 0x8000U) {
1760 /* this is an ATAPI device; augment device information */
1761 ai->ports[p].devs[d].atapi = 1;
1762 ai->ports[p].devs[d].atapi_16 = (id_buf[ATA_ID_CONFIG] & 0x0001U) != 0;
1763 ai->ports[p].devs[d].dev_type = (id_buf[ATA_ID_CONFIG] & 0x1f00U) >> 8;
1764 ai->ports[p].devs[d].ncq_max = 1;
1765
1766 } else {
1767 /* complete ATA-specific device information */
1768 if (enable_ncq[ad_no(ai)][p]) {
1769 ai->ports[p].devs[d].ncq_max = id_buf[ATA_ID_QUEUE_DEPTH] & 0x001fU;
1770 }
1771 if (ai->ports[p].devs[d].ncq_max < 1) {
1772 /* NCQ not enabled for this device, or device doesn't support NCQ */
1773 ai->ports[p].devs[d].ncq_max = 1;
1774 }
1775 if (id_buf[ATA_ID_CFS_ENABLE_2] & 0x0400U) {
1776 ai->ports[p].devs[d].lba48 = 1;
1777 }
1778 }
1779
1780 dprintf("found device %d.%d.%d: removable = %d, dev_type = %d, atapi = %d, "
1781 "ncq_max = %d\n", ad_no(ai), p, d,
1782 ai->ports[p].devs[d].removable,
1783 ai->ports[p].devs[d].dev_type,
1784 ai->ports[p].devs[d].atapi,
1785 ai->ports[p].devs[d].ncq_max);
1786
1787 /* add device to resource manager; we don't really care about errors here */
1788 memset(&ds, 0x00, sizeof(ds));
1789 memset(&adj, 0x00, sizeof(adj));
1790
1791 adj.pNextAdj = NULL;
1792 adj.AdjLength = sizeof(adj);
1793 adj.AdjType = ADJ_ADD_UNIT;
1794 adj.Add_Unit.ADDHandle = rm_drvh;
1795 adj.Add_Unit.UnitHandle = (USHORT) total_dev_cnt;
1796
1797 /* create Resource Manager device key string;
1798 * we distinguish only HDs and CD drives for now
1799 */
1800 if (ai->ports[p].devs[d].removable) {
1801 sprintf(dev_name, RM_CD_PREFIX "%s", p, d, ata_dev_name(id_buf));
1802 } else {
1803 sprintf(dev_name, RM_HD_PREFIX "%s", p, d, ata_dev_name(id_buf));
1804 }
1805
1806 ds.DevDescriptName = dev_name;
1807 ds.DevFlags = (ai->ports[p].devs[d].removable) ? DS_REMOVEABLE_MEDIA
1808 : DS_FIXED_LOGICALNAME;
1809 ds.DevType = ai->ports[p].devs[d].dev_type;
1810 ds.pAdjunctList = &adj;
1811
1812 RMCreateDevice(rm_drvh, &dh, &ds, ai->rm_adh, NULL);
1813
1814 total_dev_cnt++;
1815
1816 /* try to detect virtualbox environment to enable a hack for IRQ routing */
1817 if (ai == ad_infos && ai->pci_vendor == 0x8086 && ai->pci_device == 0x2829 &&
1818 !memcmp(ata_dev_name(id_buf), "VBOX HARDDISK", 13)) {
1819 /* running inside virtualbox */
1820 pci_hack_virtualbox();
1821 }
1822}
1823
Note: See TracBrowser for help on using the repository browser.