xref: /onnv-gate/usr/src/uts/common/sys/scsi/adapters/pmcs/pmcs_def.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
2012060SDavid.Hollister@Sun.COM  */
2112060SDavid.Hollister@Sun.COM /*
2212060SDavid.Hollister@Sun.COM  * Copyright (c) 2009, 2010, Oracle and/or its affiliates. All rights reserved.
2310696SDavid.Hollister@Sun.COM  */
2410696SDavid.Hollister@Sun.COM #ifndef	_PMCS_DEF_H
2510696SDavid.Hollister@Sun.COM #define	_PMCS_DEF_H
2610696SDavid.Hollister@Sun.COM #ifdef	__cplusplus
2710696SDavid.Hollister@Sun.COM extern "C" {
2810696SDavid.Hollister@Sun.COM #endif
2910696SDavid.Hollister@Sun.COM 
3010696SDavid.Hollister@Sun.COM typedef enum {
3110696SDavid.Hollister@Sun.COM 	NOTHING,	/* nothing connected here */
3210696SDavid.Hollister@Sun.COM 	SATA,		/* SATA connection */
3310696SDavid.Hollister@Sun.COM 	SAS,		/* direct or indirect SAS connection */
3410696SDavid.Hollister@Sun.COM 	EXPANDER,	/* connection to an expander */
3510696SDavid.Hollister@Sun.COM 	NEW		/* Brand new device (pending state) */
3610696SDavid.Hollister@Sun.COM } pmcs_dtype_t;
3710696SDavid.Hollister@Sun.COM 
3810696SDavid.Hollister@Sun.COM /*
3910696SDavid.Hollister@Sun.COM  * This structure defines a PHY device that represents what we
4010696SDavid.Hollister@Sun.COM  * are connected to.
4110696SDavid.Hollister@Sun.COM  *
4210696SDavid.Hollister@Sun.COM  * The eight real physical PHYs that are in the PMC8X6G are represented
4310696SDavid.Hollister@Sun.COM  * as an array of eight of these structures which define what these
4410696SDavid.Hollister@Sun.COM  * real PHYs are connected to.
4510696SDavid.Hollister@Sun.COM  *
4610696SDavid.Hollister@Sun.COM  * Depending upon what is actually connected to each PHY, the
4710696SDavid.Hollister@Sun.COM  * type set will define what we're connected to. If it is
4810696SDavid.Hollister@Sun.COM  * a direct SATA connection, the phy will describe a SATA endpoint
4910696SDavid.Hollister@Sun.COM  * If it is a direct SAS connection, it will describe a SAS
5010696SDavid.Hollister@Sun.COM  * endpoint.
5110696SDavid.Hollister@Sun.COM  *
5210696SDavid.Hollister@Sun.COM  * If it is an EXPANDER, this will describe the edge of an expander.
5310696SDavid.Hollister@Sun.COM  * As we perform discovery on what is in an EXPANDER we define an
5410696SDavid.Hollister@Sun.COM  * additional list of phys that represent what the Expander is connected to.
5510696SDavid.Hollister@Sun.COM  */
5610696SDavid.Hollister@Sun.COM #define	PMCS_HW_MIN_LINK_RATE	SAS_LINK_RATE_1_5GBIT
5710696SDavid.Hollister@Sun.COM #define	PMCS_HW_MAX_LINK_RATE	SAS_LINK_RATE_6GBIT
5810696SDavid.Hollister@Sun.COM 
5911347SRamana.Srikanth@Sun.COM #define	PMCS_INVALID_DEVICE_ID		0xffffffff
60*12791Sdavid.hollister@oracle.com #define	PMCS_DEVICE_ID_MASK		0xffff
6111347SRamana.Srikanth@Sun.COM #define	PMCS_PHY_INVALID_PORT_ID	0xf
6210696SDavid.Hollister@Sun.COM 
6311307SDavid.Hollister@Sun.COM #define	PMCS_PM_MAX_NAMELEN	16
6411601SDavid.Hollister@Sun.COM #define	PMCS_MAX_REENUMERATE	2	/* Maximum re-enumeration attempts */
6511601SDavid.Hollister@Sun.COM 
6611601SDavid.Hollister@Sun.COM /*
6711601SDavid.Hollister@Sun.COM  * Number of usecs to wait after last noted activate/deactivate callback
6811601SDavid.Hollister@Sun.COM  * before possibly restarting discovery
6911601SDavid.Hollister@Sun.COM  */
7011601SDavid.Hollister@Sun.COM #define	PMCS_REDISCOVERY_DELAY	(5 * MICROSEC)
7111307SDavid.Hollister@Sun.COM 
7210696SDavid.Hollister@Sun.COM struct pmcs_phy {
7310696SDavid.Hollister@Sun.COM 	pmcs_phy_t	*sibling;	/* sibling phy */
7410696SDavid.Hollister@Sun.COM 	pmcs_phy_t 	*parent;	/* parent phy */
7510696SDavid.Hollister@Sun.COM 	pmcs_phy_t 	*children;	/* head of list of children */
7610696SDavid.Hollister@Sun.COM 	pmcs_phy_t 	*dead_next;	/* dead PHY list link */
7710696SDavid.Hollister@Sun.COM 	list_node_t	list_node;	/* list element */
7810696SDavid.Hollister@Sun.COM 	uint32_t	device_id;	/* PMC8X6G device handle */
7910696SDavid.Hollister@Sun.COM 	uint32_t
8010696SDavid.Hollister@Sun.COM 		ncphy 		: 8,	/* # of contained phys for expander */
8110696SDavid.Hollister@Sun.COM 		hw_event_ack	: 24;	/* XXX: first level phy event acked */
8210696SDavid.Hollister@Sun.COM 	uint8_t		phynum;		/* phy number on parent expander */
8310696SDavid.Hollister@Sun.COM 	uint8_t		width;		/* how many phys wide */
8410696SDavid.Hollister@Sun.COM 	uint8_t		ds_recovery_retries; /* # error retry attempts */
8511087SRamana.Srikanth@Sun.COM 	uint8_t		ds_prev_good_recoveries; /* # successful recoveries */
8611087SRamana.Srikanth@Sun.COM 	clock_t		prev_recovery;	/* previous successful recovery */
8711087SRamana.Srikanth@Sun.COM 	clock_t		last_good_recovery; /* oldest successful recovery */
8811087SRamana.Srikanth@Sun.COM 			/* within PMCS_MAX_DS_RECOVERY_TIME time frame */
8910696SDavid.Hollister@Sun.COM 	pmcs_dtype_t	dtype;		/* current dtype of the phy */
9010696SDavid.Hollister@Sun.COM 	pmcs_dtype_t	pend_dtype;	/* new dtype (pending change) */
9110696SDavid.Hollister@Sun.COM 	uint32_t
9210696SDavid.Hollister@Sun.COM 		level		: 8,	/* level in expander tree */
9310696SDavid.Hollister@Sun.COM 		tolerates_sas2	: 1,	/* tolerates SAS2 SMP */
9410696SDavid.Hollister@Sun.COM 		spinup_hold	: 1,	/* spinup hold needs releasing */
9510696SDavid.Hollister@Sun.COM 		atdt		: 3,	/* attached device type */
9610696SDavid.Hollister@Sun.COM 		portid		: 4,	/* PMC8X6G port context */
9710696SDavid.Hollister@Sun.COM 		link_rate   	: 4,	/* current supported speeds */
9810696SDavid.Hollister@Sun.COM 		valid_device_id	: 1,	/* device id is valid */
9910696SDavid.Hollister@Sun.COM 		abort_sent	: 1,	/* we've sent an abort */
10010696SDavid.Hollister@Sun.COM 		abort_pending	: 1,	/* we have an abort pending */
10110696SDavid.Hollister@Sun.COM 		need_rl_ext	: 1,	/* need SATA RL_EXT recocvery */
10210696SDavid.Hollister@Sun.COM 		subsidiary	: 1,	/* this is part of a wide phy */
10310696SDavid.Hollister@Sun.COM 		configured	: 1,	/* is configured */
10410696SDavid.Hollister@Sun.COM 		dead		: 1,	/* dead */
10511347SRamana.Srikanth@Sun.COM 		changed		: 1,	/* this phy is changing */
10611601SDavid.Hollister@Sun.COM 		reenumerate	: 1,	/* attempt re-enumeration */
10712443Sdavid.hollister@oracle.com 		virtual		: 1,	/* This is a virtual PHY */
10811347SRamana.Srikanth@Sun.COM 		deregister_wait : 1;	/* phy waiting to get deregistered */
10910696SDavid.Hollister@Sun.COM 	clock_t		config_stop;	/* When config attempts will stop */
11010696SDavid.Hollister@Sun.COM 	hrtime_t	abort_all_start;
11110696SDavid.Hollister@Sun.COM 	kcondvar_t	abort_all_cv;	/* Wait for ABORT_ALL completion */
11210696SDavid.Hollister@Sun.COM 	kmutex_t	phy_lock;
11310696SDavid.Hollister@Sun.COM 	volatile uint32_t ref_count;	/* Targets & work on this PHY */
11411601SDavid.Hollister@Sun.COM 	uint32_t	enum_attempts;	/* # of enumeration attempts */
11510696SDavid.Hollister@Sun.COM 	uint8_t 	sas_address[8];	/* SAS address for this PHY */
11610696SDavid.Hollister@Sun.COM 	struct {
11710696SDavid.Hollister@Sun.COM 	uint32_t
11810696SDavid.Hollister@Sun.COM 		prog_min_rate	:4,
11910696SDavid.Hollister@Sun.COM 		hw_min_rate	:4,
12010696SDavid.Hollister@Sun.COM 		prog_max_rate	:4,
12110696SDavid.Hollister@Sun.COM 		hw_max_rate	:4,
12210696SDavid.Hollister@Sun.COM 		reserved	:16;
12310696SDavid.Hollister@Sun.COM 	} state;
12410696SDavid.Hollister@Sun.COM 	char		path[32];	/* path name for this phy */
12510696SDavid.Hollister@Sun.COM 	pmcs_hw_t	*pwp;		/* back ptr to hba struct */
12610696SDavid.Hollister@Sun.COM 	pmcs_iport_t	*iport;		/* back ptr to the iport handle */
12711501SDavid.Hollister@Sun.COM 	pmcs_iport_t	*last_iport;	/* last iport this PHY was on */
12810696SDavid.Hollister@Sun.COM 	pmcs_xscsi_t	*target;	/* back ptr to current target */
12912668Ssrikanth.suravajhala@oracle.com 	pmcs_xscsi_t	**target_addr;	/* address of real target pointer */
13010696SDavid.Hollister@Sun.COM 	kstat_t		*phy_stats;	/* kstats for this phy */
13111307SDavid.Hollister@Sun.COM 	/*
13211307SDavid.Hollister@Sun.COM 	 * Attached port phy mask and target port phymask.  With 16 bytes
13311307SDavid.Hollister@Sun.COM 	 * we can represent a phymask for anything with up to 64 ports
13411307SDavid.Hollister@Sun.COM 	 */
13511307SDavid.Hollister@Sun.COM 	uint64_t	att_port_pm;		/* att port pm for this PHY */
13611307SDavid.Hollister@Sun.COM 	uint64_t	att_port_pm_tmp;	/* Temp area for wide-ports */
13711307SDavid.Hollister@Sun.COM 	char		att_port_pm_str[PMCS_PM_MAX_NAMELEN + 1];
13811307SDavid.Hollister@Sun.COM 	uint64_t	tgt_port_pm;		/* tgt port pm for this PHY */
13911307SDavid.Hollister@Sun.COM 	uint64_t	tgt_port_pm_tmp;	/* Temp area for wide-ports */
14011307SDavid.Hollister@Sun.COM 	char		tgt_port_pm_str[PMCS_PM_MAX_NAMELEN + 1];
14111601SDavid.Hollister@Sun.COM 	smp_routing_attr_t routing_attr; /* Routing attr. from discover resp. */
14211601SDavid.Hollister@Sun.COM 	smp_routing_attr_t routing_method; /* Actual routing method used. */
14311601SDavid.Hollister@Sun.COM 	smp_report_general_resp_t rg_resp;	/* Response to REPORT_GENERAL */
14411601SDavid.Hollister@Sun.COM 	smp_discover_resp_t disc_resp;		/* Response to DISCOVER */
14510696SDavid.Hollister@Sun.COM };
14610696SDavid.Hollister@Sun.COM 
14710696SDavid.Hollister@Sun.COM /* maximum number of ds recovery retries (ds_recovery_retries) */
14811347SRamana.Srikanth@Sun.COM #define	PMCS_MAX_DS_RECOVERY_RETRIES	10
14910696SDavid.Hollister@Sun.COM 
15011087SRamana.Srikanth@Sun.COM /* max time allowed for successful recovery */
15111087SRamana.Srikanth@Sun.COM #define	PMCS_MAX_DS_RECOVERY_TIME	(60 * 1000000) /* 60 seconds */
15211087SRamana.Srikanth@Sun.COM 
15311087SRamana.Srikanth@Sun.COM /* ds recovery on same same phy is not allowed within this interval */
15411087SRamana.Srikanth@Sun.COM #define	PMCS_DS_RECOVERY_INTERVAL	(1000000) /* 1 second */
15511087SRamana.Srikanth@Sun.COM 
15610696SDavid.Hollister@Sun.COM 
15710696SDavid.Hollister@Sun.COM /*
15810696SDavid.Hollister@Sun.COM  * Inbound and Outbound Queue Related Definitions.
15910696SDavid.Hollister@Sun.COM  *
16010696SDavid.Hollister@Sun.COM  * The PMC8X6G has a programmable number of inbound and outbound circular
16110696SDavid.Hollister@Sun.COM  * queues for use in message passing between the host and the PMC8X6G
16210696SDavid.Hollister@Sun.COM  * (up to 64 queues for the Rev C Chip). This driver does not use all
16310696SDavid.Hollister@Sun.COM  * possible queues.
16410696SDavid.Hollister@Sun.COM  *
16510696SDavid.Hollister@Sun.COM  * Each Queue is given 4K of consistent memory and we set a 64 byte size for
16610696SDavid.Hollister@Sun.COM  * the queue entry size (this gives us 256 queue entries per queue).
16710696SDavid.Hollister@Sun.COM  *
16810696SDavid.Hollister@Sun.COM  * This allocation then continues up a further PMCS_SCRATCH_SIZE bytes
16910696SDavid.Hollister@Sun.COM  * that the driver uses as a temporary scratch area for things like
17010696SDavid.Hollister@Sun.COM  * SMP discovery.
17110696SDavid.Hollister@Sun.COM  *
17210696SDavid.Hollister@Sun.COM  * This control area looks like this:
17310696SDavid.Hollister@Sun.COM  *
17410696SDavid.Hollister@Sun.COM  * Offset			What
17510696SDavid.Hollister@Sun.COM  * ------------------------------------------------
17610696SDavid.Hollister@Sun.COM  * 0					IQ 0 Consumer Index
17710696SDavid.Hollister@Sun.COM  * 4					IQ 1 Consumer Index
17810696SDavid.Hollister@Sun.COM  * 8..255				...
17910696SDavid.Hollister@Sun.COM  * 252..255				IQ 63 Consumer Index
18010696SDavid.Hollister@Sun.COM  * 256					OQ 0 Producer Index
18110696SDavid.Hollister@Sun.COM  * 260					OQ 1 Producer Index
18210696SDavid.Hollister@Sun.COM  * 264..259				....
18310696SDavid.Hollister@Sun.COM  * 508..511				OQ 63 Producer Index
18410696SDavid.Hollister@Sun.COM  * 512..512+PMCS_SCRATCH_SIZE-1		Scratch area.
18510696SDavid.Hollister@Sun.COM  */
18610696SDavid.Hollister@Sun.COM #define	IQCI_BASE_OFFSET	0
18710696SDavid.Hollister@Sun.COM #define	IQ_OFFSET(qnum)		(IQCI_BASE_OFFSET + (qnum << 2))
18810696SDavid.Hollister@Sun.COM #define	OQPI_BASE_OFFSET	256
18910696SDavid.Hollister@Sun.COM #define	OQ_OFFSET(qnum)		(OQPI_BASE_OFFSET + (qnum << 2))
19010696SDavid.Hollister@Sun.COM 
19110696SDavid.Hollister@Sun.COM /*
19210696SDavid.Hollister@Sun.COM  * Work related structures. Each one of these structures is paired
19310696SDavid.Hollister@Sun.COM  * with *any* command that is fed to the PMC8X6G via one of the
19410696SDavid.Hollister@Sun.COM  * Inbound Queues. The work structure has a tag to compare with
19510696SDavid.Hollister@Sun.COM  * the message that comes back out of an Outbound Queue. The
19610696SDavid.Hollister@Sun.COM  * work structure also points to the phy which this command is
19710696SDavid.Hollister@Sun.COM  * tied to. It also has a pointer a callback function (if defined).
19810696SDavid.Hollister@Sun.COM  * See that TAG Architecture below for the various kinds of
19910696SDavid.Hollister@Sun.COM  * dispositions of a work structure.
20010696SDavid.Hollister@Sun.COM  */
20110696SDavid.Hollister@Sun.COM 
20210696SDavid.Hollister@Sun.COM /*
20310696SDavid.Hollister@Sun.COM  * Work Structure States
20410696SDavid.Hollister@Sun.COM  *
20510696SDavid.Hollister@Sun.COM  * NIL			->	READY
20610696SDavid.Hollister@Sun.COM  * READY		->	NIL
20710696SDavid.Hollister@Sun.COM  * READY		->	ONCHIP
20810696SDavid.Hollister@Sun.COM  * ONCHIP		->	INTR
20910696SDavid.Hollister@Sun.COM  * INTR			->	READY
21010696SDavid.Hollister@Sun.COM  * INTR			->	NIL
21110696SDavid.Hollister@Sun.COM  * INTR			->	ABORTED
21210696SDavid.Hollister@Sun.COM  * INTR			->	TIMED_OUT
21310696SDavid.Hollister@Sun.COM  * ABORTED		->	NIL
21410696SDavid.Hollister@Sun.COM  * TIMED_OUT		->	NIL
21510696SDavid.Hollister@Sun.COM  */
21610696SDavid.Hollister@Sun.COM typedef enum {
21710696SDavid.Hollister@Sun.COM 	PMCS_WORK_STATE_NIL = 0,
21810696SDavid.Hollister@Sun.COM 	PMCS_WORK_STATE_READY,
21910696SDavid.Hollister@Sun.COM 	PMCS_WORK_STATE_ONCHIP,
22010696SDavid.Hollister@Sun.COM 	PMCS_WORK_STATE_INTR,
22110696SDavid.Hollister@Sun.COM 	PMCS_WORK_STATE_IOCOMPQ,
22210696SDavid.Hollister@Sun.COM 	PMCS_WORK_STATE_ABORTED,
22310696SDavid.Hollister@Sun.COM 	PMCS_WORK_STATE_TIMED_OUT
22410696SDavid.Hollister@Sun.COM } pmcs_work_state_t;
22510696SDavid.Hollister@Sun.COM 
22610696SDavid.Hollister@Sun.COM struct pmcwork {
22710696SDavid.Hollister@Sun.COM 	STAILQ_ENTRY(pmcwork)	next;
22810696SDavid.Hollister@Sun.COM 	kmutex_t		lock;
22910696SDavid.Hollister@Sun.COM 	kcondvar_t		sleep_cv;
23010696SDavid.Hollister@Sun.COM 	void			*ptr;	/* linkage or callback function */
23110696SDavid.Hollister@Sun.COM 	void 			*arg;	/* command specific data */
23210696SDavid.Hollister@Sun.COM 	pmcs_phy_t 		*phy;	/* phy who owns this command */
23310696SDavid.Hollister@Sun.COM 	pmcs_xscsi_t		*xp;	/* Back pointer to xscsi struct */
23410696SDavid.Hollister@Sun.COM 	volatile uint32_t	htag;	/* tag for this structure */
23511048SDavid.Hollister@Sun.COM 	uint32_t		abt_htag; /* Tag of command to be aborted */
23610696SDavid.Hollister@Sun.COM 	uint32_t
23710696SDavid.Hollister@Sun.COM 			timer	:	27,
23810696SDavid.Hollister@Sun.COM 			onwire	:	1,
23910696SDavid.Hollister@Sun.COM 			dead	:	1,
24010696SDavid.Hollister@Sun.COM 			state	:	3;
24110696SDavid.Hollister@Sun.COM 	hrtime_t		start;	/* timestamp start */
24210696SDavid.Hollister@Sun.COM 	uint32_t		ssp_event; /* ssp event */
24310696SDavid.Hollister@Sun.COM 	pmcs_dtype_t		dtype;	/* stash, incase phy gets cleared */
24410696SDavid.Hollister@Sun.COM 
24510696SDavid.Hollister@Sun.COM 	void			*last_ptr;
24610696SDavid.Hollister@Sun.COM 	void			*last_arg;
24710696SDavid.Hollister@Sun.COM 	pmcs_phy_t		*last_phy;
24810696SDavid.Hollister@Sun.COM 	pmcs_xscsi_t		*last_xp;
24910696SDavid.Hollister@Sun.COM 	uint32_t		last_htag;
25010696SDavid.Hollister@Sun.COM 	pmcs_work_state_t	last_state;
25110696SDavid.Hollister@Sun.COM 	hrtime_t		finish;
25210696SDavid.Hollister@Sun.COM };
25312506Sjesse.butler@oracle.com #define	PMCS_ABT_HTAG_ALL	0xffffffff
25410696SDavid.Hollister@Sun.COM 
25510696SDavid.Hollister@Sun.COM #define	PMCS_REC_EVENT	0xffffffff	/* event recovery */
25610696SDavid.Hollister@Sun.COM 
25710696SDavid.Hollister@Sun.COM /*
25810696SDavid.Hollister@Sun.COM  * This structure defines a PMC-Sierra defined firmware header.
25910696SDavid.Hollister@Sun.COM  */
26010696SDavid.Hollister@Sun.COM #pragma	pack(4)
26110696SDavid.Hollister@Sun.COM typedef struct {
26210696SDavid.Hollister@Sun.COM 	char 		vendor_id[8];
26310696SDavid.Hollister@Sun.COM 	uint8_t		product_id;
26410696SDavid.Hollister@Sun.COM 	uint8_t		hwrev;
26510696SDavid.Hollister@Sun.COM 	uint8_t		destination_partition;
26610696SDavid.Hollister@Sun.COM 	uint8_t		reserved0;
26710696SDavid.Hollister@Sun.COM 	uint8_t		fwrev[4];
26810696SDavid.Hollister@Sun.COM 	uint32_t	firmware_length;
26910696SDavid.Hollister@Sun.COM 	uint32_t	crc;
27010696SDavid.Hollister@Sun.COM 	uint32_t	start_address;
27110696SDavid.Hollister@Sun.COM 	uint8_t		data[];
27210696SDavid.Hollister@Sun.COM } pmcs_fw_hdr_t;
27310696SDavid.Hollister@Sun.COM #pragma	pack()
27410696SDavid.Hollister@Sun.COM 
27510696SDavid.Hollister@Sun.COM /*
27610696SDavid.Hollister@Sun.COM  * Offlevel work as a bit pattern.
27710696SDavid.Hollister@Sun.COM  */
27810696SDavid.Hollister@Sun.COM #define	PMCS_WORK_DISCOVER		0
27910696SDavid.Hollister@Sun.COM #define	PMCS_WORK_ABORT_HANDLE		3
28010696SDavid.Hollister@Sun.COM #define	PMCS_WORK_SPINUP_RELEASE	4
28110696SDavid.Hollister@Sun.COM #define	PMCS_WORK_SAS_HW_ACK		5
28210696SDavid.Hollister@Sun.COM #define	PMCS_WORK_SATA_RUN		6
28310696SDavid.Hollister@Sun.COM #define	PMCS_WORK_RUN_QUEUES		7
28410696SDavid.Hollister@Sun.COM #define	PMCS_WORK_ADD_DMA_CHUNKS	8
28510696SDavid.Hollister@Sun.COM #define	PMCS_WORK_DS_ERR_RECOVERY	9
28610696SDavid.Hollister@Sun.COM #define	PMCS_WORK_SSP_EVT_RECOVERY	10
28711347SRamana.Srikanth@Sun.COM #define	PMCS_WORK_DEREGISTER_DEV	11
28811847SDavid.Hollister@Sun.COM #define	PMCS_WORK_DUMP_REGS		12
28910696SDavid.Hollister@Sun.COM 
29010696SDavid.Hollister@Sun.COM /*
29110696SDavid.Hollister@Sun.COM  * The actual values as they appear in work_flags
29210696SDavid.Hollister@Sun.COM  */
29310696SDavid.Hollister@Sun.COM #define	PMCS_WORK_FLAG_DISCOVER		(1 << 0)
29410696SDavid.Hollister@Sun.COM #define	PMCS_WORK_FLAG_ABORT_HANDLE	(1 << 3)
29510696SDavid.Hollister@Sun.COM #define	PMCS_WORK_FLAG_SPINUP_RELEASE	(1 << 4)
29610696SDavid.Hollister@Sun.COM #define	PMCS_WORK_FLAG_SAS_HW_ACK	(1 << 5)
29710696SDavid.Hollister@Sun.COM #define	PMCS_WORK_FLAG_SATA_RUN		(1 << 6)
29810696SDavid.Hollister@Sun.COM #define	PMCS_WORK_FLAG_RUN_QUEUES	(1 << 7)
29910696SDavid.Hollister@Sun.COM #define	PMCS_WORK_FLAG_ADD_DMA_CHUNKS	(1 << 8)
30010696SDavid.Hollister@Sun.COM #define	PMCS_WORK_FLAG_DS_ERR_RECOVERY	(1 << 9)
30110696SDavid.Hollister@Sun.COM #define	PMCS_WORK_FLAG_SSP_EVT_RECOVERY (1 << 10)
30211347SRamana.Srikanth@Sun.COM #define	PMCS_WORK_FLAG_DEREGISTER_DEV   (1 << 11)
30311847SDavid.Hollister@Sun.COM #define	PMCS_WORK_FLAG_DUMP_REGS	(1 << 12)
30410696SDavid.Hollister@Sun.COM 
30510696SDavid.Hollister@Sun.COM /*
30610696SDavid.Hollister@Sun.COM  * This structure is used by this function to test MPI (and interrupts)
30710696SDavid.Hollister@Sun.COM  * after MPI has been started to make sure it's working reliably.
30810696SDavid.Hollister@Sun.COM  */
30910696SDavid.Hollister@Sun.COM typedef struct {
31010696SDavid.Hollister@Sun.COM 	uint32_t signature;
31110696SDavid.Hollister@Sun.COM 	uint32_t count;
31210696SDavid.Hollister@Sun.COM 	uint32_t *ptr;
31310696SDavid.Hollister@Sun.COM } echo_test_t;
31410696SDavid.Hollister@Sun.COM #define	ECHO_SIGNATURE	0xbebebeef
31510696SDavid.Hollister@Sun.COM 
31610696SDavid.Hollister@Sun.COM /*
31710696SDavid.Hollister@Sun.COM  * Tag Architecture. The PMC has 32 bit tags for MPI messages.
31810696SDavid.Hollister@Sun.COM  * We use this tag this way.
31910696SDavid.Hollister@Sun.COM  *
32010696SDavid.Hollister@Sun.COM  * bits		what
32110696SDavid.Hollister@Sun.COM  * ------------------------
32210696SDavid.Hollister@Sun.COM  * 31		done bit
32312258Ssrikanth.suravajhala@oracle.com  * 30		non-io cmd bit
32412258Ssrikanth.suravajhala@oracle.com  * 29..28	tag type
32510696SDavid.Hollister@Sun.COM  * 27..12	rolling serial number
32610696SDavid.Hollister@Sun.COM  * 11..0	index into work area to get pmcwork structure
32710696SDavid.Hollister@Sun.COM  *
32810696SDavid.Hollister@Sun.COM  * A tag type of NONE means that nobody is waiting on any results,
32910696SDavid.Hollister@Sun.COM  * so the interrupt code frees the work structure that has this
33010696SDavid.Hollister@Sun.COM  * tag.
33110696SDavid.Hollister@Sun.COM  *
33210696SDavid.Hollister@Sun.COM  * A tag type of CBACK means that the the interrupt handler
33310696SDavid.Hollister@Sun.COM  * takes the tag 'arg' in the work structure to be a callback
33410696SDavid.Hollister@Sun.COM  * function pointer (see pmcs_cb_t). The callee is responsible
33510696SDavid.Hollister@Sun.COM  * for freeing the work structure that has this tag.
33610696SDavid.Hollister@Sun.COM  *
33710696SDavid.Hollister@Sun.COM  * A tag type of WAIT means that the issuer of the work needs
33810696SDavid.Hollister@Sun.COM  * be woken up from interrupt level when the command completes
33910696SDavid.Hollister@Sun.COM  * (or times out). If work structure tag 'arg' is non-null,
34010696SDavid.Hollister@Sun.COM  * up to 2*PMCS_QENTRY_SIZE bits of data from the Outbound Queue
34110696SDavid.Hollister@Sun.COM  * entry may be copied to the area pointed to by 'arg'. This
34210696SDavid.Hollister@Sun.COM  * allows issuers to get directly at the results of the command
34310696SDavid.Hollister@Sun.COM  * they issed. The synchronization point for the issuer and the
34410696SDavid.Hollister@Sun.COM  * interrupt code for command done notification is the setting
34510696SDavid.Hollister@Sun.COM  * of the 'DONE' bit in the tag as stored in the work structure.
34610696SDavid.Hollister@Sun.COM  */
34710696SDavid.Hollister@Sun.COM #define	PMCS_TAG_TYPE_FREE	0
34810696SDavid.Hollister@Sun.COM #define	PMCS_TAG_TYPE_NONE	1
34910696SDavid.Hollister@Sun.COM #define	PMCS_TAG_TYPE_CBACK  	2
35010696SDavid.Hollister@Sun.COM #define	PMCS_TAG_TYPE_WAIT	3
35110696SDavid.Hollister@Sun.COM #define	PMCS_TAG_TYPE_SHIFT	28
35210696SDavid.Hollister@Sun.COM #define	PMCS_TAG_SERNO_SHIFT	12
35310696SDavid.Hollister@Sun.COM #define	PMCS_TAG_INDEX_SHIFT	0
35412258Ssrikanth.suravajhala@oracle.com #define	PMCS_TAG_TYPE_MASK	0x30000000
35512258Ssrikanth.suravajhala@oracle.com #define	PMCS_TAG_NONIO_CMD	0x40000000
35610696SDavid.Hollister@Sun.COM #define	PMCS_TAG_DONE		0x80000000
35710696SDavid.Hollister@Sun.COM #define	PMCS_TAG_SERNO_MASK	0x0ffff000
35810696SDavid.Hollister@Sun.COM #define	PMCS_TAG_INDEX_MASK	0x00000fff
35910696SDavid.Hollister@Sun.COM #define	PMCS_TAG_TYPE(x)		\
36010696SDavid.Hollister@Sun.COM 	(((x) & PMCS_TAG_TYPE_MASK) >> PMCS_TAG_TYPE_SHIFT)
36110696SDavid.Hollister@Sun.COM #define	PMCS_TAG_SERNO(x)	\
36210696SDavid.Hollister@Sun.COM 	(((x) & PMCS_TAG_SERNO_MASK) >> PMCS_TAG_SERNO_SHIFT)
36310696SDavid.Hollister@Sun.COM #define	PMCS_TAG_INDEX(x)	\
36410696SDavid.Hollister@Sun.COM 	(((x) & PMCS_TAG_INDEX_MASK) >> PMCS_TAG_INDEX_SHIFT)
36510696SDavid.Hollister@Sun.COM #define	PMCS_TAG_FREE		0
36610696SDavid.Hollister@Sun.COM #define	PMCS_COMMAND_DONE(x)	\
36710696SDavid.Hollister@Sun.COM 	(((x)->htag == PMCS_TAG_FREE) || (((x)->htag & PMCS_TAG_DONE) != 0))
36810696SDavid.Hollister@Sun.COM #define	PMCS_COMMAND_ACTIVE(x)	\
36910696SDavid.Hollister@Sun.COM 	((x)->htag != PMCS_TAG_FREE && (x)->state == PMCS_WORK_STATE_ONCHIP)
37010696SDavid.Hollister@Sun.COM 
37110696SDavid.Hollister@Sun.COM /*
37210696SDavid.Hollister@Sun.COM  * Miscellaneous Definitions
37310696SDavid.Hollister@Sun.COM  */
37410696SDavid.Hollister@Sun.COM #define	CLEAN_MESSAGE(m, x)	{	\
37510696SDavid.Hollister@Sun.COM 	int _j = x;			\
37610696SDavid.Hollister@Sun.COM 	while (_j < PMCS_MSG_SIZE) {	\
37710696SDavid.Hollister@Sun.COM 		m[_j++] = 0;		\
37810696SDavid.Hollister@Sun.COM 	}				\
37910696SDavid.Hollister@Sun.COM }
38010696SDavid.Hollister@Sun.COM 
38110696SDavid.Hollister@Sun.COM #define	COPY_MESSAGE(t, f, a)	{	\
38210696SDavid.Hollister@Sun.COM 	int _j;				\
38310696SDavid.Hollister@Sun.COM 	for (_j = 0; _j < a; _j++) {	\
38410696SDavid.Hollister@Sun.COM 		t[_j] = f[_j];		\
38510696SDavid.Hollister@Sun.COM 	}				\
38610696SDavid.Hollister@Sun.COM 	while (_j < PMCS_MSG_SIZE) {	\
38710696SDavid.Hollister@Sun.COM 		t[_j++] = 0;		\
38810696SDavid.Hollister@Sun.COM 	}				\
38910696SDavid.Hollister@Sun.COM }
39010696SDavid.Hollister@Sun.COM 
39110696SDavid.Hollister@Sun.COM #define	PMCS_PHY_ADDRESSABLE(pp)			\
39210696SDavid.Hollister@Sun.COM 	((pp)->level == 0 && (pp)->dtype == SATA &&	\
39310696SDavid.Hollister@Sun.COM 	    ((pp)->sas_address[0] >> 4) != 5)
39410696SDavid.Hollister@Sun.COM 
39510696SDavid.Hollister@Sun.COM #define	RESTART_DISCOVERY(pwp)				\
39610696SDavid.Hollister@Sun.COM 	ASSERT(!mutex_owned(&pwp->config_lock));	\
39710696SDavid.Hollister@Sun.COM 	mutex_enter(&pwp->config_lock);			\
39810696SDavid.Hollister@Sun.COM 	pwp->config_changed = B_TRUE;			\
39910696SDavid.Hollister@Sun.COM 	mutex_exit(&pwp->config_lock);			\
40010696SDavid.Hollister@Sun.COM 	SCHEDULE_WORK(pwp, PMCS_WORK_DISCOVER);
40110696SDavid.Hollister@Sun.COM 
40210696SDavid.Hollister@Sun.COM #define	RESTART_DISCOVERY_LOCKED(pwp)			\
40310696SDavid.Hollister@Sun.COM 	ASSERT(mutex_owned(&pwp->config_lock));		\
40410696SDavid.Hollister@Sun.COM 	pwp->config_changed = B_TRUE;			\
40510696SDavid.Hollister@Sun.COM 	SCHEDULE_WORK(pwp, PMCS_WORK_DISCOVER);
40610696SDavid.Hollister@Sun.COM 
40710696SDavid.Hollister@Sun.COM #define	PHY_CHANGED(pwp, p)						\
40811048SDavid.Hollister@Sun.COM 	pmcs_prt(pwp, PMCS_PRT_DEBUG_CONFIG, p, NULL, "%s changed in "  \
40911048SDavid.Hollister@Sun.COM 	    "%s line %d", p->path, __func__, __LINE__); 		\
41011601SDavid.Hollister@Sun.COM 	p->changed = 1;							\
41111601SDavid.Hollister@Sun.COM 	p->enum_attempts = 0
41210696SDavid.Hollister@Sun.COM 
41310696SDavid.Hollister@Sun.COM #define	PHY_CHANGED_AT_LOCATION(pwp, p, func, line)			\
41411048SDavid.Hollister@Sun.COM 	pmcs_prt(pwp, PMCS_PRT_DEBUG_CONFIG, p, NULL, "%s changed in "  \
41511048SDavid.Hollister@Sun.COM 	    "%s line %d", p->path, func, line);				\
41611601SDavid.Hollister@Sun.COM 	p->changed = 1;							\
41711601SDavid.Hollister@Sun.COM 	p->enum_attempts = 0
41810696SDavid.Hollister@Sun.COM 
41910696SDavid.Hollister@Sun.COM #define	PHY_TYPE(pptr)					\
42010696SDavid.Hollister@Sun.COM 	(((pptr)->dtype == NOTHING)?  "NOTHING" :	\
42110696SDavid.Hollister@Sun.COM 	(((pptr)->dtype == SATA)? "SATA" :		\
42210696SDavid.Hollister@Sun.COM 	(((pptr)->dtype == SAS)? "SAS" : "EXPANDER")))
42310696SDavid.Hollister@Sun.COM 
42410696SDavid.Hollister@Sun.COM #define	IS_ROOT_PHY(pptr)	(pptr->parent == NULL)
42510696SDavid.Hollister@Sun.COM 
42610696SDavid.Hollister@Sun.COM #define	PMCS_HIPRI(pwp, oq, c)				\
42710696SDavid.Hollister@Sun.COM 	(pwp->hipri_queue & (1 << PMCS_IQ_OTHER)) ?	\
42810696SDavid.Hollister@Sun.COM 	(PMCS_IOMB_HIPRI | PMCS_IOMB_IN_SAS(oq, c)) :	\
42910696SDavid.Hollister@Sun.COM 	(PMCS_IOMB_IN_SAS(oq, c))
43010696SDavid.Hollister@Sun.COM 
43110696SDavid.Hollister@Sun.COM #define	SCHEDULE_WORK(hwp, wrk)		\
43210696SDavid.Hollister@Sun.COM 	(void) atomic_set_long_excl(&hwp->work_flags, wrk)
43310696SDavid.Hollister@Sun.COM 
43410696SDavid.Hollister@Sun.COM /*
43510696SDavid.Hollister@Sun.COM  * Check to see if the requested work bit is set.  Either way, the bit will
43610696SDavid.Hollister@Sun.COM  * be cleared upon return.
43710696SDavid.Hollister@Sun.COM  */
43810696SDavid.Hollister@Sun.COM #define	WORK_SCHEDULED(hwp, wrk)	\
43910696SDavid.Hollister@Sun.COM 	(atomic_clear_long_excl(&hwp->work_flags, wrk) == 0)
44010696SDavid.Hollister@Sun.COM 
44110696SDavid.Hollister@Sun.COM /*
44210696SDavid.Hollister@Sun.COM  * Check to see if the requested work bit is set.  The value will not be
44310696SDavid.Hollister@Sun.COM  * changed in this case.  The atomic_xx_nv operations can be quite expensive
44410696SDavid.Hollister@Sun.COM  * so this should not be used in non-DEBUG code.
44510696SDavid.Hollister@Sun.COM  */
44610696SDavid.Hollister@Sun.COM #define	WORK_IS_SCHEDULED(hwp, wrk)	\
44710696SDavid.Hollister@Sun.COM 	((atomic_and_ulong_nv(&hwp->work_flags, (ulong_t)-1) & (1 << wrk)) != 0)
44810696SDavid.Hollister@Sun.COM 
44910696SDavid.Hollister@Sun.COM #define	WAIT_FOR(p, t, r)					\
45012078SJesse.Butler@Sun.COM 	clock_t	_lb = ddi_get_lbolt();				\
45110696SDavid.Hollister@Sun.COM 	r = 0;							\
45210696SDavid.Hollister@Sun.COM 	while (!PMCS_COMMAND_DONE(p)) {				\
45312078SJesse.Butler@Sun.COM 		clock_t _ret = cv_timedwait(&p->sleep_cv,	\
45412078SJesse.Butler@Sun.COM 		    &p->lock, _lb + drv_usectohz(t * 1000));	\
45512078SJesse.Butler@Sun.COM 		if (!PMCS_COMMAND_DONE(p) && _ret < 0) {		\
45610696SDavid.Hollister@Sun.COM 			r = 1;					\
45710696SDavid.Hollister@Sun.COM 			break;					\
45810696SDavid.Hollister@Sun.COM 		}						\
45910696SDavid.Hollister@Sun.COM 	}
46010696SDavid.Hollister@Sun.COM 
46110696SDavid.Hollister@Sun.COM /*
46210696SDavid.Hollister@Sun.COM  * Signal the next I/O completion thread to start running.
46310696SDavid.Hollister@Sun.COM  */
46410696SDavid.Hollister@Sun.COM 
46510696SDavid.Hollister@Sun.COM #define	PMCS_CQ_RUN_LOCKED(hwp)						\
46610696SDavid.Hollister@Sun.COM 	if (!STAILQ_EMPTY(&hwp->cq) || hwp->iocomp_cb_head) {		\
46710696SDavid.Hollister@Sun.COM 		pmcs_cq_thr_info_t *cqti;				\
46810696SDavid.Hollister@Sun.COM 		cqti = &hwp->cq_info.cq_thr_info			\
46910696SDavid.Hollister@Sun.COM 		    [hwp->cq_info.cq_next_disp_thr];			\
47010696SDavid.Hollister@Sun.COM 		hwp->cq_info.cq_next_disp_thr++;			\
47110696SDavid.Hollister@Sun.COM 		if (hwp->cq_info.cq_next_disp_thr ==			\
47210696SDavid.Hollister@Sun.COM 		    hwp->cq_info.cq_threads) {				\
47310696SDavid.Hollister@Sun.COM 			hwp->cq_info.cq_next_disp_thr = 0;		\
47410696SDavid.Hollister@Sun.COM 		}							\
47510696SDavid.Hollister@Sun.COM 		mutex_enter(&cqti->cq_thr_lock);			\
47610696SDavid.Hollister@Sun.COM 		cv_signal(&cqti->cq_cv);				\
47710696SDavid.Hollister@Sun.COM 		mutex_exit(&cqti->cq_thr_lock);				\
47812343Sdavid.hollister@oracle.com 	}
47910696SDavid.Hollister@Sun.COM 
48010696SDavid.Hollister@Sun.COM #define	PMCS_CQ_RUN(hwp)						\
48110696SDavid.Hollister@Sun.COM 	mutex_enter(&hwp->cq_lock);					\
48210696SDavid.Hollister@Sun.COM 	PMCS_CQ_RUN_LOCKED(hwp);					\
48310696SDavid.Hollister@Sun.COM 	mutex_exit(&hwp->cq_lock);
48410696SDavid.Hollister@Sun.COM 
48510696SDavid.Hollister@Sun.COM 
48610696SDavid.Hollister@Sun.COM /*
48710696SDavid.Hollister@Sun.COM  * Watchdog/SCSA timer definitions
48810696SDavid.Hollister@Sun.COM  */
48910696SDavid.Hollister@Sun.COM /* usecs to SCSA watchdog ticks */
49010696SDavid.Hollister@Sun.COM #define	US2WT(x)	(x)/10
49110696SDavid.Hollister@Sun.COM 
49210696SDavid.Hollister@Sun.COM /*
49310696SDavid.Hollister@Sun.COM  * More misc
49410696SDavid.Hollister@Sun.COM  */
49510696SDavid.Hollister@Sun.COM #define	BYTE0(x)	(((x) >>  0) & 0xff)
49610696SDavid.Hollister@Sun.COM #define	BYTE1(x)	(((x) >>  8) & 0xff)
49710696SDavid.Hollister@Sun.COM #define	BYTE2(x)	(((x) >> 16) & 0xff)
49810696SDavid.Hollister@Sun.COM #define	BYTE3(x)	(((x) >> 24) & 0xff)
49910696SDavid.Hollister@Sun.COM #define	BYTE4(x)	(((x) >> 32) & 0xff)
50010696SDavid.Hollister@Sun.COM #define	BYTE5(x)	(((x) >> 40) & 0xff)
50110696SDavid.Hollister@Sun.COM #define	BYTE6(x)	(((x) >> 48) & 0xff)
50210696SDavid.Hollister@Sun.COM #define	BYTE7(x)	(((x) >> 56) & 0xff)
50310696SDavid.Hollister@Sun.COM #define	WORD0(x)	(((x) >>  0) & 0xffff)
50410696SDavid.Hollister@Sun.COM #define	WORD1(x)	(((x) >> 16) & 0xffff)
50510696SDavid.Hollister@Sun.COM #define	WORD2(x)	(((x) >> 32) & 0xffff)
50610696SDavid.Hollister@Sun.COM #define	WORD3(x)	(((x) >> 48) & 0xffff)
50710696SDavid.Hollister@Sun.COM #define	DWORD0(x)	((uint32_t)(x))
50810696SDavid.Hollister@Sun.COM #define	DWORD1(x)	((uint32_t)(((uint64_t)x) >> 32))
50910696SDavid.Hollister@Sun.COM 
51010696SDavid.Hollister@Sun.COM #define	SAS_ADDR_FMT	"0x%02x%02x%02x%02x%02x%02x%02x%02x"
51110696SDavid.Hollister@Sun.COM #define	SAS_ADDR_PRT(x)	x[0], x[1], x[2], x[3], x[4], x[5], x[6], x[7]
51210696SDavid.Hollister@Sun.COM 
51310696SDavid.Hollister@Sun.COM #define	PMCS_VALID_LINK_RATE(r) \
51410696SDavid.Hollister@Sun.COM 	((r == SAS_LINK_RATE_1_5GBIT) || (r == SAS_LINK_RATE_3GBIT) || \
51510696SDavid.Hollister@Sun.COM 	(r == SAS_LINK_RATE_6GBIT))
51610696SDavid.Hollister@Sun.COM 
51710696SDavid.Hollister@Sun.COM /*
51810696SDavid.Hollister@Sun.COM  * This is here to avoid inclusion of <sys/ctype.h> which is not lint clean.
51910696SDavid.Hollister@Sun.COM  */
52010696SDavid.Hollister@Sun.COM #define	HEXDIGIT(x)	(((x) >= '0' && (x) <= '9') || \
52110696SDavid.Hollister@Sun.COM 	((x) >= 'a' && (x) <= 'f') || ((x) >= 'A' && (x) <= 'F'))
52210696SDavid.Hollister@Sun.COM 
52312120SDavid.Hollister@Sun.COM #define	NSECS_PER_SEC	1000000000UL
52412120SDavid.Hollister@Sun.COM 
52510696SDavid.Hollister@Sun.COM 
52610696SDavid.Hollister@Sun.COM typedef void (*pmcs_cb_t) (pmcs_hw_t *, pmcwork_t *, uint32_t *);
52710696SDavid.Hollister@Sun.COM 
52810696SDavid.Hollister@Sun.COM /*
52910696SDavid.Hollister@Sun.COM  * Defines and structure used for tracing/logging information
53010696SDavid.Hollister@Sun.COM  */
53110696SDavid.Hollister@Sun.COM 
53210696SDavid.Hollister@Sun.COM #define	PMCS_TBUF_ELEM_SIZE	120
53310696SDavid.Hollister@Sun.COM #define	PMCS_TBUF_NUM_ELEMS_DEF	100000
53410696SDavid.Hollister@Sun.COM 
53511048SDavid.Hollister@Sun.COM #define	PMCS_TBUF_UA_MAX_SIZE	32
53610696SDavid.Hollister@Sun.COM typedef struct {
53711048SDavid.Hollister@Sun.COM 	/* Target-specific data */
53811048SDavid.Hollister@Sun.COM 	uint16_t	target_num;
53911048SDavid.Hollister@Sun.COM 	char		target_ua[PMCS_TBUF_UA_MAX_SIZE];
54011048SDavid.Hollister@Sun.COM 	/* PHY-specific data */
54111048SDavid.Hollister@Sun.COM 	uint8_t 	phy_sas_address[8];
54211048SDavid.Hollister@Sun.COM 	char		phy_path[32];
54311048SDavid.Hollister@Sun.COM 	pmcs_dtype_t	phy_dtype;
54411048SDavid.Hollister@Sun.COM 	/* Log data */
54510696SDavid.Hollister@Sun.COM 	timespec_t	timestamp;
54612120SDavid.Hollister@Sun.COM 	uint64_t	fw_timestamp;
54710696SDavid.Hollister@Sun.COM 	char		buf[PMCS_TBUF_ELEM_SIZE];
54810696SDavid.Hollister@Sun.COM } pmcs_tbuf_t;
54910696SDavid.Hollister@Sun.COM 
55010696SDavid.Hollister@Sun.COM /*
55110696SDavid.Hollister@Sun.COM  * Firmware event log header format
55210696SDavid.Hollister@Sun.COM  */
55310696SDavid.Hollister@Sun.COM typedef struct pmcs_fw_event_hdr_s {
55410696SDavid.Hollister@Sun.COM 	uint32_t	fw_el_signature;
55510696SDavid.Hollister@Sun.COM 	uint32_t	fw_el_entry_start_offset;
55610696SDavid.Hollister@Sun.COM 	uint32_t	fw_el_rsvd1;
55710696SDavid.Hollister@Sun.COM 	uint32_t	fw_el_buf_size;
55810696SDavid.Hollister@Sun.COM 	uint32_t	fw_el_rsvd2;
55910696SDavid.Hollister@Sun.COM 	uint32_t	fw_el_oldest_idx;
56010696SDavid.Hollister@Sun.COM 	uint32_t	fw_el_latest_idx;
56110696SDavid.Hollister@Sun.COM 	uint32_t	fw_el_entry_size;
56210696SDavid.Hollister@Sun.COM } pmcs_fw_event_hdr_t;
56310696SDavid.Hollister@Sun.COM 
56412060SDavid.Hollister@Sun.COM /*
56512120SDavid.Hollister@Sun.COM  * Firmware event log entry format
56612120SDavid.Hollister@Sun.COM  */
56712120SDavid.Hollister@Sun.COM typedef struct pmcs_fw_event_entry_s {
56812120SDavid.Hollister@Sun.COM 	uint32_t	num_words : 3,
56912120SDavid.Hollister@Sun.COM 			reserved : 25,
57012120SDavid.Hollister@Sun.COM 			severity: 4;
57112120SDavid.Hollister@Sun.COM 	uint32_t	ts_upper;
57212120SDavid.Hollister@Sun.COM 	uint32_t	ts_lower;
57312120SDavid.Hollister@Sun.COM 	uint32_t	seq_num;
57412120SDavid.Hollister@Sun.COM 	uint32_t	logw0;
57512120SDavid.Hollister@Sun.COM 	uint32_t	logw1;
57612120SDavid.Hollister@Sun.COM 	uint32_t	logw2;
57712120SDavid.Hollister@Sun.COM 	uint32_t	logw3;
57812120SDavid.Hollister@Sun.COM } pmcs_fw_event_entry_t;
57912120SDavid.Hollister@Sun.COM 
58012120SDavid.Hollister@Sun.COM #define	PMCS_FWLOG_TIMER_DIV	8	/* fw timer has 8ns granularity */
58112120SDavid.Hollister@Sun.COM #define	PMCS_FWLOG_AAP1_SIG	0x1234AAAA
58212120SDavid.Hollister@Sun.COM #define	PMCS_FWLOG_IOP_SIG	0x5678CCCC
58312120SDavid.Hollister@Sun.COM 
58412120SDavid.Hollister@Sun.COM /*
58512060SDavid.Hollister@Sun.COM  * Receptacle information
58612060SDavid.Hollister@Sun.COM  */
58712060SDavid.Hollister@Sun.COM #define	PMCS_NUM_RECEPTACLES	2
58812060SDavid.Hollister@Sun.COM 
58912060SDavid.Hollister@Sun.COM #define	PMCS_RECEPT_LABEL_0	"SAS0"
59012060SDavid.Hollister@Sun.COM #define	PMCS_RECEPT_LABEL_1	"SAS1"
59112060SDavid.Hollister@Sun.COM 
59212120SDavid.Hollister@Sun.COM #define	PMCS_RECEPT_PM_0	"f0"
59312120SDavid.Hollister@Sun.COM #define	PMCS_RECEPT_PM_1	"f"
59412060SDavid.Hollister@Sun.COM 
59510696SDavid.Hollister@Sun.COM #ifdef	__cplusplus
59610696SDavid.Hollister@Sun.COM }
59710696SDavid.Hollister@Sun.COM #endif
59810696SDavid.Hollister@Sun.COM #endif	/* _PMCS_DEF_H */
599