nv_sata.h revision 13106:98bb3694e858
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 (c) 2007, 2010, Oracle and/or its affiliates. All rights reserved.
24 */
25
26#ifndef _NV_SATA_H
27#define	_NV_SATA_H
28
29
30#ifdef	__cplusplus
31extern "C" {
32#endif
33
34
35/*
36 * SGPIO Support
37 * Enable SGPIO support only on x86/x64, because it is implemented using
38 * functions that are only available on x86/x64.
39 */
40
41#define	NV_MAX_PORTS(nvc) nvc->nvc_sata_hba_tran.sata_tran_hba_num_cports
42
43typedef struct nv_port nv_port_t;
44
45#ifdef SGPIO_SUPPORT
46typedef struct nv_sgp_cmn nv_sgp_cmn_t;
47#endif
48
49/*
50 * sizes of strings to allocate
51 */
52#define	NV_STR_LEN	10
53#define	NV_LOGBUF_LEN	512
54#define	NV_REASON_LEN	30
55
56
57typedef struct nv_ctl {
58	/*
59	 * Each of these are specific to the chipset in use.
60	 */
61	uint_t		(*nvc_interrupt)(caddr_t arg1, caddr_t arg2);
62	void		(*nvc_reg_init)(struct nv_ctl *nvc,
63			    ddi_acc_handle_t pci_conf_handle);
64
65	dev_info_t	*nvc_dip; /* devinfo pointer of controller */
66
67	struct nv_port	*nvc_port; /* array of pointers to port struct */
68
69	/*
70	 * handle and base address to register space.
71	 *
72	 * 0: port 0 task file
73	 * 1: port 0 status
74	 * 2: port 1 task file
75	 * 3: port 1 status
76	 * 4: bus master for both ports
77	 * 5: extended registers for SATA features
78	 */
79	ddi_acc_handle_t nvc_bar_hdl[6];
80	uchar_t		*nvc_bar_addr[6];
81
82	/*
83	 * sata registers in bar 5 which are shared on all devices
84	 * on the channel.
85	 */
86	uint32_t	*nvc_mcp5x_ctl;
87	uint32_t	*nvc_mcp5x_ncq; /* NCQ status control bits */
88
89	kmutex_t	nvc_mutex; /* ctrl level lock */
90
91	ddi_intr_handle_t *nvc_htable;	/* For array of interrupts */
92	int		 nvc_intr_type;	/* What type of interrupt */
93	int		nvc_intr_cnt;	/* # of intrs count returned */
94	size_t		nvc_intr_size;	/* Size of intr array to */
95	uint_t		nvc_intr_pri;   /* Interrupt priority */
96	int		nvc_intr_cap;	/* Interrupt capabilities */
97	uint8_t		*nvc_ck804_int_status; /* interrupt status ck804 */
98
99	sata_hba_tran_t	nvc_sata_hba_tran; /* sata_hba_tran for ctrl */
100
101	/*
102	 * enable/disable interrupts, controller specific
103	 */
104	void		(*nvc_set_intr)(nv_port_t *nvp, int flag);
105	int		nvc_state;	/* state flags of ctrl see below */
106	uint8_t		nvc_revid;	/* PCI revid of device */
107	boolean_t	dma_40bit;	/* 40bit DMA support */
108
109#ifdef SGPIO_SUPPORT
110	int		nvc_mcp5x_flag;	/* is the controller MCP51/MCP55 */
111	uint8_t		nvc_ctlr_num;	/* controller number within the part */
112	uint32_t	nvc_sgp_csr;	/* SGPIO CSR i/o address */
113	volatile nv_sgp_cb_t *nvc_sgp_cbp; /* SGPIO Control Block */
114	nv_sgp_cmn_t	*nvc_sgp_cmn;	/* SGPIO shared data */
115#endif
116} nv_ctl_t;
117
118
119struct nv_port {
120
121	struct nv_ctl	*nvp_ctlp; /* back pointer to controller */
122
123	uint8_t		nvp_port_num; /* port number, ie 0 or 1 */
124
125	uint8_t		nvp_type;	/* SATA_DTYPE_{NONE,ATADISK,UNKNOWN} */
126	uint32_t	nvp_signature;	/* sig acquired from task file regs */
127	uchar_t		*nvp_cmd_addr;	/* base addr for cmd regs for port */
128	uchar_t		*nvp_bm_addr;	/* base addr for bus master for port */
129	uchar_t		*nvp_ctl_addr;	/* base addr for ctrl regs for port */
130
131	ddi_acc_handle_t nvp_cmd_hdl;
132	uchar_t		*nvp_data;	/* data register */
133	uchar_t		*nvp_error;	/* error register (read) */
134	uchar_t		*nvp_feature;	/* features (write) */
135	uchar_t		*nvp_count;	/* sector count */
136	uchar_t		*nvp_sect;	/* sector number */
137	uchar_t		*nvp_lcyl;	/* cylinder low byte */
138	uchar_t		*nvp_hcyl;	/* cylinder high byte */
139	uchar_t		*nvp_drvhd;	/* drive/head register */
140	uchar_t		*nvp_status;	/* status/command register */
141	uchar_t		*nvp_cmd;	/* status/command register */
142
143	ddi_acc_handle_t nvp_ctl_hdl;
144	uchar_t		*nvp_altstatus; /* alternate status (read) */
145	uchar_t		*nvp_devctl;	/* device control (write) */
146
147	ddi_acc_handle_t nvp_bm_hdl;
148	uchar_t		*nvp_bmisx;
149	uint32_t	*nvp_bmidtpx;
150	uchar_t		*nvp_bmicx;
151
152	ddi_dma_handle_t *nvp_sg_dma_hdl; /* dma handle to prd table */
153	caddr_t		 *nvp_sg_addr;	  /* virtual addr of prd table */
154	uint32_t	 *nvp_sg_paddr;   /* physical address of prd table */
155	ddi_acc_handle_t *nvp_sg_acc_hdl; /* mem acc handle to the prd table */
156
157	uint32_t	*nvp_sstatus;
158	uint32_t	*nvp_serror;
159	uint32_t	*nvp_sctrl;
160	uint32_t	*nvp_sactive;
161
162	kmutex_t	nvp_mutex;	/* main per port mutex */
163	kcondvar_t	nvp_sync_cv;	/* handshake btwn ISR and start thrd */
164	kcondvar_t	nvp_reset_cv;	/* when reset is synchronous */
165
166	/*
167	 * nvp_slot is a pointer to an array of nv_slot
168	 */
169	struct nv_slot	*nvp_slot;
170	uint32_t	nvp_sactive_cache; /* cache of SACTIVE */
171	uint8_t		nvp_queue_depth;
172
173	/*
174	 * NCQ flow control.  During NCQ operation, no other commands
175	 * allowed.  The following are used to enforce this.
176	 */
177	int		nvp_ncq_run;
178	int		nvp_non_ncq_run;
179	int		nvp_seq;
180
181	timeout_id_t	nvp_timeout_id;
182
183	clock_t		nvp_reset_time;		/* time of last reset */
184	clock_t		nvp_link_event_time;	/* time of last plug event */
185	int		nvp_reset_retry_count;
186	clock_t		nvp_wait_sig; /* wait before rechecking sig */
187
188	int		nvp_state; /* state of port. flags defined below */
189
190	uint16_t	*nvp_mcp5x_int_status;
191	uint16_t	*nvp_mcp5x_int_ctl;
192
193#ifdef SGPIO_SUPPORT
194	uint8_t		nvp_sgp_ioctl_mod; /* LEDs modified by ioctl */
195#endif
196	clock_t		nvp_timeout_duration;
197
198
199	/*
200	 * debug and statistical information
201	 */
202	clock_t		nvp_rem_time;
203	clock_t		nvp_add_time;
204	clock_t		nvp_trans_link_time;
205	int		nvp_trans_link_count;
206
207	uint8_t		nvp_last_cmd;
208	uint8_t		nvp_previous_cmd;
209	int		nvp_reset_count;
210	char		nvp_first_reset_reason[NV_REASON_LEN];
211	char		nvp_reset_reason[NV_REASON_LEN];
212	clock_t		intr_duration;	/* max length of port intr (ticks) */
213	clock_t		intr_start_time;
214	int		intr_loop_cnt;
215};
216
217
218typedef struct nv_device_table {
219	ushort_t vendor_id;	/* vendor id */
220	ushort_t device_id;	/* device id */
221	ushort_t type;		/* chipset type, ck804 or mcp51/mcp55 */
222} nv_device_table_t;
223
224
225typedef struct nv_slot {
226	caddr_t		nvslot_v_addr;	/* I/O buffer address */
227	size_t		nvslot_byte_count; /* # bytes left to read/write */
228	sata_pkt_t	*nvslot_spkt;
229	uint8_t		nvslot_rqsense_buff[SATA_ATAPI_RQSENSE_LEN];
230	clock_t		nvslot_stime;
231	int		(*nvslot_start)(nv_port_t *nvp, int queue);
232	void		(*nvslot_intr)(nv_port_t *nvp,
233			    struct nv_slot *nv_slotp);
234	uint32_t	nvslot_flags;
235} nv_slot_t;
236
237
238#ifdef SGPIO_SUPPORT
239struct nv_sgp_cmn {
240	uint8_t		nvs_in_use;	/* bit-field of active ctlrs */
241	uint8_t		nvs_connected;	/* port connected bit-field flag */
242	uint8_t		nvs_activity;	/* port usage bit-field flag */
243	int		nvs_cbp;	/* SGPIO Control Block Pointer */
244	int		nvs_taskq_delay; /* rest time for activity LED taskq */
245	kmutex_t	nvs_slock;	/* lock for shared data */
246	kmutex_t	nvs_tlock;	/* lock for taskq */
247	kcondvar_t	nvs_cv;		/* condition variable for taskq wait */
248	ddi_taskq_t	*nvs_taskq;	/* activity LED taskq */
249};
250
251struct nv_sgp_cbp2cmn {
252	uint32_t	c2cm_cbp;	/* ctlr block ptr from pci cfg space */
253	nv_sgp_cmn_t	*c2cm_cmn;	/* point to common space */
254};
255#endif
256
257
258/*
259 * nvslot_flags
260 */
261#define	NVSLOT_COMPLETE 0x01
262#define	NVSLOT_NCQ	0x02	/* NCQ is active */
263#define	NVSLOT_RQSENSE	0x04	/* processing request sense */
264
265/*
266 * state values for nv_attach
267 */
268#define	ATTACH_PROGRESS_NONE			(1 << 0)
269#define	ATTACH_PROGRESS_STATEP_ALLOC		(1 << 1)
270#define	ATTACH_PROGRESS_PCI_HANDLE		(1 << 2)
271#define	ATTACH_PROGRESS_BARS			(1 << 3)
272#define	ATTACH_PROGRESS_INTR_ADDED		(1 << 4)
273#define	ATTACH_PROGRESS_MUTEX_INIT		(1 << 5)
274#define	ATTACH_PROGRESS_CTL_SETUP		(1 << 6)
275#define	ATTACH_PROGRESS_TRAN_SETUP		(1 << 7)
276#define	ATTACH_PROGRESS_COUNT			(1 << 8)
277#define	ATTACH_PROGRESS_CONF_HANDLE		(1 << 9)
278#define	ATTACH_PROGRESS_SATA_MODULE		(1 << 10)
279
280#ifdef DEBUG
281
282#define	NV_DEBUG		1
283
284#endif /* DEBUG */
285
286
287/*
288 * nv_debug_flags
289 */
290#define	NVDBG_ALWAYS	0x00001
291#define	NVDBG_INIT	0x00002
292#define	NVDBG_ENTRY	0x00004
293#define	NVDBG_DELIVER	0x00008
294#define	NVDBG_EVENT	0x00010
295#define	NVDBG_SYNC	0x00020
296#define	NVDBG_PKTCOMP	0x00040
297#define	NVDBG_TIMEOUT	0x00080
298#define	NVDBG_INFO	0x00100
299#define	NVDBG_VERBOSE	0x00200
300#define	NVDBG_INTR	0x00400
301#define	NVDBG_ERRS	0x00800
302#define	NVDBG_COOKIES	0x01000
303#define	NVDBG_HOT	0x02000
304#define	NVDBG_RESET	0x04000
305#define	NVDBG_ATAPI	0x08000
306
307#define	NVLOG(flag, nvc, nvp, fmt, args ...)		\
308	if (nv_debug_flags & (flag)) {			\
309		nv_log(nvc, nvp, fmt, ## args);		\
310	}
311
312
313#define	NV_SUCCESS	0
314#define	NV_FAILURE	-1
315
316/*
317 * indicates whether nv_wait functions can sleep or not.
318 */
319#define	NV_SLEEP	1
320#define	NV_NOSLEEP	2
321
322
323/*
324 * port offsets from base address ioaddr1
325 */
326#define	NV_DATA		0x00	/* data register 			*/
327#define	NV_ERROR	0x01	/* error register (read)		*/
328#define	NV_FEATURE	0x01	/* features (write)			*/
329#define	NV_COUNT	0x02    /* sector count 			*/
330#define	NV_SECT		0x03	/* sector number 			*/
331#define	NV_LCYL		0x04	/* cylinder low byte 			*/
332#define	NV_HCYL		0x05	/* cylinder high byte 			*/
333#define	NV_DRVHD	0x06    /* drive/head register 			*/
334#define	NV_STATUS	0x07	/* status/command register 		*/
335#define	NV_CMD		0x07	/* status/command register 		*/
336
337/*
338 * port offsets from base address ioaddr2
339 */
340#define	NV_ALTSTATUS	0x02	/* alternate status (read)		*/
341#define	NV_DEVCTL	0x02	/* device control (write)		*/
342
343/*
344 * device control register
345 */
346#define	ATDC_NIEN    	0x02    /* disable interrupts */
347#define	ATDC_SRST	0x04	/* controller reset */
348#define	ATDC_D3		0x08	/* mysterious bit */
349#define	ATDC_HOB	0x80	/* high order byte to read 48-bit values */
350
351/*
352 * MCP5x NCQ and INTR control registers
353 */
354#define	MCP5X_CTL		0x400 /* queuing control */
355#define	MCP5X_INT_STATUS	0x440 /* status bits for interrupt */
356#define	MCP5X_INT_CTL		0x444 /* enable bits for interrupt */
357#define	MCP5X_NCQ		0x448 /* NCQ status and ctrl bits */
358
359/*
360 * if either of these bits are set, when using NCQ, if no other commands are
361 * active while a new command is started, DMA engine can be programmed ahead
362 * of time to save extra interrupt.  Presumably pre-programming is discarded
363 * if a subsequent command ends up finishing first.
364 */
365#define	MCP_SATA_AE_NCQ_PDEV_FIRST_CMD	(1 << 7)
366#define	MCP_SATA_AE_NCQ_SDEV_FIRST_CMD	(1 << 23)
367
368/*
369 * bit definitions to indicate which NCQ command requires
370 * DMA setup.
371 */
372#define	MCP_SATA_AE_NCQ_PDEV_DMA_SETUP_TAG_SHIFT	2
373#define	MCP_SATA_AE_NCQ_SDEV_DMA_SETUP_TAG_SHIFT	18
374#define	MCP_SATA_AE_NCQ_DMA_SETUP_TAG_MASK		0x1f
375
376
377/*
378 * Bits for NV_MCP5X_INT_CTL and NV_MCP5X_INT_STATUS
379 */
380#define	MCP5X_INT_SNOTIFY	0x200	/* snotification set */
381#define	MCP5X_INT_SERROR	0x100	/* serror set */
382#define	MCP5X_INT_DMA_SETUP	0x80	/* DMA to be programmed */
383#define	MCP5X_INT_DH_REGFIS	0x40	/* REGFIS received */
384#define	MCP5X_INT_SDB_FIS	0x20	/* SDB FIS */
385#define	MCP5X_INT_TX_BACKOUT	0x10	/* TX backout */
386#define	MCP5X_INT_REM		0x08	/* device removed */
387#define	MCP5X_INT_ADD		0x04	/* device added */
388#define	MCP5X_INT_PM		0x02	/* power changed */
389#define	MCP5X_INT_COMPLETE	0x01	/* device interrupt */
390
391/*
392 * Bits above that are not used for now.
393 */
394#define	MCP5X_INT_IGNORE (MCP5X_INT_DMA_SETUP|MCP5X_INT_DH_REGFIS|\
395	MCP5X_INT_SDB_FIS|MCP5X_INT_TX_BACKOUT|MCP5X_INT_PM|\
396	MCP5X_INT_SNOTIFY|MCP5X_INT_SERROR)
397
398/*
399 * Bits for MCP_SATA_AE_CTL
400 */
401#define	MCP_SATA_AE_CTL_PRI_SWNCQ	(1 << 1) /* software NCQ chan 0 */
402#define	MCP_SATA_AE_CTL_SEC_SWNCQ	(1 << 2) /* software NCQ chan 1 */
403
404#define	NV_DELAY_NSEC(wait_ns)		\
405{					\
406	hrtime_t start, end;		\
407	start = end =  gethrtime();	\
408	while ((end - start) < wait_ns)	\
409		end = gethrtime();	\
410}
411
412/*
413 * signature in task file registers after device reset
414 */
415#define	NV_DISK_SIG	0x00000101
416#define	NV_ATAPI_SIG	0xeb140101
417#define	NV_PM_SIG	0x96690101
418#define	NV_NO_SIG	0x00000000
419
420/*
421 * These bar5 offsets are common to mcp51/mcp55/ck804 and thus
422 * prefixed with NV.
423 */
424#define	NV_SSTATUS	0x00
425#define	NV_SERROR	0x04
426#define	NV_SCTRL	0x08
427#define	NV_SACTIVE	0x0c
428#define	NV_SNOTIFICATION 0x10
429
430#define	CH0_SREG_OFFSET	0x0
431#define	CH1_SREG_OFFSET	0x40
432
433
434/*
435 * The following config space offsets are needed to enable
436 * bar 5 register access in ck804/mcp51/mcp55
437 */
438#define	NV_SATA_CFG_20		0x50
439#define	NV_BAR5_SPACE_EN	0x04
440#define	NV_40BIT_PRD		0x20
441
442#define	NV_SATA_CFG_23		0x60
443
444/*
445 * ck804 interrupt status register
446 */
447
448/*
449 * offsets to bar 5 registers
450 */
451#define	CK804_SATA_INT_STATUS	0x440
452#define	CK804_SATA_INT_EN	0x441
453
454
455/*
456 * bit fields for int status and int enable
457 * registers
458 */
459#define	CK804_INT_PDEV_INT	0x01 /* completion interrupt */
460#define	CK804_INT_PDEV_PM	0x02 /* power change */
461#define	CK804_INT_PDEV_ADD	0x04 /* hot plug */
462#define	CK804_INT_PDEV_REM	0x08 /* hot remove */
463#define	CK804_INT_PDEV_HOT	CK804_INT_PDEV_ADD|CK804_INT_PDEV_REM
464
465#define	CK804_INT_SDEV_INT	0x10 /* completion interrupt */
466#define	CK804_INT_SDEV_PM	0x20 /* power change */
467#define	CK804_INT_SDEV_ADD	0x40 /* hot plug */
468#define	CK804_INT_SDEV_REM	0x80 /* hot remove */
469#define	CK804_INT_SDEV_HOT	CK804_INT_SDEV_ADD|CK804_INT_SDEV_REM
470
471#define	CK804_INT_PDEV_ALL	CK804_INT_PDEV_INT|CK804_INT_PDEV_HOT|\
472				CK804_INT_PDEV_PM
473#define	CK804_INT_SDEV_ALL	CK804_INT_SDEV_INT|CK804_INT_SDEV_HOT|\
474				CK804_INT_SDEV_PM
475
476/*
477 * config space offset 42
478 */
479#define	NV_SATA_CFG_42			0xac
480
481/*
482 * bit in CFG_42 which delays hotplug interrupt until
483 * PHY ready
484 */
485#define	CK804_CFG_DELAY_HOTPLUG_INTR	(0x1 << 12)
486
487
488/*
489 * bar 5 offsets for SATA registers in ck804
490 */
491#define	CK804_CH1_SSTATUS	0x00
492#define	CK804_CH1_SERROR	0x04
493#define	CK804_CH1_SCTRL		0x08
494#define	CK804_CH1_SACTIVE	0x0c
495#define	CK804_CH1_SNOTIFICATION	0x10
496
497#define	CK804_CH2_SSTATUS	0x40
498#define	CK804_CH2_SERROR	0x44
499#define	CK804_CH2_SCTRL		0x48
500#define	CK804_CH2_SACTIVE	0x4c
501#define	CK804_CH2_SNOTIFICATION	0x50
502
503
504/*
505 * bar 5 offsets for ADMACTL settings for both ck804/mcp51/mcp/55
506 */
507#define	NV_ADMACTL_X	0x4C0
508#define	NV_ADMACTL_Y	0x5C0
509
510/*
511 * Bits for NV_ADMACTL_X and NV_ADMACTL_Y
512 */
513#define	NV_HIRQ_EN	0x01 /* hot plug/unplug interrupt enable */
514#define	NV_CH_RST	0x04 /* reset channel */
515
516
517/*
518 * bar 5 offset for ADMASTAT regs for ck804
519 */
520#define	CK804_ADMASTAT_X	0x4C4
521#define	CK804_ADMASTAT_Y	0x5C4
522
523/*
524 * Bits for CK804_ADMASTAT_X and CK804_ADMASTAT_Y
525 */
526#define	CK804_HPIRQ	0x4
527#define	MCP05_HUIRQ	0x2
528
529
530/*
531 * bar 4 offset to bus master command registers
532 */
533#define	BMICX_REG	0
534
535/*
536 * bit definitions for BMICX_REG
537 */
538#define	BMICX_SSBM	0x01	/* Start/Stop Bus Master */
539				/* 1=Start (Enable) */
540				/* 0=Start (Disable) */
541
542/*
543 * NOTE: "read" and "write" are the actions of the DMA engine
544 * on the PCI bus, not the SATA bus.  Therefore for a ATA READ
545 * command, program the DMA engine to "write to memory" mode
546 * (and vice versa).
547 */
548#define	BMICX_RWCON			0x08 /* Read/Write Control */
549#define	BMICX_RWCON_WRITE_TO_MEMORY	0x08 /* 1=Write (dev to host) */
550#define	BMICX_RWCON_READ_FROM_MEMORY	0x00 /* 0=Read  (host to dev) */
551
552/*
553 * BMICX bits to preserve during updates
554 */
555#define	BMICX_MASK	(~(BMICX_SSBM | BMICX_RWCON))
556
557/*
558 * bar 4 offset to bus master status register
559 */
560#define	BMISX_REG	2
561
562/*
563 * bit fields for bus master status register
564 */
565#define	BMISX_BMIDEA	0x01	/* Bus Master IDE Active */
566#define	BMISX_IDERR	0x02	/* IDE DMA Error */
567#define	BMISX_IDEINTS	0x04	/* IDE Interrupt Status */
568
569/*
570 * bus master status register bits to preserve
571 */
572#define	BMISX_MASK	0xf8
573
574/*
575 * bar4 offset to bus master PRD descriptor table
576 */
577#define	BMIDTPX_REG	4
578
579
580/*
581 * structure for a single entry in the PRD table
582 * (physical region descriptor table)
583 */
584typedef struct prde {
585	uint32_t p_address; /* physical address */
586	uint32_t p_count;   /* byte count, EOT in high order bit */
587} prde_t;
588
589
590#define	PRDE_EOT	((uint_t)0x80000000)
591
592#define	NV_DMA_NSEGS	257 /* at least 1MB (4KB/pg * 256) + 1 if misaligned */
593
594/*
595 * ck804 and mcp55 both have 2 ports per controller
596 */
597#define	NV_NUM_PORTS	2
598
599/*
600 * Number of slots to allocate in data nv_sata structures to handle
601 * multiple commands at once.  This does not reflect the capability of
602 * the drive or the hardware, and in many cases will not match.
603 * 1 or 32 slots are allocated, so in cases where the driver has NCQ
604 * enabled but the drive doesn't support it, or supports fewer than
605 * 32 slots, here may be an over allocation of memory.
606 */
607#ifdef NCQ
608#define	NV_QUEUE_SLOTS	32
609#else
610#define	NV_QUEUE_SLOTS	1
611#endif
612
613#define	NV_BM_64K_BOUNDARY	0x10000ull
614
615#define	NV_MAX_INTR_PER_DEV	20	/* Empirical value */
616
617/*
618 * 1 second (in microseconds)
619 */
620#define	NV_ONE_SEC		1000000
621
622/*
623 * 1 millisecond (in microseconds)
624 */
625#define	NV_ONE_MSEC		1000
626
627/*
628 * initial wait before checking for signature, in microseconds
629 */
630#define	NV_WAIT_SIG	2500
631
632
633/*
634 * Length of port reset (microseconds) - SControl bit 0 set to 1
635 */
636#define	NV_RESET_LENGTH		1000
637
638/*
639 * the maximum number of comresets to issue while
640 * performing link reset in nv_reset()
641 */
642#define	NV_COMRESET_ATTEMPTS	3
643
644/*
645 * amount of time to wait for a signature in reset, in ms, before
646 * issuing another reset
647 */
648#define	NV_RETRY_RESET_SIG	5000
649
650/*
651 * the maximum number of resets to issue to gather signature
652 * before giving up
653 */
654#define	NV_MAX_RESET_RETRY	8
655
656/*
657 * amount of time (us) to wait after receiving a link event
658 * before acting on it.  This is because of flakey hardware
659 * sometimes issues the wrong, multiple, or out of order link
660 * events.
661 */
662#define	NV_LINK_EVENT_SETTLE	500000
663
664/*
665 * The amount of time (ms) a link can be missing
666 * before declaring it removed.
667 */
668#define	NV_LINK_EVENT_DOWN	200
669
670/*
671 * nvp_state flags
672 */
673#define	NV_DEACTIVATED	0x001
674#define	NV_ABORTING	0x002
675#define	NV_FAILED	0x004
676#define	NV_RESET	0x008
677#define	NV_RESTORE	0x010
678#define	NV_LINK_EVENT	0x020
679#define	NV_ATTACH	0x040
680#define	NV_HOTPLUG	0x080
681
682
683/*
684 * flags for nv_report_link_event()
685 */
686#define	NV_ADD_DEV 0
687#define	NV_REM_DEV 1
688
689/*
690 * nvc_state flags
691 */
692#define	NV_CTRL_SUSPEND		0x1
693
694
695/*
696 * flags for ck804_set_intr/mcp5x_set_intr
697 */
698#define	NV_INTR_DISABLE		0x1
699#define	NV_INTR_ENABLE		0x2
700#define	NV_INTR_CLEAR_ALL	0x4
701#define	NV_INTR_DISABLE_NON_BLOCKING		0x8
702
703
704#define	NV_BYTES_PER_SEC 512
705
706#define	NV_WAIT_REG_CHECK	10	/* 10 microseconds */
707#define	NV_ATA_NUM_CMDS		256	/* max num ATA cmds possible, 8 bits */
708#define	NV_PRINT_INTERVAL	40	/* throttle debug msg from flooding */
709#define	MCP5X_INT_CLEAR		0xffff	/* clear all interrupts */
710
711/*
712 * definition labels for the BAR registers
713 */
714#define	NV_BAR_0 0 /* chan 0 task file regs */
715#define	NV_BAR_1 1 /* chan 0 status reg */
716#define	NV_BAR_2 2 /* chan 1 task file regs */
717#define	NV_BAR_3 3 /* chan 1 status reg */
718#define	NV_BAR_4 4 /* bus master regs */
719#define	NV_BAR_5 5 /* extra regs mostly SATA related */
720
721/*
722 * transform seconds to microseconds
723 */
724#define	NV_SEC2USEC(x) x * MICROSEC
725
726
727/*
728 * ck804 maps in task file regs into bar 5.  These are
729 * only used to identify ck804, therefore only this reg is
730 * listed here.
731 */
732#define	NV_BAR5_TRAN_LEN_CH_X	0x518
733
734/*
735 * if after this many iterations through the interrupt
736 * processing loop, declare the interrupt wedged and
737 * disable.
738 */
739#define	NV_MAX_INTR_LOOP 10
740
741/*
742 * flag values for nv_copy_regs_out
743 */
744#define	NV_COPY_COMPLETE 0x01	/* normal command completion */
745#define	NV_COPY_ERROR    0x02	/* error, did not complete ok */
746#define	NV_COPY_SSREGS   0x04	/* SS port registers */
747
748#ifdef SGPIO_SUPPORT
749#define	NV_MAX_CBPS	16		/* Maximum # of Control Block */
750					/* Pointers.  Corresponds to */
751					/* each MCP55 and IO55 */
752#define	SGPIO_LOOP_WAIT_USECS	62500	/* 1/16 second (in usecs) */
753#define	SGPIO_TQ_NAME_LEN	32
754
755/*
756 * The drive number format is ccp (binary).
757 * cc is the controller number (0-based number)
758 * p is the port number (0 or 1)
759 */
760#define	SGP_DRV_TO_PORT(d)		((d) & 1)
761#define	SGP_DRV_TO_CTLR(d)		((d) >> 1)
762#define	SGP_CTLR_PORT_TO_DRV(c, p)	(((c) << 1) | ((p) & 1))
763#endif
764
765#ifdef	__cplusplus
766}
767#endif
768
769#endif /* _NV_SATA_H */
770