root/usr/src/uts/sun4u/sys/envmon.h
/*
 * 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 2005 Sun Microsystems, Inc.  All rights reserved.
 * Use is subject to license terms.
 */

#ifndef _SYS_ENVMON_H
#define _SYS_ENVMON_H

#pragma ident   "%Z%%M% %I%     %E% SMI"

#ifdef  __cplusplus
extern "C" {
#endif

#include <sys/ioccom.h>

/*
 * environmental monitoring ioctls
 *
 * there are two types of environmental monitor:
 * sensors      - these provide a value for the environmental property
 * indicators   - these provide a status of "within range" or "out of range"
 *
 * for any given environmental property, a particular platform is likely
 * to support either a sensor or an indicator
 *
 * a reserved value is used to signify that a particular sensor value is
 * not available
 */

/* reserved values to signify "value unavailable" */
#define ENVMON_VAL_UNAVAILABLE  ((int16_t)(-32768))

/*
 * The ability of a sensor or indicator to deliver a value is encapsulated
 * in the sensor_status field.
 * The following sensor_status bit fields are defined
 */
#define ENVMON_SENSOR_OK        0       /* this one's a value */
#define ENVMON_NOT_PRESENT      1
#define ENVMON_INACCESSIBLE     2       /* e.g. i2c bus problem */

/*
 * Some drivers may implement the older lomv interface in addition to
 * the ioctls defined here. To avoid a clash with values from older
 * interfaces, ioctls defined here start high in the available range.
 */
#define ENVMON_BASE             200

#define ENVMONIOCSYSINFO        _IOR('a',  ENVMON_BASE + 0, envmon_sysinfo_t)
#define ENVMONIOCVOLTSENSOR     _IOWR('a', ENVMON_BASE + 1, envmon_sensor_t)
#define ENVMONIOCAMPSENSOR      _IOWR('a', ENVMON_BASE + 2, envmon_sensor_t)
#define ENVMONIOCTEMPSENSOR     _IOWR('a', ENVMON_BASE + 3, envmon_sensor_t)
#define ENVMONIOCFAN            _IOWR('a', ENVMON_BASE + 4, envmon_fan_t)
#define ENVMONIOCVOLTIND        _IOWR('a', ENVMON_BASE + 5, envmon_indicator_t)
#define ENVMONIOCAMPIND         _IOWR('a', ENVMON_BASE + 6, envmon_indicator_t)
#define ENVMONIOCTEMPIND        _IOWR('a', ENVMON_BASE + 7, envmon_indicator_t)
#define ENVMONIOCFANIND         _IOWR('a', ENVMON_BASE + 8, envmon_indicator_t)
#define ENVMONIOCGETLED         _IOWR('a', ENVMON_BASE + 9, envmon_led_info_t)
#define ENVMONIOCSETLED         _IOW('a',  ENVMON_BASE + 10, envmon_led_ctl_t)
#define ENVMONIOCHPU            _IOWR('a', ENVMON_BASE + 11, envmon_hpu_t)
#define ENVMONIOCGETKEYSW       _IOR('a',  ENVMON_BASE + 12, envmon_keysw_pos_t)
#define ENVMONIOCGETALARM       \
                _IOWR('a', ENVMON_BASE + 13, envmon_alarm_info_t)
#define ENVMONIOCSETALARM       _IOWR('a', ENVMON_BASE + 14, envmon_alarm_ctl_t)
#define ENVMONIOCCHASSISSERIALNUM       \
                _IOR('a', ENVMON_BASE + 15, envmon_chassis_t)

/* field length for text identifiers */
#define ENVMON_MAXNAMELEN       32

typedef struct {
        char                    name[ENVMON_MAXNAMELEN];
} envmon_handle_t;

/*
 * Some structures include threshold fields.
 * Where a particular threshold is not defined for a given sensor,
 * the reserved value ENVMON_VAL_UNAVAILABLE is returned.
 */
typedef struct {
        int16_t                 warning;
        int16_t                 shutdown;
        int16_t                 poweroff;
} envmon_thresholds_t;

/*
 * id identifies the fru to be accessed.
 * next_id returns the id for the next component of the type implied by
 * the ioctl command. If there are no more frus in this sequence,
 * next_id is set to an empty string.
 * If id is set to an empty string on entry, next_id returns the first id.
 * In this case, sensor_status will be returned as ENVMON_NOT_PRESENT.
 */
typedef struct {
        envmon_handle_t         id;
        uint16_t                sensor_status;
        int16_t                 value;          /* sensor reading */
        envmon_thresholds_t     lowthresholds;
        envmon_thresholds_t     highthresholds;
        envmon_handle_t         next_id;
} envmon_sensor_t;

typedef struct {
        envmon_handle_t id;
        uint16_t                sensor_status;
        uint16_t                condition;      /* 0 = within limits */
        envmon_handle_t next_id;
} envmon_indicator_t;

typedef struct {
        envmon_handle_t id;
        uint16_t                sensor_status;
        uint16_t                speed;
        char                    units[ENVMON_MAXNAMELEN];
        envmon_thresholds_t     lowthresholds;
        envmon_handle_t         next_id;
} envmon_fan_t;

/*
 * Values for led_state
 */
#define ENVMON_LED_OFF          0
#define ENVMON_LED_ON           1
#define ENVMON_LED_BLINKING     2
#define ENVMON_LED_FLASHING     3

/*
 * Values for the hue of the leds
 */
#define ENVMON_LED_CLR_NONE     ((int8_t)(-1))
#define ENVMON_LED_CLR_ANY      0
#define ENVMON_LED_CLR_WHITE    1
#define ENVMON_LED_CLR_BLUE     2
#define ENVMON_LED_CLR_GREEN    3
#define ENVMON_LED_CLR_AMBER    4
#define ENVMON_LED_CLR_RED      5

typedef struct {
        envmon_handle_t         id;
        uint16_t                sensor_status;
        int8_t                  led_state;
        int8_t                  led_color;
        envmon_handle_t         next_id;
} envmon_led_info_t;

typedef struct {
        envmon_handle_t         id;
        int8_t                  led_state;
} envmon_led_ctl_t;

/*
 * Values for alarm_state
 */
#define ENVMON_ALARM_OFF        0
#define ENVMON_ALARM_ON         1

typedef struct {
        envmon_handle_t         id;
        uint16_t                sensor_status;
        int8_t                  alarm_state;
        envmon_handle_t         next_id;
} envmon_alarm_info_t;

typedef struct {
        envmon_handle_t         id;
        int8_t                  alarm_state;
} envmon_alarm_ctl_t;

/*
 * Values for fru_status
 */
#define ENVMON_FRU_NOT_PRESENT  0
#define ENVMON_FRU_PRESENT      1
#define ENVMON_FRU_FAULT        2
#define ENVMON_FRU_DOWNLOAD     3       /* flash update or download active */

typedef struct {
        envmon_handle_t         id;
        uint8_t                 sensor_status;
        uint8_t                 fru_status;
        envmon_handle_t         next_id;
} envmon_hpu_t;

/*
 * env_sysinto_t is used to return limits on various item types
 */
typedef struct {
        uint16_t        maxVoltSens;    /* max number of voltage sensors */
        uint16_t        maxVoltInd;     /* max number of voltage indicators */
        uint16_t        maxAmpSens;     /* max number of current sensors */
        uint16_t        maxAmpInd;      /* max number of circuit breakers */
        uint16_t        maxTempSens;    /* max number of temperature sensors */
        uint16_t        maxTempInd;     /* max number of temp'r indicators */
        uint16_t        maxFanSens;     /* max number of fan speed sensors */
        uint16_t        maxFanInd;      /* max number of fan indicators */
        uint16_t        maxLED;         /* max number of LEDs */
        uint16_t        maxHPU;         /* max number of Hot Pluggable Units */
} envmon_sysinfo_t;

/*
 * envmon_keysw_t is used to return the current value of the
 * keyswitch (if fitted)
 */
typedef enum envmon_keysw_pos {
        ENVMON_KEYSW_POS_UNKNOWN        = 0,
        ENVMON_KEYSW_POS_NORMAL,
        ENVMON_KEYSW_POS_DIAG,
        ENVMON_KEYSW_POS_LOCKED,
        ENVMON_KEYSW_POS_OFF
} envmon_keysw_pos_t;

/*
 * envmon_chassis_t is used to retuen the chassis serial number
 */
typedef struct {
        char            serial_number[ENVMON_MAXNAMELEN];
} envmon_chassis_t;

#ifdef  __cplusplus
}
#endif

#endif  /* _SYS_ENVMON_H */