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