xref: /titanic_44/usr/src/uts/common/sys/sata/impl/sata.h (revision fb3fb4f3d76d55b64440afd0af72775dfad3bd1d)
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_H
28 #define	_SATA_H
29 
30 #pragma ident	"%Z%%M%	%I%	%E% SMI"
31 
32 #ifdef	__cplusplus
33 extern "C" {
34 #endif
35 
36 /*
37  * Generic SATA Host Adapter Implementation
38  */
39 
40 #include <sys/types.h>
41 #include <sys/scsi/scsi.h>
42 #include <sys/scsi/impl/services.h>
43 #include <sys/sata/sata_defs.h>
44 #include <sys/sata/sata_hba.h>
45 
46 /* Statistics counters */
47 struct sata_port_stats {
48 	uint64_t	link_lost;		/* event counter */
49 	uint64_t	link_established;	/* event counter */
50 	uint64_t	device_attached;	/* event counter */
51 	uint64_t	device_detached;	/* event counter */
52 	uint64_t	port_reset;		/* event counter */
53 	uint64_t	port_pwr_changed;	/* event counter */
54 };
55 
56 typedef struct sata_port_stats sata_port_stats_t;
57 
58 struct sata_drive_stats {
59 	uint64_t	media_error;		/* available ??? */
60 	uint64_t	drive_reset;		/* event counter */
61 } sata_drv_stats_t;
62 
63 typedef struct sata_drive_stats sata_drive_stats_t;
64 
65 struct sata_ctrl_stats {
66 	uint64_t	ctrl_reset;		/* event counter */
67 	uint64_t	ctrl_pwr_change;	/* event counter */
68 };
69 
70 typedef struct sata_ctrl_stats sata_ctrl_stats_t;
71 
72 
73 /*
74  * SATA HBA instance info structure
75  */
76 struct sata_hba_inst {
77 	dev_info_t		*satahba_dip;	/* this HBA instance devinfo */
78 	struct sata_hba_inst	*satahba_next;	/* ptr to next sata_hba_inst */
79 	struct sata_hba_inst	*satahba_prev;	/* ptr to prev sata_hba_inst */
80 	struct scsi_hba_tran	*satahba_scsi_tran; /* scsi_hba_tran */
81 	struct sata_hba_tran	*satahba_tran;	/* sata_hba_tran */
82 	kmutex_t		satahba_mutex;	/* sata hba cntrl mutex */
83 
84 						/*
85 						 * HBA event flags:
86 						 * SATA_EVNT_MAIN
87 						 * SATA_EVNT_PWR_LEVEL_CHANGED
88 						 * SATA_EVNT_SKIP
89 						 */
90 	uint_t			satahba_event_flags;
91 
92 	struct sata_cport_info	*satahba_dev_port[SATA_MAX_CPORTS];
93 
94 						/*
95 						 * DEVCTL open flag:
96 						 * SATA_DEVCTL_SOPENED
97 						 * SATA_DEVCTL_EXOPENED
98 						 */
99 	uint_t			satahba_open_flag; /* shared open flag */
100 	struct sata_ctrl_stats	satahba_stats;	/* HBA cntrl statistics */
101 
102 	uint_t			satahba_attached; /* HBA attaching: */
103 						/* 0 - not completed */
104 						/* 1 - completed */
105 };
106 
107 typedef struct sata_hba_inst	sata_hba_inst_t;
108 
109 /*
110  * SATA controller's device port info and state.
111  * This structure is pointed to by the sata_hba_inst.satahba_dev_port[x]
112  * where x is a device port number.
113  * cport_state holds port state flags, defined in sata_hba.h file.
114  * cport_event_flags holds SATA_EVNT_* flags defined in this file and in
115  * sata_hba.h file.
116  * cport_dev_type holds SATA_DTYPE_* types defined in sata_hba.h file.
117  */
118 struct sata_cport_info {
119 	sata_address_t		cport_addr;	/* this port SATA address */
120 	kmutex_t		cport_mutex;	/* port mutex */
121 
122 						/*
123 						 * Port state flags
124 						 * SATA_STATE_UNKNOWN
125 						 * SATA_STATE_PROBING
126 						 * SATA_STATE_PROBED
127 						 * SATA_STATE_READY
128 						 * SATA_PSTATE_PWRON
129 						 * SATA_PSTATE_PWROFF
130 						 * SATA_PSTATE_SHUTDOWN
131 						 * SATA_PSTATE_FAILED
132 						 */
133 	uint32_t		cport_state;
134 
135 						/*
136 						 * Port event flags:
137 						 * SATA_EVNT_DEVICE_ATTACHED
138 						 * SATA_EVNT_DEVICE_DETACHED
139 						 * SATA_EVNT_LINK_LOST
140 						 * SATA_EVNT_LINK_ESTABLISHED
141 						 * SATA_EVNT_PORT_FAILED
142 						 * SATA_EVNT_PWR_LEVEL_CHANGED
143 						 */
144 	uint32_t		cport_event_flags;
145 
146 	struct sata_port_scr	cport_scr;	/* Port status and ctrl regs */
147 
148 						/*
149 						 * Attached device type:
150 						 * SATA_DTYPE_NONE
151 						 * SATA_DTYPE_ATADISK
152 						 * SATA_DTYPE_ATAPICD
153 						 * SATA_DTYPE_ATAPINONCD
154 						 * SATA_DTYPE_PMULT
155 						 * SATA_DTYPE_UNKNOWN
156 						 */
157 	uint32_t		cport_dev_type;
158 	union {
159 	    struct sata_drive_info *cport_sata_drive; /* Attached drive info */
160 	    struct sata_pmult_info *cport_sata_pmult; /* Attached Port Mult */
161 	} 			cport_devp;
162 						/* lbolt value at link lost */
163 	clock_t			cport_link_lost_time;
164 
165 	struct sata_port_stats	cport_stats;	/* Port statistics */
166 };
167 
168 typedef struct sata_cport_info sata_cport_info_t;
169 
170 /*
171  * Attached SATA drive info and state.
172  * This structure is pointed to by sata_cport_info's cport_sata_drive field
173  * when a drive is attached directly to a controller device port.
174  */
175 struct sata_drive_info {
176 	sata_address_t	satadrv_addr;		/* this drive SATA address */
177 
178 						/*
179 						 * Drive state flags
180 						 * SATA_STATE_UNKNOWN
181 						 * SATA_STATE_PROBING
182 						 * SATA_STATE_PROBED
183 						 * SATA_STATE_READY
184 						 * SATA_DSTATE_PWR_ACTIVE
185 						 * SATA_DSTATE_PWR_IDLE
186 						 * SATA_DSTATE_RESET
187 						 * SATA_DSTATE_FAILED
188 						 */
189 	uint32_t	satadrv_state;
190 
191 						/*
192 						 * drive event flags:
193 						 * SATA_EVNT_DRIVE_RESET
194 						 */
195 	uint32_t	satadrv_event_flags;
196 
197 						/*
198 						 * Attached device type:
199 						 * SATA_DTYPE_ATADISK
200 						 * SATA_DTYPE_ATAPICD
201 						 * SATA_DTYPE_ATAPINONCD
202 						 */
203 	uint32_t	satadrv_type;
204 
205 	uint32_t	satadrv_status_reg;	/* drive status reg */
206 	uint32_t	satadrv_error_reg;	/* drive error reg */
207 	uint16_t	satadrv_features_support; /* drive features support */
208 	uint16_t	satadrv_queue_depth;    /* drive queue depth */
209 	uint16_t	satadrv_settings;	/* drive settings flags */
210 	uint16_t	satadrv_pad2;		/* struct alignment pad */
211 	uint64_t	satadrv_capacity;	/* drive capacity */
212 	sata_id_t	satadrv_id;		/* Device Identify Data */
213 	struct sata_drive_stats satadrv_stats;	/* drive statistics */
214 };
215 
216 typedef struct sata_drive_info sata_drive_info_t;
217 
218 _NOTE(SCHEME_PROTECTS_DATA("unshared data", sata_drive_info))
219 
220 
221 /* Port Multiplier & host port info and state */
222 struct sata_pmult_info {
223 	sata_address_t	pmult_addr;		/* this PMult SATA Address */
224 	kmutex_t	pmult_mutex;		/* pmult (host port) mutex */
225 
226 						/*
227 						 * PMult state flags
228 						 * SATA_STATE_UNKNOWN
229 						 * SATA_STATE_PROBING
230 						 * SATA_STATE_PROBED
231 						 * SATA_STATE_READY
232 						 * SATA_PSTATE_FAILED
233 						 */
234 	uint32_t	pmult_state;
235 	uint32_t	pmult_event_flags;	/* Undefined for now */
236 	struct sata_port_scr pmult_scr;		/* Host port SCR block */
237 	uint32_t	pmult_num_dev_ports; 	/* Number of data ports */
238 	struct sata_pmport_info	*pmult_dev_port[SATA_MAX_PMPORTS - 1];
239 };
240 
241 typedef	struct sata_pmult_info sata_pmult_info_t;
242 
243 /* Port Multiplier's device port info & state */
244 struct sata_pmport_info {
245 	sata_address_t	pmport_addr;		/* this SATA port address */
246 	kmutex_t	pmport_mutex;		/* pmult device port mutex */
247 
248 						/*
249 						 * Port state flags
250 						 * SATA_STATE_UNKNOWN
251 						 * SATA_STATE_PROBING
252 						 * SATA_STATE_PROBED
253 						 * SATA_STATE_READY
254 						 * SATA_PSTATE_PWRON
255 						 * SATA_PSTATE_PWROFF
256 						 * SATA_PSTATE_SHUTDOWN
257 						 * SATA_PSTATE_FAILED
258 						 */
259 	uint32_t	pmport_state;
260 
261 						/*
262 						 * Port event flags:
263 						 * SATA_EVNT_DEVICE_ATTACHED
264 						 * SATA_EVNT_DEVICE_DETACHED
265 						 * SATA_EVNT_LINK_LOST
266 						 * SATA_EVNT_LINK_ESTABLISHED
267 						 * SATA_EVNT_PORT_FAILED
268 						 * SATA_EVNT_PWR_LEVEL_CHANGED
269 						 */
270 	uint32_t	pmport_event_flags;
271 
272 	struct sata_port_scr pmport_scr;	/* PMult device port scr */
273 
274 						/*
275 						 * Attached device type:
276 						 * SATA_DTYPE_NONE
277 						 * SATA_DTYPE_ATADISK
278 						 * SATA_DTYPE_ATAPICD
279 						 * SATA_DTYPE_ATAPINONCD
280 						 * SATA_DTYPE_UNKNOWN
281 						 */
282 	uint32_t	pmport_dev_type;
283 
284 	struct sata_drive_info	*pmport_sata_drive; /* Attached drive info */
285 
286 						/* lbolt value at link lost */
287 	clock_t		pmport_link_lost_time;
288 
289 	struct sata_port_stats	pmport_stats;	/* Port statistics */
290 };
291 
292 typedef	struct sata_pmport_info sata_pmport_info_t;
293 
294 /*
295  * Port SSTATUS register (sata_port_scr sport_sstatus field).
296  * Link bits are valid only in port active state.
297  */
298 #define	SATA_PORT_DEVLINK_UP	0x00000103	/* Link with dev established */
299 #define	SATA_PORT_DEVLINK_UP_MASK 0x0000010F	/* Mask for link bits */
300 
301 /*
302  * Port state clear mask (cport_state and pmport_state fields).
303  * SATA_PSTATE_SHUTDOWN and power state are preserved.
304  */
305 #define	SATA_PORT_STATE_CLEAR_MASK	(~(SATA_PSTATE_SHUTDOWN))
306 
307 /*
308  * Valid i.e.supported device types mask (cport_dev_type, satadrv_type,
309  * pmult_dev_type fields).
310  */
311 #define	SATA_VALID_DEV_TYPE	(SATA_DTYPE_ATADISK)	/* only disks now */
312 
313 /*
314  * Device feature_support (satadrv_features_support)
315  */
316 #define	SATA_DEV_F_DMA			0x01
317 #define	SATA_DEV_F_LBA28		0x02
318 #define	SATA_DEV_F_LBA48		0x04
319 #define	SATA_DEV_F_NCQ			0x08
320 #define	SATA_DEV_F_SATA1		0x10
321 #define	SATA_DEV_F_SATA2		0x20
322 
323 /*
324  * Drive settings flags (satdrv_settings)
325  */
326 #define	SATA_DEV_READ_AHEAD		0x0001	/* Read Ahead enabled */
327 #define	SATA_DEV_WRITE_CACHE		0x0002	/* Write cache ON */
328 #define	SATA_DEV_SERIAL_FEATURES 	0x8000	/* Serial ATA feat. enabled */
329 #define	SATA_DEV_ASYNCH_NOTIFY		0x2000	/* Asynch-event enabled */
330 
331 
332 /*
333  * Internal event and flags.
334  * These flags are set in the *_event_flags fields of various structures.
335  * Events and lock flags defined below are used internally by the
336  * SATA framework (they are not reported by SATA HBA drivers).
337  */
338 #define	SATA_EVNT_MAIN			0x80000000
339 #define	SATA_EVNT_SKIP			0x40000000
340 #define	SATA_EVNT_INPROC_DEVICE_RESET	0x08000000
341 #define	SATA_EVNT_CLEAR_DEVICE_RESET	0x04000000
342 
343 /*
344  * Lock flags - used to serialize configuration operations
345  * on ports and devices.
346  * SATA_EVNT_LOCK_PORT_BUSY is set by event daemon to prevent
347  * simultaneous cfgadm operations.
348  * SATA_APCTL_LOCK_PORT_BUSY is set by cfgadm ioctls to prevent
349  * simultaneous event processing.
350  */
351 #define	SATA_EVNT_LOCK_PORT_BUSY	0x00800000
352 #define	SATA_APCTL_LOCK_PORT_BUSY	0x00400000
353 
354 /* Mask for port events */
355 #define	SATA_EVNT_PORT_EVENTS		(SATA_EVNT_DEVICE_ATTACHED | \
356 					SATA_EVNT_DEVICE_DETACHED | \
357 					SATA_EVNT_LINK_LOST | \
358 					SATA_EVNT_LINK_ESTABLISHED | \
359 					SATA_EVNT_PORT_FAILED)
360 /* Mask for drive events */
361 #define	SATA_EVNT_DRIVE_EVENTS		SATA_EVNT_DEVICE_RESET
362 #define	SATA_EVNT_CONTROLLER_EVENTS	SATA_EVNT_PWR_LEVEL_CHANGED
363 
364 /* Delays and timeounts definitions */
365 #define	SATA_EVNT_DAEMON_SLEEP_TIME	50000	/* 50 ms */
366 #define	SATA_EVNT_DAEMON_TERM_TIMEOUT	100000	/* 100 ms */
367 #define	SATA_EVNT_DAEMON_TERM_WAIT	60000000 /* 60 s */
368 #define	SATA_EVNT_LINK_LOST_TIMEOUT	1000000	/* 1 s */
369 
370 #define	SATA_DEVICE_IDENTIFY_RETRY	2
371 
372 /*
373  * sata_scsi's hba_open_flag: field indicating open devctl instance.
374  *	0 = closed, 1 = shared open, 2 = exclusive open.
375  */
376 #define	SATA_DEVCTL_CLOSED	0
377 #define	SATA_DEVCTL_SOPENED	1
378 #define	SATA_DEVCTL_EXOPENED	2
379 
380 /*
381  * sata_pkt_txlate structure contains info about resources allocated
382  * for the packet
383  * Address of this structure is stored in scsi_pkt.pkt_ha_private and
384  * in sata_pkt.sata_hba_private fields, so all three strucures are
385  * cross-linked, with sata_pkt_txlate as a centerpiece.
386  */
387 
388 typedef struct sata_pkt_txlate {
389 	struct sata_hba_inst	*txlt_sata_hba_inst;
390 	struct scsi_pkt		*txlt_scsi_pkt;
391 	struct sata_pkt		*txlt_sata_pkt;
392 	ddi_dma_handle_t	txlt_buf_dma_handle;
393 	uint_t			txlt_flags;	/* data-in / data-out */
394 	uint_t			txlt_num_dma_win; /* number of DMA windows */
395 	uint_t			txlt_cur_dma_win; /* current DMA window */
396 
397 				/* cookies in the current DMA window */
398 	uint_t			txlt_curwin_num_dma_cookies;
399 
400 				/* procesed dma cookies in current DMA win */
401 	uint_t			txlt_curwin_processed_dma_cookies;
402 	size_t			txlt_total_residue;
403 	int			txlt_dma_cookie_list_len; /* alloc list len */
404 	ddi_dma_cookie_t 	*txlt_dma_cookie_list; /* dma cookie list */
405 	int			txlt_num_dma_cookies; /* dma cookies in list */
406 } sata_pkt_txlate_t;
407 
408 _NOTE(SCHEME_PROTECTS_DATA("unshared data", sata_pkt_txlate))
409 _NOTE(SCHEME_PROTECTS_DATA("unshared data", scsi_pkt))
410 
411 
412 /*
413  * Additional scsi sense code definitions.
414  * These definition should eventually be moved to scsi header files.
415  */
416 #define	SD_SCSI_NO_ADD_SENSE			0x00
417 #define	SD_SCSI_LU_NOT_READY			0x04
418 #define	SD_SCSI_WRITE_ERROR			0x0c
419 #define	SD_SCSI_UNREC_READ_ERROR		0x11
420 #define	SD_SCSI_INVALID_COMMAND_CODE		0x20
421 #define	SD_SCSI_LBA_OUT_OF_RANGE		0x21
422 #define	SD_SCSI_INVALID_FIELD_IN_CDB		0x24
423 #define	SD_SCSI_INVALID_FIELD_IN_PARAMETER_LIST 0x26
424 #define	SD_SCSI_SAVING_PARAMS_NOT_SUP		0x39
425 
426 
427 /* SCSI defs missing from scsi headers */
428 /* Missing from sys/scsi/generic/commands.h */
429 #define	SCMD_SYNCHRONIZE_CACHE_G1		0x91
430 /*
431  * Missing from sys/scsi/impl/mode.h, although defined
432  * in sys/scsi/targets/sddefs.h as MODEPAGE_ERR_RECOV
433  */
434 #define	MODEPAGE_RW_ERRRECOV			0x01 /* read/write recovery */
435 
436 /*
437  * Macros for accessing various structure fields
438  *
439  */
440 
441 #define	SATA_TRAN(sata_hba_inst) \
442 	sata_hba_inst->satahba_tran
443 
444 #define	SATA_DIP(sata_hba_inst) \
445 	sata_hba_inst->satahba_dip
446 
447 #define	SATA_NUM_CPORTS(sata_hba_inst) \
448 	sata_hba_inst->satahba_tran->sata_tran_hba_num_cports
449 
450 #define	SATA_QDEPTH(sata_hba_inst) \
451 	sata_hba_inst->satahba_tran->sata_tran_hba_qdepth
452 
453 #define	SATA_FEATURES(sata_hba_inst) \
454 	sata_hba_inst->satahba_tran->sata_tran_hba_features_support
455 
456 #define	SATA_DMA_ATTR(sata_hba_inst) \
457 	sata_hba_inst->satahba_tran->sata_tran_hba_dma_attr
458 
459 #define	SATA_START_FUNC(sata_hba_inst) \
460 	sata_hba_inst->satahba_tran->sata_tran_start
461 
462 #define	SATA_ABORT_FUNC(sata_hba_inst) \
463 	sata_hba_inst->satahba_tran->sata_tran_abort
464 
465 #define	SATA_RESET_DPORT_FUNC(sata_hba_inst) \
466 	sata_hba_inst->satahba_tran->sata_tran_reset_dport
467 
468 #define	SATA_PORT_DEACTIVATE_FUNC(sata_hba_inst) \
469 	(sata_hba_inst->satahba_tran->sata_tran_hotplug_ops == NULL ? \
470 	NULL : \
471 	sata_hba_inst->satahba_tran->sata_tran_hotplug_ops->\
472 	sata_tran_port_deactivate)
473 
474 #define	SATA_PORT_ACTIVATE_FUNC(sata_hba_inst) \
475 	(sata_hba_inst->satahba_tran->sata_tran_hotplug_ops == NULL ? \
476 	NULL : \
477 	sata_hba_inst->satahba_tran->sata_tran_hotplug_ops->\
478 	sata_tran_port_activate)
479 
480 #define	SATA_PROBE_PORT_FUNC(sata_hba_inst) \
481 	sata_hba_inst->satahba_tran->sata_tran_probe_port
482 
483 #define	SATA_SELFTEST_FUNC(sata_hba_inst) \
484 	sata_hba_inst->satahba_tran->sata_tran_selftest
485 
486 #define	SATA_CPORT_MUTEX(sata_hba_inst, cport) \
487 	sata_hba_inst->satahba_dev_port[cport]->cport_mutex
488 
489 #define	SATA_CPORT_INFO(sata_hba_inst, cport) \
490 	sata_hba_inst->satahba_dev_port[cport]
491 
492 #define	SATA_CPORT_STATE(sata_hba_inst, cport) \
493 	sata_hba_inst->satahba_dev_port[cport]->cport_state
494 
495 #define	SATA_CPORT_SCR(sata_hba_inst, cport) \
496 	sata_hba_inst->satahba_dev_port[cport]->cport_scr
497 
498 #define	SATA_CPORT_DEV_TYPE(sata_hba_inst, cport) \
499 	sata_hba_inst->satahba_dev_port[cport]->cport_dev_type
500 
501 #define	SATA_CPORT_DRV_INFO(sata_hba_inst, cport) \
502 	sata_hba_inst->satahba_dev_port[cport]->cport_devp.cport_sata_drive
503 
504 #define	SATA_CPORTINFO_DRV_TYPE(cportinfo) \
505 	cportinfo->cport_dev_type
506 
507 #define	SATA_CPORTINFO_DRV_INFO(cportinfo) \
508 	cportinfo->cport_devp.cport_sata_drive
509 
510 #define	SATA_CPORTINFO_PMULT_INFO(cportinfo) \
511 	cportinfo->cport_devp.cport_sata_pmult
512 
513 #define	SATA_PMULT_INFO(sata_hba_inst, cport) \
514 	sata_hba_inst->satahba_dev_port[cport]->cport_devp.cport_sata_pmult
515 
516 #define	SATA_NUM_PMPORTS(sata_hba_inst, cport) \
517 	sata_hba_inst->satahba_dev_port[cport]->\
518 	cport_devp.cport_sata_pmult->pmult_num_dev_ports
519 
520 #define	SATA_PMPORT_INFO(sata_hba_inst, cport, pmport) \
521 	sata_hba_inst->satahba_dev_port[cport]->\
522 	cport_devp.cport_sata_pmult->pmult_dev_port[pmport]
523 
524 #define	SATA_PMPORT_DRV_INFO(sata_hba_inst, cport, pmport) \
525 	sata_hba_inst->satahba_dev_port[cport]->\
526 	cport_devp.cport_sata_pmult->pmult_dev_port[pmport]->\
527 	pmport_sata_drive
528 
529 #define	SATA_PMPORT_STATE(sata_hba_inst, cport, pmport) \
530 	sata_hba_inst->satahba_dev_port[cport]->\
531 	cport_devp.cport_sata_pmult->pmult_dev_port[pmport]->pmport_state
532 
533 #define	SATA_PMPORT_SCR(sata_hba_inst, cport, pmport) \
534 	sata_hba_inst->satahba_dev_port[cport]->\
535 	cport_devp.cport_sata_pmult->pmult_dev_port[pmport]->pmport_scr
536 
537 #define	SATA_PMPORT_DEV_TYPE(sata_hba_inst, cport, pmport) \
538 	sata_hba_inst->satahba_dev_port[cport]->\
539 	cport_devp.cport_sata_pmult->pmult_dev_port[pmport]->pmport_dev_type
540 
541 #define	SATA_TXLT_HBA_INST(spx) \
542 	spx->txlt_sata_hba_inst
543 
544 #define	SATA_TXLT_CPORT(spx) \
545 	spx->txlt_sata_pkt->satapkt_device.satadev_addr.cport
546 
547 #define	SATA_TXLT_CPORT_MUTEX(spx) \
548 	spx->txlt_sata_hba_inst->\
549 	satahba_dev_port[spx->txlt_sata_pkt->\
550 	satapkt_device.satadev_addr.cport]->cport_mutex
551 
552 /*
553  * Minor number construction for devctl and attachment point nodes.
554  * All necessary information has to be encoded in NBITSMINOR32 bits.
555  *
556  * Devctl node minor number:
557  * ((controller_instance << SATA_CNTRL_INSTANCE_SHIFT) | SATA_DEVCTL_NODE)
558  *
559  * Attachment point node minor number has to include controller
560  * instance (7 bits), controller port number (5 bits) and port multiplier
561  * device port number (4 bits) and port multiplier device port
562  * indicator (1 bit).  Additionally, a single bit is used to
563  * differentiate between attachment point node and device control node.
564  *
565  * Attachment point minor number:
566  * ((controller_instance << SATA_CNTRL_INSTANCE_SHIFT) | SATA_AP_NODE |
567  * [(port_multiplier_device_port << SATA_PMULT_PORT_SHIFT) | SATA_PMULT_AP] |
568  * (controller_port))
569  *
570  * 17 bits are used (if 64 instances of controllers are expected)
571  * bit 18 is reserved for future use.
572  *
573  *   --------------------------------------------------------
574  *   |17|16|15|14|13|12|11|10 |09|08|07|06|05|04|03|02|01|00|
575  *   --------------------------------------------------------
576  *   | R| c| c| c| c| c| c|a/d|pm|pp|pp|pp|pp|cp|cp|cp|cp|cp|
577  *   --------------------------------------------------------
578  * Where:
579  * cp  - device port number on the HBA SATA controller
580  * pp  - device port number on the port multiplier
581  * pm  - 0 - target attached to controller device port
582  *       1 - target attached to port multiplier's device port
583  * a/d - 0 - devctl node
584  *       1 - attachment point node
585  * c   - controller number
586  * R   - reserved bit
587  */
588 
589 #define	SATA_AP_NODE		0x400		/* Attachment Point node */
590 #define	SATA_DEVCTL_NODE	0x000		/* DEVCTL node */
591 #define	SATA_PMULT_AP		0x200		/* device on PMult port */
592 #define	SATA_PMULT_PORT_SHIFT	5
593 #define	SATA_CNTRL_INSTANCE_SHIFT 11
594 #define	SATA_CPORT_MASK		0x1f		/* 32 device ports */
595 #define	SATA_PMULT_PORT_MASK	0xf		/* 15 device ports */
596 #define	SATA_CNTRL_INSTANCE_MASK 0x03F		/* 64 controllers */
597 
598 /* Macro for creating devctl node minor number */
599 #define	SATA_MAKE_DEVCTL_MINOR(controller_instance) \
600 	((controller_instance << SATA_CNTRL_INSTANCE_SHIFT) | \
601 	SATA_DEVCTL_NODE)
602 
603 /* Macro for creating an attachment point node minor number */
604 #define	SATA_MAKE_AP_MINOR(cntrl_instance, cport, pmport, qual) \
605 	(qual & (SATA_ADDR_PMPORT | SATA_ADDR_DPMPORT) ? \
606 	(((cntrl_instance) << SATA_CNTRL_INSTANCE_SHIFT) | \
607 	SATA_AP_NODE | SATA_PMULT_AP | \
608 	(pmport << SATA_PMULT_PORT_SHIFT) | cport) : \
609 	(((cntrl_instance) << SATA_CNTRL_INSTANCE_SHIFT) | \
610 	SATA_AP_NODE | cport))
611 
612 /* Macro retrieving controller number from a minor number */
613 #define	SATA_MINOR2INSTANCE(minor) \
614 	((minor >> SATA_CNTRL_INSTANCE_SHIFT) & SATA_CNTRL_INSTANCE_MASK)
615 
616 
617 /*
618  * SCSI target number format
619  *
620  *   -------------------------------
621  *   | 9| 8| 7| 6| 5| 4| 3| 2| 1| 0|    Bit number
622  *   -------------------------------
623  *   |pm|pp|pp|pp|pp|cp|cp|cp|cp|cp|
624  *   -------------------------------
625  * Where:
626  * cp  - device port number on the HBA SATA controller
627  * pp  - device port number on the port multiplier
628  * pm  - 0 - target attached to controller device port
629  *       1 - target attached to port multiplier's device port
630  */
631 
632 /* SATA ports to SCSI target number translation */
633 
634 #define	SATA_TO_SCSI_TARGET(cport, pmport, qual) \
635 	(qual == SATA_ADDR_DCPORT ? cport : \
636 	(cport | (pmport << SATA_PMULT_PORT_SHIFT) | SATA_PMULT_AP))
637 
638 /* SCSI target number to SATA cntrl/pmport/cport translations */
639 #define	SCSI_TO_SATA_CPORT(scsi_target) \
640 	(scsi_target & SATA_CPORT_MASK)
641 
642 #define	SCSI_TO_SATA_PMPORT(scsi_target) \
643 	((scsi_target >> SATA_PMULT_PORT_SHIFT) & SATA_PMULT_PORT_MASK)
644 
645 #define	SCSI_TO_SATA_ADDR_QUAL(scsi_target) \
646 	((scsi_target & SATA_PMULT_AP) ? SATA_ADDR_DPMPORT : \
647 	SATA_ADDR_DCPORT)
648 
649 
650 /* Debug flags */
651 #if	DEBUG
652 
653 #define	SATA_DEBUG
654 #define	SATA_DBG_SCSI_IF	1
655 #define	SATA_DBG_HBA_IF		2
656 #define	SATA_DBG_NODES		4
657 #define	SATA_DBG_IOCTL_IF	8
658 #define	SATA_DBG_EVENTS		0x10
659 #define	SATA_DBG_EVENTS_PROC	0x20
660 #define	SATA_DBG_EVENTS_PROCPST	0x40
661 #define	SATA_DBG_EVENTS_CNTRL	0x80
662 #define	SATA_DBG_EVENTS_DAEMON	0x100
663 #define	SATA_DBG_DMA_SETUP	0x400
664 
665 extern int sata_debug_flag;
666 
667 /* Debug macros */
668 #define	SATADBG1(flag, sata, format, arg1) \
669 	if (sata_debug_flags & (flag)) { \
670 		sata_log(sata, CE_CONT, format, arg1); \
671 	}
672 
673 #define	SATADBG2(flag, sata, format, arg1, arg2) \
674 	if (sata_debug_flags & (flag)) { \
675 		sata_log(sata, CE_CONT, format, arg1, arg2); \
676 	}
677 
678 #define	SATADBG3(flag, sata, format, arg1, arg2, arg3) \
679 	if (sata_debug_flags & (flag)) { \
680 		sata_log(sata, CE_CONT, format, arg1, arg2, arg3); \
681 	}
682 #else
683 
684 #define	SATADBG1(flag, dip, frmt, arg1)
685 #define	SATADBG2(flag, dip, frmt, arg1, arg2)
686 #define	SATADBG3(flag, dip, frmt, arg1, arg2, arg3)
687 
688 #endif
689 
690 #ifdef	__cplusplus
691 }
692 #endif
693 
694 #endif /* _SATA_H */
695