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