/* * CDDL HEADER START * * The contents of this file are subject to the terms of the * Common Development and Distribution License (the "License"). * You may not use this file except in compliance with the License. * * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE * or http://www.opensolaris.org/os/licensing. * See the License for the specific language governing permissions * and limitations under the License. * * When distributing Covered Code, include this CDDL HEADER in each * file and include the License file at usr/src/OPENSOLARIS.LICENSE. * If applicable, add the following below this CDDL HEADER, with the * fields enclosed by brackets "[]" replaced with your own identifying * information: Portions Copyright [yyyy] [name of copyright owner] * * CDDL HEADER END */ /* * Copyright 2005 Sun Microsystems, Inc. All rights reserved. * Use is subject to license terms. */ #ifndef _SBDP_PRIV_H #define _SBDP_PRIV_H #pragma ident "%Z%%M% %I% %E% SMI" #ifdef __cplusplus extern "C" { #endif #include #include #include #include #include #ifdef DEBUG #define SBDPDBG_STATE 0x00000001 #define SBDPDBG_QR 0x00000002 #define SBDPDBG_CPU 0x00000004 #define SBDPDBG_MEM 0x00000008 #define SBDPDBG_IO 0x00000010 #define SBDPDBG_MBOX 0x00000020 #define SBDPDBG_ERR 0x00000040 #define SBDPDBG_MISC 0x00000080 #define SBDPDBG_FUNC 0x00000100 extern uint_t sbdp_debug; #define SBDP_DBG_ALL if (sbdp_debug) prom_printf #define SBDP_DBG_STATE if (sbdp_debug & SBDPDBG_STATE) prom_printf #define SBDP_DBG_QR if (sbdp_debug & SBDPDBG_QR) prom_printf #define SBDP_DBG_CPU if (sbdp_debug & SBDPDBG_CPU) prom_printf #define SBDP_DBG_MEM if (sbdp_debug & SBDPDBG_MEM) prom_printf #define SBDP_DBG_IO if (sbdp_debug & SBDPDBG_IO) prom_printf #define SBDP_DBG_MBOX if (sbdp_debug & SBDPDBG_MBOX) prom_printf #define SBDP_DBG_ERR if (sbdp_debug & SBDPDBG_ERR) prom_printf #define SBDP_DBG_MISC if (sbdp_debug & SBDPDBG_MISC) prom_printf #define SBDP_DBG_FUNC if (sbdp_debug & SBDPDBG_FUNC) prom_printf #else /* DEBUG */ #define SBDP_DBG_ALL #define SBDP_DBG_STATE #define SBDP_DBG_QR #define SBDP_DBG_CPU #define SBDP_DBG_MEM #define SBDP_DBG_IO #define SBDP_DBG_MBOX #define SBDP_DBG_ERR #define SBDP_DBG_MISC #define SBDP_DBG_FUNC #endif /* DEBUG */ #define PORTID_BAD -1 #define OBP_PORTID "portid" #define SBDP_MAX_BOARDS plat_max_boards() #define SBDP_MAX_MEM_NODES_PER_BOARD 4 #define SBDP_MAX_NODES 32 #define SBDP_MAX_WNODES 16 /* * CPU present macros */ #define SBDP_SET_CPU_PRESENT(bdp, unit)\ ((bdp)->cpus_present |= (1 << (unit))) #define SBDP_IS_CPU_PRESENT(bdp, unit)\ (((bdp)->cpus_present & (1 << (unit))) != 0) /* * CPU reset macros */ #define SBDP_SET_CPU_IN_RESET(bdp, unit)\ ((bdp)->cpus_in_reset |= (1 << (unit))) #define SBDP_UNSET_CPU_IN_RESET(bdp, unit)\ ((bdp)->cpus_in_reset &= ~(1 << (unit))) #define SBDP_IS_CPU_IN_RESET(bdp, unit)\ (((bdp)->cpus_in_reset & (1 << (unit))) != 0) #define SBDP_SET_ALL_CPUS_IN_RESET(bdp)\ ((bdp)->cpus_in_reset |= 0xf) #define SBDP_UNSET_ALL_CPUS_IN_RESET(bdp)\ ((bdp)->cpus_in_reset = 0x0) #define SBDP_ALL_CPUS -1 /* * These definitions come from the SC. Should the SC change them * then we need to changed them */ #define SBDP_DIAG_OFF 0x00 #define SBDP_DIAG_INIT 0x07 #define SBDP_DIAG_QUICK 0x10 #define SBDP_DIAG_MIN 0x20 #define SBDP_DIAG_DEFAULT 0x40 #define SBDP_DIAG_MEM1 0x60 #define SBDP_DIAG_MEM2 0x7f #define SBDP_DIAG_NVCI 0xffff /* Use stored value in nvci */ int *slices; #define SBDP_INIT_PLATOPTS (uint_t)-1 #define SBDP_PLATFORM_OPTS(s_platopts) ((s_platopts) = SBDP_INIT_PLATOPTS, \ SBD_SET_PLATOPTS(SBD_CMD_TEST, (s_platopts)), \ SBD_SET_PLATOPTS(SBD_CMD_PASSTHRU, (s_platopts))) typedef struct sbdp_bank { int id; ushort_t valid; ushort_t uk; uint_t um; uchar_t lk; uchar_t lm; struct sbdp_bank *bd_next; /* in the board */ struct sbdp_bank *seg_next; /* in the segment */ } sbdp_bank_t; typedef struct sbdp_segs { int id; int intlv; /* interleave for this segment */ uint64_t base; /* base address for this segment */ uint64_t size; /* size of this segment */ int nbanks; /* number of banks in this segment */ sbdp_bank_t *banks; /* pointer to the banks of this seg */ struct sbdp_segs *next; } sbdp_seg_t; typedef struct { int bd; int wnode; uint64_t bpa; /* base physical addr for this board */ int nnum; /* number of nodes */ struct memlist *ml; /* memlist for this board */ pnode_t nodes[SBDP_MAX_MEM_NODES_PER_BOARD]; kmutex_t bd_mutex; /* mutex for this board */ show_board_t *bd_sc; /* info obtained from the SC */ int valid_cp; /* Is this a valid copy of show_board */ sbdp_bank_t *banks; /* Banks for this board */ int cpus_in_reset; int cpus_present; } sbdp_bd_t; typedef struct sbdp_wnode { int wnode; /* wildcat node */ int nbds; /* number of bds for this node */ sbdp_bd_t *bds; /* pointer to the list of bds */ struct sbdp_wnode *next; /* ptr to nex wnode */ struct sbdp_wnode *prev; /* ptr to prev node */ } sbdp_wnode_t; typedef struct { uint_t regspec_addr_hi; uint_t regspec_addr_lo; uint_t regspec_size_hi; uint_t regspec_size_lo; } regspace_t; /* * Suspend states used internally by sbdp_suspend and * sbdp_resume */ typedef enum sbd_suspend_state { SBDP_SRSTATE_BEGIN = 0, SBDP_SRSTATE_USER, SBDP_SRSTATE_DRIVER, SBDP_SRSTATE_FULL } suspend_state_t; /* * specific suspend/resume interface handle */ typedef struct { sbd_error_t sep; dev_info_t *sr_failed_dip; suspend_state_t sr_suspend_state; uint_t sr_flags; uint_t sh_ndi; } sbdp_sr_handle_t; typedef struct sbdp_shutdown { uint64_t estack; uint64_t flushaddr; uint32_t size; uint32_t linesize; uint64_t physaddr; } sbdp_shutdown_t; extern int plat_max_boards(); typedef struct { int node; /* wildcat node */ int board; pnode_t nodes[SBDP_MAX_NODES]; int num_of_nodes; int flags; int error; dev_info_t *top_node; char *errstr; } attach_pkt_t; extern uint64_t *sbdp_valp; sbdp_sr_handle_t *sbdp_get_sr_handle(void); void sbdp_release_sr_handle(sbdp_sr_handle_t *); int sbdp_suspend(sbdp_sr_handle_t *); void sbdp_resume(sbdp_sr_handle_t *); void sbdp_set_err(sbd_error_t *ep, int ecode, char *rsc); int sbdp_is_node_bad(pnode_t); void sbdp_walk_prom_tree(pnode_t, int(*)(pnode_t, void *, uint_t), void *); int sbdp_detach_bd(int node, int board, sbd_error_t *sep); void sbdp_attach_bd(int, int); int sbdp_get_bd_and_wnode_num(pnode_t, int *, int *); void sbdp_update_bd_info(sbdp_bd_t *); sbdp_bd_t *sbdp_get_bd_info(int, int); int sbdp_make_bd_mem_contigous(int); sbd_cond_t sbdp_get_comp_status(pnode_t); void sbdp_init_bd_banks(sbdp_bd_t *); void sbdp_swap_list_of_banks(sbdp_bd_t *, sbdp_bd_t *); void sbdp_fini_bd_banks(sbdp_bd_t *); void sbdp_print_bd_banks(sbdp_bd_t *); void sbdp_add_new_bd_info(int, int); void sbdp_cleanup_bd(int, int); void sbdp_cpu_in_reset(int, int, int, int); int sbdp_is_cpu_in_reset(int, int, int); int sbdp_set_cpu_present(int, int, int); int sbdp_is_cpu_present(int, int, int); int sbdp_swap_slices(int, int); #ifdef DEBUG void sbdp_print_all_segs(void); int sbdp_passthru_test_quiesce(sbdp_handle_t *hp, void *); #endif int sbdp_select_top_nodes(pnode_t, void *, uint_t); pnode_t sbdp_find_nearby_cpu_by_portid(pnode_t, processorid_t); int sbdp_board_non_panther_cpus(int, int); #ifdef __cplusplus } #endif #endif /* _SBDP_PRIV_H */