1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24#ifndef __LINUX_ATA_H__
25#define __LINUX_ATA_H__
26
27#include <linux/types.h>
28
29
30#define ATA_DMA_BOUNDARY 0xffffUL
31#define ATA_DMA_MASK 0xffffffffULL
32
33enum {
34
35 ATA_MAX_DEVICES = 2,
36 ATA_MAX_PRD = 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
60
61 ATA_UDMA_MASK_40C = ATA_UDMA2,
62
63
64 ATA_PRD_SZ = 8,
65 ATA_PRD_TBL_SZ = (ATA_MAX_PRD * ATA_PRD_SZ),
66 ATA_PRD_EOT = (1 << 31),
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
78 ATA_HOB = (1 << 7),
79 ATA_NIEN = (1 << 1),
80 ATA_LBA = (1 << 6),
81 ATA_DEV1 = (1 << 4),
82 ATA_DEVICE_OBS = (1 << 7) | (1 << 5),
83 ATA_DEVCTL_OBS = (1 << 3),
84 ATA_BUSY = (1 << 7),
85 ATA_DRDY = (1 << 6),
86 ATA_DF = (1 << 5),
87 ATA_DRQ = (1 << 3),
88 ATA_ERR = (1 << 0),
89 ATA_SRST = (1 << 2),
90 ATA_ABORTED = (1 << 2),
91
92
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,
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
110 ATA_CMD_CHK_POWER = 0xE5,
111 ATA_CMD_EDD = 0x90,
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
127
128 SETFEATURES_XFER = 0x03,
129 XFER_UDMA_7 = 0x47,
130 XFER_UDMA_6 = 0x46,
131 XFER_UDMA_5 = 0x45,
132 XFER_UDMA_4 = 0x44,
133 XFER_UDMA_3 = 0x43,
134 XFER_UDMA_2 = 0x42,
135 XFER_UDMA_1 = 0x41,
136 XFER_UDMA_0 = 0x40,
137 XFER_MW_DMA_2 = 0x22,
138 XFER_MW_DMA_1 = 0x21,
139 XFER_MW_DMA_0 = 0x20,
140 XFER_PIO_4 = 0x0C,
141 XFER_PIO_3 = 0x0B,
142 XFER_PIO_2 = 0x0A,
143 XFER_PIO_1 = 0x09,
144 XFER_PIO_0 = 0x08,
145 XFER_SW_DMA_2 = 0x12,
146 XFER_SW_DMA_1 = 0x11,
147 XFER_SW_DMA_0 = 0x10,
148 XFER_PIO_SLOW = 0x00,
149
150
151 ATAPI_PKT_DMA = (1 << 0),
152 ATAPI_DMADIR = (1 << 2),
153
154 ATAPI_CDB_LEN = 16,
155
156
157 ATA_CBL_NONE = 0,
158 ATA_CBL_PATA40 = 1,
159 ATA_CBL_PATA80 = 2,
160 ATA_CBL_PATA_UNK = 3,
161 ATA_CBL_SATA = 4,
162
163
164 SCR_STATUS = 0,
165 SCR_ERROR = 1,
166 SCR_CONTROL = 2,
167 SCR_ACTIVE = 3,
168 SCR_NOTIFICATION = 4,
169
170
171 ATA_TFLAG_LBA48 = (1 << 0),
172 ATA_TFLAG_ISADDR = (1 << 1),
173 ATA_TFLAG_DEVICE = (1 << 2),
174 ATA_TFLAG_WRITE = (1 << 3),
175};
176
177enum ata_tf_protocols {
178
179 ATA_PROT_UNKNOWN,
180 ATA_PROT_NODATA,
181 ATA_PROT_PIO,
182 ATA_PROT_PIO_MULT,
183 ATA_PROT_DMA,
184 ATA_PROT_ATAPI,
185 ATA_PROT_ATAPI_NODATA,
186 ATA_PROT_ATAPI_DMA,
187};
188
189enum ata_ioctls {
190 ATA_IOC_GET_IO32 = 0x309,
191 ATA_IOC_SET_IO32 = 0x324,
192};
193
194
195
196struct ata_prd {
197 u32 addr;
198 u32 flags_len;
199};
200
201struct ata_taskfile {
202 unsigned long flags;
203 u8 protocol;
204
205 u8 ctl;
206
207 u8 hob_feature;
208 u8 hob_nsect;
209 u8 hob_lbal;
210 u8 hob_lbam;
211 u8 hob_lbah;
212
213 u8 feature;
214 u8 nsect;
215 u8 lbal;
216 u8 lbam;
217 u8 lbah;
218
219 u8 device;
220
221 u8 command;
222};
223
224#define ata_id_is_ata(id) (((id)[0] & (1 << 15)) == 0)
225#define ata_id_rahead_enabled(id) ((id)[85] & (1 << 6))
226#define ata_id_wcache_enabled(id) ((id)[85] & (1 << 5))
227#define ata_id_has_flush(id) ((id)[83] & (1 << 12))
228#define ata_id_has_flush_ext(id) ((id)[83] & (1 << 13))
229#define ata_id_has_lba48(id) ((id)[83] & (1 << 10))
230#define ata_id_has_wcache(id) ((id)[82] & (1 << 5))
231#define ata_id_has_pm(id) ((id)[82] & (1 << 3))
232#define ata_id_has_lba(id) ((id)[49] & (1 << 9))
233#define ata_id_has_dma(id) ((id)[49] & (1 << 8))
234#define ata_id_removeable(id) ((id)[0] & (1 << 7))
235#define ata_id_u32(id,n) \
236 (((u32) (id)[(n) + 1] << 16) | ((u32) (id)[(n)]))
237#define ata_id_u64(id,n) \
238 ( ((u64) (id)[(n) + 3] << 48) | \
239 ((u64) (id)[(n) + 2] << 32) | \
240 ((u64) (id)[(n) + 1] << 16) | \
241 ((u64) (id)[(n) + 0]) )
242
243static inline int atapi_cdb_len(u16 *dev_id)
244{
245 u16 tmp = dev_id[0] & 0x3;
246 switch (tmp) {
247 case 0: return 12;
248 case 1: return 16;
249 default: return -1;
250 }
251}
252
253static inline int is_atapi_taskfile(struct ata_taskfile *tf)
254{
255 return (tf->protocol == ATA_PROT_ATAPI) ||
256 (tf->protocol == ATA_PROT_ATAPI_NODATA) ||
257 (tf->protocol == ATA_PROT_ATAPI_DMA);
258}
259
260static inline int ata_ok(u8 status)
261{
262 return ((status & (ATA_BUSY | ATA_DRDY | ATA_DF | ATA_DRQ | ATA_ERR))
263 == ATA_DRDY);
264}
265
266#endif
267