11708Sstevel /* 21708Sstevel * CDDL HEADER START 31708Sstevel * 41708Sstevel * The contents of this file are subject to the terms of the 53941Svenki * Common Development and Distribution License (the "License"). 63941Svenki * You may not use this file except in compliance with the License. 71708Sstevel * 81708Sstevel * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE 91708Sstevel * or http://www.opensolaris.org/os/licensing. 101708Sstevel * See the License for the specific language governing permissions 111708Sstevel * and limitations under the License. 121708Sstevel * 131708Sstevel * When distributing Covered Code, include this CDDL HEADER in each 141708Sstevel * file and include the License file at usr/src/OPENSOLARIS.LICENSE. 151708Sstevel * If applicable, add the following below this CDDL HEADER, with the 161708Sstevel * fields enclosed by brackets "[]" replaced with your own identifying 171708Sstevel * information: Portions Copyright [yyyy] [name of copyright owner] 181708Sstevel * 191708Sstevel * CDDL HEADER END 201708Sstevel */ 211708Sstevel /* 223941Svenki * Copyright 2007 Sun Microsystems, Inc. All rights reserved. 231708Sstevel * Use is subject to license terms. 241708Sstevel */ 251708Sstevel 261708Sstevel #pragma ident "%Z%%M% %I% %E% SMI" 271708Sstevel 281708Sstevel #include <stdio.h> 291708Sstevel #include <stdlib.h> 301708Sstevel #include <unistd.h> 311708Sstevel #include <ctype.h> 321708Sstevel #include <string.h> 331708Sstevel #include <kvm.h> 341708Sstevel #include <varargs.h> 351708Sstevel #include <time.h> 361708Sstevel #include <dirent.h> 371708Sstevel #include <fcntl.h> 381708Sstevel #include <sys/param.h> 391708Sstevel #include <sys/stat.h> 401708Sstevel #include <sys/types.h> 411708Sstevel #include <sys/utsname.h> 421708Sstevel #include <sys/openpromio.h> 431708Sstevel #include <libintl.h> 441708Sstevel #include <syslog.h> 451708Sstevel #include <sys/dkio.h> 463941Svenki #include <sys/systeminfo.h> 473941Svenki #include <picldefs.h> 481708Sstevel #include "pdevinfo.h" 491708Sstevel #include "display.h" 501708Sstevel #include "display_sun4v.h" 511708Sstevel #include "libprtdiag.h" 521708Sstevel 531708Sstevel #if !defined(TEXT_DOMAIN) 541708Sstevel #define TEXT_DOMAIN "SYS_TEST" 551708Sstevel #endif 561708Sstevel 573941Svenki #define IOBOARD "IOBD" 583941Svenki #define NETWORK "network" 593941Svenki #define PCIE_COMPATIBLE_STR "pciex" 603941Svenki #define PCIX_COMPATIBLE_STR "pci" 613941Svenki #define SUN4V_MACHINE "sun4v" 623941Svenki #define PARENT_NAMES 10 633941Svenki 643941Svenki /* 653941Svenki * Additional OBP properties 663941Svenki */ 673941Svenki #define OBP_PROP_COMPATIBLE "compatible" 683941Svenki #define OBP_PROP_MODEL "model" 693941Svenki #define OBP_PROP_SLOT_NAMES "slot-names" 703941Svenki 713941Svenki #define PICL_NODE_PHYSICAL_PLATFORM "physical-platform" 723941Svenki #define PICL_NODE_CHASSIS "chassis" 733941Svenki #define MEMORY_SIZE_FIELD 11 743941Svenki #define INVALID_THRESHOLD 1000000 753941Svenki 763941Svenki /* 773941Svenki * Additional picl classes 783941Svenki */ 793941Svenki #ifndef PICL_CLASS_SUN4V 803941Svenki #define PICL_CLASS_SUN4V "sun4v" 813941Svenki #endif 823941Svenki 833941Svenki #ifndef PICL_PROP_NAC 843941Svenki #define PICL_PROP_NAC "nac" 853941Svenki #endif 863941Svenki 873941Svenki extern int sys_clk; 883941Svenki extern picl_errno_t sun4v_get_node_by_name(picl_nodehdl_t, char *, 893941Svenki picl_nodehdl_t *); 903941Svenki 913941Svenki static picl_nodehdl_t rooth = 0, phyplatformh = 0; 923941Svenki static picl_nodehdl_t chassish = 0; 933941Svenki static int class_node_found; 943941Svenki static int syserrlog; 953941Svenki static int all_status_ok; 963941Svenki 973941Svenki /* local functions */ 983941Svenki static int sun4v_get_first_compatible_value(picl_nodehdl_t, char **); 993941Svenki static void sun4v_display_memory_conf(picl_nodehdl_t); 1003941Svenki static void sun4v_disp_env_status(); 1013941Svenki static void sun4v_env_print_fan_sensors(); 1023941Svenki static void sun4v_env_print_fan_indicators(); 1033941Svenki static void sun4v_env_print_temp_sensors(); 1043941Svenki static void sun4v_env_print_temp_indicators(); 1053941Svenki static void sun4v_env_print_current_sensors(); 1063941Svenki static void sun4v_env_print_current_indicators(); 1073941Svenki static void sun4v_env_print_voltage_sensors(); 1083941Svenki static void sun4v_env_print_voltage_indicators(); 1093941Svenki static void sun4v_env_print_LEDs(); 1103941Svenki static void sun4v_print_fru_status(); 1113941Svenki static void sun4v_print_fw_rev(); 1123941Svenki static void sun4v_print_chassis_serial_no(); 1131708Sstevel 1141708Sstevel int 1153941Svenki sun4v_display(Sys_tree *tree, Prom_node *root, int log, 1163941Svenki picl_nodehdl_t plafh) 1171708Sstevel { 1181708Sstevel void *value; /* used for opaque PROM data */ 1191708Sstevel struct mem_total memory_total; /* Total memory in system */ 1201708Sstevel struct grp_info grps; /* Info on all groups in system */ 1213941Svenki char machine[MAXSTRLEN]; 1223941Svenki 1233941Svenki if (sysinfo(SI_MACHINE, machine, sizeof (machine)) == -1) 1243941Svenki return (1); 1253941Svenki if (strncmp(machine, SUN4V_MACHINE, strlen(SUN4V_MACHINE)) != 0) 1263941Svenki return (1); 1271708Sstevel 1281708Sstevel sys_clk = -1; /* System clock freq. (in MHz) */ 1291708Sstevel 1301708Sstevel /* 1311708Sstevel * Now display the machine's configuration. We do this if we 1321708Sstevel * are not logging. 1331708Sstevel */ 1341708Sstevel if (!logging) { 1351708Sstevel struct utsname uts_buf; 1361708Sstevel 1371708Sstevel /* 1381708Sstevel * Display system banner 1391708Sstevel */ 1401708Sstevel (void) uname(&uts_buf); 1411708Sstevel 1423941Svenki log_printf(dgettext(TEXT_DOMAIN, "System Configuration: " 1433941Svenki "Sun Microsystems %s %s\n"), uts_buf.machine, 1443941Svenki get_prop_val(find_prop(root, "banner-name")), 0); 1451708Sstevel 1461708Sstevel /* display system clock frequency */ 1471708Sstevel value = get_prop_val(find_prop(root, "clock-frequency")); 1481708Sstevel if (value != NULL) { 1491708Sstevel sys_clk = ((*((int *)value)) + 500000) / 1000000; 1501708Sstevel log_printf(dgettext(TEXT_DOMAIN, "System clock " 1511708Sstevel "frequency: %d MHz\n"), sys_clk, 0); 1521708Sstevel } 1531708Sstevel 1541708Sstevel /* Display the Memory Size */ 1551708Sstevel display_memorysize(tree, NULL, &grps, &memory_total); 1561708Sstevel 1571708Sstevel /* Display the CPU devices */ 1581708Sstevel sun4v_display_cpu_devices(plafh); 1591708Sstevel 1601708Sstevel /* Display the Memory configuration */ 1613941Svenki class_node_found = 0; 1623941Svenki sun4v_display_memory_conf(plafh); 1631708Sstevel 1641708Sstevel /* Display all the IO cards. */ 1651708Sstevel (void) sun4v_display_pci(plafh); 1663941Svenki sun4v_display_diaginfo((log || (logging)), root, plafh); 1671708Sstevel 1683941Svenki if (picl_get_root(&rooth) != PICL_SUCCESS) 1693941Svenki return (1); 1703941Svenki if (sun4v_get_node_by_name(rooth, PICL_NODE_PHYSICAL_PLATFORM, 1713941Svenki &phyplatformh) != PICL_SUCCESS) 1723941Svenki return (1); 1733941Svenki 1743941Svenki if (picl_find_node(phyplatformh, PICL_PROP_CLASSNAME, 1753941Svenki PICL_PTYPE_CHARSTRING, (void *)PICL_CLASS_CHASSIS, 1763941Svenki strlen(PICL_CLASS_CHASSIS), &chassish) != PICL_SUCCESS) 1773941Svenki return (1); 1783941Svenki 1793941Svenki syserrlog = log; 1803941Svenki sun4v_disp_env_status(); 1813941Svenki } 1823941Svenki return (0); 1833941Svenki } 1843941Svenki 1853941Svenki static void 1863941Svenki get_bus_type(picl_nodehdl_t nodeh, struct io_card *card) 1873941Svenki { 1883941Svenki char *compatible; 1893941Svenki 190*4003Svivek (void) strlcpy(card->bus_type, "PCIX", sizeof (card->bus_type)); 1913941Svenki if (sun4v_get_first_compatible_value(nodeh, &compatible) 1923941Svenki == PICL_SUCCESS) { 1933941Svenki if (strncmp(compatible, PCIE_COMPATIBLE_STR, 1943941Svenki strlen(PCIE_COMPATIBLE_STR)) == 0) 195*4003Svivek (void) strlcpy(card->bus_type, "PCIE", 196*4003Svivek sizeof (card->bus_type)); 1973941Svenki free(compatible); 1983941Svenki } 1993941Svenki } 2003941Svenki 2013941Svenki static picl_errno_t 2023941Svenki get_slot_label(picl_nodehdl_t nodeh, struct io_card *card) 2033941Svenki { 2043941Svenki char val[PICL_PROPNAMELEN_MAX]; 2053941Svenki picl_errno_t err; 2063941Svenki 2073941Svenki err = picl_get_propval_by_name(nodeh, PICL_PROP_LABEL, val, 2083941Svenki sizeof (val)); 2093941Svenki if (err != PICL_SUCCESS) 2103941Svenki return (err); 2113941Svenki 212*4003Svivek (void) strlcpy(card->slot_str, val, sizeof (card->slot_str)); 2133941Svenki card->slot = -1; 2143941Svenki return (PICL_SUCCESS); 2153941Svenki } 2163941Svenki 2173941Svenki static void 2183941Svenki get_slot_number(picl_nodehdl_t nodeh, struct io_card *card) 2193941Svenki { 2203941Svenki picl_errno_t err; 2213941Svenki picl_prophdl_t proph; 2223941Svenki picl_propinfo_t pinfo; 2233941Svenki picl_nodehdl_t pnodeh; 2243941Svenki uint8_t *pval; 2253941Svenki uint32_t dev_mask; 2263941Svenki char uaddr[MAXSTRLEN]; 2273941Svenki int i; 2283941Svenki 2293941Svenki if (get_slot_label(nodeh, card) == PICL_SUCCESS) 2303941Svenki return; 2313941Svenki err = PICL_SUCCESS; 2323941Svenki while (err == PICL_SUCCESS) { 2333941Svenki if (picl_get_propval_by_name(nodeh, PICL_PROP_PARENT, &pnodeh, 2343941Svenki sizeof (pnodeh)) != PICL_SUCCESS) { 235*4003Svivek (void) strlcpy(card->slot_str, IOBOARD, 236*4003Svivek sizeof (card->slot_str)); 2373941Svenki card->slot = -1; 2383941Svenki return; 2393941Svenki } 2403941Svenki if (picl_get_propinfo_by_name(pnodeh, OBP_PROP_SLOT_NAMES, 2413941Svenki &pinfo, &proph) == PICL_SUCCESS) { 2423941Svenki break; 2433941Svenki } 2443941Svenki nodeh = pnodeh; 2453941Svenki } 2463941Svenki if (picl_get_propval_by_name(nodeh, PICL_PROP_UNIT_ADDRESS, uaddr, 2473941Svenki sizeof (uaddr)) != PICL_SUCCESS) { 248*4003Svivek (void) strlcpy(card->slot_str, IOBOARD, 249*4003Svivek sizeof (card->slot_str)); 2503941Svenki card->slot = -1; 2513941Svenki return; 2523941Svenki } 2533941Svenki pval = (uint8_t *)malloc(pinfo.size); 2543941Svenki if (!pval) { 255*4003Svivek (void) strlcpy(card->slot_str, IOBOARD, 256*4003Svivek sizeof (card->slot_str)); 2573941Svenki card->slot = -1; 2583941Svenki return; 2593941Svenki } 2603941Svenki if (picl_get_propval(proph, pval, pinfo.size) != PICL_SUCCESS) { 261*4003Svivek (void) strlcpy(card->slot_str, IOBOARD, 262*4003Svivek sizeof (card->slot_str)); 2633941Svenki card->slot = -1; 2643941Svenki free(pval); 2653941Svenki return; 2661708Sstevel } 2671708Sstevel 2683941Svenki dev_mask = 0; 2693941Svenki for (i = 0; i < sizeof (dev_mask); i++) 2703941Svenki dev_mask |= (*(pval+i) << 8*(sizeof (dev_mask)-1-i)); 2713941Svenki for (i = 0; i < sizeof (uaddr) && uaddr[i] != '\0'; i++) { 2723941Svenki if (uaddr[i] == ',') { 2733941Svenki uaddr[i] = '\0'; 2743941Svenki break; 2753941Svenki } 2763941Svenki } 2773941Svenki card->slot = atol(uaddr); 2783941Svenki if (((1 << card->slot) & dev_mask) == 0) { 279*4003Svivek (void) strlcpy(card->slot_str, IOBOARD, 280*4003Svivek sizeof (card->slot_str)); 2813941Svenki card->slot = -1; 2823941Svenki } else { 2833941Svenki char *p = (char *)(pval+sizeof (dev_mask)); 2843941Svenki int shift = sizeof (uint32_t)*8-1-card->slot; 2853941Svenki uint32_t x = (dev_mask << shift) >> shift; 2863941Svenki int count = 0; /* count # of 1's in x */ 2873941Svenki int i = 0; 2883941Svenki while (x != 0) { 2893941Svenki count++; 2903941Svenki x &= x-1; 2913941Svenki } 2923941Svenki while (count > 1) { 2933941Svenki while (p[i++] != '\0'); 2943941Svenki count--; 2953941Svenki } 296*4003Svivek (void) strlcpy(card->slot_str, (char *)(p+i), 297*4003Svivek sizeof (card->slot_str)); 2983941Svenki } 2993941Svenki free(pval); 3003941Svenki } 3013941Svenki 3023941Svenki /* 3033941Svenki * add all io devices under pci in io list 3043941Svenki */ 3053941Svenki /* ARGSUSED */ 3063941Svenki static int 3073941Svenki sun4v_pci_callback(picl_nodehdl_t pcih, void *args) 3083941Svenki { 3093941Svenki char path[PICL_PROPNAMELEN_MAX]; 3103941Svenki char class[PICL_CLASSNAMELEN_MAX]; 3113941Svenki char name[PICL_PROPNAMELEN_MAX]; 3123941Svenki char model[PICL_PROPNAMELEN_MAX]; 3133941Svenki char binding_name[PICL_PROPNAMELEN_MAX]; 3143941Svenki char val[PICL_PROPNAMELEN_MAX]; 3153941Svenki char *compatible; 3163941Svenki picl_errno_t err; 3173941Svenki picl_nodehdl_t nodeh; 3183941Svenki struct io_card pci_card; 3193941Svenki 3203941Svenki /* Walk through the children */ 3213941Svenki 3223941Svenki err = picl_get_propval_by_name(pcih, PICL_PROP_CHILD, &nodeh, 3233941Svenki sizeof (picl_nodehdl_t)); 3243941Svenki 3253941Svenki while (err == PICL_SUCCESS) { 3263941Svenki err = picl_get_propval_by_name(nodeh, PICL_PROP_CLASSNAME, 3273941Svenki class, sizeof (class)); 3283941Svenki if (err != PICL_SUCCESS) 3293941Svenki return (err); 3303941Svenki 3313941Svenki if (args) { 3323941Svenki char *val = args; 3333941Svenki if (strcmp(class, val) == 0) { 3343941Svenki err = picl_get_propval_by_name(nodeh, 3353941Svenki PICL_PROP_PEER, &nodeh, 3363941Svenki sizeof (picl_nodehdl_t)); 3373941Svenki continue; 3383941Svenki } else if (strcmp(val, PICL_CLASS_PCIEX) == 0 && 3393941Svenki strcmp(class, PICL_CLASS_PCI) == 0) { 3403941Svenki err = picl_get_propval_by_name(nodeh, 3413941Svenki PICL_PROP_PEER, &nodeh, 3423941Svenki sizeof (picl_nodehdl_t)); 3433941Svenki continue; 3443941Svenki } else if (strcmp(val, PICL_CLASS_PCI) == 0 && 3453941Svenki strcmp(class, PICL_CLASS_PCIEX) == 0) { 3463941Svenki err = picl_get_propval_by_name(nodeh, 3473941Svenki PICL_PROP_PEER, &nodeh, 3483941Svenki sizeof (picl_nodehdl_t)); 3493941Svenki continue; 3503941Svenki } 3513941Svenki } 3523941Svenki 3533941Svenki err = picl_get_propval_by_name(nodeh, PICL_PROP_DEVFS_PATH, 3543941Svenki path, sizeof (path)); 3553941Svenki if (err != PICL_SUCCESS) 3563941Svenki return (err); 3573941Svenki 3583941Svenki (void) strlcpy(pci_card.notes, path, sizeof (pci_card.notes)); 3593941Svenki 3603941Svenki get_bus_type(nodeh, &pci_card); 3613941Svenki get_slot_number(nodeh, &pci_card); 3623941Svenki 3633941Svenki err = picl_get_propval_by_name(nodeh, PICL_PROP_NAME, name, 3643941Svenki sizeof (name)); 3653941Svenki if (err == PICL_PROPNOTFOUND) 366*4003Svivek (void) strlcpy(name, "", sizeof (name)); 3673941Svenki else if (err != PICL_SUCCESS) 3683941Svenki return (err); 3693941Svenki 3703941Svenki err = picl_get_propval_by_name(nodeh, PICL_PROP_STATUS, val, 3713941Svenki sizeof (val)); 3723941Svenki if (err == PICL_PROPNOTFOUND) 373*4003Svivek (void) strlcpy(val, "", sizeof (val)); 3743941Svenki else if (err != PICL_SUCCESS) 3753941Svenki return (err); 3763941Svenki 3773941Svenki /* Figure NAC name */ 3783941Svenki if (pci_card.slot != -1) 3793941Svenki (void) snprintf(pci_card.status, 3803941Svenki sizeof (pci_card.status), 3813941Svenki "%s%d", pci_card.slot_str, 3823941Svenki pci_card.slot); 3833941Svenki else 3843941Svenki (void) snprintf(pci_card.status, 3853941Svenki sizeof (pci_card.status), 3863941Svenki "%s", pci_card.slot_str); 3873941Svenki 3883941Svenki /* 3893941Svenki * Get the name of this card. If binding_name is found, 3903941Svenki * name will be <nodename>-<binding_name>. 3913941Svenki */ 3923941Svenki err = picl_get_propval_by_name(nodeh, PICL_PROP_BINDING_NAME, 3933941Svenki binding_name, sizeof (binding_name)); 3943941Svenki if (err == PICL_SUCCESS) { 3953941Svenki if (strcmp(name, binding_name) != 0) { 3963941Svenki (void) strlcat(name, "-", sizeof (name)); 3973941Svenki (void) strlcat(name, binding_name, 3983941Svenki sizeof (name)); 3993941Svenki } 4003941Svenki } else if (err == PICL_PROPNOTFOUND) { 4013941Svenki /* 4023941Svenki * if compatible prop is not found, name will be 4033941Svenki * <nodename>-<compatible> 4043941Svenki */ 4053941Svenki err = sun4v_get_first_compatible_value(nodeh, 4063941Svenki &compatible); 4073941Svenki if (err == PICL_SUCCESS) { 4083941Svenki (void) strlcat(name, "-", sizeof (name)); 409*4003Svivek (void) strlcat(name, compatible, 410*4003Svivek sizeof (name)); 4113941Svenki free(compatible); 4123941Svenki } 4133941Svenki } else 4143941Svenki return (err); 4153941Svenki 4163941Svenki (void) strlcpy(pci_card.name, name, sizeof (pci_card.name)); 4173941Svenki 4183941Svenki /* Get the model of this card */ 4193941Svenki 4203941Svenki err = picl_get_propval_by_name(nodeh, OBP_PROP_MODEL, 4213941Svenki model, sizeof (model)); 4223941Svenki if (err == PICL_PROPNOTFOUND) 423*4003Svivek (void) strlcpy(model, "", sizeof (model)); 4243941Svenki else if (err != PICL_SUCCESS) 4253941Svenki return (err); 4263941Svenki (void) strlcpy(pci_card.model, model, sizeof (pci_card.model)); 4273941Svenki 4283941Svenki /* Print NAC name */ 4293941Svenki log_printf("%-12s", pci_card.status); 4303941Svenki /* Print IO Type */ 4313941Svenki log_printf("%-6s", pci_card.bus_type); 4323941Svenki /* Printf Card Name */ 4333941Svenki log_printf("%-46s", pci_card.name); 4343941Svenki /* Print Card Model */ 4353941Svenki log_printf("%-8s", pci_card.model); 4363941Svenki log_printf("\n"); 4373941Svenki /* Print Status */ 4383941Svenki log_printf("%-12s", val); 4393941Svenki /* Print IO Type */ 4403941Svenki log_printf("%-6s", ""); 4413941Svenki /* Print Parent Path */ 4423941Svenki log_printf("%-46s", pci_card.notes); 4433941Svenki log_printf("\n"); 4443941Svenki 4453941Svenki err = picl_get_propval_by_name(nodeh, PICL_PROP_PEER, &nodeh, 4463941Svenki sizeof (picl_nodehdl_t)); 4473941Svenki } 4483941Svenki return (PICL_WALK_CONTINUE); 4491708Sstevel } 4501708Sstevel 4511708Sstevel /* 4521708Sstevel * display_pci 4531708Sstevel * Display all the PCI IO cards on this board. 4541708Sstevel */ 4551708Sstevel void 4561708Sstevel sun4v_display_pci(picl_nodehdl_t plafh) 4571708Sstevel { 4583941Svenki char *fmt = "%-11s %-5s %-45s %-8s"; 4593941Svenki /* Have we printed the column headings? */ 4603941Svenki static int banner = FALSE; 4613941Svenki 4623941Svenki if (banner == FALSE) { 4633941Svenki log_printf("\n"); 4643941Svenki log_printf("============================"); 4653941Svenki log_printf(" IO Devices "); 4663941Svenki log_printf("============================"); 4673941Svenki log_printf("\n"); 4683941Svenki log_printf(fmt, "Slot +", "Bus", "Name +", "Model", 0); 4693941Svenki log_printf("\n"); 4703941Svenki log_printf(fmt, "Status", "Type", "Path", "", 0); 4713941Svenki log_printf("\n"); 4723941Svenki log_printf("---------------------------------" 4733941Svenki "------------------------------------\n"); 4743941Svenki banner = TRUE; 4753941Svenki } 4763941Svenki 4773941Svenki (void) picl_walk_tree_by_class(plafh, PICL_CLASS_PCIEX, 4783941Svenki PICL_CLASS_PCIEX, sun4v_pci_callback); 4793941Svenki (void) picl_walk_tree_by_class(plafh, PICL_CLASS_PCI, 4803941Svenki PICL_CLASS_PCI, sun4v_pci_callback); 4813941Svenki (void) picl_walk_tree_by_class(plafh, PICL_CLASS_SUN4V, 4823941Svenki PICL_CLASS_SUN4V, sun4v_pci_callback); 4833941Svenki } 4843941Svenki 4853941Svenki /* 4863941Svenki * return the first compatible value 4873941Svenki */ 4883941Svenki static int 4893941Svenki sun4v_get_first_compatible_value(picl_nodehdl_t nodeh, char **outbuf) 4903941Svenki { 4913941Svenki picl_errno_t err; 4923941Svenki picl_prophdl_t proph; 4933941Svenki picl_propinfo_t pinfo; 4943941Svenki picl_prophdl_t tblh; 4953941Svenki picl_prophdl_t rowproph; 4963941Svenki char *pval; 4973941Svenki 4983941Svenki err = picl_get_propinfo_by_name(nodeh, OBP_PROP_COMPATIBLE, 4993941Svenki &pinfo, &proph); 5003941Svenki if (err != PICL_SUCCESS) 5013941Svenki return (err); 5023941Svenki 5033941Svenki if (pinfo.type == PICL_PTYPE_CHARSTRING) { 5043941Svenki pval = malloc(pinfo.size); 5053941Svenki if (pval == NULL) 5063941Svenki return (PICL_FAILURE); 5073941Svenki err = picl_get_propval(proph, pval, pinfo.size); 5083941Svenki if (err != PICL_SUCCESS) { 5093941Svenki free(pval); 5103941Svenki return (err); 5113941Svenki } 5123941Svenki *outbuf = pval; 5133941Svenki return (PICL_SUCCESS); 5143941Svenki } 5153941Svenki 5163941Svenki if (pinfo.type != PICL_PTYPE_TABLE) 5173941Svenki return (PICL_FAILURE); 5183941Svenki 5193941Svenki /* get first string from table */ 5203941Svenki err = picl_get_propval(proph, &tblh, pinfo.size); 5213941Svenki if (err != PICL_SUCCESS) 5223941Svenki return (err); 5233941Svenki 5243941Svenki err = picl_get_next_by_row(tblh, &rowproph); 5253941Svenki if (err != PICL_SUCCESS) 5263941Svenki return (err); 5273941Svenki 5283941Svenki err = picl_get_propinfo(rowproph, &pinfo); 5293941Svenki if (err != PICL_SUCCESS) 5303941Svenki return (err); 5313941Svenki 5323941Svenki pval = malloc(pinfo.size); 5333941Svenki if (pval == NULL) 5343941Svenki return (PICL_FAILURE); 5353941Svenki 5363941Svenki err = picl_get_propval(rowproph, pval, pinfo.size); 5373941Svenki if (err != PICL_SUCCESS) { 5383941Svenki free(pval); 5393941Svenki return (err); 5403941Svenki } 5413941Svenki 5423941Svenki *outbuf = pval; 5433941Svenki return (PICL_SUCCESS); 5441708Sstevel } 5451708Sstevel 5463941Svenki /* 5473941Svenki * print size of a memory segment 5483941Svenki */ 5493941Svenki static void 5503941Svenki print_memory_segment_size(uint64_t size) 5513941Svenki { 5523941Svenki uint64_t kbyte = 1024; 5533941Svenki uint64_t mbyte = kbyte * kbyte; 5543941Svenki uint64_t gbyte = kbyte * mbyte; 5553941Svenki char buf[MEMORY_SIZE_FIELD]; 5563941Svenki 5573941Svenki if (size >= gbyte) { 5583941Svenki if (size % gbyte == 0) 5593941Svenki (void) snprintf(buf, sizeof (buf), "%d GB", 5603941Svenki (int)(size / gbyte)); 5613941Svenki else 5623941Svenki (void) snprintf(buf, sizeof (buf), "%.2f GB", 5633941Svenki (float)size / gbyte); 5643941Svenki } else if (size >= mbyte) { 5653941Svenki if (size % mbyte == 0) 5663941Svenki (void) snprintf(buf, sizeof (buf), "%d MB", 5673941Svenki (int)(size / mbyte)); 5683941Svenki else 5693941Svenki (void) snprintf(buf, sizeof (buf), "%.2f MB", 5703941Svenki (float)size / mbyte); 5713941Svenki } else { 5723941Svenki if (size % kbyte == 0) 5733941Svenki (void) snprintf(buf, sizeof (buf), "%d KB", 5743941Svenki (int)(size / kbyte)); 5753941Svenki else 5763941Svenki (void) snprintf(buf, sizeof (buf), "%.2f KB", 5773941Svenki (float)size / kbyte); 5783941Svenki } 5793941Svenki log_printf("%-7s ", buf); 5803941Svenki } 5813941Svenki 5823941Svenki /* 5833941Svenki * print bank IDs of a memory segment 5843941Svenki */ 5853941Svenki static void 5863941Svenki print_memory_segment_contain(picl_nodehdl_t nodeh) 5871708Sstevel { 5883941Svenki char val[PICL_PROPNAMELEN_MAX]; 5893941Svenki picl_errno_t err = picl_get_propval_by_name(nodeh, 5903941Svenki PICL_PROP_NAC, val, sizeof (val)); 5913941Svenki if (err != PICL_SUCCESS) 5923941Svenki return; 5933941Svenki log_printf("%-30s", val); 5943941Svenki while ((err = picl_get_propval_by_name(nodeh, 5953941Svenki PICL_PROP_PEER, &nodeh, 5963941Svenki sizeof (nodeh))) == PICL_SUCCESS) { 5973941Svenki err = picl_get_propval_by_name(nodeh, 5983941Svenki PICL_PROP_NAC, val, sizeof (val)); 5993941Svenki if (err == PICL_SUCCESS) { 6003941Svenki log_printf("\n"); 6013941Svenki log_printf("%-30s", val); 6023941Svenki } 6033941Svenki } 6043941Svenki } 6053941Svenki 6063941Svenki /* 6073941Svenki * Search node where _class=="memory-segment" 6083941Svenki * print "Base Address", "Size", etc 6093941Svenki */ 6103941Svenki /*ARGSUSED*/ 6113941Svenki static int 6123941Svenki sun4v_memory_conf_callback(picl_nodehdl_t nodeh, void *args) 6133941Svenki { 6143941Svenki uint64_t base; 6153941Svenki uint64_t size; 6163941Svenki uint64_t ifactor; 6173941Svenki picl_errno_t err = PICL_SUCCESS; 6183941Svenki 6193941Svenki if (class_node_found == 0) { 6203941Svenki class_node_found = 1; 6213941Svenki return (PICL_WALK_TERMINATE); 6223941Svenki } 6233941Svenki while (err == PICL_SUCCESS) { 6243941Svenki err = picl_get_propval_by_name(nodeh, PICL_PROP_BASEADDRESS, 6253941Svenki &base, sizeof (base)); 6263941Svenki if (err != PICL_SUCCESS) 6273941Svenki break; 6283941Svenki err = picl_get_propval_by_name(nodeh, PICL_PROP_SIZE, 6293941Svenki &size, sizeof (size)); 6303941Svenki if (err != PICL_SUCCESS) 6313941Svenki break; 6323941Svenki err = picl_get_propval_by_name(nodeh, 6333941Svenki PICL_PROP_INTERLEAVE_FACTOR, &ifactor, 6343941Svenki sizeof (ifactor)); 6353941Svenki if (err != PICL_SUCCESS) 6363941Svenki break; 6373941Svenki err = picl_get_propval_by_name(nodeh, PICL_PROP_CHILD, 6383941Svenki &nodeh, sizeof (nodeh)); 6393941Svenki if (err != PICL_SUCCESS) 6403941Svenki break; 6413941Svenki log_printf("%-13llx", base); 6423941Svenki print_memory_segment_size(size); 6433941Svenki log_printf("%-18d", ifactor); 6443941Svenki print_memory_segment_contain(nodeh); 6453941Svenki log_printf("\n"); 6463941Svenki err = picl_get_propval_by_name(nodeh, PICL_PROP_PEER, &nodeh, 6473941Svenki sizeof (picl_nodehdl_t)); 6483941Svenki } 6493941Svenki 6503941Svenki return (PICL_WALK_CONTINUE); 6513941Svenki } 6523941Svenki 6533941Svenki /*ARGSUSED*/ 6543941Svenki void 6553941Svenki sun4v_display_memory_conf(picl_nodehdl_t plafh) 6563941Svenki { 6573941Svenki char *fmt = "%-12s %-7s %-9s %-20s"; 6583941Svenki (void) picl_walk_tree_by_class(plafh, PICL_CLASS_MEMORY_SEGMENT, 6593941Svenki NULL, sun4v_memory_conf_callback); 6603941Svenki if (class_node_found == 0) 6613941Svenki return; 6623941Svenki log_printf("\n"); 6633941Svenki log_printf("============================"); 6643941Svenki log_printf(" Memory Configuration "); 6653941Svenki log_printf("============================"); 6663941Svenki log_printf("\n"); 6673941Svenki log_printf("Segment Table:\n"); 6683941Svenki log_printf("-----------------------------------------------\n"); 6693941Svenki log_printf(fmt, "Base Address", "Size", "Interleave Factor", 6703941Svenki "Contains", 0); 6713941Svenki log_printf("\n"); 6723941Svenki log_printf("-----------------------------------------------\n"); 6733941Svenki (void) picl_walk_tree_by_class(plafh, PICL_CLASS_MEMORY_SEGMENT, 6743941Svenki NULL, sun4v_memory_conf_callback); 6751708Sstevel } 6761708Sstevel 6771708Sstevel void 6781708Sstevel sun4v_display_cpu_devices(picl_nodehdl_t plafh) 6791708Sstevel { 6803941Svenki char *fmt = "%-12s %-5s %-8s %-19s %-5s"; 6811708Sstevel 6821708Sstevel /* 6831708Sstevel * Display the table header for CPUs . Then display the CPU 6841708Sstevel * frequency, cache size, and processor revision of all cpus. 6851708Sstevel */ 6861708Sstevel log_printf(dgettext(TEXT_DOMAIN, 6871708Sstevel "\n" 6881708Sstevel "=========================" 6891708Sstevel " CPUs " 6901708Sstevel "===============================================" 6911708Sstevel "\n" 6921708Sstevel "\n")); 6931708Sstevel log_printf(fmt, "", "", "", "CPU", "CPU", 0); 6941708Sstevel log_printf("\n"); 6951708Sstevel log_printf(fmt, "Location", "CPU", "Freq", 6963941Svenki "Implementation", "Mask", 0); 6971708Sstevel log_printf("\n"); 6981708Sstevel log_printf(fmt, "------------", "-----", "--------", 6993941Svenki "-------------------", "-----", 0); 7001708Sstevel log_printf("\n"); 7011708Sstevel 7021708Sstevel (void) picl_walk_tree_by_class(plafh, "cpu", "cpu", sun4v_display_cpus); 7031708Sstevel } 7041708Sstevel 7051708Sstevel /* 7061708Sstevel * Display the CPUs present on this board. 7071708Sstevel */ 7081708Sstevel /*ARGSUSED*/ 7091708Sstevel int 7101708Sstevel sun4v_display_cpus(picl_nodehdl_t cpuh, void* args) 7111708Sstevel { 7121708Sstevel int status; 7133941Svenki picl_prophdl_t proph; 7143941Svenki picl_prophdl_t tblh; 7153941Svenki picl_prophdl_t rowproph; 7161708Sstevel picl_propinfo_t propinfo; 7173941Svenki int *int_value; 7183941Svenki uint64_t cpuid, mask_no; 7193941Svenki char *comp_value; 7203941Svenki char *no_prop_value = " "; 7213941Svenki char freq_str[MAXSTRLEN]; 7223941Svenki char fru_name[MAXSTRLEN]; 7231708Sstevel 7241708Sstevel /* 7251708Sstevel * Get cpuid property and print it and the NAC name 7261708Sstevel */ 7271708Sstevel status = picl_get_propinfo_by_name(cpuh, "cpuid", &propinfo, &proph); 7281708Sstevel if (status == PICL_SUCCESS) { 7291708Sstevel status = picl_get_propval(proph, &cpuid, sizeof (cpuid)); 7301708Sstevel if (status != PICL_SUCCESS) { 7313941Svenki log_printf("%-13s", no_prop_value); 7323941Svenki log_printf("%-6s", no_prop_value); 7331708Sstevel } else { 7341708Sstevel (void) snprintf(fru_name, sizeof (fru_name), "%s%d", 7351708Sstevel CPU_STRAND_NAC, (int)cpuid); 7363941Svenki log_printf("%-13s", fru_name); 7373941Svenki log_printf("%-6d", (int)cpuid); 7381708Sstevel } 7391708Sstevel } else { 7403941Svenki log_printf("%-13s", no_prop_value); 7413941Svenki log_printf("%-6s", no_prop_value); 7421708Sstevel } 7431708Sstevel 7441708Sstevel clock_freq: 7451708Sstevel status = picl_get_propinfo_by_name(cpuh, "clock-frequency", &propinfo, 7463941Svenki &proph); 7471708Sstevel if (status == PICL_SUCCESS) { 7481708Sstevel int_value = malloc(propinfo.size); 7491708Sstevel if (int_value == NULL) { 7503941Svenki log_printf("%-9s", no_prop_value); 7511708Sstevel goto compatible; 7521708Sstevel } 7531708Sstevel status = picl_get_propval(proph, int_value, propinfo.size); 7541708Sstevel if (status != PICL_SUCCESS) { 7553941Svenki log_printf("%-9s", no_prop_value); 7561708Sstevel } else { 7571708Sstevel /* Running frequency */ 7581708Sstevel (void) snprintf(freq_str, sizeof (freq_str), "%d MHz", 7591708Sstevel CLK_FREQ_TO_MHZ(*int_value)); 7603941Svenki log_printf("%-9s", freq_str); 7611708Sstevel } 7621708Sstevel free(int_value); 7631708Sstevel } else 7643941Svenki log_printf("%-9s", no_prop_value); 7651708Sstevel 7661708Sstevel compatible: 7671708Sstevel status = picl_get_propinfo_by_name(cpuh, "compatible", &propinfo, 7683941Svenki &proph); 7691708Sstevel if (status == PICL_SUCCESS) { 7701708Sstevel if (propinfo.type == PICL_PTYPE_CHARSTRING) { 7711708Sstevel /* 7721708Sstevel * Compatible Property only has 1 value 7731708Sstevel */ 7741708Sstevel comp_value = malloc(propinfo.size); 7751708Sstevel if (comp_value == NULL) { 7763941Svenki log_printf("%-20s", no_prop_value, 0); 7771708Sstevel goto mask; 7781708Sstevel } 7791708Sstevel status = picl_get_propval(proph, comp_value, 7803941Svenki propinfo.size); 7813941Svenki if (status != PICL_SUCCESS) 7823941Svenki log_printf("%-20s", no_prop_value, 0); 7833941Svenki else 7843941Svenki log_printf("%-20s", comp_value, 0); 7853941Svenki free(comp_value); 7861708Sstevel } else if (propinfo.type == PICL_PTYPE_TABLE) { 7871708Sstevel /* 7881708Sstevel * Compatible Property has multiple values 7891708Sstevel */ 7901708Sstevel status = picl_get_propval(proph, &tblh, propinfo.size); 7911708Sstevel if (status != PICL_SUCCESS) { 7923941Svenki log_printf("%-20s", no_prop_value, 0); 7931708Sstevel goto mask; 7941708Sstevel } 7951708Sstevel status = picl_get_next_by_row(tblh, &rowproph); 7961708Sstevel if (status != PICL_SUCCESS) { 7973941Svenki log_printf("%-20s", no_prop_value, 0); 7981708Sstevel goto mask; 7991708Sstevel } 8001708Sstevel 8011708Sstevel status = picl_get_propinfo(rowproph, &propinfo); 8021708Sstevel if (status != PICL_SUCCESS) { 8033941Svenki log_printf("%-20s", no_prop_value, 0); 8041708Sstevel goto mask; 8051708Sstevel } 8061708Sstevel 8071708Sstevel comp_value = malloc(propinfo.size); 8081708Sstevel if (comp_value == NULL) { 8093941Svenki log_printf("%-20s", no_prop_value, 0); 8101708Sstevel goto mask; 8111708Sstevel } 8121708Sstevel status = picl_get_propval(rowproph, comp_value, 8133941Svenki propinfo.size); 8143941Svenki if (status != PICL_SUCCESS) 8153941Svenki log_printf("%-20s", no_prop_value, 0); 8163941Svenki else 8173941Svenki log_printf("%-20s", comp_value, 0); 8181708Sstevel free(comp_value); 8191708Sstevel } 8201708Sstevel } else 8213941Svenki log_printf("%-20s", no_prop_value, 0); 8221708Sstevel 8231708Sstevel mask: 8241708Sstevel status = picl_get_propinfo_by_name(cpuh, "mask#", &propinfo, &proph); 8251708Sstevel if (status == PICL_SUCCESS) { 8261708Sstevel status = picl_get_propval(proph, &mask_no, sizeof (mask_no)); 8271708Sstevel if (status != PICL_SUCCESS) { 8283941Svenki log_printf("%-9s", no_prop_value); 8291708Sstevel } else { 8301708Sstevel log_printf(dgettext(TEXT_DOMAIN, " %2d.%d"), 8313941Svenki (mask_no>> 4) & 0xf, mask_no & 0xf); 8321708Sstevel } 8331708Sstevel } else 8343941Svenki log_printf("%-9s", no_prop_value); 8351708Sstevel 8361708Sstevel done: 8371708Sstevel log_printf("\n"); 8381708Sstevel return (PICL_WALK_CONTINUE); 8391708Sstevel } 8401708Sstevel 8411708Sstevel void 8421708Sstevel sun4v_display_diaginfo(int flag, Prom_node *root, picl_nodehdl_t plafh) 8431708Sstevel { 8441708Sstevel #ifdef lint 8451708Sstevel flag = flag; 8461708Sstevel root = root; 8471708Sstevel plafh = plafh; 8481708Sstevel #endif 8491708Sstevel /* 8501708Sstevel * This function is intentionally empty 8511708Sstevel */ 8521708Sstevel } 8531708Sstevel 8541708Sstevel void 8551708Sstevel display_boardnum(int num) 8561708Sstevel { 8571708Sstevel log_printf("%2d ", num, 0); 8581708Sstevel } 8593941Svenki 8603941Svenki static void 8613941Svenki sun4v_disp_env_status() 8623941Svenki { 8633941Svenki if (phyplatformh == 0) 8643941Svenki return; 8653941Svenki log_printf("\n"); 8663941Svenki log_printf("============================"); 8673941Svenki log_printf(" Environmental Status "); 8683941Svenki log_printf("============================"); 8693941Svenki log_printf("\n"); 8703941Svenki 8713941Svenki class_node_found = 0; 8723941Svenki all_status_ok = 1; 8733941Svenki sun4v_env_print_fan_sensors(); 8743941Svenki 8753941Svenki class_node_found = 0; 8763941Svenki all_status_ok = 1; 8773941Svenki sun4v_env_print_fan_indicators(); 8783941Svenki 8793941Svenki class_node_found = 0; 8803941Svenki all_status_ok = 1; 8813941Svenki sun4v_env_print_temp_sensors(); 8823941Svenki 8833941Svenki class_node_found = 0; 8843941Svenki all_status_ok = 1; 8853941Svenki sun4v_env_print_temp_indicators(); 8863941Svenki 8873941Svenki class_node_found = 0; 8883941Svenki all_status_ok = 1; 8893941Svenki sun4v_env_print_current_sensors(); 8903941Svenki 8913941Svenki class_node_found = 0; 8923941Svenki all_status_ok = 1; 8933941Svenki sun4v_env_print_current_indicators(); 8943941Svenki 8953941Svenki class_node_found = 0; 8963941Svenki all_status_ok = 1; 8973941Svenki sun4v_env_print_voltage_sensors(); 8983941Svenki 8993941Svenki class_node_found = 0; 9003941Svenki all_status_ok = 1; 9013941Svenki sun4v_env_print_voltage_indicators(); 9023941Svenki 9033941Svenki class_node_found = 0; 9043941Svenki sun4v_env_print_LEDs(); 9053941Svenki 9063941Svenki class_node_found = 0; 9073941Svenki all_status_ok = 1; 9083941Svenki sun4v_print_fru_status(); 9093941Svenki 9103941Svenki class_node_found = 0; 9113941Svenki sun4v_print_fw_rev(); 9123941Svenki 9133941Svenki sun4v_print_chassis_serial_no(); 9143941Svenki } 9153941Svenki 9163941Svenki /*ARGSUSED*/ 9173941Svenki static int 9183941Svenki sun4v_env_print_sensor_callback(picl_nodehdl_t nodeh, void *args) 9193941Svenki { 9203941Svenki char val[PICL_PROPNAMELEN_MAX]; 9213941Svenki picl_nodehdl_t parenth; 9223941Svenki char *names[PARENT_NAMES]; 9233941Svenki char *loc; 9243941Svenki int i; 9253941Svenki char *prop; 9263941Svenki picl_errno_t err; 9273941Svenki int32_t lo_warning, lo_shutdown; 9283941Svenki int32_t hi_warning, hi_shutdown; 9293941Svenki int32_t current_val; 9303941Svenki 9313941Svenki if (class_node_found == 0) { 9323941Svenki class_node_found = 1; 9333941Svenki return (PICL_WALK_TERMINATE); 9343941Svenki } 9353941Svenki 9363941Svenki if (syserrlog == 0) { 9373941Svenki err = picl_get_propval_by_name(nodeh, 9383941Svenki PICL_PROP_OPERATIONAL_STATUS, val, 9393941Svenki sizeof (val)); 9403941Svenki if (err == PICL_SUCCESS) { 9413941Svenki if (strcmp(val, "disabled") == 0) { 9423941Svenki if (all_status_ok) { 9433941Svenki all_status_ok = 0; 9443941Svenki return (PICL_WALK_TERMINATE); 9453941Svenki } 9463941Svenki } else 9473941Svenki return (PICL_WALK_CONTINUE); 9483941Svenki } else { 9493941Svenki all_status_ok = 0; 9503941Svenki return (PICL_WALK_TERMINATE); 9513941Svenki } 9523941Svenki } 9533941Svenki err = picl_get_propval_by_name(nodeh, PICL_PROP_PARENT, &parenth, 9543941Svenki sizeof (parenth)); 9553941Svenki if (err != PICL_SUCCESS) { 9563941Svenki log_printf("\n"); 9573941Svenki return (PICL_WALK_CONTINUE); 9583941Svenki } 959*4003Svivek 9603941Svenki if ((loc = (char *)malloc(PICL_PROPNAMELEN_MAX*PARENT_NAMES)) == NULL) 9613941Svenki return (PICL_WALK_TERMINATE); 9623941Svenki for (i = 0; i < PARENT_NAMES; i++) 9633941Svenki if ((names[i] = (char *)malloc(PICL_PROPNAMELEN_MAX)) == NULL) { 9643941Svenki while (--i > -1) 9653941Svenki free(names[i]); 9663941Svenki free(loc); 9673941Svenki return (PICL_WALK_TERMINATE); 9683941Svenki } 9693941Svenki i = 0; 9703941Svenki while (err == PICL_SUCCESS) { 9713941Svenki if (parenth == chassish || parenth == phyplatformh) 9723941Svenki break; 9733941Svenki err = picl_get_propval_by_name(parenth, PICL_PROP_NAME, 9743941Svenki names[i++], PICL_PROPNAMELEN_MAX); 9753941Svenki if (err != PICL_SUCCESS) { 9763941Svenki i--; 9773941Svenki break; 9783941Svenki } 9793941Svenki if (i == PARENT_NAMES) 9803941Svenki break; 9813941Svenki err = picl_get_propval_by_name(parenth, PICL_PROP_PARENT, 9823941Svenki &parenth, sizeof (parenth)); 9833941Svenki } 9843941Svenki loc[0] = '\0'; 985*4003Svivek if (--i > -1) { 986*4003Svivek (void) strlcat(loc, names[i], 987*4003Svivek PICL_PROPNAMELEN_MAX * PARENT_NAMES); 988*4003Svivek } 9893941Svenki while (--i > -1) { 990*4003Svivek (void) strlcat(loc, "/", PICL_PROPNAMELEN_MAX*PARENT_NAMES); 991*4003Svivek (void) strlcat(loc, names[i], 992*4003Svivek PICL_PROPNAMELEN_MAX * PARENT_NAMES); 9933941Svenki } 9943941Svenki log_printf("%-12s", loc); 9953941Svenki for (i = 0; i < PARENT_NAMES; i++) 9963941Svenki free(names[i]); 9973941Svenki free(loc); 9983941Svenki err = picl_get_propval_by_name(nodeh, PICL_PROP_LABEL, val, 9993941Svenki sizeof (val)); 10003941Svenki if (err == PICL_SUCCESS) 10013941Svenki log_printf("%-15s", val); 10023941Svenki 10033941Svenki prop = (char *)args; 10043941Svenki if (!prop) { 10053941Svenki log_printf("\n"); 10063941Svenki return (PICL_WALK_CONTINUE); 10073941Svenki } 10083941Svenki if (picl_get_propval_by_name(nodeh, prop, ¤t_val, 10093941Svenki sizeof (current_val)) != PICL_SUCCESS) { 10103941Svenki log_printf("\n"); 10113941Svenki return (PICL_WALK_CONTINUE); 10123941Svenki } 10133941Svenki if (picl_get_propval_by_name(nodeh, PICL_PROP_LOW_WARNING, 10143941Svenki &lo_warning, sizeof (lo_warning)) != PICL_SUCCESS) 10153941Svenki lo_warning = INVALID_THRESHOLD; 10163941Svenki if (picl_get_propval_by_name(nodeh, PICL_PROP_LOW_SHUTDOWN, 10173941Svenki &lo_shutdown, sizeof (lo_shutdown)) != PICL_SUCCESS) 10183941Svenki lo_shutdown = INVALID_THRESHOLD; 10193941Svenki if (picl_get_propval_by_name(nodeh, PICL_PROP_HIGH_WARNING, 10203941Svenki &hi_warning, sizeof (hi_warning)) != PICL_SUCCESS) 10213941Svenki hi_warning = INVALID_THRESHOLD; 10223941Svenki if (picl_get_propval_by_name(nodeh, PICL_PROP_HIGH_SHUTDOWN, 10233941Svenki &hi_shutdown, sizeof (hi_shutdown)) != PICL_SUCCESS) 10243941Svenki hi_shutdown = INVALID_THRESHOLD; 10253941Svenki 10263941Svenki if ((lo_shutdown != INVALID_THRESHOLD && 10273941Svenki current_val <= lo_shutdown) || 10283941Svenki (hi_shutdown != INVALID_THRESHOLD && 10293941Svenki current_val >= hi_shutdown)) { 10303941Svenki log_printf("%-s", "failed ("); 10313941Svenki log_printf("%-d", current_val); 10323941Svenki log_printf("%-s", ")"); 10333941Svenki } else if ((lo_warning != INVALID_THRESHOLD && 10343941Svenki current_val <= lo_warning) || 10353941Svenki (hi_warning != INVALID_THRESHOLD && 10363941Svenki current_val >= hi_warning)) { 10373941Svenki log_printf("%-s", "warning ("); 10383941Svenki log_printf("%-d", current_val); 10393941Svenki log_printf("%-s", ")"); 10403941Svenki } else 10413941Svenki log_printf("%-s", "ok"); 10423941Svenki 10433941Svenki log_printf("\n"); 10443941Svenki return (PICL_WALK_CONTINUE); 10453941Svenki } 10463941Svenki 10473941Svenki /*ARGSUSED*/ 10483941Svenki static int 10493941Svenki sun4v_env_print_indicator_callback(picl_nodehdl_t nodeh, void *args) 10503941Svenki { 10513941Svenki char val[PICL_PROPNAMELEN_MAX]; 10523941Svenki char status[PICL_PROPNAMELEN_MAX]; 10533941Svenki picl_nodehdl_t parenth; 10543941Svenki char *names[PARENT_NAMES]; 10553941Svenki char *loc; 10563941Svenki int i = 0; 10573941Svenki char *prop = (char *)args; 10583941Svenki picl_errno_t err = PICL_SUCCESS; 10593941Svenki 10603941Svenki if (class_node_found == 0) { 10613941Svenki class_node_found = 1; 10623941Svenki return (PICL_WALK_TERMINATE); 10633941Svenki } 10643941Svenki if (syserrlog == 0) { 10653941Svenki err = picl_get_propval_by_name(nodeh, 10663941Svenki PICL_PROP_OPERATIONAL_STATUS, status, 10673941Svenki sizeof (status)); 10683941Svenki if (err == PICL_SUCCESS) { 10693941Svenki if (strcmp(status, "disabled") == 0) { 10703941Svenki if (all_status_ok) { 10713941Svenki all_status_ok = 0; 10723941Svenki return (PICL_WALK_TERMINATE); 10733941Svenki } 10743941Svenki } else 10753941Svenki return (PICL_WALK_CONTINUE); 10763941Svenki } else { 10773941Svenki all_status_ok = 0; 10783941Svenki return (PICL_WALK_TERMINATE); 10793941Svenki } 10803941Svenki } 10813941Svenki err = picl_get_propval_by_name(nodeh, PICL_PROP_PARENT, &parenth, 10823941Svenki sizeof (parenth)); 10833941Svenki if (err != PICL_SUCCESS) { 10843941Svenki log_printf("\n"); 10853941Svenki return (PICL_WALK_CONTINUE); 10863941Svenki } 10873941Svenki if ((loc = (char *)malloc(PICL_PROPNAMELEN_MAX*PARENT_NAMES)) == NULL) 10883941Svenki return (PICL_WALK_TERMINATE); 10893941Svenki for (i = 0; i < PARENT_NAMES; i++) 10903941Svenki if ((names[i] = (char *)malloc(PICL_PROPNAMELEN_MAX)) == NULL) { 10913941Svenki while (--i > -1) 10923941Svenki free(names[i]); 10933941Svenki free(loc); 10943941Svenki return (PICL_WALK_TERMINATE); 10953941Svenki } 10963941Svenki i = 0; 10973941Svenki while (err == PICL_SUCCESS) { 10983941Svenki if (parenth == chassish || parenth == phyplatformh) 10993941Svenki break; 11003941Svenki err = picl_get_propval_by_name(parenth, PICL_PROP_NAME, 11013941Svenki names[i++], PICL_PROPNAMELEN_MAX); 11023941Svenki if (err != PICL_SUCCESS) { 11033941Svenki i--; 11043941Svenki break; 11053941Svenki } 11063941Svenki if (i == PARENT_NAMES) 11073941Svenki break; 11083941Svenki err = picl_get_propval_by_name(parenth, PICL_PROP_PARENT, 11093941Svenki &parenth, sizeof (parenth)); 11103941Svenki } 11113941Svenki loc[0] = '\0'; 1112*4003Svivek if (--i > -1) { 1113*4003Svivek (void) strlcat(loc, names[i], 1114*4003Svivek PICL_PROPNAMELEN_MAX * PARENT_NAMES); 1115*4003Svivek } 11163941Svenki while (--i > -1) { 1117*4003Svivek (void) strlcat(loc, "/", PICL_PROPNAMELEN_MAX * PARENT_NAMES); 1118*4003Svivek (void) strlcat(loc, names[i], 1119*4003Svivek PICL_PROPNAMELEN_MAX * PARENT_NAMES); 11203941Svenki } 11213941Svenki log_printf("%-12s", loc); 11223941Svenki for (i = 0; i < PARENT_NAMES; i++) 11233941Svenki free(names[i]); 11243941Svenki free(loc); 11253941Svenki err = picl_get_propval_by_name(nodeh, PICL_PROP_LABEL, val, 11263941Svenki sizeof (val)); 11273941Svenki if (err == PICL_SUCCESS) 11283941Svenki log_printf("%-15s", val); 11293941Svenki if (syserrlog == 0) { 11303941Svenki log_printf("%-8s", status); 11313941Svenki return (PICL_WALK_CONTINUE); 11323941Svenki } 11333941Svenki err = picl_get_propval_by_name(nodeh, prop, val, 11343941Svenki sizeof (val)); 11353941Svenki if (err == PICL_SUCCESS) 11363941Svenki log_printf("%-8s", val); 11373941Svenki log_printf("\n"); 11383941Svenki return (PICL_WALK_CONTINUE); 11393941Svenki } 11403941Svenki 11413941Svenki static void 11423941Svenki sun4v_env_print_fan_sensors() 11433941Svenki { 11443941Svenki char *fmt = "%-11s %-14s %-10s\n"; 11453941Svenki /* 11463941Svenki * If there isn't any fan sensor node, return now. 11473941Svenki */ 11483941Svenki (void) picl_walk_tree_by_class(phyplatformh, 11493941Svenki PICL_CLASS_RPM_SENSOR, (void *)PICL_CLASS_RPM_SENSOR, 11503941Svenki sun4v_env_print_sensor_callback); 11513941Svenki if (!class_node_found) 11523941Svenki return; 11533941Svenki log_printf("Fan sensors:\n"); 11543941Svenki if (syserrlog == 0) { 11553941Svenki (void) picl_walk_tree_by_class(phyplatformh, 11563941Svenki PICL_CLASS_RPM_SENSOR, 11573941Svenki NULL, sun4v_env_print_sensor_callback); 11583941Svenki if (all_status_ok) { 11593941Svenki log_printf("All fan sensors are OK.\n"); 11603941Svenki return; 11613941Svenki } 11623941Svenki } 11633941Svenki log_printf("---------------------------------\n"); 11643941Svenki log_printf(fmt, "Location", "Sensor", "Status", 0); 11653941Svenki log_printf("---------------------------------\n"); 11663941Svenki (void) picl_walk_tree_by_class(phyplatformh, PICL_CLASS_RPM_SENSOR, 11673941Svenki PICL_PROP_SPEED, sun4v_env_print_sensor_callback); 11683941Svenki } 11693941Svenki 11703941Svenki static void 11713941Svenki sun4v_env_print_fan_indicators() 11723941Svenki { 11733941Svenki char *fmt = "%-11s %-14s %-10s\n"; 11743941Svenki (void) picl_walk_tree_by_class(phyplatformh, 11753941Svenki PICL_CLASS_RPM_INDICATOR, (void *)PICL_CLASS_RPM_INDICATOR, 11763941Svenki sun4v_env_print_indicator_callback); 11773941Svenki if (!class_node_found) 11783941Svenki return; 11793941Svenki log_printf("\nFan indicators:\n"); 11803941Svenki if (syserrlog == 0) { 11813941Svenki (void) picl_walk_tree_by_class(phyplatformh, 11823941Svenki PICL_CLASS_RPM_INDICATOR, 11833941Svenki NULL, sun4v_env_print_indicator_callback); 11843941Svenki if (all_status_ok) { 11853941Svenki log_printf("All fan indicators are OK.\n"); 11863941Svenki return; 11873941Svenki } 11883941Svenki } 11893941Svenki log_printf("------------------------------------\n"); 11903941Svenki log_printf(fmt, "Location", "Sensor", "Condition", 0); 11913941Svenki log_printf("------------------------------------\n"); 11923941Svenki (void) picl_walk_tree_by_class(phyplatformh, PICL_CLASS_RPM_INDICATOR, 11933941Svenki PICL_CLASS_RPM_INDICATOR, sun4v_env_print_indicator_callback); 11943941Svenki } 11953941Svenki 11963941Svenki static void 11973941Svenki sun4v_env_print_temp_sensors() 11983941Svenki { 11993941Svenki char *fmt = "%-11s %-14s %-10s\n"; 12003941Svenki (void) picl_walk_tree_by_class(phyplatformh, 12013941Svenki PICL_CLASS_TEMPERATURE_SENSOR, 12023941Svenki (void *)PICL_PROP_TEMPERATURE, 12033941Svenki sun4v_env_print_sensor_callback); 12043941Svenki if (!class_node_found) 12053941Svenki return; 12063941Svenki 12073941Svenki log_printf("\nTemperature sensors:\n"); 12083941Svenki if (syserrlog == 0) { 12093941Svenki (void) picl_walk_tree_by_class(phyplatformh, 12103941Svenki PICL_CLASS_TEMPERATURE_SENSOR, 12113941Svenki NULL, sun4v_env_print_sensor_callback); 12123941Svenki if (all_status_ok) { 12133941Svenki log_printf("All temperature sensors are OK.\n"); 12143941Svenki return; 12153941Svenki } 12163941Svenki } 12173941Svenki log_printf("---------------------------------\n"); 12183941Svenki log_printf(fmt, "Location", "Sensor", "Status", 0); 12193941Svenki log_printf("---------------------------------\n"); 12203941Svenki (void) picl_walk_tree_by_class(phyplatformh, 12213941Svenki PICL_CLASS_TEMPERATURE_SENSOR, 12223941Svenki (void *)PICL_PROP_TEMPERATURE, sun4v_env_print_sensor_callback); 12233941Svenki } 12243941Svenki 12253941Svenki static void 12263941Svenki sun4v_env_print_temp_indicators() 12273941Svenki { 12283941Svenki char *fmt = "%-11s %-14s %-8s\n"; 12293941Svenki (void) picl_walk_tree_by_class(phyplatformh, 12303941Svenki PICL_CLASS_TEMPERATURE_INDICATOR, (void *)PICL_PROP_CONDITION, 12313941Svenki sun4v_env_print_indicator_callback); 12323941Svenki if (!class_node_found) 12333941Svenki return; 12343941Svenki log_printf("\nTemperature indicators:\n"); 12353941Svenki if (syserrlog == 0) { 12363941Svenki (void) picl_walk_tree_by_class(phyplatformh, 12373941Svenki PICL_CLASS_TEMPERATURE_INDICATOR, NULL, 12383941Svenki sun4v_env_print_indicator_callback); 12393941Svenki if (all_status_ok) { 12403941Svenki log_printf("All temperature indicators are OK.\n"); 12413941Svenki return; 12423941Svenki } 12433941Svenki } 12443941Svenki log_printf("------------------------------\n"); 12453941Svenki log_printf(fmt, "Location", "Indicator", "Condition", 0); 12463941Svenki log_printf("------------------------------\n"); 12473941Svenki (void) picl_walk_tree_by_class(phyplatformh, 12483941Svenki PICL_CLASS_TEMPERATURE_INDICATOR, 12493941Svenki (void *)PICL_PROP_CONDITION, 12503941Svenki sun4v_env_print_indicator_callback); 12513941Svenki } 12523941Svenki 12533941Svenki static void 12543941Svenki sun4v_env_print_current_sensors() 12553941Svenki { 12563941Svenki char *fmt = "%-11s %-14s %-10s\n"; 12573941Svenki (void) picl_walk_tree_by_class(phyplatformh, PICL_CLASS_CURRENT_SENSOR, 12583941Svenki (void *)PICL_PROP_CURRENT, sun4v_env_print_sensor_callback); 12593941Svenki if (!class_node_found) 12603941Svenki return; 12613941Svenki log_printf("\nCurrent sensors:\n"); 12623941Svenki if (syserrlog == 0) { 12633941Svenki (void) picl_walk_tree_by_class(phyplatformh, 12643941Svenki PICL_CLASS_CURRENT_SENSOR, 12653941Svenki NULL, sun4v_env_print_sensor_callback); 12663941Svenki if (all_status_ok) { 12673941Svenki log_printf("All current sensors are OK.\n"); 12683941Svenki return; 12693941Svenki } 12703941Svenki } 12713941Svenki log_printf("---------------------------------\n"); 12723941Svenki log_printf(fmt, "Location", "Sensor", "Status", 0); 12733941Svenki log_printf("---------------------------------\n"); 12743941Svenki (void) picl_walk_tree_by_class(phyplatformh, 12753941Svenki PICL_CLASS_CURRENT_SENSOR, (void *)PICL_PROP_CURRENT, 12763941Svenki sun4v_env_print_sensor_callback); 12773941Svenki } 12783941Svenki 12793941Svenki static void 12803941Svenki sun4v_env_print_current_indicators() 12813941Svenki { 12823941Svenki char *fmt = "%-11s %-14s %-8s\n"; 12833941Svenki (void) picl_walk_tree_by_class(phyplatformh, 12843941Svenki PICL_CLASS_CURRENT_INDICATOR, 12853941Svenki (void *)PICL_PROP_CONDITION, 12863941Svenki sun4v_env_print_indicator_callback); 12873941Svenki if (!class_node_found) 12883941Svenki return; 12893941Svenki log_printf("\nCurrent indicators:\n"); 12903941Svenki if (syserrlog == 0) { 12913941Svenki (void) picl_walk_tree_by_class(phyplatformh, 12923941Svenki PICL_CLASS_CURRENT_INDICATOR, NULL, 12933941Svenki sun4v_env_print_indicator_callback); 12943941Svenki if (all_status_ok) { 12953941Svenki log_printf("All current indicators are OK.\n"); 12963941Svenki return; 12973941Svenki } 12983941Svenki } 12993941Svenki log_printf("------------------------------------\n"); 13003941Svenki log_printf(fmt, "Location", "Indicator", "Condition", 0); 13013941Svenki log_printf("------------------------------------\n"); 13023941Svenki (void) picl_walk_tree_by_class(phyplatformh, 13033941Svenki PICL_CLASS_CURRENT_INDICATOR, 13043941Svenki (void *)PICL_PROP_CONDITION, 13053941Svenki sun4v_env_print_indicator_callback); 13063941Svenki } 13073941Svenki 13083941Svenki static void 13093941Svenki sun4v_env_print_voltage_sensors() 13103941Svenki { 13113941Svenki char *fmt = "%-11s %-14s %-10s\n"; 13123941Svenki (void) picl_walk_tree_by_class(phyplatformh, 13133941Svenki PICL_CLASS_VOLTAGE_SENSOR, 13143941Svenki PICL_PROP_VOLTAGE, 13153941Svenki sun4v_env_print_sensor_callback); 13163941Svenki if (!class_node_found) 13173941Svenki return; 13183941Svenki log_printf("\nVoltage sensors:\n"); 13193941Svenki if (syserrlog == 0) { 13203941Svenki (void) picl_walk_tree_by_class(phyplatformh, 13213941Svenki PICL_CLASS_VOLTAGE_SENSOR, 13223941Svenki NULL, sun4v_env_print_sensor_callback); 13233941Svenki if (all_status_ok) { 13243941Svenki log_printf("All voltage sensors are OK.\n"); 13253941Svenki return; 13263941Svenki } 13273941Svenki } 13283941Svenki log_printf("---------------------------------\n"); 13293941Svenki log_printf(fmt, "Location", "Sensor", "Status", 0); 13303941Svenki log_printf("---------------------------------\n"); 13313941Svenki (void) picl_walk_tree_by_class(phyplatformh, 13323941Svenki PICL_CLASS_VOLTAGE_SENSOR, 13333941Svenki (void *)PICL_PROP_VOLTAGE, 13343941Svenki sun4v_env_print_sensor_callback); 13353941Svenki } 13363941Svenki 13373941Svenki static void 13383941Svenki sun4v_env_print_voltage_indicators() 13393941Svenki { 13403941Svenki char *fmt = "%-11s %-14s %-8s\n"; 13413941Svenki (void) picl_walk_tree_by_class(phyplatformh, 13423941Svenki PICL_CLASS_VOLTAGE_INDICATOR, 13433941Svenki (void *)PICL_PROP_CONDITION, 13443941Svenki sun4v_env_print_indicator_callback); 13453941Svenki if (!class_node_found) 13463941Svenki return; 13473941Svenki log_printf("\nVoltage indicators:\n"); 13483941Svenki if (syserrlog == 0) { 13493941Svenki (void) picl_walk_tree_by_class(phyplatformh, 13503941Svenki PICL_CLASS_VOLTAGE_INDICATOR, NULL, 13513941Svenki sun4v_env_print_indicator_callback); 13523941Svenki if (all_status_ok) { 13533941Svenki log_printf("All voltage indicators are OK.\n"); 13543941Svenki return; 13553941Svenki } 13563941Svenki } 13573941Svenki log_printf("------------------------------------\n"); 13583941Svenki log_printf(fmt, "Location", "Indicator", "Condition", 0); 13593941Svenki log_printf("------------------------------------\n"); 13603941Svenki (void) picl_walk_tree_by_class(phyplatformh, 13613941Svenki PICL_CLASS_VOLTAGE_INDICATOR, 13623941Svenki (void *)PICL_PROP_CONDITION, 13633941Svenki sun4v_env_print_indicator_callback); 13643941Svenki } 13653941Svenki 13663941Svenki static void 13673941Svenki sun4v_env_print_LEDs() 13683941Svenki { 13693941Svenki char *fmt = "%-11s %-14s %-8s\n"; 13703941Svenki if (syserrlog == 0) 13713941Svenki return; 13723941Svenki (void) picl_walk_tree_by_class(phyplatformh, PICL_CLASS_LED, 13733941Svenki (void *)PICL_PROP_STATE, sun4v_env_print_indicator_callback); 13743941Svenki if (!class_node_found) 13753941Svenki return; 13763941Svenki log_printf("\nLEDs:\n"); 13773941Svenki log_printf("--------------------------------\n"); 13783941Svenki log_printf(fmt, "Location", "LED", "State", 0); 13793941Svenki log_printf("--------------------------------\n"); 13803941Svenki (void) picl_walk_tree_by_class(phyplatformh, PICL_CLASS_LED, 13813941Svenki (void *)PICL_PROP_STATE, sun4v_env_print_indicator_callback); 13823941Svenki } 13833941Svenki 13843941Svenki /*ARGSUSED*/ 13853941Svenki static int 13863941Svenki sun4v_print_fru_status_callback(picl_nodehdl_t nodeh, void *args) 13873941Svenki { 13883941Svenki char label[PICL_PROPNAMELEN_MAX]; 13893941Svenki char status[PICL_PROPNAMELEN_MAX]; 13903941Svenki picl_errno_t err; 13913941Svenki picl_prophdl_t proph; 13923941Svenki picl_nodehdl_t parenth; 13933941Svenki char *names[PARENT_NAMES]; 13943941Svenki char *loc; 13953941Svenki int i; 13963941Svenki 13973941Svenki if (!class_node_found) { 13983941Svenki class_node_found = 1; 13993941Svenki return (PICL_WALK_TERMINATE); 14003941Svenki } 14013941Svenki err = picl_get_prop_by_name(nodeh, PICL_PROP_IS_FRU, &proph); 14023941Svenki if (err != PICL_SUCCESS) 14033941Svenki return (PICL_WALK_CONTINUE); 14043941Svenki err = picl_get_propval_by_name(nodeh, PICL_PROP_LABEL, label, 14053941Svenki sizeof (label)); 14063941Svenki if (err != PICL_SUCCESS) 14073941Svenki return (PICL_WALK_CONTINUE); 14083941Svenki err = picl_get_propval_by_name(nodeh, PICL_PROP_OPERATIONAL_STATUS, 14093941Svenki status, sizeof (status)); 14103941Svenki if (err != PICL_SUCCESS) 14113941Svenki return (PICL_WALK_CONTINUE); 14123941Svenki if (syserrlog == 0) { 14133941Svenki if (strcmp(status, "disabled") == 0) { 14143941Svenki if (all_status_ok) { 14153941Svenki all_status_ok = 0; 14163941Svenki return (PICL_WALK_TERMINATE); 14173941Svenki } 14183941Svenki } else 14193941Svenki return (PICL_WALK_CONTINUE); 14203941Svenki } 14213941Svenki err = picl_get_propval_by_name(nodeh, PICL_PROP_PARENT, &parenth, 14223941Svenki sizeof (parenth)); 14233941Svenki if (err != PICL_SUCCESS) { 14243941Svenki log_printf("\n"); 14253941Svenki return (PICL_WALK_CONTINUE); 14263941Svenki } 14273941Svenki if ((loc = (char *)malloc(PICL_PROPNAMELEN_MAX*PARENT_NAMES)) == NULL) 14283941Svenki return (PICL_WALK_TERMINATE); 14293941Svenki for (i = 0; i < PARENT_NAMES; i++) 14303941Svenki if ((names[i] = (char *)malloc(PICL_PROPNAMELEN_MAX)) == NULL) { 14313941Svenki while (--i > -1) 14323941Svenki free(names[i]); 14333941Svenki free(loc); 14343941Svenki return (PICL_WALK_TERMINATE); 14353941Svenki } 14363941Svenki i = 0; 14373941Svenki while (err == PICL_SUCCESS) { 14383941Svenki if (parenth == chassish || parenth == phyplatformh) 14393941Svenki break; 14403941Svenki err = picl_get_propval_by_name(parenth, PICL_PROP_NAME, 14413941Svenki names[i++], PICL_PROPNAMELEN_MAX); 14423941Svenki if (err != PICL_SUCCESS) { 14433941Svenki i--; 14443941Svenki break; 14453941Svenki } 14463941Svenki if (i == PARENT_NAMES) 14473941Svenki break; 14483941Svenki err = picl_get_propval_by_name(parenth, PICL_PROP_PARENT, 14493941Svenki &parenth, sizeof (parenth)); 14503941Svenki } 14513941Svenki loc[0] = '\0'; 1452*4003Svivek if (--i > -1) { 1453*4003Svivek (void) strlcat(loc, names[i], 1454*4003Svivek PICL_PROPNAMELEN_MAX * PARENT_NAMES); 1455*4003Svivek } 14563941Svenki while (--i > -1) { 1457*4003Svivek (void) strlcat(loc, "/", PICL_PROPNAMELEN_MAX * PARENT_NAMES); 1458*4003Svivek (void) strlcat(loc, names[i], 1459*4003Svivek PICL_PROPNAMELEN_MAX * PARENT_NAMES); 14603941Svenki } 14613941Svenki log_printf("%-21s", loc); 14623941Svenki for (i = 0; i < PARENT_NAMES; i++) 14633941Svenki free(names[i]); 14643941Svenki free(loc); 14653941Svenki log_printf("%-10s", label); 14663941Svenki log_printf("%-9s", status); 14673941Svenki log_printf("\n"); 14683941Svenki return (PICL_WALK_CONTINUE); 14693941Svenki } 14703941Svenki 14713941Svenki static void 14723941Svenki sun4v_print_fru_status() 14733941Svenki { 14743941Svenki char *fmt = "%-20s %-9s %-8s\n"; 14753941Svenki (void) picl_walk_tree_by_class(phyplatformh, NULL, NULL, 14763941Svenki sun4v_print_fru_status_callback); 14773941Svenki if (!class_node_found) 14783941Svenki return; 14793941Svenki log_printf("\n"); 14803941Svenki log_printf("============================"); 14813941Svenki log_printf(" FRU Status "); 14823941Svenki log_printf("============================"); 14833941Svenki log_printf("\n"); 14843941Svenki 14853941Svenki if (syserrlog == 0) { 14863941Svenki (void) picl_walk_tree_by_class(phyplatformh, 14873941Svenki PICL_CLASS_MODULE, NULL, 14883941Svenki sun4v_print_fru_status_callback); 14893941Svenki if (all_status_ok) { 14903941Svenki log_printf("All FRUs are enabled.\n"); 14913941Svenki return; 14923941Svenki } 14933941Svenki } 14943941Svenki log_printf(fmt, "Location", "Name", "Status", 0); 14953941Svenki log_printf("-------------------------------------\n"); 14963941Svenki (void) picl_walk_tree_by_class(phyplatformh, PICL_CLASS_MODULE, NULL, 14973941Svenki sun4v_print_fru_status_callback); 14983941Svenki } 14993941Svenki 15003941Svenki /*ARGSUSED*/ 15013941Svenki static int 15023941Svenki sun4v_print_fw_rev_callback(picl_nodehdl_t nodeh, void *args) 15033941Svenki { 15043941Svenki char label[PICL_PROPNAMELEN_MAX]; 15053941Svenki char rev[PICL_PROPNAMELEN_MAX]; 15063941Svenki picl_errno_t err; 15073941Svenki 15083941Svenki if (!class_node_found) { 15093941Svenki class_node_found = 1; 15103941Svenki return (PICL_WALK_TERMINATE); 15113941Svenki } 15123941Svenki err = picl_get_propval_by_name(nodeh, PICL_PROP_LABEL, label, 15133941Svenki sizeof (label)); 15143941Svenki if (err != PICL_SUCCESS) 15153941Svenki return (PICL_WALK_CONTINUE); 15163941Svenki err = picl_get_propval_by_name(nodeh, PICL_PROP_FW_REVISION, rev, 15173941Svenki sizeof (rev)); 15183941Svenki if (err != PICL_SUCCESS) 15193941Svenki return (PICL_WALK_CONTINUE); 15203941Svenki if (strlen(rev) == 0) 15213941Svenki return (PICL_WALK_CONTINUE); 15223941Svenki log_printf("%-21s", label); 15233941Svenki log_printf("%-40s", rev); 15243941Svenki log_printf("\n"); 15253941Svenki return (PICL_WALK_CONTINUE); 15263941Svenki } 15273941Svenki 15283941Svenki static void 15293941Svenki sun4v_print_fw_rev() 15303941Svenki { 15313941Svenki char *fmt = "%-20s %-10s\n"; 15323941Svenki if (syserrlog == 0) 15333941Svenki return; 15343941Svenki (void) picl_walk_tree_by_class(phyplatformh, NULL, NULL, 15353941Svenki sun4v_print_fw_rev_callback); 15363941Svenki if (!class_node_found) 15373941Svenki return; 15383941Svenki log_printf("\n"); 15393941Svenki log_printf("============================"); 15403941Svenki log_printf(" FW Version "); 15413941Svenki log_printf("============================"); 15423941Svenki log_printf("\n"); 15433941Svenki log_printf(fmt, "Name", "Version", 0); 15443941Svenki log_printf("----------------------------\n"); 15453941Svenki (void) picl_walk_tree_by_class(phyplatformh, NULL, NULL, 15463941Svenki sun4v_print_fw_rev_callback); 15473941Svenki } 15483941Svenki 15493941Svenki static void 15503941Svenki sun4v_print_chassis_serial_no() 15513941Svenki { 15523941Svenki char val[PICL_PROPNAMELEN_MAX]; 15533941Svenki picl_errno_t err; 15543941Svenki if (syserrlog == 0 || chassish == 0) 15553941Svenki return; 15563941Svenki 15573941Svenki log_printf("\n"); 15583941Svenki log_printf("Chassis Serial Number"); 15593941Svenki log_printf("\n"); 15603941Svenki log_printf("---------------------\n"); 15613941Svenki err = picl_get_propval_by_name(chassish, PICL_PROP_SERIAL_NUMBER, 15623941Svenki val, sizeof (val)); 15633941Svenki if (err == PICL_SUCCESS) 15643941Svenki log_printf("%s", val); 15653941Svenki log_printf("\n"); 15663941Svenki } 1567