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