VServer 1.9.2 (patch-2.6.8.1-vs1.9.2.diff)
[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_DEVICE_OBS          = (1 << 7) | (1 << 5), /* obs bits in dev reg */
82         ATA_DEVCTL_OBS          = (1 << 3),     /* obsolete bit in devctl reg */
83         ATA_BUSY                = (1 << 7),     /* BSY status bit */
84         ATA_DRDY                = (1 << 6),     /* device ready */
85         ATA_DF                  = (1 << 5),     /* device fault */
86         ATA_DRQ                 = (1 << 3),     /* data request i/o */
87         ATA_ERR                 = (1 << 0),     /* have an error */
88         ATA_SRST                = (1 << 2),     /* software reset */
89         ATA_ABORTED             = (1 << 2),     /* command aborted */
90
91         /* ATA command block registers */
92         ATA_REG_DATA            = 0x00,
93         ATA_REG_ERR             = 0x01,
94         ATA_REG_NSECT           = 0x02,
95         ATA_REG_LBAL            = 0x03,
96         ATA_REG_LBAM            = 0x04,
97         ATA_REG_LBAH            = 0x05,
98         ATA_REG_DEVICE          = 0x06,
99         ATA_REG_STATUS          = 0x07,
100
101         ATA_REG_FEATURE         = ATA_REG_ERR, /* and their aliases */
102         ATA_REG_CMD             = ATA_REG_STATUS,
103         ATA_REG_BYTEL           = ATA_REG_LBAM,
104         ATA_REG_BYTEH           = ATA_REG_LBAH,
105         ATA_REG_DEVSEL          = ATA_REG_DEVICE,
106         ATA_REG_IRQ             = ATA_REG_NSECT,
107
108         /* ATA device commands */
109         ATA_CMD_CHK_POWER       = 0xE5, /* check power mode */
110         ATA_CMD_EDD             = 0x90, /* execute device diagnostic */
111         ATA_CMD_FLUSH           = 0xE7,
112         ATA_CMD_FLUSH_EXT       = 0xEA,
113         ATA_CMD_ID_ATA          = 0xEC,
114         ATA_CMD_ID_ATAPI        = 0xA1,
115         ATA_CMD_READ            = 0xC8,
116         ATA_CMD_READ_EXT        = 0x25,
117         ATA_CMD_WRITE           = 0xCA,
118         ATA_CMD_WRITE_EXT       = 0x35,
119         ATA_CMD_PIO_READ        = 0x20,
120         ATA_CMD_PIO_READ_EXT    = 0x24,
121         ATA_CMD_PIO_WRITE       = 0x30,
122         ATA_CMD_PIO_WRITE_EXT   = 0x34,
123         ATA_CMD_SET_FEATURES    = 0xEF,
124         ATA_CMD_PACKET          = 0xA0,
125
126         /* SETFEATURES stuff */
127         SETFEATURES_XFER        = 0x03,
128         XFER_UDMA_7             = 0x47,
129         XFER_UDMA_6             = 0x46,
130         XFER_UDMA_5             = 0x45,
131         XFER_UDMA_4             = 0x44,
132         XFER_UDMA_3             = 0x43,
133         XFER_UDMA_2             = 0x42,
134         XFER_UDMA_1             = 0x41,
135         XFER_UDMA_0             = 0x40,
136         XFER_PIO_4              = 0x0C,
137         XFER_PIO_3              = 0x0B,
138
139         /* ATAPI stuff */
140         ATAPI_PKT_DMA           = (1 << 0),
141         ATAPI_DMADIR            = (1 << 2),     /* ATAPI data dir:
142                                                    0=to device, 1=to host */
143
144         /* cable types */
145         ATA_CBL_NONE            = 0,
146         ATA_CBL_PATA40          = 1,
147         ATA_CBL_PATA80          = 2,
148         ATA_CBL_PATA_UNK        = 3,
149         ATA_CBL_SATA            = 4,
150
151         /* SATA Status and Control Registers */
152         SCR_STATUS              = 0,
153         SCR_ERROR               = 1,
154         SCR_CONTROL             = 2,
155         SCR_ACTIVE              = 3,
156         SCR_NOTIFICATION        = 4,
157
158         /* struct ata_taskfile flags */
159         ATA_TFLAG_LBA48         = (1 << 0), /* enable 48-bit LBA and "HOB" */
160         ATA_TFLAG_ISADDR        = (1 << 1), /* enable r/w to nsect/lba regs */
161         ATA_TFLAG_DEVICE        = (1 << 2), /* enable r/w to device reg */
162         ATA_TFLAG_WRITE         = (1 << 3), /* data dir: host->dev==1 (write) */
163 };
164
165 enum ata_tf_protocols {
166         /* ATA taskfile protocols */
167         ATA_PROT_UNKNOWN,       /* unknown/invalid */
168         ATA_PROT_NODATA,        /* no data */
169         ATA_PROT_PIO,           /* PIO single sector */
170         ATA_PROT_PIO_MULT,      /* PIO multiple sector */
171         ATA_PROT_DMA,           /* DMA */
172         ATA_PROT_ATAPI,         /* packet command */
173         ATA_PROT_ATAPI_DMA,     /* packet command with special DMA sauce */
174 };
175
176 /* core structures */
177
178 struct ata_prd {
179         u32                     addr;
180         u32                     flags_len;
181 } __attribute__((packed));
182
183 struct ata_taskfile {
184         unsigned long           flags;          /* ATA_TFLAG_xxx */
185         u8                      protocol;       /* ATA_PROT_xxx */
186
187         u8                      ctl;            /* control reg */
188
189         u8                      hob_feature;    /* additional data */
190         u8                      hob_nsect;      /* to support LBA48 */
191         u8                      hob_lbal;
192         u8                      hob_lbam;
193         u8                      hob_lbah;
194
195         u8                      feature;
196         u8                      nsect;
197         u8                      lbal;
198         u8                      lbam;
199         u8                      lbah;
200
201         u8                      device;
202
203         u8                      command;        /* IO operation */
204 };
205
206 #define ata_id_is_ata(dev)      (((dev)->id[0] & (1 << 15)) == 0)
207 #define ata_id_rahead_enabled(dev) ((dev)->id[85] & (1 << 6))
208 #define ata_id_wcache_enabled(dev) ((dev)->id[85] & (1 << 5))
209 #define ata_id_has_lba48(dev)   ((dev)->id[83] & (1 << 10))
210 #define ata_id_has_wcache(dev)  ((dev)->id[82] & (1 << 5))
211 #define ata_id_has_pm(dev)      ((dev)->id[82] & (1 << 3))
212 #define ata_id_has_lba(dev)     ((dev)->id[49] & (1 << 9))
213 #define ata_id_has_dma(dev)     ((dev)->id[49] & (1 << 8))
214 #define ata_id_removeable(dev)  ((dev)->id[0] & (1 << 7))
215 #define ata_id_u32(dev,n)       \
216         (((u32) (dev)->id[(n) + 1] << 16) | ((u32) (dev)->id[(n)]))
217 #define ata_id_u64(dev,n)       \
218         ( ((u64) dev->id[(n) + 3] << 48) |      \
219           ((u64) dev->id[(n) + 2] << 32) |      \
220           ((u64) dev->id[(n) + 1] << 16) |      \
221           ((u64) dev->id[(n) + 0]) )
222
223 static inline int is_atapi_taskfile(struct ata_taskfile *tf)
224 {
225         return (tf->protocol == ATA_PROT_ATAPI) ||
226                (tf->protocol == ATA_PROT_ATAPI_DMA);
227 }
228
229 static inline int ata_ok(u8 status)
230 {
231         return ((status & (ATA_BUSY | ATA_DRDY | ATA_DF | ATA_DRQ | ATA_ERR))
232                         == ATA_DRDY);
233 }
234
235 #endif /* __LINUX_ATA_H__ */