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 33 extern "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 146 typedef 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 */ 175 typedef 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