patch-2_6_7-vs1_9_1_12
[linux-2.6.git] / include / linux / ata.h
1
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 /* defines only for the constants which don't work well as enums */
28 #define ATA_DMA_BOUNDARY        0xffffUL
29 #define ATA_DMA_MASK            0xffffffffULL
30
31 enum {
32         /* various global constants */
33         ATA_MAX_DEVICES         = 2,    /* per bus/port */
34         ATA_MAX_PRD             = 256,  /* we could make these 256/256 */
35         ATA_SECT_SIZE           = 512,
36         ATA_SECT_SIZE_MASK      = (ATA_SECT_SIZE - 1),
37         ATA_SECT_DWORDS         = ATA_SECT_SIZE / sizeof(u32),
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_UDMA_MODES       = 88,
46         ATA_ID_PIO4             = (1 << 1),
47
48         ATA_PCI_CTL_OFS         = 2,
49         ATA_SERNO_LEN           = 20,
50         ATA_UDMA0               = (1 << 0),
51         ATA_UDMA1               = ATA_UDMA0 | (1 << 1),
52         ATA_UDMA2               = ATA_UDMA1 | (1 << 2),
53         ATA_UDMA3               = ATA_UDMA2 | (1 << 3),
54         ATA_UDMA4               = ATA_UDMA3 | (1 << 4),
55         ATA_UDMA5               = ATA_UDMA4 | (1 << 5),
56         ATA_UDMA6               = ATA_UDMA5 | (1 << 6),
57         ATA_UDMA7               = ATA_UDMA6 | (1 << 7),
58         /* ATA_UDMA7 is just for completeness... doesn't exist (yet?).  */
59
60         ATA_UDMA_MASK_40C       = ATA_UDMA2,    /* udma0-2 */
61
62         /* DMA-related */
63         ATA_PRD_SZ              = 8,
64         ATA_PRD_TBL_SZ          = (ATA_MAX_PRD * ATA_PRD_SZ),
65         ATA_PRD_EOT             = (1 << 31),    /* end-of-table flag */
66
67         ATA_DMA_TABLE_OFS       = 4,
68         ATA_DMA_STATUS          = 2,
69         ATA_DMA_CMD             = 0,
70         ATA_DMA_WR              = (1 << 3),
71         ATA_DMA_START           = (1 << 0),
72         ATA_DMA_INTR            = (1 << 2),
73         ATA_DMA_ERR             = (1 << 1),
74         ATA_DMA_ACTIVE          = (1 << 0),
75
76         /* bits in ATA command block registers */
77         ATA_HOB                 = (1 << 7),     /* LBA48 selector */
78         ATA_NIEN                = (1 << 1),     /* disable-irq flag */
79         ATA_LBA                 = (1 << 6),     /* LBA28 selector */
80         ATA_DEV1                = (1 << 4),     /* Select Device 1 (slave) */
81         ATA_BUSY                = (1 << 7),     /* BSY status bit */
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_DRQ                 = (1 << 3),     /* data request i/o */
85         ATA_ERR                 = (1 << 0),     /* have an error */
86         ATA_SRST                = (1 << 2),     /* software reset */
87         ATA_ABORTED             = (1 << 2),     /* command aborted */
88
89         /* ATA command block registers */
90         ATA_REG_DATA            = 0x00,
91         ATA_REG_ERR             = 0x01,
92         ATA_REG_NSECT           = 0x02,
93         ATA_REG_LBAL            = 0x03,
94         ATA_REG_LBAM            = 0x04,
95         ATA_REG_LBAH            = 0x05,
96         ATA_REG_DEVICE          = 0x06,
97         ATA_REG_STATUS          = 0x07,
98
99         ATA_REG_FEATURE         = ATA_REG_ERR, /* and their aliases */
100         ATA_REG_CMD             = ATA_REG_STATUS,
101         ATA_REG_BYTEL           = ATA_REG_LBAM,
102         ATA_REG_BYTEH           = ATA_REG_LBAH,
103         ATA_REG_DEVSEL          = ATA_REG_DEVICE,
104         ATA_REG_IRQ             = ATA_REG_NSECT,
105
106         /* ATA device commands */
107         ATA_CMD_CHK_POWER       = 0xE5, /* check power mode */
108         ATA_CMD_EDD             = 0x90, /* execute device diagnostic */
109         ATA_CMD_FLUSH           = 0xE7,
110         ATA_CMD_FLUSH_EXT       = 0xEA,
111         ATA_CMD_ID_ATA          = 0xEC,
112         ATA_CMD_ID_ATAPI        = 0xA1,
113         ATA_CMD_READ            = 0xC8,
114         ATA_CMD_READ_EXT        = 0x25,
115         ATA_CMD_WRITE           = 0xCA,
116         ATA_CMD_WRITE_EXT       = 0x35,
117         ATA_CMD_PIO_READ        = 0x20,
118         ATA_CMD_PIO_READ_EXT    = 0x24,
119         ATA_CMD_PIO_WRITE       = 0x30,
120         ATA_CMD_PIO_WRITE_EXT   = 0x34,
121         ATA_CMD_SET_FEATURES    = 0xEF,
122         ATA_CMD_PACKET          = 0xA0,
123
124         /* SETFEATURES stuff */
125         SETFEATURES_XFER        = 0x03,
126         XFER_UDMA_7             = 0x47,
127         XFER_UDMA_6             = 0x46,
128         XFER_UDMA_5             = 0x45,
129         XFER_UDMA_4             = 0x44,
130         XFER_UDMA_3             = 0x43,
131         XFER_UDMA_2             = 0x42,
132         XFER_UDMA_1             = 0x41,
133         XFER_UDMA_0             = 0x40,
134         XFER_PIO_4              = 0x0C,
135         XFER_PIO_3              = 0x0B,
136
137         /* ATAPI stuff */
138         ATAPI_PKT_DMA           = (1 << 0),
139         ATAPI_DMADIR            = (1 << 2),     /* ATAPI data dir:
140                                                    0=to device, 1=to host */
141
142         /* cable types */
143         ATA_CBL_NONE            = 0,
144         ATA_CBL_PATA40          = 1,
145         ATA_CBL_PATA80          = 2,
146         ATA_CBL_PATA_UNK        = 3,
147         ATA_CBL_SATA            = 4,
148
149         /* SATA Status and Control Registers */
150         SCR_STATUS              = 0,
151         SCR_ERROR               = 1,
152         SCR_CONTROL             = 2,
153         SCR_ACTIVE              = 3,
154         SCR_NOTIFICATION        = 4,
155
156         /* struct ata_taskfile flags */
157         ATA_TFLAG_LBA48         = (1 << 0), /* enable 48-bit LBA and "HOB" */
158         ATA_TFLAG_ISADDR        = (1 << 1), /* enable r/w to nsect/lba regs */
159         ATA_TFLAG_DEVICE        = (1 << 2), /* enable r/w to device reg */
160         ATA_TFLAG_WRITE         = (1 << 3), /* data dir: host->dev==1 (write) */
161 };
162
163 enum ata_tf_protocols {
164         /* ATA taskfile protocols */
165         ATA_PROT_UNKNOWN,       /* unknown/invalid */
166         ATA_PROT_NODATA,        /* no data */
167         ATA_PROT_PIO,           /* PIO single sector */
168         ATA_PROT_PIO_MULT,      /* PIO multiple sector */
169         ATA_PROT_DMA,           /* DMA */
170         ATA_PROT_ATAPI,         /* packet command */
171         ATA_PROT_ATAPI_DMA,     /* packet command with special DMA sauce */
172 };
173
174 /* core structures */
175
176 struct ata_prd {
177         u32                     addr;
178         u32                     flags_len;
179 } __attribute__((packed));
180
181 struct ata_taskfile {
182         unsigned long           flags;          /* ATA_TFLAG_xxx */
183         u8                      protocol;       /* ATA_PROT_xxx */
184
185         u8                      ctl;            /* control reg */
186
187         u8                      hob_feature;    /* additional data */
188         u8                      hob_nsect;      /* to support LBA48 */
189         u8                      hob_lbal;
190         u8                      hob_lbam;
191         u8                      hob_lbah;
192
193         u8                      feature;
194         u8                      nsect;
195         u8                      lbal;
196         u8                      lbam;
197         u8                      lbah;
198
199         u8                      device;
200
201         u8                      command;        /* IO operation */
202 };
203
204 #define ata_id_is_ata(dev)      (((dev)->id[0] & (1 << 15)) == 0)
205 #define ata_id_rahead_enabled(dev) ((dev)->id[85] & (1 << 6))
206 #define ata_id_wcache_enabled(dev) ((dev)->id[85] & (1 << 5))
207 #define ata_id_has_lba48(dev)   ((dev)->id[83] & (1 << 10))
208 #define ata_id_has_wcache(dev)  ((dev)->id[82] & (1 << 5))
209 #define ata_id_has_pm(dev)      ((dev)->id[82] & (1 << 3))
210 #define ata_id_has_lba(dev)     ((dev)->id[49] & (1 << 8))
211 #define ata_id_has_dma(dev)     ((dev)->id[49] & (1 << 9))
212 #define ata_id_removeable(dev)  ((dev)->id[0] & (1 << 7))
213 #define ata_id_u32(dev,n)       \
214         (((u32) (dev)->id[(n) + 1] << 16) | ((u32) (dev)->id[(n)]))
215 #define ata_id_u64(dev,n)       \
216         ( ((u64) dev->id[(n) + 3] << 48) |      \
217           ((u64) dev->id[(n) + 2] << 32) |      \
218           ((u64) dev->id[(n) + 1] << 16) |      \
219           ((u64) dev->id[(n) + 0]) )
220
221 static inline int is_atapi_taskfile(struct ata_taskfile *tf)
222 {
223         return (tf->protocol == ATA_PROT_ATAPI) ||
224                (tf->protocol == ATA_PROT_ATAPI_DMA);
225 }
226
227 #endif /* __LINUX_ATA_H__ */