#ifndef _SYS_SGENV_IMPL_H
#define _SYS_SGENV_IMPL_H
#pragma ident "%Z%%M% %I% %E% SMI"
#ifdef __cplusplus
extern "C" {
#endif
#include <sys/sgenv.h>
#define POSITION_KSTAT_NAME "position"
#define SG_GET_ENV_HPU_KEYS 0x4000
#define SG_GET_ENV_CONSTANTS 0x4004
#define SG_GET_ENV_VOLATILES 0x4002
#define SG_GET_ENV_THRESHOLDS 0x4003
#define SGENV_DEFAULT_MAX_MBOX_WAIT_TIME 30
#define SGENV_MAX_SENSORS_PER_KEY 27
#define SGENV_MAX_HPUS_PER_DOMAIN 24
#define SGENV_MAX_HPU_KEYS (SSM_MAX_INSTANCES * \
SGENV_MAX_HPUS_PER_DOMAIN)
#define SGENV_MAX_SENSORS (SGENV_MAX_SENSORS_PER_KEY * \
SGENV_MAX_HPU_KEYS)
#define SGENV_NO_NODE_EXISTS 0x0
#define SGENV_NODE_TYPE_DS 0x3FF
#define SGENV_POLL_THREAD 0x1
#define SGENV_INTERRUPT_THREAD 0x2
#define BOARD_CACHE 0x1
#define ENV_CACHE 0x2
#define EP_SGENV SUNW_KERN_PUB SGENV_DRV_NAME
#define MAX_TAG_ID_STR_LEN 100
#define HPU_ENTRY(value_macro) { \
value_macro, \
value_macro ## _STR, \
value_macro ## _ID \
}
#define PART_VALUE(value_macro) { \
value_macro, \
value_macro ## _STR \
}
#define TYPE_VALUE(value_macro, scale) { \
value_macro, \
value_macro ## _STR, \
value_macro ## _UNITS, \
scale \
}
typedef struct hpu_value {
unsigned value;
const char *name;
const char *IDstr;
} hpu_value_t;
typedef struct part_value {
unsigned value;
const char *name;
} part_value_t;
typedef struct type_value {
unsigned value;
const char *name;
const char *units;
uint32_t scale;
} type_value_t;
typedef struct sgenv_soft_state {
int instance;
dev_info_t *dip;
kstat_t *keyswitch_ksp;
kstat_t *env_info_ksp;
kstat_t *board_info_ksp;
} sgenv_soft_state_t;
typedef int32_t envresp_key_t;
typedef struct envresp_constants {
sensor_id_t id;
sensor_data_t lo;
sensor_data_t hi;
} envresp_constants_t;
typedef struct envresp_volatiles {
sensor_status_t info;
sensor_data_t value;
int32_t _pad;
} envresp_volatiles_t;
typedef struct envresp_thresholds {
sensor_data_t lo_warn;
sensor_data_t hi_warn;
} envresp_thresholds_t;
static int sgenv_attach(dev_info_t *dip, ddi_attach_cmd_t cmd);
static int sgenv_detach(dev_info_t *dip, ddi_detach_cmd_t cmd);
static int sgenv_add_kstats(sgenv_soft_state_t *softsp);
static void sgenv_remove_kstats(sgenv_soft_state_t *softsp);
static int sgenv_create_cache_update_threads(void);
static int sgenv_remove_cache_update_threads(void);
static void sgenv_indicate_cache_update_needed(int cache);
static int sgenv_keyswitch_kstat_update(kstat_t *ksp, int rw);
static void sgenv_init_env_cache(void);
static void sgenv_update_env_cache(void);
static int sgenv_env_info_kstat_update(kstat_t *ksp, int rw);
static int sgenv_env_info_kstat_snapshot(kstat_t *ksp, void *buf, int rw);
static int sgenv_get_env_info_data(void);
static int sgenv_get_hpu_keys(envresp_key_t *new, int *status);
static int sgenv_get_env_data(envresp_key_t key, int key_posn,
uint16_t flag, int *status);
static int sgenv_handle_env_data_error(int err, int status, int key_posn,
envresp_key_t key, char *str);
static void sgenv_mbox_error_msg(char *str, int err, int status);
static void sgenv_destroy_env_cache(void);
static void sgenv_clear_env_cache_entry(int key_posn);
static int sgenv_create_env_cache_entry(int key_posn);
static void sgenv_set_sensor_status(env_sensor_t *sensor);
static void sgenv_update_env_kstat_size(kstat_t *ksp);
static void sgenv_init_board_cache(void);
static void sgenv_update_board_cache(void);
static int sgenv_board_info_kstat_update(kstat_t *ksp, int rw);
static int sgenv_board_info_kstat_snapshot(kstat_t *ksp,
void *buf, int rw);
static int sgenv_get_board_info_data(void);
static void sgenv_set_valid_node_positions(uint_t *node_present);
static int sgenv_process_threshold_event(env_sensor_t sensor);
static void sgenv_tagid_to_string(sensor_id_t id, char *str);
static int sgenv_add_intr_handlers(void);
static int sgenv_remove_intr_handlers(void);
static uint_t sgenv_keyswitch_handler(char *);
static uint_t sgenv_env_data_handler(char *);
static uint_t sgenv_fan_status_handler(char *);
static uint_t sgenv_dr_event_handler(char *);
static uint_t sgenv_check_sensor_thresholds(void);
static const char *sgenv_get_hpu_id_str(uint_t hpu_type);
static const char *sgenv_get_part_str(uint_t sensor_part);
static const char *sgenv_get_type_str(uint_t sensor_type);
#ifdef DEBUG
extern uint_t sgenv_debug;
#define SGENV_DEBUG_NONE 0x00
#define SGENV_DEBUG_POLL 0x01
#define SGENV_DEBUG_EVENT 0x02
#define SGENV_DEBUG_CACHE 0x04
#define SGENV_DEBUG_MSG 0x08
#define SGENV_DEBUG_THREAD 0x10
#define SGENV_DEBUG_ALL 0xFF
#define DCMN_ERR_S(v, s) static fn_t (v) = (s)
#define DCMN_ERR cmn_err
#define DCMN_ERR_EVENT if (sgenv_debug & SGENV_DEBUG_EVENT) DCMN_ERR
#define DCMN_ERR_CACHE if (sgenv_debug & SGENV_DEBUG_CACHE) DCMN_ERR
#define DCMN_ERR_THREAD if (sgenv_debug & SGENV_DEBUG_THREAD) DCMN_ERR
#define SGENV_PRINT_MBOX_MSG(x, str) \
DCMN_ERR(CE_CONT, "Mbox msg info: %s", str); \
DCMN_ERR(CE_CONT, "\ttype = 0x%x,", x->msg_type.type); \
DCMN_ERR(CE_CONT, "\tsub_type = 0x%x\n", x->msg_type.sub_type); \
DCMN_ERR(CE_CONT, "\tstatus = 0x%x\n", x->msg_status); \
DCMN_ERR(CE_CONT, "\tlen = %d\n", x->msg_len); \
DCMN_ERR(CE_CONT, "\tbytes = %d\n", x->msg_bytes); \
DCMN_ERR(CE_CONT, "\tdata[0] = %d\n", x->msg_data[0]); \
DCMN_ERR(CE_CONT, "\tdata[1] = %d\n", x->msg_data[1]);
#define SGENV_PRINT_ENV_INFO(x) \
DCMN_ERR(CE_CONT, "Tag=%lx, Val=%d, Lo=%d, LoW=%d, HiW=%d, Hi=%d, " \
"Inf=%llx St=%x PSt=%x", \
x.sd_id.tag_id, x.sd_value, \
x.sd_lo, x.sd_lo_warn, x.sd_hi_warn, x.sd_hi, x.sd_infostamp, \
SG_GET_SENSOR_STATUS(x.sd_status), \
SG_GET_PREV_SENSOR_STATUS(x.sd_status));
#define SGENV_PRINT_POLL_INFO(x) \
if (sgenv_debug & SGENV_DEBUG_POLL) SGENV_PRINT_ENV_INFO(x)
#else
#define DCMN_ERR_S(v, s) fn_t (v) = ""
#define _DCMN_ERR cmn_err
#define DCMN_ERR if (0) _DCMN_ERR
#define DCMN_ERR_EVENT if (0) _DCMN_ERR
#define DCMN_ERR_CACHE if (0) _DCMN_ERR
#define DCMN_ERR_THREAD if (0) _DCMN_ERR
#define SGENV_PRINT_MBOX_MSG
#define SGENV_PRINT_ENV_INFO
#define SGENV_PRINT_POLL_INFO
#endif
#ifdef __cplusplus
}
#endif
#endif