xref: /illumos-gate/usr/src/uts/common/sys/sata/sata_hba.h (revision 622200ad88c6c6382403a01985a94e22484baac6)
1 /*
2  * CDDL HEADER START
3  *
4  * The contents of this file are subject to the terms of the
5  * Common Development and Distribution License (the "License").
6  * You may not use this file except in compliance with the License.
7  *
8  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
9  * or http://www.opensolaris.org/os/licensing.
10  * See the License for the specific language governing permissions
11  * and limitations under the License.
12  *
13  * When distributing Covered Code, include this CDDL HEADER in each
14  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
15  * If applicable, add the following below this CDDL HEADER, with the
16  * fields enclosed by brackets "[]" replaced with your own identifying
17  * information: Portions Copyright [yyyy] [name of copyright owner]
18  *
19  * CDDL HEADER END
20  */
21 
22 /*
23  * Copyright 2005 Sun Microsystems, Inc.  All rights reserved.
24  * Use is subject to license terms.
25  */
26 
27 #ifndef _SATA_HBA_H
28 #define	_SATA_HBA_H
29 
30 #pragma ident	"%Z%%M%	%I%	%E% SMI"
31 
32 #ifdef	__cplusplus
33 extern "C" {
34 #endif
35 
36 #include <sys/sata/sata_defs.h>
37 
38 /*
39  * SATA Host Bus Adapter (HBA) driver transport definitions
40  */
41 
42 #include <sys/types.h>
43 
44 #ifndef	TRUE
45 #define	TRUE	1
46 #define	FALSE	0
47 #endif
48 
49 #define	SATA_SUCCESS	0
50 #define	SATA_FAILURE	-1
51 
52 
53 /* SATA Framework definitions */
54 
55 #define	SATA_MAX_CPORTS		32	/* Max number of controller ports */
56 
57 					/* Multiplier (PMult) */
58 #define	SATA_MAX_PMPORTS	16	/* Maximum number of ports on PMult */
59 #define	SATA_PMULT_HOSTPORT	0xf	/* Port Multiplier host port number */
60 
61 
62 /*
63  * SATA device address
64  * Address qualifier flags are used to specify what is addressed (device
65  * or port) and where (controller or port multiplier data port).
66  */
67 struct sata_address {
68 	uint8_t		cport;		/* Controller's SATA port number */
69 	uint8_t 	pmport;		/* Port Multiplier SATA port number */
70 	uint8_t		qual;		/* Address Qualifier flags */
71 	uint8_t		pad;		/* Reserved */
72 };
73 
74 typedef struct sata_address sata_address_t;
75 
76 /*
77  * SATA address Qualifier flags (in qual field of sata_address struct).
78  * They are mutually exclusive.
79  */
80 
81 #define	SATA_ADDR_NULL		0x00	/* No address */
82 #define	SATA_ADDR_DCPORT	0x01	/* Device attched to controller port */
83 #define	SATA_ADDR_DPMPORT	0x02	/* Device attched to PM device port */
84 #define	SATA_ADDR_CPORT		0x04	/* Controller's device port */
85 #define	SATA_ADDR_PMPORT	0x08	/* Port Multiplier's device port */
86 #define	SATA_ADDR_CNTRL		0x10	/* Controller */
87 #define	SATA_ADDR_PMULT		0x20	/* Port Multiplier */
88 
89 /*
90  * SATA port status and control register block.
91  * The sstatus, serror, scontrol, sactive and snotific
92  * are the copies of the SATA port status and control registers.
93  * (Port SStatus, SError, SControl, SActive and SNotification are
94  * defined by Serial ATA r1.0a sepc and Serial ATA II spec.
95  */
96 
97 struct sata_port_scr
98 {
99 	uint32_t	sstatus;	/* Port SStatus register */
100 	uint32_t	serror;		/* Port SError register */
101 	uint32_t	scontrol;	/* Port SControl register */
102 	uint32_t	sactive;	/* Port SActive register */
103 	uint32_t	snotific; 	/* Port SNotification register */
104 };
105 
106 typedef struct sata_port_scr sata_port_scr_t;
107 
108 /*
109  * SATA Device Structure (rev 1)
110  * Used to request/return state of the controller, port, port multiplier
111  * or an attached drive:
112  *  	The satadev_addr.cport, satadev_addr.pmport and satadev_addr.qual
113  *  	fields are used to specify SATA address (see sata_address structure
114  *  	description).
115  * 	The satadev_scr structure is used to pass the content of a port
116  *	status and control registers.
117  *	The satadev_add_info field is used by SATA HBA driver to return an
118  *	additional information, which type depends on the function using
119  *	sata_device as argument. For example:
120  *	- in case of sata_tran_probe_port() this field should contain
121  *	a number of available Port Multiplier device ports;
122  *	- in case of sata_hba_event_notify() this field may contain
123  *	a value specific for a reported event.
124  */
125 #define	SATA_DEVICE_REV_1	1
126 #define	SATA_DEVICE_REV		SATA_DEVICE_REV_1
127 
128 struct sata_device
129 {
130 	int		satadev_rev;		/* structure  version */
131 	struct sata_address satadev_addr;	/* sata port/device address */
132 	uint32_t	satadev_state;		/* Port or device state */
133 	uint32_t	satadev_type;		/* Attached device type */
134 	struct sata_port_scr satadev_scr; 	/* Port status and ctrl regs */
135 	uint32_t	satadev_add_info;	/* additional information, */
136 						/* function specific */
137 };
138 
139 typedef struct sata_device sata_device_t;
140 
141 _NOTE(SCHEME_PROTECTS_DATA("unshared data", sata_device))
142 
143 
144 /*
145  * satadev_state field of sata_device structure.
146  * Common flags specifying current state of a port or an attached drive.
147  * These states are mutually exclusive, except SATA_STATE_PROBED and
148  * SATA_STATE_READY that may be set at the same time.
149  */
150 #define	SATA_STATE_UNKNOWN		0x000000
151 #define	SATA_STATE_PROBING		0x000001
152 #define	SATA_STATE_PROBED		0x000002
153 #define	SATA_STATE_READY		0x000010
154 
155 /*
156  * Attached drive specific states (satadev_state field of the sata_device
157  * structure).
158  * SATA_DSTATE_PWR_ACTIVE, SATA_DSTATE_PWR_IDLE and SATA_DSTATE_PWR_STANDBY
159  * are mutually exclusive. All other states may be combined with each other
160  * and with one of the power states.
161  * These flags may be used only if the address qualifier (satadev_addr.qual) is
162  * set to SATA_ADDR_DCPORT or SATA_ADDR_DPMPORT value.
163  */
164 
165 #define	SATA_DSTATE_PWR_ACTIVE		0x000100
166 #define	SATA_DSTATE_PWR_IDLE		0x000200
167 #define	SATA_DSTATE_PWR_STANDBY		0x000400
168 #define	SATA_DSTATE_RESET		0x001000
169 #define	SATA_DSTATE_FAILED		0x008000
170 
171 /* Mask for drive power states */
172 #define	SATA_DSTATE_PWR			(SATA_DSTATE_PWR_ACTIVE | \
173 					SATA_DSTATE_PWR_IDLE | \
174 					SATA_DSTATE_PWR_STANDBY)
175 /*
176  * SATA Port specific states (satadev_state field of sata_device structure).
177  * SATA_PSTATE_PWRON and SATA_PSTATE_PWROFF are mutually exclusive.
178  * All other states may be combined with each other and with one of the power
179  * level state.
180  * These flags may be used only if the address qualifier (satadev_addr.qual) is
181  * set to SATA_ADDR_CPORT or SATA_ADDR_PMPORT value.
182  */
183 
184 #define	SATA_PSTATE_PWRON		0x010000
185 #define	SATA_PSTATE_PWROFF		0X020000
186 #define	SATA_PSTATE_SHUTDOWN		0x040000
187 #define	SATA_PSTATE_FAILED		0x080000
188 
189 /* Mask for the valid port-specific state flags */
190 #define	SATA_PSTATE_VALID		(SATA_PSTATE_PWRON | \
191 					SATA_PSTATE_PWROFF | \
192 					SATA_PSTATE_SHUTDOWN | \
193 					SATA_PSTATE_FAILED)
194 
195 /* Mask for a port power states */
196 #define	SATA_PSTATE_PWR			(SATA_PSTATE_PWRON | \
197 					SATA_PSTATE_PWROFF)
198 
199 /*
200  * Device type (in satadev_type field of sata_device structure).
201  * More device types may be added in the future.
202  */
203 
204 #define	SATA_DTYPE_NONE			0x00	/* No device attached */
205 #define	SATA_DTYPE_ATADISK		0x01	/* ATA Disk */
206 #define	SATA_DTYPE_ATAPICD		0x02	/* Atapi CD/DVD device */
207 #define	SATA_DTYPE_ATAPINONCD		0x03	/* Atapi non-CD/DVD device */
208 #define	SATA_DTYPE_PMULT		0x10	/* Port Multiplier */
209 #define	SATA_DTYPE_UNKNOWN		0x20	/* Device attached, unkown */
210 
211 
212 /*
213  * SATA cmd structure  (rev 1)
214  *
215  * SATA HBA framework always sets all fields except status_reg and error_reg.
216  * SATA HBA driver action depends on the addressing type specified by
217  * addr_type field:
218  * If LBA48 addressing is indicated, SATA HBA driver has to load values from
219  * satacmd_sec_count_msb_reg, satacmd_lba_low_msb_reg,
220  * satacmd_lba_mid_msb_reg and satacmd_lba_hi_msb_reg
221  * to appropriate registers prior to loading other registers.
222  * For other addressing modes, SATA HBA driver should skip loading values
223  * from satacmd_sec_count_msb_reg, satacmd_lba_low_msb_reg,
224  * satacmd_lba_mid_msb_reg and satacmd_lba_hi_msb_reg
225  * fields and load only remaining field values to corresponding registers.
226  *
227  * satacmd_sec_count_msb and satamcd_sec_count_lsb values are loaded into
228  * sec_count register, satacmd_sec_count_msb loaded first (if LBA48
229  * addressing is used).
230  * satacmd_lba_low_msb and satacmd_lba_low_lsb values are loaded into the
231  * lba_low register, satacmd_lba_low_msb loaded first (if LBA48 addressing
232  * is used). The lba_low register is the newer name for the old
233  * sector_number register.
234  * satacmd_lba_mid_msb and satacmd_lba_mid_lsb values are loaded into lba_mid
235  * register, satacmd_lba_mid_msb loaded first (if LBA48 addressing is used).
236  * The lba_mid register is the newer name for the old cylinder_low register.
237  * satacmd_lba_high_msb and satacmd_lba_high_lsb values are loaded into
238  * the lba_high regster, satacmd_lba_high_msb loaded first (if LBA48
239  * addressing is used). The lba_high register  is a newer name for the old
240  * cylinder_high register.
241  *
242  * No addressing mode is selected when an ata command does not involve actual
243  * reading/writing data from/to the media (for example IDENTIFY DEVICE or
244  * SET FEATURE command), or the ATAPI PACKET command is sent.
245  * If ATAPI PACKET command is sent and tagged commands are used,
246  * SATA HBA driver has to provide and manage a tag value and
247  * set it into the sector_count register.
248  *
249  * Device Control register is not specified in sata_cmd structure - SATA HBA
250  * driver shall set it accordingly to current mode of operation (interrupt
251  * enable/disable).
252  *
253  * Buffer structure's b_flags should be used to determine the
254  * address type of b_un.b_addr. However, there is no need to allocate DMA
255  * resources for the buffer in SATA HBA driver.
256  * DMA resources for a buffer structure are allocated by the SATA HBA
257  * framework. Scatter/gather list is to be used only for DMA transfers
258  * and it should be based on the DMA cookies list.
259  *
260  * Upon completion of a command, SATA HBA driver has to update
261  * satacmd_status_reg and satacmd_error_reg to reflect the contents of
262  * the corresponding device status and error registers.
263  * If the command completed with error, SATA HBA driver has to update
264  * satacmd_sec_count_msb, satacmd_sec_count_lsb, satacmd_lba_low_msb,
265  * satacmd_lba_low_lsb, satacmd_lba_mid_msb, satacmd_lba_mid_lsb,
266  * satacmd_lba_high_msb and satacmd_lba_high_lsb to values read from the
267  * corresponding device registers.
268  * If an operation could not complete because of the port error, the
269  * sata_pkt.satapkt_device.satadev_scr structure has to be updated.
270  *
271  * If ATAPI PACKET command was sent and command completed with error,
272  * rqsense structure has to be filed by SATA HBA driver. The satacmd_arq_cdb
273  * points to pre-set request sense cdb that may be used for issuing request
274  * sense data from the device.
275  *
276  * If FPDMA-type command was sent and command completed with error, the HBA
277  * driver may use pre-set command READ LOG EXTENDED command pointed to
278  * by satacmd_rle_sata_cmd field to retrieve error data from a device.
279  * Only ATA register fields of the sata_cmd are set-up for that purpose.
280  *
281  * If the READ MULTIPLIER command was specified in cmd_reg (command directed
282  * to a port multiplier host port rather then to an attached device),
283  * upon the command completion SATA HBA driver has to update_sector count
284  * and lba fields of the sata_cmd structure to values returned via
285  * command block registers (task file registers).
286  */
287 #define	SATA_CMD_REV_1	1
288 #define	SATA_CMD_REV	SATA_CMD_REV_1
289 
290 #define	SATA_ATAPI_MAX_CDB_LEN	16	/* Covers both 12 and 16 byte cdbs */
291 #define	SATA_ATAPI_RQSENSE_LEN	24	/* Fixed size Request Sense data */
292 
293 struct sata_cmd {
294 	int		satacmd_rev;		/* version */
295 	struct buf	*satacmd_bp;		/* ptr to buffer structure */
296 	uint32_t	satacmd_flags;		/* transfer direction */
297 	uint8_t 	satacmd_addr_type; 	/* addr type: LBA28, LBA48 */
298 	uint8_t		satacmd_features_reg_ext; /* features reg extended */
299 	uint8_t		satacmd_sec_count_msb;	/* sector count MSB (LBA48) */
300 	uint8_t		satacmd_lba_low_msb; 	/* LBA Low MSB (LBA48) */
301 	uint8_t		satacmd_lba_mid_msb;	/* LBA Mid MSB (LBA48) */
302 	uint8_t		satacmd_lba_high_msb;	/* LBA High MSB (LBA48) */
303 	uint8_t		satacmd_sec_count_lsb;	/* sector count LSB */
304 	uint8_t		satacmd_lba_low_lsb;	/* LBA Low LSB */
305 	uint8_t		satacmd_lba_mid_lsb;	/* LBA Mid LSB */
306 	uint8_t		satacmd_lba_high_lsb;	/* LBA High LSB */
307 	uint8_t		satacmd_device_reg;	/* ATA dev reg & LBA28 MSB */
308 	uint8_t		satacmd_cmd_reg;	/* ata command code */
309 	uint8_t		satacmd_features_reg;	/* ATA features register */
310 	uint8_t		satacmd_status_reg;	/* ATA status register */
311 	uint8_t		satacmd_error_reg;	/* ATA error register  */
312 	uint8_t		satacmd_acdb_len;	/* ATAPI cdb length */
313 	uint8_t		satacmd_acdb[SATA_ATAPI_MAX_CDB_LEN]; /* ATAPI cdb */
314 
315 						/*
316 						 * Ptr to request sense cdb
317 						 * request sense buf
318 						 */
319 	uint8_t		*satacmd_arq_cdb;
320 
321 	uint8_t 	satacmd_rqsense[SATA_ATAPI_RQSENSE_LEN];
322 
323 						/*
324 						 * Ptr to FPDMA error
325 						 * retrieval cmd
326 						 */
327 	struct sata_cmd	*satacmd_rle_sata_cmd;
328 
329 	int		satacmd_num_dma_cookies; /* number of dma cookies */
330 						/* ptr to dma cookie list */
331 	ddi_dma_cookie_t *satacmd_dma_cookie_list;
332 };
333 
334 typedef struct sata_cmd sata_cmd_t;
335 
336 _NOTE(SCHEME_PROTECTS_DATA("unshared data", sata_cmd))
337 
338 
339 /* ATA address type (in satacmd_addr_type field */
340 #define	ATA_ADDR_LBA	0x1
341 #define	ATA_ADDR_LBA28	0x2
342 #define	ATA_ADDR_LBA48	0x4
343 
344 /*
345  * satacmd_flags : contain data transfer direction flags,
346  * tagged queuing type flags, queued command flag, and reset state handling
347  * flag.
348  */
349 
350 /*
351  * Data transfer direction flags (satacmd_flags)
352  * Direction flags are mutually exclusive.
353  */
354 #define	SATA_DIR_NODATA_XFER	0x0001	/* No data transfer */
355 #define	SATA_DIR_READ		0x0002	/* Reading data from a device */
356 #define	SATA_DIR_WRITE		0x0004	/* Writing data to a device */
357 
358 #define	SATA_XFER_DIR_MASK	0x0007
359 
360 /*
361  * Tagged Queuing type flags (satacmd_flags).
362  * These flags indicate how the SATA command should be queued.
363  *
364  * SATA_QUEUE_STAG_CMD
365  * Simple-queue-tagged command. It may be executed out-of-order in respect
366  * to other queued commands.
367  * SATA_QUEUE_OTAG_CMD
368  * Ordered-queue-tagged command. It cannot be executed out-of-order in
369  * respect to other commands, i.e. it should be executed in the order of
370  * being transported to the HBA.
371  *
372  * Translated head-of-queue-tagged scsi commands and commands that are
373  * to be put at the head of the queue are treated as SATA_QUEUE_OTAG_CMD
374  * tagged commands.
375  */
376 #define	SATA_QUEUE_STAG_CMD	0x0010	/* simple-queue-tagged command */
377 #define	SATA_QUEUE_OTAG_CMD	0x0020	/* ordered-queue-tagged command */
378 
379 
380 /*
381  * Queuing command set-up flag (satacmd_flags).
382  * This flag indicates that sata_cmd was set-up for DMA Queued command
383  * (either READ_DMA_QUEUED, READ_DMA_QUEUED_EXT, WRITE_DMA_QUEUED or
384  * WRITE_DMA_QUEUED_EXT command) or one of the Native Command Queuing commands
385  * (either READ_FPDMA_QUEUED or WRITE_FPDMA_QUEUED).
386  * This flag will be used only if sata_tran_hba_flags indicates controller
387  * support for queuing and the device for which sata_cmd is prepared supports
388  * either legacy queuing (indicated by Device Identify data word 83 bit 2)
389  * or NCQ (indicated by  word 76 of Device Identify data).
390  */
391 #define	SATA_QUEUED_CMD			0x0100
392 
393 
394 /*
395  * Reset state handling (satacmd_flags).
396  * SATA HBA device enters reset state if the device was subjected to
397  * the Device Reset (may also enter this state if the device was reset
398  * as a side effect of port reset). SATA HBA driver sets this state.
399  * Device stays in this condition until explicit request from SATA HBA
400  * framework (SATA_CLEAR_DEV_RESET_STATE flag) to clear the state.
401  */
402 #define	SATA_IGNORE_DEV_RESET_STATE	0x1000
403 #define	SATA_CLEAR_DEV_RESET_STATE	0x2000
404 
405 /*
406  * SATA Packet structure (rev 1)
407  * hba_driver_private is for a private use of the SATA HBA driver;
408  * satapkt_framework_private is used only by SATA HBA framework;
409  * satapkt_comp is a callback function to be called when packet
410  * execution is completed (for any reason) if mode of operation is not
411  * synchronous (SATA_OPMODE_SYNCH);
412  * satapkt_reason specifies why the packet operation was completed
413  *
414  * NOTE: after the packet completion callback SATA HBA driver should not
415  * attempt to access any sata_pkt fields because sata_pkt is not valid anymore
416  * (it could have been destroyed).
417  * Since satapkt_hba_driver_private field cannot be retrieved, any hba private
418  * data respources allocated per packet and accessed via this pointer should
419  * either be freed before the completion callback is done, or the pointer has
420  * to be saved by the HBA driver before the completion callback.
421  */
422 #define	SATA_PKT_REV_1	1
423 #define	SATA_PKT_REV	SATA_PKT_REV_1
424 
425 struct sata_pkt {
426 	int		satapkt_rev;		/* version */
427 	struct sata_device satapkt_device;	/* Device address/type */
428 
429 						/* HBA driver private data */
430 	void		*satapkt_hba_driver_private;
431 
432 						/* SATA framework priv data */
433 	void		*satapkt_framework_private;
434 
435 						/* Rqsted mode of operation */
436 	uint32_t	satapkt_op_mode;
437 
438 	struct sata_cmd	satapkt_cmd;		/* composite sata command */
439 	int		satapkt_time;		/* time allotted to command */
440 	void		(*satapkt_comp)(struct sata_pkt *); /* callback */
441 	int		satapkt_reason; 	/* completion reason */
442 };
443 
444 typedef struct sata_pkt sata_pkt_t;
445 
446 _NOTE(SCHEME_PROTECTS_DATA("unshared data", sata_pkt))
447 
448 
449 /*
450  * Operation mode flags (in satapkt_op_mode field of sata_pkt structure).
451  * Use to specify what should be a mode of operation for specified command.
452  * Default (000b) means use Interrupt and Asynchronous mode to
453  * perform an operation.
454  * Synchronous operation menas that the packet operation has to be completed
455  * before the function called to initiate the operation returns.
456  */
457 #define	SATA_OPMODE_INTERRUPTS	0 /* Use interrupts (hint) */
458 #define	SATA_OPMODE_POLLING	1 /* Use polling instead of interrupts */
459 #define	SATA_OPMODE_ASYNCH	0 /* Return immediately after accepting pkt */
460 #define	SATA_OPMODE_SYNCH	4 /* Perform synchronous operation */
461 
462 /*
463  * satapkt_reason values:
464  *
465  * SATA_PKT_QUEUE_FULL - cmd not sent because of queue full (detected
466  * 	by the controller). If a device reject command for this reason, it
467  * 	should be reported as SATA_PKT_DEV_ERROR
468  *
469  * SATA_PKT_CMD_NOT_SUPPORTED - command not supported by a controller
470  *	Controller is unable to send such command to a device.
471  *	If device rejects a command, it should be reported as
472  *	SATA_PKT_DEV_ERROR.
473  *
474  * SATA_PKT_DEV_ERROR - cmd failed because of device reported an error.
475  *	The content of status_reg (ERROR bit has to be set) and error_reg
476  *	fields of the sata_cmd structure have to be set and will be used
477  *	by SATA HBA Framework to determine the error cause.
478  *
479  * SATA_PKT_PORT_ERROR - cmd failed because of a link or a port error.
480  *	Link failed / no communication with a device / communication error
481  *	or other port related error was detected by a controller.
482  *	sata_pkt.satapkt_device.satadev_scr.sXXXXXXX words have to be set.
483  *
484  * SATA_PKT_ABORTED - cmd execution was aborted by the request from the
485  *	framework. Abort mechanism is HBA driver specific.
486  *
487  * SATA_PKT_TIMEOUT - cmd execution has timed-out. Timeout specified by
488  *	 pkt_time was exceeded. The command was terminated by the SATA HBA
489  *	driver.
490  *
491  * SATA_PKT_COMPLETED - this is a value returned when an operation
492  *	completes without errors.
493  *
494  * SATA_PKT_BUSY - packet was not accepted for execution because the
495  *      driver was busy performing some other operation(s).
496  *
497  * SATA_PKT_RESET - packet execution was aborted because of device
498  * reset originated by either the HBA driver or the SATA framework.
499  *
500  */
501 
502 #define	SATA_PKT_BUSY			-1	/* Not completed, busy */
503 #define	SATA_PKT_COMPLETED		0	/* No error */
504 #define	SATA_PKT_DEV_ERROR		1	/* Device reported error */
505 #define	SATA_PKT_QUEUE_FULL		2	/* Not accepted, queue full */
506 #define	SATA_PKT_PORT_ERROR		3	/* Not completed, port error */
507 #define	SATA_PKT_CMD_UNSUPPORTED	4	/* Cmd unsupported */
508 #define	SATA_PKT_ABORTED		5	/* Aborted by request */
509 #define	SATA_PKT_TIMEOUT		6	/* Operation timeut */
510 #define	SATA_PKT_RESET			7	/* Aborted by reset request */
511 
512 /*
513  * Hoplug functions vector structure (rev 1)
514  */
515 #define	SATA_TRAN_HOTPLUG_OPS_REV_1	1
516 
517 struct sata_tran_hotplug_ops {
518 	int	sata_tran_hotplug_ops_rev; /* version */
519 	int	(*sata_tran_port_activate)(dev_info_t  *, sata_device_t *);
520 	int	(*sata_tran_port_deactivate)(dev_info_t  *, sata_device_t *);
521 };
522 
523 typedef struct sata_tran_hotplug_ops sata_tran_hotplug_ops_t;
524 
525 
526 /*
527  * Power management functions vector structure (rev 1)
528  * The embedded function returns information about the controller's
529  * power level.
530  * Additional functions may be added in the future without changes to
531  * sata_tran structure.
532  */
533 #define	SATA_TRAN_PWRMGT_OPS_REV_1	1
534 
535 struct sata_tran_pwrmgt_ops {
536 	int	sata_tran_pwrmgt_ops_rev; /* version */
537 	int	(*sata_tran_get_pwr_level)(dev_info_t  *, sata_device_t *);
538 };
539 
540 typedef struct sata_tran_pwrmgt_ops sata_tran_pwrmgt_ops_t;
541 
542 
543 /*
544  * SATA port PHY Power Level
545  * These states correspond to the interface power management state as defined
546  * in Serial ATA spec.
547  */
548 #define	SATA_TRAN_PORTPWR_LEVEL1	1 /* Interface in active PM state */
549 #define	SATA_TRAN_PORTPWR_LEVEL2	2 /* Interface in PARTIAL PM state */
550 #define	SATA_TRAN_PORTPWR_LEVEL3	3 /* Interface in SLUMBER PM state */
551 
552 /*
553  * SATA HBA Tran structure (rev 1)
554  * Registered with SATA Framework
555  *
556  * dma_attr is a pointer to data (buffer) dma attibutes of the controller
557  * DMA engine.
558  *
559  * The qdepth field specifies number of commands that may be accepted by
560  * the controller. Value range 1-32. A value greater than 1 indicates that
561  * the controller supports queuing. Support for Native Command Queuing
562  * indicated by SATA_CTLF_NCQ flag also requires qdepth set to a value
563  * greater then 1.
564  *
565  */
566 #define	SATA_TRAN_HBA_REV_1	1
567 #define	SATA_TRAN_HBA_REV	SATA_TRAN_HBA_REV_1
568 
569 struct sata_hba_tran {
570 	int		sata_tran_hba_rev;	/* version */
571 	dev_info_t	*sata_tran_hba_dip;	/* Controler dev info */
572 	ddi_dma_attr_t	*sata_tran_hba_dma_attr; /* DMA attributes */
573 	int		sata_tran_hba_num_cports; /* Num of HBA device ports */
574 	uint16_t	sata_tran_hba_features_support; /* HBA features */
575 	uint16_t	sata_tran_hba_qdepth;	/* HBA-supported queue depth */
576 
577 	int		(*sata_tran_probe_port)(dev_info_t *, sata_device_t *);
578 	int		(*sata_tran_start)(dev_info_t *, sata_pkt_t *);
579 	int		(*sata_tran_abort)(dev_info_t *, sata_pkt_t *, int);
580 	int		(*sata_tran_reset_dport)(dev_info_t *,
581 					sata_device_t *);
582 	int		(*sata_tran_selftest)(dev_info_t *, sata_device_t *);
583 
584 						/* Hotplug vector */
585 	struct sata_tran_hotplug_ops *sata_tran_hotplug_ops;
586 
587 						/* Power mgt vector */
588 	struct sata_tran_pwrmgt_ops *sata_tran_pwrmgt_ops;
589 
590 	int		(*sata_tran_ioctl)(dev_info_t *, int, intptr_t);
591 };
592 
593 typedef struct sata_hba_tran sata_hba_tran_t;
594 
595 
596 /*
597  * Controller's features support flags (sata_tran_hba_features_support).
598  * Note: SATA_CTLF_NCQ indicates that SATA controller supports NCQ in addition
599  * to legacy queuing commands, indicated by SATA_CTLF_QCMD flag.
600  */
601 
602 #define	SATA_CTLF_ATAPI			0x001 /* ATAPI support */
603 #define	SATA_CTLF_PORT_MULTIPLIER 	0x010 /* Port Multiplier suport */
604 #define	SATA_CTLF_HOTPLUG		0x020 /* Hotplug support */
605 #define	SATA_CTLF_ASN			0x040 /* Asynchronous Event Support */
606 #define	SATA_CTLF_QCMD			0x080 /* Queued commands support */
607 #define	SATA_CTLF_NCQ			0x100 /* NCQ support */
608 
609 /*
610  * sata_tran_start() return values.
611  * When pkt is not accepted, the satapkt_reason has to be updated
612  * before function returns - it should reflect the same reason for not being
613  * executed as the return status of above functions.
614  * If pkt was accepted and executed synchronously,
615  * satapk_reason should indicate a completion status.
616  */
617 #define	SATA_TRAN_ACCEPTED		0 /* accepted */
618 #define	SATA_TRAN_QUEUE_FULL		1 /* not accepted, queue full */
619 #define	SATA_TRAN_PORT_ERROR		2 /* not accepted, port error */
620 #define	SATA_TRAN_CMD_UNSUPPORTED	3 /* not accepted, cmd not supported */
621 #define	SATA_TRAN_BUSY			4 /* not accepted, busy */
622 
623 
624 /*
625  * sata_tran_abort() abort type flag
626  */
627 #define	SATA_ABORT_PACKET		0
628 #define	SATA_ABORT_ALL_PACKETS		1
629 
630 
631 /*
632  * Events handled by SATA HBA Framework
633  * More then one event may be reported at the same time
634  *
635  * SATA_EVNT__DEVICE_ATTACHED
636  * HBA detected the presence of a device ( electrical connection with
637  * a device was detected ).
638  *
639  * SATA_EVNT_DEVICE_DETACHED
640  * HBA detected the detachment of a device (electrical connection with
641  * a device was broken)
642  *
643  * SATA_EVNT_LINK_LOST
644  * HBA lost link with an attached device
645  *
646  * SATA_EVNT_LINK_ESTABLISHED
647  * HBA established a link with an attached device
648  *
649  * SATA_EVNT_PORT_FAILED
650  * HBA has determined that the port failed and is unuseable
651  *
652  * SATA_EVENT_DEVICE_RESET
653  * SATA device was reset, causing loss of the device setting
654  *
655  * SATA_EVNT_PWR_LEVEL_CHANGED
656  * A port or entire SATA controller power level has changed
657  *
658  */
659 #define	SATA_EVNT_DEVICE_ATTACHED	0x01
660 #define	SATA_EVNT_DEVICE_DETACHED	0x02
661 #define	SATA_EVNT_LINK_LOST		0x04
662 #define	SATA_EVNT_LINK_ESTABLISHED	0x08
663 #define	SATA_EVNT_PORT_FAILED		0x10
664 #define	SATA_EVNT_DEVICE_RESET		0x20
665 #define	SATA_EVNT_PWR_LEVEL_CHANGED	0x40
666 
667 /*
668  * SATA Framework interface entry points
669  */
670 int 	sata_hba_init(struct modlinkage *);
671 int 	sata_hba_attach(dev_info_t *, sata_hba_tran_t *, ddi_attach_cmd_t);
672 int 	sata_hba_detach(dev_info_t *, ddi_detach_cmd_t);
673 void 	sata_hba_fini(struct modlinkage *);
674 void 	sata_hba_event_notify(dev_info_t *, sata_device_t *, int);
675 
676 
677 #ifdef	__cplusplus
678 }
679 #endif
680 
681 #endif /* _SATA_HBA_H */
682