Home | History | Annotate | Download | only in sys
      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