1 1708 stevel /* 2 1708 stevel * CDDL HEADER START 3 1708 stevel * 4 1708 stevel * The contents of this file are subject to the terms of the 5 5889 zk194757 * Common Development and Distribution License (the "License"). 6 5889 zk194757 * You may not use this file except in compliance with the License. 7 1708 stevel * 8 1708 stevel * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE 9 1708 stevel * or http://www.opensolaris.org/os/licensing. 10 1708 stevel * See the License for the specific language governing permissions 11 1708 stevel * and limitations under the License. 12 1708 stevel * 13 1708 stevel * When distributing Covered Code, include this CDDL HEADER in each 14 1708 stevel * file and include the License file at usr/src/OPENSOLARIS.LICENSE. 15 1708 stevel * If applicable, add the following below this CDDL HEADER, with the 16 1708 stevel * fields enclosed by brackets "[]" replaced with your own identifying 17 1708 stevel * information: Portions Copyright [yyyy] [name of copyright owner] 18 1708 stevel * 19 1708 stevel * CDDL HEADER END 20 1708 stevel */ 21 1708 stevel /* 22 5889 zk194757 * Copyright 2008 Sun Microsystems, Inc. All rights reserved. 23 1708 stevel * Use is subject to license terms. 24 1708 stevel */ 25 1708 stevel 26 1708 stevel /* 27 1708 stevel * Daktari Platform specific functions. 28 1708 stevel * 29 1708 stevel * called when : 30 1708 stevel * machine_type == MTYPE_DAKTARI 31 1708 stevel * 32 1708 stevel */ 33 1708 stevel 34 1708 stevel #pragma ident "%Z%%M% %I% %E% SMI" 35 1708 stevel 36 1708 stevel #include <stdio.h> 37 1708 stevel #include <stdlib.h> 38 1708 stevel #include <unistd.h> 39 1708 stevel #include <kstat.h> 40 1708 stevel #include <string.h> 41 1708 stevel #include <assert.h> 42 1708 stevel #include <libintl.h> 43 1708 stevel #include <note.h> 44 1708 stevel 45 1708 stevel #include <sys/openpromio.h> 46 1708 stevel #include <sys/sysmacros.h> 47 1708 stevel #include <sys/daktari.h> 48 1708 stevel 49 1708 stevel #include <pdevinfo.h> 50 1708 stevel #include <display.h> 51 1708 stevel #include <pdevinfo_sun4u.h> 52 1708 stevel #include <display_sun4u.h> 53 1708 stevel #include <libprtdiag.h> 54 1708 stevel 55 1708 stevel #include <picl.h> 56 1708 stevel #include "workfile.c" 57 1708 stevel 58 1708 stevel #if !defined(TEXT_DOMAIN) 59 1708 stevel #define TEXT_DOMAIN "SYS_TEST" 60 1708 stevel #endif 61 1708 stevel 62 1708 stevel #define DAK_MAX_SLOTS_PER_IO_BD 9 63 1708 stevel #define DAK_MAX_DISKS 12 64 1708 stevel #define DAK_MAX_FSP_LEDS 2 65 1708 stevel #define DAK_MAX_PS 3 66 1708 stevel #define DAK_MAX_PS_VOLTAGE_SENSORS 4 67 1708 stevel #define DAK_MAX_PS_FAULT_SENSORS 3 68 1708 stevel #define DAK_MAX_FANS 10 69 1708 stevel #ifndef SCHIZO_COMPAT_PROP 70 1708 stevel #define SCHIZO_COMPAT_PROP "pci108e,8001" 71 1708 stevel #endif 72 1708 stevel 73 1708 stevel #define MULTIPLE_BITS_SET(x) ((x)&((x)-1)) 74 1708 stevel 75 1708 stevel extern int print_flag; 76 1708 stevel 77 1708 stevel /* 78 1708 stevel * these functions will overlay the symbol table of libprtdiag 79 1708 stevel * at runtime (workgroup server systems only) 80 1708 stevel */ 81 1708 stevel void display_cpu_devices(Sys_tree *tree); 82 1708 stevel void display_cpus(Board_node *board); 83 1708 stevel void display_pci(Board_node *board); 84 1708 stevel void display_io_cards(struct io_card *list); 85 1708 stevel void display_diaginfo(int flag, Prom_node *root, Sys_tree *tree, 86 1708 stevel struct system_kstat_data *kstats); 87 1708 stevel void display_ffb(Board_node *board, int table); 88 1708 stevel void display_memoryconf(Sys_tree *tree, struct grp_info *grps); 89 1708 stevel 90 1708 stevel /* local functions */ 91 1708 stevel static int disp_envc_status(void); 92 1708 stevel static int dak_env_print_temps(picl_nodehdl_t); 93 1708 stevel static int dak_env_print_keyswitch(picl_nodehdl_t); 94 1708 stevel static int dak_env_print_FSP_LEDS(picl_nodehdl_t); 95 1708 stevel static int dak_env_print_disk(picl_nodehdl_t); 96 1708 stevel static int dak_env_print_fans(picl_nodehdl_t); 97 1708 stevel static int dak_env_print_ps(picl_nodehdl_t); 98 1708 stevel 99 1708 stevel static void dak_display_hw_revisions(Prom_node *root, 100 1708 stevel Board_node *bnode); 101 1708 stevel static void display_schizo_revisions(Board_node *bdlist); 102 1708 stevel 103 1708 stevel 104 1708 stevel /* 105 1708 stevel * Defining the error_check function in order to return the 106 1708 stevel * appropriate error code. 107 1708 stevel */ 108 1708 stevel /*ARGSUSED0*/ 109 1708 stevel int 110 1708 stevel error_check(Sys_tree *tree, struct system_kstat_data *kstats) 111 1708 stevel { 112 1708 stevel int exit_code = 0; /* init to all OK */ 113 1708 stevel /* 114 1708 stevel * silently check for any types of machine errors 115 1708 stevel */ 116 1708 stevel print_flag = 0; 117 1708 stevel if (disp_fail_parts(tree)) { 118 1708 stevel /* set exit_code to show failures */ 119 1708 stevel exit_code = 1; 120 1708 stevel } 121 1708 stevel print_flag = 1; 122 1708 stevel 123 1708 stevel return (exit_code); 124 1708 stevel } 125 1708 stevel 126 1708 stevel /* 127 1708 stevel * disp_fail_parts 128 1708 stevel * 129 1708 stevel * Display the failed parts in the system. This function looks for 130 1708 stevel * the status property in all PROM nodes. On systems where 131 1708 stevel * the PROM does not support passing diagnostic information 132 1708 stevel * through the device tree, this routine will be silent. 133 1708 stevel */ 134 1708 stevel int 135 1708 stevel disp_fail_parts(Sys_tree *tree) 136 1708 stevel { 137 1708 stevel int exit_code = 0; 138 1708 stevel int system_failed = 0; 139 1708 stevel Board_node *bnode = tree->bd_list; 140 1708 stevel Prom_node *pnode; 141 1708 stevel 142 1708 stevel /* go through all of the boards looking for failed units. */ 143 1708 stevel while (bnode != NULL) { 144 1708 stevel /* find failed chips */ 145 1708 stevel pnode = find_failed_node(bnode->nodes); 146 1708 stevel if ((pnode != NULL) && !system_failed) { 147 1708 stevel system_failed = 1; 148 1708 stevel exit_code = 1; 149 1708 stevel if (print_flag == 0) { 150 1708 stevel return (exit_code); 151 1708 stevel } 152 1708 stevel log_printf("\n"); 153 1708 stevel log_printf(dgettext(TEXT_DOMAIN, "Failed Field " 154 5889 zk194757 "Replaceable Units (FRU) in System:\n")); 155 1708 stevel log_printf("==========================" 156 5889 zk194757 "====================\n"); 157 1708 stevel } 158 1708 stevel while (pnode != NULL) { 159 1708 stevel void *value; 160 1708 stevel char *name; /* node name string */ 161 1708 stevel char *type; /* node type string */ 162 1708 stevel char *board_type = NULL; 163 1708 stevel 164 1708 stevel value = get_prop_val(find_prop(pnode, "status")); 165 1708 stevel name = get_node_name(pnode); 166 1708 stevel 167 1708 stevel /* sanity check of data retrieved from PROM */ 168 1708 stevel if ((value == NULL) || (name == NULL)) { 169 1708 stevel pnode = next_failed_node(pnode); 170 1708 stevel continue; 171 1708 stevel } 172 1708 stevel 173 1708 stevel /* Find the board type of this board */ 174 1708 stevel if (bnode->board_type == CPU_BOARD) { 175 1708 stevel board_type = "CPU"; 176 1708 stevel } else { 177 1708 stevel board_type = "IO"; 178 1708 stevel } 179 1708 stevel 180 1708 stevel log_printf(dgettext(TEXT_DOMAIN, "%s unavailable " 181 5889 zk194757 "on %s Board #%d\n"), name, board_type, 182 5889 zk194757 bnode->board_num); 183 1708 stevel 184 1708 stevel log_printf(dgettext(TEXT_DOMAIN, 185 5889 zk194757 "\tPROM fault string: %s\n"), value); 186 1708 stevel 187 1708 stevel log_printf(dgettext(TEXT_DOMAIN, 188 5889 zk194757 "\tFailed Field Replaceable Unit is ")); 189 1708 stevel 190 1708 stevel /* 191 1708 stevel * Determine whether FRU is CPU module, system 192 1708 stevel * board, or SBus card. 193 1708 stevel */ 194 1708 stevel if ((name != NULL) && (strstr(name, "sbus"))) { 195 1708 stevel 196 1708 stevel log_printf(dgettext(TEXT_DOMAIN, 197 5889 zk194757 "SBus Card %d\n"), 198 5889 zk194757 get_sbus_slot(pnode)); 199 1708 stevel 200 1708 stevel } else if (((name = get_node_name(pnode->parent)) != 201 1708 stevel NULL) && (strstr(name, "pci"))) { 202 1708 stevel 203 1708 stevel log_printf(dgettext(TEXT_DOMAIN, 204 5889 zk194757 "PCI Card %d"), 205 5889 zk194757 get_pci_device(pnode)); 206 1708 stevel 207 1708 stevel } else if (((type = get_node_type(pnode)) != NULL) && 208 1708 stevel (strstr(type, "cpu"))) { 209 1708 stevel 210 1708 stevel log_printf(dgettext(TEXT_DOMAIN, "UltraSPARC " 211 5889 zk194757 "module Board %d Module %d\n"), 0, 212 5889 zk194757 get_id(pnode)); 213 1708 stevel 214 1708 stevel } else { 215 1708 stevel log_printf(dgettext(TEXT_DOMAIN, 216 5889 zk194757 "%s board %d\n"), board_type, 217 5889 zk194757 bnode->board_num); 218 1708 stevel } 219 1708 stevel pnode = next_failed_node(pnode); 220 1708 stevel } 221 1708 stevel bnode = bnode->next; 222 1708 stevel } 223 1708 stevel 224 1708 stevel if (!system_failed) { 225 1708 stevel log_printf(dgettext(TEXT_DOMAIN, 226 5889 zk194757 "No failures found in System\n")); 227 1708 stevel log_printf("===========================\n\n"); 228 1708 stevel } 229 1708 stevel 230 1708 stevel if (system_failed) 231 1708 stevel return (1); 232 1708 stevel else 233 1708 stevel return (0); 234 1708 stevel } 235 1708 stevel 236 1708 stevel /*ARGSUSED*/ 237 1708 stevel void 238 1708 stevel display_hp_fail_fault(Sys_tree *tree, struct system_kstat_data *kstats) 239 1708 stevel { 240 1708 stevel /* Display failed units */ 241 1708 stevel (void) disp_fail_parts(tree); 242 1708 stevel } 243 1708 stevel 244 1708 stevel /*ARGSUSED*/ 245 1708 stevel void 246 1708 stevel display_memoryconf(Sys_tree *tree, struct grp_info *grps) 247 1708 stevel { 248 1708 stevel Board_node *bnode = tree->bd_list; 249 1708 stevel 250 1708 stevel log_printf(dgettext(TEXT_DOMAIN, 251 5889 zk194757 "========================= Memory Configuration" 252 5889 zk194757 " ===============================\n" 253 5889 zk194757 "\n Logical Logical" 254 5889 zk194757 " Logical " 255 5889 zk194757 "\n MC Bank Bank Bank" 256 5889 zk194757 " DIMM Interleave Interleaved" 257 5889 zk194757 "\n Brd ID num size " 258 5889 zk194757 "Status Size " 259 5889 zk194757 "Factor with" 260 5889 zk194757 "\n---- --- ---- ------ " 261 5889 zk194757 "----------- ------ " 262 5889 zk194757 "---------- -----------")); 263 1708 stevel 264 1708 stevel while (bnode != NULL) { 265 1708 stevel if (get_us3_mem_regs(bnode)) { 266 1708 stevel log_printf(dgettext(TEXT_DOMAIN, 267 5889 zk194757 "\nFailed to get memory information.\n")); 268 1708 stevel return; 269 1708 stevel } 270 1708 stevel bnode = bnode->next; 271 1708 stevel } 272 1708 stevel 273 1708 stevel /* Display what we have found */ 274 1708 stevel display_us3_banks(); 275 1708 stevel } 276 1708 stevel 277 1708 stevel void 278 1708 stevel display_cpu_devices(Sys_tree *tree) 279 1708 stevel { 280 1708 stevel Board_node *bnode; 281 1708 stevel 282 1708 stevel /* 283 1708 stevel * Display the table header for CPUs . Then display the CPU 284 1708 stevel * frequency, cache size, and processor revision of all cpus. 285 1708 stevel */ 286 1708 stevel log_printf(dgettext(TEXT_DOMAIN, 287 5889 zk194757 "\n" 288 5889 zk194757 "=========================" 289 5889 zk194757 " CPUs " 290 5889 zk194757 "===============================================" 291 5889 zk194757 "\n" 292 5889 zk194757 "\n" 293 5889 zk194757 " Run E$ CPU CPU \n" 294 5889 zk194757 "Brd CPU MHz MB Impl. Mask \n" 295 5889 zk194757 "--- ----- ---- ---- ------- ---- \n")); 296 1708 stevel 297 1708 stevel /* Now display all of the cpus on each board */ 298 1708 stevel bnode = tree->bd_list; 299 1708 stevel if (bnode == NULL) { 300 1708 stevel log_printf(dgettext(TEXT_DOMAIN, 301 5889 zk194757 "CPU Board list was NULL\n")); 302 1708 stevel } 303 1708 stevel while (bnode != NULL) { 304 1708 stevel display_cpus(bnode); 305 1708 stevel bnode = bnode->next; 306 1708 stevel } 307 1708 stevel 308 1708 stevel log_printf("\n"); 309 1708 stevel } 310 1708 stevel 311 1708 stevel /* 312 1708 stevel * Display the CPUs present on this board. 313 1708 stevel */ 314 1708 stevel void 315 1708 stevel display_cpus(Board_node *board) 316 1708 stevel { 317 1708 stevel Prom_node *cpu; 318 5889 zk194757 uint_t freq; /* CPU clock frequency */ 319 1708 stevel int ecache_size; /* External cache size */ 320 1708 stevel int *l3_shares; 321 1708 stevel int *mid; 322 1708 stevel int *impl; 323 1708 stevel int *mask; 324 1708 stevel int *coreid; 325 1708 stevel char fru_prev = 'X'; /* Valid frus are 'A','B','C','D' */ 326 1708 stevel int mid_prev; 327 1708 stevel int ecache_size_prev = 0; 328 1708 stevel char fru_name; 329 1708 stevel 330 1708 stevel /* 331 1708 stevel * display the CPUs' operating frequency, cache size, impl. field 332 1708 stevel * and mask revision. 333 1708 stevel */ 334 1708 stevel for (cpu = dev_find_type(board->nodes, "cpu"); cpu != NULL; 335 1708 stevel cpu = dev_next_type(cpu, "cpu")) { 336 1708 stevel 337 1708 stevel mid = (int *)get_prop_val(find_prop(cpu, "portid")); 338 1708 stevel if (mid == NULL) 339 1708 stevel mid = (int *)get_prop_val(find_prop(cpu, "cpuid")); 340 1708 stevel freq = DAK_CLK_FREQ_TO_MHZ(get_cpu_freq(cpu)); 341 1708 stevel ecache_size = get_ecache_size(cpu); 342 1708 stevel impl = (int *)get_prop_val(find_prop(cpu, "implementation#")); 343 1708 stevel mask = (int *)get_prop_val(find_prop(cpu, "mask#")); 344 5889 zk194757 l3_shares = (int *)get_prop_val(find_prop(cpu, 345 5889 zk194757 "l3-cache-sharing")); 346 1708 stevel 347 1708 stevel /* Do not display a failed CPU node */ 348 1708 stevel if ((impl == NULL) || (freq == 0) || (node_failed(cpu))) 349 1708 stevel continue; 350 1708 stevel 351 1708 stevel /* Board number */ 352 1708 stevel fru_name = (char)('A' + DAK_GETSLOT(*mid)); 353 1708 stevel 354 1708 stevel if (CPU_IMPL_IS_CMP(*impl)) { 355 1708 stevel coreid = (int *)get_prop_val(find_prop(cpu, "reg")); 356 1708 stevel if (coreid == NULL) { 357 1708 stevel continue; 358 1708 stevel } 359 1708 stevel if ((fru_prev == 'X') || 360 5889 zk194757 ((fru_prev != 'X') && 361 5889 zk194757 (fru_name != fru_prev))) { 362 1708 stevel fru_prev = fru_name; 363 1708 stevel mid_prev = *mid; 364 1708 stevel ecache_size_prev = ecache_size; 365 1708 stevel continue; 366 1708 stevel } else { 367 1708 stevel /* 368 1708 stevel * Some CMP chips have a split E$, 369 1708 stevel * so the size for both cores is added 370 1708 stevel * together to get the total size for 371 1708 stevel * the chip. 372 1708 stevel * 373 1708 stevel * Still, other CMP chips have E$ (L3) 374 1708 stevel * which is logically shared, so the 375 1708 stevel * total size is equal to the core size. 376 1708 stevel */ 377 1708 stevel if ((l3_shares == NULL) || 378 5889 zk194757 ((l3_shares != NULL) && 379 5889 zk194757 MULTIPLE_BITS_SET(*l3_shares))) { 380 1708 stevel ecache_size += ecache_size_prev; 381 1708 stevel } 382 1708 stevel ecache_size_prev = 0; 383 1708 stevel fru_prev = 'X'; 384 1708 stevel } 385 1708 stevel } 386 1708 stevel 387 1708 stevel log_printf("%2c", fru_name); 388 1708 stevel 389 1708 stevel /* CPU Module ID */ 390 1708 stevel if (CPU_IMPL_IS_CMP(*impl)) { 391 1708 stevel log_printf("%3d,%3d", mid_prev, *mid, 0); 392 1708 stevel } else 393 1708 stevel log_printf(" %d ", *mid); 394 1708 stevel 395 1708 stevel /* Running frequency */ 396 5889 zk194757 log_printf(" %4u ", freq); 397 1708 stevel 398 1708 stevel /* Ecache size */ 399 1708 stevel if (ecache_size == 0) 400 1708 stevel log_printf(dgettext(TEXT_DOMAIN, "%3s "), 401 1708 stevel "N/A"); 402 1708 stevel else 403 1708 stevel log_printf("%4.1f ", 404 5889 zk194757 (float)ecache_size / (float)(1<<20)); 405 1708 stevel 406 1708 stevel /* Implementation */ 407 1708 stevel if (impl == NULL) { 408 1708 stevel log_printf(dgettext(TEXT_DOMAIN, "%s "), 409 1708 stevel "N/A"); 410 1708 stevel } else { 411 1708 stevel if (IS_CHEETAH(*impl)) 412 1708 stevel log_printf("%7s", "US-III ", 0); 413 1708 stevel else if (IS_CHEETAH_PLUS(*impl)) 414 1708 stevel log_printf("%7s", "US-III+", 0); 415 1708 stevel else if (IS_JAGUAR(*impl)) 416 1708 stevel log_printf("%7s", "US-IV ", 0); 417 1708 stevel else if (IS_PANTHER(*impl)) 418 1708 stevel log_printf("%7s", "US-IV+ ", 0); 419 1708 stevel else 420 1708 stevel log_printf("%-7x", *impl, 0); 421 1708 stevel } 422 1708 stevel 423 1708 stevel /* CPU Mask */ 424 1708 stevel if (mask == NULL) { 425 1708 stevel log_printf(dgettext(TEXT_DOMAIN, " %3s "), 426 1708 stevel "N/A"); 427 1708 stevel } else { 428 1708 stevel log_printf(dgettext(TEXT_DOMAIN, " %2d.%d"), 429 1708 stevel (*mask >> 4) & 0xf, *mask & 0xf); 430 1708 stevel } 431 1708 stevel 432 1708 stevel log_printf("\n"); 433 1708 stevel } 434 1708 stevel } 435 1708 stevel 436 1708 stevel /* 437 1708 stevel * display_pci 438 1708 stevel * Display all the PCI IO cards on this board. 439 1708 stevel */ 440 1708 stevel void 441 1708 stevel display_pci(Board_node *board) 442 1708 stevel { 443 1708 stevel struct io_card *card_list = NULL; 444 1708 stevel struct io_card card; 445 1708 stevel void *value; 446 1708 stevel Prom_node *pci; 447 1708 stevel Prom_node *card_node; 448 1708 stevel char *slot_name_arr[DAK_MAX_SLOTS_PER_IO_BD] = {NULL}; 449 1708 stevel int i; 450 1708 stevel #ifdef DEBUG 451 1708 stevel int slot_name_bits; 452 1708 stevel #endif 453 1708 stevel 454 1708 stevel if (board == NULL) 455 1708 stevel return; 456 1708 stevel 457 1708 stevel memset(&card, 0, sizeof (struct io_card)); 458 1708 stevel /* Initialize all the common information */ 459 1708 stevel card.display = TRUE; 460 1708 stevel card.board = board->board_num; 461 1708 stevel 462 1708 stevel /* 463 1708 stevel * Search for each pci instance, then find/display all nodes under 464 1708 stevel * each instance node found. 465 1708 stevel */ 466 1708 stevel for (pci = dev_find_node_by_compat(board->nodes, SCHIZO_COMPAT_PROP); 467 5889 zk194757 pci != NULL; 468 5889 zk194757 pci = dev_next_node_by_compat(pci, SCHIZO_COMPAT_PROP)) { 469 1708 stevel (void) snprintf(card.bus_type, MAXSTRLEN, 470 5889 zk194757 dgettext(TEXT_DOMAIN, "PCI")); 471 1708 stevel /* 472 1708 stevel * Get slot-name properties from parent node and 473 1708 stevel * store them in an array. 474 1708 stevel */ 475 1708 stevel value = (char *)get_prop_val( 476 5889 zk194757 find_prop(pci, "slot-names")); 477 1708 stevel 478 1708 stevel if (value != NULL) { 479 1708 stevel #ifdef DEBUG 480 1708 stevel /* save the 4 byte bitmask */ 481 1708 stevel slot_name_bits = *(int *)value; 482 1708 stevel #endif 483 1708 stevel 484 1708 stevel /* array starts after first int */ 485 1708 stevel slot_name_arr[0] = (char *)value + sizeof (int); 486 1708 stevel for (i = 1; i < DAK_MAX_SLOTS_PER_IO_BD; i++) { 487 1708 stevel slot_name_arr[i] = (char *)slot_name_arr[i - 1] 488 5889 zk194757 + strlen(slot_name_arr[i - 1]) +1; 489 1708 stevel } 490 1708 stevel } 491 1708 stevel /* 492 1708 stevel * Search for Children of this node ie. Cards. 493 1708 stevel * Note: any of these cards can be a pci-bridge 494 1708 stevel * that itself has children. If we find a 495 1708 stevel * pci-bridge we need to handle it specially. 496 1708 stevel */ 497 1708 stevel card_node = pci->child; 498 1708 stevel /* Generate the list of pci cards on pci instance: pci */ 499 1708 stevel fill_pci_card_list(pci, card_node, &card, &card_list, 500 5889 zk194757 slot_name_arr); 501 1708 stevel } /* end-for */ 502 1708 stevel 503 1708 stevel display_io_cards(card_list); 504 1708 stevel free_io_cards(card_list); 505 1708 stevel log_printf("\n"); 506 1708 stevel } 507 1708 stevel 508 1708 stevel /* 509 1708 stevel * Print out all the io cards in the list. Also print the column 510 1708 stevel * headers if told to do so. 511 1708 stevel */ 512 1708 stevel void 513 1708 stevel display_io_cards(struct io_card *list) 514 1708 stevel { 515 1708 stevel static int banner = 0; /* Have we printed the column headings? */ 516 1708 stevel struct io_card *p; 517 1708 stevel 518 1708 stevel if (list == NULL) 519 1708 stevel return; 520 1708 stevel 521 1708 stevel if (banner == FALSE) { 522 1708 stevel log_printf(dgettext(TEXT_DOMAIN, 523 5889 zk194757 " Bus Max\n" 524 5889 zk194757 " IO Port Bus Freq Bus Dev," 525 5889 zk194757 "\n" 526 5889 zk194757 "Brd Type ID Side Slot MHz Freq " 527 5889 zk194757 "Func State Name " 528 5889 zk194757 "Model\n" 529 1708 stevel /* ---------Brd IO Port Bus Slot Bus Max Dev Stat */ 530 5889 zk194757 "---- ---- ---- ---- ---- ---- ---- ----" 531 5889 zk194757 " ----- " 532 5889 zk194757 "-------------------------------- " 533 5889 zk194757 "----------------------\n")); 534 1708 stevel banner = TRUE; 535 1708 stevel } 536 1708 stevel 537 1708 stevel for (p = list; p != NULL; p = p -> next) { 538 1708 stevel log_printf(dgettext(TEXT_DOMAIN, "I/O ")); 539 1708 stevel log_printf("%-4s ", p->bus_type); 540 1708 stevel log_printf("%-3d ", p->schizo_portid); 541 1708 stevel log_printf("%c ", p->pci_bus); 542 1708 stevel log_printf("%-1s ", p->slot_str); 543 1708 stevel log_printf("%-3d ", p->freq); 544 1708 stevel switch (p->pci_bus) { 545 1708 stevel case 'A': 546 1708 stevel log_printf(dgettext(TEXT_DOMAIN, " 66 ")); 547 1708 stevel break; 548 1708 stevel case 'B': 549 1708 stevel log_printf(dgettext(TEXT_DOMAIN, " 33 ")); 550 1708 stevel break; 551 1708 stevel default: 552 1708 stevel log_printf(dgettext(TEXT_DOMAIN, " - ")); 553 1708 stevel break; 554 1708 stevel } 555 1708 stevel 556 1708 stevel log_printf("%-1d,%-1d ", p->dev_no, p->func_no); 557 1708 stevel log_printf("%-5s ", p->status); 558 1708 stevel log_printf("%-32.32s", p->name); 559 1708 stevel if (strlen(p->name) > 32) 560 1708 stevel log_printf(dgettext(TEXT_DOMAIN, "+ ")); 561 1708 stevel else 562 1708 stevel log_printf(dgettext(TEXT_DOMAIN, " ")); 563 1708 stevel log_printf("%-22.22s", p->model); 564 1708 stevel if (strlen(p->model) > 22) 565 1708 stevel log_printf(dgettext(TEXT_DOMAIN, "+")); 566 1708 stevel 567 1708 stevel #ifdef DEBUG 568 1708 stevel log_printf(dgettext(TEXT_DOMAIN, "%s "), p->notes); 569 1708 stevel #endif 570 1708 stevel log_printf("\n"); 571 1708 stevel } 572 1708 stevel } 573 1708 stevel 574 1708 stevel /* 575 1708 stevel * display_ffb 576 1708 stevel * 577 1708 stevel * There are no FFB's on a Daktari, however in the generic library, 578 1708 stevel * the display_ffb() function is implemented so we have to define an 579 1708 stevel * empty function here. 580 1708 stevel */ 581 1708 stevel /* ARGSUSED */ 582 1708 stevel void 583 1708 stevel display_ffb(Board_node *board, int table) 584 1708 stevel {} 585 1708 stevel 586 1708 stevel 587 1708 stevel /* 588 1708 stevel * ---------------------------------------------------------------------------- 589 1708 stevel */ 590 1708 stevel 591 1708 stevel /* ARGSUSED */ 592 1708 stevel void 593 1708 stevel display_diaginfo(int flag, Prom_node *root, Sys_tree *tree, 594 1708 stevel struct system_kstat_data *kstats) 595 1708 stevel { 596 1708 stevel /* NOTE(ARGUNUSED(kstats)) */ 597 1708 stevel /* 598 1708 stevel * Now display the last powerfail time and the fatal hardware 599 1708 stevel * reset information. We do this under a couple of conditions. 600 1708 stevel * First if the user asks for it. The second is if the user 601 1708 stevel * told us to do logging, and we found a system failure. 602 1708 stevel */ 603 1708 stevel if (flag) { 604 1708 stevel /* 605 1708 stevel * display time of latest powerfail. Not all systems 606 1708 stevel * have this capability. For those that do not, this 607 1708 stevel * is just a no-op. 608 1708 stevel */ 609 1708 stevel disp_powerfail(root); 610 1708 stevel 611 1708 stevel (void) disp_envc_status(); 612 1708 stevel 613 1708 stevel /* platform_disp_prom_version(tree); */ 614 1708 stevel dak_display_hw_revisions(root, tree->bd_list); 615 1708 stevel } 616 1708 stevel } 617 1708 stevel 618 1708 stevel /* 619 1708 stevel * local functions 620 1708 stevel */ 621 1708 stevel 622 1708 stevel /* 623 1708 stevel * disp_envc_status 624 1708 stevel * 625 1708 stevel * This routine displays the environmental status passed up from 626 1708 stevel * device drivers via the envlibobj.so library. 627 1708 stevel * This is a Daktari specific environmental information display routine. 628 1708 stevel */ 629 1708 stevel int 630 1708 stevel disp_envc_status() 631 1708 stevel { 632 1708 stevel int err; 633 1708 stevel char *system = "SYSTEM"; 634 1708 stevel picl_nodehdl_t system_node, root; 635 1708 stevel 636 1708 stevel err = picl_initialize(); 637 1708 stevel if (err != PICL_SUCCESS) { 638 1708 stevel log_printf(dgettext(TEXT_DOMAIN, 639 5889 zk194757 "picl_initialize failed\n" 640 5889 zk194757 "%s\nCannot display environmental status\n"), 641 5889 zk194757 picl_strerror(err)); 642 1708 stevel return (err); 643 1708 stevel } 644 1708 stevel err = picl_get_root(&root); 645 1708 stevel err = find_child_device(root, system, &system_node); 646 1708 stevel if (err != PICL_SUCCESS) { 647 1708 stevel log_printf(dgettext(TEXT_DOMAIN, 648 5889 zk194757 "picl_get_node_by_path for the SYSTEM node " 649 5889 zk194757 "failed\n" 650 5889 zk194757 "%s\nCannot display environmental status\n"), 651 5889 zk194757 picl_strerror(err)); 652 1708 stevel return (err); 653 1708 stevel } 654 1708 stevel 655 1708 stevel log_printf(dgettext(TEXT_DOMAIN, 656 5889 zk194757 "\n" 657 5889 zk194757 "========================= " 658 5889 zk194757 "Environmental Status " 659 5889 zk194757 "=========================" 660 5889 zk194757 "\n" 661 5889 zk194757 "\n")); 662 1708 stevel 663 1708 stevel dak_env_print_temps(system_node); 664 1708 stevel dak_env_print_keyswitch(system_node); 665 1708 stevel dak_env_print_FSP_LEDS(system_node); 666 1708 stevel dak_env_print_disk(system_node); 667 1708 stevel dak_env_print_fans(system_node); 668 1708 stevel dak_env_print_ps(system_node); 669 1708 stevel 670 1708 stevel (void) picl_shutdown(); 671 1708 stevel return (0); 672 1708 stevel } 673 1708 stevel 674 1708 stevel int 675 1708 stevel dak_env_print_ps(picl_nodehdl_t system_node) 676 1708 stevel { 677 1708 stevel int i, r, fail, err = 0; 678 6753 vb70745 int low_warn_flag = 0; 679 1708 stevel int32_t number; 680 1708 stevel char name[PICL_PROPNAMELEN_MAX]; 681 1708 stevel picl_nodehdl_t *ps; 682 1708 stevel picl_nodehdl_t *ps_fail[DAK_MAX_PS_FAULT_SENSORS]; 683 1708 stevel picl_nodehdl_t *ps_I_sensor[DAK_MAX_PS_VOLTAGE_SENSORS]; 684 1708 stevel int32_t volts[DAK_MAX_PS_VOLTAGE_SENSORS]; 685 6753 vb70745 int32_t lo_warn[DAK_MAX_PS_VOLTAGE_SENSORS]; 686 1708 stevel char fault_state 687 5889 zk194757 [DAK_MAX_PS_FAULT_SENSORS][PICL_PROPNAMELEN_MAX]; 688 1708 stevel char ps_state[PICL_PROPNAMELEN_MAX]; 689 1708 stevel /* Printing out the Power Supply Heading information */ 690 1708 stevel log_printf(dgettext(TEXT_DOMAIN, 691 5889 zk194757 "Power Supplies:\n" 692 5889 zk194757 "---------------\n" 693 5889 zk194757 " " 694 5889 zk194757 "Current Drain:\n" 695 5889 zk194757 "Supply Status Fan Fail Temp Fail CS Fail " 696 5889 zk194757 "3.3V 5V 12V 48V\n" 697 5889 zk194757 "------ ------------ -------- --------- " 698 5889 zk194757 "------- ---- -- --- ---\n")); 699 1708 stevel 700 1708 stevel err = fill_device_array_from_id(system_node, "PSVC_PS", &number, 701 1708 stevel &ps); 702 1708 stevel if (err != PICL_SUCCESS) { 703 1708 stevel log_printf(dgettext(TEXT_DOMAIN, 704 5889 zk194757 "failed in fill_device_array_from_id for PS\n" 705 5889 zk194757 "%s\n"), picl_strerror(err)); 706 1708 stevel return (err); 707 1708 stevel } 708 1708 stevel /* Printing out the Power Supply Status information */ 709 1708 stevel for (i = 0; i < DAK_MAX_PS; i++) { 710 1708 stevel /* 711 1708 stevel * Re initialize the fail variable so that if 712 1708 stevel * one power supply fails, they don't all do also. 713 1708 stevel */ 714 1708 stevel fail = 0; 715 1708 stevel 716 1708 stevel err = picl_get_propval_by_name(ps[i], PICL_PROP_NAME, name, 717 1708 stevel PICL_PROPNAMELEN_MAX); 718 1708 stevel if (err != PICL_SUCCESS) { 719 1708 stevel continue; 720 1708 stevel } 721 1708 stevel err = picl_get_propval_by_name(ps[i], "State", ps_state, 722 5889 zk194757 PICL_PROPNAMELEN_MAX); 723 1708 stevel if (err != PICL_SUCCESS) { 724 1708 stevel log_printf(dgettext(TEXT_DOMAIN, 725 5889 zk194757 "Error getting ps[%d]'s state: %s"), 726 5889 zk194757 i, picl_strerror(err)); 727 1708 stevel } 728 1708 stevel 729 1708 stevel err = fill_device_array_from_id(ps[i], "PSVC_DEV_FAULT_SENSOR", 730 5889 zk194757 &number, &ps_fail[i]); 731 1708 stevel 732 1708 stevel if (err != PICL_SUCCESS) { 733 1708 stevel log_printf(dgettext(TEXT_DOMAIN, 734 5889 zk194757 "failed to get present PS fault sensors\n" 735 5889 zk194757 "%s\n"), picl_strerror(err)); 736 1708 stevel return (err); 737 1708 stevel } 738 1708 stevel 739 1708 stevel err = fill_device_array_from_id(ps[i], "PSVC_PS_I_SENSOR", 740 1708 stevel &number, &ps_I_sensor[i]); 741 1708 stevel 742 1708 stevel if ((err != PICL_SUCCESS) && (err != PICL_INVALIDHANDLE)) { 743 1708 stevel log_printf(dgettext(TEXT_DOMAIN, 744 5889 zk194757 "failed to get present PS I sensors\n" 745 5889 zk194757 "%s\n"), picl_strerror(err)); 746 1708 stevel } 747 1708 stevel 748 1708 stevel log_printf("%s", name); 749 1708 stevel 750 1708 stevel /* 751 1708 stevel * If the AC cord is unplugged, then the power supply 752 1708 stevel * sensors will have unreliable values. In this case, 753 1708 stevel * skip to the next power supply. 754 1708 stevel */ 755 1708 stevel if (strcmp(ps_state, "HOTPLUGGED") == 0) { 756 1708 stevel log_printf(dgettext(TEXT_DOMAIN, 757 1708 stevel " UNPLUGGED\n")); 758 1708 stevel continue; 759 1708 stevel } 760 1708 stevel 761 1708 stevel for (r = 0; r < DAK_MAX_PS_FAULT_SENSORS; r++) { 762 1708 stevel err = picl_get_propval_by_name(ps_fail[i][r], "State", 763 5889 zk194757 fault_state[r], PICL_PROPNAMELEN_MAX); 764 1708 stevel if (err == PICL_SUCCESS) { 765 1708 stevel fail = 766 1708 stevel strcmp(fault_state[r], "OFF") 767 1708 stevel + fail; 768 1708 stevel } else { 769 1708 stevel log_printf(dgettext(TEXT_DOMAIN, 770 5889 zk194757 "picl_get_propval_by_name for ps " 771 5889 zk194757 "fault state failed\n" 772 5889 zk194757 "%s\n"), picl_strerror(err)); 773 1708 stevel return (err); 774 1708 stevel } 775 1708 stevel } 776 1708 stevel for (r = 0; r < DAK_MAX_PS_VOLTAGE_SENSORS; r++) { 777 1708 stevel err = picl_get_propval_by_name(ps_I_sensor[i][r], 778 5889 zk194757 "AtoDSensorValue", &volts[r], 779 5889 zk194757 sizeof (int32_t)); 780 6753 vb70745 if (err != PICL_SUCCESS) { 781 6753 vb70745 log_printf(dgettext(TEXT_DOMAIN, 782 6753 vb70745 "failed to get A to D sensor " 783 6753 vb70745 "value\n%s\n"), picl_strerror(err)); 784 6753 vb70745 return (err); 785 6753 vb70745 } 786 6753 vb70745 err = picl_get_propval_by_name(ps_I_sensor[i][r], 787 6753 vb70745 "LowWarningThreshold", &lo_warn[r], 788 6753 vb70745 sizeof (int32_t)); 789 6753 vb70745 if (err != PICL_SUCCESS) { 790 6753 vb70745 log_printf(dgettext(TEXT_DOMAIN, 791 6753 vb70745 "failed to get low warning threshold " 792 6753 vb70745 "value\n%s\n"), picl_strerror(err)); 793 6753 vb70745 return (err); 794 6753 vb70745 } 795 6753 vb70745 if (volts[r] <= lo_warn[r]) 796 6753 vb70745 low_warn_flag++; 797 6753 vb70745 } 798 6753 vb70745 799 6753 vb70745 if (fail != 0 || low_warn_flag != 0) { 800 6753 vb70745 log_printf(dgettext(TEXT_DOMAIN, 801 6753 vb70745 " FAIL ")); 802 6753 vb70745 } else { 803 6753 vb70745 log_printf(dgettext(TEXT_DOMAIN, " GOOD ")); 804 1708 stevel } 805 1708 stevel 806 1708 stevel if (fail != 0) { 807 1708 stevel for (r = 0; r < DAK_MAX_PS_FAULT_SENSORS; r++) { 808 1708 stevel log_printf(dgettext(TEXT_DOMAIN, " %-4s"), 809 5889 zk194757 fault_state[r]); 810 1708 stevel } 811 1708 stevel } else { 812 1708 stevel for (r = 0; r < DAK_MAX_PS_FAULT_SENSORS; r++) { 813 1708 stevel log_printf(dgettext(TEXT_DOMAIN, " ")); 814 1708 stevel } 815 1708 stevel } 816 1708 stevel for (r = 0; r < DAK_MAX_PS_VOLTAGE_SENSORS; r++) { 817 1708 stevel log_printf(dgettext(TEXT_DOMAIN, " %2d"), volts[r]); 818 1708 stevel } 819 1708 stevel log_printf("\n"); 820 1708 stevel } 821 1708 stevel log_printf("\n"); 822 1708 stevel return (err); 823 1708 stevel } 824 1708 stevel 825 1708 stevel int 826 1708 stevel dak_env_print_fans(picl_nodehdl_t system_node) 827 1708 stevel { 828 1708 stevel int i, err = 0; 829 1708 stevel int32_t number, fan_speed; 830 1708 stevel picl_nodehdl_t *fans; 831 1708 stevel char name[PICL_PROPNAMELEN_MAX]; 832 1708 stevel char enabled[PICL_PROPNAMELEN_MAX]; 833 1708 stevel 834 1708 stevel err = fill_device_array_from_id(system_node, "PSVC_FAN", &number, 835 1708 stevel &fans); 836 1708 stevel if (err != PICL_SUCCESS) { 837 1708 stevel log_printf(dgettext(TEXT_DOMAIN, 838 5889 zk194757 "failed in fill_device_array_from_id " 839 5889 zk194757 "for FAN\n" 840 5889 zk194757 "%s\n"), picl_strerror(err)); 841 1708 stevel return (err); 842 1708 stevel } 843 1708 stevel 844 1708 stevel log_printf("\n"); 845 1708 stevel log_printf(dgettext(TEXT_DOMAIN, 846 5889 zk194757 "=================================\n")); 847 1708 stevel log_printf("\n"); 848 1708 stevel log_printf(dgettext(TEXT_DOMAIN, "Fan Bank :\n")); 849 1708 stevel log_printf(dgettext(TEXT_DOMAIN, "----------\n")); 850 1708 stevel log_printf("\n"); 851 1708 stevel log_printf(dgettext(TEXT_DOMAIN, "Bank Speed " 852 5889 zk194757 " Status Fan State\n")); 853 1708 stevel log_printf(dgettext(TEXT_DOMAIN, " ( RPMS )" 854 5889 zk194757 " \n")); 855 1708 stevel log_printf(dgettext(TEXT_DOMAIN, "---- --------" 856 5889 zk194757 " --------- ---------\n")); 857 1708 stevel 858 1708 stevel 859 1708 stevel for (i = 0; i < DAK_MAX_FANS; i++) { 860 1708 stevel char fan_state[PICL_PROPNAMELEN_MAX]; 861 1708 stevel fan_speed = 0; 862 1708 stevel err = picl_get_propval_by_name(fans[i], PICL_PROP_NAME, name, 863 1708 stevel PICL_PROPNAMELEN_MAX); 864 1708 stevel if (err == PICL_SUCCESS) { 865 1708 stevel log_printf(dgettext(TEXT_DOMAIN, "%16-s"), name); 866 1708 stevel } else { 867 1708 stevel continue; 868 1708 stevel } 869 1708 stevel 870 1708 stevel err = picl_get_propval_by_name(fans[i], "Fan-speed", 871 5889 zk194757 &fan_speed, sizeof (int32_t)); 872 1708 stevel if ((err != PICL_SUCCESS) && (err != PICL_INVALIDHANDLE)) { 873 1708 stevel log_printf(dgettext(TEXT_DOMAIN, 874 5889 zk194757 "failed in picl_get_propval_by_name for " 875 5889 zk194757 "fan speed\n" 876 5889 zk194757 "%s\n"), picl_strerror(err)); 877 1708 stevel return (err); 878 1708 stevel } 879 1708 stevel 880 1708 stevel if ((strcmp(name, "CPU0_PRIM_FAN") != 0) && 881 5889 zk194757 (strcmp(name, "CPU1_PRIM_FAN") != 0)) { 882 1708 stevel err = picl_get_propval_by_name(fans[i], "Fan-switch", 883 5889 zk194757 enabled, PICL_PROPNAMELEN_MAX); 884 1708 stevel if ((err != PICL_SUCCESS) && 885 1708 stevel (err != PICL_INVALIDHANDLE)) { 886 1708 stevel log_printf(dgettext(TEXT_DOMAIN, 887 5889 zk194757 "failed in picl_get_propval_by_name for" 888 5889 zk194757 " fan enabled/disabled\n" 889 5889 zk194757 "%s\n"), picl_strerror(err)); 890 1708 stevel return (err); 891 1708 stevel } 892 1708 stevel /* 893 1708 stevel * Display the fan's speed and whether or not 894 1708 stevel * it's enabled. 895 1708 stevel */ 896 1708 stevel if (strcmp(enabled, "ON") == 0) { 897 1708 stevel log_printf(dgettext(TEXT_DOMAIN, 898 5889 zk194757 "\t %4d [ENABLED]"), 899 5889 zk194757 fan_speed); 900 1708 stevel } else { 901 1708 stevel log_printf(dgettext(TEXT_DOMAIN, 902 5889 zk194757 "\t 0 [DISABLED]")); 903 1708 stevel } 904 1708 stevel 905 1708 stevel } else { 906 1708 stevel /* Display the fan's speed */ 907 1708 stevel log_printf(dgettext(TEXT_DOMAIN, "\t %4d"), 908 5889 zk194757 fan_speed); 909 1708 stevel log_printf(dgettext(TEXT_DOMAIN, 910 5889 zk194757 " [ENABLED]")); 911 1708 stevel } 912 1708 stevel 913 1708 stevel err = picl_get_propval_by_name(fans[i], "State", fan_state, 914 5889 zk194757 PICL_PROPNAMELEN_MAX); 915 1708 stevel if (err != PICL_SUCCESS) { 916 1708 stevel log_printf(dgettext(TEXT_DOMAIN, 917 5889 zk194757 "picl_get_propval_by_name failed: %s"), 918 5889 zk194757 picl_strerror(err)); 919 1708 stevel return (err); 920 1708 stevel } 921 1708 stevel log_printf(dgettext(TEXT_DOMAIN, "\t %s\n"), fan_state); 922 1708 stevel } 923 1708 stevel log_printf("\n"); 924 1708 stevel log_printf(dgettext(TEXT_DOMAIN, 925 5889 zk194757 "=================================\n")); 926 1708 stevel log_printf("\n"); 927 1708 stevel 928 1708 stevel return (err); 929 1708 stevel } 930 1708 stevel 931 1708 stevel int 932 1708 stevel dak_env_print_disk(picl_nodehdl_t system_node) 933 1708 stevel { 934 1708 stevel int i, err; 935 1708 stevel int32_t number; 936 1708 stevel picl_nodehdl_t *disks; 937 1708 stevel picl_nodehdl_t disk_slots[DAK_MAX_DISKS]; 938 1708 stevel picl_nodehdl_t disk_fault_leds[DAK_MAX_DISKS]; 939 1708 stevel picl_nodehdl_t disk_remove_leds[DAK_MAX_DISKS]; 940 1708 stevel char led_state[PICL_PROPNAMELEN_MAX]; 941 1708 stevel char name[PICL_PROPNAMELEN_MAX]; 942 1708 stevel 943 1708 stevel err = fill_device_array_from_id(system_node, "PSVC_DISK", &number, 944 5889 zk194757 &disks); 945 1708 stevel if (err != PICL_SUCCESS) { 946 1708 stevel log_printf(dgettext(TEXT_DOMAIN, 947 5889 zk194757 "failed in fill_device_array_from_id for " 948 5889 zk194757 "DISK\n" 949 5889 zk194757 "%s\n"), picl_strerror(err)); 950 1708 stevel return (err); 951 1708 stevel } 952 1708 stevel 953 1708 stevel log_printf(dgettext(TEXT_DOMAIN, 954 5889 zk194757 "Disk Status:\n" 955 5889 zk194757 " Presence Fault LED Remove LED\n")); 956 1708 stevel 957 1708 stevel for (i = 0; i < DAK_MAX_DISKS; i++) { 958 1708 stevel err = picl_get_propval_by_name(disks[i], PICL_PROP_NAME, name, 959 1708 stevel PICL_PROPNAMELEN_MAX); 960 1708 stevel switch (err) { 961 1708 stevel case PICL_SUCCESS: 962 1708 stevel log_printf(dgettext(TEXT_DOMAIN, "DISK %2d: [%7s]"), 963 5889 zk194757 i, "PRESENT"); 964 1708 stevel break; 965 1708 stevel case PICL_INVALIDHANDLE: 966 1708 stevel log_printf(dgettext(TEXT_DOMAIN, "DISK %2d: [%7s]"), 967 5889 zk194757 i, "EMPTY"); 968 1708 stevel log_printf("\n"); 969 1708 stevel continue; 970 1708 stevel default: 971 1708 stevel log_printf(dgettext(TEXT_DOMAIN, 972 5889 zk194757 "Failed picl_get_propval_by_name for " 973 5889 zk194757 "disk %d with %s\n"), i, picl_strerror(err)); 974 1708 stevel return (err); 975 1708 stevel } 976 1708 stevel 977 1708 stevel err = fill_device_from_id(disks[i], "PSVC_PARENT", 978 5889 zk194757 &(disk_slots[i])); 979 1708 stevel switch (err) { 980 1708 stevel case PICL_SUCCESS: 981 1708 stevel break; 982 1708 stevel case PICL_INVALIDHANDLE: 983 1708 stevel continue; 984 1708 stevel default: 985 1708 stevel log_printf(dgettext(TEXT_DOMAIN, 986 5889 zk194757 "failed in fill_device_from_id for disk " 987 5889 zk194757 "slot\n" 988 5889 zk194757 "%s\n"), picl_strerror(err)); 989 1708 stevel return (err); 990 1708 stevel } 991 1708 stevel 992 1708 stevel err = fill_device_from_id(disk_slots[i], "PSVC_SLOT_FAULT_LED", 993 1708 stevel &disk_fault_leds[i]); 994 1708 stevel if (err != PICL_SUCCESS) { 995 1708 stevel log_printf(dgettext(TEXT_DOMAIN, 996 5889 zk194757 "failed in fill_device_from_id for disk slot " 997 5889 zk194757 "fault led\n" 998 5889 zk194757 "%s\n"), picl_strerror(err)); 999 1708 stevel return (err); 1000 1708 stevel } 1001 1708 stevel err = picl_get_propval_by_name(disk_fault_leds[i], 1002 5889 zk194757 "State", led_state, PICL_PROPNAMELEN_MAX); 1003 1708 stevel if (err == PICL_SUCCESS) { 1004 1708 stevel log_printf(dgettext(TEXT_DOMAIN, " [%3s]"), 1005 5889 zk194757 led_state); 1006 1708 stevel } else { 1007 1708 stevel log_printf(dgettext(TEXT_DOMAIN, 1008 5889 zk194757 "picl_get_propval_by_name for fault led_state" 1009 5889 zk194757 " failed\n" 1010 5889 zk194757 "%s\n"), picl_strerror(err)); 1011 1708 stevel return (err); 1012 1708 stevel } 1013 1708 stevel err = fill_device_from_id(disk_slots[i], "PSVC_SLOT_REMOVE_LED", 1014 1708 stevel &disk_remove_leds[i]); 1015 1708 stevel if (err != PICL_SUCCESS) { 1016 1708 stevel log_printf(dgettext(TEXT_DOMAIN, 1017 5889 zk194757 "failed in fill_device_from_id for disk slot " 1018 5889 zk194757 "remove led\n" 1019 5889 zk194757 "%s\n"), picl_strerror(err)); 1020 1708 stevel return (err); 1021 1708 stevel } 1022 1708 stevel 1023 1708 stevel err = picl_get_propval_by_name(disk_remove_leds[i], 1024 5889 zk194757 "State", led_state, PICL_PROPNAMELEN_MAX); 1025 1708 stevel if (err == PICL_SUCCESS) { 1026 1708 stevel log_printf(dgettext(TEXT_DOMAIN, 1027 5889 zk194757 " [%3s]"), led_state); 1028 1708 stevel } else { 1029 1708 stevel log_printf(dgettext(TEXT_DOMAIN, 1030 5889 zk194757 "picl_get_propval_by_name for remove" 1031 5889 zk194757 " led_state failed\n" 1032 5889 zk194757 "%s\n"), picl_strerror(err)); 1033 1708 stevel return (err); 1034 1708 stevel } 1035 1708 stevel log_printf("\n"); 1036 1708 stevel } 1037 1708 stevel return (err); 1038 1708 stevel } 1039 1708 stevel 1040 1708 stevel int 1041 1708 stevel dak_env_print_FSP_LEDS(picl_nodehdl_t system_node) 1042 1708 stevel { 1043 1708 stevel int i, err = 0; 1044 1708 stevel int32_t number; 1045 1708 stevel picl_nodehdl_t *fsp_leds; 1046 1708 stevel char led_state[PICL_PROPNAMELEN_MAX]; 1047 1708 stevel 1048 1708 stevel err = fill_device_array_from_id(system_node, "PSVC_FSP_LED", &number, 1049 1708 stevel &fsp_leds); 1050 1708 stevel if (err != PICL_SUCCESS) { 1051 1708 stevel log_printf(dgettext(TEXT_DOMAIN, 1052 5889 zk194757 "failed in fill_device_array_from_id for " 1053 5889 zk194757 "FSP_LED\n" 1054 5889 zk194757 "%s\n"), picl_strerror(err)); 1055 1708 stevel return (err); 1056 1708 stevel } 1057 1708 stevel 1058 1708 stevel log_printf(dgettext(TEXT_DOMAIN, 1059 5889 zk194757 "System LED Status:\n" 1060 5889 zk194757 " GEN FAULT REMOVE\n")); 1061 1708 stevel for (i = 0; i < DAK_MAX_FSP_LEDS; i++) { 1062 1708 stevel err = picl_get_propval_by_name(fsp_leds[i], "State", 1063 5889 zk194757 led_state, PICL_PROPNAMELEN_MAX); 1064 1708 stevel if (err != PICL_SUCCESS) { 1065 1708 stevel log_printf(dgettext(TEXT_DOMAIN, 1066 5889 zk194757 "picl_get_propval_by_name for led_state" 1067 5889 zk194757 " failed\n" 1068 5889 zk194757 "%s\n"), picl_strerror(err)); 1069 1708 stevel return (err); 1070 1708 stevel } 1071 1708 stevel 1072 1708 stevel log_printf(dgettext(TEXT_DOMAIN, 1073 5889 zk194757 " [%3s]"), led_state); 1074 1708 stevel } 1075 1708 stevel log_printf("\n\n"); 1076 1708 stevel log_printf(dgettext(TEXT_DOMAIN, 1077 5889 zk194757 " DISK FAULT ")); 1078 1708 stevel log_printf(dgettext(TEXT_DOMAIN, "POWER FAULT\n")); 1079 1708 stevel for (i = 2; i < 4; i++) { 1080 1708 stevel err = picl_get_propval_by_name(fsp_leds[i], "State", 1081 5889 zk194757 led_state, PICL_PROPNAMELEN_MAX); 1082 1708 stevel if (err != PICL_SUCCESS) { 1083 1708 stevel log_printf(dgettext(TEXT_DOMAIN, 1084 5889 zk194757 "picl_get_propval_by_name for led_state" 1085 5889 zk194757 " failed\n" 1086 5889 zk194757 "%s\n"), picl_strerror(err)); 1087 1708 stevel return (err); 1088 1708 stevel } 1089 1708 stevel log_printf(dgettext(TEXT_DOMAIN, " [%3s]"), 1090 1708 stevel led_state); 1091 1708 stevel } 1092 1708 stevel log_printf("\n\n"); 1093 1708 stevel log_printf(dgettext(TEXT_DOMAIN, 1094 5889 zk194757 " LEFT THERMAL FAULT " 1095 5889 zk194757 "RIGHT THERMAL FAULT\n")); 1096 1708 stevel for (i = 4; i < 6; i++) { 1097 1708 stevel err = picl_get_propval_by_name(fsp_leds[i], "State", 1098 1708 stevel led_state, PICL_PROPNAMELEN_MAX); 1099 1708 stevel if (err != PICL_SUCCESS) { 1100 1708 stevel log_printf(dgettext(TEXT_DOMAIN, 1101 5889 zk194757 "picl_get_propval_by_name for led_state " 1102 5889 zk194757 "failed\n" 1103 5889 zk194757 "%s\n"), picl_strerror(err)); 1104 1708 stevel return (err); 1105 1708 stevel } 1106 1708 stevel log_printf(dgettext(TEXT_DOMAIN, " [%3s]"), 1107 5889 zk194757 led_state); 1108 1708 stevel } 1109 1708 stevel log_printf("\n\n"); 1110 1708 stevel log_printf(dgettext(TEXT_DOMAIN, 1111 5889 zk194757 " LEFT DOOR " 1112 5889 zk194757 "RIGHT DOOR\n")); 1113 1708 stevel for (i = 6; i < 8; i++) { 1114 1708 stevel err = picl_get_propval_by_name(fsp_leds[i], "State", 1115 1708 stevel led_state, PICL_PROPNAMELEN_MAX); 1116 1708 stevel if (err != PICL_SUCCESS) { 1117 1708 stevel log_printf(dgettext(TEXT_DOMAIN, 1118 5889 zk194757 "picl_get_propval_by_name for led_state" 1119 5889 zk194757 " failed\n" 1120 5889 zk194757 "%s\n"), picl_strerror(err)); 1121 1708 stevel return (err); 1122 1708 stevel } 1123 1708 stevel log_printf(dgettext(TEXT_DOMAIN, " [%3s]"), 1124 5889 zk194757 led_state); 1125 1708 stevel } 1126 1708 stevel log_printf("\n\n"); 1127 1708 stevel log_printf(dgettext(TEXT_DOMAIN, 1128 5889 zk194757 "=================================\n")); 1129 1708 stevel log_printf("\n"); 1130 1708 stevel 1131 1708 stevel return (err); 1132 1708 stevel } 1133 1708 stevel 1134 1708 stevel int 1135 1708 stevel dak_env_print_keyswitch(picl_nodehdl_t system_node) 1136 1708 stevel { 1137 1708 stevel int err = 0; 1138 1708 stevel picl_nodehdl_t *keyswitch; 1139 1708 stevel int32_t number; 1140 1708 stevel char ks_pos[PICL_PROPNAMELEN_MAX]; 1141 1708 stevel 1142 1708 stevel err = fill_device_array_from_id(system_node, "PSVC_KEYSWITCH", &number, 1143 1708 stevel &keyswitch); 1144 1708 stevel if (err != PICL_SUCCESS) { 1145 1708 stevel log_printf(dgettext(TEXT_DOMAIN, 1146 5889 zk194757 "failed in fill_device_array_from_id for " 1147 5889 zk194757 " PSVC_KEYSWITCH\n" 1148 5889 zk194757 "%s\n"), picl_strerror(err)); 1149 1708 stevel return (err); 1150 1708 stevel } 1151 1708 stevel 1152 1708 stevel err = picl_get_propval_by_name(keyswitch[0], "State", ks_pos, 1153 5889 zk194757 PICL_PROPNAMELEN_MAX); 1154 1708 stevel if (err != PICL_SUCCESS) { 1155 1708 stevel log_printf(dgettext(TEXT_DOMAIN, 1156 5889 zk194757 "picl_get_propval_by_name for keyswitch state " 1157 5889 zk194757 "failed\n" 1158 5889 zk194757 "%s\n"), picl_strerror(err)); 1159 1708 stevel return (err); 1160 1708 stevel } 1161 1708 stevel 1162 1708 stevel log_printf(dgettext(TEXT_DOMAIN, 1163 5889 zk194757 "Front Status Panel:\n" 1164 5889 zk194757 "-------------------\n" 1165 5889 zk194757 "Keyswitch position: " 1166 5889 zk194757 "%s\n"), ks_pos); 1167 1708 stevel log_printf("\n"); 1168 1708 stevel 1169 1708 stevel return (err); 1170 1708 stevel } 1171 1708 stevel 1172 1708 stevel int 1173 1708 stevel dak_env_print_temps(picl_nodehdl_t system_node) 1174 1708 stevel { 1175 1708 stevel int i; 1176 1708 stevel int err; 1177 1708 stevel picl_nodehdl_t *system_ts_nodes; 1178 1708 stevel int32_t temp; 1179 1708 stevel int32_t number; 1180 1708 stevel char label[PICL_PROPNAMELEN_MAX]; 1181 1708 stevel char state[PICL_PROPNAMELEN_MAX]; 1182 1708 stevel char *p; 1183 1708 stevel 1184 1708 stevel err = fill_device_array_from_id(system_node, "PSVC_TS", &number, 1185 1708 stevel &system_ts_nodes); 1186 1708 stevel if (err != PICL_SUCCESS) { 1187 1708 stevel return (err); 1188 1708 stevel } 1189 1708 stevel 1190 1708 stevel log_printf(dgettext(TEXT_DOMAIN, 1191 5889 zk194757 "System Temperatures (Celsius):\n" 1192 5889 zk194757 "-------------------------------\n" 1193 5889 zk194757 "Device\t\tTemperature\tStatus\n" 1194 5889 zk194757 "---------------------------------------\n")); 1195 1708 stevel 1196 1708 stevel for (i = 0; i < number; i++) { 1197 1708 stevel err = picl_get_propval_by_name(system_ts_nodes[i], 1198 1708 stevel "State", state, sizeof (state)); 1199 1708 stevel if (err != PICL_SUCCESS) { 1200 1708 stevel if (err == PICL_INVALIDHANDLE) { 1201 1708 stevel strcpy(state, "n/a"); 1202 1708 stevel } else { 1203 1708 stevel log_printf("%s\n", picl_strerror(err)); 1204 1708 stevel return (err); 1205 1708 stevel } 1206 1708 stevel } 1207 1708 stevel err = picl_get_propval_by_name(system_ts_nodes[i], 1208 1708 stevel PICL_PROP_NAME, label, PICL_PROPNAMELEN_MAX); 1209 1708 stevel if (err != PICL_SUCCESS) { 1210 1708 stevel if (err == PICL_INVALIDHANDLE) 1211 1708 stevel /* This FRU isn't present. Skip it. */ 1212 1708 stevel continue; 1213 1708 stevel log_printf("%s\n", picl_strerror(err)); 1214 1708 stevel return (err); 1215 1708 stevel } 1216 1708 stevel 1217 1708 stevel /* 1218 1708 stevel * The names in the tree are like "CPU0_DIE_TEMPERATURE_SENSOR". 1219 1708 stevel * All we want to print is up to the first underscore. 1220 1708 stevel */ 1221 1708 stevel p = strchr(label, '_'); 1222 1708 stevel if (p != NULL) 1223 1708 stevel *p = '\0'; 1224 1708 stevel 1225 1708 stevel err = picl_get_propval_by_name(system_ts_nodes[i], 1226 5889 zk194757 "Temperature", &temp, sizeof (temp)); 1227 1708 stevel if (err != PICL_SUCCESS) { 1228 1708 stevel log_printf("%s\n", picl_strerror(err)); 1229 1708 stevel return (err); 1230 1708 stevel } 1231 1708 stevel log_printf("%s\t\t%3d\t\t%s\n", label, temp, state); 1232 1708 stevel } 1233 1708 stevel 1234 1708 stevel log_printf(dgettext(TEXT_DOMAIN, 1235 5889 zk194757 "\n=================================\n\n")); 1236 1708 stevel 1237 1708 stevel return (PICL_SUCCESS); 1238 1708 stevel } 1239 1708 stevel 1240 1708 stevel static void 1241 1708 stevel dak_display_hw_revisions(Prom_node *root, Board_node *bdlist) 1242 1708 stevel { 1243 1708 stevel Prom_node *pnode; 1244 1708 stevel char *value; 1245 1708 stevel 1246 1708 stevel log_printf(dgettext(TEXT_DOMAIN, "\n" 1247 5889 zk194757 "========================= HW Revisions " 1248 5889 zk194757 "=======================================\n\n")); 1249 1708 stevel 1250 1708 stevel log_printf(dgettext(TEXT_DOMAIN, 1251 5889 zk194757 "System PROM revisions:\n" 1252 5889 zk194757 "----------------------\n")); 1253 1708 stevel 1254 1708 stevel pnode = dev_find_node(root, "openprom"); 1255 1708 stevel if (pnode != NULL) { 1256 5889 zk194757 value = (char *)get_prop_val(find_prop(pnode, "version")); 1257 5889 zk194757 log_printf(value); 1258 1708 stevel } 1259 1708 stevel 1260 1708 stevel log_printf(dgettext(TEXT_DOMAIN, "\n\n" 1261 5889 zk194757 "IO ASIC revisions:\n" 1262 5889 zk194757 "------------------\n" 1263 5889 zk194757 " Port\n" 1264 5889 zk194757 "Model ID Status Version\n" 1265 5889 zk194757 "-------- ---- ------ -------\n")); 1266 1708 stevel 1267 1708 stevel display_schizo_revisions(bdlist); 1268 1708 stevel } 1269 1708 stevel 1270 1708 stevel static void 1271 1708 stevel display_schizo_revisions(Board_node *bdlist) 1272 1708 stevel { 1273 1708 stevel Prom_node *pnode; 1274 1708 stevel int *int_val; 1275 1708 stevel int portid; 1276 1708 stevel int prev_portid = -1; 1277 1708 stevel char *status_a = NULL; 1278 1708 stevel char *status_b = NULL; 1279 1708 stevel int revision; 1280 1708 stevel #ifdef DEBUG 1281 1708 stevel uint32_t a_notes, b_notes; 1282 1708 stevel #endif 1283 1708 stevel int pci_bus; 1284 1708 stevel Board_node *bnode; 1285 1708 stevel bnode = bdlist; 1286 1708 stevel 1287 1708 stevel while (bnode != NULL) { 1288 1708 stevel /* 1289 1708 stevel * search this board node for all Schizos 1290 1708 stevel */ 1291 1708 stevel for (pnode = dev_find_node_by_compat(bnode->nodes, 1292 5889 zk194757 SCHIZO_COMPAT_PROP); pnode != NULL; 1293 5889 zk194757 pnode = dev_next_node_by_compat(pnode, 1294 5889 zk194757 SCHIZO_COMPAT_PROP)) { 1295 1708 stevel 1296 1708 stevel /* 1297 1708 stevel * get the reg property to determine 1298 1708 stevel * whether we are looking at side A or B 1299 1708 stevel */ 1300 1708 stevel int_val = (int *)get_prop_val 1301 5889 zk194757 (find_prop(pnode, "reg")); 1302 1708 stevel if (int_val != NULL) { 1303 1708 stevel int_val ++; /* second integer in array */ 1304 1708 stevel pci_bus = ((*int_val) & 0x7f0000); 1305 1708 stevel } 1306 1708 stevel 1307 1708 stevel /* get portid */ 1308 1708 stevel int_val = (int *)get_prop_val 1309 5889 zk194757 (find_prop(pnode, "portid")); 1310 1708 stevel if (int_val == NULL) 1311 1708 stevel continue; 1312 1708 stevel 1313 1708 stevel portid = *int_val; 1314 1708 stevel 1315 1708 stevel /* 1316 1708 stevel * If this is a new portid and it is PCI bus B, 1317 1708 stevel * we skip onto the PCI bus A. 1318 1708 stevel */ 1319 1708 stevel if ((portid != prev_portid) && (pci_bus == 0x700000)) { 1320 1708 stevel prev_portid = portid; 1321 1708 stevel /* status */ 1322 1708 stevel status_b = (char *)get_prop_val 1323 1708 stevel (find_prop(pnode, "status")); 1324 1708 stevel #ifdef DEBUG 1325 1708 stevel b_notes = pci_bus; 1326 1708 stevel #endif 1327 1708 stevel continue; /* skip to the next schizo */ 1328 1708 stevel } 1329 1708 stevel 1330 1708 stevel /* 1331 1708 stevel * This must be side A of the same Schizo. 1332 1708 stevel * Gather all its props and display them. 1333 1708 stevel */ 1334 1708 stevel #ifdef DEBUG 1335 1708 stevel a_notes = pci_bus; 1336 1708 stevel #endif 1337 1708 stevel 1338 1708 stevel prev_portid = portid; 1339 1708 stevel 1340 1708 stevel int_val = (int *)get_prop_val 1341 5889 zk194757 (find_prop(pnode, "version#")); 1342 1708 stevel if (int_val != NULL) 1343 1708 stevel revision = *int_val; 1344 1708 stevel else 1345 1708 stevel revision = -1; 1346 1708 stevel 1347 1708 stevel status_a = (char *)get_prop_val(find_prop 1348 5889 zk194757 (pnode, "status")); 1349 1708 stevel 1350 1708 stevel log_printf(dgettext(TEXT_DOMAIN, "Schizo ")); 1351 1708 stevel 1352 1708 stevel log_printf(dgettext(TEXT_DOMAIN, "%-3d "), portid, 0); 1353 1708 stevel 1354 1708 stevel 1355 1708 stevel log_printf((status_a == NULL && status_b == NULL) ? 1356 5889 zk194757 dgettext(TEXT_DOMAIN, " ok ") : 1357 5889 zk194757 dgettext(TEXT_DOMAIN, " fail ")); 1358 1708 stevel 1359 1708 stevel log_printf(dgettext(TEXT_DOMAIN, " %4d "), 1360 1708 stevel revision); 1361 1708 stevel #ifdef DEBUG 1362 1708 stevel log_printf(" 0x%x 0x%x", a_notes, b_notes); 1363 1708 stevel #endif 1364 1708 stevel log_printf("\n"); 1365 1708 stevel } 1366 1708 stevel bnode = bnode->next; 1367 1708 stevel } 1368 1708 stevel } 1369