3 Copyright 2003-2004 Red Hat, Inc. All rights reserved.
4 Copyright 2003-2004 Jeff Garzik
6 The contents of this file are subject to the Open
7 Software License version 1.1 that can be found at
8 http://www.opensource.org/licenses/osl-1.1.txt and is included herein
11 Alternatively, the contents of this file may be used under the terms
12 of the GNU General Public License version 2 (the "GPL") as distributed
13 in the kernel source COPYING file, in which case the provisions of
14 the GPL are applicable instead of the above. If you wish to allow
15 the use of your version of this file only under the terms of the
16 GPL and not to allow others to use your version of this file under
17 the OSL, indicate your decision by deleting the provisions above and
18 replace them with the notice and other provisions required by the GPL.
19 If you do not delete the provisions above, a recipient may use your
20 version of this file under either the OSL or the GPL.
24 #ifndef __LINUX_ATA_H__
25 #define __LINUX_ATA_H__
27 /* defines only for the constants which don't work well as enums */
28 #define ATA_DMA_BOUNDARY 0xffffUL
29 #define ATA_DMA_MASK 0xffffffffULL
32 /* various global constants */
33 ATA_MAX_DEVICES = 2, /* per bus/port */
34 ATA_MAX_PRD = 256, /* we could make these 256/256 */
36 ATA_SECT_SIZE_MASK = (ATA_SECT_SIZE - 1),
37 ATA_SECT_DWORDS = ATA_SECT_SIZE / sizeof(u32),
41 ATA_ID_SERNO_OFS = 10,
42 ATA_ID_MAJOR_VER = 80,
43 ATA_ID_PIO_MODES = 64,
44 ATA_ID_UDMA_MODES = 88,
45 ATA_ID_PIO4 = (1 << 1),
50 ATA_UDMA1 = ATA_UDMA0 | (1 << 1),
51 ATA_UDMA2 = ATA_UDMA1 | (1 << 2),
52 ATA_UDMA3 = ATA_UDMA2 | (1 << 3),
53 ATA_UDMA4 = ATA_UDMA3 | (1 << 4),
54 ATA_UDMA5 = ATA_UDMA4 | (1 << 5),
55 ATA_UDMA6 = ATA_UDMA5 | (1 << 6),
56 ATA_UDMA7 = ATA_UDMA6 | (1 << 7),
57 /* ATA_UDMA7 is just for completeness... doesn't exist (yet?). */
59 ATA_UDMA_MASK_40C = ATA_UDMA2, /* udma0-2 */
63 ATA_PRD_TBL_SZ = (ATA_MAX_PRD * ATA_PRD_SZ),
64 ATA_PRD_EOT = (1 << 31), /* end-of-table flag */
66 ATA_DMA_TABLE_OFS = 4,
69 ATA_DMA_WR = (1 << 3),
70 ATA_DMA_START = (1 << 0),
71 ATA_DMA_INTR = (1 << 2),
72 ATA_DMA_ERR = (1 << 1),
73 ATA_DMA_ACTIVE = (1 << 0),
75 /* bits in ATA command block registers */
76 ATA_HOB = (1 << 7), /* LBA48 selector */
77 ATA_NIEN = (1 << 1), /* disable-irq flag */
78 ATA_LBA = (1 << 6), /* LBA28 selector */
79 ATA_DEV1 = (1 << 4), /* Select Device 1 (slave) */
80 ATA_BUSY = (1 << 7), /* BSY status bit */
81 ATA_DEVICE_OBS = (1 << 7) | (1 << 5), /* obs bits in dev reg */
82 ATA_DEVCTL_OBS = (1 << 3), /* obsolete bit in devctl reg */
83 ATA_DRQ = (1 << 3), /* data request i/o */
84 ATA_ERR = (1 << 0), /* have an error */
85 ATA_SRST = (1 << 2), /* software reset */
86 ATA_ABORTED = (1 << 2), /* command aborted */
88 /* ATA command block registers */
95 ATA_REG_DEVICE = 0x06,
96 ATA_REG_STATUS = 0x07,
98 ATA_REG_FEATURE = ATA_REG_ERR, /* and their aliases */
99 ATA_REG_CMD = ATA_REG_STATUS,
100 ATA_REG_BYTEL = ATA_REG_LBAM,
101 ATA_REG_BYTEH = ATA_REG_LBAH,
102 ATA_REG_DEVSEL = ATA_REG_DEVICE,
103 ATA_REG_IRQ = ATA_REG_NSECT,
105 /* ATA device commands */
106 ATA_CMD_EDD = 0x90, /* execute device diagnostic */
107 ATA_CMD_ID_ATA = 0xEC,
108 ATA_CMD_ID_ATAPI = 0xA1,
110 ATA_CMD_READ_EXT = 0x25,
111 ATA_CMD_WRITE = 0xCA,
112 ATA_CMD_WRITE_EXT = 0x35,
113 ATA_CMD_PIO_READ = 0x20,
114 ATA_CMD_PIO_READ_EXT = 0x24,
115 ATA_CMD_PIO_WRITE = 0x30,
116 ATA_CMD_PIO_WRITE_EXT = 0x34,
117 ATA_CMD_SET_FEATURES = 0xEF,
118 ATA_CMD_PACKET = 0xA0,
120 /* SETFEATURES stuff */
121 SETFEATURES_XFER = 0x03,
134 ATAPI_PKT_DMA = (1 << 0),
140 ATA_CBL_PATA_UNK = 3,
143 /* SATA Status and Control Registers */
148 SCR_NOTIFICATION = 4,
150 /* struct ata_taskfile flags */
151 ATA_TFLAG_LBA48 = (1 << 0), /* enable 48-bit LBA and "HOB" */
152 ATA_TFLAG_ISADDR = (1 << 1), /* enable r/w to nsect/lba regs */
153 ATA_TFLAG_DEVICE = (1 << 2), /* enable r/w to device reg */
154 ATA_TFLAG_WRITE = (1 << 3), /* data dir: host->dev==1 (write) */
157 enum ata_tf_protocols {
158 /* ATA taskfile protocols */
159 ATA_PROT_UNKNOWN, /* unknown/invalid */
160 ATA_PROT_NODATA, /* no data */
161 ATA_PROT_PIO, /* PIO single sector */
162 ATA_PROT_PIO_MULT, /* PIO multiple sector */
163 ATA_PROT_DMA, /* DMA */
164 ATA_PROT_ATAPI, /* packet command */
165 ATA_PROT_ATAPI_DMA, /* packet command with special DMA sauce */
168 /* core structures */
173 } __attribute__((packed));
175 struct ata_taskfile {
176 unsigned long flags; /* ATA_TFLAG_xxx */
177 u8 protocol; /* ATA_PROT_xxx */
179 u8 ctl; /* control reg */
181 u8 hob_feature; /* additional data */
182 u8 hob_nsect; /* to support LBA48 */
195 u8 command; /* IO operation */
198 #define ata_id_is_ata(dev) (((dev)->id[0] & (1 << 15)) == 0)
199 #define ata_id_has_lba48(dev) ((dev)->id[83] & (1 << 10))
200 #define ata_id_has_lba(dev) ((dev)->id[49] & (1 << 8))
201 #define ata_id_has_dma(dev) ((dev)->id[49] & (1 << 9))
202 #define ata_id_u32(dev,n) \
203 (((u32) (dev)->id[(n) + 1] << 16) | ((u32) (dev)->id[(n)]))
204 #define ata_id_u64(dev,n) \
205 ( ((u64) dev->id[(n) + 3] << 48) | \
206 ((u64) dev->id[(n) + 2] << 32) | \
207 ((u64) dev->id[(n) + 1] << 16) | \
208 ((u64) dev->id[(n) + 0]) )
210 #endif /* __LINUX_ATA_H__ */