18b89ef0aSSøren Schmidt /*- 29a14aa01SUlrich Spörlein * Copyright (c) 1998 - 2008 Søren Schmidt <sos@FreeBSD.org> 38b89ef0aSSøren Schmidt * All rights reserved. 48b89ef0aSSøren Schmidt * 58b89ef0aSSøren Schmidt * Redistribution and use in source and binary forms, with or without 68b89ef0aSSøren Schmidt * modification, are permitted provided that the following conditions 78b89ef0aSSøren Schmidt * are met: 88b89ef0aSSøren Schmidt * 1. Redistributions of source code must retain the above copyright 98b89ef0aSSøren Schmidt * notice, this list of conditions and the following disclaimer, 108b89ef0aSSøren Schmidt * without modification, immediately at the beginning of the file. 118b89ef0aSSøren Schmidt * 2. Redistributions in binary form must reproduce the above copyright 128b89ef0aSSøren Schmidt * notice, this list of conditions and the following disclaimer in the 138b89ef0aSSøren Schmidt * documentation and/or other materials provided with the distribution. 148b89ef0aSSøren Schmidt * 158b89ef0aSSøren Schmidt * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR 168b89ef0aSSøren Schmidt * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 178b89ef0aSSøren Schmidt * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 188b89ef0aSSøren Schmidt * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, 198b89ef0aSSøren Schmidt * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 208b89ef0aSSøren Schmidt * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 218b89ef0aSSøren Schmidt * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 228b89ef0aSSøren Schmidt * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 238b89ef0aSSøren Schmidt * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 248b89ef0aSSøren Schmidt * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 258b89ef0aSSøren Schmidt * 26c3aac50fSPeter Wemm * $FreeBSD$ 278b89ef0aSSøren Schmidt */ 288b89ef0aSSøren Schmidt 299b079503SAlexander Motin #include "opt_ata.h" 309b079503SAlexander Motin 31f3755df1SNathan Whitehorn #if 0 32f3755df1SNathan Whitehorn #define ATA_LEGACY_SUPPORT /* Enable obsolete features that break 33f3755df1SNathan Whitehorn * some modern devices */ 34f3755df1SNathan Whitehorn #endif 35f3755df1SNathan Whitehorn 368b89ef0aSSøren Schmidt /* ATA register defines */ 370e1eb682SSøren Schmidt #define ATA_DATA 0 /* (RW) data */ 385fdbb0d2SSøren Schmidt 390e1eb682SSøren Schmidt #define ATA_FEATURE 1 /* (W) feature */ 400e1eb682SSøren Schmidt #define ATA_F_DMA 0x01 /* enable DMA */ 410e1eb682SSøren Schmidt #define ATA_F_OVL 0x02 /* enable overlap */ 420e1eb682SSøren Schmidt 430e1eb682SSøren Schmidt #define ATA_COUNT 2 /* (W) sector count */ 440e1eb682SSøren Schmidt 450e1eb682SSøren Schmidt #define ATA_SECTOR 3 /* (RW) sector # */ 460e1eb682SSøren Schmidt #define ATA_CYL_LSB 4 /* (RW) cylinder# LSB */ 470e1eb682SSøren Schmidt #define ATA_CYL_MSB 5 /* (RW) cylinder# MSB */ 480e1eb682SSøren Schmidt #define ATA_DRIVE 6 /* (W) Sector/Drive/Head */ 490e1eb682SSøren Schmidt #define ATA_D_LBA 0x40 /* use LBA addressing */ 500e1eb682SSøren Schmidt #define ATA_D_IBM 0xa0 /* 512 byte sectors, ECC */ 510e1eb682SSøren Schmidt 520e1eb682SSøren Schmidt #define ATA_COMMAND 7 /* (W) command */ 530e1eb682SSøren Schmidt 540e1eb682SSøren Schmidt #define ATA_ERROR 8 /* (R) error */ 555fdbb0d2SSøren Schmidt #define ATA_E_ILI 0x01 /* illegal length */ 563082a6dcSSøren Schmidt #define ATA_E_NM 0x02 /* no media */ 572b0a1c08SSøren Schmidt #define ATA_E_ABORT 0x04 /* command aborted */ 583082a6dcSSøren Schmidt #define ATA_E_MCR 0x08 /* media change request */ 593082a6dcSSøren Schmidt #define ATA_E_IDNF 0x10 /* ID not found */ 603082a6dcSSøren Schmidt #define ATA_E_MC 0x20 /* media changed */ 613082a6dcSSøren Schmidt #define ATA_E_UNC 0x40 /* uncorrectable data */ 623082a6dcSSøren Schmidt #define ATA_E_ICRC 0x80 /* UDMA crc error */ 63cd8a592bSSøren Schmidt #define ATA_E_ATAPI_SENSE_MASK 0xf0 /* ATAPI sense key mask */ 642b0a1c08SSøren Schmidt 650e1eb682SSøren Schmidt #define ATA_IREASON 9 /* (R) interrupt reason */ 668b89ef0aSSøren Schmidt #define ATA_I_CMD 0x01 /* cmd (1) | data (0) */ 678b89ef0aSSøren Schmidt #define ATA_I_IN 0x02 /* read (1) | write (0) */ 688b89ef0aSSøren Schmidt #define ATA_I_RELEASE 0x04 /* released bus (1) */ 6955bfaed1SSøren Schmidt #define ATA_I_TAGMASK 0xf8 /* tag mask */ 708b89ef0aSSøren Schmidt 710e1eb682SSøren Schmidt #define ATA_STATUS 10 /* (R) status */ 720e1eb682SSøren Schmidt #define ATA_ALTSTAT 11 /* (R) alternate status */ 738b89ef0aSSøren Schmidt #define ATA_S_ERROR 0x01 /* error */ 748b89ef0aSSøren Schmidt #define ATA_S_INDEX 0x02 /* index */ 758b89ef0aSSøren Schmidt #define ATA_S_CORR 0x04 /* data corrected */ 768b89ef0aSSøren Schmidt #define ATA_S_DRQ 0x08 /* data request */ 7755bfaed1SSøren Schmidt #define ATA_S_DSC 0x10 /* drive seek completed */ 782b0a1c08SSøren Schmidt #define ATA_S_SERVICE 0x10 /* drive needs service */ 798b89ef0aSSøren Schmidt #define ATA_S_DWF 0x20 /* drive write fault */ 802b0a1c08SSøren Schmidt #define ATA_S_DMA 0x20 /* DMA ready */ 812b0a1c08SSøren Schmidt #define ATA_S_READY 0x40 /* drive ready */ 822b0a1c08SSøren Schmidt #define ATA_S_BUSY 0x80 /* busy */ 838b89ef0aSSøren Schmidt 840e1eb682SSøren Schmidt #define ATA_CONTROL 12 /* (W) control */ 850e1eb682SSøren Schmidt 860e1eb682SSøren Schmidt #define ATA_CTLOFFSET 0x206 /* control register offset */ 870e1eb682SSøren Schmidt #define ATA_PCCARD_CTLOFFSET 0x0e /* do for PCCARD devices */ 880e1eb682SSøren Schmidt #define ATA_PC98_CTLOFFSET 0x10c /* do for PC98 devices */ 898b89ef0aSSøren Schmidt #define ATA_A_IDS 0x02 /* disable interrupts */ 908b89ef0aSSøren Schmidt #define ATA_A_RESET 0x04 /* RESET controller */ 91f3755df1SNathan Whitehorn #ifdef ATA_LEGACY_SUPPORT 92f3755df1SNathan Whitehorn #define ATA_A_4BIT 0x08 /* 4 head bits: obsolete 1996 */ 93f3755df1SNathan Whitehorn #else 94f3755df1SNathan Whitehorn #define ATA_A_4BIT 0x00 95f3755df1SNathan Whitehorn #endif 968ca4df32SSøren Schmidt #define ATA_A_HOB 0x80 /* High Order Byte enable */ 978b89ef0aSSøren Schmidt 98b0a7e6a5SSøren Schmidt /* SATA register defines */ 99b0a7e6a5SSøren Schmidt #define ATA_SSTATUS 13 100b0a7e6a5SSøren Schmidt #define ATA_SS_DET_MASK 0x0000000f 101b0a7e6a5SSøren Schmidt #define ATA_SS_DET_NO_DEVICE 0x00000000 102b0a7e6a5SSøren Schmidt #define ATA_SS_DET_DEV_PRESENT 0x00000001 103b0a7e6a5SSøren Schmidt #define ATA_SS_DET_PHY_ONLINE 0x00000003 104b0a7e6a5SSøren Schmidt #define ATA_SS_DET_PHY_OFFLINE 0x00000004 105b0a7e6a5SSøren Schmidt 106b0a7e6a5SSøren Schmidt #define ATA_SS_SPD_MASK 0x000000f0 107b0a7e6a5SSøren Schmidt #define ATA_SS_SPD_NO_SPEED 0x00000000 108b0a7e6a5SSøren Schmidt #define ATA_SS_SPD_GEN1 0x00000010 109b0a7e6a5SSøren Schmidt #define ATA_SS_SPD_GEN2 0x00000020 110b0a7e6a5SSøren Schmidt 111b0a7e6a5SSøren Schmidt #define ATA_SS_IPM_MASK 0x00000f00 112b0a7e6a5SSøren Schmidt #define ATA_SS_IPM_NO_DEVICE 0x00000000 113b0a7e6a5SSøren Schmidt #define ATA_SS_IPM_ACTIVE 0x00000100 114b0a7e6a5SSøren Schmidt #define ATA_SS_IPM_PARTIAL 0x00000200 115b0a7e6a5SSøren Schmidt #define ATA_SS_IPM_SLUMBER 0x00000600 116b0a7e6a5SSøren Schmidt 117b0a7e6a5SSøren Schmidt #define ATA_SERROR 14 118b0a7e6a5SSøren Schmidt #define ATA_SE_DATA_CORRECTED 0x00000001 119b0a7e6a5SSøren Schmidt #define ATA_SE_COMM_CORRECTED 0x00000002 120b0a7e6a5SSøren Schmidt #define ATA_SE_DATA_ERR 0x00000100 121b0a7e6a5SSøren Schmidt #define ATA_SE_COMM_ERR 0x00000200 122b0a7e6a5SSøren Schmidt #define ATA_SE_PROT_ERR 0x00000400 123b0a7e6a5SSøren Schmidt #define ATA_SE_HOST_ERR 0x00000800 124b0a7e6a5SSøren Schmidt #define ATA_SE_PHY_CHANGED 0x00010000 125b0a7e6a5SSøren Schmidt #define ATA_SE_PHY_IERROR 0x00020000 126b0a7e6a5SSøren Schmidt #define ATA_SE_COMM_WAKE 0x00040000 127b0a7e6a5SSøren Schmidt #define ATA_SE_DECODE_ERR 0x00080000 128b0a7e6a5SSøren Schmidt #define ATA_SE_PARITY_ERR 0x00100000 129b0a7e6a5SSøren Schmidt #define ATA_SE_CRC_ERR 0x00200000 130b0a7e6a5SSøren Schmidt #define ATA_SE_HANDSHAKE_ERR 0x00400000 131b0a7e6a5SSøren Schmidt #define ATA_SE_LINKSEQ_ERR 0x00800000 132b0a7e6a5SSøren Schmidt #define ATA_SE_TRANSPORT_ERR 0x01000000 133b0a7e6a5SSøren Schmidt #define ATA_SE_UNKNOWN_FIS 0x02000000 134b0a7e6a5SSøren Schmidt 135b0a7e6a5SSøren Schmidt #define ATA_SCONTROL 15 136b0a7e6a5SSøren Schmidt #define ATA_SC_DET_MASK 0x0000000f 137abacbfafSSøren Schmidt #define ATA_SC_DET_IDLE 0x00000000 138b0a7e6a5SSøren Schmidt #define ATA_SC_DET_RESET 0x00000001 139b0a7e6a5SSøren Schmidt #define ATA_SC_DET_DISABLE 0x00000004 140b0a7e6a5SSøren Schmidt 141b0a7e6a5SSøren Schmidt #define ATA_SC_SPD_MASK 0x000000f0 142b0a7e6a5SSøren Schmidt #define ATA_SC_SPD_NO_SPEED 0x00000000 143b0a7e6a5SSøren Schmidt #define ATA_SC_SPD_SPEED_GEN1 0x00000010 144b0a7e6a5SSøren Schmidt #define ATA_SC_SPD_SPEED_GEN2 0x00000020 1459c87d811SAlexander Motin #define ATA_SC_SPD_SPEED_GEN3 0x00000040 146b0a7e6a5SSøren Schmidt 147b0a7e6a5SSøren Schmidt #define ATA_SC_IPM_MASK 0x00000f00 148b0a7e6a5SSøren Schmidt #define ATA_SC_IPM_NONE 0x00000000 149b0a7e6a5SSøren Schmidt #define ATA_SC_IPM_DIS_PARTIAL 0x00000100 150b0a7e6a5SSøren Schmidt #define ATA_SC_IPM_DIS_SLUMBER 0x00000200 151b0a7e6a5SSøren Schmidt 152d81c813fSSøren Schmidt #define ATA_SACTIVE 16 153d81c813fSSøren Schmidt 154d81c813fSSøren Schmidt /* SATA AHCI v1.0 register defines */ 155d81c813fSSøren Schmidt #define ATA_AHCI_CAP 0x00 1564c10f2e6SAlexander Motin #define ATA_AHCI_CAP_NPMASK 0x0000001f 157aa87dacbSAlexander Motin #define ATA_AHCI_CAP_SXS 0x00000020 158aa87dacbSAlexander Motin #define ATA_AHCI_CAP_EMS 0x00000040 159aa87dacbSAlexander Motin #define ATA_AHCI_CAP_CCCS 0x00000080 160aa87dacbSAlexander Motin #define ATA_AHCI_CAP_NCS 0x00001F00 161aa87dacbSAlexander Motin #define ATA_AHCI_CAP_NCS_SHIFT 8 1624c10f2e6SAlexander Motin #define ATA_AHCI_CAP_PSC 0x00002000 1634c10f2e6SAlexander Motin #define ATA_AHCI_CAP_SSC 0x00004000 164aa87dacbSAlexander Motin #define ATA_AHCI_CAP_PMD 0x00008000 165aa87dacbSAlexander Motin #define ATA_AHCI_CAP_FBSS 0x00010000 1669f82379cSSøren Schmidt #define ATA_AHCI_CAP_SPM 0x00020000 167aa87dacbSAlexander Motin #define ATA_AHCI_CAP_SAM 0x00080000 168aa87dacbSAlexander Motin #define ATA_AHCI_CAP_ISS 0x00F00000 169aa87dacbSAlexander Motin #define ATA_AHCI_CAP_ISS_SHIFT 20 170aa87dacbSAlexander Motin #define ATA_AHCI_CAP_SCLO 0x01000000 171aa87dacbSAlexander Motin #define ATA_AHCI_CAP_SAL 0x02000000 1724c10f2e6SAlexander Motin #define ATA_AHCI_CAP_SALP 0x04000000 173aa87dacbSAlexander Motin #define ATA_AHCI_CAP_SSS 0x08000000 174aa87dacbSAlexander Motin #define ATA_AHCI_CAP_SMPS 0x10000000 175aa87dacbSAlexander Motin #define ATA_AHCI_CAP_SSNTF 0x20000000 176aa87dacbSAlexander Motin #define ATA_AHCI_CAP_SNCQ 0x40000000 177ca40bd0bSSøren Schmidt #define ATA_AHCI_CAP_64BIT 0x80000000 178d81c813fSSøren Schmidt 179d81c813fSSøren Schmidt #define ATA_AHCI_GHC 0x04 180d81c813fSSøren Schmidt #define ATA_AHCI_GHC_AE 0x80000000 181d81c813fSSøren Schmidt #define ATA_AHCI_GHC_IE 0x00000002 182200c7605SSøren Schmidt #define ATA_AHCI_GHC_HR 0x00000001 183d81c813fSSøren Schmidt 184d81c813fSSøren Schmidt #define ATA_AHCI_IS 0x08 185d81c813fSSøren Schmidt #define ATA_AHCI_PI 0x0c 186d81c813fSSøren Schmidt #define ATA_AHCI_VS 0x10 187d81c813fSSøren Schmidt 188d81c813fSSøren Schmidt #define ATA_AHCI_OFFSET 0x80 189d81c813fSSøren Schmidt 190d81c813fSSøren Schmidt #define ATA_AHCI_P_CLB 0x100 191d81c813fSSøren Schmidt #define ATA_AHCI_P_CLBU 0x104 192d81c813fSSøren Schmidt #define ATA_AHCI_P_FB 0x108 193d81c813fSSøren Schmidt #define ATA_AHCI_P_FBU 0x10c 194d81c813fSSøren Schmidt #define ATA_AHCI_P_IS 0x110 195d81c813fSSøren Schmidt #define ATA_AHCI_P_IE 0x114 196d81c813fSSøren Schmidt #define ATA_AHCI_P_IX_DHR 0x00000001 197d81c813fSSøren Schmidt #define ATA_AHCI_P_IX_PS 0x00000002 198d81c813fSSøren Schmidt #define ATA_AHCI_P_IX_DS 0x00000004 199d81c813fSSøren Schmidt #define ATA_AHCI_P_IX_SDB 0x00000008 200d81c813fSSøren Schmidt #define ATA_AHCI_P_IX_UF 0x00000010 201d81c813fSSøren Schmidt #define ATA_AHCI_P_IX_DP 0x00000020 202d81c813fSSøren Schmidt #define ATA_AHCI_P_IX_PC 0x00000040 203d81c813fSSøren Schmidt #define ATA_AHCI_P_IX_DI 0x00000080 204d81c813fSSøren Schmidt 205d81c813fSSøren Schmidt #define ATA_AHCI_P_IX_PRC 0x00400000 206d81c813fSSøren Schmidt #define ATA_AHCI_P_IX_IPM 0x00800000 207d81c813fSSøren Schmidt #define ATA_AHCI_P_IX_OF 0x01000000 208d81c813fSSøren Schmidt #define ATA_AHCI_P_IX_INF 0x04000000 209d81c813fSSøren Schmidt #define ATA_AHCI_P_IX_IF 0x08000000 210d81c813fSSøren Schmidt #define ATA_AHCI_P_IX_HBD 0x10000000 211d81c813fSSøren Schmidt #define ATA_AHCI_P_IX_HBF 0x20000000 212d81c813fSSøren Schmidt #define ATA_AHCI_P_IX_TFE 0x40000000 213d81c813fSSøren Schmidt #define ATA_AHCI_P_IX_CPD 0x80000000 214d81c813fSSøren Schmidt 215d81c813fSSøren Schmidt #define ATA_AHCI_P_CMD 0x118 216d81c813fSSøren Schmidt #define ATA_AHCI_P_CMD_ST 0x00000001 217d81c813fSSøren Schmidt #define ATA_AHCI_P_CMD_SUD 0x00000002 218d81c813fSSøren Schmidt #define ATA_AHCI_P_CMD_POD 0x00000004 219d81c813fSSøren Schmidt #define ATA_AHCI_P_CMD_CLO 0x00000008 220d81c813fSSøren Schmidt #define ATA_AHCI_P_CMD_FRE 0x00000010 221d81c813fSSøren Schmidt #define ATA_AHCI_P_CMD_CCS_MASK 0x00001f00 222d81c813fSSøren Schmidt #define ATA_AHCI_P_CMD_ISS 0x00002000 223d81c813fSSøren Schmidt #define ATA_AHCI_P_CMD_FR 0x00004000 224d81c813fSSøren Schmidt #define ATA_AHCI_P_CMD_CR 0x00008000 225d81c813fSSøren Schmidt #define ATA_AHCI_P_CMD_CPS 0x00010000 226d81c813fSSøren Schmidt #define ATA_AHCI_P_CMD_PMA 0x00020000 227d81c813fSSøren Schmidt #define ATA_AHCI_P_CMD_HPCP 0x00040000 228d81c813fSSøren Schmidt #define ATA_AHCI_P_CMD_ISP 0x00080000 229d81c813fSSøren Schmidt #define ATA_AHCI_P_CMD_CPD 0x00100000 230d81c813fSSøren Schmidt #define ATA_AHCI_P_CMD_ATAPI 0x01000000 231d81c813fSSøren Schmidt #define ATA_AHCI_P_CMD_DLAE 0x02000000 232d81c813fSSøren Schmidt #define ATA_AHCI_P_CMD_ALPE 0x04000000 233d81c813fSSøren Schmidt #define ATA_AHCI_P_CMD_ASP 0x08000000 234d81c813fSSøren Schmidt #define ATA_AHCI_P_CMD_ICC_MASK 0xf0000000 235d81c813fSSøren Schmidt #define ATA_AHCI_P_CMD_NOOP 0x00000000 236d81c813fSSøren Schmidt #define ATA_AHCI_P_CMD_ACTIVE 0x10000000 237d81c813fSSøren Schmidt #define ATA_AHCI_P_CMD_PARTIAL 0x20000000 238ca6c2e36SAlexander Motin #define ATA_AHCI_P_CMD_SLUMBER 0x60000000 239d81c813fSSøren Schmidt 240d81c813fSSøren Schmidt #define ATA_AHCI_P_TFD 0x120 241d81c813fSSøren Schmidt #define ATA_AHCI_P_SIG 0x124 242d81c813fSSøren Schmidt #define ATA_AHCI_P_SSTS 0x128 243d81c813fSSøren Schmidt #define ATA_AHCI_P_SCTL 0x12c 244d81c813fSSøren Schmidt #define ATA_AHCI_P_SERR 0x130 245d81c813fSSøren Schmidt #define ATA_AHCI_P_SACT 0x134 246d81c813fSSøren Schmidt #define ATA_AHCI_P_CI 0x138 2479f82379cSSøren Schmidt #define ATA_AHCI_P_SNTF 0x13C 2489f82379cSSøren Schmidt #define ATA_AHCI_P_FBS 0x140 249d81c813fSSøren Schmidt 250d81c813fSSøren Schmidt #define ATA_AHCI_CL_SIZE 32 251d81c813fSSøren Schmidt #define ATA_AHCI_CL_OFFSET 0 252104c094eSSøren Schmidt #define ATA_AHCI_FB_OFFSET (ATA_AHCI_CL_SIZE * 32) 253104c094eSSøren Schmidt #define ATA_AHCI_CT_OFFSET (ATA_AHCI_FB_OFFSET + 4096) 254ebbb35baSAlexander Motin #define ATA_AHCI_CT_SIZE (2176 + 128) 255d81c813fSSøren Schmidt 256233fcaedSSøren Schmidt struct ata_ahci_dma_prd { 257233fcaedSSøren Schmidt u_int64_t dba; 258233fcaedSSøren Schmidt u_int32_t reserved; 259233fcaedSSøren Schmidt u_int32_t dbc; /* 0 based */ 260233fcaedSSøren Schmidt #define ATA_AHCI_PRD_MASK 0x003fffff /* max 4MB */ 261233fcaedSSøren Schmidt #define ATA_AHCI_PRD_IPC (1<<31) 262233fcaedSSøren Schmidt } __packed; 263233fcaedSSøren Schmidt 264233fcaedSSøren Schmidt struct ata_ahci_cmd_tab { 265233fcaedSSøren Schmidt u_int8_t cfis[64]; 266233fcaedSSøren Schmidt u_int8_t acmd[32]; 267233fcaedSSøren Schmidt u_int8_t reserved[32]; 268ebbb35baSAlexander Motin #define ATA_AHCI_DMA_ENTRIES 129 269104c094eSSøren Schmidt struct ata_ahci_dma_prd prd_tab[ATA_AHCI_DMA_ENTRIES]; 270233fcaedSSøren Schmidt } __packed; 271233fcaedSSøren Schmidt 272233fcaedSSøren Schmidt struct ata_ahci_cmd_list { 273233fcaedSSøren Schmidt u_int16_t cmd_flags; 2749f82379cSSøren Schmidt #define ATA_AHCI_CMD_ATAPI 0x0020 2759f82379cSSøren Schmidt #define ATA_AHCI_CMD_WRITE 0x0040 2769f82379cSSøren Schmidt #define ATA_AHCI_CMD_PREFETCH 0x0080 2779f82379cSSøren Schmidt #define ATA_AHCI_CMD_RESET 0x0100 2789f82379cSSøren Schmidt #define ATA_AHCI_CMD_BIST 0x0200 2799f82379cSSøren Schmidt #define ATA_AHCI_CMD_CLR_BUSY 0x0400 2809f82379cSSøren Schmidt 281233fcaedSSøren Schmidt u_int16_t prd_length; /* PRD entries */ 282233fcaedSSøren Schmidt u_int32_t bytecount; 283233fcaedSSøren Schmidt u_int64_t cmd_table_phys; /* 128byte aligned */ 284233fcaedSSøren Schmidt } __packed; 285233fcaedSSøren Schmidt 286233fcaedSSøren Schmidt 287b0a7e6a5SSøren Schmidt /* DMA register defines */ 288b0a7e6a5SSøren Schmidt #define ATA_DMA_ENTRIES 256 289b0a7e6a5SSøren Schmidt #define ATA_DMA_EOT 0x80000000 290b0a7e6a5SSøren Schmidt 291d81c813fSSøren Schmidt #define ATA_BMCMD_PORT 17 292b0a7e6a5SSøren Schmidt #define ATA_BMCMD_START_STOP 0x01 293b0a7e6a5SSøren Schmidt #define ATA_BMCMD_WRITE_READ 0x08 294b0a7e6a5SSøren Schmidt 295d81c813fSSøren Schmidt #define ATA_BMDEVSPEC_0 18 296d81c813fSSøren Schmidt #define ATA_BMSTAT_PORT 19 297b0a7e6a5SSøren Schmidt #define ATA_BMSTAT_ACTIVE 0x01 298b0a7e6a5SSøren Schmidt #define ATA_BMSTAT_ERROR 0x02 299b0a7e6a5SSøren Schmidt #define ATA_BMSTAT_INTERRUPT 0x04 300b0a7e6a5SSøren Schmidt #define ATA_BMSTAT_MASK 0x07 301b0a7e6a5SSøren Schmidt #define ATA_BMSTAT_DMA_MASTER 0x20 302b0a7e6a5SSøren Schmidt #define ATA_BMSTAT_DMA_SLAVE 0x40 303b0a7e6a5SSøren Schmidt #define ATA_BMSTAT_DMA_SIMPLEX 0x80 304b0a7e6a5SSøren Schmidt 305d81c813fSSøren Schmidt #define ATA_BMDEVSPEC_1 20 306d81c813fSSøren Schmidt #define ATA_BMDTP_PORT 21 307b0a7e6a5SSøren Schmidt 308d81c813fSSøren Schmidt #define ATA_IDX_ADDR 22 309d81c813fSSøren Schmidt #define ATA_IDX_DATA 23 310d81c813fSSøren Schmidt #define ATA_MAX_RES 24 3115fdbb0d2SSøren Schmidt 31255bfaed1SSøren Schmidt /* misc defines */ 3137dd6c388SSøren Schmidt #define ATA_PRIMARY 0x1f0 3147dd6c388SSøren Schmidt #define ATA_SECONDARY 0x170 3158ba4488cSSøren Schmidt #define ATA_PC98_BANK 0x432 3168b89ef0aSSøren Schmidt #define ATA_IOSIZE 0x08 317566cf07aSSøren Schmidt #define ATA_PC98_IOSIZE 0x10 3180e1eb682SSøren Schmidt #define ATA_CTLIOSIZE 0x01 319b17f7a1aSSøren Schmidt #define ATA_BMIOSIZE 0x08 3208ba4488cSSøren Schmidt #define ATA_PC98_BANKIOSIZE 0x01 321331c488dSSøren Schmidt #define ATA_IOADDR_RID 0 3220e1eb682SSøren Schmidt #define ATA_CTLADDR_RID 1 323566cf07aSSøren Schmidt #define ATA_BMADDR_RID 0x20 3240e1eb682SSøren Schmidt #define ATA_PC98_CTLADDR_RID 8 3258ba4488cSSøren Schmidt #define ATA_PC98_BANKADDR_RID 9 326331c488dSSøren Schmidt #define ATA_IRQ_RID 0 3271a796873SSøren Schmidt #define ATA_DEV(unit) ((unit > 0) ? 0x10 : 0) 328cd8a592bSSøren Schmidt #define ATA_CFA_MAGIC1 0x844A 329cd8a592bSSøren Schmidt #define ATA_CFA_MAGIC2 0x848A 330266d3a7aSRemko Lodder #define ATA_CFA_MAGIC3 0x8400 331b0a7e6a5SSøren Schmidt #define ATAPI_MAGIC_LSB 0x14 332b0a7e6a5SSøren Schmidt #define ATAPI_MAGIC_MSB 0xeb 333b0a7e6a5SSøren Schmidt #define ATAPI_P_READ (ATA_S_DRQ | ATA_I_IN) 334b0a7e6a5SSøren Schmidt #define ATAPI_P_WRITE (ATA_S_DRQ) 335b0a7e6a5SSøren Schmidt #define ATAPI_P_CMDOUT (ATA_S_DRQ | ATA_I_CMD) 336b0a7e6a5SSøren Schmidt #define ATAPI_P_DONEDRQ (ATA_S_DRQ | ATA_I_CMD | ATA_I_IN) 337b0a7e6a5SSøren Schmidt #define ATAPI_P_DONE (ATA_I_CMD | ATA_I_IN) 338b0a7e6a5SSøren Schmidt #define ATAPI_P_ABORT 0 3395fdbb0d2SSøren Schmidt #define ATA_INTR_FLAGS (INTR_MPSAFE|INTR_TYPE_BIO|INTR_ENTROPY) 3405fdbb0d2SSøren Schmidt #define ATA_OP_CONTINUES 0 3415fdbb0d2SSøren Schmidt #define ATA_OP_FINISHED 1 3426c22760cSSøren Schmidt #define ATA_MAX_28BIT_LBA 268435455UL 343241ce89eSSøren Schmidt 3446fb5300bSAlexander Motin #ifndef ATA_REQUEST_TIMEOUT 3456fb5300bSAlexander Motin #define ATA_REQUEST_TIMEOUT 10 3466fb5300bSAlexander Motin #endif 3476fb5300bSAlexander Motin 3488ca4df32SSøren Schmidt /* structure used for composite atomic operations */ 3498ec96d7bSSøren Schmidt #define MAX_COMPOSITES 32 /* u_int32_t bits */ 3508ca4df32SSøren Schmidt struct ata_composite { 3518ca4df32SSøren Schmidt struct mtx lock; /* control lock */ 3528ca4df32SSøren Schmidt u_int32_t rd_needed; /* needed read subdisks */ 3538ca4df32SSøren Schmidt u_int32_t rd_done; /* done read subdisks */ 3548ca4df32SSøren Schmidt u_int32_t wr_needed; /* needed write subdisks */ 3558ca4df32SSøren Schmidt u_int32_t wr_depend; /* write depends on subdisks */ 3568ca4df32SSøren Schmidt u_int32_t wr_done; /* done write subdisks */ 3578ec96d7bSSøren Schmidt struct ata_request *request[MAX_COMPOSITES]; 358e9bd25bfSSøren Schmidt u_int32_t residual; /* bytes still to transfer */ 3598ca4df32SSøren Schmidt caddr_t data_1; 3608ca4df32SSøren Schmidt caddr_t data_2; 3618ca4df32SSøren Schmidt }; 3625fdbb0d2SSøren Schmidt 3638ca4df32SSøren Schmidt /* structure used to queue an ATA/ATAPI request */ 3648ca4df32SSøren Schmidt struct ata_request { 3658ca4df32SSøren Schmidt device_t dev; /* device handle */ 36628baad63SSøren Schmidt device_t parent; /* channel handle */ 367ebbb35baSAlexander Motin int unit; /* physical unit */ 3685fdbb0d2SSøren Schmidt union { 3695fdbb0d2SSøren Schmidt struct { 3705fdbb0d2SSøren Schmidt u_int8_t command; /* command reg */ 371a6e97ccfSSøren Schmidt u_int16_t feature; /* feature reg */ 3725fdbb0d2SSøren Schmidt u_int16_t count; /* count reg */ 373f2972d7eSSøren Schmidt u_int64_t lba; /* lba reg */ 3745fdbb0d2SSøren Schmidt } ata; 3755fdbb0d2SSøren Schmidt struct { 3765fdbb0d2SSøren Schmidt u_int8_t ccb[16]; /* ATAPI command block */ 377cd8a592bSSøren Schmidt struct atapi_sense sense; /* ATAPI request sense data */ 378cd8a592bSSøren Schmidt u_int8_t saved_cmd; /* ATAPI saved command */ 3795fdbb0d2SSøren Schmidt } atapi; 3805fdbb0d2SSøren Schmidt } u; 3818ca4df32SSøren Schmidt u_int32_t bytecount; /* bytes to transfer */ 3828ca4df32SSøren Schmidt u_int32_t transfersize; /* bytes pr transfer */ 3838ca4df32SSøren Schmidt caddr_t data; /* pointer to data buf */ 3849f82379cSSøren Schmidt u_int32_t tag; /* HW tag of this request */ 3858ca4df32SSøren Schmidt int flags; 3868ca4df32SSøren Schmidt #define ATA_R_CONTROL 0x00000001 3878ca4df32SSøren Schmidt #define ATA_R_READ 0x00000002 3888ca4df32SSøren Schmidt #define ATA_R_WRITE 0x00000004 3891d968d22SSøren Schmidt #define ATA_R_ATAPI 0x00000008 3901d968d22SSøren Schmidt #define ATA_R_DMA 0x00000010 3918ca4df32SSøren Schmidt #define ATA_R_QUIET 0x00000020 3921d968d22SSøren Schmidt #define ATA_R_TIMEOUT 0x00000040 393ebbb35baSAlexander Motin #define ATA_R_48BIT 0x00000080 3948ca4df32SSøren Schmidt 3958ca4df32SSøren Schmidt #define ATA_R_ORDERED 0x00000100 3968ca4df32SSøren Schmidt #define ATA_R_AT_HEAD 0x00000200 3978ca4df32SSøren Schmidt #define ATA_R_REQUEUE 0x00000400 3988ca4df32SSøren Schmidt #define ATA_R_THREAD 0x00000800 399ea74abd5SAlexander Motin #define ATA_R_DIRECT 0x00001000 40023d9e39cSAlexander Motin #define ATA_R_NEEDRESULT 0x00002000 4018ca4df32SSøren Schmidt 402ebbb35baSAlexander Motin #define ATA_R_ATAPI16 0x00010000 403ebbb35baSAlexander Motin #define ATA_R_ATAPI_INTR 0x00020000 404ebbb35baSAlexander Motin 4058ca4df32SSøren Schmidt #define ATA_R_DEBUG 0x10000000 4060b03bcd2SSøren Schmidt #define ATA_R_DANGER1 0x20000000 4070b03bcd2SSøren Schmidt #define ATA_R_DANGER2 0x40000000 4085fdbb0d2SSøren Schmidt 409104c094eSSøren Schmidt struct ata_dmaslot *dma; /* DMA slot of this request */ 4105fdbb0d2SSøren Schmidt u_int8_t status; /* ATA status */ 4115fdbb0d2SSøren Schmidt u_int8_t error; /* ATA error */ 4125fdbb0d2SSøren Schmidt u_int32_t donecount; /* bytes transferred */ 4138ca4df32SSøren Schmidt int result; /* result error code */ 4149f06a427SSøren Schmidt void (*callback)(struct ata_request *request); 415a7a120f6SSøren Schmidt struct sema done; /* request done sema */ 4165fdbb0d2SSøren Schmidt int retries; /* retry count */ 4175fdbb0d2SSøren Schmidt int timeout; /* timeout for this cmd */ 418b5dee91fSSøren Schmidt struct callout callout; /* callout management */ 4195fdbb0d2SSøren Schmidt struct task task; /* task management */ 420816994ccSSøren Schmidt struct bio *bio; /* bio for this request */ 4218ca4df32SSøren Schmidt int this; /* this request ID */ 4228ca4df32SSøren Schmidt struct ata_composite *composite; /* for composite atomic ops */ 4238ca4df32SSøren Schmidt void *driver; /* driver specific */ 4245fdbb0d2SSøren Schmidt TAILQ_ENTRY(ata_request) chain; /* list management */ 425066f913aSAlexander Motin #ifdef ATA_CAM 426066f913aSAlexander Motin union ccb *ccb; 427066f913aSAlexander Motin #endif 42855bfaed1SSøren Schmidt }; 42955bfaed1SSøren Schmidt 430a7a120f6SSøren Schmidt /* define this for debugging request processing */ 4310e1eb682SSøren Schmidt #if 0 432a7a120f6SSøren Schmidt #define ATA_DEBUG_RQ(request, string) \ 433a7a120f6SSøren Schmidt { \ 434a7a120f6SSøren Schmidt if (request->flags & ATA_R_DEBUG) \ 435ebbb35baSAlexander Motin device_printf(request->parent, "req=%p %s " string "\n", \ 436b5dee91fSSøren Schmidt request, ata_cmd2str(request)); \ 437a7a120f6SSøren Schmidt } 438a7a120f6SSøren Schmidt #else 439a7a120f6SSøren Schmidt #define ATA_DEBUG_RQ(request, string) 440a7a120f6SSøren Schmidt #endif 441a7a120f6SSøren Schmidt 442a7a120f6SSøren Schmidt 4436ddce903SSøren Schmidt /* structure describing an ATA/ATAPI device */ 4446ddce903SSøren Schmidt struct ata_device { 4458ca4df32SSøren Schmidt device_t dev; /* device handle */ 4468ca4df32SSøren Schmidt int unit; /* physical unit */ 4476ddce903SSøren Schmidt #define ATA_MASTER 0x00 448d90a6aaeSSøren Schmidt #define ATA_SLAVE 0x01 4499f82379cSSøren Schmidt #define ATA_PM 0x0f 4506ddce903SSøren Schmidt 4518ca4df32SSøren Schmidt struct ata_params param; /* ata param structure */ 4528ca4df32SSøren Schmidt int mode; /* current transfermode */ 4538ca4df32SSøren Schmidt u_int32_t max_iosize; /* max IO size */ 45472d945abSPoul-Henning Kamp int spindown; /* idle spindown timeout */ 45572d945abSPoul-Henning Kamp struct callout spindown_timer; 45672d945abSPoul-Henning Kamp int spindown_state; 4576ddce903SSøren Schmidt int flags; 4586ddce903SSøren Schmidt #define ATA_D_USE_CHS 0x0001 4598ca4df32SSøren Schmidt #define ATA_D_MEDIA_CHANGED 0x0002 4608ca4df32SSøren Schmidt #define ATA_D_ENC_PRESENT 0x0004 4616ddce903SSøren Schmidt }; 4626ddce903SSøren Schmidt 4638b68793aSSøren Schmidt /* structure for holding DMA Physical Region Descriptors (PRD) entries */ 4648b68793aSSøren Schmidt struct ata_dma_prdentry { 4658b68793aSSøren Schmidt u_int32_t addr; 4665fdbb0d2SSøren Schmidt u_int32_t count; 4675fdbb0d2SSøren Schmidt }; 4685fdbb0d2SSøren Schmidt 4698b68793aSSøren Schmidt /* structure used by the setprd function */ 4708b68793aSSøren Schmidt struct ata_dmasetprd_args { 4718b68793aSSøren Schmidt void *dmatab; 472eeda55ceSSøren Schmidt int nsegs; 4738b68793aSSøren Schmidt int error; 4748b68793aSSøren Schmidt }; 4758b68793aSSøren Schmidt 476104c094eSSøren Schmidt struct ata_dmaslot { 477104c094eSSøren Schmidt u_int8_t status; /* DMA status */ 478104c094eSSøren Schmidt bus_dma_tag_t sg_tag; /* SG list DMA tag */ 479104c094eSSøren Schmidt bus_dmamap_t sg_map; /* SG list DMA map */ 480104c094eSSøren Schmidt void *sg; /* DMA transfer table */ 481104c094eSSøren Schmidt bus_addr_t sg_bus; /* bus address of dmatab */ 482104c094eSSøren Schmidt bus_dma_tag_t data_tag; /* data DMA tag */ 483104c094eSSøren Schmidt bus_dmamap_t data_map; /* data DMA map */ 484104c094eSSøren Schmidt }; 485104c094eSSøren Schmidt 486566cf07aSSøren Schmidt /* structure holding DMA related information */ 4875fdbb0d2SSøren Schmidt struct ata_dma { 488566cf07aSSøren Schmidt bus_dma_tag_t dmatag; /* parent DMA tag */ 4898ca4df32SSøren Schmidt bus_dma_tag_t work_tag; /* workspace DMA tag */ 4908ca4df32SSøren Schmidt bus_dmamap_t work_map; /* workspace DMA map */ 4918ca4df32SSøren Schmidt u_int8_t *work; /* workspace */ 4928ca4df32SSøren Schmidt bus_addr_t work_bus; /* bus address of dmatab */ 493104c094eSSøren Schmidt 494ebbb35baSAlexander Motin #define ATA_DMA_SLOTS 1 495104c094eSSøren Schmidt int dma_slots; /* DMA slots allocated */ 496104c094eSSøren Schmidt struct ata_dmaslot slot[ATA_DMA_SLOTS]; 49740fdf812SSøren Schmidt u_int32_t alignment; /* DMA SG list alignment */ 49840fdf812SSøren Schmidt u_int32_t boundary; /* DMA SG list boundary */ 49940fdf812SSøren Schmidt u_int32_t segsize; /* DMA SG list segment size */ 50040fdf812SSøren Schmidt u_int32_t max_iosize; /* DMA data max IO size */ 501f27a1465SSøren Schmidt u_int64_t max_address; /* highest DMA'able address */ 502566cf07aSSøren Schmidt int flags; 5039f82379cSSøren Schmidt #define ATA_DMA_ACTIVE 0x01 /* DMA transfer in progress */ 504566cf07aSSøren Schmidt 505eeda55ceSSøren Schmidt void (*alloc)(device_t dev); 506eeda55ceSSøren Schmidt void (*free)(device_t dev); 5078b68793aSSøren Schmidt void (*setprd)(void *xsc, bus_dma_segment_t *segs, int nsegs, int error); 5089f82379cSSøren Schmidt int (*load)(struct ata_request *request, void *addr, int *nsegs); 5099f82379cSSøren Schmidt int (*unload)(struct ata_request *request); 5109f82379cSSøren Schmidt int (*start)(struct ata_request *request); 5119f82379cSSøren Schmidt int (*stop)(struct ata_request *request); 512eeda55ceSSøren Schmidt void (*reset)(device_t dev); 513566cf07aSSøren Schmidt }; 514566cf07aSSøren Schmidt 5155fdbb0d2SSøren Schmidt /* structure holding lowlevel functions */ 5165fdbb0d2SSøren Schmidt struct ata_lowlevel { 5179f82379cSSøren Schmidt u_int32_t (*softreset)(device_t dev, int pmport); 5189f82379cSSøren Schmidt int (*pm_read)(device_t dev, int port, int reg, u_int32_t *result); 5199f82379cSSøren Schmidt int (*pm_write)(device_t dev, int port, int reg, u_int32_t value); 520f5f55db3SSøren Schmidt int (*status)(device_t dev); 521b5dee91fSSøren Schmidt int (*begin_transaction)(struct ata_request *request); 522b5dee91fSSøren Schmidt int (*end_transaction)(struct ata_request *request); 523eeda55ceSSøren Schmidt int (*command)(struct ata_request *request); 5244c088dcdSSøren Schmidt void (*tf_read)(struct ata_request *request); 5254c088dcdSSøren Schmidt void (*tf_write)(struct ata_request *request); 5265fdbb0d2SSøren Schmidt }; 5275fdbb0d2SSøren Schmidt 528566cf07aSSøren Schmidt /* structure holding resources for an ATA channel */ 529566cf07aSSøren Schmidt struct ata_resource { 530566cf07aSSøren Schmidt struct resource *res; 531566cf07aSSøren Schmidt int offset; 532bb5bdd38SSøren Schmidt }; 533bb5bdd38SSøren Schmidt 534066f913aSAlexander Motin #ifdef ATA_CAM 535066f913aSAlexander Motin struct ata_cam_device { 536066f913aSAlexander Motin u_int revision; 537066f913aSAlexander Motin int mode; 538066f913aSAlexander Motin u_int bytecount; 5394cca1530SAlexander Motin u_int atapi; 54095e97044SAlexander Motin u_int caps; 541066f913aSAlexander Motin }; 542066f913aSAlexander Motin #endif 543066f913aSAlexander Motin 5446ddce903SSøren Schmidt /* structure describing an ATA channel */ 5456ddce903SSøren Schmidt struct ata_channel { 5468ca4df32SSøren Schmidt device_t dev; /* device handle */ 5478ca4df32SSøren Schmidt int unit; /* physical channel */ 548b50bb79cSAlexander Motin int attached; /* channel is attached */ 549566cf07aSSøren Schmidt struct ata_resource r_io[ATA_MAX_RES];/* I/O resources */ 55047351d27SSøren Schmidt struct resource *r_irq; /* interrupt of this channel */ 5511a488af6SSøren Schmidt void *ih; /* interrupt handle */ 5525fdbb0d2SSøren Schmidt struct ata_lowlevel hw; /* lowlevel HW functions */ 5539f82379cSSøren Schmidt struct ata_dma dma; /* DMA data / functions */ 554bb5bdd38SSøren Schmidt int flags; /* channel flags */ 5558975ededSSøren Schmidt #define ATA_NO_SLAVE 0x01 5568975ededSSøren Schmidt #define ATA_USE_16BIT 0x02 5576c357737SSøren Schmidt #define ATA_ATAPI_DMA_RO 0x04 55885047b1bSSøren Schmidt #define ATA_NO_48BIT_DMA 0x08 559f5f55db3SSøren Schmidt #define ATA_ALWAYS_DMASTAT 0x10 560066f913aSAlexander Motin #define ATA_CHECKS_CABLE 0x20 561066f913aSAlexander Motin #define ATA_NO_ATAPI_DMA 0x40 562066f913aSAlexander Motin #define ATA_SATA 0x80 563351129c7SNathan Whitehorn #define ATA_DMA_BEFORE_CMD 0x100 564a250a687SAlexander Motin #define ATA_KNOWN_PRESENCE 0x200 565c14e163aSNathan Whitehorn #define ATA_STATUS_IS_LONG 0x400 566bda55b6aSAlexander Motin #define ATA_PERIODIC_POLL 0x800 5676ddce903SSøren Schmidt 5684c10f2e6SAlexander Motin int pm_level; /* power management level */ 5698563f77dSSøren Schmidt int devices; /* what is present */ 5709f82379cSSøren Schmidt #define ATA_ATA_MASTER 0x00000001 5719f82379cSSøren Schmidt #define ATA_ATA_SLAVE 0x00000002 5729f82379cSSøren Schmidt #define ATA_PORTMULTIPLIER 0x00008000 5739f82379cSSøren Schmidt #define ATA_ATAPI_MASTER 0x00010000 5749f82379cSSøren Schmidt #define ATA_ATAPI_SLAVE 0x00020000 575f63c7e58SSøren Schmidt 576b5dee91fSSøren Schmidt struct mtx state_mtx; /* state lock */ 577b5dee91fSSøren Schmidt int state; /* ATA channel state */ 5788ea3ce2aSSøren Schmidt #define ATA_IDLE 0x0000 5795fdbb0d2SSøren Schmidt #define ATA_ACTIVE 0x0001 5808ca4df32SSøren Schmidt #define ATA_STALL_QUEUE 0x0002 5818b89ef0aSSøren Schmidt 582a7a120f6SSøren Schmidt struct mtx queue_mtx; /* queue lock */ 5835fdbb0d2SSøren Schmidt TAILQ_HEAD(, ata_request) ata_queue; /* head of ATA queue */ 5848ca4df32SSøren Schmidt struct ata_request *freezepoint; /* composite freezepoint */ 585f2972d7eSSøren Schmidt struct ata_request *running; /* currently running request */ 5866030a3f0SAlexander Motin struct task conntask; /* PHY events handling task */ 587066f913aSAlexander Motin #ifdef ATA_CAM 588066f913aSAlexander Motin struct cam_sim *sim; 589066f913aSAlexander Motin struct cam_path *path; 590066f913aSAlexander Motin struct ata_cam_device user[16]; /* User-specified settings */ 591066f913aSAlexander Motin struct ata_cam_device curr[16]; /* Current settings */ 592f3c987e5SAlexander Motin int requestsense; /* CCB waiting for SENSE. */ 593066f913aSAlexander Motin #endif 594bda55b6aSAlexander Motin struct callout poll_callout; /* Periodic status poll. */ 5958b89ef0aSSøren Schmidt }; 5968b89ef0aSSøren Schmidt 59733ede9b3SSøren Schmidt /* disk bay/enclosure related */ 5986ddce903SSøren Schmidt #define ATA_LED_OFF 0x00 5996ddce903SSøren Schmidt #define ATA_LED_RED 0x01 6006ddce903SSøren Schmidt #define ATA_LED_GREEN 0x02 6016ddce903SSøren Schmidt #define ATA_LED_ORANGE 0x03 60233ede9b3SSøren Schmidt #define ATA_LED_MASK 0x03 6036ddce903SSøren Schmidt 6042c483f9eSSøren Schmidt /* externs */ 6056667b30dSSøren Schmidt extern int (*ata_raid_ioctl_func)(u_long cmd, caddr_t data); 60659de60ddSSøren Schmidt extern struct intr_config_hook *ata_delayed_attach; 60747351d27SSøren Schmidt extern devclass_t ata_devclass; 6081bebf0fbSSøren Schmidt extern int ata_wc; 6099f82379cSSøren Schmidt extern int ata_setmax; 610854d77bdSPhilip Paeps extern int ata_dma_check_80pin; 6118b89ef0aSSøren Schmidt 6128b89ef0aSSøren Schmidt /* public prototypes */ 6135fdbb0d2SSøren Schmidt /* ata-all.c: */ 6149f06a427SSøren Schmidt int ata_probe(device_t dev); 6159f06a427SSøren Schmidt int ata_attach(device_t dev); 6169f06a427SSøren Schmidt int ata_detach(device_t dev); 6178ca4df32SSøren Schmidt int ata_reinit(device_t dev); 6189f06a427SSøren Schmidt int ata_suspend(device_t dev); 6199f06a427SSøren Schmidt int ata_resume(device_t dev); 62046a309e2SAlexander Motin void ata_interrupt(void *data); 6216667b30dSSøren Schmidt int ata_device_ioctl(device_t dev, u_long cmd, caddr_t data); 6229f82379cSSøren Schmidt int ata_getparam(struct ata_device *atadev, int init); 62377662bd7SSøren Schmidt int ata_identify(device_t dev); 6240068f98fSSøren Schmidt void ata_default_registers(device_t dev); 62585047b1bSSøren Schmidt void ata_modify_if_48bit(struct ata_request *request); 6260f7cfb84SSøren Schmidt void ata_udelay(int interval); 6275187458fSMarius Strobl const char *ata_unit2str(struct ata_device *atadev); 628066f913aSAlexander Motin const char *ata_mode2str(int mode); 6297ce1f3e5SAlexander Motin int ata_str2mode(const char *str); 630066f913aSAlexander Motin const char *ata_satarev2str(int rev); 6310966baf7SMarius Strobl int ata_atapi(device_t dev, int target); 6325fdbb0d2SSøren Schmidt int ata_pmode(struct ata_params *ap); 6335fdbb0d2SSøren Schmidt int ata_wmode(struct ata_params *ap); 6345fdbb0d2SSøren Schmidt int ata_umode(struct ata_params *ap); 6350068f98fSSøren Schmidt int ata_limit_mode(device_t dev, int mode, int maxmode); 636066f913aSAlexander Motin void ata_setmode(device_t dev); 637066f913aSAlexander Motin void ata_print_cable(device_t dev, u_int8_t *who); 638066f913aSAlexander Motin int ata_check_80pin(device_t dev, int mode); 639066f913aSAlexander Motin #ifdef ATA_CAM 640066f913aSAlexander Motin void ata_cam_begin_transaction(device_t dev, union ccb *ccb); 641066f913aSAlexander Motin void ata_cam_end_transaction(device_t dev, struct ata_request *request); 642066f913aSAlexander Motin #endif 6435fdbb0d2SSøren Schmidt 6445fdbb0d2SSøren Schmidt /* ata-queue.c: */ 6450068f98fSSøren Schmidt int ata_controlcmd(device_t dev, u_int8_t command, u_int16_t feature, u_int64_t lba, u_int16_t count); 6460068f98fSSøren Schmidt int ata_atapicmd(device_t dev, u_int8_t *ccb, caddr_t data, int count, int flags, int timeout); 6475fdbb0d2SSøren Schmidt void ata_queue_request(struct ata_request *request); 6488ca4df32SSøren Schmidt void ata_start(device_t dev); 6495fdbb0d2SSøren Schmidt void ata_finish(struct ata_request *request); 6501d968d22SSøren Schmidt void ata_timeout(struct ata_request *); 6510068f98fSSøren Schmidt void ata_catch_inflight(device_t dev); 6520068f98fSSøren Schmidt void ata_fail_requests(device_t dev); 653b1d1fff7SAlexander Motin void ata_drop_requests(device_t dev); 6545187458fSMarius Strobl const char *ata_cmd2str(struct ata_request *request); 6555fdbb0d2SSøren Schmidt 6565fdbb0d2SSøren Schmidt /* ata-lowlevel.c: */ 6570068f98fSSøren Schmidt void ata_generic_hw(device_t dev); 658f5f55db3SSøren Schmidt int ata_begin_transaction(struct ata_request *); 659f5f55db3SSøren Schmidt int ata_end_transaction(struct ata_request *); 6600068f98fSSøren Schmidt void ata_generic_reset(device_t dev); 661eeda55ceSSøren Schmidt int ata_generic_command(struct ata_request *request); 662b17f7a1aSSøren Schmidt 66393588d5cSRafal Jaworowski /* ata-dma.c: */ 66493588d5cSRafal Jaworowski void ata_dmainit(device_t); 66593588d5cSRafal Jaworowski void ata_dmafini(device_t dev); 66693588d5cSRafal Jaworowski 66793588d5cSRafal Jaworowski /* ata-sata.c: */ 668bda55b6aSAlexander Motin void ata_sata_phy_check_events(device_t dev, int port); 66993588d5cSRafal Jaworowski int ata_sata_scr_read(struct ata_channel *ch, int port, int reg, uint32_t *val); 67093588d5cSRafal Jaworowski int ata_sata_scr_write(struct ata_channel *ch, int port, int reg, uint32_t val); 67193588d5cSRafal Jaworowski int ata_sata_phy_reset(device_t dev, int port, int quick); 672066f913aSAlexander Motin int ata_sata_setmode(device_t dev, int target, int mode); 673066f913aSAlexander Motin int ata_sata_getrev(device_t dev, int target); 67493588d5cSRafal Jaworowski int ata_request2fis_h2d(struct ata_request *request, u_int8_t *fis); 67593588d5cSRafal Jaworowski void ata_pm_identify(device_t dev); 67693588d5cSRafal Jaworowski 677b3c3ba2eSSøren Schmidt /* macros for alloc/free of struct ata_request */ 678104c094eSSøren Schmidt extern uma_zone_t ata_request_zone; 679104c094eSSøren Schmidt #define ata_alloc_request() uma_zalloc(ata_request_zone, M_NOWAIT | M_ZERO) 680104c094eSSøren Schmidt #define ata_free_request(request) { \ 681104c094eSSøren Schmidt if (!(request->flags & ATA_R_DANGER2)) \ 682104c094eSSøren Schmidt uma_zfree(ata_request_zone, request); \ 683104c094eSSøren Schmidt } 684dca5e1abSSøren Schmidt 685b3c3ba2eSSøren Schmidt /* macros for alloc/free of struct ata_composite */ 686b3c3ba2eSSøren Schmidt extern uma_zone_t ata_composite_zone; 687b3c3ba2eSSøren Schmidt #define ata_alloc_composite() uma_zalloc(ata_composite_zone, M_NOWAIT | M_ZERO) 688b3c3ba2eSSøren Schmidt #define ata_free_composite(composite) uma_zfree(ata_composite_zone, composite) 689b3c3ba2eSSøren Schmidt 6908ca4df32SSøren Schmidt MALLOC_DECLARE(M_ATA); 6918ca4df32SSøren Schmidt 6928ca4df32SSøren Schmidt /* misc newbus defines */ 6938ca4df32SSøren Schmidt #define GRANDPARENT(dev) device_get_parent(device_get_parent(dev)) 6945df3ca78SSøren Schmidt 6958ea3ce2aSSøren Schmidt /* macros to hide busspace uglyness */ 696b17f7a1aSSøren Schmidt #define ATA_INB(res, offset) \ 69708d2425fSPoul-Henning Kamp bus_read_1((res), (offset)) 698566cf07aSSøren Schmidt 699b17f7a1aSSøren Schmidt #define ATA_INW(res, offset) \ 70008d2425fSPoul-Henning Kamp bus_read_2((res), (offset)) 701ba514351SMarius Strobl #define ATA_INW_STRM(res, offset) \ 702ba514351SMarius Strobl bus_read_stream_2((res), (offset)) 703b17f7a1aSSøren Schmidt #define ATA_INL(res, offset) \ 70408d2425fSPoul-Henning Kamp bus_read_4((res), (offset)) 705b17f7a1aSSøren Schmidt #define ATA_INSW(res, offset, addr, count) \ 70608d2425fSPoul-Henning Kamp bus_read_multi_2((res), (offset), (addr), (count)) 7077800211bSSøren Schmidt #define ATA_INSW_STRM(res, offset, addr, count) \ 70808d2425fSPoul-Henning Kamp bus_read_multi_stream_2((res), (offset), (addr), (count)) 709b17f7a1aSSøren Schmidt #define ATA_INSL(res, offset, addr, count) \ 71008d2425fSPoul-Henning Kamp bus_read_multi_4((res), (offset), (addr), (count)) 7117800211bSSøren Schmidt #define ATA_INSL_STRM(res, offset, addr, count) \ 71208d2425fSPoul-Henning Kamp bus_read_multi_stream_4((res), (offset), (addr), (count)) 713b17f7a1aSSøren Schmidt #define ATA_OUTB(res, offset, value) \ 71408d2425fSPoul-Henning Kamp bus_write_1((res), (offset), (value)) 715b17f7a1aSSøren Schmidt #define ATA_OUTW(res, offset, value) \ 71608d2425fSPoul-Henning Kamp bus_write_2((res), (offset), (value)) 717ba514351SMarius Strobl #define ATA_OUTW_STRM(res, offset, value) \ 718ba514351SMarius Strobl bus_write_stream_2((res), (offset), (value)) 719b17f7a1aSSøren Schmidt #define ATA_OUTL(res, offset, value) \ 72008d2425fSPoul-Henning Kamp bus_write_4((res), (offset), (value)) 721b17f7a1aSSøren Schmidt #define ATA_OUTSW(res, offset, addr, count) \ 72208d2425fSPoul-Henning Kamp bus_write_multi_2((res), (offset), (addr), (count)) 7237800211bSSøren Schmidt #define ATA_OUTSW_STRM(res, offset, addr, count) \ 72408d2425fSPoul-Henning Kamp bus_write_multi_stream_2((res), (offset), (addr), (count)) 725b17f7a1aSSøren Schmidt #define ATA_OUTSL(res, offset, addr, count) \ 72608d2425fSPoul-Henning Kamp bus_write_multi_4((res), (offset), (addr), (count)) 7277800211bSSøren Schmidt #define ATA_OUTSL_STRM(res, offset, addr, count) \ 72808d2425fSPoul-Henning Kamp bus_write_multi_stream_4((res), (offset), (addr), (count)) 7291b39bd24SSøren Schmidt 730566cf07aSSøren Schmidt #define ATA_IDX_INB(ch, idx) \ 731ad452ba4SSøren Schmidt ATA_INB(ch->r_io[idx].res, ch->r_io[idx].offset) 7321b39bd24SSøren Schmidt 733566cf07aSSøren Schmidt #define ATA_IDX_INW(ch, idx) \ 734ad452ba4SSøren Schmidt ATA_INW(ch->r_io[idx].res, ch->r_io[idx].offset) 7351b39bd24SSøren Schmidt 736ba514351SMarius Strobl #define ATA_IDX_INW_STRM(ch, idx) \ 737ba514351SMarius Strobl ATA_INW_STRM(ch->r_io[idx].res, ch->r_io[idx].offset) 738ba514351SMarius Strobl 739566cf07aSSøren Schmidt #define ATA_IDX_INL(ch, idx) \ 740ad452ba4SSøren Schmidt ATA_INL(ch->r_io[idx].res, ch->r_io[idx].offset) 7411b39bd24SSøren Schmidt 742566cf07aSSøren Schmidt #define ATA_IDX_INSW(ch, idx, addr, count) \ 743ad452ba4SSøren Schmidt ATA_INSW(ch->r_io[idx].res, ch->r_io[idx].offset, addr, count) 7441b39bd24SSøren Schmidt 745566cf07aSSøren Schmidt #define ATA_IDX_INSW_STRM(ch, idx, addr, count) \ 746ad452ba4SSøren Schmidt ATA_INSW_STRM(ch->r_io[idx].res, ch->r_io[idx].offset, addr, count) 7471b39bd24SSøren Schmidt 748566cf07aSSøren Schmidt #define ATA_IDX_INSL(ch, idx, addr, count) \ 749ad452ba4SSøren Schmidt ATA_INSL(ch->r_io[idx].res, ch->r_io[idx].offset, addr, count) 7501b39bd24SSøren Schmidt 751566cf07aSSøren Schmidt #define ATA_IDX_INSL_STRM(ch, idx, addr, count) \ 752ad452ba4SSøren Schmidt ATA_INSL_STRM(ch->r_io[idx].res, ch->r_io[idx].offset, addr, count) 7531b39bd24SSøren Schmidt 754566cf07aSSøren Schmidt #define ATA_IDX_OUTB(ch, idx, value) \ 755ad452ba4SSøren Schmidt ATA_OUTB(ch->r_io[idx].res, ch->r_io[idx].offset, value) 7561b39bd24SSøren Schmidt 757566cf07aSSøren Schmidt #define ATA_IDX_OUTW(ch, idx, value) \ 758ad452ba4SSøren Schmidt ATA_OUTW(ch->r_io[idx].res, ch->r_io[idx].offset, value) 7591b39bd24SSøren Schmidt 760ba514351SMarius Strobl #define ATA_IDX_OUTW_STRM(ch, idx, value) \ 761ba514351SMarius Strobl ATA_OUTW_STRM(ch->r_io[idx].res, ch->r_io[idx].offset, value) 762ba514351SMarius Strobl 763566cf07aSSøren Schmidt #define ATA_IDX_OUTL(ch, idx, value) \ 764ad452ba4SSøren Schmidt ATA_OUTL(ch->r_io[idx].res, ch->r_io[idx].offset, value) 7651b39bd24SSøren Schmidt 766566cf07aSSøren Schmidt #define ATA_IDX_OUTSW(ch, idx, addr, count) \ 767ad452ba4SSøren Schmidt ATA_OUTSW(ch->r_io[idx].res, ch->r_io[idx].offset, addr, count) 7681b39bd24SSøren Schmidt 769566cf07aSSøren Schmidt #define ATA_IDX_OUTSW_STRM(ch, idx, addr, count) \ 770ad452ba4SSøren Schmidt ATA_OUTSW_STRM(ch->r_io[idx].res, ch->r_io[idx].offset, addr, count) 7711b39bd24SSøren Schmidt 772566cf07aSSøren Schmidt #define ATA_IDX_OUTSL(ch, idx, addr, count) \ 773ad452ba4SSøren Schmidt ATA_OUTSL(ch->r_io[idx].res, ch->r_io[idx].offset, addr, count) 7741b39bd24SSøren Schmidt 775566cf07aSSøren Schmidt #define ATA_IDX_OUTSL_STRM(ch, idx, addr, count) \ 776ad452ba4SSøren Schmidt ATA_OUTSL_STRM(ch->r_io[idx].res, ch->r_io[idx].offset, addr, count) 777