#ifndef _SYS_SGENV_H
#define _SYS_SGENV_H
#pragma ident "%Z%%M% %I% %E% SMI"
#ifdef __cplusplus
extern "C" {
#endif
#include <sys/time.h>
#include <sys/sgenv_tag.h>
#include <sys/sgfrutypes.h>
#include <sys/serengeti.h>
#define SGENV_DRV_NAME "sgenv"
#define SG_BOARD_STATUS_KSTAT_NAME "sg_board_status"
#define SG_HOTPLUG_LED_MASK 0x1
#define SG_FAULT_LED_MASK 0x2
#define SG_POWER_LED_MASK 0x4
#define SGENV_NUM_BOARD_READINGS(ksp) ((ksp)->ks_data_size / \
(sizeof (sg_board_info_t)))
typedef union sg_led {
struct {
int _pad :29,
power :1,
fault :1,
hotplug :1;
} status;
int led_status;
} sg_led_t;
typedef struct sg_board_info {
int node_id;
int board_num;
int condition;
int assigned;
int claimed;
int present;
sg_led_t led;
} sg_board_info_t;
#define SG_KEYSWITCH_KSTAT_NAME "sg_keyswitch"
typedef struct {
kstat_named_t keyswitch_position;
} sg_keyswitch_kstat_t;
#define SG_ENV_INFO_KSTAT_NAME "sg_env_info"
#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
#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
#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))
#define SGENV_NUM_ENV_READINGS(ksp) ((ksp)->ks_data_size / \
(sizeof (env_sensor_t)))
#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;
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;
typedef struct env_sensor {
sensor_id_t sd_id;
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;
#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