blob: d8981402cd5b986bb3a094790781da768b7fd278 [file] [log] [blame]
Linus Torvalds1da177e2005-04-16 15:20:36 -07001
2/*
3 Copyright 2003-2004 Red Hat, Inc. All rights reserved.
4 Copyright 2003-2004 Jeff Garzik
5
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
9 by reference.
10
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.
21
22 */
23
24#ifndef __LINUX_ATA_H__
25#define __LINUX_ATA_H__
26
27#include <linux/types.h>
28
29/* defines only for the constants which don't work well as enums */
30#define ATA_DMA_BOUNDARY 0xffffUL
31#define ATA_DMA_MASK 0xffffffffULL
32
33enum {
34 /* various global constants */
35 ATA_MAX_DEVICES = 2, /* per bus/port */
36 ATA_MAX_PRD = 256, /* we could make these 256/256 */
37 ATA_SECT_SIZE = 512,
38
39 ATA_ID_WORDS = 256,
40 ATA_ID_PROD_OFS = 27,
41 ATA_ID_FW_REV_OFS = 23,
42 ATA_ID_SERNO_OFS = 10,
43 ATA_ID_MAJOR_VER = 80,
44 ATA_ID_PIO_MODES = 64,
45 ATA_ID_MWDMA_MODES = 63,
46 ATA_ID_UDMA_MODES = 88,
47 ATA_ID_PIO4 = (1 << 1),
48
49 ATA_PCI_CTL_OFS = 2,
50 ATA_SERNO_LEN = 20,
51 ATA_UDMA0 = (1 << 0),
52 ATA_UDMA1 = ATA_UDMA0 | (1 << 1),
53 ATA_UDMA2 = ATA_UDMA1 | (1 << 2),
54 ATA_UDMA3 = ATA_UDMA2 | (1 << 3),
55 ATA_UDMA4 = ATA_UDMA3 | (1 << 4),
56 ATA_UDMA5 = ATA_UDMA4 | (1 << 5),
57 ATA_UDMA6 = ATA_UDMA5 | (1 << 6),
58 ATA_UDMA7 = ATA_UDMA6 | (1 << 7),
59 /* ATA_UDMA7 is just for completeness... doesn't exist (yet?). */
60
61 ATA_UDMA_MASK_40C = ATA_UDMA2, /* udma0-2 */
62
63 /* DMA-related */
64 ATA_PRD_SZ = 8,
65 ATA_PRD_TBL_SZ = (ATA_MAX_PRD * ATA_PRD_SZ),
66 ATA_PRD_EOT = (1 << 31), /* end-of-table flag */
67
68 ATA_DMA_TABLE_OFS = 4,
69 ATA_DMA_STATUS = 2,
70 ATA_DMA_CMD = 0,
71 ATA_DMA_WR = (1 << 3),
72 ATA_DMA_START = (1 << 0),
73 ATA_DMA_INTR = (1 << 2),
74 ATA_DMA_ERR = (1 << 1),
75 ATA_DMA_ACTIVE = (1 << 0),
76
77 /* bits in ATA command block registers */
78 ATA_HOB = (1 << 7), /* LBA48 selector */
79 ATA_NIEN = (1 << 1), /* disable-irq flag */
80 ATA_LBA = (1 << 6), /* LBA28 selector */
81 ATA_DEV1 = (1 << 4), /* Select Device 1 (slave) */
82 ATA_DEVICE_OBS = (1 << 7) | (1 << 5), /* obs bits in dev reg */
83 ATA_DEVCTL_OBS = (1 << 3), /* obsolete bit in devctl reg */
84 ATA_BUSY = (1 << 7), /* BSY status bit */
85 ATA_DRDY = (1 << 6), /* device ready */
86 ATA_DF = (1 << 5), /* device fault */
87 ATA_DRQ = (1 << 3), /* data request i/o */
88 ATA_ERR = (1 << 0), /* have an error */
89 ATA_SRST = (1 << 2), /* software reset */
90 ATA_ABORTED = (1 << 2), /* command aborted */
91
92 /* ATA command block registers */
93 ATA_REG_DATA = 0x00,
94 ATA_REG_ERR = 0x01,
95 ATA_REG_NSECT = 0x02,
96 ATA_REG_LBAL = 0x03,
97 ATA_REG_LBAM = 0x04,
98 ATA_REG_LBAH = 0x05,
99 ATA_REG_DEVICE = 0x06,
100 ATA_REG_STATUS = 0x07,
101
102 ATA_REG_FEATURE = ATA_REG_ERR, /* and their aliases */
103 ATA_REG_CMD = ATA_REG_STATUS,
104 ATA_REG_BYTEL = ATA_REG_LBAM,
105 ATA_REG_BYTEH = ATA_REG_LBAH,
106 ATA_REG_DEVSEL = ATA_REG_DEVICE,
107 ATA_REG_IRQ = ATA_REG_NSECT,
108
109 /* ATA device commands */
110 ATA_CMD_CHK_POWER = 0xE5, /* check power mode */
111 ATA_CMD_EDD = 0x90, /* execute device diagnostic */
112 ATA_CMD_FLUSH = 0xE7,
113 ATA_CMD_FLUSH_EXT = 0xEA,
114 ATA_CMD_ID_ATA = 0xEC,
115 ATA_CMD_ID_ATAPI = 0xA1,
116 ATA_CMD_READ = 0xC8,
117 ATA_CMD_READ_EXT = 0x25,
118 ATA_CMD_WRITE = 0xCA,
119 ATA_CMD_WRITE_EXT = 0x35,
120 ATA_CMD_PIO_READ = 0x20,
121 ATA_CMD_PIO_READ_EXT = 0x24,
122 ATA_CMD_PIO_WRITE = 0x30,
123 ATA_CMD_PIO_WRITE_EXT = 0x34,
124 ATA_CMD_SET_FEATURES = 0xEF,
125 ATA_CMD_PACKET = 0xA0,
126 ATA_CMD_VERIFY = 0x40,
127 ATA_CMD_VERIFY_EXT = 0x42,
Albert Lee8bf62ece2005-05-12 15:29:42 -0400128 ATA_CMD_INIT_DEV_PARAMS = 0x91,
Linus Torvalds1da177e2005-04-16 15:20:36 -0700129
130 /* SETFEATURES stuff */
131 SETFEATURES_XFER = 0x03,
132 XFER_UDMA_7 = 0x47,
133 XFER_UDMA_6 = 0x46,
134 XFER_UDMA_5 = 0x45,
135 XFER_UDMA_4 = 0x44,
136 XFER_UDMA_3 = 0x43,
137 XFER_UDMA_2 = 0x42,
138 XFER_UDMA_1 = 0x41,
139 XFER_UDMA_0 = 0x40,
140 XFER_MW_DMA_2 = 0x22,
141 XFER_MW_DMA_1 = 0x21,
142 XFER_MW_DMA_0 = 0x20,
143 XFER_PIO_4 = 0x0C,
144 XFER_PIO_3 = 0x0B,
145 XFER_PIO_2 = 0x0A,
146 XFER_PIO_1 = 0x09,
147 XFER_PIO_0 = 0x08,
148 XFER_SW_DMA_2 = 0x12,
149 XFER_SW_DMA_1 = 0x11,
150 XFER_SW_DMA_0 = 0x10,
151 XFER_PIO_SLOW = 0x00,
152
153 /* ATAPI stuff */
154 ATAPI_PKT_DMA = (1 << 0),
155 ATAPI_DMADIR = (1 << 2), /* ATAPI data dir:
156 0=to device, 1=to host */
157 ATAPI_CDB_LEN = 16,
158
159 /* cable types */
160 ATA_CBL_NONE = 0,
161 ATA_CBL_PATA40 = 1,
162 ATA_CBL_PATA80 = 2,
163 ATA_CBL_PATA_UNK = 3,
164 ATA_CBL_SATA = 4,
165
166 /* SATA Status and Control Registers */
167 SCR_STATUS = 0,
168 SCR_ERROR = 1,
169 SCR_CONTROL = 2,
170 SCR_ACTIVE = 3,
171 SCR_NOTIFICATION = 4,
172
173 /* struct ata_taskfile flags */
174 ATA_TFLAG_LBA48 = (1 << 0), /* enable 48-bit LBA and "HOB" */
175 ATA_TFLAG_ISADDR = (1 << 1), /* enable r/w to nsect/lba regs */
176 ATA_TFLAG_DEVICE = (1 << 2), /* enable r/w to device reg */
177 ATA_TFLAG_WRITE = (1 << 3), /* data dir: host->dev==1 (write) */
Albert Lee8bf62ece2005-05-12 15:29:42 -0400178 ATA_TFLAG_LBA = (1 << 4), /* enable LBA */
Linus Torvalds1da177e2005-04-16 15:20:36 -0700179};
180
181enum ata_tf_protocols {
182 /* ATA taskfile protocols */
183 ATA_PROT_UNKNOWN, /* unknown/invalid */
184 ATA_PROT_NODATA, /* no data */
185 ATA_PROT_PIO, /* PIO single sector */
186 ATA_PROT_PIO_MULT, /* PIO multiple sector */
187 ATA_PROT_DMA, /* DMA */
188 ATA_PROT_ATAPI, /* packet command, PIO data xfer*/
189 ATA_PROT_ATAPI_NODATA, /* packet command, no data */
190 ATA_PROT_ATAPI_DMA, /* packet command with special DMA sauce */
191};
192
193enum ata_ioctls {
194 ATA_IOC_GET_IO32 = 0x309,
195 ATA_IOC_SET_IO32 = 0x324,
196};
197
198/* core structures */
199
200struct ata_prd {
201 u32 addr;
202 u32 flags_len;
203};
204
205struct ata_taskfile {
206 unsigned long flags; /* ATA_TFLAG_xxx */
207 u8 protocol; /* ATA_PROT_xxx */
208
209 u8 ctl; /* control reg */
210
211 u8 hob_feature; /* additional data */
212 u8 hob_nsect; /* to support LBA48 */
213 u8 hob_lbal;
214 u8 hob_lbam;
215 u8 hob_lbah;
216
217 u8 feature;
218 u8 nsect;
219 u8 lbal;
220 u8 lbam;
221 u8 lbah;
222
223 u8 device;
224
225 u8 command; /* IO operation */
226};
227
228#define ata_id_is_ata(id) (((id)[0] & (1 << 15)) == 0)
229#define ata_id_rahead_enabled(id) ((id)[85] & (1 << 6))
230#define ata_id_wcache_enabled(id) ((id)[85] & (1 << 5))
231#define ata_id_has_flush(id) ((id)[83] & (1 << 12))
232#define ata_id_has_flush_ext(id) ((id)[83] & (1 << 13))
233#define ata_id_has_lba48(id) ((id)[83] & (1 << 10))
234#define ata_id_has_wcache(id) ((id)[82] & (1 << 5))
235#define ata_id_has_pm(id) ((id)[82] & (1 << 3))
236#define ata_id_has_lba(id) ((id)[49] & (1 << 9))
237#define ata_id_has_dma(id) ((id)[49] & (1 << 8))
238#define ata_id_removeable(id) ((id)[0] & (1 << 7))
239#define ata_id_u32(id,n) \
240 (((u32) (id)[(n) + 1] << 16) | ((u32) (id)[(n)]))
241#define ata_id_u64(id,n) \
242 ( ((u64) (id)[(n) + 3] << 48) | \
243 ((u64) (id)[(n) + 2] << 32) | \
244 ((u64) (id)[(n) + 1] << 16) | \
245 ((u64) (id)[(n) + 0]) )
246
Albert Lee8bf62ece2005-05-12 15:29:42 -0400247static inline int ata_id_current_chs_valid(u16 *id)
248{
249 /* For ATA-1 devices, if the INITIALIZE DEVICE PARAMETERS command
250 has not been issued to the device then the values of
251 id[54] to id[56] are vendor specific. */
252 return (id[53] & 0x01) && /* Current translation valid */
253 id[54] && /* cylinders in current translation */
254 id[55] && /* heads in current translation */
255 id[55] <= 16 &&
256 id[56]; /* sectors in current translation */
257}
258
Linus Torvalds1da177e2005-04-16 15:20:36 -0700259static inline int atapi_cdb_len(u16 *dev_id)
260{
261 u16 tmp = dev_id[0] & 0x3;
262 switch (tmp) {
263 case 0: return 12;
264 case 1: return 16;
265 default: return -1;
266 }
267}
268
269static inline int is_atapi_taskfile(struct ata_taskfile *tf)
270{
271 return (tf->protocol == ATA_PROT_ATAPI) ||
272 (tf->protocol == ATA_PROT_ATAPI_NODATA) ||
273 (tf->protocol == ATA_PROT_ATAPI_DMA);
274}
275
276static inline int ata_ok(u8 status)
277{
278 return ((status & (ATA_BUSY | ATA_DRDY | ATA_DF | ATA_DRQ | ATA_ERR))
279 == ATA_DRDY);
280}
281
282#endif /* __LINUX_ATA_H__ */