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 _SYS_SGSBBC_PRIV_H 28*03831d35Sstevel #define _SYS_SGSBBC_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 /* 37*03831d35Sstevel * Private structures used by the Serengeti SBBC Driver 38*03831d35Sstevel * 39*03831d35Sstevel * The Serengeti SBBC driver handles communication between the 40*03831d35Sstevel * System Controller Software (ScApp) and Solaris via SBBC 41*03831d35Sstevel * registers and IOSRAM. 42*03831d35Sstevel * 43*03831d35Sstevel * This header file contains necessary definitions to enable 44*03831d35Sstevel * such communication. 45*03831d35Sstevel * 46*03831d35Sstevel * Register offsets and definitions can be found in 47*03831d35Sstevel * Serengeti Architecture Programmer's Reference 48*03831d35Sstevel * Revision 1.3 11/16/1999 49*03831d35Sstevel * Section 2.5 to 2.8 50*03831d35Sstevel */ 51*03831d35Sstevel 52*03831d35Sstevel #include <sys/types.h> 53*03831d35Sstevel #include <sys/dditypes.h> 54*03831d35Sstevel #include <sys/sgsbbc.h> 55*03831d35Sstevel 56*03831d35Sstevel /* 57*03831d35Sstevel * SBBC Interrupt registers 58*03831d35Sstevel */ 59*03831d35Sstevel #define SBBC_MAX_INTRS 32 60*03831d35Sstevel 61*03831d35Sstevel /* 62*03831d35Sstevel * Different interrupts 63*03831d35Sstevel */ 64*03831d35Sstevel #define INTERRUPT_ON 0x1 /* bit 0 */ 65*03831d35Sstevel /* 66*03831d35Sstevel * EPLD Interrupt Register Offset for communication with the SC 67*03831d35Sstevel */ 68*03831d35Sstevel #define EPLD_INTERRUPT 0x13 69*03831d35Sstevel 70*03831d35Sstevel /* 71*03831d35Sstevel * register numbers for mapping in OBP reg properties 72*03831d35Sstevel */ 73*03831d35Sstevel #define RNUM_SBBC_REGS 1 74*03831d35Sstevel 75*03831d35Sstevel /* 76*03831d35Sstevel * SBBC registers and devices on CPU/memory board 77*03831d35Sstevel */ 78*03831d35Sstevel #define SBBC_REGS_OFFSET 0x800000 79*03831d35Sstevel #define SBBC_REGS_SIZE 0x6230 80*03831d35Sstevel #define SBBC_EPLD_OFFSET 0x8e0000 81*03831d35Sstevel #define SBBC_EPLD_SIZE 0x20 82*03831d35Sstevel #define SBBC_SRAM_OFFSET 0x900000 83*03831d35Sstevel #define SBBC_SRAM_SIZE 0x20000 /* max. 128KB of SRAM */ 84*03831d35Sstevel /* 85*03831d35Sstevel * Register Offsets 86*03831d35Sstevel */ 87*03831d35Sstevel #define SBBC_PCI_INT_STATUS 0x2320 88*03831d35Sstevel #define SBBC_PCI_INT_ENABLE 0x2330 89*03831d35Sstevel 90*03831d35Sstevel /* 91*03831d35Sstevel * Port Interrupt Enable Register 92*03831d35Sstevel * 93*03831d35Sstevel * Field Bits Reset Type Description 94*03831d35Sstevel * State 95*03831d35Sstevel * Resvd <31:8> 0 R Reserved 96*03831d35Sstevel * PINT1_EN <7:4> 0 RW Enables for each of the 4 PCI 97*03831d35Sstevel * interrupt lines for Port Interrupt 98*03831d35Sstevel * Generation register 1. Bit 7 99*03831d35Sstevel * corresponds to PCI Interrupt D, 100*03831d35Sstevel * bit 4 corresponds to PCI Interrupt A. 101*03831d35Sstevel * PINT0_EN <3:0> 0 RW Same as above, but for register 0. 102*03831d35Sstevel */ 103*03831d35Sstevel #define SBBC_PCI_ENABLE_INT_A 0x11 /* Enable both PCI Interrupt A */ 104*03831d35Sstevel #define SBBC_PCI_ENABLE_MASK 0xff /* Mask for the two enable registers */ 105*03831d35Sstevel 106*03831d35Sstevel #ifdef DEBUG 107*03831d35Sstevel #define SGSBBC_DBG_MASK_MBOX 0x00000001 108*03831d35Sstevel #define SGSBBC_DBG_MASK_INTR 0x00000002 109*03831d35Sstevel #define SGSBBC_DBG_MASK_EVENT 0x00000004 110*03831d35Sstevel 111*03831d35Sstevel extern uint_t sgsbbc_debug; 112*03831d35Sstevel #define SGSBBC_DBG_ALL if (sgsbbc_debug) prom_printf 113*03831d35Sstevel #define SGSBBC_DBG_MBOX \ 114*03831d35Sstevel if (sgsbbc_debug & SGSBBC_DBG_MASK_MBOX) printf 115*03831d35Sstevel #define SGSBBC_DBG_INTR \ 116*03831d35Sstevel if (sgsbbc_debug & SGSBBC_DBG_MASK_INTR) cmn_err 117*03831d35Sstevel #define SGSBBC_DBG_EVENT \ 118*03831d35Sstevel if (sgsbbc_debug & SGSBBC_DBG_MASK_EVENT) cmn_err 119*03831d35Sstevel 120*03831d35Sstevel #else /* DEBUG */ 121*03831d35Sstevel #define SGSBBC_DBG_ALL 122*03831d35Sstevel #define SGSBBC_DBG_MBOX 123*03831d35Sstevel #define SGSBBC_DBG_INTR 124*03831d35Sstevel #define SGSBBC_DBG_EVENT 125*03831d35Sstevel 126*03831d35Sstevel #endif /* DEBUG */ 127*03831d35Sstevel 128*03831d35Sstevel 129*03831d35Sstevel typedef struct sbbc_intrs { 130*03831d35Sstevel sbbc_intrfunc_t sbbc_handler; /* interrupt handler */ 131*03831d35Sstevel caddr_t sbbc_arg; /* interrupt argument */ 132*03831d35Sstevel ddi_softintr_t sbbc_intr_id; 133*03831d35Sstevel kmutex_t *sbbc_intr_lock; /* for state flag */ 134*03831d35Sstevel uint_t *sbbc_intr_state; /* handler state */ 135*03831d35Sstevel struct sbbc_intrs *sbbc_intr_next; 136*03831d35Sstevel int registered; 137*03831d35Sstevel } sbbc_intrs_t; 138*03831d35Sstevel 139*03831d35Sstevel struct sbbc_epld_regs { 140*03831d35Sstevel uchar_t epld_reg[32]; 141*03831d35Sstevel }; 142*03831d35Sstevel 143*03831d35Sstevel /* 144*03831d35Sstevel * device soft state 145*03831d35Sstevel */ 146*03831d35Sstevel typedef struct sbbc_softstate { 147*03831d35Sstevel struct sbbc_softstate *prev; 148*03831d35Sstevel struct sbbc_softstate *next; 149*03831d35Sstevel 150*03831d35Sstevel struct chosen_iosram *iosram; /* back reference */ 151*03831d35Sstevel dev_info_t *dip; 152*03831d35Sstevel 153*03831d35Sstevel /* 154*03831d35Sstevel * Tunnel Info. 155*03831d35Sstevel */ 156*03831d35Sstevel void *sram; 157*03831d35Sstevel 158*03831d35Sstevel /* 159*03831d35Sstevel * SBBC Register Info. 160*03831d35Sstevel */ 161*03831d35Sstevel caddr_t sbbc_regs; /* common device regs */ 162*03831d35Sstevel uint32_t *port_int_regs; /* interrupt regs */ 163*03831d35Sstevel struct sbbc_epld_regs *epld_regs; /* EPLD regs */ 164*03831d35Sstevel uint32_t sram_toc; /* SRAM TOC */ 165*03831d35Sstevel 166*03831d35Sstevel /* 167*03831d35Sstevel * device map handles for register mapping 168*03831d35Sstevel */ 169*03831d35Sstevel ddi_acc_handle_t sbbc_reg_handle1; 170*03831d35Sstevel ddi_acc_handle_t sbbc_reg_handle2; 171*03831d35Sstevel /* 172*03831d35Sstevel * SBBC Interrupts 173*03831d35Sstevel */ 174*03831d35Sstevel uint_t inumber; 175*03831d35Sstevel ddi_iblock_cookie_t iblock; 176*03831d35Sstevel ddi_idevice_cookie_t idevice; 177*03831d35Sstevel 178*03831d35Sstevel sbbc_intrs_t *intr_hdlrs; 179*03831d35Sstevel 180*03831d35Sstevel /* 181*03831d35Sstevel * misc. 182*03831d35Sstevel */ 183*03831d35Sstevel kmutex_t sbbc_lock; /* mutex for this struct */ 184*03831d35Sstevel uchar_t suspended; /* TRUE if instance suspended */ 185*03831d35Sstevel uchar_t chosen; /* TRUE if instance 'chosen' */ 186*03831d35Sstevel int sbbc_instance; 187*03831d35Sstevel int sbbc_state; /* see below */ 188*03831d35Sstevel } sbbc_softstate_t; 189*03831d35Sstevel /* sbbc iosram state */ 190*03831d35Sstevel #define SBBC_STATE_INIT 0x0001 /* initialization */ 191*03831d35Sstevel #define SBBC_STATE_DETACH 0x0002 /* IOSRAM instance being detached */ 192*03831d35Sstevel 193*03831d35Sstevel /* 194*03831d35Sstevel * Structure used for tunnel switch 195*03831d35Sstevel */ 196*03831d35Sstevel typedef struct { 197*03831d35Sstevel dev_info_t *cur_dip; /* current dip that we compare to */ 198*03831d35Sstevel dev_info_t *new_dip; /* new dip that fits the condition */ 199*03831d35Sstevel } sbbc_find_dip_t; 200*03831d35Sstevel 201*03831d35Sstevel /* 202*03831d35Sstevel * Routines for mapping and unmapping SBBC internal registers 203*03831d35Sstevel */ 204*03831d35Sstevel extern int sbbc_map_regs(sbbc_softstate_t *); 205*03831d35Sstevel 206*03831d35Sstevel /* 207*03831d35Sstevel * Interrupt related routines 208*03831d35Sstevel */ 209*03831d35Sstevel extern int sbbc_add_intr(sbbc_softstate_t *); 210*03831d35Sstevel extern void sbbc_enable_intr(sbbc_softstate_t *); 211*03831d35Sstevel extern void sbbc_disable_intr(sbbc_softstate_t *); 212*03831d35Sstevel extern int sbbc_send_intr(sbbc_softstate_t *, int); 213*03831d35Sstevel extern uint_t sbbc_intr_handler(); 214*03831d35Sstevel 215*03831d35Sstevel extern sbbc_softstate_t *sbbc_get_soft_state(int); 216*03831d35Sstevel 217*03831d35Sstevel /* 218*03831d35Sstevel * To protect master_chosen 219*03831d35Sstevel */ 220*03831d35Sstevel extern kmutex_t chosen_lock; 221*03831d35Sstevel 222*03831d35Sstevel #ifdef __cplusplus 223*03831d35Sstevel } 224*03831d35Sstevel #endif 225*03831d35Sstevel 226*03831d35Sstevel #endif /* _SYS_SGSBBC_PRIV_H */ 227