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