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