xref: /titanic_51/usr/src/uts/common/sys/lom_io.h (revision 45818ee124adeaaf947698996b4f4c722afc6d1f)
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 1999-2002 Sun Microsystems, Inc.  All rights reserved.
24  * Use is subject to license terms.
25  */
26 
27 #ifndef	_SYS_LOM_IO_H
28 #define	_SYS_LOM_IO_H
29 
30 #pragma ident	"%Z%%M%	%I%	%E% SMI"
31 
32 /*
33  * I/O header file for LOMlite Driver.
34  */
35 
36 #ifdef __cplusplus
37 extern "C" {
38 #endif
39 
40 #include <sys/ioccom.h>
41 
42 /* ioctls for the TSalarm card */
43 
44 /*
45  * commands to access the alarm monitor node
46  */
47 
48 #define	TSIOCNBMON	_IOR('a', 1, int)
49 #define	TSIOCWTMON	_IOWR('a', 2, int)
50 #define	TSIOCGETMASK	_IOR('a', 3, int)
51 
52 /*
53  * commands to manipulate the control node
54  */
55 
56 #define	TSIOCALCTL	_IOW('a', 4, ts_aldata_t)
57 #define	TSIOCALSTATE	_IOWR('a', 5, ts_aldata_t)
58 #define	TSIOCDOGSTATE	_IOR('a', 6, ts_dogstate_t)
59 #define	TSIOCDOGCTL	_IOW('a', 7, ts_dogctl_t)
60 #define	TSIOCDOGTIME	_IOW('a', 8, uint_t)
61 #define	TSIOCDOGPAT	_IO('a', 9)
62 #define	TSIOCUNLOCK	_IO('a', 10)
63 
64 /*
65  * Defines for the number of the three alarms
66  */
67 
68 #define	ALARM_NUM_1	1
69 #define	ALARM_NUM_2	2
70 #define	ALARM_NUM_3	3
71 
72 /*
73  * command to tell the driver to output debug information. This information
74  * includes :
75  * - the hardware monitor port (R/O)
76  * - in-core monitor status byte
77  * - the in-core control port
78  * - the watchdog timeout setting
79  */
80 #define	TSIOCDUMP	_IO('a', 11)
81 #define	TSIOCDBCTL	_IOW('a', 12, ts_dbctl_t)
82 
83 /*
84  * typedefs used in alarm ioctl definitions
85  */
86 
87 typedef
88 struct {
89 	int alarm_no;
90 	int alarm_state;
91 } ts_aldata_t;
92 
93 typedef
94 struct {
95 	int reset_enable;
96 	int dog_enable;
97 } ts_dogctl_t;
98 
99 typedef
100 struct {
101 	int reset_enable;
102 	int dog_enable;
103 	uint_t dog_timeout;
104 } ts_dogstate_t;
105 
106 
107 typedef
108 struct {
109 	int db_timing;
110 	int db_debug;
111 } ts_dbctl_t;
112 
113 #define	MAX_PSUS	3
114 #define	MAX_FANS	4
115 #define	NUM_EVENTS	10
116 #define	NUM_ALARMS	3
117 
118 /*
119  * Defines for the lom_ctl_t events/fault led flag.
120  */
121 
122 #define	OFF	1
123 #define	ON	2
124 
125 /*
126  * Defines for a3mode.
127  */
128 
129 #define	WATCHDOG	0x02
130 #define	USER		0x01
131 
132 /*
133  * Defines for PSUSTATE
134  */
135 #define	LOM_PSU_NOACCESS	0x20
136 
137 /* ioctls for the LOMlite card */
138 
139 /*
140  * old commands to access the monitor node
141  */
142 
143 #define	LOMIOCNBMON	TSIOCNBMON
144 #define	LOMIOCWTMON	TSIOCWTMON
145 #define	LOMIOCGETMASK	TSIOCGETMASK
146 
147 /*
148  * old commands to manipulate the control node
149  */
150 
151 #define	LOMIOCALCTL	TSIOCALCTL
152 #define	LOMIOCALSTATE	TSIOCALSTATE
153 #define	LOMIOCDOGSTATE	TSIOCDOGSTATE
154 #define	LOMIOCDOGCTL	TSIOCDOGCTL
155 #define	LOMIOCDOGTIME	TSIOCDOGTIME
156 #define	LOMIOCDOGPAT	TSIOCDOGPAT
157 #define	LOMIOCUNLOCK	TSIOCUNLOCK
158 
159 /*
160  * new commands to access the monitor node
161  */
162 
163 #define	LOMIOCPSUSTATE	_IOR('a', 21, lom_psudata_t)
164 #define	LOMIOCEVENTLOG	_IOR('a', 22, lom_eventlog_t)
165 #define	LOMIOCFANSTATE	_IOR('a', 23, lom_fandata_t)
166 #define	LOMIOCFLEDSTATE _IOR('a', 24, lom_fled_info_t)
167 #define	LOMIOCINFO	_IOR('a', 25, lom_info_t)
168 
169 /*
170  * new commands to manipulate the control node
171  */
172 
173 #define	LOMIOCCLEARLOG	_IO('a', 26)
174 #define	LOMIOCCTL	_IOW('a', 27, lom_ctl_t)
175 #define	LOMIOCPROG	_IOWR('a', 28, lom_prog_t)
176 #define	LOMIOCDAEMON	_IOWR('a', 29, int)
177 #define	LOMIOCDMON	_IOWR('a', 30, int)
178 
179 /*
180  * Command to read general purpose LOMlite inputs.
181  * There are only 3 bits to general purpose inputs.
182  */
183 
184 #define	LOMIOCGPINPUTS	_IOWR('a', 31, int)
185 
186 /*
187  * Manufacture programming command.
188  */
189 
190 #define	LOMIOCMPROG	_IOW('a', 32, lom_mprog_t)
191 #define	LOMIOCMREAD	_IOR('a', 33, lom_mprog_t)
192 
193 #define	LOMIOCLEDSTATE 	_IOR('a', 34, lom_led_state_t)
194 
195 /*
196  * command to tell the driver to output debug information. This information
197  * includes :
198  * - the hardware monitor port (R/O)
199  * - in-core monitor status byte
200  * - the in-core control port
201  * - the watchdog timeout setting
202  */
203 #define	LOMIOCDUMP	TSIOCDUMP
204 #define	LOMIOCDBCTL	TSIOCDBCTL
205 
206 /*
207  * typedefs used in LOMlite ioctl definitions
208  */
209 
210 typedef
211 struct {
212 	int alarm_no;
213 	int state;
214 } lom_aldata_t;
215 
216 typedef
217 struct {
218 	int reset_enable;
219 	int dog_enable;
220 } lom_dogctl_t;
221 
222 typedef
223 struct {
224 	int reset_enable;
225 	int dog_enable;
226 	uint_t dog_timeout;
227 } lom_dogstate_t;
228 
229 
230 typedef
231 struct {
232 	int db_timing;
233 	int db_debug;
234 } lom_dbctl_t;
235 
236 
237 typedef
238 struct {
239 	int fitted[MAX_PSUS];
240 	int output[MAX_PSUS];
241 	int supplya[MAX_PSUS];
242 	int supplyb[MAX_PSUS];
243 	int standby[MAX_PSUS];
244 } lom_psudata_t;
245 
246 typedef
247 struct {
248 	int fitted[MAX_FANS];
249 	int speed[MAX_FANS];
250 	int minspeed[MAX_FANS];
251 } lom_fandata_t;
252 
253 typedef
254 struct {
255 	int events[NUM_EVENTS];
256 	int fatalevent;
257 } lom_eventlog_t;
258 
259 /*
260  * The event codes as used in lom_eventlog_t are coded as described here:
261  *
262  * Event codes encode, in a single byte, the source and type
263  * of event/failure in the system.
264  *
265  * There are two types of failure - fan and PSU.
266  *
267  * Other events need to be stored but do not constitue faults.
268  */
269 #define	LOM_EVENT_NONE		0x00	/* No fault */
270 #define	LOM_EVENT_LOST		0x01	/* Event lost due to buffer overflow */
271 #define	LOM_EVENT_RESET		0x02	/* Reset is asserted by the LOM */
272 #define	LOM_EVENT_PWR_ON	0x03	/* Power is turned on by the LOM */
273 #define	LOM_EVENT_PWR_OFF	0x04	/* Power is turned off by the LOM */
274 #define	LOM_EVENT_WDOG_ON	0x05	/* Host watchdog enabled */
275 #define	LOM_EVENT_WDOG_OFF	0x06	/* Host watchdog disabled */
276 #define	LOM_EVENT_WDOG_TRIG	0x07	/* Host watchdog triggered */
277 #define	LOM_EVENT_LOM_RESET	0x08	/* LOMlite has been reset */
278 #define	LOM_EVENT_CHECKSUM	0x09	/* ROM checksum failure */
279 #define	LOM_EVENT_BUSY		0x0a	/* Event not ready yet (being read) */
280 
281 /*
282  * Fault LED events
283  */
284 #define	LOM_EVENT_FAULT		0x20	/* Fault events - codes 0x20-0x2f */
285 #define	LOM_EVENT_FAULT_MASK	0xf0	/* Fault events - codes 0x20-0x2f */
286 
287 /*
288  * Fault LED events are encoded thus
289  *
290  *  7	 4 3		       0
291  *  ----------------------------
292  * | 0010 | Fault LED frequency |
293  *  ----------------------------
294  *
295  * The "Fault LED frequency" is a 4 bit code allowing for LED
296  * falshing rates of 0 to 14 Hz with a rate of 15 signifying off.
297  *
298  * For example the event code for the assertion of a fault LED rate of 2Hz is:
299  *    LOM_EVENT_FAULT_ENCODE(2);
300  */
301 #define	LOM_EVENT_FAULT_ENCODE(faultRate) \
302 	(LOM_EVENT_FAULT | ((faultRate)&0xf))
303 
304 /*
305  * Alarm events
306  */
307 #define	LOM_EVENT_ALARM		0x30	/* Alarm events - codes 0x30-0x3f */
308 #define	LOM_EVENT_ALARM_MASK	0xf0	/* Alarm events - codes 0x30-0x3f */
309 
310 /*
311  * Alarm events are encoded thus
312  *
313  *  7	 4 3		1    0
314  *  --------------------------
315  * | 0011 | Alarm number | On |
316  *  --------------------------
317  *
318  * The "Alarm number" is a 3 bit code allowing for up to 8 alarms
319  *
320  * For example the event code for the assertion of alarm 2 is:
321  *    LOM_EVENT_ALARM_ENCODE(2, 1);
322  */
323 #define	LOM_EVENT_ALARM_ENCODE(alarmNum, alarmOn) \
324 	(LOM_EVENT_ALARM | (alarmNum<<1) | ((alarmOn)&0x1))
325 
326 /*
327  * These alarms are considered fatal errors
328  */
329 
330 #define	LOM_EVENT_FAN		0x40	/* Fan failure - codes 0x40-0x7f */
331 #define	LOM_EVENT_FAN_MASK	0xc0	/* Fan failure - codes 0x40-0x7f */
332 
333 /*
334  * Fan events are encoded thus
335  *
336  *  7  6 5	    3 2	     0
337  *  --------------------------
338  * | 01 | Fan number | Status |
339  *  --------------------------
340  *
341  * The "Fan number" is a 3 bit code allowing for up to 8 fans
342  *
343  * As yet there are no defined fan statuses.
344  *
345  * For example the event code for a failure on fan 3 is:
346  *    LOM_EVENT_FAN_ENCODE(3, 0);
347  */
348 #define	LOM_EVENT_FAN_ENCODE(fanNum, fanStatus) \
349 	(LOM_EVENT_FAN | (fanNum<<3) | ((fanStatus)&0x7))
350 
351 #define	LOM_EVENT_PSU		0x80	/* PSU failure - codes 0x80-0xbf */
352 #define	LOM_EVENT_PSU_MASK	0xc0	/* PSU failure - codes 0x80-0xbf */
353 
354 /*
355  * These definitions will be picked up elsewhere in embedded code
356  */
357 #ifndef LOM_PSU_PRESENT
358 /*
359  * PSU status flags
360  */
361 #define	LOM_PSU_PRESENT		0x08
362 #define	LOM_PSU_INPUT_A_OK	0x01
363 #define	LOM_PSU_INPUT_B_OK	0x02
364 #define	LOM_PSU_OUTPUT_OK	0x04
365 #define	LOM_PSU_STATUS_MASK	(LOM_PSU_INPUT_A_OK | LOM_PSU_INPUT_B_OK | \
366 				LOM_PSU_OUTPUT_OK)
367 #endif
368 
369 /*
370  * PSU events are encoded thus
371  *
372  *  7  6 5	    3		    2		     1		      0
373  *  -------------------------------------------------------------------
374  * | 10 | PSU number | Output Status | Input B Status | Input A Status |
375  *  -------------------------------------------------------------------
376  *
377  * The PSU number is a 3 bit code allowing for up to 8 PSUs
378  *
379  * The PSU status is derived from the LOM_PSU... definitions.
380  *
381  * For example the event code for an "Input B" failure on PSU 2 is:
382  *    LOM_EVENT_PSU_ENCODE(2, LOM_PSU_INPUT_A_OK | LOM_PSU_OUTPUT_OK);
383  */
384 #define	LOM_EVENT_PSU_ENCODE(psuNum, psuStatus) \
385 	(LOM_EVENT_PSU | (psuNum<<3) | ((psuStatus)&0x7))
386 
387 #define	MAX_LOM2_NAME_STR	16
388 
389 #define	LOM_LED_STATE_OFF		0x00
390 #define	LOM_LED_STATE_ON_STEADY		0x01
391 #define	LOM_LED_STATE_ON_FLASHING	0x02
392 #define	LOM_LED_STATE_ON_SLOWFLASH	0x03
393 #define	LOM_LED_STATE_INACCESSIBLE	0xfd
394 #define	LOM_LED_STATE_STANDBY		0xfe
395 #define	LOM_LED_STATE_NOT_PRESENT	0xff
396 
397 enum states {
398 	LOM_LED_OUTOFRANGE = -3,
399 	LOM_LED_NOT_IMPLEMENTED,
400 	LOM_LED_ACCESS_ERROR,
401 	LOM_LED_OFF,
402 	LOM_LED_ON,
403 	LOM_LED_BLINKING
404 };
405 
406 enum colours {
407 	LOM_LED_COLOUR_NONE = -1,
408 	LOM_LED_COLOUR_ANY,
409 	LOM_LED_COLOUR_WHITE,
410 	LOM_LED_COLOUR_BLUE,
411 	LOM_LED_COLOUR_GREEN,
412 	LOM_LED_COLOUR_AMBER
413 };
414 
415 
416 typedef
417 struct {
418 	int on;
419 } lom_fled_info_t;
420 
421 typedef
422 struct {
423 	int16_t index;
424 	int8_t state;
425 	int8_t colour;
426 	char label[MAX_LOM2_NAME_STR];
427 } lom_led_state_t;
428 
429 typedef
430 struct {
431 	char ser_char;
432 	int a3mode;
433 	int fver;
434 	int fchksum;
435 	int prod_rev;
436 	char prod_id[12];
437 	int events;
438 } lom_info_t;
439 
440 typedef
441 struct {
442 	char ser_char;
443 	int a3mode;
444 	int fault_led;
445 	int events;
446 	int check;
447 } lom_ctl_t;
448 
449 /*
450  * in mprog, config is:
451  *  bits 5-7 no. fans
452  *  bits 3-4 no.psus
453  *  bit 2 tty_con
454  *  bit 1 set to stop fault LED flashing
455  *  bit 0 set if DC PSUs fitted
456  *
457  * fanhz is hz for 100% and fanmin is min speed as %.
458  */
459 
460 typedef
461 struct {
462 	char mod_id[12];
463 	int mod_rev;
464 	int config;
465 	int fanhz[4];
466 	int fanmin[4];
467 } lom_mprog_t;
468 
469 typedef
470 struct {
471 	int index;	    /* top bit should be set if last buffer */
472 	uint8_t data[0x400];
473 	int size;
474 } lom_prog_t;
475 
476 /*
477  * LOMlite2 specific support.
478  */
479 
480 #define	LOMIOCCTL2	_IOW('a', 40, lom_ctl2_t)
481 
482 typedef
483 struct {
484 	char  escape_chars[6];
485 	int   serial_events;
486 } lom_ctl2_t;
487 
488 #define	LOM_EVENT_NOREP	0
489 #define	LOM_EVENT_FATAL	1
490 #define	LOM_EVENT_WARN	2
491 #define	LOM_EVENT_INFO	3
492 #define	LOM_EVENT_USER	4
493 #define	LOM_SER_EVENTS_ON	0x100
494 #define	LOM_SER_EVENTS_OFF	0x200
495 #define	LOM_SER_EVENTS_DEF	0x300
496 #define	DEFAULT_NUM_EVENTS	10
497 
498 #define	LOMIOCVOLTS	_IOR('a', 41, lom_volts_t)
499 #define	MAX_VOLTS	16
500 
501 typedef
502 struct {
503 	int   num;  /* No. of voltage lines being monitored on that system */
504 	char  name[MAX_VOLTS][MAX_LOM2_NAME_STR];
505 	int   status[MAX_VOLTS]; /* 0=ok 1=faulty */
506 	int   shutdown_enabled[MAX_VOLTS];
507 } lom_volts_t;
508 
509 /* status flags (circuit breakers) */
510 
511 #define	LOMIOCSTATS	_IOR('a', 42, lom_sflags_t)
512 #define	MAX_STATS	8
513 
514 typedef
515 struct {
516 	int   num;  /* No. of status flags being monitored on that system */
517 	char  name[MAX_STATS][MAX_LOM2_NAME_STR];
518 	int   status[MAX_STATS]; /* 0=ok 1=faulty */
519 } lom_sflags_t;
520 
521 #define	LOMIOCTEMP	_IOR('a', 43, lom_temp_t)
522 #define	MAX_TEMPS	8
523 
524 typedef
525 struct {
526 	int   num;  /* No. of temps being monitored on that system */
527 	char  name[MAX_TEMPS][MAX_LOM2_NAME_STR];
528 	int   temp[MAX_TEMPS]; /* degrees C */
529 	int   warning[MAX_TEMPS]; /* degrees C - zero if not enabled */
530 	int   shutdown[MAX_TEMPS]; /* degrees C - zero if not enabled */
531 	int   num_ov;  /* No. of overtemp sensors being monitored */
532 	char  name_ov[MAX_TEMPS][MAX_LOM2_NAME_STR];
533 	int   status_ov[MAX_TEMPS]; /* 0=ok 1=faulty */
534 } lom_temp_t;
535 
536 #define	LOMIOCCONS	_IOR('a', 44, lom_cbuf_t)
537 #define	CONS_BUF_SIZE	256
538 
539 typedef
540 struct {
541 	char  lrbuf[CONS_BUF_SIZE];
542 } lom_cbuf_t;
543 
544 #define	LOMIOCEVENTLOG2	_IOWR('a', 45, lom_eventlog2_t)
545 #define	MAX_EVENTS	128
546 #define	MAX_EVENT_STR	80
547 
548 /*
549  * NB no need for 1st fatal as the ioctl can ask for ONLY fatal events.
550  * The driver will return the whole event string, but include the code
551  * and time for mgmt applications.
552  */
553 
554 typedef
555 struct {
556 	int   num; /* no. events requested and no. returned */
557 	int   level; /* level of events requested */
558 	int   code[MAX_EVENTS];
559 	char  string[MAX_EVENTS][MAX_EVENT_STR];
560 	int   time[MAX_EVENTS];
561 } lom_eventlog2_t;
562 
563 #define	LOMIOCINFO2	_IOWR('a', 46, lom2_info_t)
564 
565 /*
566  * We may not display all these properties by default, but add them all
567  * into IOCTL structure to cover future enhancements.
568  */
569 
570 typedef
571 struct {
572 	char escape_chars[6];
573 	int  serial_events; /* as defined for LOMIOCCTL2 */
574 	int a3mode;
575 	int fver;
576 	int fchksum;
577 	int prod_rev;
578 	char prod_id[12];
579 	int serial_config; /* security, timeout, etc */
580 	int baud_rate;
581 	int serial_hw_config; /* stop bit, parity etc */
582 	int phone_home_config; /* TRUE is enabled */
583 	char phone_home_script[128];
584 	char fan_names[MAX_FANS][MAX_LOM2_NAME_STR];
585 } lom2_info_t;
586 
587 /* serial_config defn - bottom 8bits are serial return timeout */
588 #define	LOM_SER_SECURITY 0x10000
589 #define	LOM_SER_RETURN	 0x20000
590 #define	LOM_DISABLE_WDOG_BREAK 0x40000
591 
592 /*
593  * For test ioctl low byte is test number and 2nd byte is the argument supplied
594  * with the test.  Usually, it indicates the number of iterations to perform.
595  * The result is returned in the low byte.
596  */
597 #define	BSCV_LED_TEST			0x06
598 #define	BSCV_LED_TEST_FLASH_ALL		0x01
599 #define	BSCV_LED_TEST_SVC_REQD		0x02
600 #define	BSCV_LED_TEST_DONE		0x00
601 #define	LOMIOCTEST	_IOWR('a', 47, uint32_t)
602 
603 #define	LOMIOCMPROG2	_IOW('a', 48, lom2_mprog_t)
604 #define	LOMIOCMREAD2	_IOR('a', 49, lom2_mprog_t)
605 
606 typedef
607 struct {
608 	int   addr_space;
609 	uint8_t	data[255];
610 } lom2_mprog_t;
611 
612 #define	LOMIOCEVNT	_IOWR('a', 50, int)
613 
614 /*
615  * Due to poll being broken in S8su2 add in ioctl to sleep for arg microsecs
616  */
617 
618 #define	LOMIOCSLEEP	_IOWR('a', 51, int)
619 
620 /*
621  * IOCTL defines for lomp - LOMlite field programming driver.
622  */
623 
624 #define	LOMPIOCRESON	_IO('p', 1)
625 #define	LOMPIOCRESOFF	_IO('p', 2)
626 #define	LOMPIOCFVPPON	_IO('p', 3)
627 #define	LOMPIOCFVPPOFF	_IO('p', 4)
628 
629 
630 
631 #ifdef __cplusplus
632 }
633 #endif
634 
635 #endif	/* _SYS_LOM_IO_H */
636