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