ata.h 20.6 KB
Newer Older
L
Linus Torvalds 已提交
1 2

/*
3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26
 *  Copyright 2003-2004 Red Hat, Inc.  All rights reserved.
 *  Copyright 2003-2004 Jeff Garzik
 *
 *
 *  This program is free software; you can redistribute it and/or modify
 *  it under the terms of the GNU General Public License as published by
 *  the Free Software Foundation; either version 2, or (at your option)
 *  any later version.
 *
 *  This program is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 *  GNU General Public License for more details.
 *
 *  You should have received a copy of the GNU General Public License
 *  along with this program; see the file COPYING.  If not, write to
 *  the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
 *
 *
 *  libata documentation is available via 'make {ps|pdf}docs',
 *  as Documentation/DocBook/libata.*
 *
 *  Hardware documentation available from http://www.t13.org/
 *
L
Linus Torvalds 已提交
27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42
 */

#ifndef __LINUX_ATA_H__
#define __LINUX_ATA_H__

#include <linux/types.h>

/* defines only for the constants which don't work well as enums */
#define ATA_DMA_BOUNDARY	0xffffUL
#define ATA_DMA_MASK		0xffffffffULL

enum {
	/* various global constants */
	ATA_MAX_DEVICES		= 2,	/* per bus/port */
	ATA_MAX_PRD		= 256,	/* we could make these 256/256 */
	ATA_SECT_SIZE		= 512,
43
	ATA_MAX_SECTORS_128	= 128,
44 45
	ATA_MAX_SECTORS		= 256,
	ATA_MAX_SECTORS_LBA48	= 65535,/* TODO: 65536? */
46
	ATA_MAX_SECTORS_TAPE	= 65535,
L
Linus Torvalds 已提交
47 48

	ATA_ID_WORDS		= 256,
49 50 51 52
	ATA_ID_CONFIG		= 0,
	ATA_ID_CYLS		= 1,
	ATA_ID_HEADS		= 3,
	ATA_ID_SECTORS		= 6,
53
	ATA_ID_SERNO		= 10,
54
	ATA_ID_BUF_SIZE		= 21,
55 56
	ATA_ID_FW_REV		= 23,
	ATA_ID_PROD		= 27,
57 58 59
	ATA_ID_MAX_MULTSECT	= 47,
	ATA_ID_DWORD_IO		= 48,
	ATA_ID_CAPABILITY	= 49,
60
	ATA_ID_OLD_PIO_MODES	= 51,
61
	ATA_ID_OLD_DMA_MODES	= 52,
62
	ATA_ID_FIELD_VALID	= 53,
63 64 65 66 67 68
	ATA_ID_CUR_CYLS		= 54,
	ATA_ID_CUR_HEADS	= 55,
	ATA_ID_CUR_SECTORS	= 56,
	ATA_ID_MULTSECT		= 59,
	ATA_ID_LBA_CAPACITY	= 60,
	ATA_ID_SWDMA_MODES	= 62,
L
Linus Torvalds 已提交
69
	ATA_ID_MWDMA_MODES	= 63,
70 71
	ATA_ID_PIO_MODES	= 64,
	ATA_ID_EIDE_DMA_MIN	= 65,
72
	ATA_ID_EIDE_DMA_TIME	= 66,
73 74
	ATA_ID_EIDE_PIO		= 67,
	ATA_ID_EIDE_PIO_IORDY	= 68,
75
	ATA_ID_QUEUE_DEPTH	= 75,
76
	ATA_ID_MAJOR_VER	= 80,
77 78 79 80 81 82 83 84 85 86 87 88 89 90
	ATA_ID_COMMAND_SET_1	= 82,
	ATA_ID_COMMAND_SET_2	= 83,
	ATA_ID_CFSSE		= 84,
	ATA_ID_CFS_ENABLE_1	= 85,
	ATA_ID_CFS_ENABLE_2	= 86,
	ATA_ID_CSF_DEFAULT	= 87,
	ATA_ID_UDMA_MODES	= 88,
	ATA_ID_HW_CONFIG	= 93,
	ATA_ID_SPG		= 98,
	ATA_ID_LBA_CAPACITY_2	= 100,
	ATA_ID_LAST_LUN		= 126,
	ATA_ID_DLF		= 128,
	ATA_ID_CSFO		= 129,
	ATA_ID_CFA_POWER	= 160,
L
Linus Torvalds 已提交
91 92
	ATA_ID_PIO4		= (1 << 1),

93 94 95 96
	ATA_ID_SERNO_LEN	= 20,
	ATA_ID_FW_REV_LEN	= 8,
	ATA_ID_PROD_LEN		= 40,

L
Linus Torvalds 已提交
97
	ATA_PCI_CTL_OFS		= 2,
B
Bartlomiej Zolnierkiewicz 已提交
98 99 100 101 102 103 104 105 106

	ATA_PIO0		= (1 << 0),
	ATA_PIO1		= ATA_PIO0 | (1 << 1),
	ATA_PIO2		= ATA_PIO1 | (1 << 2),
	ATA_PIO3		= ATA_PIO2 | (1 << 3),
	ATA_PIO4		= ATA_PIO3 | (1 << 4),
	ATA_PIO5		= ATA_PIO4 | (1 << 5),
	ATA_PIO6		= ATA_PIO5 | (1 << 6),

107 108 109 110 111 112 113 114 115 116 117 118 119
	ATA_SWDMA0		= (1 << 0),
	ATA_SWDMA1		= ATA_SWDMA0 | (1 << 1),
	ATA_SWDMA2		= ATA_SWDMA1 | (1 << 2),

	ATA_SWDMA2_ONLY		= (1 << 2),

	ATA_MWDMA0		= (1 << 0),
	ATA_MWDMA1		= ATA_MWDMA0 | (1 << 1),
	ATA_MWDMA2		= ATA_MWDMA1 | (1 << 2),

	ATA_MWDMA12_ONLY	= (1 << 1) | (1 << 2),
	ATA_MWDMA2_ONLY		= (1 << 2),

L
Linus Torvalds 已提交
120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155
	ATA_UDMA0		= (1 << 0),
	ATA_UDMA1		= ATA_UDMA0 | (1 << 1),
	ATA_UDMA2		= ATA_UDMA1 | (1 << 2),
	ATA_UDMA3		= ATA_UDMA2 | (1 << 3),
	ATA_UDMA4		= ATA_UDMA3 | (1 << 4),
	ATA_UDMA5		= ATA_UDMA4 | (1 << 5),
	ATA_UDMA6		= ATA_UDMA5 | (1 << 6),
	ATA_UDMA7		= ATA_UDMA6 | (1 << 7),
	/* ATA_UDMA7 is just for completeness... doesn't exist (yet?).  */

	ATA_UDMA_MASK_40C	= ATA_UDMA2,	/* udma0-2 */

	/* DMA-related */
	ATA_PRD_SZ		= 8,
	ATA_PRD_TBL_SZ		= (ATA_MAX_PRD * ATA_PRD_SZ),
	ATA_PRD_EOT		= (1 << 31),	/* end-of-table flag */

	ATA_DMA_TABLE_OFS	= 4,
	ATA_DMA_STATUS		= 2,
	ATA_DMA_CMD		= 0,
	ATA_DMA_WR		= (1 << 3),
	ATA_DMA_START		= (1 << 0),
	ATA_DMA_INTR		= (1 << 2),
	ATA_DMA_ERR		= (1 << 1),
	ATA_DMA_ACTIVE		= (1 << 0),

	/* bits in ATA command block registers */
	ATA_HOB			= (1 << 7),	/* LBA48 selector */
	ATA_NIEN		= (1 << 1),	/* disable-irq flag */
	ATA_LBA			= (1 << 6),	/* LBA28 selector */
	ATA_DEV1		= (1 << 4),	/* Select Device 1 (slave) */
	ATA_DEVICE_OBS		= (1 << 7) | (1 << 5), /* obs bits in dev reg */
	ATA_DEVCTL_OBS		= (1 << 3),	/* obsolete bit in devctl reg */
	ATA_BUSY		= (1 << 7),	/* BSY status bit */
	ATA_DRDY		= (1 << 6),	/* device ready */
	ATA_DF			= (1 << 5),	/* device fault */
156
	ATA_DSC			= (1 << 4),	/* drive seek complete */
L
Linus Torvalds 已提交
157
	ATA_DRQ			= (1 << 3),	/* data request i/o */
158 159
	ATA_CORR		= (1 << 2),	/* corrected data error */
	ATA_IDX			= (1 << 1),	/* index */
L
Linus Torvalds 已提交
160 161
	ATA_ERR			= (1 << 0),	/* have an error */
	ATA_SRST		= (1 << 2),	/* software reset */
162
	ATA_ICRC		= (1 << 7),	/* interface CRC error */
163
	ATA_BBK			= ATA_ICRC,	/* pre-EIDE: block marked bad */
164
	ATA_UNC			= (1 << 6),	/* uncorrectable media error */
165
	ATA_MC			= (1 << 5),	/* media changed */
166
	ATA_IDNF		= (1 << 4),	/* ID not found */
167
	ATA_MCR			= (1 << 3),	/* media change requested */
L
Linus Torvalds 已提交
168
	ATA_ABORTED		= (1 << 2),	/* command aborted */
169 170 171 172 173 174 175
	ATA_TRK0NF		= (1 << 1),	/* track 0 not found */
	ATA_AMNF		= (1 << 0),	/* address mark not found */
	ATAPI_LFS		= 0xF0,		/* last failed sense */
	ATAPI_EOM		= ATA_TRK0NF,	/* end of media */
	ATAPI_ILI		= ATA_AMNF,	/* illegal length indication */
	ATAPI_IO		= (1 << 1),
	ATAPI_COD		= (1 << 0),
L
Linus Torvalds 已提交
176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194

	/* ATA command block registers */
	ATA_REG_DATA		= 0x00,
	ATA_REG_ERR		= 0x01,
	ATA_REG_NSECT		= 0x02,
	ATA_REG_LBAL		= 0x03,
	ATA_REG_LBAM		= 0x04,
	ATA_REG_LBAH		= 0x05,
	ATA_REG_DEVICE		= 0x06,
	ATA_REG_STATUS		= 0x07,

	ATA_REG_FEATURE		= ATA_REG_ERR, /* and their aliases */
	ATA_REG_CMD		= ATA_REG_STATUS,
	ATA_REG_BYTEL		= ATA_REG_LBAM,
	ATA_REG_BYTEH		= ATA_REG_LBAH,
	ATA_REG_DEVSEL		= ATA_REG_DEVICE,
	ATA_REG_IRQ		= ATA_REG_NSECT,

	/* ATA device commands */
195
	ATA_CMD_DEV_RESET	= 0x08, /* ATAPI device reset */
L
Linus Torvalds 已提交
196
	ATA_CMD_CHK_POWER	= 0xE5, /* check power mode */
197 198
	ATA_CMD_STANDBY		= 0xE2, /* place in standby power mode */
	ATA_CMD_IDLE		= 0xE3, /* place in idle power mode */
L
Linus Torvalds 已提交
199 200 201 202 203 204 205 206 207
	ATA_CMD_EDD		= 0x90,	/* execute device diagnostic */
	ATA_CMD_FLUSH		= 0xE7,
	ATA_CMD_FLUSH_EXT	= 0xEA,
	ATA_CMD_ID_ATA		= 0xEC,
	ATA_CMD_ID_ATAPI	= 0xA1,
	ATA_CMD_READ		= 0xC8,
	ATA_CMD_READ_EXT	= 0x25,
	ATA_CMD_WRITE		= 0xCA,
	ATA_CMD_WRITE_EXT	= 0x35,
T
Tejun Heo 已提交
208
	ATA_CMD_WRITE_FUA_EXT	= 0x3D,
209 210
	ATA_CMD_FPDMA_READ	= 0x60,
	ATA_CMD_FPDMA_WRITE	= 0x61,
L
Linus Torvalds 已提交
211 212 213 214
	ATA_CMD_PIO_READ	= 0x20,
	ATA_CMD_PIO_READ_EXT	= 0x24,
	ATA_CMD_PIO_WRITE	= 0x30,
	ATA_CMD_PIO_WRITE_EXT	= 0x34,
215 216 217 218
	ATA_CMD_READ_MULTI	= 0xC4,
	ATA_CMD_READ_MULTI_EXT	= 0x29,
	ATA_CMD_WRITE_MULTI	= 0xC5,
	ATA_CMD_WRITE_MULTI_EXT	= 0x39,
T
Tejun Heo 已提交
219
	ATA_CMD_WRITE_MULTI_FUA_EXT = 0xCE,
L
Linus Torvalds 已提交
220
	ATA_CMD_SET_FEATURES	= 0xEF,
221
	ATA_CMD_SET_MULTI	= 0xC6,
L
Linus Torvalds 已提交
222 223 224
	ATA_CMD_PACKET		= 0xA0,
	ATA_CMD_VERIFY		= 0x40,
	ATA_CMD_VERIFY_EXT	= 0x42,
225 226
	ATA_CMD_STANDBYNOW1	= 0xE0,
	ATA_CMD_IDLEIMMEDIATE	= 0xE1,
227
	ATA_CMD_SLEEP		= 0xE6,
228
	ATA_CMD_INIT_DEV_PARAMS	= 0x91,
229 230
	ATA_CMD_READ_NATIVE_MAX	= 0xF8,
	ATA_CMD_READ_NATIVE_MAX_EXT = 0x27,
A
Alan Cox 已提交
231 232
	ATA_CMD_SET_MAX		= 0xF9,
	ATA_CMD_SET_MAX_EXT	= 0x37,
233
	ATA_CMD_READ_LOG_EXT	= 0x2f,
234 235
	ATA_CMD_PMP_READ	= 0xE4,
	ATA_CMD_PMP_WRITE	= 0xE8,
T
Tejun Heo 已提交
236 237
	ATA_CMD_CONF_OVERLAY	= 0xB1,
	ATA_CMD_SEC_FREEZE_LOCK	= 0xF5,
238 239 240 241 242 243 244
	ATA_CMD_SMART		= 0xB0,
	ATA_CMD_MEDIA_LOCK	= 0xDE,
	ATA_CMD_MEDIA_UNLOCK	= 0xDF,
	/* marked obsolete in the ATA/ATAPI-7 spec */
	ATA_CMD_RESTORE		= 0x10,
	/* EXABYTE specific */
	ATA_EXABYTE_ENABLE_NEST	= 0xF0,
245 246 247

	/* READ_LOG_EXT pages */
	ATA_LOG_SATA_NCQ	= 0x10,
L
Linus Torvalds 已提交
248

249 250 251 252 253 254
	/* READ/WRITE LONG (obsolete) */
	ATA_CMD_READ_LONG	= 0x22,
	ATA_CMD_READ_LONG_ONCE	= 0x23,
	ATA_CMD_WRITE_LONG	= 0x32,
	ATA_CMD_WRITE_LONG_ONCE	= 0x33,

L
Linus Torvalds 已提交
255 256 257 258 259 260 261 262 263 264
	/* SETFEATURES stuff */
	SETFEATURES_XFER	= 0x03,
	XFER_UDMA_7		= 0x47,
	XFER_UDMA_6		= 0x46,
	XFER_UDMA_5		= 0x45,
	XFER_UDMA_4		= 0x44,
	XFER_UDMA_3		= 0x43,
	XFER_UDMA_2		= 0x42,
	XFER_UDMA_1		= 0x41,
	XFER_UDMA_0		= 0x40,
265 266
	XFER_MW_DMA_4		= 0x24,	/* CFA only */
	XFER_MW_DMA_3		= 0x23,	/* CFA only */
L
Linus Torvalds 已提交
267 268 269
	XFER_MW_DMA_2		= 0x22,
	XFER_MW_DMA_1		= 0x21,
	XFER_MW_DMA_0		= 0x20,
270 271 272
	XFER_SW_DMA_2		= 0x12,
	XFER_SW_DMA_1		= 0x11,
	XFER_SW_DMA_0		= 0x10,
273 274
	XFER_PIO_6		= 0x0E,	/* CFA only */
	XFER_PIO_5		= 0x0D,	/* CFA only */
L
Linus Torvalds 已提交
275 276 277 278 279 280 281
	XFER_PIO_4		= 0x0C,
	XFER_PIO_3		= 0x0B,
	XFER_PIO_2		= 0x0A,
	XFER_PIO_1		= 0x09,
	XFER_PIO_0		= 0x08,
	XFER_PIO_SLOW		= 0x00,

282 283 284
	SETFEATURES_WC_ON	= 0x02, /* Enable write cache */
	SETFEATURES_WC_OFF	= 0x82, /* Disable write cache */

285 286 287 288
	/* Enable/Disable Automatic Acoustic Management */
	SETFEATURES_AAM_ON	= 0x42,
	SETFEATURES_AAM_OFF	= 0xC2,

289 290
	SETFEATURES_SPINUP	= 0x07, /* Spin-up drive */

291 292 293 294 295
	SETFEATURES_SATA_ENABLE = 0x10, /* Enable use of SATA feature */
	SETFEATURES_SATA_DISABLE = 0x90, /* Disable use of SATA feature */

	/* SETFEATURE Sector counts for SATA features */
	SATA_AN			= 0x05,  /* Asynchronous Notification */
296
	SATA_DIPM		= 0x03,  /* Device Initiated Power Management */
297

T
Tejun Heo 已提交
298 299 300 301 302 303 304 305 306 307 308 309 310
	/* feature values for SET_MAX */
	ATA_SET_MAX_ADDR	= 0x00,
	ATA_SET_MAX_PASSWD	= 0x01,
	ATA_SET_MAX_LOCK	= 0x02,
	ATA_SET_MAX_UNLOCK	= 0x03,
	ATA_SET_MAX_FREEZE_LOCK	= 0x04,

	/* feature values for DEVICE CONFIGURATION OVERLAY */
	ATA_DCO_RESTORE		= 0xC0,
	ATA_DCO_FREEZE_LOCK	= 0xC1,
	ATA_DCO_IDENTIFY	= 0xC2,
	ATA_DCO_SET		= 0xC3,

311 312 313 314 315 316 317 318 319
	/* feature values for SMART */
	ATA_SMART_ENABLE	= 0xD8,
	ATA_SMART_READ_VALUES	= 0xD0,
	ATA_SMART_READ_THRESHOLDS = 0xD1,

	/* password used in LBA Mid / LBA High for executing SMART commands */
	ATA_SMART_LBAM_PASS	= 0x4F,
	ATA_SMART_LBAH_PASS	= 0xC2,

L
Linus Torvalds 已提交
320 321 322 323 324 325
	/* ATAPI stuff */
	ATAPI_PKT_DMA		= (1 << 0),
	ATAPI_DMADIR		= (1 << 2),	/* ATAPI data dir:
						   0=to device, 1=to host */
	ATAPI_CDB_LEN		= 16,

326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347
	/* PMP stuff */
	SATA_PMP_MAX_PORTS	= 15,
	SATA_PMP_CTRL_PORT	= 15,

	SATA_PMP_GSCR_DWORDS	= 128,
	SATA_PMP_GSCR_PROD_ID	= 0,
	SATA_PMP_GSCR_REV	= 1,
	SATA_PMP_GSCR_PORT_INFO	= 2,
	SATA_PMP_GSCR_ERROR	= 32,
	SATA_PMP_GSCR_ERROR_EN	= 33,
	SATA_PMP_GSCR_FEAT	= 64,
	SATA_PMP_GSCR_FEAT_EN	= 96,

	SATA_PMP_PSCR_STATUS	= 0,
	SATA_PMP_PSCR_ERROR	= 1,
	SATA_PMP_PSCR_CONTROL	= 2,

	SATA_PMP_FEAT_BIST	= (1 << 0),
	SATA_PMP_FEAT_PMREQ	= (1 << 1),
	SATA_PMP_FEAT_DYNSSC	= (1 << 2),
	SATA_PMP_FEAT_NOTIFY	= (1 << 3),

L
Linus Torvalds 已提交
348 349 350 351
	/* cable types */
	ATA_CBL_NONE		= 0,
	ATA_CBL_PATA40		= 1,
	ATA_CBL_PATA80		= 2,
T
Tejun Heo 已提交
352 353 354 355
	ATA_CBL_PATA40_SHORT	= 3,	/* 40 wire cable to high UDMA spec */
	ATA_CBL_PATA_UNK	= 4,	/* don't know, maybe 80c? */
	ATA_CBL_PATA_IGN	= 5,	/* don't know, ignore cable handling */
	ATA_CBL_SATA		= 6,
L
Linus Torvalds 已提交
356 357 358 359 360 361 362 363

	/* SATA Status and Control Registers */
	SCR_STATUS		= 0,
	SCR_ERROR		= 1,
	SCR_CONTROL		= 2,
	SCR_ACTIVE		= 3,
	SCR_NOTIFICATION	= 4,

364 365 366 367 368 369 370 371
	/* SError bits */
	SERR_DATA_RECOVERED	= (1 << 0), /* recovered data error */
	SERR_COMM_RECOVERED	= (1 << 1), /* recovered comm failure */
	SERR_DATA		= (1 << 8), /* unrecovered data error */
	SERR_PERSISTENT		= (1 << 9), /* persistent data/comm error */
	SERR_PROTOCOL		= (1 << 10), /* protocol violation */
	SERR_INTERNAL		= (1 << 11), /* host internal error */
	SERR_PHYRDY_CHG		= (1 << 16), /* PHY RDY changed */
372 373 374 375 376 377 378 379 380
	SERR_PHY_INT_ERR	= (1 << 17), /* PHY internal error */
	SERR_COMM_WAKE		= (1 << 18), /* Comm wake */
	SERR_10B_8B_ERR		= (1 << 19), /* 10b to 8b decode error */
	SERR_DISPARITY		= (1 << 20), /* Disparity */
	SERR_CRC		= (1 << 21), /* CRC error */
	SERR_HANDSHAKE		= (1 << 22), /* Handshake error */
	SERR_LINK_SEQ_ERR	= (1 << 23), /* Link sequence error */
	SERR_TRANS_ST_ERROR	= (1 << 24), /* Transport state trans. error */
	SERR_UNRECOG_FIS	= (1 << 25), /* Unrecognized FIS */
381 382
	SERR_DEV_XCHG		= (1 << 26), /* device exchanged */

L
Linus Torvalds 已提交
383 384 385 386 387
	/* struct ata_taskfile flags */
	ATA_TFLAG_LBA48		= (1 << 0), /* enable 48-bit LBA and "HOB" */
	ATA_TFLAG_ISADDR	= (1 << 1), /* enable r/w to nsect/lba regs */
	ATA_TFLAG_DEVICE	= (1 << 2), /* enable r/w to device reg */
	ATA_TFLAG_WRITE		= (1 << 3), /* data dir: host->dev==1 (write) */
388
	ATA_TFLAG_LBA		= (1 << 4), /* enable LBA */
T
Tejun Heo 已提交
389
	ATA_TFLAG_FUA		= (1 << 5), /* enable FUA */
J
Jeff Garzik 已提交
390
	ATA_TFLAG_POLLING	= (1 << 6), /* set nIEN to 1 and use polling */
T
Tejun Heo 已提交
391 392 393 394 395 396 397

	/* protocol flags */
	ATA_PROT_FLAG_PIO	= (1 << 0), /* is PIO */
	ATA_PROT_FLAG_DMA	= (1 << 1), /* is DMA */
	ATA_PROT_FLAG_DATA	= ATA_PROT_FLAG_PIO | ATA_PROT_FLAG_DMA,
	ATA_PROT_FLAG_NCQ	= (1 << 2), /* is NCQ */
	ATA_PROT_FLAG_ATAPI	= (1 << 3), /* is ATAPI */
L
Linus Torvalds 已提交
398 399 400 401 402 403
};

enum ata_tf_protocols {
	/* ATA taskfile protocols */
	ATA_PROT_UNKNOWN,	/* unknown/invalid */
	ATA_PROT_NODATA,	/* no data */
404
	ATA_PROT_PIO,		/* PIO data xfer */
L
Linus Torvalds 已提交
405
	ATA_PROT_DMA,		/* DMA */
406
	ATA_PROT_NCQ,		/* NCQ */
407 408 409
	ATAPI_PROT_NODATA,	/* packet command, no data */
	ATAPI_PROT_PIO,		/* packet command, PIO data xfer*/
	ATAPI_PROT_DMA,		/* packet command with special DMA sauce */
L
Linus Torvalds 已提交
410 411 412 413 414 415 416 417 418 419
};

enum ata_ioctls {
	ATA_IOC_GET_IO32	= 0x309,
	ATA_IOC_SET_IO32	= 0x324,
};

/* core structures */

struct ata_prd {
A
Al Viro 已提交
420 421
	__le32			addr;
	__le32			flags_len;
L
Linus Torvalds 已提交
422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446
};

struct ata_taskfile {
	unsigned long		flags;		/* ATA_TFLAG_xxx */
	u8			protocol;	/* ATA_PROT_xxx */

	u8			ctl;		/* control reg */

	u8			hob_feature;	/* additional data */
	u8			hob_nsect;	/* to support LBA48 */
	u8			hob_lbal;
	u8			hob_lbam;
	u8			hob_lbah;

	u8			feature;
	u8			nsect;
	u8			lbal;
	u8			lbam;
	u8			lbah;

	u8			device;

	u8			command;	/* IO operation */
};

T
Tejun Heo 已提交
447 448 449 450 451 452 453 454 455 456 457 458 459 460
/*
 * protocol tests
 */
static inline unsigned int ata_prot_flags(u8 prot)
{
	switch (prot) {
	case ATA_PROT_NODATA:
		return 0;
	case ATA_PROT_PIO:
		return ATA_PROT_FLAG_PIO;
	case ATA_PROT_DMA:
		return ATA_PROT_FLAG_DMA;
	case ATA_PROT_NCQ:
		return ATA_PROT_FLAG_DMA | ATA_PROT_FLAG_NCQ;
461
	case ATAPI_PROT_NODATA:
T
Tejun Heo 已提交
462
		return ATA_PROT_FLAG_ATAPI;
463
	case ATAPI_PROT_PIO:
T
Tejun Heo 已提交
464
		return ATA_PROT_FLAG_ATAPI | ATA_PROT_FLAG_PIO;
465
	case ATAPI_PROT_DMA:
T
Tejun Heo 已提交
466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503
		return ATA_PROT_FLAG_ATAPI | ATA_PROT_FLAG_DMA;
	}
	return 0;
}

static inline int ata_is_atapi(u8 prot)
{
	return ata_prot_flags(prot) & ATA_PROT_FLAG_ATAPI;
}

static inline int ata_is_nodata(u8 prot)
{
	return !(ata_prot_flags(prot) & ATA_PROT_FLAG_DATA);
}

static inline int ata_is_pio(u8 prot)
{
	return ata_prot_flags(prot) & ATA_PROT_FLAG_PIO;
}

static inline int ata_is_dma(u8 prot)
{
	return ata_prot_flags(prot) & ATA_PROT_FLAG_DMA;
}

static inline int ata_is_ncq(u8 prot)
{
	return ata_prot_flags(prot) & ATA_PROT_FLAG_NCQ;
}

static inline int ata_is_data(u8 prot)
{
	return ata_prot_flags(prot) & ATA_PROT_FLAG_DATA;
}

/*
 * id tests
 */
504 505 506
#define ata_id_is_ata(id)	(((id)[ATA_ID_CONFIG] & (1 << 15)) == 0)
#define ata_id_has_lba(id)	((id)[ATA_ID_CAPABILITY] & (1 << 9))
#define ata_id_has_dma(id)	((id)[ATA_ID_CAPABILITY] & (1 << 8))
507
#define ata_id_has_ncq(id)	((id)[76] & (1 << 8))
508 509
#define ata_id_queue_depth(id)	(((id)[ATA_ID_QUEUE_DEPTH] & 0x1f) + 1)
#define ata_id_removeable(id)	((id)[ATA_ID_CONFIG] & (1 << 7))
T
Tejun Heo 已提交
510
#define ata_id_has_atapi_AN(id)	\
511 512
	( (((id)[76] != 0x0000) && ((id)[76] != 0xffff)) && \
	  ((id)[78] & (1 << 5)) )
513 514
#define ata_id_iordy_disable(id) ((id)[ATA_ID_CAPABILITY] & (1 << 10))
#define ata_id_has_iordy(id) ((id)[ATA_ID_CAPABILITY] & (1 << 11))
L
Linus Torvalds 已提交
515 516 517 518 519 520 521 522
#define ata_id_u32(id,n)	\
	(((u32) (id)[(n) + 1] << 16) | ((u32) (id)[(n)]))
#define ata_id_u64(id,n)	\
	( ((u64) (id)[(n) + 3] << 48) |	\
	  ((u64) (id)[(n) + 2] << 32) |	\
	  ((u64) (id)[(n) + 1] << 16) |	\
	  ((u64) (id)[(n) + 0]) )

523
#define ata_id_cdb_intr(id)	(((id)[ATA_ID_CONFIG] & 0x60) == 0x20)
524

525 526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541 542 543 544
static inline bool ata_id_has_hipm(const u16 *id)
{
	u16 val = id[76];

	if (val == 0 || val == 0xffff)
		return false;

	return val & (1 << 9);
}

static inline bool ata_id_has_dipm(const u16 *id)
{
	u16 val = id[78];

	if (val == 0 || val == 0xffff)
		return false;

	return val & (1 << 3);
}

545

546 547
static inline int ata_id_has_fua(const u16 *id)
{
548
	if ((id[ATA_ID_CFSSE] & 0xC000) != 0x4000)
549
		return 0;
550
	return id[ATA_ID_CFSSE] & (1 << 6);
551 552 553 554
}

static inline int ata_id_has_flush(const u16 *id)
{
555
	if ((id[ATA_ID_COMMAND_SET_2] & 0xC000) != 0x4000)
556
		return 0;
557
	return id[ATA_ID_COMMAND_SET_2] & (1 << 12);
558 559 560 561
}

static inline int ata_id_has_flush_ext(const u16 *id)
{
562
	if ((id[ATA_ID_COMMAND_SET_2] & 0xC000) != 0x4000)
563
		return 0;
564
	return id[ATA_ID_COMMAND_SET_2] & (1 << 13);
565 566 567 568
}

static inline int ata_id_has_lba48(const u16 *id)
{
569
	if ((id[ATA_ID_COMMAND_SET_2] & 0xC000) != 0x4000)
570
		return 0;
571
	if (!ata_id_u64(id, ATA_ID_LBA_CAPACITY_2))
G
Geert Uytterhoeven 已提交
572
		return 0;
573
	return id[ATA_ID_COMMAND_SET_2] & (1 << 10);
574 575 576 577 578
}

static inline int ata_id_hpa_enabled(const u16 *id)
{
	/* Yes children, word 83 valid bits cover word 82 data */
579
	if ((id[ATA_ID_COMMAND_SET_2] & 0xC000) != 0x4000)
580 581
		return 0;
	/* And 87 covers 85-87 */
582
	if ((id[ATA_ID_CSF_DEFAULT] & 0xC000) != 0x4000)
583 584
		return 0;
	/* Check command sets enabled as well as supported */
585
	if ((id[ATA_ID_CFS_ENABLE_1] & (1 << 10)) == 0)
586
		return 0;
587
	return id[ATA_ID_COMMAND_SET_1] & (1 << 10);
588 589 590 591 592
}

static inline int ata_id_has_wcache(const u16 *id)
{
	/* Yes children, word 83 valid bits cover word 82 data */
593
	if ((id[ATA_ID_COMMAND_SET_2] & 0xC000) != 0x4000)
594
		return 0;
595
	return id[ATA_ID_COMMAND_SET_1] & (1 << 5);
596 597 598 599
}

static inline int ata_id_has_pm(const u16 *id)
{
600
	if ((id[ATA_ID_COMMAND_SET_2] & 0xC000) != 0x4000)
601
		return 0;
602
	return id[ATA_ID_COMMAND_SET_1] & (1 << 3);
603 604 605 606
}

static inline int ata_id_rahead_enabled(const u16 *id)
{
607
	if ((id[ATA_ID_CSF_DEFAULT] & 0xC000) != 0x4000)
608
		return 0;
609
	return id[ATA_ID_CFS_ENABLE_1] & (1 << 6);
610 611 612 613
}

static inline int ata_id_wcache_enabled(const u16 *id)
{
614
	if ((id[ATA_ID_CSF_DEFAULT] & 0xC000) != 0x4000)
615
		return 0;
616
	return id[ATA_ID_CFS_ENABLE_1] & (1 << 5);
617 618 619 620 621 622 623 624 625 626 627 628
}

/**
 *	ata_id_major_version	-	get ATA level of drive
 *	@id: Identify data
 *
 *	Caveats:
 *		ATA-1 considers identify optional
 *		ATA-2 introduces mandatory identify
 *		ATA-3 introduces word 80 and accurate reporting
 *
 *	The practical impact of this is that ata_id_major_version cannot
629
 *	reliably report on drives below ATA3.
630 631
 */

632 633 634 635
static inline unsigned int ata_id_major_version(const u16 *id)
{
	unsigned int mver;

636 637 638
	if (id[ATA_ID_MAJOR_VER] == 0xFFFF)
		return 0;

639 640 641 642 643 644
	for (mver = 14; mver >= 1; mver--)
		if (id[ATA_ID_MAJOR_VER] & (1 << mver))
			break;
	return mver;
}

645 646
static inline int ata_id_is_sata(const u16 *id)
{
647
	return ata_id_major_version(id) >= 5 && id[ATA_ID_HW_CONFIG] == 0;
648 649
}

650 651 652 653 654 655 656 657 658 659 660 661 662 663 664
static inline int ata_id_has_tpm(const u16 *id)
{
	/* The TPM bits are only valid on ATA8 */
	if (ata_id_major_version(id) < 8)
		return 0;
	if ((id[48] & 0xC000) != 0x4000)
		return 0;
	return id[48] & (1 << 0);
}

static inline int ata_id_has_dword_io(const u16 *id)
{
	/* ATA 8 reuses this flag for "trusted" computing */
	if (ata_id_major_version(id) > 7)
		return 0;
665
	if (id[ATA_ID_DWORD_IO] & (1 << 0))
666 667 668 669
		return 1;
	return 0;
}

J
Jeff Garzik 已提交
670
static inline int ata_id_current_chs_valid(const u16 *id)
671
{
J
Jeff Garzik 已提交
672 673
	/* For ATA-1 devices, if the INITIALIZE DEVICE PARAMETERS command
	   has not been issued to the device then the values of
674 675 676 677 678 679
	   id[ATA_ID_CUR_CYLS] to id[ATA_ID_CUR_SECTORS] are vendor specific. */
	return (id[ATA_ID_FIELD_VALID] & 1) && /* Current translation valid */
		id[ATA_ID_CUR_CYLS] &&  /* cylinders in current translation */
		id[ATA_ID_CUR_HEADS] &&  /* heads in current translation */
		id[ATA_ID_CUR_HEADS] <= 16 &&
		id[ATA_ID_CUR_SECTORS];    /* sectors in current translation */
680 681
}

682 683
static inline int ata_id_is_cfa(const u16 *id)
{
684
	if (id[ATA_ID_CONFIG] == 0x848A)	/* Standard CF */
685 686
		return 1;
	/* Could be CF hiding as standard ATA */
687 688 689
	if (ata_id_major_version(id) >= 3 &&
	    id[ATA_ID_COMMAND_SET_1] != 0xFFFF &&
	   (id[ATA_ID_COMMAND_SET_1] & (1 << 2)))
690 691 692 693
		return 1;
	return 0;
}

694 695
static inline int ata_drive_40wire(const u16 *dev_id)
{
696
	if (ata_id_is_sata(dev_id))
697
		return 0;	/* SATA */
698
	if ((dev_id[ATA_ID_HW_CONFIG] & 0xE000) == 0x6000)
699 700 701 702
		return 0;	/* 80 wire */
	return 1;
}

A
Alan Cox 已提交
703 704
static inline int ata_drive_40wire_relaxed(const u16 *dev_id)
{
705
	if ((dev_id[ATA_ID_HW_CONFIG] & 0x2000) == 0x2000)
A
Alan Cox 已提交
706 707 708 709
		return 0;	/* 80 wire */
	return 1;
}

J
Jeff Garzik 已提交
710
static inline int atapi_cdb_len(const u16 *dev_id)
L
Linus Torvalds 已提交
711
{
712
	u16 tmp = dev_id[ATA_ID_CONFIG] & 0x3;
L
Linus Torvalds 已提交
713 714 715 716 717 718 719
	switch (tmp) {
	case 0:		return 12;
	case 1:		return 16;
	default:	return -1;
	}
}

720 721
static inline int atapi_command_packet_set(const u16 *dev_id)
{
722
	return (dev_id[ATA_ID_CONFIG] >> 8) & 0x1f;
723 724
}

725 726 727 728 729
static inline int atapi_id_dmadir(const u16 *dev_id)
{
	return ata_id_major_version(dev_id) >= 7 && (dev_id[62] & 0x8000);
}

730 731 732 733 734
static inline int is_multi_taskfile(struct ata_taskfile *tf)
{
	return (tf->command == ATA_CMD_READ_MULTI) ||
	       (tf->command == ATA_CMD_WRITE_MULTI) ||
	       (tf->command == ATA_CMD_READ_MULTI_EXT) ||
735 736
	       (tf->command == ATA_CMD_WRITE_MULTI_EXT) ||
	       (tf->command == ATA_CMD_WRITE_MULTI_FUA_EXT);
737 738
}

L
Linus Torvalds 已提交
739 740 741 742 743 744
static inline int ata_ok(u8 status)
{
	return ((status & (ATA_BUSY | ATA_DRDY | ATA_DF | ATA_DRQ | ATA_ERR))
			== ATA_DRDY);
}

745 746 747 748 749 750 751 752 753 754 755 756
static inline int lba_28_ok(u64 block, u32 n_block)
{
	/* check the ending block number */
	return ((block + n_block - 1) < ((u64)1 << 28)) && (n_block <= 256);
}

static inline int lba_48_ok(u64 block, u32 n_block)
{
	/* check the ending block number */
	return ((block + n_block - 1) < ((u64)1 << 48)) && (n_block <= 65536);
}

757 758 759 760 761
#define sata_pmp_gscr_vendor(gscr)	((gscr)[SATA_PMP_GSCR_PROD_ID] & 0xffff)
#define sata_pmp_gscr_devid(gscr)	((gscr)[SATA_PMP_GSCR_PROD_ID] >> 16)
#define sata_pmp_gscr_rev(gscr)		(((gscr)[SATA_PMP_GSCR_REV] >> 8) & 0xff)
#define sata_pmp_gscr_ports(gscr)	((gscr)[SATA_PMP_GSCR_PORT_INFO] & 0xf)

L
Linus Torvalds 已提交
762
#endif /* __LINUX_ATA_H__ */