ftp://ftp.kernel.org/pub/linux/kernel/v2.6/linux-2.6.6.tar.bz2
[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_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),
46
47         ATA_PCI_CTL_OFS         = 2,
48         ATA_SERNO_LEN           = 20,
49         ATA_UDMA0               = (1 << 0),
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?).  */
58
59         ATA_UDMA_MASK_40C       = ATA_UDMA2,    /* udma0-2 */
60
61         /* DMA-related */
62         ATA_PRD_SZ              = 8,
63         ATA_PRD_TBL_SZ          = (ATA_MAX_PRD * ATA_PRD_SZ),
64         ATA_PRD_EOT             = (1 << 31),    /* end-of-table flag */
65
66         ATA_DMA_TABLE_OFS       = 4,
67         ATA_DMA_STATUS          = 2,
68         ATA_DMA_CMD             = 0,
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),
74
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 */
87
88         /* ATA command block registers */
89         ATA_REG_DATA            = 0x00,
90         ATA_REG_ERR             = 0x01,
91         ATA_REG_NSECT           = 0x02,
92         ATA_REG_LBAL            = 0x03,
93         ATA_REG_LBAM            = 0x04,
94         ATA_REG_LBAH            = 0x05,
95         ATA_REG_DEVICE          = 0x06,
96         ATA_REG_STATUS          = 0x07,
97
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,
104
105         /* ATA device commands */
106         ATA_CMD_EDD             = 0x90, /* execute device diagnostic */
107         ATA_CMD_ID_ATA          = 0xEC,
108         ATA_CMD_ID_ATAPI        = 0xA1,
109         ATA_CMD_READ            = 0xC8,
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,
119
120         /* SETFEATURES stuff */
121         SETFEATURES_XFER        = 0x03,
122         XFER_UDMA_7             = 0x47,
123         XFER_UDMA_6             = 0x46,
124         XFER_UDMA_5             = 0x45,
125         XFER_UDMA_4             = 0x44,
126         XFER_UDMA_3             = 0x43,
127         XFER_UDMA_2             = 0x42,
128         XFER_UDMA_1             = 0x41,
129         XFER_UDMA_0             = 0x40,
130         XFER_PIO_4              = 0x0C,
131         XFER_PIO_3              = 0x0B,
132
133         /* ATAPI stuff */
134         ATAPI_PKT_DMA           = (1 << 0),
135
136         /* cable types */
137         ATA_CBL_NONE            = 0,
138         ATA_CBL_PATA40          = 1,
139         ATA_CBL_PATA80          = 2,
140         ATA_CBL_PATA_UNK        = 3,
141         ATA_CBL_SATA            = 4,
142
143         /* SATA Status and Control Registers */
144         SCR_STATUS              = 0,
145         SCR_ERROR               = 1,
146         SCR_CONTROL             = 2,
147         SCR_ACTIVE              = 3,
148         SCR_NOTIFICATION        = 4,
149
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) */
155 };
156
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 */
166 };
167
168 /* core structures */
169
170 struct ata_prd {
171         u32                     addr;
172         u32                     flags_len;
173 } __attribute__((packed));
174
175 struct ata_taskfile {
176         unsigned long           flags;          /* ATA_TFLAG_xxx */
177         u8                      protocol;       /* ATA_PROT_xxx */
178
179         u8                      ctl;            /* control reg */
180
181         u8                      hob_feature;    /* additional data */
182         u8                      hob_nsect;      /* to support LBA48 */
183         u8                      hob_lbal;
184         u8                      hob_lbam;
185         u8                      hob_lbah;
186
187         u8                      feature;
188         u8                      nsect;
189         u8                      lbal;
190         u8                      lbam;
191         u8                      lbah;
192
193         u8                      device;
194
195         u8                      command;        /* IO operation */
196 };
197
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]) )
209
210 #endif /* __LINUX_ATA_H__ */