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 * Copyright 2007 Sun Microsystems, Inc. All rights reserved. 23 * Use is subject to license terms. 24 */ 25 26 #ifndef _SYS_BSCV_IMPL_H 27 #define _SYS_BSCV_IMPL_H 28 29 #pragma ident "%Z%%M% %I% %E% SMI" 30 31 /* 32 * Implementation private header file for bscv driver. 33 */ 34 35 #ifdef __cplusplus 36 extern "C" { 37 #endif 38 39 #include <sys/lom_priv.h> 40 41 42 /* 43 * Local #defines 44 */ 45 46 #define BSCV_SUCCESS DDI_SUCCESS 47 #define BSCV_FAILURE DDI_FAILURE 48 49 /* 50 * The following are used as progress indicators in bscv_attach() 51 */ 52 53 #define BSCV_LOCKS 0x01 54 #define BSCV_MAPPED_REGS 0x02 55 #define BSCV_NODES 0x04 56 #define BSCV_THREAD 0x08 57 #define BSCV_HOSTNAME_DONE 0x10 58 #define BSCV_WDOG_CFG 0x20 59 #define BSCV_SIG_SENT 0x40 60 61 /* 62 * macros to encode device minors and provide mapping to device instances. 63 * The following is designed to get around the problem of a 32-bit app not 64 * supporting a 32-bit minor number on an LP64 model system. 65 */ 66 67 #ifdef NBITSMINOR 68 #undef NBITSMINOR 69 #define NBITSMINOR 18 70 #endif 71 72 #define BSCV_MONITOR_NODE 0 73 #define BSCV_CONTROL_NODE (1 << (NBITSMINOR - 1)) 74 75 #define DEVICETOINSTANCE(x) ((getminor(x)) & (~BSCV_CONTROL_NODE)); 76 77 /* 78 * The maximum number of leds which are supported by this lom implementation. 79 */ 80 #define MAX_LED_ID 7 81 82 /* 83 * general driver configuration constants which may be changed to improve 84 * performance/efficiency. 85 */ 86 87 #define INIT_BUSY_WAIT 10 /* 10 microsecs */ 88 89 #define MAX_WDOGTIMEOUT 127 /* maximum wdog timout - 127s */ 90 91 92 /* 93 * Event processing task status flags. 94 */ 95 #define TASK_ALIVE_FLG 0x01 96 #define TASK_STOP_FLG 0x02 97 #define TASK_SLEEPING_FLG 0x04 98 #define TASK_PAUSE_FLG 0x08 99 #define TASK_EVENT_PENDING_FLG 0x10 100 #define TASK_EVENT_CONSUMER_FLG 0x20 101 102 /* 103 * strace(1M) prints out the debug data once the debug value is set in 104 * the bscv.conf file and the debug driver is installed. 105 * 106 * Debug flags 107 * 108 * '@' - Register (@)ccess 109 * 'A' - (A)ttach 110 * 'B' - (B)lom1 attach extra 111 * 'C' - lom1 (C)allback 112 * 'D' - (D)aemon 113 * 'E' - (E)vents 114 * 'F' - Sel(F)test 115 * 'I' - (I)octl 116 * 'L' - TSa(L)arms 117 * 'M' - (M)odel parameters 118 * 'N' - I(N)terrupt Service Routine 119 * 'O' - (O)pen/Close 120 * 'P' - (P)rogramming 121 * 'Q' - (Q)ueue things 122 * 'R' - Read/Write (R)etry summary. 123 * 'S' - Event (S)trings 124 * 'U' - Programming ioctls 125 * 'V' - ??? 126 * 'W' - (W)atchdog 127 * 'X' - additional X86 functional calls 128 * 'Z' - Temporary - just log things 129 */ 130 131 /* 132 * Debug tips : 133 * 134 * strace(1M) prints out the debug data. 135 * A nice way to work out the debug value set in bscv.conf is to use mdb 136 * Say we want to show 'D' Daemon and 'I' IOCTL processing, 137 * you calculate the debug value with the following mdb session : 138 * # mdb 139 * > 1<<('D'-'@') | 1<<('I'-'@') = X 140 * 210 141 * > $q 142 * When you insert "debug=0x210;" into bscv.conf, it causes the next 143 * reboot with the debug driver to trace Daemon and IOCTL functionality. 144 */ 145 146 /* 147 * Xbus channel access data 148 */ 149 150 struct xbus_channel { 151 ddi_acc_handle_t handle; 152 uint8_t *regs; 153 }; 154 155 #define BSCV_MINCHANNELS 2 156 #define BSCV_MAXCHANNELS 16 157 158 /* 159 * soft state structure 160 */ 161 162 typedef 163 struct { 164 /* 165 * Hardware instance variables 166 */ 167 uint64_t debug; /* debugging turned on */ 168 major_t majornum; /* debugging - major number */ 169 minor_t minornum; /* debugging - minor number */ 170 171 dev_info_t *dip; /* pointer to device info tree */ 172 int instance; /* instance number for the device */ 173 ddi_device_acc_attr_t attr; /* device access attributes */ 174 175 struct xbus_channel channel[BSCV_MAXCHANNELS]; 176 int nchannels; 177 178 int progress; /* progress indicator for attach */ 179 180 int bad_resync; /* Number of bad resyncs */ 181 182 /* 183 * lom data variables/arrays 184 */ 185 uint8_t lom_regs[0x80]; /* registers on the lomlite */ 186 int serial_reporting; 187 int reporting_level; 188 189 /* 190 * lom2 static information. 191 * setup at driver attach and restart after programming. 192 */ 193 int num_fans; 194 char fan_names[MAX_FANS][MAX_LOM2_NAME_STR]; 195 uint8_t fanspeed[MAX_FANS]; 196 char led_names[MAX_LED_ID][MAX_LOM2_NAME_STR]; 197 lom_volts_t volts; /* keep a static copy of this so */ 198 /* dont have to re-read names */ 199 lom_temp_t temps; /* keep a static copy of this so */ 200 /* dont have to re-read names */ 201 lom_sflags_t sflags; /* keep a static copy of this so */ 202 /* dont have to re-read names */ 203 char escape_chars[6]; /* local copy */ 204 205 uint_t watchdog_timeout; 206 uint8_t watchdog_reset_on_timeout; 207 208 /* 209 * lom2 firmware communication 210 */ 211 212 /* 213 * cmd_mutex protects the lom2 command progress variables. 214 * These should only be read/updated with the mutex held. 215 * 216 * command_error - acts as a return code and may be read 217 * without the mutex held if a command is not in progress. 218 * Note a read only returns failure if the lom does not respond. 219 * So you might need to check the error code to see if things really 220 * did work! 221 * 222 * addr_mu is used to protect stopping and starting of the queue. 223 * BUT when programming it has different semantics and relies 224 * on only the programming thread being in the ioctl routine 225 * whilst programming is in progress. The event queue must also 226 * be paused at this time. 227 */ 228 kmutex_t cmd_mutex; /* LOM command mutual exclusion */ 229 230 int command_error; /* error code from last command */ 231 /* valid until the next command */ 232 /* starts. */ 233 234 boolean_t had_fault; /* Current command sequence faulted */ 235 boolean_t had_session_error; /* Current session had error */ 236 237 uint8_t pat_seq; /* Watchdog patting sequence number */ 238 uint8_t cap0; /* capability byte */ 239 uint8_t cap1; /* capability byte */ 240 uint8_t cap2; /* capability byte */ 241 242 /* 243 * Programming variables 244 */ 245 kmutex_t prog_mu; /* Programming mutex. - lom 2 */ 246 boolean_t prog_mode_only; /* If true we can only reprogram */ 247 /* the lom */ 248 boolean_t programming; /* TRUE is actually programming */ 249 /* the BSC */ 250 boolean_t cssp_prog; /* TRUE is CSSP programming the BSC */ 251 252 int prog_index; /* data buffer number - bit */ 253 /* 0x8000 set if last buffer */ 254 int image_ptr; /* ptr to next byte in image buffer */ 255 /* for programming */ 256 uint8_t *image; /* ptr to image buffer for */ 257 /* programming */ 258 boolean_t image2_processing; /* boolean to say which of */ 259 /* 2 BSC images being processed */ 260 boolean_t loader_running; /* Still have the loader running */ 261 262 /* 263 * LOM eeprom window access state 264 * Access under bscv_enter/bscv_exit protection. 265 */ 266 boolean_t eeinfo_valid; 267 uint32_t eeprom_size; 268 uint32_t eventlog_start; 269 uint32_t eventlog_size; 270 boolean_t oldeeptr_valid; 271 uint16_t oldeeptr; 272 273 /* 274 * Communication with the event processing thread 275 * 276 * Change these variables with task_mu held and signal task_cv 277 * if an event/task needs processing. 278 */ 279 kmutex_t task_mu; /* mutex for wait on event thread */ 280 kcondvar_t task_cv; /* cv for wait on event thread */ 281 kcondvar_t task_evnt_cv; /* cv for lom2 wait on event */ 282 int task_flags; /* To monitor/stop the event thread */ 283 volatile int event_active_count; /* Count of event thread runs */ 284 boolean_t event_waiting; /* New events are waiting in the lom */ 285 boolean_t status_change; /* A status change is waiting */ 286 boolean_t nodename_change; /* Nodename has changed */ 287 boolean_t event_sleep; /* Error reading events - wait a bit */ 288 boolean_t event_fault_reported; /* Event fault reported */ 289 boolean_t watchdog_change; /* Watchdog config has changed */ 290 #ifdef __sparc 291 bscv_sig_t last_sig; /* Record of last signature sent */ 292 #endif /* __sparc */ 293 uint8_t last_event[8]; /* last event read and reported */ 294 #if defined(__i386) || defined(__amd64) 295 ddi_periodic_t periodic_id; /* watchdog patter periodical callback */ 296 callb_id_t callb_id; /* Need to store the ID so we can */ 297 /* unschedule the panic callback */ 298 char last_nodename[128]; /* copy of last utsname.nodename */ 299 #endif /* __i386 || __amd64 */ 300 } bscv_soft_state_t; 301 302 struct bscv_idi_callout { 303 enum bscv_idi_type type; /* Type of service */ 304 boolean_t (*fn)(struct bscv_idi_info); /* Function's address */ 305 }; 306 307 #define BSCV_IDI_CALLOUT_MAGIC 0xb5c1ca11 308 #define BSCV_IDI_ERR_MSG_THRESHOLD 10 309 struct bscv_idi_callout_mgr { 310 /* 311 * To allow for sanity check. 312 */ 313 uint32_t magic; 314 315 /* 316 * The instance number of "an" instance of the driver. This is assigned 317 * during driver attach. 318 */ 319 uint32_t valid_inst; 320 321 /* 322 * Table of services offered via the idi interface. 323 */ 324 struct bscv_idi_callout *tbl; 325 326 /* 327 * Error message count since last successful use of the idi interface. 328 */ 329 uint64_t errs; 330 }; 331 332 333 334 #define BSC_IMAGE_MAX_SIZE (0x20000 + sizeof (lom_prog_data_t)) 335 336 #define BSC_PROBE_FAULT_LIMIT 8 /* Tries before declaring lom dead */ 337 #define BSC_EVENT_POLL_NORMAL (drv_usectohz(1000000)) /* 1 second */ 338 #define BSC_EVENT_POLL_FAULTY (drv_usectohz(10000000)) /* 10 second */ 339 340 #define BSC_FAILURE_RETRY_LIMIT 5 /* Access retries before giving up */ 341 #define BSC_ERASE_RETRY_LIMIT 5 /* Erase retries */ 342 #define BSC_PAGE_RETRY_LIMIT 5 /* Page write retries */ 343 344 #define BSC_ADDR_CACHE_LIMIT \ 345 (sizeof (((bscv_soft_state_t *)NULL)->lom_regs)) 346 #define BSC_INFORM_ONLINE 0x4f530100 347 #define BSC_INFORM_OFFLINE 0x4f530201 348 #define BSC_INFORM_PANIC 0x4f530204 349 350 #include <sys/lom_ebuscodes.h> 351 352 typedef uint32_t bscv_addr_t; 353 354 #define BSC_NEXUS_ADDR(ssp, chan, as, index) \ 355 (&((ssp)->channel[chan].regs[((as) * 256) + (index)])) 356 357 #define BSC_NEXUS_OFFSET(as, index) (((as) * 256) + (index)) 358 359 #define BSCVA(as, index) (((as) * 256) + (index)) 360 361 #define PSR_SUCCESS(status) (((status) & EBUS_PROGRAM_PSR_STATUS_MASK) == \ 362 EBUS_PROGRAM_PSR_SUCCESS) 363 364 #define PSR_PROG(status) (((status) & EBUS_PROGRAM_PSR_PROG_MODE) != 0) 365 #ifdef __cplusplus 366 } 367 #endif 368 369 #endif /* _SYS_BSCV_IMPL_H */ 370