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, Version 1.0 only 6 * (the "License"). You may not use this file except in compliance 7 * with the License. 8 * 9 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE 10 * or http://www.opensolaris.org/os/licensing. 11 * See the License for the specific language governing permissions 12 * and limitations under the License. 13 * 14 * When distributing Covered Code, include this CDDL HEADER in each 15 * file and include the License file at usr/src/OPENSOLARIS.LICENSE. 16 * If applicable, add the following below this CDDL HEADER, with the 17 * fields enclosed by brackets "[]" replaced with your own identifying 18 * information: Portions Copyright [yyyy] [name of copyright owner] 19 * 20 * CDDL HEADER END 21 */ 22 /* 23 * Copyright 2005 Sun Microsystems, Inc. All rights reserved. 24 * Use is subject to license terms. 25 */ 26 27 #ifndef _ENVD_H 28 #define _ENVD_H 29 30 #pragma ident "%Z%%M% %I% %E% SMI" 31 32 #include <sys/types.h> 33 #include <libintl.h> 34 35 #ifdef __cplusplus 36 extern "C" { 37 #endif 38 39 /* 40 * Chicago Platform Details 41 */ 42 #define MAX_SENSORS 8 43 #define MAX_FANS 6 44 45 /* 46 * Fan names and ids 47 */ 48 #define ENV_SYSTEM_FAN0 "system-fan0" 49 #define ENV_SYSTEM_FAN1 "system-fan1" 50 #define ENV_SYSTEM_FAN2 "system-fan2" 51 #define ENV_SYSTEM_FAN3 "system-fan3" 52 #define ENV_SYSTEM_FAN4 "system-fan4" 53 54 #define SYSTEM_FAN0_ID 0 55 #define SYSTEM_FAN1_ID 1 56 #define SYSTEM_FAN2_ID 2 57 #define SYSTEM_FAN3_ID 3 58 #define SYSTEM_FAN4_ID 4 59 60 #define CPU0_FAN_ID SYSTEM_FAN0_ID 61 #define CPU1_FAN_ID SYSTEM_FAN1_ID 62 63 /* 64 * Sensor names and ids 65 */ 66 #define SENSOR_CPU0 "cpu0" 67 #define SENSOR_CPU1 "cpu1" 68 #define SENSOR_MB "MotherBoard" 69 #define SENSOR_ADT7462 "ADT7462" 70 #define SENSOR_LM95221 "LM95221" 71 #define SENSOR_FIRE "FireASIC" 72 #define SENSOR_LSI1064 "LSI1064" 73 #define SENSOR_FRONT_PANEL "Front_panel" 74 75 #define CPU0_SENSOR_ID 0 76 #define CPU1_SENSOR_ID 1 77 #define ADT7462_SENSOR_ID 2 78 #define MB_SENSOR_ID 3 79 #define LM95221_SENSOR_ID 4 80 #define FIRE_SENSOR_ID 5 81 #define LSI1064_SENSOR_ID 6 82 #define FRONT_PANEL_SENSOR_ID 7 83 84 /* 85 * Hard disk sensor names and ids 86 */ 87 #define ENV_DISK0 "hard-disk0" 88 #define ENV_DISK1 "hard-disk1" 89 #define ENV_DISK2 "hard-disk2" 90 #define ENV_DISK3 "hard-disk3" 91 92 #define DISK0_ID 0 93 #define DISK1_ID 1 94 #define DISK2_ID 2 95 #define DISK3_ID 3 96 97 /* 98 * Thresholds and other constants 99 */ 100 #define DISK_SCAN_INTERVAL 10 101 #define DISK_HIGH_WARN_TEMPERATURE 55 102 #define DISK_LOW_WARN_TEMPERATURE 5 103 #define DISK_HIGH_SHUTDOWN_TEMPERATURE 60 104 #define DISK_LOW_SHUTDOWN_TEMPERATURE 0 105 #define DISK_INVALID_TEMP 0xFFFF 106 #define LSI1064_VENDOR_ID 0x1000 107 #define LSI1064_DEVICE_ID 0x50 108 #define FAN_SCAN_INTERVAL 10 109 #define SENSOR_SCAN_INTERVAL 2 110 #define SENSOR_WARNING_DURATION 4 111 #define SENSOR_WARNING_INTERVAL 30 112 #define DISK_WARNING_INTERVAL 30 113 #define DISK_WARNING_DURATION 20 114 #define SENSOR_SHUTDOWN_INTERVAL 60 115 #define DISK_SHUTDOWN_INTERVAL 30 116 #define ENV_CONF_FILE "envmodel.conf" 117 #define TUNABLE_CONF_FILE "piclenvd.conf" 118 #define PM_DEVICE "/dev/pm" 119 #define SHUTDOWN_CMD "/usr/sbin/shutdown -y -g 60 -i 5" 120 #define PICL_PLUGINS_NODE "plugins" 121 #define PICL_ENVIRONMENTAL_NODE "environmental" 122 123 #define MAX_RETRIES_FOR_FAN_FAULT 10 124 #define MAX_FAN_RETRIES 14 125 #define MAX_SENSOR_RETRIES 14 126 127 #define TACH_TO_RPM(tach) (90000 * 60)/tach 128 129 #define DISK0_PHYSPATH \ 130 "/pci@1e,600000/pci@0/pci@a/pci@0/LSILogic,sas@1/sd@0,0" 131 132 #define DISK1_PHYSPATH \ 133 "/pci@1e,600000/pci@0/pci@a/pci@0/LSILogic,sas@1/sd@1,0" 134 135 #define DISK2_PHYSPATH \ 136 "/pci@1e,600000/pci@0/pci@a/pci@0/LSILogic,sas@1/sd@2,0" 137 138 #define DISK3_PHYSPATH \ 139 "/pci@1e,600000/pci@0/pci@a/pci@0/LSILogic,sas@1/sd@3,0" 140 141 #define ENV_DISK0_DEVFS \ 142 "/devices/pci@1e,600000/pci@0/pci@a/pci@0/LSILogic,sas@1/sd@0,0:a,raw" 143 144 #define ENV_DISK1_DEVFS \ 145 "/devices/pci@1e,600000/pci@0/pci@a/pci@0/LSILogic,sas@1/sd@1,0:a,raw" 146 147 #define ENV_DISK2_DEVFS \ 148 "/devices/pci@1e,600000/pci@0/pci@a/pci@0/LSILogic,sas@1/sd@2,0:a,raw" 149 150 #define ENV_DISK3_DEVFS \ 151 "/devices/pci@1e,600000/pci@0/pci@a/pci@0/LSILogic,sas@1/sd@3,0:a,raw" 152 153 #define DISK0_NODE_PATH \ 154 "name:/platform/pci@1e,600000/pci@0/pci@a/pci@0/LSILogic,sas@1/sd@0,0" 155 156 #define DISK1_NODE_PATH \ 157 "name:/platform/pci@1e,600000/pci@0/pci@a/pci@0/LSILogic,sas@1/sd@1,0" 158 159 #define DISK2_NODE_PATH \ 160 "name:/platform/pci@1e,600000/pci@0/pci@a/pci@0/LSILogic,sas@1/sd@2,0" 161 162 #define DISK3_NODE_PATH \ 163 "name:/platform/pci@1e,600000/pci@0/pci@a/pci@0/LSILogic,sas@1/sd@3,0" 164 165 #define SCSI_CONTROLLER_NODE_PATH \ 166 "name:/platform/pci@1e,600000/pci@0/pci@a/pci@0/LSILogic,sas@1" 167 168 /* CPU Path Names */ 169 #define CPU0_PATH "_class:/jbus/cpu?ID=0" 170 #define CPU1_PATH "_class:/jbus/cpu?ID=1" 171 172 #define ENV_MONITOR_DEVFS "/devices/ebus@1f,464000/env-monitor@3,0" 173 174 175 /* 176 * devfs-path for various fans and their min/max speeds 177 */ 178 #define ENV_SYSTEM_FAN0_DEVFS \ 179 "/devices/ebus@1f,464000/env-monitor@3,0:fan_0" 180 #define ENV_SYSTEM_FAN1_DEVFS \ 181 "/devices/ebus@1f,464000/env-monitor@3,0:fan_1" 182 #define ENV_SYSTEM_FAN2_DEVFS \ 183 "/devices/ebus@1f,464000/env-monitor@3,0:fan_2" 184 #define ENV_SYSTEM_FAN3_DEVFS \ 185 "/devices/ebus@1f,464000/env-monitor@3,0:fan_3" 186 #define ENV_SYSTEM_FAN4_DEVFS \ 187 "/devices/ebus@1f,464000/env-monitor@3,0:fan_4" 188 189 /* MIN and MAX SPEED are in RPM units */ 190 191 #define CPU_FAN_SPEED_MIN 250 192 #define CPU_FAN_SPEED_MAX 5000 193 194 #define SYSTEM_FAN_SPEED_MIN 250 195 #define SYSTEM_FAN_SPEED_MAX 5000 196 197 /* 198 * devfs-path for various temperature sensors and CPU platform path 199 */ 200 #define SENSOR_CPU0_DEVFS \ 201 "/devices/ebus@1f,464000/env-monitor@3,0:cpu_0" 202 #define SENSOR_CPU1_DEVFS \ 203 "/devices/ebus@1f,464000/env-monitor@3,0:cpu_1" 204 #define SENSOR_MB_DEVFS \ 205 "/devices/ebus@1f,464000/env-monitor@3,0:mb" 206 #define SENSOR_ADT7462_DEVFS \ 207 "/devices/ebus@1f,464000/env-monitor@3,0:adt7462" 208 #define SENSOR_LM95221_DEVFS \ 209 "/devices/ebus@1f,464000/env-monitor@3,0:lm95221" 210 #define SENSOR_FIRE_DEVFS \ 211 "/devices/ebus@1f,464000/env-monitor@3,0:fire" 212 #define SENSOR_LSI1064_DEVFS \ 213 "/devices/ebus@1f,464000/env-monitor@3,0:lsi1064" 214 #define SENSOR_FRONT_PANEL_DEVFS \ 215 "/devices/ebus@1f,464000/env-monitor@3,0:front_panel" 216 217 /* 218 * Temperature type 219 */ 220 typedef int16_t tempr_t; 221 222 /* 223 * SEEPROM LAYOUT 224 * 225 * The layout of environmental segment in the SEEPROM in Chicago is as 226 * shown below. Note that this is a stripped-down version of the Envseg 227 * Definition v2.0 (but compatible). In particular, piclenvd in Chicago 228 * does not use the #FanEntries and the list of FANn_ID/FANn_DOFF 229 * pairs, and it doesn't use the SensorPolicy and the list of 230 * Measured/Corrected pairs for the temperature sensor values either. 231 * 232 * 233 * 0 1 2 3 4 5 234 * +---------+------------------+----------+---------+---------+ 235 * 0x1800: | HDR_TAG | HDR_VER | HDR_LEN | HDR_CRC | N_SEGS | 236 * +---------+---------+--------+----------+---------+---------+ 237 * 0x1806: | SEG1_NAME | SEG1_DESC | 238 * +-------------------+-------------------+-------------------+ 239 * 0x180C: | SEG1_OFF | SEG1_LEN | SEG2_NAME | 240 * +-------------------+-------------------+-------------------+ 241 * ~ ~ 242 * . . 243 * ~ ~ 244 * +-------------------+-------------------+-------------------+ 245 * 0xXXXX: | SEGn_OFF | SEGn_LEN | 246 * +-------------------+-------------------+ 247 * 248 * 249 * +---------+---------+---------------------------------------+ 250 * ENVSEG_OFF: | ESEG_VER| N_SNSRS | SENSOR1_ID | 251 * +---------+---------+---------------------------------------+ 252 * | SNSR1_DOFF | SENSOR2_ID | 253 * +-------------------+---------------------------------------+ 254 * ~ ~ 255 * ~ ~ 256 * +-------------------+---------------------------------------+ 257 * | SNSRm_DOFF | 258 * +-------------------+ 259 * 260 * 261 * +---------+---------+--------+----------+---------+---------+ 262 * SNSRk_DOFF: | HI_POFF | HI_SHUT | HI_WARN| LO_WARN | LO_SHUT | LO_POFF | 263 * +-------------------+--------+----------+---------+---------+ 264 */ 265 266 #define I2C_DEVFS "/devices/ebus@1f,464000/i2c@3,80" 267 #define IOFRU_DEV "front-io-fru-prom@0,a4:front-io-fru-prom" 268 #define FRU_SEEPROM_NAME "front-io-fru-prom" 269 270 /* 271 * SEEPROM section header 272 */ 273 #define SSCN_TAG 0x08 274 #define SSCN_VER 0x0001 275 #define SSCN_OFFSET 0x1800 276 typedef struct { 277 uint8_t sscn_tag; /* section header tag */ 278 uint8_t sscn_ver[2]; /* section header version */ 279 uint8_t sscn_len; /* section header length */ 280 uint8_t sscn_crc; /* unused */ 281 uint8_t sscn_nsegs; /* total number of segments */ 282 } seeprom_scn_t; 283 284 /* 285 * SEEPROM segment header 286 */ 287 typedef struct { 288 uint16_t sseg_name; /* segment name */ 289 uint16_t sseg_desc[2]; /* segment descriptor */ 290 uint16_t sseg_off; /* segment data offset */ 291 uint16_t sseg_len; /* segment length */ 292 } seeprom_seg_t; 293 #define ENVSEG_NAME 0x4553 /* "ES" */ 294 295 /* 296 * Envseg layout V2 (stripped-down version) 297 */ 298 typedef struct { 299 uint8_t esb_high_power_off; 300 uint8_t esb_high_shutdown; 301 uint8_t esb_high_warning; 302 uint8_t esb_low_warning; 303 uint8_t esb_low_shutdown; 304 uint8_t esb_low_power_off; 305 } es_sensor_blk_t; 306 307 typedef struct { 308 uint16_t ess_id[2]; /* unique sensor id (on this FRU) */ 309 uint16_t ess_off; /* sensor data blk offset */ 310 } es_sensor_t; 311 312 #define ENVSEG_VERSION 2 313 typedef struct { 314 uint8_t esd_ver; /* envseg version */ 315 uint8_t esd_nsensors; /* envseg total number of sensor blks */ 316 es_sensor_t esd_sensors[1]; /* sensor table (variable length) */ 317 } es_data_t; 318 319 /* 320 * Macros to fetch 16 and 32 bit msb-to-lsb data from unaligned addresses 321 */ 322 #define GET_UNALIGN16(addr) \ 323 (((*(uint8_t *)addr) << 8) | *((uint8_t *)addr + 1)) 324 #define GET_UNALIGN32(addr) \ 325 (GET_UNALIGN16(addr) << 16) | GET_UNALIGN16((uint8_t *)addr + 2) 326 327 /* 328 * Macros to check sensor/disk temperatures 329 */ 330 #define SENSOR_TEMP_IN_WARNING_RANGE(val, sensorp) \ 331 ((val) > (sensorp)->es->esb_high_warning || \ 332 (val) < (char)((sensorp)->es->esb_low_warning)) 333 334 #define SENSOR_TEMP_IN_SHUTDOWN_RANGE(val, sensorp) \ 335 ((val) > (sensorp)->es->esb_high_shutdown || \ 336 (val) < (char)((sensorp)->es->esb_low_shutdown)) 337 338 #define DISK_TEMP_IN_WARNING_RANGE(val, diskp) \ 339 ((val) > (diskp)->high_warning || \ 340 (val) < (char)((diskp)->low_warning)) 341 342 #define DISK_TEMP_IN_SHUTDOWN_RANGE(val, diskp) \ 343 ((val) > (diskp)->high_shutdown || \ 344 (val) < (char)((diskp)->low_shutdown)) 345 346 #define SENSOR_WARN 1 347 #define SENSOR_OK 0 348 349 #define FAN_FAILED 1 350 #define FAN_OK 0 351 352 /* 353 * Default limits for sensors in case environmental segment is absent 354 */ 355 #define CPU0_HIGH_POWER_OFF 105 356 #define CPU0_HIGH_SHUTDOWN 100 357 #define CPU0_HIGH_WARNING 95 358 #define CPU0_LOW_WARNING 5 359 #define CPU0_LOW_SHUTDOWN 0 360 #define CPU0_LOW_POWER_OFF 0 361 362 #define CPU1_HIGH_POWER_OFF 105 363 #define CPU1_HIGH_SHUTDOWN 100 364 #define CPU1_HIGH_WARNING 95 365 #define CPU1_LOW_WARNING 5 366 #define CPU1_LOW_SHUTDOWN 0 367 #define CPU1_LOW_POWER_OFF 0 368 369 #define ADT7462_HIGH_POWER_OFF 80 370 #define ADT7462_HIGH_SHUTDOWN 75 371 #define ADT7462_HIGH_WARNING 70 372 #define ADT7462_LOW_WARNING 5 373 #define ADT7462_LOW_SHUTDOWN 0 374 #define ADT7462_LOW_POWER_OFF 0 375 376 #define MB_HIGH_POWER_OFF 80 377 #define MB_HIGH_SHUTDOWN 75 378 #define MB_HIGH_WARNING 70 379 #define MB_LOW_WARNING 5 380 #define MB_LOW_SHUTDOWN 0 381 #define MB_LOW_POWER_OFF 0 382 383 #define LM95221_HIGH_POWER_OFF 80 384 #define LM95221_HIGH_SHUTDOWN 75 385 #define LM95221_HIGH_WARNING 70 386 #define LM95221_LOW_WARNING 5 387 #define LM95221_LOW_SHUTDOWN 0 388 #define LM95221_LOW_POWER_OFF 0 389 390 #define FIRE_HIGH_POWER_OFF 105 391 #define FIRE_HIGH_SHUTDOWN 100 392 #define FIRE_HIGH_WARNING 95 393 #define FIRE_LOW_WARNING 5 394 #define FIRE_LOW_SHUTDOWN 0 395 #define FIRE_LOW_POWER_OFF 0 396 397 #define LSI1064_HIGH_POWER_OFF 105 398 #define LSI1064_HIGH_SHUTDOWN 100 399 #define LSI1064_HIGH_WARNING 95 400 #define LSI1064_LOW_WARNING 5 401 #define LSI1064_LOW_SHUTDOWN 0 402 #define LSI1064_LOW_POWER_OFF 0 403 404 #define FRONT_PANEL_HIGH_POWER_OFF 75 405 #define FRONT_PANEL_HIGH_SHUTDOWN 70 406 #define FRONT_PANEL_HIGH_WARNING 60 407 #define FRONT_PANEL_LOW_WARNING 5 408 #define FRONT_PANEL_LOW_SHUTDOWN 0 409 #define FRONT_PANEL_LOW_POWER_OFF 0 410 411 /* 412 * Temperature sensor related data structure 413 */ 414 typedef struct env_sensor { 415 char *name; /* sensor name */ 416 char *devfs_path; /* sensor device devfs path */ 417 int id; 418 int fd; /* device file descriptor */ 419 es_sensor_blk_t *es; 420 int error; /* error flag */ 421 boolean_t present; /* sensor present */ 422 tempr_t cur_temp; /* current temperature */ 423 time_t warning_start; /* warning start time (secs) */ 424 time_t warning_tstamp; /* last warning time (secs) */ 425 time_t shutdown_tstamp; /* shutdown temp time (secs) */ 426 boolean_t shutdown_initiated; /* shutdown initated */ 427 } env_sensor_t; 428 429 extern env_sensor_t *sensor_lookup(char *sensor_name); 430 extern int get_temperature(env_sensor_t *, tempr_t *); 431 432 typedef struct env_disk { 433 char *name; /* disk name */ 434 char *devfs_path; /* disk device devfs path */ 435 char *physpath; /* used to be probe for IDLW TIME */ 436 char *nodepath; /* used to detect presence of disk */ 437 uchar_t id; 438 int fd; /* device file descriptor */ 439 boolean_t present; /* disk present */ 440 boolean_t tpage_supported; /* Temperature page */ 441 int current_temp; 442 int ref_temp; 443 int reliability_temp; 444 uchar_t high_shutdown; 445 uchar_t high_warning; 446 uchar_t low_warning; 447 uchar_t low_shutdown; 448 time_t warning_start; /* warning start time (secs) */ 449 time_t warning_tstamp; /* last warning time (secs) */ 450 time_t shutdown_tstamp; /* shutdown temp time (secs) */ 451 boolean_t shutdown_initiated; /* shutdown initated */ 452 } env_disk_t; 453 454 extern env_disk_t *disk_lookup(char *disk_name); 455 extern int disk_temperature(env_disk_t *, tempr_t *); 456 457 /* 458 * Fan information data structure 459 */ 460 typedef int fanspeed_t; 461 462 typedef struct env_fan { 463 char *name; /* fan name */ 464 char *devfs_path; /* fan device devfs path */ 465 uchar_t id; 466 fanspeed_t speed_min; /* minimum speed */ 467 fanspeed_t speed_max; /* maximum speed */ 468 int forced_speed; /* forced (fixed) speed */ 469 int fd; /* device file descriptor */ 470 boolean_t present; /* fan present */ 471 int last_status; /* Fan status */ 472 uint8_t cspeed; /* Current speed (tach) */ 473 uint8_t lspeed; /* Last speed (tach) */ 474 } env_fan_t; 475 476 /* 477 * Tuneables 478 */ 479 typedef struct env_tuneable { 480 char *name; 481 char type; 482 void *value; 483 int (*rfunc)(ptree_rarg_t *, void *); 484 int (*wfunc)(ptree_warg_t *, const void *); 485 int nbytes; 486 picl_prophdl_t proph; 487 } env_tuneable_t; 488 489 extern env_fan_t *fan_lookup(char *fan_name); 490 extern int get_fan_speed(env_fan_t *, fanspeed_t *); 491 extern int set_fan_speed(env_fan_t *, fanspeed_t); 492 493 extern int env_debug; 494 extern void envd_log(int pri, const char *fmt, ...); 495 496 /* 497 * Various messages 498 */ 499 #define ENVD_PLUGIN_INIT_FAILED \ 500 gettext("SUNW_piclenvd: initialization failed!\n") 501 502 #define ENVD_PICL_SETUP_FAILED \ 503 gettext("SUNW_piclenvd: PICL setup failed!\n") 504 505 #define PM_THREAD_CREATE_FAILED \ 506 gettext("SUNW_piclenvd: pmthr thread creation failed!\n") 507 508 #define PM_THREAD_EXITING \ 509 gettext("SUNW_piclenvd: pmthr exiting! errno:%d %s\n") 510 511 #define DISK_TEMP_THREAD_EXITING \ 512 gettext("SUNW_piclenvd: Disk temp thread exiting." \ 513 " Disk temperature will not be monitored. errno:%d %s\n") 514 515 #define ENVTHR_THREAD_CREATE_FAILED \ 516 gettext("SUNW_piclenvd: envthr thread creation failed!\n") 517 518 #define ENV_SHUTDOWN_MSG \ 519 gettext("SUNW_piclenvd: '%s' sensor temperature %d outside safe " \ 520 "limits (%d...%d). Shutting down the system.\n") 521 522 #define ENV_WARNING_MSG \ 523 gettext("SUNW_piclenvd: '%s' sensor temperature %d outside safe " \ 524 "operating limits (%d...%d).\n") 525 526 #define ENV_FAN_OPEN_FAIL \ 527 gettext("SUNW_piclenvd: can't open '%s' fan path:%s errno:%d %s\n") 528 529 #define ENV_SENSOR_OPEN_FAIL \ 530 gettext("SUNW_piclenvd: can't open '%s' sensor path:%s errno:%d %s\n") 531 532 #define ENV_SENSOR_ACCESS_FAIL \ 533 gettext("SUNW_piclenvd: can't access '%s' sensor errno:%d %s\n") 534 535 #define ENV_SENSOR_ACCESS_OK \ 536 gettext("SUNW_piclenvd: '%s' sensor is accessible now.\n") 537 538 #define ENV_FAN_FAILURE_WARNING_MSG \ 539 gettext("SUNW_piclenvd: %s has Failed.\n" \ 540 "(rpm = %s status = %s)\n") 541 542 #define ENV_FAN_OK_MSG \ 543 gettext("SUNW_piclenvd: %s is OKAY.\n") 544 545 #define ENV_FRU_OPEN_FAIL \ 546 gettext("SUNW_piclenvd: can't open FRU SEEPROM path:%s errno:%d\n") 547 548 #define ENV_FRU_BAD_ENVSEG \ 549 gettext("SUNW_piclenvd: version mismatch or environmental segment " \ 550 "header too short in FRU SEEPROM %s\n") 551 552 #define ENV_FRU_BAD_SCNHDR \ 553 gettext("SUNW_piclenvd: invalid section header tag:%x version:%x\n") 554 555 #define ENV_FRU_NOMEM_FOR_SEG \ 556 gettext("SUNW_piclenvd: cannot allocate %d bytes for env seg memory\n") 557 558 #define ENV_DEFAULT_LIMITS \ 559 gettext("SUNW_piclenvd: error reading ES segment, using defaults\n") 560 561 #ifdef __cplusplus 562 } 563 #endif 564 565 #endif /* _ENVD_H */ 566