/* * CDDL HEADER START * * The contents of this file are subject to the terms of the * Common Development and Distribution License (the "License"). * You may not use this file except in compliance with the License. * * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE * or http://www.opensolaris.org/os/licensing. * See the License for the specific language governing permissions * and limitations under the License. * * When distributing Covered Code, include this CDDL HEADER in each * file and include the License file at usr/src/OPENSOLARIS.LICENSE. * If applicable, add the following below this CDDL HEADER, with the * fields enclosed by brackets "[]" replaced with your own identifying * information: Portions Copyright [yyyy] [name of copyright owner] * * CDDL HEADER END */ /* * Copyright 2000 Sun Microsystems, Inc. All rights reserved. * Use is subject to license terms. */ #ifndef _SYS_SGENV_H #define _SYS_SGENV_H #pragma ident "%Z%%M% %I% %E% SMI" #ifdef __cplusplus extern "C" { #endif /* * sgenv.h - Serengeti Environmental Driver * * This header file contains the environmental definitions for * the Serengeti platform. * * It contains all the information necessary to obtain the required * data from the kstats which export the environmental data. The * following information is exported. * * o Board status information * o Keyswitch position * o Environmental Readings */ #include /* hrtime_t */ #include /* TagID information */ #include /* HPU type information */ #include #define SGENV_DRV_NAME "sgenv" /* * Board Status Information * ======================== */ /* name of kstat returning board status info */ #define SG_BOARD_STATUS_KSTAT_NAME "sg_board_status" /* Masks to determine which LEDs are on */ #define SG_HOTPLUG_LED_MASK 0x1 #define SG_FAULT_LED_MASK 0x2 #define SG_POWER_LED_MASK 0x4 /* * Calculate the number of boards, who's info readings that were * returned by this kstat */ #define SGENV_NUM_BOARD_READINGS(ksp) ((ksp)->ks_data_size / \ (sizeof (sg_board_info_t))) typedef union sg_led { struct { int _pad :29, /* MSB */ power :1, fault :1, hotplug :1; /* LSB */ } status; int led_status; } sg_led_t; typedef struct sg_board_info { int node_id; int board_num; int condition; /* see in */ int assigned; int claimed; int present; /* 1 if board is present in Domain */ sg_led_t led; } sg_board_info_t; /* * Keyswitch Information * ===================== */ /* name of kstat returning keyswitch info */ #define SG_KEYSWITCH_KSTAT_NAME "sg_keyswitch" /* * Kstat structure used to pass Keyswitch data to userland. * * The position is stored in the 32-bit integer value of the * kstat_named_t union . * * (i.e. to get the position - read keyswitch_position.value.ui32) */ typedef struct { kstat_named_t keyswitch_position; /* position */ } sg_keyswitch_kstat_t; /* * Environmental Information * ========================= * * the environmental kstat exports an array of env_sensor_t structs */ #define SG_ENV_INFO_KSTAT_NAME "sg_env_info" /* * sd_infostamp access macros and return values * * N.b. None of the values need shifting. This means the * UTC time in nanoseconds since The Epoch has, at best, * a resolution of c.256 nanoseconds (since the lo-order * c.8-bits are overlaid with other information). */ #define SG_INFO_TIMESTATUS(info) ((int)((info) & _SG_INFO_TIMSTSMSK)) #define SG_INFO_VALUESTATUS(info) ((int)((info) & _SG_INFO_VALSTSMSK)) #define SG_INFO_NANOSECONDS(info) ((hrtime_t)((info) & _SG_INFO_TIMVALMSK)) #define _SG_INFO_TIMSTSMSK ((sensor_status_t)0x0F) #define SG_INFO_TIME_OK 0x00 /* always 0 */ #define SG_INFO_TIME_NOT_KNOWN 0x01 #define SG_INFO_TIME_NOT_AVAILABLE 0x02 #define _SG_INFO_VALSTSMSK ((sensor_status_t)0xF0) #define SG_INFO_VALUE_OK 0x00 /* always 0 */ #define SG_INFO_VALUE_NOT_POSSIBLE 0x10 #define SG_INFO_VALUE_NOT_AVAILABLE 0x20 #define _SG_INFO_TIMVALMSK \ (((hrtime_t)~0) & ~(_SG_INFO_TIMSTSMSK | _SG_INFO_VALSTSMSK)) /* Calculate the number of sensor readings that were returned by this kstat */ #define SGENV_NUM_ENV_READINGS(ksp) ((ksp)->ks_data_size / \ (sizeof (env_sensor_t))) /* used to calculate the status of a sensor reading from */ #define SG_STATUS_SHIFT 16 #define SG_STATUS_MASK 0xFFFF #define SG_PREV_STATUS_MASK 0xFFFF0000 #define SG_GET_SENSOR_STATUS(status) ((status) & SG_STATUS_MASK) #define SG_GET_PREV_SENSOR_STATUS(status) ((status) >> SG_STATUS_SHIFT) #define SG_SET_SENSOR_STATUS(status, value) \ status &= ~SG_STATUS_MASK; \ status |= ((value) & SG_STATUS_MASK) #define SG_SET_PREV_SENSOR_STATUS(status, value) \ status &= ~SG_PREV_STATUS_MASK; \ status |= (((value) & SG_STATUS_MASK) << SG_STATUS_SHIFT) typedef int32_t sensor_data_t; typedef hrtime_t sensor_status_t; /* * The possible states a sensor reading can be in. */ typedef enum env_sensor_status { SG_SENSOR_STATUS_OK = 0x01, SG_SENSOR_STATUS_LO_WARN = 0x02, SG_SENSOR_STATUS_HI_WARN = 0x04, SG_SENSOR_STATUS_LO_DANGER = 0x08, SG_SENSOR_STATUS_HI_DANGER = 0x10, SG_SENSOR_STATUS_FAN_OFF = 0x100, SG_SENSOR_STATUS_FAN_LOW = 0x200, SG_SENSOR_STATUS_FAN_HIGH = 0x400, SG_SENSOR_STATUS_FAN_FAIL = 0x800, SG_SENSOR_STATUS_UNKNOWN = 0x1000 } env_sensor_status_t; /* * The raw env. info. kstat is made up of an array of these structures. */ typedef struct env_sensor { sensor_id_t sd_id; /* defined in sensor_tag.h */ sensor_data_t sd_value; sensor_data_t sd_lo; sensor_data_t sd_hi; sensor_data_t sd_lo_warn; sensor_data_t sd_hi_warn; sensor_status_t sd_infostamp; env_sensor_status_t sd_status; } env_sensor_t; /* * Events Information * ================== */ #define SGENV_FAN_SPEED_UNKNOWN (-1) #define SGENV_FAN_SPEED_OFF 0 #define SGENV_FAN_SPEED_LOW 1 #define SGENV_FAN_SPEED_HIGH 2 #define SGENV_FAN_SPEED_UNKNOWN_STR "Unknown" #define SGENV_FAN_SPEED_OFF_STR "Off" #define SGENV_FAN_SPEED_LOW_STR "Low" #define SGENV_FAN_SPEED_HIGH_STR "High" #define SGENV_EVENT_MSG_OK "returned to the normal operating range" #define SGENV_EVENT_MSG_LO_WARN "dropped below low warning threshold" #define SGENV_EVENT_MSG_HI_WARN "exceeded high warning threshold" #define SGENV_EVENT_MSG_LO_DANGER "dropped below low warning limit" #define SGENV_EVENT_MSG_HI_DANGER "exceeded high warning limit" #define SGENV_EVENT_MSG_UNKNOWN "changed to an unknown status" #ifdef __cplusplus } #endif #endif /* _SYS_SGENV_H */