[205] | 1 | /**
|
---|
[57] | 2 | * ata.h - ATA structures and macros for os2ahci driver
|
---|
| 3 | *
|
---|
[87] | 4 | * Copyright (c) 2011 thi.guten Software Development
|
---|
| 5 | * Copyright (c) 2011 Mensys B.V.
|
---|
[211] | 6 | * Copyright (c) 2013-2023 David Azarewicz <david@88watts.net>
|
---|
[57] | 7 | *
|
---|
[87] | 8 | * Authors: Christian Mueller, Markus Thielen
|
---|
| 9 | *
|
---|
| 10 | * Parts copied from/inspired by the Linux AHCI driver;
|
---|
| 11 | * those parts are (c) Linux AHCI/ATA maintainers
|
---|
| 12 | *
|
---|
[57] | 13 | * This program is free software; you can redistribute it and/or modify
|
---|
| 14 | * it under the terms of the GNU General Public License as published by
|
---|
| 15 | * the Free Software Foundation; either version 2 of the License, or
|
---|
| 16 | * (at your option) any later version.
|
---|
| 17 | *
|
---|
| 18 | * This program is distributed in the hope that it will be useful,
|
---|
| 19 | * but WITHOUT ANY WARRANTY; without even the implied warranty of
|
---|
| 20 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
---|
| 21 | * GNU General Public License for more details.
|
---|
| 22 | *
|
---|
| 23 | * You should have received a copy of the GNU General Public License
|
---|
| 24 | * along with this program; if not, write to the Free Software
|
---|
| 25 | * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
---|
| 26 | */
|
---|
| 27 |
|
---|
| 28 | /******************************************************************************
|
---|
[82] | 29 | * Right now, os2ahci uses a fixed sector size of 512 bytes for hard disks.
|
---|
| 30 | * This may change in the future...
|
---|
| 31 | */
|
---|
| 32 | #define ATA_SECTOR_SIZE 512
|
---|
| 33 |
|
---|
| 34 | /******************************************************************************
|
---|
[57] | 35 | * Macros to access geometry values in the ATA ID buffer
|
---|
| 36 | */
|
---|
| 37 | #define ATA_CYLS(id_buf) *((u16 *) (id_buf + ATA_ID_CYLS))
|
---|
| 38 | #define ATA_HEADS(id_buf) *((u16 *) (id_buf + ATA_ID_HEADS))
|
---|
| 39 | #define ATA_SECTORS(id_buf) *((u16 *) (id_buf + ATA_ID_SECTORS))
|
---|
| 40 | #define ATA_CAPACITY(id_buf) *((u32 *) (id_buf + ATA_ID_LBA_CAPACITY))
|
---|
| 41 |
|
---|
| 42 | #define ATA_CAPACITY48_L(id_buf) *((u32 *) (id_buf + ATA_ID_LBA_CAPACITY_2))
|
---|
| 43 | #define ATA_CAPACITY48_H(id_buf) *((u32 *) (id_buf + ATA_ID_LBA_CAPACITY_2 + 2))
|
---|
| 44 |
|
---|
| 45 | #define CUR_CYLS(id_buf) *((u16 *) (id_buf + ATA_ID_CUR_CYLS))
|
---|
| 46 | #define CUR_HEADS(id_buf) *((u16 *) (id_buf + ATA_ID_CUR_HEADS))
|
---|
| 47 | #define CUR_SECTORS(id_buf) *((u16 *) (id_buf + ATA_ID_CUR_SECTORS))
|
---|
| 48 | #define CUR_CAPACITY(id_buf) *((u32 *) (id_buf + ATA_ID_CUR_CAPACITY))
|
---|
| 49 |
|
---|
| 50 |
|
---|
| 51 | /******************************************************************************
|
---|
| 52 | * ATA IDENTIFY offsets and constants. The ATA IDENTIFY response is a bit of a
|
---|
| 53 | * mess and after struggling to put this into some structure, I discovered the
|
---|
| 54 | * Linux folks simply defined offsets and constants to those fields which are
|
---|
| 55 | * actually needed. Thus, I copied the relevant bits from ata.h, replacing
|
---|
| 56 | * the enum with precompiler definitions because our enums are signed 16 bits.
|
---|
| 57 | *
|
---|
| 58 | * Please note that strings such as the product name are stored using byte-
|
---|
| 59 | * swapped 16-bit words.
|
---|
| 60 | */
|
---|
| 61 | #define ATA_ID_WORDS 256
|
---|
| 62 | #define ATA_ID_CONFIG 0
|
---|
| 63 | #define ATA_ID_CYLS 1
|
---|
| 64 | #define ATA_ID_HEADS 3
|
---|
| 65 | #define ATA_ID_SECTORS 6
|
---|
| 66 | #define ATA_ID_SERNO 10
|
---|
| 67 | #define ATA_ID_BUF_SIZE 21
|
---|
| 68 | #define ATA_ID_FW_REV 23
|
---|
| 69 | #define ATA_ID_PROD 27
|
---|
| 70 | #define ATA_ID_MAX_MULTSECT 47
|
---|
| 71 | #define ATA_ID_DWORD_IO 48
|
---|
| 72 | #define ATA_ID_CAPABILITY 49
|
---|
| 73 | #define ATA_ID_OLD_PIO_MODES 51
|
---|
| 74 | #define ATA_ID_OLD_DMA_MODES 52
|
---|
| 75 | #define ATA_ID_FIELD_VALID 53
|
---|
| 76 | #define ATA_ID_CUR_CYLS 54
|
---|
| 77 | #define ATA_ID_CUR_HEADS 55
|
---|
| 78 | #define ATA_ID_CUR_SECTORS 56
|
---|
| 79 | #define ATA_ID_CUR_CAPACITY 57
|
---|
| 80 | #define ATA_ID_MULTSECT 59
|
---|
| 81 | #define ATA_ID_LBA_CAPACITY 60
|
---|
| 82 | #define ATA_ID_SWDMA_MODES 62
|
---|
| 83 | #define ATA_ID_MWDMA_MODES 63
|
---|
| 84 | #define ATA_ID_PIO_MODES 64
|
---|
| 85 | #define ATA_ID_EIDE_DMA_MIN 65
|
---|
| 86 | #define ATA_ID_EIDE_DMA_TIME 66
|
---|
| 87 | #define ATA_ID_EIDE_PIO 67
|
---|
| 88 | #define ATA_ID_EIDE_PIO_IORDY 68
|
---|
| 89 | #define ATA_ID_ADDITIONAL_SUPP 69
|
---|
| 90 | #define ATA_ID_QUEUE_DEPTH 75
|
---|
| 91 | #define ATA_ID_MAJOR_VER 80
|
---|
| 92 | #define ATA_ID_COMMAND_SET_1 82
|
---|
| 93 | #define ATA_ID_COMMAND_SET_2 83
|
---|
| 94 | #define ATA_ID_CFSSE 84
|
---|
| 95 | #define ATA_ID_CFSSE 84
|
---|
| 96 | #define ATA_ID_CFS_ENABLE_1 85
|
---|
| 97 | #define ATA_ID_CFS_ENABLE_2 86
|
---|
| 98 | #define ATA_ID_CSF_DEFAULT 87
|
---|
| 99 | #define ATA_ID_UDMA_MODES 88
|
---|
| 100 | #define ATA_ID_HW_CONFIG 93
|
---|
| 101 | #define ATA_ID_SPG 98
|
---|
| 102 | #define ATA_ID_LBA_CAPACITY_2 100
|
---|
| 103 | #define ATA_ID_SECTOR_SIZE 106
|
---|
| 104 | #define ATA_ID_LAST_LUN 126
|
---|
| 105 | #define ATA_ID_DLF 128
|
---|
| 106 | #define ATA_ID_CSFO 129
|
---|
| 107 | #define ATA_ID_CFA_POWER 160
|
---|
| 108 | #define ATA_ID_CFA_KEY_MGMT 162
|
---|
| 109 | #define ATA_ID_CFA_MODES 163
|
---|
| 110 | #define ATA_ID_DATA_SET_MGMT 169
|
---|
| 111 | #define ATA_ID_ROT_SPEED 217
|
---|
| 112 | #define ATA_ID_PIO4 (1U << 1)
|
---|
| 113 |
|
---|
| 114 | #define ATA_ID_SERNO_LEN 20
|
---|
| 115 | #define ATA_ID_FW_REV_LEN 8
|
---|
| 116 | #define ATA_ID_PROD_LEN 40
|
---|
| 117 |
|
---|
| 118 | #define ATA_PCI_CTL_OFS 2
|
---|
| 119 |
|
---|
| 120 | #define ATA_PIO0 (1U << 0)
|
---|
| 121 | #define ATA_PIO1 ATA_PIO0 | (1U << 1)
|
---|
| 122 | #define ATA_PIO2 ATA_PIO1 | (1U << 2)
|
---|
| 123 | #define ATA_PIO3 ATA_PIO2 | (1U << 3)
|
---|
| 124 | #define ATA_PIO4 ATA_PIO3 | (1U << 4)
|
---|
| 125 | #define ATA_PIO5 ATA_PIO4 | (1U << 5)
|
---|
| 126 | #define ATA_PIO6 ATA_PIO5 | (1U << 6)
|
---|
| 127 |
|
---|
| 128 | #define ATA_PIO4_ONLY (1U << 4)
|
---|
| 129 |
|
---|
| 130 | #define ATA_SWDMA0 (1U << 0)
|
---|
| 131 | #define ATA_SWDMA1 ATA_SWDMA0 | (1U << 1)
|
---|
| 132 | #define ATA_SWDMA2 ATA_SWDMA1 | (1U << 2)
|
---|
| 133 |
|
---|
| 134 | #define ATA_SWDMA2_ONLY (1U << 2)
|
---|
| 135 |
|
---|
| 136 | #define ATA_MWDMA0 (1U << 0)
|
---|
| 137 | #define ATA_MWDMA1 ATA_MWDMA0 | (1U << 1)
|
---|
| 138 | #define ATA_MWDMA2 ATA_MWDMA1 | (1U << 2)
|
---|
| 139 | #define ATA_MWDMA3 ATA_MWDMA2 | (1U << 3)
|
---|
| 140 | #define ATA_MWDMA4 ATA_MWDMA3 | (1U << 4)
|
---|
| 141 |
|
---|
| 142 | #define ATA_MWDMA12_ONLY (1U << 1) | (1U << 2)
|
---|
| 143 | #define ATA_MWDMA2_ONLY (1U << 2)
|
---|
| 144 |
|
---|
| 145 | #define ATA_UDMA0 (1U << 0)
|
---|
| 146 | #define ATA_UDMA1 ATA_UDMA0 | (1U << 1)
|
---|
| 147 | #define ATA_UDMA2 ATA_UDMA1 | (1U << 2)
|
---|
| 148 | #define ATA_UDMA3 ATA_UDMA2 | (1U << 3)
|
---|
| 149 | #define ATA_UDMA4 ATA_UDMA3 | (1U << 4)
|
---|
| 150 | #define ATA_UDMA5 ATA_UDMA4 | (1U << 5)
|
---|
| 151 | #define ATA_UDMA6 ATA_UDMA5 | (1U << 6)
|
---|
| 152 |
|
---|
| 153 | /******************************************************************************
|
---|
| 154 | * Miscellanous constants copied from the Linux LIBATA code. Again, the enums
|
---|
| 155 | * have been converted to preprocessor definitions to avoid problems with
|
---|
| 156 | * signed 16-bit integers.
|
---|
| 157 | *
|
---|
| 158 | * Please note that Linux supports all kinds of IDE/EIDE/ATA/SATA/... devices
|
---|
| 159 | * in LIBATA while we only need the ATA-8 bits, and those only as far as they
|
---|
| 160 | * are relevant to AHCI.
|
---|
| 161 | */
|
---|
| 162 |
|
---|
| 163 | /* bits in ATA command block registers */
|
---|
| 164 | #define ATA_HOB (1U << 7) /* LBA48 selector */
|
---|
| 165 | #define ATA_NIEN (1U << 1) /* disable-irq flag */
|
---|
| 166 | #define ATA_LBA (1U << 6) /* LBA28 selector */
|
---|
| 167 | #define ATA_DEV1 (1U << 4) /* Select Device 1 (slave) */
|
---|
| 168 | #define ATA_DEVICE_OBS (1U << 7) | (1U << 5) /* obs bits in dev reg */
|
---|
| 169 | #define ATA_DEVCTL_OBS (1U << 3) /* obsolete bit in devctl reg */
|
---|
| 170 | #define ATA_BUSY (1U << 7) /* BSY status bit */
|
---|
| 171 | #define ATA_DRDY (1U << 6) /* device ready */
|
---|
| 172 | #define ATA_DF (1U << 5) /* device fault */
|
---|
| 173 | #define ATA_DSC (1U << 4) /* drive seek complete */
|
---|
| 174 | #define ATA_DRQ (1U << 3) /* data request i/o */
|
---|
| 175 | #define ATA_CORR (1U << 2) /* corrected data error */
|
---|
| 176 | #define ATA_IDX (1U << 1) /* index */
|
---|
| 177 | #define ATA_ERR (1U << 0) /* have an error */
|
---|
| 178 | #define ATA_SRST (1U << 2) /* software reset */
|
---|
| 179 | #define ATA_ICRC (1U << 7) /* interface CRC error */
|
---|
| 180 | #define ATA_BBK ATA_ICRC /* pre-EIDE: block marked bad */
|
---|
| 181 | #define ATA_UNC (1U << 6) /* uncorrectable media error */
|
---|
| 182 | #define ATA_MC (1U << 5) /* media changed */
|
---|
| 183 | #define ATA_IDNF (1U << 4) /* ID not found */
|
---|
| 184 | #define ATA_MCR (1U << 3) /* media change requested */
|
---|
| 185 | #define ATA_ABORTED (1U << 2) /* command aborted */
|
---|
| 186 | #define ATA_TRK0NF (1U << 1) /* track 0 not found */
|
---|
| 187 | #define ATA_AMNF (1U << 0) /* address mark not found */
|
---|
| 188 | #define ATAPI_LFS 0xF0U /* last failed sense */
|
---|
| 189 | #define ATAPI_EOM ATA_TRK0NF /* end of media */
|
---|
| 190 | #define ATAPI_ILI ATA_AMNF /* illegal length indication */
|
---|
| 191 | #define ATAPI_IO (1U << 1)
|
---|
| 192 | #define ATAPI_COD (1U << 0)
|
---|
| 193 |
|
---|
| 194 | /* ATA device commands */
|
---|
| 195 | #define ATA_CMD_DEV_RESET 0x08 /* ATAPI device reset */
|
---|
| 196 | #define ATA_CMD_CHK_POWER 0xE5 /* check power mode */
|
---|
| 197 | #define ATA_CMD_STANDBY 0xE2 /* place in standby power mode */
|
---|
| 198 | #define ATA_CMD_IDLE 0xE3 /* place in idle power mode */
|
---|
| 199 | #define ATA_CMD_EDD 0x90 /* execute device diagnostic */
|
---|
[87] | 200 | #define ATA_CMD_DOWNLOAD_MICRO 0x92
|
---|
| 201 | #define ATA_CMD_NOP 0x00
|
---|
| 202 | #define ATA_CMD_FLUSH 0xE7
|
---|
| 203 | #define ATA_CMD_FLUSH_EXT 0xEA
|
---|
| 204 | #define ATA_CMD_ID_ATA 0xEC
|
---|
| 205 | #define ATA_CMD_ID_ATAPI 0xA1
|
---|
| 206 | #define ATA_CMD_SERVICE 0xA2
|
---|
| 207 | #define ATA_CMD_READ 0xC8
|
---|
| 208 | #define ATA_CMD_READ_EXT 0x25
|
---|
| 209 | #define ATA_CMD_READ_QUEUED 0x26
|
---|
| 210 | #define ATA_CMD_READ_STREAM_EXT 0x2B
|
---|
| 211 | #define ATA_CMD_READ_STREAM_DMA_EXT 0x2A
|
---|
| 212 | #define ATA_CMD_WRITE 0xCA
|
---|
| 213 | #define ATA_CMD_WRITE_EXT 0x35
|
---|
| 214 | #define ATA_CMD_WRITE_QUEUED 0x36
|
---|
| 215 | #define ATA_CMD_WRITE_STREAM_EXT 0x3B
|
---|
| 216 | #define ATA_CMD_WRITE_STREAM_DMA_EXT 0x3A
|
---|
| 217 | #define ATA_CMD_WRITE_FUA_EXT 0x3D
|
---|
| 218 | #define ATA_CMD_WRITE_QUEUED_FUA_EXT 0x3E
|
---|
| 219 | #define ATA_CMD_FPDMA_READ 0x60
|
---|
| 220 | #define ATA_CMD_FPDMA_WRITE 0x61
|
---|
| 221 | #define ATA_CMD_PIO_READ 0x20
|
---|
| 222 | #define ATA_CMD_PIO_READ_EXT 0x24
|
---|
| 223 | #define ATA_CMD_PIO_WRITE 0x30
|
---|
| 224 | #define ATA_CMD_PIO_WRITE_EXT 0x34
|
---|
| 225 | #define ATA_CMD_READ_MULTI 0xC4
|
---|
| 226 | #define ATA_CMD_READ_MULTI_EXT 0x29
|
---|
| 227 | #define ATA_CMD_WRITE_MULTI 0xC5
|
---|
| 228 | #define ATA_CMD_WRITE_MULTI_EXT 0x39
|
---|
| 229 | #define ATA_CMD_WRITE_MULTI_FUA_EXT 0xCE
|
---|
| 230 | #define ATA_CMD_SET_FEATURES 0xEF
|
---|
| 231 | #define ATA_CMD_SET_MULTI 0xC6
|
---|
| 232 | #define ATA_CMD_PACKET 0xA0
|
---|
| 233 | #define ATA_CMD_VERIFY 0x40
|
---|
| 234 | #define ATA_CMD_VERIFY_EXT 0x42
|
---|
| 235 | #define ATA_CMD_WRITE_UNCORR_EXT 0x45
|
---|
| 236 | #define ATA_CMD_STANDBYNOW1 0xE0
|
---|
| 237 | #define ATA_CMD_IDLEIMMEDIATE 0xE1
|
---|
| 238 | #define ATA_CMD_SLEEP 0xE6
|
---|
| 239 | #define ATA_CMD_INIT_DEV_PARAMS 0x91
|
---|
| 240 | #define ATA_CMD_READ_NATIVE_MAX 0xF8
|
---|
| 241 | #define ATA_CMD_READ_NATIVE_MAX_EXT 0x27
|
---|
| 242 | #define ATA_CMD_SET_MAX 0xF9
|
---|
| 243 | #define ATA_CMD_SET_MAX_EXT 0x37
|
---|
| 244 | #define ATA_CMD_READ_LOG_EXT 0x2F
|
---|
| 245 | #define ATA_CMD_WRITE_LOG_EXT 0x3F
|
---|
| 246 | #define ATA_CMD_READ_LOG_DMA_EXT 0x47
|
---|
| 247 | #define ATA_CMD_WRITE_LOG_DMA_EXT 0x57
|
---|
| 248 | #define ATA_CMD_TRUSTED_RCV 0x5C
|
---|
| 249 | #define ATA_CMD_TRUSTED_RCV_DMA 0x5D
|
---|
| 250 | #define ATA_CMD_TRUSTED_SND 0x5E
|
---|
| 251 | #define ATA_CMD_TRUSTED_SND_DMA 0x5F
|
---|
| 252 | #define ATA_CMD_PMP_READ 0xE4
|
---|
| 253 | #define ATA_CMD_PMP_WRITE 0xE8
|
---|
| 254 | #define ATA_CMD_CONF_OVERLAY 0xB1
|
---|
| 255 | #define ATA_CMD_SEC_SET_PASS 0xF1
|
---|
| 256 | #define ATA_CMD_SEC_UNLOCK 0xF2
|
---|
| 257 | #define ATA_CMD_SEC_ERASE_PREP 0xF3
|
---|
| 258 | #define ATA_CMD_SEC_ERASE_UNIT 0xF4
|
---|
| 259 | #define ATA_CMD_SEC_FREEZE_LOCK 0xF5
|
---|
| 260 | #define ATA_CMD_SEC_DISABLE_PASS 0xF6
|
---|
| 261 | #define ATA_CMD_CONFIG_STREAM 0x51
|
---|
| 262 | #define ATA_CMD_SMART 0xB0
|
---|
| 263 | #define ATA_CMD_MEDIA_LOCK 0xDE
|
---|
| 264 | #define ATA_CMD_MEDIA_UNLOCK 0xDF
|
---|
| 265 | #define ATA_CMD_DSM 0x06
|
---|
| 266 | #define ATA_CMD_CHK_MED_CRD_TYP 0xD1
|
---|
| 267 | #define ATA_CMD_CFA_REQ_EXT_ERR 0x03
|
---|
| 268 | #define ATA_CMD_CFA_WRITE_NE 0x38
|
---|
| 269 | #define ATA_CMD_CFA_TRANS_SECT 0x87
|
---|
| 270 | #define ATA_CMD_CFA_ERASE 0xC0
|
---|
| 271 | #define ATA_CMD_CFA_WRITE_MULT_NE 0xCD
|
---|
[57] | 272 | /* marked obsolete in the ATA/ATAPI-7 spec */
|
---|
[87] | 273 | #define ATA_CMD_RESTORE 0x10
|
---|
[57] | 274 |
|
---|
| 275 | /* READ_LOG_EXT pages */
|
---|
[87] | 276 | #define ATA_LOG_SATA_NCQ 0x10
|
---|
[57] | 277 |
|
---|
| 278 | /* READ/WRITE LONG (obsolete) */
|
---|
[87] | 279 | #define ATA_CMD_READ_LONG 0x22
|
---|
| 280 | #define ATA_CMD_READ_LONG_ONCE 0x23
|
---|
| 281 | #define ATA_CMD_WRITE_LONG 0x32
|
---|
| 282 | #define ATA_CMD_WRITE_LONG_ONCE 0x33
|
---|
[57] | 283 |
|
---|
| 284 | /* SETFEATURES stuff */
|
---|
[87] | 285 | #define SETFEATURES_XFER 0x03
|
---|
| 286 | #define XFER_UDMA_7 0x47
|
---|
| 287 | #define XFER_UDMA_6 0x46
|
---|
| 288 | #define XFER_UDMA_5 0x45
|
---|
| 289 | #define XFER_UDMA_4 0x44
|
---|
| 290 | #define XFER_UDMA_3 0x43
|
---|
| 291 | #define XFER_UDMA_2 0x42
|
---|
| 292 | #define XFER_UDMA_1 0x41
|
---|
| 293 | #define XFER_UDMA_0 0x40
|
---|
[57] | 294 | #define XFER_MW_DMA_4 0x24 /* CFA only */
|
---|
| 295 | #define XFER_MW_DMA_3 0x23 /* CFA only */
|
---|
[87] | 296 | #define XFER_MW_DMA_2 0x22
|
---|
| 297 | #define XFER_MW_DMA_1 0x21
|
---|
| 298 | #define XFER_MW_DMA_0 0x20
|
---|
| 299 | #define XFER_SW_DMA_2 0x12
|
---|
| 300 | #define XFER_SW_DMA_1 0x11
|
---|
| 301 | #define XFER_SW_DMA_0 0x10
|
---|
[57] | 302 | #define XFER_PIO_6 0x0E /* CFA only */
|
---|
| 303 | #define XFER_PIO_5 0x0D /* CFA only */
|
---|
[87] | 304 | #define XFER_PIO_4 0x0C
|
---|
| 305 | #define XFER_PIO_3 0x0B
|
---|
| 306 | #define XFER_PIO_2 0x0A
|
---|
| 307 | #define XFER_PIO_1 0x09
|
---|
| 308 | #define XFER_PIO_0 0x08
|
---|
| 309 | #define XFER_PIO_SLOW 0x00
|
---|
[57] | 310 |
|
---|
| 311 | #define SETFEATURES_WC_ON 0x02 /* Enable write cache */
|
---|
| 312 | #define SETFEATURES_WC_OFF 0x82 /* Disable write cache */
|
---|
| 313 |
|
---|
| 314 | /* Enable/Disable Automatic Acoustic Management */
|
---|
[87] | 315 | #define SETFEATURES_AAM_ON 0x42
|
---|
| 316 | #define SETFEATURES_AAM_OFF 0xC2
|
---|
[57] | 317 |
|
---|
| 318 | #define SETFEATURES_SPINUP 0x07 /* Spin-up drive */
|
---|
| 319 |
|
---|
| 320 | #define SETFEATURES_SATA_ENABLE 0x10 /* Enable use of SATA feature */
|
---|
| 321 | #define SETFEATURES_SATA_DISABLE 0x90 /* Disable use of SATA feature */
|
---|
| 322 |
|
---|
| 323 | /* SETFEATURE Sector counts for SATA features */
|
---|
| 324 | #define SATA_FPDMA_OFFSET 0x01 /* FPDMA non-zero buffer offsets */
|
---|
| 325 | #define SATA_FPDMA_AA 0x02 /* FPDMA Setup FIS Auto-Activate */
|
---|
| 326 | #define SATA_DIPM 0x03 /* Device Initiated Power Management */
|
---|
| 327 | #define SATA_FPDMA_IN_ORDER 0x04 /* FPDMA in-order data delivery */
|
---|
| 328 | #define SATA_AN 0x05 /* Asynchronous Notification */
|
---|
| 329 | #define SATA_SSP 0x06 /* Software Settings Preservation */
|
---|
| 330 |
|
---|
| 331 | /* feature values for SET_MAX */
|
---|
[87] | 332 | #define ATA_SET_MAX_ADDR 0x00
|
---|
| 333 | #define ATA_SET_MAX_PASSWD 0x01
|
---|
| 334 | #define ATA_SET_MAX_LOCK 0x02
|
---|
| 335 | #define ATA_SET_MAX_UNLOCK 0x03
|
---|
| 336 | #define ATA_SET_MAX_FREEZE_LOCK 0x04
|
---|
[57] | 337 |
|
---|
| 338 | /* feature values for DEVICE CONFIGURATION OVERLAY */
|
---|
[87] | 339 | #define ATA_DCO_RESTORE 0xC0
|
---|
| 340 | #define ATA_DCO_FREEZE_LOCK 0xC1
|
---|
| 341 | #define ATA_DCO_IDENTIFY 0xC2
|
---|
| 342 | #define ATA_DCO_SET 0xC3
|
---|
[57] | 343 |
|
---|
| 344 | /* feature values for SMART */
|
---|
[125] | 345 | #define ATA_SMART_READ_VALUES 0xD0
|
---|
| 346 | #define ATA_SMART_READ_THRESHOLDS 0xD1
|
---|
| 347 | #define ATA_SMART_AUTOSAVE 0xD2
|
---|
| 348 | #define ATA_SMART_SAVE 0xD3
|
---|
| 349 | #define ATA_SMART_IMMEDIATE_OFFLINE 0xD4
|
---|
| 350 | #define ATA_SMART_READ_LOG 0xD5
|
---|
| 351 | #define ATA_SMART_WRITE_LOG 0xD6
|
---|
| 352 | #define ATA_SMART_ENABLE 0xD8
|
---|
| 353 | #define ATA_SMART_DISABLE 0xD9
|
---|
| 354 | #define ATA_SMART_STATUS 0xDA
|
---|
| 355 | #define ATA_SMART_AUTO_OFFLINE 0xDB
|
---|
[57] | 356 |
|
---|
| 357 | /* feature values for Data Set Management */
|
---|
[87] | 358 | #define ATA_DSM_TRIM 0x01
|
---|
[57] | 359 |
|
---|
| 360 | /* password used in LBA Mid / LBA High for executing SMART commands */
|
---|
[87] | 361 | #define ATA_SMART_LBAM_PASS 0x4F
|
---|
| 362 | #define ATA_SMART_LBAH_PASS 0xC2
|
---|
[57] | 363 |
|
---|
| 364 | /* ATAPI stuff */
|
---|
[87] | 365 | #define ATAPI_PKT_DMA (1U << 0)
|
---|
[57] | 366 | #define ATAPI_DMADIR (1U << 2) /* ATAPI data dir:
|
---|
| 367 | 0=to device, 1=to host */
|
---|
| 368 | #define ATAPI_CDB_LEN 16
|
---|
| 369 |
|
---|
| 370 | /* PMP stuff */
|
---|
| 371 | #define SATA_PMP_MAX_PORTS 15
|
---|
| 372 | #define SATA_PMP_CTRL_PORT 15
|
---|
| 373 |
|
---|
| 374 | #define SATA_PMP_GSCR_DWORDS 128
|
---|
| 375 | #define SATA_PMP_GSCR_PROD_ID 0
|
---|
| 376 | #define SATA_PMP_GSCR_REV 1
|
---|
| 377 | #define SATA_PMP_GSCR_PORT_INFO 2
|
---|
| 378 | #define SATA_PMP_GSCR_ERROR 32
|
---|
| 379 | #define SATA_PMP_GSCR_ERROR_EN 33
|
---|
| 380 | #define SATA_PMP_GSCR_FEAT 64
|
---|
| 381 | #define SATA_PMP_GSCR_FEAT_EN 96
|
---|
| 382 |
|
---|
| 383 | #define SATA_PMP_PSCR_STATUS 0
|
---|
| 384 | #define SATA_PMP_PSCR_ERROR 1
|
---|
| 385 | #define SATA_PMP_PSCR_CONTROL 2
|
---|
| 386 |
|
---|
| 387 | #define SATA_PMP_FEAT_BIST (1U << 0)
|
---|
| 388 | #define SATA_PMP_FEAT_PMREQ (1U << 1)
|
---|
| 389 | #define SATA_PMP_FEAT_DYNSSC (1U << 2)
|
---|
| 390 | #define SATA_PMP_FEAT_NOTIFY (1U << 3)
|
---|
| 391 |
|
---|
| 392 | /* SATA Status and Control Registers */
|
---|
| 393 | #define SCR_STATUS 0
|
---|
| 394 | #define SCR_ERROR 1
|
---|
| 395 | #define SCR_CONTROL 2
|
---|
| 396 | #define SCR_ACTIVE 3
|
---|
| 397 | #define SCR_NOTIFICATION 4
|
---|
| 398 |
|
---|
| 399 | /* SError bits */
|
---|
| 400 | #define SERR_DATA_RECOVERED (1UL << 0) /* recovered data error */
|
---|
| 401 | #define SERR_COMM_RECOVERED (1UL << 1) /* recovered comm failure */
|
---|
| 402 | #define SERR_DATA (1UL << 8) /* unrecovered data error */
|
---|
| 403 | #define SERR_PERSISTENT (1UL << 9) /* persistent data/comm error */
|
---|
| 404 | #define SERR_PROTOCOL (1UL << 10) /* protocol violation */
|
---|
| 405 | #define SERR_INTERNAL (1UL << 11) /* host internal error */
|
---|
| 406 | #define SERR_PHYRDY_CHG (1UL << 16) /* PHY RDY changed */
|
---|
| 407 | #define SERR_PHY_INT_ERR (1UL << 17) /* PHY internal error */
|
---|
| 408 | #define SERR_COMM_WAKE (1UL << 18) /* Comm wake */
|
---|
| 409 | #define SERR_10B_8B_ERR (1UL << 19) /* 10b to 8b decode error */
|
---|
| 410 | #define SERR_DISPARITY (1UL << 20) /* Disparity */
|
---|
| 411 | #define SERR_CRC (1UL << 21) /* CRC error */
|
---|
| 412 | #define SERR_HANDSHAKE (1UL << 22) /* Handshake error */
|
---|
| 413 | #define SERR_LINK_SEQ_ERR (1UL << 23) /* Link sequence error */
|
---|
| 414 | #define SERR_TRANS_ST_ERROR (1UL << 24) /* Transport state trans. error */
|
---|
| 415 | #define SERR_UNRECOG_FIS (1UL << 25) /* Unrecognized FIS */
|
---|
| 416 | #define SERR_DEV_XCHG (1UL << 26) /* device exchanged */
|
---|
| 417 |
|
---|
| 418 | /******************************************************************************
|
---|
| 419 | * Parameters for ATA commands. Those parameters are passed in a variable
|
---|
| 420 | * argument list in the format:
|
---|
| 421 | *
|
---|
| 422 | * AP_xxx, [val, ...], AP_xxx, [val, ...]
|
---|
| 423 | *
|
---|
| 424 | * The values expected by each parameter are indicated within square brackets.
|
---|
| 425 | */
|
---|
| 426 | typedef enum {
|
---|
| 427 | AP_FEATURES, /* [u16] ATA command features (read: flags) */
|
---|
| 428 | AP_COUNT, /* [u16] number of sectors (0 = 65536) */
|
---|
| 429 | AP_SECTOR_28, /* [u32] 28-bit sector address */
|
---|
| 430 | AP_SECTOR_48, /* [u32, u16] 48-bit sector address */
|
---|
[82] | 431 | AP_DEVICE, /* [u16] ATA cmd "device" field */
|
---|
[178] | 432 | AP_SGLIST, /* [void *, u16] buffer S/G (SCATGATENTRY/count) */
|
---|
| 433 | AP_VADDR, /* [void *, u16] buffer virtual address (buf/len) */
|
---|
[57] | 434 | AP_WRITE, /* [u16] if != 0, data is written to device */
|
---|
| 435 | AP_AHCI_FLAGS, /* [u16] AHCI command header flags */
|
---|
[178] | 436 | AP_ATAPI_CMD, /* [void *, u16] ATAPI command (CDB) and length */
|
---|
| 437 | AP_ATA_CMD, /* [void *] ATA command (fixed len) */
|
---|
[57] | 438 | AP_END /* [] end of variable argument list */
|
---|
| 439 | } ATA_PARM;
|
---|
| 440 |
|
---|
[110] | 441 | /******************************************************************************
|
---|
| 442 | * Return codes for ata_cmd(); please note that positive return codes indicate
|
---|
| 443 | * that not all S/G elements could be mapped, 0 means success and negative
|
---|
| 444 | * values indicate error conditions.
|
---|
| 445 | */
|
---|
| 446 | #define ATA_CMD_SUCCESS 0
|
---|
| 447 | #define ATA_CMD_INVALID_PARM -1
|
---|
| 448 | #define ATA_CMD_UNALIGNED_ADDR -2
|
---|
| 449 |
|
---|
[57] | 450 | /* ------------------------ typedefs and structures ------------------------ */
|
---|
| 451 |
|
---|
| 452 | /******************************************************************************
|
---|
[76] | 453 | * Generic ATA-8 command structure. This is loosely based on ATA-8, i.e. we
|
---|
| 454 | * don't have to deal with shadow registers and map them to the low bytes of
|
---|
| 455 | * adjecent words, etc. but there are still some oddities which need to be
|
---|
| 456 | * taken into consideration. For example, ATA-8 says LBA-28 sector addresses
|
---|
| 457 | * are simply the lower 28 bits in the LBA field. However, the underlying
|
---|
| 458 | * transport (SATA in our case) only looks at the three lower bytes of the
|
---|
| 459 | * LBA field, much like an IDE device would do. This means that only 3 bytes
|
---|
| 460 | * of the LBA field are processed and this yields only 24 bits. The remaining
|
---|
| 461 | * 4 bits need to be stored in the "device" register....
|
---|
| 462 | *
|
---|
| 463 | * Everything else seems to behave normally, as far as this term can be
|
---|
| 464 | * applied to IDE/ATA. Further details can be found in section 7.1.5.1 of the
|
---|
| 465 | * ATA-8 spec (Inputs for 28-bit Read/Write Commands).
|
---|
[57] | 466 | */
|
---|
| 467 | typedef struct {
|
---|
| 468 | u16 features; /* feature bits */
|
---|
| 469 | u16 count; /* count register (e.g. number of sectors) */
|
---|
| 470 | u32 lba_l; /* low 24 bits of LBA-28 (32 bits for 48-bit devices) */
|
---|
| 471 | u16 lba_h; /* high 16 bits of LBA for 48-bit devices */
|
---|
| 472 | u8 cmd; /* ATA command field */
|
---|
| 473 | u8 device; /* ATA device field and upper 4 bits of LBA-28 */
|
---|
| 474 | } ATA_CMD;
|
---|
| 475 |
|
---|
| 476 | /* generic ATA-8 response structure */
|
---|
| 477 | typedef struct {
|
---|
| 478 | u16 error; /* error code, if any */
|
---|
| 479 | u16 count; /* count register (e.g. number of sectors) */
|
---|
| 480 | u32 lba_l; /* low 28 bits of LBA (32 bits for 48-bit devices) */
|
---|
| 481 | u16 lba_h; /* high 16 bits of LBA for 48-bit devices */
|
---|
| 482 | u16 status; /* response status bits */
|
---|
| 483 | } ATA_RSP;
|
---|
| 484 |
|
---|
| 485 | /******************************************************************************
|
---|
| 486 | * Command-specific ATA-8 structures.
|
---|
| 487 | */
|
---|
| 488 |
|
---|
| 489 | /* -------------------------- function prototypes -------------------------- */
|
---|
| 490 |
|
---|
[185] | 491 | extern int ata_cmd(AD_INFO *ai, int port, int device, int slot, int cmd, ...);
|
---|
| 492 | extern int v_ata_cmd(AD_INFO *ai, int port, int device, int slot, int cmd, va_list va);
|
---|
| 493 | extern void ata_cmd_to_fis(u8 *fis, ATA_CMD *cmd, int device);
|
---|
| 494 | extern void ata_max_sg_cnt(IORB_EXECUTEIO *io, USHORT sg_indx, USHORT sg_max, USHORT *sg_cnt, USHORT *sector_cnt);
|
---|
[178] | 495 | extern int ata_get_geometry(IORBH FAR16DATA *iorb, IORBH *pIorb, int slot);
|
---|
| 496 | extern void ata_get_geometry_pp(IORBH FAR16DATA *vIorb, IORBH *pIorb);
|
---|
| 497 | extern int ata_unit_ready(IORBH FAR16DATA *vIorb, IORBH *pIorb, int slot);
|
---|
| 498 | extern int ata_read(IORBH FAR16DATA *vIorb, IORBH *pIorb, int slot);
|
---|
| 499 | extern int ata_read_unaligned(IORBH *pIorb, int slot);
|
---|
| 500 | extern void ata_read_pp(IORBH FAR16DATA *vIorb, IORBH *pIorb);
|
---|
| 501 | extern int ata_verify(IORBH FAR16DATA *vIorb, IORBH *pIorb, int slot);
|
---|
| 502 | extern int ata_write(IORBH FAR16DATA *vIorb, IORBH *pIorb, int slot);
|
---|
| 503 | extern int ata_write_unaligned(IORBH *pIorb, int slot);
|
---|
| 504 | extern void ata_write_pp(IORBH FAR16DATA *vIorb, IORBH *pIorb);
|
---|
| 505 | extern int ata_execute_ata(IORBH FAR16DATA *vIorb, IORBH *pIorb, int slot);
|
---|
| 506 | extern void ata_execute_ata_pp(IORBH FAR16DATA *vIorb, IORBH *pIorb);
|
---|
| 507 | extern int ata_req_sense(IORBH FAR16DATA *vIorb, IORBH *pIorb, int slot);
|
---|
[185] | 508 | extern char *ata_dev_name(u16 *id_buf);
|
---|
[57] | 509 |
|
---|