xref: /titanic_50/usr/src/cmd/picl/plugins/sun4u/snowbird/frutree/piclfrutree.h (revision 7c478bd95313f5f23a4c958a745db2134aa03244)
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, Version 1.0 only
6  * (the "License").  You may not use this file except in compliance
7  * with the License.
8  *
9  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
10  * or http://www.opensolaris.org/os/licensing.
11  * See the License for the specific language governing permissions
12  * and limitations under the License.
13  *
14  * When distributing Covered Code, include this CDDL HEADER in each
15  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
16  * If applicable, add the following below this CDDL HEADER, with the
17  * fields enclosed by brackets "[]" replaced with your own identifying
18  * information: Portions Copyright [yyyy] [name of copyright owner]
19  *
20  * CDDL HEADER END
21  */
22 /*
23  * Copyright 2004 Sun Microsystems, Inc.  All rights reserved.
24  * Use is subject to license terms.
25  */
26 
27 #ifndef	_PICLFRUTREE_H
28 #define	_PICLFRUTREE_H
29 
30 #pragma ident	"%Z%%M%	%I%	%E% SMI"
31 
32 #include <sys/param.h>
33 #include <syslog.h>
34 
35 #ifdef	__cplusplus
36 extern "C" {
37 #endif
38 
39 typedef enum {
40 	NONE		= 0x0,
41 	FRUTREE_INIT 	= 0x1,
42 	EVENTS 		= 0x2,
43 	HASHTABLE 	= 0x4,
44 	PERF_DATA	= 0x8,
45 	EV_COMPLETION	= 0x10,
46 	PRINT_ALL	= 0xFF
47 } frutree_debug_t;
48 
49 #define	FRUTREE_DEBUG0(lvl, fmt) \
50 	if (lvl & frutree_debug) { \
51 		syslog(LOG_DEBUG, fmt);	\
52 	}
53 #define	FRUTREE_DEBUG1(lvl, fmt, d1) \
54 	if (lvl & frutree_debug) { \
55 		syslog(LOG_DEBUG, fmt, d1); \
56 	}
57 #define	FRUTREE_DEBUG2(lvl, fmt, d1, d2) \
58 	if (lvl & frutree_debug) { \
59 		syslog(LOG_DEBUG, fmt, d1, d2);	\
60 	}
61 #define	FRUTREE_DEBUG3(lvl, fmt, d1, d2, d3) \
62 	if (lvl & frutree_debug) { \
63 		syslog(LOG_DEBUG, fmt, d1, d2, d3); \
64 	}
65 #define	FRUTREE_DEBUG4(lvl, fmt, d1, d2, d3, d4) \
66 	if (lvl & frutree_debug) {\
67 		syslog(LOG_DEBUG, fmt, d1, d2, d3, d4); \
68 	}
69 
70 /* environment variables to tune the variables */
71 #define	FRUTREE_DEBUG		"SUNW_FRUTREE_DEBUG"
72 #define	FRUTREE_POLL_TIMEOUT	"SUNW_FRUTREE_POLL_TIMEOUT"
73 #define	FRUTREE_DRWAIT		"SUNW_FRUTREE_DRWAIT_TIME"
74 
75 /* PICL defines */
76 #define	PICL_NODE_CHASSIS		"chassis"
77 
78 /* Sanibel specific defines */
79 #define	SANIBEL_PICLNODE_CPU		"CPU"
80 #define	SANIBEL_PICLNODE_PARALLEL	"ecpp"
81 #define	SANIBEL_NETWORK_LABEL		"ENET"
82 #define	SANIBEL_CPCISLOT_TYPE		"cpci"
83 #define	SANIBEL_NETWORK_PORT		"network"
84 #define	SANIBEL_SERIAL_PORT		"serial"
85 #define	SANIBEL_PARALLEL_PORT		"parallel"
86 #define	SANIBEL_SCSI_SLOT		"scsi"
87 #define	SANIBEL_IDE_SLOT		"ide"
88 #define	SANIBEL_UNKNOWN_SLOT		"unknown"
89 #define	DEVICE_CLASS_SCSI		"scsi"
90 #define	DEVICE_CLASS_IDE		"dada"
91 
92 #define	MAX_BUFSIZE		512
93 #define	SUPER_USER		0
94 #define	DEVFSADM_CMD		"/usr/sbin/devfsadm -i"
95 #define	TEMP_DIR		"/var/tmp/"
96 #define	PROBE_FILE		"probed"
97 #define	NULLREAD		(int (*)(ptree_rarg_t *, void *))0
98 #define	NULLWRITE		(int (*)(ptree_warg_t *, const void *))0
99 
100 #define	PTREE_CREATE_PROP_FAILED	\
101 	gettext("SUNW_frutree:Error in creating property:%s, "\
102 	"under %s(error=%d)")
103 #define	PTREE_POST_PICLEVENT_ERR	\
104 	gettext("SUNW_frutree:Error in posting picl event %s(%s)(error=%d)")
105 #define	PTREE_EVENT_HANDLING_ERR	\
106 	gettext("SUNW_frutree:Error in handling %s event on %s(error=%d)")
107 #define	GET_LOC_STATE_ERR	\
108 	gettext("SUNW_frutree:Error in getting state info for %s"\
109 	"(location)(error=%d)")
110 #define	GET_FRU_STATE_ERR	\
111 	gettext("SUNW_frutree:Error in getting state for %s(fru)(error=%d)")
112 #define	GET_FRU_COND_ERR	\
113 	gettext("SUNW_frutree:Error in getting condition for %s(fru)(error=%d)")
114 #define	CONNECT_FAILED_ERR	\
115 	gettext("SUNW_frutree:Connect operation on %s failed(error=%d)")
116 #define	CONFIGURE_FAILED_ERR	\
117 	gettext("SUNW_frutree:Configure operation on %s failed(error=%d)")
118 #define	UNCONFIG_FAILED_ERR	\
119 	gettext("SUNW_frutree:Unconfigure operation on %s failed(error=%d)")
120 #define	DISCONNECT_FAILED_ERR	\
121 	gettext("SUNW_frutree:Disconnect operation on %s failed(error=%d)")
122 #define	PROBE_FRU_ERR	\
123 	gettext("SUNW_frutree:Error in probing fru under %s(error=%d)")
124 #define	PTREE_UPDATE_PROP_ERR	\
125 	gettext("SUNW_frutree:Error updating %s of %s(error=%d)")
126 #define	PTREE_GET_PROPVAL_ERR	\
127 	gettext("SUNW_frutree:Error in getting value of %s(%s)(error=%d)")
128 #define	PTREE_DEVICE_CREATE_ERR	\
129 	gettext("SUNW_frutree:Error in creating nodes under %s(error=%d)")
130 #define	EVENT_NOT_HANDLED	\
131 	gettext("SUNW_frutree:Error in handling %s on %s(error=%d)")
132 #define	ERROR_REINIT	\
133 	gettext("SUNW_frutree:Error in reinitializing %s")
134 
135 typedef enum {
136 	NO_WAIT = 0,
137 	WAIT
138 } frutree_wait_t;
139 
140 typedef uint8_t frutree_frustate_t;
141 typedef uint8_t frutree_frucond_t;
142 typedef uint8_t	frutree_locstate_t;
143 typedef uint8_t frutree_port_type_t;
144 typedef uint8_t frutree_datatype_t;
145 typedef uint8_t frutree_loctype_t;
146 
147 /* valid fru states */
148 #define	FRU_STATE_UNKNOWN		0x0
149 #define	FRU_STATE_CONFIGURED		0x1
150 #define	FRU_STATE_UNCONFIGURED		0x2
151 #define	FRU_STATE_CONFIGURING		0x3
152 #define	FRU_STATE_UNCONFIGURING		0x4
153 
154 /* valid fru condition */
155 #define	FRU_COND_UNKNOWN		0x0
156 #define	FRU_COND_FAILED			0x1
157 #define	FRU_COND_FAILING		0x2
158 #define	FRU_COND_OK			0x3
159 #define	FRU_COND_TESTING		0x4
160 
161 /* port states */
162 #define	PORT_STATE_DOWN			0x0
163 #define	PORT_STATE_UP			0x1
164 #define	PORT_STATE_UNKNOWN		0x2
165 
166 /* port condition */
167 #define	PORT_COND_OK			0x0
168 #define	PORT_COND_FAILING		0x1
169 #define	PORT_COND_FAILED		0x2
170 #define	PORT_COND_TESTING		0x3
171 #define	PORT_COND_UNKNOWN		0x4
172 
173 /* port types */
174 #define	NETWORK_PORT			0x0
175 #define	SERIAL_PORT			0x1
176 #define	PARALLEL_PORT			0x2
177 #define	UNKNOWN_PORT			0x4
178 
179 /* location states */
180 #define	LOC_STATE_UNKNOWN		0x0
181 #define	LOC_STATE_EMPTY			0x1
182 #define	LOC_STATE_CONNECTED		0x2
183 #define	LOC_STATE_DISCONNECTED		0x3
184 #define	LOC_STATE_CONNECTING		0x4
185 #define	LOC_STATE_DISCONNECTING		0x5
186 
187 /* types of nodes */
188 #define	LOC_TYPE			0x0
189 #define	FRU_TYPE			0x1
190 #define	PORT_TYPE			0x2
191 
192 /* location managers */
193 #define	CFGADM_AP			0x0 /*  managed based on cfgadm data */
194 #define	PLUGIN_PVT			0x1 /* managed by other plugin */
195 #define	STATIC_LOC			0x2 /* managed based on libdevinfo */
196 #define	UNKNOWN				0x3 /* unknown */
197 
198 typedef struct conf_cache {
199 	char 			buf[MAX_BUFSIZE];
200 	struct conf_cache	*next;
201 } frutree_cache_t;
202 
203 typedef struct {
204 	picl_nodehdl_t	nodeh;
205 	picl_prophdl_t	device_tblhdl;
206 	picl_prophdl_t	env_tblhdl;
207 	frutree_cache_t	*first;
208 	frutree_cache_t	*last;
209 	boolean_t	create_cache;
210 } frutree_device_args_t;
211 
212 typedef struct loc_node		frutree_locnode_t;
213 typedef struct fru_node		frutree_frunode_t;
214 typedef struct port_node	frutree_portnode_t;
215 
216 /* information on a particular location */
217 struct loc_node {
218 	picl_nodehdl_t locnodeh;	/* handle of the loc node itself */
219 	char *name;
220 	boolean_t cpu_node;
221 	boolean_t dr_in_progress;
222 	boolean_t autoconfig_enabled;
223 	frutree_loctype_t state_mgr;	/* state manager */
224 	frutree_locstate_t state;	/* present state */
225 	frutree_locstate_t prev_state;	/* previous state */
226 	pthread_mutex_t	mutex;
227 	pthread_cond_t cond_cv;
228 };
229 
230 /* information on a particular port */
231 struct port_node {
232 	picl_nodehdl_t portnodeh;
233 	char *name;
234 	int state;
235 	int cond;
236 	uint8_t instance;
237 	char driver[MAXPATHLEN];
238 };
239 
240 /* information on a particular fru */
241 struct fru_node {
242 	/* variable data */
243 	picl_nodehdl_t frunodeh;
244 	char *name;
245 	frutree_frustate_t state;
246 	frutree_frustate_t prev_state;
247 	frutree_frucond_t cond;
248 	frutree_frucond_t prev_cond;
249 	boolean_t cpu_node;
250 	boolean_t autoconfig_enabled;
251 	boolean_t dr_in_progress;
252 	boolean_t busy;
253 	frutree_loctype_t state_mgr;
254 	char fru_path[MAXPATHLEN];
255 	pthread_mutex_t	mutex;
256 	pthread_cond_t	cond_cv;
257 	pthread_cond_t	busy_cond_cv;
258 };
259 
260 #ifdef	__cplusplus
261 }
262 #endif
263 
264 #endif	/* _PICLFRUTREE_H */
265