xref: /onnv-gate/usr/src/cmd/picl/plugins/sun4u/chicago/envd/envd.h (revision 8739:be065c2ac4a7)
10Sstevel@tonic-gate /*
20Sstevel@tonic-gate  * CDDL HEADER START
30Sstevel@tonic-gate  *
40Sstevel@tonic-gate  * The contents of this file are subject to the terms of the
5*8739SJustin.Frank@Sun.COM  * Common Development and Distribution License (the "License").
6*8739SJustin.Frank@Sun.COM  * You may not use this file except in compliance with the License.
70Sstevel@tonic-gate  *
80Sstevel@tonic-gate  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
90Sstevel@tonic-gate  * or http://www.opensolaris.org/os/licensing.
100Sstevel@tonic-gate  * See the License for the specific language governing permissions
110Sstevel@tonic-gate  * and limitations under the License.
120Sstevel@tonic-gate  *
130Sstevel@tonic-gate  * When distributing Covered Code, include this CDDL HEADER in each
140Sstevel@tonic-gate  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
150Sstevel@tonic-gate  * If applicable, add the following below this CDDL HEADER, with the
160Sstevel@tonic-gate  * fields enclosed by brackets "[]" replaced with your own identifying
170Sstevel@tonic-gate  * information: Portions Copyright [yyyy] [name of copyright owner]
180Sstevel@tonic-gate  *
190Sstevel@tonic-gate  * CDDL HEADER END
200Sstevel@tonic-gate  */
210Sstevel@tonic-gate /*
22*8739SJustin.Frank@Sun.COM  * Copyright 2009 Sun Microsystems, Inc.  All rights reserved.
230Sstevel@tonic-gate  * Use is subject to license terms.
240Sstevel@tonic-gate  */
250Sstevel@tonic-gate 
260Sstevel@tonic-gate #ifndef	_ENVD_H
270Sstevel@tonic-gate #define	_ENVD_H
280Sstevel@tonic-gate 
290Sstevel@tonic-gate #include <sys/types.h>
300Sstevel@tonic-gate #include <libintl.h>
310Sstevel@tonic-gate 
320Sstevel@tonic-gate #ifdef	__cplusplus
330Sstevel@tonic-gate extern "C" {
340Sstevel@tonic-gate #endif
350Sstevel@tonic-gate 
360Sstevel@tonic-gate /*
370Sstevel@tonic-gate  * Chicago Platform Details
380Sstevel@tonic-gate  */
39707Svenki #define	MAX_SENSORS		9
400Sstevel@tonic-gate #define	MAX_FANS		6
410Sstevel@tonic-gate 
420Sstevel@tonic-gate /*
430Sstevel@tonic-gate  * Fan names and ids
440Sstevel@tonic-gate  */
450Sstevel@tonic-gate #define	ENV_SYSTEM_FAN0		"system-fan0"
460Sstevel@tonic-gate #define	ENV_SYSTEM_FAN1		"system-fan1"
470Sstevel@tonic-gate #define	ENV_SYSTEM_FAN2		"system-fan2"
480Sstevel@tonic-gate #define	ENV_SYSTEM_FAN3		"system-fan3"
490Sstevel@tonic-gate #define	ENV_SYSTEM_FAN4		"system-fan4"
500Sstevel@tonic-gate 
510Sstevel@tonic-gate #define	SYSTEM_FAN0_ID		0
520Sstevel@tonic-gate #define	SYSTEM_FAN1_ID		1
530Sstevel@tonic-gate #define	SYSTEM_FAN2_ID		2
540Sstevel@tonic-gate #define	SYSTEM_FAN3_ID		3
550Sstevel@tonic-gate #define	SYSTEM_FAN4_ID		4
560Sstevel@tonic-gate 
570Sstevel@tonic-gate #define	CPU0_FAN_ID		SYSTEM_FAN0_ID
580Sstevel@tonic-gate #define	CPU1_FAN_ID		SYSTEM_FAN1_ID
590Sstevel@tonic-gate 
600Sstevel@tonic-gate /*
610Sstevel@tonic-gate  * Sensor names and ids
620Sstevel@tonic-gate  */
630Sstevel@tonic-gate #define	SENSOR_CPU0		"cpu0"
640Sstevel@tonic-gate #define	SENSOR_CPU1		"cpu1"
650Sstevel@tonic-gate #define	SENSOR_MB		"MotherBoard"
660Sstevel@tonic-gate #define	SENSOR_ADT7462		"ADT7462"
670Sstevel@tonic-gate #define	SENSOR_LM95221		"LM95221"
680Sstevel@tonic-gate #define	SENSOR_FIRE		"FireASIC"
690Sstevel@tonic-gate #define	SENSOR_LSI1064		"LSI1064"
700Sstevel@tonic-gate #define	SENSOR_FRONT_PANEL	"Front_panel"
71707Svenki #define	SENSOR_PSU		"PSU"
720Sstevel@tonic-gate 
730Sstevel@tonic-gate #define	CPU0_SENSOR_ID		0
740Sstevel@tonic-gate #define	CPU1_SENSOR_ID		1
750Sstevel@tonic-gate #define	ADT7462_SENSOR_ID	2
760Sstevel@tonic-gate #define	MB_SENSOR_ID		3
770Sstevel@tonic-gate #define	LM95221_SENSOR_ID	4
780Sstevel@tonic-gate #define	FIRE_SENSOR_ID		5
790Sstevel@tonic-gate #define	LSI1064_SENSOR_ID	6
800Sstevel@tonic-gate #define	FRONT_PANEL_SENSOR_ID	7
81707Svenki #define	PSU_SENSOR_ID		8
820Sstevel@tonic-gate 
830Sstevel@tonic-gate /*
840Sstevel@tonic-gate  * Hard disk sensor names and ids
850Sstevel@tonic-gate  */
860Sstevel@tonic-gate #define	ENV_DISK0		"hard-disk0"
870Sstevel@tonic-gate #define	ENV_DISK1		"hard-disk1"
880Sstevel@tonic-gate #define	ENV_DISK2		"hard-disk2"
890Sstevel@tonic-gate #define	ENV_DISK3		"hard-disk3"
900Sstevel@tonic-gate 
910Sstevel@tonic-gate #define	DISK0_ID		0
920Sstevel@tonic-gate #define	DISK1_ID		1
930Sstevel@tonic-gate #define	DISK2_ID		2
940Sstevel@tonic-gate #define	DISK3_ID		3
950Sstevel@tonic-gate 
960Sstevel@tonic-gate /*
970Sstevel@tonic-gate  * Thresholds and other constants
980Sstevel@tonic-gate  */
990Sstevel@tonic-gate #define	DISK_SCAN_INTERVAL		10
1000Sstevel@tonic-gate #define	DISK_HIGH_WARN_TEMPERATURE	55
1010Sstevel@tonic-gate #define	DISK_LOW_WARN_TEMPERATURE	5
1020Sstevel@tonic-gate #define	DISK_HIGH_SHUTDOWN_TEMPERATURE	60
1030Sstevel@tonic-gate #define	DISK_LOW_SHUTDOWN_TEMPERATURE	0
1040Sstevel@tonic-gate #define	DISK_INVALID_TEMP		0xFFFF
1050Sstevel@tonic-gate #define	LSI1064_VENDOR_ID		0x1000
1060Sstevel@tonic-gate #define	LSI1064_DEVICE_ID		0x50
1070Sstevel@tonic-gate #define	FAN_SCAN_INTERVAL		10
1080Sstevel@tonic-gate #define	SENSOR_SCAN_INTERVAL		2
1090Sstevel@tonic-gate #define	SENSOR_WARNING_DURATION		4
1100Sstevel@tonic-gate #define	SENSOR_WARNING_INTERVAL		30
1110Sstevel@tonic-gate #define	DISK_WARNING_INTERVAL		30
1120Sstevel@tonic-gate #define	DISK_WARNING_DURATION		20
1130Sstevel@tonic-gate #define	SENSOR_SHUTDOWN_INTERVAL	60
1140Sstevel@tonic-gate #define	DISK_SHUTDOWN_INTERVAL		30
1150Sstevel@tonic-gate #define	ENV_CONF_FILE			"envmodel.conf"
1160Sstevel@tonic-gate #define	TUNABLE_CONF_FILE		"piclenvd.conf"
1170Sstevel@tonic-gate #define	PM_DEVICE			"/dev/pm"
1180Sstevel@tonic-gate #define	SHUTDOWN_CMD			"/usr/sbin/shutdown -y -g 60 -i 5"
1190Sstevel@tonic-gate #define	PICL_PLUGINS_NODE		"plugins"
1200Sstevel@tonic-gate #define	PICL_ENVIRONMENTAL_NODE		"environmental"
1210Sstevel@tonic-gate 
1220Sstevel@tonic-gate #define	MAX_RETRIES_FOR_FAN_FAULT	10
1230Sstevel@tonic-gate #define	MAX_FAN_RETRIES			14
1240Sstevel@tonic-gate #define	MAX_SENSOR_RETRIES		14
1250Sstevel@tonic-gate 
126*8739SJustin.Frank@Sun.COM #define	TACH_TO_RPM(tach)	(((tach) == 0) ? 0 : (90000 * 60)/(tach))
1270Sstevel@tonic-gate 
128377Siskreen /*
129377Siskreen  * constants used for retrieving SMART data
130377Siskreen  */
131377Siskreen #define	DEFAULT_SCSI_TIMEOUT		60
132377Siskreen #define	IEC_PAGE			0x1C
133377Siskreen #define	HDA_TEMP			0xc2
134377Siskreen #define	DRIVE_TEMP			0xe7
135377Siskreen #define	GET_SMART_INFO			0x31
136377Siskreen #define	SMART_FIELDS			30
137377Siskreen #define	REPORT_ON_REQUEST		0x6
138377Siskreen #define	PAGE_FMT			4
139377Siskreen #define	IEC_PAGE_SIZE			12
140377Siskreen #define	SMART_FLAG_SIZE			2
141377Siskreen #define	ATTRIBUTE_DATA_SIZE		8
142377Siskreen #define	VENDOR_ATTR_SIZE		131
143377Siskreen #define	SMART_RESERVED_SIZE		10
144377Siskreen #define	COLLECTION_DATA_SIZE		6
145377Siskreen 
1460Sstevel@tonic-gate #define	DISK0_PHYSPATH	\
147673Svenki 	"/pci@1e,600000/pci@0/pci@9/pci@0/scsi@1/sd@0,0"
1480Sstevel@tonic-gate 
1490Sstevel@tonic-gate #define	DISK1_PHYSPATH	\
150673Svenki 	"/pci@1e,600000/pci@0/pci@9/pci@0/scsi@1/sd@1,0"
1510Sstevel@tonic-gate 
1520Sstevel@tonic-gate #define	DISK2_PHYSPATH  \
153673Svenki 	"/pci@1e,600000/pci@0/pci@9/pci@0/scsi@1/sd@2,0"
1540Sstevel@tonic-gate 
1550Sstevel@tonic-gate #define	DISK3_PHYSPATH  \
156673Svenki 	"/pci@1e,600000/pci@0/pci@9/pci@0/scsi@1/sd@3,0"
1570Sstevel@tonic-gate 
1580Sstevel@tonic-gate #define	ENV_DISK0_DEVFS	\
159673Svenki "/devices/pci@1e,600000/pci@0/pci@9/pci@0/scsi@1/sd@0,0:a,raw"
1600Sstevel@tonic-gate 
1610Sstevel@tonic-gate #define	ENV_DISK1_DEVFS	\
162673Svenki "/devices/pci@1e,600000/pci@0/pci@9/pci@0/scsi@1/sd@1,0:a,raw"
1630Sstevel@tonic-gate 
1640Sstevel@tonic-gate #define	ENV_DISK2_DEVFS \
165673Svenki "/devices/pci@1e,600000/pci@0/pci@9/pci@0/scsi@1/sd@2,0:a,raw"
1660Sstevel@tonic-gate 
1670Sstevel@tonic-gate #define	ENV_DISK3_DEVFS \
168673Svenki "/devices/pci@1e,600000/pci@0/pci@9/pci@0/scsi@1/sd@3,0:a,raw"
1690Sstevel@tonic-gate 
1700Sstevel@tonic-gate #define	DISK0_NODE_PATH	\
171673Svenki "name:/platform/pci@1e,600000/pci@0/pci@9/pci@0/scsi@1/sd@0,0"
1720Sstevel@tonic-gate 
1730Sstevel@tonic-gate #define	DISK1_NODE_PATH	\
174673Svenki "name:/platform/pci@1e,600000/pci@0/pci@9/pci@0/scsi@1/sd@1,0"
1750Sstevel@tonic-gate 
1760Sstevel@tonic-gate #define	DISK2_NODE_PATH \
177673Svenki "name:/platform/pci@1e,600000/pci@0/pci@9/pci@0/scsi@1/sd@2,0"
1780Sstevel@tonic-gate 
1790Sstevel@tonic-gate #define	DISK3_NODE_PATH \
180673Svenki "name:/platform/pci@1e,600000/pci@0/pci@9/pci@0/scsi@1/sd@3,0"
1810Sstevel@tonic-gate 
1820Sstevel@tonic-gate #define	SCSI_CONTROLLER_NODE_PATH	\
183673Svenki 	"name:/platform/pci@1e,600000/pci@0/pci@9/pci@0/scsi@1"
1840Sstevel@tonic-gate 
1850Sstevel@tonic-gate /* CPU Path Names */
1860Sstevel@tonic-gate #define	CPU0_PATH		"_class:/jbus/cpu?ID=0"
1870Sstevel@tonic-gate #define	CPU1_PATH		"_class:/jbus/cpu?ID=1"
1880Sstevel@tonic-gate 
1890Sstevel@tonic-gate #define	ENV_MONITOR_DEVFS	"/devices/ebus@1f,464000/env-monitor@3,0"
1900Sstevel@tonic-gate 
1910Sstevel@tonic-gate 
1920Sstevel@tonic-gate /*
1930Sstevel@tonic-gate  * devfs-path for various fans and their min/max speeds
1940Sstevel@tonic-gate  */
1950Sstevel@tonic-gate #define	ENV_SYSTEM_FAN0_DEVFS	\
1960Sstevel@tonic-gate 	"/devices/ebus@1f,464000/env-monitor@3,0:fan_0"
1970Sstevel@tonic-gate #define	ENV_SYSTEM_FAN1_DEVFS	\
1980Sstevel@tonic-gate 	"/devices/ebus@1f,464000/env-monitor@3,0:fan_1"
1990Sstevel@tonic-gate #define	ENV_SYSTEM_FAN2_DEVFS	\
2000Sstevel@tonic-gate 	"/devices/ebus@1f,464000/env-monitor@3,0:fan_2"
2010Sstevel@tonic-gate #define	ENV_SYSTEM_FAN3_DEVFS	\
2020Sstevel@tonic-gate 	"/devices/ebus@1f,464000/env-monitor@3,0:fan_3"
2030Sstevel@tonic-gate #define	ENV_SYSTEM_FAN4_DEVFS	\
2040Sstevel@tonic-gate 	"/devices/ebus@1f,464000/env-monitor@3,0:fan_4"
2050Sstevel@tonic-gate 
2060Sstevel@tonic-gate /* MIN and MAX SPEED are in RPM units */
2070Sstevel@tonic-gate 
2080Sstevel@tonic-gate #define	CPU_FAN_SPEED_MIN	250
2090Sstevel@tonic-gate #define	CPU_FAN_SPEED_MAX	5000
2100Sstevel@tonic-gate 
2110Sstevel@tonic-gate #define	SYSTEM_FAN_SPEED_MIN	250
2120Sstevel@tonic-gate #define	SYSTEM_FAN_SPEED_MAX	5000
2130Sstevel@tonic-gate 
2140Sstevel@tonic-gate /*
2150Sstevel@tonic-gate  * devfs-path for various temperature sensors and CPU platform path
2160Sstevel@tonic-gate  */
2170Sstevel@tonic-gate #define	SENSOR_CPU0_DEVFS	\
2180Sstevel@tonic-gate 	"/devices/ebus@1f,464000/env-monitor@3,0:cpu_0"
2190Sstevel@tonic-gate #define	SENSOR_CPU1_DEVFS	\
2200Sstevel@tonic-gate 	"/devices/ebus@1f,464000/env-monitor@3,0:cpu_1"
2210Sstevel@tonic-gate #define	SENSOR_MB_DEVFS	\
2220Sstevel@tonic-gate 	"/devices/ebus@1f,464000/env-monitor@3,0:mb"
2230Sstevel@tonic-gate #define	SENSOR_ADT7462_DEVFS	\
2240Sstevel@tonic-gate 	"/devices/ebus@1f,464000/env-monitor@3,0:adt7462"
2250Sstevel@tonic-gate #define	SENSOR_LM95221_DEVFS	\
2260Sstevel@tonic-gate 	"/devices/ebus@1f,464000/env-monitor@3,0:lm95221"
2270Sstevel@tonic-gate #define	SENSOR_FIRE_DEVFS	\
2280Sstevel@tonic-gate 	"/devices/ebus@1f,464000/env-monitor@3,0:fire"
2290Sstevel@tonic-gate #define	SENSOR_LSI1064_DEVFS	\
2300Sstevel@tonic-gate 	"/devices/ebus@1f,464000/env-monitor@3,0:lsi1064"
2310Sstevel@tonic-gate #define	SENSOR_FRONT_PANEL_DEVFS	\
2320Sstevel@tonic-gate 	"/devices/ebus@1f,464000/env-monitor@3,0:front_panel"
233707Svenki #define	SENSOR_PSU_DEVFS	\
234707Svenki 	"/devices/ebus@1f,464000/env-monitor@3,0:psu"
2350Sstevel@tonic-gate 
2360Sstevel@tonic-gate /*
2370Sstevel@tonic-gate  * Temperature type
2380Sstevel@tonic-gate  */
2390Sstevel@tonic-gate typedef int16_t tempr_t;
2400Sstevel@tonic-gate 
241323Svenki /*
242323Svenki  *				SEEPROM LAYOUT
243323Svenki  *
244323Svenki  *      The layout of environmental segment in the SEEPROM in Chicago is as
245323Svenki  *      shown below. Note that this is a stripped-down version of the Envseg
246323Svenki  *      Definition v2.0 (but compatible). In particular, piclenvd in Chicago
247323Svenki  *      does not use the #FanEntries and the list of FANn_ID/FANn_DOFF
248323Svenki  *      pairs, and it doesn't use the SensorPolicy and the list of
249323Svenki  *      Measured/Corrected pairs for the temperature sensor values either.
250323Svenki  *
251323Svenki  *
252323Svenki  *                   0         1         2         3         4         5
253323Svenki  *		+---------+------------------+----------+---------+---------+
254323Svenki  *	0x1800:	| HDR_TAG |      HDR_VER     |  HDR_LEN | HDR_CRC |  N_SEGS |
255323Svenki  *		+---------+---------+--------+----------+---------+---------+
256323Svenki  *	0x1806:	|     SEG1_NAME	    |	            SEG1_DESC               |
257323Svenki  *		+-------------------+-------------------+-------------------+
258323Svenki  *	0x180C:	|     SEG1_OFF	    |	  SEG1_LEN	|      SEG2_NAME    |
259323Svenki  *		+-------------------+-------------------+-------------------+
260323Svenki  *		~							    ~
261323Svenki  *		.							    .
262323Svenki  *		~							    ~
263323Svenki  *		+-------------------+-------------------+-------------------+
264323Svenki  *	0xXXXX:	|     SEGn_OFF	    |	  SEGn_LEN	|
265323Svenki  *		+-------------------+-------------------+
266323Svenki  *
267323Svenki  *
268323Svenki  *              +---------+---------+---------------------------------------+
269323Svenki  *  ENVSEG_OFF:	| ESEG_VER| N_SNSRS |            SENSOR1_ID                 |
270323Svenki  *              +---------+---------+---------------------------------------+
271323Svenki  *	        |    SNSR1_DOFF     |            SENSOR2_ID                 |
272323Svenki  *              +-------------------+---------------------------------------+
273323Svenki  *		~							    ~
274323Svenki  *		~							    ~
275323Svenki  *		+-------------------+---------------------------------------+
276323Svenki  *	        |    SNSRm_DOFF     |
277323Svenki  *              +-------------------+
278323Svenki  *
279323Svenki  *
280323Svenki  *		+---------+---------+--------+----------+---------+---------+
281323Svenki  * SNSRk_DOFF:	| HI_POFF | HI_SHUT | HI_WARN| LO_WARN  | LO_SHUT | LO_POFF |
282323Svenki  *              +-------------------+--------+----------+---------+---------+
283323Svenki  */
284323Svenki 
285323Svenki #define	I2C_DEVFS		"/devices/ebus@1f,464000/i2c@3,80"
286323Svenki #define	IOFRU_DEV		"front-io-fru-prom@0,a4:front-io-fru-prom"
287323Svenki #define	FRU_SEEPROM_NAME	"front-io-fru-prom"
288323Svenki 
289323Svenki /*
290323Svenki  * SEEPROM section header
291323Svenki  */
292323Svenki #define	SSCN_TAG	0x08
293323Svenki #define	SSCN_VER	0x0001
294323Svenki #define	SSCN_OFFSET	0x1800
295323Svenki typedef struct {
296323Svenki 	uint8_t sscn_tag;		/* section header tag */
297323Svenki 	uint8_t sscn_ver[2];		/* section header version */
298323Svenki 	uint8_t sscn_len;		/* section header length */
299323Svenki 	uint8_t sscn_crc;		/* unused */
300323Svenki 	uint8_t sscn_nsegs;		/* total number of segments */
301323Svenki } seeprom_scn_t;
302323Svenki 
303323Svenki /*
304323Svenki  * SEEPROM segment header
305323Svenki  */
306323Svenki typedef struct {
307323Svenki 	uint16_t sseg_name;		/* segment name */
308323Svenki 	uint16_t sseg_desc[2];		/* segment descriptor */
309323Svenki 	uint16_t sseg_off;		/* segment data offset */
310323Svenki 	uint16_t sseg_len;		/* segment length */
311323Svenki } seeprom_seg_t;
312323Svenki #define	ENVSEG_NAME	0x4553		/* "ES" */
313323Svenki 
314323Svenki /*
315323Svenki  * Envseg layout V2 (stripped-down version)
316323Svenki  */
317323Svenki typedef struct {
318323Svenki 	uint8_t esb_high_power_off;
319323Svenki 	uint8_t esb_high_shutdown;
320323Svenki 	uint8_t esb_high_warning;
321323Svenki 	uint8_t esb_low_warning;
322323Svenki 	uint8_t esb_low_shutdown;
323323Svenki 	uint8_t esb_low_power_off;
324323Svenki } es_sensor_blk_t;
325323Svenki 
326323Svenki typedef struct {
327323Svenki 	uint16_t ess_id[2];		/* unique sensor id (on this FRU) */
328323Svenki 	uint16_t ess_off;		/* sensor data blk offset */
329323Svenki } es_sensor_t;
330323Svenki 
331323Svenki #define	ENVSEG_VERSION	2
332323Svenki typedef struct {
333323Svenki 	uint8_t esd_ver;		/* envseg version */
334323Svenki 	uint8_t esd_nsensors;		/* envseg total number of sensor blks */
335323Svenki 	es_sensor_t esd_sensors[1];	/* sensor table (variable length) */
336323Svenki } es_data_t;
337323Svenki 
338323Svenki /*
339323Svenki  * Macros to fetch 16 and 32 bit msb-to-lsb data from unaligned addresses
340323Svenki  */
341323Svenki #define	GET_UNALIGN16(addr)	\
342323Svenki 	(((*(uint8_t *)addr) << 8) | *((uint8_t *)addr + 1))
343323Svenki #define	GET_UNALIGN32(addr)	\
344323Svenki 	(GET_UNALIGN16(addr) << 16) | GET_UNALIGN16((uint8_t *)addr + 2)
345323Svenki 
346323Svenki /*
347323Svenki  * Macros to check sensor/disk temperatures
348323Svenki  */
3490Sstevel@tonic-gate #define	SENSOR_TEMP_IN_WARNING_RANGE(val, sensorp) \
350323Svenki 	((val) > (sensorp)->es->esb_high_warning || \
351323Svenki 	(val) < (char)((sensorp)->es->esb_low_warning))
3520Sstevel@tonic-gate 
3530Sstevel@tonic-gate #define	SENSOR_TEMP_IN_SHUTDOWN_RANGE(val, sensorp) \
354323Svenki 	((val) > (sensorp)->es->esb_high_shutdown || \
355323Svenki 	(val) < (char)((sensorp)->es->esb_low_shutdown))
3560Sstevel@tonic-gate 
3570Sstevel@tonic-gate #define	DISK_TEMP_IN_WARNING_RANGE(val, diskp) \
3580Sstevel@tonic-gate 	((val) > (diskp)->high_warning || \
3590Sstevel@tonic-gate 	(val) < (char)((diskp)->low_warning))
3600Sstevel@tonic-gate 
3610Sstevel@tonic-gate #define	DISK_TEMP_IN_SHUTDOWN_RANGE(val, diskp) \
3620Sstevel@tonic-gate 	((val) > (diskp)->high_shutdown || \
3630Sstevel@tonic-gate 	(val) < (char)((diskp)->low_shutdown))
3640Sstevel@tonic-gate 
3650Sstevel@tonic-gate #define	SENSOR_WARN		1
3660Sstevel@tonic-gate #define	SENSOR_OK		0
3670Sstevel@tonic-gate 
3680Sstevel@tonic-gate #define	FAN_FAILED		1
3690Sstevel@tonic-gate #define	FAN_OK			0
3700Sstevel@tonic-gate 
371323Svenki /*
372323Svenki  * Default limits for sensors in case environmental segment is absent
373323Svenki  */
374323Svenki #define	CPU0_HIGH_POWER_OFF		105
3750Sstevel@tonic-gate #define	CPU0_HIGH_SHUTDOWN		100
3760Sstevel@tonic-gate #define	CPU0_HIGH_WARNING		95
3770Sstevel@tonic-gate #define	CPU0_LOW_WARNING		5
378323Svenki #define	CPU0_LOW_SHUTDOWN		0
379323Svenki #define	CPU0_LOW_POWER_OFF		0
3800Sstevel@tonic-gate 
381323Svenki #define	CPU1_HIGH_POWER_OFF		105
3820Sstevel@tonic-gate #define	CPU1_HIGH_SHUTDOWN		100
3830Sstevel@tonic-gate #define	CPU1_HIGH_WARNING		95
3840Sstevel@tonic-gate #define	CPU1_LOW_WARNING		5
385323Svenki #define	CPU1_LOW_SHUTDOWN		0
386323Svenki #define	CPU1_LOW_POWER_OFF		0
3870Sstevel@tonic-gate 
388323Svenki #define	ADT7462_HIGH_POWER_OFF		80
3890Sstevel@tonic-gate #define	ADT7462_HIGH_SHUTDOWN		75
3900Sstevel@tonic-gate #define	ADT7462_HIGH_WARNING		70
3910Sstevel@tonic-gate #define	ADT7462_LOW_WARNING		5
392323Svenki #define	ADT7462_LOW_SHUTDOWN		0
393323Svenki #define	ADT7462_LOW_POWER_OFF		0
3940Sstevel@tonic-gate 
395323Svenki #define	MB_HIGH_POWER_OFF		80
3960Sstevel@tonic-gate #define	MB_HIGH_SHUTDOWN		75
3970Sstevel@tonic-gate #define	MB_HIGH_WARNING			70
3980Sstevel@tonic-gate #define	MB_LOW_WARNING			5
399323Svenki #define	MB_LOW_SHUTDOWN			0
400323Svenki #define	MB_LOW_POWER_OFF		0
4010Sstevel@tonic-gate 
402323Svenki #define	LM95221_HIGH_POWER_OFF		80
4030Sstevel@tonic-gate #define	LM95221_HIGH_SHUTDOWN		75
4040Sstevel@tonic-gate #define	LM95221_HIGH_WARNING		70
4050Sstevel@tonic-gate #define	LM95221_LOW_WARNING		5
406323Svenki #define	LM95221_LOW_SHUTDOWN		0
407323Svenki #define	LM95221_LOW_POWER_OFF		0
4080Sstevel@tonic-gate 
409323Svenki #define	FIRE_HIGH_POWER_OFF		105
4100Sstevel@tonic-gate #define	FIRE_HIGH_SHUTDOWN		100
4110Sstevel@tonic-gate #define	FIRE_HIGH_WARNING		95
4120Sstevel@tonic-gate #define	FIRE_LOW_WARNING		5
413323Svenki #define	FIRE_LOW_SHUTDOWN		0
414323Svenki #define	FIRE_LOW_POWER_OFF		0
4150Sstevel@tonic-gate 
416323Svenki #define	LSI1064_HIGH_POWER_OFF		105
4170Sstevel@tonic-gate #define	LSI1064_HIGH_SHUTDOWN		100
4180Sstevel@tonic-gate #define	LSI1064_HIGH_WARNING		95
4190Sstevel@tonic-gate #define	LSI1064_LOW_WARNING		5
420323Svenki #define	LSI1064_LOW_SHUTDOWN		0
421323Svenki #define	LSI1064_LOW_POWER_OFF		0
4220Sstevel@tonic-gate 
423323Svenki #define	FRONT_PANEL_HIGH_POWER_OFF	75
4240Sstevel@tonic-gate #define	FRONT_PANEL_HIGH_SHUTDOWN	70
4250Sstevel@tonic-gate #define	FRONT_PANEL_HIGH_WARNING	60
4260Sstevel@tonic-gate #define	FRONT_PANEL_LOW_WARNING		5
427323Svenki #define	FRONT_PANEL_LOW_SHUTDOWN	0
428323Svenki #define	FRONT_PANEL_LOW_POWER_OFF	0
429323Svenki 
430707Svenki #define	PSU_HIGH_POWER_OFF		95
431707Svenki #define	PSU_HIGH_SHUTDOWN		85
432707Svenki #define	PSU_HIGH_WARNING		75
433707Svenki #define	PSU_LOW_WARNING			5
434707Svenki #define	PSU_LOW_SHUTDOWN		0
435707Svenki #define	PSU_LOW_POWER_OFF		0
436707Svenki 
4370Sstevel@tonic-gate /*
4380Sstevel@tonic-gate  * Temperature sensor related data structure
4390Sstevel@tonic-gate  */
4400Sstevel@tonic-gate typedef struct env_sensor {
4410Sstevel@tonic-gate 	char		*name;			/* sensor name */
4420Sstevel@tonic-gate 	char		*devfs_path;		/* sensor device devfs path */
4430Sstevel@tonic-gate 	int		id;
4440Sstevel@tonic-gate 	int		fd;			/* device file descriptor */
445323Svenki 	es_sensor_blk_t	*es;
4460Sstevel@tonic-gate 	int		error;			/* error flag */
4470Sstevel@tonic-gate 	boolean_t 	present;		/* sensor present */
4480Sstevel@tonic-gate 	tempr_t		cur_temp;		/* current temperature */
4490Sstevel@tonic-gate 	time_t		warning_start;		/* warning start time (secs) */
4500Sstevel@tonic-gate 	time_t		warning_tstamp;		/* last warning time (secs) */
4510Sstevel@tonic-gate 	time_t		shutdown_tstamp;	/* shutdown temp time (secs) */
4520Sstevel@tonic-gate 	boolean_t 	shutdown_initiated;	/* shutdown initated */
4530Sstevel@tonic-gate } env_sensor_t;
4540Sstevel@tonic-gate 
4550Sstevel@tonic-gate extern	env_sensor_t *sensor_lookup(char *sensor_name);
4560Sstevel@tonic-gate extern	int get_temperature(env_sensor_t *, tempr_t *);
4570Sstevel@tonic-gate 
4580Sstevel@tonic-gate typedef struct env_disk {
4590Sstevel@tonic-gate 	char		*name;			/* disk name */
4600Sstevel@tonic-gate 	char		*devfs_path;	/* disk device devfs path */
4610Sstevel@tonic-gate 	char		*physpath;	/* used to be probe for IDLW TIME */
4620Sstevel@tonic-gate 	char		*nodepath;	/* used to detect presence of disk */
4630Sstevel@tonic-gate 	uchar_t		id;
4640Sstevel@tonic-gate 	int		fd;		/* device file descriptor */
4650Sstevel@tonic-gate 	boolean_t	present;	/* disk present */
4660Sstevel@tonic-gate 	boolean_t	tpage_supported;	/* Temperature page */
467377Siskreen 	boolean_t	smart_supported;
4680Sstevel@tonic-gate 	int		current_temp;
4690Sstevel@tonic-gate 	int		ref_temp;
4700Sstevel@tonic-gate 	int		reliability_temp;
4710Sstevel@tonic-gate 	uchar_t  	high_shutdown;
4720Sstevel@tonic-gate 	uchar_t  	high_warning;
4730Sstevel@tonic-gate 	uchar_t  	low_warning;
4740Sstevel@tonic-gate 	uchar_t  	low_shutdown;
4750Sstevel@tonic-gate 	time_t		warning_start;		/* warning start time (secs) */
4760Sstevel@tonic-gate 	time_t		warning_tstamp;		/* last warning time (secs) */
4770Sstevel@tonic-gate 	time_t		shutdown_tstamp;	/* shutdown temp time (secs) */
4780Sstevel@tonic-gate 	boolean_t 	shutdown_initiated;	/* shutdown initated */
4790Sstevel@tonic-gate } env_disk_t;
4800Sstevel@tonic-gate 
4810Sstevel@tonic-gate extern	env_disk_t *disk_lookup(char *disk_name);
4820Sstevel@tonic-gate extern	int disk_temperature(env_disk_t *, tempr_t *);
4830Sstevel@tonic-gate 
4840Sstevel@tonic-gate /*
4850Sstevel@tonic-gate  * Fan information data structure
4860Sstevel@tonic-gate  */
4870Sstevel@tonic-gate typedef int fanspeed_t;
4880Sstevel@tonic-gate 
4890Sstevel@tonic-gate typedef struct env_fan {
4900Sstevel@tonic-gate 	char		*name;			/* fan name */
491707Svenki 	char		*devfs_path;		/* fan device devfs path */
4920Sstevel@tonic-gate 	uchar_t		id;
4930Sstevel@tonic-gate 	fanspeed_t	speed_min;		/* minimum speed */
4940Sstevel@tonic-gate 	fanspeed_t	speed_max;		/* maximum speed */
4950Sstevel@tonic-gate 	int		forced_speed;		/* forced (fixed) speed */
4960Sstevel@tonic-gate 	int		fd;			/* device file descriptor */
4970Sstevel@tonic-gate 	boolean_t	present;		/* fan present */
4980Sstevel@tonic-gate 	int		last_status;		/* Fan status */
4990Sstevel@tonic-gate 	uint8_t		cspeed;			/* Current speed (tach) */
5000Sstevel@tonic-gate 	uint8_t		lspeed;			/* Last speed (tach) */
5010Sstevel@tonic-gate } env_fan_t;
5020Sstevel@tonic-gate 
5030Sstevel@tonic-gate /*
5040Sstevel@tonic-gate  * Tuneables
5050Sstevel@tonic-gate  */
5060Sstevel@tonic-gate typedef struct env_tuneable {
5070Sstevel@tonic-gate 	char		*name;
5080Sstevel@tonic-gate 	char		type;
5090Sstevel@tonic-gate 	void		*value;
5100Sstevel@tonic-gate 	int		(*rfunc)(ptree_rarg_t *, void *);
5110Sstevel@tonic-gate 	int		(*wfunc)(ptree_warg_t *, const void *);
5120Sstevel@tonic-gate 	int		nbytes;
5130Sstevel@tonic-gate 	picl_prophdl_t proph;
5140Sstevel@tonic-gate } env_tuneable_t;
5150Sstevel@tonic-gate 
516377Siskreen /*
517377Siskreen  * Smart structures
518377Siskreen  */
519377Siskreen 
520377Siskreen typedef	struct smart_field {
521377Siskreen 	uint8_t id;
522377Siskreen 	uint8_t flags[SMART_FLAG_SIZE];
523377Siskreen 	uint8_t raw_data[ATTRIBUTE_DATA_SIZE];
524377Siskreen 	uint8_t	reserved;
525377Siskreen } smart_attribute;
526377Siskreen 
527377Siskreen typedef struct smart_struct {
528377Siskreen 	uint16_t	revision;		/* SMART version # */
529377Siskreen 	struct smart_field attribute[SMART_FIELDS];
530377Siskreen 			/* offline collection information */
531377Siskreen 	uint8_t		collection_status[COLLECTION_DATA_SIZE];
532377Siskreen 	uint16_t	capability;		/* SMART capability */
533377Siskreen 	uint8_t		reserved[SMART_RESERVED_SIZE];
534377Siskreen 	uint8_t		vendor_specific[VENDOR_ATTR_SIZE];
535377Siskreen 	uint8_t		checksum;		/* page checksum */
536377Siskreen } smart_structure;
537377Siskreen 
5380Sstevel@tonic-gate extern	env_fan_t *fan_lookup(char *fan_name);
5390Sstevel@tonic-gate extern	int get_fan_speed(env_fan_t *, fanspeed_t *);
5400Sstevel@tonic-gate extern	int set_fan_speed(env_fan_t *, fanspeed_t);
5410Sstevel@tonic-gate 
5420Sstevel@tonic-gate extern int env_debug;
5430Sstevel@tonic-gate extern void envd_log(int pri, const char *fmt, ...);
5440Sstevel@tonic-gate 
5450Sstevel@tonic-gate /*
5460Sstevel@tonic-gate  * Various messages
5470Sstevel@tonic-gate  */
5480Sstevel@tonic-gate #define	ENVD_PLUGIN_INIT_FAILED		\
5490Sstevel@tonic-gate 	gettext("SUNW_piclenvd: initialization failed!\n")
5500Sstevel@tonic-gate 
5510Sstevel@tonic-gate #define	ENVD_PICL_SETUP_FAILED		\
5520Sstevel@tonic-gate 	gettext("SUNW_piclenvd: PICL setup failed!\n")
5530Sstevel@tonic-gate 
5540Sstevel@tonic-gate #define	PM_THREAD_CREATE_FAILED		\
5550Sstevel@tonic-gate 	gettext("SUNW_piclenvd: pmthr thread creation failed!\n")
5560Sstevel@tonic-gate 
5570Sstevel@tonic-gate #define	PM_THREAD_EXITING		\
5580Sstevel@tonic-gate 	gettext("SUNW_piclenvd: pmthr exiting! errno:%d %s\n")
5590Sstevel@tonic-gate 
5600Sstevel@tonic-gate #define	DISK_TEMP_THREAD_EXITING		\
5610Sstevel@tonic-gate 	gettext("SUNW_piclenvd: Disk temp thread exiting."	\
5620Sstevel@tonic-gate 	" Disk temperature will not be monitored. errno:%d %s\n")
5630Sstevel@tonic-gate 
5640Sstevel@tonic-gate #define	ENVTHR_THREAD_CREATE_FAILED	\
5650Sstevel@tonic-gate 	gettext("SUNW_piclenvd: envthr thread creation failed!\n")
5660Sstevel@tonic-gate 
5670Sstevel@tonic-gate #define	ENV_SHUTDOWN_MSG		\
5680Sstevel@tonic-gate 	gettext("SUNW_piclenvd: '%s' sensor temperature %d outside safe " \
5690Sstevel@tonic-gate 	"limits (%d...%d). Shutting down the system.\n")
5700Sstevel@tonic-gate 
5710Sstevel@tonic-gate #define	ENV_WARNING_MSG			\
5720Sstevel@tonic-gate 	gettext("SUNW_piclenvd: '%s' sensor temperature %d outside safe " \
5730Sstevel@tonic-gate 	"operating limits (%d...%d).\n")
5740Sstevel@tonic-gate 
5750Sstevel@tonic-gate #define	ENV_FAN_OPEN_FAIL		\
5760Sstevel@tonic-gate 	gettext("SUNW_piclenvd: can't open '%s' fan path:%s errno:%d %s\n")
5770Sstevel@tonic-gate 
5780Sstevel@tonic-gate #define	ENV_SENSOR_OPEN_FAIL		\
5790Sstevel@tonic-gate 	gettext("SUNW_piclenvd: can't open '%s' sensor path:%s errno:%d %s\n")
5800Sstevel@tonic-gate 
5810Sstevel@tonic-gate #define	ENV_SENSOR_ACCESS_FAIL		\
5820Sstevel@tonic-gate 	gettext("SUNW_piclenvd: can't access '%s' sensor errno:%d %s\n")
5830Sstevel@tonic-gate 
5840Sstevel@tonic-gate #define	ENV_SENSOR_ACCESS_OK		\
5850Sstevel@tonic-gate 	gettext("SUNW_piclenvd: '%s' sensor is accessible now.\n")
5860Sstevel@tonic-gate 
5870Sstevel@tonic-gate #define	ENV_FAN_FAILURE_WARNING_MSG		\
5880Sstevel@tonic-gate 	gettext("SUNW_piclenvd: %s has Failed.\n"	\
5890Sstevel@tonic-gate 	"(rpm = %s status = %s)\n")
5900Sstevel@tonic-gate 
5910Sstevel@tonic-gate #define	ENV_FAN_OK_MSG		\
5920Sstevel@tonic-gate 	gettext("SUNW_piclenvd: %s is OKAY.\n")
5930Sstevel@tonic-gate 
594323Svenki #define	ENV_FRU_OPEN_FAIL		\
595323Svenki 	gettext("SUNW_piclenvd: can't open FRU SEEPROM path:%s errno:%d\n")
596323Svenki 
597323Svenki #define	ENV_FRU_BAD_ENVSEG		\
598323Svenki 	gettext("SUNW_piclenvd: version mismatch or environmental segment " \
599323Svenki 		"header too short in FRU SEEPROM %s\n")
600323Svenki 
601323Svenki #define	ENV_FRU_BAD_SCNHDR		\
602323Svenki 	gettext("SUNW_piclenvd: invalid section header tag:%x version:%x\n")
603323Svenki 
604323Svenki #define	ENV_FRU_NOMEM_FOR_SEG		\
605323Svenki 	gettext("SUNW_piclenvd: cannot allocate %d bytes for env seg memory\n")
606323Svenki 
607323Svenki #define	ENV_DEFAULT_LIMITS		\
608323Svenki 	gettext("SUNW_piclenvd: error reading ES segment, using defaults\n")
6090Sstevel@tonic-gate 
6100Sstevel@tonic-gate #ifdef	__cplusplus
6110Sstevel@tonic-gate }
6120Sstevel@tonic-gate #endif
6130Sstevel@tonic-gate 
6140Sstevel@tonic-gate #endif	/* _ENVD_H */
615