xref: /onnv-gate/usr/src/uts/common/sys/scsi/adapters/pmcs/pmcs_iomb.h (revision 12791:3e47de750570)
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  *
2112258Ssrikanth.suravajhala@oracle.com  */
2212258Ssrikanth.suravajhala@oracle.com /*
2312258Ssrikanth.suravajhala@oracle.com  * Copyright (c) 2009, 2010, Oracle and/or its affiliates. All rights reserved.
2410696SDavid.Hollister@Sun.COM  */
2510696SDavid.Hollister@Sun.COM /*
2610696SDavid.Hollister@Sun.COM  * PMC 8x6G IOMB Definitions
2710696SDavid.Hollister@Sun.COM  */
2810696SDavid.Hollister@Sun.COM #ifndef	_PMCS_IOMB_H
2910696SDavid.Hollister@Sun.COM #define	_PMCS_IOMB_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 /*
3510696SDavid.Hollister@Sun.COM  * An IOMB (IO Message Buffer) is the principle means of communication
3610696SDavid.Hollister@Sun.COM  * between the PMC and the HOST. The host places IOMBs on the Inbound
3710696SDavid.Hollister@Sun.COM  * Queues (IQ) which are in HOST memory and updates a producer index
3810696SDavid.Hollister@Sun.COM  * within the PMC. The PMC pulls the IOMB off the IQ and updates a
3910696SDavid.Hollister@Sun.COM  * consumer index in HOST memory. If appropriate, when the PMC is
4010696SDavid.Hollister@Sun.COM  * done with the action requested by the IOMB, the PMC writes a
4110696SDavid.Hollister@Sun.COM  * reply IOMB to host memory and updates its producer index and
4210696SDavid.Hollister@Sun.COM  * interrupts the HOST.
4310696SDavid.Hollister@Sun.COM  */
4410696SDavid.Hollister@Sun.COM /*
4510696SDavid.Hollister@Sun.COM  * The first word of all IOMBs is always laid out thusly:
4610696SDavid.Hollister@Sun.COM  *
4710696SDavid.Hollister@Sun.COM  * |Byte 3       |Byte 2       |Byte 1      |Byte 0   |
4810696SDavid.Hollister@Sun.COM  * +-------------+-------------+----------------------+
4910696SDavid.Hollister@Sun.COM  * |V Resvd    BC|Resvd  OBID  |CAT   |  OPCODE       |
5010696SDavid.Hollister@Sun.COM  * +--------------------------------------------------+
5110696SDavid.Hollister@Sun.COM  *
5210696SDavid.Hollister@Sun.COM  * V == Valid
5310696SDavid.Hollister@Sun.COM  * BC = Buffer Count
5410696SDavid.Hollister@Sun.COM  * OBID = Outbound Queue ID
5510696SDavid.Hollister@Sun.COM  * CAT = Category
5610696SDavid.Hollister@Sun.COM  * OPCODE = Well, uh, OPCODE.
5710696SDavid.Hollister@Sun.COM  */
5810696SDavid.Hollister@Sun.COM 
5910696SDavid.Hollister@Sun.COM #define	PMCS_IOMB_VALID		(1U << 31)
6010696SDavid.Hollister@Sun.COM #define	PMCS_IOMB_HIPRI		(1U << 30)
6110696SDavid.Hollister@Sun.COM #define	PMCS_IOMB_BC_SHIFT	(24)
6210696SDavid.Hollister@Sun.COM #define	PMCS_IOMB_BC_MASK	(0xf << PMCS_IOMB_BC_SHIFT)
6310696SDavid.Hollister@Sun.COM #define	PMCS_IOMB_OBID_SHIFT	(16)
6410696SDavid.Hollister@Sun.COM #define	PMCS_IOMB_OBID_MASK	(0xf << PMCS_IOMB_OBID_SHIFT)
6510696SDavid.Hollister@Sun.COM #define	PMCS_IOMB_CAT_SHIFT	(12)
6610696SDavid.Hollister@Sun.COM #define	PMCS_IOMB_CAT_MASK	(0xf << PMCS_IOMB_CAT_SHIFT)
6710696SDavid.Hollister@Sun.COM #define	PMCS_IOMB_OPCODE_MASK	(0xfff)
6810696SDavid.Hollister@Sun.COM 
6910696SDavid.Hollister@Sun.COM 
7010696SDavid.Hollister@Sun.COM #define	PMCS_IOMB_CAT_NET	0
7110696SDavid.Hollister@Sun.COM #define	PMCS_IOMB_CAT_FC	1
7210696SDavid.Hollister@Sun.COM #define	PMCS_IOMB_CAT_SAS	2
7310696SDavid.Hollister@Sun.COM #define	PMCS_IOMB_CAT_SCSI	3
7410696SDavid.Hollister@Sun.COM 
7510696SDavid.Hollister@Sun.COM /*
7610696SDavid.Hollister@Sun.COM  * Shorthand
7710696SDavid.Hollister@Sun.COM  */
7810696SDavid.Hollister@Sun.COM #define	PMCS_IOMB_IN_SAS(q, opcode)					\
7910696SDavid.Hollister@Sun.COM 	(PMCS_IOMB_VALID | (1 << PMCS_IOMB_BC_SHIFT)		|	\
8010696SDavid.Hollister@Sun.COM 	(PMCS_IOMB_CAT_SAS << PMCS_IOMB_CAT_SHIFT)		|	\
8110696SDavid.Hollister@Sun.COM 	((q << PMCS_IOMB_OBID_SHIFT) & PMCS_IOMB_OBID_MASK)	|	\
8210696SDavid.Hollister@Sun.COM 	(opcode & PMCS_IOMB_OPCODE_MASK))
8310696SDavid.Hollister@Sun.COM 
8410696SDavid.Hollister@Sun.COM /*
8510696SDavid.Hollister@Sun.COM  * PMC IOMB Inbound Queue Opcodes
8610696SDavid.Hollister@Sun.COM  */
8710696SDavid.Hollister@Sun.COM #define	PMCIN_ECHO							0x01
8810696SDavid.Hollister@Sun.COM #define	PMCIN_GET_INFO							0x02
8910696SDavid.Hollister@Sun.COM #define	PMCIN_GET_VPD							0x03
9010696SDavid.Hollister@Sun.COM #define	PMCIN_PHY_START							0x04
9110696SDavid.Hollister@Sun.COM #define	PMCIN_PHY_STOP							0x05
9210696SDavid.Hollister@Sun.COM #define	PMCIN_SSP_INI_IO_START						0x06
9310696SDavid.Hollister@Sun.COM #define	PMCIN_SSP_INI_TM_START						0x07
9410696SDavid.Hollister@Sun.COM #define	PMCIN_SSP_INI_EXT_IO_START					0x08
9510696SDavid.Hollister@Sun.COM #define	PMCIN_DEVICE_HANDLE_ACCEPT					0x09
9610696SDavid.Hollister@Sun.COM #define	PMCIN_SSP_TGT_IO_START						0x0A
9710696SDavid.Hollister@Sun.COM #define	PMCIN_SSP_TGT_RESPONSE_START					0x0B
9810696SDavid.Hollister@Sun.COM #define	PMCIN_SSP_INI_EDC_EXT_IO_START					0x0C
9910696SDavid.Hollister@Sun.COM #define	PMCIN_SSP_INI_EDC_EXT_IO_START1					0x0D
10010696SDavid.Hollister@Sun.COM #define	PMCIN_SSP_TGT_EDC_IO_START					0x0E
10110696SDavid.Hollister@Sun.COM #define	PMCIN_SSP_ABORT							0x0F
10210696SDavid.Hollister@Sun.COM #define	PMCIN_DEREGISTER_DEVICE_HANDLE					0x10
10310696SDavid.Hollister@Sun.COM #define	PMCIN_GET_DEVICE_HANDLE						0x11
10410696SDavid.Hollister@Sun.COM #define	PMCIN_SMP_REQUEST						0x12
10510696SDavid.Hollister@Sun.COM #define	PMCIN_SMP_RESPONSE						0x13
10610696SDavid.Hollister@Sun.COM #define	PMCIN_SMP_ABORT							0x14
10710696SDavid.Hollister@Sun.COM #define	PMCIN_ASSISTED_DISCOVERY					0x15
10810696SDavid.Hollister@Sun.COM #define	PMCIN_REGISTER_DEVICE						0x16
10910696SDavid.Hollister@Sun.COM #define	PMCIN_SATA_HOST_IO_START					0x17
11010696SDavid.Hollister@Sun.COM #define	PMCIN_SATA_ABORT						0x18
11110696SDavid.Hollister@Sun.COM #define	PMCIN_LOCAL_PHY_CONTROL						0x19
11210696SDavid.Hollister@Sun.COM #define	PMCIN_GET_DEVICE_INFO						0x1A
11310696SDavid.Hollister@Sun.COM #define	PMCIN_TWI							0x1B
11410696SDavid.Hollister@Sun.COM #define	PMCIN_FW_FLASH_UPDATE						0x20
11510696SDavid.Hollister@Sun.COM #define	PMCIN_SET_VPD							0x21
11610696SDavid.Hollister@Sun.COM #define	PMCIN_GPIO							0x22
11710696SDavid.Hollister@Sun.COM #define	PMCIN_SAS_DIAG_MODE_START_END					0x23
11810696SDavid.Hollister@Sun.COM #define	PMCIN_SAS_DIAG_EXECUTE						0x24
11912258Ssrikanth.suravajhala@oracle.com #define	PMCIN_SAS_HW_EVENT_ACK						0x25
12010696SDavid.Hollister@Sun.COM #define	PMCIN_GET_TIME_STAMP						0x26
12110696SDavid.Hollister@Sun.COM #define	PMCIN_PORT_CONTROL						0x27
12210696SDavid.Hollister@Sun.COM #define	PMCIN_GET_NVMD_DATA						0x28
12310696SDavid.Hollister@Sun.COM #define	PMCIN_SET_NVMD_DATA						0x29
12410696SDavid.Hollister@Sun.COM #define	PMCIN_SET_DEVICE_STATE						0x2A
12510696SDavid.Hollister@Sun.COM #define	PMCIN_GET_DEVICE_STATE						0x2B
12610696SDavid.Hollister@Sun.COM 
12710696SDavid.Hollister@Sun.COM /*
12810696SDavid.Hollister@Sun.COM  * General Inbound Queue related parameters (DWORD 4)
12910696SDavid.Hollister@Sun.COM  */
13010696SDavid.Hollister@Sun.COM #define	PMCIN_MESSAGE_REPORT		(1 << 2)
13110696SDavid.Hollister@Sun.COM #define	PMCIN_DS_ABORT_TASK		(1 << 3)
13210696SDavid.Hollister@Sun.COM #define	PMCIN_DS_IN_RECOVERY		(1 << 4)
13310696SDavid.Hollister@Sun.COM #define	PMCIN_DATADIR_NONE		(0x00 << 8)
13410696SDavid.Hollister@Sun.COM #define	PMCIN_DATADIR_2_INI		(0x01 << 8)
13510696SDavid.Hollister@Sun.COM #define	PMCIN_DATADIR_2_DEV		(0x02 << 8)
13610696SDavid.Hollister@Sun.COM 
13710696SDavid.Hollister@Sun.COM 
13810696SDavid.Hollister@Sun.COM /*
13910696SDavid.Hollister@Sun.COM  * SATA Host IO Start ATA Protocol Types
14010696SDavid.Hollister@Sun.COM  * (placed into DWORD 4)
14110696SDavid.Hollister@Sun.COM  */
14210696SDavid.Hollister@Sun.COM 
14310696SDavid.Hollister@Sun.COM #define	SATA_PROTOCOL_SRST_ASSERT	(0x01 << 10)
14410696SDavid.Hollister@Sun.COM #define	SATA_PROTOCOL_SRT_DEASSERT	(0x02 << 10)
14510696SDavid.Hollister@Sun.COM #define	SATA_PROTOCOL_EXECDEVDIAG	(0x03 << 10)
14610696SDavid.Hollister@Sun.COM #define	SATA_PROTOCOL_NONDATA		(0x04 << 10)
14710696SDavid.Hollister@Sun.COM #define	SATA_PROTOCOL_PIO		(0x05 << 10)
14810696SDavid.Hollister@Sun.COM #define	SATA_PROTOCOL_DMA		(0x06 << 10)
14910696SDavid.Hollister@Sun.COM #define	SATA_PROTOCOL_FPDMA		(0x07 << 10)
15010696SDavid.Hollister@Sun.COM 
15110696SDavid.Hollister@Sun.COM /*
15210696SDavid.Hollister@Sun.COM  * SAS Host IO Start TLR definitions
15310696SDavid.Hollister@Sun.COM  * (placed into DWORD 4)
15410696SDavid.Hollister@Sun.COM  */
15510696SDavid.Hollister@Sun.COM #define	SAS_TLR_ALL	0	/* SAS 1.1 and SAS 2.0 per device mode page */
15610696SDavid.Hollister@Sun.COM #define	SAS_TLR_ON	1	/* unconditionally on */
15710696SDavid.Hollister@Sun.COM #define	SAS_TLR_OFF	2	/* unconditionally off */
15810696SDavid.Hollister@Sun.COM #define	SAS_TLR_SAS2	3	/* SAS 2.0 per device mode page */
15910696SDavid.Hollister@Sun.COM 
16010696SDavid.Hollister@Sun.COM /*
16110696SDavid.Hollister@Sun.COM  * IOP SMP Request Information
16210696SDavid.Hollister@Sun.COM  */
16310696SDavid.Hollister@Sun.COM #define	SMP_INDIRECT_RESPONSE		0x01
16410696SDavid.Hollister@Sun.COM #define	SMP_INDIRECT_REQUEST		0x02
16510696SDavid.Hollister@Sun.COM #define	SMP_PHY_OVERRIDE		0x04
16610696SDavid.Hollister@Sun.COM #define	SMP_REQUEST_LENGTH_SHIFT	16
16710696SDavid.Hollister@Sun.COM 
16810696SDavid.Hollister@Sun.COM /*
16910696SDavid.Hollister@Sun.COM  * PHY Start related definitions
17010696SDavid.Hollister@Sun.COM  */
17110696SDavid.Hollister@Sun.COM #define	PHY_LINK_1_5			0x01
17210696SDavid.Hollister@Sun.COM #define	PHY_LINK_3			0x02
17310696SDavid.Hollister@Sun.COM #define	PHY_LINK_6			0x04
17410696SDavid.Hollister@Sun.COM #define	PHY_LINK_ALL			(PHY_LINK_1_5 | PHY_LINK_3 | PHY_LINK_6)
17510696SDavid.Hollister@Sun.COM #define	PHY_LINK_SHIFT			8
17610696SDavid.Hollister@Sun.COM 
17710696SDavid.Hollister@Sun.COM #define	PHY_LM_SAS			1
17810696SDavid.Hollister@Sun.COM #define	PHY_LM_SATA			2
17910696SDavid.Hollister@Sun.COM #define	PHY_LM_AUTO			3
18010696SDavid.Hollister@Sun.COM #define	PHY_MODE_SHIFT			12
18110696SDavid.Hollister@Sun.COM 
18210696SDavid.Hollister@Sun.COM #define	PHY_SPINUP_HOLD			(1 << 14)
18310696SDavid.Hollister@Sun.COM 
18410696SDavid.Hollister@Sun.COM /*
18510696SDavid.Hollister@Sun.COM  * LOCAL PHY CONTROL related definitions
18610696SDavid.Hollister@Sun.COM  */
18710696SDavid.Hollister@Sun.COM 
18810696SDavid.Hollister@Sun.COM /*
18910696SDavid.Hollister@Sun.COM  * Device Registration related definitions
19010696SDavid.Hollister@Sun.COM  */
19110696SDavid.Hollister@Sun.COM #define	PMCS_DEVREG_LINK_RATE_SHIFT	24
19210696SDavid.Hollister@Sun.COM #define	PMCS_DEVREG_TYPE_SATA		0
19310696SDavid.Hollister@Sun.COM #define	PMCS_DEVREG_TYPE_SAS		(1 << 28)
19410696SDavid.Hollister@Sun.COM #define	PMCS_DEVREG_TYPE_SATA_DIRECT	(1 << 29)
19510696SDavid.Hollister@Sun.COM 
19610696SDavid.Hollister@Sun.COM #define	PMCS_PHYID_SHIFT		4	/* level 0 registration only */
19710696SDavid.Hollister@Sun.COM #define	PMCS_DEVREG_TLR			0x1	/* Transport Layer Retry */
19810696SDavid.Hollister@Sun.COM 
19911980SDavid.Hollister@Sun.COM #define	PMCS_DEVREG_IT_NEXUS_TIMEOUT	2000U
20010696SDavid.Hollister@Sun.COM 
20110696SDavid.Hollister@Sun.COM #define	PMCS_DEVREG_HA			0x2	/* Host Assigned upper 16 */
20210696SDavid.Hollister@Sun.COM 						/* bits for device ID. */
20310696SDavid.Hollister@Sun.COM /*
20410696SDavid.Hollister@Sun.COM  * These are used for getting/setting data in the NVRAM (SEEPROM, VPD, etc.)
20510696SDavid.Hollister@Sun.COM  */
20610696SDavid.Hollister@Sun.COM 
20710696SDavid.Hollister@Sun.COM typedef struct pmcs_get_nvmd_cmd_s {
20810696SDavid.Hollister@Sun.COM 	uint32_t		header;		/* DWORD 0 */
20910696SDavid.Hollister@Sun.COM 	uint32_t		htag;		/* DWORD 1 */
21010696SDavid.Hollister@Sun.COM 	uint8_t			tdas_nvmd;	/* DWORD 2 */
21110696SDavid.Hollister@Sun.COM 	uint8_t			tbn_tdps;
21210696SDavid.Hollister@Sun.COM 	uint8_t			tda;
21310696SDavid.Hollister@Sun.COM 	uint8_t			ip;
21410696SDavid.Hollister@Sun.COM 	uint8_t			doa[3];		/* DWORD 3 Data Offset Addr */
21510696SDavid.Hollister@Sun.COM 	uint8_t			d_len;		/* Direct Pld Data Len */
21610696SDavid.Hollister@Sun.COM 	uint32_t		rsvd[8];	/* DWORDS 4-11 */
21710696SDavid.Hollister@Sun.COM 	uint32_t		ipbal;		/* 12 - Ind Pld buf addr low */
21810696SDavid.Hollister@Sun.COM 	uint32_t		ipbah;		/* 13 - Ind Pld buf addr high */
21910696SDavid.Hollister@Sun.COM 	uint32_t		ipdl;		/* 14 - Ind Pld data length */
22010696SDavid.Hollister@Sun.COM 	uint32_t		rsvd3;
22110696SDavid.Hollister@Sun.COM } pmcs_get_nvmd_cmd_t;
22210696SDavid.Hollister@Sun.COM 
22310696SDavid.Hollister@Sun.COM typedef struct pmcs_set_nvmd_cmd_s {
22410696SDavid.Hollister@Sun.COM 	uint32_t		header;		/* DWORD 0 */
22510696SDavid.Hollister@Sun.COM 	uint32_t		htag;		/* DWORD 1 */
22610696SDavid.Hollister@Sun.COM 	uint8_t			tdas_nvmd;	/* DWORD 2 */
22710696SDavid.Hollister@Sun.COM 	uint8_t			tbn_tdps;
22810696SDavid.Hollister@Sun.COM 	uint8_t			tda;
22910696SDavid.Hollister@Sun.COM 	uint8_t			ip;
23010696SDavid.Hollister@Sun.COM 	uint8_t			doa[3];		/* DWORD 3 Data Offset Addr */
23110696SDavid.Hollister@Sun.COM 	uint8_t			d_len;		/* Direct Pld Data Len */
23210696SDavid.Hollister@Sun.COM 	uint32_t		signature;	/* DWORD 4 */
23310696SDavid.Hollister@Sun.COM 	uint32_t		rsvd[7];	/* DWORDS 5-11 */
23410696SDavid.Hollister@Sun.COM 	uint32_t		ipbal;		/* 12 - Ind Pld buf addr low */
23510696SDavid.Hollister@Sun.COM 	uint32_t		ipbah;		/* 13 - Ind Pld buf addr high */
23610696SDavid.Hollister@Sun.COM 	uint32_t		ipdl;		/* 14 - Ind Pld data length */
23710696SDavid.Hollister@Sun.COM 	uint32_t		rsvd2;
23810696SDavid.Hollister@Sun.COM } pmcs_set_nvmd_cmd_t;
23910696SDavid.Hollister@Sun.COM 
24010696SDavid.Hollister@Sun.COM #define	PMCIN_NVMD_DIRECT_PLD		0x00
24110696SDavid.Hollister@Sun.COM #define	PMCIN_NVMD_INDIRECT_PLD		0x80
24210696SDavid.Hollister@Sun.COM 
24310696SDavid.Hollister@Sun.COM /* TWI bus number is upper 4 bits of tbn_tdps */
24410696SDavid.Hollister@Sun.COM #define	PMCIN_NVMD_TBN(x)		(x << 4)
24510696SDavid.Hollister@Sun.COM 
24610696SDavid.Hollister@Sun.COM /* TWI Device Page Size bits (lower 4 bits of tbn_tdps */
24710696SDavid.Hollister@Sun.COM #define	PMCIN_NVMD_TDPS_1		0	/* 1 byte */
24810696SDavid.Hollister@Sun.COM #define	PMCIN_NVMD_TDPS_8		1	/* 8 bytes */
24910696SDavid.Hollister@Sun.COM #define	PMCIN_NVMD_TDPS_16		2	/* 16 bytes */
25010696SDavid.Hollister@Sun.COM #define	PMCIN_NVMD_TDPS_32		3	/* 32 bytes */
25110696SDavid.Hollister@Sun.COM 
25210696SDavid.Hollister@Sun.COM /* TWI Device Address Size (upper 4 bits of tdas_nvmd) */
25310696SDavid.Hollister@Sun.COM #define	PMCIN_NVMD_TDAS_1		(0 << 4)	/* 1 byte */
25410696SDavid.Hollister@Sun.COM #define	PMCIN_NVMD_TDAS_2		(1 << 4)	/* 2 bytes */
25510696SDavid.Hollister@Sun.COM 
25610696SDavid.Hollister@Sun.COM /*
25710696SDavid.Hollister@Sun.COM  * TWI Device Address
25810696SDavid.Hollister@Sun.COM  * The address used to access TWI device for the 2Kb SEEPROM device is
25910696SDavid.Hollister@Sun.COM  * arranged as follows:
26010696SDavid.Hollister@Sun.COM  *	Bits 7-4 are fixed (0xA)
26110696SDavid.Hollister@Sun.COM  *	Bits 3-1 are page numbers for each 256 byte page
26210696SDavid.Hollister@Sun.COM  *	Bit 0: Set to "1" to read, "0" to write
26310696SDavid.Hollister@Sun.COM  * Bit 0 is set/reset by the firmware based on whether the command is a
26410696SDavid.Hollister@Sun.COM  * SET or a GET.
26510696SDavid.Hollister@Sun.COM  */
26610696SDavid.Hollister@Sun.COM #define	PMCIN_TDA_BASE			0xA0
26710696SDavid.Hollister@Sun.COM #define	PMCIN_TDA_PAGE(x)		(PMCIN_TDA_BASE | (x << 1))
26810696SDavid.Hollister@Sun.COM 
26910696SDavid.Hollister@Sun.COM /* NVM Device bits (lower 4 bits of tdas_nvmd) */
27010696SDavid.Hollister@Sun.COM #define	PMCIN_NVMD_TWI			0	/* TWI Device */
27110696SDavid.Hollister@Sun.COM #define	PMCIN_NVMD_SEEPROM		1	/* SEEPROM Device */
27210696SDavid.Hollister@Sun.COM #define	PMCIN_NVMD_VPD			4	/* VPD Flash Memory */
27310696SDavid.Hollister@Sun.COM #define	PMCIN_NVMD_AAP1			5	/* AAP1 Register Dump */
27410696SDavid.Hollister@Sun.COM #define	PMCIN_NVMD_IOP			6	/* IOP Register Dump */
27510696SDavid.Hollister@Sun.COM 
27610696SDavid.Hollister@Sun.COM #define	PMCS_SEEPROM_PAGE_SIZE		256
27710696SDavid.Hollister@Sun.COM 
27810696SDavid.Hollister@Sun.COM /*
27910696SDavid.Hollister@Sun.COM  * Minimum and maximum sizes of SPCBoot image
28010696SDavid.Hollister@Sun.COM  */
28110696SDavid.Hollister@Sun.COM #define	PMCS_SPCBOOT_MIN_SIZE		64
28210696SDavid.Hollister@Sun.COM #define	PMCS_SPCBOOT_MAX_SIZE		512
28310696SDavid.Hollister@Sun.COM 
28410696SDavid.Hollister@Sun.COM #define	PMCS_SEEPROM_SIGNATURE		0xFEDCBA98
28510696SDavid.Hollister@Sun.COM 
28610696SDavid.Hollister@Sun.COM /*
28710696SDavid.Hollister@Sun.COM  * Register dump information
28810696SDavid.Hollister@Sun.COM  *
28910696SDavid.Hollister@Sun.COM  * There are two 16KB regions for register dump information
29010696SDavid.Hollister@Sun.COM  */
29110696SDavid.Hollister@Sun.COM 
29210696SDavid.Hollister@Sun.COM #define	PMCS_REGISTER_DUMP_FLASH_SIZE	(1024 * 16)
29310696SDavid.Hollister@Sun.COM #define	PMCS_REGISTER_DUMP_BLOCK_SIZE	4096	/* Must be read 4K at a time */
29410696SDavid.Hollister@Sun.COM #define	PMCS_FLASH_CHUNK_SIZE		4096	/* Must be read 4K at a time */
29510696SDavid.Hollister@Sun.COM #define	PMCS_REG_DUMP_SIZE		(1024 * 1024 * 12)
29610696SDavid.Hollister@Sun.COM #define	PMCS_NVMD_EVENT_LOG_OFFSET	0x10000
29710696SDavid.Hollister@Sun.COM #define	PMCS_IQP_TRACE_BUFFER_SIZE	(1024 * 512)
29810696SDavid.Hollister@Sun.COM 
29910696SDavid.Hollister@Sun.COM /*
30010696SDavid.Hollister@Sun.COM  * The list of items we can retrieve via the GET_NVMD_DATA command
30110696SDavid.Hollister@Sun.COM  */
30210696SDavid.Hollister@Sun.COM 
30310696SDavid.Hollister@Sun.COM typedef enum {
30410696SDavid.Hollister@Sun.COM 	PMCS_NVMD_VPD = 0,
30510696SDavid.Hollister@Sun.COM 	PMCS_NVMD_REG_DUMP,
30610696SDavid.Hollister@Sun.COM 	PMCS_NVMD_EVENT_LOG,
30710696SDavid.Hollister@Sun.COM 	PMCS_NVMD_SPCBOOT
30810696SDavid.Hollister@Sun.COM } pmcs_nvmd_type_t;
30910696SDavid.Hollister@Sun.COM 
31010696SDavid.Hollister@Sun.COM /*
31110696SDavid.Hollister@Sun.COM  * Command types, descriptors and offsets for SAS_DIAG_EXECUTE.
31210696SDavid.Hollister@Sun.COM  */
31310696SDavid.Hollister@Sun.COM #define	PMCS_DIAG_CMD_DESC_SHIFT	8
31410696SDavid.Hollister@Sun.COM #define	PMCS_DIAG_CMD_SHIFT		13
31510696SDavid.Hollister@Sun.COM #define	PMCS_DIAG_REPORT_GET		0x04	/* Get counters */
31610696SDavid.Hollister@Sun.COM #define	PMCS_ERR_CNT_RESET		0x05	/* Clear counters */
31710696SDavid.Hollister@Sun.COM #define	PMCS_DISPARITY_ERR_CNT		0x02	/* Disparity error count */
31810696SDavid.Hollister@Sun.COM #define	PMCS_LOST_DWORD_SYNC_CNT	0x05	/* Lost DWord sync count */
31910696SDavid.Hollister@Sun.COM #define	PMCS_INVALID_DWORD_CNT		0x06	/* Invalid DWord count */
32010696SDavid.Hollister@Sun.COM #define	PMCS_RESET_FAILED_CNT		0x0C	/* PHY reset failed count */
32110696SDavid.Hollister@Sun.COM 
32210696SDavid.Hollister@Sun.COM /*
32310696SDavid.Hollister@Sun.COM  * VPD data layout
32410696SDavid.Hollister@Sun.COM  */
32510696SDavid.Hollister@Sun.COM 
326*12698Ssrikanth.suravajhala@oracle.com #define	PMCS_EEPROM_INT_VERSION	1	/* supported version for Thebe INT */
327*12698Ssrikanth.suravajhala@oracle.com #define	PMCS_EEPROM_EXT_VERSION	2	/* supported version for Thebe EXT */
32810696SDavid.Hollister@Sun.COM #define	PMCS_VPD_DATA_PAGE	2	/* VPD starts at offset 512 */
32910696SDavid.Hollister@Sun.COM #define	PMCS_VPD_RO_BYTE	0x90	/* Start of "read-only" data */
33010696SDavid.Hollister@Sun.COM #define	PMCS_VPD_START		0x82	/* VPD start byte */
33110696SDavid.Hollister@Sun.COM #define	PMCS_VPD_END		0x78	/* VPD end byte */
33210696SDavid.Hollister@Sun.COM 
333*12698Ssrikanth.suravajhala@oracle.com #define	PMCS_EEPROM_INT_SSID_BYTE1	0x02	/* Byte 1 of Thebe INT SSID */
334*12698Ssrikanth.suravajhala@oracle.com #define	PMCS_EEPROM_INT_SSID_BYTE2	0x02	/* Byte 2 of Thebe INT SSID */
335*12698Ssrikanth.suravajhala@oracle.com #define	PMCS_EEPROM_EXT_SSID_BYTE1	0x00	/* Byte 1 of Thebe EXT SSID */
336*12698Ssrikanth.suravajhala@oracle.com #define	PMCS_EEPROM_EXT_SSID_BYTE2	0x22	/* Byte 2 of Thebe EXT SSID */
337*12698Ssrikanth.suravajhala@oracle.com 
33810696SDavid.Hollister@Sun.COM /*
33910696SDavid.Hollister@Sun.COM  * This structure defines the "header" for the VPD data.  Everything
34010696SDavid.Hollister@Sun.COM  * following this structure is self-defining.  The consumer just needs
34110696SDavid.Hollister@Sun.COM  * to allocate a buffer large enough for vpd_length + 3 bytes of data.
34210696SDavid.Hollister@Sun.COM  */
34310696SDavid.Hollister@Sun.COM 
34410696SDavid.Hollister@Sun.COM typedef struct {
34510696SDavid.Hollister@Sun.COM 	uint8_t		eeprom_version;
34610696SDavid.Hollister@Sun.COM 	uint8_t		vpd_length[2];	/* # bytes that follow, little-endian */
34710696SDavid.Hollister@Sun.COM 	uint8_t		hba_sas_wwid[8];
34810696SDavid.Hollister@Sun.COM 	uint8_t		subsys_pid[2];
34910696SDavid.Hollister@Sun.COM 	uint8_t		subsys_vid[2];
35010696SDavid.Hollister@Sun.COM 	uint8_t		vpd_start_byte;	/* 0x82 */
35110696SDavid.Hollister@Sun.COM 	uint8_t		strid_length[2]; /* little-endian */
35210696SDavid.Hollister@Sun.COM 	/* strid_length bytes follow */
35310696SDavid.Hollister@Sun.COM } pmcs_vpd_header_t;
35410696SDavid.Hollister@Sun.COM 
35510696SDavid.Hollister@Sun.COM typedef struct {
35610696SDavid.Hollister@Sun.COM 	char		keyword[2];
35710696SDavid.Hollister@Sun.COM 	uint8_t		value_length;
35810696SDavid.Hollister@Sun.COM 	char		value[1];	/* Length is actually value_length */
35910696SDavid.Hollister@Sun.COM } pmcs_vpd_kv_t;
36010696SDavid.Hollister@Sun.COM 
36110696SDavid.Hollister@Sun.COM /*
36210696SDavid.Hollister@Sun.COM  * From here on out are definitions related to Outbound Queues
36310696SDavid.Hollister@Sun.COM  * (completions of Inbound Queue requests and async events)
36410696SDavid.Hollister@Sun.COM  */
36510696SDavid.Hollister@Sun.COM 
36610696SDavid.Hollister@Sun.COM /*
36710696SDavid.Hollister@Sun.COM  * PMC IOMB Outbound Queue Opcodes
36810696SDavid.Hollister@Sun.COM  */
36910696SDavid.Hollister@Sun.COM #define	PMCOUT_ECHO							0x01
37010696SDavid.Hollister@Sun.COM #define	PMCOUT_GET_INFO							0x02
37110696SDavid.Hollister@Sun.COM #define	PMCOUT_GET_VPD							0x03
37210696SDavid.Hollister@Sun.COM #define	PMCOUT_SAS_HW_EVENT						0x04
37310696SDavid.Hollister@Sun.COM #define	PMCOUT_SSP_COMPLETION						0x05
37410696SDavid.Hollister@Sun.COM #define	PMCOUT_SMP_COMPLETION						0x06
37510696SDavid.Hollister@Sun.COM #define	PMCOUT_LOCAL_PHY_CONTROL					0x07
37610696SDavid.Hollister@Sun.COM #define	PMCOUT_SAS_ASSISTED_DISCOVERY_EVENT				0x08
37710696SDavid.Hollister@Sun.COM #define	PMCOUT_SATA_ASSISTED_DISCOVERY_EVENT				0x09
37810696SDavid.Hollister@Sun.COM #define	PMCOUT_DEVICE_REGISTRATION					0x0A
37910696SDavid.Hollister@Sun.COM #define	PMCOUT_DEREGISTER_DEVICE_HANDLE					0x0B
38010696SDavid.Hollister@Sun.COM #define	PMCOUT_GET_DEVICE_HANDLE					0x0C
38110696SDavid.Hollister@Sun.COM #define	PMCOUT_SATA_COMPLETION						0x0D
38210696SDavid.Hollister@Sun.COM #define	PMCOUT_SATA_EVENT						0x0E
38310696SDavid.Hollister@Sun.COM #define	PMCOUT_SSP_EVENT						0x0F
38410696SDavid.Hollister@Sun.COM #define	PMCOUT_DEVICE_HANDLE_ARRIVED					0x10
38510696SDavid.Hollister@Sun.COM #define	PMCOUT_SSP_REQUEST_RECEIVED					0x12
38610696SDavid.Hollister@Sun.COM #define	PMCOUT_DEVICE_INFO						0x13
38710696SDavid.Hollister@Sun.COM #define	PMCOUT_FW_FLASH_UPDATE						0x14
38810696SDavid.Hollister@Sun.COM #define	PMCOUT_SET_VPD							0x15
38910696SDavid.Hollister@Sun.COM #define	PMCOUT_GPIO							0x16
39010696SDavid.Hollister@Sun.COM #define	PMCOUT_GPIO_EVENT						0x17
39110696SDavid.Hollister@Sun.COM #define	PMCOUT_GENERAL_EVENT						0x18
39210696SDavid.Hollister@Sun.COM #define	PMCOUT_TWI							0x19
39310696SDavid.Hollister@Sun.COM #define	PMCOUT_SSP_ABORT						0x1A
39410696SDavid.Hollister@Sun.COM #define	PMCOUT_SATA_ABORT						0x1B
39510696SDavid.Hollister@Sun.COM #define	PMCOUT_SAS_DIAG_MODE_START_END					0x1C
39610696SDavid.Hollister@Sun.COM #define	PMCOUT_SAS_DIAG_EXECUTE						0x1D
39710696SDavid.Hollister@Sun.COM #define	PMCOUT_GET_TIME_STAMP						0x1E
39810696SDavid.Hollister@Sun.COM #define	PMCOUT_SAS_HW_EVENT_ACK_ACK					0x1F
39910696SDavid.Hollister@Sun.COM #define	PMCOUT_PORT_CONTROL						0x20
40010696SDavid.Hollister@Sun.COM #define	PMCOUT_SKIP_ENTRIES						0x21
40110696SDavid.Hollister@Sun.COM #define	PMCOUT_SMP_ABORT						0x22
40210696SDavid.Hollister@Sun.COM #define	PMCOUT_GET_NVMD_DATA						0x23
40310696SDavid.Hollister@Sun.COM #define	PMCOUT_SET_NVMD_DATA						0x24
40410696SDavid.Hollister@Sun.COM #define	PMCOUT_DEVICE_HANDLE_REMOVED					0x25
40510696SDavid.Hollister@Sun.COM #define	PMCOUT_SET_DEVICE_STATE						0x26
40610696SDavid.Hollister@Sun.COM #define	PMCOUT_GET_DEVICE_STATE						0x27
40710696SDavid.Hollister@Sun.COM #define	PMCOUT_SET_DEVICE_INFO						0x28
40810696SDavid.Hollister@Sun.COM 
40910696SDavid.Hollister@Sun.COM /*
41010696SDavid.Hollister@Sun.COM  * General Outbound Status Definitions
41110696SDavid.Hollister@Sun.COM  */
41210696SDavid.Hollister@Sun.COM #define	PMCOUT_STATUS_OK						0x00
41310696SDavid.Hollister@Sun.COM #define	PMCOUT_STATUS_ABORTED						0x01
41410696SDavid.Hollister@Sun.COM #define	PMCOUT_STATUS_OVERFLOW						0x02
41510696SDavid.Hollister@Sun.COM #define	PMCOUT_STATUS_UNDERFLOW						0x03
41610696SDavid.Hollister@Sun.COM #define	PMCOUT_STATUS_FAILED						0x04
41710696SDavid.Hollister@Sun.COM #define	PMCOUT_STATUS_ABORT_RESET					0x05
41810696SDavid.Hollister@Sun.COM #define	PMCOUT_STATUS_IO_NOT_VALID					0x06
41910696SDavid.Hollister@Sun.COM #define	PMCOUT_STATUS_NO_DEVICE						0x07
42010696SDavid.Hollister@Sun.COM #define	PMCOUT_STATUS_ILLEGAL_PARAMETER					0x08
42110696SDavid.Hollister@Sun.COM #define	PMCOUT_STATUS_LINK_FAILURE					0x09
42210696SDavid.Hollister@Sun.COM #define	PMCOUT_STATUS_PROG_ERROR					0x0A
42310696SDavid.Hollister@Sun.COM #define	PMCOUT_STATUS_EDC_IN_ERROR					0x0B
42410696SDavid.Hollister@Sun.COM #define	PMCOUT_STATUS_EDC_OUT_ERROR					0x0C
42510696SDavid.Hollister@Sun.COM #define	PMCOUT_STATUS_ERROR_HW_TIMEOUT					0x0D
42610696SDavid.Hollister@Sun.COM #define	PMCOUT_STATUS_XFER_ERR_BREAK					0x0E
42710696SDavid.Hollister@Sun.COM #define	PMCOUT_STATUS_XFER_ERR_PHY_NOT_READY				0x0F
42810696SDavid.Hollister@Sun.COM #define	PMCOUT_STATUS_OPEN_CNX_PROTOCOL_NOT_SUPPORTED			0x10
42910696SDavid.Hollister@Sun.COM #define	PMCOUT_STATUS_OPEN_CNX_ERROR_ZONE_VIOLATION			0x11
43010696SDavid.Hollister@Sun.COM #define	PMCOUT_STATUS_OPEN_CNX_ERROR_BREAK				0x12
43110696SDavid.Hollister@Sun.COM #define	PMCOUT_STATUS_OPEN_CNX_ERROR_IT_NEXUS_LOSS			0x13
43210696SDavid.Hollister@Sun.COM #define	PMCOUT_STATUS_OPENCNX_ERROR_BAD_DESTINATION			0x14
43310696SDavid.Hollister@Sun.COM #define	PMCOUT_STATUS_OPEN_CNX_ERROR_CONNECTION_RATE_NOT_SUPPORTED	0x15
43410696SDavid.Hollister@Sun.COM #define	PMCOUT_STATUS_OPEN_CNX_ERROR_STP_RESOURCES_BUSY			0x16
43510696SDavid.Hollister@Sun.COM #define	PMCOUT_STATUS_OPEN_CNX_ERROR_WRONG_DESTINATION			0x17
43611601SDavid.Hollister@Sun.COM #define	PMCOUT_STATUS_OPEN_CNX_ERROR_UNKNOWN_ERROR			0x18
43710696SDavid.Hollister@Sun.COM #define	PMCOUT_STATUS_IO_XFER_ERROR_NAK_RECEIVED			0x19
43810696SDavid.Hollister@Sun.COM #define	PMCOUT_STATUS_XFER_ERROR_ACK_NAK_TIMEOUT			0x1A
43910696SDavid.Hollister@Sun.COM #define	PMCOUT_STATUS_XFER_ERROR_PEER_ABORTED				0x1B
44010696SDavid.Hollister@Sun.COM #define	PMCOUT_STATUS_XFER_ERROR_RX_FRAME				0x1C
44110696SDavid.Hollister@Sun.COM #define	PMCOUT_STATUS_IO_XFER_ERROR_DMA					0x1D
44210696SDavid.Hollister@Sun.COM #define	PMCOUT_STATUS_XFER_ERROR_CREDIT_TIMEOUT				0x1E
44310696SDavid.Hollister@Sun.COM #define	PMCOUT_STATUS_XFER_ERROR_SATA_LINK_TIMEOUT			0x1F
44410696SDavid.Hollister@Sun.COM #define	PMCOUT_STATUS_XFER_ERROR_SATA					0x20
44510696SDavid.Hollister@Sun.COM #define	PMCOUT_STATUS_XFER_ERROR_REJECTED_NCQ_MODE			0x21
44610696SDavid.Hollister@Sun.COM #define	PMCOUT_STATUS_XFER_ERROR_ABORTED_DUE_TO_SRST			0x22
44710696SDavid.Hollister@Sun.COM #define	PMCOUT_STATUS_XFER_ERROR_ABORTED_NCQ_MODE			0x23
44810696SDavid.Hollister@Sun.COM #define	PMCOUT_STATUS_IO_XFER_OPEN_RETRY_TIMEOUT			0x24
44910696SDavid.Hollister@Sun.COM #define	PMCOUT_STATUS_SMP_RESP_CONNECTION_ERROR				0x25
45010696SDavid.Hollister@Sun.COM #define	PMCOUT_STATUS_XFER_ERROR_UNEXPECTED_PHASE			0x26
45110696SDavid.Hollister@Sun.COM #define	PMCOUT_STATUS_XFER_ERROR_RDY_OVERRUN				0x27
45210696SDavid.Hollister@Sun.COM #define	PMCOUT_STATUS_XFER_ERROR_RDY_NOT_EXPECTED			0x28
45310696SDavid.Hollister@Sun.COM /* 0x29 */
45410696SDavid.Hollister@Sun.COM /* 0x2A */
45510696SDavid.Hollister@Sun.COM /* 0x2B */
45610696SDavid.Hollister@Sun.COM /* 0x2C */
45710696SDavid.Hollister@Sun.COM /* 0x2D */
45810696SDavid.Hollister@Sun.COM /* 0x2E */
45910696SDavid.Hollister@Sun.COM /* 0x2F */
46010696SDavid.Hollister@Sun.COM #define	PMCOUT_STATUS_XFER_ERROR_CMD_ISSUE_ACK_NAK_TIMEOUT		0x30
46110696SDavid.Hollister@Sun.COM #define	PMCOUT_STATUS_XFER_ERROR_CMD_ISSUE_BREAK_BEFORE_ACK_NACK	0x31
46210696SDavid.Hollister@Sun.COM #define	PMCOUT_STATUS_XFER_ERROR_CMD_ISSUE_PHY_DOWN_BEFORE_ACK_NAK	0x32
46310696SDavid.Hollister@Sun.COM /* 0x33 */
46410696SDavid.Hollister@Sun.COM #define	PMCOUT_STATUS_XFER_ERROR_OFFSET_MISMATCH			0x34
46510696SDavid.Hollister@Sun.COM #define	PMCOUT_STATUS_XFER_ERROR_ZERO_DATA_LEN				0x35
46610696SDavid.Hollister@Sun.COM #define	PMCOUT_STATUS_XFER_CMD_FRAME_ISSUED				0x36
46710696SDavid.Hollister@Sun.COM #define	PMCOUT_STATUS_ERROR_INTERNAL_SMP_RESOURCE			0x37
46810696SDavid.Hollister@Sun.COM #define	PMCOUT_STATUS_IO_PORT_IN_RESET					0x38
46910696SDavid.Hollister@Sun.COM #define	PMCOUT_STATUS_IO_DS_NON_OPERATIONAL				0x39
47010696SDavid.Hollister@Sun.COM #define	PMCOUT_STATUS_IO_DS_IN_RECOVERY					0x3A
47111601SDavid.Hollister@Sun.COM #define	PMCOUT_STATUS_IO_TM_TAG_NOT_FOUND				0x3B
47211601SDavid.Hollister@Sun.COM #define	PMCOUT_STATUS_IO_SSP_EXT_IU_ZERO_LEN_ERROR			0x3D
47311601SDavid.Hollister@Sun.COM #define	PMCOUT_STATUS_IO_OPEN_CNX_ERROR_HW_RESOURCE_BUSY		0x3F
47410696SDavid.Hollister@Sun.COM #define	PMCOUT_STATUS_IO_ABORT_IN_PROGRESS				0x40
47510696SDavid.Hollister@Sun.COM 
47610696SDavid.Hollister@Sun.COM /*
47711241SDavid.Hollister@Sun.COM  * IOMB formats
47811241SDavid.Hollister@Sun.COM  *
47911241SDavid.Hollister@Sun.COM  * NOTE: All IOMBs are little-endian with exceptions to certain parts of
48011241SDavid.Hollister@Sun.COM  * some IOMBs.  For example, the SSP_RESPONSE_IU in the SSP_COMPLETION
48111241SDavid.Hollister@Sun.COM  * outbound IOMB is big-endian (SAS).
48211241SDavid.Hollister@Sun.COM  */
48311241SDavid.Hollister@Sun.COM 
48411241SDavid.Hollister@Sun.COM /* Common IOMB header */
48511241SDavid.Hollister@Sun.COM 
48611241SDavid.Hollister@Sun.COM typedef struct pmcs_iomb_header {
48711241SDavid.Hollister@Sun.COM 	uint8_t		opcode_lo;
48811241SDavid.Hollister@Sun.COM 	DECL_BITFIELD2(opcode_hi: 4,
48911241SDavid.Hollister@Sun.COM 	    cat			: 4);
49011241SDavid.Hollister@Sun.COM 	DECL_BITFIELD2(obid	: 6,
49111241SDavid.Hollister@Sun.COM 	    rsvd1		: 2);
49211241SDavid.Hollister@Sun.COM 	DECL_BITFIELD4(buf_count: 5,
49311241SDavid.Hollister@Sun.COM 	    rsvd2		: 1,
49411241SDavid.Hollister@Sun.COM 	    h_bit		: 1,
49511241SDavid.Hollister@Sun.COM 	    v_bit		: 1);
49611241SDavid.Hollister@Sun.COM } pmcs_iomb_header_t;
49711241SDavid.Hollister@Sun.COM 
49811241SDavid.Hollister@Sun.COM /* PMCOUT_SSP_COMPLETION */
49911241SDavid.Hollister@Sun.COM 
50011241SDavid.Hollister@Sun.COM typedef struct pmcout_ssp_comp {
50111241SDavid.Hollister@Sun.COM 	pmcs_iomb_header_t	header;
50211241SDavid.Hollister@Sun.COM 	uint32_t		htag;
50311241SDavid.Hollister@Sun.COM 	uint32_t		status;
50411241SDavid.Hollister@Sun.COM 	uint32_t		param;
50511241SDavid.Hollister@Sun.COM 	uint16_t		ssp_tag;
50611241SDavid.Hollister@Sun.COM 	DECL_BITFIELD3(resc_v	: 1,
50711241SDavid.Hollister@Sun.COM 	    resc_pad	: 2,
50811241SDavid.Hollister@Sun.COM 	    rsvd1	: 5);
50911241SDavid.Hollister@Sun.COM 	uint8_t			rsvd2;
51011241SDavid.Hollister@Sun.COM 	/* SSP_RESPONSE_IU (if it exists) */
51111241SDavid.Hollister@Sun.COM 	/* Residual count (if resc_v is set) */
51211241SDavid.Hollister@Sun.COM } pmcout_ssp_comp_t;
51311241SDavid.Hollister@Sun.COM 
51411241SDavid.Hollister@Sun.COM 
51511241SDavid.Hollister@Sun.COM /*
51610696SDavid.Hollister@Sun.COM  * Device State definitions
51710696SDavid.Hollister@Sun.COM  */
51811090SDavid.Hollister@Sun.COM #define	PMCS_DEVICE_STATE_NOT_AVAILABLE		0x0	/* Unconfigured tgt */
51910696SDavid.Hollister@Sun.COM #define	PMCS_DEVICE_STATE_OPERATIONAL		0x1
52010696SDavid.Hollister@Sun.COM #define	PMCS_DEVICE_STATE_PORT_IN_RESET		0x2
52110696SDavid.Hollister@Sun.COM #define	PMCS_DEVICE_STATE_IN_RECOVERY		0x3
52210696SDavid.Hollister@Sun.COM #define	PMCS_DEVICE_STATE_IN_ERROR		0x4
52310696SDavid.Hollister@Sun.COM #define	PMCS_DEVICE_STATE_NON_OPERATIONAL	0x7
52410696SDavid.Hollister@Sun.COM 
52510696SDavid.Hollister@Sun.COM /*
52610696SDavid.Hollister@Sun.COM  * Reset Types
52710696SDavid.Hollister@Sun.COM  */
52810696SDavid.Hollister@Sun.COM #define	PMCS_SSP_LINK_RESET		0x1
52910696SDavid.Hollister@Sun.COM #define	PMCS_SSP_HARD_RESET		0x2
53010696SDavid.Hollister@Sun.COM #define	PMCS_SMP_HARD_RESET		0x3
53110696SDavid.Hollister@Sun.COM 
53210696SDavid.Hollister@Sun.COM /*
53310696SDavid.Hollister@Sun.COM  * PHYOP for LOCAL_PHY_CONTROL Command
53410696SDavid.Hollister@Sun.COM  */
53510696SDavid.Hollister@Sun.COM #define	PMCS_PHYOP_LINK_RESET		0x01
53610696SDavid.Hollister@Sun.COM #define	PMCS_PHYOP_HARD_RESET		0x02
53710696SDavid.Hollister@Sun.COM 
53810696SDavid.Hollister@Sun.COM /*
53910696SDavid.Hollister@Sun.COM  * Specialized status values
54010696SDavid.Hollister@Sun.COM  */
54110696SDavid.Hollister@Sun.COM /* PHY Stop Status Results */
54210696SDavid.Hollister@Sun.COM #define	IOP_PHY_STOP_OK		0x0
54310696SDavid.Hollister@Sun.COM #define	IOP_PHY_STOP_INVALID	0x1
54410696SDavid.Hollister@Sun.COM #define	IOP_PHY_STOP_ERROR	0x3
54510696SDavid.Hollister@Sun.COM #define	IOP_PHY_STOP_ALREADY	0x4
54610696SDavid.Hollister@Sun.COM 
54710696SDavid.Hollister@Sun.COM /* PHY Start Status Results */
54810696SDavid.Hollister@Sun.COM #define	IOP_PHY_START_OK	0
54910696SDavid.Hollister@Sun.COM #define	IOP_PHY_START_INVALID	1
55010696SDavid.Hollister@Sun.COM #define	IOP_PHY_START_ALREADY	2
55110696SDavid.Hollister@Sun.COM #define	IOP_PHY_START_ERROR	3
55210696SDavid.Hollister@Sun.COM 
55310696SDavid.Hollister@Sun.COM /* SET/GET_NVMD status results */
55410696SDavid.Hollister@Sun.COM #define	PMCS_NVMD_STAT_SUCCESS			0x0000
55510696SDavid.Hollister@Sun.COM #define	PMCS_NVMD_STAT_PLD_NVMD_COMB_ERR	0x0001
55610696SDavid.Hollister@Sun.COM #define	PMCS_NVMD_STAT_PLD_LEN_ERR		0x0002
55710696SDavid.Hollister@Sun.COM #define	PMCS_NVMD_STAT_TWI_DEV_NACK		0x2001
55810696SDavid.Hollister@Sun.COM #define	PMCS_NVMD_STAT_TWI_DEV_LOST_ARB		0x2002
55910696SDavid.Hollister@Sun.COM #define	PMCS_NVMD_STAT_TWI_TIMEOUT		0x2021
56010696SDavid.Hollister@Sun.COM #define	PMCS_NVMD_STAT_TWI_BUS_NACK		0x2081
56110696SDavid.Hollister@Sun.COM #define	PMCS_NVMD_STAT_TWI_DEV_ARB_FAIL		0x2082
56210696SDavid.Hollister@Sun.COM #define	PMCS_NVMD_STAT_TWI_BUS_SER_TIMEO	0x20FF
56310696SDavid.Hollister@Sun.COM #define	PMCS_NVMD_STAT_PART_NOT_IN_FLASH	0x9001
56410696SDavid.Hollister@Sun.COM #define	PMCS_NVMD_STAT_LEN_TOO_LARGE		0x9002
56510696SDavid.Hollister@Sun.COM #define	PMCS_NVMD_STAT_FLASH_PRGRM_FAIL		0x9003
56610696SDavid.Hollister@Sun.COM #define	PMCS_NVMD_STAT_DEVID_MATCH_FAIL		0x9004
56710696SDavid.Hollister@Sun.COM #define	PMCS_NVMD_STAT_VENDID_MATCH_FAIL	0x9005
56810696SDavid.Hollister@Sun.COM #define	PMCS_NVMD_STAT_SEC_ERASE_TIMEO		0x9006
56910696SDavid.Hollister@Sun.COM #define	PMCS_NVMD_STAT_SEC_ERASE_CWE		0x9007
57010696SDavid.Hollister@Sun.COM #define	PMCS_NVMD_STAT_FLASH_DEV_BUSY		0x9008
57110696SDavid.Hollister@Sun.COM #define	PMCS_NVMD_STAT_FLASH_DEV_NOT_SUP	0x9009
57210696SDavid.Hollister@Sun.COM #define	PMCS_NVMD_STAT_FLASH_NO_CFI		0x900A
57310696SDavid.Hollister@Sun.COM #define	PMCS_NVMD_STAT_ERASE_BLOCKS		0x900B
57410696SDavid.Hollister@Sun.COM #define	PMCS_NVMD_STAT_PART_READ_ONLY		0x900C
57510696SDavid.Hollister@Sun.COM #define	PMCS_NVMD_STAT_PART_INV_MAP_TYPE	0x900D
57610696SDavid.Hollister@Sun.COM #define	PMCS_NVMD_STAT_PART_INIT_STR_DIS	0x900E
57710696SDavid.Hollister@Sun.COM 
57810696SDavid.Hollister@Sun.COM /*
57910696SDavid.Hollister@Sun.COM  * General Event Status Codes
58010696SDavid.Hollister@Sun.COM  */
58110696SDavid.Hollister@Sun.COM #define	INBOUND_IOMB_V_BIT_NOT_SET		0x1
58210696SDavid.Hollister@Sun.COM #define	INBOUND_IOMB_OPC_NOT_SUPPORTED		0x2
58310696SDavid.Hollister@Sun.COM 
58410696SDavid.Hollister@Sun.COM /* Device Register Status Results */
58510696SDavid.Hollister@Sun.COM #define	PMCS_DEVREG_OK				0x0
58610696SDavid.Hollister@Sun.COM #define	PMCS_DEVREG_DEVICE_ALREADY_REGISTERED	0x2
58710696SDavid.Hollister@Sun.COM #define	PMCS_DEVREG_PHY_ALREADY_REGISTERED	0x4
58810696SDavid.Hollister@Sun.COM 
58910696SDavid.Hollister@Sun.COM /*
59010696SDavid.Hollister@Sun.COM  * Flash Update responses
59110696SDavid.Hollister@Sun.COM  */
59210696SDavid.Hollister@Sun.COM #define	FLASH_UPDATE_COMPLETE_PENDING_REBOOT	0x0
59310696SDavid.Hollister@Sun.COM #define	FLASH_UPDATE_IN_PROGRESS		0x1
59410696SDavid.Hollister@Sun.COM #define	FLASH_UPDATE_HDR_ERR			0x2
59510696SDavid.Hollister@Sun.COM #define	FLASH_UPDATE_OFFSET_ERR			0x3
59610696SDavid.Hollister@Sun.COM #define	FLASH_UPDATE_UPDATE_CRC_ERR		0x4
59710696SDavid.Hollister@Sun.COM #define	FLASH_UPDATE_LENGTH_ERR			0x5
59810696SDavid.Hollister@Sun.COM #define	FLASH_UPDATE_HW_ERR			0x6
59910696SDavid.Hollister@Sun.COM #define	FLASH_UPDATE_DNLD_NOT_SUPPORTED		0x10
60010696SDavid.Hollister@Sun.COM #define	FLASH_UPDATE_DISABLED			0x11
60110696SDavid.Hollister@Sun.COM 
60210696SDavid.Hollister@Sun.COM /*
60310696SDavid.Hollister@Sun.COM  * IOP SAS HW Event Related definitions
60410696SDavid.Hollister@Sun.COM  */
60510696SDavid.Hollister@Sun.COM 
60610696SDavid.Hollister@Sun.COM #define	IOP_EVENT_LINK_RATE(x)		((x >> 28) & 0xf)
60710696SDavid.Hollister@Sun.COM #define	IOP_EVENT_STATUS(x) 		((x >> 24) & 0xf)
60810696SDavid.Hollister@Sun.COM #define	IOP_EVENT_EVENT(x)		((x >> 8) & 0xffff)
60910696SDavid.Hollister@Sun.COM #define	IOP_EVENT_PHYNUM(x)		((x >> 4) & 0xf)
61010696SDavid.Hollister@Sun.COM #define	IOP_EVENT_PORTID(x)		((x) & 0xf)
61110696SDavid.Hollister@Sun.COM 
61210696SDavid.Hollister@Sun.COM 
61310696SDavid.Hollister@Sun.COM #define	IOP_EVENT_PHY_STOP_STATUS		0x03
61410696SDavid.Hollister@Sun.COM #define	IOP_EVENT_SAS_PHY_UP			0x04
61510696SDavid.Hollister@Sun.COM #define	IOP_EVENT_SATA_PHY_UP			0x05
61610696SDavid.Hollister@Sun.COM #define	IOP_EVENT_SATA_SPINUP_HOLD		0x06
61710696SDavid.Hollister@Sun.COM #define	IOP_EVENT_PHY_DOWN			0x07
61810696SDavid.Hollister@Sun.COM #define	IOP_EVENT_PORT_INVALID			0x08	/* < fw 1.6 */
61910696SDavid.Hollister@Sun.COM #define	IOP_EVENT_BROADCAST_CHANGE		0x09
62010696SDavid.Hollister@Sun.COM #define	IOP_EVENT_BROADCAST_SES			0x0B
62110696SDavid.Hollister@Sun.COM #define	IOP_EVENT_PHY_ERR_INBOUND_CRC		0x0C
62210696SDavid.Hollister@Sun.COM #define	IOP_EVENT_HARD_RESET_RECEIVED		0x0D
62310696SDavid.Hollister@Sun.COM #define	IOP_EVENT_EVENT_ID_FRAME_TIMO		0x0F
62410696SDavid.Hollister@Sun.COM #define	IOP_EVENT_BROADCAST_EXP			0x10
62510696SDavid.Hollister@Sun.COM #define	IOP_EVENT_PHY_START_STATUS		0x11
62610696SDavid.Hollister@Sun.COM #define	IOP_EVENT_PHY_ERR_INVALID_DWORD		0x12
62710696SDavid.Hollister@Sun.COM #define	IOP_EVENT_PHY_ERR_DISPARITY_ERROR	0x13
62810696SDavid.Hollister@Sun.COM #define	IOP_EVENT_PHY_ERR_CODE_VIOLATION	0x14
62910696SDavid.Hollister@Sun.COM #define	IOP_EVENT_PHY_ERR_LOSS_OF_DWORD_SYN	0x15
63010696SDavid.Hollister@Sun.COM #define	IOP_EVENT_PHY_ERR_PHY_RESET_FAILD	0x16
63110696SDavid.Hollister@Sun.COM #define	IOP_EVENT_PORT_RECOVERY_TIMER_TMO	0x17
63210696SDavid.Hollister@Sun.COM #define	IOP_EVENT_PORT_RECOVER			0x18
63310696SDavid.Hollister@Sun.COM #define	IOP_EVENT_PORT_RESET_TIMER_TMO		0x19
63410696SDavid.Hollister@Sun.COM #define	IOP_EVENT_PORT_RESET_COMPLETE		0x20
63510696SDavid.Hollister@Sun.COM #define	IOP_EVENT_BROADCAST_ASYNC_EVENT		0x21
63611601SDavid.Hollister@Sun.COM #define	IOP_EVENT_IT_NEXUS_LOSS			0x22
63710696SDavid.Hollister@Sun.COM 
63810696SDavid.Hollister@Sun.COM 
63910696SDavid.Hollister@Sun.COM #define	IOP_EVENT_PORT_STATE(x)		((x) & 0xf)
64010696SDavid.Hollister@Sun.COM #define	IOP_EVENT_NPIP(x)		(((x) >> 4) & 0xf)
64110696SDavid.Hollister@Sun.COM 
64210696SDavid.Hollister@Sun.COM #define	IOP_EVENT_PS_NIL		0x0	/* PORT_ID not valid yet */
64310696SDavid.Hollister@Sun.COM #define	IOP_EVENT_PS_VALID		0x1	/* PORT_ID now valid */
64410696SDavid.Hollister@Sun.COM #define	IOP_EVENT_PS_LOSTCOMM		0x2	/* Link temporarily down */
64510696SDavid.Hollister@Sun.COM #define	IOP_EVENT_PS_IN_RESET		0x4	/* Port in reset */
64610696SDavid.Hollister@Sun.COM #define	IOP_EVENT_PS_INVALID		0x8	/* PORT_ID now dead */
64710696SDavid.Hollister@Sun.COM 
64810696SDavid.Hollister@Sun.COM /*
64910696SDavid.Hollister@Sun.COM  * HW Event Acknowledge Response Values
65010696SDavid.Hollister@Sun.COM  */
65110696SDavid.Hollister@Sun.COM #define	SAS_HW_EVENT_ACK_OK		0x0
65210696SDavid.Hollister@Sun.COM #define	SAS_HW_EVENT_ACK_INVALID_SEA	0x1
65310696SDavid.Hollister@Sun.COM #define	SAS_HW_EVENT_ACK_INVALID_PHY	0x2
65410696SDavid.Hollister@Sun.COM #define	SAS_HW_EVENT_ACK_INVALID_PORT	0x4
65510696SDavid.Hollister@Sun.COM #define	SAS_HW_EVENT_ACK_INVALID_PARAM	0x8
65610696SDavid.Hollister@Sun.COM 
65710696SDavid.Hollister@Sun.COM /*
65810696SDavid.Hollister@Sun.COM  * IOMB Queue definitions and Macros
65910696SDavid.Hollister@Sun.COM  */
66010696SDavid.Hollister@Sun.COM 
66110696SDavid.Hollister@Sun.COM #define	ADDQI(ix, n, qd)	((ix + n) & (qd - 1))
66210696SDavid.Hollister@Sun.COM #define	INCQI(ix, qd)		ix = ADDQI(ix, 1, qd)
66310696SDavid.Hollister@Sun.COM #define	QI2O(ix, n, qd)		(ADDQI(ix, n, qd) * PMCS_QENTRY_SIZE)
66410696SDavid.Hollister@Sun.COM 
66510696SDavid.Hollister@Sun.COM /*
66610696SDavid.Hollister@Sun.COM  * Inbound Queue Producer Indices live inside the PMC card.
66710696SDavid.Hollister@Sun.COM  *
66810696SDavid.Hollister@Sun.COM  * Inbound Queue Consumer indices live in host memory. We use the Consumer
66910696SDavid.Hollister@Sun.COM  * Index to return a pointer to an Inbound Queue entry. We then can fill
67010696SDavid.Hollister@Sun.COM  * it with an IOMB. We then update the the Producer index which kicks
67110696SDavid.Hollister@Sun.COM  * card to read the IOMB we just wrote.
67210696SDavid.Hollister@Sun.COM  *
67310696SDavid.Hollister@Sun.COM  * There is one mutex for each inbound queue that is held from the time
67410696SDavid.Hollister@Sun.COM  * we get an entry until we increment the producer index, or released
67510696SDavid.Hollister@Sun.COM  * manually if we don't actually send the message.
67610696SDavid.Hollister@Sun.COM  */
67710696SDavid.Hollister@Sun.COM 
67810696SDavid.Hollister@Sun.COM /*
67910696SDavid.Hollister@Sun.COM  * NB: the appropriate iqp_lock must be held
68010696SDavid.Hollister@Sun.COM  */
68110696SDavid.Hollister@Sun.COM #define	GET_IQ_ENTRY(hwp, qnum)	\
68210696SDavid.Hollister@Sun.COM 	((ADDQI(hwp->shadow_iqpi[qnum], 1, hwp->ioq_depth) == \
68310696SDavid.Hollister@Sun.COM 	pmcs_rd_iqci(hwp, qnum)) ? NULL : \
68410696SDavid.Hollister@Sun.COM 	&hwp->iqp[qnum][hwp->shadow_iqpi[qnum] * (PMCS_QENTRY_SIZE >> 2)])
68510696SDavid.Hollister@Sun.COM 
68610696SDavid.Hollister@Sun.COM /*
68710696SDavid.Hollister@Sun.COM  * NB: This releases the lock on the Inbound Queue that GET_IO_IQ_ENTRY
68810696SDavid.Hollister@Sun.COM  * acquired below.
68910696SDavid.Hollister@Sun.COM  */
69010696SDavid.Hollister@Sun.COM #ifdef	DEBUG
69110696SDavid.Hollister@Sun.COM #define	INC_IQ_ENTRY(hwp, qnum)						\
69210696SDavid.Hollister@Sun.COM {									\
69310696SDavid.Hollister@Sun.COM 	uint32_t htag;							\
69410696SDavid.Hollister@Sun.COM 	ASSERT(mutex_owned(&(hwp)->iqp_lock[qnum]));			\
69510696SDavid.Hollister@Sun.COM 	htag = hwp->iqp[qnum][(hwp->shadow_iqpi[qnum] *			\
69610696SDavid.Hollister@Sun.COM 	    (PMCS_QENTRY_SIZE >> 2)) + 1];				\
69710696SDavid.Hollister@Sun.COM 	mutex_enter(&(hwp)->dbglock);					\
69810696SDavid.Hollister@Sun.COM 	pmcs_iqp_trace(hwp, qnum);					\
69910696SDavid.Hollister@Sun.COM 	mutex_exit(&(hwp)->dbglock);					\
70010696SDavid.Hollister@Sun.COM 	INCQI(hwp->shadow_iqpi[qnum], hwp->ioq_depth);			\
70110696SDavid.Hollister@Sun.COM 	if (ddi_dma_sync(hwp->cip_handles, 0, 0,			\
70210696SDavid.Hollister@Sun.COM 	    DDI_DMA_SYNC_FORDEV) != DDI_SUCCESS) {			\
70311048SDavid.Hollister@Sun.COM 		pmcs_prt(hwp, PMCS_PRT_DEBUG, NULL, NULL, "Condition "	\
70411048SDavid.Hollister@Sun.COM 		    "failed at %s():%d", __func__, __LINE__);		\
70510696SDavid.Hollister@Sun.COM 	}								\
70611048SDavid.Hollister@Sun.COM 	hwp->ftime[hwp->fti] = gethrtime();				\
70710696SDavid.Hollister@Sun.COM 	pmcs_wr_iqpi(hwp, qnum, hwp->shadow_iqpi[qnum]);		\
70810696SDavid.Hollister@Sun.COM 	mutex_exit(&(hwp)->iqp_lock[qnum]);				\
70910696SDavid.Hollister@Sun.COM 	mutex_enter(&(hwp)->dbglock);					\
71010696SDavid.Hollister@Sun.COM 	hwp->ftag_lines[hwp->fti] = __LINE__;				\
71110696SDavid.Hollister@Sun.COM 	hwp->ftags[hwp->fti++] = htag;					\
71210696SDavid.Hollister@Sun.COM 	mutex_exit(&(hwp)->dbglock);					\
71310696SDavid.Hollister@Sun.COM }
71410696SDavid.Hollister@Sun.COM #else
71510696SDavid.Hollister@Sun.COM #define	INC_IQ_ENTRY(hwp, qnum)						\
71610696SDavid.Hollister@Sun.COM 	INCQI(hwp->shadow_iqpi[qnum], hwp->ioq_depth);			\
71710696SDavid.Hollister@Sun.COM 	if (ddi_dma_sync(hwp->cip_handles, 0, 0,			\
71810696SDavid.Hollister@Sun.COM 	    DDI_DMA_SYNC_FORDEV) != DDI_SUCCESS) {			\
71911048SDavid.Hollister@Sun.COM 		pmcs_prt(hwp, PMCS_PRT_DEBUG, NULL, NULL, "Condition "	\
72011048SDavid.Hollister@Sun.COM 		    "failed at %s():%d", __func__, __LINE__);		\
72110696SDavid.Hollister@Sun.COM 	}								\
72210696SDavid.Hollister@Sun.COM 	pmcs_wr_iqpi(hwp, qnum, hwp->shadow_iqpi[qnum]);		\
72310696SDavid.Hollister@Sun.COM 	mutex_exit(&(hwp)->iqp_lock[qnum])
72410696SDavid.Hollister@Sun.COM #endif
72510696SDavid.Hollister@Sun.COM 
72610696SDavid.Hollister@Sun.COM 
72710696SDavid.Hollister@Sun.COM /*
72810696SDavid.Hollister@Sun.COM  * NB: sucessfull acquisition of an IO Inbound Queue
72910696SDavid.Hollister@Sun.COM  * entry leaves the lock on that Inbound Queue held.
73010696SDavid.Hollister@Sun.COM  */
73110696SDavid.Hollister@Sun.COM #define	GET_IO_IQ_ENTRY(pwp, msg, did, iq)				\
73210696SDavid.Hollister@Sun.COM 	iq = did & PMCS_IO_IQ_MASK;					\
73310696SDavid.Hollister@Sun.COM 	mutex_enter(&(pwp)->iqp_lock[iq]);				\
73410696SDavid.Hollister@Sun.COM 	msg = GET_IQ_ENTRY(pwp, iq);					\
73510696SDavid.Hollister@Sun.COM 	if (msg == NULL) {						\
73610696SDavid.Hollister@Sun.COM 		mutex_exit(&(pwp)->iqp_lock[iq]);			\
73710696SDavid.Hollister@Sun.COM 		for (iq = 0; iq <= PMCS_NON_HIPRI_QUEUES; iq++) {	\
73810696SDavid.Hollister@Sun.COM 			mutex_enter(&(pwp)->iqp_lock[iq]);		\
73910696SDavid.Hollister@Sun.COM 			msg = GET_IQ_ENTRY(pwp, iq);			\
74010696SDavid.Hollister@Sun.COM 			if (msg) {					\
74110696SDavid.Hollister@Sun.COM 				break;					\
74210696SDavid.Hollister@Sun.COM 			}						\
74310696SDavid.Hollister@Sun.COM 			mutex_exit(&(pwp->iqp_lock[iq]));		\
74410696SDavid.Hollister@Sun.COM 		}							\
74510696SDavid.Hollister@Sun.COM 	}
74610696SDavid.Hollister@Sun.COM 
74710696SDavid.Hollister@Sun.COM /*
74810696SDavid.Hollister@Sun.COM  * Outbound Queue Macros
74910696SDavid.Hollister@Sun.COM  *
75010696SDavid.Hollister@Sun.COM  * Outbound Queue Consumer indices live inside the card.
75110696SDavid.Hollister@Sun.COM  *
75210696SDavid.Hollister@Sun.COM  * Outbound Queue Producer indices live in host memory. When the card
75310696SDavid.Hollister@Sun.COM  * wants to send an IOMB, it uses the producer index to find the spot
75410696SDavid.Hollister@Sun.COM  * to write the IOMB. After it's done it updates the producer index
75510696SDavid.Hollister@Sun.COM  * and interrupts the host. The host reads the producer index (from
75610696SDavid.Hollister@Sun.COM  * host memory) and reads IOMBs up to but not including that index.
75710696SDavid.Hollister@Sun.COM  * It writes that index back to the consumer index on the card,
75810696SDavid.Hollister@Sun.COM  * signifying that it has read up to that which the card has sent.
75910696SDavid.Hollister@Sun.COM  */
76010696SDavid.Hollister@Sun.COM #define	GET_OQ_ENTRY(hwp, qn, ix, o) \
76110696SDavid.Hollister@Sun.COM 	&hwp->oqp[qn][QI2O(ix, o, hwp->ioq_depth) >> 2]
76210696SDavid.Hollister@Sun.COM 
76310696SDavid.Hollister@Sun.COM #define	STEP_OQ_ENTRY(hwp, qn, ix, n)	ix = ADDQI(ix, n, hwp->ioq_depth)
76410696SDavid.Hollister@Sun.COM 
76510696SDavid.Hollister@Sun.COM #define	SYNC_OQ_ENTRY(hwp, qn, ci, pi) 		\
76610696SDavid.Hollister@Sun.COM 	pmcs_wr_oqci(hwp, qn, ci);		\
76710696SDavid.Hollister@Sun.COM 	(hwp)->oqci[qn] = ci;			\
76810696SDavid.Hollister@Sun.COM 	(hwp)->oqpi[qn] = pi
76910696SDavid.Hollister@Sun.COM 
77010696SDavid.Hollister@Sun.COM #ifdef	__cplusplus
77110696SDavid.Hollister@Sun.COM }
77210696SDavid.Hollister@Sun.COM #endif
77310696SDavid.Hollister@Sun.COM #endif	/* _PMCS_IOMB_H */
774