Deleted Added
full compact
pci_ahci.c (280732) pci_ahci.c (280733)
1/*-
2 * Copyright (c) 2013 Zhixiang Yu <zcore@freebsd.org>
3 * All rights reserved.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions
7 * are met:
8 * 1. Redistributions of source code must retain the above copyright

--- 9 unchanged lines hidden (view full) ---

18 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
19 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
20 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
21 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
22 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
23 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
24 * SUCH DAMAGE.
25 *
1/*-
2 * Copyright (c) 2013 Zhixiang Yu <zcore@freebsd.org>
3 * All rights reserved.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions
7 * are met:
8 * 1. Redistributions of source code must retain the above copyright

--- 9 unchanged lines hidden (view full) ---

18 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
19 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
20 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
21 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
22 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
23 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
24 * SUCH DAMAGE.
25 *
26 * $FreeBSD: stable/10/usr.sbin/bhyve/pci_ahci.c 280732 2015-03-27 08:42:55Z mav $
26 * $FreeBSD: stable/10/usr.sbin/bhyve/pci_ahci.c 280733 2015-03-27 08:43:45Z mav $
27 */
28
29#include <sys/cdefs.h>
27 */
28
29#include <sys/cdefs.h>
30__FBSDID("$FreeBSD: stable/10/usr.sbin/bhyve/pci_ahci.c 280732 2015-03-27 08:42:55Z mav $");
30__FBSDID("$FreeBSD: stable/10/usr.sbin/bhyve/pci_ahci.c 280733 2015-03-27 08:43:45Z mav $");
31
32#include <sys/param.h>
33#include <sys/linker_set.h>
34#include <sys/stat.h>
35#include <sys/uio.h>
36#include <sys/ioctl.h>
37#include <sys/disk.h>
38#include <sys/ata.h>

--- 387 unchanged lines hidden (view full) ---

426 }
427
428 ahci_check_stopped(p);
429}
430
431static void
432ahci_port_reset(struct ahci_port *pr)
433{
31
32#include <sys/param.h>
33#include <sys/linker_set.h>
34#include <sys/stat.h>
35#include <sys/uio.h>
36#include <sys/ioctl.h>
37#include <sys/disk.h>
38#include <sys/ata.h>

--- 387 unchanged lines hidden (view full) ---

426 }
427
428 ahci_check_stopped(p);
429}
430
431static void
432ahci_port_reset(struct ahci_port *pr)
433{
434 pr->sctl = 0;
435 pr->serr = 0;
436 pr->sact = 0;
437 pr->xfermode = ATA_UDMA6;
438 pr->mult_sectors = 128;
439
440 if (!pr->bctx) {
441 pr->ssts = ATA_SS_DET_NO_DEVICE;
442 pr->sig = 0xFFFFFFFF;
443 pr->tfd = 0x7F;
444 return;
445 }
434 pr->serr = 0;
435 pr->sact = 0;
436 pr->xfermode = ATA_UDMA6;
437 pr->mult_sectors = 128;
438
439 if (!pr->bctx) {
440 pr->ssts = ATA_SS_DET_NO_DEVICE;
441 pr->sig = 0xFFFFFFFF;
442 pr->tfd = 0x7F;
443 return;
444 }
446 pr->ssts = ATA_SS_DET_PHY_ONLINE | ATA_SS_SPD_GEN2 |
447 ATA_SS_IPM_ACTIVE;
445 pr->ssts = ATA_SS_DET_PHY_ONLINE | ATA_SS_IPM_ACTIVE;
446 if (pr->sctl & ATA_SC_SPD_MASK)
447 pr->ssts |= (pr->sctl & ATA_SC_SPD_MASK);
448 else
449 pr->ssts |= ATA_SS_SPD_GEN3;
448 pr->tfd = (1 << 8) | ATA_S_DSC | ATA_S_DMA;
449 if (!pr->atapi) {
450 pr->sig = PxSIG_ATA;
451 pr->tfd |= ATA_S_READY;
452 } else
453 pr->sig = PxSIG_ATAPI;
454 ahci_write_reset_fis_d2h(pr);
455}

--- 9 unchanged lines hidden (view full) ---

465 if (sc->lintr) {
466 pci_lintr_deassert(sc->asc_pi);
467 sc->lintr = 0;
468 }
469
470 for (i = 0; i < sc->ports; i++) {
471 sc->port[i].ie = 0;
472 sc->port[i].is = 0;
450 pr->tfd = (1 << 8) | ATA_S_DSC | ATA_S_DMA;
451 if (!pr->atapi) {
452 pr->sig = PxSIG_ATA;
453 pr->tfd |= ATA_S_READY;
454 } else
455 pr->sig = PxSIG_ATAPI;
456 ahci_write_reset_fis_d2h(pr);
457}

--- 9 unchanged lines hidden (view full) ---

467 if (sc->lintr) {
468 pci_lintr_deassert(sc->asc_pi);
469 sc->lintr = 0;
470 }
471
472 for (i = 0; i < sc->ports; i++) {
473 sc->port[i].ie = 0;
474 sc->port[i].is = 0;
475 sc->port[i].sctl = 0;
473 ahci_port_reset(&sc->port[i]);
474 }
475}
476
477static void
478ata_string(uint8_t *dest, const char *src, int len)
479{
480 int i;

--- 322 unchanged lines hidden (view full) ---

803 ata_string((uint8_t *)(buf+27), "BHYVE SATA DISK", 40);
804 buf[47] = (0x8000 | 128);
805 buf[48] = 0x1;
806 buf[49] = (1 << 8 | 1 << 9 | 1 << 11);
807 buf[50] = (1 << 14);
808 buf[53] = (1 << 1 | 1 << 2);
809 if (p->mult_sectors)
810 buf[59] = (0x100 | p->mult_sectors);
476 ahci_port_reset(&sc->port[i]);
477 }
478}
479
480static void
481ata_string(uint8_t *dest, const char *src, int len)
482{
483 int i;

--- 322 unchanged lines hidden (view full) ---

806 ata_string((uint8_t *)(buf+27), "BHYVE SATA DISK", 40);
807 buf[47] = (0x8000 | 128);
808 buf[48] = 0x1;
809 buf[49] = (1 << 8 | 1 << 9 | 1 << 11);
810 buf[50] = (1 << 14);
811 buf[53] = (1 << 1 | 1 << 2);
812 if (p->mult_sectors)
813 buf[59] = (0x100 | p->mult_sectors);
811 buf[60] = sectors;
812 buf[61] = (sectors >> 16);
814 if (sectors <= 0x0fffffff) {
815 buf[60] = sectors;
816 buf[61] = (sectors >> 16);
817 } else {
818 buf[60] = 0xffff;
819 buf[61] = 0x0fff;
820 }
813 buf[63] = 0x7;
814 if (p->xfermode & ATA_WDMA0)
815 buf[63] |= (1 << ((p->xfermode & 7) + 8));
816 buf[64] = 0x3;
821 buf[63] = 0x7;
822 if (p->xfermode & ATA_WDMA0)
823 buf[63] |= (1 << ((p->xfermode & 7) + 8));
824 buf[64] = 0x3;
817 buf[65] = 100;
818 buf[66] = 100;
819 buf[67] = 100;
820 buf[68] = 100;
825 buf[65] = 120;
826 buf[66] = 120;
827 buf[67] = 120;
828 buf[68] = 120;
821 buf[69] = 0;
822 buf[75] = 31;
829 buf[69] = 0;
830 buf[75] = 31;
823 buf[76] = (1 << 8 | 1 << 2);
831 buf[76] = (ATA_SATA_GEN1 | ATA_SATA_GEN2 | ATA_SATA_GEN3 |
832 ATA_SUPPORT_NCQ);
824 buf[80] = 0x1f0;
825 buf[81] = 0x28;
833 buf[80] = 0x1f0;
834 buf[81] = 0x28;
826 buf[82] = (1 << 5 | 1 << 14);
827 buf[83] = (1 << 10 | 1 << 12 | 1 << 13 | 1 << 14);
835 buf[82] = (ATA_SUPPORT_POWERMGT | ATA_SUPPORT_WRITECACHE|
836 ATA_SUPPORT_LOOKAHEAD | ATA_SUPPORT_NOP);
837 buf[83] = (ATA_SUPPORT_ADDRESS48 | ATA_SUPPORT_FLUSHCACHE |
838 ATA_SUPPORT_FLUSHCACHE48 | 1 << 14);
828 buf[84] = (1 << 14);
839 buf[84] = (1 << 14);
829 buf[85] = (1 << 5 | 1 << 14);
830 buf[86] = (1 << 10 | 1 << 12 | 1 << 13);
840 buf[85] = (ATA_SUPPORT_POWERMGT | ATA_SUPPORT_WRITECACHE|
841 ATA_SUPPORT_LOOKAHEAD | ATA_SUPPORT_NOP);
842 buf[86] = (ATA_SUPPORT_ADDRESS48 | ATA_SUPPORT_FLUSHCACHE |
843 ATA_SUPPORT_FLUSHCACHE48);
831 buf[87] = (1 << 14);
832 buf[88] = 0x7f;
833 if (p->xfermode & ATA_UDMA0)
834 buf[88] |= (1 << ((p->xfermode & 7) + 8));
835 buf[93] = (1 | 1 <<14);
836 buf[100] = sectors;
837 buf[101] = (sectors >> 16);
838 buf[102] = (sectors >> 32);

--- 10 unchanged lines hidden (view full) ---

849 buf[106] |= ffsl(psectsz / sectsz) - 1;
850 buf[209] |= (psectoff / sectsz);
851 }
852 if (sectsz > 512) {
853 buf[106] |= 0x1000;
854 buf[117] = sectsz / 2;
855 buf[118] = ((sectsz / 2) >> 16);
856 }
844 buf[87] = (1 << 14);
845 buf[88] = 0x7f;
846 if (p->xfermode & ATA_UDMA0)
847 buf[88] |= (1 << ((p->xfermode & 7) + 8));
848 buf[93] = (1 | 1 <<14);
849 buf[100] = sectors;
850 buf[101] = (sectors >> 16);
851 buf[102] = (sectors >> 32);

--- 10 unchanged lines hidden (view full) ---

862 buf[106] |= ffsl(psectsz / sectsz) - 1;
863 buf[209] |= (psectoff / sectsz);
864 }
865 if (sectsz > 512) {
866 buf[106] |= 0x1000;
867 buf[117] = sectsz / 2;
868 buf[118] = ((sectsz / 2) >> 16);
869 }
870 buf[222] = 0x1020;
857 ahci_write_fis_piosetup(p);
858 write_prdt(p, slot, cfis, (void *)buf, sizeof(buf));
859 ahci_write_fis_d2h(p, slot, cfis, ATA_S_DSC | ATA_S_READY);
860 }
861}
862
863static void
864handle_atapi_identify(struct ahci_port *p, int slot, uint8_t *cfis)

--- 981 unchanged lines hidden (view full) ---

1846 break;
1847 }
1848 case AHCI_P_TFD:
1849 case AHCI_P_SIG:
1850 case AHCI_P_SSTS:
1851 WPRINTF("pci_ahci_port: read only registers 0x%"PRIx64"\n", offset);
1852 break;
1853 case AHCI_P_SCTL:
871 ahci_write_fis_piosetup(p);
872 write_prdt(p, slot, cfis, (void *)buf, sizeof(buf));
873 ahci_write_fis_d2h(p, slot, cfis, ATA_S_DSC | ATA_S_READY);
874 }
875}
876
877static void
878handle_atapi_identify(struct ahci_port *p, int slot, uint8_t *cfis)

--- 981 unchanged lines hidden (view full) ---

1860 break;
1861 }
1862 case AHCI_P_TFD:
1863 case AHCI_P_SIG:
1864 case AHCI_P_SSTS:
1865 WPRINTF("pci_ahci_port: read only registers 0x%"PRIx64"\n", offset);
1866 break;
1867 case AHCI_P_SCTL:
1868 p->sctl = value;
1854 if (!(p->cmd & AHCI_P_CMD_ST)) {
1855 if (value & ATA_SC_DET_RESET)
1856 ahci_port_reset(p);
1869 if (!(p->cmd & AHCI_P_CMD_ST)) {
1870 if (value & ATA_SC_DET_RESET)
1871 ahci_port_reset(p);
1857 p->sctl = value;
1858 }
1859 break;
1860 case AHCI_P_SERR:
1861 p->serr &= ~value;
1862 break;
1863 case AHCI_P_SACT:
1864 p->sact |= value;
1865 break;

--- 281 unchanged lines hidden ---
1872 }
1873 break;
1874 case AHCI_P_SERR:
1875 p->serr &= ~value;
1876 break;
1877 case AHCI_P_SACT:
1878 p->sact |= value;
1879 break;

--- 281 unchanged lines hidden ---