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 2005 Sun Microsystems, Inc. All rights reserved. 24*03831d35Sstevel * Use is subject to license terms. 25*03831d35Sstevel */ 26*03831d35Sstevel 27*03831d35Sstevel #ifndef _SBDP_PRIV_H 28*03831d35Sstevel #define _SBDP_PRIV_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 #include <sys/sbd.h> 37*03831d35Sstevel #include <sys/sbdp_mbox.h> 38*03831d35Sstevel #include <sys/conf.h> 39*03831d35Sstevel #include <sys/ddi_impldefs.h> 40*03831d35Sstevel #include <sys/serengeti.h> 41*03831d35Sstevel 42*03831d35Sstevel #ifdef DEBUG 43*03831d35Sstevel #define SBDPDBG_STATE 0x00000001 44*03831d35Sstevel #define SBDPDBG_QR 0x00000002 45*03831d35Sstevel #define SBDPDBG_CPU 0x00000004 46*03831d35Sstevel #define SBDPDBG_MEM 0x00000008 47*03831d35Sstevel #define SBDPDBG_IO 0x00000010 48*03831d35Sstevel #define SBDPDBG_MBOX 0x00000020 49*03831d35Sstevel #define SBDPDBG_ERR 0x00000040 50*03831d35Sstevel #define SBDPDBG_MISC 0x00000080 51*03831d35Sstevel #define SBDPDBG_FUNC 0x00000100 52*03831d35Sstevel 53*03831d35Sstevel extern uint_t sbdp_debug; 54*03831d35Sstevel 55*03831d35Sstevel #define SBDP_DBG_ALL if (sbdp_debug) prom_printf 56*03831d35Sstevel #define SBDP_DBG_STATE if (sbdp_debug & SBDPDBG_STATE) prom_printf 57*03831d35Sstevel #define SBDP_DBG_QR if (sbdp_debug & SBDPDBG_QR) prom_printf 58*03831d35Sstevel #define SBDP_DBG_CPU if (sbdp_debug & SBDPDBG_CPU) prom_printf 59*03831d35Sstevel #define SBDP_DBG_MEM if (sbdp_debug & SBDPDBG_MEM) prom_printf 60*03831d35Sstevel #define SBDP_DBG_IO if (sbdp_debug & SBDPDBG_IO) prom_printf 61*03831d35Sstevel #define SBDP_DBG_MBOX if (sbdp_debug & SBDPDBG_MBOX) prom_printf 62*03831d35Sstevel #define SBDP_DBG_ERR if (sbdp_debug & SBDPDBG_ERR) prom_printf 63*03831d35Sstevel #define SBDP_DBG_MISC if (sbdp_debug & SBDPDBG_MISC) prom_printf 64*03831d35Sstevel #define SBDP_DBG_FUNC if (sbdp_debug & SBDPDBG_FUNC) prom_printf 65*03831d35Sstevel 66*03831d35Sstevel #else /* DEBUG */ 67*03831d35Sstevel 68*03831d35Sstevel #define SBDP_DBG_ALL 69*03831d35Sstevel #define SBDP_DBG_STATE 70*03831d35Sstevel #define SBDP_DBG_QR 71*03831d35Sstevel #define SBDP_DBG_CPU 72*03831d35Sstevel #define SBDP_DBG_MEM 73*03831d35Sstevel #define SBDP_DBG_IO 74*03831d35Sstevel #define SBDP_DBG_MBOX 75*03831d35Sstevel #define SBDP_DBG_ERR 76*03831d35Sstevel #define SBDP_DBG_MISC 77*03831d35Sstevel #define SBDP_DBG_FUNC 78*03831d35Sstevel #endif /* DEBUG */ 79*03831d35Sstevel 80*03831d35Sstevel #define PORTID_BAD -1 81*03831d35Sstevel #define OBP_PORTID "portid" 82*03831d35Sstevel #define SBDP_MAX_BOARDS plat_max_boards() 83*03831d35Sstevel #define SBDP_MAX_MEM_NODES_PER_BOARD 4 84*03831d35Sstevel #define SBDP_MAX_NODES 32 85*03831d35Sstevel #define SBDP_MAX_WNODES 16 86*03831d35Sstevel 87*03831d35Sstevel /* 88*03831d35Sstevel * CPU present macros 89*03831d35Sstevel */ 90*03831d35Sstevel #define SBDP_SET_CPU_PRESENT(bdp, unit)\ 91*03831d35Sstevel ((bdp)->cpus_present |= (1 << (unit))) 92*03831d35Sstevel 93*03831d35Sstevel #define SBDP_IS_CPU_PRESENT(bdp, unit)\ 94*03831d35Sstevel (((bdp)->cpus_present & (1 << (unit))) != 0) 95*03831d35Sstevel 96*03831d35Sstevel /* 97*03831d35Sstevel * CPU reset macros 98*03831d35Sstevel */ 99*03831d35Sstevel #define SBDP_SET_CPU_IN_RESET(bdp, unit)\ 100*03831d35Sstevel ((bdp)->cpus_in_reset |= (1 << (unit))) 101*03831d35Sstevel #define SBDP_UNSET_CPU_IN_RESET(bdp, unit)\ 102*03831d35Sstevel ((bdp)->cpus_in_reset &= ~(1 << (unit))) 103*03831d35Sstevel #define SBDP_IS_CPU_IN_RESET(bdp, unit)\ 104*03831d35Sstevel (((bdp)->cpus_in_reset & (1 << (unit))) != 0) 105*03831d35Sstevel #define SBDP_SET_ALL_CPUS_IN_RESET(bdp)\ 106*03831d35Sstevel ((bdp)->cpus_in_reset |= 0xf) 107*03831d35Sstevel #define SBDP_UNSET_ALL_CPUS_IN_RESET(bdp)\ 108*03831d35Sstevel ((bdp)->cpus_in_reset = 0x0) 109*03831d35Sstevel #define SBDP_ALL_CPUS -1 110*03831d35Sstevel 111*03831d35Sstevel /* 112*03831d35Sstevel * These definitions come from the SC. Should the SC change them 113*03831d35Sstevel * then we need to changed them 114*03831d35Sstevel */ 115*03831d35Sstevel #define SBDP_DIAG_OFF 0x00 116*03831d35Sstevel #define SBDP_DIAG_INIT 0x07 117*03831d35Sstevel #define SBDP_DIAG_QUICK 0x10 118*03831d35Sstevel #define SBDP_DIAG_MIN 0x20 119*03831d35Sstevel #define SBDP_DIAG_DEFAULT 0x40 120*03831d35Sstevel #define SBDP_DIAG_MEM1 0x60 121*03831d35Sstevel #define SBDP_DIAG_MEM2 0x7f 122*03831d35Sstevel #define SBDP_DIAG_NVCI 0xffff /* Use stored value in nvci */ 123*03831d35Sstevel 124*03831d35Sstevel int *slices; 125*03831d35Sstevel 126*03831d35Sstevel #define SBDP_INIT_PLATOPTS (uint_t)-1 127*03831d35Sstevel #define SBDP_PLATFORM_OPTS(s_platopts) ((s_platopts) = SBDP_INIT_PLATOPTS, \ 128*03831d35Sstevel SBD_SET_PLATOPTS(SBD_CMD_TEST, (s_platopts)), \ 129*03831d35Sstevel SBD_SET_PLATOPTS(SBD_CMD_PASSTHRU, (s_platopts))) 130*03831d35Sstevel 131*03831d35Sstevel typedef struct sbdp_bank { 132*03831d35Sstevel int id; 133*03831d35Sstevel ushort_t valid; 134*03831d35Sstevel ushort_t uk; 135*03831d35Sstevel uint_t um; 136*03831d35Sstevel uchar_t lk; 137*03831d35Sstevel uchar_t lm; 138*03831d35Sstevel struct sbdp_bank *bd_next; /* in the board */ 139*03831d35Sstevel struct sbdp_bank *seg_next; /* in the segment */ 140*03831d35Sstevel } sbdp_bank_t; 141*03831d35Sstevel 142*03831d35Sstevel typedef struct sbdp_segs { 143*03831d35Sstevel int id; 144*03831d35Sstevel int intlv; /* interleave for this segment */ 145*03831d35Sstevel uint64_t base; /* base address for this segment */ 146*03831d35Sstevel uint64_t size; /* size of this segment */ 147*03831d35Sstevel int nbanks; /* number of banks in this segment */ 148*03831d35Sstevel sbdp_bank_t *banks; /* pointer to the banks of this seg */ 149*03831d35Sstevel struct sbdp_segs *next; 150*03831d35Sstevel } sbdp_seg_t; 151*03831d35Sstevel 152*03831d35Sstevel typedef struct { 153*03831d35Sstevel int bd; 154*03831d35Sstevel int wnode; 155*03831d35Sstevel uint64_t bpa; /* base physical addr for this board */ 156*03831d35Sstevel int nnum; /* number of nodes */ 157*03831d35Sstevel struct memlist *ml; /* memlist for this board */ 158*03831d35Sstevel pnode_t nodes[SBDP_MAX_MEM_NODES_PER_BOARD]; 159*03831d35Sstevel kmutex_t bd_mutex; /* mutex for this board */ 160*03831d35Sstevel show_board_t *bd_sc; /* info obtained from the SC */ 161*03831d35Sstevel int valid_cp; /* Is this a valid copy of show_board */ 162*03831d35Sstevel sbdp_bank_t *banks; /* Banks for this board */ 163*03831d35Sstevel int cpus_in_reset; 164*03831d35Sstevel int cpus_present; 165*03831d35Sstevel } sbdp_bd_t; 166*03831d35Sstevel 167*03831d35Sstevel typedef struct sbdp_wnode { 168*03831d35Sstevel int wnode; /* wildcat node */ 169*03831d35Sstevel int nbds; /* number of bds for this node */ 170*03831d35Sstevel sbdp_bd_t *bds; /* pointer to the list of bds */ 171*03831d35Sstevel struct sbdp_wnode *next; /* ptr to nex wnode */ 172*03831d35Sstevel struct sbdp_wnode *prev; /* ptr to prev node */ 173*03831d35Sstevel } sbdp_wnode_t; 174*03831d35Sstevel 175*03831d35Sstevel typedef struct { 176*03831d35Sstevel uint_t regspec_addr_hi; 177*03831d35Sstevel uint_t regspec_addr_lo; 178*03831d35Sstevel uint_t regspec_size_hi; 179*03831d35Sstevel uint_t regspec_size_lo; 180*03831d35Sstevel } regspace_t; 181*03831d35Sstevel 182*03831d35Sstevel /* 183*03831d35Sstevel * Suspend states used internally by sbdp_suspend and 184*03831d35Sstevel * sbdp_resume 185*03831d35Sstevel */ 186*03831d35Sstevel typedef enum sbd_suspend_state { 187*03831d35Sstevel SBDP_SRSTATE_BEGIN = 0, 188*03831d35Sstevel SBDP_SRSTATE_USER, 189*03831d35Sstevel SBDP_SRSTATE_DRIVER, 190*03831d35Sstevel SBDP_SRSTATE_FULL 191*03831d35Sstevel } suspend_state_t; 192*03831d35Sstevel 193*03831d35Sstevel /* 194*03831d35Sstevel * specific suspend/resume interface handle 195*03831d35Sstevel */ 196*03831d35Sstevel typedef struct { 197*03831d35Sstevel sbd_error_t sep; 198*03831d35Sstevel dev_info_t *sr_failed_dip; 199*03831d35Sstevel suspend_state_t sr_suspend_state; 200*03831d35Sstevel uint_t sr_flags; 201*03831d35Sstevel uint_t sh_ndi; 202*03831d35Sstevel } sbdp_sr_handle_t; 203*03831d35Sstevel 204*03831d35Sstevel typedef struct sbdp_shutdown { 205*03831d35Sstevel uint64_t estack; 206*03831d35Sstevel uint64_t flushaddr; 207*03831d35Sstevel uint32_t size; 208*03831d35Sstevel uint32_t linesize; 209*03831d35Sstevel uint64_t physaddr; 210*03831d35Sstevel } sbdp_shutdown_t; 211*03831d35Sstevel 212*03831d35Sstevel extern int plat_max_boards(); 213*03831d35Sstevel 214*03831d35Sstevel typedef struct { 215*03831d35Sstevel int node; /* wildcat node */ 216*03831d35Sstevel int board; 217*03831d35Sstevel pnode_t nodes[SBDP_MAX_NODES]; 218*03831d35Sstevel int num_of_nodes; 219*03831d35Sstevel int flags; 220*03831d35Sstevel int error; 221*03831d35Sstevel dev_info_t *top_node; 222*03831d35Sstevel char *errstr; 223*03831d35Sstevel } attach_pkt_t; 224*03831d35Sstevel 225*03831d35Sstevel extern uint64_t *sbdp_valp; 226*03831d35Sstevel 227*03831d35Sstevel sbdp_sr_handle_t *sbdp_get_sr_handle(void); 228*03831d35Sstevel void sbdp_release_sr_handle(sbdp_sr_handle_t *); 229*03831d35Sstevel int sbdp_suspend(sbdp_sr_handle_t *); 230*03831d35Sstevel void sbdp_resume(sbdp_sr_handle_t *); 231*03831d35Sstevel void sbdp_set_err(sbd_error_t *ep, int ecode, char *rsc); 232*03831d35Sstevel int sbdp_is_node_bad(pnode_t); 233*03831d35Sstevel void sbdp_walk_prom_tree(pnode_t, int(*)(pnode_t, void *, uint_t), void *); 234*03831d35Sstevel int sbdp_detach_bd(int node, int board, sbd_error_t *sep); 235*03831d35Sstevel void sbdp_attach_bd(int, int); 236*03831d35Sstevel int sbdp_get_bd_and_wnode_num(pnode_t, int *, int *); 237*03831d35Sstevel void sbdp_update_bd_info(sbdp_bd_t *); 238*03831d35Sstevel sbdp_bd_t *sbdp_get_bd_info(int, int); 239*03831d35Sstevel int sbdp_make_bd_mem_contigous(int); 240*03831d35Sstevel sbd_cond_t sbdp_get_comp_status(pnode_t); 241*03831d35Sstevel void sbdp_init_bd_banks(sbdp_bd_t *); 242*03831d35Sstevel void sbdp_swap_list_of_banks(sbdp_bd_t *, sbdp_bd_t *); 243*03831d35Sstevel void sbdp_fini_bd_banks(sbdp_bd_t *); 244*03831d35Sstevel void sbdp_print_bd_banks(sbdp_bd_t *); 245*03831d35Sstevel void sbdp_add_new_bd_info(int, int); 246*03831d35Sstevel void sbdp_cleanup_bd(int, int); 247*03831d35Sstevel void sbdp_cpu_in_reset(int, int, int, int); 248*03831d35Sstevel int sbdp_is_cpu_in_reset(int, int, int); 249*03831d35Sstevel int sbdp_set_cpu_present(int, int, int); 250*03831d35Sstevel int sbdp_is_cpu_present(int, int, int); 251*03831d35Sstevel int sbdp_swap_slices(int, int); 252*03831d35Sstevel #ifdef DEBUG 253*03831d35Sstevel void sbdp_print_all_segs(void); 254*03831d35Sstevel int sbdp_passthru_test_quiesce(sbdp_handle_t *hp, void *); 255*03831d35Sstevel #endif 256*03831d35Sstevel int sbdp_select_top_nodes(pnode_t, void *, uint_t); 257*03831d35Sstevel pnode_t sbdp_find_nearby_cpu_by_portid(pnode_t, processorid_t); 258*03831d35Sstevel int sbdp_board_non_panther_cpus(int, int); 259*03831d35Sstevel 260*03831d35Sstevel #ifdef __cplusplus 261*03831d35Sstevel } 262*03831d35Sstevel #endif 263*03831d35Sstevel 264*03831d35Sstevel #endif /* _SBDP_PRIV_H */ 265