xref: /titanic_52/usr/src/uts/sun4u/serengeti/sys/sbdp_priv.h (revision 03831d35f7499c87d51205817c93e9a8d42c4bae)
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