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 _SYS_SGHSC_H 28*03831d35Sstevel #define _SYS_SGHSC_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 /* 37*03831d35Sstevel * Serengeti CompactPCI Hot Swap Controller Driver header file. This file is 38*03831d35Sstevel * structured in a following way: common, sghsc data (defines and structures) 39*03831d35Sstevel * and mailbox related data (defines and structures). 40*03831d35Sstevel */ 41*03831d35Sstevel 42*03831d35Sstevel #include <sys/hotplug/hpctrl.h> 43*03831d35Sstevel #include <sys/hotplug/hpcsvc.h> 44*03831d35Sstevel #include <sys/sgsbbc_mailbox.h> 45*03831d35Sstevel 46*03831d35Sstevel /* 47*03831d35Sstevel * sghsc node path with insert placeholders 48*03831d35Sstevel */ 49*03831d35Sstevel #define SGHSC_PATH "/ssm@%x,0/pci@%x,%x00000" 50*03831d35Sstevel 51*03831d35Sstevel /* 52*03831d35Sstevel * Mutex short hands 53*03831d35Sstevel */ 54*03831d35Sstevel #define SGHSC_MUTEX(sghsc) \ 55*03831d35Sstevel (&sghsc->sghsc_mutex) 56*03831d35Sstevel #define SGHSC_MUTEX_OWNED(sghsc) \ 57*03831d35Sstevel mutex_owned(SGHSC_MUTEX(sghsc)) 58*03831d35Sstevel #define SGHSC_MUTEX_ENTER(sghsc) \ 59*03831d35Sstevel mutex_enter(SGHSC_MUTEX(sghsc)) 60*03831d35Sstevel #define SGHSC_MUTEX_EXIT(sghsc) \ 61*03831d35Sstevel mutex_exit(SGHSC_MUTEX(sghsc)) 62*03831d35Sstevel 63*03831d35Sstevel #define SGHSC_SLOT_MUTEX(sghsc, slot_num) \ 64*03831d35Sstevel (&sghsc->sghsc_slot_table[slot_num]->slot_mutex) 65*03831d35Sstevel #define SGHSC_SLOT_MUTEX_OWNED(sghsc, slot_num) \ 66*03831d35Sstevel mutex_owned(SGHSC_SLOT_MUTEX(sghsc, slot_num)); 67*03831d35Sstevel #define SGHSC_SLOT_MUTEX_ENTER(sghsc, slot_num) \ 68*03831d35Sstevel mutex_enter(SGHSC_SLOT_MUTEX(sghsc, slot_num)); 69*03831d35Sstevel #define SGHSC_SLOT_MUTEX_EXIT(sghsc, slot_num) \ 70*03831d35Sstevel mutex_exit(SGHSC_SLOT_MUTEX(sghsc, slot_num)); 71*03831d35Sstevel 72*03831d35Sstevel /* 73*03831d35Sstevel * Misc definitions 74*03831d35Sstevel */ 75*03831d35Sstevel #define SGHSC_ALL_SLOTS_ENABLE 0x3F 76*03831d35Sstevel #define SGHSC_SLOT_ENABLE 0x01 77*03831d35Sstevel #define SGHSC_ALL_SLOTS_DISABLE 0x02 78*03831d35Sstevel #define SGHSC_SLOT_DISABLE 0x03 79*03831d35Sstevel #define SGHSC_ALL_LEDS_ENABLE 0x3F3F 80*03831d35Sstevel #define SGHSC_LED_ENABLE 0x04 81*03831d35Sstevel #define SGHSC_ALL_LEDS_DISABLE 0x05 82*03831d35Sstevel #define SGHSC_LED_DISABLE 0x06 83*03831d35Sstevel #define SGHSC_LED_BLINKING 0x07 84*03831d35Sstevel #define SGHSC_SLOT_ISOLATE 0x08 85*03831d35Sstevel #define SGHSC_SLOT_POWER 0x09 86*03831d35Sstevel #define SGHSC_LED_ENABLE_MASK 0x0000FFFF 87*03831d35Sstevel #define SGHSC_SAFARI_ID_EVEN 0x3fe 88*03831d35Sstevel 89*03831d35Sstevel 90*03831d35Sstevel /* Individual events definitions */ 91*03831d35Sstevel #define SGHSC_EVENT_CARD_INSERT 0x1 92*03831d35Sstevel #define SGHSC_EVENT_CARD_REMOVE 0x2 93*03831d35Sstevel #define SGHSC_EVENT_LEVER_ACTION 0x3 94*03831d35Sstevel #define SGHSC_EVENT_HEALTHY_LOST 0x4 95*03831d35Sstevel #define SGHSC_EVENT_POWER_ON 0x5 96*03831d35Sstevel #define SGHSC_EVENT_POWER_OFF 0x6 97*03831d35Sstevel 98*03831d35Sstevel /* Slot flags */ 99*03831d35Sstevel #define SGHSC_SLOT_AUTO_CFG_EN 0x1 100*03831d35Sstevel #define SGHSC_SLOT_HEALTHY_LOST 0x2 101*03831d35Sstevel 102*03831d35Sstevel /* LED definitions */ 103*03831d35Sstevel #define SGHSC_POWER_LED 0x10 104*03831d35Sstevel #define SGHSC_FAULT_LED 0x20 105*03831d35Sstevel #define SGHSC_ACTIVE_LED 0x40 106*03831d35Sstevel #define SGHSC_ATTN_LED 0x80 107*03831d35Sstevel 108*03831d35Sstevel /* Ring buffer size, has to be power of 2 */ 109*03831d35Sstevel #define SGHSC_RING_BUFFER_SZ 0x10 110*03831d35Sstevel 111*03831d35Sstevel /* 112*03831d35Sstevel * Per Hot Swappable Slot info 113*03831d35Sstevel */ 114*03831d35Sstevel typedef struct sghsc_slot { 115*03831d35Sstevel 116*03831d35Sstevel /* 117*03831d35Sstevel * Mutex for each slots for state change 118*03831d35Sstevel */ 119*03831d35Sstevel kmutex_t slot_mutex; 120*03831d35Sstevel 121*03831d35Sstevel /* 122*03831d35Sstevel * pathname of bus node 123*03831d35Sstevel */ 124*03831d35Sstevel char nexus_path[MAXPATHLEN]; 125*03831d35Sstevel 126*03831d35Sstevel /* 127*03831d35Sstevel * property, status, cap for each slot 128*03831d35Sstevel */ 129*03831d35Sstevel hpc_slot_info_t slot_info; 130*03831d35Sstevel hpc_slot_state_t slot_status; 131*03831d35Sstevel uint32_t slot_capb; 132*03831d35Sstevel 133*03831d35Sstevel /* 134*03831d35Sstevel * PCI Bus number for each slot 135*03831d35Sstevel */ 136*03831d35Sstevel uint8_t pci_device_num; 137*03831d35Sstevel 138*03831d35Sstevel /* 139*03831d35Sstevel * dynamically allocated hpc_slot_ops_t 140*03831d35Sstevel * and register slot handle 141*03831d35Sstevel */ 142*03831d35Sstevel hpc_slot_ops_t *slot_ops; 143*03831d35Sstevel hpc_slot_t handle; 144*03831d35Sstevel 145*03831d35Sstevel /* 146*03831d35Sstevel * Leds for each slot are not cached 147*03831d35Sstevel */ 148*03831d35Sstevel 149*03831d35Sstevel /* 150*03831d35Sstevel * slot state, flags, board type 151*03831d35Sstevel */ 152*03831d35Sstevel uint32_t flags; 153*03831d35Sstevel uint32_t state; 154*03831d35Sstevel uint32_t board_type; 155*03831d35Sstevel 156*03831d35Sstevel } sghsc_slot_t; 157*03831d35Sstevel 158*03831d35Sstevel /* 159*03831d35Sstevel * Per Serenget CompactPCI HSC instance soft state structure 160*03831d35Sstevel */ 161*03831d35Sstevel typedef struct sghsc { 162*03831d35Sstevel dev_info_t *sghsc_dip; 163*03831d35Sstevel kmutex_t sghsc_mutex; 164*03831d35Sstevel uint32_t sghsc_instance; 165*03831d35Sstevel uint32_t sghsc_board; 166*03831d35Sstevel uint32_t sghsc_node_id; 167*03831d35Sstevel uint32_t sghsc_portid; 168*03831d35Sstevel uint32_t sghsc_num_slots; 169*03831d35Sstevel uint32_t sghsc_valid; 170*03831d35Sstevel sghsc_slot_t *sghsc_slot_table; 171*03831d35Sstevel } sghsc_t; 172*03831d35Sstevel 173*03831d35Sstevel /* 174*03831d35Sstevel * Slot map descriptor (slot to bus segment mapping) 175*03831d35Sstevel */ 176*03831d35Sstevel typedef struct sdesc { 177*03831d35Sstevel uint32_t agent_delta; 178*03831d35Sstevel uint32_t off; 179*03831d35Sstevel uint32_t pcidev; 180*03831d35Sstevel uint32_t slot_type; 181*03831d35Sstevel } sdesc_t; 182*03831d35Sstevel 183*03831d35Sstevel /* 184*03831d35Sstevel * Mailbox related data and structures 185*03831d35Sstevel */ 186*03831d35Sstevel #define CPCI_GET_SLOT_STATUS 0x5000 187*03831d35Sstevel #define CPCI_SET_SLOT_FAULT_LED 0x5001 188*03831d35Sstevel #define CPCI_SET_SLOT_STATUS 0x5002 189*03831d35Sstevel #define CPCI_SET_SLOT_POWER 0x5003 190*03831d35Sstevel #define CPCI_GET_NUM_SLOTS 0x5004 191*03831d35Sstevel #define CPCI_SET_ENUM_CLEARED 0x5005 192*03831d35Sstevel #define CPCI_BOARD_TYPE 0x5006 193*03831d35Sstevel 194*03831d35Sstevel /* 195*03831d35Sstevel * Bit definition for Boat Type 196*03831d35Sstevel */ 197*03831d35Sstevel #define NO_BOARD_TYPE 0 198*03831d35Sstevel #define PCI_BOARD 1 199*03831d35Sstevel #define CPCI_BOARD 2 200*03831d35Sstevel #define SP_CPCI_BOARD 3 201*03831d35Sstevel #define WCI_CPCI_BOARD 4 202*03831d35Sstevel #define WCI_SP_CPCI_BOARD 5 203*03831d35Sstevel 204*03831d35Sstevel /* 205*03831d35Sstevel * Shifts definition for CPCI_GET_SLOT_STATUS 206*03831d35Sstevel */ 207*03831d35Sstevel #define ONE_BIT 1 208*03831d35Sstevel #define TWO_BITS 3 209*03831d35Sstevel #define THREE_BITS 7 210*03831d35Sstevel #define CPCI_STAT_POWER_ON_SHIFT 0 211*03831d35Sstevel #define CPCI_STAT_LED_POWER_SHIFT 1 212*03831d35Sstevel #define CPCI_STAT_LED_FAULT_SHIFT 2 213*03831d35Sstevel #define CPCI_STAT_LED_HP_SHIFT 3 214*03831d35Sstevel #define CPCI_STAT_SLOT_EMPTY_SHIFT 4 215*03831d35Sstevel #define CPCI_STAT_HOT_SWAP_STATUS_SHIFT 5 216*03831d35Sstevel #define CPCI_STAT_HEALTHY_SHIFT 12 /* One bit */ 217*03831d35Sstevel #define CPCI_STAT_RESET_SHIFT 13 /* One bit */ 218*03831d35Sstevel 219*03831d35Sstevel /* 220*03831d35Sstevel * Bit definition for CPCI_SET_SLOT_STATUS 221*03831d35Sstevel */ 222*03831d35Sstevel #define CPCI_SET_STATUS_SLOT_RESET 0x00001 223*03831d35Sstevel #define CPCI_SET_STATUS_SLOT_READY 0x00000 224*03831d35Sstevel /* 225*03831d35Sstevel * Bit definition for CPCI_SET_SLOT_STATUS_FAULT_LED 226*03831d35Sstevel */ 227*03831d35Sstevel #define CPCI_SET_FAULT_LED_OFF 0x00000 228*03831d35Sstevel #define CPCI_SET_FAULT_LED_ON 0x00001 229*03831d35Sstevel #define CPCI_SET_FAULT_LED_KEEP 0x00002 230*03831d35Sstevel #define CPCI_SET_FAULT_LED_TOGGLE 0x00003 231*03831d35Sstevel 232*03831d35Sstevel /* 233*03831d35Sstevel * Bit definition for CPCI_SET_SLOT_POWER 234*03831d35Sstevel */ 235*03831d35Sstevel #define CPCI_POWER_OFF 0x0 236*03831d35Sstevel #define CPCI_POWER_ON 0x1 237*03831d35Sstevel 238*03831d35Sstevel /* 239*03831d35Sstevel * Mailbox timeout 240*03831d35Sstevel */ 241*03831d35Sstevel #define SGHSC_MBX_TIMEOUT 600 242*03831d35Sstevel 243*03831d35Sstevel /* 244*03831d35Sstevel * cPCI command codes (internal) 245*03831d35Sstevel */ 246*03831d35Sstevel #define _SGHSC_CODE ('N' << 16) 247*03831d35Sstevel 248*03831d35Sstevel #define SGHSC_GET_SLOT_STATUS (_SGHSC_CODE | 0x14) 249*03831d35Sstevel #define SGHSC_SET_SLOT_STATUS_RESET (_SGHSC_CODE | 0x15) 250*03831d35Sstevel #define SGHSC_SET_SLOT_STATUS_READY (_SGHSC_CODE | 0x16) 251*03831d35Sstevel #define SGHSC_SET_SLOT_FAULT_LED_ON (_SGHSC_CODE | 0x17) 252*03831d35Sstevel #define SGHSC_SET_SLOT_FAULT_LED_OFF (_SGHSC_CODE | 0x18) 253*03831d35Sstevel #define SGHSC_SET_SLOT_FAULT_LED_KEEP (_SGHSC_CODE | 0x19) 254*03831d35Sstevel #define SGHSC_SET_SLOT_FAULT_LED_TOGGLE (_SGHSC_CODE | 0x1a) 255*03831d35Sstevel #define SGHSC_SET_SLOT_POWER_OFF (_SGHSC_CODE | 0x1b) 256*03831d35Sstevel #define SGHSC_SET_SLOT_POWER_ON (_SGHSC_CODE | 0x1c) 257*03831d35Sstevel #define SGHSC_GET_NUM_SLOTS (_SGHSC_CODE | 0x1d) 258*03831d35Sstevel #define SGHSC_SET_ENUM_CLEARED (_SGHSC_CODE | 0x1e) 259*03831d35Sstevel #define SGHSC_GET_CPCI_BOARD_TYPE (_SGHSC_CODE | 0x1f) 260*03831d35Sstevel 261*03831d35Sstevel typedef struct { 262*03831d35Sstevel uint32_t cmd_id; 263*03831d35Sstevel uint32_t node_id; 264*03831d35Sstevel uint32_t board; 265*03831d35Sstevel uint32_t slot; 266*03831d35Sstevel uint32_t info; 267*03831d35Sstevel } bitcmd_info_t; 268*03831d35Sstevel 269*03831d35Sstevel typedef struct { 270*03831d35Sstevel uint32_t cmd_id; 271*03831d35Sstevel uint32_t result; 272*03831d35Sstevel } bitcmd_resp_t; 273*03831d35Sstevel 274*03831d35Sstevel typedef enum { SGHSC_RB_EMPTY, SGHSC_RB_FLOAT, 275*03831d35Sstevel SGHSC_RB_FULL } sghsc_rb_state_t; 276*03831d35Sstevel 277*03831d35Sstevel typedef struct sghsc_event { 278*03831d35Sstevel int type; 279*03831d35Sstevel int node_id; 280*03831d35Sstevel int board; 281*03831d35Sstevel int slot; 282*03831d35Sstevel int info; 283*03831d35Sstevel } sghsc_event_t; 284*03831d35Sstevel 285*03831d35Sstevel typedef struct sghsc_rb_head { 286*03831d35Sstevel sghsc_event_t *buf; 287*03831d35Sstevel int put_idx; 288*03831d35Sstevel int get_idx; 289*03831d35Sstevel int size; 290*03831d35Sstevel sghsc_rb_state_t state; 291*03831d35Sstevel } sghsc_rb_head_t; 292*03831d35Sstevel 293*03831d35Sstevel #ifdef __cplusplus 294*03831d35Sstevel } 295*03831d35Sstevel #endif 296*03831d35Sstevel 297*03831d35Sstevel #endif /* _SYS_SGHSC_H */ 298