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 /*
23  * Copyright 2005 Sun Microsystems, Inc.  All rights reserved.
24  * Use is subject to license terms.
25  */
26 
27 #ifndef	_SYS_RMC_COMM_HPROTO_H
28 #define	_SYS_RMC_COMM_HPROTO_H
29 
30 #pragma ident	"%Z%%M%	%I%	%E% SMI"
31 
32 #ifdef	__cplusplus
33 extern "C" {
34 #endif
35 
36 /*
37  * data types used in the data protocol fields
38  */
39 
40 typedef unsigned char rsci8;
41 typedef unsigned short rsci16;
42 
43 typedef short rscis16;
44 
45 #ifdef _LP64
46 typedef unsigned int rsci32;
47 typedef unsigned long rsci64;
48 #else
49 typedef unsigned long rsci32;
50 typedef unsigned long long rsci64;
51 #endif
52 
53 /*
54  * handle definition. Handles are used in the high-level data protocol
55  * to identify FRU, sensors (temperature, voltage), and so on.
56  */
57 
58 typedef rsci16 dp_handle_t;
59 
60 #define	DP_NULL_HANDLE		0xffff
61 
62 #define	DP_MAX_HANDLE_NAME	32
63 
64 #define	DP_NULL_MSG		0x00
65 
66 /*
67  * Supported message types and associated data types:
68  */
69 
70 #define	DP_RESET_RSC		0x7A
71 
72 #define	DP_RESET_RSC_R		0x5A
73 
74 #define	DP_UPDATE_FLASH		0x66
75 
76 #define	DP_UPDATE_FLASH_R	0x46
77 typedef struct dp_update_flash_r {
78 	rsci32	status;		/* completion code */
79 } dp_update_flash_r_t;
80 
81 #define	DP_RUN_TEST		0x74
82 typedef struct dp_run_test {
83 	rsci32	testno;		/* test number to run; see below. */
84 	rsci32	param_len;	/* # bytes in test parameter data. */
85 } dp_run_test_t;
86 /* followed by test parameters; see individual tests below. */
87 
88 #define	DP_RUN_TEST_R		0x54
89 typedef struct dp_run_test_r {
90 	rsci32	status;		/* 0 = test passed, otherwise see failure */
91 				/* codes below. */
92 	rsci32	idatalen;	/* # items in input data array */
93 	rsci32	odatalen;	/* # items in output data array */
94 #define	DP_MAX_RUN_TEST_DATALEN (DP_MAX_MSGLEN-32)/2
95 	rsci8	idata[DP_MAX_RUN_TEST_DATALEN];	/* input data array */
96 	rsci8	odata[DP_MAX_RUN_TEST_DATALEN];	/* output data array */
97 } dp_run_test_r_t;
98 
99 #define	RSC_TEST_PASSED		0
100 #define	RSC_TEST_SW_FAILURE	1
101 #define	RSC_TEST_BAD_DATA	2
102 #define	RSC_TEST_NO_RESPONSE	3
103 #define	RSC_TEST_BAD_CRC	4
104 #define	RSC_TEST_BAD_PARAMS	5
105 #define	RSC_TEST_NO_DEVICE	6
106 #define	RSC_TEST_DEV_SETUP_FAIL	7
107 #define	RSC_TEST_MEM_ALLOC_FAIL	8
108 #define	RSC_TEST_ENET_ADDR_FAIL	9
109 #define	RSC_TEST_DEV_INFO_FAIL	10
110 #define	RSC_TEST_NYI		255
111 
112 #define	DP_RSC_STATUS		0x73
113 
114 #define	DP_RSC_STATUS_R		0x53
115 typedef struct dp_rsc_status_r {
116 /* The first six fields here must not be changed to ensure that they  */
117 /* are the same in all versions of RSC, most notably when compared to */
118 /* 1.x. New fields must be added to the end of the structure. */
119 	rsci16	main_rev_major;
120 	rsci16	main_rev_minor;
121 	rsci16	bootmon_rev_major;
122 	rsci16	bootmon_rev_minor;
123 	rsci16	post_status;
124 	rsci16	nusers;		/* number of users currently logged in to */
125 				/* CLI.  */
126 /* Any new fields in the structure may be added after this point ONLY! */
127 	rsci16	release_rev_major;
128 	rsci16	release_rev_minor;
129 	rsci16	release_rev_micro;
130 	rsci16	main_rev_micro;
131 	rsci16	bootmon_rev_micro;
132 	rsci16	hardware_rev;
133 
134 	rsci32 bm_cksum;
135 	rsci8  rsc_build;
136 	char creationDate[256];
137 	rsci32 fw_cksum;
138 	rsci32 sys_mem;
139 	rsci32 nvram_version;
140 
141 } dp_rsc_status_r_t;
142 
143 #define	DP_SET_CFGVAR		0x76
144 typedef struct dp_set_cfgvar {
145 	rsci32	hidden;		/* boolean */
146 } dp_set_cfgvar_t;
147 
148 /* Data is variable name & new value as zero-terminated ascii strings. */
149 
150 #define	DP_SET_CFGVAR_R		0x56
151 typedef struct dp_set_cfgvar_r {
152 	rsci32	status;		/* completion code */
153 } dp_set_cfgvar_r_t;
154 
155 #define	DP_GET_CFGVAR		0x67
156 /* Data is variable name as zero-terminated ascii string. */
157 
158 #define	DP_GET_CFGVAR_R		0x47
159 typedef struct dp_get_cfgvar_r {
160 	rsci32	status;		/* completion code */
161 } dp_get_cfgvar_r_t;
162 /* followed by value of variable as a zero-terminated ascii string. */
163 
164 #define	DP_GET_CFGVAR_NAME	0x6E
165 /*
166  * Data is variable name as zero-terminated ascii string.  A zero-length
167  * string means 'return the name of the "first" variable.'
168  */
169 
170 #define	DP_GET_CFGVAR_NAME_R	0x4E
171 typedef struct dp_get_cfgvar_name_r {
172 	rsci32	status;		/* completion code */
173 } dp_get_cfgvar_name_r_t;
174 /* followed by name of "next" variable as a zero-terminated ascii string. */
175 
176 #define	DP_SET_DATE_TIME		0x64
177 #define	DP_SET_DATE_TIME_IGNORE_FIELD	0xFFFF
178 typedef struct dp_set_date_time {
179 	rsci32	year;		/* Full year, IE 1997 */
180 	rsci32	month;		/* 1 = Jan, 2 = Feb, etc. */
181 	rsci32	day;		/* Day of the month, 1 to 31. */
182 	rsci32	hour;		/* 0 to 23 */
183 	rsci32	minute;		/* 0 to 59 */
184 	rsci32	second;		/* 0 to 59 */
185 } dp_set_date_time_t;
186 
187 #define	DP_SET_DATE_TIME_R	0x44
188 typedef struct dp_set_date_time_r {
189 	rsci32	status;		/* 0 - succes, non-zero - fail. */
190 } dp_set_date_time_r_t;
191 
192 #define	DP_GET_DATE_TIME	0x65
193 #define	DP_GET_DATE_TIME_R	0x45
194 typedef struct dp_get_date_time_r {
195 	rsci32	status;		/* completion code */
196 	rsci32	current_datetime; /* in Unix format */
197 } dp_get_date_time_r_t;
198 /* followed by the date represented as a zero-terminated ascii string. */
199 
200 
201 #define	DP_SEND_ALERT		0x61
202 typedef struct dp_send_alert {
203 	rsci32	critical; /* boolean */
204 } dp_send_alert_t;
205 
206 #define	DP_SEND_ALERT_R		0x41
207 typedef struct dp_send_alert_r {
208 	rsci32	status;		/* completion code */
209 } dp_send_alert_r_t;
210 
211 #define	DP_GET_TEMP		0x78
212 
213 #define	DP_GET_TEMP_R		0x58
214 typedef struct dp_get_temp_r {
215 	rsci32	status;
216 	rsci32	current_temp;
217 } dp_get_temp_r_t;
218 
219 /*
220  * Implementations using this level of protocol or above,
221  * will generate a response to any supplied command code.
222  * This doesn't mean they will support a given command.
223  * It only means that they will generate a response to that
224  * command.
225  */
226 #define	SDP_RESPONDS_TO_ALL_CMDS	3
227 
228 #define	DP_GET_SDP_VERSION	0x7B
229 
230 #define	DP_GET_SDP_VERSION_R	0x5B
231 typedef struct dp_get_sdp_version_r {
232 	rsci32	version;
233 } dp_get_sdp_version_r_t;
234 
235 #define	DP_GET_TOD_CLOCK	0x7C
236 
237 #define	DP_GET_TOD_CLOCK_R	0x5C
238 typedef struct dp_get_tod_clock_r {
239 	rsci32	current_tod;
240 } dp_get_tod_clock_r_t;
241 
242 #define	DP_MAX_LOGSIZE		(DP_MAX_MSGLEN-24)
243 
244 #define	DP_GET_EVENT_LOG	0x7D
245 
246 /*
247  * NOTE: changing this or the dp_event_log_entry structure will almost
248  * certainly require changing the code that parses these structures
249  * in scadm.  See src/cmd/scadm/sparcv9/mpxu/common/eventlog.c.
250  */
251 #define	DP_GET_EVENT_LOG_R	0x5D
252 typedef struct dp_get_event_log_r {
253 	rsci32	entry_count;
254 	rsci8	data[DP_MAX_LOGSIZE];
255 } dp_get_event_log_r_t;
256 
257 typedef struct dp_event_log_entry {
258 	rsci32	eventTime;
259 	rsci32	eventId;
260 	rsci32	paramLen;
261 	char	param[256];
262 } dp_event_log_entry_t;
263 
264 #define	DP_GET_PCMCIA_INFO	0x7E
265 
266 #define	DP_GET_PCMCIA_INFO_R	0x5E
267 typedef struct dp_get_pcmcia_info_r {
268 	rsci32	card_present;	/* true=present, false=no card */
269 	rsci32	idInfoLen;
270 	rsci8	idInfo[256];
271 } dp_get_pcmcia_info_r_t;
272 
273 
274 #define	DP_USER_MAX		16
275 #define	DP_USER_NAME_SIZE	16
276 
277 /* User sub-commands */
278 #define	DP_USER_CMD_ADD		0x1
279 #define	DP_USER_CMD_DEL		0x2
280 #define	DP_USER_CMD_SHOW	0x3
281 #define	DP_USER_CMD_PASSWORD	0x4
282 #define	DP_USER_CMD_PERM	0x5
283 
284 /*
285  * The following fields are used to set the user permissions.
286  * Each must be represented as a single bit in the parm field.
287  */
288 #define	DP_USER_PERM_C		0x1
289 #define	DP_USER_PERM_U		0x2
290 #define	DP_USER_PERM_A		0x4
291 #define	DP_USER_PERM_R		0x8
292 
293 /*
294  * values for parm for CMD_SHOW.  Anything other than 0 will show
295  * the user # up to and including DP_USER_MAX
296  */
297 #define	DP_USER_SHOW_USERNAME	0x0
298 
299 /* Error values for status */
300 #define	DP_ERR_USER_FULL	0x1  /* No free user slots */
301 #define	DP_ERR_USER_NONE	0x2  /* User does not exist */
302 #define	DP_ERR_USER_BAD		0x3  /* Malformed username */
303 #define	DP_ERR_USER_NACT	0x4  /* user # not activated */
304 #define	DP_ERR_USER_THERE	0x5  /* user already registered */
305 #define	DP_ERR_USER_PASSWD	0x6  /* invalid password */
306 #define	DP_ERR_USER_WARNING	0x7  /* Malformed username warning */
307 #define	DP_ERR_USER_NYI		0xFD /* Not yet implemented */
308 #define	DP_ERR_USER_UNDEF	0xFE /* Undefine error */
309 #define	DP_ERR_USER_CMD		0xFF /* Invalid Command */
310 
311 #define	DP_USER_ADM		0x50
312 /*
313  * The parm field is used by the permission command to set specific
314  *  permissions.  The parm field is also used by the show command to
315  * indicate if the user name is specified or not.
316  */
317 typedef struct dp_user_adm {
318 	rsci32	command;
319 	rsci32	parm;
320 } dp_user_adm_t;
321 /*
322  * followed by zero-terminated ascii strings.  All user commands
323  * are followed by the username. The password command is also
324  * followed by the password.
325  */
326 
327 #define	DP_USER_ADM_R		0x51
328 /*
329  * the response field is used to return the user permissions
330  * for the user permissions command. The response is also used
331  * to echo back the user selection for the show command.
332  */
333 typedef struct dp_user_adm_r {
334 	rsci32	status;		/* completion code */
335 	rsci32  command;	/* echo back adm command */
336 	rsci32	response;
337 } dp_user_adm_r_t;
338 /* followed by a zero-terminated ascii string for the show command.  */
339 
340 
341 #define	DP_MODEM_PASS		0
342 #define	DP_MODEM_FAIL		-1
343 
344 /* Commands used for rscadm modem_setup */
345 #define	DP_MODEM_CONNECT	0x30
346 #define	DP_MODEM_CONNECT_R	0x31
347 typedef struct dp_modem_connect_r {
348 	rsci32	status;
349 } dp_modem_connect_r_t;
350 
351 /* There is no reponse to a modem_data command */
352 /* The modem data command goes in both directions */
353 #define	DP_MODEM_DATA		0x32
354 /* followed by a zero-terminated ascii string */
355 
356 #define	DP_MODEM_DISCONNECT	0x34
357 #define	DP_MODEM_DISCONNECT_R	0x35
358 typedef struct dp_modem_disconnect_r {
359 	rsci32	status;
360 } dp_modem_disconnect_r_t;
361 
362 
363 #define	DP_GET_TICKCNT		0x22
364 #define	DP_GET_TICKCNT_R	0x23
365 typedef struct dp_get_tickcnt_r {
366 	rsci32	upper;		/* MSW of 64 bit tick count */
367 	rsci32	lower;		/* LSW of 64 bit tick count */
368 } dp_get_tickcnt_r_t;
369 
370 
371 #define	DP_SET_DEFAULT_CFG	0x72
372 
373 #define	DP_SET_DEFAULT_CFG_R	0x52
374 typedef struct dp_set_default_cfg_r {
375 	rsci32	status;
376 } dp_set_default_cfg_r_t;
377 
378 
379 #define	DP_GET_NETWORK_CFG	0x59
380 
381 #define	DP_GET_NETWORK_CFG_R	0x79
382 typedef struct dp_get_network_cfg_r {
383 	rsci32	status;
384 	char	ipMode[7];
385 	char	ipAddr[16];
386 	char	ipMask[16];
387 	char	ipGateway[16];
388 	char	ethAddr[18];
389 	char	ipDHCPServer[16];
390 } dp_get_network_cfg_r_t;
391 
392 
393 /*
394  * Parameters for DP_RUN_TEST message:
395  */
396 
397 /*
398  * Test routines need to know what the low-level protocol sync
399  * character is.
400  */
401 
402 #define	RSC_TEST_SERIAL		0
403 typedef struct rsc_serial_test {
404 	rsci32	testtype;
405 #define	RSC_SERIAL_TTYC_LB	0
406 #define	RSC_SERIAL_TTYC_LB_OFF	1
407 #define	RSC_SERIAL_TTYD_LB	2
408 #define	RSC_SERIAL_TTYD_LB_OFF	3
409 #define	RSC_SERIAL_TTYCD_LB	4
410 #define	RSC_SERIAL_TTYCD_LB_OFF	5
411 #define	RSC_SERIAL_TTYU_INT_LB	6
412 #define	RSC_SERIAL_TTYU_EXT_LB	7
413 	rsci32	baud;
414 	rsci32	passes;
415 	rsci32	datalen;
416 	rsci8	data[DP_MAX_MSGLEN-32];
417 } rsc_serial_test_t;
418 
419 #define	RSC_TEST_ENET		1
420 typedef struct rsc_enet_test {
421 	rsci32	testtype;
422 #define	RSC_ENET_INT_LB		0
423 #define	RSC_ENET_EXT_LB		1
424 #define	RSC_ENET_PING		2
425 #define	RSC_ENET_INT_PHY_LB	3
426 	rsci8	ip_addr[4];
427 	rsci32	passes;
428 	rsci32	datalen;
429 	rsci8	data[DP_MAX_MSGLEN-32];
430 } rsc_enet_test_t;
431 
432 #define	RSC_TEST_FLASH_CRC	2
433 typedef struct rsc_flash_crcs_r {
434 	rsci32	boot_crc;
435 	rsci32	main_crc;
436 } rsc_flash_crcs_r_t;
437 
438 #define	RSC_TEST_SEEPROM_CRC	3
439 typedef struct rsc_seeprom_crcs_r {
440 	rsci32	hdr_crc;
441 	rsci32	main_crc;
442 } rsc_seeprom_crcs_r_t;
443 
444 #define	RSC_TEST_FRU_SEEPROM_CRC 4
445 typedef struct rsc_fru_crcs_r {
446 	rsci32	ro_hdr_crc;
447 	rsci32	seg_sd_crc;
448 } rsc_fru_crcs_r_t;
449 
450 
451 /*
452  * new commands definitions
453  */
454 
455 #define	DP_GET_SYSINFO		0x20
456 
457 #define	DP_GET_SYSINFO_R	0x21
458 typedef struct dp_get_sysinfo_r {
459 	rsci8 maxTemp;		/* max number of temperature sensors */
460 	rsci8 maxFan;		/* max number of FANs */
461 	rsci8 maxPSU;		/* max number of PSUs slot */
462 	rsci8 maxLED;		/* max number of LEDs */
463 	rsci8 maxVolt;		/* max number of voltage sensors */
464 	rsci8 maxFRU;		/* max number of FRUs (field replac. unit)  */
465 	rsci8 maxCircuitBrks;	/* max number of circuit breakers */
466 	rsci8 keyswitch;	/* key switch setting value */
467 } dp_get_sysinfo_r_t;
468 
469 
470 #define	DP_GET_TEMPERATURES	0x24
471 typedef struct dp_get_temperatures {
472 	dp_handle_t handle;	/* handle of a temperature sensor */
473 				/* or <null handle> (0xffff) */
474 } dp_get_temperatures_t;
475 
476 /* Data is variable name & new value as zero-terminated ascii strings. */
477 
478 #define	DP_GET_TEMPERATURES_R	0x25
479 typedef rscis16		dp_tempr_t;
480 
481 enum sensor_status {
482 	DP_SENSOR_DATA_AVAILABLE = 0,
483 	DP_SENSOR_DATA_UNAVAILABLE,
484 	DP_SENSOR_NOT_PRESENT
485 };
486 
487 typedef struct dp_tempr_status {
488 	dp_handle_t	handle;
489 	rsci8		sensor_status; 	/* tells whether the reading is */
490 					/* available or not */
491 	dp_tempr_t	value;	/* temperature value (celsius). */
492 
493 	dp_tempr_t 	low_warning;
494 	dp_tempr_t 	low_soft_shutdown;
495 	dp_tempr_t 	low_hard_shutdown;
496 	dp_tempr_t 	high_warning;
497 	dp_tempr_t 	high_soft_shutdown;
498 	dp_tempr_t 	high_hard_shutdown;
499 
500 } dp_tempr_status_t;
501 
502 typedef struct dp_get_temperatures_r {
503 	rsci8			num_temps;
504 	dp_tempr_status_t	temp_status[1];
505 
506 } dp_get_temperatures_r_t;
507 
508 
509 #define	DP_GET_FAN_STATUS	0x26
510 typedef struct dp_get_fan_status {
511 	dp_handle_t handle;	/* handle of a temperature sensor */
512 				/* or <null handle> (0xffff) */
513 } dp_get_fan_status_t;
514 
515 #define	DP_GET_FAN_STATUS_R	0x27
516 
517 typedef struct dp_fan_status {
518 	dp_handle_t	handle;
519 	rsci8		sensor_status; 	/* tells whether the reading is */
520 					/* available or not */
521 	rsci8 		flag;
522 
523 #define	DP_FAN_PRESENCE		0x01	/* FAN presence (bit set=FAN present) */
524 #define	DP_FAN_SPEED_VAL_UNIT	0x02	/* speed unit	(bit set=relative, */
525 					/*		bit clear=RPM) */
526 #define	DP_FAN_STATUS		0x04	/* FAN status (bit set=error) */
527 
528 	rsci16		speed;	/* FAN speed. */
529 	rsci16		minspeed; /* minimum FAN speed warning threshold */
530 
531 } dp_fan_status_t;
532 
533 typedef struct dp_get_fan_status_r {
534 	rsci8		num_fans;
535 	dp_fan_status_t	fan_status[1];
536 
537 } dp_get_fan_status_r_t;
538 
539 
540 #define	DP_GET_PSU_STATUS	0x28
541 typedef struct dp_get_psu_status {
542 	dp_handle_t handle;	/* handle of a temperature sensor */
543 				/* or <null handle> (0xffff) */
544 } dp_get_psu_status_t;
545 
546 #define	DP_GET_PSU_STATUS_R	0x29
547 typedef struct dp_psu_status {
548 	dp_handle_t	handle;
549 	rsci8		sensor_status; 	/* tells whether the reading is */
550 					/* available or not */
551 	rsci16 		mask;		/* flag bit mask (feature presence) */
552 	rsci16 		flag;		/* status bits */
553 
554 #define	DP_PSU_PRESENCE			0x0001	/* PSU presence  */
555 #define	DP_PSU_OUTPUT_STATUS		0x0002	/* output status */
556 #define	DP_PSU_INPUT_STATUS		0x0004	/* input status */
557 #define	DP_PSU_SEC_INPUT_STATUS		0x0008	/* secondary input status */
558 #define	DP_PSU_OVERTEMP_FAULT		0x0010	/* over temperature fault */
559 #define	DP_PSU_FAN_FAULT    		0x0020	/* FAN fault */
560 #define	DP_PSU_FAIL_STATUS		0x0040	/* PSU generic fault */
561 #define	DP_PSU_OUTPUT_VLO_STATUS	0x0080	/* output under voltage */
562 #define	DP_PSU_OUTPUT_VHI_STATUS	0x0100	/* output over voltage */
563 #define	DP_PSU_OUTPUT_AHI_STATUS	0x0200	/* output over current */
564 #define	DP_PSU_ALERT_STATUS		0x0400	/* PSU alert indication */
565 #define	DP_PSU_PDCT_FAN			0x0800	/* predicted fan fail */
566 #define	DP_PSU_NR_WARNING		0x1000	/* non-redundancy condition */
567 
568 			/* presence: 	bit clear=not present */
569 			/*		bit set=present */
570 			/* status:	bit clear=ok */
571 			/*		bit set=generic fault */
572 } dp_psu_status_t;
573 
574 typedef struct dp_get_psu_status_r {
575 
576 	rsci8		num_psus;
577 	dp_psu_status_t	psu_status[1];
578 
579 } dp_get_psu_status_r_t;
580 
581 #define	DP_GET_FRU_STATUS	0x2A
582 typedef struct dp_get_fru_status {
583 	dp_handle_t handle;	/* handle of a hot pluggable unit */
584 				/* or <null handle> (0xffff)	  */
585 } dp_get_fru_status_t;
586 
587 
588 #define	DP_GET_FRU_STATUS_R	0x2B
589 typedef struct dp_fru_status {
590 
591 	dp_handle_t	handle;
592 	rsci8		sensor_status; 	/* tells whether the reading is */
593 					/* available or not */
594 	rsci8		presence;	/* 1=FRU present */
595 	rsci8		status;
596 
597 } dp_fru_status_t;
598 
599 enum dp_fru_status_type {
600 	DP_FRU_STATUS_OK = 1,
601 	DP_FRU_STATUS_FAILED,
602 	DP_FRU_STATUS_BLACKLISTED,
603 	DP_FRU_STATUS_UNKNOWN
604 };
605 
606 typedef struct dp_get_fru_status_r {
607 	rsci8		num_frus;
608 	dp_fru_status_t	fru_status[1];
609 
610 } dp_get_fru_status_r_t;
611 
612 /*
613  * DP_GET_DEVICE(_R) command is used to discover I2C devices dynamically
614  * (used by SunVTS)
615  */
616 #define	DP_GET_DEVICE		0x2C
617 
618 typedef struct dp_get_device {
619 	dp_handle_t	handle;	/* handle of a device or */
620 				/* <null handle>(0xffff) */
621 } dp_get_device_t;
622 
623 #define	DP_GET_DEVICE_R		0x2D
624 
625 #define	DP_MAX_DEVICE_TYPE_NAME	32
626 
627 typedef struct dp_device {
628 	dp_handle_t	handle;
629 	rsci8		presence;	/* 0 is not present, 1 is present */
630 	char		device_type[DP_MAX_DEVICE_TYPE_NAME];
631 } dp_device_t;
632 
633 typedef struct dp_get_device_r {
634 	rsci8		num_devices;
635 	dp_device_t	device[1];
636 } dp_get_device_r_t;
637 
638 
639 #define	DP_SET_CPU_SIGNATURE	0x33
640 
641 typedef struct dp_set_cpu_signature {
642 	int		cpu_id;		/* see PSARC 2000/205 for more */
643 	ushort_t	sig; 		/* information on the value/meaning */
644 	uchar_t		states;		/* of these fields */
645 	uchar_t		sub_state;
646 
647 } dp_cpu_signature_t;
648 
649 
650 #define	DP_SET_CPU_NODENAME	0x38
651 
652 #define	DP_MAX_NODENAME		256
653 
654 typedef struct dp_set_nodename {
655 	char		nodename[DP_MAX_NODENAME];
656 } dp_set_nodename_t;
657 
658 
659 #define	DP_GET_LED_STATE	0x3C
660 
661 typedef struct dp_get_led_state {
662 	dp_handle_t handle;	/* handle of a hot pluggable unit */
663 				/* or <null handle> (0xffff) */
664 } dp_get_led_state_t;
665 
666 #define	DP_GET_LED_STATE_R	0x3D
667 
668 typedef struct dp_led_state {
669 	dp_handle_t	handle;
670 	rsci8		sensor_status; 	/* tells whether the reading is */
671 					/* available or not */
672 	rsci8		state;
673 	rsci8		colour;
674 } dp_led_state_t;
675 
676 typedef struct dp_get_led_state_r {
677 	rsci8		num_leds;
678 	dp_led_state_t	led_state[1];
679 } dp_get_led_state_r_t;
680 
681 /* LED states */
682 
683 enum dp_led_states {
684 	DP_LED_OFF = 0,
685 	DP_LED_ON,
686 	DP_LED_FLASHING,
687 	DP_LED_BLINKING
688 };
689 
690 enum dp_led_colours {
691 	DP_LED_COLOUR_NONE = -1,
692 	DP_LED_COLOUR_ANY,
693 	DP_LED_COLOUR_WHITE,
694 	DP_LED_COLOUR_BLUE,
695 	DP_LED_COLOUR_GREEN,
696 	DP_LED_COLOUR_AMBER
697 };
698 
699 
700 #define	DP_SET_LED_STATE	0x3E
701 
702 typedef struct dp_set_led_state {
703 	dp_handle_t	handle;		/* handle of a LED */
704 	rsci8		state;
705 } dp_set_led_state_t;
706 
707 #define	DP_SET_LED_STATE_R	0x3F
708 typedef struct dp_set_led_state_r {
709 	rsci8		status;
710 } dp_set_led_state_r_t;
711 
712 enum dp_set_led_status {
713 	DP_SET_LED_OK = 0,
714 	DP_SET_LED_INVALID_HANDLE,
715 	DP_SET_LED_ERROR
716 };
717 
718 
719 #define	DP_GET_ALARM_STATE	0x68
720 
721 typedef struct dp_get_alarm_state {
722 	dp_handle_t handle;	/* handle of an alarm relay */
723 				/* or <null handle> (0xffff) */
724 } dp_get_alarm_state_t;
725 
726 #define	DP_GET_ALARM_STATE_R	0x69
727 
728 typedef struct dp_alarm_state {
729 	dp_handle_t	handle;
730 	rsci8		sensor_status; 	/* tells whether the reading is */
731 					/* available or not */
732 	rsci8		state;
733 } dp_alarm_state_t;
734 
735 typedef struct dp_get_alarm_state_r {
736 	rsci8		num_alarms;
737 	dp_alarm_state_t	alarm_state[1];
738 } dp_get_alarm_state_r_t;
739 
740 /* ALARM states */
741 
742 enum dp_alarm_states {
743 	DP_ALARM_OFF = 0,
744 	DP_ALARM_ON
745 };
746 
747 #define	DP_SET_ALARM_STATE	0x6A
748 
749 typedef struct dp_set_alarm_state {
750 	dp_handle_t	handle;		/* handle of a ALARM */
751 	rsci8		state;
752 } dp_set_alarm_state_t;
753 
754 #define	DP_SET_ALARM_STATE_R	0x6B
755 typedef struct dp_set_alarm_state_r {
756 	rsci8		status;
757 } dp_set_alarm_state_r_t;
758 
759 enum dp_set_alarm_status {
760 	DP_SET_ALARM_OK = 0,
761 	DP_SET_ALARM_INVALID_HANDLE,
762 	DP_SET_ALARM_ERROR
763 };
764 
765 
766 #define	DP_SET_USER_WATCHDOG	0x60
767 #define	DP_SET_USER_WATCHDOG_R	0x6F
768 #define	DP_GET_USER_WATCHDOG	0x70
769 #define	DP_GET_USER_WATCHDOG_R	0x71
770 
771 #define	DP_USER_WATCHDOG_ENABLE		0x01
772 #define	DP_USER_WATCHDOG_DISABLE	0x00
773 
774 enum dp_user_watchdog_status {
775 	DP_USER_WDT_OK = 0,
776 	DP_USER_WDT_ERROR
777 };
778 
779 typedef struct dp_set_user_watchdog {
780 	rsci8 enable;	/* enable = 1 */
781 } dp_set_user_watchdog_t;
782 
783 typedef struct dp_set_user_watchdog_r {
784 	rsci8 status;
785 } dp_set_user_watchdog_r_t;
786 
787 typedef struct dp_get_user_watchdog_r {
788 	rsci8 enable;
789 } dp_get_user_watchdog_r_t;
790 
791 #define	DP_GET_VOLTS		0x42
792 
793 typedef struct dp_get_volts {
794 	dp_handle_t	handle;		/* handle of a voltage sensor */
795 } dp_get_volts_t;
796 
797 #define	DP_GET_VOLTS_R		0x43
798 
799 typedef rscis16		dp_volt_reading_t;	/* unit in mV */
800 
801 typedef struct dp_volt_status {
802 	dp_handle_t		handle;
803 	rsci8			sensor_status; 	/* tells whether the reading */
804 						/* is available or not */
805 	rsci8			status;		/* 0=ok, 1=error */
806 	dp_volt_reading_t	reading;	/* value in mV. */
807 	dp_volt_reading_t	low_warning;
808 	dp_volt_reading_t	low_soft_shutdown;
809 	dp_volt_reading_t	low_hard_shutdown;
810 	dp_volt_reading_t	high_warning;
811 	dp_volt_reading_t	high_soft_shutdown;
812 	dp_volt_reading_t	high_hard_shutdown;
813 
814 } dp_volt_status_t;
815 
816 typedef struct dp_get_volts_r {
817 	rsci8			num_volts;
818 	dp_volt_status_t	volt_status[1];
819 
820 } dp_get_volts_r_t;
821 
822 
823 #define	DP_GET_CIRCUIT_BRKS	0x62
824 
825 typedef struct dp_get_circuit_brks {
826 	dp_handle_t handle;	/* handle of a circuit breaker */
827 				/* or <null handle> (0xffff) */
828 } dp_get_circuit_brks_t;
829 
830 #define	DP_GET_CIRCUIT_BRKS_R	0x63
831 
832 typedef struct dp_circuit_brk_status {
833 	dp_handle_t	handle;
834 	rsci8		sensor_status; 	/* tells whether the reading is */
835 					/* available or not */
836 	rsci8		status;		/* 0=ok, 1=error */
837 
838 } dp_circuit_brk_status_t;
839 
840 typedef struct dp_get_circuit_brks_r {
841 	rsci8			num_circuit_brks;
842 	dp_circuit_brk_status_t	circuit_brk_status[1];
843 
844 } dp_get_circuit_brks_r_t;
845 
846 
847 #define	DP_SET_HOST_WATCHDOG	0x48
848 
849 typedef struct dp_set_host_watchdog {
850 	rsci8	enable;		/* 0=enable watchdog, 1=disable watchdog */
851 } dp_set_host_watchdog_t;
852 
853 
854 #define	DP_GET_HANDLE_NAME	0x4A
855 
856 typedef struct dp_get_handle_name {
857 	dp_handle_t	handle;
858 } dp_get_handle_name_t;
859 
860 #define	DP_GET_HANDLE_NAME_R	0x4B
861 
862 typedef struct dp_get_handle_name_r {
863 	dp_handle_t	handle;
864 	char 		name[DP_MAX_HANDLE_NAME];
865 } dp_get_handle_name_r_t;
866 
867 
868 #define	DP_GET_HANDLE		0x4C
869 
870 typedef struct dp_get_handle {
871 	char 		name[DP_MAX_HANDLE_NAME];
872 } dp_get_handle_t;
873 
874 #define	DP_GET_HANDLE_R		0x4D
875 
876 typedef struct dp_get_handle_r {
877 	dp_handle_t 	handle;
878 } dp_get_handle_r_t;
879 
880 
881 #define	DP_RMC_EVENTS		0x57
882 
883 typedef rsci16	dp_event_t;
884 
885 /*
886  * list of events
887  */
888 
889 enum rmc_events {
890 	RMC_INIT_EVENT	= 0x01,
891 	RMC_HPU_EVENT,
892 	RMC_ENV_EVENT,
893 	RMC_KEYSWITCH_EVENT,
894 	RMC_LOG_EVENT
895 };
896 
897 /*
898  * event data structures
899  */
900 enum rmc_hpu_events {
901 	RMC_HPU_INSERT_EVENT	= 0x20,
902 	RMC_HPU_REMOVE_EVENT,
903 	RMC_HPU_HWERROR_EVENT
904 };
905 
906 typedef struct dp_hpu_event {
907 	dp_handle_t	hpu_hdl;
908 	dp_event_t	sub_event;
909 
910 } dp_hpu_event_t;
911 
912 
913 enum rmc_env_events {
914 	RMC_ENV_WARNING_THRESHOLD_EVENT = 0x31,
915 	RMC_ENV_SHUTDOWN_THRESHOLD_EVENT,
916 	RMC_ENV_FAULT_EVENT,
917 	RMC_ENV_OK_EVENT
918 };
919 
920 typedef struct dp_env_event {
921 	dp_handle_t	env_hdl;
922 	dp_event_t	sub_event;
923 
924 } dp_env_event_t;
925 
926 
927 enum rmc_keyswitch_pos {
928 	RMC_KEYSWITCH_POS_UNKNOWN	= 0x00,
929 	RMC_KEYSWITCH_POS_NORMAL,
930 	RMC_KEYSWITCH_POS_DIAG,
931 	RMC_KEYSWITCH_POS_LOCKED,
932 	RMC_KEYSWITCH_POS_OFF
933 };
934 
935 typedef struct dp_keyswitch_event {
936 	rsci8	key_position;
937 } dp_keyswitch_event_t;
938 
939 
940 typedef struct dp_rmclog_event {
941 	int	log_record_size;
942 	rsci8	log_record[DP_MAX_LOGSIZE];
943 } dp_rmclog_event_t;
944 
945 typedef union dp_event_info {
946 	dp_hpu_event_t		ev_hpunot;
947 	dp_env_event_t		ev_envnot;
948 	dp_keyswitch_event_t	ev_keysw;
949 	dp_rmclog_event_t	ev_rmclog;
950 } dp_event_info_t;
951 
952 typedef struct dp_event_notification {
953 	dp_event_t	event;
954 	rsci32		event_seqno; 	/* event sequence number */
955 	rsci32		timestamp;	/* timestamp of the event */
956 	dp_event_info_t	event_info;	/* event information */
957 } dp_event_notification_t;
958 
959 #define	DP_RMC_EVENTS_R		0x5F
960 
961 typedef struct dp_event_notification_r {
962 	rsci32		event_seqno; 	/* event sequence number */
963 } dp_event_notification_r_t;
964 
965 #define	DP_GET_CHASSIS_SERIALNUM	0x2E
966 #define	DP_GET_CHASSIS_SERIALNUM_R	0x2F
967 typedef struct dp_get_serialnum_r {
968 	rsci8		chassis_serial_number[32];
969 } dp_get_serialnum_r_t;
970 
971 #define	DP_GET_CONSOLE_LOG	0x1A
972 typedef struct dp_get_console_log {
973 	rsci64		start_seq; 	/* sequence number of first log byte */
974 	rsci16		length;		/* expected size of retrieved data */
975 } dp_get_console_log_t;
976 
977 #define	DP_GET_CONSOLE_LOG_R	0x1B
978 typedef struct dp_get_console_log_r {
979 	rsci64		next_seq;	/* sequence number of next log byte */
980 	rsci64		remaining_log_bytes;	/* bytes left to retrieve */
981 	rsci16		length;		/* size of retrieved data */
982 	char		buffer[DP_MAX_MSGLEN - (sizeof (rsci64) * 2 +
983 			    sizeof (rsci16))];
984 } dp_get_console_log_r_t;
985 
986 #define	DP_GET_CONFIG_LOG	0x1C
987 typedef struct dp_get_config_log {
988 	rsci64		start_seq;	/* sequence number of first log byte */
989 	rsci16		length;		/* size of retrieved data */
990 } dp_get_config_log_t;
991 
992 #define	DP_GET_CONFIG_LOG_R	0x1D
993 typedef struct dp_get_config_log_r {
994 	rsci64		next_seq;	/* sequence number of next log byte */
995 	rsci64		remaining_log_bytes;	/* bytes left to retrieve */
996 	rsci16		length;		/* size of retrieved data */
997 	char		buffer[DP_MAX_MSGLEN - (sizeof (rsci64) * 2 +
998 			    sizeof (rsci16))];
999 } dp_get_config_log_r_t;
1000 
1001 #define	DP_GET_EVENT_LOG2	0x1E
1002 typedef struct dp_get_event_log2 {
1003 	rsci64		start_seq;	/* sequence number of first log event */
1004 	rsci16		length;		/* size of retrieved data */
1005 } dp_get_event_log2_t;
1006 
1007 #define	DP_GET_EVENT_LOG2_R	0x1F
1008 typedef struct dp_get_event_log2_r {
1009 	rsci64		next_seq;	/* sequence number of next log event */
1010 	rsci64		remaining_log_events;	/* events left to retrieve */
1011 	rsci16		num_events;		/* size of retrieved data */
1012 	char		buffer[DP_MAX_MSGLEN - (sizeof (rsci64) * 2 +
1013 			    sizeof (rsci16))];
1014 } dp_get_event_log2_r_t;
1015 
1016 /*
1017  * This is ALOM's response to command codes it does not know.  It will
1018  * return the unknown command code in inv_type.  Note that this is
1019  * available starting with protocol version 3.  ALOM will not respond
1020  * to unknown commands in older versions of the protocol.
1021  */
1022 #define	DP_INVCMD	0x7F
1023 typedef struct dp_invcmd {
1024 	uint8_t inv_type;
1025 } dp_invcmd_t;
1026 
1027 #ifdef	__cplusplus
1028 }
1029 #endif
1030 
1031 #endif	/* _SYS_RMC_COMM_HPROTO_H */
1032