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	_PICL_WATCHDOG_H
28#define	_PICL_WATCHDOG_H
29
30#pragma ident	"%Z%%M%	%I%	%E% SMI"
31
32#ifdef	__cplusplus
33extern "C" {
34#endif
35
36#include <libintl.h>
37#include <sys/inttypes.h>
38#include <smclib.h>
39
40#define	WD_DEBUG0(fmt) \
41	if (wd_debug) { \
42		syslog(LOG_DEBUG, fmt);	\
43	}
44#define	WD_DEBUG1(fmt, d1) \
45	if (wd_debug) { \
46		syslog(LOG_DEBUG, fmt, d1); \
47	}
48
49/* environment variable defs */
50#define	WATCHDOG_DEBUG			"SUNW_WATCHDOG_DEBUG"
51
52/* debug flags */
53#define	WD_GENERAL_MSGS			0x1
54#define	WD_TIME_DEBUG			0x2
55
56/* tunables */
57#define	WD_DEFAULT_THREAD_PRIORITY	0
58#define	WD_POLL_TIMEOUT			10000	/* 10 sec */
59#define	WD_PAT_TIME			5000
60
61/* constants */
62#define	WD_SET_CMD_DATA_LEN		6	/* size for set cmd */
63#define	PICL_WD_PROPVAL_MAX		20
64#define	SUPER_USER			0
65
66/* watchdog status */
67#define	WD_ARMED			0x1	/* watchdog is running */
68#define	WD_EXPIRED			0x2	/* watchdog is expired */
69#define	WD_DISARMED			0x4	/* watchdog is stopped */
70
71/* patting status */
72#define	WD_RESET			0x8	/* client chose to pat. */
73#define	WD_NORESET			0x0	/* pat state initial value. */
74
75/* auto pat feature for SMC f/w */
76#define	ENABLE_AUTO_PAT			0x1
77#define	DISABLE_AUTO_PAT		0x0
78
79/* flags used to track user actions */
80#define	USER_ARMED_WD			0x1	/* user armed the watchdog */
81#define	USER_ARMED_PAT_WD		0x2	/* debug feature */
82#define	USER_PAT_WD			0x3	/* debug feature */
83#define	USER_DISARMED_WD		0x4	/* user disarmed watchdog */
84
85/* bit masks */
86#define	WD_ACTION_NONE1			0x30	/* action none with interrupt */
87#define	WD_ACTION_NONE2			0x00	/* no action */
88#define	WD_ACTION_HARD_RESET		0x01	/* hard reset */
89#define	WD_ACTION_HEALTHY_DOWN_HOST	0x50	/* dont put bridge in reset */
90#define	WD_ACTION_HEALTHY_DOWN_SAT	0x40	/* healthy down, bridge reset */
91#define	WD_USEFLAG_OS			0x04	/* set os as user of wd */
92#define	WD_XPR_FLG_CLR_OS		0x10	/* to clear sms/os expiry bit */
93#define	WD_WD_RUNNING			0x40	/* to check wd running or not */
94#define	WD_ENABLE_AUTO_PAT		0x20	/* enable auto pat feature */
95
96/* timer max values */
97#define	WD_MAX_L2			0xff	/* 255 sec */
98#define	WD_MAX_L1   			0xffff	/* 109.22 min */
99#define	WD_L1_RESOLUTION		100	/* 100ms/cnt */
100#define	WD_L2_RESOLUTION		1000 	/* 1000ms/cnt */
101
102#define	WD1				0x1	/* wd level 1 */
103#define	WD2				0x2	/* wd level 2 */
104#define	WD1_2				0x3	/* wd level 1 and level 2 */
105#define	WD_MAX_SEQN			255
106
107/* PICL node names */
108#define	PICL_NODE_CHASSIS		"chassis"
109#define	PICL_NODE_SYSMGMT		"sysmgmt"
110#define	PICL_NODE_WD_CONTROLLER		"watchdog"
111#define	PICL_NODE_WD_L1			"watchdog-level1"
112#define	PICL_NODE_WD_L2			"watchdog-level2"
113
114/* debug value for wd_op */
115#define	WD_ARM_PAT			"arm-pat"
116
117/* HEALTHY# status */
118#define	WD_HEALTHY_DOWN			0x0
119#define	WD_HEALTHY_UP			0x1
120
121#define	SHUTDOWN_CMD			"shutdown -y -i 6 -g 60 watchdog "\
122					"expired.. rebooting"
123/* watchdog config file variables */
124#define	PICL_CONFIG_DIR			"/etc/picl/config"
125#define	WD_CONF_FILE			"watchdog.conf"
126#define	WD_CONF_MAXSIZE			100
127#define	WD_DELIMETER			" \t\n"
128
129/* The following values can be tuned using config file */
130#define	WD_PAT_THREAD_PRIORITY		"wd_thread_priority"
131#define	WD_PATTING_TIME			"wd_pat_time"
132#define	WD_ENABLE			"watchdog-enable"
133
134#define	WD_HOST				1
135#define	WD_STANDALONE			2
136
137/* HEALTHY# bitmask */
138#define	IS_HEALTHY			0x01
139
140#define	DEFAULT_SEQN			15
141#define	DEFAULT_FD			-1
142#define	SMC_NODE			"/dev/ctsmc"
143
144#define	WD_REGISTER_LEN			8
145
146typedef struct {
147	/* properties values */
148	uint8_t 	wd1_run_state;	/* L1 status */
149	uint8_t 	wd1_action;	/* L1 action */
150	uint8_t 	wd2_run_state;	/* L2 status */
151	uint8_t 	wd2_action;	/* L2 action */
152	int32_t		wd1_timeout;	/* L1 timeout */
153	int32_t		wd2_timeout;	/* L2 timeout */
154	uchar_t		wd_pat_state;	/* pat state */
155	boolean_t 	reboot_action;	/* is reboot action set */
156	boolean_t 	is_host;	/* is a host or standalone CPU */
157
158	/* Cache for PICL handles */
159	picl_nodehdl_t	wd_ctrl_nodehdl;	/* watchdog controller */
160						/* prop handle for op  */
161	picl_prophdl_t	wd_ops_hdl;
162
163	picl_prophdl_t	wd1_state_hdl;
164	picl_prophdl_t	wd1_timeout_hdl;
165	picl_prophdl_t	wd1_action_hdl;
166	picl_nodehdl_t	wd1_nodehdl;		/* L1 node handle */
167
168	picl_prophdl_t	wd2_state_hdl;
169	picl_prophdl_t	wd2_timeout_hdl;
170	picl_prophdl_t	wd2_action_hdl;
171	picl_nodehdl_t	wd2_nodehdl;		/* L2 node handle */
172} wd_data_t;
173
174/* structure to hold watchdog status */
175typedef struct {
176	int		present_state;
177	uint8_t		action1;
178	uint8_t		action2;
179	uint8_t		timeout1[2];
180	uint8_t		timeout2;
181	uint8_t		present_t1[2];
182} wd_state_t;
183
184/* Error messages */
185#define	WD_PICL_NOSPACE	\
186	gettext("SUNW_piclwatchdog: Error in memory allocation")
187#define	WD_PICL_REG_ERR	\
188	gettext("SUNW_piclwatchdog: Failed to register with picl framework,"\
189	" error = %d")
190#define	WD_PICL_SMC_OPEN_ERR \
191	gettext("SUNW_piclwatchdog: Error in opening SMC drv")
192#define	WD_PICL_EXCLUSIVE_ACCESS_ERR \
193	gettext("SUNW_piclwatchdog: Error in getting exclusive access "\
194	"for watchdog commands")
195#define	WD_PICL_THREAD_CREATE_FAILED \
196	gettext("SUNW_piclwatchdog: Error in creating %s thread")
197#define	WD_PICL_PROP_INIT_ERR \
198	gettext("SUNW_piclwatchdog: ptree prop init call failed:%d")
199#define	WD_NODE_INIT_ERR \
200	gettext("SUNW_piclwatchdog: Error in creating watchdog nodes(%d):%d")
201#define	WD_PICL_GET_STAT_ERR \
202	gettext("SUNW_piclwatchdog: Error in getting the watchdog status")
203#define	WD_PICL_GET_ERR	\
204	gettext("SUNW_piclwatchdog: Error in getting watchdog status,"\
205	" error = %d")
206#define	WD_PICL_PAT_ERR \
207	gettext("SUNW_piclwatchdog: Error in patting the watchdog"\
208	" error = %d")
209#define	WD_PICL_START_ERR \
210	gettext("SUNW_piclwatchdog: Error in starting the watchdog, error = %d")
211#define	WD_PICL_STOP_ERR \
212	gettext("SUNW_piclwatchdog: Error in stopping the watchdog,"\
213	" error = %d")
214#define	WD_PICL_SET_ATTR_FAILED	\
215	gettext("SUNW_piclwatchdog: Error in setting attributes for a stream")
216#define	WD_PICL_RT_THRD_FAIL \
217	gettext("SUNW_piclwatchdog: Error in creating real time thread")
218#define	WD_PICL_RT_THRD_NO_PERM_ERR \
219	gettext("SUNW_piclwatchdog: No perm to change the priority of thread")
220#define	WD_PICL_NO_WD_ERR \
221	gettext("SUNW_piclwatchdog: Watchdog is not running")
222#define	WD_PICL_WD1_RUNNING_ERR	\
223	gettext("SUNW_piclwatchdog: Disarm the Watchdog level 1")
224#define	WD_PICL_WD2_RUNNING_ERR	\
225	gettext("SUNW_piclwatchdog: Disarm the Watchdog level 2")
226#define	WD_PICL_SMC_READ_ERR \
227	gettext("SUNW_piclwatchdog: Error in reading from SMC")
228#define	WD_PICL_SMC_WRITE_ERR \
229	gettext("SUNW_piclwatchdog: Error in writing to SMC")
230#define	WD_NO_ROOT_PERM	\
231	gettext("SUNW_piclwatchdog: Root perm are reqd to perform this op.")
232#define	WD_PICL_POLL_ERR \
233	gettext("SUNW_piclwatchdog: Error in poll system call")
234#define	WD_PICL_INVALID_T1 \
235	gettext("SUNW_piclwatchdog: Invalid timeout value for wd level 1")
236#define	WD_PICL_INVALID_T2 \
237	gettext("SUNW_piclwatchdog: Invalid timeout value for wd level 2")
238#define	WD_PICL_TMOUT_LV1_LV2_SETTO_0 \
239	gettext("SUNW_piclwatchdog: Invalid timeout val for wd level 1 & 2")
240#define	WD_PICL_INVALID_ACTION1 \
241	gettext("SUNW_piclwatchdog: Invalid action for level one")
242#define	WD_PICL_INVALID_ACTION2	\
243	gettext("SUNW_piclwatchdog: Invalid action for level two")
244#define	WD_PICL_CLEAR_EXCL_ERR \
245	gettext("SUNW_piclwatchdog: Error in clearing exclusive "\
246			"access for watchdog commands")
247#define	WD_PICL_POST_EVENT_ERR \
248	gettext("SUNW_piclwatchdog: Error in posting wd expiry event,"\
249	" error = %d")
250#define	WD_PICL_COND_SIGNAL_ERR	\
251	gettext("SUNW_piclwatchdog: Error in cond_signal")
252#define	WD_PICL_IS_NOT_SUPPORTED \
253	gettext("SUNW_piclwatchdog: This feature is not supported")
254#define	WD_PICL_TRY_PAT_ERR \
255	gettext("SUNW_piclwatchdog: OS is already patting the watchdog")
256#define	WD_PICL_GET_TIMEOUT_ERR	\
257	gettext("SUNW_piclwatchdog: Error in getting the timeout values")
258#define	WD_PICL_ARM_PAT_ERR \
259	gettext("SUNW_piclwatchdog: Illegal timeout values for arm-pat op")
260#define	WD_PICL_PERM_DENIED \
261	gettext("SUNW_piclwatchdog: This client is not the owner of watchdog")
262#define	WD_PICL_PAT_TIME_ERR \
263	gettext("SUNW_piclwatchdog: Negative value for pat_time \
264	is not allowed")
265#define	WD_PICL_STATE_INVALID \
266	gettext("SUNW_piclwatchdog: WD operations not allowed while "\
267	"chassis state is configuring")
268#define	WD_HEALTHY_ERR \
269	gettext("SUNW_piclwatchdog: Cannot arm the watchdog, "\
270	"action already taken")
271#define	WD_GET_OWN_FAILED \
272	gettext("SUNW_piclwatchdog: Error in finding active owner of watchdog,"\
273	" error = %d")
274#define	WD_NVLIST_ERR \
275	gettext("SUNW_piclwatchdog: Error in posting watchdog event"\
276	"(nvlist error), error = %d")
277#define	WD_GET_HEALTH_ERR \
278	gettext("SUNW_piclwatchdog: Error in getting HEALTHY# status")
279#define	WD_UPDATE_STATE_ERR \
280	gettext("SUNW_piclwatchdog: Error in updating watchdog state,"\
281	"error = %d")
282#define	WD_WD1_EXPIRED \
283	gettext("SUNW_piclwatchdog: watchdog level 1 expired")
284#ifdef	__cplusplus
285}
286#endif
287
288#endif	/* _PICL_WATCHDOG_H */
289