xref: /onnv-gate/usr/src/uts/common/sys/scsi/adapters/pmcs/pmcs_mpi.h (revision 11847:533fb074e3b8)
110696SDavid.Hollister@Sun.COM /*
210696SDavid.Hollister@Sun.COM  * CDDL HEADER START
310696SDavid.Hollister@Sun.COM  *
410696SDavid.Hollister@Sun.COM  * The contents of this file are subject to the terms of the
510696SDavid.Hollister@Sun.COM  * Common Development and Distribution License (the "License").
610696SDavid.Hollister@Sun.COM  * You may not use this file except in compliance with the License.
710696SDavid.Hollister@Sun.COM  *
810696SDavid.Hollister@Sun.COM  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
910696SDavid.Hollister@Sun.COM  * or http://www.opensolaris.org/os/licensing.
1010696SDavid.Hollister@Sun.COM  * See the License for the specific language governing permissions
1110696SDavid.Hollister@Sun.COM  * and limitations under the License.
1210696SDavid.Hollister@Sun.COM  *
1310696SDavid.Hollister@Sun.COM  * When distributing Covered Code, include this CDDL HEADER in each
1410696SDavid.Hollister@Sun.COM  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
1510696SDavid.Hollister@Sun.COM  * If applicable, add the following below this CDDL HEADER, with the
1610696SDavid.Hollister@Sun.COM  * fields enclosed by brackets "[]" replaced with your own identifying
1710696SDavid.Hollister@Sun.COM  * information: Portions Copyright [yyyy] [name of copyright owner]
1810696SDavid.Hollister@Sun.COM  *
1910696SDavid.Hollister@Sun.COM  * CDDL HEADER END
2010696SDavid.Hollister@Sun.COM  *
2110696SDavid.Hollister@Sun.COM  *
22*11847SDavid.Hollister@Sun.COM  * Copyright 2010 Sun Microsystems, Inc.  All rights reserved.
2310696SDavid.Hollister@Sun.COM  * Use is subject to license terms.
2410696SDavid.Hollister@Sun.COM  */
2510696SDavid.Hollister@Sun.COM /*
2610696SDavid.Hollister@Sun.COM  * PMC 8x6G Message Passing Interface Definitions
2710696SDavid.Hollister@Sun.COM  */
2810696SDavid.Hollister@Sun.COM #ifndef	_PMCS_MPI_H
2910696SDavid.Hollister@Sun.COM #define	_PMCS_MPI_H
3010696SDavid.Hollister@Sun.COM #ifdef	__cplusplus
3110696SDavid.Hollister@Sun.COM extern "C" {
3210696SDavid.Hollister@Sun.COM #endif
3310696SDavid.Hollister@Sun.COM 
3410696SDavid.Hollister@Sun.COM #define	PMCS_DWRD(x)	(x << 2)
3510696SDavid.Hollister@Sun.COM 
3610696SDavid.Hollister@Sun.COM /*
3710696SDavid.Hollister@Sun.COM  * MPI Configuration Table Offsets
3810696SDavid.Hollister@Sun.COM  */
3910696SDavid.Hollister@Sun.COM #define	PMCS_MPI_AS	PMCS_DWRD(0)	/* ASCII Signature */
4010696SDavid.Hollister@Sun.COM #define	PMCS_SIGNATURE	0x53434D50
4110696SDavid.Hollister@Sun.COM 
4210696SDavid.Hollister@Sun.COM #define	PMCS_MPI_IR	PMCS_DWRD(1)	/* Interface Revision */
4310696SDavid.Hollister@Sun.COM #define	PMCS_MPI_REVISION1	1
4410696SDavid.Hollister@Sun.COM 
4510696SDavid.Hollister@Sun.COM #define	PMCS_MPI_FW	PMCS_DWRD(2)	/* Firmware Version */
4610696SDavid.Hollister@Sun.COM #define	PMCS_FW_TYPE(hwp)		(hwp->fw & 0xf)
4710696SDavid.Hollister@Sun.COM #define		PMCS_FW_TYPE_RELEASED		0
4810696SDavid.Hollister@Sun.COM #define		PMCS_FW_TYPE_DEVELOPMENT	1
4910696SDavid.Hollister@Sun.COM #define		PMCS_FW_TYPE_ALPHA		2
5010696SDavid.Hollister@Sun.COM #define		PMCS_FW_TYPE_BETA		3
5110696SDavid.Hollister@Sun.COM #define	PMCS_FW_VARIANT(hwp)		((hwp->fw >> 4) & 0xf)
5210696SDavid.Hollister@Sun.COM #define	PMCS_FW_MAJOR(hwp)		((hwp->fw >> 24) & 0xff)
5310696SDavid.Hollister@Sun.COM #define	PMCS_FW_MINOR(hwp)		((hwp->fw >> 16) & 0xff)
5410696SDavid.Hollister@Sun.COM #define	PMCS_FW_MICRO(hwp)		((hwp->fw >>  8) & 0xff)
5510696SDavid.Hollister@Sun.COM #define	PMCS_FW_REV(hwp)		((hwp->fw >> 8) & 0xffffff)
5610696SDavid.Hollister@Sun.COM #define	PMCS_FW_VERSION(maj, min, mic)	((maj << 16)|(min << 8)|mic)
5710696SDavid.Hollister@Sun.COM 
5810696SDavid.Hollister@Sun.COM #define	PMCS_MPI_MOIO	PMCS_DWRD(3)	/* Maximum # of outstandiong I/Os */
5910696SDavid.Hollister@Sun.COM #define	PMCS_MPI_INFO0	PMCS_DWRD(4)	/* Maximum S/G Elem, Max Dev Handle */
6010696SDavid.Hollister@Sun.COM #define	PMCS_MSGL(x)	(x & 0xffff)
6110696SDavid.Hollister@Sun.COM #define	PMCS_MD(x)	((x >> 16) & 0xffff)
6210696SDavid.Hollister@Sun.COM 
6310696SDavid.Hollister@Sun.COM #define	PMCS_MPI_INFO1	PMCS_DWRD(5)	/* Info #0 */
6410696SDavid.Hollister@Sun.COM 
6510696SDavid.Hollister@Sun.COM #define	PMCS_MNIQ(x)	(x & 0xff)		/* Max # of Inbound Queues */
6610696SDavid.Hollister@Sun.COM #define	PMCS_MNOQ(x)	((x >> 8) & 0xff)	/* Max # of Outbound Queues */
6710696SDavid.Hollister@Sun.COM #define	PMCS_HPIQ(x)	((x >> 16) & 0x1)	/* High Pri Queue Supported */
6810696SDavid.Hollister@Sun.COM #define	PMCS_ICS(x)	((x >> 18) & 0x1)	/* Interrupt Coalescing */
6910696SDavid.Hollister@Sun.COM #define	PMCS_NPHY(x)	((x >> 19) & 0x3f)	/* Numbers of PHYs */
7010696SDavid.Hollister@Sun.COM #define	PMCS_SASREV(x)	((x >> 25) & 0x7)	/* SAS Revision Specification */
7110696SDavid.Hollister@Sun.COM 
7210696SDavid.Hollister@Sun.COM #define	PMCS_MPI_GSTO	PMCS_DWRD(6)	/* General Status Table Offset */
7310696SDavid.Hollister@Sun.COM #define	PMCS_MPI_IQCTO	PMCS_DWRD(7)	/* Inbound Queue Config Table Offset */
7410696SDavid.Hollister@Sun.COM #define	PMCS_MPI_OQCTO	PMCS_DWRD(8)	/* Outbound Queue Config Table Offset */
7510696SDavid.Hollister@Sun.COM 
7610696SDavid.Hollister@Sun.COM #define	PMCS_MPI_INFO2	PMCS_DWRD(9)	/* Info #1 */
7710696SDavid.Hollister@Sun.COM 
7810696SDavid.Hollister@Sun.COM #define	IQ_NORMAL_PRI_DEPTH_SHIFT	0
7910696SDavid.Hollister@Sun.COM #define	IQ_NORMAL_PRI_DEPTH_MASK	0xff
8010696SDavid.Hollister@Sun.COM #define	IQ_HIPRI_PRI_DEPTH_SHIFT	8
8110696SDavid.Hollister@Sun.COM #define	IQ_HIPRI_PRI_DEPTH_MASK		0xff00
8210696SDavid.Hollister@Sun.COM #define	GENERAL_EVENT_OQ_SHIFT		16
8310696SDavid.Hollister@Sun.COM #define	GENERAL_EVENT_OQ_MASK		0xff0000
8410696SDavid.Hollister@Sun.COM #define	DEVICE_HANDLE_REMOVED_SHIFT	24
8510696SDavid.Hollister@Sun.COM #define	DEVICE_HANDLE_REMOVED_MASK	0xff000000ul
8610696SDavid.Hollister@Sun.COM 
8710696SDavid.Hollister@Sun.COM #define	PMCS_MPI_EVQS	PMCS_DWRD(0xA)	/* SAS Event Queues */
8810696SDavid.Hollister@Sun.COM #define	PMCS_MPI_EVQSET(pwp, oq, phy)	{				\
8910696SDavid.Hollister@Sun.COM 	uint32_t woff = phy / 4;					\
9010696SDavid.Hollister@Sun.COM 	uint32_t shf = (phy % 4) * 8;					\
9110696SDavid.Hollister@Sun.COM 	uint32_t tmp = pmcs_rd_mpi_tbl(pwp, PMCS_MPI_EVQS + (woff << 2)); \
9210696SDavid.Hollister@Sun.COM 	tmp &= ~(0xff << shf);						\
9310696SDavid.Hollister@Sun.COM 	tmp |= ((oq & 0xff) << shf);					\
9410696SDavid.Hollister@Sun.COM 	pmcs_wr_mpi_tbl(pwp, PMCS_MPI_EVQS + (woff << 2), tmp);		\
9510696SDavid.Hollister@Sun.COM }
9610696SDavid.Hollister@Sun.COM 
9710696SDavid.Hollister@Sun.COM #define	PMCS_MPI_SNCQ	PMCS_DWRD(0xC)	/* Sata NCQ Notification Queues */
9810696SDavid.Hollister@Sun.COM #define	PMCS_MPI_NCQSET(pwp, oq, phy)	{				\
9910696SDavid.Hollister@Sun.COM 	uint32_t woff = phy / 4;					\
10010696SDavid.Hollister@Sun.COM 	uint32_t shf = (phy % 4) * 8;					\
10110696SDavid.Hollister@Sun.COM 	uint32_t tmp = pmcs_rd_mpi_tbl(pwp, PMCS_MPI_SNCQ + (woff << 2)); \
10210696SDavid.Hollister@Sun.COM 	tmp &= ~(0xff << shf);						\
10310696SDavid.Hollister@Sun.COM 	tmp |= ((oq & 0xff) << shf);					\
10410696SDavid.Hollister@Sun.COM 	pmcs_wr_mpi_tbl(pwp, PMCS_MPI_SNCQ + (woff << 2), tmp);		\
10510696SDavid.Hollister@Sun.COM }
10610696SDavid.Hollister@Sun.COM 
10710696SDavid.Hollister@Sun.COM /*
10810696SDavid.Hollister@Sun.COM  * I_T Nexus Target Event Notification Queue
10910696SDavid.Hollister@Sun.COM  */
11010696SDavid.Hollister@Sun.COM #define	PMCS_MPI_IT_NTENQ	PMCS_DWRD(0xE)
11110696SDavid.Hollister@Sun.COM 
11210696SDavid.Hollister@Sun.COM /*
11310696SDavid.Hollister@Sun.COM  * SSP Target Event Notification Queue
11410696SDavid.Hollister@Sun.COM  */
11510696SDavid.Hollister@Sun.COM #define	PMCS_MPI_SSP_TENQ	PMCS_DWRD(0x10)
11610696SDavid.Hollister@Sun.COM 
11710696SDavid.Hollister@Sun.COM /*
118*11847SDavid.Hollister@Sun.COM  * I/O Abort Delay
11910696SDavid.Hollister@Sun.COM  */
120*11847SDavid.Hollister@Sun.COM #define	PMCS_MPI_IOABTDLY	PMCS_DWRD(0x12)
121*11847SDavid.Hollister@Sun.COM 
122*11847SDavid.Hollister@Sun.COM /*
123*11847SDavid.Hollister@Sun.COM  * Customization Setting
124*11847SDavid.Hollister@Sun.COM  */
125*11847SDavid.Hollister@Sun.COM #define	PMCS_MPI_CUSTSET	PMCS_DWRD(0x13)
126*11847SDavid.Hollister@Sun.COM 
127*11847SDavid.Hollister@Sun.COM #define	PMCS_MPI_CUST_HW_RSC_BSY_ALT	0x1	/* Bit 0 */
128*11847SDavid.Hollister@Sun.COM #define	PMCS_MPI_CUST_ABORT_ITNL	0x2	/* Bit 1 */
12910696SDavid.Hollister@Sun.COM 
13010696SDavid.Hollister@Sun.COM /*
13110696SDavid.Hollister@Sun.COM  * This specifies a log buffer in host memory for the MSGU.
13210696SDavid.Hollister@Sun.COM  */
13310696SDavid.Hollister@Sun.COM #define	PMCS_MPI_MELBAH	PMCS_DWRD(0x14)	/* MSGU Log Buffer high 32 bits */
13410696SDavid.Hollister@Sun.COM #define	PMCS_MPI_MELBAL	PMCS_DWRD(0x15)	/* MSGU Log Buffer low 32 bits */
13510696SDavid.Hollister@Sun.COM #define	PMCS_MPI_MELBS	PMCS_DWRD(0x16)	/* size in bytes of MSGU log buffer */
13610696SDavid.Hollister@Sun.COM #define	PMCS_MPI_MELSEV	PMCS_DWRD(0x17)	/* Log Severity */
13710696SDavid.Hollister@Sun.COM 
13810696SDavid.Hollister@Sun.COM /*
13910696SDavid.Hollister@Sun.COM  * This specifies a log buffer in host memory for the IOP.
14010696SDavid.Hollister@Sun.COM  */
14110696SDavid.Hollister@Sun.COM #define	PMCS_MPI_IELBAH	PMCS_DWRD(0x18)	/* IOP Log Buffer high 32 bits */
14210696SDavid.Hollister@Sun.COM #define	PMCS_MPI_IELBAL	PMCS_DWRD(0x19)	/* IOP Log Buffer low 32 bits */
14310696SDavid.Hollister@Sun.COM #define	PMCS_MPI_IELBS	PMCS_DWRD(0x1A)	/* size in bytes of IOP log buffer */
14410696SDavid.Hollister@Sun.COM #define	PMCS_MPI_IELSEV	PMCS_DWRD(0x1B)	/* Log Severity */
14510696SDavid.Hollister@Sun.COM 
14610696SDavid.Hollister@Sun.COM /*
14710696SDavid.Hollister@Sun.COM  * Fatal Error Handling
14810696SDavid.Hollister@Sun.COM  */
14910696SDavid.Hollister@Sun.COM #define	PMCS_MPI_FERR		PMCS_DWRD(0x1C)
15010696SDavid.Hollister@Sun.COM #define	PMCS_FERRIE		0x1	/* Fatal Err Interrupt Enable */
151*11847SDavid.Hollister@Sun.COM #define	PMCS_PCAD64		0x2	/* PI/CI addresses are 64-bit */
15210696SDavid.Hollister@Sun.COM #define	PMCS_FERIV_MASK		0xff00	/* Fatal Err Interrupt Mask */
15310696SDavid.Hollister@Sun.COM #define	PMCS_FERIV_SHIFT	8	/* Fatal Err Interrupt Shift */
15410696SDavid.Hollister@Sun.COM 
15510696SDavid.Hollister@Sun.COM #define	PMCS_MPI_IRAE		0x20000	/* Interrupt Reassertion Enable */
15610696SDavid.Hollister@Sun.COM #define	PMCS_MPI_IRAU		0x40000	/* Interrupt Reassertion Unit */
15710696SDavid.Hollister@Sun.COM #define	PMCS_MPI_IRAD_MASK	0xfff80000 /* Reassertion Delay Mask */
15810696SDavid.Hollister@Sun.COM 
15910696SDavid.Hollister@Sun.COM #define	PMCS_FERDOMSGU		PMCS_DWRD(0x1D)
16010696SDavid.Hollister@Sun.COM #define	PMCS_FERDLMSGU		PMCS_DWRD(0x1E)
16110696SDavid.Hollister@Sun.COM #define	PMCS_FERDOIOP		PMCS_DWRD(0x1F)
16210696SDavid.Hollister@Sun.COM #define	PMCS_FERDLIOP		PMCS_DWRD(0x20)
16310696SDavid.Hollister@Sun.COM 
16410696SDavid.Hollister@Sun.COM /*
16510696SDavid.Hollister@Sun.COM  * MPI GST Table Offsets
16610696SDavid.Hollister@Sun.COM  */
16710696SDavid.Hollister@Sun.COM 
16810696SDavid.Hollister@Sun.COM #define	PMCS_GST_BASE		0
16910696SDavid.Hollister@Sun.COM #define	PMCS_GST_IQFRZ0		(PMCS_GST_BASE + PMCS_DWRD(1))
17010696SDavid.Hollister@Sun.COM #define	PMCS_GST_IQFRZ1		(PMCS_GST_BASE + PMCS_DWRD(2))
17110696SDavid.Hollister@Sun.COM #define	PMCS_GST_MSGU_TICK	(PMCS_GST_BASE + PMCS_DWRD(3))
17210696SDavid.Hollister@Sun.COM #define	PMCS_GST_IOP_TICK	(PMCS_GST_BASE + PMCS_DWRD(4))
17310696SDavid.Hollister@Sun.COM #define	PMCS_GST_PHY_INFO(x)	(PMCS_GST_BASE + PMCS_DWRD(0x6) + PMCS_DWRD(x))
17410696SDavid.Hollister@Sun.COM #define	PMCS_GST_RERR_BASE	(PMCS_GST_BASE + PMCS_DWRD(0x11))
17510696SDavid.Hollister@Sun.COM #define	PMCS_GST_RERR_INFO(x)	(PMCS_GST_RERR_BASE + PMCS_DWRD(x))
17610696SDavid.Hollister@Sun.COM 
17710696SDavid.Hollister@Sun.COM #define	PMCS_MPI_S(x)		((x) & 0x7)
17810696SDavid.Hollister@Sun.COM #define	PMCS_QF(x)		(((x) >> 3) & 0x1)
17910696SDavid.Hollister@Sun.COM #define	PMCS_GSTLEN(x)		(((x) >> 4) & 0x3fff)
18010696SDavid.Hollister@Sun.COM #define	PMCS_HMI_ERR(x)		(((x) >> 16) & 0xffff)
18110696SDavid.Hollister@Sun.COM 
18210696SDavid.Hollister@Sun.COM #define	PMCS_MPI_STATE_NIL	0
18310696SDavid.Hollister@Sun.COM #define	PMCS_MPI_STATE_INIT	1
18410696SDavid.Hollister@Sun.COM #define	PMCS_MPI_STATE_DEINIT	2
18510696SDavid.Hollister@Sun.COM #define	PMCS_MPI_STATE_ERR	3
18610696SDavid.Hollister@Sun.COM 
18710696SDavid.Hollister@Sun.COM /*
18810696SDavid.Hollister@Sun.COM  * MPI Inbound Queue Configuration Table Offsets
18910696SDavid.Hollister@Sun.COM  *
19010696SDavid.Hollister@Sun.COM  * Each Inbound Queue configuration area consumes 8 DWORDS (32 bit words),
19110696SDavid.Hollister@Sun.COM  * or 32 bytes.
19210696SDavid.Hollister@Sun.COM  */
19310696SDavid.Hollister@Sun.COM #define	PMCS_IQC_PARMX(x)	((x) << 5)
19410696SDavid.Hollister@Sun.COM #define	PMCS_IQBAHX(x)		(((x) << 5) + 4)
19510696SDavid.Hollister@Sun.COM #define	PMCS_IQBALX(x)		(((x) << 5) + 8)
19610696SDavid.Hollister@Sun.COM #define	PMCS_IQCIBAHX(x)	(((x) << 5) + 12)
19710696SDavid.Hollister@Sun.COM #define	PMCS_IQCIBALX(x)	(((x) << 5) + 16)
19810696SDavid.Hollister@Sun.COM #define	PMCS_IQPIBARX(x)	(((x) << 5) + 20)
19910696SDavid.Hollister@Sun.COM #define	PMCS_IQPIOFFX(x)	(((x) << 5) + 24)
20010696SDavid.Hollister@Sun.COM #define	PMCS_IQDX(x)		((x) & 0xffff)
20110696SDavid.Hollister@Sun.COM #define	PMCS_IQESX(x)		(((x) >> 16) & 0x3fff)
20210696SDavid.Hollister@Sun.COM #define	PMCS_IQPX(x)		(((x) >> 30) & 0x3)
20310696SDavid.Hollister@Sun.COM 
20410696SDavid.Hollister@Sun.COM /*
20510696SDavid.Hollister@Sun.COM  * MPI Outbound Queue Configuration Table Offsets
20610696SDavid.Hollister@Sun.COM  *
20710696SDavid.Hollister@Sun.COM  * Each Outbound Queue configuration area consumes 9 DWORDS (32 bit words),
20810696SDavid.Hollister@Sun.COM  * or 36 bytes.
20910696SDavid.Hollister@Sun.COM  */
21010696SDavid.Hollister@Sun.COM #define	PMCS_OQC_PARMX(x)	(x * 36)
21110696SDavid.Hollister@Sun.COM #define	PMCS_OQBAHX(x)		((x * 36) + 4)
21210696SDavid.Hollister@Sun.COM #define	PMCS_OQBALX(x)		((x * 36) + 8)
21310696SDavid.Hollister@Sun.COM #define	PMCS_OQPIBAHX(x)	((x * 36) + 12)
21410696SDavid.Hollister@Sun.COM #define	PMCS_OQPIBALX(x)	((x * 36) + 16)
21510696SDavid.Hollister@Sun.COM #define	PMCS_OQCIBARX(x)	((x * 36) + 20)
21610696SDavid.Hollister@Sun.COM #define	PMCS_OQCIOFFX(x)	((x * 36) + 24)
21710696SDavid.Hollister@Sun.COM #define	PMCS_OQIPARM(x)		((x * 36) + 28)
21810696SDavid.Hollister@Sun.COM #define	PMCS_OQDICX(x)		((x * 36) + 32)
21910696SDavid.Hollister@Sun.COM 
22010696SDavid.Hollister@Sun.COM #define	PMCS_OQDX(x)		((x) & 0xffff)
22110696SDavid.Hollister@Sun.COM #define	PMCS_OQESX(x)		(((x) >> 16) & 0x3fff)
22210696SDavid.Hollister@Sun.COM #define	PMCS_OQICT(x)		((x) & 0xffff)
22310696SDavid.Hollister@Sun.COM #define	PMCS_OQICC(x)		(((x) >> 16) & 0xff)
22410696SDavid.Hollister@Sun.COM #define	PMCS_OQIV(x)		(((x) >> 24) & 0xff)
22510696SDavid.Hollister@Sun.COM 
22610696SDavid.Hollister@Sun.COM #define	OQIEX			(1 << 30)
22710696SDavid.Hollister@Sun.COM 
22810696SDavid.Hollister@Sun.COM #ifdef	__cplusplus
22910696SDavid.Hollister@Sun.COM }
23010696SDavid.Hollister@Sun.COM #endif
23110696SDavid.Hollister@Sun.COM #endif	/* _PMCS_MPI_H */
232