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