xref: /dragonfly/sys/dev/disk/ahci/atascsi.h (revision 279dd846)
1 /*
2  * Copyright (c) 2007 David Gwynne <dlg@openbsd.org>
3  *
4  * Permission to use, copy, modify, and distribute this software for any
5  * purpose with or without fee is hereby granted, provided that the above
6  * copyright notice and this permission notice appear in all copies.
7  *
8  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
9  * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
10  * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
11  * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
12  * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
13  * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
14  * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
15  *
16  * $OpenBSD: atascsi.h,v 1.33 2009/02/16 21:19:06 miod Exp $
17  */
18 
19 struct atascsi;
20 struct scsi_link;
21 
22 /*
23  * ATA commands
24  */
25 
26 #define ATA_C_DATA_SET_MANAGEMENT 0x06 /* Data Set Management command */
27 #define ATA_C_SATA_FEATURE_ENA	0x10
28 #define ATA_C_READDMA_EXT	0x25
29 #define ATA_C_READ_LOG_EXT	0x2f
30 #define ATA_C_WRITEDMA_EXT	0x35
31 #define ATA_C_READ_FPDMA	0x60
32 #define ATA_C_WRITE_FPDMA	0x61
33 #define ATA_C_SATA_FEATURE_DIS	0x90
34 #define ATA_C_PACKET		0xa0
35 #define ATA_C_ATAPI_IDENTIFY	0xa1
36 #define ATA_C_READDMA		0xc8
37 #define ATA_C_WRITEDMA		0xca
38 #define ATA_C_READ_PM		0xe4
39 #define ATA_C_WRITE_PM		0xe8
40 #define ATA_C_FLUSH_CACHE	0xe7
41 #define ATA_C_FLUSH_CACHE_EXT	0xea /* lba48 */
42 #define ATA_C_IDENTIFY		0xec
43 #define ATA_C_SET_FEATURES	0xef
44 #define ATA_C_SEC_FREEZE_LOCK	0xf5
45 
46 /*
47  * ATA SATA FEATURES subcommands
48  */
49 #define ATA_SATAFT_NONZDMA	0x01	/* DMA non-zero buffer offset */
50 #define ATA_SATAFT_DMAAAOPT	0x02	/* DMA AA optimization */
51 #define ATA_SATAFT_DEVIPS	0x03	/* Device-initiated pwr state*/
52 #define ATA_SATAFT_INORDER	0x04	/* in-order data delivery */
53 #define ATA_SATAFT_ASYNCNOTIFY	0x05	/* Async notification */
54 
55 /*
56  * ATA SET FEATURES subcommands
57  */
58 #define ATA_SF_DSM_TRIM          0x01 /* TRIM DSM feature */
59 #define ATA_SF_WRITECACHE_EN	0x02
60 #define ATA_SF_SETXFER		0x03
61 #define ATA_SF_LOOKAHEAD_EN	0xaa
62 
63 struct ata_identify {
64 	u_int16_t	config;		/*   0 */
65 	u_int16_t	ncyls;		/*   1 */
66 	u_int16_t	reserved1;	/*   2 */
67 	u_int16_t	nheads;		/*   3 */
68 	u_int16_t	track_size;	/*   4 */
69 	u_int16_t	sector_size;	/*   5 */
70 	u_int16_t	nsectors;	/*   6 */
71 	u_int16_t	reserved2[3];	/*   7 vendor unique */
72 	u_int8_t	serial[20];	/*  10 */
73 	u_int16_t	buffer_type;	/*  20 */
74 	u_int16_t	buffer_size;	/*  21 */
75 	u_int16_t	ecc;		/*  22 */
76 	u_int8_t	firmware[8];	/*  23 */
77 	u_int8_t	model[40];	/*  27 */
78 	u_int16_t	multi;		/*  47 */
79 	u_int16_t	dwcap;		/*  48 */
80 	u_int16_t	cap;		/*  49 */
81 	u_int16_t	reserved3;	/*  50 */
82 	u_int16_t	piomode;	/*  51 */
83 	u_int16_t	dmamode;	/*  52 */
84 	u_int16_t	validinfo;	/*  53 */
85 	u_int16_t	curcyls;	/*  54 */
86 	u_int16_t	curheads;	/*  55 */
87 	u_int16_t	cursectrk;	/*  56 */
88 	u_int16_t	curseccp[2];	/*  57 */
89 	u_int16_t	mult2;		/*  59 */
90 	u_int16_t	addrsec[2];	/*  60 */
91 	u_int16_t	worddma;	/*  62 */
92 	u_int16_t	dworddma;	/*  63 */
93 	u_int16_t	advpiomode;	/*  64 */
94 	u_int16_t	minmwdma;	/*  65 */
95 	u_int16_t	recmwdma;	/*  66 */
96 	u_int16_t	minpio;		/*  67 */
97 	u_int16_t	minpioflow;	/*  68 */
98 	u_int16_t       support3;	/*  69 */
99 #define ATA_SUPPORT_RZAT                0x0020
100 #define ATA_SUPPORT_DRAT                0x4000
101 	u_int16_t	reserved4;	/*  70 */
102 	u_int16_t	typtime[2];	/*  71 */
103 	u_int16_t	reserved5[2];	/*  73 */
104 	u_int16_t	qdepth;		/*  75 */
105 	u_int16_t	satacap;	/*  76 */
106 	u_int16_t	satacap2;	/*  77 */
107 #define SATA_CAP2_SNDRCV_FPDMA		(1 << 6)
108 	u_int16_t	satafsup;	/*  78 */
109 	u_int16_t	satafen;	/*  79 */
110 	u_int16_t	majver;		/*  80 */
111 	u_int16_t	minver;		/*  81 */
112 	u_int16_t	cmdset82;	/*  82 */
113 	u_int16_t	cmdset83;	/*  83 */
114 	u_int16_t	cmdset84;	/*  84 */
115 	u_int16_t	features85;	/*  85 */
116 	u_int16_t	features86;	/*  86 */
117 	u_int16_t	features87;	/*  87 */
118 #define ATA_ID_F87_WWN		(1<<8)
119 	u_int16_t	ultradma;	/*  88 */
120 	u_int16_t	erasetime;	/*  89 */
121 	u_int16_t	erasetimex;	/*  90 */
122 	u_int16_t	apm;		/*  91 */
123 	u_int16_t	masterpw;	/*  92 */
124 	u_int16_t	hwreset;	/*  93 */
125 	u_int16_t	acoustic;	/*  94 */
126 	u_int16_t	stream_min;	/*  95 */
127 	u_int16_t	stream_xfer_d;	/*  96 */
128 	u_int16_t	stream_lat;	/*  97 */
129 	u_int16_t	streamperf[2];	/*  98 */
130 	u_int16_t	addrsecxt[4];	/* 100 */
131 	u_int16_t	stream_xfer_p;	/* 104 */
132 	u_int16_t	max_dsm_blocks;	/* 105 */
133 	u_int16_t	phys_sect_sz;	/* 106 */
134 	u_int16_t	seek_delay;	/* 107 */
135 	u_int16_t	naa_ieee_oui;	/* 108 */
136 	u_int16_t	ieee_oui_uid;	/* 109 */
137 	u_int16_t	uid_mid;	/* 110 */
138 	u_int16_t	uid_low;	/* 111 */
139 	u_int16_t	resv_wwn[4];	/* 112 */
140 	u_int16_t	incits;		/* 116 */
141 	u_int16_t	words_lsec[2];	/* 117 */
142 	u_int16_t	cmdset119;	/* 119 */
143 	u_int16_t	features120;	/* 120 */
144 	u_int16_t	padding2[6];
145 	u_int16_t	rmsn;		/* 127 */
146 	u_int16_t	securestatus;	/* 128 */
147 #define ATA_SECURE_LOCKED		(1<<2)
148 #define ATA_SECURE_FROZEN		(1<<3)
149 	u_int16_t	vendor[31];	/* 129 */
150 	u_int16_t	padding3[9];	/* 160 */
151 	u_int16_t	support_dsm;	/* 169 */
152 #define ATA_SUPPORT_DSM_TRIM            0x0001
153 	u_int16_t	padding5[6];	/* 170 */
154 	u_int16_t	curmedser[30];	/* 176 */
155 	u_int16_t	sctsupport;	/* 206 */
156 	u_int16_t	padding4[10];	/* 207 */
157 	u_int16_t	nomrota_rate;	/* 217 */
158 	u_int16_t	padding6[37];	/* 218 */
159 	u_int16_t	integrity;	/* 255 */
160 } __packed;
161 
162 /*
163  * IDENTIFY DEVICE data
164  */
165 #define ATA_IDENTIFY_SECURITY		(1 << 1)
166 #define ATA_IDENTIFY_WRITECACHE		(1 << 5)
167 #define ATA_IDENTIFY_LOOKAHEAD		(1 << 6)
168 
169 /*
170  * Frame Information Structures
171  */
172 
173 #define ATA_FIS_LENGTH		20
174 
175 struct ata_fis_h2d {
176 	u_int8_t		type;
177 #define ATA_FIS_TYPE_H2D		0x27
178 	u_int8_t		flags;
179 #define ATA_H2D_FLAGS_CMD		(1<<7)
180 	u_int8_t		command;
181 	u_int8_t		features;
182 #define ATA_H2D_FEATURES_DMA		(1<<0)
183 #define ATA_H2D_FEATURES_DIR		(1<<2)
184 #define ATA_H2D_FEATURES_DIR_READ	(1<<2)
185 #define ATA_H2D_FEATURES_DIR_WRITE	(0<<2)
186 
187 	u_int8_t		lba_low;
188 	u_int8_t		lba_mid;
189 	u_int8_t		lba_high;
190 	u_int8_t		device;
191 #define ATA_H2D_DEVICE_LBA		0x40
192 
193 	u_int8_t		lba_low_exp;
194 	u_int8_t		lba_mid_exp;
195 	u_int8_t		lba_high_exp;
196 	u_int8_t		features_exp;
197 
198 	u_int8_t		sector_count;
199 	u_int8_t		sector_count_exp;
200 	u_int8_t		reserved0;
201 	u_int8_t		control;
202 #define ATA_FIS_CONTROL_SRST	0x04
203 #define ATA_FIS_CONTROL_4BIT	0x08
204 
205 	u_int8_t		reserved1;
206 	u_int8_t		reserved2;
207 	u_int8_t		reserved3;
208 	u_int8_t		reserved4;
209 } __packed;
210 
211 struct ata_fis_d2h {
212 	u_int8_t		type;
213 #define ATA_FIS_TYPE_D2H		0x34
214 	u_int8_t		flags;
215 #define ATA_D2H_FLAGS_INTR		(1<<6)
216 	u_int8_t		status;
217 	u_int8_t		error;
218 
219 	u_int8_t		lba_low;
220 	u_int8_t		lba_mid;
221 	u_int8_t		lba_high;
222 	u_int8_t		device;
223 
224 	u_int8_t		lba_low_exp;
225 	u_int8_t		lba_mid_exp;
226 	u_int8_t		lba_high_exp;
227 	u_int8_t		reserved0;
228 
229 	u_int8_t		sector_count;
230 	u_int8_t		sector_count_exp;
231 	u_int8_t		reserved1;
232 	u_int8_t		reserved2;
233 
234 	u_int8_t		reserved3;
235 	u_int8_t		reserved4;
236 	u_int8_t		reserved5;
237 	u_int8_t		reserved6;
238 } __packed;
239 
240 /*
241  * SATA log page 10h -
242  * looks like a D2H FIS, with errored tag number in first byte.
243  */
244 struct ata_log_page_10h {
245 	struct ata_fis_d2h	err_regs;
246 #define ATA_LOG_10H_TYPE_NOTQUEUED	0x80
247 #define ATA_LOG_10H_TYPE_TAG_MASK	0x1f
248 	u_int8_t		reserved[256 - sizeof(struct ata_fis_d2h)];
249 	u_int8_t		vendor_specific[255];
250 	u_int8_t		checksum;
251 } __packed;
252 
253 /*
254  * SATA registers
255  */
256 
257 #define SATA_SStatus_DET		0x00f
258 #define SATA_SStatus_DET_NODEV		0x000
259 #define SATA_SStatus_DET_NOPHY		0x001
260 #define SATA_SStatus_DET_DEV		0x003
261 #define SATA_SStatus_DET_OFFLINE	0x008
262 
263 #define SATA_SStatus_SPD		0x0f0
264 #define SATA_SStatus_SPD_NONE		0x000
265 #define SATA_SStatus_SPD_1_5		0x010
266 #define SATA_SStatus_SPD_3_0		0x020
267 
268 #define SATA_SStatus_IPM		0xf00
269 #define SATA_SStatus_IPM_NODEV		0x000
270 #define SATA_SStatus_IPM_ACTIVE		0x100
271 #define SATA_SStatus_IPM_PARTIAL	0x200
272 #define SATA_SStatus_IPM_SLUMBER	0x600
273 
274 #define SATA_SIGNATURE_PORT_MULTIPLIER	0x96690101
275 #define SATA_SIGNATURE_ATAPI		0xeb140101
276 #define SATA_SIGNATURE_DISK		0x00000101
277 
278 /*
279  * ATA interface
280  */
281 
282 struct ahci_port;
283 
284 struct ata_port {
285 	struct ata_identify	at_identify;	/* only if ATA_PORT_T_DISK */
286 	struct ahci_port	*at_ahci_port;
287 	int			at_type;
288 #define ATA_PORT_T_NONE			0
289 #define ATA_PORT_T_DISK			1
290 #define ATA_PORT_T_ATAPI		2
291 #define ATA_PORT_T_PM			3
292 	int			at_features;
293 #define ATA_PORT_F_WCACHE		(1 << 0)
294 #define ATA_PORT_F_RAHEAD		(1 << 1)
295 #define ATA_PORT_F_FRZLCK		(1 << 2)
296 #define ATA_PORT_F_RESCAN		(1 << 3) /* re-check on bus scan */
297 	int			at_probe;
298 #define ATA_PROBE_NEED_INIT		0
299 #define ATA_PROBE_NEED_HARD_RESET	1
300 #define ATA_PROBE_NEED_SOFT_RESET	2
301 #define ATA_PROBE_NEED_IDENT		3
302 #define ATA_PROBE_GOOD			4
303 #define ATA_PROBE_FAILED		7
304 	int			at_ncqdepth;
305 	u_int64_t		at_capacity;	/* only if ATA_PORT_T_DISK */
306 	int			at_target;	/* port multiplier port */
307 	char			at_name[16];
308 };
309 
310 struct ata_xfer {
311 	struct ata_fis_h2d	*fis;
312 	struct ata_fis_d2h	rfis;
313 	u_int8_t		*packetcmd;
314 	u_int8_t		tag;
315 
316 	void			*data;
317 	size_t			datalen;
318 	size_t			resid;
319 
320 	void			(*complete)(struct ata_xfer *);
321 	u_int			timeout;
322 	int			serial;		/* detect timeout races */
323 
324 	int			flags;
325 #define ATA_F_READ			(1<<0)
326 #define ATA_F_WRITE			(1<<1)
327 #define ATA_F_NOWAIT			(1<<2)
328 #define ATA_F_POLL			(1<<3)
329 #define ATA_F_PIO			(1<<4)
330 #define ATA_F_PACKET			(1<<5)
331 #define ATA_F_NCQ			(1<<6)
332 #define ATA_F_TIMEOUT_RUNNING		(1<<7)
333 #define ATA_F_TIMEOUT_DESIRED		(1<<8)
334 #define ATA_F_TIMEOUT_EXPIRED		(1<<9)
335 #define ATA_F_AUTOSENSE			(1<<10)
336 #define ATA_F_EXCLUSIVE			(1<<11)
337 #define ATA_F_SILENT			(1<<12)
338 #define ATA_FMT_FLAGS			"\020" 				\
339 					"\015SILENT"			\
340 					"\014EXCLUSIVE"			\
341 					"\013AUTOSENSE"			\
342 					"\012EXPIRED"			\
343 					"\011DESIRED" "\010TRUNNING"	\
344 					"\007NCQ" "\006PACKET"		\
345 					"\005PIO" "\004POLL" "\003NOWAIT" \
346 					"\002WRITE" "\001READ"
347 
348 	volatile int		state;
349 #define ATA_S_SETUP			0
350 #define ATA_S_PENDING			1
351 #define ATA_S_COMPLETE			2
352 #define ATA_S_ERROR			3
353 #define ATA_S_TIMEOUT			4
354 #define ATA_S_ONCHIP			5
355 #define ATA_S_PUT			6
356 
357 	void			*atascsi_private;
358 	struct ata_port         *at;	/* NULL if direct-attached */
359 };
360 
361