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 --- |