xref: /titanic_50/usr/src/uts/sun4u/montecarlo/sys/scsb.h (revision 03831d35f7499c87d51205817c93e9a8d42c4bae)
1*03831d35Sstevel /*
2*03831d35Sstevel  * CDDL HEADER START
3*03831d35Sstevel  *
4*03831d35Sstevel  * The contents of this file are subject to the terms of the
5*03831d35Sstevel  * Common Development and Distribution License (the "License").
6*03831d35Sstevel  * You may not use this file except in compliance with the License.
7*03831d35Sstevel  *
8*03831d35Sstevel  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
9*03831d35Sstevel  * or http://www.opensolaris.org/os/licensing.
10*03831d35Sstevel  * See the License for the specific language governing permissions
11*03831d35Sstevel  * and limitations under the License.
12*03831d35Sstevel  *
13*03831d35Sstevel  * When distributing Covered Code, include this CDDL HEADER in each
14*03831d35Sstevel  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
15*03831d35Sstevel  * If applicable, add the following below this CDDL HEADER, with the
16*03831d35Sstevel  * fields enclosed by brackets "[]" replaced with your own identifying
17*03831d35Sstevel  * information: Portions Copyright [yyyy] [name of copyright owner]
18*03831d35Sstevel  *
19*03831d35Sstevel  * CDDL HEADER END
20*03831d35Sstevel  */
21*03831d35Sstevel 
22*03831d35Sstevel /*
23*03831d35Sstevel  * Copyright 2001 Sun Microsystems, Inc.  All rights reserved.
24*03831d35Sstevel  * Use is subject to license terms.
25*03831d35Sstevel  */
26*03831d35Sstevel 
27*03831d35Sstevel #ifndef	_MONTECARLO_SYS_SCSB_H
28*03831d35Sstevel #define	_MONTECARLO_SYS_SCSB_H
29*03831d35Sstevel 
30*03831d35Sstevel #pragma ident	"%Z%%M%	%I%	%E% SMI"
31*03831d35Sstevel 
32*03831d35Sstevel #ifdef	__cplusplus
33*03831d35Sstevel extern "C" {
34*03831d35Sstevel #endif
35*03831d35Sstevel 
36*03831d35Sstevel #ifdef	_KERNEL
37*03831d35Sstevel #include <sys/inttypes.h>
38*03831d35Sstevel #include <sys/i2c/misc/i2c_svc.h>
39*03831d35Sstevel #include <sys/ksynch.h>
40*03831d35Sstevel #endif	/* _KERNEL */
41*03831d35Sstevel 
42*03831d35Sstevel /*
43*03831d35Sstevel  * CPU and AlarmCard slots
44*03831d35Sstevel  * MonteCarlo:	CPU = SLOT1, AC = SLOT8
45*03831d35Sstevel  * Tonga:	CPU = SLOT3, AC = SLOT1
46*03831d35Sstevel  */
47*03831d35Sstevel #define	SC_MC_CPU_SLOT			1
48*03831d35Sstevel #define	SC_TG_CPU_SLOT			3
49*03831d35Sstevel #define	SC_MC_AC_SLOT			8
50*03831d35Sstevel #define	SC_TG_AC_SLOT			1
51*03831d35Sstevel #define	SC_MC_CTC_SLOT			2
52*03831d35Sstevel 
53*03831d35Sstevel #define	SCSB_MC_ALARM_SLOT		SC_MC_AC_SLOT
54*03831d35Sstevel #define	SCSB_TONGA_ALARM_SLOT		SC_TG_AC_SLOT
55*03831d35Sstevel 
56*03831d35Sstevel #define	SCTRL_PROM_P06			0x00
57*03831d35Sstevel #define	SCTRL_PROM_P10			0x01
58*03831d35Sstevel #define	SCTRL_PROM_P15			0x02
59*03831d35Sstevel #define	SCTRL_PROM_P20			0x03
60*03831d35Sstevel 
61*03831d35Sstevel #define	SCSB_RESET_SLOT			1
62*03831d35Sstevel #define	SCSB_UNRESET_SLOT		2
63*03831d35Sstevel #define	SCSB_GET_SLOT_RESET_STATUS	3
64*03831d35Sstevel 
65*03831d35Sstevel #define	SCTRL_CFG_SLOT16		SCTRL_SYSCFG_5_READ-SCTRL_SYSCFG_BASE
66*03831d35Sstevel #define	SCTRL_CFG_SLOT710		SCTRL_SYSCFG_6_READ-SCTRL_SYSCFG_BASE
67*03831d35Sstevel #define	SCTRL_CFG_SLOTAC		SCTRL_SYSCFG_4_READ-SCTRL_SYSCFG_BASE
68*03831d35Sstevel 
69*03831d35Sstevel /*
70*03831d35Sstevel  * SCSB operations between scsb and the hotswap controller module
71*03831d35Sstevel  */
72*03831d35Sstevel #define	SCSB_HSC_AC_BUSY		1
73*03831d35Sstevel #define	SCSB_HSC_AC_CONFIGURED		2
74*03831d35Sstevel #define	SCSB_HSC_AC_UNCONFIGURED	3
75*03831d35Sstevel #define	SCSB_HSC_AC_UNCONFIGURE		4
76*03831d35Sstevel #define	SCSB_HSC_AC_CONFIGURE		5
77*03831d35Sstevel #define	SCSB_HSC_AC_SET_BUSY		6
78*03831d35Sstevel #define	SCSB_HSC_AC_REMOVAL_ALERT	7
79*03831d35Sstevel /*
80*03831d35Sstevel  * SCSB_HSC_AC_GET_SLOT_INFO for hsc_ac_op()
81*03831d35Sstevel  * to return hsc_slot_t pointer (for debugging)
82*03831d35Sstevel  */
83*03831d35Sstevel #define	SCSB_HSC_AC_GET_SLOT_INFO	11
84*03831d35Sstevel 
85*03831d35Sstevel /*
86*03831d35Sstevel  * The register set starting address, and macro for translating
87*03831d35Sstevel  * the index to 0 base.
88*03831d35Sstevel  */
89*03831d35Sstevel #define	SCSB_REG_ADDR_START		0xC0
90*03831d35Sstevel #define	SCSB_REG_INDEX(raddr)		((raddr) % SCSB_REG_ADDR_START)
91*03831d35Sstevel 
92*03831d35Sstevel /*
93*03831d35Sstevel  * ----------------------
94*03831d35Sstevel  * P1.0
95*03831d35Sstevel  * ----------------------
96*03831d35Sstevel  * The following three register offset groups are defined for P1.0 where
97*03831d35Sstevel  * FRUs might have three different bit offset values,
98*03831d35Sstevel  * Group 1:	LEDs, Slot Reset, and BrdHlthy,
99*03831d35Sstevel  * Group 2:	Config/Status registers
100*03831d35Sstevel  * Group 3:	Interrupt Pointer/Mask registers
101*03831d35Sstevel  */
102*03831d35Sstevel #define	REG_GROUP1		0
103*03831d35Sstevel #define	REG_GROUP2		1
104*03831d35Sstevel #define	REG_GROUP3		2
105*03831d35Sstevel #define	REG_GROUPS_NUM		3
106*03831d35Sstevel #define	IS_GROUP1(rx)			(rx < SCTRL_SYSCFG_5)
107*03831d35Sstevel #define	IS_GROUP3(rx)			(rx > SCTRL_SYSCFG_4)
108*03831d35Sstevel #define	IS_GROUP2(rx)			(rx > (SCTRL_SYSCFG_5 - 1) && \
109*03831d35Sstevel 					(rx < (SCTRL_SYSCFG_4 + 1)))
110*03831d35Sstevel #define	IS_SCB_P10			(scsb->scsb_state & \
111*03831d35Sstevel 						(SCSB_P06_PROM | SCSB_P10_PROM))
112*03831d35Sstevel /*
113*03831d35Sstevel  * ----------------------
114*03831d35Sstevel  * P1.5
115*03831d35Sstevel  * ----------------------
116*03831d35Sstevel  * The table access macros use BASE register plus register offset to get the
117*03831d35Sstevel  * correct register index or address.
118*03831d35Sstevel  * The SCB FRU type has two register offsets, LED reg and INT reg offsets.
119*03831d35Sstevel  * The one in fru_offsets[] is for the NOK, OK, and BLINK LED data.
120*03831d35Sstevel  * To get the register offset for the INTSRC and INTMASK registers, the
121*03831d35Sstevel  * following constant must be added to the table value returned by
122*03831d35Sstevel  * FRU_REG_INDEX(SCTRL_EVENT_SCB, SCTRL_INTMSK_BASE), NOT SCTRL_INTMASK_BASE.
123*03831d35Sstevel  * Given enough time, this too should be handled via macro access to tables.
124*03831d35Sstevel  */
125*03831d35Sstevel #define	SCB_INT_OFFSET	2
126*03831d35Sstevel 
127*03831d35Sstevel /*
128*03831d35Sstevel  * ----------------------------------
129*03831d35Sstevel  * P0.6, P1.0, P1.5, P2.0 DEFINITIONS
130*03831d35Sstevel  * ----------------------------------
131*03831d35Sstevel  */
132*03831d35Sstevel 
133*03831d35Sstevel #define	SCTRL_PROM_VERSION		0xCF	/* same Addr for P06 thru P20 */
134*03831d35Sstevel #define	IS_SCB_P15			(scsb->scsb_state & \
135*03831d35Sstevel 						(SCSB_P15_PROM | SCSB_P20_PROM))
136*03831d35Sstevel 
137*03831d35Sstevel /*
138*03831d35Sstevel  * SCB Register Indicies to scb_reg_index[] table
139*03831d35Sstevel  */
140*03831d35Sstevel #define	SCTRL_SYS_CMD_BASE		0
141*03831d35Sstevel #define	SCTRL_SYS_CMD1			SCTRL_SYS_CMD_BASE
142*03831d35Sstevel #define	SCTRL_SYS_CMD2			1
143*03831d35Sstevel #define	SCTRL_LED_NOK_BASE		2
144*03831d35Sstevel #define	SCTRL_LED_SLOT_16_NOK		SCTRL_LED_NOK_BASE
145*03831d35Sstevel #define	SCTRL_LED_SLOT_712_NOK		3
146*03831d35Sstevel #define	SCTRL_LED_DPP_NOK		4
147*03831d35Sstevel #define	SCTRL_LED_FAN_NOK 		5
148*03831d35Sstevel #define	SCTRL_LED_OK_BASE		6
149*03831d35Sstevel #define	SCTRL_LED_SLOT_16_OK		SCTRL_LED_OK_BASE
150*03831d35Sstevel #define	SCTRL_LED_SLOT_712_OK		7
151*03831d35Sstevel #define	SCTRL_LED_DPP_OK		8
152*03831d35Sstevel #define	SCTRL_LED_FAN_OK		9
153*03831d35Sstevel #define	SCTRL_RESET_BASE		10
154*03831d35Sstevel #define	SCTRL_RESET_SLOT_16		SCTRL_RESET_BASE
155*03831d35Sstevel #define	SCTRL_RESET_SLOT_710A		11
156*03831d35Sstevel #define	SCTRL_RESET_ALARM		11
157*03831d35Sstevel #define	SCTRL_BLINK_OK_BASE		12
158*03831d35Sstevel #define	SCTRL_BLINK_OK_1		SCTRL_BLINK_OK_BASE
159*03831d35Sstevel #define	SCTRL_BLINK_OK_2		13
160*03831d35Sstevel #define	SCTRL_BLINK_GR_3		14			/* 0xCE */
161*03831d35Sstevel #define	SCTRL_SCBID_BASE		15
162*03831d35Sstevel #define	SCTRL_BHLTHY_BASE		16
163*03831d35Sstevel #define	SCTRL_BHLTHY_SLOT_16		SCTRL_BHLTHY_BASE
164*03831d35Sstevel #define	SCTRL_BHLTHY_SLOT_710		17
165*03831d35Sstevel #define	SCTRL_SYSCFG_BASE		18
166*03831d35Sstevel #define	SCTRL_SYSCFG_5			SCTRL_SYSCFG_BASE
167*03831d35Sstevel #define	SCTRL_SYSCFG_6			19
168*03831d35Sstevel #define	SCTRL_SYSCFG_1			20
169*03831d35Sstevel #define	SCTRL_SYSCFG_2			21
170*03831d35Sstevel #define	SCTRL_SYSCFG_3			22
171*03831d35Sstevel #define	SCTRL_SYSCFG_4			23
172*03831d35Sstevel #define	SCTRL_INTSRC_BASE		24
173*03831d35Sstevel #define	SCTRL_INTSRC_HLTHY_BASE		SCTRL_INTSRC_BASE
174*03831d35Sstevel #define	SCTRL_INTSRC_1			SCTRL_INTSRC_BASE
175*03831d35Sstevel #define	SCTRL_INTSRC_2			25
176*03831d35Sstevel #define	SCTRL_INTSRC_3			26
177*03831d35Sstevel #define	SCTRL_INTSRC_4			27
178*03831d35Sstevel #define	SCTRL_INTSRC_5			28
179*03831d35Sstevel #define	SCTRL_INTSRC_6			29
180*03831d35Sstevel #define	SCTRL_INTSRC_SCB_P15		SCTRL_INTSRC_6
181*03831d35Sstevel #define	SCTRL_INTMASK_BASE		30
182*03831d35Sstevel #define	SCTRL_INTMASK_HLTHY_BASE	SCTRL_INTMASK_BASE
183*03831d35Sstevel #define	SCTRL_INTMASK_1			SCTRL_INTMASK_BASE
184*03831d35Sstevel #define	SCTRL_INTMASK_2			31
185*03831d35Sstevel #define	SCTRL_INTMASK_3			32
186*03831d35Sstevel #define	SCTRL_INTMASK_4			33
187*03831d35Sstevel #define	SCTRL_INTMASK_5			34
188*03831d35Sstevel #define	SCTRL_INTMASK_6			35
189*03831d35Sstevel 
190*03831d35Sstevel #define	SCTRL_INTPTR_BASE		SCTRL_INTSRC_3
191*03831d35Sstevel #define	SCTRL_INTMSK_BASE		SCTRL_INTMASK_3
192*03831d35Sstevel /*
193*03831d35Sstevel  * The last two definitions are for register offset compatibility.
194*03831d35Sstevel  * These will be used with FRU_REG_INDEX macros, for P1.0 and P1.5, so 1.5
195*03831d35Sstevel  * register offsets in upper nibble of fru_offset[] tables will be consistent.
196*03831d35Sstevel  * This happens because the HLTHY INTs and INT masks come before the slots and
197*03831d35Sstevel  * FRUs.  That's what changes the register offsets.
198*03831d35Sstevel  * The only EXCEPTION is the ALARM RESET register, which for P1.5 is not
199*03831d35Sstevel  * BASE + 3 as in all other cases, but BASE + 1.  FRU_REG_INDEX(code,base) does
200*03831d35Sstevel  * NOT work for ALARM RESET.  Use ALARM_RESET_REG_INDEX() instead.
201*03831d35Sstevel  * FRU_REG_INDEX() works differently for P1.0, using offset groups to calculate
202*03831d35Sstevel  * the index to the fru_offset[] table.
203*03831d35Sstevel  */
204*03831d35Sstevel 
205*03831d35Sstevel /*
206*03831d35Sstevel  * REGISTER BIT OFFSETS
207*03831d35Sstevel  * For the bit definitions, the SCB register sets are divided into two tables,
208*03831d35Sstevel  * 1. scb_1x_fru_offset[]	bit-offsets for all FRUs and
209*03831d35Sstevel  *				Interrupt events
210*03831d35Sstevel  * 2. scb_1x_sys_offset[]	for system command/control registers
211*03831d35Sstevel  *				and any remaining bits, like MPID.
212*03831d35Sstevel  *
213*03831d35Sstevel  * This is a bit historic from P0.6,P1.0 days.
214*03831d35Sstevel  * The fru_offset table is indexed using the SCTRL_EVENT_ codes defined in
215*03831d35Sstevel  * mct_topology.h.  Almost all of these describe interrupt generated events.
216*03831d35Sstevel  * Ths sys_offset table contains anything else, mostly the System Control
217*03831d35Sstevel  * registers and some bit definitions form the config/status registers.
218*03831d35Sstevel  */
219*03831d35Sstevel 
220*03831d35Sstevel /*
221*03831d35Sstevel  * scb_1x_sys_offset[] table indicies
222*03831d35Sstevel  *
223*03831d35Sstevel  * SCB System Command/Control Registers from 1.0 and 1.5
224*03831d35Sstevel  */
225*03831d35Sstevel #define	SCTRL_SYS_PS1_OFF		0
226*03831d35Sstevel #define	SCTRL_SYS_PS2_OFF		1
227*03831d35Sstevel #define	SCTRL_SYS_PS_OFF_BASE		SCTRL_SYS_PS1_OFF
228*03831d35Sstevel #define	SCTRL_SYS_PS1_ON		2
229*03831d35Sstevel #define	SCTRL_SYS_PS2_ON		3
230*03831d35Sstevel #define	SCTRL_SYS_PS_ON_BASE		SCTRL_SYS_PS1_ON
231*03831d35Sstevel #define	SCTRL_SYS_SCB_CTL0		4
232*03831d35Sstevel #define	SCTRL_SYS_SCB_CTL1		5
233*03831d35Sstevel #define	SCTRL_SYS_SCB_CTL2		6
234*03831d35Sstevel #define	SCTRL_SYS_SCB_CTL3		7
235*03831d35Sstevel #define	SCTRL_SYS_PSM_INT_ENABLE	8
236*03831d35Sstevel #define	SCTRL_SYS_SCB_INIT		9
237*03831d35Sstevel #define	SCTRL_SYS_TEST_MODE		10
238*03831d35Sstevel #define	SCTRL_SYS_SCBLED		11
239*03831d35Sstevel #define	SCTRL_SYS_SPA0			12
240*03831d35Sstevel #define	SCTRL_SYS_SPA1			13
241*03831d35Sstevel #define	SCTRL_SYS_SPA2			14
242*03831d35Sstevel #define	SCTRL_SYS_RSVD			15
243*03831d35Sstevel /*
244*03831d35Sstevel  * SCB Config/Status register leftovers
245*03831d35Sstevel  */
246*03831d35Sstevel #define	SCTRL_CFG_MPID0			16
247*03831d35Sstevel #define	SCTRL_CFG_MPID1			17
248*03831d35Sstevel #define	SCTRL_CFG_MPID2			18
249*03831d35Sstevel #define	SCTRL_CFG_MPID3			19
250*03831d35Sstevel #define	SCTRL_CFG_SCB_STAT0		20
251*03831d35Sstevel #define	SCTRL_CFG_SCB_STAT2		21
252*03831d35Sstevel /*
253*03831d35Sstevel  * SCB Identity register offsets
254*03831d35Sstevel  */
255*03831d35Sstevel #define	SCTRL_SCBID0			22
256*03831d35Sstevel #define	SCTRL_SCBID_SIZE		4
257*03831d35Sstevel #define	SCTRL_SCB_TEST			23
258*03831d35Sstevel 
259*03831d35Sstevel /* numregs table order and indicies */
260*03831d35Sstevel #define	SCTRL_SYS_CMD_NUM		0
261*03831d35Sstevel #define	SCTRL_LED_NOK_NUM		1
262*03831d35Sstevel #define	SCTRL_LED_OK_NUM		2
263*03831d35Sstevel #define	SCTRL_LED_NUM			3
264*03831d35Sstevel #define	SCTRL_RESET_NUM			4
265*03831d35Sstevel #define	SCTRL_BLINK_NUM			5
266*03831d35Sstevel #define	SCTRL_SCBID_NUM			6
267*03831d35Sstevel #define	SCTRL_BHLTHY_NUM		7
268*03831d35Sstevel #define	SCTRL_SYSCFG_NUM		8
269*03831d35Sstevel #define	SCTRL_INTSRC_NUM		9
270*03831d35Sstevel #define	SCTRL_INTMSK_NUM		10
271*03831d35Sstevel #define	SCTRL_TOTAL_NUM			11
272*03831d35Sstevel 
273*03831d35Sstevel 
274*03831d35Sstevel /*
275*03831d35Sstevel  * Macro Definitions for register and bit offset values
276*03831d35Sstevel  */
277*03831d35Sstevel /* macros names for scb_numregs[] access */
278*03831d35Sstevel #define	SCTRL_SYSCMD_NUMREGS	(scb_numregs[SCTRL_SYS_CMD_NUM])
279*03831d35Sstevel #define	SCTRL_LED_NOK_NUMREGS	(scb_numregs[SCTRL_LED_NOK_NUM])
280*03831d35Sstevel #define	SCTRL_LED_OK_NUMREGS	(scb_numregs[SCTRL_LED_OK_NUM])
281*03831d35Sstevel #define	SCTRL_LED_NUMREGS	(scb_numregs[SCTRL_LED_NUM])
282*03831d35Sstevel #define	SCTRL_RESET_NUMREGS	(scb_numregs[SCTRL_RESET_NUM])
283*03831d35Sstevel #define	SCTRL_BLINK_NUMREGS	(scb_numregs[SCTRL_BLINK_NUM])
284*03831d35Sstevel #define	SCTRL_SCBID_NUMREGS	(scb_numregs[SCTRL_SCBID_NUM])
285*03831d35Sstevel #define	SCTRL_BHLTHY_NUMREGS	(scb_numregs[SCTRL_BHLTHY_NUM])
286*03831d35Sstevel #define	SCTRL_CFG_NUMREGS	(scb_numregs[SCTRL_SYSCFG_NUM])
287*03831d35Sstevel #define	SCTRL_INTR_NUMREGS	(scb_numregs[SCTRL_INTSRC_NUM])
288*03831d35Sstevel #define	SCTRL_MASK_NUMREGS	(scb_numregs[SCTRL_INTMSK_NUM])
289*03831d35Sstevel #define	SCTRL_TOTAL_NUMREGS	(scb_numregs[SCTRL_TOTAL_NUM])
290*03831d35Sstevel 
291*03831d35Sstevel /*
292*03831d35Sstevel  * Maximum number of registers in a register group
293*03831d35Sstevel  * Needed for above register groups array sizing
294*03831d35Sstevel  */
295*03831d35Sstevel #define	SCTRL_MAX_GROUP_NUMREGS		16
296*03831d35Sstevel 
297*03831d35Sstevel #define	SCSB_REG_ADDR(rx)		(scb_reg_index[rx])
298*03831d35Sstevel #define	FRU_INDEX(code)			(event_to_index(code))
299*03831d35Sstevel #define	FRU_OFFSET_BASE(rx)		(MCT_MAX_FRUS * (IS_SCB_P15 ? 0 : \
300*03831d35Sstevel 						(IS_GROUP1(rx) ? REG_GROUP1 : \
301*03831d35Sstevel 						(IS_GROUP3(rx) ? REG_GROUP3 : \
302*03831d35Sstevel 						REG_GROUP2))))
303*03831d35Sstevel #define	FRU_OFFSET_VAL(code, rx)	(scb_fru_offset[FRU_OFFSET_BASE(rx) + \
304*03831d35Sstevel 							FRU_INDEX(code)])
305*03831d35Sstevel 
306*03831d35Sstevel #define	FRU_OFFSET(code, rx)		(FRU_OFFSET_VAL(code, rx) & 0xf)
307*03831d35Sstevel #define	FRU_REG_INDEX(code, rx)		(((FRU_OFFSET_VAL(code, rx) >> 4) \
308*03831d35Sstevel 						& 0xf) + rx)
309*03831d35Sstevel #define	FRU_REG_ADDR(code, rx)		(SCSB_REG_ADDR(FRU_REG_INDEX(code, rx)))
310*03831d35Sstevel #define	SYS_OFFSET_VAL(idx)		(scb_sys_offset[idx])
311*03831d35Sstevel #define	SYS_OFFSET(idx)			(SYS_OFFSET_VAL(idx) & 0xf)
312*03831d35Sstevel #define	SYS_REG_INDEX(idx, rx)		(((SYS_OFFSET_VAL(idx) >> 4) \
313*03831d35Sstevel 						& 0xf) + rx)
314*03831d35Sstevel 
315*03831d35Sstevel #define	ALARM_RESET_REG_INDEX(code, rx)	((IS_SCB_P15 ? 1 : \
316*03831d35Sstevel 					((FRU_OFFSET_VAL(code, rx) >> 4) \
317*03831d35Sstevel 					& 0xf)) + rx)
318*03831d35Sstevel #define	FRU_UNIT_TO_EVCODE(type, unit)	(type_to_code1[type] << (unit - 1))
319*03831d35Sstevel 
320*03831d35Sstevel /*LINTED table used in scsb.o and system utilities*/
321*03831d35Sstevel static uchar_t	*scb_reg_index;
322*03831d35Sstevel /*LINTED table used in scsb.o and system utilities*/
323*03831d35Sstevel static uchar_t	*scb_numregs;
324*03831d35Sstevel /*LINTED table used in scsb.o and system utilities*/
325*03831d35Sstevel static uchar_t	*scb_fru_offset;
326*03831d35Sstevel /*LINTED table used in scsb.o and system utilities*/
327*03831d35Sstevel static uchar_t	*scb_sys_offset;
328*03831d35Sstevel 
329*03831d35Sstevel /*
330*03831d35Sstevel  * --------------------
331*03831d35Sstevel  * Common TABLES
332*03831d35Sstevel  * --------------------
333*03831d35Sstevel  */
334*03831d35Sstevel 
335*03831d35Sstevel /*
336*03831d35Sstevel  * FRU type to unit 1 event_code, see FRU_UNIT_TO_EVCODE() macro above.
337*03831d35Sstevel  * Table order is dependent on scsb_utype_t definition in mct_topology.h
338*03831d35Sstevel  */
339*03831d35Sstevel /*LINTED table used in scsb.o and system utilities*/
340*03831d35Sstevel static uint32_t type_to_code1[] = {
341*03831d35Sstevel 	SCTRL_EVENT_SLOT1,
342*03831d35Sstevel 	SCTRL_EVENT_PDU1,
343*03831d35Sstevel 	SCTRL_EVENT_PS1,
344*03831d35Sstevel 	SCTRL_EVENT_DISK1,
345*03831d35Sstevel 	SCTRL_EVENT_FAN1,
346*03831d35Sstevel 	SCTRL_EVENT_ALARM,
347*03831d35Sstevel 	SCTRL_EVENT_SCB,
348*03831d35Sstevel 	SCTRL_EVENT_SSB,
349*03831d35Sstevel 	SCTRL_EVENT_CFTM,
350*03831d35Sstevel 	SCTRL_EVENT_CRTM,
351*03831d35Sstevel 	SCTRL_EVENT_PRTM
352*03831d35Sstevel };
353*03831d35Sstevel 
354*03831d35Sstevel /*
355*03831d35Sstevel  * --------------------
356*03831d35Sstevel  * P0.6 and P1.0 TABLES
357*03831d35Sstevel  * --------------------
358*03831d35Sstevel  */
359*03831d35Sstevel 
360*03831d35Sstevel /*
361*03831d35Sstevel  * MonteCarlo: Programming Inteface Specifications Version 0.9
362*03831d35Sstevel  * 10/27/99
363*03831d35Sstevel  * NOTE: P0.6 FANs and PDUs were different
364*03831d35Sstevel  */
365*03831d35Sstevel /*LINTED table used in scsb.o and system utilities*/
366*03831d35Sstevel static uchar_t scb_10_reg_index[] = {
367*03831d35Sstevel 	0xC0, 0xC1, 0xC2, 0xC3, 0xC4, 0xC5, 0xC6, 0xC7,		/* 00 - 07 */
368*03831d35Sstevel 	0xC8, 0xC9, 0xCA, 0xCB, 0xCC, 0xCD, 0xCE, 0xCF,		/* 08 - 15 */
369*03831d35Sstevel 	0xD0, 0xD1, 0xD2, 0xD3, 0xD4, 0xD5, 0xD6, 0xD7,		/* 16 - 23 */
370*03831d35Sstevel 	0xD8, 0xD9, 0xDA, 0xDB, 0x00, 0x00, 0xDC, 0x00,		/* 24 - 31 */
371*03831d35Sstevel 	0xDC, 0xDD, 0xDE, 0xDF, 0xD8, 0xDC, 0x00, 0x00,		/* 32 - 39 */
372*03831d35Sstevel };
373*03831d35Sstevel 
374*03831d35Sstevel /*LINTED table used in scsb.o and system utilities*/
375*03831d35Sstevel static uchar_t scb_10_numregs[] = {
376*03831d35Sstevel 	2, 4, 4, 8, 2, 2, 1, 2, 6, 4, 4, 32
377*03831d35Sstevel };
378*03831d35Sstevel 
379*03831d35Sstevel 
380*03831d35Sstevel /*
381*03831d35Sstevel  * MCT_MAX_FRUS * REG_GROUPS_NUM
382*03831d35Sstevel  *
383*03831d35Sstevel  * FRU order:
384*03831d35Sstevel  *	 0 -  9:	Slots 1 - 10
385*03831d35Sstevel  *	10 - 11:	PDU 1 - 2
386*03831d35Sstevel  *	12 - 13:	PS 1 - 2
387*03831d35Sstevel  *	14 - 16:	Disk 1 - 3
388*03831d35Sstevel  *	17 - 19:	Fan 1 - 3
389*03831d35Sstevel  *	20:		Alarm Card
390*03831d35Sstevel  *	21:		SCB
391*03831d35Sstevel  *	22:		SSB
392*03831d35Sstevel  *	23:		CRTM
393*03831d35Sstevel  *	24:		CFTM
394*03831d35Sstevel  *	25:		PRTM
395*03831d35Sstevel  *	26:		PWRDWN
396*03831d35Sstevel  *	27:		REPLACE
397*03831d35Sstevel  *	28:		ALARM_INT
398*03831d35Sstevel  *	29 - 31:	Unused
399*03831d35Sstevel  *
400*03831d35Sstevel  * A register base group offset is added to the register base value to
401*03831d35Sstevel  * find the index into the reg_index table.
402*03831d35Sstevel  * Example: LED_NOK_BASE + '1' = register for slots 7-10 NOK LEDs
403*03831d35Sstevel  * This offset is encoded in the upper nibble in the following table
404*03831d35Sstevel  * of register offsets per FRU/EVENT.
405*03831d35Sstevel  * The register base group definitions are:
406*03831d35Sstevel  *	base group		offset group
407*03831d35Sstevel  *	----------------------	------------
408*03831d35Sstevel  *	SCTRL_LED_NOK_BASE	G1
409*03831d35Sstevel  *	SCTRL_LED_OK_BASE	G1
410*03831d35Sstevel  *	SCTRL_RESET_BASE	G1
411*03831d35Sstevel  *	SCTRL_BLINK_OK_BASE	G1
412*03831d35Sstevel  *	SCTRL_BHLTHY_BASE	G1
413*03831d35Sstevel  *	SCTRL_SYSCFG_BASE	G2
414*03831d35Sstevel  *	SCTRL_INTSRC_BASE	G3
415*03831d35Sstevel  *	SCTRL_INTMASK_BASE	G3
416*03831d35Sstevel  *	SCTRL_SYS_CMD_BASE	G4
417*03831d35Sstevel  *
418*03831d35Sstevel  * See FRU_OFFSET() macro
419*03831d35Sstevel  */
420*03831d35Sstevel /*LINTED table used in scsb.o and system utilities*/
421*03831d35Sstevel static uchar_t	scb_10_fru_offset[] = {
422*03831d35Sstevel 	/* Register Group 1 */
423*03831d35Sstevel 	0x00, 0x01, 0x02, 0x03, 0x04, 0x05,	/* SLOT    1-6	*/
424*03831d35Sstevel 	0x10, 0x11, 0x12, 0x13,			/* SLOT    7-10	*/
425*03831d35Sstevel 	0x35, 0x15, 0x21, 0x22,			/* PDU/PS  1-2	*/
426*03831d35Sstevel 	0x23, 0x24, 0x25,			/* Disks   1-3	*/
427*03831d35Sstevel 	0x33, 0x34, 0x35,			/* Fans    1-3	*/
428*03831d35Sstevel 	0xFF, 0x20, 0xFF,		/* Alarm Card, SCB, SSB	*/
429*03831d35Sstevel 	0xFF, 0xFF, 0xFF,		/* CRTM, CFTM, PRTM	*/
430*03831d35Sstevel 	0xFF, 0xFF, 0xFF,		/* PWRDWN, SCBRR, ACINT */
431*03831d35Sstevel 	0xFF, 0xFF, 0xFF,		/* Unused		*/
432*03831d35Sstevel 	/* Register Group 2 */
433*03831d35Sstevel 	0x00, 0x01, 0x02, 0x03, 0x04, 0x05,	/* SLOT    1-6	*/
434*03831d35Sstevel 	0x10, 0x11, 0x12, 0x13,			/* SLOT    7-10	*/
435*03831d35Sstevel 	0x25, 0x27, 0x30, 0x31,			/* PDU/PS  1-2	*/
436*03831d35Sstevel 	0x40, 0x41, 0x42,			/* Disks   1-3	*/
437*03831d35Sstevel 	0x32, 0x33, 0x34,			/* Fans    1-3	*/
438*03831d35Sstevel 	0x50, 0xFF, 0x35,		/* Alarm Card, SCB, SSB	*/
439*03831d35Sstevel 	0x43, 0x44, 0x45,		/* CRTM, CFTM, PRTM	*/
440*03831d35Sstevel 	0xFF, 0xFF, 0xFF,		/* PWRDWN, SCBRR, ACINT */
441*03831d35Sstevel 	0x24, 0x26, 0x20,		/* STAT0, STAT1, MPID0	*/
442*03831d35Sstevel 	/* Register Group 3 */
443*03831d35Sstevel 	0x31, 0x32, 0x33, 0x34, 0x35, 0x36,	/* SLOT    1-6	*/
444*03831d35Sstevel 	0x37, 0x26, 0x27, 0x16,			/* SLOT    7-10	*/
445*03831d35Sstevel 	0xFF, 0xFF, 0x10, 0x11,			/* PDU/PS  1-2	*/
446*03831d35Sstevel 	0x20, 0x21, 0x22,			/* Disks   1-3	*/
447*03831d35Sstevel 	0x12, 0x13, 0x14,			/* Fans    1-3	*/
448*03831d35Sstevel 	0x30, 0x04, 0x15,		/* Alarm Card, SCB, SSB	*/
449*03831d35Sstevel 	0x23, 0x24, 0x25,		/* CRTM, CFTM, PRTM	*/
450*03831d35Sstevel 	0x00, 0x02, 0x03,		/* PWRDWN, SCBRR, ACINT */
451*03831d35Sstevel 	0xFF, 0xFF, 0xFF,		/* Unused		*/
452*03831d35Sstevel };
453*03831d35Sstevel 
454*03831d35Sstevel /*LINTED table used in scsb.o and system utilities*/
455*03831d35Sstevel static uchar_t	scb_10_sys_offset[] = {
456*03831d35Sstevel 	0x00, 0x01, 0x06, 0x07, 0x10, 0x11, 0x12, 0x13,
457*03831d35Sstevel 	0x15, 0x16, 0xFF, 0x02, 0x03, 0x04, 0x05, 0x14,
458*03831d35Sstevel 	0x20, 0x21, 0x22, 0x23, 0x24, 0x26, 0x00, 0x07,
459*03831d35Sstevel };
460*03831d35Sstevel 
461*03831d35Sstevel /*LINTED table used in scsb.o and system utilities*/
462*03831d35Sstevel static uchar_t	scb_10_int_masks[] = {
463*03831d35Sstevel 	0x11, 0x2F, 0x3F, 0xFF, 0x00, 0x00,
464*03831d35Sstevel };
465*03831d35Sstevel 
466*03831d35Sstevel 
467*03831d35Sstevel /*
468*03831d35Sstevel  * --------------------
469*03831d35Sstevel  * P1.5 and P2.0 TABLES
470*03831d35Sstevel  * --------------------
471*03831d35Sstevel  */
472*03831d35Sstevel 
473*03831d35Sstevel /*
474*03831d35Sstevel  * MonteCarlo: Programming Inteface Specifications
475*03831d35Sstevel  * Chapter 12 from the MonteCarlo System Specification
476*03831d35Sstevel  * 02/08/00: Chapter update from Carl Meert
477*03831d35Sstevel  */
478*03831d35Sstevel /*LINTED table used in scsb.o and system utilities*/
479*03831d35Sstevel static uchar_t scb_15_reg_index[] = {
480*03831d35Sstevel 	0xE0, 0xE1, 0xC0, 0xC1, 0xC2, 0xC2, 0xC3, 0xC4,		/* 00 - 07 */
481*03831d35Sstevel 	0xC5, 0xC5, 0xE2, 0xE3, 0xC6, 0xC7, 0xC8, 0xCF,		/* 08 - 15 */
482*03831d35Sstevel 	0xE4, 0xE5, 0xE6, 0xE7, 0xE8, 0xE9, 0x00, 0x00,		/* 16 - 23 */
483*03831d35Sstevel 	0xD0, 0xD1, 0xD2, 0xD3, 0xD4, 0xD5, 0xD6, 0xD7,		/* 24 - 31 */
484*03831d35Sstevel 	0xD8, 0xD9, 0xDA, 0xDB, 0xD2, 0xD8, 0x00, 0x00,		/* 32 - 39 */
485*03831d35Sstevel };
486*03831d35Sstevel 
487*03831d35Sstevel /*LINTED table used in scsb.o and system utilities*/
488*03831d35Sstevel static uchar_t scb_15_numregs[] = {
489*03831d35Sstevel 	2, 3, 3, 6, 2, 3, 1, 2, 4, 6, 6, 48
490*03831d35Sstevel };
491*03831d35Sstevel 
492*03831d35Sstevel /*LINTED table used in scsb.o and system utilities*/
493*03831d35Sstevel static uchar_t	scb_15_fru_offset[] = {
494*03831d35Sstevel 	0x00, 0x01, 0x02, 0x03, 0x04, 0x05,	/* SLOT    1-6	*/
495*03831d35Sstevel 	0x06, 0x07, 0x16, 0x17,			/* SLOT    7-10	*/
496*03831d35Sstevel 	0x11, 0x13, 0x26, 0x27,			/* PDU/PS  1-2	*/
497*03831d35Sstevel 	0x23, 0x24, 0x25,			/* Disks   1-3	*/
498*03831d35Sstevel 	0x20, 0x21, 0xFF,			/* Fans    1-3	*/
499*03831d35Sstevel 	0x30, 0x15, 0x33,		/* Alarm Card, SCB, SSB	*/
500*03831d35Sstevel 	0x31, 0x14, 0x32,		/* CRTM, CFTM, PRTM	*/
501*03831d35Sstevel 	0x34, 0xFF, 0x36,		/* PWRDWN, SCBRR, ACINT */
502*03831d35Sstevel 	0xFF, 0xFF, 0xFF,		/* Unused		*/
503*03831d35Sstevel };
504*03831d35Sstevel 
505*03831d35Sstevel /*LINTED table used in scsb.o and system utilities*/
506*03831d35Sstevel static uchar_t	scb_15_sys_offset[] = {
507*03831d35Sstevel 	0x00, 0x01, 0x02, 0x03, 0x10, 0x11, 0x12, 0x13,
508*03831d35Sstevel 	0x14, 0x15, 0x16, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
509*03831d35Sstevel 	0x34, 0x35, 0x36, 0x37, 0x10, 0x12, 0x00, 0x07
510*03831d35Sstevel };
511*03831d35Sstevel 
512*03831d35Sstevel /*LINTED table used in scsb.o and system utilities*/
513*03831d35Sstevel static uchar_t	scb_15_int_masks[] = {
514*03831d35Sstevel 	0xFF, 0x00, 0xFF, 0x1A, 0xFB, 0x7F,
515*03831d35Sstevel };
516*03831d35Sstevel 
517*03831d35Sstevel #define	SCSB_NO_OF_BOARDS  1
518*03831d35Sstevel 
519*03831d35Sstevel /*
520*03831d35Sstevel  * scsb_state values
521*03831d35Sstevel  * outside _KERNEL for smctrl test utility
522*03831d35Sstevel  */
523*03831d35Sstevel #define	SCSB_DOWN			0x0000	/* never really used */
524*03831d35Sstevel #define	SCSB_UP				0x0001
525*03831d35Sstevel #define	SCSB_OPEN			0x0002
526*03831d35Sstevel #define	SCSB_EXCL			0x0004
527*03831d35Sstevel #define	SCSB_APP_SLOTLED_CTRL		0x0008
528*03831d35Sstevel #define	SCSB_KS_UPDATE			0x0010
529*03831d35Sstevel #define	SCSB_FROZEN			0x0020
530*03831d35Sstevel #define	SCSB_DEBUG_MODE			0x0040
531*03831d35Sstevel #define	SCSB_DIAGS_MODE			0x0080
532*03831d35Sstevel #define	SCSB_UNUSED_08			0x0100
533*03831d35Sstevel #define	SCSB_PSM_INT_ENABLED		0x0200
534*03831d35Sstevel #define	SCSB_UMUTEX			0x0400
535*03831d35Sstevel #define	SCSB_CONDVAR			0x0800
536*03831d35Sstevel #define	SCSB_SCB_PRESENT		0x1000
537*03831d35Sstevel #define	SCSB_SSB_PRESENT		0x2000
538*03831d35Sstevel #define	SCSB_UNUSED_14			0x4000
539*03831d35Sstevel #define	SCSB_UNUSED_15			0x8000
540*03831d35Sstevel #define	SCSB_MINOR_NODE			0x00010000
541*03831d35Sstevel #define	SCSB_PROP_CREATE		0x00020000
542*03831d35Sstevel #define	SCSB_IMUTEX			0x00040000
543*03831d35Sstevel #define	SCSB_I2C_PHANDLE		0x00080000
544*03831d35Sstevel #define	SCSB_I2C_TRANSFER		0x00100000
545*03831d35Sstevel #define	SCSB_TOPOLOGY			0x00200000
546*03831d35Sstevel #define	SCSB_KSTATS			0x00400000
547*03831d35Sstevel #define	SCSB_IS_TONGA			0x00800000
548*03831d35Sstevel #define	SCSB_P10_PROM			0x01000000
549*03831d35Sstevel #define	SCSB_P15_PROM			0x02000000
550*03831d35Sstevel #define	SCSB_P20_PROM			0x04000000
551*03831d35Sstevel #define	SCSB_P2X_PROM			0x08000000
552*03831d35Sstevel #define	SCSB_P06_PROM			0x10000000
553*03831d35Sstevel #define	SCSB_P06_INTR_ON		0x20000000
554*03831d35Sstevel #define	SCSB_P06_NOINT_KLUGE		0x40000000
555*03831d35Sstevel #define	SCSB_IN_INTR			0x80000000
556*03831d35Sstevel #define	SCSB_HSC_INIT			0x0001
557*03831d35Sstevel #define	SCSB_ENUM_ENABLED		0x0002
558*03831d35Sstevel #define	SCSB_ALARM_CARD_PRES		0x0004
559*03831d35Sstevel #define	SCSB_ALARM_CARD_IN_USE		0x0008
560*03831d35Sstevel #define	SCSB_AC_SLOT_INTR_DONE		0x0010
561*03831d35Sstevel #define	SCSB_HSC_CTC_PRES		0x0020
562*03831d35Sstevel #define	SCSB_HSC_UNUSED_06		0x0040
563*03831d35Sstevel #define	SCSB_HSC_UNUSED_07		0x0080
564*03831d35Sstevel #define	SCSB_HSC_UNUSED_08		0x0100
565*03831d35Sstevel #define	SCSB_HSC_UNUSED_09		0x0200
566*03831d35Sstevel #define	SCSB_HSC_UNUSED_10		0x0400
567*03831d35Sstevel #define	SCSB_HSC_UNUSED_11		0x0800
568*03831d35Sstevel #define	SCSB_HSC_UNUSED_12		0x1000
569*03831d35Sstevel #define	SCSB_HSC_UNUSED_13		0x2000
570*03831d35Sstevel #define	SCSB_HSC_UNUSED_14		0x4000
571*03831d35Sstevel #define	SCSB_HSC_UNUSED_15		0x8000
572*03831d35Sstevel 
573*03831d35Sstevel #ifdef	_KERNEL
574*03831d35Sstevel 
575*03831d35Sstevel /*
576*03831d35Sstevel  * The System Controller Board uses the Xilinx to control the I2C bus.
577*03831d35Sstevel  * The address should really go to scsb.conf file.
578*03831d35Sstevel  * The I2C address of the System Controller Board
579*03831d35Sstevel  */
580*03831d35Sstevel #define	SCSB_I2C_ADDR		0x80
581*03831d35Sstevel #define	SCSB_I2C_ADDR_MASK 	0xFF
582*03831d35Sstevel 
583*03831d35Sstevel #define	SCSB_DEVICE_NAME	"scsb"
584*03831d35Sstevel #define	SCSB_INTR_PIL	4
585*03831d35Sstevel 
586*03831d35Sstevel /*
587*03831d35Sstevel  * definitions for Interrupt Event Code handling
588*03831d35Sstevel  */
589*03831d35Sstevel #define	EVC_FIFO_SIZE	8
590*03831d35Sstevel #define	EVC_PROCS_MAX	16
591*03831d35Sstevel /*
592*03831d35Sstevel  * return values for check_event_procs()
593*03831d35Sstevel  */
594*03831d35Sstevel #define	EVC_NO_EVENT_CODE	1
595*03831d35Sstevel #define	EVC_NO_CURR_PROC	2
596*03831d35Sstevel #define	EVC_NEW_EVENT_CODE	3
597*03831d35Sstevel #define	EVC_OR_EVENT_CODE	4
598*03831d35Sstevel #define	EVC_FAILURE		5
599*03831d35Sstevel /*
600*03831d35Sstevel  * scsb_queue_ops() definitions
601*03831d35Sstevel  *   Operations:
602*03831d35Sstevel  */
603*03831d35Sstevel #define	QPROCSOFF		1
604*03831d35Sstevel #define	QPUT_INT32		2
605*03831d35Sstevel #define	QFIRST_AVAILABLE	3
606*03831d35Sstevel #define	QFIRST_OPEN		4
607*03831d35Sstevel #define	QFIND_QUEUE		5
608*03831d35Sstevel /*
609*03831d35Sstevel  *   Return values:
610*03831d35Sstevel  *   0 - 15 are valid clone numbers used as index to clone_devs[]
611*03831d35Sstevel  *   and returned for some operations instead of QOP_OK.
612*03831d35Sstevel  */
613*03831d35Sstevel #define	QOP_OK		16
614*03831d35Sstevel #define	QOP_FAILED	-1
615*03831d35Sstevel 
616*03831d35Sstevel /*
617*03831d35Sstevel  * minor_t definitions
618*03831d35Sstevel  *   bits 2-0      SCB instance 0-7
619*03831d35Sstevel  *   bit    3      Clone device for sm_open()
620*03831d35Sstevel  *   bits 7-4      Cloned device numbers for a total of 15: 0x1# - 0xf#
621*03831d35Sstevel  *		   Must start with '1'  to avoid conflict with:
622*03831d35Sstevel  *			0x00 non-clone device node for instance 0
623*03831d35Sstevel  *			0x08 the clone device node for instance 0
624*03831d35Sstevel  * the new minor_t for the clone is all of the above.
625*03831d35Sstevel  */
626*03831d35Sstevel #define	SCSB_INSTANCE_MASK	0x07
627*03831d35Sstevel #define	SCSB_CLONE		0x08
628*03831d35Sstevel #define	SCSB_CLONES_MASK	0xf0
629*03831d35Sstevel #define	SCSB_CLONES_SHIFT	4
630*03831d35Sstevel #define	SCSB_CLONES_FIRST	1
631*03831d35Sstevel #define	SCSB_CLONES_MAX		16
632*03831d35Sstevel #define	SCSB_GET_CLONE(minor)	((minor&SCSB_CLONES_MASK)>>SCSB_CLONES_SHIFT)
633*03831d35Sstevel #define	SCSB_GET_INSTANCE(minor) \
634*03831d35Sstevel 				(minor&SCSB_INSTANCE_MASK)
635*03831d35Sstevel #define	SCSB_MAKE_MINOR(inst, clnum) \
636*03831d35Sstevel 				(inst|(clnum<<SCSB_CLONES_SHIFT)|SCSB_CLONE)
637*03831d35Sstevel 
638*03831d35Sstevel typedef struct clone_dev {
639*03831d35Sstevel 	queue_t		*cl_rq;
640*03831d35Sstevel 	minor_t		cl_minor;
641*03831d35Sstevel 	uint32_t	cl_flags;
642*03831d35Sstevel } clone_dev_t;
643*03831d35Sstevel 
644*03831d35Sstevel typedef struct {
645*03831d35Sstevel 	uint32_t	scsb_instance;
646*03831d35Sstevel 	uint32_t	scsb_state;
647*03831d35Sstevel 	uint32_t	scsb_hsc_state;
648*03831d35Sstevel 	int		ac_slotnum;	/* Alarm Card Slot Number */
649*03831d35Sstevel 	kmutex_t	scsb_mutex;
650*03831d35Sstevel 	kcondvar_t	scsb_cv;
651*03831d35Sstevel 	uint32_t	scsb_opens;
652*03831d35Sstevel 	dev_info_t	*scsb_dev;
653*03831d35Sstevel 	i2c_client_hdl_t scsb_phandle;	/* i2c private handle from i2c nexus */
654*03831d35Sstevel 	mblk_t		*scsb_mp;	/* reserved for interrupt processing */
655*03831d35Sstevel 	i2c_transfer_t	*scsb_i2ctp;	/* pointer to read/write structure */
656*03831d35Sstevel 	uchar_t		scsb_data_reg[SCSB_DATA_REGISTERS];
657*03831d35Sstevel 	int		scsb_i2c_addr;	/* i2c addr. */
658*03831d35Sstevel 	queue_t		*scsb_rq;	/* read q for scsb_instance */
659*03831d35Sstevel 	timeout_id_t	scsb_btid;	/* qbufcall, or qtimeout id */
660*03831d35Sstevel 	kmutex_t	scsb_imutex;
661*03831d35Sstevel 	ddi_iblock_cookie_t scsb_iblock;
662*03831d35Sstevel 	kstat_t		*ks_leddata;
663*03831d35Sstevel 	kstat_t		*ks_state;
664*03831d35Sstevel 	kstat_t		*ks_topology;
665*03831d35Sstevel 	kstat_t		*ks_evcreg;
666*03831d35Sstevel 	uint32_t	scsb_i2c_errcnt;
667*03831d35Sstevel 	boolean_t	scsb_err_flag;	/* latch err until kstat read */
668*03831d35Sstevel 	boolean_t	scsb_kstat_flag;	/* do i2c trans for kstat */
669*03831d35Sstevel 	uint32_t	scsb_clopens;
670*03831d35Sstevel 	clone_dev_t	clone_devs[SCSB_CLONES_MAX];
671*03831d35Sstevel } scsb_state_t;
672*03831d35Sstevel 
673*03831d35Sstevel int	scsb_led_get(scsb_state_t *, scsb_uinfo_t *, scsb_led_t led_type);
674*03831d35Sstevel int	scsb_led_set(scsb_state_t *, scsb_uinfo_t *, scsb_led_t led_type);
675*03831d35Sstevel int	scsb_reset_unit(scsb_state_t *, scsb_uinfo_t *);
676*03831d35Sstevel int	scsb_bhealthy_slot(scsb_state_t *, scsb_uinfo_t *);
677*03831d35Sstevel int	scsb_slot_occupancy(scsb_state_t *, scsb_uinfo_t *);
678*03831d35Sstevel 
679*03831d35Sstevel #if defined(DEBUG)
680*03831d35Sstevel extern void prom_printf(const char *, ...);
681*03831d35Sstevel void	scsb_debug_prnt(char *, uintptr_t, uintptr_t,
682*03831d35Sstevel 	uintptr_t, uintptr_t, uintptr_t);
683*03831d35Sstevel 
684*03831d35Sstevel #define	DEBUG0(fmt)\
685*03831d35Sstevel 	scsb_debug_prnt(fmt, 0, 0, 0, 0, 0);
686*03831d35Sstevel #define	DEBUG1(fmt, a1)\
687*03831d35Sstevel 	scsb_debug_prnt(fmt, (uintptr_t)(a1), 0, 0, 0, 0);
688*03831d35Sstevel #define	DEBUG2(fmt, a1, a2)\
689*03831d35Sstevel 	scsb_debug_prnt(fmt, (uintptr_t)(a1), (uintptr_t)(a2), 0, 0, 0);
690*03831d35Sstevel #define	DEBUG3(fmt, a1, a2, a3)\
691*03831d35Sstevel 	scsb_debug_prnt(fmt, (uintptr_t)(a1), (uintptr_t)(a2),\
692*03831d35Sstevel 		(uintptr_t)(a3), 0, 0);
693*03831d35Sstevel #define	DEBUG4(fmt, a1, a2, a3, a4)\
694*03831d35Sstevel 	scsb_debug_prnt(fmt, (uintptr_t)(a1), (uintptr_t)(a2),\
695*03831d35Sstevel 		(uintptr_t)(a3), (uintptr_t)(a4), 0);
696*03831d35Sstevel #else
697*03831d35Sstevel #define	DEBUG0(fmt)
698*03831d35Sstevel #define	DEBUG1(fmt, a1)
699*03831d35Sstevel #define	DEBUG2(fmt, a1, a2)
700*03831d35Sstevel #define	DEBUG3(fmt, a1, a2, a3)
701*03831d35Sstevel #define	DEBUG4(fmt, a1, a2, a3, a4)
702*03831d35Sstevel #endif
703*03831d35Sstevel 
704*03831d35Sstevel 
705*03831d35Sstevel #endif	/* _KERNEL */
706*03831d35Sstevel 
707*03831d35Sstevel #ifdef	__cplusplus
708*03831d35Sstevel }
709*03831d35Sstevel #endif
710*03831d35Sstevel 
711*03831d35Sstevel #endif	/* _MONTECARLO_SYS_SCSB_H */
712