03831d35f7499c87d51205817c93e9a8d42c4baestevel/*
03831d35f7499c87d51205817c93e9a8d42c4baestevel * CDDL HEADER START
03831d35f7499c87d51205817c93e9a8d42c4baestevel *
03831d35f7499c87d51205817c93e9a8d42c4baestevel * The contents of this file are subject to the terms of the
2983dda76a6d296fdb560c88114fe41caad1b84fMichael Bergknoff * Common Development and Distribution License (the "License").
2983dda76a6d296fdb560c88114fe41caad1b84fMichael Bergknoff * 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/*
2983dda76a6d296fdb560c88114fe41caad1b84fMichael Bergknoff * Copyright (c) 2005, 2010, Oracle and/or its affiliates. All rights reserved.
03831d35f7499c87d51205817c93e9a8d42c4baestevel */
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel#include <stdio.h>
03831d35f7499c87d51205817c93e9a8d42c4baestevel#include <stdlib.h>
03831d35f7499c87d51205817c93e9a8d42c4baestevel#include <string.h>
03831d35f7499c87d51205817c93e9a8d42c4baestevel#include <alloca.h>
03831d35f7499c87d51205817c93e9a8d42c4baestevel#include <errno.h>
03831d35f7499c87d51205817c93e9a8d42c4baestevel#include <libintl.h>
03831d35f7499c87d51205817c93e9a8d42c4baestevel#include <sys/utsname.h>
03831d35f7499c87d51205817c93e9a8d42c4baestevel#include <sys/types.h>
03831d35f7499c87d51205817c93e9a8d42c4baestevel#include <sys/stat.h>
03831d35f7499c87d51205817c93e9a8d42c4baestevel#include <sys/openpromio.h>
03831d35f7499c87d51205817c93e9a8d42c4baestevel#include <sys/ddi.h>
03831d35f7499c87d51205817c93e9a8d42c4baestevel#include <syslog.h>
03831d35f7499c87d51205817c93e9a8d42c4baestevel#include <fcntl.h>
03831d35f7499c87d51205817c93e9a8d42c4baestevel#include <dirent.h>
03831d35f7499c87d51205817c93e9a8d42c4baestevel#include <unistd.h>
03831d35f7499c87d51205817c93e9a8d42c4baestevel#include <locale.h>
03831d35f7499c87d51205817c93e9a8d42c4baestevel#include <picl.h>
03831d35f7499c87d51205817c93e9a8d42c4baestevel#include "pdevinfo.h"
03831d35f7499c87d51205817c93e9a8d42c4baestevel#include "display.h"
03831d35f7499c87d51205817c93e9a8d42c4baestevel#include "display_sun4u.h"
03831d35f7499c87d51205817c93e9a8d42c4baestevel#include "picldefs.h"
03831d35f7499c87d51205817c93e9a8d42c4baestevel#include "libprtdiag.h"
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel#if !defined(TEXT_DOMAIN)
03831d35f7499c87d51205817c93e9a8d42c4baestevel#define TEXT_DOMAIN "SYS_TEST"
03831d35f7499c87d51205817c93e9a8d42c4baestevel#endif
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel#define EM_INIT_FAIL dgettext(TEXT_DOMAIN,\
03831d35f7499c87d51205817c93e9a8d42c4baestevel "picl_initialize failed: %s\n")
03831d35f7499c87d51205817c93e9a8d42c4baestevel#define EM_GET_ROOT_FAIL dgettext(TEXT_DOMAIN,\
03831d35f7499c87d51205817c93e9a8d42c4baestevel "Getting root node failed: %s\n")
03831d35f7499c87d51205817c93e9a8d42c4baestevel#define EM_PRTDIAG_FAIL dgettext(TEXT_DOMAIN, "Prtdiag failed!\n")
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel#define SIGN_ON_MSG dgettext(TEXT_DOMAIN,\
2983dda76a6d296fdb560c88114fe41caad1b84fMichael Bergknoff "System Configuration: Oracle Corporation ")
03831d35f7499c87d51205817c93e9a8d42c4baestevel#define SYSCLK_FREQ_MSG dgettext(TEXT_DOMAIN,\
03831d35f7499c87d51205817c93e9a8d42c4baestevel "System clock frequency: %d MHZ\n")
03831d35f7499c87d51205817c93e9a8d42c4baestevel#define MEM_SIZE_MSG dgettext(TEXT_DOMAIN, "Memory size: ")
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel#define DEFAULT_BOARD_NUM 0
03831d35f7499c87d51205817c93e9a8d42c4baestevel#define DEFAULT_PORTID 0
03831d35f7499c87d51205817c93e9a8d42c4baestevel#define CLK_FREQ_66MHZ 66
03831d35f7499c87d51205817c93e9a8d42c4baestevel#define USB -1
03831d35f7499c87d51205817c93e9a8d42c4baestevel#define HUB -2
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel/* bus id */
03831d35f7499c87d51205817c93e9a8d42c4baestevel#define PCI_TYPE 1
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel/*
03831d35f7499c87d51205817c93e9a8d42c4baestevel * PICL classes
03831d35f7499c87d51205817c93e9a8d42c4baestevel */
03831d35f7499c87d51205817c93e9a8d42c4baestevel#define PICL_CLASS_OPTIONS "options"
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel/*
03831d35f7499c87d51205817c93e9a8d42c4baestevel * Property names
03831d35f7499c87d51205817c93e9a8d42c4baestevel */
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel#define OBP_PROP_REG "reg"
03831d35f7499c87d51205817c93e9a8d42c4baestevel#define OBP_PROP_CLOCK_FREQ "clock-frequency"
03831d35f7499c87d51205817c93e9a8d42c4baestevel#define OBP_PROP_BOARD_NUM "board#"
03831d35f7499c87d51205817c93e9a8d42c4baestevel#define OBP_PROP_REVISION_ID "revision-id"
03831d35f7499c87d51205817c93e9a8d42c4baestevel#define OBP_PROP_VERSION_NUM "version#"
03831d35f7499c87d51205817c93e9a8d42c4baestevel#define OBP_PROP_BOARD_TYPE "board_type"
03831d35f7499c87d51205817c93e9a8d42c4baestevel#define OBP_PROP_ECACHE_SIZE "ecache-size"
03831d35f7499c87d51205817c93e9a8d42c4baestevel#define OBP_PROP_IMPLEMENTATION "implementation#"
03831d35f7499c87d51205817c93e9a8d42c4baestevel#define OBP_PROP_MASK "mask#"
03831d35f7499c87d51205817c93e9a8d42c4baestevel#define OBP_PROP_COMPATIBLE "compatible"
03831d35f7499c87d51205817c93e9a8d42c4baestevel#define OBP_PROP_BANNER_NAME "banner-name"
03831d35f7499c87d51205817c93e9a8d42c4baestevel#define OBP_PROP_MODEL "model"
03831d35f7499c87d51205817c93e9a8d42c4baestevel#define OBP_PROP_66MHZ_CAPABLE "66mhz-capable"
03831d35f7499c87d51205817c93e9a8d42c4baestevel#define OBP_PROP_FBC_REG_ID "fbc_reg_id"
03831d35f7499c87d51205817c93e9a8d42c4baestevel#define OBP_PROP_VERSION "version"
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel#define PROP_POWERFAIL_TIME "powerfail-time"
03831d35f7499c87d51205817c93e9a8d42c4baestevel#define PICL_PROP_LOW_WARNING_THRESHOLD "LowWarningThreshold"
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel#define DEFAULT_LINE_WIDTH 78
03831d35f7499c87d51205817c93e9a8d42c4baestevel#define HEADING_SYMBOL "="
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel#define SIZE_FIELD 11
03831d35f7499c87d51205817c93e9a8d42c4baestevel#define MAX_IWAYS 32
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baesteveltypedef struct bank_list {
03831d35f7499c87d51205817c93e9a8d42c4baestevel picl_nodehdl_t nodeh;
03831d35f7499c87d51205817c93e9a8d42c4baestevel uint32_t iway_count;
03831d35f7499c87d51205817c93e9a8d42c4baestevel uint32_t iway[MAX_IWAYS];
03831d35f7499c87d51205817c93e9a8d42c4baestevel struct bank_list *next;
03831d35f7499c87d51205817c93e9a8d42c4baestevel} bank_list_t;
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baesteveltypedef struct {
03831d35f7499c87d51205817c93e9a8d42c4baestevel uint64_t base;
03831d35f7499c87d51205817c93e9a8d42c4baestevel uint64_t size;
03831d35f7499c87d51205817c93e9a8d42c4baestevel int ifactor;
03831d35f7499c87d51205817c93e9a8d42c4baestevel int bank_count;
03831d35f7499c87d51205817c93e9a8d42c4baestevel} seg_info_t;
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevelstatic struct io_card *io_card_list = NULL; /* The head of the IO card list */
03831d35f7499c87d51205817c93e9a8d42c4baestevelstatic bank_list_t *mem_banks = NULL;
03831d35f7499c87d51205817c93e9a8d42c4baestevelstatic int mem_xfersize;
03831d35f7499c87d51205817c93e9a8d42c4baestevelstatic int no_xfer_size = 0;
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevelstatic const char *io_device_table[] = {
03831d35f7499c87d51205817c93e9a8d42c4baestevel "block",
03831d35f7499c87d51205817c93e9a8d42c4baestevel "disk",
03831d35f7499c87d51205817c93e9a8d42c4baestevel "cdrom",
03831d35f7499c87d51205817c93e9a8d42c4baestevel "floppy",
03831d35f7499c87d51205817c93e9a8d42c4baestevel "tape",
03831d35f7499c87d51205817c93e9a8d42c4baestevel "network",
03831d35f7499c87d51205817c93e9a8d42c4baestevel "display",
03831d35f7499c87d51205817c93e9a8d42c4baestevel "serial",
03831d35f7499c87d51205817c93e9a8d42c4baestevel "parallel",
03831d35f7499c87d51205817c93e9a8d42c4baestevel "scsi",
03831d35f7499c87d51205817c93e9a8d42c4baestevel "scsi-2",
03831d35f7499c87d51205817c93e9a8d42c4baestevel "scsi-3",
03831d35f7499c87d51205817c93e9a8d42c4baestevel "ide",
03831d35f7499c87d51205817c93e9a8d42c4baestevel "fcal",
03831d35f7499c87d51205817c93e9a8d42c4baestevel "keyboard",
03831d35f7499c87d51205817c93e9a8d42c4baestevel "mouse",
03831d35f7499c87d51205817c93e9a8d42c4baestevel "dma"
03831d35f7499c87d51205817c93e9a8d42c4baestevel};
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel#define NIODEVICE (sizeof (io_device_table) / sizeof (io_device_table[0]))
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevelstatic const char *bus_table[] = {
03831d35f7499c87d51205817c93e9a8d42c4baestevel "ebus",
03831d35f7499c87d51205817c93e9a8d42c4baestevel "isa",
03831d35f7499c87d51205817c93e9a8d42c4baestevel "pmu"
03831d35f7499c87d51205817c93e9a8d42c4baestevel};
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel#define NBUS (sizeof (bus_table) / sizeof (bus_table[0]))
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel/*
03831d35f7499c87d51205817c93e9a8d42c4baestevel * check if it is an IO deice
03831d35f7499c87d51205817c93e9a8d42c4baestevel * return 1 if this is a io device; return 0 for else.
03831d35f7499c87d51205817c93e9a8d42c4baestevel */
03831d35f7499c87d51205817c93e9a8d42c4baestevelstatic int
03831d35f7499c87d51205817c93e9a8d42c4baestevelis_io_device(char *device_class)
03831d35f7499c87d51205817c93e9a8d42c4baestevel{
03831d35f7499c87d51205817c93e9a8d42c4baestevel int i;
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel for (i = 0; i < NIODEVICE; i++) {
2983dda76a6d296fdb560c88114fe41caad1b84fMichael Bergknoff if (strcmp(device_class, io_device_table[i]) == 0)
2983dda76a6d296fdb560c88114fe41caad1b84fMichael Bergknoff return (1);
03831d35f7499c87d51205817c93e9a8d42c4baestevel }
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel return (0);
03831d35f7499c87d51205817c93e9a8d42c4baestevel}
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel/*
03831d35f7499c87d51205817c93e9a8d42c4baestevel * check if it is a bus
03831d35f7499c87d51205817c93e9a8d42c4baestevel * return 1 if this is a bus; return 0 for else.
03831d35f7499c87d51205817c93e9a8d42c4baestevel */
03831d35f7499c87d51205817c93e9a8d42c4baestevelstatic int
03831d35f7499c87d51205817c93e9a8d42c4baestevelis_bus(char *device_class)
03831d35f7499c87d51205817c93e9a8d42c4baestevel{
03831d35f7499c87d51205817c93e9a8d42c4baestevel int i;
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel for (i = 0; i < NBUS; i++) {
2983dda76a6d296fdb560c88114fe41caad1b84fMichael Bergknoff if (strcmp(device_class, bus_table[i]) == 0)
2983dda76a6d296fdb560c88114fe41caad1b84fMichael Bergknoff return (1);
03831d35f7499c87d51205817c93e9a8d42c4baestevel }
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel return (0);
03831d35f7499c87d51205817c93e9a8d42c4baestevel}
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel/*
03831d35f7499c87d51205817c93e9a8d42c4baestevel * search children to get the node by the nodename
03831d35f7499c87d51205817c93e9a8d42c4baestevel * return node handler in picl_nodehdl_t *nodeh
03831d35f7499c87d51205817c93e9a8d42c4baestevel */
03831d35f7499c87d51205817c93e9a8d42c4baestevelstatic int
03831d35f7499c87d51205817c93e9a8d42c4baestevelpicldiag_get_node_by_name(picl_nodehdl_t rooth, char *name,
03831d35f7499c87d51205817c93e9a8d42c4baestevel picl_nodehdl_t *nodeh)
03831d35f7499c87d51205817c93e9a8d42c4baestevel{
03831d35f7499c87d51205817c93e9a8d42c4baestevel picl_nodehdl_t childh;
03831d35f7499c87d51205817c93e9a8d42c4baestevel int err;
03831d35f7499c87d51205817c93e9a8d42c4baestevel char *nodename;
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel nodename = alloca(strlen(name) + 1);
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (nodename == NULL)
03831d35f7499c87d51205817c93e9a8d42c4baestevel return (PICL_FAILURE);
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel err = picl_get_propval_by_name(rooth, PICL_PROP_CHILD, &childh,
03831d35f7499c87d51205817c93e9a8d42c4baestevel sizeof (picl_nodehdl_t));
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel while (err == PICL_SUCCESS) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel err = picl_get_propval_by_name(childh, PICL_PROP_NAME,
03831d35f7499c87d51205817c93e9a8d42c4baestevel nodename, (strlen(name) + 1));
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (err != PICL_SUCCESS) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel err = picl_get_propval_by_name(childh, PICL_PROP_PEER,
2983dda76a6d296fdb560c88114fe41caad1b84fMichael Bergknoff &childh, sizeof (picl_nodehdl_t));
03831d35f7499c87d51205817c93e9a8d42c4baestevel continue;
03831d35f7499c87d51205817c93e9a8d42c4baestevel }
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (strcmp(nodename, name) == 0) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel *nodeh = childh;
03831d35f7499c87d51205817c93e9a8d42c4baestevel return (PICL_SUCCESS);
03831d35f7499c87d51205817c93e9a8d42c4baestevel }
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel err = picl_get_propval_by_name(childh, PICL_PROP_PEER,
03831d35f7499c87d51205817c93e9a8d42c4baestevel &childh, sizeof (picl_nodehdl_t));
03831d35f7499c87d51205817c93e9a8d42c4baestevel }
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel return (err);
03831d35f7499c87d51205817c93e9a8d42c4baestevel}
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel/*
03831d35f7499c87d51205817c93e9a8d42c4baestevel * get the value by the property name of the string prop
03831d35f7499c87d51205817c93e9a8d42c4baestevel * the value will be in outbuf
03831d35f7499c87d51205817c93e9a8d42c4baestevel * Caller must free the outbuf
03831d35f7499c87d51205817c93e9a8d42c4baestevel */
03831d35f7499c87d51205817c93e9a8d42c4baestevelstatic int
03831d35f7499c87d51205817c93e9a8d42c4baestevelpicldiag_get_string_propval(picl_nodehdl_t modh, char *prop_name, char **outbuf)
03831d35f7499c87d51205817c93e9a8d42c4baestevel{
03831d35f7499c87d51205817c93e9a8d42c4baestevel int err;
03831d35f7499c87d51205817c93e9a8d42c4baestevel picl_prophdl_t proph;
03831d35f7499c87d51205817c93e9a8d42c4baestevel picl_propinfo_t pinfo;
03831d35f7499c87d51205817c93e9a8d42c4baestevel char *prop_value;
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel err = picl_get_propinfo_by_name(modh, prop_name, &pinfo, &proph);
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (err != PICL_SUCCESS)
03831d35f7499c87d51205817c93e9a8d42c4baestevel return (err);
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel /*
03831d35f7499c87d51205817c93e9a8d42c4baestevel * If it is not a string prop, return NULL
03831d35f7499c87d51205817c93e9a8d42c4baestevel */
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (pinfo.type != PICL_PTYPE_CHARSTRING)
2983dda76a6d296fdb560c88114fe41caad1b84fMichael Bergknoff return (PICL_FAILURE);
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel prop_value = malloc(pinfo.size);
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (prop_value == NULL)
03831d35f7499c87d51205817c93e9a8d42c4baestevel return (PICL_FAILURE);
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel err = picl_get_propval(proph, prop_value, pinfo.size);
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (err != PICL_SUCCESS) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel free(prop_value);
03831d35f7499c87d51205817c93e9a8d42c4baestevel return (err);
03831d35f7499c87d51205817c93e9a8d42c4baestevel }
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel *outbuf = prop_value;
03831d35f7499c87d51205817c93e9a8d42c4baestevel return (PICL_SUCCESS);
03831d35f7499c87d51205817c93e9a8d42c4baestevel}
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel/*
03831d35f7499c87d51205817c93e9a8d42c4baestevel * return the value as a signed integer
03831d35f7499c87d51205817c93e9a8d42c4baestevel */
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevelstatic int64_t
03831d35f7499c87d51205817c93e9a8d42c4baestevelpicldiag_get_int_propval(picl_nodehdl_t modh, char *prop_name, int *ret)
03831d35f7499c87d51205817c93e9a8d42c4baestevel{
03831d35f7499c87d51205817c93e9a8d42c4baestevel int err;
03831d35f7499c87d51205817c93e9a8d42c4baestevel picl_prophdl_t proph;
03831d35f7499c87d51205817c93e9a8d42c4baestevel picl_propinfo_t pinfo;
03831d35f7499c87d51205817c93e9a8d42c4baestevel int8_t int8v;
03831d35f7499c87d51205817c93e9a8d42c4baestevel int16_t int16v;
03831d35f7499c87d51205817c93e9a8d42c4baestevel int32_t int32v;
03831d35f7499c87d51205817c93e9a8d42c4baestevel int64_t int64v;
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel err = picl_get_propinfo_by_name(modh, prop_name, &pinfo, &proph);
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (err != PICL_SUCCESS) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel *ret = err;
03831d35f7499c87d51205817c93e9a8d42c4baestevel return (0);
03831d35f7499c87d51205817c93e9a8d42c4baestevel }
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel /*
03831d35f7499c87d51205817c93e9a8d42c4baestevel * If it is not an int, uint or byte array prop, return failure
03831d35f7499c87d51205817c93e9a8d42c4baestevel */
03831d35f7499c87d51205817c93e9a8d42c4baestevel if ((pinfo.type != PICL_PTYPE_INT) &&
2983dda76a6d296fdb560c88114fe41caad1b84fMichael Bergknoff (pinfo.type != PICL_PTYPE_UNSIGNED_INT) &&
2983dda76a6d296fdb560c88114fe41caad1b84fMichael Bergknoff (pinfo.type != PICL_PTYPE_BYTEARRAY)) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel *ret = PICL_FAILURE;
03831d35f7499c87d51205817c93e9a8d42c4baestevel return (0);
03831d35f7499c87d51205817c93e9a8d42c4baestevel }
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel switch (pinfo.size) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel case sizeof (int8_t):
03831d35f7499c87d51205817c93e9a8d42c4baestevel err = picl_get_propval(proph, &int8v, sizeof (int8v));
03831d35f7499c87d51205817c93e9a8d42c4baestevel *ret = err;
03831d35f7499c87d51205817c93e9a8d42c4baestevel return (int8v);
03831d35f7499c87d51205817c93e9a8d42c4baestevel case sizeof (int16_t):
03831d35f7499c87d51205817c93e9a8d42c4baestevel err = picl_get_propval(proph, &int16v, sizeof (int16v));
03831d35f7499c87d51205817c93e9a8d42c4baestevel *ret = err;
03831d35f7499c87d51205817c93e9a8d42c4baestevel return (int16v);
03831d35f7499c87d51205817c93e9a8d42c4baestevel case sizeof (int32_t):
03831d35f7499c87d51205817c93e9a8d42c4baestevel err = picl_get_propval(proph, &int32v, sizeof (int32v));
03831d35f7499c87d51205817c93e9a8d42c4baestevel *ret = err;
03831d35f7499c87d51205817c93e9a8d42c4baestevel return (int32v);
03831d35f7499c87d51205817c93e9a8d42c4baestevel case sizeof (int64_t):
03831d35f7499c87d51205817c93e9a8d42c4baestevel err = picl_get_propval(proph, &int64v, sizeof (int64v));
03831d35f7499c87d51205817c93e9a8d42c4baestevel *ret = err;
03831d35f7499c87d51205817c93e9a8d42c4baestevel return (int64v);
03831d35f7499c87d51205817c93e9a8d42c4baestevel default: /* not supported size */
03831d35f7499c87d51205817c93e9a8d42c4baestevel *ret = PICL_FAILURE;
03831d35f7499c87d51205817c93e9a8d42c4baestevel return (0);
03831d35f7499c87d51205817c93e9a8d42c4baestevel }
03831d35f7499c87d51205817c93e9a8d42c4baestevel}
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel/*
03831d35f7499c87d51205817c93e9a8d42c4baestevel * return the value of the uint prop
03831d35f7499c87d51205817c93e9a8d42c4baestevel */
03831d35f7499c87d51205817c93e9a8d42c4baestevelstatic uint64_t
03831d35f7499c87d51205817c93e9a8d42c4baestevelpicldiag_get_uint_propval(picl_nodehdl_t modh, char *prop_name, int *ret)
03831d35f7499c87d51205817c93e9a8d42c4baestevel{
03831d35f7499c87d51205817c93e9a8d42c4baestevel int err;
03831d35f7499c87d51205817c93e9a8d42c4baestevel picl_prophdl_t proph;
03831d35f7499c87d51205817c93e9a8d42c4baestevel picl_propinfo_t pinfo;
03831d35f7499c87d51205817c93e9a8d42c4baestevel uint8_t uint8v;
03831d35f7499c87d51205817c93e9a8d42c4baestevel uint16_t uint16v;
03831d35f7499c87d51205817c93e9a8d42c4baestevel uint32_t uint32v;
03831d35f7499c87d51205817c93e9a8d42c4baestevel uint64_t uint64v;
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel err = picl_get_propinfo_by_name(modh, prop_name, &pinfo, &proph);
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (err != PICL_SUCCESS) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel *ret = err;
03831d35f7499c87d51205817c93e9a8d42c4baestevel return (0);
03831d35f7499c87d51205817c93e9a8d42c4baestevel }
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel /*
03831d35f7499c87d51205817c93e9a8d42c4baestevel * If it is not an int or uint prop, return failure
03831d35f7499c87d51205817c93e9a8d42c4baestevel */
03831d35f7499c87d51205817c93e9a8d42c4baestevel if ((pinfo.type != PICL_PTYPE_INT) &&
2983dda76a6d296fdb560c88114fe41caad1b84fMichael Bergknoff (pinfo.type != PICL_PTYPE_UNSIGNED_INT)) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel *ret = PICL_FAILURE;
03831d35f7499c87d51205817c93e9a8d42c4baestevel return (0);
03831d35f7499c87d51205817c93e9a8d42c4baestevel }
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel /* uint prop */
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel switch (pinfo.size) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel case sizeof (uint8_t):
03831d35f7499c87d51205817c93e9a8d42c4baestevel err = picl_get_propval(proph, &uint8v, sizeof (uint8v));
03831d35f7499c87d51205817c93e9a8d42c4baestevel *ret = err;
03831d35f7499c87d51205817c93e9a8d42c4baestevel return (uint8v);
03831d35f7499c87d51205817c93e9a8d42c4baestevel case sizeof (uint16_t):
03831d35f7499c87d51205817c93e9a8d42c4baestevel err = picl_get_propval(proph, &uint16v, sizeof (uint16v));
03831d35f7499c87d51205817c93e9a8d42c4baestevel *ret = err;
03831d35f7499c87d51205817c93e9a8d42c4baestevel return (uint16v);
03831d35f7499c87d51205817c93e9a8d42c4baestevel case sizeof (uint32_t):
03831d35f7499c87d51205817c93e9a8d42c4baestevel err = picl_get_propval(proph, &uint32v, sizeof (uint32v));
03831d35f7499c87d51205817c93e9a8d42c4baestevel *ret = err;
03831d35f7499c87d51205817c93e9a8d42c4baestevel return (uint32v);
03831d35f7499c87d51205817c93e9a8d42c4baestevel case sizeof (uint64_t):
03831d35f7499c87d51205817c93e9a8d42c4baestevel err = picl_get_propval(proph, &uint64v, sizeof (uint64v));
03831d35f7499c87d51205817c93e9a8d42c4baestevel *ret = err;
03831d35f7499c87d51205817c93e9a8d42c4baestevel return (uint64v);
03831d35f7499c87d51205817c93e9a8d42c4baestevel default: /* not supported size */
03831d35f7499c87d51205817c93e9a8d42c4baestevel *ret = PICL_FAILURE;
03831d35f7499c87d51205817c93e9a8d42c4baestevel return (0);
03831d35f7499c87d51205817c93e9a8d42c4baestevel }
03831d35f7499c87d51205817c93e9a8d42c4baestevel}
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel/*
03831d35f7499c87d51205817c93e9a8d42c4baestevel * return the value of the float prop
03831d35f7499c87d51205817c93e9a8d42c4baestevel */
03831d35f7499c87d51205817c93e9a8d42c4baestevelstatic float
03831d35f7499c87d51205817c93e9a8d42c4baestevelpicldiag_get_float_propval(picl_nodehdl_t modh, char *prop_name, int *ret)
03831d35f7499c87d51205817c93e9a8d42c4baestevel{
03831d35f7499c87d51205817c93e9a8d42c4baestevel int err;
03831d35f7499c87d51205817c93e9a8d42c4baestevel picl_prophdl_t proph;
03831d35f7499c87d51205817c93e9a8d42c4baestevel picl_propinfo_t pinfo;
03831d35f7499c87d51205817c93e9a8d42c4baestevel float floatv;
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel err = picl_get_propinfo_by_name(modh, prop_name, &pinfo, &proph);
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (err != PICL_SUCCESS) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel *ret = err;
03831d35f7499c87d51205817c93e9a8d42c4baestevel return ((float)0);
03831d35f7499c87d51205817c93e9a8d42c4baestevel }
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel /*
03831d35f7499c87d51205817c93e9a8d42c4baestevel * If it is not a float prop, return failure
03831d35f7499c87d51205817c93e9a8d42c4baestevel */
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (pinfo.type != PICL_PTYPE_FLOAT) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel *ret = PICL_FAILURE;
03831d35f7499c87d51205817c93e9a8d42c4baestevel return ((float)0);
03831d35f7499c87d51205817c93e9a8d42c4baestevel }
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel *ret = picl_get_propval(proph, &floatv, sizeof (floatv));
03831d35f7499c87d51205817c93e9a8d42c4baestevel return (floatv);
03831d35f7499c87d51205817c93e9a8d42c4baestevel}
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel/*
03831d35f7499c87d51205817c93e9a8d42c4baestevel * get the clock frequency
03831d35f7499c87d51205817c93e9a8d42c4baestevel */
03831d35f7499c87d51205817c93e9a8d42c4baestevelstatic int
03831d35f7499c87d51205817c93e9a8d42c4baestevelpicldiag_get_clock_freq(picl_nodehdl_t modh, uint32_t *freq)
03831d35f7499c87d51205817c93e9a8d42c4baestevel{
03831d35f7499c87d51205817c93e9a8d42c4baestevel#define ROUND_TO_MHZ(x) (((x) + 500000)/ 1000000)
03831d35f7499c87d51205817c93e9a8d42c4baestevel int err;
03831d35f7499c87d51205817c93e9a8d42c4baestevel uint64_t clk_freq;
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel clk_freq = picldiag_get_uint_propval(modh, OBP_PROP_CLOCK_FREQ, &err);
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (err != PICL_SUCCESS)
03831d35f7499c87d51205817c93e9a8d42c4baestevel return (err);
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel *freq = ROUND_TO_MHZ(clk_freq);
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel return (PICL_SUCCESS);
03831d35f7499c87d51205817c93e9a8d42c4baestevel}
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel/*
03831d35f7499c87d51205817c93e9a8d42c4baestevel * get the clock frequency from parent
03831d35f7499c87d51205817c93e9a8d42c4baestevel */
03831d35f7499c87d51205817c93e9a8d42c4baestevelstatic int
03831d35f7499c87d51205817c93e9a8d42c4baestevelpicldiag_get_clock_from_parent(picl_nodehdl_t nodeh, uint32_t *clk)
03831d35f7499c87d51205817c93e9a8d42c4baestevel{
03831d35f7499c87d51205817c93e9a8d42c4baestevel picl_nodehdl_t parenth;
03831d35f7499c87d51205817c93e9a8d42c4baestevel int err;
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel err = picl_get_propval_by_name(nodeh, PICL_PROP_PARENT,
03831d35f7499c87d51205817c93e9a8d42c4baestevel &parenth, sizeof (parenth));
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel while (err == PICL_SUCCESS) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel err = picldiag_get_clock_freq(parenth, clk);
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (err != PICL_PROPNOTFOUND)
03831d35f7499c87d51205817c93e9a8d42c4baestevel return (err);
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel err = picl_get_propval_by_name(parenth, PICL_PROP_PARENT,
03831d35f7499c87d51205817c93e9a8d42c4baestevel &parenth, sizeof (parenth));
03831d35f7499c87d51205817c93e9a8d42c4baestevel }
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel return (err);
03831d35f7499c87d51205817c93e9a8d42c4baestevel}
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel/*
03831d35f7499c87d51205817c93e9a8d42c4baestevel * get _fru_parent prop
03831d35f7499c87d51205817c93e9a8d42c4baestevel * If not found, then travese superiors (parent nodes) until
03831d35f7499c87d51205817c93e9a8d42c4baestevel * a _fru_parent property is found.
03831d35f7499c87d51205817c93e9a8d42c4baestevel * If not found, no fru parent
03831d35f7499c87d51205817c93e9a8d42c4baestevel */
03831d35f7499c87d51205817c93e9a8d42c4baestevelstatic int
03831d35f7499c87d51205817c93e9a8d42c4baestevelpicldiag_get_fru_parent(picl_nodehdl_t nodeh, picl_nodehdl_t *fruparenth)
03831d35f7499c87d51205817c93e9a8d42c4baestevel{
03831d35f7499c87d51205817c93e9a8d42c4baestevel picl_nodehdl_t fruh;
03831d35f7499c87d51205817c93e9a8d42c4baestevel int err;
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel /* find fru parent */
03831d35f7499c87d51205817c93e9a8d42c4baestevel err = picl_get_propval_by_name(nodeh, PICL_REFPROP_FRU_PARENT,
03831d35f7499c87d51205817c93e9a8d42c4baestevel &fruh, sizeof (fruh));
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (err != PICL_SUCCESS)
03831d35f7499c87d51205817c93e9a8d42c4baestevel err = picl_get_propval_by_name(nodeh, PICL_REFPROP_LOC_PARENT,
03831d35f7499c87d51205817c93e9a8d42c4baestevel &fruh, sizeof (fruh));
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel while (err == PICL_PROPNOTFOUND) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel err = picl_get_propval_by_name(nodeh, PICL_PROP_PARENT,
03831d35f7499c87d51205817c93e9a8d42c4baestevel &nodeh, sizeof (nodeh));
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (err != PICL_SUCCESS)
03831d35f7499c87d51205817c93e9a8d42c4baestevel return (err);
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel err = picl_get_propval_by_name(nodeh, PICL_REFPROP_FRU_PARENT,
03831d35f7499c87d51205817c93e9a8d42c4baestevel &fruh, sizeof (fruh));
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (err != PICL_SUCCESS)
03831d35f7499c87d51205817c93e9a8d42c4baestevel err = picl_get_propval_by_name(nodeh,
03831d35f7499c87d51205817c93e9a8d42c4baestevel PICL_REFPROP_LOC_PARENT, &fruh, sizeof (fruh));
03831d35f7499c87d51205817c93e9a8d42c4baestevel }
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (err == PICL_SUCCESS)
03831d35f7499c87d51205817c93e9a8d42c4baestevel *fruparenth = fruh;
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel return (err);
03831d35f7499c87d51205817c93e9a8d42c4baestevel}
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel/*
03831d35f7499c87d51205817c93e9a8d42c4baestevel * get label
03831d35f7499c87d51205817c93e9a8d42c4baestevel *
03831d35f7499c87d51205817c93e9a8d42c4baestevel * To get the label, use the following algorithm:
03831d35f7499c87d51205817c93e9a8d42c4baestevel * Lookup "Label" property in the fru node itself. If no
03831d35f7499c87d51205817c93e9a8d42c4baestevel * Label found, then traverse superiors (parent nodes) until
03831d35f7499c87d51205817c93e9a8d42c4baestevel * a Label property is found.
03831d35f7499c87d51205817c93e9a8d42c4baestevel * if not found, then no label
03831d35f7499c87d51205817c93e9a8d42c4baestevel */
03831d35f7499c87d51205817c93e9a8d42c4baestevelstatic int
03831d35f7499c87d51205817c93e9a8d42c4baestevelpicldiag_get_label(picl_nodehdl_t nodeh, char **label)
03831d35f7499c87d51205817c93e9a8d42c4baestevel{
03831d35f7499c87d51205817c93e9a8d42c4baestevel int err;
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel err = picldiag_get_string_propval(nodeh, PICL_PROP_LABEL, label);
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel while (err == PICL_PROPNOTFOUND) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel err = picl_get_propval_by_name(nodeh, PICL_PROP_PARENT,
03831d35f7499c87d51205817c93e9a8d42c4baestevel &nodeh, sizeof (nodeh));
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (err != PICL_SUCCESS)
03831d35f7499c87d51205817c93e9a8d42c4baestevel return (err);
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel err = picldiag_get_string_propval(nodeh, PICL_PROP_LABEL,
03831d35f7499c87d51205817c93e9a8d42c4baestevel label);
03831d35f7499c87d51205817c93e9a8d42c4baestevel }
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel return (err);
03831d35f7499c87d51205817c93e9a8d42c4baestevel}
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel/*
03831d35f7499c87d51205817c93e9a8d42c4baestevel * get combined label
03831d35f7499c87d51205817c93e9a8d42c4baestevel *
03831d35f7499c87d51205817c93e9a8d42c4baestevel * like picldiag_get_label, except concatenates the labels of parent locations
03831d35f7499c87d51205817c93e9a8d42c4baestevel * eg SB0/P3 for processor P3 on system board SB0
03831d35f7499c87d51205817c93e9a8d42c4baestevel *
03831d35f7499c87d51205817c93e9a8d42c4baestevel * if caller specifies non-zero label length, label will be cut to specified
03831d35f7499c87d51205817c93e9a8d42c4baestevel * length.
03831d35f7499c87d51205817c93e9a8d42c4baestevel * negative length is left justified, non-negative length is right justified
03831d35f7499c87d51205817c93e9a8d42c4baestevel */
03831d35f7499c87d51205817c93e9a8d42c4baestevelstatic int
03831d35f7499c87d51205817c93e9a8d42c4baestevelpicldiag_get_combined_label(picl_nodehdl_t nodeh, char **label, int lablen)
03831d35f7499c87d51205817c93e9a8d42c4baestevel{
03831d35f7499c87d51205817c93e9a8d42c4baestevel int err;
03831d35f7499c87d51205817c93e9a8d42c4baestevel char *ptr;
03831d35f7499c87d51205817c93e9a8d42c4baestevel char *ptr1 = NULL;
03831d35f7499c87d51205817c93e9a8d42c4baestevel char *ptr2;
03831d35f7499c87d51205817c93e9a8d42c4baestevel int len;
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel err = picldiag_get_string_propval(nodeh, PICL_PROP_LABEL, &ptr1);
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (err != PICL_PROPNOTFOUND && err != PICL_SUCCESS)
03831d35f7499c87d51205817c93e9a8d42c4baestevel return (err);
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel for (;;) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel err = picl_get_propval_by_name(nodeh, PICL_PROP_PARENT,
03831d35f7499c87d51205817c93e9a8d42c4baestevel &nodeh, sizeof (nodeh));
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (err == PICL_PROPNOTFOUND)
03831d35f7499c87d51205817c93e9a8d42c4baestevel break;
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (err != PICL_SUCCESS)
03831d35f7499c87d51205817c93e9a8d42c4baestevel return (err);
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel err = picldiag_get_string_propval(nodeh, PICL_PROP_LABEL, &ptr);
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (err == PICL_SUCCESS) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (ptr1 == NULL) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel ptr1 = ptr;
03831d35f7499c87d51205817c93e9a8d42c4baestevel } else {
03831d35f7499c87d51205817c93e9a8d42c4baestevel ptr2 = malloc(strlen(ptr1) + strlen(ptr) + 2);
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (ptr2 == NULL)
03831d35f7499c87d51205817c93e9a8d42c4baestevel return (PICL_FAILURE);
03831d35f7499c87d51205817c93e9a8d42c4baestevel (void) strlcpy(ptr2, ptr, strlen(ptr)-1);
03831d35f7499c87d51205817c93e9a8d42c4baestevel (void) strlcat(ptr2, "/", 1);
03831d35f7499c87d51205817c93e9a8d42c4baestevel (void) strlcat(ptr2, ptr1, strlen(ptr1)-1);
03831d35f7499c87d51205817c93e9a8d42c4baestevel (void) strlcat(ptr2, "\0", 1);
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel (void) free(ptr);
03831d35f7499c87d51205817c93e9a8d42c4baestevel (void) free(ptr1);
03831d35f7499c87d51205817c93e9a8d42c4baestevel ptr1 = ptr2;
03831d35f7499c87d51205817c93e9a8d42c4baestevel }
03831d35f7499c87d51205817c93e9a8d42c4baestevel } else if (err != PICL_PROPNOTFOUND) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel return (err);
03831d35f7499c87d51205817c93e9a8d42c4baestevel }
03831d35f7499c87d51205817c93e9a8d42c4baestevel }
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (ptr1 == NULL)
03831d35f7499c87d51205817c93e9a8d42c4baestevel return (PICL_PROPNOTFOUND);
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel len = strlen(ptr1);
03831d35f7499c87d51205817c93e9a8d42c4baestevel /* if no string truncation is desired or required */
03831d35f7499c87d51205817c93e9a8d42c4baestevel if ((lablen == 0) || (len <= abs(lablen))) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel *label = ptr1;
03831d35f7499c87d51205817c93e9a8d42c4baestevel return (PICL_SUCCESS);
03831d35f7499c87d51205817c93e9a8d42c4baestevel }
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel /* string truncation is required; alloc space for (lablen + \0) */
03831d35f7499c87d51205817c93e9a8d42c4baestevel ptr = malloc(abs(lablen) + 1);
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (ptr == 0)
03831d35f7499c87d51205817c93e9a8d42c4baestevel return (PICL_FAILURE);
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (lablen > 0) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel /* right justification; label = "+<string>\0" */
03831d35f7499c87d51205817c93e9a8d42c4baestevel strlcpy(ptr, "+", 1);
03831d35f7499c87d51205817c93e9a8d42c4baestevel strlcat(ptr, ptr1 + len - lablen + 1, lablen + 1);
03831d35f7499c87d51205817c93e9a8d42c4baestevel } else {
03831d35f7499c87d51205817c93e9a8d42c4baestevel /* left justification; label = "<string>+\0" */
03831d35f7499c87d51205817c93e9a8d42c4baestevel strlcpy(ptr, ptr1, abs(lablen) - 1);
03831d35f7499c87d51205817c93e9a8d42c4baestevel strcat(ptr, "+");
03831d35f7499c87d51205817c93e9a8d42c4baestevel }
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel *label = ptr;
03831d35f7499c87d51205817c93e9a8d42c4baestevel return (PICL_SUCCESS);
03831d35f7499c87d51205817c93e9a8d42c4baestevel}
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel/*
03831d35f7499c87d51205817c93e9a8d42c4baestevel * return the first compatible value
03831d35f7499c87d51205817c93e9a8d42c4baestevel */
03831d35f7499c87d51205817c93e9a8d42c4baestevelstatic int
03831d35f7499c87d51205817c93e9a8d42c4baestevelpicldiag_get_first_compatible_value(picl_nodehdl_t nodeh, char **outbuf)
03831d35f7499c87d51205817c93e9a8d42c4baestevel{
03831d35f7499c87d51205817c93e9a8d42c4baestevel int err;
03831d35f7499c87d51205817c93e9a8d42c4baestevel picl_prophdl_t proph;
03831d35f7499c87d51205817c93e9a8d42c4baestevel picl_propinfo_t pinfo;
03831d35f7499c87d51205817c93e9a8d42c4baestevel picl_prophdl_t tblh;
03831d35f7499c87d51205817c93e9a8d42c4baestevel picl_prophdl_t rowproph;
03831d35f7499c87d51205817c93e9a8d42c4baestevel char *pval;
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel err = picl_get_propinfo_by_name(nodeh, OBP_PROP_COMPATIBLE,
03831d35f7499c87d51205817c93e9a8d42c4baestevel &pinfo, &proph);
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (err != PICL_SUCCESS)
2983dda76a6d296fdb560c88114fe41caad1b84fMichael Bergknoff return (err);
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (pinfo.type == PICL_PTYPE_CHARSTRING) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel pval = malloc(pinfo.size);
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (pval == NULL)
03831d35f7499c87d51205817c93e9a8d42c4baestevel return (PICL_FAILURE);
03831d35f7499c87d51205817c93e9a8d42c4baestevel err = picl_get_propval(proph, pval, pinfo.size);
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (err != PICL_SUCCESS) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel free(pval);
03831d35f7499c87d51205817c93e9a8d42c4baestevel return (err);
03831d35f7499c87d51205817c93e9a8d42c4baestevel }
03831d35f7499c87d51205817c93e9a8d42c4baestevel *outbuf = pval;
03831d35f7499c87d51205817c93e9a8d42c4baestevel return (PICL_SUCCESS);
03831d35f7499c87d51205817c93e9a8d42c4baestevel }
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (pinfo.type != PICL_PTYPE_TABLE)
03831d35f7499c87d51205817c93e9a8d42c4baestevel return (PICL_FAILURE);
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel /* get first string from table */
03831d35f7499c87d51205817c93e9a8d42c4baestevel err = picl_get_propval(proph, &tblh, pinfo.size);
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (err != PICL_SUCCESS)
03831d35f7499c87d51205817c93e9a8d42c4baestevel return (err);
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel err = picl_get_next_by_row(tblh, &rowproph);
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (err != PICL_SUCCESS)
03831d35f7499c87d51205817c93e9a8d42c4baestevel return (err);
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel err = picl_get_propinfo(rowproph, &pinfo);
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (err != PICL_SUCCESS)
2983dda76a6d296fdb560c88114fe41caad1b84fMichael Bergknoff return (err);
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel pval = malloc(pinfo.size);
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (pval == NULL)
03831d35f7499c87d51205817c93e9a8d42c4baestevel return (PICL_FAILURE);
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel err = picl_get_propval(rowproph, pval, pinfo.size);
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (err != PICL_SUCCESS) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel free(pval);
03831d35f7499c87d51205817c93e9a8d42c4baestevel return (err);
03831d35f7499c87d51205817c93e9a8d42c4baestevel }
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel *outbuf = pval;
03831d35f7499c87d51205817c93e9a8d42c4baestevel return (PICL_SUCCESS);
03831d35f7499c87d51205817c93e9a8d42c4baestevel}
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel/*
03831d35f7499c87d51205817c93e9a8d42c4baestevel * print the header in the center
03831d35f7499c87d51205817c93e9a8d42c4baestevel */
03831d35f7499c87d51205817c93e9a8d42c4baestevelstatic void
03831d35f7499c87d51205817c93e9a8d42c4baestevellogprintf_header(char *header, size_t line_width)
03831d35f7499c87d51205817c93e9a8d42c4baestevel{
03831d35f7499c87d51205817c93e9a8d42c4baestevel size_t start_pos;
03831d35f7499c87d51205817c93e9a8d42c4baestevel size_t i;
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf("\n");
03831d35f7499c87d51205817c93e9a8d42c4baestevel start_pos = (line_width - strlen(header) - 2) / 2;
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel for (i = 0; i < start_pos; i++)
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf("%s", HEADING_SYMBOL);
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf(" %s ", header);
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel for (i = 0; i < start_pos; i++)
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf("%s", HEADING_SYMBOL);
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf("\n");
03831d35f7499c87d51205817c93e9a8d42c4baestevel}
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel/*
03831d35f7499c87d51205817c93e9a8d42c4baestevel * print the size
03831d35f7499c87d51205817c93e9a8d42c4baestevel */
03831d35f7499c87d51205817c93e9a8d42c4baestevelstatic void
03831d35f7499c87d51205817c93e9a8d42c4baestevellogprintf_size(uint64_t size)
03831d35f7499c87d51205817c93e9a8d42c4baestevel{
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel uint64_t kbyte = 1024;
03831d35f7499c87d51205817c93e9a8d42c4baestevel uint64_t mbyte = 1024 * 1024;
03831d35f7499c87d51205817c93e9a8d42c4baestevel uint64_t gbyte = 1024 * 1024 * 1024;
03831d35f7499c87d51205817c93e9a8d42c4baestevel uint64_t residue;
03831d35f7499c87d51205817c93e9a8d42c4baestevel char buf[SIZE_FIELD];
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (size >= gbyte) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel residue = size % gbyte;
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (residue == 0)
03831d35f7499c87d51205817c93e9a8d42c4baestevel snprintf(buf, sizeof (buf), "%dGB",
03831d35f7499c87d51205817c93e9a8d42c4baestevel (int)(size / gbyte));
03831d35f7499c87d51205817c93e9a8d42c4baestevel else
03831d35f7499c87d51205817c93e9a8d42c4baestevel snprintf(buf, sizeof (buf), "%.2fGB",
03831d35f7499c87d51205817c93e9a8d42c4baestevel (float)size / gbyte);
03831d35f7499c87d51205817c93e9a8d42c4baestevel } else if (size >= mbyte) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel residue = size % mbyte;
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (residue == 0)
03831d35f7499c87d51205817c93e9a8d42c4baestevel snprintf(buf, sizeof (buf), "%dMB",
03831d35f7499c87d51205817c93e9a8d42c4baestevel (int)(size / mbyte));
03831d35f7499c87d51205817c93e9a8d42c4baestevel else
03831d35f7499c87d51205817c93e9a8d42c4baestevel snprintf(buf, sizeof (buf), "%.2fMB",
03831d35f7499c87d51205817c93e9a8d42c4baestevel (float)size / mbyte);
03831d35f7499c87d51205817c93e9a8d42c4baestevel } else {
03831d35f7499c87d51205817c93e9a8d42c4baestevel residue = size % kbyte;
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (residue == 0)
03831d35f7499c87d51205817c93e9a8d42c4baestevel snprintf(buf, sizeof (buf), "%dKB",
03831d35f7499c87d51205817c93e9a8d42c4baestevel (int)(size / kbyte));
03831d35f7499c87d51205817c93e9a8d42c4baestevel else
03831d35f7499c87d51205817c93e9a8d42c4baestevel snprintf(buf, sizeof (buf), "%.2fKB",
03831d35f7499c87d51205817c93e9a8d42c4baestevel (float)size / kbyte);
03831d35f7499c87d51205817c93e9a8d42c4baestevel }
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf("%-10s ", buf);
03831d35f7499c87d51205817c93e9a8d42c4baestevel}
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel/*
03831d35f7499c87d51205817c93e9a8d42c4baestevel * display platform banner
03831d35f7499c87d51205817c93e9a8d42c4baestevel */
03831d35f7499c87d51205817c93e9a8d42c4baestevelstatic int
03831d35f7499c87d51205817c93e9a8d42c4baesteveldisplay_platform_banner(picl_nodehdl_t plafh)
03831d35f7499c87d51205817c93e9a8d42c4baestevel{
03831d35f7499c87d51205817c93e9a8d42c4baestevel char *platform;
03831d35f7499c87d51205817c93e9a8d42c4baestevel char *banner_name;
03831d35f7499c87d51205817c93e9a8d42c4baestevel int err;
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel /*
03831d35f7499c87d51205817c93e9a8d42c4baestevel * get PICL_PROP_MACHINE and PICL_PROP_BANNER_NAME
03831d35f7499c87d51205817c93e9a8d42c4baestevel */
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf(SIGN_ON_MSG);
03831d35f7499c87d51205817c93e9a8d42c4baestevel err = picldiag_get_string_propval(plafh, PICL_PROP_MACHINE,
03831d35f7499c87d51205817c93e9a8d42c4baestevel &platform);
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (err != PICL_SUCCESS)
03831d35f7499c87d51205817c93e9a8d42c4baestevel return (err);
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf(" %s", platform);
03831d35f7499c87d51205817c93e9a8d42c4baestevel free(platform);
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel err = picldiag_get_string_propval(plafh, OBP_PROP_BANNER_NAME,
03831d35f7499c87d51205817c93e9a8d42c4baestevel &banner_name);
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (err != PICL_SUCCESS)
03831d35f7499c87d51205817c93e9a8d42c4baestevel return (err);
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf(" %s", banner_name);
03831d35f7499c87d51205817c93e9a8d42c4baestevel free(banner_name);
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf("\n");
03831d35f7499c87d51205817c93e9a8d42c4baestevel return (PICL_SUCCESS);
03831d35f7499c87d51205817c93e9a8d42c4baestevel}
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel/*
03831d35f7499c87d51205817c93e9a8d42c4baestevel * display the clock frequency
03831d35f7499c87d51205817c93e9a8d42c4baestevel */
03831d35f7499c87d51205817c93e9a8d42c4baestevelstatic int
03831d35f7499c87d51205817c93e9a8d42c4baesteveldisplay_system_clock(picl_nodehdl_t plafh)
03831d35f7499c87d51205817c93e9a8d42c4baestevel{
03831d35f7499c87d51205817c93e9a8d42c4baestevel uint32_t system_clk;
03831d35f7499c87d51205817c93e9a8d42c4baestevel int err;
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel err = picldiag_get_clock_freq(plafh, &system_clk);
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (err != PICL_SUCCESS)
03831d35f7499c87d51205817c93e9a8d42c4baestevel return (err);
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf(SYSCLK_FREQ_MSG, system_clk);
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel return (PICL_SUCCESS);
03831d35f7499c87d51205817c93e9a8d42c4baestevel}
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel/*
03831d35f7499c87d51205817c93e9a8d42c4baestevel * callback function to display the memory size
03831d35f7499c87d51205817c93e9a8d42c4baestevel */
03831d35f7499c87d51205817c93e9a8d42c4baestevel/*ARGSUSED*/
03831d35f7499c87d51205817c93e9a8d42c4baestevelstatic int
03831d35f7499c87d51205817c93e9a8d42c4baestevelmemory_callback(picl_nodehdl_t memh, void *args)
03831d35f7499c87d51205817c93e9a8d42c4baestevel{
03831d35f7499c87d51205817c93e9a8d42c4baestevel uint64_t mem_size;
03831d35f7499c87d51205817c93e9a8d42c4baestevel int err;
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf(MEM_SIZE_MSG);
03831d35f7499c87d51205817c93e9a8d42c4baestevel mem_size = picldiag_get_uint_propval(memh, PICL_PROP_SIZE, &err);
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (err == PICL_SUCCESS)
03831d35f7499c87d51205817c93e9a8d42c4baestevel logprintf_size(mem_size);
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf("\n");
03831d35f7499c87d51205817c93e9a8d42c4baestevel no_xfer_size = 0;
03831d35f7499c87d51205817c93e9a8d42c4baestevel mem_xfersize = picldiag_get_uint_propval(memh, PICL_PROP_TRANSFER_SIZE,
03831d35f7499c87d51205817c93e9a8d42c4baestevel &err);
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (err == PICL_PROPNOTFOUND)
03831d35f7499c87d51205817c93e9a8d42c4baestevel no_xfer_size = 1;
03831d35f7499c87d51205817c93e9a8d42c4baestevel return (PICL_WALK_TERMINATE);
03831d35f7499c87d51205817c93e9a8d42c4baestevel}
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel/*
03831d35f7499c87d51205817c93e9a8d42c4baestevel * callback function to print cpu information
03831d35f7499c87d51205817c93e9a8d42c4baestevel */
03831d35f7499c87d51205817c93e9a8d42c4baestevel/*ARGSUSED*/
03831d35f7499c87d51205817c93e9a8d42c4baestevelstatic int
03831d35f7499c87d51205817c93e9a8d42c4baestevelcpu_callback(picl_nodehdl_t nodeh, void *args)
03831d35f7499c87d51205817c93e9a8d42c4baestevel{
03831d35f7499c87d51205817c93e9a8d42c4baestevel int err;
03831d35f7499c87d51205817c93e9a8d42c4baestevel int id;
03831d35f7499c87d51205817c93e9a8d42c4baestevel uint64_t uintval;
03831d35f7499c87d51205817c93e9a8d42c4baestevel uint32_t freq;
03831d35f7499c87d51205817c93e9a8d42c4baestevel char *impl_name;
03831d35f7499c87d51205817c93e9a8d42c4baestevel char *status;
03831d35f7499c87d51205817c93e9a8d42c4baestevel picl_prophdl_t parenth;
03831d35f7499c87d51205817c93e9a8d42c4baestevel char *label;
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel /*
03831d35f7499c87d51205817c93e9a8d42c4baestevel * If no ID is found, return
03831d35f7499c87d51205817c93e9a8d42c4baestevel */
03831d35f7499c87d51205817c93e9a8d42c4baestevel id = picldiag_get_uint_propval(nodeh, PICL_PROP_ID, &err);
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (err == PICL_PROPNOTFOUND)
03831d35f7499c87d51205817c93e9a8d42c4baestevel return (PICL_WALK_CONTINUE);
03831d35f7499c87d51205817c93e9a8d42c4baestevel else if (err != PICL_SUCCESS)
03831d35f7499c87d51205817c93e9a8d42c4baestevel return (err);
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf(" %2d ", id);
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel /*
03831d35f7499c87d51205817c93e9a8d42c4baestevel * If no freq is found, return
03831d35f7499c87d51205817c93e9a8d42c4baestevel */
03831d35f7499c87d51205817c93e9a8d42c4baestevel err = picldiag_get_clock_freq(nodeh, &freq);
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (err == PICL_PROPNOTFOUND)
03831d35f7499c87d51205817c93e9a8d42c4baestevel return (PICL_WALK_CONTINUE);
03831d35f7499c87d51205817c93e9a8d42c4baestevel else if (err != PICL_SUCCESS)
03831d35f7499c87d51205817c93e9a8d42c4baestevel return (err);
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf(dgettext(TEXT_DOMAIN, "%4d MHz "), freq);
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel /* Ecache size */
03831d35f7499c87d51205817c93e9a8d42c4baestevel uintval = picldiag_get_uint_propval(nodeh, OBP_PROP_ECACHE_SIZE, &err);
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (err == PICL_PROPNOTFOUND)
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf(" - ");
03831d35f7499c87d51205817c93e9a8d42c4baestevel else if (err == PICL_SUCCESS)
03831d35f7499c87d51205817c93e9a8d42c4baestevel logprintf_size(uintval);
03831d35f7499c87d51205817c93e9a8d42c4baestevel else
03831d35f7499c87d51205817c93e9a8d42c4baestevel return (err);
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel /* Implementation */
03831d35f7499c87d51205817c93e9a8d42c4baestevel impl_name = NULL;
03831d35f7499c87d51205817c93e9a8d42c4baestevel err = picldiag_get_string_propval(nodeh, PICL_PROP_NAME, &impl_name);
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (err != PICL_SUCCESS)
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf(dgettext(TEXT_DOMAIN, " <unknown> "));
03831d35f7499c87d51205817c93e9a8d42c4baestevel else
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf(" %-22s ", impl_name);
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel /* CPU Mask */
03831d35f7499c87d51205817c93e9a8d42c4baestevel uintval = picldiag_get_uint_propval(nodeh, OBP_PROP_MASK, &err);
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (err == PICL_PROPNOTFOUND)
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf(" - ");
03831d35f7499c87d51205817c93e9a8d42c4baestevel else if (err == PICL_SUCCESS)
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf("%2lld.%-2lld ", (uintval >> 4) & 0xf,
03831d35f7499c87d51205817c93e9a8d42c4baestevel uintval & 0xf);
03831d35f7499c87d51205817c93e9a8d42c4baestevel else
03831d35f7499c87d51205817c93e9a8d42c4baestevel return (err);
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel /*
03831d35f7499c87d51205817c93e9a8d42c4baestevel * Status - if the node has a status property then display that
03831d35f7499c87d51205817c93e9a8d42c4baestevel * otherwise display the State property
03831d35f7499c87d51205817c93e9a8d42c4baestevel */
03831d35f7499c87d51205817c93e9a8d42c4baestevel err = picldiag_get_string_propval(nodeh, PICL_PROP_STATUS, &status);
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (err == PICL_SUCCESS) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf("%-12s", status);
03831d35f7499c87d51205817c93e9a8d42c4baestevel free(status);
03831d35f7499c87d51205817c93e9a8d42c4baestevel } else if (err != PICL_PROPNOTFOUND && err !=
03831d35f7499c87d51205817c93e9a8d42c4baestevel PICL_PROPVALUNAVAILABLE && err != PICL_ENDOFLIST) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel return (err);
03831d35f7499c87d51205817c93e9a8d42c4baestevel } else {
03831d35f7499c87d51205817c93e9a8d42c4baestevel err = picldiag_get_string_propval(nodeh,
03831d35f7499c87d51205817c93e9a8d42c4baestevel PICL_PROP_STATE, &status);
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (err == PICL_SUCCESS) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf("%-12s", status);
03831d35f7499c87d51205817c93e9a8d42c4baestevel free(status);
03831d35f7499c87d51205817c93e9a8d42c4baestevel } else if (err != PICL_PROPNOTFOUND && err !=
03831d35f7499c87d51205817c93e9a8d42c4baestevel PICL_PROPVALUNAVAILABLE && err !=
03831d35f7499c87d51205817c93e9a8d42c4baestevel PICL_ENDOFLIST) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel return (err);
03831d35f7499c87d51205817c93e9a8d42c4baestevel } else {
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf(dgettext(TEXT_DOMAIN, "unknown "));
03831d35f7499c87d51205817c93e9a8d42c4baestevel }
03831d35f7499c87d51205817c93e9a8d42c4baestevel }
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel /*
03831d35f7499c87d51205817c93e9a8d42c4baestevel * Location: use label of fru parent
03831d35f7499c87d51205817c93e9a8d42c4baestevel */
03831d35f7499c87d51205817c93e9a8d42c4baestevel err = picldiag_get_fru_parent(nodeh, &parenth);
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (err == PICL_PROPNOTFOUND) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf(" - ");
03831d35f7499c87d51205817c93e9a8d42c4baestevel } else if (err == PICL_SUCCESS) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel err = picldiag_get_combined_label(parenth, &label, 12);
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (err == PICL_PROPNOTFOUND)
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf(" - ");
03831d35f7499c87d51205817c93e9a8d42c4baestevel else if (err == PICL_SUCCESS) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf("%s", label);
03831d35f7499c87d51205817c93e9a8d42c4baestevel free(label);
03831d35f7499c87d51205817c93e9a8d42c4baestevel } else
03831d35f7499c87d51205817c93e9a8d42c4baestevel return (err);
03831d35f7499c87d51205817c93e9a8d42c4baestevel } else
03831d35f7499c87d51205817c93e9a8d42c4baestevel return (err);
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf("\n");
03831d35f7499c87d51205817c93e9a8d42c4baestevel return (PICL_WALK_CONTINUE);
03831d35f7499c87d51205817c93e9a8d42c4baestevel}
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel/*
03831d35f7499c87d51205817c93e9a8d42c4baestevel * display cpu information
03831d35f7499c87d51205817c93e9a8d42c4baestevel */
03831d35f7499c87d51205817c93e9a8d42c4baestevelstatic int
03831d35f7499c87d51205817c93e9a8d42c4baesteveldisplay_cpu_info(picl_nodehdl_t plafh)
03831d35f7499c87d51205817c93e9a8d42c4baestevel{
03831d35f7499c87d51205817c93e9a8d42c4baestevel int err;
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel /*
03831d35f7499c87d51205817c93e9a8d42c4baestevel * Display the table header for CPUs . Then display the CPU
03831d35f7499c87d51205817c93e9a8d42c4baestevel * frequency, cache size, and processor revision on all the boards.
03831d35f7499c87d51205817c93e9a8d42c4baestevel */
03831d35f7499c87d51205817c93e9a8d42c4baestevel logprintf_header(dgettext(TEXT_DOMAIN, "CPUs"), DEFAULT_LINE_WIDTH);
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf(dgettext(TEXT_DOMAIN, " E$ CPU"
2983dda76a6d296fdb560c88114fe41caad1b84fMichael Bergknoff " CPU\n"));
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf(dgettext(TEXT_DOMAIN,
03831d35f7499c87d51205817c93e9a8d42c4baestevel "CPU Freq Size Implementation"
2983dda76a6d296fdb560c88114fe41caad1b84fMichael Bergknoff " Mask Status Location\n"));
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf("--- -------- ---------- --------------------- "
2983dda76a6d296fdb560c88114fe41caad1b84fMichael Bergknoff "----- ------ --------\n");
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel err = picl_walk_tree_by_class(plafh, PICL_CLASS_CPU, PICL_CLASS_CPU,
03831d35f7499c87d51205817c93e9a8d42c4baestevel cpu_callback);
03831d35f7499c87d51205817c93e9a8d42c4baestevel return (err);
03831d35f7499c87d51205817c93e9a8d42c4baestevel}
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel/*
03831d35f7499c87d51205817c93e9a8d42c4baestevel * Inserts an io_card structure into the list.
03831d35f7499c87d51205817c93e9a8d42c4baestevel */
03831d35f7499c87d51205817c93e9a8d42c4baestevelstatic void
03831d35f7499c87d51205817c93e9a8d42c4baesteveladd_io_card(uint32_t board, uint32_t bus_id, uint32_t slot, char *label,
03831d35f7499c87d51205817c93e9a8d42c4baestevel uint32_t freq, char *name, char *model, char *status, char *devfs_path)
03831d35f7499c87d51205817c93e9a8d42c4baestevel{
03831d35f7499c87d51205817c93e9a8d42c4baestevel struct io_card card;
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel card.display = 1;
03831d35f7499c87d51205817c93e9a8d42c4baestevel card.board = board;
03831d35f7499c87d51205817c93e9a8d42c4baestevel switch (bus_id) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel case PCI_TYPE:
03831d35f7499c87d51205817c93e9a8d42c4baestevel strlcpy(card.bus_type, PCI_NAME, MAXSTRLEN);
03831d35f7499c87d51205817c93e9a8d42c4baestevel break;
03831d35f7499c87d51205817c93e9a8d42c4baestevel default: /* won't reach here */
03831d35f7499c87d51205817c93e9a8d42c4baestevel strlcpy(card.bus_type, "", MAXSTRLEN);
03831d35f7499c87d51205817c93e9a8d42c4baestevel break;
03831d35f7499c87d51205817c93e9a8d42c4baestevel }
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (label == NULL)
03831d35f7499c87d51205817c93e9a8d42c4baestevel card.slot = slot;
03831d35f7499c87d51205817c93e9a8d42c4baestevel else {
03831d35f7499c87d51205817c93e9a8d42c4baestevel card.slot = PCI_SLOT_IS_STRING;
03831d35f7499c87d51205817c93e9a8d42c4baestevel (void) strlcpy(card.slot_str, label, MAXSTRLEN);
03831d35f7499c87d51205817c93e9a8d42c4baestevel }
03831d35f7499c87d51205817c93e9a8d42c4baestevel card.freq = freq;
03831d35f7499c87d51205817c93e9a8d42c4baestevel card.status[0] = '\0';
03831d35f7499c87d51205817c93e9a8d42c4baestevel card.name[0] = '\0';
03831d35f7499c87d51205817c93e9a8d42c4baestevel card.model[0] = '\0';
03831d35f7499c87d51205817c93e9a8d42c4baestevel card.notes[0] = '\0';
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (status != NULL)
03831d35f7499c87d51205817c93e9a8d42c4baestevel strlcpy(card.status, status, MAXSTRLEN);
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (name != NULL)
03831d35f7499c87d51205817c93e9a8d42c4baestevel strlcpy(card.name, name, MAXSTRLEN);
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (model != NULL)
03831d35f7499c87d51205817c93e9a8d42c4baestevel strlcpy(card.model, model, MAXSTRLEN);
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (status != NULL)
03831d35f7499c87d51205817c93e9a8d42c4baestevel strlcpy(card.status, status, MAXSTRLEN);
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (devfs_path != NULL)
03831d35f7499c87d51205817c93e9a8d42c4baestevel strlcpy(card.notes, devfs_path, MAXSTRLEN);
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel io_card_list = insert_io_card(io_card_list, &card);
03831d35f7499c87d51205817c93e9a8d42c4baestevel}
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevelstatic void
03831d35f7499c87d51205817c93e9a8d42c4baestevelappend_to_bank_list(bank_list_t *newptr)
03831d35f7499c87d51205817c93e9a8d42c4baestevel{
03831d35f7499c87d51205817c93e9a8d42c4baestevel bank_list_t *ptr;
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (mem_banks == NULL) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel mem_banks = newptr;
03831d35f7499c87d51205817c93e9a8d42c4baestevel return;
03831d35f7499c87d51205817c93e9a8d42c4baestevel }
03831d35f7499c87d51205817c93e9a8d42c4baestevel ptr = mem_banks;
03831d35f7499c87d51205817c93e9a8d42c4baestevel while (ptr->next != NULL)
03831d35f7499c87d51205817c93e9a8d42c4baestevel ptr = ptr->next;
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel ptr->next = newptr;
03831d35f7499c87d51205817c93e9a8d42c4baestevel}
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevelstatic void
03831d35f7499c87d51205817c93e9a8d42c4baestevelfree_bank_list(void)
03831d35f7499c87d51205817c93e9a8d42c4baestevel{
03831d35f7499c87d51205817c93e9a8d42c4baestevel bank_list_t *ptr;
03831d35f7499c87d51205817c93e9a8d42c4baestevel bank_list_t *tmp;
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel for (ptr = mem_banks; ptr != NULL; ptr = tmp) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel tmp = ptr->next;
03831d35f7499c87d51205817c93e9a8d42c4baestevel free(ptr);
03831d35f7499c87d51205817c93e9a8d42c4baestevel }
03831d35f7499c87d51205817c93e9a8d42c4baestevel mem_banks = NULL;
03831d35f7499c87d51205817c93e9a8d42c4baestevel}
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel/*
03831d35f7499c87d51205817c93e9a8d42c4baestevel * print label for memory module
03831d35f7499c87d51205817c93e9a8d42c4baestevel */
03831d35f7499c87d51205817c93e9a8d42c4baestevelstatic int
03831d35f7499c87d51205817c93e9a8d42c4baestevellogprintf_memory_module_label(picl_nodehdl_t moduleh)
03831d35f7499c87d51205817c93e9a8d42c4baestevel{
03831d35f7499c87d51205817c93e9a8d42c4baestevel picl_nodehdl_t fruparenth;
03831d35f7499c87d51205817c93e9a8d42c4baestevel int err;
03831d35f7499c87d51205817c93e9a8d42c4baestevel char *label;
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel err = picldiag_get_fru_parent(moduleh, &fruparenth);
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (err == PICL_PROPNOTFOUND) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf("-");
03831d35f7499c87d51205817c93e9a8d42c4baestevel return (PICL_SUCCESS);
03831d35f7499c87d51205817c93e9a8d42c4baestevel } else if (err != PICL_SUCCESS)
03831d35f7499c87d51205817c93e9a8d42c4baestevel return (err);
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel err = picldiag_get_combined_label(fruparenth, &label, 30);
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (err == PICL_PROPNOTFOUND)
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf("-");
03831d35f7499c87d51205817c93e9a8d42c4baestevel else if (err == PICL_SUCCESS) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf("%-15s", label);
03831d35f7499c87d51205817c93e9a8d42c4baestevel free(label);
03831d35f7499c87d51205817c93e9a8d42c4baestevel } else
03831d35f7499c87d51205817c93e9a8d42c4baestevel return (err);
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel return (PICL_SUCCESS);
03831d35f7499c87d51205817c93e9a8d42c4baestevel}
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel/*
03831d35f7499c87d51205817c93e9a8d42c4baestevel * print the bank id and add the bank handle in the bank list
03831d35f7499c87d51205817c93e9a8d42c4baestevel * return the head of the bank list
03831d35f7499c87d51205817c93e9a8d42c4baestevel */
03831d35f7499c87d51205817c93e9a8d42c4baestevelstatic int
03831d35f7499c87d51205817c93e9a8d42c4baestevelmembank_callback(picl_nodehdl_t bankh, void *args)
03831d35f7499c87d51205817c93e9a8d42c4baestevel{
03831d35f7499c87d51205817c93e9a8d42c4baestevel int err;
03831d35f7499c87d51205817c93e9a8d42c4baestevel int64_t id;
03831d35f7499c87d51205817c93e9a8d42c4baestevel uint64_t match;
03831d35f7499c87d51205817c93e9a8d42c4baestevel uint64_t mask;
03831d35f7499c87d51205817c93e9a8d42c4baestevel int i;
03831d35f7499c87d51205817c93e9a8d42c4baestevel bank_list_t *newptr;
03831d35f7499c87d51205817c93e9a8d42c4baestevel seg_info_t *segp = args;
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel /*
03831d35f7499c87d51205817c93e9a8d42c4baestevel * print the bank id in the segment table contains column
03831d35f7499c87d51205817c93e9a8d42c4baestevel */
03831d35f7499c87d51205817c93e9a8d42c4baestevel id = picldiag_get_uint_propval(bankh, PICL_PROP_ID, &err);
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (segp->bank_count > 0)
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf(",");
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (err == PICL_PROPNOTFOUND)
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf("-");
03831d35f7499c87d51205817c93e9a8d42c4baestevel else if (err == PICL_SUCCESS)
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf("%-lld", id);
03831d35f7499c87d51205817c93e9a8d42c4baestevel else
03831d35f7499c87d51205817c93e9a8d42c4baestevel return (err);
03831d35f7499c87d51205817c93e9a8d42c4baestevel segp->bank_count++;
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel /*
03831d35f7499c87d51205817c93e9a8d42c4baestevel * Save the bank information for later (print_bank_table)
03831d35f7499c87d51205817c93e9a8d42c4baestevel */
03831d35f7499c87d51205817c93e9a8d42c4baestevel newptr = malloc(sizeof (*newptr));
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (newptr == NULL)
03831d35f7499c87d51205817c93e9a8d42c4baestevel return (PICL_FAILURE);
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel newptr->nodeh = bankh;
03831d35f7499c87d51205817c93e9a8d42c4baestevel newptr->iway_count = 0;
03831d35f7499c87d51205817c93e9a8d42c4baestevel newptr->next = NULL;
03831d35f7499c87d51205817c93e9a8d42c4baestevel append_to_bank_list(newptr);
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel /*
03831d35f7499c87d51205817c93e9a8d42c4baestevel * Compute the way numbers for the bank
03831d35f7499c87d51205817c93e9a8d42c4baestevel */
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (no_xfer_size)
03831d35f7499c87d51205817c93e9a8d42c4baestevel return (PICL_WALK_CONTINUE);
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel match = picldiag_get_uint_propval(bankh, PICL_PROP_ADDRESSMATCH, &err);
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (err == PICL_PROPNOTFOUND)
03831d35f7499c87d51205817c93e9a8d42c4baestevel return (PICL_WALK_CONTINUE);
03831d35f7499c87d51205817c93e9a8d42c4baestevel else if (err != PICL_SUCCESS)
03831d35f7499c87d51205817c93e9a8d42c4baestevel return (err);
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel mask = picldiag_get_uint_propval(bankh, PICL_PROP_ADDRESSMASK, &err);
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (err == PICL_PROPNOTFOUND)
03831d35f7499c87d51205817c93e9a8d42c4baestevel return (PICL_WALK_CONTINUE);
03831d35f7499c87d51205817c93e9a8d42c4baestevel else if (err != PICL_SUCCESS)
03831d35f7499c87d51205817c93e9a8d42c4baestevel return (err);
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel i = 0;
03831d35f7499c87d51205817c93e9a8d42c4baestevel while ((i < segp->ifactor) && (newptr->iway_count < MAX_IWAYS)) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (((segp->base + i * mem_xfersize) & mask) == match)
03831d35f7499c87d51205817c93e9a8d42c4baestevel newptr->iway[newptr->iway_count++] = i;
03831d35f7499c87d51205817c93e9a8d42c4baestevel ++i;
03831d35f7499c87d51205817c93e9a8d42c4baestevel }
03831d35f7499c87d51205817c93e9a8d42c4baestevel return (PICL_WALK_CONTINUE);
03831d35f7499c87d51205817c93e9a8d42c4baestevel}
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel/*
03831d35f7499c87d51205817c93e9a8d42c4baestevel * find the memory bank and add the bank handle in the bank list
03831d35f7499c87d51205817c93e9a8d42c4baestevel * return the head of the bank list
03831d35f7499c87d51205817c93e9a8d42c4baestevel */
03831d35f7499c87d51205817c93e9a8d42c4baestevelstatic int
03831d35f7499c87d51205817c93e9a8d42c4baestevellogprintf_bankinfo(picl_nodehdl_t segh, seg_info_t *segp)
03831d35f7499c87d51205817c93e9a8d42c4baestevel{
03831d35f7499c87d51205817c93e9a8d42c4baestevel int err;
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf(dgettext(TEXT_DOMAIN, "BankIDs "));
03831d35f7499c87d51205817c93e9a8d42c4baestevel /*
03831d35f7499c87d51205817c93e9a8d42c4baestevel * find memory-bank
03831d35f7499c87d51205817c93e9a8d42c4baestevel */
03831d35f7499c87d51205817c93e9a8d42c4baestevel segp->bank_count = 0;
03831d35f7499c87d51205817c93e9a8d42c4baestevel err = picl_walk_tree_by_class(segh, PICL_CLASS_MEMORY_BANK, segp,
03831d35f7499c87d51205817c93e9a8d42c4baestevel membank_callback);
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf("\n");
03831d35f7499c87d51205817c93e9a8d42c4baestevel return (err);
03831d35f7499c87d51205817c93e9a8d42c4baestevel}
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel/*
03831d35f7499c87d51205817c93e9a8d42c4baestevel * print the label of memory module or the memory module bank ids
03831d35f7499c87d51205817c93e9a8d42c4baestevel */
03831d35f7499c87d51205817c93e9a8d42c4baestevelstatic int
03831d35f7499c87d51205817c93e9a8d42c4baestevellogprintf_seg_contains_col(picl_nodehdl_t nodeh, seg_info_t *segp)
03831d35f7499c87d51205817c93e9a8d42c4baestevel{
03831d35f7499c87d51205817c93e9a8d42c4baestevel picl_nodehdl_t moduleh;
03831d35f7499c87d51205817c93e9a8d42c4baestevel int err;
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel /*
03831d35f7499c87d51205817c93e9a8d42c4baestevel * find memory-module if referenced directly from the memory-segment
03831d35f7499c87d51205817c93e9a8d42c4baestevel * (ie no memory banks)
03831d35f7499c87d51205817c93e9a8d42c4baestevel */
03831d35f7499c87d51205817c93e9a8d42c4baestevel err = picl_get_propval_by_name(nodeh, PICL_REFPROP_MEMORY_MODULE,
03831d35f7499c87d51205817c93e9a8d42c4baestevel &moduleh, sizeof (moduleh));
03831d35f7499c87d51205817c93e9a8d42c4baestevel if ((err != PICL_SUCCESS) && (err != PICL_PROPNOTFOUND))
03831d35f7499c87d51205817c93e9a8d42c4baestevel return (err);
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (err == PICL_SUCCESS) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel err = logprintf_memory_module_label(moduleh);
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf("\n");
03831d35f7499c87d51205817c93e9a8d42c4baestevel return (err);
03831d35f7499c87d51205817c93e9a8d42c4baestevel }
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel /*
03831d35f7499c87d51205817c93e9a8d42c4baestevel * memory-module not referenced directly from the memory segment
03831d35f7499c87d51205817c93e9a8d42c4baestevel * so list memory banks instead
03831d35f7499c87d51205817c93e9a8d42c4baestevel */
03831d35f7499c87d51205817c93e9a8d42c4baestevel err = logprintf_bankinfo(nodeh, segp);
03831d35f7499c87d51205817c93e9a8d42c4baestevel return (err);
03831d35f7499c87d51205817c93e9a8d42c4baestevel}
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel/*
03831d35f7499c87d51205817c93e9a8d42c4baestevel * find all memory modules under the given memory module group
03831d35f7499c87d51205817c93e9a8d42c4baestevel * and print its label
03831d35f7499c87d51205817c93e9a8d42c4baestevel */
03831d35f7499c87d51205817c93e9a8d42c4baestevelstatic int
03831d35f7499c87d51205817c93e9a8d42c4baestevellogprintf_memory_module_group_info(picl_nodehdl_t memgrph, uint64_t mcid)
03831d35f7499c87d51205817c93e9a8d42c4baestevel{
03831d35f7499c87d51205817c93e9a8d42c4baestevel int err;
03831d35f7499c87d51205817c93e9a8d42c4baestevel int64_t id;
03831d35f7499c87d51205817c93e9a8d42c4baestevel boolean_t got_status;
03831d35f7499c87d51205817c93e9a8d42c4baestevel picl_nodehdl_t moduleh;
03831d35f7499c87d51205817c93e9a8d42c4baestevel char piclclass[PICL_CLASSNAMELEN_MAX];
03831d35f7499c87d51205817c93e9a8d42c4baestevel picl_nodehdl_t fruparenth;
03831d35f7499c87d51205817c93e9a8d42c4baestevel char *status;
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel id = picldiag_get_uint_propval(memgrph, PICL_PROP_ID, &err);
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (err == PICL_PROPNOTFOUND)
03831d35f7499c87d51205817c93e9a8d42c4baestevel id = -1;
03831d35f7499c87d51205817c93e9a8d42c4baestevel else if (err != PICL_SUCCESS)
03831d35f7499c87d51205817c93e9a8d42c4baestevel return (err);
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel err = picl_get_propval_by_name(memgrph, PICL_PROP_CHILD, &moduleh,
03831d35f7499c87d51205817c93e9a8d42c4baestevel sizeof (picl_nodehdl_t));
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel while (err == PICL_SUCCESS) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel /* controller id */
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf("%-8lld ", mcid);
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel /* group id */
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (id == -1) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf("- ");
03831d35f7499c87d51205817c93e9a8d42c4baestevel } else {
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf("%-8lld ", id);
03831d35f7499c87d51205817c93e9a8d42c4baestevel }
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel err = picl_get_propval_by_name(moduleh, PICL_PROP_CLASSNAME,
03831d35f7499c87d51205817c93e9a8d42c4baestevel piclclass, sizeof (piclclass));
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (err != PICL_SUCCESS)
03831d35f7499c87d51205817c93e9a8d42c4baestevel return (err);
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (strcmp(piclclass, PICL_CLASS_MEMORY_MODULE) == 0) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel err = logprintf_memory_module_label(moduleh);
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (err != PICL_SUCCESS)
03831d35f7499c87d51205817c93e9a8d42c4baestevel return (err);
03831d35f7499c87d51205817c93e9a8d42c4baestevel }
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel got_status = B_FALSE;
03831d35f7499c87d51205817c93e9a8d42c4baestevel err = picldiag_get_fru_parent(moduleh, &fruparenth);
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (err == PICL_SUCCESS) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel err = picldiag_get_string_propval(fruparenth,
03831d35f7499c87d51205817c93e9a8d42c4baestevel PICL_PROP_OPERATIONAL_STATUS, &status);
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (err == PICL_SUCCESS) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel got_status = B_TRUE;
03831d35f7499c87d51205817c93e9a8d42c4baestevel } else if (err != PICL_PROPNOTFOUND)
03831d35f7499c87d51205817c93e9a8d42c4baestevel return (err);
03831d35f7499c87d51205817c93e9a8d42c4baestevel } else if (err != PICL_PROPNOTFOUND)
03831d35f7499c87d51205817c93e9a8d42c4baestevel return (err);
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (!got_status) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel err = picldiag_get_string_propval(moduleh,
03831d35f7499c87d51205817c93e9a8d42c4baestevel PICL_PROP_STATUS, &status);
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (err == PICL_SUCCESS)
03831d35f7499c87d51205817c93e9a8d42c4baestevel got_status = B_TRUE;
03831d35f7499c87d51205817c93e9a8d42c4baestevel else if (err != PICL_PROPNOTFOUND)
03831d35f7499c87d51205817c93e9a8d42c4baestevel return (err);
03831d35f7499c87d51205817c93e9a8d42c4baestevel }
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (got_status) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf("%s", status);
03831d35f7499c87d51205817c93e9a8d42c4baestevel free(status);
03831d35f7499c87d51205817c93e9a8d42c4baestevel }
03831d35f7499c87d51205817c93e9a8d42c4baestevel err = picl_get_propval_by_name(moduleh, PICL_PROP_PEER,
03831d35f7499c87d51205817c93e9a8d42c4baestevel &moduleh, sizeof (picl_nodehdl_t));
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf("\n");
03831d35f7499c87d51205817c93e9a8d42c4baestevel }
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (err == PICL_PROPNOTFOUND)
03831d35f7499c87d51205817c93e9a8d42c4baestevel return (PICL_SUCCESS);
03831d35f7499c87d51205817c93e9a8d42c4baestevel return (err);
03831d35f7499c87d51205817c93e9a8d42c4baestevel}
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel/*
03831d35f7499c87d51205817c93e9a8d42c4baestevel * search children to find memory module group under memory-controller
03831d35f7499c87d51205817c93e9a8d42c4baestevel */
03831d35f7499c87d51205817c93e9a8d42c4baestevelstatic int
03831d35f7499c87d51205817c93e9a8d42c4baestevelfind_memory_module_group(picl_nodehdl_t mch, int *print_header)
03831d35f7499c87d51205817c93e9a8d42c4baestevel{
03831d35f7499c87d51205817c93e9a8d42c4baestevel picl_nodehdl_t memgrph;
03831d35f7499c87d51205817c93e9a8d42c4baestevel uint64_t mcid;
03831d35f7499c87d51205817c93e9a8d42c4baestevel int err;
03831d35f7499c87d51205817c93e9a8d42c4baestevel char piclclass[PICL_CLASSNAMELEN_MAX];
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel mcid = picldiag_get_uint_propval(mch, OBP_PROP_PORTID, &err);
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (err == PICL_PROPNOTFOUND)
03831d35f7499c87d51205817c93e9a8d42c4baestevel mcid = DEFAULT_PORTID;
03831d35f7499c87d51205817c93e9a8d42c4baestevel else if (err != PICL_SUCCESS)
03831d35f7499c87d51205817c93e9a8d42c4baestevel return (err);
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel err = picl_get_propval_by_name(mch, PICL_PROP_CHILD,
03831d35f7499c87d51205817c93e9a8d42c4baestevel &memgrph, sizeof (picl_nodehdl_t));
03831d35f7499c87d51205817c93e9a8d42c4baestevel while (err == PICL_SUCCESS) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel err = picl_get_propval_by_name(memgrph,
03831d35f7499c87d51205817c93e9a8d42c4baestevel PICL_PROP_CLASSNAME, piclclass, sizeof (piclclass));
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (err != PICL_SUCCESS)
03831d35f7499c87d51205817c93e9a8d42c4baestevel return (err);
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (strcmp(piclclass, PICL_CLASS_MEMORY_MODULE_GROUP) == 0) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (*print_header == 1) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf(
03831d35f7499c87d51205817c93e9a8d42c4baestevel dgettext(TEXT_DOMAIN,
2983dda76a6d296fdb560c88114fe41caad1b84fMichael Bergknoff "\nMemory Module Groups:\n"));
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf("--------------------------");
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf("------\n");
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf(dgettext(TEXT_DOMAIN,
03831d35f7499c87d51205817c93e9a8d42c4baestevel "ControllerID GroupID Labels\n"));
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf("--------------------------");
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf("------\n");
03831d35f7499c87d51205817c93e9a8d42c4baestevel *print_header = 0;
03831d35f7499c87d51205817c93e9a8d42c4baestevel }
03831d35f7499c87d51205817c93e9a8d42c4baestevel err = logprintf_memory_module_group_info(memgrph, mcid);
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (err != PICL_SUCCESS)
03831d35f7499c87d51205817c93e9a8d42c4baestevel return (err);
03831d35f7499c87d51205817c93e9a8d42c4baestevel }
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel err = picl_get_propval_by_name(memgrph, PICL_PROP_PEER,
03831d35f7499c87d51205817c93e9a8d42c4baestevel &memgrph, sizeof (picl_nodehdl_t));
03831d35f7499c87d51205817c93e9a8d42c4baestevel }
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (err == PICL_PROPNOTFOUND)
03831d35f7499c87d51205817c93e9a8d42c4baestevel return (PICL_SUCCESS);
03831d35f7499c87d51205817c93e9a8d42c4baestevel return (err);
03831d35f7499c87d51205817c93e9a8d42c4baestevel}
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel/*
03831d35f7499c87d51205817c93e9a8d42c4baestevel * print memory module group table per memory-controller
03831d35f7499c87d51205817c93e9a8d42c4baestevel */
03831d35f7499c87d51205817c93e9a8d42c4baestevelstatic int
03831d35f7499c87d51205817c93e9a8d42c4baestevelprint_memory_module_group_table(picl_nodehdl_t plafh)
03831d35f7499c87d51205817c93e9a8d42c4baestevel{
03831d35f7499c87d51205817c93e9a8d42c4baestevel picl_nodehdl_t mch;
03831d35f7499c87d51205817c93e9a8d42c4baestevel int err;
03831d35f7499c87d51205817c93e9a8d42c4baestevel char piclclass[PICL_CLASSNAMELEN_MAX];
03831d35f7499c87d51205817c93e9a8d42c4baestevel int print_header;
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel print_header = 1;
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel /*
03831d35f7499c87d51205817c93e9a8d42c4baestevel * find memory-controller
03831d35f7499c87d51205817c93e9a8d42c4baestevel */
03831d35f7499c87d51205817c93e9a8d42c4baestevel err = picl_get_propval_by_name(plafh, PICL_PROP_CHILD, &mch,
03831d35f7499c87d51205817c93e9a8d42c4baestevel sizeof (picl_nodehdl_t));
03831d35f7499c87d51205817c93e9a8d42c4baestevel while (err == PICL_SUCCESS) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel err = picl_get_propval_by_name(mch, PICL_PROP_CLASSNAME,
03831d35f7499c87d51205817c93e9a8d42c4baestevel piclclass, sizeof (piclclass));
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (err != PICL_SUCCESS)
03831d35f7499c87d51205817c93e9a8d42c4baestevel return (err);
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (strcmp(piclclass, PICL_CLASS_MEMORY_CONTROLLER) != 0) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel err = print_memory_module_group_table(mch);
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (err != PICL_SUCCESS)
03831d35f7499c87d51205817c93e9a8d42c4baestevel return (err);
03831d35f7499c87d51205817c93e9a8d42c4baestevel err = picl_get_propval_by_name(mch, PICL_PROP_PEER,
03831d35f7499c87d51205817c93e9a8d42c4baestevel &mch, sizeof (picl_nodehdl_t));
03831d35f7499c87d51205817c93e9a8d42c4baestevel continue;
03831d35f7499c87d51205817c93e9a8d42c4baestevel }
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel err = find_memory_module_group(mch, &print_header);
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (err != PICL_SUCCESS)
03831d35f7499c87d51205817c93e9a8d42c4baestevel return (err);
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel err = picl_get_propval_by_name(mch, PICL_PROP_PEER,
03831d35f7499c87d51205817c93e9a8d42c4baestevel &mch, sizeof (picl_nodehdl_t));
03831d35f7499c87d51205817c93e9a8d42c4baestevel }
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (err == PICL_PROPNOTFOUND)
03831d35f7499c87d51205817c93e9a8d42c4baestevel return (PICL_SUCCESS);
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel return (err);
03831d35f7499c87d51205817c93e9a8d42c4baestevel}
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel/*
03831d35f7499c87d51205817c93e9a8d42c4baestevel * print bank table
03831d35f7499c87d51205817c93e9a8d42c4baestevel */
03831d35f7499c87d51205817c93e9a8d42c4baestevelstatic int
03831d35f7499c87d51205817c93e9a8d42c4baestevelprint_bank_table(void)
03831d35f7499c87d51205817c93e9a8d42c4baestevel{
03831d35f7499c87d51205817c93e9a8d42c4baestevel bank_list_t *ptr;
03831d35f7499c87d51205817c93e9a8d42c4baestevel picl_nodehdl_t bankh;
03831d35f7499c87d51205817c93e9a8d42c4baestevel picl_nodehdl_t memgrph;
03831d35f7499c87d51205817c93e9a8d42c4baestevel picl_nodehdl_t mch;
03831d35f7499c87d51205817c93e9a8d42c4baestevel int err;
03831d35f7499c87d51205817c93e9a8d42c4baestevel int32_t i;
03831d35f7499c87d51205817c93e9a8d42c4baestevel uint64_t size;
03831d35f7499c87d51205817c93e9a8d42c4baestevel int id;
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf(dgettext(TEXT_DOMAIN, "\nBank Table:\n"));
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf("---------------------------------------");
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf("--------------------\n");
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf(dgettext(TEXT_DOMAIN, " Physical Location\n"));
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf(dgettext(TEXT_DOMAIN, "ID ControllerID GroupID "));
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf(dgettext(TEXT_DOMAIN, "Size Interleave Way\n"));
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf("---------------------------------------");
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf("--------------------\n");
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel for (ptr = mem_banks; ptr != NULL; ptr = ptr->next) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel bankh = ptr->nodeh;
03831d35f7499c87d51205817c93e9a8d42c4baestevel id = picldiag_get_uint_propval(bankh, PICL_PROP_ID, &err);
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (err != PICL_SUCCESS)
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf("%-8s ", "-");
03831d35f7499c87d51205817c93e9a8d42c4baestevel else
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf("%-8d ", id);
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel /* find memory-module-group */
03831d35f7499c87d51205817c93e9a8d42c4baestevel err = picl_get_propval_by_name(bankh,
03831d35f7499c87d51205817c93e9a8d42c4baestevel PICL_REFPROP_MEMORY_MODULE_GROUP, &memgrph,
03831d35f7499c87d51205817c93e9a8d42c4baestevel sizeof (memgrph));
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (err == PICL_PROPNOTFOUND) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf("%-8s ", "-");
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf("%-8s ", "-");
03831d35f7499c87d51205817c93e9a8d42c4baestevel } else if (err != PICL_SUCCESS)
03831d35f7499c87d51205817c93e9a8d42c4baestevel return (err);
03831d35f7499c87d51205817c93e9a8d42c4baestevel else {
03831d35f7499c87d51205817c93e9a8d42c4baestevel /*
03831d35f7499c87d51205817c93e9a8d42c4baestevel * get controller id
03831d35f7499c87d51205817c93e9a8d42c4baestevel */
03831d35f7499c87d51205817c93e9a8d42c4baestevel err = picl_get_propval_by_name(memgrph,
03831d35f7499c87d51205817c93e9a8d42c4baestevel PICL_PROP_PARENT, &mch, sizeof (picl_nodehdl_t));
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (err != PICL_SUCCESS)
03831d35f7499c87d51205817c93e9a8d42c4baestevel return (err);
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel id = picldiag_get_uint_propval(mch, OBP_PROP_PORTID,
03831d35f7499c87d51205817c93e9a8d42c4baestevel &err);
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (err == PICL_PROPNOTFOUND)
03831d35f7499c87d51205817c93e9a8d42c4baestevel id = DEFAULT_PORTID; /* use default */
03831d35f7499c87d51205817c93e9a8d42c4baestevel else if (err != PICL_SUCCESS)
03831d35f7499c87d51205817c93e9a8d42c4baestevel return (err);
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf("%-8d ", id);
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel /* get group id */
03831d35f7499c87d51205817c93e9a8d42c4baestevel id = picldiag_get_uint_propval(memgrph, PICL_PROP_ID,
03831d35f7499c87d51205817c93e9a8d42c4baestevel &err);
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (err == PICL_PROPNOTFOUND)
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf("- ");
03831d35f7499c87d51205817c93e9a8d42c4baestevel else if (err == PICL_SUCCESS)
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf("%-8d ", id);
03831d35f7499c87d51205817c93e9a8d42c4baestevel else
03831d35f7499c87d51205817c93e9a8d42c4baestevel return (err);
03831d35f7499c87d51205817c93e9a8d42c4baestevel }
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel size = picldiag_get_uint_propval(bankh, PICL_PROP_SIZE, &err);
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (err == PICL_PROPNOTFOUND)
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf("- ");
03831d35f7499c87d51205817c93e9a8d42c4baestevel else if (err == PICL_SUCCESS)
03831d35f7499c87d51205817c93e9a8d42c4baestevel logprintf_size(size);
03831d35f7499c87d51205817c93e9a8d42c4baestevel else
03831d35f7499c87d51205817c93e9a8d42c4baestevel return (err);
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf(" ");
03831d35f7499c87d51205817c93e9a8d42c4baestevel for (i = 0; i < ptr->iway_count; i++) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (i != 0)
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf(",");
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf("%d", ptr->iway[i]);
03831d35f7499c87d51205817c93e9a8d42c4baestevel }
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf("\n");
03831d35f7499c87d51205817c93e9a8d42c4baestevel }
03831d35f7499c87d51205817c93e9a8d42c4baestevel return (PICL_SUCCESS);
03831d35f7499c87d51205817c93e9a8d42c4baestevel}
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel/*
03831d35f7499c87d51205817c93e9a8d42c4baestevel * callback function to print segment, add the bank in the list and
03831d35f7499c87d51205817c93e9a8d42c4baestevel * return the bank list
03831d35f7499c87d51205817c93e9a8d42c4baestevel */
03831d35f7499c87d51205817c93e9a8d42c4baestevel/* ARGSUSED */
03831d35f7499c87d51205817c93e9a8d42c4baestevelstatic int
03831d35f7499c87d51205817c93e9a8d42c4baestevelmemseg_callback(picl_nodehdl_t segh, void *args)
03831d35f7499c87d51205817c93e9a8d42c4baestevel{
03831d35f7499c87d51205817c93e9a8d42c4baestevel seg_info_t seginfo;
03831d35f7499c87d51205817c93e9a8d42c4baestevel int err;
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel /* get base address */
03831d35f7499c87d51205817c93e9a8d42c4baestevel seginfo.base = picldiag_get_uint_propval(segh, PICL_PROP_BASEADDRESS,
03831d35f7499c87d51205817c93e9a8d42c4baestevel &err);
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (err == PICL_PROPNOTFOUND) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf("-\n");
03831d35f7499c87d51205817c93e9a8d42c4baestevel return (PICL_WALK_CONTINUE);
03831d35f7499c87d51205817c93e9a8d42c4baestevel } else if (err == PICL_SUCCESS)
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf("0x%-16llx ", seginfo.base);
03831d35f7499c87d51205817c93e9a8d42c4baestevel else
03831d35f7499c87d51205817c93e9a8d42c4baestevel return (err);
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel /* get size */
03831d35f7499c87d51205817c93e9a8d42c4baestevel seginfo.size = picldiag_get_uint_propval(segh, PICL_PROP_SIZE, &err);
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (err == PICL_PROPNOTFOUND) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf("-\n");
03831d35f7499c87d51205817c93e9a8d42c4baestevel return (PICL_WALK_CONTINUE);
03831d35f7499c87d51205817c93e9a8d42c4baestevel } else if (err == PICL_SUCCESS)
03831d35f7499c87d51205817c93e9a8d42c4baestevel logprintf_size(seginfo.size);
03831d35f7499c87d51205817c93e9a8d42c4baestevel else
03831d35f7499c87d51205817c93e9a8d42c4baestevel return (err);
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel /* get interleave factor */
03831d35f7499c87d51205817c93e9a8d42c4baestevel seginfo.ifactor = picldiag_get_uint_propval(segh,
03831d35f7499c87d51205817c93e9a8d42c4baestevel PICL_PROP_INTERLEAVE_FACTOR, &err);
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (err == PICL_PROPNOTFOUND) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf(" -\n");
03831d35f7499c87d51205817c93e9a8d42c4baestevel return (PICL_WALK_CONTINUE);
03831d35f7499c87d51205817c93e9a8d42c4baestevel } else if (err == PICL_SUCCESS)
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf(" %-2d ", seginfo.ifactor);
03831d35f7499c87d51205817c93e9a8d42c4baestevel else
03831d35f7499c87d51205817c93e9a8d42c4baestevel return (err);
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel seginfo.bank_count = 0;
03831d35f7499c87d51205817c93e9a8d42c4baestevel err = logprintf_seg_contains_col(segh, &seginfo);
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (err != PICL_SUCCESS)
03831d35f7499c87d51205817c93e9a8d42c4baestevel return (err);
03831d35f7499c87d51205817c93e9a8d42c4baestevel return (PICL_WALK_CONTINUE);
03831d35f7499c87d51205817c93e9a8d42c4baestevel}
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel/*
03831d35f7499c87d51205817c93e9a8d42c4baestevel * search children to find memory-segment and set up the bank list
03831d35f7499c87d51205817c93e9a8d42c4baestevel */
03831d35f7499c87d51205817c93e9a8d42c4baestevelstatic int
03831d35f7499c87d51205817c93e9a8d42c4baestevelfind_segments(picl_nodehdl_t plafh)
03831d35f7499c87d51205817c93e9a8d42c4baestevel{
03831d35f7499c87d51205817c93e9a8d42c4baestevel int err;
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf(dgettext(TEXT_DOMAIN, "Segment Table:\n"));
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf("------------------------------");
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf("-----------------------------------------\n");
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf(dgettext(TEXT_DOMAIN, "Base Address Size "));
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf(dgettext(TEXT_DOMAIN, "Interleave Factor Contains\n"));
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf("------------------------------");
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf("-----------------------------------------\n");
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel err = picl_walk_tree_by_class(plafh, PICL_CLASS_MEMORY_SEGMENT,
03831d35f7499c87d51205817c93e9a8d42c4baestevel NULL, memseg_callback);
03831d35f7499c87d51205817c93e9a8d42c4baestevel return (err);
03831d35f7499c87d51205817c93e9a8d42c4baestevel}
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel/*
03831d35f7499c87d51205817c93e9a8d42c4baestevel * display memory configuration
03831d35f7499c87d51205817c93e9a8d42c4baestevel */
03831d35f7499c87d51205817c93e9a8d42c4baestevelstatic int
03831d35f7499c87d51205817c93e9a8d42c4baesteveldisplay_memory_config(picl_nodehdl_t plafh)
03831d35f7499c87d51205817c93e9a8d42c4baestevel{
03831d35f7499c87d51205817c93e9a8d42c4baestevel int err;
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel logprintf_header(dgettext(TEXT_DOMAIN, "Memory Configuration"),
03831d35f7499c87d51205817c93e9a8d42c4baestevel DEFAULT_LINE_WIDTH);
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel mem_banks = NULL;
03831d35f7499c87d51205817c93e9a8d42c4baestevel err = find_segments(plafh);
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel if ((err == PICL_SUCCESS) && (mem_banks != NULL))
03831d35f7499c87d51205817c93e9a8d42c4baestevel print_bank_table();
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel free_bank_list();
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel return (print_memory_module_group_table(plafh));
03831d35f7499c87d51205817c93e9a8d42c4baestevel}
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel/*
03831d35f7499c87d51205817c93e9a8d42c4baestevel * print the hub device
03831d35f7499c87d51205817c93e9a8d42c4baestevel */
03831d35f7499c87d51205817c93e9a8d42c4baestevelstatic int
03831d35f7499c87d51205817c93e9a8d42c4baestevellogprintf_hub_devices(picl_nodehdl_t hubh)
03831d35f7499c87d51205817c93e9a8d42c4baestevel{
03831d35f7499c87d51205817c93e9a8d42c4baestevel char *name;
03831d35f7499c87d51205817c93e9a8d42c4baestevel int portnum;
03831d35f7499c87d51205817c93e9a8d42c4baestevel char *labelp;
03831d35f7499c87d51205817c93e9a8d42c4baestevel picl_nodehdl_t parenth;
03831d35f7499c87d51205817c93e9a8d42c4baestevel int err;
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel err = picldiag_get_string_propval(hubh, PICL_PROP_NAME, &name);
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (err != PICL_SUCCESS)
03831d35f7499c87d51205817c93e9a8d42c4baestevel return (err);
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf("%-12.12s ", name);
03831d35f7499c87d51205817c93e9a8d42c4baestevel free(name);
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel err = picl_get_propval_by_name(hubh, PICL_REFPROP_LOC_PARENT, &parenth,
03831d35f7499c87d51205817c93e9a8d42c4baestevel sizeof (picl_nodehdl_t));
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (err == PICL_SUCCESS) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel /* Read the Label */
03831d35f7499c87d51205817c93e9a8d42c4baestevel err = picldiag_get_label(parenth, &labelp);
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (err == PICL_SUCCESS) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf("%s\n", labelp);
03831d35f7499c87d51205817c93e9a8d42c4baestevel free(labelp);
03831d35f7499c87d51205817c93e9a8d42c4baestevel return (PICL_SUCCESS);
03831d35f7499c87d51205817c93e9a8d42c4baestevel } else if (err != PICL_PROPNOTFOUND) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf("\n");
03831d35f7499c87d51205817c93e9a8d42c4baestevel return (err);
03831d35f7499c87d51205817c93e9a8d42c4baestevel }
03831d35f7499c87d51205817c93e9a8d42c4baestevel } else if (err != PICL_PROPNOTFOUND) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf("\n");
03831d35f7499c87d51205817c93e9a8d42c4baestevel return (err);
03831d35f7499c87d51205817c93e9a8d42c4baestevel }
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel /* No Label, try the reg */
03831d35f7499c87d51205817c93e9a8d42c4baestevel err = picl_get_propval_by_name(hubh, OBP_PROP_REG, &portnum,
03831d35f7499c87d51205817c93e9a8d42c4baestevel sizeof (portnum));
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (err == PICL_PROPNOTFOUND)
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf(" -\n");
03831d35f7499c87d51205817c93e9a8d42c4baestevel else if (err != PICL_SUCCESS) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf("\n");
03831d35f7499c87d51205817c93e9a8d42c4baestevel return (err);
03831d35f7499c87d51205817c93e9a8d42c4baestevel } else
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf("%3d\n", portnum);
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel return (PICL_SUCCESS);
03831d35f7499c87d51205817c93e9a8d42c4baestevel}
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel/*
03831d35f7499c87d51205817c93e9a8d42c4baestevel * callback functions to display hub devices
03831d35f7499c87d51205817c93e9a8d42c4baestevel */
03831d35f7499c87d51205817c93e9a8d42c4baestevel/* ARGSUSED */
03831d35f7499c87d51205817c93e9a8d42c4baestevelstatic int
03831d35f7499c87d51205817c93e9a8d42c4baestevelprint_usb_devices(picl_nodehdl_t hubh, void *arg)
03831d35f7499c87d51205817c93e9a8d42c4baestevel{
03831d35f7499c87d51205817c93e9a8d42c4baestevel picl_nodehdl_t chdh;
03831d35f7499c87d51205817c93e9a8d42c4baestevel char *rootname;
03831d35f7499c87d51205817c93e9a8d42c4baestevel int type = *(int *)arg;
03831d35f7499c87d51205817c93e9a8d42c4baestevel int hubnum;
03831d35f7499c87d51205817c93e9a8d42c4baestevel int err;
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel err = picl_get_propval_by_name(hubh, PICL_PROP_CHILD, &chdh,
03831d35f7499c87d51205817c93e9a8d42c4baestevel sizeof (picl_nodehdl_t));
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel /* print header */
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (err == PICL_SUCCESS) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel err = picldiag_get_string_propval(hubh, PICL_PROP_NAME,
03831d35f7499c87d51205817c93e9a8d42c4baestevel &rootname);
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (err != PICL_SUCCESS)
03831d35f7499c87d51205817c93e9a8d42c4baestevel return (err);
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (type == USB) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf("\n===============================");
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf(dgettext(TEXT_DOMAIN,
03831d35f7499c87d51205817c93e9a8d42c4baestevel " %s Devices "), rootname);
03831d35f7499c87d51205817c93e9a8d42c4baestevel } else {
03831d35f7499c87d51205817c93e9a8d42c4baestevel /* Get its hub number */
03831d35f7499c87d51205817c93e9a8d42c4baestevel err = picl_get_propval_by_name(hubh,
03831d35f7499c87d51205817c93e9a8d42c4baestevel OBP_PROP_REG, &hubnum, sizeof (hubnum));
03831d35f7499c87d51205817c93e9a8d42c4baestevel if ((err != PICL_SUCCESS) &&
03831d35f7499c87d51205817c93e9a8d42c4baestevel (err != PICL_PROPNOTFOUND)) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel free(rootname);
03831d35f7499c87d51205817c93e9a8d42c4baestevel return (err);
03831d35f7499c87d51205817c93e9a8d42c4baestevel }
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf("\n===============================");
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (err == PICL_SUCCESS)
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf(dgettext(TEXT_DOMAIN,
03831d35f7499c87d51205817c93e9a8d42c4baestevel " %s#%d Devices "),
03831d35f7499c87d51205817c93e9a8d42c4baestevel rootname, hubnum);
03831d35f7499c87d51205817c93e9a8d42c4baestevel else
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf(dgettext(TEXT_DOMAIN,
03831d35f7499c87d51205817c93e9a8d42c4baestevel " %s Devices "), rootname);
03831d35f7499c87d51205817c93e9a8d42c4baestevel }
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf("===============================\n\n");
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf(dgettext(TEXT_DOMAIN, "Name Port#\n"));
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf("------------ -----\n");
03831d35f7499c87d51205817c93e9a8d42c4baestevel free(rootname);
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel do {
03831d35f7499c87d51205817c93e9a8d42c4baestevel logprintf_hub_devices(chdh);
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel err = picl_get_propval_by_name(chdh, PICL_PROP_PEER,
03831d35f7499c87d51205817c93e9a8d42c4baestevel &chdh, sizeof (picl_nodehdl_t));
03831d35f7499c87d51205817c93e9a8d42c4baestevel } while (err == PICL_SUCCESS);
03831d35f7499c87d51205817c93e9a8d42c4baestevel }
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (err == PICL_PROPNOTFOUND)
03831d35f7499c87d51205817c93e9a8d42c4baestevel return (PICL_WALK_CONTINUE);
03831d35f7499c87d51205817c93e9a8d42c4baestevel return (err);
03831d35f7499c87d51205817c93e9a8d42c4baestevel}
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel/*
03831d35f7499c87d51205817c93e9a8d42c4baestevel * callback functions to display usb devices
03831d35f7499c87d51205817c93e9a8d42c4baestevel */
03831d35f7499c87d51205817c93e9a8d42c4baestevel/* ARGSUSED */
03831d35f7499c87d51205817c93e9a8d42c4baestevelstatic int
03831d35f7499c87d51205817c93e9a8d42c4baestevelusb_callback(picl_nodehdl_t usbh, void *args)
03831d35f7499c87d51205817c93e9a8d42c4baestevel{
03831d35f7499c87d51205817c93e9a8d42c4baestevel int err;
03831d35f7499c87d51205817c93e9a8d42c4baestevel int type;
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel type = USB;
03831d35f7499c87d51205817c93e9a8d42c4baestevel err = print_usb_devices(usbh, &type);
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (err != PICL_WALK_CONTINUE)
03831d35f7499c87d51205817c93e9a8d42c4baestevel return (err);
03831d35f7499c87d51205817c93e9a8d42c4baestevel type = HUB;
03831d35f7499c87d51205817c93e9a8d42c4baestevel err = picl_walk_tree_by_class(usbh, NULL, &type, print_usb_devices);
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (err == PICL_SUCCESS)
03831d35f7499c87d51205817c93e9a8d42c4baestevel err = PICL_WALK_CONTINUE;
03831d35f7499c87d51205817c93e9a8d42c4baestevel return (err);
03831d35f7499c87d51205817c93e9a8d42c4baestevel}
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel/*
03831d35f7499c87d51205817c93e9a8d42c4baestevel * find usb devices and print its information
03831d35f7499c87d51205817c93e9a8d42c4baestevel */
03831d35f7499c87d51205817c93e9a8d42c4baestevelstatic int
03831d35f7499c87d51205817c93e9a8d42c4baesteveldisplay_usb_devices(picl_nodehdl_t plafh)
03831d35f7499c87d51205817c93e9a8d42c4baestevel{
03831d35f7499c87d51205817c93e9a8d42c4baestevel int err;
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel /*
03831d35f7499c87d51205817c93e9a8d42c4baestevel * get the usb node
03831d35f7499c87d51205817c93e9a8d42c4baestevel */
03831d35f7499c87d51205817c93e9a8d42c4baestevel err = picl_walk_tree_by_class(plafh, PICL_CLASS_USB, NULL,
03831d35f7499c87d51205817c93e9a8d42c4baestevel usb_callback);
03831d35f7499c87d51205817c93e9a8d42c4baestevel return (err);
03831d35f7499c87d51205817c93e9a8d42c4baestevel}
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel/*
03831d35f7499c87d51205817c93e9a8d42c4baestevel * If nodeh is the io device, add it into the io list and return
03831d35f7499c87d51205817c93e9a8d42c4baestevel * If it is not an io device and it has the subtree, traverse the subtree
03831d35f7499c87d51205817c93e9a8d42c4baestevel * and add all leaf io devices
03831d35f7499c87d51205817c93e9a8d42c4baestevel */
03831d35f7499c87d51205817c93e9a8d42c4baestevelstatic int
03831d35f7499c87d51205817c93e9a8d42c4baesteveladd_io_leaves(picl_nodehdl_t nodeh, char *parentname, uint32_t board,
03831d35f7499c87d51205817c93e9a8d42c4baestevel uint32_t bus_id, uint64_t slot, uint32_t freq, char *model, char *status)
03831d35f7499c87d51205817c93e9a8d42c4baestevel{
03831d35f7499c87d51205817c93e9a8d42c4baestevel picl_nodehdl_t childh;
03831d35f7499c87d51205817c93e9a8d42c4baestevel picl_prophdl_t proph;
03831d35f7499c87d51205817c93e9a8d42c4baestevel picl_propinfo_t pinfo;
03831d35f7499c87d51205817c93e9a8d42c4baestevel int err;
03831d35f7499c87d51205817c93e9a8d42c4baestevel char *nameval;
03831d35f7499c87d51205817c93e9a8d42c4baestevel char piclclass[PICL_CLASSNAMELEN_MAX];
03831d35f7499c87d51205817c93e9a8d42c4baestevel char nodename[MAXSTRLEN];
03831d35f7499c87d51205817c93e9a8d42c4baestevel char name[MAXSTRLEN];
03831d35f7499c87d51205817c93e9a8d42c4baestevel char *devfs_path;
03831d35f7499c87d51205817c93e9a8d42c4baestevel char *compatible;
03831d35f7499c87d51205817c93e9a8d42c4baestevel picl_nodehdl_t fruparenth;
03831d35f7499c87d51205817c93e9a8d42c4baestevel char *label;
03831d35f7499c87d51205817c93e9a8d42c4baestevel char binding_name[MAXSTRLEN];
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel err = picl_get_propinfo_by_name(nodeh, PICL_PROP_NAME, &pinfo,
03831d35f7499c87d51205817c93e9a8d42c4baestevel &proph);
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (err != PICL_SUCCESS)
03831d35f7499c87d51205817c93e9a8d42c4baestevel return (err);
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel nameval = alloca(pinfo.size);
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (nameval == NULL)
03831d35f7499c87d51205817c93e9a8d42c4baestevel return (PICL_FAILURE);
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel err = picl_get_propval(proph, nameval, pinfo.size);
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (err != PICL_SUCCESS)
03831d35f7499c87d51205817c93e9a8d42c4baestevel return (err);
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel (void) strlcpy(nodename, nameval, MAXSTRLEN);
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel err = picl_get_propval_by_name(nodeh, PICL_PROP_CLASSNAME,
03831d35f7499c87d51205817c93e9a8d42c4baestevel piclclass, sizeof (piclclass));
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (err != PICL_SUCCESS)
03831d35f7499c87d51205817c93e9a8d42c4baestevel return (err);
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel /* if binding_name is found, name will be <nodename>-<binding_name> */
03831d35f7499c87d51205817c93e9a8d42c4baestevel err = picl_get_propval_by_name(nodeh, PICL_PROP_BINDING_NAME,
03831d35f7499c87d51205817c93e9a8d42c4baestevel binding_name, sizeof (binding_name));
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (err == PICL_PROPNOTFOUND) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel /*
03831d35f7499c87d51205817c93e9a8d42c4baestevel * if compatible prop is found, name will be
03831d35f7499c87d51205817c93e9a8d42c4baestevel * <nodename>-<compatible>
03831d35f7499c87d51205817c93e9a8d42c4baestevel */
03831d35f7499c87d51205817c93e9a8d42c4baestevel err = picldiag_get_first_compatible_value(nodeh, &compatible);
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (err == PICL_SUCCESS) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel strlcat(nodename, "-", MAXSTRLEN);
03831d35f7499c87d51205817c93e9a8d42c4baestevel strlcat(nodename, compatible, MAXSTRLEN);
03831d35f7499c87d51205817c93e9a8d42c4baestevel free(compatible);
03831d35f7499c87d51205817c93e9a8d42c4baestevel } else if (err != PICL_PROPNOTFOUND) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel return (err);
03831d35f7499c87d51205817c93e9a8d42c4baestevel }
03831d35f7499c87d51205817c93e9a8d42c4baestevel } else if (err != PICL_SUCCESS) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel return (err);
03831d35f7499c87d51205817c93e9a8d42c4baestevel } else if (strcmp(nodename, binding_name) != 0) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (strcmp(nodename, piclclass) == 0) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel /*
03831d35f7499c87d51205817c93e9a8d42c4baestevel * nodename same as binding name -
03831d35f7499c87d51205817c93e9a8d42c4baestevel * no need to display twice
03831d35f7499c87d51205817c93e9a8d42c4baestevel */
03831d35f7499c87d51205817c93e9a8d42c4baestevel strlcpy(nodename, binding_name, MAXSTRLEN);
03831d35f7499c87d51205817c93e9a8d42c4baestevel } else {
03831d35f7499c87d51205817c93e9a8d42c4baestevel strlcat(nodename, "-", MAXSTRLEN);
03831d35f7499c87d51205817c93e9a8d42c4baestevel strlcat(nodename, binding_name, MAXSTRLEN);
03831d35f7499c87d51205817c93e9a8d42c4baestevel }
03831d35f7499c87d51205817c93e9a8d42c4baestevel }
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel /*
03831d35f7499c87d51205817c93e9a8d42c4baestevel * If it is an immediate child under pci and not
03831d35f7499c87d51205817c93e9a8d42c4baestevel * a bus node, add it to the io list.
03831d35f7499c87d51205817c93e9a8d42c4baestevel * If it is a child under sub-bus and it is in an io
03831d35f7499c87d51205817c93e9a8d42c4baestevel * device, add it to the io list.
03831d35f7499c87d51205817c93e9a8d42c4baestevel */
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (((parentname == NULL) && (!is_bus(piclclass))) ||
03831d35f7499c87d51205817c93e9a8d42c4baestevel ((parentname != NULL) && (is_io_device(piclclass)))) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (parentname == NULL)
03831d35f7499c87d51205817c93e9a8d42c4baestevel (void) snprintf(name, MAXSTRLEN, "%s", nodename);
03831d35f7499c87d51205817c93e9a8d42c4baestevel else
03831d35f7499c87d51205817c93e9a8d42c4baestevel (void) snprintf(name, MAXSTRLEN, "%s/%s", parentname,
03831d35f7499c87d51205817c93e9a8d42c4baestevel nodename);
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel /*
03831d35f7499c87d51205817c93e9a8d42c4baestevel * append the class if its class is not a generic
03831d35f7499c87d51205817c93e9a8d42c4baestevel * obp-device class
03831d35f7499c87d51205817c93e9a8d42c4baestevel */
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (strcmp(piclclass, PICL_CLASS_OBP_DEVICE))
03831d35f7499c87d51205817c93e9a8d42c4baestevel (void) snprintf(name, MAXSTRLEN, "%s (%s)", name,
03831d35f7499c87d51205817c93e9a8d42c4baestevel piclclass);
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel err = picldiag_get_fru_parent(nodeh, &fruparenth);
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (err == PICL_PROPNOTFOUND) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel label = NULL;
03831d35f7499c87d51205817c93e9a8d42c4baestevel } else if (err != PICL_SUCCESS) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel return (err);
03831d35f7499c87d51205817c93e9a8d42c4baestevel } else {
03831d35f7499c87d51205817c93e9a8d42c4baestevel err = picldiag_get_combined_label(fruparenth, &label,
03831d35f7499c87d51205817c93e9a8d42c4baestevel 15);
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (err == PICL_PROPNOTFOUND)
03831d35f7499c87d51205817c93e9a8d42c4baestevel label = NULL;
03831d35f7499c87d51205817c93e9a8d42c4baestevel else if (err != PICL_SUCCESS)
03831d35f7499c87d51205817c93e9a8d42c4baestevel return (err);
03831d35f7499c87d51205817c93e9a8d42c4baestevel }
03831d35f7499c87d51205817c93e9a8d42c4baestevel /* devfs-path */
03831d35f7499c87d51205817c93e9a8d42c4baestevel err = picldiag_get_string_propval(nodeh, PICL_PROP_DEVFS_PATH,
03831d35f7499c87d51205817c93e9a8d42c4baestevel &devfs_path);
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (err == PICL_PROPNOTFOUND)
03831d35f7499c87d51205817c93e9a8d42c4baestevel devfs_path = NULL;
03831d35f7499c87d51205817c93e9a8d42c4baestevel else if (err != PICL_SUCCESS)
03831d35f7499c87d51205817c93e9a8d42c4baestevel return (err);
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel add_io_card(board, bus_id, slot, label, freq, name,
03831d35f7499c87d51205817c93e9a8d42c4baestevel model, status, devfs_path);
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (label != NULL)
03831d35f7499c87d51205817c93e9a8d42c4baestevel free(label);
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (devfs_path != NULL)
03831d35f7499c87d51205817c93e9a8d42c4baestevel free(devfs_path);
03831d35f7499c87d51205817c93e9a8d42c4baestevel return (PICL_SUCCESS);
03831d35f7499c87d51205817c93e9a8d42c4baestevel }
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel /*
03831d35f7499c87d51205817c93e9a8d42c4baestevel * If there is any child, Go through each child.
03831d35f7499c87d51205817c93e9a8d42c4baestevel */
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel err = picl_get_propval_by_name(nodeh, PICL_PROP_CHILD,
03831d35f7499c87d51205817c93e9a8d42c4baestevel &childh, sizeof (picl_nodehdl_t));
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel /* there is a child */
03831d35f7499c87d51205817c93e9a8d42c4baestevel while (err == PICL_SUCCESS) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (parentname == NULL)
03831d35f7499c87d51205817c93e9a8d42c4baestevel (void) strlcpy(name, nodename, MAXSTRLEN);
03831d35f7499c87d51205817c93e9a8d42c4baestevel else
03831d35f7499c87d51205817c93e9a8d42c4baestevel (void) snprintf(name, MAXSTRLEN, "%s/%s", parentname,
03831d35f7499c87d51205817c93e9a8d42c4baestevel nodename);
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel err = add_io_leaves(childh, name, board, bus_id, slot, freq,
03831d35f7499c87d51205817c93e9a8d42c4baestevel model, status);
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (err != PICL_SUCCESS)
03831d35f7499c87d51205817c93e9a8d42c4baestevel return (err);
03831d35f7499c87d51205817c93e9a8d42c4baestevel /*
03831d35f7499c87d51205817c93e9a8d42c4baestevel * get next child
03831d35f7499c87d51205817c93e9a8d42c4baestevel */
03831d35f7499c87d51205817c93e9a8d42c4baestevel err = picl_get_propval_by_name(childh, PICL_PROP_PEER,
03831d35f7499c87d51205817c93e9a8d42c4baestevel &childh, sizeof (picl_nodehdl_t));
03831d35f7499c87d51205817c93e9a8d42c4baestevel }
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (err == PICL_PROPNOTFOUND)
03831d35f7499c87d51205817c93e9a8d42c4baestevel return (PICL_SUCCESS);
03831d35f7499c87d51205817c93e9a8d42c4baestevel return (err);
03831d35f7499c87d51205817c93e9a8d42c4baestevel}
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel/*
03831d35f7499c87d51205817c93e9a8d42c4baestevel * add all io devices under pci in io list
03831d35f7499c87d51205817c93e9a8d42c4baestevel */
03831d35f7499c87d51205817c93e9a8d42c4baestevel/* ARGSUSED */
03831d35f7499c87d51205817c93e9a8d42c4baestevelstatic int
03831d35f7499c87d51205817c93e9a8d42c4baestevelpci_callback(picl_nodehdl_t pcih, void *args)
03831d35f7499c87d51205817c93e9a8d42c4baestevel{
03831d35f7499c87d51205817c93e9a8d42c4baestevel picl_nodehdl_t nodeh;
03831d35f7499c87d51205817c93e9a8d42c4baestevel int err;
03831d35f7499c87d51205817c93e9a8d42c4baestevel char piclclass[PICL_CLASSNAMELEN_MAX];
03831d35f7499c87d51205817c93e9a8d42c4baestevel uint32_t boardnum;
03831d35f7499c87d51205817c93e9a8d42c4baestevel uint32_t bus_id;
03831d35f7499c87d51205817c93e9a8d42c4baestevel uint32_t slot;
03831d35f7499c87d51205817c93e9a8d42c4baestevel uint32_t freq;
03831d35f7499c87d51205817c93e9a8d42c4baestevel char *model;
03831d35f7499c87d51205817c93e9a8d42c4baestevel char *status;
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel /* Fill in common infomation */
03831d35f7499c87d51205817c93e9a8d42c4baestevel bus_id = PCI_TYPE;
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel /*
03831d35f7499c87d51205817c93e9a8d42c4baestevel * Check if it has the freq, if not,
03831d35f7499c87d51205817c93e9a8d42c4baestevel * If not, use its parent's freq
03831d35f7499c87d51205817c93e9a8d42c4baestevel * if its parent's freq is not found, return
03831d35f7499c87d51205817c93e9a8d42c4baestevel */
03831d35f7499c87d51205817c93e9a8d42c4baestevel err = picldiag_get_clock_freq(pcih, &freq);
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (err == PICL_PROPNOTFOUND) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel err = picldiag_get_clock_from_parent(pcih, &freq);
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (err == PICL_PROPNOTFOUND)
03831d35f7499c87d51205817c93e9a8d42c4baestevel return (PICL_WALK_CONTINUE);
03831d35f7499c87d51205817c93e9a8d42c4baestevel else if (err != PICL_SUCCESS)
03831d35f7499c87d51205817c93e9a8d42c4baestevel return (err);
03831d35f7499c87d51205817c93e9a8d42c4baestevel } else if (err != PICL_SUCCESS)
03831d35f7499c87d51205817c93e9a8d42c4baestevel return (err);
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel /*
03831d35f7499c87d51205817c93e9a8d42c4baestevel * If no board# is found, set boardnum to 0
03831d35f7499c87d51205817c93e9a8d42c4baestevel */
03831d35f7499c87d51205817c93e9a8d42c4baestevel boardnum = picldiag_get_uint_propval(pcih, OBP_PROP_BOARD_NUM, &err);
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (err == PICL_PROPNOTFOUND)
03831d35f7499c87d51205817c93e9a8d42c4baestevel boardnum = DEFAULT_BOARD_NUM;
03831d35f7499c87d51205817c93e9a8d42c4baestevel else if (err != PICL_SUCCESS)
03831d35f7499c87d51205817c93e9a8d42c4baestevel return (err);
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel /* Walk through the children */
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel err = picl_get_propval_by_name(pcih, PICL_PROP_CHILD, &nodeh,
03831d35f7499c87d51205817c93e9a8d42c4baestevel sizeof (picl_nodehdl_t));
03831d35f7499c87d51205817c93e9a8d42c4baestevel while (err == PICL_SUCCESS) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel err = picl_get_propval_by_name(nodeh, PICL_PROP_CLASSNAME,
03831d35f7499c87d51205817c93e9a8d42c4baestevel piclclass, sizeof (piclclass));
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (err != PICL_SUCCESS)
03831d35f7499c87d51205817c93e9a8d42c4baestevel return (err);
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel /*
03831d35f7499c87d51205817c93e9a8d42c4baestevel * Skip PCI bridge and USB devices because they will be
03831d35f7499c87d51205817c93e9a8d42c4baestevel * processed later
03831d35f7499c87d51205817c93e9a8d42c4baestevel */
03831d35f7499c87d51205817c93e9a8d42c4baestevel if ((strcmp(piclclass, PICL_CLASS_PCI) == 0) ||
03831d35f7499c87d51205817c93e9a8d42c4baestevel (strcmp(piclclass, PICL_CLASS_USB) == 0)) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel err = picl_get_propval_by_name(nodeh, PICL_PROP_PEER,
03831d35f7499c87d51205817c93e9a8d42c4baestevel &nodeh, sizeof (picl_nodehdl_t));
03831d35f7499c87d51205817c93e9a8d42c4baestevel continue;
03831d35f7499c87d51205817c93e9a8d42c4baestevel }
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel /* Get the device id for pci card */
03831d35f7499c87d51205817c93e9a8d42c4baestevel slot = picldiag_get_uint_propval(nodeh,
03831d35f7499c87d51205817c93e9a8d42c4baestevel PICL_PROP_DEVICE_ID, &err);
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (err == PICL_PROPNOTFOUND) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel err = picl_get_propval_by_name(nodeh, PICL_PROP_PEER,
03831d35f7499c87d51205817c93e9a8d42c4baestevel &nodeh, sizeof (picl_nodehdl_t));
03831d35f7499c87d51205817c93e9a8d42c4baestevel continue;
03831d35f7499c87d51205817c93e9a8d42c4baestevel } else if (err != PICL_SUCCESS)
03831d35f7499c87d51205817c93e9a8d42c4baestevel return (err);
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel /* Get the model of this card */
03831d35f7499c87d51205817c93e9a8d42c4baestevel err = picldiag_get_string_propval(nodeh, OBP_PROP_MODEL,
03831d35f7499c87d51205817c93e9a8d42c4baestevel &model);
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (err == PICL_PROPNOTFOUND)
03831d35f7499c87d51205817c93e9a8d42c4baestevel model = NULL;
03831d35f7499c87d51205817c93e9a8d42c4baestevel else if (err != PICL_SUCCESS)
03831d35f7499c87d51205817c93e9a8d42c4baestevel return (err);
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel err = picldiag_get_string_propval(nodeh, PICL_PROP_STATUS,
03831d35f7499c87d51205817c93e9a8d42c4baestevel &status);
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (err == PICL_PROPNOTFOUND) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel status = malloc(5);
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (status == NULL)
03831d35f7499c87d51205817c93e9a8d42c4baestevel return (PICL_FAILURE);
03831d35f7499c87d51205817c93e9a8d42c4baestevel strlcpy(status, "okay", 5);
03831d35f7499c87d51205817c93e9a8d42c4baestevel } else if (err != PICL_SUCCESS)
03831d35f7499c87d51205817c93e9a8d42c4baestevel return (err);
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel err = add_io_leaves(nodeh, NULL, boardnum, bus_id, slot,
03831d35f7499c87d51205817c93e9a8d42c4baestevel freq, model, status);
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (model != NULL)
03831d35f7499c87d51205817c93e9a8d42c4baestevel free(model);
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (status != NULL)
03831d35f7499c87d51205817c93e9a8d42c4baestevel free(status);
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (err != PICL_SUCCESS)
03831d35f7499c87d51205817c93e9a8d42c4baestevel return (err);
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel err = picl_get_propval_by_name(nodeh, PICL_PROP_PEER, &nodeh,
03831d35f7499c87d51205817c93e9a8d42c4baestevel sizeof (picl_nodehdl_t));
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel }
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (err == PICL_PROPNOTFOUND)
03831d35f7499c87d51205817c93e9a8d42c4baestevel return (PICL_WALK_CONTINUE);
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel return (err);
03831d35f7499c87d51205817c93e9a8d42c4baestevel}
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel/*
03831d35f7499c87d51205817c93e9a8d42c4baestevel * loop through all children and add io devices in io list
03831d35f7499c87d51205817c93e9a8d42c4baestevel */
03831d35f7499c87d51205817c93e9a8d42c4baestevelstatic int
03831d35f7499c87d51205817c93e9a8d42c4baestevelprocess_io_leaves(picl_nodehdl_t rooth)
03831d35f7499c87d51205817c93e9a8d42c4baestevel{
03831d35f7499c87d51205817c93e9a8d42c4baestevel picl_nodehdl_t nodeh;
03831d35f7499c87d51205817c93e9a8d42c4baestevel char classval[PICL_CLASSNAMELEN_MAX];
03831d35f7499c87d51205817c93e9a8d42c4baestevel int err;
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel err = picl_get_propval_by_name(rooth, PICL_PROP_CHILD, &nodeh,
03831d35f7499c87d51205817c93e9a8d42c4baestevel sizeof (picl_nodehdl_t));
03831d35f7499c87d51205817c93e9a8d42c4baestevel while (err == PICL_SUCCESS) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel err = picl_get_propval_by_name(nodeh, PICL_PROP_CLASSNAME,
03831d35f7499c87d51205817c93e9a8d42c4baestevel classval, sizeof (classval));
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (err != PICL_SUCCESS)
03831d35f7499c87d51205817c93e9a8d42c4baestevel return (err);
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (err != PICL_SUCCESS)
03831d35f7499c87d51205817c93e9a8d42c4baestevel return (err);
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel err = picl_get_propval_by_name(nodeh, PICL_PROP_PEER, &nodeh,
03831d35f7499c87d51205817c93e9a8d42c4baestevel sizeof (picl_nodehdl_t));
03831d35f7499c87d51205817c93e9a8d42c4baestevel }
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (err == PICL_PROPNOTFOUND)
03831d35f7499c87d51205817c93e9a8d42c4baestevel return (PICL_SUCCESS);
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel return (err);
03831d35f7499c87d51205817c93e9a8d42c4baestevel}
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel/*
03831d35f7499c87d51205817c93e9a8d42c4baestevel * find all io devices and add them in the io list
03831d35f7499c87d51205817c93e9a8d42c4baestevel */
03831d35f7499c87d51205817c93e9a8d42c4baestevelstatic int
03831d35f7499c87d51205817c93e9a8d42c4baestevelgather_io_cards(picl_nodehdl_t plafh)
03831d35f7499c87d51205817c93e9a8d42c4baestevel{
03831d35f7499c87d51205817c93e9a8d42c4baestevel int err;
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel /*
03831d35f7499c87d51205817c93e9a8d42c4baestevel * look for io devices under the immediate children of platform
03831d35f7499c87d51205817c93e9a8d42c4baestevel */
03831d35f7499c87d51205817c93e9a8d42c4baestevel err = process_io_leaves(plafh);
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (err != PICL_SUCCESS)
03831d35f7499c87d51205817c93e9a8d42c4baestevel return (err);
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (err != PICL_SUCCESS)
03831d35f7499c87d51205817c93e9a8d42c4baestevel return (err);
03831d35f7499c87d51205817c93e9a8d42c4baestevel err = picl_walk_tree_by_class(plafh, PICL_CLASS_PCI,
03831d35f7499c87d51205817c93e9a8d42c4baestevel PICL_CLASS_PCI, pci_callback);
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (err != PICL_SUCCESS)
03831d35f7499c87d51205817c93e9a8d42c4baestevel return (err);
03831d35f7499c87d51205817c93e9a8d42c4baestevel return (err);
03831d35f7499c87d51205817c93e9a8d42c4baestevel}
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevelstatic void
03831d35f7499c87d51205817c93e9a8d42c4baestevelpicldiag_display_io_cards(struct io_card *list)
03831d35f7499c87d51205817c93e9a8d42c4baestevel{
03831d35f7499c87d51205817c93e9a8d42c4baestevel static int banner = 0; /* Have we printed the column headings? */
03831d35f7499c87d51205817c93e9a8d42c4baestevel struct io_card *p;
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (list == NULL)
03831d35f7499c87d51205817c93e9a8d42c4baestevel return;
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (banner == 0) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf(dgettext(TEXT_DOMAIN,
03831d35f7499c87d51205817c93e9a8d42c4baestevel "Bus Freq Slot + Name +\n"), 0);
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf(dgettext(TEXT_DOMAIN, "Type MHz Status "
2983dda76a6d296fdb560c88114fe41caad1b84fMichael Bergknoff "Path "
2983dda76a6d296fdb560c88114fe41caad1b84fMichael Bergknoff "Model"), 0);
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf("\n", 0);
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf("---- ---- ---------- "
2983dda76a6d296fdb560c88114fe41caad1b84fMichael Bergknoff "---------------------------- "
2983dda76a6d296fdb560c88114fe41caad1b84fMichael Bergknoff "--------------------", 0);
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf("\n", 0);
03831d35f7499c87d51205817c93e9a8d42c4baestevel banner = 1;
03831d35f7499c87d51205817c93e9a8d42c4baestevel }
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel for (p = list; p != NULL; p = p -> next) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf("%-4s ", p->bus_type, 0);
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf("%3d ", p->freq, 0);
03831d35f7499c87d51205817c93e9a8d42c4baestevel /*
03831d35f7499c87d51205817c93e9a8d42c4baestevel * We check to see if it's an int or
03831d35f7499c87d51205817c93e9a8d42c4baestevel * a char string to display for slot.
03831d35f7499c87d51205817c93e9a8d42c4baestevel */
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (p->slot == PCI_SLOT_IS_STRING)
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf("%10s ", p->slot_str, 0);
03831d35f7499c87d51205817c93e9a8d42c4baestevel else
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf("%10d ", p->slot, 0);
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf("%-28.28s", p->name, 0);
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (strlen(p->name) > 28)
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf("+ ", 0);
03831d35f7499c87d51205817c93e9a8d42c4baestevel else
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf(" ", 0);
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf("%-19.19s", p->model, 0);
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (strlen(p->model) > 19)
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf("+", 0);
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf("\n", 0);
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf(" %10s ", p->status, 0);
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (strlen(p->notes) > 0)
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf("%s", p->notes, 0);
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf("\n\n", 0);
03831d35f7499c87d51205817c93e9a8d42c4baestevel }
03831d35f7499c87d51205817c93e9a8d42c4baestevel}
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel/*
03831d35f7499c87d51205817c93e9a8d42c4baestevel * display all io devices
03831d35f7499c87d51205817c93e9a8d42c4baestevel */
03831d35f7499c87d51205817c93e9a8d42c4baestevelstatic int
03831d35f7499c87d51205817c93e9a8d42c4baesteveldisplay_io_device_info(picl_nodehdl_t plafh)
03831d35f7499c87d51205817c93e9a8d42c4baestevel{
03831d35f7499c87d51205817c93e9a8d42c4baestevel int err;
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel err = gather_io_cards(plafh);
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (err != PICL_SUCCESS)
03831d35f7499c87d51205817c93e9a8d42c4baestevel return (err);
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel logprintf_header(dgettext(TEXT_DOMAIN, "IO Devices"),
03831d35f7499c87d51205817c93e9a8d42c4baestevel DEFAULT_LINE_WIDTH);
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel picldiag_display_io_cards(io_card_list);
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel free_io_cards(io_card_list);
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel return (PICL_SUCCESS);
03831d35f7499c87d51205817c93e9a8d42c4baestevel}
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel/*
03831d35f7499c87d51205817c93e9a8d42c4baestevel * print fan device information
03831d35f7499c87d51205817c93e9a8d42c4baestevel */
03831d35f7499c87d51205817c93e9a8d42c4baestevelstatic int
03831d35f7499c87d51205817c93e9a8d42c4baestevellogprintf_fan_info(picl_nodehdl_t fanh)
03831d35f7499c87d51205817c93e9a8d42c4baestevel{
03831d35f7499c87d51205817c93e9a8d42c4baestevel int err;
03831d35f7499c87d51205817c93e9a8d42c4baestevel char *label;
03831d35f7499c87d51205817c93e9a8d42c4baestevel char *unit;
03831d35f7499c87d51205817c93e9a8d42c4baestevel int64_t speed;
03831d35f7499c87d51205817c93e9a8d42c4baestevel int64_t min_speed;
03831d35f7499c87d51205817c93e9a8d42c4baestevel picl_nodehdl_t fruph;
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel err = picldiag_get_fru_parent(fanh, &fruph);
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (err != PICL_SUCCESS)
03831d35f7499c87d51205817c93e9a8d42c4baestevel return (err);
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel err = picldiag_get_combined_label(fruph, &label, 14);
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (err != PICL_SUCCESS)
03831d35f7499c87d51205817c93e9a8d42c4baestevel return (err);
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf("%-14s ", label);
03831d35f7499c87d51205817c93e9a8d42c4baestevel free(label);
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel err = picldiag_get_label(fanh, &label);
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (err == PICL_SUCCESS) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf("%-14s ", label);
03831d35f7499c87d51205817c93e9a8d42c4baestevel free(label);
03831d35f7499c87d51205817c93e9a8d42c4baestevel } else if (err == PICL_PROPNOTFOUND || err == PICL_PROPVALUNAVAILABLE) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf(" - ");
03831d35f7499c87d51205817c93e9a8d42c4baestevel } else
03831d35f7499c87d51205817c93e9a8d42c4baestevel return (err);
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel speed = picldiag_get_uint_propval(fanh, PICL_PROP_FAN_SPEED, &err);
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (err == PICL_SUCCESS) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel min_speed = picldiag_get_uint_propval(fanh,
03831d35f7499c87d51205817c93e9a8d42c4baestevel PICL_PROP_LOW_WARNING_THRESHOLD, &err);
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (err != PICL_SUCCESS)
03831d35f7499c87d51205817c93e9a8d42c4baestevel min_speed = 0;
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (speed < min_speed) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf(dgettext(TEXT_DOMAIN,
03831d35f7499c87d51205817c93e9a8d42c4baestevel "failed (%lld"), speed);
03831d35f7499c87d51205817c93e9a8d42c4baestevel err = picldiag_get_string_propval(fanh,
03831d35f7499c87d51205817c93e9a8d42c4baestevel PICL_PROP_FAN_SPEED_UNIT, &unit);
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (err == PICL_SUCCESS) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf("%s", unit);
03831d35f7499c87d51205817c93e9a8d42c4baestevel free(unit);
03831d35f7499c87d51205817c93e9a8d42c4baestevel }
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf(")");
03831d35f7499c87d51205817c93e9a8d42c4baestevel } else {
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf(dgettext(TEXT_DOMAIN, "okay"));
03831d35f7499c87d51205817c93e9a8d42c4baestevel }
03831d35f7499c87d51205817c93e9a8d42c4baestevel } else {
03831d35f7499c87d51205817c93e9a8d42c4baestevel err = picldiag_get_string_propval(fanh,
03831d35f7499c87d51205817c93e9a8d42c4baestevel PICL_PROP_FAN_SPEED_UNIT, &unit);
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (err == PICL_SUCCESS) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf("%-12s ", unit);
03831d35f7499c87d51205817c93e9a8d42c4baestevel free(unit);
03831d35f7499c87d51205817c93e9a8d42c4baestevel }
03831d35f7499c87d51205817c93e9a8d42c4baestevel }
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf("\n");
03831d35f7499c87d51205817c93e9a8d42c4baestevel return (PICL_SUCCESS);
03831d35f7499c87d51205817c93e9a8d42c4baestevel}
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevelstatic int
03831d35f7499c87d51205817c93e9a8d42c4baestevelfan_callback(picl_nodehdl_t fanh, void *arg)
03831d35f7499c87d51205817c93e9a8d42c4baestevel{
03831d35f7499c87d51205817c93e9a8d42c4baestevel int *countp = arg;
03831d35f7499c87d51205817c93e9a8d42c4baestevel int err;
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (*countp == 0) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf(dgettext(TEXT_DOMAIN, "Fan Status:\n"));
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf("---------------------------------------\n");
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf(dgettext(TEXT_DOMAIN,
03831d35f7499c87d51205817c93e9a8d42c4baestevel "Location Sensor Status \n"));
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf("---------------------------------------\n");
03831d35f7499c87d51205817c93e9a8d42c4baestevel }
03831d35f7499c87d51205817c93e9a8d42c4baestevel *countp += 1;
03831d35f7499c87d51205817c93e9a8d42c4baestevel err = logprintf_fan_info(fanh);
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (err == PICL_SUCCESS)
03831d35f7499c87d51205817c93e9a8d42c4baestevel return (PICL_WALK_CONTINUE);
03831d35f7499c87d51205817c93e9a8d42c4baestevel return (err);
03831d35f7499c87d51205817c93e9a8d42c4baestevel}
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel/*
03831d35f7499c87d51205817c93e9a8d42c4baestevel * callback function search children to find fan device and print its speed
03831d35f7499c87d51205817c93e9a8d42c4baestevel */
03831d35f7499c87d51205817c93e9a8d42c4baestevelstatic int
03831d35f7499c87d51205817c93e9a8d42c4baesteveldisplay_fan_speed(picl_nodehdl_t plafh)
03831d35f7499c87d51205817c93e9a8d42c4baestevel{
03831d35f7499c87d51205817c93e9a8d42c4baestevel int err;
03831d35f7499c87d51205817c93e9a8d42c4baestevel int print_header;
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel print_header = 0;
03831d35f7499c87d51205817c93e9a8d42c4baestevel err = picl_walk_tree_by_class(plafh, PICL_CLASS_FAN,
03831d35f7499c87d51205817c93e9a8d42c4baestevel &print_header, fan_callback);
03831d35f7499c87d51205817c93e9a8d42c4baestevel return (err);
03831d35f7499c87d51205817c93e9a8d42c4baestevel}
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel/*
03831d35f7499c87d51205817c93e9a8d42c4baestevel * print temperature sensor information
03831d35f7499c87d51205817c93e9a8d42c4baestevel */
03831d35f7499c87d51205817c93e9a8d42c4baestevelstatic int
03831d35f7499c87d51205817c93e9a8d42c4baestevellogprintf_temp_info(picl_nodehdl_t temph)
03831d35f7499c87d51205817c93e9a8d42c4baestevel{
03831d35f7499c87d51205817c93e9a8d42c4baestevel int err;
03831d35f7499c87d51205817c93e9a8d42c4baestevel char *label;
03831d35f7499c87d51205817c93e9a8d42c4baestevel int64_t temperature;
03831d35f7499c87d51205817c93e9a8d42c4baestevel int64_t threshold;
03831d35f7499c87d51205817c93e9a8d42c4baestevel picl_nodehdl_t fruph;
03831d35f7499c87d51205817c93e9a8d42c4baestevel char *status = "unknown";
03831d35f7499c87d51205817c93e9a8d42c4baestevel int got_temp = 0;
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel err = picldiag_get_fru_parent(temph, &fruph);
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (err != PICL_SUCCESS)
03831d35f7499c87d51205817c93e9a8d42c4baestevel return (err);
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel err = picldiag_get_combined_label(fruph, &label, 14);
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (err != PICL_SUCCESS)
03831d35f7499c87d51205817c93e9a8d42c4baestevel return (err);
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf("%-14s ", label);
03831d35f7499c87d51205817c93e9a8d42c4baestevel free(label);
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel err = picldiag_get_label(temph, &label);
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (err != PICL_SUCCESS)
03831d35f7499c87d51205817c93e9a8d42c4baestevel return (err);
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf("%-14s ", label);
03831d35f7499c87d51205817c93e9a8d42c4baestevel free(label);
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel temperature = picldiag_get_int_propval(temph, PICL_PROP_TEMPERATURE,
03831d35f7499c87d51205817c93e9a8d42c4baestevel &err);
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (err == PICL_SUCCESS) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel got_temp = 1;
03831d35f7499c87d51205817c93e9a8d42c4baestevel status = "okay";
03831d35f7499c87d51205817c93e9a8d42c4baestevel } else if (err != PICL_PROPNOTFOUND && err != PICL_PROPVALUNAVAILABLE) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel return (err);
03831d35f7499c87d51205817c93e9a8d42c4baestevel }
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel threshold = picldiag_get_int_propval(temph, PICL_PROP_LOW_WARNING,
03831d35f7499c87d51205817c93e9a8d42c4baestevel &err);
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (err == PICL_SUCCESS) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (got_temp && temperature < threshold)
03831d35f7499c87d51205817c93e9a8d42c4baestevel status = "warning";
03831d35f7499c87d51205817c93e9a8d42c4baestevel } else if (err != PICL_PROPNOTFOUND && err != PICL_PROPVALUNAVAILABLE) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel return (err);
03831d35f7499c87d51205817c93e9a8d42c4baestevel }
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel threshold = picldiag_get_int_propval(temph, PICL_PROP_LOW_SHUTDOWN,
03831d35f7499c87d51205817c93e9a8d42c4baestevel &err);
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (err == PICL_SUCCESS) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (got_temp && temperature < threshold)
03831d35f7499c87d51205817c93e9a8d42c4baestevel status = "failed";
03831d35f7499c87d51205817c93e9a8d42c4baestevel } else if (err != PICL_PROPNOTFOUND && err != PICL_PROPVALUNAVAILABLE) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel return (err);
03831d35f7499c87d51205817c93e9a8d42c4baestevel }
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel threshold = picldiag_get_int_propval(temph, PICL_PROP_HIGH_WARNING,
03831d35f7499c87d51205817c93e9a8d42c4baestevel &err);
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (err == PICL_SUCCESS) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (got_temp && temperature > threshold)
03831d35f7499c87d51205817c93e9a8d42c4baestevel status = "warning";
03831d35f7499c87d51205817c93e9a8d42c4baestevel } else if (err != PICL_PROPNOTFOUND && err != PICL_PROPVALUNAVAILABLE) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel return (err);
03831d35f7499c87d51205817c93e9a8d42c4baestevel }
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel threshold = picldiag_get_int_propval(temph, PICL_PROP_HIGH_SHUTDOWN,
03831d35f7499c87d51205817c93e9a8d42c4baestevel &err);
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (err == PICL_SUCCESS) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (got_temp && temperature > threshold)
03831d35f7499c87d51205817c93e9a8d42c4baestevel status = "failed";
03831d35f7499c87d51205817c93e9a8d42c4baestevel } else if (err != PICL_PROPNOTFOUND && err != PICL_PROPVALUNAVAILABLE) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel return (err);
03831d35f7499c87d51205817c93e9a8d42c4baestevel }
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel err = picldiag_get_string_propval(temph, PICL_PROP_CONDITION, &status);
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (err == PICL_SUCCESS) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf("%s", status);
03831d35f7499c87d51205817c93e9a8d42c4baestevel free(status);
03831d35f7499c87d51205817c93e9a8d42c4baestevel } else if (err != PICL_PROPNOTFOUND && err != PICL_PROPVALUNAVAILABLE) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel return (err);
03831d35f7499c87d51205817c93e9a8d42c4baestevel } else {
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf("%s ", status);
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (strcmp(status, "failed") == 0 ||
03831d35f7499c87d51205817c93e9a8d42c4baestevel strcmp(status, "warning") == 0)
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf("(%.2lldC)", temperature);
03831d35f7499c87d51205817c93e9a8d42c4baestevel }
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf("\n");
03831d35f7499c87d51205817c93e9a8d42c4baestevel return (PICL_SUCCESS);
03831d35f7499c87d51205817c93e9a8d42c4baestevel}
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevelstatic int
03831d35f7499c87d51205817c93e9a8d42c4baesteveltemp_callback(picl_nodehdl_t temph, void *arg)
03831d35f7499c87d51205817c93e9a8d42c4baestevel{
03831d35f7499c87d51205817c93e9a8d42c4baestevel int err;
03831d35f7499c87d51205817c93e9a8d42c4baestevel int *countp = arg;
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (*countp == 0) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf("\n");
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf("---------------------------------------\n");
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf(dgettext(TEXT_DOMAIN, "Temperature sensors:\n"));
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf("------------------------------------\n");
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf(dgettext(TEXT_DOMAIN,
03831d35f7499c87d51205817c93e9a8d42c4baestevel "Location Sensor Status\n"));
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf("------------------------------------\n");
03831d35f7499c87d51205817c93e9a8d42c4baestevel }
03831d35f7499c87d51205817c93e9a8d42c4baestevel *countp += 1;
03831d35f7499c87d51205817c93e9a8d42c4baestevel err = logprintf_temp_info(temph);
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (err == PICL_SUCCESS)
03831d35f7499c87d51205817c93e9a8d42c4baestevel return (PICL_WALK_CONTINUE);
03831d35f7499c87d51205817c93e9a8d42c4baestevel return (err);
03831d35f7499c87d51205817c93e9a8d42c4baestevel}
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel/*
03831d35f7499c87d51205817c93e9a8d42c4baestevel * callback function search children to find temp sensors and print the temp
03831d35f7499c87d51205817c93e9a8d42c4baestevel */
03831d35f7499c87d51205817c93e9a8d42c4baestevel/* ARGSUSED */
03831d35f7499c87d51205817c93e9a8d42c4baestevelstatic int
03831d35f7499c87d51205817c93e9a8d42c4baesteveldisplay_temp(picl_nodehdl_t plafh)
03831d35f7499c87d51205817c93e9a8d42c4baestevel{
03831d35f7499c87d51205817c93e9a8d42c4baestevel int err;
03831d35f7499c87d51205817c93e9a8d42c4baestevel int print_header;
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel print_header = 0;
03831d35f7499c87d51205817c93e9a8d42c4baestevel err = picl_walk_tree_by_class(plafh, PICL_CLASS_TEMPERATURE_SENSOR,
03831d35f7499c87d51205817c93e9a8d42c4baestevel &print_header, temp_callback);
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (err != PICL_SUCCESS)
03831d35f7499c87d51205817c93e9a8d42c4baestevel return (err);
03831d35f7499c87d51205817c93e9a8d42c4baestevel err = picl_walk_tree_by_class(plafh, PICL_CLASS_TEMPERATURE_INDICATOR,
03831d35f7499c87d51205817c93e9a8d42c4baestevel &print_header, temp_callback);
03831d35f7499c87d51205817c93e9a8d42c4baestevel return (err);
03831d35f7499c87d51205817c93e9a8d42c4baestevel}
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel/*
03831d35f7499c87d51205817c93e9a8d42c4baestevel * print current sensor information
03831d35f7499c87d51205817c93e9a8d42c4baestevel */
03831d35f7499c87d51205817c93e9a8d42c4baestevelstatic int
03831d35f7499c87d51205817c93e9a8d42c4baestevellogprintf_current_info(picl_nodehdl_t currenth)
03831d35f7499c87d51205817c93e9a8d42c4baestevel{
03831d35f7499c87d51205817c93e9a8d42c4baestevel int err;
03831d35f7499c87d51205817c93e9a8d42c4baestevel char *label;
03831d35f7499c87d51205817c93e9a8d42c4baestevel float current;
03831d35f7499c87d51205817c93e9a8d42c4baestevel float threshold;
03831d35f7499c87d51205817c93e9a8d42c4baestevel picl_nodehdl_t fruph;
03831d35f7499c87d51205817c93e9a8d42c4baestevel char *status = "unknown";
03831d35f7499c87d51205817c93e9a8d42c4baestevel int got_current = 0;
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel err = picldiag_get_fru_parent(currenth, &fruph);
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (err != PICL_SUCCESS)
03831d35f7499c87d51205817c93e9a8d42c4baestevel return (err);
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel err = picldiag_get_combined_label(fruph, &label, 10);
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (err != PICL_SUCCESS)
03831d35f7499c87d51205817c93e9a8d42c4baestevel return (err);
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf("%-10s ", label);
03831d35f7499c87d51205817c93e9a8d42c4baestevel free(label);
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel err = picldiag_get_label(currenth, &label);
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (err != PICL_SUCCESS)
03831d35f7499c87d51205817c93e9a8d42c4baestevel return (err);
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf("%-10s ", label);
03831d35f7499c87d51205817c93e9a8d42c4baestevel free(label);
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel current = picldiag_get_float_propval(currenth, PICL_PROP_CURRENT, &err);
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (err == PICL_SUCCESS) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel status = "okay";
03831d35f7499c87d51205817c93e9a8d42c4baestevel got_current = 1;
03831d35f7499c87d51205817c93e9a8d42c4baestevel } else if (err != PICL_PROPNOTFOUND && err != PICL_PROPVALUNAVAILABLE) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel return (err);
03831d35f7499c87d51205817c93e9a8d42c4baestevel }
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel threshold = picldiag_get_float_propval(currenth, PICL_PROP_LOW_WARNING,
03831d35f7499c87d51205817c93e9a8d42c4baestevel &err);
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (err == PICL_SUCCESS) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (got_current && current < threshold)
03831d35f7499c87d51205817c93e9a8d42c4baestevel status = "warning";
03831d35f7499c87d51205817c93e9a8d42c4baestevel } else if (err != PICL_PROPNOTFOUND && err != PICL_PROPVALUNAVAILABLE) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel return (err);
03831d35f7499c87d51205817c93e9a8d42c4baestevel }
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel threshold = picldiag_get_float_propval(currenth, PICL_PROP_LOW_SHUTDOWN,
03831d35f7499c87d51205817c93e9a8d42c4baestevel &err);
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (err == PICL_SUCCESS) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (got_current && current < threshold)
03831d35f7499c87d51205817c93e9a8d42c4baestevel status = "failed";
03831d35f7499c87d51205817c93e9a8d42c4baestevel } else if (err != PICL_PROPNOTFOUND && err != PICL_PROPVALUNAVAILABLE) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel return (err);
03831d35f7499c87d51205817c93e9a8d42c4baestevel }
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel threshold = picldiag_get_float_propval(currenth, PICL_PROP_HIGH_WARNING,
03831d35f7499c87d51205817c93e9a8d42c4baestevel &err);
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (err == PICL_SUCCESS) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (got_current && current > threshold)
03831d35f7499c87d51205817c93e9a8d42c4baestevel status = "warning";
03831d35f7499c87d51205817c93e9a8d42c4baestevel } else if (err != PICL_PROPNOTFOUND && err != PICL_PROPVALUNAVAILABLE) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel return (err);
03831d35f7499c87d51205817c93e9a8d42c4baestevel }
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel threshold = picldiag_get_float_propval(currenth,
03831d35f7499c87d51205817c93e9a8d42c4baestevel PICL_PROP_HIGH_SHUTDOWN, &err);
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (err == PICL_SUCCESS) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (got_current && current > threshold)
03831d35f7499c87d51205817c93e9a8d42c4baestevel status = "failed";
03831d35f7499c87d51205817c93e9a8d42c4baestevel } else if (err != PICL_PROPNOTFOUND && err != PICL_PROPVALUNAVAILABLE) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel return (err);
03831d35f7499c87d51205817c93e9a8d42c4baestevel }
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel err = picldiag_get_string_propval(currenth,
03831d35f7499c87d51205817c93e9a8d42c4baestevel PICL_PROP_CONDITION, &status);
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (err == PICL_SUCCESS) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf(" %s", status);
03831d35f7499c87d51205817c93e9a8d42c4baestevel free(status);
03831d35f7499c87d51205817c93e9a8d42c4baestevel } else if (err != PICL_PROPNOTFOUND && err != PICL_PROPVALUNAVAILABLE) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel return (err);
03831d35f7499c87d51205817c93e9a8d42c4baestevel } else {
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf("%s ", status);
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (strcmp(status, "failed") == 0 ||
03831d35f7499c87d51205817c93e9a8d42c4baestevel strcmp(status, "warning") == 0)
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf("(%.2fA)", current);
03831d35f7499c87d51205817c93e9a8d42c4baestevel }
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf("\n");
03831d35f7499c87d51205817c93e9a8d42c4baestevel return (PICL_SUCCESS);
03831d35f7499c87d51205817c93e9a8d42c4baestevel}
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevelstatic int
03831d35f7499c87d51205817c93e9a8d42c4baestevelcurrent_callback(picl_nodehdl_t currh, void *arg)
03831d35f7499c87d51205817c93e9a8d42c4baestevel{
03831d35f7499c87d51205817c93e9a8d42c4baestevel int err;
03831d35f7499c87d51205817c93e9a8d42c4baestevel int *countp = arg;
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (*countp == 0) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf("------------------------------------\n");
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf(dgettext(TEXT_DOMAIN, "Current sensors:\n"));
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf("------------------------------\n");
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf(dgettext(TEXT_DOMAIN,
03831d35f7499c87d51205817c93e9a8d42c4baestevel "Location Sensor Status\n"));
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf("------------------------------\n");
03831d35f7499c87d51205817c93e9a8d42c4baestevel }
03831d35f7499c87d51205817c93e9a8d42c4baestevel *countp += 1;
03831d35f7499c87d51205817c93e9a8d42c4baestevel err = logprintf_current_info(currh);
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (err == PICL_SUCCESS)
03831d35f7499c87d51205817c93e9a8d42c4baestevel return (PICL_WALK_CONTINUE);
03831d35f7499c87d51205817c93e9a8d42c4baestevel return (err);
03831d35f7499c87d51205817c93e9a8d42c4baestevel}
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel/*
03831d35f7499c87d51205817c93e9a8d42c4baestevel * callback function search children to find curr sensors and print the curr
03831d35f7499c87d51205817c93e9a8d42c4baestevel */
03831d35f7499c87d51205817c93e9a8d42c4baestevel/* ARGSUSED */
03831d35f7499c87d51205817c93e9a8d42c4baestevelstatic int
03831d35f7499c87d51205817c93e9a8d42c4baesteveldisplay_current(picl_nodehdl_t plafh)
03831d35f7499c87d51205817c93e9a8d42c4baestevel{
03831d35f7499c87d51205817c93e9a8d42c4baestevel int err;
03831d35f7499c87d51205817c93e9a8d42c4baestevel int print_header;
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel print_header = 0;
03831d35f7499c87d51205817c93e9a8d42c4baestevel err = picl_walk_tree_by_class(plafh, PICL_CLASS_CURRENT_SENSOR,
03831d35f7499c87d51205817c93e9a8d42c4baestevel &print_header, current_callback);
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (err != PICL_SUCCESS)
03831d35f7499c87d51205817c93e9a8d42c4baestevel return (err);
03831d35f7499c87d51205817c93e9a8d42c4baestevel err = picl_walk_tree_by_class(plafh, PICL_CLASS_CURRENT_INDICATOR,
03831d35f7499c87d51205817c93e9a8d42c4baestevel &print_header, current_callback);
03831d35f7499c87d51205817c93e9a8d42c4baestevel return (err);
03831d35f7499c87d51205817c93e9a8d42c4baestevel}
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel/*
03831d35f7499c87d51205817c93e9a8d42c4baestevel * print voltage sensor information
03831d35f7499c87d51205817c93e9a8d42c4baestevel */
03831d35f7499c87d51205817c93e9a8d42c4baestevelstatic int
03831d35f7499c87d51205817c93e9a8d42c4baestevellogprintf_voltage_info(picl_nodehdl_t voltageh)
03831d35f7499c87d51205817c93e9a8d42c4baestevel{
03831d35f7499c87d51205817c93e9a8d42c4baestevel int err;
03831d35f7499c87d51205817c93e9a8d42c4baestevel char *label;
03831d35f7499c87d51205817c93e9a8d42c4baestevel float voltage;
03831d35f7499c87d51205817c93e9a8d42c4baestevel float threshold;
03831d35f7499c87d51205817c93e9a8d42c4baestevel picl_nodehdl_t fruph;
03831d35f7499c87d51205817c93e9a8d42c4baestevel char *status = "unknown";
03831d35f7499c87d51205817c93e9a8d42c4baestevel int got_voltage = 0;
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel err = picldiag_get_fru_parent(voltageh, &fruph);
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (err != PICL_SUCCESS)
03831d35f7499c87d51205817c93e9a8d42c4baestevel return (err);
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel err = picldiag_get_combined_label(fruph, &label, 10);
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (err != PICL_SUCCESS)
03831d35f7499c87d51205817c93e9a8d42c4baestevel return (err);
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf("%-10s ", label);
03831d35f7499c87d51205817c93e9a8d42c4baestevel free(label);
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel err = picldiag_get_label(voltageh, &label);
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (err != PICL_SUCCESS)
03831d35f7499c87d51205817c93e9a8d42c4baestevel return (err);
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf("%-12s ", label);
03831d35f7499c87d51205817c93e9a8d42c4baestevel free(label);
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel voltage = picldiag_get_float_propval(voltageh, PICL_PROP_VOLTAGE, &err);
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (err == PICL_SUCCESS) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel status = "okay";
03831d35f7499c87d51205817c93e9a8d42c4baestevel got_voltage = 1;
03831d35f7499c87d51205817c93e9a8d42c4baestevel } else if (err != PICL_PROPNOTFOUND && err != PICL_PROPVALUNAVAILABLE) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel return (err);
03831d35f7499c87d51205817c93e9a8d42c4baestevel }
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel threshold = picldiag_get_float_propval(voltageh, PICL_PROP_LOW_WARNING,
03831d35f7499c87d51205817c93e9a8d42c4baestevel &err);
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (err == PICL_SUCCESS) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (got_voltage && voltage < threshold)
03831d35f7499c87d51205817c93e9a8d42c4baestevel status = "warning";
03831d35f7499c87d51205817c93e9a8d42c4baestevel } else if (err != PICL_PROPNOTFOUND && err != PICL_PROPVALUNAVAILABLE) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel return (err);
03831d35f7499c87d51205817c93e9a8d42c4baestevel }
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel threshold = picldiag_get_float_propval(voltageh, PICL_PROP_LOW_SHUTDOWN,
03831d35f7499c87d51205817c93e9a8d42c4baestevel &err);
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (err == PICL_SUCCESS) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (got_voltage && voltage < threshold)
03831d35f7499c87d51205817c93e9a8d42c4baestevel status = "failed";
03831d35f7499c87d51205817c93e9a8d42c4baestevel } else if (err != PICL_PROPNOTFOUND && err != PICL_PROPVALUNAVAILABLE) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel return (err);
03831d35f7499c87d51205817c93e9a8d42c4baestevel }
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel threshold = picldiag_get_float_propval(voltageh, PICL_PROP_HIGH_WARNING,
03831d35f7499c87d51205817c93e9a8d42c4baestevel &err);
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (err == PICL_SUCCESS) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (got_voltage && voltage > threshold)
03831d35f7499c87d51205817c93e9a8d42c4baestevel status = "warning";
03831d35f7499c87d51205817c93e9a8d42c4baestevel } else if (err != PICL_PROPNOTFOUND && err != PICL_PROPVALUNAVAILABLE) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel return (err);
03831d35f7499c87d51205817c93e9a8d42c4baestevel }
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel threshold = picldiag_get_float_propval(voltageh,
03831d35f7499c87d51205817c93e9a8d42c4baestevel PICL_PROP_HIGH_SHUTDOWN, &err);
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (err == PICL_SUCCESS) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (got_voltage && voltage > threshold)
03831d35f7499c87d51205817c93e9a8d42c4baestevel status = "failed";
03831d35f7499c87d51205817c93e9a8d42c4baestevel } else if (err != PICL_PROPNOTFOUND && err != PICL_PROPVALUNAVAILABLE) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel return (err);
03831d35f7499c87d51205817c93e9a8d42c4baestevel }
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel err = picldiag_get_string_propval(voltageh,
03831d35f7499c87d51205817c93e9a8d42c4baestevel PICL_PROP_CONDITION, &status);
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (err == PICL_SUCCESS) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf("%s", status);
03831d35f7499c87d51205817c93e9a8d42c4baestevel free(status);
03831d35f7499c87d51205817c93e9a8d42c4baestevel } else if (err != PICL_PROPNOTFOUND && err != PICL_PROPVALUNAVAILABLE) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel return (err);
03831d35f7499c87d51205817c93e9a8d42c4baestevel } else {
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf("%s ", status);
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (strcmp(status, "warning") == 0 ||
03831d35f7499c87d51205817c93e9a8d42c4baestevel strcmp(status, "failed") == 0)
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf("(%.2fV)", voltage);
03831d35f7499c87d51205817c93e9a8d42c4baestevel }
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf("\n");
03831d35f7499c87d51205817c93e9a8d42c4baestevel return (PICL_SUCCESS);
03831d35f7499c87d51205817c93e9a8d42c4baestevel}
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevelstatic int
03831d35f7499c87d51205817c93e9a8d42c4baestevelvoltage_callback(picl_nodehdl_t voltageh, void *arg)
03831d35f7499c87d51205817c93e9a8d42c4baestevel{
03831d35f7499c87d51205817c93e9a8d42c4baestevel int *countp = arg;
03831d35f7499c87d51205817c93e9a8d42c4baestevel int err;
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (*countp == 0) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf("--------------------------------\n");
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf(dgettext(TEXT_DOMAIN, "Voltage sensors:\n"));
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf("-------------------------------\n");
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf(dgettext(TEXT_DOMAIN,
03831d35f7499c87d51205817c93e9a8d42c4baestevel "Location Sensor Status\n"));
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf("-------------------------------\n");
03831d35f7499c87d51205817c93e9a8d42c4baestevel }
03831d35f7499c87d51205817c93e9a8d42c4baestevel *countp += 1;
03831d35f7499c87d51205817c93e9a8d42c4baestevel err = logprintf_voltage_info(voltageh);
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (err == PICL_SUCCESS)
03831d35f7499c87d51205817c93e9a8d42c4baestevel return (PICL_WALK_CONTINUE);
03831d35f7499c87d51205817c93e9a8d42c4baestevel return (err);
03831d35f7499c87d51205817c93e9a8d42c4baestevel}
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel/*
03831d35f7499c87d51205817c93e9a8d42c4baestevel * callback function search children to find voltage sensors and print voltage
03831d35f7499c87d51205817c93e9a8d42c4baestevel */
03831d35f7499c87d51205817c93e9a8d42c4baestevel/* ARGSUSED */
03831d35f7499c87d51205817c93e9a8d42c4baestevelstatic int
03831d35f7499c87d51205817c93e9a8d42c4baesteveldisplay_voltage(picl_nodehdl_t plafh)
03831d35f7499c87d51205817c93e9a8d42c4baestevel{
03831d35f7499c87d51205817c93e9a8d42c4baestevel int err;
03831d35f7499c87d51205817c93e9a8d42c4baestevel int print_header;
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel print_header = 0;
03831d35f7499c87d51205817c93e9a8d42c4baestevel err = picl_walk_tree_by_class(plafh, PICL_CLASS_VOLTAGE_SENSOR,
03831d35f7499c87d51205817c93e9a8d42c4baestevel &print_header, voltage_callback);
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (err != PICL_SUCCESS)
03831d35f7499c87d51205817c93e9a8d42c4baestevel return (err);
03831d35f7499c87d51205817c93e9a8d42c4baestevel err = picl_walk_tree_by_class(plafh, PICL_CLASS_VOLTAGE_INDICATOR,
03831d35f7499c87d51205817c93e9a8d42c4baestevel &print_header, voltage_callback);
03831d35f7499c87d51205817c93e9a8d42c4baestevel return (err);
03831d35f7499c87d51205817c93e9a8d42c4baestevel}
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel/*
03831d35f7499c87d51205817c93e9a8d42c4baestevel * print led device information
03831d35f7499c87d51205817c93e9a8d42c4baestevel */
03831d35f7499c87d51205817c93e9a8d42c4baestevelstatic int
03831d35f7499c87d51205817c93e9a8d42c4baestevellogprintf_led_info(picl_nodehdl_t ledh)
03831d35f7499c87d51205817c93e9a8d42c4baestevel{
03831d35f7499c87d51205817c93e9a8d42c4baestevel int err;
03831d35f7499c87d51205817c93e9a8d42c4baestevel char *label;
03831d35f7499c87d51205817c93e9a8d42c4baestevel char *state;
03831d35f7499c87d51205817c93e9a8d42c4baestevel char *color;
03831d35f7499c87d51205817c93e9a8d42c4baestevel picl_nodehdl_t fruph;
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel err = picldiag_get_fru_parent(ledh, &fruph);
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (err != PICL_SUCCESS)
03831d35f7499c87d51205817c93e9a8d42c4baestevel return (err);
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel err = picldiag_get_combined_label(fruph, &label, 10);
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (err != PICL_SUCCESS) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf(" - ", label);
03831d35f7499c87d51205817c93e9a8d42c4baestevel } else {
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf("%-10s ", label);
03831d35f7499c87d51205817c93e9a8d42c4baestevel free(label);
03831d35f7499c87d51205817c93e9a8d42c4baestevel }
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel err = picldiag_get_label(ledh, &label);
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (err != PICL_SUCCESS)
03831d35f7499c87d51205817c93e9a8d42c4baestevel return (err);
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf("%-20s ", label);
03831d35f7499c87d51205817c93e9a8d42c4baestevel free(label);
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel err = picldiag_get_string_propval(ledh, PICL_PROP_STATE, &state);
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (err == PICL_PROPNOTFOUND || err == PICL_PROPVALUNAVAILABLE) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf(" - ");
03831d35f7499c87d51205817c93e9a8d42c4baestevel } else if (err != PICL_SUCCESS) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel return (err);
03831d35f7499c87d51205817c93e9a8d42c4baestevel } else {
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf("%-10s ", state);
03831d35f7499c87d51205817c93e9a8d42c4baestevel free(state);
03831d35f7499c87d51205817c93e9a8d42c4baestevel }
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel err = picldiag_get_string_propval(ledh, PICL_PROP_COLOR, &color);
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (err == PICL_PROPNOTFOUND || err == PICL_PROPVALUNAVAILABLE) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf("\n");
03831d35f7499c87d51205817c93e9a8d42c4baestevel } else if (err != PICL_SUCCESS) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel return (err);
03831d35f7499c87d51205817c93e9a8d42c4baestevel } else {
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf("%-16s\n", color);
03831d35f7499c87d51205817c93e9a8d42c4baestevel free(color);
03831d35f7499c87d51205817c93e9a8d42c4baestevel }
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel return (PICL_SUCCESS);
03831d35f7499c87d51205817c93e9a8d42c4baestevel}
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevelstatic int
03831d35f7499c87d51205817c93e9a8d42c4baestevelled_callback(picl_nodehdl_t ledh, void *arg)
03831d35f7499c87d51205817c93e9a8d42c4baestevel{
03831d35f7499c87d51205817c93e9a8d42c4baestevel int *countp = arg;
03831d35f7499c87d51205817c93e9a8d42c4baestevel int err;
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (*countp == 0) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf("--------------------------------------"
03831d35f7499c87d51205817c93e9a8d42c4baestevel "------------\n");
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf(dgettext(TEXT_DOMAIN, "Led State:\n"));
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf("--------------------------------------"
03831d35f7499c87d51205817c93e9a8d42c4baestevel "------------\n");
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf(dgettext(TEXT_DOMAIN,
03831d35f7499c87d51205817c93e9a8d42c4baestevel "Location Led State"
03831d35f7499c87d51205817c93e9a8d42c4baestevel " Color\n"));
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf("--------------------------------------"
03831d35f7499c87d51205817c93e9a8d42c4baestevel "------------\n");
03831d35f7499c87d51205817c93e9a8d42c4baestevel }
03831d35f7499c87d51205817c93e9a8d42c4baestevel *countp += 1;
03831d35f7499c87d51205817c93e9a8d42c4baestevel err = logprintf_led_info(ledh);
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (err == PICL_SUCCESS)
03831d35f7499c87d51205817c93e9a8d42c4baestevel return (PICL_WALK_CONTINUE);
03831d35f7499c87d51205817c93e9a8d42c4baestevel return (err);
03831d35f7499c87d51205817c93e9a8d42c4baestevel}
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel/*
03831d35f7499c87d51205817c93e9a8d42c4baestevel * callback function search children to find led devices and print status
03831d35f7499c87d51205817c93e9a8d42c4baestevel */
03831d35f7499c87d51205817c93e9a8d42c4baestevel/* ARGSUSED */
03831d35f7499c87d51205817c93e9a8d42c4baestevelstatic int
03831d35f7499c87d51205817c93e9a8d42c4baesteveldisplay_led_status(picl_nodehdl_t plafh)
03831d35f7499c87d51205817c93e9a8d42c4baestevel{
03831d35f7499c87d51205817c93e9a8d42c4baestevel int print_header;
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel print_header = 0;
03831d35f7499c87d51205817c93e9a8d42c4baestevel picl_walk_tree_by_class(plafh, PICL_CLASS_LED,
03831d35f7499c87d51205817c93e9a8d42c4baestevel &print_header, led_callback);
03831d35f7499c87d51205817c93e9a8d42c4baestevel return (PICL_SUCCESS);
03831d35f7499c87d51205817c93e9a8d42c4baestevel}
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel/*
03831d35f7499c87d51205817c93e9a8d42c4baestevel * print keyswitch device information
03831d35f7499c87d51205817c93e9a8d42c4baestevel */
03831d35f7499c87d51205817c93e9a8d42c4baestevelstatic int
03831d35f7499c87d51205817c93e9a8d42c4baestevellogprintf_keyswitch_info(picl_nodehdl_t keyswitchh, picl_nodehdl_t fruph)
03831d35f7499c87d51205817c93e9a8d42c4baestevel{
03831d35f7499c87d51205817c93e9a8d42c4baestevel int err;
03831d35f7499c87d51205817c93e9a8d42c4baestevel char *label;
03831d35f7499c87d51205817c93e9a8d42c4baestevel char *state;
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel err = picldiag_get_combined_label(fruph, &label, 10);
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (err != PICL_SUCCESS) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf("%-14s", " -");
03831d35f7499c87d51205817c93e9a8d42c4baestevel } else {
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf("%-14s ", label);
03831d35f7499c87d51205817c93e9a8d42c4baestevel free(label);
03831d35f7499c87d51205817c93e9a8d42c4baestevel }
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel err = picldiag_get_label(keyswitchh, &label);
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (err != PICL_SUCCESS)
03831d35f7499c87d51205817c93e9a8d42c4baestevel return (err);
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf("%-11s ", label);
03831d35f7499c87d51205817c93e9a8d42c4baestevel free(label);
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel err = picldiag_get_string_propval(keyswitchh, PICL_PROP_STATE, &state);
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (err == PICL_PROPNOTFOUND || err == PICL_PROPVALUNAVAILABLE) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf(" -\n");
03831d35f7499c87d51205817c93e9a8d42c4baestevel } else if (err != PICL_SUCCESS) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel return (err);
03831d35f7499c87d51205817c93e9a8d42c4baestevel } else {
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf("%s\n", state);
03831d35f7499c87d51205817c93e9a8d42c4baestevel free(state);
03831d35f7499c87d51205817c93e9a8d42c4baestevel }
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel return (PICL_SUCCESS);
03831d35f7499c87d51205817c93e9a8d42c4baestevel}
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevelstatic int
03831d35f7499c87d51205817c93e9a8d42c4baestevelkeyswitch_callback(picl_nodehdl_t keyswitchh, void *arg)
03831d35f7499c87d51205817c93e9a8d42c4baestevel{
03831d35f7499c87d51205817c93e9a8d42c4baestevel int *countp = arg;
03831d35f7499c87d51205817c93e9a8d42c4baestevel int err;
03831d35f7499c87d51205817c93e9a8d42c4baestevel picl_nodehdl_t fruph;
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel /*
03831d35f7499c87d51205817c93e9a8d42c4baestevel * Tamale simulates a key-switch on ENxS. So the presence of a
03831d35f7499c87d51205817c93e9a8d42c4baestevel * node of class keyswitch is not sufficient. If it has a fru parent
03831d35f7499c87d51205817c93e9a8d42c4baestevel * or location parent, then believe it.
03831d35f7499c87d51205817c93e9a8d42c4baestevel */
03831d35f7499c87d51205817c93e9a8d42c4baestevel err = picl_get_propval_by_name(keyswitchh, PICL_REFPROP_FRU_PARENT,
03831d35f7499c87d51205817c93e9a8d42c4baestevel &fruph, sizeof (fruph));
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (err == PICL_PROPNOTFOUND) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel err = picl_get_propval_by_name(keyswitchh,
03831d35f7499c87d51205817c93e9a8d42c4baestevel PICL_REFPROP_LOC_PARENT, &fruph, sizeof (fruph));
03831d35f7499c87d51205817c93e9a8d42c4baestevel }
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (err == PICL_PROPNOTFOUND || err == PICL_PROPVALUNAVAILABLE)
03831d35f7499c87d51205817c93e9a8d42c4baestevel return (PICL_WALK_CONTINUE);
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (err != PICL_SUCCESS)
03831d35f7499c87d51205817c93e9a8d42c4baestevel return (err);
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (*countp == 0) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf("-----------------------------------------\n");
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf(dgettext(TEXT_DOMAIN, "Keyswitch:\n"));
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf("-----------------------------------------\n");
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf(dgettext(TEXT_DOMAIN,
03831d35f7499c87d51205817c93e9a8d42c4baestevel "Location Keyswitch State\n"));
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf("-----------------------------------------\n");
03831d35f7499c87d51205817c93e9a8d42c4baestevel }
03831d35f7499c87d51205817c93e9a8d42c4baestevel *countp += 1;
03831d35f7499c87d51205817c93e9a8d42c4baestevel err = logprintf_keyswitch_info(keyswitchh, fruph);
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (err == PICL_SUCCESS)
03831d35f7499c87d51205817c93e9a8d42c4baestevel return (PICL_WALK_CONTINUE);
03831d35f7499c87d51205817c93e9a8d42c4baestevel return (err);
03831d35f7499c87d51205817c93e9a8d42c4baestevel}
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel/*
03831d35f7499c87d51205817c93e9a8d42c4baestevel * search children to find keyswitch device(s) and print status
03831d35f7499c87d51205817c93e9a8d42c4baestevel */
03831d35f7499c87d51205817c93e9a8d42c4baestevel/* ARGSUSED */
03831d35f7499c87d51205817c93e9a8d42c4baestevelstatic int
03831d35f7499c87d51205817c93e9a8d42c4baesteveldisplay_keyswitch(picl_nodehdl_t plafh)
03831d35f7499c87d51205817c93e9a8d42c4baestevel{
03831d35f7499c87d51205817c93e9a8d42c4baestevel int print_header = 0;
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel picl_walk_tree_by_class(plafh, PICL_CLASS_KEYSWITCH,
03831d35f7499c87d51205817c93e9a8d42c4baestevel &print_header, keyswitch_callback);
03831d35f7499c87d51205817c93e9a8d42c4baestevel return (PICL_SUCCESS);
03831d35f7499c87d51205817c93e9a8d42c4baestevel}
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel/*
03831d35f7499c87d51205817c93e9a8d42c4baestevel * display environment status
03831d35f7499c87d51205817c93e9a8d42c4baestevel */
03831d35f7499c87d51205817c93e9a8d42c4baestevelstatic int
03831d35f7499c87d51205817c93e9a8d42c4baesteveldisplay_envctrl_status(picl_nodehdl_t plafh)
03831d35f7499c87d51205817c93e9a8d42c4baestevel{
03831d35f7499c87d51205817c93e9a8d42c4baestevel logprintf_header(dgettext(TEXT_DOMAIN, "Environmental Status"),
03831d35f7499c87d51205817c93e9a8d42c4baestevel DEFAULT_LINE_WIDTH);
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel display_fan_speed(plafh);
03831d35f7499c87d51205817c93e9a8d42c4baestevel display_temp(plafh);
03831d35f7499c87d51205817c93e9a8d42c4baestevel display_current(plafh);
03831d35f7499c87d51205817c93e9a8d42c4baestevel display_voltage(plafh);
03831d35f7499c87d51205817c93e9a8d42c4baestevel display_keyswitch(plafh);
03831d35f7499c87d51205817c93e9a8d42c4baestevel display_led_status(plafh);
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel return (PICL_SUCCESS);
03831d35f7499c87d51205817c93e9a8d42c4baestevel}
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel/*
03831d35f7499c87d51205817c93e9a8d42c4baestevel * print fru operational status
03831d35f7499c87d51205817c93e9a8d42c4baestevel */
03831d35f7499c87d51205817c93e9a8d42c4baestevelstatic int
03831d35f7499c87d51205817c93e9a8d42c4baestevellogprintf_fru_oper_status(picl_nodehdl_t fruh, int *countp)
03831d35f7499c87d51205817c93e9a8d42c4baestevel{
03831d35f7499c87d51205817c93e9a8d42c4baestevel int err;
03831d35f7499c87d51205817c93e9a8d42c4baestevel char *label;
03831d35f7499c87d51205817c93e9a8d42c4baestevel char *status;
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel err = picldiag_get_combined_label(fruh, &label, 15);
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (err != PICL_SUCCESS)
03831d35f7499c87d51205817c93e9a8d42c4baestevel return (PICL_WALK_CONTINUE);
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel err = picldiag_get_string_propval(fruh,
03831d35f7499c87d51205817c93e9a8d42c4baestevel PICL_PROP_OPERATIONAL_STATUS, &status);
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (err == PICL_SUCCESS) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (*countp == 0) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel logprintf_header(dgettext(TEXT_DOMAIN,
03831d35f7499c87d51205817c93e9a8d42c4baestevel "FRU Operational Status"),
03831d35f7499c87d51205817c93e9a8d42c4baestevel DEFAULT_LINE_WIDTH);
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf("-------------------------\n");
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf(dgettext(TEXT_DOMAIN,
03831d35f7499c87d51205817c93e9a8d42c4baestevel "Fru Operational Status:\n"));
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf("-------------------------\n");
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf(dgettext(TEXT_DOMAIN,
03831d35f7499c87d51205817c93e9a8d42c4baestevel "Location Status \n"));
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf("-------------------------\n");
03831d35f7499c87d51205817c93e9a8d42c4baestevel }
03831d35f7499c87d51205817c93e9a8d42c4baestevel *countp += 1;
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf("%-15s ", label);
03831d35f7499c87d51205817c93e9a8d42c4baestevel free(label);
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf("%s\n", status);
03831d35f7499c87d51205817c93e9a8d42c4baestevel free(status);
03831d35f7499c87d51205817c93e9a8d42c4baestevel } else if (err != PICL_PROPNOTFOUND && err != PICL_PROPVALUNAVAILABLE) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel free(label);
03831d35f7499c87d51205817c93e9a8d42c4baestevel return (err);
03831d35f7499c87d51205817c93e9a8d42c4baestevel } else {
03831d35f7499c87d51205817c93e9a8d42c4baestevel free(label);
03831d35f7499c87d51205817c93e9a8d42c4baestevel }
03831d35f7499c87d51205817c93e9a8d42c4baestevel return (PICL_WALK_CONTINUE);
03831d35f7499c87d51205817c93e9a8d42c4baestevel}
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevelstatic int
03831d35f7499c87d51205817c93e9a8d42c4baestevelfru_oper_status_callback(picl_nodehdl_t fruh, void *arg)
03831d35f7499c87d51205817c93e9a8d42c4baestevel{
03831d35f7499c87d51205817c93e9a8d42c4baestevel int err;
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel err = logprintf_fru_oper_status(fruh, (int *)arg);
03831d35f7499c87d51205817c93e9a8d42c4baestevel return (err);
03831d35f7499c87d51205817c93e9a8d42c4baestevel}
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel/*
03831d35f7499c87d51205817c93e9a8d42c4baestevel * display fru operational status
03831d35f7499c87d51205817c93e9a8d42c4baestevel */
03831d35f7499c87d51205817c93e9a8d42c4baestevelstatic int
03831d35f7499c87d51205817c93e9a8d42c4baesteveldisplay_fru_oper_status(picl_nodehdl_t frutreeh)
03831d35f7499c87d51205817c93e9a8d42c4baestevel{
03831d35f7499c87d51205817c93e9a8d42c4baestevel int print_header;
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel print_header = 0;
03831d35f7499c87d51205817c93e9a8d42c4baestevel picl_walk_tree_by_class(frutreeh, PICL_CLASS_FRU,
03831d35f7499c87d51205817c93e9a8d42c4baestevel &print_header, fru_oper_status_callback);
03831d35f7499c87d51205817c93e9a8d42c4baestevel return (PICL_SUCCESS);
03831d35f7499c87d51205817c93e9a8d42c4baestevel}
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel/*
03831d35f7499c87d51205817c93e9a8d42c4baestevel * check if the node having the version prop
03831d35f7499c87d51205817c93e9a8d42c4baestevel * If yes, print its nodename and version
03831d35f7499c87d51205817c93e9a8d42c4baestevel */
03831d35f7499c87d51205817c93e9a8d42c4baestevel/* ARGSUSED */
03831d35f7499c87d51205817c93e9a8d42c4baestevelstatic int
03831d35f7499c87d51205817c93e9a8d42c4baestevelasicrev_callback(picl_nodehdl_t nodeh, void *arg)
03831d35f7499c87d51205817c93e9a8d42c4baestevel{
03831d35f7499c87d51205817c93e9a8d42c4baestevel uint32_t version;
03831d35f7499c87d51205817c93e9a8d42c4baestevel char *name;
03831d35f7499c87d51205817c93e9a8d42c4baestevel char *model;
03831d35f7499c87d51205817c93e9a8d42c4baestevel char *status;
03831d35f7499c87d51205817c93e9a8d42c4baestevel int err;
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel version = picldiag_get_uint_propval(nodeh, OBP_PROP_VERSION_NUM,
03831d35f7499c87d51205817c93e9a8d42c4baestevel &err);
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (err == PICL_PROPNOTFOUND)
03831d35f7499c87d51205817c93e9a8d42c4baestevel return (PICL_WALK_CONTINUE);
03831d35f7499c87d51205817c93e9a8d42c4baestevel else if (err != PICL_SUCCESS)
03831d35f7499c87d51205817c93e9a8d42c4baestevel return (err);
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel /* devfs-path */
03831d35f7499c87d51205817c93e9a8d42c4baestevel err = picldiag_get_string_propval(nodeh, PICL_PROP_DEVFS_PATH, &name);
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (err == PICL_PROPNOTFOUND)
03831d35f7499c87d51205817c93e9a8d42c4baestevel name = NULL;
03831d35f7499c87d51205817c93e9a8d42c4baestevel else if (err != PICL_SUCCESS)
03831d35f7499c87d51205817c93e9a8d42c4baestevel return (err);
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel /* model */
03831d35f7499c87d51205817c93e9a8d42c4baestevel err = picldiag_get_string_propval(nodeh, PICL_PROP_BINDING_NAME,
03831d35f7499c87d51205817c93e9a8d42c4baestevel &model);
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (err == PICL_PROPNOTFOUND)
03831d35f7499c87d51205817c93e9a8d42c4baestevel model = NULL;
03831d35f7499c87d51205817c93e9a8d42c4baestevel else if (err != PICL_SUCCESS)
03831d35f7499c87d51205817c93e9a8d42c4baestevel return (err);
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel /* status */
03831d35f7499c87d51205817c93e9a8d42c4baestevel err = picldiag_get_string_propval(nodeh, PICL_PROP_STATUS, &status);
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (err == PICL_PROPNOTFOUND)
03831d35f7499c87d51205817c93e9a8d42c4baestevel status = NULL;
03831d35f7499c87d51205817c93e9a8d42c4baestevel else if (err != PICL_SUCCESS)
03831d35f7499c87d51205817c93e9a8d42c4baestevel return (err);
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel /*
03831d35f7499c87d51205817c93e9a8d42c4baestevel * Display the data
03831d35f7499c87d51205817c93e9a8d42c4baestevel */
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel /* name */
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (name != NULL) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf("%-22s ", name);
03831d35f7499c87d51205817c93e9a8d42c4baestevel free(name);
03831d35f7499c87d51205817c93e9a8d42c4baestevel } else
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf("%-22s ", "unknown");
03831d35f7499c87d51205817c93e9a8d42c4baestevel /* model */
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (model != NULL) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf("%-15s ", model);
03831d35f7499c87d51205817c93e9a8d42c4baestevel free(model);
03831d35f7499c87d51205817c93e9a8d42c4baestevel } else
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf("%-15s ", "unknown");
03831d35f7499c87d51205817c93e9a8d42c4baestevel /* status */
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (status == NULL)
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf("%-15s ", "okay");
03831d35f7499c87d51205817c93e9a8d42c4baestevel else {
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf("%-15s ", status);
03831d35f7499c87d51205817c93e9a8d42c4baestevel free(status);
03831d35f7499c87d51205817c93e9a8d42c4baestevel }
03831d35f7499c87d51205817c93e9a8d42c4baestevel /* revision */
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf(" %-4d\n", version);
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel return (PICL_WALK_CONTINUE);
03831d35f7499c87d51205817c93e9a8d42c4baestevel}
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel/*
03831d35f7499c87d51205817c93e9a8d42c4baestevel * traverse the tree to display asic revision id for ebus
03831d35f7499c87d51205817c93e9a8d42c4baestevel */
03831d35f7499c87d51205817c93e9a8d42c4baestevel/* ARGSUSED */
03831d35f7499c87d51205817c93e9a8d42c4baestevelstatic int
03831d35f7499c87d51205817c93e9a8d42c4baestevelebus_callback(picl_nodehdl_t ebush, void *arg)
03831d35f7499c87d51205817c93e9a8d42c4baestevel{
03831d35f7499c87d51205817c93e9a8d42c4baestevel uint32_t id;
03831d35f7499c87d51205817c93e9a8d42c4baestevel char *name;
03831d35f7499c87d51205817c93e9a8d42c4baestevel int err;
03831d35f7499c87d51205817c93e9a8d42c4baestevel char *model;
03831d35f7499c87d51205817c93e9a8d42c4baestevel char *status;
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel id = picldiag_get_uint_propval(ebush, OBP_PROP_REVISION_ID, &err);
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (err == PICL_PROPNOTFOUND)
03831d35f7499c87d51205817c93e9a8d42c4baestevel return (PICL_WALK_CONTINUE);
03831d35f7499c87d51205817c93e9a8d42c4baestevel else if (err != PICL_SUCCESS)
03831d35f7499c87d51205817c93e9a8d42c4baestevel return (err);
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel /* devfs-path */
03831d35f7499c87d51205817c93e9a8d42c4baestevel err = picldiag_get_string_propval(ebush, PICL_PROP_DEVFS_PATH, &name);
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (err == PICL_PROPNOTFOUND)
03831d35f7499c87d51205817c93e9a8d42c4baestevel name = NULL;
03831d35f7499c87d51205817c93e9a8d42c4baestevel else if (err != PICL_SUCCESS)
03831d35f7499c87d51205817c93e9a8d42c4baestevel return (err);
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel /* model */
03831d35f7499c87d51205817c93e9a8d42c4baestevel err = picldiag_get_string_propval(ebush, PICL_PROP_BINDING_NAME,
03831d35f7499c87d51205817c93e9a8d42c4baestevel &model);
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (err == PICL_PROPNOTFOUND)
03831d35f7499c87d51205817c93e9a8d42c4baestevel model = NULL;
03831d35f7499c87d51205817c93e9a8d42c4baestevel else if (err != PICL_SUCCESS)
03831d35f7499c87d51205817c93e9a8d42c4baestevel return (err);
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel /* status */
03831d35f7499c87d51205817c93e9a8d42c4baestevel err = picldiag_get_string_propval(ebush, PICL_PROP_STATUS, &status);
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (err == PICL_PROPNOTFOUND)
03831d35f7499c87d51205817c93e9a8d42c4baestevel status = NULL;
03831d35f7499c87d51205817c93e9a8d42c4baestevel else if (err != PICL_SUCCESS)
03831d35f7499c87d51205817c93e9a8d42c4baestevel return (err);
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel /*
03831d35f7499c87d51205817c93e9a8d42c4baestevel * Display the data
03831d35f7499c87d51205817c93e9a8d42c4baestevel */
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel /* name */
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (name != NULL) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf("%-22s ", name);
03831d35f7499c87d51205817c93e9a8d42c4baestevel free(name);
03831d35f7499c87d51205817c93e9a8d42c4baestevel } else
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf("%-22s ", "unknown");
03831d35f7499c87d51205817c93e9a8d42c4baestevel /* model */
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (model != NULL) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf("%-15s ", model);
03831d35f7499c87d51205817c93e9a8d42c4baestevel free(model);
03831d35f7499c87d51205817c93e9a8d42c4baestevel } else
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf("%-15s ", "unknown");
03831d35f7499c87d51205817c93e9a8d42c4baestevel /* status */
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (status == NULL)
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf("%-15s ", "okay");
03831d35f7499c87d51205817c93e9a8d42c4baestevel else {
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf("%-15s ", status);
03831d35f7499c87d51205817c93e9a8d42c4baestevel free(status);
03831d35f7499c87d51205817c93e9a8d42c4baestevel }
03831d35f7499c87d51205817c93e9a8d42c4baestevel /* revision */
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf(" %-4d\n", id);
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel return (PICL_WALK_CONTINUE);
03831d35f7499c87d51205817c93e9a8d42c4baestevel}
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel/*
03831d35f7499c87d51205817c93e9a8d42c4baestevel * display asic revision id
03831d35f7499c87d51205817c93e9a8d42c4baestevel */
03831d35f7499c87d51205817c93e9a8d42c4baestevelstatic int
03831d35f7499c87d51205817c93e9a8d42c4baesteveldisplay_hw_revisions(picl_nodehdl_t plafh)
03831d35f7499c87d51205817c93e9a8d42c4baestevel{
03831d35f7499c87d51205817c93e9a8d42c4baestevel int err;
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel /* Print the header */
03831d35f7499c87d51205817c93e9a8d42c4baestevel logprintf_header(dgettext(TEXT_DOMAIN, "HW Revisions"),
03831d35f7499c87d51205817c93e9a8d42c4baestevel DEFAULT_LINE_WIDTH);
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf(dgettext(TEXT_DOMAIN, "ASIC Revisions:\n"));
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf("-----------------------------");
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf("--------------------------------------\n");
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf(dgettext(TEXT_DOMAIN, "Path Device"));
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf(dgettext(TEXT_DOMAIN,
03831d35f7499c87d51205817c93e9a8d42c4baestevel " Status Revision\n"));
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf("-----------------------------");
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf("--------------------------------------\n");
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel err = picl_walk_tree_by_class(plafh, NULL, NULL, asicrev_callback);
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (err != PICL_SUCCESS)
03831d35f7499c87d51205817c93e9a8d42c4baestevel return (err);
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel err = picl_walk_tree_by_class(plafh, PICL_CLASS_EBUS,
03831d35f7499c87d51205817c93e9a8d42c4baestevel NULL, ebus_callback);
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (err != PICL_SUCCESS)
03831d35f7499c87d51205817c93e9a8d42c4baestevel return (err);
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf("\n");
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel return (err);
03831d35f7499c87d51205817c93e9a8d42c4baestevel}
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel/*
03831d35f7499c87d51205817c93e9a8d42c4baestevel * find the options node and its powerfail_time prop
03831d35f7499c87d51205817c93e9a8d42c4baestevel * If found, display the list of latest powerfail.
03831d35f7499c87d51205817c93e9a8d42c4baestevel */
03831d35f7499c87d51205817c93e9a8d42c4baestevel/* ARGSUSED */
03831d35f7499c87d51205817c93e9a8d42c4baestevelstatic int
03831d35f7499c87d51205817c93e9a8d42c4baesteveloptions_callback(picl_nodehdl_t nodeh, void *arg)
03831d35f7499c87d51205817c93e9a8d42c4baestevel{
03831d35f7499c87d51205817c93e9a8d42c4baestevel time_t value;
03831d35f7499c87d51205817c93e9a8d42c4baestevel char *failtime;
03831d35f7499c87d51205817c93e9a8d42c4baestevel int err;
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel err = picldiag_get_string_propval(nodeh, PROP_POWERFAIL_TIME,
03831d35f7499c87d51205817c93e9a8d42c4baestevel &failtime);
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (err == PICL_PROPNOTFOUND)
03831d35f7499c87d51205817c93e9a8d42c4baestevel return (PICL_WALK_TERMINATE);
03831d35f7499c87d51205817c93e9a8d42c4baestevel else if (err != PICL_SUCCESS)
03831d35f7499c87d51205817c93e9a8d42c4baestevel return (err);
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel value = (time_t)atoi(failtime);
03831d35f7499c87d51205817c93e9a8d42c4baestevel free(failtime);
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (value == 0)
03831d35f7499c87d51205817c93e9a8d42c4baestevel return (PICL_WALK_TERMINATE);
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf(dgettext(TEXT_DOMAIN, "Most recent AC Power Failure:\n"));
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf("=============================\n");
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf("%s", ctime(&value));
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf("\n");
03831d35f7499c87d51205817c93e9a8d42c4baestevel return (PICL_WALK_TERMINATE);
03831d35f7499c87d51205817c93e9a8d42c4baestevel}
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel/*
03831d35f7499c87d51205817c93e9a8d42c4baestevel * display the OBP and POST prom revisions
03831d35f7499c87d51205817c93e9a8d42c4baestevel */
03831d35f7499c87d51205817c93e9a8d42c4baestevel/* ARGSUSED */
03831d35f7499c87d51205817c93e9a8d42c4baestevelstatic int
03831d35f7499c87d51205817c93e9a8d42c4baestevelflashprom_callback(picl_nodehdl_t flashpromh, void *arg)
03831d35f7499c87d51205817c93e9a8d42c4baestevel{
03831d35f7499c87d51205817c93e9a8d42c4baestevel picl_prophdl_t proph;
03831d35f7499c87d51205817c93e9a8d42c4baestevel picl_prophdl_t tblh;
03831d35f7499c87d51205817c93e9a8d42c4baestevel picl_prophdl_t rowproph;
03831d35f7499c87d51205817c93e9a8d42c4baestevel picl_propinfo_t pinfo;
03831d35f7499c87d51205817c93e9a8d42c4baestevel char *prom_version = NULL;
03831d35f7499c87d51205817c93e9a8d42c4baestevel char *obp_version = NULL;
03831d35f7499c87d51205817c93e9a8d42c4baestevel int err;
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel err = picl_get_propinfo_by_name(flashpromh, OBP_PROP_VERSION,
03831d35f7499c87d51205817c93e9a8d42c4baestevel &pinfo, &proph);
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (err == PICL_PROPNOTFOUND)
03831d35f7499c87d51205817c93e9a8d42c4baestevel return (PICL_WALK_TERMINATE);
03831d35f7499c87d51205817c93e9a8d42c4baestevel else if (err != PICL_SUCCESS)
03831d35f7499c87d51205817c93e9a8d42c4baestevel return (err);
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf(dgettext(TEXT_DOMAIN, "System PROM revisions:\n"));
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf("----------------------\n");
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel /*
03831d35f7499c87d51205817c93e9a8d42c4baestevel * If it's a table prop, the first element is OBP revision
03831d35f7499c87d51205817c93e9a8d42c4baestevel * The second one is POST revision.
03831d35f7499c87d51205817c93e9a8d42c4baestevel * If it's a charstring prop, the value will be only OBP revision
03831d35f7499c87d51205817c93e9a8d42c4baestevel */
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (pinfo.type == PICL_PTYPE_CHARSTRING) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel prom_version = alloca(pinfo.size);
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (prom_version == NULL)
03831d35f7499c87d51205817c93e9a8d42c4baestevel return (PICL_FAILURE);
03831d35f7499c87d51205817c93e9a8d42c4baestevel err = picl_get_propval(proph, prom_version, pinfo.size);
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (err != PICL_SUCCESS)
03831d35f7499c87d51205817c93e9a8d42c4baestevel return (err);
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf("%s\n", prom_version);
03831d35f7499c87d51205817c93e9a8d42c4baestevel }
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (pinfo.type != PICL_PTYPE_TABLE) /* not supported type */
03831d35f7499c87d51205817c93e9a8d42c4baestevel return (PICL_WALK_TERMINATE);
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel err = picl_get_propval(proph, &tblh, pinfo.size);
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (err != PICL_SUCCESS)
03831d35f7499c87d51205817c93e9a8d42c4baestevel return (err);
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel err = picl_get_next_by_row(tblh, &rowproph);
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (err == PICL_SUCCESS) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel /* get first row */
03831d35f7499c87d51205817c93e9a8d42c4baestevel err = picl_get_propinfo(rowproph, &pinfo);
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (err != PICL_SUCCESS)
2983dda76a6d296fdb560c88114fe41caad1b84fMichael Bergknoff return (err);
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel prom_version = alloca(pinfo.size);
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (prom_version == NULL)
03831d35f7499c87d51205817c93e9a8d42c4baestevel return (PICL_FAILURE);
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel err = picl_get_propval(rowproph, prom_version, pinfo.size);
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (err != PICL_SUCCESS)
03831d35f7499c87d51205817c93e9a8d42c4baestevel return (err);
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf("%s\n", prom_version);
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel /* get second row */
03831d35f7499c87d51205817c93e9a8d42c4baestevel err = picl_get_next_by_col(rowproph, &rowproph);
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (err == PICL_SUCCESS) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel err = picl_get_propinfo(rowproph, &pinfo);
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (err != PICL_SUCCESS)
03831d35f7499c87d51205817c93e9a8d42c4baestevel return (err);
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel obp_version = alloca(pinfo.size);
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (obp_version == NULL)
03831d35f7499c87d51205817c93e9a8d42c4baestevel return (PICL_FAILURE);
03831d35f7499c87d51205817c93e9a8d42c4baestevel err = picl_get_propval(rowproph, obp_version,
03831d35f7499c87d51205817c93e9a8d42c4baestevel pinfo.size);
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (err != PICL_SUCCESS)
03831d35f7499c87d51205817c93e9a8d42c4baestevel return (err);
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf("%s\n", obp_version);
03831d35f7499c87d51205817c93e9a8d42c4baestevel }
03831d35f7499c87d51205817c93e9a8d42c4baestevel }
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel return (PICL_WALK_TERMINATE);
03831d35f7499c87d51205817c93e9a8d42c4baestevel}
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevelstatic int
03831d35f7499c87d51205817c93e9a8d42c4baesteveldisplay_system_info(int serrlog, int log_flag, picl_nodehdl_t rooth)
03831d35f7499c87d51205817c93e9a8d42c4baestevel{
03831d35f7499c87d51205817c93e9a8d42c4baestevel int err;
03831d35f7499c87d51205817c93e9a8d42c4baestevel picl_nodehdl_t plafh;
03831d35f7499c87d51205817c93e9a8d42c4baestevel picl_nodehdl_t frutreeh;
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel err = picldiag_get_node_by_name(rooth, PICL_NODE_PLATFORM, &plafh);
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (err != PICL_SUCCESS)
03831d35f7499c87d51205817c93e9a8d42c4baestevel return (err);
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (!log_flag) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel err = display_platform_banner(plafh);
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (err != PICL_SUCCESS)
03831d35f7499c87d51205817c93e9a8d42c4baestevel return (err);
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel err = display_system_clock(plafh);
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (err != PICL_SUCCESS)
03831d35f7499c87d51205817c93e9a8d42c4baestevel return (err);
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel err = picl_walk_tree_by_class(plafh, PICL_CLASS_MEMORY,
03831d35f7499c87d51205817c93e9a8d42c4baestevel PICL_CLASS_MEMORY, memory_callback);
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (err != PICL_SUCCESS)
03831d35f7499c87d51205817c93e9a8d42c4baestevel return (err);
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel err = display_cpu_info(plafh);
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (err != PICL_SUCCESS)
03831d35f7499c87d51205817c93e9a8d42c4baestevel return (err);
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel err = display_io_device_info(plafh);
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (err != PICL_SUCCESS)
03831d35f7499c87d51205817c93e9a8d42c4baestevel return (err);
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel err = display_memory_config(plafh);
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (err != PICL_SUCCESS)
03831d35f7499c87d51205817c93e9a8d42c4baestevel return (err);
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel err = display_usb_devices(plafh);
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (err != PICL_SUCCESS)
03831d35f7499c87d51205817c93e9a8d42c4baestevel return (err);
03831d35f7499c87d51205817c93e9a8d42c4baestevel }
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (serrlog) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel err = picl_walk_tree_by_class(rooth, PICL_CLASS_OPTIONS,
03831d35f7499c87d51205817c93e9a8d42c4baestevel NULL, options_callback);
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (err != PICL_SUCCESS)
03831d35f7499c87d51205817c93e9a8d42c4baestevel return (err);
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel err = picldiag_get_node_by_name(rooth, PICL_NODE_FRUTREE,
03831d35f7499c87d51205817c93e9a8d42c4baestevel &frutreeh);
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel /* return ok if no frutree in picl on schumacher */
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (err != PICL_SUCCESS)
03831d35f7499c87d51205817c93e9a8d42c4baestevel return (PICL_SUCCESS);
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel err = display_fru_oper_status(frutreeh);
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (err != PICL_SUCCESS)
03831d35f7499c87d51205817c93e9a8d42c4baestevel return (err);
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel err = display_hw_revisions(plafh);
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (err != PICL_SUCCESS)
03831d35f7499c87d51205817c93e9a8d42c4baestevel return (err);
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel err = picl_walk_tree_by_class(plafh, PICL_CLASS_FLASHPROM,
03831d35f7499c87d51205817c93e9a8d42c4baestevel NULL, flashprom_callback);
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (err != PICL_SUCCESS)
03831d35f7499c87d51205817c93e9a8d42c4baestevel return (err);
03831d35f7499c87d51205817c93e9a8d42c4baestevel }
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel return (PICL_SUCCESS);
03831d35f7499c87d51205817c93e9a8d42c4baestevel}
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel/* ARGSUSED */
03831d35f7499c87d51205817c93e9a8d42c4baestevelint
03831d35f7499c87d51205817c93e9a8d42c4baesteveldo_prominfo(int serrlog, char *pgname, int log_flag, int prt_flag)
03831d35f7499c87d51205817c93e9a8d42c4baestevel{
03831d35f7499c87d51205817c93e9a8d42c4baestevel int err;
03831d35f7499c87d51205817c93e9a8d42c4baestevel char *errstr;
03831d35f7499c87d51205817c93e9a8d42c4baestevel int done;
03831d35f7499c87d51205817c93e9a8d42c4baestevel picl_nodehdl_t rooth;
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel err = picl_initialize();
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (err != PICL_SUCCESS) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel fprintf(stderr, EM_INIT_FAIL, picl_strerror(err));
03831d35f7499c87d51205817c93e9a8d42c4baestevel exit(1);
03831d35f7499c87d51205817c93e9a8d42c4baestevel }
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel do {
03831d35f7499c87d51205817c93e9a8d42c4baestevel done = 1;
03831d35f7499c87d51205817c93e9a8d42c4baestevel err = picl_get_root(&rooth);
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (err != PICL_SUCCESS) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel fprintf(stderr, EM_GET_ROOT_FAIL, picl_strerror(err));
03831d35f7499c87d51205817c93e9a8d42c4baestevel exit(1);
03831d35f7499c87d51205817c93e9a8d42c4baestevel }
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel err = display_system_info(serrlog, log_flag, rooth);
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel if ((err == PICL_STALEHANDLE) || (err == PICL_INVALIDHANDLE))
03831d35f7499c87d51205817c93e9a8d42c4baestevel done = 0;
03831d35f7499c87d51205817c93e9a8d42c4baestevel } while (!done);
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (err != PICL_SUCCESS) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel errstr = picl_strerror(err);
03831d35f7499c87d51205817c93e9a8d42c4baestevel fprintf(stderr, EM_PRTDIAG_FAIL);
03831d35f7499c87d51205817c93e9a8d42c4baestevel fprintf(stderr, "%s\n", errstr? errstr : " ");
03831d35f7499c87d51205817c93e9a8d42c4baestevel }
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel (void) picl_shutdown();
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel return (0);
03831d35f7499c87d51205817c93e9a8d42c4baestevel}