xref: /freebsd/usr.sbin/bhyve/pci_ahci.c (revision 4e8d558c)
1 /*-
2  * SPDX-License-Identifier: BSD-2-Clause
3  *
4  * Copyright (c) 2013  Zhixiang Yu <zcore@freebsd.org>
5  * Copyright (c) 2015-2016 Alexander Motin <mav@FreeBSD.org>
6  * All rights reserved.
7  *
8  * Redistribution and use in source and binary forms, with or without
9  * modification, are permitted provided that the following conditions
10  * are met:
11  * 1. Redistributions of source code must retain the above copyright
12  *    notice, this list of conditions and the following disclaimer.
13  * 2. Redistributions in binary form must reproduce the above copyright
14  *    notice, this list of conditions and the following disclaimer in the
15  *    documentation and/or other materials provided with the distribution.
16  *
17  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND
18  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
19  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
20  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
21  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
22  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
23  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
24  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
25  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
26  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
27  * SUCH DAMAGE.
28  *
29  * $FreeBSD$
30  */
31 
32 #include <sys/cdefs.h>
33 __FBSDID("$FreeBSD$");
34 
35 #include <sys/param.h>
36 #include <sys/linker_set.h>
37 #include <sys/stat.h>
38 #include <sys/uio.h>
39 #include <sys/ioctl.h>
40 #include <sys/disk.h>
41 #include <sys/ata.h>
42 #include <sys/endian.h>
43 
44 #include <errno.h>
45 #include <fcntl.h>
46 #include <stdio.h>
47 #include <stdlib.h>
48 #include <stdint.h>
49 #include <string.h>
50 #include <strings.h>
51 #include <unistd.h>
52 #include <assert.h>
53 #include <pthread.h>
54 #include <pthread_np.h>
55 #include <inttypes.h>
56 #include <md5.h>
57 
58 #include "bhyverun.h"
59 #include "config.h"
60 #include "debug.h"
61 #include "pci_emul.h"
62 #ifdef BHYVE_SNAPSHOT
63 #include "snapshot.h"
64 #endif
65 #include "ahci.h"
66 #include "block_if.h"
67 
68 #define	DEF_PORTS	6	/* Intel ICH8 AHCI supports 6 ports */
69 #define	MAX_PORTS	32	/* AHCI supports 32 ports */
70 
71 #define	PxSIG_ATA	0x00000101 /* ATA drive */
72 #define	PxSIG_ATAPI	0xeb140101 /* ATAPI drive */
73 
74 enum sata_fis_type {
75 	FIS_TYPE_REGH2D		= 0x27,	/* Register FIS - host to device */
76 	FIS_TYPE_REGD2H		= 0x34,	/* Register FIS - device to host */
77 	FIS_TYPE_DMAACT		= 0x39,	/* DMA activate FIS - device to host */
78 	FIS_TYPE_DMASETUP	= 0x41,	/* DMA setup FIS - bidirectional */
79 	FIS_TYPE_DATA		= 0x46,	/* Data FIS - bidirectional */
80 	FIS_TYPE_BIST		= 0x58,	/* BIST activate FIS - bidirectional */
81 	FIS_TYPE_PIOSETUP	= 0x5F,	/* PIO setup FIS - device to host */
82 	FIS_TYPE_SETDEVBITS	= 0xA1,	/* Set dev bits FIS - device to host */
83 };
84 
85 /*
86  * SCSI opcodes
87  */
88 #define	TEST_UNIT_READY		0x00
89 #define	REQUEST_SENSE		0x03
90 #define	INQUIRY			0x12
91 #define	START_STOP_UNIT		0x1B
92 #define	PREVENT_ALLOW		0x1E
93 #define	READ_CAPACITY		0x25
94 #define	READ_10			0x28
95 #define	POSITION_TO_ELEMENT	0x2B
96 #define	READ_TOC		0x43
97 #define	GET_EVENT_STATUS_NOTIFICATION 0x4A
98 #define	MODE_SENSE_10		0x5A
99 #define	REPORT_LUNS		0xA0
100 #define	READ_12			0xA8
101 #define	READ_CD			0xBE
102 
103 /*
104  * SCSI mode page codes
105  */
106 #define	MODEPAGE_RW_ERROR_RECOVERY	0x01
107 #define	MODEPAGE_CD_CAPABILITIES	0x2A
108 
109 /*
110  * ATA commands
111  */
112 #define	ATA_SF_ENAB_SATA_SF		0x10
113 #define	ATA_SATA_SF_AN			0x05
114 #define	ATA_SF_DIS_SATA_SF		0x90
115 
116 /*
117  * Debug printf
118  */
119 #ifdef AHCI_DEBUG
120 static FILE *dbg;
121 #define DPRINTF(format, arg...)	do{fprintf(dbg, format, ##arg);fflush(dbg);}while(0)
122 #else
123 #define DPRINTF(format, arg...)
124 #endif
125 #define WPRINTF(format, arg...) printf(format, ##arg)
126 
127 #define AHCI_PORT_IDENT 20 + 1
128 
129 struct ahci_ioreq {
130 	struct blockif_req io_req;
131 	struct ahci_port *io_pr;
132 	STAILQ_ENTRY(ahci_ioreq) io_flist;
133 	TAILQ_ENTRY(ahci_ioreq) io_blist;
134 	uint8_t *cfis;
135 	uint32_t len;
136 	uint32_t done;
137 	int slot;
138 	int more;
139 	int readop;
140 };
141 
142 struct ahci_port {
143 	struct blockif_ctxt *bctx;
144 	struct pci_ahci_softc *pr_sc;
145 	struct ata_params ata_ident;
146 	uint8_t *cmd_lst;
147 	uint8_t *rfis;
148 	int port;
149 	int atapi;
150 	int reset;
151 	int waitforclear;
152 	int mult_sectors;
153 	uint8_t xfermode;
154 	uint8_t err_cfis[20];
155 	uint8_t sense_key;
156 	uint8_t asc;
157 	u_int ccs;
158 	uint32_t pending;
159 
160 	uint32_t clb;
161 	uint32_t clbu;
162 	uint32_t fb;
163 	uint32_t fbu;
164 	uint32_t is;
165 	uint32_t ie;
166 	uint32_t cmd;
167 	uint32_t unused0;
168 	uint32_t tfd;
169 	uint32_t sig;
170 	uint32_t ssts;
171 	uint32_t sctl;
172 	uint32_t serr;
173 	uint32_t sact;
174 	uint32_t ci;
175 	uint32_t sntf;
176 	uint32_t fbs;
177 
178 	/*
179 	 * i/o request info
180 	 */
181 	struct ahci_ioreq *ioreq;
182 	int ioqsz;
183 	STAILQ_HEAD(ahci_fhead, ahci_ioreq) iofhd;
184 	TAILQ_HEAD(ahci_bhead, ahci_ioreq) iobhd;
185 };
186 
187 struct ahci_cmd_hdr {
188 	uint16_t flags;
189 	uint16_t prdtl;
190 	uint32_t prdbc;
191 	uint64_t ctba;
192 	uint32_t reserved[4];
193 };
194 
195 struct ahci_prdt_entry {
196 	uint64_t dba;
197 	uint32_t reserved;
198 #define	DBCMASK		0x3fffff
199 	uint32_t dbc;
200 };
201 
202 struct pci_ahci_softc {
203 	struct pci_devinst *asc_pi;
204 	pthread_mutex_t	mtx;
205 	int ports;
206 	uint32_t cap;
207 	uint32_t ghc;
208 	uint32_t is;
209 	uint32_t pi;
210 	uint32_t vs;
211 	uint32_t ccc_ctl;
212 	uint32_t ccc_pts;
213 	uint32_t em_loc;
214 	uint32_t em_ctl;
215 	uint32_t cap2;
216 	uint32_t bohc;
217 	uint32_t lintr;
218 	struct ahci_port port[MAX_PORTS];
219 };
220 #define	ahci_ctx(sc)	((sc)->asc_pi->pi_vmctx)
221 
222 static void ahci_handle_port(struct ahci_port *p);
223 
224 static inline void lba_to_msf(uint8_t *buf, int lba)
225 {
226 	lba += 150;
227 	buf[0] = (lba / 75) / 60;
228 	buf[1] = (lba / 75) % 60;
229 	buf[2] = lba % 75;
230 }
231 
232 /*
233  * Generate HBA interrupts on global IS register write.
234  */
235 static void
236 ahci_generate_intr(struct pci_ahci_softc *sc, uint32_t mask)
237 {
238 	struct pci_devinst *pi = sc->asc_pi;
239 	struct ahci_port *p;
240 	int i, nmsg;
241 	uint32_t mmask;
242 
243 	/* Update global IS from PxIS/PxIE. */
244 	for (i = 0; i < sc->ports; i++) {
245 		p = &sc->port[i];
246 		if (p->is & p->ie)
247 			sc->is |= (1 << i);
248 	}
249 	DPRINTF("%s(%08x) %08x", __func__, mask, sc->is);
250 
251 	/* If there is nothing enabled -- clear legacy interrupt and exit. */
252 	if (sc->is == 0 || (sc->ghc & AHCI_GHC_IE) == 0) {
253 		if (sc->lintr) {
254 			pci_lintr_deassert(pi);
255 			sc->lintr = 0;
256 		}
257 		return;
258 	}
259 
260 	/* If there is anything and no MSI -- assert legacy interrupt. */
261 	nmsg = pci_msi_maxmsgnum(pi);
262 	if (nmsg == 0) {
263 		if (!sc->lintr) {
264 			sc->lintr = 1;
265 			pci_lintr_assert(pi);
266 		}
267 		return;
268 	}
269 
270 	/* Assert respective MSIs for ports that were touched. */
271 	for (i = 0; i < nmsg; i++) {
272 		if (sc->ports <= nmsg || i < nmsg - 1)
273 			mmask = 1 << i;
274 		else
275 			mmask = 0xffffffff << i;
276 		if (sc->is & mask && mmask & mask)
277 			pci_generate_msi(pi, i);
278 	}
279 }
280 
281 /*
282  * Generate HBA interrupt on specific port event.
283  */
284 static void
285 ahci_port_intr(struct ahci_port *p)
286 {
287 	struct pci_ahci_softc *sc = p->pr_sc;
288 	struct pci_devinst *pi = sc->asc_pi;
289 	int nmsg;
290 
291 	DPRINTF("%s(%d) %08x/%08x %08x", __func__,
292 	    p->port, p->is, p->ie, sc->is);
293 
294 	/* If there is nothing enabled -- we are done. */
295 	if ((p->is & p->ie) == 0)
296 		return;
297 
298 	/* In case of non-shared MSI always generate interrupt. */
299 	nmsg = pci_msi_maxmsgnum(pi);
300 	if (sc->ports <= nmsg || p->port < nmsg - 1) {
301 		sc->is |= (1 << p->port);
302 		if ((sc->ghc & AHCI_GHC_IE) == 0)
303 			return;
304 		pci_generate_msi(pi, p->port);
305 		return;
306 	}
307 
308 	/* If IS for this port is already set -- do nothing. */
309 	if (sc->is & (1 << p->port))
310 		return;
311 
312 	sc->is |= (1 << p->port);
313 
314 	/* If interrupts are enabled -- generate one. */
315 	if ((sc->ghc & AHCI_GHC_IE) == 0)
316 		return;
317 	if (nmsg > 0) {
318 		pci_generate_msi(pi, nmsg - 1);
319 	} else if (!sc->lintr) {
320 		sc->lintr = 1;
321 		pci_lintr_assert(pi);
322 	}
323 }
324 
325 static void
326 ahci_write_fis(struct ahci_port *p, enum sata_fis_type ft, uint8_t *fis)
327 {
328 	int offset, len, irq;
329 
330 	if (p->rfis == NULL || !(p->cmd & AHCI_P_CMD_FRE))
331 		return;
332 
333 	switch (ft) {
334 	case FIS_TYPE_REGD2H:
335 		offset = 0x40;
336 		len = 20;
337 		irq = (fis[1] & (1 << 6)) ? AHCI_P_IX_DHR : 0;
338 		break;
339 	case FIS_TYPE_SETDEVBITS:
340 		offset = 0x58;
341 		len = 8;
342 		irq = (fis[1] & (1 << 6)) ? AHCI_P_IX_SDB : 0;
343 		break;
344 	case FIS_TYPE_PIOSETUP:
345 		offset = 0x20;
346 		len = 20;
347 		irq = (fis[1] & (1 << 6)) ? AHCI_P_IX_PS : 0;
348 		break;
349 	default:
350 		WPRINTF("unsupported fis type %d", ft);
351 		return;
352 	}
353 	if (fis[2] & ATA_S_ERROR) {
354 		p->waitforclear = 1;
355 		irq |= AHCI_P_IX_TFE;
356 	}
357 	memcpy(p->rfis + offset, fis, len);
358 	if (irq) {
359 		if (~p->is & irq) {
360 			p->is |= irq;
361 			ahci_port_intr(p);
362 		}
363 	}
364 }
365 
366 static void
367 ahci_write_fis_piosetup(struct ahci_port *p)
368 {
369 	uint8_t fis[20];
370 
371 	memset(fis, 0, sizeof(fis));
372 	fis[0] = FIS_TYPE_PIOSETUP;
373 	ahci_write_fis(p, FIS_TYPE_PIOSETUP, fis);
374 }
375 
376 static void
377 ahci_write_fis_sdb(struct ahci_port *p, int slot, uint8_t *cfis, uint32_t tfd)
378 {
379 	uint8_t fis[8];
380 	uint8_t error;
381 
382 	error = (tfd >> 8) & 0xff;
383 	tfd &= 0x77;
384 	memset(fis, 0, sizeof(fis));
385 	fis[0] = FIS_TYPE_SETDEVBITS;
386 	fis[1] = (1 << 6);
387 	fis[2] = tfd;
388 	fis[3] = error;
389 	if (fis[2] & ATA_S_ERROR) {
390 		p->err_cfis[0] = slot;
391 		p->err_cfis[2] = tfd;
392 		p->err_cfis[3] = error;
393 		memcpy(&p->err_cfis[4], cfis + 4, 16);
394 	} else {
395 		*(uint32_t *)(fis + 4) = (1 << slot);
396 		p->sact &= ~(1 << slot);
397 	}
398 	p->tfd &= ~0x77;
399 	p->tfd |= tfd;
400 	ahci_write_fis(p, FIS_TYPE_SETDEVBITS, fis);
401 }
402 
403 static void
404 ahci_write_fis_d2h(struct ahci_port *p, int slot, uint8_t *cfis, uint32_t tfd)
405 {
406 	uint8_t fis[20];
407 	uint8_t error;
408 
409 	error = (tfd >> 8) & 0xff;
410 	memset(fis, 0, sizeof(fis));
411 	fis[0] = FIS_TYPE_REGD2H;
412 	fis[1] = (1 << 6);
413 	fis[2] = tfd & 0xff;
414 	fis[3] = error;
415 	fis[4] = cfis[4];
416 	fis[5] = cfis[5];
417 	fis[6] = cfis[6];
418 	fis[7] = cfis[7];
419 	fis[8] = cfis[8];
420 	fis[9] = cfis[9];
421 	fis[10] = cfis[10];
422 	fis[11] = cfis[11];
423 	fis[12] = cfis[12];
424 	fis[13] = cfis[13];
425 	if (fis[2] & ATA_S_ERROR) {
426 		p->err_cfis[0] = 0x80;
427 		p->err_cfis[2] = tfd & 0xff;
428 		p->err_cfis[3] = error;
429 		memcpy(&p->err_cfis[4], cfis + 4, 16);
430 	} else
431 		p->ci &= ~(1 << slot);
432 	p->tfd = tfd;
433 	ahci_write_fis(p, FIS_TYPE_REGD2H, fis);
434 }
435 
436 static void
437 ahci_write_fis_d2h_ncq(struct ahci_port *p, int slot)
438 {
439 	uint8_t fis[20];
440 
441 	p->tfd = ATA_S_READY | ATA_S_DSC;
442 	memset(fis, 0, sizeof(fis));
443 	fis[0] = FIS_TYPE_REGD2H;
444 	fis[1] = 0;			/* No interrupt */
445 	fis[2] = p->tfd;		/* Status */
446 	fis[3] = 0;			/* No error */
447 	p->ci &= ~(1 << slot);
448 	ahci_write_fis(p, FIS_TYPE_REGD2H, fis);
449 }
450 
451 static void
452 ahci_write_reset_fis_d2h(struct ahci_port *p)
453 {
454 	uint8_t fis[20];
455 
456 	memset(fis, 0, sizeof(fis));
457 	fis[0] = FIS_TYPE_REGD2H;
458 	fis[3] = 1;
459 	fis[4] = 1;
460 	if (p->atapi) {
461 		fis[5] = 0x14;
462 		fis[6] = 0xeb;
463 	}
464 	fis[12] = 1;
465 	ahci_write_fis(p, FIS_TYPE_REGD2H, fis);
466 }
467 
468 static void
469 ahci_check_stopped(struct ahci_port *p)
470 {
471 	/*
472 	 * If we are no longer processing the command list and nothing
473 	 * is in-flight, clear the running bit, the current command
474 	 * slot, the command issue and active bits.
475 	 */
476 	if (!(p->cmd & AHCI_P_CMD_ST)) {
477 		if (p->pending == 0) {
478 			p->ccs = 0;
479 			p->cmd &= ~(AHCI_P_CMD_CR | AHCI_P_CMD_CCS_MASK);
480 			p->ci = 0;
481 			p->sact = 0;
482 			p->waitforclear = 0;
483 		}
484 	}
485 }
486 
487 static void
488 ahci_port_stop(struct ahci_port *p)
489 {
490 	struct ahci_ioreq *aior;
491 	uint8_t *cfis;
492 	int slot;
493 	int error;
494 
495 	assert(pthread_mutex_isowned_np(&p->pr_sc->mtx));
496 
497 	TAILQ_FOREACH(aior, &p->iobhd, io_blist) {
498 		/*
499 		 * Try to cancel the outstanding blockif request.
500 		 */
501 		error = blockif_cancel(p->bctx, &aior->io_req);
502 		if (error != 0)
503 			continue;
504 
505 		slot = aior->slot;
506 		cfis = aior->cfis;
507 		if (cfis[2] == ATA_WRITE_FPDMA_QUEUED ||
508 		    cfis[2] == ATA_READ_FPDMA_QUEUED ||
509 		    cfis[2] == ATA_SEND_FPDMA_QUEUED)
510 			p->sact &= ~(1 << slot);	/* NCQ */
511 		else
512 			p->ci &= ~(1 << slot);
513 
514 		/*
515 		 * This command is now done.
516 		 */
517 		p->pending &= ~(1 << slot);
518 
519 		/*
520 		 * Delete the blockif request from the busy list
521 		 */
522 		TAILQ_REMOVE(&p->iobhd, aior, io_blist);
523 
524 		/*
525 		 * Move the blockif request back to the free list
526 		 */
527 		STAILQ_INSERT_TAIL(&p->iofhd, aior, io_flist);
528 	}
529 
530 	ahci_check_stopped(p);
531 }
532 
533 static void
534 ahci_port_reset(struct ahci_port *pr)
535 {
536 	pr->serr = 0;
537 	pr->sact = 0;
538 	pr->xfermode = ATA_UDMA6;
539 	pr->mult_sectors = 128;
540 
541 	if (!pr->bctx) {
542 		pr->ssts = ATA_SS_DET_NO_DEVICE;
543 		pr->sig = 0xFFFFFFFF;
544 		pr->tfd = 0x7F;
545 		return;
546 	}
547 	pr->ssts = ATA_SS_DET_PHY_ONLINE | ATA_SS_IPM_ACTIVE;
548 	if (pr->sctl & ATA_SC_SPD_MASK)
549 		pr->ssts |= (pr->sctl & ATA_SC_SPD_MASK);
550 	else
551 		pr->ssts |= ATA_SS_SPD_GEN3;
552 	pr->tfd = (1 << 8) | ATA_S_DSC | ATA_S_DMA;
553 	if (!pr->atapi) {
554 		pr->sig = PxSIG_ATA;
555 		pr->tfd |= ATA_S_READY;
556 	} else
557 		pr->sig = PxSIG_ATAPI;
558 	ahci_write_reset_fis_d2h(pr);
559 }
560 
561 static void
562 ahci_reset(struct pci_ahci_softc *sc)
563 {
564 	int i;
565 
566 	sc->ghc = AHCI_GHC_AE;
567 	sc->is = 0;
568 
569 	if (sc->lintr) {
570 		pci_lintr_deassert(sc->asc_pi);
571 		sc->lintr = 0;
572 	}
573 
574 	for (i = 0; i < sc->ports; i++) {
575 		sc->port[i].ie = 0;
576 		sc->port[i].is = 0;
577 		sc->port[i].cmd = (AHCI_P_CMD_SUD | AHCI_P_CMD_POD);
578 		if (sc->port[i].bctx)
579 			sc->port[i].cmd |= AHCI_P_CMD_CPS;
580 		sc->port[i].sctl = 0;
581 		ahci_port_reset(&sc->port[i]);
582 	}
583 }
584 
585 static void
586 ata_string(uint8_t *dest, const char *src, int len)
587 {
588 	int i;
589 
590 	for (i = 0; i < len; i++) {
591 		if (*src)
592 			dest[i ^ 1] = *src++;
593 		else
594 			dest[i ^ 1] = ' ';
595 	}
596 }
597 
598 static void
599 atapi_string(uint8_t *dest, const char *src, int len)
600 {
601 	int i;
602 
603 	for (i = 0; i < len; i++) {
604 		if (*src)
605 			dest[i] = *src++;
606 		else
607 			dest[i] = ' ';
608 	}
609 }
610 
611 /*
612  * Build up the iovec based on the PRDT, 'done' and 'len'.
613  */
614 static void
615 ahci_build_iov(struct ahci_port *p, struct ahci_ioreq *aior,
616     struct ahci_prdt_entry *prdt, uint16_t prdtl)
617 {
618 	struct blockif_req *breq = &aior->io_req;
619 	uint32_t dbcsz, extra, left, skip, todo;
620 	int i, j;
621 
622 	assert(aior->len >= aior->done);
623 
624 	/* Copy part of PRDT between 'done' and 'len' bytes into the iov. */
625 	skip = aior->done;
626 	left = aior->len - aior->done;
627 	todo = 0;
628 	for (i = 0, j = 0; i < prdtl && j < BLOCKIF_IOV_MAX && left > 0;
629 	    i++, prdt++) {
630 		dbcsz = (prdt->dbc & DBCMASK) + 1;
631 		/* Skip already done part of the PRDT */
632 		if (dbcsz <= skip) {
633 			skip -= dbcsz;
634 			continue;
635 		}
636 		dbcsz -= skip;
637 		if (dbcsz > left)
638 			dbcsz = left;
639 		breq->br_iov[j].iov_base = paddr_guest2host(ahci_ctx(p->pr_sc),
640 		    prdt->dba + skip, dbcsz);
641 		breq->br_iov[j].iov_len = dbcsz;
642 		todo += dbcsz;
643 		left -= dbcsz;
644 		skip = 0;
645 		j++;
646 	}
647 
648 	/* If we got limited by IOV length, round I/O down to sector size. */
649 	if (j == BLOCKIF_IOV_MAX) {
650 		extra = todo % blockif_sectsz(p->bctx);
651 		todo -= extra;
652 		assert(todo > 0);
653 		while (extra > 0) {
654 			if (breq->br_iov[j - 1].iov_len > extra) {
655 				breq->br_iov[j - 1].iov_len -= extra;
656 				break;
657 			}
658 			extra -= breq->br_iov[j - 1].iov_len;
659 			j--;
660 		}
661 	}
662 
663 	breq->br_iovcnt = j;
664 	breq->br_resid = todo;
665 	aior->done += todo;
666 	aior->more = (aior->done < aior->len && i < prdtl);
667 }
668 
669 static void
670 ahci_handle_rw(struct ahci_port *p, int slot, uint8_t *cfis, uint32_t done)
671 {
672 	struct ahci_ioreq *aior;
673 	struct blockif_req *breq;
674 	struct ahci_prdt_entry *prdt;
675 	struct ahci_cmd_hdr *hdr;
676 	uint64_t lba;
677 	uint32_t len;
678 	int err, first, ncq, readop;
679 
680 	prdt = (struct ahci_prdt_entry *)(cfis + 0x80);
681 	hdr = (struct ahci_cmd_hdr *)(p->cmd_lst + slot * AHCI_CL_SIZE);
682 	ncq = 0;
683 	readop = 1;
684 	first = (done == 0);
685 
686 	if (cfis[2] == ATA_WRITE || cfis[2] == ATA_WRITE48 ||
687 	    cfis[2] == ATA_WRITE_MUL || cfis[2] == ATA_WRITE_MUL48 ||
688 	    cfis[2] == ATA_WRITE_DMA || cfis[2] == ATA_WRITE_DMA48 ||
689 	    cfis[2] == ATA_WRITE_FPDMA_QUEUED)
690 		readop = 0;
691 
692 	if (cfis[2] == ATA_WRITE_FPDMA_QUEUED ||
693 	    cfis[2] == ATA_READ_FPDMA_QUEUED) {
694 		lba = ((uint64_t)cfis[10] << 40) |
695 			((uint64_t)cfis[9] << 32) |
696 			((uint64_t)cfis[8] << 24) |
697 			((uint64_t)cfis[6] << 16) |
698 			((uint64_t)cfis[5] << 8) |
699 			cfis[4];
700 		len = cfis[11] << 8 | cfis[3];
701 		if (!len)
702 			len = 65536;
703 		ncq = 1;
704 	} else if (cfis[2] == ATA_READ48 || cfis[2] == ATA_WRITE48 ||
705 	    cfis[2] == ATA_READ_MUL48 || cfis[2] == ATA_WRITE_MUL48 ||
706 	    cfis[2] == ATA_READ_DMA48 || cfis[2] == ATA_WRITE_DMA48) {
707 		lba = ((uint64_t)cfis[10] << 40) |
708 			((uint64_t)cfis[9] << 32) |
709 			((uint64_t)cfis[8] << 24) |
710 			((uint64_t)cfis[6] << 16) |
711 			((uint64_t)cfis[5] << 8) |
712 			cfis[4];
713 		len = cfis[13] << 8 | cfis[12];
714 		if (!len)
715 			len = 65536;
716 	} else {
717 		lba = ((cfis[7] & 0xf) << 24) | (cfis[6] << 16) |
718 			(cfis[5] << 8) | cfis[4];
719 		len = cfis[12];
720 		if (!len)
721 			len = 256;
722 	}
723 	lba *= blockif_sectsz(p->bctx);
724 	len *= blockif_sectsz(p->bctx);
725 
726 	/* Pull request off free list */
727 	aior = STAILQ_FIRST(&p->iofhd);
728 	assert(aior != NULL);
729 	STAILQ_REMOVE_HEAD(&p->iofhd, io_flist);
730 
731 	aior->cfis = cfis;
732 	aior->slot = slot;
733 	aior->len = len;
734 	aior->done = done;
735 	aior->readop = readop;
736 	breq = &aior->io_req;
737 	breq->br_offset = lba + done;
738 	ahci_build_iov(p, aior, prdt, hdr->prdtl);
739 
740 	/* Mark this command in-flight. */
741 	p->pending |= 1 << slot;
742 
743 	/* Stuff request onto busy list. */
744 	TAILQ_INSERT_HEAD(&p->iobhd, aior, io_blist);
745 
746 	if (ncq && first)
747 		ahci_write_fis_d2h_ncq(p, slot);
748 
749 	if (readop)
750 		err = blockif_read(p->bctx, breq);
751 	else
752 		err = blockif_write(p->bctx, breq);
753 	assert(err == 0);
754 }
755 
756 static void
757 ahci_handle_flush(struct ahci_port *p, int slot, uint8_t *cfis)
758 {
759 	struct ahci_ioreq *aior;
760 	struct blockif_req *breq;
761 	int err;
762 
763 	/*
764 	 * Pull request off free list
765 	 */
766 	aior = STAILQ_FIRST(&p->iofhd);
767 	assert(aior != NULL);
768 	STAILQ_REMOVE_HEAD(&p->iofhd, io_flist);
769 	aior->cfis = cfis;
770 	aior->slot = slot;
771 	aior->len = 0;
772 	aior->done = 0;
773 	aior->more = 0;
774 	breq = &aior->io_req;
775 
776 	/*
777 	 * Mark this command in-flight.
778 	 */
779 	p->pending |= 1 << slot;
780 
781 	/*
782 	 * Stuff request onto busy list
783 	 */
784 	TAILQ_INSERT_HEAD(&p->iobhd, aior, io_blist);
785 
786 	err = blockif_flush(p->bctx, breq);
787 	assert(err == 0);
788 }
789 
790 static inline void
791 read_prdt(struct ahci_port *p, int slot, uint8_t *cfis, void *buf,
792     unsigned int size)
793 {
794 	struct ahci_cmd_hdr *hdr;
795 	struct ahci_prdt_entry *prdt;
796 	uint8_t *to;
797 	unsigned int len;
798 	int i;
799 
800 	hdr = (struct ahci_cmd_hdr *)(p->cmd_lst + slot * AHCI_CL_SIZE);
801 	len = size;
802 	to = buf;
803 	prdt = (struct ahci_prdt_entry *)(cfis + 0x80);
804 	for (i = 0; i < hdr->prdtl && len; i++) {
805 		uint8_t *ptr;
806 		uint32_t dbcsz;
807 		unsigned int sublen;
808 
809 		dbcsz = (prdt->dbc & DBCMASK) + 1;
810 		ptr = paddr_guest2host(ahci_ctx(p->pr_sc), prdt->dba, dbcsz);
811 		sublen = MIN(len, dbcsz);
812 		memcpy(to, ptr, sublen);
813 		len -= sublen;
814 		to += sublen;
815 		prdt++;
816 	}
817 }
818 
819 static void
820 ahci_handle_dsm_trim(struct ahci_port *p, int slot, uint8_t *cfis, uint32_t done)
821 {
822 	struct ahci_ioreq *aior;
823 	struct blockif_req *breq;
824 	uint8_t *entry;
825 	uint64_t elba;
826 	uint32_t len, elen;
827 	int err, first, ncq;
828 	uint8_t buf[512];
829 
830 	first = (done == 0);
831 	if (cfis[2] == ATA_DATA_SET_MANAGEMENT) {
832 		len = (uint16_t)cfis[13] << 8 | cfis[12];
833 		len *= 512;
834 		ncq = 0;
835 	} else { /* ATA_SEND_FPDMA_QUEUED */
836 		len = (uint16_t)cfis[11] << 8 | cfis[3];
837 		len *= 512;
838 		ncq = 1;
839 	}
840 	read_prdt(p, slot, cfis, buf, sizeof(buf));
841 
842 next:
843 	entry = &buf[done];
844 	elba = ((uint64_t)entry[5] << 40) |
845 		((uint64_t)entry[4] << 32) |
846 		((uint64_t)entry[3] << 24) |
847 		((uint64_t)entry[2] << 16) |
848 		((uint64_t)entry[1] << 8) |
849 		entry[0];
850 	elen = (uint16_t)entry[7] << 8 | entry[6];
851 	done += 8;
852 	if (elen == 0) {
853 		if (done >= len) {
854 			if (ncq) {
855 				if (first)
856 					ahci_write_fis_d2h_ncq(p, slot);
857 				ahci_write_fis_sdb(p, slot, cfis,
858 				    ATA_S_READY | ATA_S_DSC);
859 			} else {
860 				ahci_write_fis_d2h(p, slot, cfis,
861 				    ATA_S_READY | ATA_S_DSC);
862 			}
863 			p->pending &= ~(1 << slot);
864 			ahci_check_stopped(p);
865 			if (!first)
866 				ahci_handle_port(p);
867 			return;
868 		}
869 		goto next;
870 	}
871 
872 	/*
873 	 * Pull request off free list
874 	 */
875 	aior = STAILQ_FIRST(&p->iofhd);
876 	assert(aior != NULL);
877 	STAILQ_REMOVE_HEAD(&p->iofhd, io_flist);
878 	aior->cfis = cfis;
879 	aior->slot = slot;
880 	aior->len = len;
881 	aior->done = done;
882 	aior->more = (len != done);
883 
884 	breq = &aior->io_req;
885 	breq->br_offset = elba * blockif_sectsz(p->bctx);
886 	breq->br_resid = elen * blockif_sectsz(p->bctx);
887 
888 	/*
889 	 * Mark this command in-flight.
890 	 */
891 	p->pending |= 1 << slot;
892 
893 	/*
894 	 * Stuff request onto busy list
895 	 */
896 	TAILQ_INSERT_HEAD(&p->iobhd, aior, io_blist);
897 
898 	if (ncq && first)
899 		ahci_write_fis_d2h_ncq(p, slot);
900 
901 	err = blockif_delete(p->bctx, breq);
902 	assert(err == 0);
903 }
904 
905 static inline void
906 write_prdt(struct ahci_port *p, int slot, uint8_t *cfis, void *buf,
907     unsigned int size)
908 {
909 	struct ahci_cmd_hdr *hdr;
910 	struct ahci_prdt_entry *prdt;
911 	uint8_t *from;
912 	unsigned int len;
913 	int i;
914 
915 	hdr = (struct ahci_cmd_hdr *)(p->cmd_lst + slot * AHCI_CL_SIZE);
916 	len = size;
917 	from = buf;
918 	prdt = (struct ahci_prdt_entry *)(cfis + 0x80);
919 	for (i = 0; i < hdr->prdtl && len; i++) {
920 		uint8_t *ptr;
921 		uint32_t dbcsz;
922 		int sublen;
923 
924 		dbcsz = (prdt->dbc & DBCMASK) + 1;
925 		ptr = paddr_guest2host(ahci_ctx(p->pr_sc), prdt->dba, dbcsz);
926 		sublen = MIN(len, dbcsz);
927 		memcpy(ptr, from, sublen);
928 		len -= sublen;
929 		from += sublen;
930 		prdt++;
931 	}
932 	hdr->prdbc = size - len;
933 }
934 
935 static void
936 ahci_checksum(uint8_t *buf, int size)
937 {
938 	int i;
939 	uint8_t sum = 0;
940 
941 	for (i = 0; i < size - 1; i++)
942 		sum += buf[i];
943 	buf[size - 1] = 0x100 - sum;
944 }
945 
946 static void
947 ahci_handle_read_log(struct ahci_port *p, int slot, uint8_t *cfis)
948 {
949 	struct ahci_cmd_hdr *hdr;
950 	uint32_t buf[128];
951 	uint8_t *buf8 = (uint8_t *)buf;
952 	uint16_t *buf16 = (uint16_t *)buf;
953 
954 	hdr = (struct ahci_cmd_hdr *)(p->cmd_lst + slot * AHCI_CL_SIZE);
955 	if (p->atapi || hdr->prdtl == 0 || cfis[5] != 0 ||
956 	    cfis[9] != 0 || cfis[12] != 1 || cfis[13] != 0) {
957 		ahci_write_fis_d2h(p, slot, cfis,
958 		    (ATA_E_ABORT << 8) | ATA_S_READY | ATA_S_ERROR);
959 		return;
960 	}
961 
962 	memset(buf, 0, sizeof(buf));
963 	if (cfis[4] == 0x00) {	/* Log directory */
964 		buf16[0x00] = 1; /* Version -- 1 */
965 		buf16[0x10] = 1; /* NCQ Command Error Log -- 1 page */
966 		buf16[0x13] = 1; /* SATA NCQ Send and Receive Log -- 1 page */
967 	} else if (cfis[4] == 0x10) {	/* NCQ Command Error Log */
968 		memcpy(buf8, p->err_cfis, sizeof(p->err_cfis));
969 		ahci_checksum(buf8, sizeof(buf));
970 	} else if (cfis[4] == 0x13) {	/* SATA NCQ Send and Receive Log */
971 		if (blockif_candelete(p->bctx) && !blockif_is_ro(p->bctx)) {
972 			buf[0x00] = 1;	/* SFQ DSM supported */
973 			buf[0x01] = 1;	/* SFQ DSM TRIM supported */
974 		}
975 	} else {
976 		ahci_write_fis_d2h(p, slot, cfis,
977 		    (ATA_E_ABORT << 8) | ATA_S_READY | ATA_S_ERROR);
978 		return;
979 	}
980 
981 	if (cfis[2] == ATA_READ_LOG_EXT)
982 		ahci_write_fis_piosetup(p);
983 	write_prdt(p, slot, cfis, (void *)buf, sizeof(buf));
984 	ahci_write_fis_d2h(p, slot, cfis, ATA_S_DSC | ATA_S_READY);
985 }
986 
987 static void
988 handle_identify(struct ahci_port *p, int slot, uint8_t *cfis)
989 {
990 	struct ahci_cmd_hdr *hdr;
991 
992 	hdr = (struct ahci_cmd_hdr *)(p->cmd_lst + slot * AHCI_CL_SIZE);
993 	if (p->atapi || hdr->prdtl == 0) {
994 		ahci_write_fis_d2h(p, slot, cfis,
995 		    (ATA_E_ABORT << 8) | ATA_S_READY | ATA_S_ERROR);
996 	} else {
997 		ahci_write_fis_piosetup(p);
998 		write_prdt(p, slot, cfis, (void*)&p->ata_ident, sizeof(struct ata_params));
999 		ahci_write_fis_d2h(p, slot, cfis, ATA_S_DSC | ATA_S_READY);
1000 	}
1001 }
1002 
1003 static void
1004 ata_identify_init(struct ahci_port* p, int atapi)
1005 {
1006 	struct ata_params* ata_ident = &p->ata_ident;
1007 
1008 	if (atapi) {
1009 		ata_ident->config = ATA_PROTO_ATAPI | ATA_ATAPI_TYPE_CDROM |
1010 		    ATA_ATAPI_REMOVABLE | ATA_DRQ_FAST;
1011 		ata_ident->capabilities1 = ATA_SUPPORT_LBA |
1012 			ATA_SUPPORT_DMA;
1013 		ata_ident->capabilities2 = (1 << 14 | 1);
1014 		ata_ident->atavalid = ATA_FLAG_64_70 | ATA_FLAG_88;
1015 		ata_ident->obsolete62 = 0x3f;
1016 		ata_ident->mwdmamodes = 7;
1017 		if (p->xfermode & ATA_WDMA0)
1018 			ata_ident->mwdmamodes |= (1 << ((p->xfermode & 7) + 8));
1019 		ata_ident->apiomodes = 3;
1020 		ata_ident->mwdmamin = 0x0078;
1021 		ata_ident->mwdmarec = 0x0078;
1022 		ata_ident->pioblind = 0x0078;
1023 		ata_ident->pioiordy = 0x0078;
1024 		ata_ident->satacapabilities = (ATA_SATA_GEN1 | ATA_SATA_GEN2 | ATA_SATA_GEN3);
1025 		ata_ident->satacapabilities2 = ((p->ssts & ATA_SS_SPD_MASK) >> 3);
1026 		ata_ident->satasupport = ATA_SUPPORT_NCQ_STREAM;
1027 		ata_ident->version_major = 0x3f0;
1028 		ata_ident->support.command1 = (ATA_SUPPORT_POWERMGT | ATA_SUPPORT_PACKET |
1029 			ATA_SUPPORT_RESET | ATA_SUPPORT_NOP);
1030 		ata_ident->support.command2 = (1 << 14);
1031 		ata_ident->support.extension = (1 << 14);
1032 		ata_ident->enabled.command1 = (ATA_SUPPORT_POWERMGT | ATA_SUPPORT_PACKET |
1033 			ATA_SUPPORT_RESET | ATA_SUPPORT_NOP);
1034 		ata_ident->enabled.extension = (1 << 14);
1035 		ata_ident->udmamodes = 0x7f;
1036 		if (p->xfermode & ATA_UDMA0)
1037 			ata_ident->udmamodes |= (1 << ((p->xfermode & 7) + 8));
1038 		ata_ident->transport_major = 0x1020;
1039 		ata_ident->integrity = 0x00a5;
1040 	} else {
1041 		uint64_t sectors;
1042 		int sectsz, psectsz, psectoff, candelete, ro;
1043 		uint16_t cyl;
1044 		uint8_t sech, heads;
1045 
1046 		ro = blockif_is_ro(p->bctx);
1047 		candelete = blockif_candelete(p->bctx);
1048 		sectsz = blockif_sectsz(p->bctx);
1049 		sectors = blockif_size(p->bctx) / sectsz;
1050 		blockif_chs(p->bctx, &cyl, &heads, &sech);
1051 		blockif_psectsz(p->bctx, &psectsz, &psectoff);
1052 		ata_ident->config = ATA_DRQ_FAST;
1053 		ata_ident->cylinders = cyl;
1054 		ata_ident->heads = heads;
1055 		ata_ident->sectors = sech;
1056 
1057 		ata_ident->sectors_intr = (0x8000 | 128);
1058 		ata_ident->tcg = 0;
1059 
1060 		ata_ident->capabilities1 = ATA_SUPPORT_DMA |
1061 			ATA_SUPPORT_LBA | ATA_SUPPORT_IORDY;
1062 		ata_ident->capabilities2 = (1 << 14);
1063 		ata_ident->atavalid = ATA_FLAG_64_70 | ATA_FLAG_88;
1064 		if (p->mult_sectors)
1065 			ata_ident->multi = (ATA_MULTI_VALID | p->mult_sectors);
1066 		if (sectors <= 0x0fffffff) {
1067 			ata_ident->lba_size_1 = sectors;
1068 			ata_ident->lba_size_2 = (sectors >> 16);
1069 		} else {
1070 			ata_ident->lba_size_1 = 0xffff;
1071 			ata_ident->lba_size_2 = 0x0fff;
1072 		}
1073 		ata_ident->mwdmamodes = 0x7;
1074 		if (p->xfermode & ATA_WDMA0)
1075 			ata_ident->mwdmamodes |= (1 << ((p->xfermode & 7) + 8));
1076 		ata_ident->apiomodes = 0x3;
1077 		ata_ident->mwdmamin = 0x0078;
1078 		ata_ident->mwdmarec = 0x0078;
1079 		ata_ident->pioblind = 0x0078;
1080 		ata_ident->pioiordy = 0x0078;
1081 		ata_ident->support3 = 0;
1082 		ata_ident->queue = 31;
1083 		ata_ident->satacapabilities = (ATA_SATA_GEN1 | ATA_SATA_GEN2 | ATA_SATA_GEN3 |
1084 			ATA_SUPPORT_NCQ);
1085 		ata_ident->satacapabilities2 = (ATA_SUPPORT_RCVSND_FPDMA_QUEUED |
1086 			(p->ssts & ATA_SS_SPD_MASK) >> 3);
1087 		ata_ident->version_major = 0x3f0;
1088 		ata_ident->version_minor = 0x28;
1089 		ata_ident->support.command1 = (ATA_SUPPORT_POWERMGT | ATA_SUPPORT_WRITECACHE |
1090 			ATA_SUPPORT_LOOKAHEAD | ATA_SUPPORT_NOP);
1091 		ata_ident->support.command2 = (ATA_SUPPORT_ADDRESS48 | ATA_SUPPORT_FLUSHCACHE |
1092 			ATA_SUPPORT_FLUSHCACHE48 | 1 << 14);
1093 		ata_ident->support.extension = (1 << 14);
1094 		ata_ident->enabled.command1 = (ATA_SUPPORT_POWERMGT | ATA_SUPPORT_WRITECACHE |
1095 			ATA_SUPPORT_LOOKAHEAD | ATA_SUPPORT_NOP);
1096 		ata_ident->enabled.command2 = (ATA_SUPPORT_ADDRESS48 | ATA_SUPPORT_FLUSHCACHE |
1097 			ATA_SUPPORT_FLUSHCACHE48 | 1 << 15);
1098 		ata_ident->enabled.extension = (1 << 14);
1099 		ata_ident->udmamodes = 0x7f;
1100 		if (p->xfermode & ATA_UDMA0)
1101 			ata_ident->udmamodes |= (1 << ((p->xfermode & 7) + 8));
1102 		ata_ident->lba_size48_1 = sectors;
1103 		ata_ident->lba_size48_2 = (sectors >> 16);
1104 		ata_ident->lba_size48_3 = (sectors >> 32);
1105 		ata_ident->lba_size48_4 = (sectors >> 48);
1106 
1107 		if (candelete && !ro) {
1108 			ata_ident->support3 |= ATA_SUPPORT_RZAT | ATA_SUPPORT_DRAT;
1109 			ata_ident->max_dsm_blocks = 1;
1110 			ata_ident->support_dsm = ATA_SUPPORT_DSM_TRIM;
1111 		}
1112 		ata_ident->pss = ATA_PSS_VALID_VALUE;
1113 		ata_ident->lsalign = 0x4000;
1114 		if (psectsz > sectsz) {
1115 			ata_ident->pss |= ATA_PSS_MULTLS;
1116 			ata_ident->pss |= ffsl(psectsz / sectsz) - 1;
1117 			ata_ident->lsalign |= (psectoff / sectsz);
1118 		}
1119 		if (sectsz > 512) {
1120 			ata_ident->pss |= ATA_PSS_LSSABOVE512;
1121 			ata_ident->lss_1 = sectsz / 2;
1122 			ata_ident->lss_2 = ((sectsz / 2) >> 16);
1123 		}
1124 		ata_ident->support2 = (ATA_SUPPORT_RWLOGDMAEXT | 1 << 14);
1125 		ata_ident->enabled2 = (ATA_SUPPORT_RWLOGDMAEXT | 1 << 14);
1126 		ata_ident->transport_major = 0x1020;
1127 		ata_ident->integrity = 0x00a5;
1128 	}
1129 	ahci_checksum((uint8_t*)ata_ident, sizeof(struct ata_params));
1130 }
1131 
1132 static void
1133 handle_atapi_identify(struct ahci_port *p, int slot, uint8_t *cfis)
1134 {
1135 	if (!p->atapi) {
1136 		ahci_write_fis_d2h(p, slot, cfis,
1137 		    (ATA_E_ABORT << 8) | ATA_S_READY | ATA_S_ERROR);
1138 	} else {
1139 		ahci_write_fis_piosetup(p);
1140 		write_prdt(p, slot, cfis, (void *)&p->ata_ident, sizeof(struct ata_params));
1141 		ahci_write_fis_d2h(p, slot, cfis, ATA_S_DSC | ATA_S_READY);
1142 	}
1143 }
1144 
1145 static void
1146 atapi_inquiry(struct ahci_port *p, int slot, uint8_t *cfis)
1147 {
1148 	uint8_t buf[36];
1149 	uint8_t *acmd;
1150 	unsigned int len;
1151 	uint32_t tfd;
1152 
1153 	acmd = cfis + 0x40;
1154 
1155 	if (acmd[1] & 1) {		/* VPD */
1156 		if (acmd[2] == 0) {	/* Supported VPD pages */
1157 			buf[0] = 0x05;
1158 			buf[1] = 0;
1159 			buf[2] = 0;
1160 			buf[3] = 1;
1161 			buf[4] = 0;
1162 			len = 4 + buf[3];
1163 		} else {
1164 			p->sense_key = ATA_SENSE_ILLEGAL_REQUEST;
1165 			p->asc = 0x24;
1166 			tfd = (p->sense_key << 12) | ATA_S_READY | ATA_S_ERROR;
1167 			cfis[4] = (cfis[4] & ~7) | ATA_I_CMD | ATA_I_IN;
1168 			ahci_write_fis_d2h(p, slot, cfis, tfd);
1169 			return;
1170 		}
1171 	} else {
1172 		buf[0] = 0x05;
1173 		buf[1] = 0x80;
1174 		buf[2] = 0x00;
1175 		buf[3] = 0x21;
1176 		buf[4] = 31;
1177 		buf[5] = 0;
1178 		buf[6] = 0;
1179 		buf[7] = 0;
1180 		atapi_string(buf + 8, "BHYVE", 8);
1181 		atapi_string(buf + 16, "BHYVE DVD-ROM", 16);
1182 		atapi_string(buf + 32, "001", 4);
1183 		len = sizeof(buf);
1184 	}
1185 
1186 	if (len > acmd[4])
1187 		len = acmd[4];
1188 	cfis[4] = (cfis[4] & ~7) | ATA_I_CMD | ATA_I_IN;
1189 	write_prdt(p, slot, cfis, buf, len);
1190 	ahci_write_fis_d2h(p, slot, cfis, ATA_S_READY | ATA_S_DSC);
1191 }
1192 
1193 static void
1194 atapi_read_capacity(struct ahci_port *p, int slot, uint8_t *cfis)
1195 {
1196 	uint8_t buf[8];
1197 	uint64_t sectors;
1198 
1199 	sectors = blockif_size(p->bctx) / 2048;
1200 	be32enc(buf, sectors - 1);
1201 	be32enc(buf + 4, 2048);
1202 	cfis[4] = (cfis[4] & ~7) | ATA_I_CMD | ATA_I_IN;
1203 	write_prdt(p, slot, cfis, buf, sizeof(buf));
1204 	ahci_write_fis_d2h(p, slot, cfis, ATA_S_READY | ATA_S_DSC);
1205 }
1206 
1207 static void
1208 atapi_read_toc(struct ahci_port *p, int slot, uint8_t *cfis)
1209 {
1210 	uint8_t *acmd;
1211 	uint8_t format;
1212 	unsigned int len;
1213 
1214 	acmd = cfis + 0x40;
1215 
1216 	len = be16dec(acmd + 7);
1217 	format = acmd[9] >> 6;
1218 	switch (format) {
1219 	case 0:
1220 	{
1221 		size_t size;
1222 		int msf;
1223 		uint64_t sectors;
1224 		uint8_t start_track, buf[20], *bp;
1225 
1226 		msf = (acmd[1] >> 1) & 1;
1227 		start_track = acmd[6];
1228 		if (start_track > 1 && start_track != 0xaa) {
1229 			uint32_t tfd;
1230 			p->sense_key = ATA_SENSE_ILLEGAL_REQUEST;
1231 			p->asc = 0x24;
1232 			tfd = (p->sense_key << 12) | ATA_S_READY | ATA_S_ERROR;
1233 			cfis[4] = (cfis[4] & ~7) | ATA_I_CMD | ATA_I_IN;
1234 			ahci_write_fis_d2h(p, slot, cfis, tfd);
1235 			return;
1236 		}
1237 		bp = buf + 2;
1238 		*bp++ = 1;
1239 		*bp++ = 1;
1240 		if (start_track <= 1) {
1241 			*bp++ = 0;
1242 			*bp++ = 0x14;
1243 			*bp++ = 1;
1244 			*bp++ = 0;
1245 			if (msf) {
1246 				*bp++ = 0;
1247 				lba_to_msf(bp, 0);
1248 				bp += 3;
1249 			} else {
1250 				*bp++ = 0;
1251 				*bp++ = 0;
1252 				*bp++ = 0;
1253 				*bp++ = 0;
1254 			}
1255 		}
1256 		*bp++ = 0;
1257 		*bp++ = 0x14;
1258 		*bp++ = 0xaa;
1259 		*bp++ = 0;
1260 		sectors = blockif_size(p->bctx) / blockif_sectsz(p->bctx);
1261 		sectors >>= 2;
1262 		if (msf) {
1263 			*bp++ = 0;
1264 			lba_to_msf(bp, sectors);
1265 			bp += 3;
1266 		} else {
1267 			be32enc(bp, sectors);
1268 			bp += 4;
1269 		}
1270 		size = bp - buf;
1271 		be16enc(buf, size - 2);
1272 		if (len > size)
1273 			len = size;
1274 		write_prdt(p, slot, cfis, buf, len);
1275 		cfis[4] = (cfis[4] & ~7) | ATA_I_CMD | ATA_I_IN;
1276 		ahci_write_fis_d2h(p, slot, cfis, ATA_S_READY | ATA_S_DSC);
1277 		break;
1278 	}
1279 	case 1:
1280 	{
1281 		uint8_t buf[12];
1282 
1283 		memset(buf, 0, sizeof(buf));
1284 		buf[1] = 0xa;
1285 		buf[2] = 0x1;
1286 		buf[3] = 0x1;
1287 		if (len > sizeof(buf))
1288 			len = sizeof(buf);
1289 		write_prdt(p, slot, cfis, buf, len);
1290 		cfis[4] = (cfis[4] & ~7) | ATA_I_CMD | ATA_I_IN;
1291 		ahci_write_fis_d2h(p, slot, cfis, ATA_S_READY | ATA_S_DSC);
1292 		break;
1293 	}
1294 	case 2:
1295 	{
1296 		size_t size;
1297 		int msf;
1298 		uint64_t sectors;
1299 		uint8_t *bp, buf[50];
1300 
1301 		msf = (acmd[1] >> 1) & 1;
1302 		bp = buf + 2;
1303 		*bp++ = 1;
1304 		*bp++ = 1;
1305 
1306 		*bp++ = 1;
1307 		*bp++ = 0x14;
1308 		*bp++ = 0;
1309 		*bp++ = 0xa0;
1310 		*bp++ = 0;
1311 		*bp++ = 0;
1312 		*bp++ = 0;
1313 		*bp++ = 0;
1314 		*bp++ = 1;
1315 		*bp++ = 0;
1316 		*bp++ = 0;
1317 
1318 		*bp++ = 1;
1319 		*bp++ = 0x14;
1320 		*bp++ = 0;
1321 		*bp++ = 0xa1;
1322 		*bp++ = 0;
1323 		*bp++ = 0;
1324 		*bp++ = 0;
1325 		*bp++ = 0;
1326 		*bp++ = 1;
1327 		*bp++ = 0;
1328 		*bp++ = 0;
1329 
1330 		*bp++ = 1;
1331 		*bp++ = 0x14;
1332 		*bp++ = 0;
1333 		*bp++ = 0xa2;
1334 		*bp++ = 0;
1335 		*bp++ = 0;
1336 		*bp++ = 0;
1337 		sectors = blockif_size(p->bctx) / blockif_sectsz(p->bctx);
1338 		sectors >>= 2;
1339 		if (msf) {
1340 			*bp++ = 0;
1341 			lba_to_msf(bp, sectors);
1342 			bp += 3;
1343 		} else {
1344 			be32enc(bp, sectors);
1345 			bp += 4;
1346 		}
1347 
1348 		*bp++ = 1;
1349 		*bp++ = 0x14;
1350 		*bp++ = 0;
1351 		*bp++ = 1;
1352 		*bp++ = 0;
1353 		*bp++ = 0;
1354 		*bp++ = 0;
1355 		if (msf) {
1356 			*bp++ = 0;
1357 			lba_to_msf(bp, 0);
1358 			bp += 3;
1359 		} else {
1360 			*bp++ = 0;
1361 			*bp++ = 0;
1362 			*bp++ = 0;
1363 			*bp++ = 0;
1364 		}
1365 
1366 		size = bp - buf;
1367 		be16enc(buf, size - 2);
1368 		if (len > size)
1369 			len = size;
1370 		write_prdt(p, slot, cfis, buf, len);
1371 		cfis[4] = (cfis[4] & ~7) | ATA_I_CMD | ATA_I_IN;
1372 		ahci_write_fis_d2h(p, slot, cfis, ATA_S_READY | ATA_S_DSC);
1373 		break;
1374 	}
1375 	default:
1376 	{
1377 		uint32_t tfd;
1378 
1379 		p->sense_key = ATA_SENSE_ILLEGAL_REQUEST;
1380 		p->asc = 0x24;
1381 		tfd = (p->sense_key << 12) | ATA_S_READY | ATA_S_ERROR;
1382 		cfis[4] = (cfis[4] & ~7) | ATA_I_CMD | ATA_I_IN;
1383 		ahci_write_fis_d2h(p, slot, cfis, tfd);
1384 		break;
1385 	}
1386 	}
1387 }
1388 
1389 static void
1390 atapi_report_luns(struct ahci_port *p, int slot, uint8_t *cfis)
1391 {
1392 	uint8_t buf[16];
1393 
1394 	memset(buf, 0, sizeof(buf));
1395 	buf[3] = 8;
1396 
1397 	cfis[4] = (cfis[4] & ~7) | ATA_I_CMD | ATA_I_IN;
1398 	write_prdt(p, slot, cfis, buf, sizeof(buf));
1399 	ahci_write_fis_d2h(p, slot, cfis, ATA_S_READY | ATA_S_DSC);
1400 }
1401 
1402 static void
1403 atapi_read(struct ahci_port *p, int slot, uint8_t *cfis, uint32_t done)
1404 {
1405 	struct ahci_ioreq *aior;
1406 	struct ahci_cmd_hdr *hdr;
1407 	struct ahci_prdt_entry *prdt;
1408 	struct blockif_req *breq;
1409 	uint8_t *acmd;
1410 	uint64_t lba;
1411 	uint32_t len;
1412 	int err;
1413 
1414 	acmd = cfis + 0x40;
1415 	hdr = (struct ahci_cmd_hdr *)(p->cmd_lst + slot * AHCI_CL_SIZE);
1416 	prdt = (struct ahci_prdt_entry *)(cfis + 0x80);
1417 
1418 	lba = be32dec(acmd + 2);
1419 	if (acmd[0] == READ_10)
1420 		len = be16dec(acmd + 7);
1421 	else
1422 		len = be32dec(acmd + 6);
1423 	if (len == 0) {
1424 		cfis[4] = (cfis[4] & ~7) | ATA_I_CMD | ATA_I_IN;
1425 		ahci_write_fis_d2h(p, slot, cfis, ATA_S_READY | ATA_S_DSC);
1426 	}
1427 	lba *= 2048;
1428 	len *= 2048;
1429 
1430 	/*
1431 	 * Pull request off free list
1432 	 */
1433 	aior = STAILQ_FIRST(&p->iofhd);
1434 	assert(aior != NULL);
1435 	STAILQ_REMOVE_HEAD(&p->iofhd, io_flist);
1436 	aior->cfis = cfis;
1437 	aior->slot = slot;
1438 	aior->len = len;
1439 	aior->done = done;
1440 	aior->readop = 1;
1441 	breq = &aior->io_req;
1442 	breq->br_offset = lba + done;
1443 	ahci_build_iov(p, aior, prdt, hdr->prdtl);
1444 
1445 	/* Mark this command in-flight. */
1446 	p->pending |= 1 << slot;
1447 
1448 	/* Stuff request onto busy list. */
1449 	TAILQ_INSERT_HEAD(&p->iobhd, aior, io_blist);
1450 
1451 	err = blockif_read(p->bctx, breq);
1452 	assert(err == 0);
1453 }
1454 
1455 static void
1456 atapi_request_sense(struct ahci_port *p, int slot, uint8_t *cfis)
1457 {
1458 	uint8_t buf[64];
1459 	uint8_t *acmd;
1460 	unsigned int len;
1461 
1462 	acmd = cfis + 0x40;
1463 	len = acmd[4];
1464 	if (len > sizeof(buf))
1465 		len = sizeof(buf);
1466 	memset(buf, 0, len);
1467 	buf[0] = 0x70 | (1 << 7);
1468 	buf[2] = p->sense_key;
1469 	buf[7] = 10;
1470 	buf[12] = p->asc;
1471 	write_prdt(p, slot, cfis, buf, len);
1472 	cfis[4] = (cfis[4] & ~7) | ATA_I_CMD | ATA_I_IN;
1473 	ahci_write_fis_d2h(p, slot, cfis, ATA_S_READY | ATA_S_DSC);
1474 }
1475 
1476 static void
1477 atapi_start_stop_unit(struct ahci_port *p, int slot, uint8_t *cfis)
1478 {
1479 	uint8_t *acmd = cfis + 0x40;
1480 	uint32_t tfd;
1481 
1482 	switch (acmd[4] & 3) {
1483 	case 0:
1484 	case 1:
1485 	case 3:
1486 		cfis[4] = (cfis[4] & ~7) | ATA_I_CMD | ATA_I_IN;
1487 		tfd = ATA_S_READY | ATA_S_DSC;
1488 		break;
1489 	case 2:
1490 		/* TODO eject media */
1491 		cfis[4] = (cfis[4] & ~7) | ATA_I_CMD | ATA_I_IN;
1492 		p->sense_key = ATA_SENSE_ILLEGAL_REQUEST;
1493 		p->asc = 0x53;
1494 		tfd = (p->sense_key << 12) | ATA_S_READY | ATA_S_ERROR;
1495 		break;
1496 	}
1497 	ahci_write_fis_d2h(p, slot, cfis, tfd);
1498 }
1499 
1500 static void
1501 atapi_mode_sense(struct ahci_port *p, int slot, uint8_t *cfis)
1502 {
1503 	uint8_t *acmd;
1504 	uint32_t tfd;
1505 	uint8_t pc, code;
1506 	unsigned int len;
1507 
1508 	acmd = cfis + 0x40;
1509 	len = be16dec(acmd + 7);
1510 	pc = acmd[2] >> 6;
1511 	code = acmd[2] & 0x3f;
1512 
1513 	switch (pc) {
1514 	case 0:
1515 		switch (code) {
1516 		case MODEPAGE_RW_ERROR_RECOVERY:
1517 		{
1518 			uint8_t buf[16];
1519 
1520 			if (len > sizeof(buf))
1521 				len = sizeof(buf);
1522 
1523 			memset(buf, 0, sizeof(buf));
1524 			be16enc(buf, 16 - 2);
1525 			buf[2] = 0x70;
1526 			buf[8] = 0x01;
1527 			buf[9] = 16 - 10;
1528 			buf[11] = 0x05;
1529 			write_prdt(p, slot, cfis, buf, len);
1530 			tfd = ATA_S_READY | ATA_S_DSC;
1531 			break;
1532 		}
1533 		case MODEPAGE_CD_CAPABILITIES:
1534 		{
1535 			uint8_t buf[30];
1536 
1537 			if (len > sizeof(buf))
1538 				len = sizeof(buf);
1539 
1540 			memset(buf, 0, sizeof(buf));
1541 			be16enc(buf, 30 - 2);
1542 			buf[2] = 0x70;
1543 			buf[8] = 0x2A;
1544 			buf[9] = 30 - 10;
1545 			buf[10] = 0x08;
1546 			buf[12] = 0x71;
1547 			be16enc(&buf[18], 2);
1548 			be16enc(&buf[20], 512);
1549 			write_prdt(p, slot, cfis, buf, len);
1550 			tfd = ATA_S_READY | ATA_S_DSC;
1551 			break;
1552 		}
1553 		default:
1554 			goto error;
1555 			break;
1556 		}
1557 		break;
1558 	case 3:
1559 		p->sense_key = ATA_SENSE_ILLEGAL_REQUEST;
1560 		p->asc = 0x39;
1561 		tfd = (p->sense_key << 12) | ATA_S_READY | ATA_S_ERROR;
1562 		break;
1563 error:
1564 	case 1:
1565 	case 2:
1566 		p->sense_key = ATA_SENSE_ILLEGAL_REQUEST;
1567 		p->asc = 0x24;
1568 		tfd = (p->sense_key << 12) | ATA_S_READY | ATA_S_ERROR;
1569 		break;
1570 	}
1571 	cfis[4] = (cfis[4] & ~7) | ATA_I_CMD | ATA_I_IN;
1572 	ahci_write_fis_d2h(p, slot, cfis, tfd);
1573 }
1574 
1575 static void
1576 atapi_get_event_status_notification(struct ahci_port *p, int slot,
1577     uint8_t *cfis)
1578 {
1579 	uint8_t *acmd;
1580 	uint32_t tfd;
1581 
1582 	acmd = cfis + 0x40;
1583 
1584 	/* we don't support asynchronous operation */
1585 	if (!(acmd[1] & 1)) {
1586 		p->sense_key = ATA_SENSE_ILLEGAL_REQUEST;
1587 		p->asc = 0x24;
1588 		tfd = (p->sense_key << 12) | ATA_S_READY | ATA_S_ERROR;
1589 	} else {
1590 		uint8_t buf[8];
1591 		unsigned int len;
1592 
1593 		len = be16dec(acmd + 7);
1594 		if (len > sizeof(buf))
1595 			len = sizeof(buf);
1596 
1597 		memset(buf, 0, sizeof(buf));
1598 		be16enc(buf, 8 - 2);
1599 		buf[2] = 0x04;
1600 		buf[3] = 0x10;
1601 		buf[5] = 0x02;
1602 		write_prdt(p, slot, cfis, buf, len);
1603 		tfd = ATA_S_READY | ATA_S_DSC;
1604 	}
1605 	cfis[4] = (cfis[4] & ~7) | ATA_I_CMD | ATA_I_IN;
1606 	ahci_write_fis_d2h(p, slot, cfis, tfd);
1607 }
1608 
1609 static void
1610 handle_packet_cmd(struct ahci_port *p, int slot, uint8_t *cfis)
1611 {
1612 	uint8_t *acmd;
1613 
1614 	acmd = cfis + 0x40;
1615 
1616 #ifdef AHCI_DEBUG
1617 	{
1618 		int i;
1619 		DPRINTF("ACMD:");
1620 		for (i = 0; i < 16; i++)
1621 			DPRINTF("%02x ", acmd[i]);
1622 		DPRINTF("");
1623 	}
1624 #endif
1625 
1626 	switch (acmd[0]) {
1627 	case TEST_UNIT_READY:
1628 		cfis[4] = (cfis[4] & ~7) | ATA_I_CMD | ATA_I_IN;
1629 		ahci_write_fis_d2h(p, slot, cfis, ATA_S_READY | ATA_S_DSC);
1630 		break;
1631 	case INQUIRY:
1632 		atapi_inquiry(p, slot, cfis);
1633 		break;
1634 	case READ_CAPACITY:
1635 		atapi_read_capacity(p, slot, cfis);
1636 		break;
1637 	case PREVENT_ALLOW:
1638 		/* TODO */
1639 		cfis[4] = (cfis[4] & ~7) | ATA_I_CMD | ATA_I_IN;
1640 		ahci_write_fis_d2h(p, slot, cfis, ATA_S_READY | ATA_S_DSC);
1641 		break;
1642 	case READ_TOC:
1643 		atapi_read_toc(p, slot, cfis);
1644 		break;
1645 	case REPORT_LUNS:
1646 		atapi_report_luns(p, slot, cfis);
1647 		break;
1648 	case READ_10:
1649 	case READ_12:
1650 		atapi_read(p, slot, cfis, 0);
1651 		break;
1652 	case REQUEST_SENSE:
1653 		atapi_request_sense(p, slot, cfis);
1654 		break;
1655 	case START_STOP_UNIT:
1656 		atapi_start_stop_unit(p, slot, cfis);
1657 		break;
1658 	case MODE_SENSE_10:
1659 		atapi_mode_sense(p, slot, cfis);
1660 		break;
1661 	case GET_EVENT_STATUS_NOTIFICATION:
1662 		atapi_get_event_status_notification(p, slot, cfis);
1663 		break;
1664 	default:
1665 		cfis[4] = (cfis[4] & ~7) | ATA_I_CMD | ATA_I_IN;
1666 		p->sense_key = ATA_SENSE_ILLEGAL_REQUEST;
1667 		p->asc = 0x20;
1668 		ahci_write_fis_d2h(p, slot, cfis, (p->sense_key << 12) |
1669 				ATA_S_READY | ATA_S_ERROR);
1670 		break;
1671 	}
1672 }
1673 
1674 static void
1675 ahci_handle_cmd(struct ahci_port *p, int slot, uint8_t *cfis)
1676 {
1677 
1678 	p->tfd |= ATA_S_BUSY;
1679 	switch (cfis[2]) {
1680 	case ATA_ATA_IDENTIFY:
1681 		handle_identify(p, slot, cfis);
1682 		break;
1683 	case ATA_SETFEATURES:
1684 	{
1685 		switch (cfis[3]) {
1686 		case ATA_SF_ENAB_SATA_SF:
1687 			switch (cfis[12]) {
1688 			case ATA_SATA_SF_AN:
1689 				p->tfd = ATA_S_DSC | ATA_S_READY;
1690 				break;
1691 			default:
1692 				p->tfd = ATA_S_ERROR | ATA_S_READY;
1693 				p->tfd |= (ATA_ERROR_ABORT << 8);
1694 				break;
1695 			}
1696 			break;
1697 		case ATA_SF_ENAB_WCACHE:
1698 		case ATA_SF_DIS_WCACHE:
1699 		case ATA_SF_ENAB_RCACHE:
1700 		case ATA_SF_DIS_RCACHE:
1701 			p->tfd = ATA_S_DSC | ATA_S_READY;
1702 			break;
1703 		case ATA_SF_SETXFER:
1704 		{
1705 			switch (cfis[12] & 0xf8) {
1706 			case ATA_PIO:
1707 			case ATA_PIO0:
1708 				break;
1709 			case ATA_WDMA0:
1710 			case ATA_UDMA0:
1711 				p->xfermode = (cfis[12] & 0x7);
1712 				break;
1713 			}
1714 			p->tfd = ATA_S_DSC | ATA_S_READY;
1715 			break;
1716 		}
1717 		default:
1718 			p->tfd = ATA_S_ERROR | ATA_S_READY;
1719 			p->tfd |= (ATA_ERROR_ABORT << 8);
1720 			break;
1721 		}
1722 		ahci_write_fis_d2h(p, slot, cfis, p->tfd);
1723 		break;
1724 	}
1725 	case ATA_SET_MULTI:
1726 		if (cfis[12] != 0 &&
1727 			(cfis[12] > 128 || (cfis[12] & (cfis[12] - 1)))) {
1728 			p->tfd = ATA_S_ERROR | ATA_S_READY;
1729 			p->tfd |= (ATA_ERROR_ABORT << 8);
1730 		} else {
1731 			p->mult_sectors = cfis[12];
1732 			p->tfd = ATA_S_DSC | ATA_S_READY;
1733 		}
1734 		ahci_write_fis_d2h(p, slot, cfis, p->tfd);
1735 		break;
1736 	case ATA_READ:
1737 	case ATA_WRITE:
1738 	case ATA_READ48:
1739 	case ATA_WRITE48:
1740 	case ATA_READ_MUL:
1741 	case ATA_WRITE_MUL:
1742 	case ATA_READ_MUL48:
1743 	case ATA_WRITE_MUL48:
1744 	case ATA_READ_DMA:
1745 	case ATA_WRITE_DMA:
1746 	case ATA_READ_DMA48:
1747 	case ATA_WRITE_DMA48:
1748 	case ATA_READ_FPDMA_QUEUED:
1749 	case ATA_WRITE_FPDMA_QUEUED:
1750 		ahci_handle_rw(p, slot, cfis, 0);
1751 		break;
1752 	case ATA_FLUSHCACHE:
1753 	case ATA_FLUSHCACHE48:
1754 		ahci_handle_flush(p, slot, cfis);
1755 		break;
1756 	case ATA_DATA_SET_MANAGEMENT:
1757 		if (cfis[11] == 0 && cfis[3] == ATA_DSM_TRIM &&
1758 		    cfis[13] == 0 && cfis[12] == 1) {
1759 			ahci_handle_dsm_trim(p, slot, cfis, 0);
1760 			break;
1761 		}
1762 		ahci_write_fis_d2h(p, slot, cfis,
1763 		    (ATA_E_ABORT << 8) | ATA_S_READY | ATA_S_ERROR);
1764 		break;
1765 	case ATA_SEND_FPDMA_QUEUED:
1766 		if ((cfis[13] & 0x1f) == ATA_SFPDMA_DSM &&
1767 		    cfis[17] == 0 && cfis[16] == ATA_DSM_TRIM &&
1768 		    cfis[11] == 0 && cfis[3] == 1) {
1769 			ahci_handle_dsm_trim(p, slot, cfis, 0);
1770 			break;
1771 		}
1772 		ahci_write_fis_d2h(p, slot, cfis,
1773 		    (ATA_E_ABORT << 8) | ATA_S_READY | ATA_S_ERROR);
1774 		break;
1775 	case ATA_READ_LOG_EXT:
1776 	case ATA_READ_LOG_DMA_EXT:
1777 		ahci_handle_read_log(p, slot, cfis);
1778 		break;
1779 	case ATA_SECURITY_FREEZE_LOCK:
1780 	case ATA_SMART_CMD:
1781 	case ATA_NOP:
1782 		ahci_write_fis_d2h(p, slot, cfis,
1783 		    (ATA_E_ABORT << 8) | ATA_S_READY | ATA_S_ERROR);
1784 		break;
1785 	case ATA_CHECK_POWER_MODE:
1786 		cfis[12] = 0xff;	/* always on */
1787 		ahci_write_fis_d2h(p, slot, cfis, ATA_S_READY | ATA_S_DSC);
1788 		break;
1789 	case ATA_STANDBY_CMD:
1790 	case ATA_STANDBY_IMMEDIATE:
1791 	case ATA_IDLE_CMD:
1792 	case ATA_IDLE_IMMEDIATE:
1793 	case ATA_SLEEP:
1794 	case ATA_READ_VERIFY:
1795 	case ATA_READ_VERIFY48:
1796 		ahci_write_fis_d2h(p, slot, cfis, ATA_S_READY | ATA_S_DSC);
1797 		break;
1798 	case ATA_ATAPI_IDENTIFY:
1799 		handle_atapi_identify(p, slot, cfis);
1800 		break;
1801 	case ATA_PACKET_CMD:
1802 		if (!p->atapi) {
1803 			ahci_write_fis_d2h(p, slot, cfis,
1804 			    (ATA_E_ABORT << 8) | ATA_S_READY | ATA_S_ERROR);
1805 		} else
1806 			handle_packet_cmd(p, slot, cfis);
1807 		break;
1808 	default:
1809 		WPRINTF("Unsupported cmd:%02x", cfis[2]);
1810 		ahci_write_fis_d2h(p, slot, cfis,
1811 		    (ATA_E_ABORT << 8) | ATA_S_READY | ATA_S_ERROR);
1812 		break;
1813 	}
1814 }
1815 
1816 static void
1817 ahci_handle_slot(struct ahci_port *p, int slot)
1818 {
1819 	struct ahci_cmd_hdr *hdr;
1820 #ifdef AHCI_DEBUG
1821 	struct ahci_prdt_entry *prdt;
1822 #endif
1823 	struct pci_ahci_softc *sc;
1824 	uint8_t *cfis;
1825 #ifdef AHCI_DEBUG
1826 	int cfl, i;
1827 #endif
1828 
1829 	sc = p->pr_sc;
1830 	hdr = (struct ahci_cmd_hdr *)(p->cmd_lst + slot * AHCI_CL_SIZE);
1831 #ifdef AHCI_DEBUG
1832 	cfl = (hdr->flags & 0x1f) * 4;
1833 #endif
1834 	cfis = paddr_guest2host(ahci_ctx(sc), hdr->ctba,
1835 			0x80 + hdr->prdtl * sizeof(struct ahci_prdt_entry));
1836 #ifdef AHCI_DEBUG
1837 	prdt = (struct ahci_prdt_entry *)(cfis + 0x80);
1838 
1839 	DPRINTF("cfis:");
1840 	for (i = 0; i < cfl; i++) {
1841 		if (i % 10 == 0)
1842 			DPRINTF("");
1843 		DPRINTF("%02x ", cfis[i]);
1844 	}
1845 	DPRINTF("");
1846 
1847 	for (i = 0; i < hdr->prdtl; i++) {
1848 		DPRINTF("%d@%08"PRIx64"", prdt->dbc & 0x3fffff, prdt->dba);
1849 		prdt++;
1850 	}
1851 #endif
1852 
1853 	if (cfis[0] != FIS_TYPE_REGH2D) {
1854 		WPRINTF("Not a H2D FIS:%02x", cfis[0]);
1855 		return;
1856 	}
1857 
1858 	if (cfis[1] & 0x80) {
1859 		ahci_handle_cmd(p, slot, cfis);
1860 	} else {
1861 		if (cfis[15] & (1 << 2))
1862 			p->reset = 1;
1863 		else if (p->reset) {
1864 			p->reset = 0;
1865 			ahci_port_reset(p);
1866 		}
1867 		p->ci &= ~(1 << slot);
1868 	}
1869 }
1870 
1871 static void
1872 ahci_handle_port(struct ahci_port *p)
1873 {
1874 
1875 	if (!(p->cmd & AHCI_P_CMD_ST))
1876 		return;
1877 
1878 	/*
1879 	 * Search for any new commands to issue ignoring those that
1880 	 * are already in-flight.  Stop if device is busy or in error.
1881 	 */
1882 	for (; (p->ci & ~p->pending) != 0; p->ccs = ((p->ccs + 1) & 31)) {
1883 		if ((p->tfd & (ATA_S_BUSY | ATA_S_DRQ)) != 0)
1884 			break;
1885 		if (p->waitforclear)
1886 			break;
1887 		if ((p->ci & ~p->pending & (1 << p->ccs)) != 0) {
1888 			p->cmd &= ~AHCI_P_CMD_CCS_MASK;
1889 			p->cmd |= p->ccs << AHCI_P_CMD_CCS_SHIFT;
1890 			ahci_handle_slot(p, p->ccs);
1891 		}
1892 	}
1893 }
1894 
1895 /*
1896  * blockif callback routine - this runs in the context of the blockif
1897  * i/o thread, so the mutex needs to be acquired.
1898  */
1899 static void
1900 ata_ioreq_cb(struct blockif_req *br, int err)
1901 {
1902 	struct ahci_cmd_hdr *hdr;
1903 	struct ahci_ioreq *aior;
1904 	struct ahci_port *p;
1905 	struct pci_ahci_softc *sc;
1906 	uint32_t tfd;
1907 	uint8_t *cfis;
1908 	int slot, ncq, dsm;
1909 
1910 	DPRINTF("%s %d", __func__, err);
1911 
1912 	ncq = dsm = 0;
1913 	aior = br->br_param;
1914 	p = aior->io_pr;
1915 	cfis = aior->cfis;
1916 	slot = aior->slot;
1917 	sc = p->pr_sc;
1918 	hdr = (struct ahci_cmd_hdr *)(p->cmd_lst + slot * AHCI_CL_SIZE);
1919 
1920 	if (cfis[2] == ATA_WRITE_FPDMA_QUEUED ||
1921 	    cfis[2] == ATA_READ_FPDMA_QUEUED ||
1922 	    cfis[2] == ATA_SEND_FPDMA_QUEUED)
1923 		ncq = 1;
1924 	if (cfis[2] == ATA_DATA_SET_MANAGEMENT ||
1925 	    (cfis[2] == ATA_SEND_FPDMA_QUEUED &&
1926 	     (cfis[13] & 0x1f) == ATA_SFPDMA_DSM))
1927 		dsm = 1;
1928 
1929 	pthread_mutex_lock(&sc->mtx);
1930 
1931 	/*
1932 	 * Delete the blockif request from the busy list
1933 	 */
1934 	TAILQ_REMOVE(&p->iobhd, aior, io_blist);
1935 
1936 	/*
1937 	 * Move the blockif request back to the free list
1938 	 */
1939 	STAILQ_INSERT_TAIL(&p->iofhd, aior, io_flist);
1940 
1941 	if (!err)
1942 		hdr->prdbc = aior->done;
1943 
1944 	if (!err && aior->more) {
1945 		if (dsm)
1946 			ahci_handle_dsm_trim(p, slot, cfis, aior->done);
1947 		else
1948 			ahci_handle_rw(p, slot, cfis, aior->done);
1949 		goto out;
1950 	}
1951 
1952 	if (!err)
1953 		tfd = ATA_S_READY | ATA_S_DSC;
1954 	else
1955 		tfd = (ATA_E_ABORT << 8) | ATA_S_READY | ATA_S_ERROR;
1956 	if (ncq)
1957 		ahci_write_fis_sdb(p, slot, cfis, tfd);
1958 	else
1959 		ahci_write_fis_d2h(p, slot, cfis, tfd);
1960 
1961 	/*
1962 	 * This command is now complete.
1963 	 */
1964 	p->pending &= ~(1 << slot);
1965 
1966 	ahci_check_stopped(p);
1967 	ahci_handle_port(p);
1968 out:
1969 	pthread_mutex_unlock(&sc->mtx);
1970 	DPRINTF("%s exit", __func__);
1971 }
1972 
1973 static void
1974 atapi_ioreq_cb(struct blockif_req *br, int err)
1975 {
1976 	struct ahci_cmd_hdr *hdr;
1977 	struct ahci_ioreq *aior;
1978 	struct ahci_port *p;
1979 	struct pci_ahci_softc *sc;
1980 	uint8_t *cfis;
1981 	uint32_t tfd;
1982 	int slot;
1983 
1984 	DPRINTF("%s %d", __func__, err);
1985 
1986 	aior = br->br_param;
1987 	p = aior->io_pr;
1988 	cfis = aior->cfis;
1989 	slot = aior->slot;
1990 	sc = p->pr_sc;
1991 	hdr = (struct ahci_cmd_hdr *)(p->cmd_lst + aior->slot * AHCI_CL_SIZE);
1992 
1993 	pthread_mutex_lock(&sc->mtx);
1994 
1995 	/*
1996 	 * Delete the blockif request from the busy list
1997 	 */
1998 	TAILQ_REMOVE(&p->iobhd, aior, io_blist);
1999 
2000 	/*
2001 	 * Move the blockif request back to the free list
2002 	 */
2003 	STAILQ_INSERT_TAIL(&p->iofhd, aior, io_flist);
2004 
2005 	if (!err)
2006 		hdr->prdbc = aior->done;
2007 
2008 	if (!err && aior->more) {
2009 		atapi_read(p, slot, cfis, aior->done);
2010 		goto out;
2011 	}
2012 
2013 	if (!err) {
2014 		tfd = ATA_S_READY | ATA_S_DSC;
2015 	} else {
2016 		p->sense_key = ATA_SENSE_ILLEGAL_REQUEST;
2017 		p->asc = 0x21;
2018 		tfd = (p->sense_key << 12) | ATA_S_READY | ATA_S_ERROR;
2019 	}
2020 	cfis[4] = (cfis[4] & ~7) | ATA_I_CMD | ATA_I_IN;
2021 	ahci_write_fis_d2h(p, slot, cfis, tfd);
2022 
2023 	/*
2024 	 * This command is now complete.
2025 	 */
2026 	p->pending &= ~(1 << slot);
2027 
2028 	ahci_check_stopped(p);
2029 	ahci_handle_port(p);
2030 out:
2031 	pthread_mutex_unlock(&sc->mtx);
2032 	DPRINTF("%s exit", __func__);
2033 }
2034 
2035 static void
2036 pci_ahci_ioreq_init(struct ahci_port *pr)
2037 {
2038 	struct ahci_ioreq *vr;
2039 	int i;
2040 
2041 	pr->ioqsz = blockif_queuesz(pr->bctx);
2042 	pr->ioreq = calloc(pr->ioqsz, sizeof(struct ahci_ioreq));
2043 	STAILQ_INIT(&pr->iofhd);
2044 
2045 	/*
2046 	 * Add all i/o request entries to the free queue
2047 	 */
2048 	for (i = 0; i < pr->ioqsz; i++) {
2049 		vr = &pr->ioreq[i];
2050 		vr->io_pr = pr;
2051 		if (!pr->atapi)
2052 			vr->io_req.br_callback = ata_ioreq_cb;
2053 		else
2054 			vr->io_req.br_callback = atapi_ioreq_cb;
2055 		vr->io_req.br_param = vr;
2056 		STAILQ_INSERT_TAIL(&pr->iofhd, vr, io_flist);
2057 	}
2058 
2059 	TAILQ_INIT(&pr->iobhd);
2060 }
2061 
2062 static void
2063 pci_ahci_port_write(struct pci_ahci_softc *sc, uint64_t offset, uint64_t value)
2064 {
2065 	int port = (offset - AHCI_OFFSET) / AHCI_STEP;
2066 	offset = (offset - AHCI_OFFSET) % AHCI_STEP;
2067 	struct ahci_port *p = &sc->port[port];
2068 
2069 	DPRINTF("pci_ahci_port %d: write offset 0x%"PRIx64" value 0x%"PRIx64"",
2070 		port, offset, value);
2071 
2072 	switch (offset) {
2073 	case AHCI_P_CLB:
2074 		p->clb = value;
2075 		break;
2076 	case AHCI_P_CLBU:
2077 		p->clbu = value;
2078 		break;
2079 	case AHCI_P_FB:
2080 		p->fb = value;
2081 		break;
2082 	case AHCI_P_FBU:
2083 		p->fbu = value;
2084 		break;
2085 	case AHCI_P_IS:
2086 		p->is &= ~value;
2087 		ahci_port_intr(p);
2088 		break;
2089 	case AHCI_P_IE:
2090 		p->ie = value & 0xFDC000FF;
2091 		ahci_port_intr(p);
2092 		break;
2093 	case AHCI_P_CMD:
2094 	{
2095 		p->cmd &= ~(AHCI_P_CMD_ST | AHCI_P_CMD_SUD | AHCI_P_CMD_POD |
2096 		    AHCI_P_CMD_CLO | AHCI_P_CMD_FRE | AHCI_P_CMD_APSTE |
2097 		    AHCI_P_CMD_ATAPI | AHCI_P_CMD_DLAE | AHCI_P_CMD_ALPE |
2098 		    AHCI_P_CMD_ASP | AHCI_P_CMD_ICC_MASK);
2099 		p->cmd |= (AHCI_P_CMD_ST | AHCI_P_CMD_SUD | AHCI_P_CMD_POD |
2100 		    AHCI_P_CMD_CLO | AHCI_P_CMD_FRE | AHCI_P_CMD_APSTE |
2101 		    AHCI_P_CMD_ATAPI | AHCI_P_CMD_DLAE | AHCI_P_CMD_ALPE |
2102 		    AHCI_P_CMD_ASP | AHCI_P_CMD_ICC_MASK) & value;
2103 
2104 		if (!(value & AHCI_P_CMD_ST)) {
2105 			ahci_port_stop(p);
2106 		} else {
2107 			uint64_t clb;
2108 
2109 			p->cmd |= AHCI_P_CMD_CR;
2110 			clb = (uint64_t)p->clbu << 32 | p->clb;
2111 			p->cmd_lst = paddr_guest2host(ahci_ctx(sc), clb,
2112 					AHCI_CL_SIZE * AHCI_MAX_SLOTS);
2113 		}
2114 
2115 		if (value & AHCI_P_CMD_FRE) {
2116 			uint64_t fb;
2117 
2118 			p->cmd |= AHCI_P_CMD_FR;
2119 			fb = (uint64_t)p->fbu << 32 | p->fb;
2120 			/* we don't support FBSCP, so rfis size is 256Bytes */
2121 			p->rfis = paddr_guest2host(ahci_ctx(sc), fb, 256);
2122 		} else {
2123 			p->cmd &= ~AHCI_P_CMD_FR;
2124 		}
2125 
2126 		if (value & AHCI_P_CMD_CLO) {
2127 			p->tfd &= ~(ATA_S_BUSY | ATA_S_DRQ);
2128 			p->cmd &= ~AHCI_P_CMD_CLO;
2129 		}
2130 
2131 		if (value & AHCI_P_CMD_ICC_MASK) {
2132 			p->cmd &= ~AHCI_P_CMD_ICC_MASK;
2133 		}
2134 
2135 		ahci_handle_port(p);
2136 		break;
2137 	}
2138 	case AHCI_P_TFD:
2139 	case AHCI_P_SIG:
2140 	case AHCI_P_SSTS:
2141 		WPRINTF("pci_ahci_port: read only registers 0x%"PRIx64"", offset);
2142 		break;
2143 	case AHCI_P_SCTL:
2144 		p->sctl = value;
2145 		if (!(p->cmd & AHCI_P_CMD_ST)) {
2146 			if (value & ATA_SC_DET_RESET)
2147 				ahci_port_reset(p);
2148 		}
2149 		break;
2150 	case AHCI_P_SERR:
2151 		p->serr &= ~value;
2152 		break;
2153 	case AHCI_P_SACT:
2154 		p->sact |= value;
2155 		break;
2156 	case AHCI_P_CI:
2157 		p->ci |= value;
2158 		ahci_handle_port(p);
2159 		break;
2160 	case AHCI_P_SNTF:
2161 	case AHCI_P_FBS:
2162 	default:
2163 		break;
2164 	}
2165 }
2166 
2167 static void
2168 pci_ahci_host_write(struct pci_ahci_softc *sc, uint64_t offset, uint64_t value)
2169 {
2170 	DPRINTF("pci_ahci_host: write offset 0x%"PRIx64" value 0x%"PRIx64"",
2171 		offset, value);
2172 
2173 	switch (offset) {
2174 	case AHCI_CAP:
2175 	case AHCI_PI:
2176 	case AHCI_VS:
2177 	case AHCI_CAP2:
2178 		DPRINTF("pci_ahci_host: read only registers 0x%"PRIx64"", offset);
2179 		break;
2180 	case AHCI_GHC:
2181 		if (value & AHCI_GHC_HR) {
2182 			ahci_reset(sc);
2183 			break;
2184 		}
2185 		if (value & AHCI_GHC_IE)
2186 			sc->ghc |= AHCI_GHC_IE;
2187 		else
2188 			sc->ghc &= ~AHCI_GHC_IE;
2189 		ahci_generate_intr(sc, 0xffffffff);
2190 		break;
2191 	case AHCI_IS:
2192 		sc->is &= ~value;
2193 		ahci_generate_intr(sc, value);
2194 		break;
2195 	default:
2196 		break;
2197 	}
2198 }
2199 
2200 static void
2201 pci_ahci_write(struct pci_devinst *pi, int baridx, uint64_t offset, int size,
2202     uint64_t value)
2203 {
2204 	struct pci_ahci_softc *sc = pi->pi_arg;
2205 
2206 	assert(baridx == 5);
2207 	assert((offset % 4) == 0 && size == 4);
2208 
2209 	pthread_mutex_lock(&sc->mtx);
2210 
2211 	if (offset < AHCI_OFFSET)
2212 		pci_ahci_host_write(sc, offset, value);
2213 	else if (offset < (uint64_t)AHCI_OFFSET + sc->ports * AHCI_STEP)
2214 		pci_ahci_port_write(sc, offset, value);
2215 	else
2216 		WPRINTF("pci_ahci: unknown i/o write offset 0x%"PRIx64"", offset);
2217 
2218 	pthread_mutex_unlock(&sc->mtx);
2219 }
2220 
2221 static uint64_t
2222 pci_ahci_host_read(struct pci_ahci_softc *sc, uint64_t offset)
2223 {
2224 	uint32_t value;
2225 
2226 	switch (offset) {
2227 	case AHCI_CAP:
2228 	case AHCI_GHC:
2229 	case AHCI_IS:
2230 	case AHCI_PI:
2231 	case AHCI_VS:
2232 	case AHCI_CCCC:
2233 	case AHCI_CCCP:
2234 	case AHCI_EM_LOC:
2235 	case AHCI_EM_CTL:
2236 	case AHCI_CAP2:
2237 	{
2238 		uint32_t *p = &sc->cap;
2239 		p += (offset - AHCI_CAP) / sizeof(uint32_t);
2240 		value = *p;
2241 		break;
2242 	}
2243 	default:
2244 		value = 0;
2245 		break;
2246 	}
2247 	DPRINTF("pci_ahci_host: read offset 0x%"PRIx64" value 0x%x",
2248 		offset, value);
2249 
2250 	return (value);
2251 }
2252 
2253 static uint64_t
2254 pci_ahci_port_read(struct pci_ahci_softc *sc, uint64_t offset)
2255 {
2256 	uint32_t value;
2257 	int port = (offset - AHCI_OFFSET) / AHCI_STEP;
2258 	offset = (offset - AHCI_OFFSET) % AHCI_STEP;
2259 
2260 	switch (offset) {
2261 	case AHCI_P_CLB:
2262 	case AHCI_P_CLBU:
2263 	case AHCI_P_FB:
2264 	case AHCI_P_FBU:
2265 	case AHCI_P_IS:
2266 	case AHCI_P_IE:
2267 	case AHCI_P_CMD:
2268 	case AHCI_P_TFD:
2269 	case AHCI_P_SIG:
2270 	case AHCI_P_SSTS:
2271 	case AHCI_P_SCTL:
2272 	case AHCI_P_SERR:
2273 	case AHCI_P_SACT:
2274 	case AHCI_P_CI:
2275 	case AHCI_P_SNTF:
2276 	case AHCI_P_FBS:
2277 	{
2278 		uint32_t *p= &sc->port[port].clb;
2279 		p += (offset - AHCI_P_CLB) / sizeof(uint32_t);
2280 		value = *p;
2281 		break;
2282 	}
2283 	default:
2284 		value = 0;
2285 		break;
2286 	}
2287 
2288 	DPRINTF("pci_ahci_port %d: read offset 0x%"PRIx64" value 0x%x",
2289 		port, offset, value);
2290 
2291 	return value;
2292 }
2293 
2294 static uint64_t
2295 pci_ahci_read(struct pci_devinst *pi, int baridx, uint64_t regoff, int size)
2296 {
2297 	struct pci_ahci_softc *sc = pi->pi_arg;
2298 	uint64_t offset;
2299 	uint32_t value;
2300 
2301 	assert(baridx == 5);
2302 	assert(size == 1 || size == 2 || size == 4);
2303 	assert((regoff & (size - 1)) == 0);
2304 
2305 	pthread_mutex_lock(&sc->mtx);
2306 
2307 	offset = regoff & ~0x3;	    /* round down to a multiple of 4 bytes */
2308 	if (offset < AHCI_OFFSET)
2309 		value = pci_ahci_host_read(sc, offset);
2310 	else if (offset < (uint64_t)AHCI_OFFSET + sc->ports * AHCI_STEP)
2311 		value = pci_ahci_port_read(sc, offset);
2312 	else {
2313 		value = 0;
2314 		WPRINTF("pci_ahci: unknown i/o read offset 0x%"PRIx64"",
2315 		    regoff);
2316 	}
2317 	value >>= 8 * (regoff & 0x3);
2318 
2319 	pthread_mutex_unlock(&sc->mtx);
2320 
2321 	return (value);
2322 }
2323 
2324 /*
2325  * Each AHCI controller has a "port" node which contains nodes for
2326  * each port named after the decimal number of the port (no leading
2327  * zeroes).  Port nodes contain a "type" ("hd" or "cd"), as well as
2328  * options for blockif.  For example:
2329  *
2330  * pci.0.1.0
2331  *          .device="ahci"
2332  *          .port
2333  *               .0
2334  *                 .type="hd"
2335  *                 .path="/path/to/image"
2336  */
2337 static int
2338 pci_ahci_legacy_config_port(nvlist_t *nvl, int port, const char *type,
2339     const char *opts)
2340 {
2341 	char node_name[sizeof("XX")];
2342 	nvlist_t *port_nvl;
2343 
2344 	snprintf(node_name, sizeof(node_name), "%d", port);
2345 	port_nvl = create_relative_config_node(nvl, node_name);
2346 	set_config_value_node(port_nvl, "type", type);
2347 	return (blockif_legacy_config(port_nvl, opts));
2348 }
2349 
2350 static int
2351 pci_ahci_legacy_config(nvlist_t *nvl, const char *opts)
2352 {
2353 	nvlist_t *ports_nvl;
2354 	const char *type;
2355 	char *next, *next2, *str, *tofree;
2356 	int p, ret;
2357 
2358 	if (opts == NULL)
2359 		return (0);
2360 
2361 	ports_nvl = create_relative_config_node(nvl, "port");
2362 	ret = 1;
2363 	tofree = str = strdup(opts);
2364 	for (p = 0; p < MAX_PORTS && str != NULL; p++, str = next) {
2365 		/* Identify and cut off type of present port. */
2366 		if (strncmp(str, "hd:", 3) == 0) {
2367 			type = "hd";
2368 			str += 3;
2369 		} else if (strncmp(str, "cd:", 3) == 0) {
2370 			type = "cd";
2371 			str += 3;
2372 		} else
2373 			type = NULL;
2374 
2375 		/* Find and cut off the next port options. */
2376 		next = strstr(str, ",hd:");
2377 		next2 = strstr(str, ",cd:");
2378 		if (next == NULL || (next2 != NULL && next2 < next))
2379 			next = next2;
2380 		if (next != NULL) {
2381 			next[0] = 0;
2382 			next++;
2383 		}
2384 
2385 		if (str[0] == 0)
2386 			continue;
2387 
2388 		if (type == NULL) {
2389 			EPRINTLN("Missing or invalid type for port %d: \"%s\"",
2390 			    p, str);
2391 			goto out;
2392 		}
2393 
2394 		if (pci_ahci_legacy_config_port(ports_nvl, p, type, str) != 0)
2395 			goto out;
2396 	}
2397 	ret = 0;
2398 out:
2399 	free(tofree);
2400 	return (ret);
2401 }
2402 
2403 static int
2404 pci_ahci_cd_legacy_config(nvlist_t *nvl, const char *opts)
2405 {
2406 	nvlist_t *ports_nvl;
2407 
2408 	ports_nvl = create_relative_config_node(nvl, "port");
2409 	return (pci_ahci_legacy_config_port(ports_nvl, 0, "cd", opts));
2410 }
2411 
2412 static int
2413 pci_ahci_hd_legacy_config(nvlist_t *nvl, const char *opts)
2414 {
2415 	nvlist_t *ports_nvl;
2416 
2417 	ports_nvl = create_relative_config_node(nvl, "port");
2418 	return (pci_ahci_legacy_config_port(ports_nvl, 0, "hd", opts));
2419 }
2420 
2421 static int
2422 pci_ahci_init(struct pci_devinst *pi, nvlist_t *nvl)
2423 {
2424 	char bident[sizeof("XXX:XXX:XXX")];
2425 	char node_name[sizeof("XX")];
2426 	struct blockif_ctxt *bctxt;
2427 	struct pci_ahci_softc *sc;
2428 	int atapi, ret, slots, p;
2429 	MD5_CTX mdctx;
2430 	u_char digest[16];
2431 	const char *path, *type, *value;
2432 	nvlist_t *ports_nvl, *port_nvl;
2433 
2434 	ret = 0;
2435 
2436 #ifdef AHCI_DEBUG
2437 	dbg = fopen("/tmp/log", "w+");
2438 #endif
2439 
2440 	sc = calloc(1, sizeof(struct pci_ahci_softc));
2441 	pi->pi_arg = sc;
2442 	sc->asc_pi = pi;
2443 	pthread_mutex_init(&sc->mtx, NULL);
2444 	sc->ports = 0;
2445 	sc->pi = 0;
2446 	slots = 32;
2447 
2448 	ports_nvl = find_relative_config_node(nvl, "port");
2449 	for (p = 0; ports_nvl != NULL && p < MAX_PORTS; p++) {
2450 		struct ata_params *ata_ident = &sc->port[p].ata_ident;
2451 		char ident[AHCI_PORT_IDENT];
2452 
2453 		snprintf(node_name, sizeof(node_name), "%d", p);
2454 		port_nvl = find_relative_config_node(ports_nvl, node_name);
2455 		if (port_nvl == NULL)
2456 			continue;
2457 
2458 		type = get_config_value_node(port_nvl, "type");
2459 		if (type == NULL)
2460 			continue;
2461 
2462 		if (strcmp(type, "hd") == 0)
2463 			atapi = 0;
2464 		else
2465 			atapi = 1;
2466 
2467 		/*
2468 		 * Attempt to open the backing image. Use the PCI slot/func
2469 		 * and the port number for the identifier string.
2470 		 */
2471 		snprintf(bident, sizeof(bident), "%u:%u:%u", pi->pi_slot,
2472 		    pi->pi_func, p);
2473 
2474 		bctxt = blockif_open(port_nvl, bident);
2475 		if (bctxt == NULL) {
2476 			sc->ports = p;
2477 			ret = 1;
2478 			goto open_fail;
2479 		}
2480 		sc->port[p].bctx = bctxt;
2481 		sc->port[p].pr_sc = sc;
2482 		sc->port[p].port = p;
2483 		sc->port[p].atapi = atapi;
2484 
2485 		/*
2486 		 * Create an identifier for the backing file.
2487 		 * Use parts of the md5 sum of the filename
2488 		 */
2489 		path = get_config_value_node(port_nvl, "path");
2490 		MD5Init(&mdctx);
2491 		MD5Update(&mdctx, path, strlen(path));
2492 		MD5Final(digest, &mdctx);
2493 		snprintf(ident, AHCI_PORT_IDENT,
2494 			"BHYVE-%02X%02X-%02X%02X-%02X%02X",
2495 			digest[0], digest[1], digest[2], digest[3], digest[4],
2496 			digest[5]);
2497 
2498 		memset(ata_ident, 0, sizeof(struct ata_params));
2499 		ata_string((uint8_t*)&ata_ident->serial, ident, 20);
2500 		ata_string((uint8_t*)&ata_ident->revision, "001", 8);
2501 		if (atapi)
2502 			ata_string((uint8_t*)&ata_ident->model, "BHYVE SATA DVD ROM", 40);
2503 		else
2504 			ata_string((uint8_t*)&ata_ident->model, "BHYVE SATA DISK", 40);
2505 		value = get_config_value_node(port_nvl, "nmrr");
2506 		if (value != NULL)
2507 			ata_ident->media_rotation_rate = atoi(value);
2508 		value = get_config_value_node(port_nvl, "ser");
2509 		if (value != NULL)
2510 			ata_string((uint8_t*)(&ata_ident->serial), value, 20);
2511 		value = get_config_value_node(port_nvl, "rev");
2512 		if (value != NULL)
2513 			ata_string((uint8_t*)(&ata_ident->revision), value, 8);
2514 		value = get_config_value_node(port_nvl, "model");
2515 		if (value != NULL)
2516 			ata_string((uint8_t*)(&ata_ident->model), value, 40);
2517 		ata_identify_init(&sc->port[p], atapi);
2518 
2519 		/*
2520 		 * Allocate blockif request structures and add them
2521 		 * to the free list
2522 		 */
2523 		pci_ahci_ioreq_init(&sc->port[p]);
2524 
2525 		sc->pi |= (1 << p);
2526 		if (sc->port[p].ioqsz < slots)
2527 			slots = sc->port[p].ioqsz;
2528 	}
2529 	sc->ports = p;
2530 
2531 	/* Intel ICH8 AHCI */
2532 	--slots;
2533 	if (sc->ports < DEF_PORTS)
2534 		sc->ports = DEF_PORTS;
2535 	sc->cap = AHCI_CAP_64BIT | AHCI_CAP_SNCQ | AHCI_CAP_SSNTF |
2536 	    AHCI_CAP_SMPS | AHCI_CAP_SSS | AHCI_CAP_SALP |
2537 	    AHCI_CAP_SAL | AHCI_CAP_SCLO | (0x3 << AHCI_CAP_ISS_SHIFT)|
2538 	    AHCI_CAP_PMD | AHCI_CAP_SSC | AHCI_CAP_PSC |
2539 	    (slots << AHCI_CAP_NCS_SHIFT) | AHCI_CAP_SXS | (sc->ports - 1);
2540 
2541 	sc->vs = 0x10300;
2542 	sc->cap2 = AHCI_CAP2_APST;
2543 	ahci_reset(sc);
2544 
2545 	pci_set_cfgdata16(pi, PCIR_DEVICE, 0x2821);
2546 	pci_set_cfgdata16(pi, PCIR_VENDOR, 0x8086);
2547 	pci_set_cfgdata8(pi, PCIR_CLASS, PCIC_STORAGE);
2548 	pci_set_cfgdata8(pi, PCIR_SUBCLASS, PCIS_STORAGE_SATA);
2549 	pci_set_cfgdata8(pi, PCIR_PROGIF, PCIP_STORAGE_SATA_AHCI_1_0);
2550 	p = MIN(sc->ports, 16);
2551 	p = flsl(p) - ((p & (p - 1)) ? 0 : 1);
2552 	pci_emul_add_msicap(pi, 1 << p);
2553 	pci_emul_alloc_bar(pi, 5, PCIBAR_MEM32,
2554 	    AHCI_OFFSET + sc->ports * AHCI_STEP);
2555 
2556 	pci_lintr_request(pi);
2557 
2558 open_fail:
2559 	if (ret) {
2560 		for (p = 0; p < sc->ports; p++) {
2561 			if (sc->port[p].bctx != NULL)
2562 				blockif_close(sc->port[p].bctx);
2563 		}
2564 		free(sc);
2565 	}
2566 
2567 	return (ret);
2568 }
2569 
2570 #ifdef BHYVE_SNAPSHOT
2571 static int
2572 pci_ahci_snapshot(struct vm_snapshot_meta *meta)
2573 {
2574 	int i, ret;
2575 	void *bctx;
2576 	struct pci_devinst *pi;
2577 	struct pci_ahci_softc *sc;
2578 	struct ahci_port *port;
2579 
2580 	pi = meta->dev_data;
2581 	sc = pi->pi_arg;
2582 
2583 	/* TODO: add mtx lock/unlock */
2584 
2585 	SNAPSHOT_VAR_OR_LEAVE(sc->ports, meta, ret, done);
2586 	SNAPSHOT_VAR_OR_LEAVE(sc->cap, meta, ret, done);
2587 	SNAPSHOT_VAR_OR_LEAVE(sc->ghc, meta, ret, done);
2588 	SNAPSHOT_VAR_OR_LEAVE(sc->is, meta, ret, done);
2589 	SNAPSHOT_VAR_OR_LEAVE(sc->pi, meta, ret, done);
2590 	SNAPSHOT_VAR_OR_LEAVE(sc->vs, meta, ret, done);
2591 	SNAPSHOT_VAR_OR_LEAVE(sc->ccc_ctl, meta, ret, done);
2592 	SNAPSHOT_VAR_OR_LEAVE(sc->ccc_pts, meta, ret, done);
2593 	SNAPSHOT_VAR_OR_LEAVE(sc->em_loc, meta, ret, done);
2594 	SNAPSHOT_VAR_OR_LEAVE(sc->em_ctl, meta, ret, done);
2595 	SNAPSHOT_VAR_OR_LEAVE(sc->cap2, meta, ret, done);
2596 	SNAPSHOT_VAR_OR_LEAVE(sc->bohc, meta, ret, done);
2597 	SNAPSHOT_VAR_OR_LEAVE(sc->lintr, meta, ret, done);
2598 
2599 	for (i = 0; i < MAX_PORTS; i++) {
2600 		port = &sc->port[i];
2601 
2602 		if (meta->op == VM_SNAPSHOT_SAVE)
2603 			bctx = port->bctx;
2604 
2605 		SNAPSHOT_VAR_OR_LEAVE(bctx, meta, ret, done);
2606 		SNAPSHOT_VAR_OR_LEAVE(port->port, meta, ret, done);
2607 
2608 		/* Mostly for restore; save is ensured by the lines above. */
2609 		if (((bctx == NULL) && (port->bctx != NULL)) ||
2610 		    ((bctx != NULL) && (port->bctx == NULL))) {
2611 			fprintf(stderr, "%s: ports not matching\r\n", __func__);
2612 			ret = EINVAL;
2613 			goto done;
2614 		}
2615 
2616 		if (port->bctx == NULL)
2617 			continue;
2618 
2619 		if (port->port != i) {
2620 			fprintf(stderr, "%s: ports not matching: "
2621 					"actual: %d expected: %d\r\n",
2622 					__func__, port->port, i);
2623 			ret = EINVAL;
2624 			goto done;
2625 		}
2626 
2627 		SNAPSHOT_GUEST2HOST_ADDR_OR_LEAVE(pi->pi_vmctx, port->cmd_lst,
2628 			AHCI_CL_SIZE * AHCI_MAX_SLOTS, false, meta, ret, done);
2629 		SNAPSHOT_GUEST2HOST_ADDR_OR_LEAVE(pi->pi_vmctx, port->rfis, 256,
2630 		    false, meta, ret, done);
2631 
2632 		SNAPSHOT_VAR_OR_LEAVE(port->ata_ident, meta, ret, done);
2633 		SNAPSHOT_VAR_OR_LEAVE(port->atapi, meta, ret, done);
2634 		SNAPSHOT_VAR_OR_LEAVE(port->reset, meta, ret, done);
2635 		SNAPSHOT_VAR_OR_LEAVE(port->waitforclear, meta, ret, done);
2636 		SNAPSHOT_VAR_OR_LEAVE(port->mult_sectors, meta, ret, done);
2637 		SNAPSHOT_VAR_OR_LEAVE(port->xfermode, meta, ret, done);
2638 		SNAPSHOT_VAR_OR_LEAVE(port->err_cfis, meta, ret, done);
2639 		SNAPSHOT_VAR_OR_LEAVE(port->sense_key, meta, ret, done);
2640 		SNAPSHOT_VAR_OR_LEAVE(port->asc, meta, ret, done);
2641 		SNAPSHOT_VAR_OR_LEAVE(port->ccs, meta, ret, done);
2642 		SNAPSHOT_VAR_OR_LEAVE(port->pending, meta, ret, done);
2643 
2644 		SNAPSHOT_VAR_OR_LEAVE(port->clb, meta, ret, done);
2645 		SNAPSHOT_VAR_OR_LEAVE(port->clbu, meta, ret, done);
2646 		SNAPSHOT_VAR_OR_LEAVE(port->fb, meta, ret, done);
2647 		SNAPSHOT_VAR_OR_LEAVE(port->fbu, meta, ret, done);
2648 		SNAPSHOT_VAR_OR_LEAVE(port->ie, meta, ret, done);
2649 		SNAPSHOT_VAR_OR_LEAVE(port->cmd, meta, ret, done);
2650 		SNAPSHOT_VAR_OR_LEAVE(port->unused0, meta, ret, done);
2651 		SNAPSHOT_VAR_OR_LEAVE(port->tfd, meta, ret, done);
2652 		SNAPSHOT_VAR_OR_LEAVE(port->sig, meta, ret, done);
2653 		SNAPSHOT_VAR_OR_LEAVE(port->ssts, meta, ret, done);
2654 		SNAPSHOT_VAR_OR_LEAVE(port->sctl, meta, ret, done);
2655 		SNAPSHOT_VAR_OR_LEAVE(port->serr, meta, ret, done);
2656 		SNAPSHOT_VAR_OR_LEAVE(port->sact, meta, ret, done);
2657 		SNAPSHOT_VAR_OR_LEAVE(port->ci, meta, ret, done);
2658 		SNAPSHOT_VAR_OR_LEAVE(port->sntf, meta, ret, done);
2659 		SNAPSHOT_VAR_OR_LEAVE(port->fbs, meta, ret, done);
2660 		SNAPSHOT_VAR_OR_LEAVE(port->ioqsz, meta, ret, done);
2661 
2662 		assert(TAILQ_EMPTY(&port->iobhd));
2663 	}
2664 
2665 done:
2666 	return (ret);
2667 }
2668 
2669 static int
2670 pci_ahci_pause(struct pci_devinst *pi)
2671 {
2672 	struct pci_ahci_softc *sc;
2673 	struct blockif_ctxt *bctxt;
2674 	int i;
2675 
2676 	sc = pi->pi_arg;
2677 
2678 	for (i = 0; i < MAX_PORTS; i++) {
2679 		bctxt = sc->port[i].bctx;
2680 		if (bctxt == NULL)
2681 			continue;
2682 
2683 		blockif_pause(bctxt);
2684 	}
2685 
2686 	return (0);
2687 }
2688 
2689 static int
2690 pci_ahci_resume(struct pci_devinst *pi)
2691 {
2692 	struct pci_ahci_softc *sc;
2693 	struct blockif_ctxt *bctxt;
2694 	int i;
2695 
2696 	sc = pi->pi_arg;
2697 
2698 	for (i = 0; i < MAX_PORTS; i++) {
2699 		bctxt = sc->port[i].bctx;
2700 		if (bctxt == NULL)
2701 			continue;
2702 
2703 		blockif_resume(bctxt);
2704 	}
2705 
2706 	return (0);
2707 }
2708 #endif	/* BHYVE_SNAPSHOT */
2709 
2710 /*
2711  * Use separate emulation names to distinguish drive and atapi devices
2712  */
2713 static const struct pci_devemu pci_de_ahci = {
2714 	.pe_emu =	"ahci",
2715 	.pe_init =	pci_ahci_init,
2716 	.pe_legacy_config = pci_ahci_legacy_config,
2717 	.pe_barwrite =	pci_ahci_write,
2718 	.pe_barread =	pci_ahci_read,
2719 #ifdef BHYVE_SNAPSHOT
2720 	.pe_snapshot =	pci_ahci_snapshot,
2721 	.pe_pause =	pci_ahci_pause,
2722 	.pe_resume =	pci_ahci_resume,
2723 #endif
2724 };
2725 PCI_EMUL_SET(pci_de_ahci);
2726 
2727 static const struct pci_devemu pci_de_ahci_hd = {
2728 	.pe_emu =	"ahci-hd",
2729 	.pe_legacy_config = pci_ahci_hd_legacy_config,
2730 	.pe_alias =	"ahci",
2731 };
2732 PCI_EMUL_SET(pci_de_ahci_hd);
2733 
2734 static const struct pci_devemu pci_de_ahci_cd = {
2735 	.pe_emu =	"ahci-cd",
2736 	.pe_legacy_config = pci_ahci_cd_legacy_config,
2737 	.pe_alias =	"ahci",
2738 };
2739 PCI_EMUL_SET(pci_de_ahci_cd);
2740