picldiag.c revision 2983dda76a6d296fdb560c88114fe41caad1b84f
03831d35f7499c87d51205817c93e9a8d42c4baestevel * CDDL HEADER START
03831d35f7499c87d51205817c93e9a8d42c4baestevel * The contents of this file are subject to the terms of the
03831d35f7499c87d51205817c93e9a8d42c4baestevel * Common Development and Distribution License (the "License").
03831d35f7499c87d51205817c93e9a8d42c4baestevel * You may not use this file except in compliance with the License.
03831d35f7499c87d51205817c93e9a8d42c4baestevel * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
03831d35f7499c87d51205817c93e9a8d42c4baestevel * See the License for the specific language governing permissions
03831d35f7499c87d51205817c93e9a8d42c4baestevel * and limitations under the License.
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 * CDDL HEADER END
2983dda76a6d296fdb560c88114fe41caad1b84fMichael Bergknoff * Copyright (c) 2000, 2010, Oracle and/or its affiliates. All rights reserved.
03831d35f7499c87d51205817c93e9a8d42c4baestevel "picl_initialize failed: %s\n")
03831d35f7499c87d51205817c93e9a8d42c4baestevel "Getting root node failed: %s\n")
03831d35f7499c87d51205817c93e9a8d42c4baestevel#define EM_PRTDIAG_FAIL dgettext(TEXT_DOMAIN, "Prtdiag failed!\n")
2983dda76a6d296fdb560c88114fe41caad1b84fMichael Bergknoff "System Configuration: Oracle Corporation ")
03831d35f7499c87d51205817c93e9a8d42c4baestevel "System clock frequency: %d MHZ\n")
03831d35f7499c87d51205817c93e9a8d42c4baestevel "Chassis Serial Number:\n")
03831d35f7499c87d51205817c93e9a8d42c4baestevel#define MEM_SIZE_MSG dgettext(TEXT_DOMAIN, "Memory size: ")
03831d35f7499c87d51205817c93e9a8d42c4baestevel#define FFB_DOUBLE_BUF dgettext(TEXT_DOMAIN, "FFB, Double Buffered")
03831d35f7499c87d51205817c93e9a8d42c4baestevel#define FFB_SINGLE_BUF dgettext(TEXT_DOMAIN, "FFB, Single Buffered")
03831d35f7499c87d51205817c93e9a8d42c4baestevel/* bus id */
03831d35f7499c87d51205817c93e9a8d42c4baestevel * PICL classes
03831d35f7499c87d51205817c93e9a8d42c4baestevel * Property names
03831d35f7499c87d51205817c93e9a8d42c4baestevel#define PICL_PROP_LOW_WARNING_THRESHOLD "LowWarningThreshold"
03831d35f7499c87d51205817c93e9a8d42c4baesteveltypedef struct bank_list {
03831d35f7499c87d51205817c93e9a8d42c4baesteveltypedef struct {
03831d35f7499c87d51205817c93e9a8d42c4baestevelstatic struct io_card *io_card_list = NULL; /* The head of the IO card list */
03831d35f7499c87d51205817c93e9a8d42c4baestevelstatic int no_xfer_size = 0;
03831d35f7499c87d51205817c93e9a8d42c4baestevelstatic char *io_device_table[] = {
03831d35f7499c87d51205817c93e9a8d42c4baestevel "parallel",
03831d35f7499c87d51205817c93e9a8d42c4baestevel "keyboard",
03831d35f7499c87d51205817c93e9a8d42c4baestevel#define NIODEVICE sizeof (io_device_table) / sizeof (io_device_table[0])
03831d35f7499c87d51205817c93e9a8d42c4baestevelstatic char *bus_table[] = {
03831d35f7499c87d51205817c93e9a8d42c4baestevel#define NBUS sizeof (bus_table) / sizeof (bus_table[0])
03831d35f7499c87d51205817c93e9a8d42c4baestevel/* prtdiag exit codes */
03831d35f7499c87d51205817c93e9a8d42c4baestevel * Use of global assumes do_prominfo only called from main in prtdiag and
03831d35f7499c87d51205817c93e9a8d42c4baestevel * access does not need to be multi-thread safe.
03831d35f7499c87d51205817c93e9a8d42c4baestevel * This function is called from every location where a status value is output.
03831d35f7499c87d51205817c93e9a8d42c4baestevel * It checks the status arg and sets exit_code if an error is detected.
03831d35f7499c87d51205817c93e9a8d42c4baestevel * The status is typically returned from a PICL query. A case-insensitive
03831d35f7499c87d51205817c93e9a8d42c4baestevel * string comparison is done to check for any status that starts with "fail"
03831d35f7499c87d51205817c93e9a8d42c4baestevel * or "fault".
03831d35f7499c87d51205817c93e9a8d42c4baestevel * check if it is an IO deice
03831d35f7499c87d51205817c93e9a8d42c4baestevel for (i = 0; i < NIODEVICE; i++) {
2983dda76a6d296fdb560c88114fe41caad1b84fMichael Bergknoff if (strcmp(device_class, io_device_table[i]) == 0)
03831d35f7499c87d51205817c93e9a8d42c4baestevel return (0);
03831d35f7499c87d51205817c93e9a8d42c4baestevel * check if it is a bus
03831d35f7499c87d51205817c93e9a8d42c4baestevel for (i = 0; i < NBUS; i++) {
2983dda76a6d296fdb560c88114fe41caad1b84fMichael Bergknoff if (strcmp(device_class, bus_table[i]) == 0)
03831d35f7499c87d51205817c93e9a8d42c4baestevel return (0);
03831d35f7499c87d51205817c93e9a8d42c4baestevel * search children to get the node by the nodename
03831d35f7499c87d51205817c93e9a8d42c4baestevelpicldiag_get_node_by_name(picl_nodehdl_t rooth, char *name,
03831d35f7499c87d51205817c93e9a8d42c4baestevel err = picl_get_propval_by_name(rooth, PICL_PROP_CHILD, &childh,
03831d35f7499c87d51205817c93e9a8d42c4baestevel err = picl_get_propval_by_name(childh, PICL_PROP_NAME,
03831d35f7499c87d51205817c93e9a8d42c4baestevel err = picl_get_propval_by_name(childh, PICL_PROP_PEER,
03831d35f7499c87d51205817c93e9a8d42c4baestevel err = picl_get_propval_by_name(childh, PICL_PROP_PEER,
03831d35f7499c87d51205817c93e9a8d42c4baestevel * get the value by the property name of the string prop
03831d35f7499c87d51205817c93e9a8d42c4baestevel * Caller must free the outbuf
03831d35f7499c87d51205817c93e9a8d42c4baestevelpicldiag_get_string_propval(picl_nodehdl_t modh, char *prop_name, char **outbuf)
03831d35f7499c87d51205817c93e9a8d42c4baestevel err = picl_get_propinfo_by_name(modh, prop_name, &pinfo, &proph);
03831d35f7499c87d51205817c93e9a8d42c4baestevel * If it is not a string prop, return NULL
03831d35f7499c87d51205817c93e9a8d42c4baestevel err = picl_get_propval(proph, prop_value, pinfo.size);
03831d35f7499c87d51205817c93e9a8d42c4baestevel * return the value as a signed integer
03831d35f7499c87d51205817c93e9a8d42c4baestevelpicldiag_get_int_propval(picl_nodehdl_t modh, char *prop_name, int *ret)
03831d35f7499c87d51205817c93e9a8d42c4baestevel err = picl_get_propinfo_by_name(modh, prop_name, &pinfo, &proph);
03831d35f7499c87d51205817c93e9a8d42c4baestevel return (0);
03831d35f7499c87d51205817c93e9a8d42c4baestevel * If it is not an int, uint or byte array prop, return failure
2983dda76a6d296fdb560c88114fe41caad1b84fMichael Bergknoff (pinfo.type != PICL_PTYPE_UNSIGNED_INT) &&
03831d35f7499c87d51205817c93e9a8d42c4baestevel return (0);
03831d35f7499c87d51205817c93e9a8d42c4baestevel case sizeof (int8_t):
03831d35f7499c87d51205817c93e9a8d42c4baestevel err = picl_get_propval(proph, &int8v, sizeof (int8v));
03831d35f7499c87d51205817c93e9a8d42c4baestevel case sizeof (int16_t):
03831d35f7499c87d51205817c93e9a8d42c4baestevel err = picl_get_propval(proph, &int16v, sizeof (int16v));
03831d35f7499c87d51205817c93e9a8d42c4baestevel case sizeof (int32_t):
03831d35f7499c87d51205817c93e9a8d42c4baestevel err = picl_get_propval(proph, &int32v, sizeof (int32v));
03831d35f7499c87d51205817c93e9a8d42c4baestevel case sizeof (int64_t):
03831d35f7499c87d51205817c93e9a8d42c4baestevel err = picl_get_propval(proph, &int64v, sizeof (int64v));
03831d35f7499c87d51205817c93e9a8d42c4baestevel default: /* not supported size */
03831d35f7499c87d51205817c93e9a8d42c4baestevel return (0);
03831d35f7499c87d51205817c93e9a8d42c4baestevel * return the value of the uint prop
03831d35f7499c87d51205817c93e9a8d42c4baestevelpicldiag_get_uint_propval(picl_nodehdl_t modh, char *prop_name, int *ret)
03831d35f7499c87d51205817c93e9a8d42c4baestevel err = picl_get_propinfo_by_name(modh, prop_name, &pinfo, &proph);
03831d35f7499c87d51205817c93e9a8d42c4baestevel return (0);
03831d35f7499c87d51205817c93e9a8d42c4baestevel * If it is not an int or uint prop, return failure
2983dda76a6d296fdb560c88114fe41caad1b84fMichael Bergknoff (pinfo.type != PICL_PTYPE_UNSIGNED_INT)) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel return (0);
03831d35f7499c87d51205817c93e9a8d42c4baestevel /* uint prop */
03831d35f7499c87d51205817c93e9a8d42c4baestevel case sizeof (uint8_t):
03831d35f7499c87d51205817c93e9a8d42c4baestevel err = picl_get_propval(proph, &uint8v, sizeof (uint8v));
03831d35f7499c87d51205817c93e9a8d42c4baestevel case sizeof (uint16_t):
03831d35f7499c87d51205817c93e9a8d42c4baestevel err = picl_get_propval(proph, &uint16v, sizeof (uint16v));
03831d35f7499c87d51205817c93e9a8d42c4baestevel case sizeof (uint32_t):
03831d35f7499c87d51205817c93e9a8d42c4baestevel err = picl_get_propval(proph, &uint32v, sizeof (uint32v));
03831d35f7499c87d51205817c93e9a8d42c4baestevel case sizeof (uint64_t):
03831d35f7499c87d51205817c93e9a8d42c4baestevel err = picl_get_propval(proph, &uint64v, sizeof (uint64v));
03831d35f7499c87d51205817c93e9a8d42c4baestevel default: /* not supported size */
03831d35f7499c87d51205817c93e9a8d42c4baestevel return (0);
03831d35f7499c87d51205817c93e9a8d42c4baestevel * return the value of the float prop
03831d35f7499c87d51205817c93e9a8d42c4baestevelstatic float
03831d35f7499c87d51205817c93e9a8d42c4baestevelpicldiag_get_float_propval(picl_nodehdl_t modh, char *prop_name, int *ret)
03831d35f7499c87d51205817c93e9a8d42c4baestevel err = picl_get_propinfo_by_name(modh, prop_name, &pinfo, &proph);
03831d35f7499c87d51205817c93e9a8d42c4baestevel return ((float)0);
03831d35f7499c87d51205817c93e9a8d42c4baestevel * If it is not a float prop, return failure
03831d35f7499c87d51205817c93e9a8d42c4baestevel return ((float)0);
03831d35f7499c87d51205817c93e9a8d42c4baestevel *ret = picl_get_propval(proph, &floatv, sizeof (floatv));
03831d35f7499c87d51205817c93e9a8d42c4baestevel * get the clock frequency
03831d35f7499c87d51205817c93e9a8d42c4baestevelpicldiag_get_clock_freq(picl_nodehdl_t modh, uint32_t *freq)
03831d35f7499c87d51205817c93e9a8d42c4baestevel clk_freq = picldiag_get_uint_propval(modh, OBP_PROP_CLOCK_FREQ, &err);
03831d35f7499c87d51205817c93e9a8d42c4baestevel * get the clock frequency from parent
03831d35f7499c87d51205817c93e9a8d42c4baestevelpicldiag_get_clock_from_parent(picl_nodehdl_t nodeh, uint32_t *clk)
03831d35f7499c87d51205817c93e9a8d42c4baestevel err = picl_get_propval_by_name(nodeh, PICL_PROP_PARENT,
03831d35f7499c87d51205817c93e9a8d42c4baestevel err = picl_get_propval_by_name(parenth, PICL_PROP_PARENT,
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
03831d35f7499c87d51205817c93e9a8d42c4baestevelpicldiag_get_fru_parent(picl_nodehdl_t nodeh, picl_nodehdl_t *fruparenth)
03831d35f7499c87d51205817c93e9a8d42c4baestevel /* find fru parent */
03831d35f7499c87d51205817c93e9a8d42c4baestevel err = picl_get_propval_by_name(nodeh, PICL_REFPROP_FRU_PARENT,
03831d35f7499c87d51205817c93e9a8d42c4baestevel err = picl_get_propval_by_name(nodeh, PICL_REFPROP_LOC_PARENT,
03831d35f7499c87d51205817c93e9a8d42c4baestevel err = picl_get_propval_by_name(nodeh, PICL_PROP_PARENT,
03831d35f7499c87d51205817c93e9a8d42c4baestevel err = picl_get_propval_by_name(nodeh, PICL_REFPROP_FRU_PARENT,
03831d35f7499c87d51205817c93e9a8d42c4baestevel * get label
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
03831d35f7499c87d51205817c93e9a8d42c4baestevelpicldiag_get_label(picl_nodehdl_t nodeh, char **label)
03831d35f7499c87d51205817c93e9a8d42c4baestevel err = picldiag_get_string_propval(nodeh, PICL_PROP_LABEL, label);
03831d35f7499c87d51205817c93e9a8d42c4baestevel err = picl_get_propval_by_name(nodeh, PICL_PROP_PARENT,
03831d35f7499c87d51205817c93e9a8d42c4baestevel err = picldiag_get_string_propval(nodeh, PICL_PROP_LABEL,
03831d35f7499c87d51205817c93e9a8d42c4baestevel * get combined label
03831d35f7499c87d51205817c93e9a8d42c4baestevel * like picldiag_get_label, except concatenates the labels of parent locations
03831d35f7499c87d51205817c93e9a8d42c4baestevel * eg SB0/P3 for processor P3 on system board SB0
03831d35f7499c87d51205817c93e9a8d42c4baestevel * if caller specifies non-zero label length, label will be cut to specified
03831d35f7499c87d51205817c93e9a8d42c4baestevel * negative length is left justified, non-negative length is right justified
03831d35f7499c87d51205817c93e9a8d42c4baestevelpicldiag_get_combined_label(picl_nodehdl_t nodeh, char **label, int lablen)
03831d35f7499c87d51205817c93e9a8d42c4baestevel err = picldiag_get_string_propval(nodeh, PICL_PROP_LABEL, &ptr1);
03831d35f7499c87d51205817c93e9a8d42c4baestevel err = picl_get_propval_by_name(nodeh, PICL_PROP_PARENT,
03831d35f7499c87d51205817c93e9a8d42c4baestevel err = picldiag_get_string_propval(nodeh, PICL_PROP_LABEL, &ptr);
03831d35f7499c87d51205817c93e9a8d42c4baestevel /* if no string truncation is desired or required */
03831d35f7499c87d51205817c93e9a8d42c4baestevel /* string truncation is required; alloc space for (lablen + \0) */
03831d35f7499c87d51205817c93e9a8d42c4baestevel /* right justification; label = "+<string>\0" */
03831d35f7499c87d51205817c93e9a8d42c4baestevel /* left justification; label = "<string>+\0" */
03831d35f7499c87d51205817c93e9a8d42c4baestevel * return the first compatible value
03831d35f7499c87d51205817c93e9a8d42c4baestevelpicldiag_get_first_compatible_value(picl_nodehdl_t nodeh, char **outbuf)
03831d35f7499c87d51205817c93e9a8d42c4baestevel err = picl_get_propinfo_by_name(nodeh, OBP_PROP_COMPATIBLE,
03831d35f7499c87d51205817c93e9a8d42c4baestevel /* get first string from table */
03831d35f7499c87d51205817c93e9a8d42c4baestevel * print the header in the center
03831d35f7499c87d51205817c93e9a8d42c4baestevel for (i = 0; i < start_pos; i++)
03831d35f7499c87d51205817c93e9a8d42c4baestevel for (i = 0; i < start_pos; i++)
03831d35f7499c87d51205817c93e9a8d42c4baestevel * print the size
03831d35f7499c87d51205817c93e9a8d42c4baestevel * display platform banner
03831d35f7499c87d51205817c93e9a8d42c4baestevel * get PICL_PROP_MACHINE and PICL_PROP_BANNER_NAME
03831d35f7499c87d51205817c93e9a8d42c4baestevel err = picldiag_get_string_propval(plafh, PICL_PROP_MACHINE,
03831d35f7499c87d51205817c93e9a8d42c4baestevel err = picldiag_get_string_propval(plafh, OBP_PROP_BANNER_NAME,
03831d35f7499c87d51205817c93e9a8d42c4baestevel err = picl_get_propval_by_name(serialh, PICL_REFPROP_FRU_PARENT,
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (err == PICL_PROPNOTFOUND || err == PICL_PROPVALUNAVAILABLE)
03831d35f7499c87d51205817c93e9a8d42c4baestevel * display the chassis serial number
03831d35f7499c87d51205817c93e9a8d42c4baestevel picl_walk_tree_by_class(plafh, PICL_CLASS_CHASSIS_SERIAL_NUM,
03831d35f7499c87d51205817c93e9a8d42c4baestevel * display the clock frequency
03831d35f7499c87d51205817c93e9a8d42c4baestevel * callback function to display the memory size
03831d35f7499c87d51205817c93e9a8d42c4baestevel/*ARGSUSED*/
03831d35f7499c87d51205817c93e9a8d42c4baestevel mem_size = picldiag_get_uint_propval(memh, PICL_PROP_SIZE, &err);
03831d35f7499c87d51205817c93e9a8d42c4baestevel mem_xfersize = picldiag_get_uint_propval(memh, PICL_PROP_TRANSFER_SIZE,
03831d35f7499c87d51205817c93e9a8d42c4baestevel * callback function to print cpu information
03831d35f7499c87d51205817c93e9a8d42c4baestevel/*ARGSUSED*/
03831d35f7499c87d51205817c93e9a8d42c4baestevel * If no ID is found, return
03831d35f7499c87d51205817c93e9a8d42c4baestevel id = picldiag_get_uint_propval(nodeh, PICL_PROP_ID, &err);
03831d35f7499c87d51205817c93e9a8d42c4baestevel * If no freq is found, return
03831d35f7499c87d51205817c93e9a8d42c4baestevel /* Ecache size */
03831d35f7499c87d51205817c93e9a8d42c4baestevel uintval = picldiag_get_uint_propval(nodeh, OBP_PROP_ECACHE_SIZE, &err);
03831d35f7499c87d51205817c93e9a8d42c4baestevel /* Implementation */
03831d35f7499c87d51205817c93e9a8d42c4baestevel err = picldiag_get_string_propval(nodeh, PICL_PROP_NAME, &impl_name);
03831d35f7499c87d51205817c93e9a8d42c4baestevel /* CPU Mask */
03831d35f7499c87d51205817c93e9a8d42c4baestevel uintval = picldiag_get_uint_propval(nodeh, OBP_PROP_MASK, &err);
03831d35f7499c87d51205817c93e9a8d42c4baestevel * Status - if the node has a status property then display that
03831d35f7499c87d51205817c93e9a8d42c4baestevel * otherwise display the State property
03831d35f7499c87d51205817c93e9a8d42c4baestevel err = picldiag_get_string_propval(nodeh, PICL_PROP_STATUS, &status);
03831d35f7499c87d51205817c93e9a8d42c4baestevel * Location: use label of fru parent
03831d35f7499c87d51205817c93e9a8d42c4baestevel err = picldiag_get_combined_label(parenth, &label, 12);
03831d35f7499c87d51205817c93e9a8d42c4baestevel * display cpu information
03831d35f7499c87d51205817c93e9a8d42c4baestevel * Display the table header for CPUs . Then display the CPU
03831d35f7499c87d51205817c93e9a8d42c4baestevel * frequency, cache size, and processor revision on all the boards.
03831d35f7499c87d51205817c93e9a8d42c4baestevel logprintf_header(dgettext(TEXT_DOMAIN, "CPUs"), DEFAULT_LINE_WIDTH);
2983dda76a6d296fdb560c88114fe41caad1b84fMichael Bergknoff "Mask Status Location\n");
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf("--- -------- ---------- --------------------- "
2983dda76a6d296fdb560c88114fe41caad1b84fMichael Bergknoff "----- ------ --------\n");
03831d35f7499c87d51205817c93e9a8d42c4baestevel err = picl_walk_tree_by_class(plafh, PICL_CLASS_CPU, PICL_CLASS_CPU,
03831d35f7499c87d51205817c93e9a8d42c4baestevel * Inserts an io_card structure into the list.
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 default: /* won't reach here */
03831d35f7499c87d51205817c93e9a8d42c4baestevel * print label for memory module
03831d35f7499c87d51205817c93e9a8d42c4baestevel err = picldiag_get_combined_label(fruparenth, &label, 30);
03831d35f7499c87d51205817c93e9a8d42c4baestevel * print the bank id and add the bank handle in the bank list
03831d35f7499c87d51205817c93e9a8d42c4baestevel * return the head of the bank list
03831d35f7499c87d51205817c93e9a8d42c4baestevel * print the bank id in the segment table contains column
03831d35f7499c87d51205817c93e9a8d42c4baestevel id = picldiag_get_uint_propval(bankh, PICL_PROP_ID, &err);
03831d35f7499c87d51205817c93e9a8d42c4baestevel * Save the bank information for later (print_bank_table)
03831d35f7499c87d51205817c93e9a8d42c4baestevel * Compute the way numbers for the bank
03831d35f7499c87d51205817c93e9a8d42c4baestevel match = picldiag_get_uint_propval(bankh, PICL_PROP_ADDRESSMATCH, &err);
03831d35f7499c87d51205817c93e9a8d42c4baestevel mask = picldiag_get_uint_propval(bankh, PICL_PROP_ADDRESSMASK, &err);
03831d35f7499c87d51205817c93e9a8d42c4baestevel while ((i < segp->ifactor) && (newptr->iway_count < MAX_IWAYS)) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (((segp->base + i * mem_xfersize) & mask) == match)
03831d35f7499c87d51205817c93e9a8d42c4baestevel * find the memory bank and add the bank handle in the bank list
03831d35f7499c87d51205817c93e9a8d42c4baestevel * return the head of the bank list
03831d35f7499c87d51205817c93e9a8d42c4baestevellogprintf_bankinfo(picl_nodehdl_t segh, seg_info_t *segp)
03831d35f7499c87d51205817c93e9a8d42c4baestevel * find memory-bank
03831d35f7499c87d51205817c93e9a8d42c4baestevel err = picl_walk_tree_by_class(segh, PICL_CLASS_MEMORY_BANK, segp,
03831d35f7499c87d51205817c93e9a8d42c4baestevel * print the label of memory module or the memory module bank ids
03831d35f7499c87d51205817c93e9a8d42c4baestevellogprintf_seg_contains_col(picl_nodehdl_t nodeh, seg_info_t *segp)
03831d35f7499c87d51205817c93e9a8d42c4baestevel * find memory-module if referenced directly from the memory-segment
03831d35f7499c87d51205817c93e9a8d42c4baestevel * (ie no memory banks)
03831d35f7499c87d51205817c93e9a8d42c4baestevel err = picl_get_propval_by_name(nodeh, PICL_REFPROP_MEMORY_MODULE,
03831d35f7499c87d51205817c93e9a8d42c4baestevel if ((err != PICL_SUCCESS) && (err != PICL_PROPNOTFOUND))
03831d35f7499c87d51205817c93e9a8d42c4baestevel * memory-module not referenced directly from the memory segment
03831d35f7499c87d51205817c93e9a8d42c4baestevel * so list memory banks instead
03831d35f7499c87d51205817c93e9a8d42c4baestevel * find all memory modules under the given memory module group
03831d35f7499c87d51205817c93e9a8d42c4baestevel * and print its label
03831d35f7499c87d51205817c93e9a8d42c4baestevellogprintf_memory_module_group_info(picl_nodehdl_t memgrph, uint64_t mcid)
03831d35f7499c87d51205817c93e9a8d42c4baestevel id = picldiag_get_uint_propval(memgrph, PICL_PROP_ID, &err);
03831d35f7499c87d51205817c93e9a8d42c4baestevel err = picl_get_propval_by_name(memgrph, PICL_PROP_CHILD, &moduleh,
03831d35f7499c87d51205817c93e9a8d42c4baestevel /* controller id */
03831d35f7499c87d51205817c93e9a8d42c4baestevel /* group id */
03831d35f7499c87d51205817c93e9a8d42c4baestevel err = picl_get_propval_by_name(moduleh, PICL_PROP_CLASSNAME,
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (strcmp(piclclass, PICL_CLASS_MEMORY_MODULE) == 0) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel err = picl_get_propval_by_name(moduleh, PICL_PROP_PEER,
03831d35f7499c87d51205817c93e9a8d42c4baestevel * search children to find memory module group under memory-controller
03831d35f7499c87d51205817c93e9a8d42c4baestevelfind_memory_module_group(picl_nodehdl_t mch, int *print_header)
03831d35f7499c87d51205817c93e9a8d42c4baestevel mcid = picldiag_get_uint_propval(mch, OBP_PROP_PORTID, &err);
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (strcmp(piclclass, PICL_CLASS_MEMORY_MODULE_GROUP) == 0) {
2983dda76a6d296fdb560c88114fe41caad1b84fMichael Bergknoff "\nMemory Module Groups:\n"));
03831d35f7499c87d51205817c93e9a8d42c4baestevel err = logprintf_memory_module_group_info(memgrph, mcid);
03831d35f7499c87d51205817c93e9a8d42c4baestevel err = picl_get_propval_by_name(memgrph, PICL_PROP_PEER,
03831d35f7499c87d51205817c93e9a8d42c4baestevel * print memory module group table per memory-controller
03831d35f7499c87d51205817c93e9a8d42c4baestevel * find memory-controller
03831d35f7499c87d51205817c93e9a8d42c4baestevel err = picl_get_propval_by_name(plafh, PICL_PROP_CHILD, &mch,
03831d35f7499c87d51205817c93e9a8d42c4baestevel err = picl_get_propval_by_name(mch, PICL_PROP_CLASSNAME,
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (strcmp(piclclass, PICL_CLASS_MEMORY_CONTROLLER) != 0) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel * print bank table
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf(dgettext(TEXT_DOMAIN, "\nBank Table:\n"));
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf("---------------------------------------");
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 for (ptr = mem_banks; ptr != NULL; ptr = ptr->next) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel id = picldiag_get_uint_propval(bankh, PICL_PROP_ID, &err);
03831d35f7499c87d51205817c93e9a8d42c4baestevel /* find memory-module-group */
03831d35f7499c87d51205817c93e9a8d42c4baestevel * get controller id
03831d35f7499c87d51205817c93e9a8d42c4baestevel /* get group id */
03831d35f7499c87d51205817c93e9a8d42c4baestevel id = picldiag_get_uint_propval(memgrph, PICL_PROP_ID,
03831d35f7499c87d51205817c93e9a8d42c4baestevel size = picldiag_get_uint_propval(bankh, PICL_PROP_SIZE, &err);
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (i != 0)
03831d35f7499c87d51205817c93e9a8d42c4baestevel * callback function to print segment, add the bank in the list and
03831d35f7499c87d51205817c93e9a8d42c4baestevel * return the bank list
03831d35f7499c87d51205817c93e9a8d42c4baestevel/* ARGSUSED */
03831d35f7499c87d51205817c93e9a8d42c4baestevel /* get base address */
03831d35f7499c87d51205817c93e9a8d42c4baestevel seginfo.base = picldiag_get_uint_propval(segh, PICL_PROP_BASEADDRESS,
03831d35f7499c87d51205817c93e9a8d42c4baestevel /* get size */
03831d35f7499c87d51205817c93e9a8d42c4baestevel seginfo.size = picldiag_get_uint_propval(segh, PICL_PROP_SIZE, &err);
03831d35f7499c87d51205817c93e9a8d42c4baestevel /* get interleave factor */
03831d35f7499c87d51205817c93e9a8d42c4baestevel * search children to find memory-segment and set up the bank list
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf(dgettext(TEXT_DOMAIN, "Segment Table:\n"));
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("-----------------------------------------\n");
03831d35f7499c87d51205817c93e9a8d42c4baestevel err = picl_walk_tree_by_class(plafh, PICL_CLASS_MEMORY_SEGMENT,
03831d35f7499c87d51205817c93e9a8d42c4baestevel * display memory configuration
03831d35f7499c87d51205817c93e9a8d42c4baestevel logprintf_header(dgettext(TEXT_DOMAIN, "Memory Configuration"),
03831d35f7499c87d51205817c93e9a8d42c4baestevel * print the hub device
03831d35f7499c87d51205817c93e9a8d42c4baestevel err = picldiag_get_string_propval(hubh, PICL_PROP_NAME, &name);
03831d35f7499c87d51205817c93e9a8d42c4baestevel err = picl_get_propval_by_name(hubh, PICL_REFPROP_LOC_PARENT, &parenth,
03831d35f7499c87d51205817c93e9a8d42c4baestevel /* Read the Label */
03831d35f7499c87d51205817c93e9a8d42c4baestevel /* No Label, try the reg */
03831d35f7499c87d51205817c93e9a8d42c4baestevel err = picl_get_propval_by_name(hubh, OBP_PROP_REG, &portnum,
03831d35f7499c87d51205817c93e9a8d42c4baestevel * callback functions to display hub devices
03831d35f7499c87d51205817c93e9a8d42c4baestevel/* ARGSUSED */
03831d35f7499c87d51205817c93e9a8d42c4baestevel err = picl_get_propval_by_name(hubh, PICL_PROP_CHILD, &chdh,
03831d35f7499c87d51205817c93e9a8d42c4baestevel /* print header */
03831d35f7499c87d51205817c93e9a8d42c4baestevel err = picldiag_get_string_propval(hubh, PICL_PROP_NAME,
03831d35f7499c87d51205817c93e9a8d42c4baestevel /* Get its hub number */
03831d35f7499c87d51205817c93e9a8d42c4baestevel " %s#%d Devices "),
03831d35f7499c87d51205817c93e9a8d42c4baestevel * callback functions to display usb devices
03831d35f7499c87d51205817c93e9a8d42c4baestevel/* ARGSUSED */
03831d35f7499c87d51205817c93e9a8d42c4baestevel err = picl_walk_tree_by_class(usbh, NULL, &type, print_usb_devices);
03831d35f7499c87d51205817c93e9a8d42c4baestevel * find usb devices and print its information
03831d35f7499c87d51205817c93e9a8d42c4baestevel * get the usb node
03831d35f7499c87d51205817c93e9a8d42c4baestevel err = picl_walk_tree_by_class(plafh, PICL_CLASS_USB, NULL,
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
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 err = picl_get_propinfo_by_name(nodeh, PICL_PROP_NAME, &pinfo,
03831d35f7499c87d51205817c93e9a8d42c4baestevel err = picl_get_propval_by_name(nodeh, PICL_PROP_CLASSNAME,
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 * if compatible prop is found, name will be
03831d35f7499c87d51205817c93e9a8d42c4baestevel * <nodename>-<compatible>
03831d35f7499c87d51205817c93e9a8d42c4baestevel err = picldiag_get_first_compatible_value(nodeh, &compatible);
03831d35f7499c87d51205817c93e9a8d42c4baestevel * nodename same as binding name -
03831d35f7499c87d51205817c93e9a8d42c4baestevel * no need to display twice
03831d35f7499c87d51205817c93e9a8d42c4baestevel * If it is an immediate child under pci/pciex/sbus/upa 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 if (((parentname == NULL) && (!is_bus(piclclass))) ||
03831d35f7499c87d51205817c93e9a8d42c4baestevel ((parentname != NULL) && (is_io_device(piclclass)))) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel (void) snprintf(name, MAXSTRLEN, "%s/%s", parentname,
03831d35f7499c87d51205817c93e9a8d42c4baestevel * append the class if its class is not a generic
03831d35f7499c87d51205817c93e9a8d42c4baestevel * obp-device class
03831d35f7499c87d51205817c93e9a8d42c4baestevel err = picldiag_get_combined_label(fruparenth, &label,
03831d35f7499c87d51205817c93e9a8d42c4baestevel /* devfs-path */
03831d35f7499c87d51205817c93e9a8d42c4baestevel err = picldiag_get_string_propval(nodeh, PICL_PROP_DEVFS_PATH,
03831d35f7499c87d51205817c93e9a8d42c4baestevel * If there is any child, Go through each child.
03831d35f7499c87d51205817c93e9a8d42c4baestevel err = picl_get_propval_by_name(nodeh, PICL_PROP_CHILD,
03831d35f7499c87d51205817c93e9a8d42c4baestevel /* there is a child */
03831d35f7499c87d51205817c93e9a8d42c4baestevel (void) snprintf(name, MAXSTRLEN, "%s/%s", parentname,
03831d35f7499c87d51205817c93e9a8d42c4baestevel err = add_io_leaves(childh, name, board, bus_id, slot, freq,
03831d35f7499c87d51205817c93e9a8d42c4baestevel * get next child
03831d35f7499c87d51205817c93e9a8d42c4baestevel err = picl_get_propval_by_name(childh, PICL_PROP_PEER,
03831d35f7499c87d51205817c93e9a8d42c4baestevel * callback function to add all io devices under sbus in io list
03831d35f7499c87d51205817c93e9a8d42c4baestevel/*ARGSUSED*/
03831d35f7499c87d51205817c93e9a8d42c4baestevel /* Fill in common infomation */
03831d35f7499c87d51205817c93e9a8d42c4baestevel * If no board# is found, set boardnum to 0
03831d35f7499c87d51205817c93e9a8d42c4baestevel boardnum = picldiag_get_uint_propval(sbush, OBP_PROP_BOARD_NUM, &err);
03831d35f7499c87d51205817c93e9a8d42c4baestevel err = picl_get_propval_by_name(sbush, PICL_PROP_CHILD, &nodeh,
03831d35f7499c87d51205817c93e9a8d42c4baestevel err = picl_get_propval_by_name(nodeh, PICL_PROP_PEER,
03831d35f7499c87d51205817c93e9a8d42c4baestevel err = picldiag_get_string_propval(nodeh, OBP_PROP_MODEL,
03831d35f7499c87d51205817c93e9a8d42c4baestevel err = picldiag_get_string_propval(nodeh, PICL_PROP_STATUS,
03831d35f7499c87d51205817c93e9a8d42c4baestevel err = add_io_leaves(nodeh, NULL, boardnum, bus_id, slot, freq,
03831d35f7499c87d51205817c93e9a8d42c4baestevel err = picl_get_propval_by_name(nodeh, PICL_PROP_PEER, &nodeh,
03831d35f7499c87d51205817c93e9a8d42c4baestevel * add all io devices under pci/pciex in io list
03831d35f7499c87d51205817c93e9a8d42c4baestevel/* ARGSUSED */
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 * If no board# is found, set boardnum to 0
03831d35f7499c87d51205817c93e9a8d42c4baestevel boardnum = picldiag_get_uint_propval(pcih, OBP_PROP_BOARD_NUM, &err);
03831d35f7499c87d51205817c93e9a8d42c4baestevel /* Walk through the children */
03831d35f7499c87d51205817c93e9a8d42c4baestevel err = picl_get_propval_by_name(pcih, PICL_PROP_CHILD, &nodeh,
03831d35f7499c87d51205817c93e9a8d42c4baestevel err = picl_get_propval_by_name(nodeh, PICL_PROP_CLASSNAME,
03831d35f7499c87d51205817c93e9a8d42c4baestevel * Skip PCIEX, PCI bridge and USB devices because they will be
03831d35f7499c87d51205817c93e9a8d42c4baestevel * processed later
03831d35f7499c87d51205817c93e9a8d42c4baestevel err = picl_get_propval_by_name(nodeh, PICL_PROP_PEER,
03831d35f7499c87d51205817c93e9a8d42c4baestevel /* Get the device id for pci card */
03831d35f7499c87d51205817c93e9a8d42c4baestevel err = picl_get_propval_by_name(nodeh, PICL_PROP_PEER,
03831d35f7499c87d51205817c93e9a8d42c4baestevel /* Get the model of this card */
03831d35f7499c87d51205817c93e9a8d42c4baestevel err = picldiag_get_string_propval(nodeh, OBP_PROP_MODEL,
03831d35f7499c87d51205817c93e9a8d42c4baestevel err = picldiag_get_string_propval(nodeh, PICL_PROP_STATUS,
03831d35f7499c87d51205817c93e9a8d42c4baestevel err = add_io_leaves(nodeh, NULL, boardnum, bus_id, slot,
03831d35f7499c87d51205817c93e9a8d42c4baestevel err = picl_get_propval_by_name(nodeh, PICL_PROP_PEER, &nodeh,
03831d35f7499c87d51205817c93e9a8d42c4baestevel * add io devices in io list
03831d35f7499c87d51205817c93e9a8d42c4baestevel * Its slot number is drived from upa-portid
03831d35f7499c87d51205817c93e9a8d42c4baestevel * If clock frequency can't be found from its parent, don't add
03831d35f7499c87d51205817c93e9a8d42c4baestevel * If no board# is found, set boardnum to 0
03831d35f7499c87d51205817c93e9a8d42c4baestevel boardnum = picldiag_get_uint_propval(nodeh, OBP_PROP_BOARD_NUM, &err);
03831d35f7499c87d51205817c93e9a8d42c4baestevel * get upa portid as slot number
03831d35f7499c87d51205817c93e9a8d42c4baestevel * If upa portid is not found, don't add the card.
03831d35f7499c87d51205817c93e9a8d42c4baestevel slot = picldiag_get_uint_propval(nodeh, OBP_PROP_UPA_PORTID,
03831d35f7499c87d51205817c93e9a8d42c4baestevel /* Get the model of this card */
03831d35f7499c87d51205817c93e9a8d42c4baestevel err = picldiag_get_string_propval(nodeh, OBP_PROP_MODEL, &model);
03831d35f7499c87d51205817c93e9a8d42c4baestevel * check if it is a ffb device
03831d35f7499c87d51205817c93e9a8d42c4baestevel * If it's a ffb device, append its board type to name
03831d35f7499c87d51205817c93e9a8d42c4baestevel * otherwise, use its nodename
03831d35f7499c87d51205817c93e9a8d42c4baestevel err = picl_get_prop_by_name(nodeh, PICL_PROP_FFB_BOARD_REV, &proph);
03831d35f7499c87d51205817c93e9a8d42c4baestevel err = picl_get_propinfo_by_name(nodeh, PICL_PROP_NAME,
03831d35f7499c87d51205817c93e9a8d42c4baestevel /* Find out if it's single or double buffered */
03831d35f7499c87d51205817c93e9a8d42c4baestevel err = picl_get_propval_by_name(nodeh, PICL_PROP_CLASSNAME,
03831d35f7499c87d51205817c93e9a8d42c4baestevel (void) snprintf(name, sizeof (name), "%s (%s)", name, piclclass);
03831d35f7499c87d51205817c93e9a8d42c4baestevel err = picldiag_get_string_propval(nodeh, PICL_PROP_STATUS, &status);
03831d35f7499c87d51205817c93e9a8d42c4baestevel err = picldiag_get_combined_label(fruparenth, &label, 15);
03831d35f7499c87d51205817c93e9a8d42c4baestevel /* devfs-path */
03831d35f7499c87d51205817c93e9a8d42c4baestevel err = picldiag_get_string_propval(nodeh, PICL_PROP_DEVFS_PATH,
03831d35f7499c87d51205817c93e9a8d42c4baestevel add_io_card(boardnum, bus_id, slot, label, freq, name, model, status,
03831d35f7499c87d51205817c93e9a8d42c4baestevel * loop through all children and add io devices in io list
03831d35f7499c87d51205817c93e9a8d42c4baestevel err = picl_get_propval_by_name(rooth, PICL_PROP_CHILD, &nodeh,
03831d35f7499c87d51205817c93e9a8d42c4baestevel err = picl_get_propval_by_name(nodeh, PICL_PROP_CLASSNAME,
03831d35f7499c87d51205817c93e9a8d42c4baestevel err = picl_get_propval_by_name(nodeh, PICL_PROP_PEER, &nodeh,
03831d35f7499c87d51205817c93e9a8d42c4baestevel * callback function to add all io devices under upa in io list
03831d35f7499c87d51205817c93e9a8d42c4baestevel/*ARGSUSED*/
03831d35f7499c87d51205817c93e9a8d42c4baestevel * display ffb hardware configuration
03831d35f7499c87d51205817c93e9a8d42c4baestevel/* ARGSUSED */
03831d35f7499c87d51205817c93e9a8d42c4baestevel * If it has PICL_PROP_FFB_BOARD_REV, it is a ffb device
03831d35f7499c87d51205817c93e9a8d42c4baestevel * Otherwise, return.
03831d35f7499c87d51205817c93e9a8d42c4baestevel board_rev = picldiag_get_uint_propval(ffbh, PICL_PROP_FFB_BOARD_REV,
03831d35f7499c87d51205817c93e9a8d42c4baestevel fbc_ver = picldiag_get_uint_propval(ffbh, OBP_PROP_FBC_REG_ID,
03831d35f7499c87d51205817c93e9a8d42c4baestevel err = picldiag_get_string_propval(ffbh, PICL_PROP_FFB_DAC_VER,
03831d35f7499c87d51205817c93e9a8d42c4baestevel err = picldiag_get_string_propval(ffbh, PICL_PROP_FFB_FBRAM_VER,
03831d35f7499c87d51205817c93e9a8d42c4baestevel * find all io devices and add them in the io list
03831d35f7499c87d51205817c93e9a8d42c4baestevel * look for io devices under the immediate children of platform
03831d35f7499c87d51205817c93e9a8d42c4baestevel err = picl_walk_tree_by_class(plafh, PICL_CLASS_SBUS,
03831d35f7499c87d51205817c93e9a8d42c4baestevel err = picl_walk_tree_by_class(plafh, PICL_CLASS_PCIEX,
03831d35f7499c87d51205817c93e9a8d42c4baestevel static int banner = 0; /* Have we printed the column headings? */
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (banner == 0) {
2983dda76a6d296fdb560c88114fe41caad1b84fMichael Bergknoff "---------------------------- "
2983dda76a6d296fdb560c88114fe41caad1b84fMichael Bergknoff "--------------------", 0);
03831d35f7499c87d51205817c93e9a8d42c4baestevel * We check to see if it's an int or
03831d35f7499c87d51205817c93e9a8d42c4baestevel * a char string to display for slot.
03831d35f7499c87d51205817c93e9a8d42c4baestevel * display all io devices
03831d35f7499c87d51205817c93e9a8d42c4baestevel logprintf_header(dgettext(TEXT_DOMAIN, "IO Devices"),
03831d35f7499c87d51205817c93e9a8d42c4baestevel * print fan device information
03831d35f7499c87d51205817c93e9a8d42c4baestevel err = picldiag_get_combined_label(fruph, &label, 20);
03831d35f7499c87d51205817c93e9a8d42c4baestevel } else if (err == PICL_PROPNOTFOUND || err == PICL_PROPVALUNAVAILABLE) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel speed = picldiag_get_uint_propval(fanh, PICL_PROP_FAN_SPEED, &err);
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (*countp == 0) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf("-------------------------------------------\n");
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf("-------------------------------------------\n");
03831d35f7499c87d51205817c93e9a8d42c4baestevel * callback function search children to find fan device and print its speed
03831d35f7499c87d51205817c93e9a8d42c4baestevel * print temperature sensor information
03831d35f7499c87d51205817c93e9a8d42c4baestevel err = picldiag_get_combined_label(fruph, &label, 14);
03831d35f7499c87d51205817c93e9a8d42c4baestevel temperature = picldiag_get_int_propval(temph, PICL_PROP_TEMPERATURE,
03831d35f7499c87d51205817c93e9a8d42c4baestevel } else if (err != PICL_PROPNOTFOUND && err != PICL_PROPVALUNAVAILABLE) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel threshold = picldiag_get_int_propval(temph, PICL_PROP_LOW_WARNING,
03831d35f7499c87d51205817c93e9a8d42c4baestevel } else if (err != PICL_PROPNOTFOUND && err != PICL_PROPVALUNAVAILABLE) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel threshold = picldiag_get_int_propval(temph, PICL_PROP_LOW_SHUTDOWN,
03831d35f7499c87d51205817c93e9a8d42c4baestevel } else if (err != PICL_PROPNOTFOUND && err != PICL_PROPVALUNAVAILABLE) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel threshold = picldiag_get_int_propval(temph, PICL_PROP_HIGH_WARNING,
03831d35f7499c87d51205817c93e9a8d42c4baestevel } else if (err != PICL_PROPNOTFOUND && err != PICL_PROPVALUNAVAILABLE) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel threshold = picldiag_get_int_propval(temph, PICL_PROP_HIGH_SHUTDOWN,
03831d35f7499c87d51205817c93e9a8d42c4baestevel } else if (err != PICL_PROPNOTFOUND && err != PICL_PROPVALUNAVAILABLE) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel err = picldiag_get_string_propval(temph, PICL_PROP_CONDITION, &status);
03831d35f7499c87d51205817c93e9a8d42c4baestevel } else if (err != PICL_PROPNOTFOUND && err != PICL_PROPVALUNAVAILABLE) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (*countp == 0) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf(dgettext(TEXT_DOMAIN, "Temperature sensors:\n"));
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf("-----------------------------------------\n");
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf("-----------------------------------------\n");
03831d35f7499c87d51205817c93e9a8d42c4baestevel * callback function search children to find temp sensors and print the temp
03831d35f7499c87d51205817c93e9a8d42c4baestevel/* ARGSUSED */
03831d35f7499c87d51205817c93e9a8d42c4baestevel err = picl_walk_tree_by_class(plafh, PICL_CLASS_TEMPERATURE_SENSOR,
03831d35f7499c87d51205817c93e9a8d42c4baestevel err = picl_walk_tree_by_class(plafh, PICL_CLASS_TEMPERATURE_INDICATOR,
03831d35f7499c87d51205817c93e9a8d42c4baestevel * print current sensor information
03831d35f7499c87d51205817c93e9a8d42c4baestevel err = picldiag_get_combined_label(fruph, &label, 20);
03831d35f7499c87d51205817c93e9a8d42c4baestevel current = picldiag_get_float_propval(currenth, PICL_PROP_CURRENT, &err);
03831d35f7499c87d51205817c93e9a8d42c4baestevel } else if (err != PICL_PROPNOTFOUND && err != PICL_PROPVALUNAVAILABLE) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel threshold = picldiag_get_float_propval(currenth, PICL_PROP_LOW_WARNING,
03831d35f7499c87d51205817c93e9a8d42c4baestevel } else if (err != PICL_PROPNOTFOUND && err != PICL_PROPVALUNAVAILABLE) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel threshold = picldiag_get_float_propval(currenth, PICL_PROP_LOW_SHUTDOWN,
03831d35f7499c87d51205817c93e9a8d42c4baestevel } else if (err != PICL_PROPNOTFOUND && err != PICL_PROPVALUNAVAILABLE) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel threshold = picldiag_get_float_propval(currenth, PICL_PROP_HIGH_WARNING,
03831d35f7499c87d51205817c93e9a8d42c4baestevel } else if (err != PICL_PROPNOTFOUND && err != PICL_PROPVALUNAVAILABLE) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel } else if (err != PICL_PROPNOTFOUND && err != PICL_PROPVALUNAVAILABLE) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel } else if (err != PICL_PROPNOTFOUND && err != PICL_PROPVALUNAVAILABLE) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (*countp == 0) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf("------------------------------------\n");
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf(dgettext(TEXT_DOMAIN, "Current sensors:\n"));
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf("----------------------------------------\n");
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf("----------------------------------------\n");
03831d35f7499c87d51205817c93e9a8d42c4baestevel * callback function search children to find curr sensors and print the curr
03831d35f7499c87d51205817c93e9a8d42c4baestevel/* ARGSUSED */
03831d35f7499c87d51205817c93e9a8d42c4baestevel err = picl_walk_tree_by_class(plafh, PICL_CLASS_CURRENT_SENSOR,
03831d35f7499c87d51205817c93e9a8d42c4baestevel err = picl_walk_tree_by_class(plafh, PICL_CLASS_CURRENT_INDICATOR,
03831d35f7499c87d51205817c93e9a8d42c4baestevel * print voltage sensor information
03831d35f7499c87d51205817c93e9a8d42c4baestevel err = picldiag_get_combined_label(fruph, &label, 14);
03831d35f7499c87d51205817c93e9a8d42c4baestevel voltage = picldiag_get_float_propval(voltageh, PICL_PROP_VOLTAGE, &err);
03831d35f7499c87d51205817c93e9a8d42c4baestevel } else if (err != PICL_PROPNOTFOUND && err != PICL_PROPVALUNAVAILABLE) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel threshold = picldiag_get_float_propval(voltageh, PICL_PROP_LOW_WARNING,
03831d35f7499c87d51205817c93e9a8d42c4baestevel } else if (err != PICL_PROPNOTFOUND && err != PICL_PROPVALUNAVAILABLE) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel threshold = picldiag_get_float_propval(voltageh, PICL_PROP_LOW_SHUTDOWN,
03831d35f7499c87d51205817c93e9a8d42c4baestevel } else if (err != PICL_PROPNOTFOUND && err != PICL_PROPVALUNAVAILABLE) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel threshold = picldiag_get_float_propval(voltageh, PICL_PROP_HIGH_WARNING,
03831d35f7499c87d51205817c93e9a8d42c4baestevel } else if (err != PICL_PROPNOTFOUND && err != PICL_PROPVALUNAVAILABLE) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel } else if (err != PICL_PROPNOTFOUND && err != PICL_PROPVALUNAVAILABLE) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel } else if (err != PICL_PROPNOTFOUND && err != PICL_PROPVALUNAVAILABLE) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (*countp == 0) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf("------------------------------------\n");
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf(dgettext(TEXT_DOMAIN, "Voltage sensors:\n"));
03831d35f7499c87d51205817c93e9a8d42c4baestevel * callback function search children to find voltage sensors and print voltage
03831d35f7499c87d51205817c93e9a8d42c4baestevel/* ARGSUSED */
03831d35f7499c87d51205817c93e9a8d42c4baestevel err = picl_walk_tree_by_class(plafh, PICL_CLASS_VOLTAGE_SENSOR,
03831d35f7499c87d51205817c93e9a8d42c4baestevel err = picl_walk_tree_by_class(plafh, PICL_CLASS_VOLTAGE_INDICATOR,
03831d35f7499c87d51205817c93e9a8d42c4baestevel * print led device information
03831d35f7499c87d51205817c93e9a8d42c4baestevel err = picldiag_get_combined_label(fruph, &label, 22);
03831d35f7499c87d51205817c93e9a8d42c4baestevel err = picldiag_get_string_propval(ledh, PICL_PROP_STATE, &state);
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (err == PICL_PROPNOTFOUND || err == PICL_PROPVALUNAVAILABLE) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel err = picldiag_get_string_propval(ledh, PICL_PROP_COLOR, &color);
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (err == PICL_PROPNOTFOUND || err == PICL_PROPVALUNAVAILABLE) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (*countp == 0) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel "------------\n");
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf("----------------------------------------"
03831d35f7499c87d51205817c93e9a8d42c4baestevel "----------------------\n");
03831d35f7499c87d51205817c93e9a8d42c4baestevel " Color\n");
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf("----------------------------------------"
03831d35f7499c87d51205817c93e9a8d42c4baestevel "----------------------\n");
03831d35f7499c87d51205817c93e9a8d42c4baestevel * callback function search children to find led devices and print status
03831d35f7499c87d51205817c93e9a8d42c4baestevel/* ARGSUSED */
03831d35f7499c87d51205817c93e9a8d42c4baestevel * print keyswitch device information
03831d35f7499c87d51205817c93e9a8d42c4baestevellogprintf_keyswitch_info(picl_nodehdl_t keyswitchh, picl_nodehdl_t fruph)
03831d35f7499c87d51205817c93e9a8d42c4baestevel err = picldiag_get_combined_label(fruph, &label, 10);
03831d35f7499c87d51205817c93e9a8d42c4baestevel err = picldiag_get_string_propval(keyswitchh, PICL_PROP_STATE, &state);
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (err == PICL_PROPNOTFOUND || err == PICL_PROPVALUNAVAILABLE) {
03831d35f7499c87d51205817c93e9a8d42c4baestevelkeyswitch_callback(picl_nodehdl_t keyswitchh, void *arg)
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 err = picl_get_propval_by_name(keyswitchh, PICL_REFPROP_FRU_PARENT,
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (err == PICL_PROPNOTFOUND || err == PICL_PROPVALUNAVAILABLE)
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (*countp == 0) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf("-----------------------------------------\n");
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf("-----------------------------------------\n");
03831d35f7499c87d51205817c93e9a8d42c4baestevel "Location Keyswitch State\n"));
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf("-----------------------------------------\n");
03831d35f7499c87d51205817c93e9a8d42c4baestevel * search children to find keyswitch device(s) and print status
03831d35f7499c87d51205817c93e9a8d42c4baestevel/* ARGSUSED */
03831d35f7499c87d51205817c93e9a8d42c4baestevel * display environment status
03831d35f7499c87d51205817c93e9a8d42c4baestevel logprintf_header(dgettext(TEXT_DOMAIN, "Environmental Status"),
03831d35f7499c87d51205817c93e9a8d42c4baestevel * print fru operational status
03831d35f7499c87d51205817c93e9a8d42c4baestevellogprintf_fru_oper_status(picl_nodehdl_t fruh, int *countp)
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (*countp == 0) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel "FRU Operational Status"),
03831d35f7499c87d51205817c93e9a8d42c4baestevel "Fru Operational Status:\n"));
03831d35f7499c87d51205817c93e9a8d42c4baestevel } else if (err != PICL_PROPNOTFOUND && err != PICL_PROPVALUNAVAILABLE) {
03831d35f7499c87d51205817c93e9a8d42c4baestevelfru_oper_status_callback(picl_nodehdl_t fruh, void *arg)
03831d35f7499c87d51205817c93e9a8d42c4baestevel * display fru operational status
03831d35f7499c87d51205817c93e9a8d42c4baestevel * check if the node having the version prop
03831d35f7499c87d51205817c93e9a8d42c4baestevel * If yes, print its nodename and version
03831d35f7499c87d51205817c93e9a8d42c4baestevel/* ARGSUSED */
d0e72dff6c5b858c797dfc1172d9c3aed2103940venki * Fire based platforms use "fire-revision#" or "module-revision#"
d0e72dff6c5b858c797dfc1172d9c3aed2103940venki * (depending on post/pre Fire 2.0) instead of "version#", so we
d0e72dff6c5b858c797dfc1172d9c3aed2103940venki * need to check for these if we don't find "version#"
03831d35f7499c87d51205817c93e9a8d42c4baestevel version = picldiag_get_uint_propval(nodeh, OBP_PROP_VERSION_NUM, &err);
d0e72dff6c5b858c797dfc1172d9c3aed2103940venki version = picldiag_get_uint_propval(nodeh, OBP_PROP_FIREREV_NUM,
03831d35f7499c87d51205817c93e9a8d42c4baestevel /* devfs-path */
03831d35f7499c87d51205817c93e9a8d42c4baestevel err = picldiag_get_string_propval(nodeh, PICL_PROP_DEVFS_PATH, &name);
03831d35f7499c87d51205817c93e9a8d42c4baestevel /* model */
03831d35f7499c87d51205817c93e9a8d42c4baestevel err = picldiag_get_string_propval(nodeh, PICL_PROP_BINDING_NAME,
03831d35f7499c87d51205817c93e9a8d42c4baestevel /* status */
03831d35f7499c87d51205817c93e9a8d42c4baestevel err = picldiag_get_string_propval(nodeh, PICL_PROP_STATUS, &status);
03831d35f7499c87d51205817c93e9a8d42c4baestevel * Display the data
03831d35f7499c87d51205817c93e9a8d42c4baestevel /* model */
03831d35f7499c87d51205817c93e9a8d42c4baestevel /* status */
03831d35f7499c87d51205817c93e9a8d42c4baestevel /* revision */
03831d35f7499c87d51205817c93e9a8d42c4baestevel * traverse the tree to display asic revision id for ebus
03831d35f7499c87d51205817c93e9a8d42c4baestevel/* ARGSUSED */
03831d35f7499c87d51205817c93e9a8d42c4baestevel id = picldiag_get_uint_propval(ebush, OBP_PROP_REVISION_ID, &err);
03831d35f7499c87d51205817c93e9a8d42c4baestevel /* devfs-path */
03831d35f7499c87d51205817c93e9a8d42c4baestevel err = picldiag_get_string_propval(ebush, PICL_PROP_DEVFS_PATH, &name);
03831d35f7499c87d51205817c93e9a8d42c4baestevel /* model */
03831d35f7499c87d51205817c93e9a8d42c4baestevel err = picldiag_get_string_propval(ebush, PICL_PROP_BINDING_NAME,
03831d35f7499c87d51205817c93e9a8d42c4baestevel /* status */
03831d35f7499c87d51205817c93e9a8d42c4baestevel err = picldiag_get_string_propval(ebush, PICL_PROP_STATUS, &status);
03831d35f7499c87d51205817c93e9a8d42c4baestevel * Display the data
03831d35f7499c87d51205817c93e9a8d42c4baestevel /* model */
03831d35f7499c87d51205817c93e9a8d42c4baestevel /* status */
03831d35f7499c87d51205817c93e9a8d42c4baestevel /* revision */
03831d35f7499c87d51205817c93e9a8d42c4baestevel * display asic revision id
03831d35f7499c87d51205817c93e9a8d42c4baestevel /* Print the header */
03831d35f7499c87d51205817c93e9a8d42c4baestevel logprintf_header(dgettext(TEXT_DOMAIN, "HW Revisions"),
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf("--------------------------------------\n");
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf("--------------------------------------\n");
03831d35f7499c87d51205817c93e9a8d42c4baestevel err = picl_walk_tree_by_class(plafh, NULL, NULL, asicrev_callback);
03831d35f7499c87d51205817c93e9a8d42c4baestevel err = picl_walk_tree_by_class(plafh, PICL_CLASS_EBUS,
03831d35f7499c87d51205817c93e9a8d42c4baestevel err = picl_walk_tree_by_class(plafh, PICL_CLASS_DISPLAY,
03831d35f7499c87d51205817c93e9a8d42c4baestevel * find the options node and its powerfail_time prop
03831d35f7499c87d51205817c93e9a8d42c4baestevel * If found, display the list of latest powerfail.
03831d35f7499c87d51205817c93e9a8d42c4baestevel/* ARGSUSED */
03831d35f7499c87d51205817c93e9a8d42c4baestevel err = picldiag_get_string_propval(nodeh, PROP_POWERFAIL_TIME,
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf(dgettext(TEXT_DOMAIN, "Most recent AC Power Failure:\n"));
03831d35f7499c87d51205817c93e9a8d42c4baestevel * display the OBP and POST prom revisions
03831d35f7499c87d51205817c93e9a8d42c4baestevel/* ARGSUSED */
03831d35f7499c87d51205817c93e9a8d42c4baestevelflashprom_callback(picl_nodehdl_t flashpromh, void *arg)
03831d35f7499c87d51205817c93e9a8d42c4baestevel err = picl_get_propinfo_by_name(flashpromh, OBP_PROP_VERSION,
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf(dgettext(TEXT_DOMAIN, "System PROM revisions:\n"));
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 err = picl_get_propval(proph, prom_version, pinfo.size);
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (pinfo.type != PICL_PTYPE_TABLE) /* not supported type */
03831d35f7499c87d51205817c93e9a8d42c4baestevel /* get first row */
03831d35f7499c87d51205817c93e9a8d42c4baestevel err = picl_get_propval(rowproph, prom_version, pinfo.size);
03831d35f7499c87d51205817c93e9a8d42c4baestevel /* get second row */
03831d35f7499c87d51205817c93e9a8d42c4baesteveldisplay_system_info(int serrlog, int log_flag, picl_nodehdl_t rooth)
03831d35f7499c87d51205817c93e9a8d42c4baestevel err = picldiag_get_node_by_name(rooth, PICL_NODE_PLATFORM, &plafh);
03831d35f7499c87d51205817c93e9a8d42c4baestevel err = picl_walk_tree_by_class(plafh, PICL_CLASS_MEMORY,
03831d35f7499c87d51205817c93e9a8d42c4baestevel err = picl_walk_tree_by_class(rooth, PICL_CLASS_OPTIONS,
03831d35f7499c87d51205817c93e9a8d42c4baestevel err = picldiag_get_node_by_name(rooth, PICL_NODE_FRUTREE,
03831d35f7499c87d51205817c93e9a8d42c4baestevel err = picl_walk_tree_by_class(plafh, PICL_CLASS_FLASHPROM,
03831d35f7499c87d51205817c93e9a8d42c4baestevel if ((err != PICL_SUCCESS) && (err != PICL_PROPNOTFOUND))
03831d35f7499c87d51205817c93e9a8d42c4baestevel * do_prominfo is called from main in prtdiag. It returns PD_SYSTEM_FAILURE if
03831d35f7499c87d51205817c93e9a8d42c4baestevel * any system failure is detected, PD_INTERNAL_FAILURE for internal errors and
03831d35f7499c87d51205817c93e9a8d42c4baestevel * PD_SUCCESS otherwise. main uses the return value as the exit code.
03831d35f7499c87d51205817c93e9a8d42c4baestevel/* ARGSUSED */
03831d35f7499c87d51205817c93e9a8d42c4baesteveldo_prominfo(int serrlog, char *pgname, int log_flag, int prt_flag)
03831d35f7499c87d51205817c93e9a8d42c4baestevel fprintf(stderr, EM_GET_ROOT_FAIL, picl_strerror(err));
03831d35f7499c87d51205817c93e9a8d42c4baestevel if ((err == PICL_STALEHANDLE) || (err == PICL_INVALIDHANDLE))
03831d35f7499c87d51205817c93e9a8d42c4baestevel } while (!done);