source: svn/trunk/newcon3bcm2_21bu/toolchain/mipsel-linux-uclibc/include/linux/ata.h @ 29

Last change on this file since 29 was 2, checked in by jglee, 11 years ago

first commit

  • Property svn:executable set to *
File size: 7.4 KB
Line 
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#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,
128
129        /* SETFEATURES stuff */
130        SETFEATURES_XFER        = 0x03,
131        XFER_UDMA_7             = 0x47,
132        XFER_UDMA_6             = 0x46,
133        XFER_UDMA_5             = 0x45,
134        XFER_UDMA_4             = 0x44,
135        XFER_UDMA_3             = 0x43,
136        XFER_UDMA_2             = 0x42,
137        XFER_UDMA_1             = 0x41,
138        XFER_UDMA_0             = 0x40,
139        XFER_MW_DMA_2           = 0x22,
140        XFER_MW_DMA_1           = 0x21,
141        XFER_MW_DMA_0           = 0x20,
142        XFER_PIO_4              = 0x0C,
143        XFER_PIO_3              = 0x0B,
144        XFER_PIO_2              = 0x0A,
145        XFER_PIO_1              = 0x09,
146        XFER_PIO_0              = 0x08,
147        XFER_SW_DMA_2           = 0x12,
148        XFER_SW_DMA_1           = 0x11,
149        XFER_SW_DMA_0           = 0x10,
150        XFER_PIO_SLOW           = 0x00,
151
152        /* ATAPI stuff */
153        ATAPI_PKT_DMA           = (1 << 0),
154        ATAPI_DMADIR            = (1 << 2),     /* ATAPI data dir:
155                                                   0=to device, 1=to host */
156        ATAPI_CDB_LEN           = 16,
157
158        /* cable types */
159        ATA_CBL_NONE            = 0,
160        ATA_CBL_PATA40          = 1,
161        ATA_CBL_PATA80          = 2,
162        ATA_CBL_PATA_UNK        = 3,
163        ATA_CBL_SATA            = 4,
164
165        /* SATA Status and Control Registers */
166        SCR_STATUS              = 0,
167        SCR_ERROR               = 1,
168        SCR_CONTROL             = 2,
169        SCR_ACTIVE              = 3,
170        SCR_NOTIFICATION        = 4,
171
172        /* struct ata_taskfile flags */
173        ATA_TFLAG_LBA48         = (1 << 0), /* enable 48-bit LBA and "HOB" */
174        ATA_TFLAG_ISADDR        = (1 << 1), /* enable r/w to nsect/lba regs */
175        ATA_TFLAG_DEVICE        = (1 << 2), /* enable r/w to device reg */
176        ATA_TFLAG_WRITE         = (1 << 3), /* data dir: host->dev==1 (write) */
177};
178
179enum ata_tf_protocols {
180        /* ATA taskfile protocols */
181        ATA_PROT_UNKNOWN,       /* unknown/invalid */
182        ATA_PROT_NODATA,        /* no data */
183        ATA_PROT_PIO,           /* PIO single sector */
184        ATA_PROT_PIO_MULT,      /* PIO multiple sector */
185        ATA_PROT_DMA,           /* DMA */
186        ATA_PROT_ATAPI,         /* packet command, PIO data xfer*/
187        ATA_PROT_ATAPI_NODATA,  /* packet command, no data */
188        ATA_PROT_ATAPI_DMA,     /* packet command with special DMA sauce */
189};
190
191enum ata_ioctls {
192        ATA_IOC_GET_IO32        = 0x309,
193        ATA_IOC_SET_IO32        = 0x324,
194};
195
196/* core structures */
197
198struct ata_prd {
199        __u32                   addr;
200        __u32                   flags_len;
201};
202
203struct ata_taskfile {
204        unsigned long           flags;          /* ATA_TFLAG_xxx */
205        __u8                    protocol;       /* ATA_PROT_xxx */
206
207        __u8                    ctl;            /* control reg */
208
209        __u8                    hob_feature;    /* additional data */
210        __u8                    hob_nsect;      /* to support LBA48 */
211        __u8                    hob_lbal;
212        __u8                    hob_lbam;
213        __u8                    hob_lbah;
214
215        __u8                    feature;
216        __u8                    nsect;
217        __u8                    lbal;
218        __u8                    lbam;
219        __u8                    lbah;
220
221        __u8                    device;
222
223        __u8                    command;        /* IO operation */
224};
225
226#define ata_id_is_ata(id)       (((id)[0] & (1 << 15)) == 0)
227#define ata_id_rahead_enabled(id) ((id)[85] & (1 << 6))
228#define ata_id_wcache_enabled(id) ((id)[85] & (1 << 5))
229#define ata_id_has_flush(id) ((id)[83] & (1 << 12))
230#define ata_id_has_flush_ext(id) ((id)[83] & (1 << 13))
231#define ata_id_has_lba48(id)    ((id)[83] & (1 << 10))
232#define ata_id_has_wcache(id)   ((id)[82] & (1 << 5))
233#define ata_id_has_pm(id)       ((id)[82] & (1 << 3))
234#define ata_id_has_lba(id)      ((id)[49] & (1 << 9))
235#define ata_id_has_dma(id)      ((id)[49] & (1 << 8))
236#define ata_id_removeable(id)   ((id)[0] & (1 << 7))
237#define ata_id_u32(id,n)        \
238        (((__u32) (id)[(n) + 1] << 16) | ((__u32) (id)[(n)]))
239#define ata_id_u64(id,n)        \
240        ( ((__u64) (id)[(n) + 3] << 48) |       \
241          ((__u64) (id)[(n) + 2] << 32) |       \
242          ((__u64) (id)[(n) + 1] << 16) |       \
243          ((__u64) (id)[(n) + 0]) )
244
245static inline int atapi_cdb_len(__u16 *dev_id)
246{
247        __u16 tmp = dev_id[0] & 0x3;
248        switch (tmp) {
249        case 0:         return 12;
250        case 1:         return 16;
251        default:        return -1;
252        }
253}
254
255static inline int is_atapi_taskfile(struct ata_taskfile *tf)
256{
257        return (tf->protocol == ATA_PROT_ATAPI) ||
258               (tf->protocol == ATA_PROT_ATAPI_NODATA) ||
259               (tf->protocol == ATA_PROT_ATAPI_DMA);
260}
261
262static inline int ata_ok(__u8 status)
263{
264        return ((status & (ATA_BUSY | ATA_DRDY | ATA_DF | ATA_DRQ | ATA_ERR))
265                        == ATA_DRDY);
266}
267
268#endif /* __LINUX_ATA_H__ */
Note: See TracBrowser for help on using the repository browser.