1*7c478bd9Sstevel@tonic-gate /* 2*7c478bd9Sstevel@tonic-gate * CDDL HEADER START 3*7c478bd9Sstevel@tonic-gate * 4*7c478bd9Sstevel@tonic-gate * The contents of this file are subject to the terms of the 5*7c478bd9Sstevel@tonic-gate * Common Development and Distribution License, Version 1.0 only 6*7c478bd9Sstevel@tonic-gate * (the "License"). You may not use this file except in compliance 7*7c478bd9Sstevel@tonic-gate * with the License. 8*7c478bd9Sstevel@tonic-gate * 9*7c478bd9Sstevel@tonic-gate * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE 10*7c478bd9Sstevel@tonic-gate * or http://www.opensolaris.org/os/licensing. 11*7c478bd9Sstevel@tonic-gate * See the License for the specific language governing permissions 12*7c478bd9Sstevel@tonic-gate * and limitations under the License. 13*7c478bd9Sstevel@tonic-gate * 14*7c478bd9Sstevel@tonic-gate * When distributing Covered Code, include this CDDL HEADER in each 15*7c478bd9Sstevel@tonic-gate * file and include the License file at usr/src/OPENSOLARIS.LICENSE. 16*7c478bd9Sstevel@tonic-gate * If applicable, add the following below this CDDL HEADER, with the 17*7c478bd9Sstevel@tonic-gate * fields enclosed by brackets "[]" replaced with your own identifying 18*7c478bd9Sstevel@tonic-gate * information: Portions Copyright [yyyy] [name of copyright owner] 19*7c478bd9Sstevel@tonic-gate * 20*7c478bd9Sstevel@tonic-gate * CDDL HEADER END 21*7c478bd9Sstevel@tonic-gate */ 22*7c478bd9Sstevel@tonic-gate /* 23*7c478bd9Sstevel@tonic-gate * Copyright 2005 Sun Microsystems, Inc. All rights reserved. 24*7c478bd9Sstevel@tonic-gate * Use is subject to license terms. 25*7c478bd9Sstevel@tonic-gate */ 26*7c478bd9Sstevel@tonic-gate 27*7c478bd9Sstevel@tonic-gate #ifndef _SYS_SBDPRIV_H 28*7c478bd9Sstevel@tonic-gate #define _SYS_SBDPRIV_H 29*7c478bd9Sstevel@tonic-gate 30*7c478bd9Sstevel@tonic-gate #pragma ident "%Z%%M% %I% %E% SMI" 31*7c478bd9Sstevel@tonic-gate 32*7c478bd9Sstevel@tonic-gate #ifdef __cplusplus 33*7c478bd9Sstevel@tonic-gate extern "C" { 34*7c478bd9Sstevel@tonic-gate #endif 35*7c478bd9Sstevel@tonic-gate 36*7c478bd9Sstevel@tonic-gate #include <sys/processor.h> 37*7c478bd9Sstevel@tonic-gate #include <sys/obpdefs.h> 38*7c478bd9Sstevel@tonic-gate #include <sys/memlist.h> 39*7c478bd9Sstevel@tonic-gate #include <sys/sbd_ioctl.h> 40*7c478bd9Sstevel@tonic-gate #include <sys/mem_config.h> 41*7c478bd9Sstevel@tonic-gate #include <sys/sbd.h> 42*7c478bd9Sstevel@tonic-gate #ifdef DEBUG 43*7c478bd9Sstevel@tonic-gate #include <sys/promif.h> 44*7c478bd9Sstevel@tonic-gate #endif 45*7c478bd9Sstevel@tonic-gate 46*7c478bd9Sstevel@tonic-gate 47*7c478bd9Sstevel@tonic-gate /* 48*7c478bd9Sstevel@tonic-gate * This structure passes the information when the caller requests to 49*7c478bd9Sstevel@tonic-gate * reserve a portion of unconfigured memory. It is also used to release 50*7c478bd9Sstevel@tonic-gate * previously reserved memory 51*7c478bd9Sstevel@tonic-gate */ 52*7c478bd9Sstevel@tonic-gate struct sbd_mres { 53*7c478bd9Sstevel@tonic-gate uint64_t new_base_pa; /* new base addr for physintalled */ 54*7c478bd9Sstevel@tonic-gate uint64_t reserved_pa; /* addr of the reserved mem */ 55*7c478bd9Sstevel@tonic-gate uint64_t size; /* size of the reserved chunk. */ 56*7c478bd9Sstevel@tonic-gate }; 57*7c478bd9Sstevel@tonic-gate 58*7c478bd9Sstevel@tonic-gate int sbd_memory_reserve(dev_info_t *, uint64_t, struct sbd_mres *); 59*7c478bd9Sstevel@tonic-gate int sbd_memory_release(dev_info_t *, uint64_t, struct sbd_mres *); 60*7c478bd9Sstevel@tonic-gate 61*7c478bd9Sstevel@tonic-gate /* This error type is used inside sbd only */ 62*7c478bd9Sstevel@tonic-gate typedef struct { 63*7c478bd9Sstevel@tonic-gate int e_errno; 64*7c478bd9Sstevel@tonic-gate int e_code; 65*7c478bd9Sstevel@tonic-gate char e_rsc[MAXPATHLEN]; 66*7c478bd9Sstevel@tonic-gate } sbderror_t; 67*7c478bd9Sstevel@tonic-gate 68*7c478bd9Sstevel@tonic-gate #include <sys/sbd.h> 69*7c478bd9Sstevel@tonic-gate #include <sys/sbd_error.h> 70*7c478bd9Sstevel@tonic-gate 71*7c478bd9Sstevel@tonic-gate typedef enum { 72*7c478bd9Sstevel@tonic-gate SBD_STATE_EMPTY = 0, 73*7c478bd9Sstevel@tonic-gate SBD_STATE_OCCUPIED, 74*7c478bd9Sstevel@tonic-gate SBD_STATE_CONNECTED, 75*7c478bd9Sstevel@tonic-gate SBD_STATE_UNCONFIGURED, 76*7c478bd9Sstevel@tonic-gate SBD_STATE_PARTIAL, 77*7c478bd9Sstevel@tonic-gate SBD_STATE_CONFIGURED, 78*7c478bd9Sstevel@tonic-gate SBD_STATE_RELEASE, 79*7c478bd9Sstevel@tonic-gate SBD_STATE_UNREFERENCED, 80*7c478bd9Sstevel@tonic-gate SBD_STATE_FATAL, 81*7c478bd9Sstevel@tonic-gate SBD_STATE_MAX 82*7c478bd9Sstevel@tonic-gate } sbd_istate_t; 83*7c478bd9Sstevel@tonic-gate 84*7c478bd9Sstevel@tonic-gate typedef struct { 85*7c478bd9Sstevel@tonic-gate sbderror_t *errp; 86*7c478bd9Sstevel@tonic-gate sbd_flags_t flags; 87*7c478bd9Sstevel@tonic-gate } sbd_treeinfo_t; 88*7c478bd9Sstevel@tonic-gate 89*7c478bd9Sstevel@tonic-gate /* 90*7c478bd9Sstevel@tonic-gate * generic flags (sbd_handle.h_flags) 91*7c478bd9Sstevel@tonic-gate */ 92*7c478bd9Sstevel@tonic-gate #define SBD_FLAG_DEVI_FORCE 0x00000001 93*7c478bd9Sstevel@tonic-gate 94*7c478bd9Sstevel@tonic-gate /* mirror of SBD_FLAG_FORCE from sbd_ioctl.h */ 95*7c478bd9Sstevel@tonic-gate #define SBD_IOCTL_FLAG_FORCE 0x00000004 96*7c478bd9Sstevel@tonic-gate 97*7c478bd9Sstevel@tonic-gate #define SBD_USER_FLAG_MASK 0x0000ffff 98*7c478bd9Sstevel@tonic-gate 99*7c478bd9Sstevel@tonic-gate #define SBD_KERN_FLAG_MASK 0xffff0000 /* no flags in use */ 100*7c478bd9Sstevel@tonic-gate 101*7c478bd9Sstevel@tonic-gate /* 102*7c478bd9Sstevel@tonic-gate * Translation macros for sbd->sbdp flags 103*7c478bd9Sstevel@tonic-gate */ 104*7c478bd9Sstevel@tonic-gate #define SBD_2_SBDP_FLAGS(f) (((f) & SBD_IOCTL_FLAG_FORCE) ? \ 105*7c478bd9Sstevel@tonic-gate SBDP_IOCTL_FLAG_FORCE : 0) 106*7c478bd9Sstevel@tonic-gate 107*7c478bd9Sstevel@tonic-gate typedef struct sbd_handle { 108*7c478bd9Sstevel@tonic-gate void *h_sbd; 109*7c478bd9Sstevel@tonic-gate sbderror_t *h_err; 110*7c478bd9Sstevel@tonic-gate dev_t h_dev; /* dev_t of opened device */ 111*7c478bd9Sstevel@tonic-gate int h_cmd; /* ioctl argument */ 112*7c478bd9Sstevel@tonic-gate int h_mode; /* device open mode */ 113*7c478bd9Sstevel@tonic-gate sbd_flags_t h_flags; 114*7c478bd9Sstevel@tonic-gate sbd_ioctl_arg_t *h_iap; /* points to kernel copy of ioargs */ 115*7c478bd9Sstevel@tonic-gate sbdp_opts_t h_opts; /* points to the platform options */ 116*7c478bd9Sstevel@tonic-gate } sbd_handle_t; 117*7c478bd9Sstevel@tonic-gate 118*7c478bd9Sstevel@tonic-gate #define SBD_HD2ERR(hd) ((hd)->h_err) 119*7c478bd9Sstevel@tonic-gate #define SBD_GET_ERR(ep) ((ep)->e_code) 120*7c478bd9Sstevel@tonic-gate #define SBD_SET_ERR(ep, ec) ((ep)->e_code = (ec)) 121*7c478bd9Sstevel@tonic-gate #define SBD_GET_ERRNO(ep) ((ep)->e_errno) 122*7c478bd9Sstevel@tonic-gate #define SBD_SET_ERRNO(ep, en) ((ep)->e_errno = (en)) 123*7c478bd9Sstevel@tonic-gate #define SBD_GET_ERRSTR(ep) ((ep)->e_rsc) 124*7c478bd9Sstevel@tonic-gate 125*7c478bd9Sstevel@tonic-gate #define SBD_SET_ERRSTR(ep, es) \ 126*7c478bd9Sstevel@tonic-gate { \ 127*7c478bd9Sstevel@tonic-gate if ((es) && (*(es) != '\0')) \ 128*7c478bd9Sstevel@tonic-gate (void) strncpy((ep)->e_rsc, (es), MAXPATHLEN); \ 129*7c478bd9Sstevel@tonic-gate } 130*7c478bd9Sstevel@tonic-gate 131*7c478bd9Sstevel@tonic-gate #define SBD_SET_IOCTL_ERR(ierr, code, rsc) \ 132*7c478bd9Sstevel@tonic-gate { \ 133*7c478bd9Sstevel@tonic-gate (ierr)->e_code = (int)(code); \ 134*7c478bd9Sstevel@tonic-gate if ((rsc) && (*(rsc) != '\0')) \ 135*7c478bd9Sstevel@tonic-gate bcopy((caddr_t)(rsc), \ 136*7c478bd9Sstevel@tonic-gate (caddr_t)(ierr)->e_rsc, \ 137*7c478bd9Sstevel@tonic-gate sizeof ((ierr)->e_rsc)); \ 138*7c478bd9Sstevel@tonic-gate } 139*7c478bd9Sstevel@tonic-gate 140*7c478bd9Sstevel@tonic-gate #define SBD_FREE_ERR(ep) \ 141*7c478bd9Sstevel@tonic-gate ((ep)->e_rsc[0] = '\0') 142*7c478bd9Sstevel@tonic-gate 143*7c478bd9Sstevel@tonic-gate #define SBD_GET_PERR(spe, ep) \ 144*7c478bd9Sstevel@tonic-gate (ep)->e_errno = EIO; \ 145*7c478bd9Sstevel@tonic-gate (ep)->e_code = (spe)->e_code; \ 146*7c478bd9Sstevel@tonic-gate if (*((spe)->e_rsc) != '\0') \ 147*7c478bd9Sstevel@tonic-gate bcopy((caddr_t)((spe)->e_rsc), \ 148*7c478bd9Sstevel@tonic-gate (caddr_t)((ep))->e_rsc, \ 149*7c478bd9Sstevel@tonic-gate sizeof (((ep))->e_rsc)); 150*7c478bd9Sstevel@tonic-gate 151*7c478bd9Sstevel@tonic-gate /* 152*7c478bd9Sstevel@tonic-gate * dev_t is shared by PIM and PSM layers. 153*7c478bd9Sstevel@tonic-gate * 154*7c478bd9Sstevel@tonic-gate * Format = 31......16,15.......0 155*7c478bd9Sstevel@tonic-gate * | PIM | PSM | 156*7c478bd9Sstevel@tonic-gate */ 157*7c478bd9Sstevel@tonic-gate #define _SBD_DEVPIM_SHIFT 16 158*7c478bd9Sstevel@tonic-gate #define _SBD_DEVPIM_MASK 0xffff 159*7c478bd9Sstevel@tonic-gate #define _SBD_DEVPSM_MASK 0xffff 160*7c478bd9Sstevel@tonic-gate 161*7c478bd9Sstevel@tonic-gate #define SBD_GET_MINOR2INST(d) (((d) >> _SBD_DEVPIM_SHIFT) & _SBD_DEVPIM_MASK) 162*7c478bd9Sstevel@tonic-gate #define SBD_MAKE_MINOR(i, m) \ 163*7c478bd9Sstevel@tonic-gate ((((i) & _SBD_DEVPIM_MASK) << _SBD_DEVPIM_SHIFT) | \ 164*7c478bd9Sstevel@tonic-gate ((m) & _SBD_DEVPSM_MASK)) 165*7c478bd9Sstevel@tonic-gate 166*7c478bd9Sstevel@tonic-gate #define GETSTRUCT(t, n) \ 167*7c478bd9Sstevel@tonic-gate ((t *)kmem_zalloc((size_t)(n) * sizeof (t), KM_SLEEP)) 168*7c478bd9Sstevel@tonic-gate #define FREESTRUCT(p, t, n) \ 169*7c478bd9Sstevel@tonic-gate (kmem_free((caddr_t)(p), sizeof (t) * (size_t)(n))) 170*7c478bd9Sstevel@tonic-gate 171*7c478bd9Sstevel@tonic-gate #define GET_SOFTC(i) ddi_get_soft_state(sbd_g.softsp, (i)) 172*7c478bd9Sstevel@tonic-gate #define ALLOC_SOFTC(i) ddi_soft_state_zalloc(sbd_g.softsp, (i)) 173*7c478bd9Sstevel@tonic-gate #define FREE_SOFTC(i) ddi_soft_state_free(sbd_g.softsp, (i)) 174*7c478bd9Sstevel@tonic-gate 175*7c478bd9Sstevel@tonic-gate /* 176*7c478bd9Sstevel@tonic-gate * Per instance soft-state structure. 177*7c478bd9Sstevel@tonic-gate */ 178*7c478bd9Sstevel@tonic-gate typedef struct sbd_softstate { 179*7c478bd9Sstevel@tonic-gate void *sbd_boardlist; 180*7c478bd9Sstevel@tonic-gate int max_boards; 181*7c478bd9Sstevel@tonic-gate int wnode; 182*7c478bd9Sstevel@tonic-gate } sbd_softstate_t; 183*7c478bd9Sstevel@tonic-gate 184*7c478bd9Sstevel@tonic-gate /* 185*7c478bd9Sstevel@tonic-gate * dr Global data elements 186*7c478bd9Sstevel@tonic-gate */ 187*7c478bd9Sstevel@tonic-gate typedef struct { 188*7c478bd9Sstevel@tonic-gate sbd_softstate_t *softsp; /* pointer to initialize soft state */ 189*7c478bd9Sstevel@tonic-gate } sbd_global; 190*7c478bd9Sstevel@tonic-gate 191*7c478bd9Sstevel@tonic-gate typedef struct { 192*7c478bd9Sstevel@tonic-gate sbderror_t dv_error; 193*7c478bd9Sstevel@tonic-gate dev_info_t *dv_dip; 194*7c478bd9Sstevel@tonic-gate } sbd_devlist_t; 195*7c478bd9Sstevel@tonic-gate 196*7c478bd9Sstevel@tonic-gate extern int plat_max_io_units_per_board(); 197*7c478bd9Sstevel@tonic-gate extern int plat_max_cmp_units_per_board(); 198*7c478bd9Sstevel@tonic-gate extern int plat_max_cpu_units_per_board(); 199*7c478bd9Sstevel@tonic-gate extern int plat_max_mem_units_per_board(); 200*7c478bd9Sstevel@tonic-gate #define MAX_IO_UNITS_PER_BOARD plat_max_io_units_per_board() 201*7c478bd9Sstevel@tonic-gate #define MAX_CMP_UNITS_PER_BOARD plat_max_cmp_units_per_board() 202*7c478bd9Sstevel@tonic-gate #define MAX_CPU_UNITS_PER_BOARD plat_max_cpu_units_per_board() 203*7c478bd9Sstevel@tonic-gate #define MAX_MEM_UNITS_PER_BOARD plat_max_mem_units_per_board() 204*7c478bd9Sstevel@tonic-gate #define SBD_MAX_UNITS_PER_BOARD 8 205*7c478bd9Sstevel@tonic-gate /* If any of the max units exceeds 5, this must be adjusted */ 206*7c478bd9Sstevel@tonic-gate 207*7c478bd9Sstevel@tonic-gate #define SBD_MAX_INSTANCES 16 208*7c478bd9Sstevel@tonic-gate 209*7c478bd9Sstevel@tonic-gate #define SBD_NUM_STATES ((int)SBD_STATE_MAX) 210*7c478bd9Sstevel@tonic-gate 211*7c478bd9Sstevel@tonic-gate #ifdef DEBUG 212*7c478bd9Sstevel@tonic-gate #define SBD_DEVICE_TRANSITION(sb, nt, un, st) \ 213*7c478bd9Sstevel@tonic-gate { \ 214*7c478bd9Sstevel@tonic-gate int _ostate, _nstate; \ 215*7c478bd9Sstevel@tonic-gate _ostate = (int)((sb)->sb_dev[NIX(nt)][un].u_common.sbdev_state); \ 216*7c478bd9Sstevel@tonic-gate _nstate = (int)(st); \ 217*7c478bd9Sstevel@tonic-gate PR_STATE("BOARD %d (%s.%d) STATE: %s(%d) -> %s(%d)\n", \ 218*7c478bd9Sstevel@tonic-gate (sb)->sb_num, \ 219*7c478bd9Sstevel@tonic-gate sbd_ct_str[nt], (un), \ 220*7c478bd9Sstevel@tonic-gate sbd_state_str[_ostate], _ostate, \ 221*7c478bd9Sstevel@tonic-gate sbd_state_str[_nstate], _nstate); \ 222*7c478bd9Sstevel@tonic-gate (void) drv_getparm(TIME, \ 223*7c478bd9Sstevel@tonic-gate (void *)&(sb)->sb_dev[NIX(nt)][un].u_common.sbdev_time); \ 224*7c478bd9Sstevel@tonic-gate (sb)->sb_dev[NIX(nt)][un].u_common.sbdev_state = (st); \ 225*7c478bd9Sstevel@tonic-gate (sb)->sb_dev[NIX(nt)][un].u_common.sbdev_ostate = ostate_cvt(st); \ 226*7c478bd9Sstevel@tonic-gate send_event = 1; \ 227*7c478bd9Sstevel@tonic-gate } 228*7c478bd9Sstevel@tonic-gate #define SBD_BOARD_TRANSITION(sb, st) \ 229*7c478bd9Sstevel@tonic-gate { \ 230*7c478bd9Sstevel@tonic-gate PR_STATE("BOARD %d STATE: %s(%d) -> %s(%d)\n", \ 231*7c478bd9Sstevel@tonic-gate (sb)->sb_num, \ 232*7c478bd9Sstevel@tonic-gate sbd_state_str[(int)(sb)->sb_state], (int)(sb)->sb_state, \ 233*7c478bd9Sstevel@tonic-gate sbd_state_str[(int)(st)], (int)(st)); \ 234*7c478bd9Sstevel@tonic-gate (sb)->sb_pstate = (sb)->sb_state; \ 235*7c478bd9Sstevel@tonic-gate (sb)->sb_state = (st); \ 236*7c478bd9Sstevel@tonic-gate send_event = 1; \ 237*7c478bd9Sstevel@tonic-gate } 238*7c478bd9Sstevel@tonic-gate #else /* DEBUG */ 239*7c478bd9Sstevel@tonic-gate #define SBD_DEVICE_TRANSITION(sb, nt, un, st) \ 240*7c478bd9Sstevel@tonic-gate { \ 241*7c478bd9Sstevel@tonic-gate (sb)->sb_dev[NIX(nt)][un].u_common.sbdev_state = (st); \ 242*7c478bd9Sstevel@tonic-gate (sb)->sb_dev[NIX(nt)][un].u_common.sbdev_ostate = ostate_cvt(st); \ 243*7c478bd9Sstevel@tonic-gate (void) drv_getparm(TIME, \ 244*7c478bd9Sstevel@tonic-gate (void *)&(sb)->sb_dev[NIX(nt)][un].u_common.sbdev_time); \ 245*7c478bd9Sstevel@tonic-gate send_event = 1; \ 246*7c478bd9Sstevel@tonic-gate } 247*7c478bd9Sstevel@tonic-gate #define SBD_BOARD_TRANSITION(sb, st) \ 248*7c478bd9Sstevel@tonic-gate ((sb)->sb_pstate = (sb)->sb_state, (sb)->sb_state = (st), \ 249*7c478bd9Sstevel@tonic-gate send_event = 1) 250*7c478bd9Sstevel@tonic-gate #endif /* DEBUG */ 251*7c478bd9Sstevel@tonic-gate 252*7c478bd9Sstevel@tonic-gate #define SBD_DEVICE_STATE(sb, nt, un) \ 253*7c478bd9Sstevel@tonic-gate ((sb)->sb_dev[NIX(nt)][un].u_common.sbdev_state) 254*7c478bd9Sstevel@tonic-gate #define SBD_BOARD_STATE(sb) \ 255*7c478bd9Sstevel@tonic-gate ((sb)->sb_state) 256*7c478bd9Sstevel@tonic-gate #define SBD_BOARD_PSTATE(sb) \ 257*7c478bd9Sstevel@tonic-gate ((sb)->sb_pstate) 258*7c478bd9Sstevel@tonic-gate 259*7c478bd9Sstevel@tonic-gate typedef uint32_t sbd_devset_t; 260*7c478bd9Sstevel@tonic-gate 261*7c478bd9Sstevel@tonic-gate /* 262*7c478bd9Sstevel@tonic-gate * sbd_priv_handle_t MUST appear first. 263*7c478bd9Sstevel@tonic-gate */ 264*7c478bd9Sstevel@tonic-gate typedef struct sbd_priv_handle { 265*7c478bd9Sstevel@tonic-gate sbd_handle_t sh_handle; 266*7c478bd9Sstevel@tonic-gate void *sh_arg; /* raw ioctl arg */ 267*7c478bd9Sstevel@tonic-gate sbd_devset_t sh_devset; /* based on h_dev */ 268*7c478bd9Sstevel@tonic-gate sbd_devset_t sh_orig_devset; /* what client requested */ 269*7c478bd9Sstevel@tonic-gate sbderror_t sh_err; 270*7c478bd9Sstevel@tonic-gate struct sbd_priv_handle *sh_next; 271*7c478bd9Sstevel@tonic-gate } sbd_priv_handle_t; 272*7c478bd9Sstevel@tonic-gate 273*7c478bd9Sstevel@tonic-gate #define SBD_MAXNUM_NT 3 274*7c478bd9Sstevel@tonic-gate #define NIX(t) (((t) == SBD_COMP_CPU) ? 0 : \ 275*7c478bd9Sstevel@tonic-gate ((t) == SBD_COMP_MEM) ? 1 : \ 276*7c478bd9Sstevel@tonic-gate ((t) == SBD_COMP_IO) ? 2 : \ 277*7c478bd9Sstevel@tonic-gate ((t) == SBD_COMP_CMP) ? 0 : SBD_MAXNUM_NT) 278*7c478bd9Sstevel@tonic-gate 279*7c478bd9Sstevel@tonic-gate #define SBD_NUM_MC_PER_BOARD 4 280*7c478bd9Sstevel@tonic-gate 281*7c478bd9Sstevel@tonic-gate 282*7c478bd9Sstevel@tonic-gate typedef struct sbd_common_unit { 283*7c478bd9Sstevel@tonic-gate sbd_istate_t sbdev_state; 284*7c478bd9Sstevel@tonic-gate sbd_cond_t sbdev_cond; 285*7c478bd9Sstevel@tonic-gate sbd_state_t sbdev_ostate; 286*7c478bd9Sstevel@tonic-gate time_t sbdev_time; 287*7c478bd9Sstevel@tonic-gate int sbdev_busy; 288*7c478bd9Sstevel@tonic-gate void *sbdev_sbp; 289*7c478bd9Sstevel@tonic-gate int sbdev_unum; 290*7c478bd9Sstevel@tonic-gate sbd_comp_type_t sbdev_type; 291*7c478bd9Sstevel@tonic-gate dev_info_t *sbdev_dip; 292*7c478bd9Sstevel@tonic-gate } sbd_common_unit_t; 293*7c478bd9Sstevel@tonic-gate 294*7c478bd9Sstevel@tonic-gate typedef struct sbd_mem_unit { 295*7c478bd9Sstevel@tonic-gate sbd_common_unit_t sbm_cm; 296*7c478bd9Sstevel@tonic-gate sbd_istate_t sbm_state; /* mem-unit state */ 297*7c478bd9Sstevel@tonic-gate uint_t sbm_flags; 298*7c478bd9Sstevel@tonic-gate pfn_t sbm_basepfn; 299*7c478bd9Sstevel@tonic-gate pgcnt_t sbm_npages; 300*7c478bd9Sstevel@tonic-gate pgcnt_t sbm_pageslost; 301*7c478bd9Sstevel@tonic-gate /* 302*7c478bd9Sstevel@tonic-gate * The following fields are used during 303*7c478bd9Sstevel@tonic-gate * the memory detach process only. sbm_mlist 304*7c478bd9Sstevel@tonic-gate * will be used to store the board memlist 305*7c478bd9Sstevel@tonic-gate * following a detach. The memlist will be 306*7c478bd9Sstevel@tonic-gate * used to re-attach the board when configuring 307*7c478bd9Sstevel@tonic-gate * the unit directly after an unconfigure. 308*7c478bd9Sstevel@tonic-gate */ 309*7c478bd9Sstevel@tonic-gate struct sbd_mem_unit *sbm_peer; 310*7c478bd9Sstevel@tonic-gate struct memlist *sbm_mlist; 311*7c478bd9Sstevel@tonic-gate struct memlist *sbm_del_mlist; 312*7c478bd9Sstevel@tonic-gate memhandle_t sbm_memhandle; 313*7c478bd9Sstevel@tonic-gate pfn_t sbm_alignment_mask; 314*7c478bd9Sstevel@tonic-gate pfn_t sbm_slice_offset; 315*7c478bd9Sstevel@tonic-gate /* 316*7c478bd9Sstevel@tonic-gate * The following field is used to support the 317*7c478bd9Sstevel@tonic-gate * representation of all memory controllers on 318*7c478bd9Sstevel@tonic-gate * a board with one sbd_mem_unit_t. 319*7c478bd9Sstevel@tonic-gate */ 320*7c478bd9Sstevel@tonic-gate dev_info_t *sbm_dip[SBD_NUM_MC_PER_BOARD]; 321*7c478bd9Sstevel@tonic-gate /* 322*7c478bd9Sstevel@tonic-gate * The following field determines if the memory on this board 323*7c478bd9Sstevel@tonic-gate * is part of an interleave across boards 324*7c478bd9Sstevel@tonic-gate */ 325*7c478bd9Sstevel@tonic-gate int sbm_interleave; 326*7c478bd9Sstevel@tonic-gate } sbd_mem_unit_t; 327*7c478bd9Sstevel@tonic-gate 328*7c478bd9Sstevel@tonic-gate /* 329*7c478bd9Sstevel@tonic-gate * Currently only maintain state information for individual 330*7c478bd9Sstevel@tonic-gate * components. 331*7c478bd9Sstevel@tonic-gate */ 332*7c478bd9Sstevel@tonic-gate typedef struct sbd_cpu_unit { 333*7c478bd9Sstevel@tonic-gate sbd_common_unit_t sbc_cm; /* cpu-unit state */ 334*7c478bd9Sstevel@tonic-gate processorid_t sbc_cpu_id; 335*7c478bd9Sstevel@tonic-gate cpu_flag_t sbc_cpu_flags; 336*7c478bd9Sstevel@tonic-gate ushort_t sbc_pad1; 337*7c478bd9Sstevel@tonic-gate int sbc_cpu_impl; 338*7c478bd9Sstevel@tonic-gate int sbc_speed; 339*7c478bd9Sstevel@tonic-gate int sbc_ecache; 340*7c478bd9Sstevel@tonic-gate } sbd_cpu_unit_t; 341*7c478bd9Sstevel@tonic-gate 342*7c478bd9Sstevel@tonic-gate typedef struct sbd_io_unit { 343*7c478bd9Sstevel@tonic-gate sbd_common_unit_t sbi_cm; /* io-unit state */ 344*7c478bd9Sstevel@tonic-gate } sbd_io_unit_t; 345*7c478bd9Sstevel@tonic-gate 346*7c478bd9Sstevel@tonic-gate typedef union { 347*7c478bd9Sstevel@tonic-gate sbd_common_unit_t u_common; 348*7c478bd9Sstevel@tonic-gate sbd_mem_unit_t _mu; 349*7c478bd9Sstevel@tonic-gate sbd_cpu_unit_t _cu; 350*7c478bd9Sstevel@tonic-gate sbd_io_unit_t _iu; 351*7c478bd9Sstevel@tonic-gate } sbd_dev_unit_t; 352*7c478bd9Sstevel@tonic-gate 353*7c478bd9Sstevel@tonic-gate typedef struct { 354*7c478bd9Sstevel@tonic-gate sbd_priv_handle_t *sb_handle; 355*7c478bd9Sstevel@tonic-gate int sb_ref; /* # of handle references */ 356*7c478bd9Sstevel@tonic-gate int sb_num; /* board number */ 357*7c478bd9Sstevel@tonic-gate void *sb_softsp; /* pointer to soft state */ 358*7c478bd9Sstevel@tonic-gate dev_info_t *sb_topdip; /* top devinfo of instance */ 359*7c478bd9Sstevel@tonic-gate sbd_istate_t sb_state; /* (current) board state */ 360*7c478bd9Sstevel@tonic-gate sbd_istate_t sb_pstate; /* previous board state */ 361*7c478bd9Sstevel@tonic-gate sbd_cond_t sb_cond; /* condition */ 362*7c478bd9Sstevel@tonic-gate sbd_state_t sb_rstate; /* receptacle state */ 363*7c478bd9Sstevel@tonic-gate sbd_state_t sb_ostate; /* occupant state */ 364*7c478bd9Sstevel@tonic-gate /* 365*7c478bd9Sstevel@tonic-gate * 0=CPU, 1=MEM, 2=IO, 3=NULL 366*7c478bd9Sstevel@tonic-gate */ 367*7c478bd9Sstevel@tonic-gate dev_info_t **sb_devlist[SBD_MAXNUM_NT + 1]; 368*7c478bd9Sstevel@tonic-gate 369*7c478bd9Sstevel@tonic-gate sbd_devset_t sb_dev_present; /* present mask */ 370*7c478bd9Sstevel@tonic-gate sbd_devset_t sb_dev_attached; /* attached mask */ 371*7c478bd9Sstevel@tonic-gate sbd_devset_t sb_dev_released; /* released mask */ 372*7c478bd9Sstevel@tonic-gate sbd_devset_t sb_dev_unreferenced; /* unreferenced mask */ 373*7c478bd9Sstevel@tonic-gate sbd_dev_unit_t *sb_dev[SBD_MAXNUM_NT]; 374*7c478bd9Sstevel@tonic-gate 375*7c478bd9Sstevel@tonic-gate char *sb_cpupath[SBD_MAX_UNITS_PER_BOARD]; 376*7c478bd9Sstevel@tonic-gate char *sb_mempath[SBD_MAX_UNITS_PER_BOARD]; 377*7c478bd9Sstevel@tonic-gate char *sb_iopath[SBD_MAX_UNITS_PER_BOARD]; 378*7c478bd9Sstevel@tonic-gate 379*7c478bd9Sstevel@tonic-gate int sb_ndev; /* number of devs */ 380*7c478bd9Sstevel@tonic-gate int sb_errno; /* store errno */ 381*7c478bd9Sstevel@tonic-gate int sb_busy; /* drain in progress */ 382*7c478bd9Sstevel@tonic-gate int sb_assigned; 383*7c478bd9Sstevel@tonic-gate int sb_flags; 384*7c478bd9Sstevel@tonic-gate kmutex_t sb_flags_mutex; /* mutex to protect flags */ 385*7c478bd9Sstevel@tonic-gate int sb_wnode; 386*7c478bd9Sstevel@tonic-gate int sb_memaccess_ok; 387*7c478bd9Sstevel@tonic-gate sbd_stat_t sb_stat; /* cached board status */ 388*7c478bd9Sstevel@tonic-gate processorid_t sb_cpuid; /* for starfire connect */ 389*7c478bd9Sstevel@tonic-gate time_t sb_time; /* time of last board op */ 390*7c478bd9Sstevel@tonic-gate kmutex_t sb_mutex; 391*7c478bd9Sstevel@tonic-gate kmutex_t sb_slock; /* status - unconfig, discon */ 392*7c478bd9Sstevel@tonic-gate } sbd_board_t; 393*7c478bd9Sstevel@tonic-gate 394*7c478bd9Sstevel@tonic-gate /* definitions for sb_flags */ 395*7c478bd9Sstevel@tonic-gate #define SBD_BOARD_STATUS_CACHED 1 396*7c478bd9Sstevel@tonic-gate 397*7c478bd9Sstevel@tonic-gate #define SBD_GET_BOARD_MEMUNIT(sb, un) \ 398*7c478bd9Sstevel@tonic-gate (&((sb)->sb_dev[NIX(SBD_COMP_MEM)][un]._mu)) 399*7c478bd9Sstevel@tonic-gate #define SBD_GET_BOARD_CPUUNIT(sb, un) \ 400*7c478bd9Sstevel@tonic-gate (&((sb)->sb_dev[NIX(SBD_COMP_CPU)][un]._cu)) 401*7c478bd9Sstevel@tonic-gate #define SBD_GET_BOARD_IOUNIT(sb, un) \ 402*7c478bd9Sstevel@tonic-gate (&((sb)->sb_dev[NIX(SBD_COMP_IO)][un]._iu)) 403*7c478bd9Sstevel@tonic-gate 404*7c478bd9Sstevel@tonic-gate typedef ushort_t boardset_t; /* assumes 16 boards max */ 405*7c478bd9Sstevel@tonic-gate 406*7c478bd9Sstevel@tonic-gate #define BOARDSET(b) ((boardset_t)(1 << (b))) 407*7c478bd9Sstevel@tonic-gate #define BOARD_IN_SET(bs, b) (((bs) & BOARDSET(b)) != 0) 408*7c478bd9Sstevel@tonic-gate #define BOARD_ADD(bs, b) ((bs) |= BOARDSET(b)) 409*7c478bd9Sstevel@tonic-gate #define BOARD_DEL(bs, b) ((bs) &= ~BOARDSET(b)) 410*7c478bd9Sstevel@tonic-gate 411*7c478bd9Sstevel@tonic-gate /* 412*7c478bd9Sstevel@tonic-gate * Format of sbd_devset_t bit masks: 413*7c478bd9Sstevel@tonic-gate * 414*7c478bd9Sstevel@tonic-gate * 32 16 8 4 0 415*7c478bd9Sstevel@tonic-gate * |....|....|...I|IIII|....|...M|CCCC|CCCC| 416*7c478bd9Sstevel@tonic-gate * 1 = indicates respective component present/attached. 417*7c478bd9Sstevel@tonic-gate * I = I/O, M = Memory, C = CPU. 418*7c478bd9Sstevel@tonic-gate */ 419*7c478bd9Sstevel@tonic-gate #define DEVSET_ANYUNIT (-1) 420*7c478bd9Sstevel@tonic-gate #define _NT2DEVPOS(t, u) ((NIX(t) << 3) + (u)) 421*7c478bd9Sstevel@tonic-gate #define _DEVSET_MASK 0x001f01ff 422*7c478bd9Sstevel@tonic-gate #define _CMP_DEVSET_MASK 0x11 423*7c478bd9Sstevel@tonic-gate #define DEVSET(t, u) \ 424*7c478bd9Sstevel@tonic-gate (((u) == DEVSET_ANYUNIT) ? \ 425*7c478bd9Sstevel@tonic-gate (sbd_devset_t)((0xff << _NT2DEVPOS((t), 0)) & _DEVSET_MASK) : \ 426*7c478bd9Sstevel@tonic-gate (((t) == SBD_COMP_CMP) ? \ 427*7c478bd9Sstevel@tonic-gate (sbd_devset_t)(_CMP_DEVSET_MASK << _NT2DEVPOS((t), (u))) : \ 428*7c478bd9Sstevel@tonic-gate (sbd_devset_t)(1 << _NT2DEVPOS((t), (u))))) 429*7c478bd9Sstevel@tonic-gate 430*7c478bd9Sstevel@tonic-gate #define DEVSET_IN_SET(ds, t, u) (((ds) & DEVSET((t), (u))) != 0) 431*7c478bd9Sstevel@tonic-gate #define DEVSET_ADD(ds, t, u) ((ds) |= DEVSET((t), (u))) 432*7c478bd9Sstevel@tonic-gate #define DEVSET_DEL(ds, t, u) ((ds) &= ~DEVSET((t), (u))) 433*7c478bd9Sstevel@tonic-gate #define DEVSET_GET_UNITSET(ds, t) \ 434*7c478bd9Sstevel@tonic-gate (((ds) & DEVSET((t), DEVSET_ANYUNIT)) >> _NT2DEVPOS((t), 0)) 435*7c478bd9Sstevel@tonic-gate /* 436*7c478bd9Sstevel@tonic-gate * Ops for sbd_board_t.sb_dev_present 437*7c478bd9Sstevel@tonic-gate */ 438*7c478bd9Sstevel@tonic-gate #define SBD_DEV_IS_PRESENT(bp, nt, un) \ 439*7c478bd9Sstevel@tonic-gate DEVSET_IN_SET((bp)->sb_dev_present, (nt), (un)) 440*7c478bd9Sstevel@tonic-gate #define SBD_DEV_SET_PRESENT(bp, nt, un) \ 441*7c478bd9Sstevel@tonic-gate DEVSET_ADD((bp)->sb_dev_present, (nt), (un)) 442*7c478bd9Sstevel@tonic-gate #define SBD_DEV_CLR_PRESENT(bp, nt, un) \ 443*7c478bd9Sstevel@tonic-gate DEVSET_DEL((bp)->sb_dev_present, (nt), (un)) 444*7c478bd9Sstevel@tonic-gate /* 445*7c478bd9Sstevel@tonic-gate * Ops for sbd_board_t.sb_dev_attached 446*7c478bd9Sstevel@tonic-gate */ 447*7c478bd9Sstevel@tonic-gate #define SBD_DEV_IS_ATTACHED(bp, nt, un) \ 448*7c478bd9Sstevel@tonic-gate DEVSET_IN_SET((bp)->sb_dev_attached, (nt), (un)) 449*7c478bd9Sstevel@tonic-gate #define SBD_DEV_SET_ATTACHED(bp, nt, un) \ 450*7c478bd9Sstevel@tonic-gate DEVSET_ADD((bp)->sb_dev_attached, (nt), (un)) 451*7c478bd9Sstevel@tonic-gate #define SBD_DEV_CLR_ATTACHED(bp, nt, un) \ 452*7c478bd9Sstevel@tonic-gate DEVSET_DEL((bp)->sb_dev_attached, (nt), (un)) 453*7c478bd9Sstevel@tonic-gate /* 454*7c478bd9Sstevel@tonic-gate * Ops for sbd_board_t.sb_dev_released 455*7c478bd9Sstevel@tonic-gate */ 456*7c478bd9Sstevel@tonic-gate #define SBD_DEV_IS_RELEASED(bp, nt, un) \ 457*7c478bd9Sstevel@tonic-gate DEVSET_IN_SET((bp)->sb_dev_released, (nt), (un)) 458*7c478bd9Sstevel@tonic-gate #define SBD_DEV_SET_RELEASED(bp, nt, un) \ 459*7c478bd9Sstevel@tonic-gate DEVSET_ADD((bp)->sb_dev_released, (nt), (un)) 460*7c478bd9Sstevel@tonic-gate #define SBD_DEV_CLR_RELEASED(bp, nt, un) \ 461*7c478bd9Sstevel@tonic-gate DEVSET_DEL((bp)->sb_dev_released, (nt), (un)) 462*7c478bd9Sstevel@tonic-gate /* 463*7c478bd9Sstevel@tonic-gate * Ops for sbd_board_t.sb_dev_unreferenced 464*7c478bd9Sstevel@tonic-gate */ 465*7c478bd9Sstevel@tonic-gate #define SBD_DEV_IS_UNREFERENCED(bp, nt, un) \ 466*7c478bd9Sstevel@tonic-gate DEVSET_IN_SET((bp)->sb_dev_unreferenced, (nt), (un)) 467*7c478bd9Sstevel@tonic-gate #define SBD_DEV_SET_UNREFERENCED(bp, nt, un) \ 468*7c478bd9Sstevel@tonic-gate DEVSET_ADD((bp)->sb_dev_unreferenced, (nt), (un)) 469*7c478bd9Sstevel@tonic-gate #define SBD_DEV_CLR_UNREFERENCED(bp, nt, un) \ 470*7c478bd9Sstevel@tonic-gate DEVSET_DEL((bp)->sb_dev_unreferenced, (nt), (un)) 471*7c478bd9Sstevel@tonic-gate 472*7c478bd9Sstevel@tonic-gate #define SBD_DEVS_PRESENT(bp) \ 473*7c478bd9Sstevel@tonic-gate ((bp)->sb_dev_present) 474*7c478bd9Sstevel@tonic-gate #define SBD_DEVS_ATTACHED(bp) \ 475*7c478bd9Sstevel@tonic-gate ((bp)->sb_dev_attached) 476*7c478bd9Sstevel@tonic-gate #define SBD_DEVS_RELEASED(bp) \ 477*7c478bd9Sstevel@tonic-gate ((bp)->sb_dev_released) 478*7c478bd9Sstevel@tonic-gate #define SBD_DEVS_UNREFERENCED(bp) \ 479*7c478bd9Sstevel@tonic-gate ((bp)->sb_dev_unreferenced) 480*7c478bd9Sstevel@tonic-gate #define SBD_DEVS_UNATTACHED(bp) \ 481*7c478bd9Sstevel@tonic-gate ((bp)->sb_dev_present & ~(bp)->sb_dev_attached) 482*7c478bd9Sstevel@tonic-gate #define SBD_DEVS_CONFIGURE(bp, devs) \ 483*7c478bd9Sstevel@tonic-gate ((bp)->sb_dev_attached = (devs)) 484*7c478bd9Sstevel@tonic-gate #define SBD_DEVS_DISCONNECT(bp, devs) \ 485*7c478bd9Sstevel@tonic-gate ((bp)->sb_dev_present &= ~(devs)) 486*7c478bd9Sstevel@tonic-gate #define SBD_DEVS_CANCEL(bp, devs) \ 487*7c478bd9Sstevel@tonic-gate ((bp)->sb_dev_released &= ~(devs), \ 488*7c478bd9Sstevel@tonic-gate (bp)->sb_dev_unreferenced &= ~(devs)) 489*7c478bd9Sstevel@tonic-gate 490*7c478bd9Sstevel@tonic-gate /* 491*7c478bd9Sstevel@tonic-gate * return values from sbd_cancel_cpu 492*7c478bd9Sstevel@tonic-gate */ 493*7c478bd9Sstevel@tonic-gate #define SBD_CPUERR_NONE 0 494*7c478bd9Sstevel@tonic-gate #define SBD_CPUERR_RECOVERABLE -1 495*7c478bd9Sstevel@tonic-gate #define SBD_CPUERR_FATAL -2 496*7c478bd9Sstevel@tonic-gate 497*7c478bd9Sstevel@tonic-gate /* 498*7c478bd9Sstevel@tonic-gate * sbd_board_t.sbmem[].sbm_flags 499*7c478bd9Sstevel@tonic-gate */ 500*7c478bd9Sstevel@tonic-gate #define SBD_MFLAG_RESERVED 0x01 /* mem unit reserved for delete */ 501*7c478bd9Sstevel@tonic-gate #define SBD_MFLAG_SOURCE 0x02 /* source brd of copy/rename op */ 502*7c478bd9Sstevel@tonic-gate #define SBD_MFLAG_TARGET 0x04 /* board selected as target */ 503*7c478bd9Sstevel@tonic-gate #define SBD_MFLAG_MEMUPSIZE 0x08 /* move from big to small board */ 504*7c478bd9Sstevel@tonic-gate #define SBD_MFLAG_MEMDOWNSIZE 0x10 /* move from small to big board */ 505*7c478bd9Sstevel@tonic-gate #define SBD_MFLAG_MEMRESIZE 0x18 /* move to different size board */ 506*7c478bd9Sstevel@tonic-gate #define SBD_MFLAG_RELOWNER 0x20 /* memory release (delete) owner */ 507*7c478bd9Sstevel@tonic-gate #define SBD_MFLAG_RELDONE 0x40 508*7c478bd9Sstevel@tonic-gate 509*7c478bd9Sstevel@tonic-gate typedef struct { 510*7c478bd9Sstevel@tonic-gate int sfio_cmd; 511*7c478bd9Sstevel@tonic-gate void *sfio_arg; 512*7c478bd9Sstevel@tonic-gate } sbd_ioctl_t; 513*7c478bd9Sstevel@tonic-gate 514*7c478bd9Sstevel@tonic-gate /* 515*7c478bd9Sstevel@tonic-gate * 32bit support for sbd_ioctl_t. 516*7c478bd9Sstevel@tonic-gate */ 517*7c478bd9Sstevel@tonic-gate typedef struct { 518*7c478bd9Sstevel@tonic-gate int32_t sfio_cmd; 519*7c478bd9Sstevel@tonic-gate uint32_t sfio_arg; 520*7c478bd9Sstevel@tonic-gate } sbd_ioctl32_t; 521*7c478bd9Sstevel@tonic-gate 522*7c478bd9Sstevel@tonic-gate /* 523*7c478bd9Sstevel@tonic-gate * PSM-DR layers are only allowed to use lower 16 bits of dev_t. 524*7c478bd9Sstevel@tonic-gate * B - bottom 4 bits are for the slot number. 525*7c478bd9Sstevel@tonic-gate * D - device type chosen (0 = indicates all devices in slot). 526*7c478bd9Sstevel@tonic-gate * U - unit number if specific device type chosen. 527*7c478bd9Sstevel@tonic-gate * X - not used. 528*7c478bd9Sstevel@tonic-gate * 529*7c478bd9Sstevel@tonic-gate * Upper Lower 530*7c478bd9Sstevel@tonic-gate * XXXXUUUUDDDDBBBB 531*7c478bd9Sstevel@tonic-gate * 532*7c478bd9Sstevel@tonic-gate * Note that this format only allows attachment points to 533*7c478bd9Sstevel@tonic-gate * either represent all the units on a board or one particular 534*7c478bd9Sstevel@tonic-gate * unit. A more general specification would permit any combination 535*7c478bd9Sstevel@tonic-gate * of specific units and types to be represented by individual 536*7c478bd9Sstevel@tonic-gate * attachment points. 537*7c478bd9Sstevel@tonic-gate */ 538*7c478bd9Sstevel@tonic-gate #define SBD_DEV_SLOTMASK 0x000f 539*7c478bd9Sstevel@tonic-gate /* 540*7c478bd9Sstevel@tonic-gate * These device level definitions are primarily for unit testing. 541*7c478bd9Sstevel@tonic-gate */ 542*7c478bd9Sstevel@tonic-gate #define SBD_DEV_UNITMASK 0x0f00 543*7c478bd9Sstevel@tonic-gate #define SBD_DEV_UNITSHIFT 8 544*7c478bd9Sstevel@tonic-gate #define SBD_DEV_CPU 0x0010 545*7c478bd9Sstevel@tonic-gate #define SBD_DEV_MEM 0x0020 546*7c478bd9Sstevel@tonic-gate #define SBD_DEV_IO 0x0040 547*7c478bd9Sstevel@tonic-gate #define SBD_DEV_TYPEMASK (SBD_DEV_CPU | SBD_DEV_MEM | SBD_DEV_IO) 548*7c478bd9Sstevel@tonic-gate #define SBD_DEV_TYPESHIFT 4 549*7c478bd9Sstevel@tonic-gate 550*7c478bd9Sstevel@tonic-gate /* 551*7c478bd9Sstevel@tonic-gate * Slot, Instance, and Minor number Macro definitions 552*7c478bd9Sstevel@tonic-gate */ 553*7c478bd9Sstevel@tonic-gate #define SLOT2DEV(s) ((s) & SBD_DEV_SLOTMASK) 554*7c478bd9Sstevel@tonic-gate #define SBDGETSLOT(unit) ((unit) & SBD_DEV_SLOTMASK) 555*7c478bd9Sstevel@tonic-gate /* 556*7c478bd9Sstevel@tonic-gate * The following is primarily for unit testing. 557*7c478bd9Sstevel@tonic-gate */ 558*7c478bd9Sstevel@tonic-gate #define ALLCPU2DEV(s) (SBD_DEV_CPU | SLOT2DEV(s)) 559*7c478bd9Sstevel@tonic-gate #define ALLMEM2DEV(s) (SBD_DEV_MEM | SLOT2DEV(s)) 560*7c478bd9Sstevel@tonic-gate #define ALLIO2DEV(s) (SBD_DEV_IO | SLOT2DEV(s)) 561*7c478bd9Sstevel@tonic-gate #define _UNIT2DEV(u) (((u) << SBD_DEV_UNITSHIFT) & \ 562*7c478bd9Sstevel@tonic-gate SBD_DEV_UNITMASK) 563*7c478bd9Sstevel@tonic-gate #define CPUUNIT2DEV(s, c) (_UNIT2DEV(c) | ALLCPU2DEV(s)) 564*7c478bd9Sstevel@tonic-gate #define MEMUNIT2DEV(s, m) (_UNIT2DEV(m) | ALLMEM2DEV(s)) 565*7c478bd9Sstevel@tonic-gate #define IOUNIT2DEV(s, i) (_UNIT2DEV(i) | ALLIO2DEV(s)) 566*7c478bd9Sstevel@tonic-gate 567*7c478bd9Sstevel@tonic-gate #define DEV_IS_ALLUNIT(d) (((d) & SBD_DEV_UNITMASK) == 0) 568*7c478bd9Sstevel@tonic-gate #define _DEV_IS_ALLTYPE(d) (((d) & SBD_DEV_TYPEMASK) == 0) 569*7c478bd9Sstevel@tonic-gate #define DEV_IS_ALLBOARD(d) (DEV_IS_ALLUNIT(d) && _DEV_IS_ALLTYPE(d)) 570*7c478bd9Sstevel@tonic-gate #define DEV_IS_CPU(d) ((d) & SBD_DEV_CPU) 571*7c478bd9Sstevel@tonic-gate #define DEV_IS_MEM(d) ((d) & SBD_DEV_MEM) 572*7c478bd9Sstevel@tonic-gate #define DEV_IS_IO(d) ((d) & SBD_DEV_IO) 573*7c478bd9Sstevel@tonic-gate #define DEV_IS_ALLCPU(d) (DEV_IS_ALLUNIT(d) && DEV_IS_CPU(d)) 574*7c478bd9Sstevel@tonic-gate #define DEV_IS_ALLMEM(d) (DEV_IS_ALLUNIT(d) && DEV_IS_MEM(d)) 575*7c478bd9Sstevel@tonic-gate #define DEV_IS_ALLIO(d) (DEV_IS_ALLUNIT(d) && DEV_IS_IO(d)) 576*7c478bd9Sstevel@tonic-gate #define DEV2UNIT(d) \ 577*7c478bd9Sstevel@tonic-gate ((((d) & SBD_DEV_UNITMASK) >> SBD_DEV_UNITSHIFT) - 1) 578*7c478bd9Sstevel@tonic-gate #define DEV2NT(d) \ 579*7c478bd9Sstevel@tonic-gate (DEV_IS_MEM(d) ? SBD_COMP_MEM : \ 580*7c478bd9Sstevel@tonic-gate DEV_IS_CPU(d) ? SBD_COMP_CPU : \ 581*7c478bd9Sstevel@tonic-gate DEV_IS_IO(d) ? SBD_COMP_IO : SBD_COMP_UNKNOWN) 582*7c478bd9Sstevel@tonic-gate 583*7c478bd9Sstevel@tonic-gate /* 584*7c478bd9Sstevel@tonic-gate * Macros to cast between PIM and PSM layers of the following 585*7c478bd9Sstevel@tonic-gate * structures: 586*7c478bd9Sstevel@tonic-gate * board_t <-> sbd_board_t 587*7c478bd9Sstevel@tonic-gate * sbd_handle_t <-> sbd_priv_handle_t 588*7c478bd9Sstevel@tonic-gate * sbderror_t <-> sbderror_t 589*7c478bd9Sstevel@tonic-gate * slot -> board_t 590*7c478bd9Sstevel@tonic-gate * slot -> sbd_board_t 591*7c478bd9Sstevel@tonic-gate * sbd_board_t -> sbd_handle_t 592*7c478bd9Sstevel@tonic-gate * sbd_handle -> sbderror_t 593*7c478bd9Sstevel@tonic-gate */ 594*7c478bd9Sstevel@tonic-gate #define SBDH2BD(bd) ((sbd_board_t *)(bd)) 595*7c478bd9Sstevel@tonic-gate 596*7c478bd9Sstevel@tonic-gate #define HD2MACHHD(hd) ((sbd_priv_handle_t *)(hd)) 597*7c478bd9Sstevel@tonic-gate #define MACHHD2HD(mhd) ((sbd_handle_t *)&((mhd)->sh_handle)) 598*7c478bd9Sstevel@tonic-gate 599*7c478bd9Sstevel@tonic-gate #define ERR2MACHERR(err) ((sbderror_t *)(err)) 600*7c478bd9Sstevel@tonic-gate #define MACHERR2ERR(merr) ((sbderror_t *)(merr)) 601*7c478bd9Sstevel@tonic-gate 602*7c478bd9Sstevel@tonic-gate #define BSLOT2MACHBD(b) (&(sbd_boardlist[b])) 603*7c478bd9Sstevel@tonic-gate #define BSLOT2BD(slot) MACHBD2BD(BSLOT2MACHBD(slot)) 604*7c478bd9Sstevel@tonic-gate 605*7c478bd9Sstevel@tonic-gate #define MACHBD2HD(sbp) MACHHD2HD((sbp)->sb_handle) 606*7c478bd9Sstevel@tonic-gate 607*7c478bd9Sstevel@tonic-gate #define HD2MACHERR(hd) ERR2MACHERR(SBD_HD2ERR(hd)) 608*7c478bd9Sstevel@tonic-gate 609*7c478bd9Sstevel@tonic-gate #define MACHSRHD2HD(srh) ((srh)->sr_dr_handlep) 610*7c478bd9Sstevel@tonic-gate 611*7c478bd9Sstevel@tonic-gate /* 612*7c478bd9Sstevel@tonic-gate * CMP Specific Helpers 613*7c478bd9Sstevel@tonic-gate */ 614*7c478bd9Sstevel@tonic-gate #define MAX_CORES_PER_CMP 2 615*7c478bd9Sstevel@tonic-gate #define SBD_CMP_CORE_UNUM(cmp, core) ((cmp + (core * 512)) 616*7c478bd9Sstevel@tonic-gate #define SBD_CMP_NUM(unum) (unum & 0x3) 617*7c478bd9Sstevel@tonic-gate 618*7c478bd9Sstevel@tonic-gate /* 619*7c478bd9Sstevel@tonic-gate * Some stuff to assist in debug. 620*7c478bd9Sstevel@tonic-gate */ 621*7c478bd9Sstevel@tonic-gate #ifdef DEBUG 622*7c478bd9Sstevel@tonic-gate #define SBD_DBG_STATE 0x00000001 623*7c478bd9Sstevel@tonic-gate #define SBD_DBG_QR 0x00000002 624*7c478bd9Sstevel@tonic-gate #define SBD_DBG_CPU 0x00000004 625*7c478bd9Sstevel@tonic-gate #define SBD_DBG_MEM 0x00000008 626*7c478bd9Sstevel@tonic-gate #define SBD_DBG_IO 0x00000010 627*7c478bd9Sstevel@tonic-gate #define SBD_DBG_HW 0x00000020 628*7c478bd9Sstevel@tonic-gate #define SBD_DBG_BYP 0x00000040 629*7c478bd9Sstevel@tonic-gate 630*7c478bd9Sstevel@tonic-gate #define PR_ALL if (sbd_debug) printf 631*7c478bd9Sstevel@tonic-gate #define PR_STATE if (sbd_debug & SBD_DBG_STATE) printf 632*7c478bd9Sstevel@tonic-gate #define PR_QR if (sbd_debug & SBD_DBG_QR) prom_printf 633*7c478bd9Sstevel@tonic-gate #define PR_CPU if (sbd_debug & SBD_DBG_CPU) printf 634*7c478bd9Sstevel@tonic-gate #define PR_MEM if (sbd_debug & SBD_DBG_MEM) printf 635*7c478bd9Sstevel@tonic-gate #define PR_IO if (sbd_debug & SBD_DBG_IO) printf 636*7c478bd9Sstevel@tonic-gate #define PR_HW if (sbd_debug & SBD_DBG_HW) printf 637*7c478bd9Sstevel@tonic-gate #define PR_BYP if (sbd_debug & SBD_DBG_BYP) prom_printf 638*7c478bd9Sstevel@tonic-gate 639*7c478bd9Sstevel@tonic-gate #define SBD_MEMLIST_DUMP(ml) memlist_dump(ml) 640*7c478bd9Sstevel@tonic-gate 641*7c478bd9Sstevel@tonic-gate extern uint_t sbd_debug; 642*7c478bd9Sstevel@tonic-gate #else /* DEBUG */ 643*7c478bd9Sstevel@tonic-gate #define PR_ALL if (0) printf 644*7c478bd9Sstevel@tonic-gate #define PR_STATE PR_ALL 645*7c478bd9Sstevel@tonic-gate #define PR_QR PR_ALL 646*7c478bd9Sstevel@tonic-gate #define PR_CPU PR_ALL 647*7c478bd9Sstevel@tonic-gate #define PR_MEM PR_ALL 648*7c478bd9Sstevel@tonic-gate #define PR_IO PR_ALL 649*7c478bd9Sstevel@tonic-gate #define PR_HW PR_ALL 650*7c478bd9Sstevel@tonic-gate #define PR_BYP PR_ALL 651*7c478bd9Sstevel@tonic-gate 652*7c478bd9Sstevel@tonic-gate #define SBD_MEMLIST_DUMP(ml) 653*7c478bd9Sstevel@tonic-gate #endif /* DEBUG */ 654*7c478bd9Sstevel@tonic-gate extern char *sbd_state_str[]; 655*7c478bd9Sstevel@tonic-gate extern char *sbd_ct_str[]; 656*7c478bd9Sstevel@tonic-gate 657*7c478bd9Sstevel@tonic-gate /* 658*7c478bd9Sstevel@tonic-gate * event flag 659*7c478bd9Sstevel@tonic-gate */ 660*7c478bd9Sstevel@tonic-gate extern char send_event; 661*7c478bd9Sstevel@tonic-gate 662*7c478bd9Sstevel@tonic-gate /* 663*7c478bd9Sstevel@tonic-gate * IMPORTANT: 664*7c478bd9Sstevel@tonic-gate * The following two defines are also coded into OBP, so if they 665*7c478bd9Sstevel@tonic-gate * need to change here, don't forget to change OBP also. 666*7c478bd9Sstevel@tonic-gate */ 667*7c478bd9Sstevel@tonic-gate #define SBD_OBP_PROBE_GOOD 0 668*7c478bd9Sstevel@tonic-gate #define SBD_OBP_PROBE_BAD 1 669*7c478bd9Sstevel@tonic-gate 670*7c478bd9Sstevel@tonic-gate extern int sbd_setup_instance(int, dev_info_t *, int, int, 671*7c478bd9Sstevel@tonic-gate caddr_t); 672*7c478bd9Sstevel@tonic-gate extern int sbd_teardown_instance(int, caddr_t); 673*7c478bd9Sstevel@tonic-gate extern int sbd_ioctl(dev_t dev, int cmd, intptr_t arg, int mode, 674*7c478bd9Sstevel@tonic-gate char *event); 675*7c478bd9Sstevel@tonic-gate 676*7c478bd9Sstevel@tonic-gate extern sbd_comp_type_t sbd_cm_type(char *name); 677*7c478bd9Sstevel@tonic-gate extern sbd_state_t ostate_cvt(sbd_istate_t state); 678*7c478bd9Sstevel@tonic-gate extern void sbd_cpu_set_prop(sbd_cpu_unit_t *cp, dev_info_t *dip); 679*7c478bd9Sstevel@tonic-gate extern int sbd_cpu_flags(sbd_handle_t *hp, sbd_devset_t devset, 680*7c478bd9Sstevel@tonic-gate sbd_dev_stat_t *dsp); 681*7c478bd9Sstevel@tonic-gate extern int sbd_disconnect_cpu(sbd_handle_t *hp, int unit); 682*7c478bd9Sstevel@tonic-gate extern int sbd_connect_cpu(sbd_board_t *sbp, int unit); 683*7c478bd9Sstevel@tonic-gate extern int sbd_disconnect_mem(sbd_handle_t *hp, int unit); 684*7c478bd9Sstevel@tonic-gate 685*7c478bd9Sstevel@tonic-gate extern int sbd_pre_detach_mem(sbd_handle_t *hp, 686*7c478bd9Sstevel@tonic-gate sbd_devlist_t *devlist, int devnum); 687*7c478bd9Sstevel@tonic-gate extern int sbd_post_attach_mem(sbd_handle_t *, 688*7c478bd9Sstevel@tonic-gate sbd_devlist_t *, int); 689*7c478bd9Sstevel@tonic-gate extern int sbd_post_detach_mem(sbd_handle_t *, 690*7c478bd9Sstevel@tonic-gate sbd_devlist_t *, int); 691*7c478bd9Sstevel@tonic-gate extern int sbd_post_attach_cpu(sbd_handle_t *hp, 692*7c478bd9Sstevel@tonic-gate sbd_devlist_t *devlist, int devnum); 693*7c478bd9Sstevel@tonic-gate extern int sbd_pre_release_cpu(sbd_handle_t *hp, 694*7c478bd9Sstevel@tonic-gate sbd_devlist_t *devlist, int devnum); 695*7c478bd9Sstevel@tonic-gate extern int sbd_pre_detach_cpu(sbd_handle_t *hp, 696*7c478bd9Sstevel@tonic-gate sbd_devlist_t *devlist, int devnum); 697*7c478bd9Sstevel@tonic-gate extern int sbd_post_detach_cpu(sbd_handle_t *hp, 698*7c478bd9Sstevel@tonic-gate sbd_devlist_t *devlist, int devnum); 699*7c478bd9Sstevel@tonic-gate extern int sbd_pre_attach_mem(sbd_handle_t *hp, 700*7c478bd9Sstevel@tonic-gate sbd_devlist_t *devlist, int devnum); 701*7c478bd9Sstevel@tonic-gate extern int sbd_pre_release_mem(sbd_handle_t *hp, 702*7c478bd9Sstevel@tonic-gate sbd_devlist_t *devlist, int devnum); 703*7c478bd9Sstevel@tonic-gate extern int sbd_disconnect_io(sbd_handle_t *hp, int unit); 704*7c478bd9Sstevel@tonic-gate extern void sbd_check_devices(dev_info_t *dip, int *refcount, 705*7c478bd9Sstevel@tonic-gate sbd_handle_t *handle); 706*7c478bd9Sstevel@tonic-gate extern struct memlist *sbd_get_memlist(sbd_mem_unit_t *mp, sbderror_t *ep); 707*7c478bd9Sstevel@tonic-gate extern void sbd_init_mem_unit(sbd_board_t *sbp, int unit, 708*7c478bd9Sstevel@tonic-gate sbderror_t *ep); 709*7c478bd9Sstevel@tonic-gate extern void sbd_release_mem_done(sbd_handle_t *hp, int unit); 710*7c478bd9Sstevel@tonic-gate extern void sbd_release_cleanup(sbd_handle_t *hp); 711*7c478bd9Sstevel@tonic-gate extern int sbd_cancel_cpu(sbd_handle_t *hp, int unit); 712*7c478bd9Sstevel@tonic-gate extern void sbd_init_err(sbderror_t *ep); 713*7c478bd9Sstevel@tonic-gate extern int sbd_cancel_mem(sbd_handle_t *hp, int unit); 714*7c478bd9Sstevel@tonic-gate extern sbd_comp_type_t sbd_get_devtype(sbd_handle_t *hp, dev_info_t *dip); 715*7c478bd9Sstevel@tonic-gate extern int sbd_get_board(dev_info_t *dip); 716*7c478bd9Sstevel@tonic-gate extern int sfhw_get_base_physaddr(dev_info_t *dip, 717*7c478bd9Sstevel@tonic-gate uint64_t *basepa); 718*7c478bd9Sstevel@tonic-gate extern int sbd_pre_attach_cpu(sbd_handle_t *hp, 719*7c478bd9Sstevel@tonic-gate sbd_devlist_t *devlist, int devnum); 720*7c478bd9Sstevel@tonic-gate extern int sbd_move_memory(sbd_handle_t *hp, sbd_board_t 721*7c478bd9Sstevel@tonic-gate *s_bp, sbd_board_t *t_bp); 722*7c478bd9Sstevel@tonic-gate extern void memlist_delete(struct memlist *mlist); 723*7c478bd9Sstevel@tonic-gate extern struct memlist *memlist_dup(struct memlist *mlist); 724*7c478bd9Sstevel@tonic-gate extern void memlist_dump(struct memlist *mlist); 725*7c478bd9Sstevel@tonic-gate extern int memlist_intersect(struct memlist *alist, 726*7c478bd9Sstevel@tonic-gate struct memlist *blist); 727*7c478bd9Sstevel@tonic-gate extern int sbd_juggle_bootproc(sbd_handle_t *hp, 728*7c478bd9Sstevel@tonic-gate processorid_t cpuid); 729*7c478bd9Sstevel@tonic-gate 730*7c478bd9Sstevel@tonic-gate extern sbd_cond_t sbd_get_comp_cond(dev_info_t *); 731*7c478bd9Sstevel@tonic-gate void sbd_attach_mem(sbd_handle_t *hp, sbderror_t *ep); 732*7c478bd9Sstevel@tonic-gate int sbd_release_mem(sbd_handle_t *hp, dev_info_t *dip, 733*7c478bd9Sstevel@tonic-gate int unit); 734*7c478bd9Sstevel@tonic-gate 735*7c478bd9Sstevel@tonic-gate int sbd_get_memhandle(sbd_handle_t *hp, dev_info_t *dip, 736*7c478bd9Sstevel@tonic-gate memhandle_t *mhp); 737*7c478bd9Sstevel@tonic-gate int sbd_detach_memory(sbd_handle_t *hp, sbderror_t *ep, 738*7c478bd9Sstevel@tonic-gate sbd_mem_unit_t *s_mp, int unit); 739*7c478bd9Sstevel@tonic-gate void sbd_release_memory_done(void *arg, int error); 740*7c478bd9Sstevel@tonic-gate int sbd_set_err_in_hdl(sbd_handle_t *hp, sbderror_t *ep); 741*7c478bd9Sstevel@tonic-gate sbdp_handle_t *sbd_get_sbdp_handle(sbd_board_t *sbp, 742*7c478bd9Sstevel@tonic-gate sbd_handle_t *hp); 743*7c478bd9Sstevel@tonic-gate void sbd_release_sbdp_handle(sbdp_handle_t *hp); 744*7c478bd9Sstevel@tonic-gate void sbd_reset_error_sbdph(sbdp_handle_t *hp); 745*7c478bd9Sstevel@tonic-gate extern int sbd_is_cmp_child(dev_info_t *dip); 746*7c478bd9Sstevel@tonic-gate 747*7c478bd9Sstevel@tonic-gate typedef const char *const fn_t; 748*7c478bd9Sstevel@tonic-gate 749*7c478bd9Sstevel@tonic-gate #ifdef __cplusplus 750*7c478bd9Sstevel@tonic-gate } 751*7c478bd9Sstevel@tonic-gate #endif 752*7c478bd9Sstevel@tonic-gate 753*7c478bd9Sstevel@tonic-gate #endif /* _SYS_SBDPRIV_H */ 754