1 /* 2 * CDDL HEADER START 3 * 4 * The contents of this file are subject to the terms of the 5 * Common Development and Distribution License (the "License"). 6 * You may not use this file except in compliance with the License. 7 * 8 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE 9 * or http://www.opensolaris.org/os/licensing. 10 * See the License for the specific language governing permissions 11 * and limitations under the License. 12 * 13 * When distributing Covered Code, include this CDDL HEADER in each 14 * file and include the License file at usr/src/OPENSOLARIS.LICENSE. 15 * If applicable, add the following below this CDDL HEADER, with the 16 * fields enclosed by brackets "[]" replaced with your own identifying 17 * information: Portions Copyright [yyyy] [name of copyright owner] 18 * 19 * CDDL HEADER END 20 */ 21 22 /* 23 * Copyright 2006 Sun Microsystems, Inc. All rights reserved. 24 * Use is subject to license terms. 25 */ 26 27 #ifndef _SYS_SGENV_IMPL_H 28 #define _SYS_SGENV_IMPL_H 29 30 #pragma ident "%Z%%M% %I% %E% SMI" 31 32 #ifdef __cplusplus 33 extern "C" { 34 #endif 35 36 /* 37 * sgenv_impl.h - Serengeti Environmental Driver 38 * 39 * This header file contains the private environmental definitions for 40 * the Serengeti platform. (used only by sgenv driver) 41 * 42 */ 43 44 /* get the public definitions */ 45 #include <sys/sgenv.h> 46 47 /* named field of keyswitch kstat */ 48 #define POSITION_KSTAT_NAME "position" 49 50 /* Mailbox message sub-types */ 51 #define SG_GET_ENV_HPU_KEYS 0x4000 52 #define SG_GET_ENV_CONSTANTS 0x4004 53 #define SG_GET_ENV_VOLATILES 0x4002 54 #define SG_GET_ENV_THRESHOLDS 0x4003 55 56 /* 57 * Max time sgenv waits for mailbox to respond before 58 * it decides to timeout. (measured in seconds) 59 */ 60 #define SGENV_DEFAULT_MAX_MBOX_WAIT_TIME 30 61 62 #define SGENV_MAX_SENSORS_PER_KEY 27 /* from design doc (3.1.4) */ 63 #define SGENV_MAX_HPUS_PER_DOMAIN 24 64 #define SGENV_MAX_HPU_KEYS (SSM_MAX_INSTANCES * \ 65 SGENV_MAX_HPUS_PER_DOMAIN) 66 #define SGENV_MAX_SENSORS (SGENV_MAX_SENSORS_PER_KEY * \ 67 SGENV_MAX_HPU_KEYS) 68 69 #define SGENV_NO_NODE_EXISTS 0x0 70 #define SGENV_NODE_TYPE_DS 0x3FF 71 72 #define SGENV_POLL_THREAD 0x1 /* cache update called from kstat */ 73 #define SGENV_INTERRUPT_THREAD 0x2 /* cache update called from softint */ 74 75 #define BOARD_CACHE 0x1 76 #define ENV_CACHE 0x2 77 78 /* 79 * Event Publisher definitions for sysevent. 80 */ 81 #define EP_SGENV SUNW_KERN_PUB SGENV_DRV_NAME 82 83 /* 84 * Event definitions 85 */ 86 #define MAX_TAG_ID_STR_LEN 100 87 88 #define HPU_ENTRY(value_macro) { \ 89 value_macro, \ 90 value_macro ## _STR, \ 91 value_macro ## _ID \ 92 } 93 94 #define PART_VALUE(value_macro) { \ 95 value_macro, \ 96 value_macro ## _STR \ 97 } 98 99 #define TYPE_VALUE(value_macro, scale) { \ 100 value_macro, \ 101 value_macro ## _STR, \ 102 value_macro ## _UNITS, \ 103 scale \ 104 } 105 106 typedef struct hpu_value { 107 unsigned value; 108 const char *name; 109 const char *IDstr; 110 111 } hpu_value_t; 112 113 typedef struct part_value { 114 unsigned value; 115 const char *name; 116 } part_value_t; 117 118 typedef struct type_value { 119 unsigned value; 120 const char *name; 121 const char *units; 122 uint32_t scale; 123 124 } type_value_t; 125 126 127 /* 128 * SGENV soft state structure. 129 */ 130 typedef struct sgenv_soft_state { 131 int instance; /* instance number */ 132 dev_info_t *dip; /* dev_info structure */ 133 kstat_t *keyswitch_ksp; 134 kstat_t *env_info_ksp; 135 kstat_t *board_info_ksp; 136 137 } sgenv_soft_state_t; 138 139 140 /* 141 * Environmental Info Structures. 142 */ 143 typedef int32_t envresp_key_t; 144 145 typedef struct envresp_constants { 146 sensor_id_t id; /* sd_id */ 147 sensor_data_t lo; /* sd_lo */ 148 sensor_data_t hi; /* sd_hi */ 149 /* no padding required, 3x4-bytes in total length */ 150 151 } envresp_constants_t; 152 153 typedef struct envresp_volatiles { 154 sensor_status_t info; /* sd_infostamp */ 155 sensor_data_t value; /* sd_value */ 156 int32_t _pad; /* pad to 2x8-bytes */ 157 158 } envresp_volatiles_t; 159 160 typedef struct envresp_thresholds { 161 sensor_data_t lo_warn; /* sd_lo_warn */ 162 sensor_data_t hi_warn; /* sd_hi_warn */ 163 /* no padding required, 2x4-bytes in total length */ 164 165 } envresp_thresholds_t; 166 167 168 /* 169 * functions local to this driver. 170 */ 171 static int sgenv_attach(dev_info_t *dip, ddi_attach_cmd_t cmd); 172 static int sgenv_detach(dev_info_t *dip, ddi_detach_cmd_t cmd); 173 174 static int sgenv_add_kstats(sgenv_soft_state_t *softsp); 175 static void sgenv_remove_kstats(sgenv_soft_state_t *softsp); 176 177 static int sgenv_create_cache_update_threads(void); 178 static int sgenv_remove_cache_update_threads(void); 179 static void sgenv_indicate_cache_update_needed(int cache); 180 181 static int sgenv_keyswitch_kstat_update(kstat_t *ksp, int rw); 182 183 static void sgenv_init_env_cache(void); 184 static void sgenv_update_env_cache(void); 185 static int sgenv_env_info_kstat_update(kstat_t *ksp, int rw); 186 static int sgenv_env_info_kstat_snapshot(kstat_t *ksp, void *buf, int rw); 187 static int sgenv_get_env_info_data(void); 188 static int sgenv_get_hpu_keys(envresp_key_t *new, int *status); 189 static int sgenv_get_env_data(envresp_key_t key, int key_posn, 190 uint16_t flag, int *status); 191 static int sgenv_handle_env_data_error(int err, int status, int key_posn, 192 envresp_key_t key, char *str); 193 static void sgenv_mbox_error_msg(char *str, int err, int status); 194 static void sgenv_destroy_env_cache(void); 195 static void sgenv_clear_env_cache_entry(int key_posn); 196 static int sgenv_create_env_cache_entry(int key_posn); 197 static void sgenv_set_sensor_status(env_sensor_t *sensor); 198 static void sgenv_update_env_kstat_size(kstat_t *ksp); 199 200 static void sgenv_init_board_cache(void); 201 static void sgenv_update_board_cache(void); 202 static int sgenv_board_info_kstat_update(kstat_t *ksp, int rw); 203 static int sgenv_board_info_kstat_snapshot(kstat_t *ksp, 204 void *buf, int rw); 205 static int sgenv_get_board_info_data(void); 206 static void sgenv_set_valid_node_positions(uint_t *node_present); 207 208 static int sgenv_process_threshold_event(env_sensor_t sensor); 209 static void sgenv_tagid_to_string(sensor_id_t id, char *str); 210 static int sgenv_add_intr_handlers(void); 211 static int sgenv_remove_intr_handlers(void); 212 static uint_t sgenv_keyswitch_handler(char *); 213 static uint_t sgenv_env_data_handler(char *); 214 static uint_t sgenv_fan_status_handler(char *); 215 static uint_t sgenv_dr_event_handler(char *); 216 static uint_t sgenv_check_sensor_thresholds(void); 217 static const char *sgenv_get_hpu_id_str(uint_t hpu_type); 218 static const char *sgenv_get_part_str(uint_t sensor_part); 219 static const char *sgenv_get_type_str(uint_t sensor_type); 220 221 222 /* 223 * Debug stuff 224 */ 225 #ifdef DEBUG 226 extern uint_t sgenv_debug; 227 228 #define SGENV_DEBUG_NONE 0x00 229 #define SGENV_DEBUG_POLL 0x01 230 #define SGENV_DEBUG_EVENT 0x02 231 #define SGENV_DEBUG_CACHE 0x04 232 #define SGENV_DEBUG_MSG 0x08 233 #define SGENV_DEBUG_THREAD 0x10 234 #define SGENV_DEBUG_ALL 0xFF 235 236 #define DCMN_ERR_S(v, s) static fn_t (v) = (s) 237 238 #define DCMN_ERR cmn_err 239 #define DCMN_ERR_EVENT if (sgenv_debug & SGENV_DEBUG_EVENT) DCMN_ERR 240 #define DCMN_ERR_CACHE if (sgenv_debug & SGENV_DEBUG_CACHE) DCMN_ERR 241 #define DCMN_ERR_THREAD if (sgenv_debug & SGENV_DEBUG_THREAD) DCMN_ERR 242 243 #define SGENV_PRINT_MBOX_MSG(x, str) \ 244 DCMN_ERR(CE_CONT, "Mbox msg info: %s", str); \ 245 DCMN_ERR(CE_CONT, "\ttype = 0x%x,", x->msg_type.type); \ 246 DCMN_ERR(CE_CONT, "\tsub_type = 0x%x\n", x->msg_type.sub_type); \ 247 DCMN_ERR(CE_CONT, "\tstatus = 0x%x\n", x->msg_status); \ 248 DCMN_ERR(CE_CONT, "\tlen = %d\n", x->msg_len); \ 249 DCMN_ERR(CE_CONT, "\tbytes = %d\n", x->msg_bytes); \ 250 DCMN_ERR(CE_CONT, "\tdata[0] = %d\n", x->msg_data[0]); \ 251 DCMN_ERR(CE_CONT, "\tdata[1] = %d\n", x->msg_data[1]); 252 253 #define SGENV_PRINT_ENV_INFO(x) \ 254 DCMN_ERR(CE_CONT, "Tag=%lx, Val=%d, Lo=%d, LoW=%d, HiW=%d, Hi=%d, " \ 255 "Inf=%llx St=%x PSt=%x", \ 256 x.sd_id.tag_id, x.sd_value, \ 257 x.sd_lo, x.sd_lo_warn, x.sd_hi_warn, x.sd_hi, x.sd_infostamp, \ 258 SG_GET_SENSOR_STATUS(x.sd_status), \ 259 SG_GET_PREV_SENSOR_STATUS(x.sd_status)); 260 261 #define SGENV_PRINT_POLL_INFO(x) \ 262 if (sgenv_debug & SGENV_DEBUG_POLL) SGENV_PRINT_ENV_INFO(x) 263 264 #else 265 #define DCMN_ERR_S(v, s) fn_t (v) = "" 266 267 #define _DCMN_ERR cmn_err 268 #define DCMN_ERR if (0) _DCMN_ERR 269 #define DCMN_ERR_EVENT if (0) _DCMN_ERR 270 #define DCMN_ERR_CACHE if (0) _DCMN_ERR 271 #define DCMN_ERR_THREAD if (0) _DCMN_ERR 272 #define SGENV_PRINT_MBOX_MSG 273 #define SGENV_PRINT_ENV_INFO 274 #define SGENV_PRINT_POLL_INFO 275 #endif 276 277 #ifdef __cplusplus 278 } 279 #endif 280 281 #endif /* _SYS_SGENV_IMPL_H */ 282