ata.h revision 144330
1/*-
2 * Copyright (c) 2000 - 2005 S�ren Schmidt <sos@FreeBSD.org>
3 * All rights reserved.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions
7 * are met:
8 * 1. Redistributions of source code must retain the above copyright
9 *    notice, this list of conditions and the following disclaimer,
10 *    without modification, immediately at the beginning of the file.
11 * 2. Redistributions in binary form must reproduce the above copyright
12 *    notice, this list of conditions and the following disclaimer in the
13 *    documentation and/or other materials provided with the distribution.
14 * 3. The name of the author may not be used to endorse or promote products
15 *    derived from this software without specific prior written permission.
16 *
17 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
18 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
19 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
20 * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
21 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
22 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
23 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
24 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
25 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
26 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27 *
28 * $FreeBSD: head/sys/sys/ata.h 144330 2005-03-30 12:03:40Z sos $
29 */
30
31#ifndef _SYS_ATA_H_
32#define _SYS_ATA_H_
33
34#include <sys/ioccom.h>
35
36/* ATA/ATAPI device parameters */
37struct ata_params {
38/*000*/ u_int16_t	config;		/* configuration info */
39#define ATA_PROTO_MASK			0x8003
40#define ATA_PROTO_ATA			0x0000
41#define ATA_PROTO_ATAPI_12		0x8000
42#define ATA_PROTO_ATAPI_16		0x8001
43#define ATA_ATAPI_TYPE_MASK		0x1f00
44#define ATA_ATAPI_TYPE_DIRECT		0x0000	/* disk/floppy */
45#define ATA_ATAPI_TYPE_TAPE		0x0100	/* streaming tape */
46#define ATA_ATAPI_TYPE_CDROM		0x0500	/* CD-ROM device */
47#define ATA_ATAPI_TYPE_OPTICAL		0x0700	/* optical disk */
48#define ATA_DRQ_MASK			0x0060
49#define ATA_DRQ_SLOW			0x0000  /* cpu 3 ms delay */
50#define ATA_DRQ_INTR			0x0020  /* interrupt 10 ms delay */
51#define ATA_DRQ_FAST			0x0040  /* accel 50 us delay */
52
53/*001*/	u_int16_t	cylinders;		/* # of cylinders */
54	u_int16_t	reserved2;
55/*003*/	u_int16_t	heads;			/* # heads */
56	u_int16_t	obsolete4;
57	u_int16_t	obsolete5;
58/*006*/	u_int16_t	sectors;		/* # sectors/track */
59/*007*/	u_int16_t	vendor7[3];
60/*010*/	u_int8_t	serial[20];		/* serial number */
61/*020*/	u_int16_t	retired20;
62	u_int16_t	retired21;
63	u_int16_t	obsolete22;
64/*023*/	u_int8_t	revision[8];		/* firmware revision */
65/*027*/	u_int8_t	model[40];		/* model name */
66/*047*/	u_int16_t	sectors_intr;		/* sectors per interrupt */
67/*048*/	u_int16_t	usedmovsd;		/* double word read/write? */
68/*049*/	u_int16_t	capabilities1;
69#define ATA_SUPPORT_DMA			0x0100
70#define ATA_SUPPORT_LBA			0x0200
71#define ATA_SUPPORT_OVERLAP		0x4000
72
73/*050*/	u_int16_t	capabilities2;
74/*051*/	u_int16_t	retired_piomode;	/* PIO modes 0-2 */
75#define ATA_RETIRED_PIO_MASK		0x0300
76
77/*052*/	u_int16_t	retired_dmamode;	/* DMA modes */
78#define ATA_RETIRED_DMA_MASK		0x0003
79
80/*053*/	u_int16_t	atavalid;		/* fields valid */
81#define ATA_FLAG_54_58			0x0001	/* words 54-58 valid */
82#define ATA_FLAG_64_70			0x0002	/* words 64-70 valid */
83#define ATA_FLAG_88			0x0004	/* word 88 valid */
84
85/*054*/	u_int16_t	current_cylinders;
86/*055*/	u_int16_t	current_heads;
87/*056*/	u_int16_t	current_sectors;
88/*057*/	u_int16_t	current_size_1;
89/*058*/	u_int16_t	current_size_2;
90/*059*/	u_int16_t	multi;
91#define	ATA_MULTI_VALID			0x0100
92
93/*060*/	u_int16_t	lba_size_1;
94	u_int16_t	lba_size_2;
95	u_int16_t	obsolete62;
96/*063*/	u_int16_t	mwdmamodes;		/* multiword DMA modes */
97/*064*/	u_int16_t	apiomodes;		/* advanced PIO modes */
98
99/*065*/	u_int16_t	mwdmamin;		/* min. M/W DMA time/word ns */
100/*066*/	u_int16_t	mwdmarec;		/* rec. M/W DMA time ns */
101/*067*/	u_int16_t	pioblind;		/* min. PIO cycle w/o flow */
102/*068*/	u_int16_t	pioiordy;		/* min. PIO cycle IORDY flow */
103	u_int16_t	reserved69;
104	u_int16_t	reserved70;
105/*071*/	u_int16_t	rlsovlap;		/* rel time (us) for overlap */
106/*072*/	u_int16_t	rlsservice;		/* rel time (us) for service */
107	u_int16_t	reserved73;
108	u_int16_t	reserved74;
109/*075*/	u_int16_t	queue;
110#define	ATA_QUEUE_LEN(x)		((x) & 0x001f)
111
112	u_int16_t	satacapabilities;
113#define ATA_SATA_GEN1			0x0002
114#define ATA_SATA_GEN2			0x0004
115#define ATA_SUPPORT_NCQ			0x0100
116#define ATA_SUPPORT_IFPWRMNGTRCV	0x0200
117
118	u_int16_t	reserved77;
119	u_int16_t	satasupport;
120#define ATA_SUPPORT_NONZERO		0x0002
121#define ATA_SUPPORT_AUTOACTIVATE	0x0004
122#define ATA_SUPPORT_IFPWRMNGT		0x0008
123#define ATA_SUPPORT_INORDERDATA		0x0010
124	u_int16_t	sataenabled;
125
126/*080*/	u_int16_t	version_major;
127/*081*/	u_int16_t	version_minor;
128
129	struct {
130/*082/085*/ u_int16_t	command1;
131#define ATA_SUPPORT_SMART		0x0001
132#define ATA_SUPPORT_SECURITY		0x0002
133#define ATA_SUPPORT_REMOVABLE		0x0004
134#define ATA_SUPPORT_POWERMGT		0x0008
135#define ATA_SUPPORT_PACKET		0x0010
136#define ATA_SUPPORT_WRITECACHE		0x0020
137#define ATA_SUPPORT_LOOKAHEAD		0x0040
138#define ATA_SUPPORT_RELEASEIRQ		0x0080
139#define ATA_SUPPORT_SERVICEIRQ		0x0100
140#define ATA_SUPPORT_RESET		0x0200
141#define ATA_SUPPORT_PROTECTED		0x0400
142#define ATA_SUPPORT_WRITEBUFFER		0x1000
143#define ATA_SUPPORT_READBUFFER		0x2000
144#define ATA_SUPPORT_NOP			0x4000
145
146/*083/086*/ u_int16_t	command2;
147#define ATA_SUPPORT_MICROCODE		0x0001
148#define ATA_SUPPORT_QUEUED		0x0002
149#define ATA_SUPPORT_CFA			0x0004
150#define ATA_SUPPORT_APM			0x0008
151#define ATA_SUPPORT_NOTIFY		0x0010
152#define ATA_SUPPORT_STANDBY		0x0020
153#define ATA_SUPPORT_SPINUP		0x0040
154#define ATA_SUPPORT_MAXSECURITY		0x0100
155#define ATA_SUPPORT_AUTOACOUSTIC	0x0200
156#define ATA_SUPPORT_ADDRESS48		0x0400
157#define ATA_SUPPORT_OVERLAY		0x0800
158#define ATA_SUPPORT_FLUSHCACHE		0x1000
159#define ATA_SUPPORT_FLUSHCACHE48	0x2000
160
161/*084/087*/ u_int16_t	extension;
162	} __packed support, enabled;
163
164/*088*/	u_int16_t	udmamodes;		/* UltraDMA modes */
165/*089*/	u_int16_t	erase_time;
166/*090*/	u_int16_t	enhanced_erase_time;
167/*091*/	u_int16_t	apm_value;
168/*092*/	u_int16_t	master_passwd_revision;
169/*093*/	u_int16_t	hwres;
170#define ATA_CABLE_ID			0x2000
171
172/*094*/	u_int16_t	acoustic;
173#define	ATA_ACOUSTIC_CURRENT(x)		((x) & 0x00ff)
174#define	ATA_ACOUSTIC_VENDOR(x)		(((x) & 0xff00) >> 8)
175
176/*095*/	u_int16_t	stream_min_req_size;
177/*096*/	u_int16_t	stream_transfer_time;
178/*097*/	u_int16_t	stream_access_latency;
179/*098*/	u_int32_t	stream_granularity;
180/*100*/	u_int16_t	lba_size48_1;
181	u_int16_t	lba_size48_2;
182	u_int16_t	lba_size48_3;
183	u_int16_t	lba_size48_4;
184	u_int16_t	reserved104[23];
185/*127*/	u_int16_t	removable_status;
186/*128*/	u_int16_t	security_status;
187	u_int16_t	reserved129[31];
188/*160*/	u_int16_t	cfa_powermode1;
189	u_int16_t	reserved161[15];
190/*176*/	u_int16_t	media_serial[30];
191	u_int16_t	reserved206[49];
192/*255*/	u_int16_t	integrity;
193} __packed;
194
195/* ATA transfer modes */
196#define ATA_MODE_MASK		0x0f
197#define ATA_DMA_MASK		0xf0
198#define ATA_PIO			0x00
199#define ATA_PIO0		0x08
200#define ATA_PIO1		0x09
201#define ATA_PIO2		0x0a
202#define ATA_PIO3		0x0b
203#define ATA_PIO4		0x0c
204#define ATA_PIO_MAX		0x0f
205#define ATA_DMA			0x10
206#define ATA_WDMA0		0x20
207#define ATA_WDMA1		0x21
208#define ATA_WDMA2		0x22
209#define ATA_UDMA0		0x40
210#define ATA_UDMA1		0x41
211#define ATA_UDMA2		0x42
212#define ATA_UDMA3		0x43
213#define ATA_UDMA4		0x44
214#define ATA_UDMA5		0x45
215#define ATA_UDMA6		0x46
216#define ATA_SA150		0x47
217#define ATA_DMA_MAX		0x4f
218
219/* ATA commands */
220#define	ATA_NOP				0x00	/* NOP command */
221#define		ATA_NF_FLUSHQUEUE	0x00	/* flush queued cmd's */
222#define		ATA_NF_AUTOPOLL		0x01	/* start autopoll function */
223#define	ATA_ATAPI_RESET			0x08	/* reset ATAPI device */
224#define	ATA_READ			0x20	/* read command */
225#define	ATA_READ48			0x24	/* read command */
226#define	ATA_READ_DMA48			0x25	/* read w/DMA command */
227#define	ATA_READ_DMA_QUEUED48		0x26	/* read w/DMA QUEUED command */
228#define	ATA_READ_MUL48			0x29	/* read multi command */
229#define	ATA_WRITE			0x30	/* write command */
230#define	ATA_WRITE48			0x34	/* write command */
231#define	ATA_WRITE_DMA48			0x35	/* write w/DMA command */
232#define	ATA_WRITE_DMA_QUEUED48		0x36	/* write w/DMA QUEUED command */
233#define	ATA_WRITE_MUL48			0x39	/* write multi command */
234#define	ATA_PACKET_CMD			0xa0	/* packet command */
235#define	ATA_ATAPI_IDENTIFY		0xa1	/* get ATAPI params*/
236#define	ATA_SERVICE			0xa2	/* service command */
237#define	ATA_READ_MUL			0xc4	/* read multi command */
238#define	ATA_WRITE_MUL			0xc5	/* write multi command */
239#define	ATA_SET_MULTI			0xc6	/* set multi size command */
240#define	ATA_READ_DMA_QUEUED		0xc7	/* read w/DMA QUEUED command */
241#define	ATA_READ_DMA			0xc8	/* read w/DMA command */
242#define	ATA_WRITE_DMA			0xca	/* write w/DMA command */
243#define	ATA_WRITE_DMA_QUEUED		0xcc	/* write w/DMA QUEUED command */
244#define	ATA_SLEEP			0xe6	/* sleep command */
245#define	ATA_FLUSHCACHE			0xe7	/* flush cache to disk */
246#define	ATA_FLUSHCACHE48		0xea	/* flush cache to disk */
247#define	ATA_ATA_IDENTIFY		0xec	/* get ATA params */
248#define	ATA_SETFEATURES			0xef	/* features command */
249#define		ATA_SF_SETXFER		0x03	/* set transfer mode */
250#define		ATA_SF_ENAB_WCACHE	0x02	/* enable write cache */
251#define		ATA_SF_DIS_WCACHE	0x82	/* disable write cache */
252#define		ATA_SF_ENAB_RCACHE	0xaa	/* enable readahead cache */
253#define		ATA_SF_DIS_RCACHE	0x55	/* disable readahead cache */
254#define		ATA_SF_ENAB_RELIRQ	0x5d	/* enable release interrupt */
255#define		ATA_SF_DIS_RELIRQ	0xdd	/* disable release interrupt */
256#define		ATA_SF_ENAB_SRVIRQ	0x5e	/* enable service interrupt */
257#define		ATA_SF_DIS_SRVIRQ	0xde	/* disable service interrupt */
258
259/* ATAPI commands */
260#define ATAPI_TEST_UNIT_READY		0x00	/* check if device is ready */
261#define ATAPI_REZERO			0x01	/* rewind */
262#define ATAPI_REQUEST_SENSE		0x03	/* get sense data */
263#define ATAPI_FORMAT			0x04	/* format unit */
264#define ATAPI_READ			0x08	/* read data */
265#define ATAPI_WRITE			0x0a	/* write data */
266#define ATAPI_WEOF			0x10	/* write filemark */
267#define	ATAPI_WF_WRITE		0x01
268#define ATAPI_SPACE			0x11	/* space command */
269#define		ATAPI_SP_FM		0x01
270#define		ATAPI_SP_EOD		0x03
271#define ATAPI_MODE_SELECT		0x15	/* mode select */
272#define ATAPI_ERASE			0x19	/* erase */
273#define ATAPI_MODE_SENSE		0x1a	/* mode sense */
274#define ATAPI_START_STOP		0x1b	/* start/stop unit */
275#define		ATAPI_SS_LOAD		0x01
276#define		ATAPI_SS_RETENSION	0x02
277#define		ATAPI_SS_EJECT		0x04
278#define ATAPI_PREVENT_ALLOW		0x1e	/* media removal */
279#define ATAPI_READ_FORMAT_CAPACITIES	0x23	/* get format capacities */
280#define ATAPI_READ_CAPACITY		0x25	/* get volume capacity */
281#define ATAPI_READ_BIG			0x28	/* read data */
282#define ATAPI_WRITE_BIG			0x2a	/* write data */
283#define ATAPI_LOCATE			0x2b	/* locate to position */
284#define ATAPI_READ_POSITION		0x34	/* read position */
285#define ATAPI_SYNCHRONIZE_CACHE		0x35	/* flush buf, close channel */
286#define ATAPI_WRITE_BUFFER		0x3b	/* write device buffer */
287#define ATAPI_READ_BUFFER		0x3c	/* read device buffer */
288#define ATAPI_READ_SUBCHANNEL		0x42	/* get subchannel info */
289#define ATAPI_READ_TOC			0x43	/* get table of contents */
290#define ATAPI_PLAY_10			0x45	/* play by lba */
291#define ATAPI_PLAY_MSF			0x47	/* play by MSF address */
292#define ATAPI_PLAY_TRACK		0x48	/* play by track number */
293#define ATAPI_PAUSE			0x4b	/* pause audio operation */
294#define ATAPI_READ_DISK_INFO		0x51	/* get disk info structure */
295#define ATAPI_READ_TRACK_INFO		0x52	/* get track info structure */
296#define ATAPI_RESERVE_TRACK		0x53	/* reserve track */
297#define ATAPI_SEND_OPC_INFO		0x54	/* send OPC structurek */
298#define ATAPI_MODE_SELECT_BIG		0x55	/* set device parameters */
299#define ATAPI_REPAIR_TRACK		0x58	/* repair track */
300#define ATAPI_READ_MASTER_CUE		0x59	/* read master CUE info */
301#define ATAPI_MODE_SENSE_BIG		0x5a	/* get device parameters */
302#define ATAPI_CLOSE_TRACK		0x5b	/* close track/session */
303#define ATAPI_READ_BUFFER_CAPACITY	0x5c	/* get buffer capicity */
304#define ATAPI_SEND_CUE_SHEET		0x5d	/* send CUE sheet */
305#define ATAPI_BLANK			0xa1	/* blank the media */
306#define ATAPI_SEND_KEY			0xa3	/* send DVD key structure */
307#define ATAPI_REPORT_KEY		0xa4	/* get DVD key structure */
308#define ATAPI_PLAY_12			0xa5	/* play by lba */
309#define ATAPI_LOAD_UNLOAD		0xa6	/* changer control command */
310#define ATAPI_READ_STRUCTURE		0xad	/* get DVD structure */
311#define ATAPI_PLAY_CD			0xb4	/* universal play command */
312#define ATAPI_SET_SPEED			0xbb	/* set drive speed */
313#define ATAPI_MECH_STATUS		0xbd	/* get changer status */
314#define ATAPI_READ_CD			0xbe	/* read data */
315#define ATAPI_POLL_DSC			0xff	/* poll DSC status bit */
316
317struct ata_cmd {
318    int				channel;
319    int				device;
320    int				cmd;
321#define ATAGMAXCHANNEL		0x0101
322#define ATAGPARM		0x0102
323#define ATAGMODE		0x0103
324#define ATASMODE		0x0104
325#define ATAREQUEST		0x0108
326#define ATAREINIT		0x0110
327#define ATAATTACH		0x0111
328#define ATADETACH		0x0112
329#define ATARAIDCREATE		0x0120
330#define ATARAIDDELETE		0x0121
331#define ATARAIDSTATUS		0x0122
332#define ATARAIDADDSPARE		0x0123
333#define ATARAIDREBUILD		0x0124
334#define ATAENCSTAT		0x0130
335
336    union {
337	int			maxchan;
338
339	struct {
340	    int			type[2];
341	    char		name[2][32];
342	    struct ata_params	params[2];
343	} param;
344
345	struct {
346	    int			mode[2];
347	} mode;
348
349	struct {
350	    union {
351		struct {
352		    u_int8_t            command;
353		    u_int8_t            feature;
354		    u_int64_t           lba;
355		    u_int16_t           count;
356		} ata;
357		struct {
358		    char		ccb[16];
359		} atapi;
360	    } u;
361	    caddr_t		data;
362	    int			count;
363	    int			flags;
364#define ATA_CMD_CONTROL			0x01
365#define ATA_CMD_READ			0x02
366#define ATA_CMD_WRITE			0x04
367#define ATA_CMD_ATAPI			0x08
368
369	    int			timeout;
370	    int			error;
371	} request;
372
373	struct raid_setup {
374	    int			type;
375#define AR_JBOD 	              	0x01
376#define AR_SPAN        		       	0x02
377#define AR_RAID0       		       	0x04
378#define AR_RAID1       		       	0x08
379#define AR_RAID01      		       	0x10
380#define AR_RAID3       	 	      	0x20
381#define AR_RAID4       	       		0x40
382#define AR_RAID5              		0x80
383
384	    int			total_disks;
385	    int			disks[16];
386	    int			interleave;
387	    int			unit;
388	} raid_setup;
389
390	struct raid_status {
391	    int			type;
392	    int			total_disks;
393	    int			disks[16];
394	    int			interleave;
395	    int			status;
396#define	AR_READY			1
397#define	AR_DEGRADED			2
398#define	AR_REBUILDING			4
399
400	    int			progress;
401	} raid_status;
402
403	struct {
404	    int			disk;
405	} raid_spare;
406
407	struct {
408	    int			fan;
409	    int			temp;
410	    int			v05;
411	    int			v12;
412	} enclosure;
413    } u;
414};
415
416#define IOCATA			_IOWR('a',  1, struct ata_cmd)
417
418#endif /* _SYS_ATA_H_ */
419