03831d35f7499c87d51205817c93e9a8d42c4baestevel/*
03831d35f7499c87d51205817c93e9a8d42c4baestevel * CDDL HEADER START
03831d35f7499c87d51205817c93e9a8d42c4baestevel *
03831d35f7499c87d51205817c93e9a8d42c4baestevel * The contents of this file are subject to the terms of the
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki * Common Development and Distribution License (the "License").
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki * You may not use this file except in compliance with the License.
03831d35f7499c87d51205817c93e9a8d42c4baestevel *
03831d35f7499c87d51205817c93e9a8d42c4baestevel * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
03831d35f7499c87d51205817c93e9a8d42c4baestevel * or http://www.opensolaris.org/os/licensing.
03831d35f7499c87d51205817c93e9a8d42c4baestevel * See the License for the specific language governing permissions
03831d35f7499c87d51205817c93e9a8d42c4baestevel * and limitations under the License.
03831d35f7499c87d51205817c93e9a8d42c4baestevel *
03831d35f7499c87d51205817c93e9a8d42c4baestevel * When distributing Covered Code, include this CDDL HEADER in each
03831d35f7499c87d51205817c93e9a8d42c4baestevel * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
03831d35f7499c87d51205817c93e9a8d42c4baestevel * If applicable, add the following below this CDDL HEADER, with the
03831d35f7499c87d51205817c93e9a8d42c4baestevel * fields enclosed by brackets "[]" replaced with your own identifying
03831d35f7499c87d51205817c93e9a8d42c4baestevel * information: Portions Copyright [yyyy] [name of copyright owner]
03831d35f7499c87d51205817c93e9a8d42c4baestevel *
03831d35f7499c87d51205817c93e9a8d42c4baestevel * CDDL HEADER END
03831d35f7499c87d51205817c93e9a8d42c4baestevel */
03831d35f7499c87d51205817c93e9a8d42c4baestevel/*
7ae8c7a895927e389aea157a7b04d5eb606319fbMichael Bergknoff * Copyright (c) 2005, 2010, Oracle and/or its affiliates. All rights reserved.
03831d35f7499c87d51205817c93e9a8d42c4baestevel */
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel#include <stdio.h>
03831d35f7499c87d51205817c93e9a8d42c4baestevel#include <stdlib.h>
dc6ca969834c6d8d1aac19aaea19d86c5b73cf75fw#include <alloca.h>
03831d35f7499c87d51205817c93e9a8d42c4baestevel#include <unistd.h>
03831d35f7499c87d51205817c93e9a8d42c4baestevel#include <ctype.h>
03831d35f7499c87d51205817c93e9a8d42c4baestevel#include <string.h>
03831d35f7499c87d51205817c93e9a8d42c4baestevel#include <kvm.h>
03831d35f7499c87d51205817c93e9a8d42c4baestevel#include <varargs.h>
03831d35f7499c87d51205817c93e9a8d42c4baestevel#include <time.h>
03831d35f7499c87d51205817c93e9a8d42c4baestevel#include <dirent.h>
03831d35f7499c87d51205817c93e9a8d42c4baestevel#include <fcntl.h>
03831d35f7499c87d51205817c93e9a8d42c4baestevel#include <sys/param.h>
03831d35f7499c87d51205817c93e9a8d42c4baestevel#include <sys/stat.h>
03831d35f7499c87d51205817c93e9a8d42c4baestevel#include <sys/types.h>
03831d35f7499c87d51205817c93e9a8d42c4baestevel#include <sys/utsname.h>
03831d35f7499c87d51205817c93e9a8d42c4baestevel#include <sys/openpromio.h>
03831d35f7499c87d51205817c93e9a8d42c4baestevel#include <libintl.h>
03831d35f7499c87d51205817c93e9a8d42c4baestevel#include <syslog.h>
03831d35f7499c87d51205817c93e9a8d42c4baestevel#include <sys/dkio.h>
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki#include <sys/systeminfo.h>
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki#include <picldefs.h>
aaba19e23c48a32e927f4e39464be188bfcbef37fw#include <math.h>
aaba19e23c48a32e927f4e39464be188bfcbef37fw#include <errno.h>
03831d35f7499c87d51205817c93e9a8d42c4baestevel#include "pdevinfo.h"
03831d35f7499c87d51205817c93e9a8d42c4baestevel#include "display.h"
03831d35f7499c87d51205817c93e9a8d42c4baestevel#include "display_sun4v.h"
03831d35f7499c87d51205817c93e9a8d42c4baestevel#include "libprtdiag.h"
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel#if !defined(TEXT_DOMAIN)
03831d35f7499c87d51205817c93e9a8d42c4baestevel#define TEXT_DOMAIN "SYS_TEST"
03831d35f7499c87d51205817c93e9a8d42c4baestevel#endif
03831d35f7499c87d51205817c93e9a8d42c4baestevel
a90d965d832a5578dbfc2eadd1617e8cccf25264fw#define MOTHERBOARD "MB"
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki#define NETWORK "network"
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki#define SUN4V_MACHINE "sun4v"
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki#define PARENT_NAMES 10
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki/*
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki * Additional OBP properties
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki */
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki#define OBP_PROP_COMPATIBLE "compatible"
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki#define OBP_PROP_MODEL "model"
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki#define OBP_PROP_SLOT_NAMES "slot-names"
dc6ca969834c6d8d1aac19aaea19d86c5b73cf75fw#define OBP_PROP_VERSION "version"
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki#define PICL_NODE_PHYSICAL_PLATFORM "physical-platform"
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki#define PICL_NODE_CHASSIS "chassis"
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki#define MEMORY_SIZE_FIELD 11
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki#define INVALID_THRESHOLD 1000000
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki/*
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki * Additional picl classes
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki */
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki#ifndef PICL_CLASS_SUN4V
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki#define PICL_CLASS_SUN4V "sun4v"
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki#endif
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki#ifndef PICL_PROP_NAC
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki#define PICL_PROP_NAC "nac"
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki#endif
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenkiextern int sys_clk;
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenkiextern picl_errno_t sun4v_get_node_by_name(picl_nodehdl_t, char *,
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki picl_nodehdl_t *);
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenkistatic picl_nodehdl_t rooth = 0, phyplatformh = 0;
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenkistatic picl_nodehdl_t chassish = 0;
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenkistatic int class_node_found;
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenkistatic int syserrlog;
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenkistatic int all_status_ok;
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki/* local functions */
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenkistatic int sun4v_get_first_compatible_value(picl_nodehdl_t, char **);
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenkistatic void sun4v_display_memory_conf(picl_nodehdl_t);
d776656fd760148680dc0108975562197d8dfd37mbstatic int sun4v_disp_env_status();
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenkistatic void sun4v_env_print_fan_sensors();
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenkistatic void sun4v_env_print_fan_indicators();
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenkistatic void sun4v_env_print_temp_sensors();
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenkistatic void sun4v_env_print_temp_indicators();
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenkistatic void sun4v_env_print_current_sensors();
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenkistatic void sun4v_env_print_current_indicators();
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenkistatic void sun4v_env_print_voltage_sensors();
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenkistatic void sun4v_env_print_voltage_indicators();
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenkistatic void sun4v_env_print_LEDs();
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenkistatic void sun4v_print_fru_status();
8a31bd2bff65663c09a6a81f51725b27e206f136Birva Shahstatic int is_fru_absent(picl_nodehdl_t);
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenkistatic void sun4v_print_fw_rev();
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenkistatic void sun4v_print_chassis_serial_no();
dc6ca969834c6d8d1aac19aaea19d86c5b73cf75fwstatic int openprom_callback(picl_nodehdl_t openpromh, void *arg);
dc6ca969834c6d8d1aac19aaea19d86c5b73cf75fwstatic void sun4v_print_openprom_rev();
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevelint
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenkisun4v_display(Sys_tree *tree, Prom_node *root, int log,
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki picl_nodehdl_t plafh)
03831d35f7499c87d51205817c93e9a8d42c4baestevel{
03831d35f7499c87d51205817c93e9a8d42c4baestevel void *value; /* used for opaque PROM data */
03831d35f7499c87d51205817c93e9a8d42c4baestevel struct mem_total memory_total; /* Total memory in system */
03831d35f7499c87d51205817c93e9a8d42c4baestevel struct grp_info grps; /* Info on all groups in system */
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki char machine[MAXSTRLEN];
d776656fd760148680dc0108975562197d8dfd37mb int exit_code = 0;
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki if (sysinfo(SI_MACHINE, machine, sizeof (machine)) == -1)
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki return (1);
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki if (strncmp(machine, SUN4V_MACHINE, strlen(SUN4V_MACHINE)) != 0)
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki return (1);
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel sys_clk = -1; /* System clock freq. (in MHz) */
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel /*
03831d35f7499c87d51205817c93e9a8d42c4baestevel * Now display the machine's configuration. We do this if we
03831d35f7499c87d51205817c93e9a8d42c4baestevel * are not logging.
03831d35f7499c87d51205817c93e9a8d42c4baestevel */
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (!logging) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel struct utsname uts_buf;
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel /*
03831d35f7499c87d51205817c93e9a8d42c4baestevel * Display system banner
03831d35f7499c87d51205817c93e9a8d42c4baestevel */
03831d35f7499c87d51205817c93e9a8d42c4baestevel (void) uname(&uts_buf);
03831d35f7499c87d51205817c93e9a8d42c4baestevel
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki log_printf(dgettext(TEXT_DOMAIN, "System Configuration: "
2983dda76a6d296fdb560c88114fe41caad1b84fMichael Bergknoff "Oracle Corporation %s %s\n"), uts_buf.machine,
a90d965d832a5578dbfc2eadd1617e8cccf25264fw get_prop_val(find_prop(root, "banner-name")), 0);
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel /* display system clock frequency */
03831d35f7499c87d51205817c93e9a8d42c4baestevel value = get_prop_val(find_prop(root, "clock-frequency"));
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (value != NULL) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel sys_clk = ((*((int *)value)) + 500000) / 1000000;
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf(dgettext(TEXT_DOMAIN, "System clock "
a90d965d832a5578dbfc2eadd1617e8cccf25264fw "frequency: %d MHz\n"), sys_clk, 0);
03831d35f7499c87d51205817c93e9a8d42c4baestevel }
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel /* Display the Memory Size */
03831d35f7499c87d51205817c93e9a8d42c4baestevel display_memorysize(tree, NULL, &grps, &memory_total);
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel /* Display the CPU devices */
03831d35f7499c87d51205817c93e9a8d42c4baestevel sun4v_display_cpu_devices(plafh);
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel /* Display the Memory configuration */
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki class_node_found = 0;
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki sun4v_display_memory_conf(plafh);
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel /* Display all the IO cards. */
03831d35f7499c87d51205817c93e9a8d42c4baestevel (void) sun4v_display_pci(plafh);
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki sun4v_display_diaginfo((log || (logging)), root, plafh);
03831d35f7499c87d51205817c93e9a8d42c4baestevel
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki if (picl_get_root(&rooth) != PICL_SUCCESS)
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki return (1);
d776656fd760148680dc0108975562197d8dfd37mb
d776656fd760148680dc0108975562197d8dfd37mb /*
d776656fd760148680dc0108975562197d8dfd37mb * The physical-platform node may be missing on systems with
d776656fd760148680dc0108975562197d8dfd37mb * older firmware so don't consider that an error.
d776656fd760148680dc0108975562197d8dfd37mb */
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki if (sun4v_get_node_by_name(rooth, PICL_NODE_PHYSICAL_PLATFORM,
a90d965d832a5578dbfc2eadd1617e8cccf25264fw &phyplatformh) != PICL_SUCCESS)
d776656fd760148680dc0108975562197d8dfd37mb return (0);
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki if (picl_find_node(phyplatformh, PICL_PROP_CLASSNAME,
a90d965d832a5578dbfc2eadd1617e8cccf25264fw PICL_PTYPE_CHARSTRING, (void *)PICL_CLASS_CHASSIS,
a90d965d832a5578dbfc2eadd1617e8cccf25264fw strlen(PICL_CLASS_CHASSIS), &chassish) != PICL_SUCCESS)
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki return (1);
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki syserrlog = log;
d776656fd760148680dc0108975562197d8dfd37mb exit_code = sun4v_disp_env_status();
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki }
d776656fd760148680dc0108975562197d8dfd37mb return (exit_code);
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki}
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki
db8f0877c245a884664489a7d8d1e4d8a34a8432fw/*
db8f0877c245a884664489a7d8d1e4d8a34a8432fw * The binding-name property encodes the bus type.
db8f0877c245a884664489a7d8d1e4d8a34a8432fw */
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenkistatic void
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenkiget_bus_type(picl_nodehdl_t nodeh, struct io_card *card)
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki{
db8f0877c245a884664489a7d8d1e4d8a34a8432fw char val[PICL_PROPNAMELEN_MAX], *p, *q;
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki
db8f0877c245a884664489a7d8d1e4d8a34a8432fw card->bus_type[0] = '\0';
db8f0877c245a884664489a7d8d1e4d8a34a8432fw
db8f0877c245a884664489a7d8d1e4d8a34a8432fw if (picl_get_propval_by_name(nodeh, PICL_PROP_BINDING_NAME, val,
db8f0877c245a884664489a7d8d1e4d8a34a8432fw sizeof (val)) == PICL_SUCCESS) {
db8f0877c245a884664489a7d8d1e4d8a34a8432fw if (strstr(val, PICL_CLASS_PCIEX))
4c5e0fde93352f23abc94e445999402e38b91268vivek (void) strlcpy(card->bus_type, "PCIE",
a90d965d832a5578dbfc2eadd1617e8cccf25264fw sizeof (card->bus_type));
db8f0877c245a884664489a7d8d1e4d8a34a8432fw else if (strstr(val, PICL_CLASS_PCI))
db8f0877c245a884664489a7d8d1e4d8a34a8432fw (void) strlcpy(card->bus_type, "PCIX",
db8f0877c245a884664489a7d8d1e4d8a34a8432fw sizeof (card->bus_type));
db8f0877c245a884664489a7d8d1e4d8a34a8432fw else {
db8f0877c245a884664489a7d8d1e4d8a34a8432fw /*
db8f0877c245a884664489a7d8d1e4d8a34a8432fw * Not perfect: process the binding-name until
db8f0877c245a884664489a7d8d1e4d8a34a8432fw * we encounter something that we don't think would
db8f0877c245a884664489a7d8d1e4d8a34a8432fw * be part of a bus type. This may get confused a bit
db8f0877c245a884664489a7d8d1e4d8a34a8432fw * if a device or vendor id is encoded right after
db8f0877c245a884664489a7d8d1e4d8a34a8432fw * the bus class since there's no delimiter. If the
db8f0877c245a884664489a7d8d1e4d8a34a8432fw * id number begins with a hex digit [abcdef] then
db8f0877c245a884664489a7d8d1e4d8a34a8432fw * this will become part of the bus type string
db8f0877c245a884664489a7d8d1e4d8a34a8432fw * reported by prtdiag. This is all an effort to
db8f0877c245a884664489a7d8d1e4d8a34a8432fw * print something potentially useful for bus types
db8f0877c245a884664489a7d8d1e4d8a34a8432fw * other than PCI/PCIe.
db8f0877c245a884664489a7d8d1e4d8a34a8432fw *
db8f0877c245a884664489a7d8d1e4d8a34a8432fw * We do this because this code will get called for
db8f0877c245a884664489a7d8d1e4d8a34a8432fw * non-PCI class devices like the xaui (class sun4v.)
db8f0877c245a884664489a7d8d1e4d8a34a8432fw */
db8f0877c245a884664489a7d8d1e4d8a34a8432fw if (strstr(val, "SUNW,") != NULL)
db8f0877c245a884664489a7d8d1e4d8a34a8432fw p = strchr(val, ',') + 1;
db8f0877c245a884664489a7d8d1e4d8a34a8432fw else
db8f0877c245a884664489a7d8d1e4d8a34a8432fw p = val;
db8f0877c245a884664489a7d8d1e4d8a34a8432fw q = p;
db8f0877c245a884664489a7d8d1e4d8a34a8432fw while (*p != '\0') {
db8f0877c245a884664489a7d8d1e4d8a34a8432fw if (isdigit((char)*p) || ispunct((char)*p)) {
db8f0877c245a884664489a7d8d1e4d8a34a8432fw *p = '\0';
db8f0877c245a884664489a7d8d1e4d8a34a8432fw break;
db8f0877c245a884664489a7d8d1e4d8a34a8432fw }
db8f0877c245a884664489a7d8d1e4d8a34a8432fw *p = (char)_toupper((int)*p);
db8f0877c245a884664489a7d8d1e4d8a34a8432fw ++p;
db8f0877c245a884664489a7d8d1e4d8a34a8432fw }
db8f0877c245a884664489a7d8d1e4d8a34a8432fw (void) strlcpy(card->bus_type, q,
db8f0877c245a884664489a7d8d1e4d8a34a8432fw sizeof (card->bus_type));
db8f0877c245a884664489a7d8d1e4d8a34a8432fw }
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki }
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki}
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki
db8f0877c245a884664489a7d8d1e4d8a34a8432fw/*
db8f0877c245a884664489a7d8d1e4d8a34a8432fw * Fetch the Label property for this device. If none is found then
db8f0877c245a884664489a7d8d1e4d8a34a8432fw * search all the siblings with the same device ID for a
db8f0877c245a884664489a7d8d1e4d8a34a8432fw * Label and return that Label. The plug-in can only match the canonical
db8f0877c245a884664489a7d8d1e4d8a34a8432fw * path from the PRI with a specific devfs path. So we take care of
db8f0877c245a884664489a7d8d1e4d8a34a8432fw * devices with multiple functions here. A leaf device downstream of
db8f0877c245a884664489a7d8d1e4d8a34a8432fw * a bridge should fall out of here with PICL_PROPNOTFOUND, and the
db8f0877c245a884664489a7d8d1e4d8a34a8432fw * caller can walk back up the tree in search of the slot's Label.
db8f0877c245a884664489a7d8d1e4d8a34a8432fw */
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenkistatic picl_errno_t
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenkiget_slot_label(picl_nodehdl_t nodeh, struct io_card *card)
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki{
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki char val[PICL_PROPNAMELEN_MAX];
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki picl_errno_t err;
dc6ca969834c6d8d1aac19aaea19d86c5b73cf75fw picl_nodehdl_t pnodeh;
db8f0877c245a884664489a7d8d1e4d8a34a8432fw uint32_t devid, sib_devid;
db8f0877c245a884664489a7d8d1e4d8a34a8432fw int32_t instance;
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki
dc6ca969834c6d8d1aac19aaea19d86c5b73cf75fw /*
db8f0877c245a884664489a7d8d1e4d8a34a8432fw * If there's a Label at this node then return it - we're
db8f0877c245a884664489a7d8d1e4d8a34a8432fw * done.
dc6ca969834c6d8d1aac19aaea19d86c5b73cf75fw */
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki err = picl_get_propval_by_name(nodeh, PICL_PROP_LABEL, val,
a90d965d832a5578dbfc2eadd1617e8cccf25264fw sizeof (val));
db8f0877c245a884664489a7d8d1e4d8a34a8432fw if (err == PICL_SUCCESS) {
dc6ca969834c6d8d1aac19aaea19d86c5b73cf75fw (void) strlcpy(card->slot_str, val, sizeof (card->slot_str));
db8f0877c245a884664489a7d8d1e4d8a34a8432fw return (err);
db8f0877c245a884664489a7d8d1e4d8a34a8432fw } else if (err != PICL_PROPNOTFOUND)
db8f0877c245a884664489a7d8d1e4d8a34a8432fw return (err);
db8f0877c245a884664489a7d8d1e4d8a34a8432fw
db8f0877c245a884664489a7d8d1e4d8a34a8432fw /*
db8f0877c245a884664489a7d8d1e4d8a34a8432fw * At this point we're starting to extrapolate what the Label
db8f0877c245a884664489a7d8d1e4d8a34a8432fw * should be since there is none at this specific node.
db8f0877c245a884664489a7d8d1e4d8a34a8432fw * Note that until the value of "err" is overwritten in the
db8f0877c245a884664489a7d8d1e4d8a34a8432fw * loop below, its value should be PICL_PROPNOTFOUND.
db8f0877c245a884664489a7d8d1e4d8a34a8432fw */
db8f0877c245a884664489a7d8d1e4d8a34a8432fw
db8f0877c245a884664489a7d8d1e4d8a34a8432fw /*
db8f0877c245a884664489a7d8d1e4d8a34a8432fw * The device must be attached, and we can figure that out if
db8f0877c245a884664489a7d8d1e4d8a34a8432fw * the instance number is present and is not equal to -1.
db8f0877c245a884664489a7d8d1e4d8a34a8432fw * This will prevent is from returning a Label for a sibling
db8f0877c245a884664489a7d8d1e4d8a34a8432fw * node when the node passed in would have a unique Label if the
db8f0877c245a884664489a7d8d1e4d8a34a8432fw * device were attached. But if the device is downstream of a
db8f0877c245a884664489a7d8d1e4d8a34a8432fw * node with a Label then pci_callback() will still find that
db8f0877c245a884664489a7d8d1e4d8a34a8432fw * and use it.
db8f0877c245a884664489a7d8d1e4d8a34a8432fw */
db8f0877c245a884664489a7d8d1e4d8a34a8432fw if (picl_get_propval_by_name(nodeh, PICL_PROP_INSTANCE, &instance,
db8f0877c245a884664489a7d8d1e4d8a34a8432fw sizeof (instance)) != PICL_SUCCESS)
db8f0877c245a884664489a7d8d1e4d8a34a8432fw return (err);
db8f0877c245a884664489a7d8d1e4d8a34a8432fw if (instance == -1)
db8f0877c245a884664489a7d8d1e4d8a34a8432fw return (err);
db8f0877c245a884664489a7d8d1e4d8a34a8432fw
db8f0877c245a884664489a7d8d1e4d8a34a8432fw /*
db8f0877c245a884664489a7d8d1e4d8a34a8432fw * Narrow the search to just the one device ID.
db8f0877c245a884664489a7d8d1e4d8a34a8432fw */
db8f0877c245a884664489a7d8d1e4d8a34a8432fw if (picl_get_propval_by_name(nodeh, PICL_PROP_DEVICE_ID, &devid,
db8f0877c245a884664489a7d8d1e4d8a34a8432fw sizeof (devid)) != PICL_SUCCESS)
db8f0877c245a884664489a7d8d1e4d8a34a8432fw return (err);
db8f0877c245a884664489a7d8d1e4d8a34a8432fw
db8f0877c245a884664489a7d8d1e4d8a34a8432fw /*
db8f0877c245a884664489a7d8d1e4d8a34a8432fw * Go find the first child of the parent so we can search
db8f0877c245a884664489a7d8d1e4d8a34a8432fw * all of the siblings.
db8f0877c245a884664489a7d8d1e4d8a34a8432fw */
db8f0877c245a884664489a7d8d1e4d8a34a8432fw if (picl_get_propval_by_name(nodeh, PICL_PROP_PARENT, &pnodeh,
db8f0877c245a884664489a7d8d1e4d8a34a8432fw sizeof (pnodeh)) != PICL_SUCCESS)
db8f0877c245a884664489a7d8d1e4d8a34a8432fw return (err);
db8f0877c245a884664489a7d8d1e4d8a34a8432fw if (picl_get_propval_by_name(pnodeh, PICL_PROP_CHILD, &pnodeh,
db8f0877c245a884664489a7d8d1e4d8a34a8432fw sizeof (pnodeh)) != PICL_SUCCESS)
db8f0877c245a884664489a7d8d1e4d8a34a8432fw return (err);
db8f0877c245a884664489a7d8d1e4d8a34a8432fw
db8f0877c245a884664489a7d8d1e4d8a34a8432fw /*
db8f0877c245a884664489a7d8d1e4d8a34a8432fw * If the child's device ID matches, then fetch the Label and
db8f0877c245a884664489a7d8d1e4d8a34a8432fw * return it. The first child/device ID should have a Label
db8f0877c245a884664489a7d8d1e4d8a34a8432fw * associated with it.
db8f0877c245a884664489a7d8d1e4d8a34a8432fw */
db8f0877c245a884664489a7d8d1e4d8a34a8432fw do {
db8f0877c245a884664489a7d8d1e4d8a34a8432fw if (picl_get_propval_by_name(pnodeh, PICL_PROP_DEVICE_ID,
db8f0877c245a884664489a7d8d1e4d8a34a8432fw &sib_devid, sizeof (sib_devid)) == PICL_SUCCESS) {
db8f0877c245a884664489a7d8d1e4d8a34a8432fw if (sib_devid == devid) {
db8f0877c245a884664489a7d8d1e4d8a34a8432fw if ((err = picl_get_propval_by_name(pnodeh,
db8f0877c245a884664489a7d8d1e4d8a34a8432fw PICL_PROP_LABEL, val, sizeof (val))) ==
db8f0877c245a884664489a7d8d1e4d8a34a8432fw PICL_SUCCESS) {
db8f0877c245a884664489a7d8d1e4d8a34a8432fw (void) strlcpy(card->slot_str, val,
db8f0877c245a884664489a7d8d1e4d8a34a8432fw sizeof (card->slot_str));
db8f0877c245a884664489a7d8d1e4d8a34a8432fw break;
db8f0877c245a884664489a7d8d1e4d8a34a8432fw }
db8f0877c245a884664489a7d8d1e4d8a34a8432fw }
db8f0877c245a884664489a7d8d1e4d8a34a8432fw }
db8f0877c245a884664489a7d8d1e4d8a34a8432fw } while (picl_get_propval_by_name(pnodeh, PICL_PROP_PEER, &pnodeh,
db8f0877c245a884664489a7d8d1e4d8a34a8432fw sizeof (pnodeh)) == PICL_SUCCESS);
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki
dc6ca969834c6d8d1aac19aaea19d86c5b73cf75fw return (err);
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki}
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenkistatic void
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenkiget_slot_number(picl_nodehdl_t nodeh, struct io_card *card)
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki{
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki picl_errno_t err;
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki picl_prophdl_t proph;
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki picl_propinfo_t pinfo;
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki picl_nodehdl_t pnodeh;
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki uint8_t *pval;
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki uint32_t dev_mask;
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki char uaddr[MAXSTRLEN];
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki int i;
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki err = PICL_SUCCESS;
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki while (err == PICL_SUCCESS) {
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki if (picl_get_propval_by_name(nodeh, PICL_PROP_PARENT, &pnodeh,
a90d965d832a5578dbfc2eadd1617e8cccf25264fw sizeof (pnodeh)) != PICL_SUCCESS) {
a90d965d832a5578dbfc2eadd1617e8cccf25264fw (void) strlcpy(card->slot_str, MOTHERBOARD,
a90d965d832a5578dbfc2eadd1617e8cccf25264fw sizeof (card->slot_str));
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki card->slot = -1;
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki return;
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki }
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki if (picl_get_propinfo_by_name(pnodeh, OBP_PROP_SLOT_NAMES,
a90d965d832a5578dbfc2eadd1617e8cccf25264fw &pinfo, &proph) == PICL_SUCCESS) {
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki break;
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki }
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki nodeh = pnodeh;
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki }
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki if (picl_get_propval_by_name(nodeh, PICL_PROP_UNIT_ADDRESS, uaddr,
a90d965d832a5578dbfc2eadd1617e8cccf25264fw sizeof (uaddr)) != PICL_SUCCESS) {
a90d965d832a5578dbfc2eadd1617e8cccf25264fw (void) strlcpy(card->slot_str, MOTHERBOARD,
a90d965d832a5578dbfc2eadd1617e8cccf25264fw sizeof (card->slot_str));
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki card->slot = -1;
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki return;
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki }
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki pval = (uint8_t *)malloc(pinfo.size);
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki if (!pval) {
a90d965d832a5578dbfc2eadd1617e8cccf25264fw (void) strlcpy(card->slot_str, MOTHERBOARD,
a90d965d832a5578dbfc2eadd1617e8cccf25264fw sizeof (card->slot_str));
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki card->slot = -1;
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki return;
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki }
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki if (picl_get_propval(proph, pval, pinfo.size) != PICL_SUCCESS) {
a90d965d832a5578dbfc2eadd1617e8cccf25264fw (void) strlcpy(card->slot_str, MOTHERBOARD,
a90d965d832a5578dbfc2eadd1617e8cccf25264fw sizeof (card->slot_str));
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki card->slot = -1;
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki free(pval);
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki return;
03831d35f7499c87d51205817c93e9a8d42c4baestevel }
03831d35f7499c87d51205817c93e9a8d42c4baestevel
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki dev_mask = 0;
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki for (i = 0; i < sizeof (dev_mask); i++)
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki dev_mask |= (*(pval+i) << 8*(sizeof (dev_mask)-1-i));
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki for (i = 0; i < sizeof (uaddr) && uaddr[i] != '\0'; i++) {
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki if (uaddr[i] == ',') {
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki uaddr[i] = '\0';
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki break;
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki }
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki }
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki card->slot = atol(uaddr);
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki if (((1 << card->slot) & dev_mask) == 0) {
a90d965d832a5578dbfc2eadd1617e8cccf25264fw (void) strlcpy(card->slot_str, MOTHERBOARD,
a90d965d832a5578dbfc2eadd1617e8cccf25264fw sizeof (card->slot_str));
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki card->slot = -1;
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki } else {
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki char *p = (char *)(pval+sizeof (dev_mask));
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki int shift = sizeof (uint32_t)*8-1-card->slot;
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki uint32_t x = (dev_mask << shift) >> shift;
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki int count = 0; /* count # of 1's in x */
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki int i = 0;
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki while (x != 0) {
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki count++;
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki x &= x-1;
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki }
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki while (count > 1) {
a90d965d832a5578dbfc2eadd1617e8cccf25264fw while (p[i++] != '\0')
a90d965d832a5578dbfc2eadd1617e8cccf25264fw ;
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki count--;
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki }
4c5e0fde93352f23abc94e445999402e38b91268vivek (void) strlcpy(card->slot_str, (char *)(p+i),
a90d965d832a5578dbfc2eadd1617e8cccf25264fw sizeof (card->slot_str));
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki }
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki free(pval);
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki}
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki/*
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki * add all io devices under pci in io list
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki */
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki/* ARGSUSED */
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenkistatic int
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenkisun4v_pci_callback(picl_nodehdl_t pcih, void *args)
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki{
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki char path[PICL_PROPNAMELEN_MAX];
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki char class[PICL_CLASSNAMELEN_MAX];
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki char name[PICL_PROPNAMELEN_MAX];
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki char model[PICL_PROPNAMELEN_MAX];
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki char binding_name[PICL_PROPNAMELEN_MAX];
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki char val[PICL_PROPNAMELEN_MAX];
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki char *compatible;
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki picl_errno_t err;
db8f0877c245a884664489a7d8d1e4d8a34a8432fw picl_nodehdl_t nodeh, pnodeh;
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki struct io_card pci_card;
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki /* Walk through the children */
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki err = picl_get_propval_by_name(pcih, PICL_PROP_CHILD, &nodeh,
a90d965d832a5578dbfc2eadd1617e8cccf25264fw sizeof (picl_nodehdl_t));
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki while (err == PICL_SUCCESS) {
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki err = picl_get_propval_by_name(nodeh, PICL_PROP_CLASSNAME,
a90d965d832a5578dbfc2eadd1617e8cccf25264fw class, sizeof (class));
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki if (err != PICL_SUCCESS)
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki return (err);
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki if (args) {
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki char *val = args;
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki if (strcmp(class, val) == 0) {
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki err = picl_get_propval_by_name(nodeh,
a90d965d832a5578dbfc2eadd1617e8cccf25264fw PICL_PROP_PEER, &nodeh,
a90d965d832a5578dbfc2eadd1617e8cccf25264fw sizeof (picl_nodehdl_t));
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki continue;
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki } else if (strcmp(val, PICL_CLASS_PCIEX) == 0 &&
a90d965d832a5578dbfc2eadd1617e8cccf25264fw strcmp(class, PICL_CLASS_PCI) == 0) {
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki err = picl_get_propval_by_name(nodeh,
a90d965d832a5578dbfc2eadd1617e8cccf25264fw PICL_PROP_PEER, &nodeh,
a90d965d832a5578dbfc2eadd1617e8cccf25264fw sizeof (picl_nodehdl_t));
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki continue;
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki } else if (strcmp(val, PICL_CLASS_PCI) == 0 &&
a90d965d832a5578dbfc2eadd1617e8cccf25264fw strcmp(class, PICL_CLASS_PCIEX) == 0) {
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki err = picl_get_propval_by_name(nodeh,
a90d965d832a5578dbfc2eadd1617e8cccf25264fw PICL_PROP_PEER, &nodeh,
a90d965d832a5578dbfc2eadd1617e8cccf25264fw sizeof (picl_nodehdl_t));
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki continue;
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki }
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki }
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki err = picl_get_propval_by_name(nodeh, PICL_PROP_DEVFS_PATH,
a90d965d832a5578dbfc2eadd1617e8cccf25264fw path, sizeof (path));
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki if (err != PICL_SUCCESS)
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki return (err);
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki (void) strlcpy(pci_card.notes, path, sizeof (pci_card.notes));
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki
db8f0877c245a884664489a7d8d1e4d8a34a8432fw pnodeh = nodeh;
db8f0877c245a884664489a7d8d1e4d8a34a8432fw err = get_slot_label(nodeh, &pci_card);
db8f0877c245a884664489a7d8d1e4d8a34a8432fw
db8f0877c245a884664489a7d8d1e4d8a34a8432fw /*
db8f0877c245a884664489a7d8d1e4d8a34a8432fw * No Label at this node, maybe we're looking at a device
db8f0877c245a884664489a7d8d1e4d8a34a8432fw * downstream of a bridge. Walk back up and find a Label and
db8f0877c245a884664489a7d8d1e4d8a34a8432fw * record that node in "pnodeh".
db8f0877c245a884664489a7d8d1e4d8a34a8432fw */
db8f0877c245a884664489a7d8d1e4d8a34a8432fw while (err != PICL_SUCCESS) {
db8f0877c245a884664489a7d8d1e4d8a34a8432fw if (err != PICL_PROPNOTFOUND)
db8f0877c245a884664489a7d8d1e4d8a34a8432fw break;
db8f0877c245a884664489a7d8d1e4d8a34a8432fw else if (picl_get_propval_by_name(pnodeh,
db8f0877c245a884664489a7d8d1e4d8a34a8432fw PICL_PROP_PARENT, &pnodeh, sizeof (pnodeh)) ==
db8f0877c245a884664489a7d8d1e4d8a34a8432fw PICL_SUCCESS)
db8f0877c245a884664489a7d8d1e4d8a34a8432fw err = get_slot_label(pnodeh, &pci_card);
db8f0877c245a884664489a7d8d1e4d8a34a8432fw else
db8f0877c245a884664489a7d8d1e4d8a34a8432fw break;
db8f0877c245a884664489a7d8d1e4d8a34a8432fw }
db8f0877c245a884664489a7d8d1e4d8a34a8432fw
db8f0877c245a884664489a7d8d1e4d8a34a8432fw /*
db8f0877c245a884664489a7d8d1e4d8a34a8432fw * Can't find a Label for this device in the PCI heirarchy.
db8f0877c245a884664489a7d8d1e4d8a34a8432fw * Try to synthesize a slot name from atoms. This depends
db8f0877c245a884664489a7d8d1e4d8a34a8432fw * on the OBP slot_names property being implemented, and this
db8f0877c245a884664489a7d8d1e4d8a34a8432fw * so far doesn't seem to be on sun4v. But just in case that
db8f0877c245a884664489a7d8d1e4d8a34a8432fw * is resurrected, the code is here.
db8f0877c245a884664489a7d8d1e4d8a34a8432fw */
db8f0877c245a884664489a7d8d1e4d8a34a8432fw if (err != PICL_SUCCESS) {
db8f0877c245a884664489a7d8d1e4d8a34a8432fw pnodeh = nodeh;
db8f0877c245a884664489a7d8d1e4d8a34a8432fw get_slot_number(nodeh, &pci_card);
db8f0877c245a884664489a7d8d1e4d8a34a8432fw }
db8f0877c245a884664489a7d8d1e4d8a34a8432fw
db8f0877c245a884664489a7d8d1e4d8a34a8432fw /*
db8f0877c245a884664489a7d8d1e4d8a34a8432fw * Passing in pnodeh instead of nodeh will cause prtdiag
db8f0877c245a884664489a7d8d1e4d8a34a8432fw * to display the type of IO slot for the leaf node. For
db8f0877c245a884664489a7d8d1e4d8a34a8432fw * built-in devices and a lot of IO cards these will be
db8f0877c245a884664489a7d8d1e4d8a34a8432fw * the same thing. But for IO cards with bridge chips or
db8f0877c245a884664489a7d8d1e4d8a34a8432fw * for things like expansion chassis, prtdiag will report
db8f0877c245a884664489a7d8d1e4d8a34a8432fw * the bus type of the IO slot and not the leaf, which
db8f0877c245a884664489a7d8d1e4d8a34a8432fw * could be different things.
db8f0877c245a884664489a7d8d1e4d8a34a8432fw */
db8f0877c245a884664489a7d8d1e4d8a34a8432fw get_bus_type(pnodeh, &pci_card);
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki err = picl_get_propval_by_name(nodeh, PICL_PROP_NAME, name,
a90d965d832a5578dbfc2eadd1617e8cccf25264fw sizeof (name));
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki if (err == PICL_PROPNOTFOUND)
4c5e0fde93352f23abc94e445999402e38b91268vivek (void) strlcpy(name, "", sizeof (name));
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki else if (err != PICL_SUCCESS)
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki return (err);
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki err = picl_get_propval_by_name(nodeh, PICL_PROP_STATUS, val,
a90d965d832a5578dbfc2eadd1617e8cccf25264fw sizeof (val));
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki if (err == PICL_PROPNOTFOUND)
4c5e0fde93352f23abc94e445999402e38b91268vivek (void) strlcpy(val, "", sizeof (val));
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki else if (err != PICL_SUCCESS)
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki return (err);
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki
dc6ca969834c6d8d1aac19aaea19d86c5b73cf75fw (void) snprintf(pci_card.status, sizeof (pci_card.status),
dc6ca969834c6d8d1aac19aaea19d86c5b73cf75fw "%s", pci_card.slot_str);
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki /*
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki * Get the name of this card. If binding_name is found,
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki * name will be <nodename>-<binding_name>.
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki */
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki err = picl_get_propval_by_name(nodeh, PICL_PROP_BINDING_NAME,
a90d965d832a5578dbfc2eadd1617e8cccf25264fw binding_name, sizeof (binding_name));
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki if (err == PICL_SUCCESS) {
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki if (strcmp(name, binding_name) != 0) {
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki (void) strlcat(name, "-", sizeof (name));
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki (void) strlcat(name, binding_name,
a90d965d832a5578dbfc2eadd1617e8cccf25264fw sizeof (name));
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki }
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki } else if (err == PICL_PROPNOTFOUND) {
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki /*
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki * if compatible prop is not found, name will be
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki * <nodename>-<compatible>
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki */
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki err = sun4v_get_first_compatible_value(nodeh,
a90d965d832a5578dbfc2eadd1617e8cccf25264fw &compatible);
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki if (err == PICL_SUCCESS) {
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki (void) strlcat(name, "-", sizeof (name));
4c5e0fde93352f23abc94e445999402e38b91268vivek (void) strlcat(name, compatible,
a90d965d832a5578dbfc2eadd1617e8cccf25264fw sizeof (name));
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki free(compatible);
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki }
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki } else
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki return (err);
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki (void) strlcpy(pci_card.name, name, sizeof (pci_card.name));
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki /* Get the model of this card */
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki err = picl_get_propval_by_name(nodeh, OBP_PROP_MODEL,
a90d965d832a5578dbfc2eadd1617e8cccf25264fw model, sizeof (model));
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki if (err == PICL_PROPNOTFOUND)
4c5e0fde93352f23abc94e445999402e38b91268vivek (void) strlcpy(model, "", sizeof (model));
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki else if (err != PICL_SUCCESS)
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki return (err);
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki (void) strlcpy(pci_card.model, model, sizeof (pci_card.model));
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki /* Print NAC name */
aaba19e23c48a32e927f4e39464be188bfcbef37fw log_printf("%-18s", pci_card.status);
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki /* Print IO Type */
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki log_printf("%-6s", pci_card.bus_type);
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki /* Printf Card Name */
7ae4bfcbefd6100bcc6079f530f1df87f4801110fw log_printf("%-34s", pci_card.name);
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki /* Print Card Model */
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki log_printf("%-8s", pci_card.model);
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki log_printf("\n");
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki /* Print Status */
aaba19e23c48a32e927f4e39464be188bfcbef37fw log_printf("%-18s", val);
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki /* Print IO Type */
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki log_printf("%-6s", "");
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki /* Print Parent Path */
aaba19e23c48a32e927f4e39464be188bfcbef37fw log_printf("%-44s", pci_card.notes);
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki log_printf("\n");
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki err = picl_get_propval_by_name(nodeh, PICL_PROP_PEER, &nodeh,
a90d965d832a5578dbfc2eadd1617e8cccf25264fw sizeof (picl_nodehdl_t));
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki }
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki return (PICL_WALK_CONTINUE);
03831d35f7499c87d51205817c93e9a8d42c4baestevel}
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel/*
03831d35f7499c87d51205817c93e9a8d42c4baestevel * display_pci
03831d35f7499c87d51205817c93e9a8d42c4baestevel * Display all the PCI IO cards on this board.
03831d35f7499c87d51205817c93e9a8d42c4baestevel */
03831d35f7499c87d51205817c93e9a8d42c4baestevelvoid
03831d35f7499c87d51205817c93e9a8d42c4baestevelsun4v_display_pci(picl_nodehdl_t plafh)
03831d35f7499c87d51205817c93e9a8d42c4baestevel{
7ae4bfcbefd6100bcc6079f530f1df87f4801110fw char *fmt = "%-17s %-5s %-33s %-8s";
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki /* Have we printed the column headings? */
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki static int banner = FALSE;
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki if (banner == FALSE) {
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki log_printf("\n");
aaba19e23c48a32e927f4e39464be188bfcbef37fw log_printf("================================");
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki log_printf(" IO Devices ");
aaba19e23c48a32e927f4e39464be188bfcbef37fw log_printf("================================");
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki log_printf("\n");
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki log_printf(fmt, "Slot +", "Bus", "Name +", "Model", 0);
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki log_printf("\n");
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki log_printf(fmt, "Status", "Type", "Path", "", 0);
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki log_printf("\n");
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki log_printf("---------------------------------"
aaba19e23c48a32e927f4e39464be188bfcbef37fw "-------------------------------------------\n");
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki banner = TRUE;
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki }
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki (void) picl_walk_tree_by_class(plafh, PICL_CLASS_PCIEX,
a90d965d832a5578dbfc2eadd1617e8cccf25264fw PICL_CLASS_PCIEX, sun4v_pci_callback);
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki (void) picl_walk_tree_by_class(plafh, PICL_CLASS_PCI,
a90d965d832a5578dbfc2eadd1617e8cccf25264fw PICL_CLASS_PCI, sun4v_pci_callback);
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki (void) picl_walk_tree_by_class(plafh, PICL_CLASS_SUN4V,
a90d965d832a5578dbfc2eadd1617e8cccf25264fw PICL_CLASS_SUN4V, sun4v_pci_callback);
03831d35f7499c87d51205817c93e9a8d42c4baestevel}
03831d35f7499c87d51205817c93e9a8d42c4baestevel
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki/*
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki * return the first compatible value
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki */
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenkistatic int
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenkisun4v_get_first_compatible_value(picl_nodehdl_t nodeh, char **outbuf)
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki{
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki picl_errno_t err;
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki picl_prophdl_t proph;
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki picl_propinfo_t pinfo;
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki picl_prophdl_t tblh;
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki picl_prophdl_t rowproph;
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki char *pval;
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki err = picl_get_propinfo_by_name(nodeh, OBP_PROP_COMPATIBLE,
a90d965d832a5578dbfc2eadd1617e8cccf25264fw &pinfo, &proph);
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki if (err != PICL_SUCCESS)
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki return (err);
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki if (pinfo.type == PICL_PTYPE_CHARSTRING) {
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki pval = malloc(pinfo.size);
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki if (pval == NULL)
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki return (PICL_FAILURE);
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki err = picl_get_propval(proph, pval, pinfo.size);
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki if (err != PICL_SUCCESS) {
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki free(pval);
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki return (err);
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki }
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki *outbuf = pval;
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki return (PICL_SUCCESS);
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki }
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki if (pinfo.type != PICL_PTYPE_TABLE)
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki return (PICL_FAILURE);
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki /* get first string from table */
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki err = picl_get_propval(proph, &tblh, pinfo.size);
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki if (err != PICL_SUCCESS)
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki return (err);
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki err = picl_get_next_by_row(tblh, &rowproph);
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki if (err != PICL_SUCCESS)
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki return (err);
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki err = picl_get_propinfo(rowproph, &pinfo);
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki if (err != PICL_SUCCESS)
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki return (err);
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki pval = malloc(pinfo.size);
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki if (pval == NULL)
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki return (PICL_FAILURE);
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki err = picl_get_propval(rowproph, pval, pinfo.size);
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki if (err != PICL_SUCCESS) {
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki free(pval);
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki return (err);
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki }
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki *outbuf = pval;
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki return (PICL_SUCCESS);
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki}
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki/*
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki * print size of a memory segment
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki */
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenkistatic void
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenkiprint_memory_segment_size(uint64_t size)
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki{
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki uint64_t kbyte = 1024;
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki uint64_t mbyte = kbyte * kbyte;
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki uint64_t gbyte = kbyte * mbyte;
7ae4bfcbefd6100bcc6079f530f1df87f4801110fw uint64_t tbyte = kbyte * gbyte;
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki char buf[MEMORY_SIZE_FIELD];
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki
7ae4bfcbefd6100bcc6079f530f1df87f4801110fw if (size >= tbyte) {
7ae4bfcbefd6100bcc6079f530f1df87f4801110fw if (size % tbyte == 0)
7ae4bfcbefd6100bcc6079f530f1df87f4801110fw (void) snprintf(buf, sizeof (buf), "%d TB",
7ae4bfcbefd6100bcc6079f530f1df87f4801110fw (int)(size / tbyte));
7ae4bfcbefd6100bcc6079f530f1df87f4801110fw else
7ae4bfcbefd6100bcc6079f530f1df87f4801110fw (void) snprintf(buf, sizeof (buf), "%.2f TB",
7ae4bfcbefd6100bcc6079f530f1df87f4801110fw (float)size / tbyte);
7ae4bfcbefd6100bcc6079f530f1df87f4801110fw } else if (size >= gbyte) {
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki if (size % gbyte == 0)
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki (void) snprintf(buf, sizeof (buf), "%d GB",
a90d965d832a5578dbfc2eadd1617e8cccf25264fw (int)(size / gbyte));
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki else
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki (void) snprintf(buf, sizeof (buf), "%.2f GB",
a90d965d832a5578dbfc2eadd1617e8cccf25264fw (float)size / gbyte);
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki } else if (size >= mbyte) {
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki if (size % mbyte == 0)
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki (void) snprintf(buf, sizeof (buf), "%d MB",
a90d965d832a5578dbfc2eadd1617e8cccf25264fw (int)(size / mbyte));
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki else
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki (void) snprintf(buf, sizeof (buf), "%.2f MB",
a90d965d832a5578dbfc2eadd1617e8cccf25264fw (float)size / mbyte);
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki } else {
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki if (size % kbyte == 0)
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki (void) snprintf(buf, sizeof (buf), "%d KB",
a90d965d832a5578dbfc2eadd1617e8cccf25264fw (int)(size / kbyte));
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki else
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki (void) snprintf(buf, sizeof (buf), "%.2f KB",
a90d965d832a5578dbfc2eadd1617e8cccf25264fw (float)size / kbyte);
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki }
7ae4bfcbefd6100bcc6079f530f1df87f4801110fw log_printf("%-9s", buf);
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki}
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki/*
a90d965d832a5578dbfc2eadd1617e8cccf25264fw * Enumerate banks and dimms within a memory segment. We're handed
a90d965d832a5578dbfc2eadd1617e8cccf25264fw * the first bank within the segment - we assume there are dimms
a90d965d832a5578dbfc2eadd1617e8cccf25264fw * (memory-module) nodes underneath.
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki */
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenkistatic void
a90d965d832a5578dbfc2eadd1617e8cccf25264fwprint_memory_segment_contain(picl_nodehdl_t bank_nodeh)
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki{
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki char val[PICL_PROPNAMELEN_MAX];
a90d965d832a5578dbfc2eadd1617e8cccf25264fw picl_nodehdl_t module_nodeh;
a90d965d832a5578dbfc2eadd1617e8cccf25264fw int flag = 0;
7ae4bfcbefd6100bcc6079f530f1df87f4801110fw uint64_t size;
a90d965d832a5578dbfc2eadd1617e8cccf25264fw
a90d965d832a5578dbfc2eadd1617e8cccf25264fw do {
a90d965d832a5578dbfc2eadd1617e8cccf25264fw if (picl_get_propval_by_name(bank_nodeh, PICL_PROP_CHILD,
a90d965d832a5578dbfc2eadd1617e8cccf25264fw &module_nodeh, sizeof (picl_nodehdl_t)) != PICL_SUCCESS)
a90d965d832a5578dbfc2eadd1617e8cccf25264fw continue;
7ae4bfcbefd6100bcc6079f530f1df87f4801110fw if (picl_get_propval_by_name(bank_nodeh, PICL_PROP_SIZE,
7ae4bfcbefd6100bcc6079f530f1df87f4801110fw &size, sizeof (size)) == PICL_SUCCESS) {
7ae4bfcbefd6100bcc6079f530f1df87f4801110fw if (!flag) {
7ae4bfcbefd6100bcc6079f530f1df87f4801110fw print_memory_segment_size(size);
7ae4bfcbefd6100bcc6079f530f1df87f4801110fw } else {
7ae4bfcbefd6100bcc6079f530f1df87f4801110fw log_printf(" "
7ae4bfcbefd6100bcc6079f530f1df87f4801110fw " ");
7ae4bfcbefd6100bcc6079f530f1df87f4801110fw print_memory_segment_size(size);
7ae4bfcbefd6100bcc6079f530f1df87f4801110fw flag = 0;
7ae4bfcbefd6100bcc6079f530f1df87f4801110fw }
7ae4bfcbefd6100bcc6079f530f1df87f4801110fw }
a90d965d832a5578dbfc2eadd1617e8cccf25264fw do {
a90d965d832a5578dbfc2eadd1617e8cccf25264fw if (picl_get_propval_by_name(module_nodeh,
a90d965d832a5578dbfc2eadd1617e8cccf25264fw PICL_PROP_NAC, val, sizeof (val)) !=
a90d965d832a5578dbfc2eadd1617e8cccf25264fw PICL_SUCCESS)
a90d965d832a5578dbfc2eadd1617e8cccf25264fw continue;
a90d965d832a5578dbfc2eadd1617e8cccf25264fw else {
a90d965d832a5578dbfc2eadd1617e8cccf25264fw if (!flag) {
7ae4bfcbefd6100bcc6079f530f1df87f4801110fw log_printf("%s\n", val);
a90d965d832a5578dbfc2eadd1617e8cccf25264fw flag = 1;
7ae4bfcbefd6100bcc6079f530f1df87f4801110fw } else {
7ae4bfcbefd6100bcc6079f530f1df87f4801110fw log_printf("%s%s\n",
7ae4bfcbefd6100bcc6079f530f1df87f4801110fw " "
7ae4bfcbefd6100bcc6079f530f1df87f4801110fw " ",
7ae4bfcbefd6100bcc6079f530f1df87f4801110fw val);
7ae4bfcbefd6100bcc6079f530f1df87f4801110fw }
a90d965d832a5578dbfc2eadd1617e8cccf25264fw }
a90d965d832a5578dbfc2eadd1617e8cccf25264fw } while (picl_get_propval_by_name(module_nodeh, PICL_PROP_PEER,
a90d965d832a5578dbfc2eadd1617e8cccf25264fw &module_nodeh, sizeof (picl_nodehdl_t)) ==
a90d965d832a5578dbfc2eadd1617e8cccf25264fw PICL_SUCCESS);
a90d965d832a5578dbfc2eadd1617e8cccf25264fw } while (picl_get_propval_by_name(bank_nodeh, PICL_PROP_PEER,
a90d965d832a5578dbfc2eadd1617e8cccf25264fw &bank_nodeh, sizeof (picl_nodehdl_t)) == PICL_SUCCESS);
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki}
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki/*
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki * Search node where _class=="memory-segment"
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki * print "Base Address", "Size", etc
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki */
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki/*ARGSUSED*/
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenkistatic int
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenkisun4v_memory_conf_callback(picl_nodehdl_t nodeh, void *args)
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki{
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki uint64_t base;
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki uint64_t size;
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki uint64_t ifactor;
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki picl_errno_t err = PICL_SUCCESS;
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki if (class_node_found == 0) {
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki class_node_found = 1;
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki return (PICL_WALK_TERMINATE);
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki }
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki while (err == PICL_SUCCESS) {
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki err = picl_get_propval_by_name(nodeh, PICL_PROP_BASEADDRESS,
a90d965d832a5578dbfc2eadd1617e8cccf25264fw &base, sizeof (base));
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki if (err != PICL_SUCCESS)
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki break;
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki err = picl_get_propval_by_name(nodeh, PICL_PROP_SIZE,
a90d965d832a5578dbfc2eadd1617e8cccf25264fw &size, sizeof (size));
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki if (err != PICL_SUCCESS)
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki break;
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki err = picl_get_propval_by_name(nodeh,
a90d965d832a5578dbfc2eadd1617e8cccf25264fw PICL_PROP_INTERLEAVE_FACTOR, &ifactor,
a90d965d832a5578dbfc2eadd1617e8cccf25264fw sizeof (ifactor));
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki if (err != PICL_SUCCESS)
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki break;
7ae4bfcbefd6100bcc6079f530f1df87f4801110fw log_printf("0x%-13llx", base);
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki print_memory_segment_size(size);
7ae4bfcbefd6100bcc6079f530f1df87f4801110fw log_printf("%-12lld", ifactor);
a90d965d832a5578dbfc2eadd1617e8cccf25264fw err = picl_get_propval_by_name(nodeh, PICL_PROP_CHILD,
a90d965d832a5578dbfc2eadd1617e8cccf25264fw &nodeh, sizeof (nodeh));
a90d965d832a5578dbfc2eadd1617e8cccf25264fw if (err == PICL_SUCCESS)
a90d965d832a5578dbfc2eadd1617e8cccf25264fw print_memory_segment_contain(nodeh);
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki log_printf("\n");
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki err = picl_get_propval_by_name(nodeh, PICL_PROP_PEER, &nodeh,
a90d965d832a5578dbfc2eadd1617e8cccf25264fw sizeof (picl_nodehdl_t));
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki }
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki return (PICL_WALK_CONTINUE);
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki}
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki/*ARGSUSED*/
03831d35f7499c87d51205817c93e9a8d42c4baestevelvoid
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenkisun4v_display_memory_conf(picl_nodehdl_t plafh)
03831d35f7499c87d51205817c93e9a8d42c4baestevel{
7ae4bfcbefd6100bcc6079f530f1df87f4801110fw char *fmt = "%-14s %-8s %-11s %-8s %-s";
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki (void) picl_walk_tree_by_class(plafh, PICL_CLASS_MEMORY_SEGMENT,
a90d965d832a5578dbfc2eadd1617e8cccf25264fw NULL, sun4v_memory_conf_callback);
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki if (class_node_found == 0)
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki return;
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki log_printf("\n");
7ae4bfcbefd6100bcc6079f530f1df87f4801110fw log_printf("=======================");
7ae4bfcbefd6100bcc6079f530f1df87f4801110fw log_printf(" Physical Memory Configuration ");
7ae4bfcbefd6100bcc6079f530f1df87f4801110fw log_printf("========================");
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki log_printf("\n");
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki log_printf("Segment Table:\n");
a90d965d832a5578dbfc2eadd1617e8cccf25264fw log_printf(
7ae4bfcbefd6100bcc6079f530f1df87f4801110fw "--------------------------------------------------------------\n");
7ae4bfcbefd6100bcc6079f530f1df87f4801110fw log_printf(fmt, "Base", "Segment", "Interleave", "Bank", "Contains", 0);
7ae4bfcbefd6100bcc6079f530f1df87f4801110fw log_printf("\n");
7ae4bfcbefd6100bcc6079f530f1df87f4801110fw log_printf(fmt, "Address", "Size", "Factor", "Size", "Modules", 0);
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki log_printf("\n");
a90d965d832a5578dbfc2eadd1617e8cccf25264fw log_printf(
7ae4bfcbefd6100bcc6079f530f1df87f4801110fw "--------------------------------------------------------------\n");
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki (void) picl_walk_tree_by_class(plafh, PICL_CLASS_MEMORY_SEGMENT,
a90d965d832a5578dbfc2eadd1617e8cccf25264fw NULL, sun4v_memory_conf_callback);
03831d35f7499c87d51205817c93e9a8d42c4baestevel}
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevelvoid
03831d35f7499c87d51205817c93e9a8d42c4baestevelsun4v_display_cpu_devices(picl_nodehdl_t plafh)
03831d35f7499c87d51205817c93e9a8d42c4baestevel{
7ae4bfcbefd6100bcc6079f530f1df87f4801110fw char *fmt = "%-6s %-9s %-22s %-6s";
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel /*
03831d35f7499c87d51205817c93e9a8d42c4baestevel * Display the table header for CPUs . Then display the CPU
03831d35f7499c87d51205817c93e9a8d42c4baestevel * frequency, cache size, and processor revision of all cpus.
03831d35f7499c87d51205817c93e9a8d42c4baestevel */
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf(dgettext(TEXT_DOMAIN,
a90d965d832a5578dbfc2eadd1617e8cccf25264fw "\n"
7ae4bfcbefd6100bcc6079f530f1df87f4801110fw "================================"
7ae4bfcbefd6100bcc6079f530f1df87f4801110fw " Virtual CPUs "
7ae4bfcbefd6100bcc6079f530f1df87f4801110fw "================================"
a90d965d832a5578dbfc2eadd1617e8cccf25264fw "\n"
a90d965d832a5578dbfc2eadd1617e8cccf25264fw "\n"));
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf("\n");
7ae4bfcbefd6100bcc6079f530f1df87f4801110fw log_printf(fmt, "CPU ID", "Frequency", "Implementation",
7ae4bfcbefd6100bcc6079f530f1df87f4801110fw "Status", 0);
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf("\n");
7ae4bfcbefd6100bcc6079f530f1df87f4801110fw log_printf(fmt, "------", "---------",
7ae4bfcbefd6100bcc6079f530f1df87f4801110fw "----------------------", "-------", 0);
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf("\n");
03831d35f7499c87d51205817c93e9a8d42c4baestevel
7ae4bfcbefd6100bcc6079f530f1df87f4801110fw (void) picl_walk_tree_by_class(plafh, PICL_CLASS_CPU, PICL_CLASS_CPU,
7ae4bfcbefd6100bcc6079f530f1df87f4801110fw sun4v_display_cpus);
03831d35f7499c87d51205817c93e9a8d42c4baestevel}
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel/*
03831d35f7499c87d51205817c93e9a8d42c4baestevel * Display the CPUs present on this board.
03831d35f7499c87d51205817c93e9a8d42c4baestevel */
03831d35f7499c87d51205817c93e9a8d42c4baestevel/*ARGSUSED*/
03831d35f7499c87d51205817c93e9a8d42c4baestevelint
03831d35f7499c87d51205817c93e9a8d42c4baestevelsun4v_display_cpus(picl_nodehdl_t cpuh, void* args)
03831d35f7499c87d51205817c93e9a8d42c4baestevel{
03831d35f7499c87d51205817c93e9a8d42c4baestevel int status;
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki picl_prophdl_t proph;
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki picl_prophdl_t tblh;
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki picl_prophdl_t rowproph;
03831d35f7499c87d51205817c93e9a8d42c4baestevel picl_propinfo_t propinfo;
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki int *int_value;
5e3e415a5bedb7bb9ff36b225630e414258e6ecefw int cpuid;
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki char *comp_value;
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki char *no_prop_value = " ";
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki char freq_str[MAXSTRLEN];
5e3e415a5bedb7bb9ff36b225630e414258e6ecefw char state[MAXSTRLEN];
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel /*
03831d35f7499c87d51205817c93e9a8d42c4baestevel * Get cpuid property and print it and the NAC name
03831d35f7499c87d51205817c93e9a8d42c4baestevel */
7ae4bfcbefd6100bcc6079f530f1df87f4801110fw status = picl_get_propinfo_by_name(cpuh, OBP_PROP_CPUID, &propinfo,
7ae4bfcbefd6100bcc6079f530f1df87f4801110fw &proph);
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (status == PICL_SUCCESS) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel status = picl_get_propval(proph, &cpuid, sizeof (cpuid));
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (status != PICL_SUCCESS) {
7ae4bfcbefd6100bcc6079f530f1df87f4801110fw log_printf("%-7s", no_prop_value);
03831d35f7499c87d51205817c93e9a8d42c4baestevel } else {
7ae4bfcbefd6100bcc6079f530f1df87f4801110fw log_printf("%-7d", cpuid);
03831d35f7499c87d51205817c93e9a8d42c4baestevel }
03831d35f7499c87d51205817c93e9a8d42c4baestevel } else {
7ae4bfcbefd6100bcc6079f530f1df87f4801110fw log_printf("%-7s", no_prop_value);
03831d35f7499c87d51205817c93e9a8d42c4baestevel }
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevelclock_freq:
03831d35f7499c87d51205817c93e9a8d42c4baestevel status = picl_get_propinfo_by_name(cpuh, "clock-frequency", &propinfo,
a90d965d832a5578dbfc2eadd1617e8cccf25264fw &proph);
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (status == PICL_SUCCESS) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel int_value = malloc(propinfo.size);
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (int_value == NULL) {
7ae4bfcbefd6100bcc6079f530f1df87f4801110fw log_printf("%-10s", no_prop_value);
03831d35f7499c87d51205817c93e9a8d42c4baestevel goto compatible;
03831d35f7499c87d51205817c93e9a8d42c4baestevel }
03831d35f7499c87d51205817c93e9a8d42c4baestevel status = picl_get_propval(proph, int_value, propinfo.size);
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (status != PICL_SUCCESS) {
7ae4bfcbefd6100bcc6079f530f1df87f4801110fw log_printf("%-10s", no_prop_value);
03831d35f7499c87d51205817c93e9a8d42c4baestevel } else {
03831d35f7499c87d51205817c93e9a8d42c4baestevel /* Running frequency */
03831d35f7499c87d51205817c93e9a8d42c4baestevel (void) snprintf(freq_str, sizeof (freq_str), "%d MHz",
03831d35f7499c87d51205817c93e9a8d42c4baestevel CLK_FREQ_TO_MHZ(*int_value));
7ae4bfcbefd6100bcc6079f530f1df87f4801110fw log_printf("%-10s", freq_str);
03831d35f7499c87d51205817c93e9a8d42c4baestevel }
03831d35f7499c87d51205817c93e9a8d42c4baestevel free(int_value);
03831d35f7499c87d51205817c93e9a8d42c4baestevel } else
7ae4bfcbefd6100bcc6079f530f1df87f4801110fw log_printf("%-10s", no_prop_value);
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevelcompatible:
03831d35f7499c87d51205817c93e9a8d42c4baestevel status = picl_get_propinfo_by_name(cpuh, "compatible", &propinfo,
a90d965d832a5578dbfc2eadd1617e8cccf25264fw &proph);
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (status == PICL_SUCCESS) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (propinfo.type == PICL_PTYPE_CHARSTRING) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel /*
03831d35f7499c87d51205817c93e9a8d42c4baestevel * Compatible Property only has 1 value
03831d35f7499c87d51205817c93e9a8d42c4baestevel */
03831d35f7499c87d51205817c93e9a8d42c4baestevel comp_value = malloc(propinfo.size);
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (comp_value == NULL) {
7ae4bfcbefd6100bcc6079f530f1df87f4801110fw log_printf("%-23s", no_prop_value, 0);
5e3e415a5bedb7bb9ff36b225630e414258e6ecefw goto state;
03831d35f7499c87d51205817c93e9a8d42c4baestevel }
03831d35f7499c87d51205817c93e9a8d42c4baestevel status = picl_get_propval(proph, comp_value,
a90d965d832a5578dbfc2eadd1617e8cccf25264fw propinfo.size);
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki if (status != PICL_SUCCESS)
7ae4bfcbefd6100bcc6079f530f1df87f4801110fw log_printf("%-23s", no_prop_value, 0);
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki else
7ae4bfcbefd6100bcc6079f530f1df87f4801110fw log_printf("%-23s", comp_value, 0);
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki free(comp_value);
03831d35f7499c87d51205817c93e9a8d42c4baestevel } else if (propinfo.type == PICL_PTYPE_TABLE) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel /*
03831d35f7499c87d51205817c93e9a8d42c4baestevel * Compatible Property has multiple values
03831d35f7499c87d51205817c93e9a8d42c4baestevel */
03831d35f7499c87d51205817c93e9a8d42c4baestevel status = picl_get_propval(proph, &tblh, propinfo.size);
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (status != PICL_SUCCESS) {
7ae4bfcbefd6100bcc6079f530f1df87f4801110fw log_printf("%-23s", no_prop_value, 0);
5e3e415a5bedb7bb9ff36b225630e414258e6ecefw goto state;
03831d35f7499c87d51205817c93e9a8d42c4baestevel }
03831d35f7499c87d51205817c93e9a8d42c4baestevel status = picl_get_next_by_row(tblh, &rowproph);
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (status != PICL_SUCCESS) {
7ae4bfcbefd6100bcc6079f530f1df87f4801110fw log_printf("%-23s", no_prop_value, 0);
5e3e415a5bedb7bb9ff36b225630e414258e6ecefw goto state;
03831d35f7499c87d51205817c93e9a8d42c4baestevel }
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel status = picl_get_propinfo(rowproph, &propinfo);
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (status != PICL_SUCCESS) {
7ae4bfcbefd6100bcc6079f530f1df87f4801110fw log_printf("%-23s", no_prop_value, 0);
5e3e415a5bedb7bb9ff36b225630e414258e6ecefw goto state;
03831d35f7499c87d51205817c93e9a8d42c4baestevel }
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel comp_value = malloc(propinfo.size);
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (comp_value == NULL) {
7ae4bfcbefd6100bcc6079f530f1df87f4801110fw log_printf("%-23s", no_prop_value, 0);
5e3e415a5bedb7bb9ff36b225630e414258e6ecefw goto state;
03831d35f7499c87d51205817c93e9a8d42c4baestevel }
03831d35f7499c87d51205817c93e9a8d42c4baestevel status = picl_get_propval(rowproph, comp_value,
a90d965d832a5578dbfc2eadd1617e8cccf25264fw propinfo.size);
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki if (status != PICL_SUCCESS)
7ae4bfcbefd6100bcc6079f530f1df87f4801110fw log_printf("%-23s", no_prop_value, 0);
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki else
7ae4bfcbefd6100bcc6079f530f1df87f4801110fw log_printf("%-23s", comp_value, 0);
03831d35f7499c87d51205817c93e9a8d42c4baestevel free(comp_value);
03831d35f7499c87d51205817c93e9a8d42c4baestevel }
03831d35f7499c87d51205817c93e9a8d42c4baestevel } else
7ae4bfcbefd6100bcc6079f530f1df87f4801110fw log_printf("%-23s", no_prop_value, 0);
03831d35f7499c87d51205817c93e9a8d42c4baestevel
5e3e415a5bedb7bb9ff36b225630e414258e6ecefwstate:
5e3e415a5bedb7bb9ff36b225630e414258e6ecefw status = picl_get_propinfo_by_name(cpuh, PICL_PROP_STATE,
5e3e415a5bedb7bb9ff36b225630e414258e6ecefw &propinfo, &proph);
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (status == PICL_SUCCESS) {
5e3e415a5bedb7bb9ff36b225630e414258e6ecefw status = picl_get_propval(proph, state, sizeof (state));
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (status != PICL_SUCCESS) {
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki log_printf("%-9s", no_prop_value);
03831d35f7499c87d51205817c93e9a8d42c4baestevel } else {
5e3e415a5bedb7bb9ff36b225630e414258e6ecefw log_printf("%-9s", state);
03831d35f7499c87d51205817c93e9a8d42c4baestevel }
03831d35f7499c87d51205817c93e9a8d42c4baestevel } else
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki log_printf("%-9s", no_prop_value);
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baesteveldone:
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf("\n");
03831d35f7499c87d51205817c93e9a8d42c4baestevel return (PICL_WALK_CONTINUE);
03831d35f7499c87d51205817c93e9a8d42c4baestevel}
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevelvoid
03831d35f7499c87d51205817c93e9a8d42c4baestevelsun4v_display_diaginfo(int flag, Prom_node *root, picl_nodehdl_t plafh)
03831d35f7499c87d51205817c93e9a8d42c4baestevel{
03831d35f7499c87d51205817c93e9a8d42c4baestevel#ifdef lint
03831d35f7499c87d51205817c93e9a8d42c4baestevel flag = flag;
03831d35f7499c87d51205817c93e9a8d42c4baestevel root = root;
03831d35f7499c87d51205817c93e9a8d42c4baestevel plafh = plafh;
03831d35f7499c87d51205817c93e9a8d42c4baestevel#endif
03831d35f7499c87d51205817c93e9a8d42c4baestevel /*
03831d35f7499c87d51205817c93e9a8d42c4baestevel * This function is intentionally empty
03831d35f7499c87d51205817c93e9a8d42c4baestevel */
03831d35f7499c87d51205817c93e9a8d42c4baestevel}
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevelvoid
03831d35f7499c87d51205817c93e9a8d42c4baesteveldisplay_boardnum(int num)
03831d35f7499c87d51205817c93e9a8d42c4baestevel{
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf("%2d ", num, 0);
03831d35f7499c87d51205817c93e9a8d42c4baestevel}
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki
d776656fd760148680dc0108975562197d8dfd37mbstatic int
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenkisun4v_disp_env_status()
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki{
d776656fd760148680dc0108975562197d8dfd37mb int exit_code = 0;
d776656fd760148680dc0108975562197d8dfd37mb
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki if (phyplatformh == 0)
d776656fd760148680dc0108975562197d8dfd37mb return (0);
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki log_printf("\n");
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki log_printf("============================");
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki log_printf(" Environmental Status ");
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki log_printf("============================");
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki log_printf("\n");
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki class_node_found = 0;
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki all_status_ok = 1;
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki sun4v_env_print_fan_sensors();
d776656fd760148680dc0108975562197d8dfd37mb exit_code |= (!all_status_ok);
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki class_node_found = 0;
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki all_status_ok = 1;
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki sun4v_env_print_fan_indicators();
d776656fd760148680dc0108975562197d8dfd37mb exit_code |= (!all_status_ok);
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki class_node_found = 0;
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki all_status_ok = 1;
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki sun4v_env_print_temp_sensors();
d776656fd760148680dc0108975562197d8dfd37mb exit_code |= (!all_status_ok);
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki class_node_found = 0;
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki all_status_ok = 1;
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki sun4v_env_print_temp_indicators();
d776656fd760148680dc0108975562197d8dfd37mb exit_code |= (!all_status_ok);
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki class_node_found = 0;
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki all_status_ok = 1;
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki sun4v_env_print_current_sensors();
d776656fd760148680dc0108975562197d8dfd37mb exit_code |= (!all_status_ok);
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki class_node_found = 0;
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki all_status_ok = 1;
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki sun4v_env_print_current_indicators();
d776656fd760148680dc0108975562197d8dfd37mb exit_code |= (!all_status_ok);
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki class_node_found = 0;
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki all_status_ok = 1;
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki sun4v_env_print_voltage_sensors();
d776656fd760148680dc0108975562197d8dfd37mb exit_code |= (!all_status_ok);
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki class_node_found = 0;
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki all_status_ok = 1;
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki sun4v_env_print_voltage_indicators();
d776656fd760148680dc0108975562197d8dfd37mb exit_code |= (!all_status_ok);
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki class_node_found = 0;
d776656fd760148680dc0108975562197d8dfd37mb all_status_ok = 1;
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki sun4v_env_print_LEDs();
d776656fd760148680dc0108975562197d8dfd37mb exit_code |= (!all_status_ok);
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki class_node_found = 0;
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki all_status_ok = 1;
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki sun4v_print_fru_status();
d776656fd760148680dc0108975562197d8dfd37mb exit_code |= (!all_status_ok);
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki class_node_found = 0;
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki sun4v_print_fw_rev();
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki
dc6ca969834c6d8d1aac19aaea19d86c5b73cf75fw class_node_found = 0;
dc6ca969834c6d8d1aac19aaea19d86c5b73cf75fw sun4v_print_openprom_rev();
dc6ca969834c6d8d1aac19aaea19d86c5b73cf75fw
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki sun4v_print_chassis_serial_no();
d776656fd760148680dc0108975562197d8dfd37mb
d776656fd760148680dc0108975562197d8dfd37mb return (exit_code);
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki}
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki/*ARGSUSED*/
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenkistatic int
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenkisun4v_env_print_sensor_callback(picl_nodehdl_t nodeh, void *args)
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki{
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki char val[PICL_PROPNAMELEN_MAX];
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki picl_nodehdl_t parenth;
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki char *names[PARENT_NAMES];
aaba19e23c48a32e927f4e39464be188bfcbef37fw char *base_units[PICL_PROPNAMELEN_MAX];
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki char *loc;
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki int i;
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki char *prop;
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki picl_errno_t err;
dc6ca969834c6d8d1aac19aaea19d86c5b73cf75fw int32_t lo_warning, lo_shutdown, lo_poweroff;
dc6ca969834c6d8d1aac19aaea19d86c5b73cf75fw int32_t hi_warning, hi_shutdown, hi_poweroff;
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki int32_t current_val;
aaba19e23c48a32e927f4e39464be188bfcbef37fw int32_t exponent;
aaba19e23c48a32e927f4e39464be188bfcbef37fw double display_val;
a42ff480eab7fd4f2b53fe8e9bdb1b57f0cf64dafw typedef enum {SENSOR_OK, SENSOR_WARN, SENSOR_FAILED,
a42ff480eab7fd4f2b53fe8e9bdb1b57f0cf64dafw SENSOR_DISABLED, SENSOR_UNKNOWN} sensor_status_t;
a42ff480eab7fd4f2b53fe8e9bdb1b57f0cf64dafw sensor_status_t sensor_status = SENSOR_OK;
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki if (class_node_found == 0) {
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki class_node_found = 1;
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki return (PICL_WALK_TERMINATE);
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki }
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki
a42ff480eab7fd4f2b53fe8e9bdb1b57f0cf64dafw prop = (char *)args;
a42ff480eab7fd4f2b53fe8e9bdb1b57f0cf64dafw if (!prop) {
a42ff480eab7fd4f2b53fe8e9bdb1b57f0cf64dafw sensor_status = SENSOR_UNKNOWN;
a42ff480eab7fd4f2b53fe8e9bdb1b57f0cf64dafw all_status_ok = 0;
a42ff480eab7fd4f2b53fe8e9bdb1b57f0cf64dafw } else {
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki err = picl_get_propval_by_name(nodeh,
a90d965d832a5578dbfc2eadd1617e8cccf25264fw PICL_PROP_OPERATIONAL_STATUS, val,
a90d965d832a5578dbfc2eadd1617e8cccf25264fw sizeof (val));
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki if (err == PICL_SUCCESS) {
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki if (strcmp(val, "disabled") == 0) {
a42ff480eab7fd4f2b53fe8e9bdb1b57f0cf64dafw sensor_status = SENSOR_DISABLED;
a42ff480eab7fd4f2b53fe8e9bdb1b57f0cf64dafw }
a42ff480eab7fd4f2b53fe8e9bdb1b57f0cf64dafw }
a42ff480eab7fd4f2b53fe8e9bdb1b57f0cf64dafw }
a42ff480eab7fd4f2b53fe8e9bdb1b57f0cf64dafw
a42ff480eab7fd4f2b53fe8e9bdb1b57f0cf64dafw if (sensor_status != SENSOR_DISABLED &&
a42ff480eab7fd4f2b53fe8e9bdb1b57f0cf64dafw sensor_status != SENSOR_UNKNOWN) {
a42ff480eab7fd4f2b53fe8e9bdb1b57f0cf64dafw if (picl_get_propval_by_name(nodeh, prop, &current_val,
a42ff480eab7fd4f2b53fe8e9bdb1b57f0cf64dafw sizeof (current_val)) != PICL_SUCCESS) {
a42ff480eab7fd4f2b53fe8e9bdb1b57f0cf64dafw sensor_status = SENSOR_UNKNOWN;
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki } else {
dc6ca969834c6d8d1aac19aaea19d86c5b73cf75fw if (picl_get_propval_by_name(nodeh,
dc6ca969834c6d8d1aac19aaea19d86c5b73cf75fw PICL_PROP_LOW_WARNING,
dc6ca969834c6d8d1aac19aaea19d86c5b73cf75fw &lo_warning, sizeof (lo_warning)) != PICL_SUCCESS)
dc6ca969834c6d8d1aac19aaea19d86c5b73cf75fw lo_warning = INVALID_THRESHOLD;
dc6ca969834c6d8d1aac19aaea19d86c5b73cf75fw if (picl_get_propval_by_name(nodeh,
dc6ca969834c6d8d1aac19aaea19d86c5b73cf75fw PICL_PROP_LOW_SHUTDOWN,
dc6ca969834c6d8d1aac19aaea19d86c5b73cf75fw &lo_shutdown, sizeof (lo_shutdown)) != PICL_SUCCESS)
dc6ca969834c6d8d1aac19aaea19d86c5b73cf75fw lo_shutdown = INVALID_THRESHOLD;
dc6ca969834c6d8d1aac19aaea19d86c5b73cf75fw if (picl_get_propval_by_name(nodeh,
dc6ca969834c6d8d1aac19aaea19d86c5b73cf75fw PICL_PROP_LOW_POWER_OFF,
dc6ca969834c6d8d1aac19aaea19d86c5b73cf75fw &lo_poweroff, sizeof (lo_poweroff)) != PICL_SUCCESS)
dc6ca969834c6d8d1aac19aaea19d86c5b73cf75fw lo_poweroff = INVALID_THRESHOLD;
dc6ca969834c6d8d1aac19aaea19d86c5b73cf75fw if (picl_get_propval_by_name(nodeh,
dc6ca969834c6d8d1aac19aaea19d86c5b73cf75fw PICL_PROP_HIGH_WARNING,
dc6ca969834c6d8d1aac19aaea19d86c5b73cf75fw &hi_warning, sizeof (hi_warning)) != PICL_SUCCESS)
dc6ca969834c6d8d1aac19aaea19d86c5b73cf75fw hi_warning = INVALID_THRESHOLD;
dc6ca969834c6d8d1aac19aaea19d86c5b73cf75fw if (picl_get_propval_by_name(nodeh,
dc6ca969834c6d8d1aac19aaea19d86c5b73cf75fw PICL_PROP_HIGH_SHUTDOWN,
dc6ca969834c6d8d1aac19aaea19d86c5b73cf75fw &hi_shutdown, sizeof (hi_shutdown)) != PICL_SUCCESS)
dc6ca969834c6d8d1aac19aaea19d86c5b73cf75fw hi_shutdown = INVALID_THRESHOLD;
dc6ca969834c6d8d1aac19aaea19d86c5b73cf75fw if (picl_get_propval_by_name(nodeh,
dc6ca969834c6d8d1aac19aaea19d86c5b73cf75fw PICL_PROP_HIGH_POWER_OFF,
dc6ca969834c6d8d1aac19aaea19d86c5b73cf75fw &hi_poweroff, sizeof (hi_poweroff)) != PICL_SUCCESS)
dc6ca969834c6d8d1aac19aaea19d86c5b73cf75fw hi_poweroff = INVALID_THRESHOLD;
dc6ca969834c6d8d1aac19aaea19d86c5b73cf75fw
dc6ca969834c6d8d1aac19aaea19d86c5b73cf75fw if ((lo_poweroff != INVALID_THRESHOLD &&
dc6ca969834c6d8d1aac19aaea19d86c5b73cf75fw current_val <= lo_poweroff) ||
dc6ca969834c6d8d1aac19aaea19d86c5b73cf75fw (hi_poweroff != INVALID_THRESHOLD &&
dc6ca969834c6d8d1aac19aaea19d86c5b73cf75fw current_val >= hi_poweroff)) {
dc6ca969834c6d8d1aac19aaea19d86c5b73cf75fw sensor_status = SENSOR_FAILED;
dc6ca969834c6d8d1aac19aaea19d86c5b73cf75fw } else if ((lo_shutdown != INVALID_THRESHOLD &&
dc6ca969834c6d8d1aac19aaea19d86c5b73cf75fw current_val <= lo_shutdown) ||
dc6ca969834c6d8d1aac19aaea19d86c5b73cf75fw (hi_shutdown != INVALID_THRESHOLD &&
dc6ca969834c6d8d1aac19aaea19d86c5b73cf75fw current_val >= hi_shutdown)) {
dc6ca969834c6d8d1aac19aaea19d86c5b73cf75fw sensor_status = SENSOR_FAILED;
dc6ca969834c6d8d1aac19aaea19d86c5b73cf75fw } else if ((lo_warning != INVALID_THRESHOLD &&
dc6ca969834c6d8d1aac19aaea19d86c5b73cf75fw current_val <= lo_warning) ||
dc6ca969834c6d8d1aac19aaea19d86c5b73cf75fw (hi_warning != INVALID_THRESHOLD &&
dc6ca969834c6d8d1aac19aaea19d86c5b73cf75fw current_val >= hi_warning)) {
dc6ca969834c6d8d1aac19aaea19d86c5b73cf75fw sensor_status = SENSOR_WARN;
dc6ca969834c6d8d1aac19aaea19d86c5b73cf75fw } else {
dc6ca969834c6d8d1aac19aaea19d86c5b73cf75fw sensor_status = SENSOR_OK;
dc6ca969834c6d8d1aac19aaea19d86c5b73cf75fw }
a42ff480eab7fd4f2b53fe8e9bdb1b57f0cf64dafw }
a42ff480eab7fd4f2b53fe8e9bdb1b57f0cf64dafw }
a42ff480eab7fd4f2b53fe8e9bdb1b57f0cf64dafw
a42ff480eab7fd4f2b53fe8e9bdb1b57f0cf64dafw if (syserrlog == 0) {
a42ff480eab7fd4f2b53fe8e9bdb1b57f0cf64dafw if (sensor_status != SENSOR_OK && all_status_ok == 1) {
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki all_status_ok = 0;
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki return (PICL_WALK_TERMINATE);
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki }
a42ff480eab7fd4f2b53fe8e9bdb1b57f0cf64dafw if (sensor_status == SENSOR_OK) {
a42ff480eab7fd4f2b53fe8e9bdb1b57f0cf64dafw return (PICL_WALK_CONTINUE);
a42ff480eab7fd4f2b53fe8e9bdb1b57f0cf64dafw }
7ae8c7a895927e389aea157a7b04d5eb606319fbMichael Bergknoff } else {
7ae8c7a895927e389aea157a7b04d5eb606319fbMichael Bergknoff if (sensor_status != SENSOR_OK && all_status_ok == 1) {
7ae8c7a895927e389aea157a7b04d5eb606319fbMichael Bergknoff all_status_ok = 0;
7ae8c7a895927e389aea157a7b04d5eb606319fbMichael Bergknoff }
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki }
a42ff480eab7fd4f2b53fe8e9bdb1b57f0cf64dafw
a42ff480eab7fd4f2b53fe8e9bdb1b57f0cf64dafw /*
a42ff480eab7fd4f2b53fe8e9bdb1b57f0cf64dafw * If we're here then prtdiag was invoked with "-v" or we have
a42ff480eab7fd4f2b53fe8e9bdb1b57f0cf64dafw * a sensor that is beyond a threshold, so give them a book to
a42ff480eab7fd4f2b53fe8e9bdb1b57f0cf64dafw * read instead of the Cliff Notes.
a42ff480eab7fd4f2b53fe8e9bdb1b57f0cf64dafw */
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki err = picl_get_propval_by_name(nodeh, PICL_PROP_PARENT, &parenth,
a90d965d832a5578dbfc2eadd1617e8cccf25264fw sizeof (parenth));
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki if (err != PICL_SUCCESS) {
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki log_printf("\n");
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki return (PICL_WALK_CONTINUE);
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki }
4c5e0fde93352f23abc94e445999402e38b91268vivek
a42ff480eab7fd4f2b53fe8e9bdb1b57f0cf64dafw /* gather up the path name for the sensor */
a42ff480eab7fd4f2b53fe8e9bdb1b57f0cf64dafw if ((loc = (char *)malloc(PICL_PROPNAMELEN_MAX*PARENT_NAMES)) != NULL) {
a42ff480eab7fd4f2b53fe8e9bdb1b57f0cf64dafw for (i = 0; i < PARENT_NAMES; i++) {
a42ff480eab7fd4f2b53fe8e9bdb1b57f0cf64dafw if ((names[i] = (char *)malloc(PICL_PROPNAMELEN_MAX)) ==
a42ff480eab7fd4f2b53fe8e9bdb1b57f0cf64dafw NULL) {
a42ff480eab7fd4f2b53fe8e9bdb1b57f0cf64dafw while (--i > -1)
a42ff480eab7fd4f2b53fe8e9bdb1b57f0cf64dafw free(names[i]);
a42ff480eab7fd4f2b53fe8e9bdb1b57f0cf64dafw free(loc);
a42ff480eab7fd4f2b53fe8e9bdb1b57f0cf64dafw loc = NULL;
a42ff480eab7fd4f2b53fe8e9bdb1b57f0cf64dafw }
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki }
a42ff480eab7fd4f2b53fe8e9bdb1b57f0cf64dafw }
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki i = 0;
a42ff480eab7fd4f2b53fe8e9bdb1b57f0cf64dafw if (loc != 0) {
a42ff480eab7fd4f2b53fe8e9bdb1b57f0cf64dafw while (err == PICL_SUCCESS) {
a42ff480eab7fd4f2b53fe8e9bdb1b57f0cf64dafw if (parenth == phyplatformh)
a42ff480eab7fd4f2b53fe8e9bdb1b57f0cf64dafw break;
a42ff480eab7fd4f2b53fe8e9bdb1b57f0cf64dafw err = picl_get_propval_by_name(parenth, PICL_PROP_NAME,
a42ff480eab7fd4f2b53fe8e9bdb1b57f0cf64dafw names[i++], PICL_PROPNAMELEN_MAX);
a42ff480eab7fd4f2b53fe8e9bdb1b57f0cf64dafw if (err != PICL_SUCCESS) {
a42ff480eab7fd4f2b53fe8e9bdb1b57f0cf64dafw i--;
a42ff480eab7fd4f2b53fe8e9bdb1b57f0cf64dafw break;
a42ff480eab7fd4f2b53fe8e9bdb1b57f0cf64dafw }
a42ff480eab7fd4f2b53fe8e9bdb1b57f0cf64dafw if (i == PARENT_NAMES)
a42ff480eab7fd4f2b53fe8e9bdb1b57f0cf64dafw break;
a42ff480eab7fd4f2b53fe8e9bdb1b57f0cf64dafw err = picl_get_propval_by_name(parenth,
a42ff480eab7fd4f2b53fe8e9bdb1b57f0cf64dafw PICL_PROP_PARENT, &parenth, sizeof (parenth));
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki }
a42ff480eab7fd4f2b53fe8e9bdb1b57f0cf64dafw loc[0] = '\0';
a42ff480eab7fd4f2b53fe8e9bdb1b57f0cf64dafw if (--i > -1) {
a42ff480eab7fd4f2b53fe8e9bdb1b57f0cf64dafw (void) strlcat(loc, names[i],
a42ff480eab7fd4f2b53fe8e9bdb1b57f0cf64dafw PICL_PROPNAMELEN_MAX * PARENT_NAMES);
a42ff480eab7fd4f2b53fe8e9bdb1b57f0cf64dafw }
a42ff480eab7fd4f2b53fe8e9bdb1b57f0cf64dafw while (--i > -1) {
a42ff480eab7fd4f2b53fe8e9bdb1b57f0cf64dafw (void) strlcat(loc, "/", PICL_PROPNAMELEN_MAX *
a42ff480eab7fd4f2b53fe8e9bdb1b57f0cf64dafw PARENT_NAMES);
a42ff480eab7fd4f2b53fe8e9bdb1b57f0cf64dafw (void) strlcat(loc, names[i],
a42ff480eab7fd4f2b53fe8e9bdb1b57f0cf64dafw PICL_PROPNAMELEN_MAX * PARENT_NAMES);
a42ff480eab7fd4f2b53fe8e9bdb1b57f0cf64dafw }
5e3e415a5bedb7bb9ff36b225630e414258e6ecefw log_printf("%-35s", loc);
a42ff480eab7fd4f2b53fe8e9bdb1b57f0cf64dafw for (i = 0; i < PARENT_NAMES; i++)
a42ff480eab7fd4f2b53fe8e9bdb1b57f0cf64dafw free(names[i]);
a42ff480eab7fd4f2b53fe8e9bdb1b57f0cf64dafw free(loc);
a42ff480eab7fd4f2b53fe8e9bdb1b57f0cf64dafw } else {
5e3e415a5bedb7bb9ff36b225630e414258e6ecefw log_printf("%-35s", " ");
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki }
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki err = picl_get_propval_by_name(nodeh, PICL_PROP_LABEL, val,
a90d965d832a5578dbfc2eadd1617e8cccf25264fw sizeof (val));
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki if (err == PICL_SUCCESS)
bbda49b50a1377654c8b28c2e87b39842f80ffdeSree Vemuri log_printf("%-19s", val);
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki
a42ff480eab7fd4f2b53fe8e9bdb1b57f0cf64dafw /*
a42ff480eab7fd4f2b53fe8e9bdb1b57f0cf64dafw * Get the exponent if present, and do a little math so that
a42ff480eab7fd4f2b53fe8e9bdb1b57f0cf64dafw * if we need to we can print a normalized value for the
a42ff480eab7fd4f2b53fe8e9bdb1b57f0cf64dafw * sensor reading.
a42ff480eab7fd4f2b53fe8e9bdb1b57f0cf64dafw */
aaba19e23c48a32e927f4e39464be188bfcbef37fw if (picl_get_propval_by_name(nodeh, PICL_PROP_EXPONENT,
aaba19e23c48a32e927f4e39464be188bfcbef37fw &exponent, sizeof (exponent)) != PICL_SUCCESS)
aaba19e23c48a32e927f4e39464be188bfcbef37fw exponent = 0;
aaba19e23c48a32e927f4e39464be188bfcbef37fw if (exponent == 0)
aaba19e23c48a32e927f4e39464be188bfcbef37fw display_val = (double)current_val;
dc6ca969834c6d8d1aac19aaea19d86c5b73cf75fw else {
aaba19e23c48a32e927f4e39464be188bfcbef37fw display_val = (double)current_val *
aaba19e23c48a32e927f4e39464be188bfcbef37fw pow((double)10, (double)exponent);
dc6ca969834c6d8d1aac19aaea19d86c5b73cf75fw
dc6ca969834c6d8d1aac19aaea19d86c5b73cf75fw /*
dc6ca969834c6d8d1aac19aaea19d86c5b73cf75fw * Sometimes ILOM will scale a sensor reading but
dc6ca969834c6d8d1aac19aaea19d86c5b73cf75fw * there will be nothing to the right of the decimal
dc6ca969834c6d8d1aac19aaea19d86c5b73cf75fw * once that value is normalized. Setting the
dc6ca969834c6d8d1aac19aaea19d86c5b73cf75fw * exponent to zero will prevent the printf below
dc6ca969834c6d8d1aac19aaea19d86c5b73cf75fw * from printing extraneous zeros. Otherwise a
dc6ca969834c6d8d1aac19aaea19d86c5b73cf75fw * negative exponent is used to set the precision
dc6ca969834c6d8d1aac19aaea19d86c5b73cf75fw * for the printf.
dc6ca969834c6d8d1aac19aaea19d86c5b73cf75fw */
dc6ca969834c6d8d1aac19aaea19d86c5b73cf75fw if ((int)display_val == display_val || exponent > 0)
dc6ca969834c6d8d1aac19aaea19d86c5b73cf75fw exponent = 0;
dc6ca969834c6d8d1aac19aaea19d86c5b73cf75fw }
dc6ca969834c6d8d1aac19aaea19d86c5b73cf75fw
a42ff480eab7fd4f2b53fe8e9bdb1b57f0cf64dafw err = picl_get_propval_by_name(nodeh, PICL_PROP_BASE_UNITS,
a42ff480eab7fd4f2b53fe8e9bdb1b57f0cf64dafw base_units, sizeof (base_units));
aaba19e23c48a32e927f4e39464be188bfcbef37fw if (err != PICL_SUCCESS)
aaba19e23c48a32e927f4e39464be188bfcbef37fw base_units[0] = '\0';
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki
a42ff480eab7fd4f2b53fe8e9bdb1b57f0cf64dafw switch (sensor_status) {
a42ff480eab7fd4f2b53fe8e9bdb1b57f0cf64dafw case SENSOR_FAILED:
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki log_printf("%-s", "failed (");
aaba19e23c48a32e927f4e39464be188bfcbef37fw log_printf("%-.*f", abs(exponent), display_val);
aaba19e23c48a32e927f4e39464be188bfcbef37fw log_printf("%-s %s", base_units, ")");
a42ff480eab7fd4f2b53fe8e9bdb1b57f0cf64dafw break;
a42ff480eab7fd4f2b53fe8e9bdb1b57f0cf64dafw case SENSOR_WARN:
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki log_printf("%-s", "warning (");
aaba19e23c48a32e927f4e39464be188bfcbef37fw log_printf("%-.*f", abs(exponent), display_val);
aaba19e23c48a32e927f4e39464be188bfcbef37fw log_printf("%-s %s", base_units, ")");
a42ff480eab7fd4f2b53fe8e9bdb1b57f0cf64dafw break;
a42ff480eab7fd4f2b53fe8e9bdb1b57f0cf64dafw case SENSOR_DISABLED:
a42ff480eab7fd4f2b53fe8e9bdb1b57f0cf64dafw log_printf("%-s", "disabled");
a42ff480eab7fd4f2b53fe8e9bdb1b57f0cf64dafw break;
a42ff480eab7fd4f2b53fe8e9bdb1b57f0cf64dafw case SENSOR_OK:
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki log_printf("%-s", "ok");
a42ff480eab7fd4f2b53fe8e9bdb1b57f0cf64dafw break;
a42ff480eab7fd4f2b53fe8e9bdb1b57f0cf64dafw default:
a42ff480eab7fd4f2b53fe8e9bdb1b57f0cf64dafw log_printf("%-s", "unknown");
a42ff480eab7fd4f2b53fe8e9bdb1b57f0cf64dafw break;
a42ff480eab7fd4f2b53fe8e9bdb1b57f0cf64dafw }
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki log_printf("\n");
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki return (PICL_WALK_CONTINUE);
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki}
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki/*ARGSUSED*/
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenkistatic int
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenkisun4v_env_print_indicator_callback(picl_nodehdl_t nodeh, void *args)
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki{
a42ff480eab7fd4f2b53fe8e9bdb1b57f0cf64dafw char current_val[PICL_PROPNAMELEN_MAX];
a42ff480eab7fd4f2b53fe8e9bdb1b57f0cf64dafw char expected_val[PICL_PROPNAMELEN_MAX];
a42ff480eab7fd4f2b53fe8e9bdb1b57f0cf64dafw char label[PICL_PROPNAMELEN_MAX];
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki picl_nodehdl_t parenth;
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki char *names[PARENT_NAMES];
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki char *loc;
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki int i = 0;
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki char *prop = (char *)args;
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki picl_errno_t err = PICL_SUCCESS;
a42ff480eab7fd4f2b53fe8e9bdb1b57f0cf64dafw typedef enum {SENSOR_OK, SENSOR_WARN, SENSOR_FAILED,
a42ff480eab7fd4f2b53fe8e9bdb1b57f0cf64dafw SENSOR_DISABLED, SENSOR_UNKNOWN} sensor_status_t;
a42ff480eab7fd4f2b53fe8e9bdb1b57f0cf64dafw sensor_status_t sensor_status = SENSOR_OK;
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki if (class_node_found == 0) {
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki class_node_found = 1;
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki return (PICL_WALK_TERMINATE);
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki }
a42ff480eab7fd4f2b53fe8e9bdb1b57f0cf64dafw
a42ff480eab7fd4f2b53fe8e9bdb1b57f0cf64dafw prop = (char *)args;
a42ff480eab7fd4f2b53fe8e9bdb1b57f0cf64dafw if (!prop) {
a42ff480eab7fd4f2b53fe8e9bdb1b57f0cf64dafw sensor_status = SENSOR_UNKNOWN;
a42ff480eab7fd4f2b53fe8e9bdb1b57f0cf64dafw all_status_ok = 0;
a42ff480eab7fd4f2b53fe8e9bdb1b57f0cf64dafw } else {
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki err = picl_get_propval_by_name(nodeh,
a42ff480eab7fd4f2b53fe8e9bdb1b57f0cf64dafw PICL_PROP_OPERATIONAL_STATUS, current_val,
a42ff480eab7fd4f2b53fe8e9bdb1b57f0cf64dafw sizeof (current_val));
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki if (err == PICL_SUCCESS) {
a42ff480eab7fd4f2b53fe8e9bdb1b57f0cf64dafw if (strcmp(current_val, "disabled") == 0) {
a42ff480eab7fd4f2b53fe8e9bdb1b57f0cf64dafw sensor_status = SENSOR_DISABLED;
a42ff480eab7fd4f2b53fe8e9bdb1b57f0cf64dafw }
a42ff480eab7fd4f2b53fe8e9bdb1b57f0cf64dafw }
a42ff480eab7fd4f2b53fe8e9bdb1b57f0cf64dafw }
a42ff480eab7fd4f2b53fe8e9bdb1b57f0cf64dafw
a42ff480eab7fd4f2b53fe8e9bdb1b57f0cf64dafw if (sensor_status != SENSOR_DISABLED &&
a42ff480eab7fd4f2b53fe8e9bdb1b57f0cf64dafw sensor_status != SENSOR_UNKNOWN) {
a42ff480eab7fd4f2b53fe8e9bdb1b57f0cf64dafw if (picl_get_propval_by_name(nodeh, prop, &current_val,
a42ff480eab7fd4f2b53fe8e9bdb1b57f0cf64dafw sizeof (current_val)) != PICL_SUCCESS) {
a42ff480eab7fd4f2b53fe8e9bdb1b57f0cf64dafw (void) strlcpy(current_val, "unknown",
a42ff480eab7fd4f2b53fe8e9bdb1b57f0cf64dafw sizeof (current_val));
a42ff480eab7fd4f2b53fe8e9bdb1b57f0cf64dafw sensor_status = SENSOR_UNKNOWN;
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki } else {
a42ff480eab7fd4f2b53fe8e9bdb1b57f0cf64dafw if (picl_get_propval_by_name(nodeh, PICL_PROP_EXPECTED,
7ae8c7a895927e389aea157a7b04d5eb606319fbMichael Bergknoff &expected_val, sizeof (expected_val)) ==
a42ff480eab7fd4f2b53fe8e9bdb1b57f0cf64dafw PICL_SUCCESS) {
a42ff480eab7fd4f2b53fe8e9bdb1b57f0cf64dafw if (strncmp(current_val, expected_val,
a42ff480eab7fd4f2b53fe8e9bdb1b57f0cf64dafw sizeof (current_val)) == 0) {
a42ff480eab7fd4f2b53fe8e9bdb1b57f0cf64dafw sensor_status = SENSOR_OK;
a42ff480eab7fd4f2b53fe8e9bdb1b57f0cf64dafw } else {
a42ff480eab7fd4f2b53fe8e9bdb1b57f0cf64dafw sensor_status = SENSOR_FAILED;
a42ff480eab7fd4f2b53fe8e9bdb1b57f0cf64dafw }
a42ff480eab7fd4f2b53fe8e9bdb1b57f0cf64dafw }
a42ff480eab7fd4f2b53fe8e9bdb1b57f0cf64dafw }
a42ff480eab7fd4f2b53fe8e9bdb1b57f0cf64dafw }
a42ff480eab7fd4f2b53fe8e9bdb1b57f0cf64dafw
a42ff480eab7fd4f2b53fe8e9bdb1b57f0cf64dafw if (syserrlog == 0) {
a42ff480eab7fd4f2b53fe8e9bdb1b57f0cf64dafw if (sensor_status != SENSOR_OK && all_status_ok == 1) {
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki all_status_ok = 0;
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki return (PICL_WALK_TERMINATE);
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki }
a42ff480eab7fd4f2b53fe8e9bdb1b57f0cf64dafw if (sensor_status == SENSOR_OK) {
a42ff480eab7fd4f2b53fe8e9bdb1b57f0cf64dafw return (PICL_WALK_CONTINUE);
a42ff480eab7fd4f2b53fe8e9bdb1b57f0cf64dafw }
7ae8c7a895927e389aea157a7b04d5eb606319fbMichael Bergknoff } else {
7ae8c7a895927e389aea157a7b04d5eb606319fbMichael Bergknoff if (sensor_status != SENSOR_OK && all_status_ok == 1) {
7ae8c7a895927e389aea157a7b04d5eb606319fbMichael Bergknoff all_status_ok = 0;
7ae8c7a895927e389aea157a7b04d5eb606319fbMichael Bergknoff }
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki }
a42ff480eab7fd4f2b53fe8e9bdb1b57f0cf64dafw
a42ff480eab7fd4f2b53fe8e9bdb1b57f0cf64dafw /*
a42ff480eab7fd4f2b53fe8e9bdb1b57f0cf64dafw * If we're here then prtdiag was invoked with "-v" or we have
a42ff480eab7fd4f2b53fe8e9bdb1b57f0cf64dafw * a sensor that is beyond a threshold, so give them a book to
a42ff480eab7fd4f2b53fe8e9bdb1b57f0cf64dafw * read instead of the Cliff Notes.
a42ff480eab7fd4f2b53fe8e9bdb1b57f0cf64dafw */
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki err = picl_get_propval_by_name(nodeh, PICL_PROP_PARENT, &parenth,
a90d965d832a5578dbfc2eadd1617e8cccf25264fw sizeof (parenth));
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki if (err != PICL_SUCCESS) {
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki log_printf("\n");
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki return (PICL_WALK_CONTINUE);
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki }
a42ff480eab7fd4f2b53fe8e9bdb1b57f0cf64dafw if ((loc = (char *)malloc(PICL_PROPNAMELEN_MAX*PARENT_NAMES)) != NULL) {
a42ff480eab7fd4f2b53fe8e9bdb1b57f0cf64dafw for (i = 0; i < PARENT_NAMES; i++) {
a42ff480eab7fd4f2b53fe8e9bdb1b57f0cf64dafw if ((names[i] = (char *)malloc(PICL_PROPNAMELEN_MAX)) ==
a42ff480eab7fd4f2b53fe8e9bdb1b57f0cf64dafw NULL) {
a42ff480eab7fd4f2b53fe8e9bdb1b57f0cf64dafw while (--i > -1)
a42ff480eab7fd4f2b53fe8e9bdb1b57f0cf64dafw free(names[i]);
a42ff480eab7fd4f2b53fe8e9bdb1b57f0cf64dafw free(loc);
a42ff480eab7fd4f2b53fe8e9bdb1b57f0cf64dafw loc = NULL;
a42ff480eab7fd4f2b53fe8e9bdb1b57f0cf64dafw }
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki }
a42ff480eab7fd4f2b53fe8e9bdb1b57f0cf64dafw }
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki i = 0;
a42ff480eab7fd4f2b53fe8e9bdb1b57f0cf64dafw if (loc) {
a42ff480eab7fd4f2b53fe8e9bdb1b57f0cf64dafw while (err == PICL_SUCCESS) {
a42ff480eab7fd4f2b53fe8e9bdb1b57f0cf64dafw if (parenth == phyplatformh)
a42ff480eab7fd4f2b53fe8e9bdb1b57f0cf64dafw break;
a42ff480eab7fd4f2b53fe8e9bdb1b57f0cf64dafw err = picl_get_propval_by_name(parenth, PICL_PROP_NAME,
a42ff480eab7fd4f2b53fe8e9bdb1b57f0cf64dafw names[i++], PICL_PROPNAMELEN_MAX);
a42ff480eab7fd4f2b53fe8e9bdb1b57f0cf64dafw if (err != PICL_SUCCESS) {
a42ff480eab7fd4f2b53fe8e9bdb1b57f0cf64dafw i--;
a42ff480eab7fd4f2b53fe8e9bdb1b57f0cf64dafw break;
a42ff480eab7fd4f2b53fe8e9bdb1b57f0cf64dafw }
a42ff480eab7fd4f2b53fe8e9bdb1b57f0cf64dafw if (i == PARENT_NAMES)
a42ff480eab7fd4f2b53fe8e9bdb1b57f0cf64dafw break;
a42ff480eab7fd4f2b53fe8e9bdb1b57f0cf64dafw err = picl_get_propval_by_name(parenth,
a42ff480eab7fd4f2b53fe8e9bdb1b57f0cf64dafw PICL_PROP_PARENT, &parenth, sizeof (parenth));
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki }
a42ff480eab7fd4f2b53fe8e9bdb1b57f0cf64dafw loc[0] = '\0';
a42ff480eab7fd4f2b53fe8e9bdb1b57f0cf64dafw if (--i > -1) {
a42ff480eab7fd4f2b53fe8e9bdb1b57f0cf64dafw (void) strlcat(loc, names[i],
a42ff480eab7fd4f2b53fe8e9bdb1b57f0cf64dafw PICL_PROPNAMELEN_MAX * PARENT_NAMES);
a42ff480eab7fd4f2b53fe8e9bdb1b57f0cf64dafw }
a42ff480eab7fd4f2b53fe8e9bdb1b57f0cf64dafw while (--i > -1) {
a42ff480eab7fd4f2b53fe8e9bdb1b57f0cf64dafw (void) strlcat(loc, "/", PICL_PROPNAMELEN_MAX *
a42ff480eab7fd4f2b53fe8e9bdb1b57f0cf64dafw PARENT_NAMES);
a42ff480eab7fd4f2b53fe8e9bdb1b57f0cf64dafw (void) strlcat(loc, names[i],
a42ff480eab7fd4f2b53fe8e9bdb1b57f0cf64dafw PICL_PROPNAMELEN_MAX * PARENT_NAMES);
a42ff480eab7fd4f2b53fe8e9bdb1b57f0cf64dafw }
5e3e415a5bedb7bb9ff36b225630e414258e6ecefw log_printf("%-35s", loc);
a42ff480eab7fd4f2b53fe8e9bdb1b57f0cf64dafw for (i = 0; i < PARENT_NAMES; i++)
a42ff480eab7fd4f2b53fe8e9bdb1b57f0cf64dafw free(names[i]);
a42ff480eab7fd4f2b53fe8e9bdb1b57f0cf64dafw free(loc);
a42ff480eab7fd4f2b53fe8e9bdb1b57f0cf64dafw } else {
5e3e415a5bedb7bb9ff36b225630e414258e6ecefw log_printf("%-35s", "");
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki }
a42ff480eab7fd4f2b53fe8e9bdb1b57f0cf64dafw
a42ff480eab7fd4f2b53fe8e9bdb1b57f0cf64dafw err = picl_get_propval_by_name(nodeh, PICL_PROP_LABEL, label,
a42ff480eab7fd4f2b53fe8e9bdb1b57f0cf64dafw sizeof (label));
a42ff480eab7fd4f2b53fe8e9bdb1b57f0cf64dafw if (err != PICL_SUCCESS)
a42ff480eab7fd4f2b53fe8e9bdb1b57f0cf64dafw (void) strlcpy(label, "", sizeof (label));
bbda49b50a1377654c8b28c2e87b39842f80ffdeSree Vemuri log_printf("%-19s", label);
a42ff480eab7fd4f2b53fe8e9bdb1b57f0cf64dafw
a42ff480eab7fd4f2b53fe8e9bdb1b57f0cf64dafw log_printf("%-8s", current_val);
a42ff480eab7fd4f2b53fe8e9bdb1b57f0cf64dafw
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki log_printf("\n");
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki return (PICL_WALK_CONTINUE);
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki}
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenkistatic void
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenkisun4v_env_print_fan_sensors()
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki{
bbda49b50a1377654c8b28c2e87b39842f80ffdeSree Vemuri char *fmt = "%-34s %-18s %-10s\n";
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki /*
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki * If there isn't any fan sensor node, return now.
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki */
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki (void) picl_walk_tree_by_class(phyplatformh,
a42ff480eab7fd4f2b53fe8e9bdb1b57f0cf64dafw PICL_CLASS_RPM_SENSOR, (void *)PICL_PROP_SPEED,
a90d965d832a5578dbfc2eadd1617e8cccf25264fw sun4v_env_print_sensor_callback);
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki if (!class_node_found)
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki return;
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki log_printf("Fan sensors:\n");
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki if (syserrlog == 0) {
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki (void) picl_walk_tree_by_class(phyplatformh,
a90d965d832a5578dbfc2eadd1617e8cccf25264fw PICL_CLASS_RPM_SENSOR,
a42ff480eab7fd4f2b53fe8e9bdb1b57f0cf64dafw PICL_PROP_SPEED, sun4v_env_print_sensor_callback);
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki if (all_status_ok) {
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki log_printf("All fan sensors are OK.\n");
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki return;
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki }
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki }
5e3e415a5bedb7bb9ff36b225630e414258e6ecefw log_printf("-------------------------------------------------"
bbda49b50a1377654c8b28c2e87b39842f80ffdeSree Vemuri "---------------\n");
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki log_printf(fmt, "Location", "Sensor", "Status", 0);
5e3e415a5bedb7bb9ff36b225630e414258e6ecefw log_printf("-------------------------------------------------"
bbda49b50a1377654c8b28c2e87b39842f80ffdeSree Vemuri "---------------\n");
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki (void) picl_walk_tree_by_class(phyplatformh, PICL_CLASS_RPM_SENSOR,
a90d965d832a5578dbfc2eadd1617e8cccf25264fw PICL_PROP_SPEED, sun4v_env_print_sensor_callback);
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki}
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenkistatic void
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenkisun4v_env_print_fan_indicators()
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki{
bbda49b50a1377654c8b28c2e87b39842f80ffdeSree Vemuri char *fmt = "%-34s %-18s %-10s\n";
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki (void) picl_walk_tree_by_class(phyplatformh,
a42ff480eab7fd4f2b53fe8e9bdb1b57f0cf64dafw PICL_CLASS_RPM_INDICATOR, (void *)PICL_PROP_CONDITION,
a90d965d832a5578dbfc2eadd1617e8cccf25264fw sun4v_env_print_indicator_callback);
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki if (!class_node_found)
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki return;
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki log_printf("\nFan indicators:\n");
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki if (syserrlog == 0) {
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki (void) picl_walk_tree_by_class(phyplatformh,
a90d965d832a5578dbfc2eadd1617e8cccf25264fw PICL_CLASS_RPM_INDICATOR,
a42ff480eab7fd4f2b53fe8e9bdb1b57f0cf64dafw (void *)PICL_PROP_CONDITION,
a42ff480eab7fd4f2b53fe8e9bdb1b57f0cf64dafw sun4v_env_print_indicator_callback);
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki if (all_status_ok) {
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki log_printf("All fan indicators are OK.\n");
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki return;
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki }
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki }
5e3e415a5bedb7bb9ff36b225630e414258e6ecefw log_printf("-------------------------------------------------"
bbda49b50a1377654c8b28c2e87b39842f80ffdeSree Vemuri "---------------\n");
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki log_printf(fmt, "Location", "Sensor", "Condition", 0);
5e3e415a5bedb7bb9ff36b225630e414258e6ecefw log_printf("-------------------------------------------------"
bbda49b50a1377654c8b28c2e87b39842f80ffdeSree Vemuri "---------------\n");
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki (void) picl_walk_tree_by_class(phyplatformh, PICL_CLASS_RPM_INDICATOR,
aaba19e23c48a32e927f4e39464be188bfcbef37fw (void *)PICL_PROP_CONDITION, sun4v_env_print_indicator_callback);
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki}
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenkistatic void
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenkisun4v_env_print_temp_sensors()
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki{
bbda49b50a1377654c8b28c2e87b39842f80ffdeSree Vemuri char *fmt = "%-34s %-18s %-10s\n";
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki (void) picl_walk_tree_by_class(phyplatformh,
a90d965d832a5578dbfc2eadd1617e8cccf25264fw PICL_CLASS_TEMPERATURE_SENSOR,
a90d965d832a5578dbfc2eadd1617e8cccf25264fw (void *)PICL_PROP_TEMPERATURE,
a90d965d832a5578dbfc2eadd1617e8cccf25264fw sun4v_env_print_sensor_callback);
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki if (!class_node_found)
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki return;
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki log_printf("\nTemperature sensors:\n");
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki if (syserrlog == 0) {
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki (void) picl_walk_tree_by_class(phyplatformh,
a90d965d832a5578dbfc2eadd1617e8cccf25264fw PICL_CLASS_TEMPERATURE_SENSOR,
a42ff480eab7fd4f2b53fe8e9bdb1b57f0cf64dafw PICL_PROP_TEMPERATURE, sun4v_env_print_sensor_callback);
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki if (all_status_ok) {
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki log_printf("All temperature sensors are OK.\n");
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki return;
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki }
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki }
5e3e415a5bedb7bb9ff36b225630e414258e6ecefw log_printf("-------------------------------------------------"
bbda49b50a1377654c8b28c2e87b39842f80ffdeSree Vemuri "---------------\n");
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki log_printf(fmt, "Location", "Sensor", "Status", 0);
5e3e415a5bedb7bb9ff36b225630e414258e6ecefw log_printf("-------------------------------------------------"
bbda49b50a1377654c8b28c2e87b39842f80ffdeSree Vemuri "---------------\n");
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki (void) picl_walk_tree_by_class(phyplatformh,
a90d965d832a5578dbfc2eadd1617e8cccf25264fw PICL_CLASS_TEMPERATURE_SENSOR,
a90d965d832a5578dbfc2eadd1617e8cccf25264fw (void *)PICL_PROP_TEMPERATURE, sun4v_env_print_sensor_callback);
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki}
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenkistatic void
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenkisun4v_env_print_temp_indicators()
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki{
bbda49b50a1377654c8b28c2e87b39842f80ffdeSree Vemuri char *fmt = "%-34s %-18s %-8s\n";
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki (void) picl_walk_tree_by_class(phyplatformh,
a90d965d832a5578dbfc2eadd1617e8cccf25264fw PICL_CLASS_TEMPERATURE_INDICATOR, (void *)PICL_PROP_CONDITION,
a90d965d832a5578dbfc2eadd1617e8cccf25264fw sun4v_env_print_indicator_callback);
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki if (!class_node_found)
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki return;
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki log_printf("\nTemperature indicators:\n");
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki if (syserrlog == 0) {
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki (void) picl_walk_tree_by_class(phyplatformh,
a42ff480eab7fd4f2b53fe8e9bdb1b57f0cf64dafw PICL_CLASS_TEMPERATURE_INDICATOR,
a42ff480eab7fd4f2b53fe8e9bdb1b57f0cf64dafw (void *)PICL_PROP_CONDITION,
a90d965d832a5578dbfc2eadd1617e8cccf25264fw sun4v_env_print_indicator_callback);
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki if (all_status_ok) {
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki log_printf("All temperature indicators are OK.\n");
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki return;
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki }
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki }
5e3e415a5bedb7bb9ff36b225630e414258e6ecefw log_printf("-------------------------------------------------"
bbda49b50a1377654c8b28c2e87b39842f80ffdeSree Vemuri "---------------\n");
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki log_printf(fmt, "Location", "Indicator", "Condition", 0);
5e3e415a5bedb7bb9ff36b225630e414258e6ecefw log_printf("-------------------------------------------------"
bbda49b50a1377654c8b28c2e87b39842f80ffdeSree Vemuri "---------------\n");
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki (void) picl_walk_tree_by_class(phyplatformh,
a90d965d832a5578dbfc2eadd1617e8cccf25264fw PICL_CLASS_TEMPERATURE_INDICATOR,
a90d965d832a5578dbfc2eadd1617e8cccf25264fw (void *)PICL_PROP_CONDITION,
a90d965d832a5578dbfc2eadd1617e8cccf25264fw sun4v_env_print_indicator_callback);
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki}
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenkistatic void
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenkisun4v_env_print_current_sensors()
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki{
bbda49b50a1377654c8b28c2e87b39842f80ffdeSree Vemuri char *fmt = "%-34s %-18s %-10s\n";
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki (void) picl_walk_tree_by_class(phyplatformh, PICL_CLASS_CURRENT_SENSOR,
a90d965d832a5578dbfc2eadd1617e8cccf25264fw (void *)PICL_PROP_CURRENT, sun4v_env_print_sensor_callback);
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki if (!class_node_found)
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki return;
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki log_printf("\nCurrent sensors:\n");
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki if (syserrlog == 0) {
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki (void) picl_walk_tree_by_class(phyplatformh,
a90d965d832a5578dbfc2eadd1617e8cccf25264fw PICL_CLASS_CURRENT_SENSOR,
a42ff480eab7fd4f2b53fe8e9bdb1b57f0cf64dafw PICL_PROP_CURRENT, sun4v_env_print_sensor_callback);
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki if (all_status_ok) {
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki log_printf("All current sensors are OK.\n");
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki return;
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki }
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki }
5e3e415a5bedb7bb9ff36b225630e414258e6ecefw log_printf("-------------------------------------------------"
bbda49b50a1377654c8b28c2e87b39842f80ffdeSree Vemuri "---------------\n");
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki log_printf(fmt, "Location", "Sensor", "Status", 0);
5e3e415a5bedb7bb9ff36b225630e414258e6ecefw log_printf("-------------------------------------------------"
bbda49b50a1377654c8b28c2e87b39842f80ffdeSree Vemuri "---------------\n");
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki (void) picl_walk_tree_by_class(phyplatformh,
a90d965d832a5578dbfc2eadd1617e8cccf25264fw PICL_CLASS_CURRENT_SENSOR, (void *)PICL_PROP_CURRENT,
a90d965d832a5578dbfc2eadd1617e8cccf25264fw sun4v_env_print_sensor_callback);
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki}
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenkistatic void
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenkisun4v_env_print_current_indicators()
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki{
bbda49b50a1377654c8b28c2e87b39842f80ffdeSree Vemuri char *fmt = "%-34s %-18s %-8s\n";
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki (void) picl_walk_tree_by_class(phyplatformh,
a90d965d832a5578dbfc2eadd1617e8cccf25264fw PICL_CLASS_CURRENT_INDICATOR,
a90d965d832a5578dbfc2eadd1617e8cccf25264fw (void *)PICL_PROP_CONDITION,
a90d965d832a5578dbfc2eadd1617e8cccf25264fw sun4v_env_print_indicator_callback);
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki if (!class_node_found)
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki return;
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki log_printf("\nCurrent indicators:\n");
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki if (syserrlog == 0) {
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki (void) picl_walk_tree_by_class(phyplatformh,
a42ff480eab7fd4f2b53fe8e9bdb1b57f0cf64dafw PICL_CLASS_CURRENT_INDICATOR, (void *)PICL_PROP_CONDITION,
a90d965d832a5578dbfc2eadd1617e8cccf25264fw sun4v_env_print_indicator_callback);
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki if (all_status_ok) {
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki log_printf("All current indicators are OK.\n");
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki return;
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki }
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki }
5e3e415a5bedb7bb9ff36b225630e414258e6ecefw log_printf("-------------------------------------------------"
bbda49b50a1377654c8b28c2e87b39842f80ffdeSree Vemuri "---------------\n");
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki log_printf(fmt, "Location", "Indicator", "Condition", 0);
5e3e415a5bedb7bb9ff36b225630e414258e6ecefw log_printf("-------------------------------------------------"
bbda49b50a1377654c8b28c2e87b39842f80ffdeSree Vemuri "---------------\n");
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki (void) picl_walk_tree_by_class(phyplatformh,
a90d965d832a5578dbfc2eadd1617e8cccf25264fw PICL_CLASS_CURRENT_INDICATOR,
a90d965d832a5578dbfc2eadd1617e8cccf25264fw (void *)PICL_PROP_CONDITION,
a90d965d832a5578dbfc2eadd1617e8cccf25264fw sun4v_env_print_indicator_callback);
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki}
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenkistatic void
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenkisun4v_env_print_voltage_sensors()
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki{
bbda49b50a1377654c8b28c2e87b39842f80ffdeSree Vemuri char *fmt = "%-34s %-18s %-10s\n";
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki (void) picl_walk_tree_by_class(phyplatformh,
a90d965d832a5578dbfc2eadd1617e8cccf25264fw PICL_CLASS_VOLTAGE_SENSOR,
a90d965d832a5578dbfc2eadd1617e8cccf25264fw PICL_PROP_VOLTAGE,
a90d965d832a5578dbfc2eadd1617e8cccf25264fw sun4v_env_print_sensor_callback);
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki if (!class_node_found)
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki return;
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki log_printf("\nVoltage sensors:\n");
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki if (syserrlog == 0) {
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki (void) picl_walk_tree_by_class(phyplatformh,
a90d965d832a5578dbfc2eadd1617e8cccf25264fw PICL_CLASS_VOLTAGE_SENSOR,
a42ff480eab7fd4f2b53fe8e9bdb1b57f0cf64dafw PICL_PROP_VOLTAGE, sun4v_env_print_sensor_callback);
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki if (all_status_ok) {
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki log_printf("All voltage sensors are OK.\n");
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki return;
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki }
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki }
5e3e415a5bedb7bb9ff36b225630e414258e6ecefw log_printf("-------------------------------------------------"
bbda49b50a1377654c8b28c2e87b39842f80ffdeSree Vemuri "---------------\n");
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki log_printf(fmt, "Location", "Sensor", "Status", 0);
5e3e415a5bedb7bb9ff36b225630e414258e6ecefw log_printf("-------------------------------------------------"
bbda49b50a1377654c8b28c2e87b39842f80ffdeSree Vemuri "---------------\n");
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki (void) picl_walk_tree_by_class(phyplatformh,
a90d965d832a5578dbfc2eadd1617e8cccf25264fw PICL_CLASS_VOLTAGE_SENSOR,
a90d965d832a5578dbfc2eadd1617e8cccf25264fw (void *)PICL_PROP_VOLTAGE,
a90d965d832a5578dbfc2eadd1617e8cccf25264fw sun4v_env_print_sensor_callback);
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki}
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenkistatic void
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenkisun4v_env_print_voltage_indicators()
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki{
bbda49b50a1377654c8b28c2e87b39842f80ffdeSree Vemuri char *fmt = "%-34s %-18s %-8s\n";
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki (void) picl_walk_tree_by_class(phyplatformh,
a90d965d832a5578dbfc2eadd1617e8cccf25264fw PICL_CLASS_VOLTAGE_INDICATOR,
a90d965d832a5578dbfc2eadd1617e8cccf25264fw (void *)PICL_PROP_CONDITION,
a90d965d832a5578dbfc2eadd1617e8cccf25264fw sun4v_env_print_indicator_callback);
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki if (!class_node_found)
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki return;
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki log_printf("\nVoltage indicators:\n");
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki if (syserrlog == 0) {
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki (void) picl_walk_tree_by_class(phyplatformh,
a42ff480eab7fd4f2b53fe8e9bdb1b57f0cf64dafw PICL_CLASS_VOLTAGE_INDICATOR, (void *)PICL_PROP_CONDITION,
a90d965d832a5578dbfc2eadd1617e8cccf25264fw sun4v_env_print_indicator_callback);
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki if (all_status_ok) {
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki log_printf("All voltage indicators are OK.\n");
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki return;
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki }
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki }
5e3e415a5bedb7bb9ff36b225630e414258e6ecefw log_printf("-------------------------------------------------"
bbda49b50a1377654c8b28c2e87b39842f80ffdeSree Vemuri "---------------\n");
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki log_printf(fmt, "Location", "Indicator", "Condition", 0);
5e3e415a5bedb7bb9ff36b225630e414258e6ecefw log_printf("-------------------------------------------------"
bbda49b50a1377654c8b28c2e87b39842f80ffdeSree Vemuri "---------------\n");
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki (void) picl_walk_tree_by_class(phyplatformh,
a90d965d832a5578dbfc2eadd1617e8cccf25264fw PICL_CLASS_VOLTAGE_INDICATOR,
a90d965d832a5578dbfc2eadd1617e8cccf25264fw (void *)PICL_PROP_CONDITION,
a90d965d832a5578dbfc2eadd1617e8cccf25264fw sun4v_env_print_indicator_callback);
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki}
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenkistatic void
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenkisun4v_env_print_LEDs()
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki{
bbda49b50a1377654c8b28c2e87b39842f80ffdeSree Vemuri char *fmt = "%-34s %-18s %-8s\n";
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki if (syserrlog == 0)
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki return;
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki (void) picl_walk_tree_by_class(phyplatformh, PICL_CLASS_LED,
a90d965d832a5578dbfc2eadd1617e8cccf25264fw (void *)PICL_PROP_STATE, sun4v_env_print_indicator_callback);
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki if (!class_node_found)
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki return;
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki log_printf("\nLEDs:\n");
5e3e415a5bedb7bb9ff36b225630e414258e6ecefw log_printf("-------------------------------------------------"
bbda49b50a1377654c8b28c2e87b39842f80ffdeSree Vemuri "---------------\n");
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki log_printf(fmt, "Location", "LED", "State", 0);
5e3e415a5bedb7bb9ff36b225630e414258e6ecefw log_printf("-------------------------------------------------"
bbda49b50a1377654c8b28c2e87b39842f80ffdeSree Vemuri "---------------\n");
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki (void) picl_walk_tree_by_class(phyplatformh, PICL_CLASS_LED,
a90d965d832a5578dbfc2eadd1617e8cccf25264fw (void *)PICL_PROP_STATE, sun4v_env_print_indicator_callback);
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki}
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki/*ARGSUSED*/
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenkistatic int
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenkisun4v_print_fru_status_callback(picl_nodehdl_t nodeh, void *args)
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki{
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki char label[PICL_PROPNAMELEN_MAX];
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki char status[PICL_PROPNAMELEN_MAX];
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki picl_errno_t err;
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki picl_prophdl_t proph;
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki picl_nodehdl_t parenth;
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki char *names[PARENT_NAMES];
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki char *loc;
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki int i;
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki if (!class_node_found) {
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki class_node_found = 1;
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki return (PICL_WALK_TERMINATE);
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki }
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki err = picl_get_prop_by_name(nodeh, PICL_PROP_IS_FRU, &proph);
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki if (err != PICL_SUCCESS)
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki return (PICL_WALK_CONTINUE);
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki err = picl_get_propval_by_name(nodeh, PICL_PROP_LABEL, label,
a90d965d832a5578dbfc2eadd1617e8cccf25264fw sizeof (label));
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki if (err != PICL_SUCCESS)
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki return (PICL_WALK_CONTINUE);
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki err = picl_get_propval_by_name(nodeh, PICL_PROP_OPERATIONAL_STATUS,
a90d965d832a5578dbfc2eadd1617e8cccf25264fw status, sizeof (status));
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki if (err != PICL_SUCCESS)
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki return (PICL_WALK_CONTINUE);
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki if (syserrlog == 0) {
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki if (strcmp(status, "disabled") == 0) {
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki if (all_status_ok) {
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki all_status_ok = 0;
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki return (PICL_WALK_TERMINATE);
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki }
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki } else
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki return (PICL_WALK_CONTINUE);
7ae8c7a895927e389aea157a7b04d5eb606319fbMichael Bergknoff } else {
7ae8c7a895927e389aea157a7b04d5eb606319fbMichael Bergknoff if (all_status_ok && (strcmp(status, "disabled") == 0)) {
7ae8c7a895927e389aea157a7b04d5eb606319fbMichael Bergknoff all_status_ok = 0;
7ae8c7a895927e389aea157a7b04d5eb606319fbMichael Bergknoff }
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki }
8a31bd2bff65663c09a6a81f51725b27e206f136Birva Shah
8a31bd2bff65663c09a6a81f51725b27e206f136Birva Shah if (is_fru_absent(nodeh))
8a31bd2bff65663c09a6a81f51725b27e206f136Birva Shah strcpy(status, "Not present");
8a31bd2bff65663c09a6a81f51725b27e206f136Birva Shah
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki err = picl_get_propval_by_name(nodeh, PICL_PROP_PARENT, &parenth,
a90d965d832a5578dbfc2eadd1617e8cccf25264fw sizeof (parenth));
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki if (err != PICL_SUCCESS) {
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki log_printf("\n");
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki return (PICL_WALK_CONTINUE);
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki }
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki if ((loc = (char *)malloc(PICL_PROPNAMELEN_MAX*PARENT_NAMES)) == NULL)
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki return (PICL_WALK_TERMINATE);
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki for (i = 0; i < PARENT_NAMES; i++)
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki if ((names[i] = (char *)malloc(PICL_PROPNAMELEN_MAX)) == NULL) {
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki while (--i > -1)
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki free(names[i]);
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki free(loc);
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki return (PICL_WALK_TERMINATE);
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki }
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki i = 0;
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki while (err == PICL_SUCCESS) {
aaba19e23c48a32e927f4e39464be188bfcbef37fw if (parenth == phyplatformh)
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki break;
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki err = picl_get_propval_by_name(parenth, PICL_PROP_NAME,
a90d965d832a5578dbfc2eadd1617e8cccf25264fw names[i++], PICL_PROPNAMELEN_MAX);
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki if (err != PICL_SUCCESS) {
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki i--;
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki break;
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki }
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki if (i == PARENT_NAMES)
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki break;
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki err = picl_get_propval_by_name(parenth, PICL_PROP_PARENT,
a90d965d832a5578dbfc2eadd1617e8cccf25264fw &parenth, sizeof (parenth));
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki }
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki loc[0] = '\0';
4c5e0fde93352f23abc94e445999402e38b91268vivek if (--i > -1) {
4c5e0fde93352f23abc94e445999402e38b91268vivek (void) strlcat(loc, names[i],
a90d965d832a5578dbfc2eadd1617e8cccf25264fw PICL_PROPNAMELEN_MAX * PARENT_NAMES);
4c5e0fde93352f23abc94e445999402e38b91268vivek }
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki while (--i > -1) {
4c5e0fde93352f23abc94e445999402e38b91268vivek (void) strlcat(loc, "/", PICL_PROPNAMELEN_MAX * PARENT_NAMES);
4c5e0fde93352f23abc94e445999402e38b91268vivek (void) strlcat(loc, names[i],
a90d965d832a5578dbfc2eadd1617e8cccf25264fw PICL_PROPNAMELEN_MAX * PARENT_NAMES);
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki }
5e3e415a5bedb7bb9ff36b225630e414258e6ecefw log_printf("%-35s", loc);
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki for (i = 0; i < PARENT_NAMES; i++)
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki free(names[i]);
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki free(loc);
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki log_printf("%-10s", label);
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki log_printf("%-9s", status);
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki log_printf("\n");
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki return (PICL_WALK_CONTINUE);
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki}
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenkistatic void
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenkisun4v_print_fru_status()
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki{
5e3e415a5bedb7bb9ff36b225630e414258e6ecefw char *fmt = "%-34s %-9s %-8s\n";
dc6ca969834c6d8d1aac19aaea19d86c5b73cf75fw
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki (void) picl_walk_tree_by_class(phyplatformh, NULL, NULL,
a90d965d832a5578dbfc2eadd1617e8cccf25264fw sun4v_print_fru_status_callback);
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki if (!class_node_found)
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki return;
dc6ca969834c6d8d1aac19aaea19d86c5b73cf75fw
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki log_printf("\n");
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki log_printf("============================");
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki log_printf(" FRU Status ");
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki log_printf("============================");
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki log_printf("\n");
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki if (syserrlog == 0) {
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki (void) picl_walk_tree_by_class(phyplatformh,
aaba19e23c48a32e927f4e39464be188bfcbef37fw NULL, NULL,
a90d965d832a5578dbfc2eadd1617e8cccf25264fw sun4v_print_fru_status_callback);
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki if (all_status_ok) {
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki log_printf("All FRUs are enabled.\n");
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki return;
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki }
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki }
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki log_printf(fmt, "Location", "Name", "Status", 0);
5e3e415a5bedb7bb9ff36b225630e414258e6ecefw log_printf("------------------------------------------------------\n");
aaba19e23c48a32e927f4e39464be188bfcbef37fw (void) picl_walk_tree_by_class(phyplatformh, NULL, NULL,
a90d965d832a5578dbfc2eadd1617e8cccf25264fw sun4v_print_fru_status_callback);
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki}
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki
8a31bd2bff65663c09a6a81f51725b27e206f136Birva Shah/* Check the children of the FRU node for a presence indicator */
8a31bd2bff65663c09a6a81f51725b27e206f136Birva Shahstatic int
8a31bd2bff65663c09a6a81f51725b27e206f136Birva Shahis_fru_absent(picl_nodehdl_t fruh)
8a31bd2bff65663c09a6a81f51725b27e206f136Birva Shah{
8a31bd2bff65663c09a6a81f51725b27e206f136Birva Shah char class [PICL_CLASSNAMELEN_MAX];
8a31bd2bff65663c09a6a81f51725b27e206f136Birva Shah char condition [PICL_PROPNAMELEN_MAX];
8a31bd2bff65663c09a6a81f51725b27e206f136Birva Shah picl_errno_t err;
8a31bd2bff65663c09a6a81f51725b27e206f136Birva Shah picl_nodehdl_t nodeh;
8a31bd2bff65663c09a6a81f51725b27e206f136Birva Shah
8a31bd2bff65663c09a6a81f51725b27e206f136Birva Shah err = picl_get_propval_by_name(fruh, PICL_PROP_CHILD, &nodeh,
8a31bd2bff65663c09a6a81f51725b27e206f136Birva Shah sizeof (picl_nodehdl_t));
8a31bd2bff65663c09a6a81f51725b27e206f136Birva Shah while (err == PICL_SUCCESS) {
8a31bd2bff65663c09a6a81f51725b27e206f136Birva Shah err = picl_get_propval_by_name(nodeh,
8a31bd2bff65663c09a6a81f51725b27e206f136Birva Shah PICL_PROP_CLASSNAME, class, sizeof (class));
8a31bd2bff65663c09a6a81f51725b27e206f136Birva Shah if (err == PICL_SUCCESS &&
8a31bd2bff65663c09a6a81f51725b27e206f136Birva Shah strcmp(class, "presence-indicator") == 0) {
8a31bd2bff65663c09a6a81f51725b27e206f136Birva Shah err = picl_get_propval_by_name(nodeh,
8a31bd2bff65663c09a6a81f51725b27e206f136Birva Shah PICL_PROP_CONDITION, condition,
8a31bd2bff65663c09a6a81f51725b27e206f136Birva Shah sizeof (condition));
8a31bd2bff65663c09a6a81f51725b27e206f136Birva Shah if (err == PICL_SUCCESS) {
8a31bd2bff65663c09a6a81f51725b27e206f136Birva Shah if (strcmp(condition, "Absent") == 0) {
8a31bd2bff65663c09a6a81f51725b27e206f136Birva Shah return (1);
8a31bd2bff65663c09a6a81f51725b27e206f136Birva Shah } else {
8a31bd2bff65663c09a6a81f51725b27e206f136Birva Shah return (0);
8a31bd2bff65663c09a6a81f51725b27e206f136Birva Shah }
8a31bd2bff65663c09a6a81f51725b27e206f136Birva Shah }
8a31bd2bff65663c09a6a81f51725b27e206f136Birva Shah }
8a31bd2bff65663c09a6a81f51725b27e206f136Birva Shah err = picl_get_propval_by_name(nodeh, PICL_PROP_PEER,
8a31bd2bff65663c09a6a81f51725b27e206f136Birva Shah &nodeh, sizeof (picl_nodehdl_t));
8a31bd2bff65663c09a6a81f51725b27e206f136Birva Shah }
8a31bd2bff65663c09a6a81f51725b27e206f136Birva Shah return (0);
8a31bd2bff65663c09a6a81f51725b27e206f136Birva Shah}
8a31bd2bff65663c09a6a81f51725b27e206f136Birva Shah
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki/*ARGSUSED*/
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenkistatic int
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenkisun4v_print_fw_rev_callback(picl_nodehdl_t nodeh, void *args)
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki{
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki char rev[PICL_PROPNAMELEN_MAX];
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki picl_errno_t err;
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki if (!class_node_found) {
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki class_node_found = 1;
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki return (PICL_WALK_TERMINATE);
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki }
dc6ca969834c6d8d1aac19aaea19d86c5b73cf75fw
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki err = picl_get_propval_by_name(nodeh, PICL_PROP_FW_REVISION, rev,
a90d965d832a5578dbfc2eadd1617e8cccf25264fw sizeof (rev));
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki if (err != PICL_SUCCESS)
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki return (PICL_WALK_CONTINUE);
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki if (strlen(rev) == 0)
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki return (PICL_WALK_CONTINUE);
dc6ca969834c6d8d1aac19aaea19d86c5b73cf75fw log_printf("%s", rev);
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki log_printf("\n");
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki return (PICL_WALK_CONTINUE);
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki}
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenkistatic void
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenkisun4v_print_fw_rev()
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki{
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki if (syserrlog == 0)
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki return;
dc6ca969834c6d8d1aac19aaea19d86c5b73cf75fw
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki (void) picl_walk_tree_by_class(phyplatformh, NULL, NULL,
a90d965d832a5578dbfc2eadd1617e8cccf25264fw sun4v_print_fw_rev_callback);
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki if (!class_node_found)
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki return;
dc6ca969834c6d8d1aac19aaea19d86c5b73cf75fw
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki log_printf("\n");
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki log_printf("============================");
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki log_printf(" FW Version ");
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki log_printf("============================");
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki log_printf("\n");
dc6ca969834c6d8d1aac19aaea19d86c5b73cf75fw log_printf("Version\n");
5e3e415a5bedb7bb9ff36b225630e414258e6ecefw log_printf("-------------------------------------------------"
5e3e415a5bedb7bb9ff36b225630e414258e6ecefw "-----------\n");
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki (void) picl_walk_tree_by_class(phyplatformh, NULL, NULL,
a90d965d832a5578dbfc2eadd1617e8cccf25264fw sun4v_print_fw_rev_callback);
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki}
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki
dc6ca969834c6d8d1aac19aaea19d86c5b73cf75fwstatic void
dc6ca969834c6d8d1aac19aaea19d86c5b73cf75fwsun4v_print_openprom_rev()
dc6ca969834c6d8d1aac19aaea19d86c5b73cf75fw{
dc6ca969834c6d8d1aac19aaea19d86c5b73cf75fw if (syserrlog == 0)
dc6ca969834c6d8d1aac19aaea19d86c5b73cf75fw return;
dc6ca969834c6d8d1aac19aaea19d86c5b73cf75fw
dc6ca969834c6d8d1aac19aaea19d86c5b73cf75fw (void) picl_walk_tree_by_class(rooth, "openprom", NULL,
dc6ca969834c6d8d1aac19aaea19d86c5b73cf75fw openprom_callback);
dc6ca969834c6d8d1aac19aaea19d86c5b73cf75fw if (!class_node_found)
dc6ca969834c6d8d1aac19aaea19d86c5b73cf75fw return;
dc6ca969834c6d8d1aac19aaea19d86c5b73cf75fw
dc6ca969834c6d8d1aac19aaea19d86c5b73cf75fw log_printf("\n");
dc6ca969834c6d8d1aac19aaea19d86c5b73cf75fw log_printf("======================");
dc6ca969834c6d8d1aac19aaea19d86c5b73cf75fw log_printf(" System PROM revisions ");
dc6ca969834c6d8d1aac19aaea19d86c5b73cf75fw log_printf("=======================");
dc6ca969834c6d8d1aac19aaea19d86c5b73cf75fw log_printf("\n");
dc6ca969834c6d8d1aac19aaea19d86c5b73cf75fw log_printf("Version\n");
dc6ca969834c6d8d1aac19aaea19d86c5b73cf75fw log_printf("-------------------------------------------------"
dc6ca969834c6d8d1aac19aaea19d86c5b73cf75fw "-----------\n");
dc6ca969834c6d8d1aac19aaea19d86c5b73cf75fw (void) picl_walk_tree_by_class(rooth, "openprom", NULL,
dc6ca969834c6d8d1aac19aaea19d86c5b73cf75fw openprom_callback);
dc6ca969834c6d8d1aac19aaea19d86c5b73cf75fw}
dc6ca969834c6d8d1aac19aaea19d86c5b73cf75fw
dc6ca969834c6d8d1aac19aaea19d86c5b73cf75fw/*
dc6ca969834c6d8d1aac19aaea19d86c5b73cf75fw * display the OBP and POST prom revisions (if present)
dc6ca969834c6d8d1aac19aaea19d86c5b73cf75fw */
dc6ca969834c6d8d1aac19aaea19d86c5b73cf75fw/* ARGSUSED */
dc6ca969834c6d8d1aac19aaea19d86c5b73cf75fwstatic int
dc6ca969834c6d8d1aac19aaea19d86c5b73cf75fwopenprom_callback(picl_nodehdl_t openpromh, void *arg)
dc6ca969834c6d8d1aac19aaea19d86c5b73cf75fw{
dc6ca969834c6d8d1aac19aaea19d86c5b73cf75fw picl_prophdl_t proph;
dc6ca969834c6d8d1aac19aaea19d86c5b73cf75fw picl_prophdl_t tblh;
dc6ca969834c6d8d1aac19aaea19d86c5b73cf75fw picl_prophdl_t rowproph;
dc6ca969834c6d8d1aac19aaea19d86c5b73cf75fw picl_propinfo_t pinfo;
dc6ca969834c6d8d1aac19aaea19d86c5b73cf75fw char *prom_version = NULL;
dc6ca969834c6d8d1aac19aaea19d86c5b73cf75fw char *obp_version = NULL;
dc6ca969834c6d8d1aac19aaea19d86c5b73cf75fw int err;
dc6ca969834c6d8d1aac19aaea19d86c5b73cf75fw
dc6ca969834c6d8d1aac19aaea19d86c5b73cf75fw if (!class_node_found) {
dc6ca969834c6d8d1aac19aaea19d86c5b73cf75fw class_node_found = 1;
dc6ca969834c6d8d1aac19aaea19d86c5b73cf75fw return (PICL_WALK_TERMINATE);
dc6ca969834c6d8d1aac19aaea19d86c5b73cf75fw }
dc6ca969834c6d8d1aac19aaea19d86c5b73cf75fw
dc6ca969834c6d8d1aac19aaea19d86c5b73cf75fw err = picl_get_propinfo_by_name(openpromh, OBP_PROP_VERSION,
dc6ca969834c6d8d1aac19aaea19d86c5b73cf75fw &pinfo, &proph);
dc6ca969834c6d8d1aac19aaea19d86c5b73cf75fw if (err == PICL_PROPNOTFOUND)
dc6ca969834c6d8d1aac19aaea19d86c5b73cf75fw return (PICL_WALK_TERMINATE);
dc6ca969834c6d8d1aac19aaea19d86c5b73cf75fw else if (err != PICL_SUCCESS)
dc6ca969834c6d8d1aac19aaea19d86c5b73cf75fw return (err);
dc6ca969834c6d8d1aac19aaea19d86c5b73cf75fw
dc6ca969834c6d8d1aac19aaea19d86c5b73cf75fw /*
dc6ca969834c6d8d1aac19aaea19d86c5b73cf75fw * If it's a table prop, the first element is OBP revision
dc6ca969834c6d8d1aac19aaea19d86c5b73cf75fw * The second one is POST revision.
dc6ca969834c6d8d1aac19aaea19d86c5b73cf75fw * If it's a charstring prop, the value will be only OBP revision
dc6ca969834c6d8d1aac19aaea19d86c5b73cf75fw */
dc6ca969834c6d8d1aac19aaea19d86c5b73cf75fw if (pinfo.type == PICL_PTYPE_CHARSTRING) {
dc6ca969834c6d8d1aac19aaea19d86c5b73cf75fw prom_version = (char *)alloca(pinfo.size);
dc6ca969834c6d8d1aac19aaea19d86c5b73cf75fw if (prom_version == NULL)
dc6ca969834c6d8d1aac19aaea19d86c5b73cf75fw return (PICL_FAILURE);
dc6ca969834c6d8d1aac19aaea19d86c5b73cf75fw err = picl_get_propval(proph, prom_version, pinfo.size);
dc6ca969834c6d8d1aac19aaea19d86c5b73cf75fw if (err != PICL_SUCCESS)
dc6ca969834c6d8d1aac19aaea19d86c5b73cf75fw return (err);
dc6ca969834c6d8d1aac19aaea19d86c5b73cf75fw log_printf("%s\n", prom_version);
dc6ca969834c6d8d1aac19aaea19d86c5b73cf75fw }
dc6ca969834c6d8d1aac19aaea19d86c5b73cf75fw
dc6ca969834c6d8d1aac19aaea19d86c5b73cf75fw if (pinfo.type != PICL_PTYPE_TABLE) /* not supported type */
dc6ca969834c6d8d1aac19aaea19d86c5b73cf75fw return (PICL_WALK_TERMINATE);
dc6ca969834c6d8d1aac19aaea19d86c5b73cf75fw
dc6ca969834c6d8d1aac19aaea19d86c5b73cf75fw err = picl_get_propval(proph, &tblh, pinfo.size);
dc6ca969834c6d8d1aac19aaea19d86c5b73cf75fw if (err != PICL_SUCCESS)
dc6ca969834c6d8d1aac19aaea19d86c5b73cf75fw return (err);
dc6ca969834c6d8d1aac19aaea19d86c5b73cf75fw
dc6ca969834c6d8d1aac19aaea19d86c5b73cf75fw err = picl_get_next_by_row(tblh, &rowproph);
dc6ca969834c6d8d1aac19aaea19d86c5b73cf75fw if (err == PICL_SUCCESS) {
dc6ca969834c6d8d1aac19aaea19d86c5b73cf75fw /* get first row */
dc6ca969834c6d8d1aac19aaea19d86c5b73cf75fw err = picl_get_propinfo(rowproph, &pinfo);
dc6ca969834c6d8d1aac19aaea19d86c5b73cf75fw if (err != PICL_SUCCESS)
dc6ca969834c6d8d1aac19aaea19d86c5b73cf75fw return (err);
dc6ca969834c6d8d1aac19aaea19d86c5b73cf75fw
dc6ca969834c6d8d1aac19aaea19d86c5b73cf75fw prom_version = (char *)alloca(pinfo.size);
dc6ca969834c6d8d1aac19aaea19d86c5b73cf75fw if (prom_version == NULL)
dc6ca969834c6d8d1aac19aaea19d86c5b73cf75fw return (PICL_FAILURE);
dc6ca969834c6d8d1aac19aaea19d86c5b73cf75fw
dc6ca969834c6d8d1aac19aaea19d86c5b73cf75fw err = picl_get_propval(rowproph, prom_version, pinfo.size);
dc6ca969834c6d8d1aac19aaea19d86c5b73cf75fw if (err != PICL_SUCCESS)
dc6ca969834c6d8d1aac19aaea19d86c5b73cf75fw return (err);
dc6ca969834c6d8d1aac19aaea19d86c5b73cf75fw log_printf("%s\n", prom_version);
dc6ca969834c6d8d1aac19aaea19d86c5b73cf75fw
dc6ca969834c6d8d1aac19aaea19d86c5b73cf75fw /* get second row */
dc6ca969834c6d8d1aac19aaea19d86c5b73cf75fw err = picl_get_next_by_col(rowproph, &rowproph);
dc6ca969834c6d8d1aac19aaea19d86c5b73cf75fw if (err == PICL_SUCCESS) {
dc6ca969834c6d8d1aac19aaea19d86c5b73cf75fw err = picl_get_propinfo(rowproph, &pinfo);
dc6ca969834c6d8d1aac19aaea19d86c5b73cf75fw if (err != PICL_SUCCESS)
dc6ca969834c6d8d1aac19aaea19d86c5b73cf75fw return (err);
dc6ca969834c6d8d1aac19aaea19d86c5b73cf75fw
dc6ca969834c6d8d1aac19aaea19d86c5b73cf75fw obp_version = (char *)alloca(pinfo.size);
dc6ca969834c6d8d1aac19aaea19d86c5b73cf75fw if (obp_version == NULL)
dc6ca969834c6d8d1aac19aaea19d86c5b73cf75fw return (PICL_FAILURE);
dc6ca969834c6d8d1aac19aaea19d86c5b73cf75fw err = picl_get_propval(rowproph, obp_version,
dc6ca969834c6d8d1aac19aaea19d86c5b73cf75fw pinfo.size);
dc6ca969834c6d8d1aac19aaea19d86c5b73cf75fw if (err != PICL_SUCCESS)
dc6ca969834c6d8d1aac19aaea19d86c5b73cf75fw return (err);
dc6ca969834c6d8d1aac19aaea19d86c5b73cf75fw log_printf("%s\n", obp_version);
dc6ca969834c6d8d1aac19aaea19d86c5b73cf75fw }
dc6ca969834c6d8d1aac19aaea19d86c5b73cf75fw }
dc6ca969834c6d8d1aac19aaea19d86c5b73cf75fw
dc6ca969834c6d8d1aac19aaea19d86c5b73cf75fw return (PICL_WALK_TERMINATE);
dc6ca969834c6d8d1aac19aaea19d86c5b73cf75fw}
dc6ca969834c6d8d1aac19aaea19d86c5b73cf75fw
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenkistatic void
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenkisun4v_print_chassis_serial_no()
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki{
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki char val[PICL_PROPNAMELEN_MAX];
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki picl_errno_t err;
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki if (syserrlog == 0 || chassish == 0)
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki return;
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki log_printf("\n");
1cf6ec7e017216c75e94928e94bc5a1c4b94dd62suha log_printf("Chassis Serial Number");
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki log_printf("\n");
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki log_printf("---------------------\n");
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki err = picl_get_propval_by_name(chassish, PICL_PROP_SERIAL_NUMBER,
a90d965d832a5578dbfc2eadd1617e8cccf25264fw val, sizeof (val));
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki if (err == PICL_SUCCESS)
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki log_printf("%s", val);
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki log_printf("\n");
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki}