17c478bd9Sstevel@tonic-gate /*
27c478bd9Sstevel@tonic-gate  * CDDL HEADER START
37c478bd9Sstevel@tonic-gate  *
47c478bd9Sstevel@tonic-gate  * The contents of this file are subject to the terms of the
5*47b4653eSJustin Frank  * Common Development and Distribution License (the "License").
6*47b4653eSJustin Frank  * You may not use this file except in compliance with the License.
77c478bd9Sstevel@tonic-gate  *
87c478bd9Sstevel@tonic-gate  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
97c478bd9Sstevel@tonic-gate  * or http://www.opensolaris.org/os/licensing.
107c478bd9Sstevel@tonic-gate  * See the License for the specific language governing permissions
117c478bd9Sstevel@tonic-gate  * and limitations under the License.
127c478bd9Sstevel@tonic-gate  *
137c478bd9Sstevel@tonic-gate  * When distributing Covered Code, include this CDDL HEADER in each
147c478bd9Sstevel@tonic-gate  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
157c478bd9Sstevel@tonic-gate  * If applicable, add the following below this CDDL HEADER, with the
167c478bd9Sstevel@tonic-gate  * fields enclosed by brackets "[]" replaced with your own identifying
177c478bd9Sstevel@tonic-gate  * information: Portions Copyright [yyyy] [name of copyright owner]
187c478bd9Sstevel@tonic-gate  *
197c478bd9Sstevel@tonic-gate  * CDDL HEADER END
207c478bd9Sstevel@tonic-gate  */
217c478bd9Sstevel@tonic-gate /*
22*47b4653eSJustin Frank  * Copyright 2009 Sun Microsystems, Inc.  All rights reserved.
237c478bd9Sstevel@tonic-gate  * Use is subject to license terms.
247c478bd9Sstevel@tonic-gate  */
257c478bd9Sstevel@tonic-gate 
267c478bd9Sstevel@tonic-gate #ifndef	_ENVD_H
277c478bd9Sstevel@tonic-gate #define	_ENVD_H
287c478bd9Sstevel@tonic-gate 
297c478bd9Sstevel@tonic-gate #include <sys/types.h>
307c478bd9Sstevel@tonic-gate #include <libintl.h>
317c478bd9Sstevel@tonic-gate 
327c478bd9Sstevel@tonic-gate #ifdef	__cplusplus
337c478bd9Sstevel@tonic-gate extern "C" {
347c478bd9Sstevel@tonic-gate #endif
357c478bd9Sstevel@tonic-gate 
367c478bd9Sstevel@tonic-gate /*
377c478bd9Sstevel@tonic-gate  * Chicago Platform Details
387c478bd9Sstevel@tonic-gate  */
39b29b9e18Svenki #define	MAX_SENSORS		9
407c478bd9Sstevel@tonic-gate #define	MAX_FANS		6
417c478bd9Sstevel@tonic-gate 
427c478bd9Sstevel@tonic-gate /*
437c478bd9Sstevel@tonic-gate  * Fan names and ids
447c478bd9Sstevel@tonic-gate  */
457c478bd9Sstevel@tonic-gate #define	ENV_SYSTEM_FAN0		"system-fan0"
467c478bd9Sstevel@tonic-gate #define	ENV_SYSTEM_FAN1		"system-fan1"
477c478bd9Sstevel@tonic-gate #define	ENV_SYSTEM_FAN2		"system-fan2"
487c478bd9Sstevel@tonic-gate #define	ENV_SYSTEM_FAN3		"system-fan3"
497c478bd9Sstevel@tonic-gate #define	ENV_SYSTEM_FAN4		"system-fan4"
507c478bd9Sstevel@tonic-gate 
517c478bd9Sstevel@tonic-gate #define	SYSTEM_FAN0_ID		0
527c478bd9Sstevel@tonic-gate #define	SYSTEM_FAN1_ID		1
537c478bd9Sstevel@tonic-gate #define	SYSTEM_FAN2_ID		2
547c478bd9Sstevel@tonic-gate #define	SYSTEM_FAN3_ID		3
557c478bd9Sstevel@tonic-gate #define	SYSTEM_FAN4_ID		4
567c478bd9Sstevel@tonic-gate 
577c478bd9Sstevel@tonic-gate #define	CPU0_FAN_ID		SYSTEM_FAN0_ID
587c478bd9Sstevel@tonic-gate #define	CPU1_FAN_ID		SYSTEM_FAN1_ID
597c478bd9Sstevel@tonic-gate 
607c478bd9Sstevel@tonic-gate /*
617c478bd9Sstevel@tonic-gate  * Sensor names and ids
627c478bd9Sstevel@tonic-gate  */
637c478bd9Sstevel@tonic-gate #define	SENSOR_CPU0		"cpu0"
647c478bd9Sstevel@tonic-gate #define	SENSOR_CPU1		"cpu1"
657c478bd9Sstevel@tonic-gate #define	SENSOR_MB		"MotherBoard"
667c478bd9Sstevel@tonic-gate #define	SENSOR_ADT7462		"ADT7462"
677c478bd9Sstevel@tonic-gate #define	SENSOR_LM95221		"LM95221"
687c478bd9Sstevel@tonic-gate #define	SENSOR_FIRE		"FireASIC"
697c478bd9Sstevel@tonic-gate #define	SENSOR_LSI1064		"LSI1064"
707c478bd9Sstevel@tonic-gate #define	SENSOR_FRONT_PANEL	"Front_panel"
71b29b9e18Svenki #define	SENSOR_PSU		"PSU"
727c478bd9Sstevel@tonic-gate 
737c478bd9Sstevel@tonic-gate #define	CPU0_SENSOR_ID		0
747c478bd9Sstevel@tonic-gate #define	CPU1_SENSOR_ID		1
757c478bd9Sstevel@tonic-gate #define	ADT7462_SENSOR_ID	2
767c478bd9Sstevel@tonic-gate #define	MB_SENSOR_ID		3
777c478bd9Sstevel@tonic-gate #define	LM95221_SENSOR_ID	4
787c478bd9Sstevel@tonic-gate #define	FIRE_SENSOR_ID		5
797c478bd9Sstevel@tonic-gate #define	LSI1064_SENSOR_ID	6
807c478bd9Sstevel@tonic-gate #define	FRONT_PANEL_SENSOR_ID	7
81b29b9e18Svenki #define	PSU_SENSOR_ID		8
827c478bd9Sstevel@tonic-gate 
837c478bd9Sstevel@tonic-gate /*
847c478bd9Sstevel@tonic-gate  * Hard disk sensor names and ids
857c478bd9Sstevel@tonic-gate  */
867c478bd9Sstevel@tonic-gate #define	ENV_DISK0		"hard-disk0"
877c478bd9Sstevel@tonic-gate #define	ENV_DISK1		"hard-disk1"
887c478bd9Sstevel@tonic-gate #define	ENV_DISK2		"hard-disk2"
897c478bd9Sstevel@tonic-gate #define	ENV_DISK3		"hard-disk3"
907c478bd9Sstevel@tonic-gate 
917c478bd9Sstevel@tonic-gate #define	DISK0_ID		0
927c478bd9Sstevel@tonic-gate #define	DISK1_ID		1
937c478bd9Sstevel@tonic-gate #define	DISK2_ID		2
947c478bd9Sstevel@tonic-gate #define	DISK3_ID		3
957c478bd9Sstevel@tonic-gate 
967c478bd9Sstevel@tonic-gate /*
977c478bd9Sstevel@tonic-gate  * Thresholds and other constants
987c478bd9Sstevel@tonic-gate  */
997c478bd9Sstevel@tonic-gate #define	DISK_SCAN_INTERVAL		10
1007c478bd9Sstevel@tonic-gate #define	DISK_HIGH_WARN_TEMPERATURE	55
1017c478bd9Sstevel@tonic-gate #define	DISK_LOW_WARN_TEMPERATURE	5
1027c478bd9Sstevel@tonic-gate #define	DISK_HIGH_SHUTDOWN_TEMPERATURE	60
1037c478bd9Sstevel@tonic-gate #define	DISK_LOW_SHUTDOWN_TEMPERATURE	0
1047c478bd9Sstevel@tonic-gate #define	DISK_INVALID_TEMP		0xFFFF
1057c478bd9Sstevel@tonic-gate #define	LSI1064_VENDOR_ID		0x1000
1067c478bd9Sstevel@tonic-gate #define	LSI1064_DEVICE_ID		0x50
1077c478bd9Sstevel@tonic-gate #define	FAN_SCAN_INTERVAL		10
1087c478bd9Sstevel@tonic-gate #define	SENSOR_SCAN_INTERVAL		2
1097c478bd9Sstevel@tonic-gate #define	SENSOR_WARNING_DURATION		4
1107c478bd9Sstevel@tonic-gate #define	SENSOR_WARNING_INTERVAL		30
1117c478bd9Sstevel@tonic-gate #define	DISK_WARNING_INTERVAL		30
1127c478bd9Sstevel@tonic-gate #define	DISK_WARNING_DURATION		20
1137c478bd9Sstevel@tonic-gate #define	SENSOR_SHUTDOWN_INTERVAL	60
1147c478bd9Sstevel@tonic-gate #define	DISK_SHUTDOWN_INTERVAL		30
1157c478bd9Sstevel@tonic-gate #define	ENV_CONF_FILE			"envmodel.conf"
1167c478bd9Sstevel@tonic-gate #define	TUNABLE_CONF_FILE		"piclenvd.conf"
1177c478bd9Sstevel@tonic-gate #define	PM_DEVICE			"/dev/pm"
1187c478bd9Sstevel@tonic-gate #define	SHUTDOWN_CMD			"/usr/sbin/shutdown -y -g 60 -i 5"
1197c478bd9Sstevel@tonic-gate #define	PICL_PLUGINS_NODE		"plugins"
1207c478bd9Sstevel@tonic-gate #define	PICL_ENVIRONMENTAL_NODE		"environmental"
1217c478bd9Sstevel@tonic-gate 
1227c478bd9Sstevel@tonic-gate #define	MAX_RETRIES_FOR_FAN_FAULT	10
1237c478bd9Sstevel@tonic-gate #define	MAX_FAN_RETRIES			14
1247c478bd9Sstevel@tonic-gate #define	MAX_SENSOR_RETRIES		14
1257c478bd9Sstevel@tonic-gate 
126*47b4653eSJustin Frank #define	TACH_TO_RPM(tach)	(((tach) == 0) ? 0 : (90000 * 60)/(tach))
1277c478bd9Sstevel@tonic-gate 
1280028f2d1Siskreen /*
1290028f2d1Siskreen  * constants used for retrieving SMART data
1300028f2d1Siskreen  */
1310028f2d1Siskreen #define	DEFAULT_SCSI_TIMEOUT		60
1320028f2d1Siskreen #define	IEC_PAGE			0x1C
1330028f2d1Siskreen #define	HDA_TEMP			0xc2
1340028f2d1Siskreen #define	DRIVE_TEMP			0xe7
1350028f2d1Siskreen #define	GET_SMART_INFO			0x31
1360028f2d1Siskreen #define	SMART_FIELDS			30
1370028f2d1Siskreen #define	REPORT_ON_REQUEST		0x6
1380028f2d1Siskreen #define	PAGE_FMT			4
1390028f2d1Siskreen #define	IEC_PAGE_SIZE			12
1400028f2d1Siskreen #define	SMART_FLAG_SIZE			2
1410028f2d1Siskreen #define	ATTRIBUTE_DATA_SIZE		8
1420028f2d1Siskreen #define	VENDOR_ATTR_SIZE		131
1430028f2d1Siskreen #define	SMART_RESERVED_SIZE		10
1440028f2d1Siskreen #define	COLLECTION_DATA_SIZE		6
1450028f2d1Siskreen 
1467c478bd9Sstevel@tonic-gate #define	DISK0_PHYSPATH	\
1472a0eb52bSvenki 	"/pci@1e,600000/pci@0/pci@9/pci@0/scsi@1/sd@0,0"
1487c478bd9Sstevel@tonic-gate 
1497c478bd9Sstevel@tonic-gate #define	DISK1_PHYSPATH	\
1502a0eb52bSvenki 	"/pci@1e,600000/pci@0/pci@9/pci@0/scsi@1/sd@1,0"
1517c478bd9Sstevel@tonic-gate 
1527c478bd9Sstevel@tonic-gate #define	DISK2_PHYSPATH  \
1532a0eb52bSvenki 	"/pci@1e,600000/pci@0/pci@9/pci@0/scsi@1/sd@2,0"
1547c478bd9Sstevel@tonic-gate 
1557c478bd9Sstevel@tonic-gate #define	DISK3_PHYSPATH  \
1562a0eb52bSvenki 	"/pci@1e,600000/pci@0/pci@9/pci@0/scsi@1/sd@3,0"
1577c478bd9Sstevel@tonic-gate 
1587c478bd9Sstevel@tonic-gate #define	ENV_DISK0_DEVFS	\
1592a0eb52bSvenki "/devices/pci@1e,600000/pci@0/pci@9/pci@0/scsi@1/sd@0,0:a,raw"
1607c478bd9Sstevel@tonic-gate 
1617c478bd9Sstevel@tonic-gate #define	ENV_DISK1_DEVFS	\
1622a0eb52bSvenki "/devices/pci@1e,600000/pci@0/pci@9/pci@0/scsi@1/sd@1,0:a,raw"
1637c478bd9Sstevel@tonic-gate 
1647c478bd9Sstevel@tonic-gate #define	ENV_DISK2_DEVFS \
1652a0eb52bSvenki "/devices/pci@1e,600000/pci@0/pci@9/pci@0/scsi@1/sd@2,0:a,raw"
1667c478bd9Sstevel@tonic-gate 
1677c478bd9Sstevel@tonic-gate #define	ENV_DISK3_DEVFS \
1682a0eb52bSvenki "/devices/pci@1e,600000/pci@0/pci@9/pci@0/scsi@1/sd@3,0:a,raw"
1697c478bd9Sstevel@tonic-gate 
1707c478bd9Sstevel@tonic-gate #define	DISK0_NODE_PATH	\
1712a0eb52bSvenki "name:/platform/pci@1e,600000/pci@0/pci@9/pci@0/scsi@1/sd@0,0"
1727c478bd9Sstevel@tonic-gate 
1737c478bd9Sstevel@tonic-gate #define	DISK1_NODE_PATH	\
1742a0eb52bSvenki "name:/platform/pci@1e,600000/pci@0/pci@9/pci@0/scsi@1/sd@1,0"
1757c478bd9Sstevel@tonic-gate 
1767c478bd9Sstevel@tonic-gate #define	DISK2_NODE_PATH \
1772a0eb52bSvenki "name:/platform/pci@1e,600000/pci@0/pci@9/pci@0/scsi@1/sd@2,0"
1787c478bd9Sstevel@tonic-gate 
1797c478bd9Sstevel@tonic-gate #define	DISK3_NODE_PATH \
1802a0eb52bSvenki "name:/platform/pci@1e,600000/pci@0/pci@9/pci@0/scsi@1/sd@3,0"
1817c478bd9Sstevel@tonic-gate 
1827c478bd9Sstevel@tonic-gate #define	SCSI_CONTROLLER_NODE_PATH	\
1832a0eb52bSvenki 	"name:/platform/pci@1e,600000/pci@0/pci@9/pci@0/scsi@1"
1847c478bd9Sstevel@tonic-gate 
1857c478bd9Sstevel@tonic-gate /* CPU Path Names */
1867c478bd9Sstevel@tonic-gate #define	CPU0_PATH		"_class:/jbus/cpu?ID=0"
1877c478bd9Sstevel@tonic-gate #define	CPU1_PATH		"_class:/jbus/cpu?ID=1"
1887c478bd9Sstevel@tonic-gate 
1897c478bd9Sstevel@tonic-gate #define	ENV_MONITOR_DEVFS	"/devices/ebus@1f,464000/env-monitor@3,0"
1907c478bd9Sstevel@tonic-gate 
1917c478bd9Sstevel@tonic-gate 
1927c478bd9Sstevel@tonic-gate /*
1937c478bd9Sstevel@tonic-gate  * devfs-path for various fans and their min/max speeds
1947c478bd9Sstevel@tonic-gate  */
1957c478bd9Sstevel@tonic-gate #define	ENV_SYSTEM_FAN0_DEVFS	\
1967c478bd9Sstevel@tonic-gate 	"/devices/ebus@1f,464000/env-monitor@3,0:fan_0"
1977c478bd9Sstevel@tonic-gate #define	ENV_SYSTEM_FAN1_DEVFS	\
1987c478bd9Sstevel@tonic-gate 	"/devices/ebus@1f,464000/env-monitor@3,0:fan_1"
1997c478bd9Sstevel@tonic-gate #define	ENV_SYSTEM_FAN2_DEVFS	\
2007c478bd9Sstevel@tonic-gate 	"/devices/ebus@1f,464000/env-monitor@3,0:fan_2"
2017c478bd9Sstevel@tonic-gate #define	ENV_SYSTEM_FAN3_DEVFS	\
2027c478bd9Sstevel@tonic-gate 	"/devices/ebus@1f,464000/env-monitor@3,0:fan_3"
2037c478bd9Sstevel@tonic-gate #define	ENV_SYSTEM_FAN4_DEVFS	\
2047c478bd9Sstevel@tonic-gate 	"/devices/ebus@1f,464000/env-monitor@3,0:fan_4"
2057c478bd9Sstevel@tonic-gate 
2067c478bd9Sstevel@tonic-gate /* MIN and MAX SPEED are in RPM units */
2077c478bd9Sstevel@tonic-gate 
2087c478bd9Sstevel@tonic-gate #define	CPU_FAN_SPEED_MIN	250
2097c478bd9Sstevel@tonic-gate #define	CPU_FAN_SPEED_MAX	5000
2107c478bd9Sstevel@tonic-gate 
2117c478bd9Sstevel@tonic-gate #define	SYSTEM_FAN_SPEED_MIN	250
2127c478bd9Sstevel@tonic-gate #define	SYSTEM_FAN_SPEED_MAX	5000
2137c478bd9Sstevel@tonic-gate 
2147c478bd9Sstevel@tonic-gate /*
2157c478bd9Sstevel@tonic-gate  * devfs-path for various temperature sensors and CPU platform path
2167c478bd9Sstevel@tonic-gate  */
2177c478bd9Sstevel@tonic-gate #define	SENSOR_CPU0_DEVFS	\
2187c478bd9Sstevel@tonic-gate 	"/devices/ebus@1f,464000/env-monitor@3,0:cpu_0"
2197c478bd9Sstevel@tonic-gate #define	SENSOR_CPU1_DEVFS	\
2207c478bd9Sstevel@tonic-gate 	"/devices/ebus@1f,464000/env-monitor@3,0:cpu_1"
2217c478bd9Sstevel@tonic-gate #define	SENSOR_MB_DEVFS	\
2227c478bd9Sstevel@tonic-gate 	"/devices/ebus@1f,464000/env-monitor@3,0:mb"
2237c478bd9Sstevel@tonic-gate #define	SENSOR_ADT7462_DEVFS	\
2247c478bd9Sstevel@tonic-gate 	"/devices/ebus@1f,464000/env-monitor@3,0:adt7462"
2257c478bd9Sstevel@tonic-gate #define	SENSOR_LM95221_DEVFS	\
2267c478bd9Sstevel@tonic-gate 	"/devices/ebus@1f,464000/env-monitor@3,0:lm95221"
2277c478bd9Sstevel@tonic-gate #define	SENSOR_FIRE_DEVFS	\
2287c478bd9Sstevel@tonic-gate 	"/devices/ebus@1f,464000/env-monitor@3,0:fire"
2297c478bd9Sstevel@tonic-gate #define	SENSOR_LSI1064_DEVFS	\
2307c478bd9Sstevel@tonic-gate 	"/devices/ebus@1f,464000/env-monitor@3,0:lsi1064"
2317c478bd9Sstevel@tonic-gate #define	SENSOR_FRONT_PANEL_DEVFS	\
2327c478bd9Sstevel@tonic-gate 	"/devices/ebus@1f,464000/env-monitor@3,0:front_panel"
233b29b9e18Svenki #define	SENSOR_PSU_DEVFS	\
234b29b9e18Svenki 	"/devices/ebus@1f,464000/env-monitor@3,0:psu"
2357c478bd9Sstevel@tonic-gate 
2367c478bd9Sstevel@tonic-gate /*
2377c478bd9Sstevel@tonic-gate  * Temperature type
2387c478bd9Sstevel@tonic-gate  */
2397c478bd9Sstevel@tonic-gate typedef int16_t tempr_t;
2407c478bd9Sstevel@tonic-gate 
2411653ff84Svenki /*
2421653ff84Svenki  *				SEEPROM LAYOUT
2431653ff84Svenki  *
2441653ff84Svenki  *      The layout of environmental segment in the SEEPROM in Chicago is as
2451653ff84Svenki  *      shown below. Note that this is a stripped-down version of the Envseg
2461653ff84Svenki  *      Definition v2.0 (but compatible). In particular, piclenvd in Chicago
2471653ff84Svenki  *      does not use the #FanEntries and the list of FANn_ID/FANn_DOFF
2481653ff84Svenki  *      pairs, and it doesn't use the SensorPolicy and the list of
2491653ff84Svenki  *      Measured/Corrected pairs for the temperature sensor values either.
2501653ff84Svenki  *
2511653ff84Svenki  *
2521653ff84Svenki  *                   0         1         2         3         4         5
2531653ff84Svenki  *		+---------+------------------+----------+---------+---------+
2541653ff84Svenki  *	0x1800:	| HDR_TAG |      HDR_VER     |  HDR_LEN | HDR_CRC |  N_SEGS |
2551653ff84Svenki  *		+---------+---------+--------+----------+---------+---------+
2561653ff84Svenki  *	0x1806:	|     SEG1_NAME	    |	            SEG1_DESC               |
2571653ff84Svenki  *		+-------------------+-------------------+-------------------+
2581653ff84Svenki  *	0x180C:	|     SEG1_OFF	    |	  SEG1_LEN	|      SEG2_NAME    |
2591653ff84Svenki  *		+-------------------+-------------------+-------------------+
2601653ff84Svenki  *		~							    ~
2611653ff84Svenki  *		.							    .
2621653ff84Svenki  *		~							    ~
2631653ff84Svenki  *		+-------------------+-------------------+-------------------+
2641653ff84Svenki  *	0xXXXX:	|     SEGn_OFF	    |	  SEGn_LEN	|
2651653ff84Svenki  *		+-------------------+-------------------+
2661653ff84Svenki  *
2671653ff84Svenki  *
2681653ff84Svenki  *              +---------+---------+---------------------------------------+
2691653ff84Svenki  *  ENVSEG_OFF:	| ESEG_VER| N_SNSRS |            SENSOR1_ID                 |
2701653ff84Svenki  *              +---------+---------+---------------------------------------+
2711653ff84Svenki  *	        |    SNSR1_DOFF     |            SENSOR2_ID                 |
2721653ff84Svenki  *              +-------------------+---------------------------------------+
2731653ff84Svenki  *		~							    ~
2741653ff84Svenki  *		~							    ~
2751653ff84Svenki  *		+-------------------+---------------------------------------+
2761653ff84Svenki  *	        |    SNSRm_DOFF     |
2771653ff84Svenki  *              +-------------------+
2781653ff84Svenki  *
2791653ff84Svenki  *
2801653ff84Svenki  *		+---------+---------+--------+----------+---------+---------+
2811653ff84Svenki  * SNSRk_DOFF:	| HI_POFF | HI_SHUT | HI_WARN| LO_WARN  | LO_SHUT | LO_POFF |
2821653ff84Svenki  *              +-------------------+--------+----------+---------+---------+
2831653ff84Svenki  */
2841653ff84Svenki 
2851653ff84Svenki #define	I2C_DEVFS		"/devices/ebus@1f,464000/i2c@3,80"
2861653ff84Svenki #define	IOFRU_DEV		"front-io-fru-prom@0,a4:front-io-fru-prom"
2871653ff84Svenki #define	FRU_SEEPROM_NAME	"front-io-fru-prom"
2881653ff84Svenki 
2891653ff84Svenki /*
2901653ff84Svenki  * SEEPROM section header
2911653ff84Svenki  */
2921653ff84Svenki #define	SSCN_TAG	0x08
2931653ff84Svenki #define	SSCN_VER	0x0001
2941653ff84Svenki #define	SSCN_OFFSET	0x1800
2951653ff84Svenki typedef struct {
2961653ff84Svenki 	uint8_t sscn_tag;		/* section header tag */
2971653ff84Svenki 	uint8_t sscn_ver[2];		/* section header version */
2981653ff84Svenki 	uint8_t sscn_len;		/* section header length */
2991653ff84Svenki 	uint8_t sscn_crc;		/* unused */
3001653ff84Svenki 	uint8_t sscn_nsegs;		/* total number of segments */
3011653ff84Svenki } seeprom_scn_t;
3021653ff84Svenki 
3031653ff84Svenki /*
3041653ff84Svenki  * SEEPROM segment header
3051653ff84Svenki  */
3061653ff84Svenki typedef struct {
3071653ff84Svenki 	uint16_t sseg_name;		/* segment name */
3081653ff84Svenki 	uint16_t sseg_desc[2];		/* segment descriptor */
3091653ff84Svenki 	uint16_t sseg_off;		/* segment data offset */
3101653ff84Svenki 	uint16_t sseg_len;		/* segment length */
3111653ff84Svenki } seeprom_seg_t;
3121653ff84Svenki #define	ENVSEG_NAME	0x4553		/* "ES" */
3131653ff84Svenki 
3141653ff84Svenki /*
3151653ff84Svenki  * Envseg layout V2 (stripped-down version)
3161653ff84Svenki  */
3171653ff84Svenki typedef struct {
3181653ff84Svenki 	uint8_t esb_high_power_off;
3191653ff84Svenki 	uint8_t esb_high_shutdown;
3201653ff84Svenki 	uint8_t esb_high_warning;
3211653ff84Svenki 	uint8_t esb_low_warning;
3221653ff84Svenki 	uint8_t esb_low_shutdown;
3231653ff84Svenki 	uint8_t esb_low_power_off;
3241653ff84Svenki } es_sensor_blk_t;
3251653ff84Svenki 
3261653ff84Svenki typedef struct {
3271653ff84Svenki 	uint16_t ess_id[2];		/* unique sensor id (on this FRU) */
3281653ff84Svenki 	uint16_t ess_off;		/* sensor data blk offset */
3291653ff84Svenki } es_sensor_t;
3301653ff84Svenki 
3311653ff84Svenki #define	ENVSEG_VERSION	2
3321653ff84Svenki typedef struct {
3331653ff84Svenki 	uint8_t esd_ver;		/* envseg version */
3341653ff84Svenki 	uint8_t esd_nsensors;		/* envseg total number of sensor blks */
3351653ff84Svenki 	es_sensor_t esd_sensors[1];	/* sensor table (variable length) */
3361653ff84Svenki } es_data_t;
3371653ff84Svenki 
3381653ff84Svenki /*
3391653ff84Svenki  * Macros to fetch 16 and 32 bit msb-to-lsb data from unaligned addresses
3401653ff84Svenki  */
3411653ff84Svenki #define	GET_UNALIGN16(addr)	\
3421653ff84Svenki 	(((*(uint8_t *)addr) << 8) | *((uint8_t *)addr + 1))
3431653ff84Svenki #define	GET_UNALIGN32(addr)	\
3441653ff84Svenki 	(GET_UNALIGN16(addr) << 16) | GET_UNALIGN16((uint8_t *)addr + 2)
3451653ff84Svenki 
3461653ff84Svenki /*
3471653ff84Svenki  * Macros to check sensor/disk temperatures
3481653ff84Svenki  */
3497c478bd9Sstevel@tonic-gate #define	SENSOR_TEMP_IN_WARNING_RANGE(val, sensorp) \
3501653ff84Svenki 	((val) > (sensorp)->es->esb_high_warning || \
3511653ff84Svenki 	(val) < (char)((sensorp)->es->esb_low_warning))
3527c478bd9Sstevel@tonic-gate 
3537c478bd9Sstevel@tonic-gate #define	SENSOR_TEMP_IN_SHUTDOWN_RANGE(val, sensorp) \
3541653ff84Svenki 	((val) > (sensorp)->es->esb_high_shutdown || \
3551653ff84Svenki 	(val) < (char)((sensorp)->es->esb_low_shutdown))
3567c478bd9Sstevel@tonic-gate 
3577c478bd9Sstevel@tonic-gate #define	DISK_TEMP_IN_WARNING_RANGE(val, diskp) \
3587c478bd9Sstevel@tonic-gate 	((val) > (diskp)->high_warning || \
3597c478bd9Sstevel@tonic-gate 	(val) < (char)((diskp)->low_warning))
3607c478bd9Sstevel@tonic-gate 
3617c478bd9Sstevel@tonic-gate #define	DISK_TEMP_IN_SHUTDOWN_RANGE(val, diskp) \
3627c478bd9Sstevel@tonic-gate 	((val) > (diskp)->high_shutdown || \
3637c478bd9Sstevel@tonic-gate 	(val) < (char)((diskp)->low_shutdown))
3647c478bd9Sstevel@tonic-gate 
3657c478bd9Sstevel@tonic-gate #define	SENSOR_WARN		1
3667c478bd9Sstevel@tonic-gate #define	SENSOR_OK		0
3677c478bd9Sstevel@tonic-gate 
3687c478bd9Sstevel@tonic-gate #define	FAN_FAILED		1
3697c478bd9Sstevel@tonic-gate #define	FAN_OK			0
3707c478bd9Sstevel@tonic-gate 
3711653ff84Svenki /*
3721653ff84Svenki  * Default limits for sensors in case environmental segment is absent
3731653ff84Svenki  */
3741653ff84Svenki #define	CPU0_HIGH_POWER_OFF		105
3757c478bd9Sstevel@tonic-gate #define	CPU0_HIGH_SHUTDOWN		100
3767c478bd9Sstevel@tonic-gate #define	CPU0_HIGH_WARNING		95
3777c478bd9Sstevel@tonic-gate #define	CPU0_LOW_WARNING		5
3781653ff84Svenki #define	CPU0_LOW_SHUTDOWN		0
3791653ff84Svenki #define	CPU0_LOW_POWER_OFF		0
3807c478bd9Sstevel@tonic-gate 
3811653ff84Svenki #define	CPU1_HIGH_POWER_OFF		105
3827c478bd9Sstevel@tonic-gate #define	CPU1_HIGH_SHUTDOWN		100
3837c478bd9Sstevel@tonic-gate #define	CPU1_HIGH_WARNING		95
3847c478bd9Sstevel@tonic-gate #define	CPU1_LOW_WARNING		5
3851653ff84Svenki #define	CPU1_LOW_SHUTDOWN		0
3861653ff84Svenki #define	CPU1_LOW_POWER_OFF		0
3877c478bd9Sstevel@tonic-gate 
3881653ff84Svenki #define	ADT7462_HIGH_POWER_OFF		80
3897c478bd9Sstevel@tonic-gate #define	ADT7462_HIGH_SHUTDOWN		75
3907c478bd9Sstevel@tonic-gate #define	ADT7462_HIGH_WARNING		70
3917c478bd9Sstevel@tonic-gate #define	ADT7462_LOW_WARNING		5
3921653ff84Svenki #define	ADT7462_LOW_SHUTDOWN		0
3931653ff84Svenki #define	ADT7462_LOW_POWER_OFF		0
3947c478bd9Sstevel@tonic-gate 
3951653ff84Svenki #define	MB_HIGH_POWER_OFF		80
3967c478bd9Sstevel@tonic-gate #define	MB_HIGH_SHUTDOWN		75
3977c478bd9Sstevel@tonic-gate #define	MB_HIGH_WARNING			70
3987c478bd9Sstevel@tonic-gate #define	MB_LOW_WARNING			5
3991653ff84Svenki #define	MB_LOW_SHUTDOWN			0
4001653ff84Svenki #define	MB_LOW_POWER_OFF		0
4017c478bd9Sstevel@tonic-gate 
4021653ff84Svenki #define	LM95221_HIGH_POWER_OFF		80
4037c478bd9Sstevel@tonic-gate #define	LM95221_HIGH_SHUTDOWN		75
4047c478bd9Sstevel@tonic-gate #define	LM95221_HIGH_WARNING		70
4057c478bd9Sstevel@tonic-gate #define	LM95221_LOW_WARNING		5
4061653ff84Svenki #define	LM95221_LOW_SHUTDOWN		0
4071653ff84Svenki #define	LM95221_LOW_POWER_OFF		0
4087c478bd9Sstevel@tonic-gate 
4091653ff84Svenki #define	FIRE_HIGH_POWER_OFF		105
4107c478bd9Sstevel@tonic-gate #define	FIRE_HIGH_SHUTDOWN		100
4117c478bd9Sstevel@tonic-gate #define	FIRE_HIGH_WARNING		95
4127c478bd9Sstevel@tonic-gate #define	FIRE_LOW_WARNING		5
4131653ff84Svenki #define	FIRE_LOW_SHUTDOWN		0
4141653ff84Svenki #define	FIRE_LOW_POWER_OFF		0
4157c478bd9Sstevel@tonic-gate 
4161653ff84Svenki #define	LSI1064_HIGH_POWER_OFF		105
4177c478bd9Sstevel@tonic-gate #define	LSI1064_HIGH_SHUTDOWN		100
4187c478bd9Sstevel@tonic-gate #define	LSI1064_HIGH_WARNING		95
4197c478bd9Sstevel@tonic-gate #define	LSI1064_LOW_WARNING		5
4201653ff84Svenki #define	LSI1064_LOW_SHUTDOWN		0
4211653ff84Svenki #define	LSI1064_LOW_POWER_OFF		0
4227c478bd9Sstevel@tonic-gate 
4231653ff84Svenki #define	FRONT_PANEL_HIGH_POWER_OFF	75
4247c478bd9Sstevel@tonic-gate #define	FRONT_PANEL_HIGH_SHUTDOWN	70
4257c478bd9Sstevel@tonic-gate #define	FRONT_PANEL_HIGH_WARNING	60
4267c478bd9Sstevel@tonic-gate #define	FRONT_PANEL_LOW_WARNING		5
4271653ff84Svenki #define	FRONT_PANEL_LOW_SHUTDOWN	0
4281653ff84Svenki #define	FRONT_PANEL_LOW_POWER_OFF	0
4291653ff84Svenki 
430b29b9e18Svenki #define	PSU_HIGH_POWER_OFF		95
431b29b9e18Svenki #define	PSU_HIGH_SHUTDOWN		85
432b29b9e18Svenki #define	PSU_HIGH_WARNING		75
433b29b9e18Svenki #define	PSU_LOW_WARNING			5
434b29b9e18Svenki #define	PSU_LOW_SHUTDOWN		0
435b29b9e18Svenki #define	PSU_LOW_POWER_OFF		0
436b29b9e18Svenki 
4377c478bd9Sstevel@tonic-gate /*
4387c478bd9Sstevel@tonic-gate  * Temperature sensor related data structure
4397c478bd9Sstevel@tonic-gate  */
4407c478bd9Sstevel@tonic-gate typedef struct env_sensor {
4417c478bd9Sstevel@tonic-gate 	char		*name;			/* sensor name */
4427c478bd9Sstevel@tonic-gate 	char		*devfs_path;		/* sensor device devfs path */
4437c478bd9Sstevel@tonic-gate 	int		id;
4447c478bd9Sstevel@tonic-gate 	int		fd;			/* device file descriptor */
4451653ff84Svenki 	es_sensor_blk_t	*es;
4467c478bd9Sstevel@tonic-gate 	int		error;			/* error flag */
4477c478bd9Sstevel@tonic-gate 	boolean_t 	present;		/* sensor present */
4487c478bd9Sstevel@tonic-gate 	tempr_t		cur_temp;		/* current temperature */
4497c478bd9Sstevel@tonic-gate 	time_t		warning_start;		/* warning start time (secs) */
4507c478bd9Sstevel@tonic-gate 	time_t		warning_tstamp;		/* last warning time (secs) */
4517c478bd9Sstevel@tonic-gate 	time_t		shutdown_tstamp;	/* shutdown temp time (secs) */
4527c478bd9Sstevel@tonic-gate 	boolean_t 	shutdown_initiated;	/* shutdown initated */
4537c478bd9Sstevel@tonic-gate } env_sensor_t;
4547c478bd9Sstevel@tonic-gate 
4557c478bd9Sstevel@tonic-gate extern	env_sensor_t *sensor_lookup(char *sensor_name);
4567c478bd9Sstevel@tonic-gate extern	int get_temperature(env_sensor_t *, tempr_t *);
4577c478bd9Sstevel@tonic-gate 
4587c478bd9Sstevel@tonic-gate typedef struct env_disk {
4597c478bd9Sstevel@tonic-gate 	char		*name;			/* disk name */
4607c478bd9Sstevel@tonic-gate 	char		*devfs_path;	/* disk device devfs path */
4617c478bd9Sstevel@tonic-gate 	char		*physpath;	/* used to be probe for IDLW TIME */
4627c478bd9Sstevel@tonic-gate 	char		*nodepath;	/* used to detect presence of disk */
4637c478bd9Sstevel@tonic-gate 	uchar_t		id;
4647c478bd9Sstevel@tonic-gate 	int		fd;		/* device file descriptor */
4657c478bd9Sstevel@tonic-gate 	boolean_t	present;	/* disk present */
4667c478bd9Sstevel@tonic-gate 	boolean_t	tpage_supported;	/* Temperature page */
4670028f2d1Siskreen 	boolean_t	smart_supported;
4687c478bd9Sstevel@tonic-gate 	int		current_temp;
4697c478bd9Sstevel@tonic-gate 	int		ref_temp;
4707c478bd9Sstevel@tonic-gate 	int		reliability_temp;
4717c478bd9Sstevel@tonic-gate 	uchar_t  	high_shutdown;
4727c478bd9Sstevel@tonic-gate 	uchar_t  	high_warning;
4737c478bd9Sstevel@tonic-gate 	uchar_t  	low_warning;
4747c478bd9Sstevel@tonic-gate 	uchar_t  	low_shutdown;
4757c478bd9Sstevel@tonic-gate 	time_t		warning_start;		/* warning start time (secs) */
4767c478bd9Sstevel@tonic-gate 	time_t		warning_tstamp;		/* last warning time (secs) */
4777c478bd9Sstevel@tonic-gate 	time_t		shutdown_tstamp;	/* shutdown temp time (secs) */
4787c478bd9Sstevel@tonic-gate 	boolean_t 	shutdown_initiated;	/* shutdown initated */
4797c478bd9Sstevel@tonic-gate } env_disk_t;
4807c478bd9Sstevel@tonic-gate 
4817c478bd9Sstevel@tonic-gate extern	env_disk_t *disk_lookup(char *disk_name);
4827c478bd9Sstevel@tonic-gate extern	int disk_temperature(env_disk_t *, tempr_t *);
4837c478bd9Sstevel@tonic-gate 
4847c478bd9Sstevel@tonic-gate /*
4857c478bd9Sstevel@tonic-gate  * Fan information data structure
4867c478bd9Sstevel@tonic-gate  */
4877c478bd9Sstevel@tonic-gate typedef int fanspeed_t;
4887c478bd9Sstevel@tonic-gate 
4897c478bd9Sstevel@tonic-gate typedef struct env_fan {
4907c478bd9Sstevel@tonic-gate 	char		*name;			/* fan name */
491b29b9e18Svenki 	char		*devfs_path;		/* fan device devfs path */
4927c478bd9Sstevel@tonic-gate 	uchar_t		id;
4937c478bd9Sstevel@tonic-gate 	fanspeed_t	speed_min;		/* minimum speed */
4947c478bd9Sstevel@tonic-gate 	fanspeed_t	speed_max;		/* maximum speed */
4957c478bd9Sstevel@tonic-gate 	int		forced_speed;		/* forced (fixed) speed */
4967c478bd9Sstevel@tonic-gate 	int		fd;			/* device file descriptor */
4977c478bd9Sstevel@tonic-gate 	boolean_t	present;		/* fan present */
4987c478bd9Sstevel@tonic-gate 	int		last_status;		/* Fan status */
4997c478bd9Sstevel@tonic-gate 	uint8_t		cspeed;			/* Current speed (tach) */
5007c478bd9Sstevel@tonic-gate 	uint8_t		lspeed;			/* Last speed (tach) */
5017c478bd9Sstevel@tonic-gate } env_fan_t;
5027c478bd9Sstevel@tonic-gate 
5037c478bd9Sstevel@tonic-gate /*
5047c478bd9Sstevel@tonic-gate  * Tuneables
5057c478bd9Sstevel@tonic-gate  */
5067c478bd9Sstevel@tonic-gate typedef struct env_tuneable {
5077c478bd9Sstevel@tonic-gate 	char		*name;
5087c478bd9Sstevel@tonic-gate 	char		type;
5097c478bd9Sstevel@tonic-gate 	void		*value;
5107c478bd9Sstevel@tonic-gate 	int		(*rfunc)(ptree_rarg_t *, void *);
5117c478bd9Sstevel@tonic-gate 	int		(*wfunc)(ptree_warg_t *, const void *);
5127c478bd9Sstevel@tonic-gate 	int		nbytes;
5137c478bd9Sstevel@tonic-gate 	picl_prophdl_t proph;
5147c478bd9Sstevel@tonic-gate } env_tuneable_t;
5157c478bd9Sstevel@tonic-gate 
5160028f2d1Siskreen /*
5170028f2d1Siskreen  * Smart structures
5180028f2d1Siskreen  */
5190028f2d1Siskreen 
5200028f2d1Siskreen typedef	struct smart_field {
5210028f2d1Siskreen 	uint8_t id;
5220028f2d1Siskreen 	uint8_t flags[SMART_FLAG_SIZE];
5230028f2d1Siskreen 	uint8_t raw_data[ATTRIBUTE_DATA_SIZE];
5240028f2d1Siskreen 	uint8_t	reserved;
5250028f2d1Siskreen } smart_attribute;
5260028f2d1Siskreen 
5270028f2d1Siskreen typedef struct smart_struct {
5280028f2d1Siskreen 	uint16_t	revision;		/* SMART version # */
5290028f2d1Siskreen 	struct smart_field attribute[SMART_FIELDS];
5300028f2d1Siskreen 			/* offline collection information */
5310028f2d1Siskreen 	uint8_t		collection_status[COLLECTION_DATA_SIZE];
5320028f2d1Siskreen 	uint16_t	capability;		/* SMART capability */
5330028f2d1Siskreen 	uint8_t		reserved[SMART_RESERVED_SIZE];
5340028f2d1Siskreen 	uint8_t		vendor_specific[VENDOR_ATTR_SIZE];
5350028f2d1Siskreen 	uint8_t		checksum;		/* page checksum */
5360028f2d1Siskreen } smart_structure;
5370028f2d1Siskreen 
5387c478bd9Sstevel@tonic-gate extern	env_fan_t *fan_lookup(char *fan_name);
5397c478bd9Sstevel@tonic-gate extern	int get_fan_speed(env_fan_t *, fanspeed_t *);
5407c478bd9Sstevel@tonic-gate extern	int set_fan_speed(env_fan_t *, fanspeed_t);
5417c478bd9Sstevel@tonic-gate 
5427c478bd9Sstevel@tonic-gate extern int env_debug;
5437c478bd9Sstevel@tonic-gate extern void envd_log(int pri, const char *fmt, ...);
5447c478bd9Sstevel@tonic-gate 
5457c478bd9Sstevel@tonic-gate /*
5467c478bd9Sstevel@tonic-gate  * Various messages
5477c478bd9Sstevel@tonic-gate  */
5487c478bd9Sstevel@tonic-gate #define	ENVD_PLUGIN_INIT_FAILED		\
5497c478bd9Sstevel@tonic-gate 	gettext("SUNW_piclenvd: initialization failed!\n")
5507c478bd9Sstevel@tonic-gate 
5517c478bd9Sstevel@tonic-gate #define	ENVD_PICL_SETUP_FAILED		\
5527c478bd9Sstevel@tonic-gate 	gettext("SUNW_piclenvd: PICL setup failed!\n")
5537c478bd9Sstevel@tonic-gate 
5547c478bd9Sstevel@tonic-gate #define	PM_THREAD_CREATE_FAILED		\
5557c478bd9Sstevel@tonic-gate 	gettext("SUNW_piclenvd: pmthr thread creation failed!\n")
5567c478bd9Sstevel@tonic-gate 
5577c478bd9Sstevel@tonic-gate #define	PM_THREAD_EXITING		\
5587c478bd9Sstevel@tonic-gate 	gettext("SUNW_piclenvd: pmthr exiting! errno:%d %s\n")
5597c478bd9Sstevel@tonic-gate 
5607c478bd9Sstevel@tonic-gate #define	DISK_TEMP_THREAD_EXITING		\
5617c478bd9Sstevel@tonic-gate 	gettext("SUNW_piclenvd: Disk temp thread exiting."	\
5627c478bd9Sstevel@tonic-gate 	" Disk temperature will not be monitored. errno:%d %s\n")
5637c478bd9Sstevel@tonic-gate 
5647c478bd9Sstevel@tonic-gate #define	ENVTHR_THREAD_CREATE_FAILED	\
5657c478bd9Sstevel@tonic-gate 	gettext("SUNW_piclenvd: envthr thread creation failed!\n")
5667c478bd9Sstevel@tonic-gate 
5677c478bd9Sstevel@tonic-gate #define	ENV_SHUTDOWN_MSG		\
5687c478bd9Sstevel@tonic-gate 	gettext("SUNW_piclenvd: '%s' sensor temperature %d outside safe " \
5697c478bd9Sstevel@tonic-gate 	"limits (%d...%d). Shutting down the system.\n")
5707c478bd9Sstevel@tonic-gate 
5717c478bd9Sstevel@tonic-gate #define	ENV_WARNING_MSG			\
5727c478bd9Sstevel@tonic-gate 	gettext("SUNW_piclenvd: '%s' sensor temperature %d outside safe " \
5737c478bd9Sstevel@tonic-gate 	"operating limits (%d...%d).\n")
5747c478bd9Sstevel@tonic-gate 
5757c478bd9Sstevel@tonic-gate #define	ENV_FAN_OPEN_FAIL		\
5767c478bd9Sstevel@tonic-gate 	gettext("SUNW_piclenvd: can't open '%s' fan path:%s errno:%d %s\n")
5777c478bd9Sstevel@tonic-gate 
5787c478bd9Sstevel@tonic-gate #define	ENV_SENSOR_OPEN_FAIL		\
5797c478bd9Sstevel@tonic-gate 	gettext("SUNW_piclenvd: can't open '%s' sensor path:%s errno:%d %s\n")
5807c478bd9Sstevel@tonic-gate 
5817c478bd9Sstevel@tonic-gate #define	ENV_SENSOR_ACCESS_FAIL		\
5827c478bd9Sstevel@tonic-gate 	gettext("SUNW_piclenvd: can't access '%s' sensor errno:%d %s\n")
5837c478bd9Sstevel@tonic-gate 
5847c478bd9Sstevel@tonic-gate #define	ENV_SENSOR_ACCESS_OK		\
5857c478bd9Sstevel@tonic-gate 	gettext("SUNW_piclenvd: '%s' sensor is accessible now.\n")
5867c478bd9Sstevel@tonic-gate 
5877c478bd9Sstevel@tonic-gate #define	ENV_FAN_FAILURE_WARNING_MSG		\
5887c478bd9Sstevel@tonic-gate 	gettext("SUNW_piclenvd: %s has Failed.\n"	\
5897c478bd9Sstevel@tonic-gate 	"(rpm = %s status = %s)\n")
5907c478bd9Sstevel@tonic-gate 
5917c478bd9Sstevel@tonic-gate #define	ENV_FAN_OK_MSG		\
5927c478bd9Sstevel@tonic-gate 	gettext("SUNW_piclenvd: %s is OKAY.\n")
5937c478bd9Sstevel@tonic-gate 
5941653ff84Svenki #define	ENV_FRU_OPEN_FAIL		\
5951653ff84Svenki 	gettext("SUNW_piclenvd: can't open FRU SEEPROM path:%s errno:%d\n")
5961653ff84Svenki 
5971653ff84Svenki #define	ENV_FRU_BAD_ENVSEG		\
5981653ff84Svenki 	gettext("SUNW_piclenvd: version mismatch or environmental segment " \
5991653ff84Svenki 		"header too short in FRU SEEPROM %s\n")
6001653ff84Svenki 
6011653ff84Svenki #define	ENV_FRU_BAD_SCNHDR		\
6021653ff84Svenki 	gettext("SUNW_piclenvd: invalid section header tag:%x version:%x\n")
6031653ff84Svenki 
6041653ff84Svenki #define	ENV_FRU_NOMEM_FOR_SEG		\
6051653ff84Svenki 	gettext("SUNW_piclenvd: cannot allocate %d bytes for env seg memory\n")
6061653ff84Svenki 
6071653ff84Svenki #define	ENV_DEFAULT_LIMITS		\
6081653ff84Svenki 	gettext("SUNW_piclenvd: error reading ES segment, using defaults\n")
6097c478bd9Sstevel@tonic-gate 
6107c478bd9Sstevel@tonic-gate #ifdef	__cplusplus
6117c478bd9Sstevel@tonic-gate }
6127c478bd9Sstevel@tonic-gate #endif
6137c478bd9Sstevel@tonic-gate 
6147c478bd9Sstevel@tonic-gate #endif	/* _ENVD_H */
615