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