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) 2004, 2010, Oracle and/or its affiliates. All rights reserved.
03831d35f7499c87d51205817c93e9a8d42c4baestevel */
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel/*
03831d35f7499c87d51205817c93e9a8d42c4baestevel * This program prints the diagnostics of Sanibel system. It
03831d35f7499c87d51205817c93e9a8d42c4baestevel * also prints other miscellaneous information about watchdog, temperature
03831d35f7499c87d51205817c93e9a8d42c4baestevel * of CPU sensor, firmware versions of SMC and, micro controller role
03831d35f7499c87d51205817c93e9a8d42c4baestevel * etc. The basic sources of output is PICL, and SMC.
03831d35f7499c87d51205817c93e9a8d42c4baestevel */
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel/* includes */
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel#include <stdio.h>
03831d35f7499c87d51205817c93e9a8d42c4baestevel#include <strings.h>
03831d35f7499c87d51205817c93e9a8d42c4baestevel#include <ctype.h>
03831d35f7499c87d51205817c93e9a8d42c4baestevel#include <string.h>
03831d35f7499c87d51205817c93e9a8d42c4baestevel#include <time.h>
03831d35f7499c87d51205817c93e9a8d42c4baestevel#include <dirent.h>
03831d35f7499c87d51205817c93e9a8d42c4baestevel#include <sys/param.h>
03831d35f7499c87d51205817c93e9a8d42c4baestevel#include <picl.h>
03831d35f7499c87d51205817c93e9a8d42c4baestevel#include <libintl.h>
03831d35f7499c87d51205817c93e9a8d42c4baestevel#include <sys/types.h>
03831d35f7499c87d51205817c93e9a8d42c4baestevel#include <sys/stat.h>
03831d35f7499c87d51205817c93e9a8d42c4baestevel#include <sys/systeminfo.h>
03831d35f7499c87d51205817c93e9a8d42c4baestevel#include <sys/openpromio.h>
03831d35f7499c87d51205817c93e9a8d42c4baestevel#include <fcntl.h>
03831d35f7499c87d51205817c93e9a8d42c4baestevel#include <smc_if.h>
03831d35f7499c87d51205817c93e9a8d42c4baestevel#include <stropts.h>
03831d35f7499c87d51205817c93e9a8d42c4baestevel#include <alloca.h>
03831d35f7499c87d51205817c93e9a8d42c4baestevel#include <errno.h>
03831d35f7499c87d51205817c93e9a8d42c4baestevel#include <poll.h>
03831d35f7499c87d51205817c93e9a8d42c4baestevel#include <stdlib.h>
03831d35f7499c87d51205817c93e9a8d42c4baestevel#include <unistd.h>
03831d35f7499c87d51205817c93e9a8d42c4baestevel#include <kstat.h>
03831d35f7499c87d51205817c93e9a8d42c4baestevel#include <sys/utsname.h>
03831d35f7499c87d51205817c93e9a8d42c4baestevel#include <stddef.h>
03831d35f7499c87d51205817c93e9a8d42c4baestevel#include <pdevinfo.h>
03831d35f7499c87d51205817c93e9a8d42c4baestevel#include <display_sun4u.h>
03831d35f7499c87d51205817c93e9a8d42c4baestevel#include <libprtdiag.h>
03831d35f7499c87d51205817c93e9a8d42c4baestevel#include <smclib.h>
03831d35f7499c87d51205817c93e9a8d42c4baestevel#include <smc_commands.h>
03831d35f7499c87d51205817c93e9a8d42c4baestevel#include <picldefs.h>
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel/* #defines for the PICL library API usage and local static variables */
03831d35f7499c87d51205817c93e9a8d42c4baestevel#define PD_CPCI_SLOT_TYPE "cpci"
03831d35f7499c87d51205817c93e9a8d42c4baestevel#define PD_PCI_SLOT_TYPE "pci"
03831d35f7499c87d51205817c93e9a8d42c4baestevel#define PD_PRESENT 1
03831d35f7499c87d51205817c93e9a8d42c4baestevel#define PD_BLANK " "
03831d35f7499c87d51205817c93e9a8d42c4baestevel#define PD_ENABLED 1
03831d35f7499c87d51205817c93e9a8d42c4baestevel#define PD_DISABLED 0
03831d35f7499c87d51205817c93e9a8d42c4baestevel#define SNOWBIRD "SUNW,Netra-CP2300"
03831d35f7499c87d51205817c93e9a8d42c4baestevel#define CHASSIS_NODE_NAME "chassis"
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel/* #defines for the SMC and IPMI commands */
03831d35f7499c87d51205817c93e9a8d42c4baestevel#define POLL_TIMEOUT 10000
03831d35f7499c87d51205817c93e9a8d42c4baestevel#define DEFAULT_SEQN 0xff
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel/* SMC driver */
03831d35f7499c87d51205817c93e9a8d42c4baestevel#define PD_SMC_DRV_PATH "/dev/ctsmc"
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel/* Constants */
03831d35f7499c87d51205817c93e9a8d42c4baestevel#define OBP_PROP_BANNER_NAME "banner-name"
03831d35f7499c87d51205817c93e9a8d42c4baestevel#define OBP_PROP_CLOCK_FREQ "clock-frequency"
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel/* #defines for local usage */
03831d35f7499c87d51205817c93e9a8d42c4baestevel#define PD_SUCCESS 0
03831d35f7499c87d51205817c93e9a8d42c4baestevel#define PD_FAILURE 1
03831d35f7499c87d51205817c93e9a8d42c4baestevel#define PD_INTERNAL_FAILURE 2
03831d35f7499c87d51205817c93e9a8d42c4baestevel#define PD_ERROR -1
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel/* static global variables */
03831d35f7499c87d51205817c93e9a8d42c4baestevelstatic int pd_print_option;
03831d35f7499c87d51205817c93e9a8d42c4baestevelstatic uint8_t pd_smc_glbl_enabl_rsp[2];
03831d35f7499c87d51205817c93e9a8d42c4baestevelstatic boolean_t pd_hdr_prt = B_TRUE;
03831d35f7499c87d51205817c93e9a8d42c4baestevelstatic int pd_smc_fd = 0;
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel/* function declarations used in this program */
03831d35f7499c87d51205817c93e9a8d42c4baestevelstatic uint32_t pd_check_for_snowbird();
03831d35f7499c87d51205817c93e9a8d42c4baestevelstatic uint32_t pd_prt_snowbird_diag();
03831d35f7499c87d51205817c93e9a8d42c4baestevelstatic uint32_t pd_check_cpu_health();
03831d35f7499c87d51205817c93e9a8d42c4baestevelstatic uint32_t pd_check_tty_debug_mode();
03831d35f7499c87d51205817c93e9a8d42c4baestevelstatic uint32_t pd_query_SMC_firmware_version();
03831d35f7499c87d51205817c93e9a8d42c4baestevelstatic uint32_t pd_check_slots();
03831d35f7499c87d51205817c93e9a8d42c4baestevelint32_t pd_prt_slot_info(picl_nodehdl_t, void *);
03831d35f7499c87d51205817c93e9a8d42c4baestevelint do_prominfo(int syserrlog, char *pname, int log_flag, int prt_flag);
03831d35f7499c87d51205817c93e9a8d42c4baestevelstatic uint32_t pd_query_watchdog_state();
03831d35f7499c87d51205817c93e9a8d42c4baestevelint pd_check_wd_state(picl_nodehdl_t, void *);
03831d35f7499c87d51205817c93e9a8d42c4baestevelstatic uint32_t pd_print_fruinfo_hdr();
03831d35f7499c87d51205817c93e9a8d42c4baestevelstatic uint32_t pd_print_device_info(int);
03831d35f7499c87d51205817c93e9a8d42c4baestevelstatic uint32_t pd_get_role_information();
03831d35f7499c87d51205817c93e9a8d42c4baestevelstatic uint32_t pd_get_message_flags();
03831d35f7499c87d51205817c93e9a8d42c4baestevelstatic uint32_t pd_get_reset_mode();
03831d35f7499c87d51205817c93e9a8d42c4baestevelstatic uint32_t pd_get_sensor_reading();
03831d35f7499c87d51205817c93e9a8d42c4baestevelstatic uint32_t pd_get_sensor_threshold();
03831d35f7499c87d51205817c93e9a8d42c4baestevelstatic uint32_t pd_prt_cpci_condition(picl_nodehdl_t nodeh);
03831d35f7499c87d51205817c93e9a8d42c4baestevelstatic uint32_t pd_check_location_parent(picl_nodehdl_t nodeh);
03831d35f7499c87d51205817c93e9a8d42c4baestevelstatic uint64_t
03831d35f7499c87d51205817c93e9a8d42c4baestevelpicldiag_get_uint_propval(picl_nodehdl_t modh, char *prop_name, int *ret);
03831d35f7499c87d51205817c93e9a8d42c4baestevelstatic int picldiag_get_clock_freq(picl_nodehdl_t modh, uint32_t *freq);
03831d35f7499c87d51205817c93e9a8d42c4baestevelstatic int display_system_clock(picl_nodehdl_t plafh);
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
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
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/*
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(dgettext(TEXT_DOMAIN,
2983dda76a6d296fdb560c88114fe41caad1b84fMichael Bergknoff "System clock frequency: %d MHZ\n"), system_clk);
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel return (PICL_SUCCESS);
03831d35f7499c87d51205817c93e9a8d42c4baestevel}
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel/*
03831d35f7499c87d51205817c93e9a8d42c4baestevel * get the value by the property name of the string prop
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/*
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(dgettext(TEXT_DOMAIN,
2983dda76a6d296fdb560c88114fe41caad1b84fMichael Bergknoff "System Configuration: Oracle Corporation "), 0);
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, 0);
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, 0);
03831d35f7499c87d51205817c93e9a8d42c4baestevel free(banner_name);
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf("\n", 0);
03831d35f7499c87d51205817c93e9a8d42c4baestevel return (PICL_SUCCESS);
03831d35f7499c87d51205817c93e9a8d42c4baestevel}
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel/*
03831d35f7499c87d51205817c93e9a8d42c4baestevel * search children to get the node by the nodename
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/*
03831d35f7499c87d51205817c93e9a8d42c4baestevel * This routine is invoked when prtdiag starts execution. It prints
03831d35f7499c87d51205817c93e9a8d42c4baestevel * system configuration, memory size, initializes PICL and acts as
03831d35f7499c87d51205817c93e9a8d42c4baestevel * a driver routine for prtdiag output for Snowbird.
03831d35f7499c87d51205817c93e9a8d42c4baestevel */
03831d35f7499c87d51205817c93e9a8d42c4baestevel/* ARGSUSED */
03831d35f7499c87d51205817c93e9a8d42c4baestevelint
03831d35f7499c87d51205817c93e9a8d42c4baesteveldo_prominfo(int syserrlog, char *pname, int log_flag, int prt_flag)
03831d35f7499c87d51205817c93e9a8d42c4baestevel{
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel struct mem_total memory_total; /* total memory in system */
03831d35f7499c87d51205817c93e9a8d42c4baestevel struct grp_info grps;
03831d35f7499c87d51205817c93e9a8d42c4baestevel uint8_t status = PD_SUCCESS;
03831d35f7499c87d51205817c93e9a8d42c4baestevel picl_nodehdl_t rooth;
03831d35f7499c87d51205817c93e9a8d42c4baestevel picl_nodehdl_t plafh;
03831d35f7499c87d51205817c93e9a8d42c4baestevel struct system_kstat_data *kstats = NULL;
03831d35f7499c87d51205817c93e9a8d42c4baestevel Sys_tree *tree = NULL;
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel sys_clk = -1;
03831d35f7499c87d51205817c93e9a8d42c4baestevel pd_print_option = syserrlog;
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel if ((status = picl_initialize()) != PICL_SUCCESS) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf("prtdiag: failed to initialize the PICL\n", 0);
03831d35f7499c87d51205817c93e9a8d42c4baestevel exit(1);
03831d35f7499c87d51205817c93e9a8d42c4baestevel }
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel if ((status = picl_get_root(&rooth)) != PICL_SUCCESS) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf("prtdiag: failed\n", 0);
03831d35f7499c87d51205817c93e9a8d42c4baestevel exit(1);
03831d35f7499c87d51205817c93e9a8d42c4baestevel }
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel status = picldiag_get_node_by_name(rooth, PICL_NODE_PLATFORM, &plafh);
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (status != PICL_SUCCESS)
03831d35f7499c87d51205817c93e9a8d42c4baestevel return (status);
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (!log_flag) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel status = display_platform_banner(plafh);
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (status != PICL_SUCCESS)
03831d35f7499c87d51205817c93e9a8d42c4baestevel return (status);
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel status = display_system_clock(plafh);
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (status != PICL_SUCCESS)
03831d35f7499c87d51205817c93e9a8d42c4baestevel return (status);
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel /* display the memory Size */
03831d35f7499c87d51205817c93e9a8d42c4baestevel display_memorysize(tree, kstats, &grps, &memory_total);
03831d35f7499c87d51205817c93e9a8d42c4baestevel }
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel if ((pd_smc_fd = open(PD_SMC_DRV_PATH, O_RDWR)) == -1)
03831d35f7499c87d51205817c93e9a8d42c4baestevel return (PD_FAILURE);
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel if ((status = pd_check_for_snowbird()) != PD_SUCCESS)
03831d35f7499c87d51205817c93e9a8d42c4baestevel return (status);
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel if ((status = pd_prt_snowbird_diag()) != PD_SUCCESS)
03831d35f7499c87d51205817c93e9a8d42c4baestevel return (status);
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel (void) close(pd_smc_fd);
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (picl_shutdown() != PICL_SUCCESS)
03831d35f7499c87d51205817c93e9a8d42c4baestevel return (PD_INTERNAL_FAILURE);
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel return (PD_SUCCESS);
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel}
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel/*
03831d35f7499c87d51205817c93e9a8d42c4baestevel * This routine prints out the platform name.
03831d35f7499c87d51205817c93e9a8d42c4baestevel */
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevelstatic uint32_t
03831d35f7499c87d51205817c93e9a8d42c4baestevelpd_check_for_snowbird()
03831d35f7499c87d51205817c93e9a8d42c4baestevel{
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel char si_platform[30];
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (sysinfo(SI_PLATFORM, si_platform, sizeof (si_platform)) == -1) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel return (PD_FAILURE);
03831d35f7499c87d51205817c93e9a8d42c4baestevel }
03831d35f7499c87d51205817c93e9a8d42c4baestevel /* is it a Snowbird? */
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (strcmp(si_platform, SNOWBIRD) != 0)
03831d35f7499c87d51205817c93e9a8d42c4baestevel return (PD_FAILURE);
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf("platform Type : %s\n", si_platform, 0);
03831d35f7499c87d51205817c93e9a8d42c4baestevel return (PD_SUCCESS);
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel}
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel/*
03831d35f7499c87d51205817c93e9a8d42c4baestevel * Driver routine for satellite specific output. This is also used by
03831d35f7499c87d51205817c93e9a8d42c4baestevel * host driver routine as all satellite information is printed by host.
03831d35f7499c87d51205817c93e9a8d42c4baestevel * It also prints some host specific information for formatting purposes
03831d35f7499c87d51205817c93e9a8d42c4baestevel */
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevelstatic uint32_t
03831d35f7499c87d51205817c93e9a8d42c4baestevelpd_prt_snowbird_diag()
03831d35f7499c87d51205817c93e9a8d42c4baestevel{
03831d35f7499c87d51205817c93e9a8d42c4baestevel uint8_t status = PD_SUCCESS;
03831d35f7499c87d51205817c93e9a8d42c4baestevel if ((status = pd_check_cpu_health()) != PD_SUCCESS) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel return (status);
03831d35f7499c87d51205817c93e9a8d42c4baestevel }
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (pd_print_option) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf(
2983dda76a6d296fdb560c88114fe41caad1b84fMichael Bergknoff "\n %11s Other Miscellaneous Information \n",
2983dda76a6d296fdb560c88114fe41caad1b84fMichael Bergknoff PD_BLANK, 0);
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf(
2983dda76a6d296fdb560c88114fe41caad1b84fMichael Bergknoff "%12s ------------------------------- \n",
2983dda76a6d296fdb560c88114fe41caad1b84fMichael Bergknoff PD_BLANK, 0);
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel if ((status = pd_get_role_information()) != PD_SUCCESS) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel return (status);
03831d35f7499c87d51205817c93e9a8d42c4baestevel }
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (pd_smc_glbl_enabl_rsp[1] & 0x10) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf(
2983dda76a6d296fdb560c88114fe41caad1b84fMichael Bergknoff "IPMI Response Notification\t\tEnabled\n", 0);
03831d35f7499c87d51205817c93e9a8d42c4baestevel } else {
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf(
2983dda76a6d296fdb560c88114fe41caad1b84fMichael Bergknoff "IPMI Response Notification\t\tDisabled\n", 0);
03831d35f7499c87d51205817c93e9a8d42c4baestevel }
03831d35f7499c87d51205817c93e9a8d42c4baestevel if ((status = pd_query_SMC_firmware_version()) != PD_SUCCESS) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel return (status);
03831d35f7499c87d51205817c93e9a8d42c4baestevel }
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel if ((status = pd_check_tty_debug_mode()) != PD_SUCCESS) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel return (status);
03831d35f7499c87d51205817c93e9a8d42c4baestevel }
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel if ((status = pd_get_reset_mode()) != PD_SUCCESS) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel return (status);
03831d35f7499c87d51205817c93e9a8d42c4baestevel }
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel if ((status = pd_get_message_flags()) != PD_SUCCESS) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel return (status);
03831d35f7499c87d51205817c93e9a8d42c4baestevel }
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel if ((status = pd_query_watchdog_state()) != PD_SUCCESS) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel return (status);
03831d35f7499c87d51205817c93e9a8d42c4baestevel }
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel if ((status = pd_get_sensor_reading()) != PD_SUCCESS) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel return (status);
03831d35f7499c87d51205817c93e9a8d42c4baestevel }
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel if ((status = pd_get_sensor_threshold()) != PD_SUCCESS) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel return (status);
03831d35f7499c87d51205817c93e9a8d42c4baestevel }
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel }
03831d35f7499c87d51205817c93e9a8d42c4baestevel return (status);
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel}
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel/*
03831d35f7499c87d51205817c93e9a8d42c4baestevel * This routine prints the mode in which SMC is running. It uses the
03831d35f7499c87d51205817c93e9a8d42c4baestevel * response from SMC global enables to determine the mode
03831d35f7499c87d51205817c93e9a8d42c4baestevel */
03831d35f7499c87d51205817c93e9a8d42c4baestevelstatic uint32_t
03831d35f7499c87d51205817c93e9a8d42c4baestevelpd_check_tty_debug_mode()
03831d35f7499c87d51205817c93e9a8d42c4baestevel{
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (pd_smc_glbl_enabl_rsp[1] & 0x20) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf("SMC verbose mode\t\t\tON\n", 0);
03831d35f7499c87d51205817c93e9a8d42c4baestevel } else {
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf("SMC verbose mode\t\t\tOFF\n", 0);
03831d35f7499c87d51205817c93e9a8d42c4baestevel }
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel return (PD_SUCCESS);
03831d35f7499c87d51205817c93e9a8d42c4baestevel}
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel/* This routine prints SMC f/w version */
03831d35f7499c87d51205817c93e9a8d42c4baestevelstatic uint32_t
03831d35f7499c87d51205817c93e9a8d42c4baestevelpd_query_SMC_firmware_version()
03831d35f7499c87d51205817c93e9a8d42c4baestevel{
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel sc_reqmsg_t req_pkt;
03831d35f7499c87d51205817c93e9a8d42c4baestevel sc_rspmsg_t rsp_pkt;
03831d35f7499c87d51205817c93e9a8d42c4baestevel uint8_t ver, rev, bldrev;
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel smc_init_smc_msg(&req_pkt, SMC_QUERY_FIRMWARE_VERSION,
2983dda76a6d296fdb560c88114fe41caad1b84fMichael Bergknoff DEFAULT_SEQN, 0);
03831d35f7499c87d51205817c93e9a8d42c4baestevel smc_send_msg(-1, &req_pkt, &rsp_pkt, POLL_TIMEOUT);
03831d35f7499c87d51205817c93e9a8d42c4baestevel ver = (rsp_pkt.data[0] & 0xf0) >> 4;
03831d35f7499c87d51205817c93e9a8d42c4baestevel rev = rsp_pkt.data[0] & 0x0f;
03831d35f7499c87d51205817c93e9a8d42c4baestevel bldrev = rsp_pkt.data[2] & 0x3f;
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf("SMC f/w version is\t\t\t%d.%d.%d\n", ver, rev, bldrev, 0);
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel return (PD_SUCCESS);
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel}
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel/*
03831d35f7499c87d51205817c93e9a8d42c4baestevel * This routine checks CPU's health by using SMC self test results command
03831d35f7499c87d51205817c93e9a8d42c4baestevel * It acts as driver routine for printing cPCI slot information
03831d35f7499c87d51205817c93e9a8d42c4baestevel */
03831d35f7499c87d51205817c93e9a8d42c4baestevelstatic uint32_t
03831d35f7499c87d51205817c93e9a8d42c4baestevelpd_check_cpu_health()
03831d35f7499c87d51205817c93e9a8d42c4baestevel{
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel sc_reqmsg_t req_pkt;
03831d35f7499c87d51205817c93e9a8d42c4baestevel sc_rspmsg_t rsp_pkt;
03831d35f7499c87d51205817c93e9a8d42c4baestevel uint8_t dev_id = 0x1f;
03831d35f7499c87d51205817c93e9a8d42c4baestevel#ifdef DEBUG
03831d35f7499c87d51205817c93e9a8d42c4baestevel uint8_t i2c_chk = 0x40;
03831d35f7499c87d51205817c93e9a8d42c4baestevel#endif
03831d35f7499c87d51205817c93e9a8d42c4baestevel uint8_t mem_test = 0x20;
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel smc_init_smc_msg(&req_pkt, SMC_GET_SMC_SELF_TEST_RESULT,
2983dda76a6d296fdb560c88114fe41caad1b84fMichael Bergknoff DEFAULT_SEQN, 0);
03831d35f7499c87d51205817c93e9a8d42c4baestevel smc_send_msg(-1, &req_pkt, &rsp_pkt, POLL_TIMEOUT);
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel dev_id = rsp_pkt.data[0] & dev_id;
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel#ifdef DEBUG
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (rsp_pkt.data[0] & i2c_chk) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel pd_print_device_info(dev_id);
03831d35f7499c87d51205817c93e9a8d42c4baestevel }
03831d35f7499c87d51205817c93e9a8d42c4baestevel#endif
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (rsp_pkt.data[0] & mem_test) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel pd_print_device_info(dev_id);
03831d35f7499c87d51205817c93e9a8d42c4baestevel }
03831d35f7499c87d51205817c93e9a8d42c4baestevel return (pd_check_slots());
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel}
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel/*
03831d35f7499c87d51205817c93e9a8d42c4baestevel * This routine decodes error message for CPU failures and prints details
03831d35f7499c87d51205817c93e9a8d42c4baestevel * of the failure
03831d35f7499c87d51205817c93e9a8d42c4baestevel */
03831d35f7499c87d51205817c93e9a8d42c4baestevelstatic uint32_t
03831d35f7499c87d51205817c93e9a8d42c4baestevelpd_print_device_info(int dev_id)
03831d35f7499c87d51205817c93e9a8d42c4baestevel{
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel switch (dev_id) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel case 1:
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf("Mux Philip 9540\n", 0);
03831d35f7499c87d51205817c93e9a8d42c4baestevel break;
03831d35f7499c87d51205817c93e9a8d42c4baestevel case 2:
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf("cpu temp max1617\n", 0);
03831d35f7499c87d51205817c93e9a8d42c4baestevel break;
03831d35f7499c87d51205817c93e9a8d42c4baestevel case 3:
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf("pmc temp max 1617\n", 0);
03831d35f7499c87d51205817c93e9a8d42c4baestevel break;
03831d35f7499c87d51205817c93e9a8d42c4baestevel case 4:
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf("MB HS temp max 1617\n", 0);
03831d35f7499c87d51205817c93e9a8d42c4baestevel break;
03831d35f7499c87d51205817c93e9a8d42c4baestevel case 5:
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf("MB mem temp max1617\n", 0);
03831d35f7499c87d51205817c93e9a8d42c4baestevel break;
03831d35f7499c87d51205817c93e9a8d42c4baestevel case 6:
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf("MB gpio Philip8574\n", 0);
03831d35f7499c87d51205817c93e9a8d42c4baestevel break;
03831d35f7499c87d51205817c93e9a8d42c4baestevel case 7:
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf("MB Fru ID ID i2c eep\n", 0);
03831d35f7499c87d51205817c93e9a8d42c4baestevel break;
03831d35f7499c87d51205817c93e9a8d42c4baestevel case 8:
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf("MB enet ID ID i2d eep\n", 0);
03831d35f7499c87d51205817c93e9a8d42c4baestevel break;
03831d35f7499c87d51205817c93e9a8d42c4baestevel case 9:
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf("MB gpio Philip8574A\n", 0);
03831d35f7499c87d51205817c93e9a8d42c4baestevel break;
03831d35f7499c87d51205817c93e9a8d42c4baestevel case 10:
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf("SDRAM mod1 temp max1617\n", 0);
03831d35f7499c87d51205817c93e9a8d42c4baestevel break;
03831d35f7499c87d51205817c93e9a8d42c4baestevel case 11:
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf("SDRAM mod ID ID i2c eep\n", 0);
03831d35f7499c87d51205817c93e9a8d42c4baestevel break;
03831d35f7499c87d51205817c93e9a8d42c4baestevel case 12:
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf("SDRAM mod2 temp max1617\n", 0);
03831d35f7499c87d51205817c93e9a8d42c4baestevel break;
03831d35f7499c87d51205817c93e9a8d42c4baestevel case 13:
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf("SDRAM mod ID ID i2c eep\n", 0);
03831d35f7499c87d51205817c93e9a8d42c4baestevel break;
03831d35f7499c87d51205817c93e9a8d42c4baestevel case 14:
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf("Power mod temp ds1721\n", 0);
03831d35f7499c87d51205817c93e9a8d42c4baestevel break;
03831d35f7499c87d51205817c93e9a8d42c4baestevel case 15:
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf("Power mod gpio Philip 8574\n", 0);
03831d35f7499c87d51205817c93e9a8d42c4baestevel break;
03831d35f7499c87d51205817c93e9a8d42c4baestevel case 16:
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf("Power mod ID eep ST M24C01\n", 0);
03831d35f7499c87d51205817c93e9a8d42c4baestevel break;
03831d35f7499c87d51205817c93e9a8d42c4baestevel case 17:
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf("SMC ID i2c eep\n", 0);
03831d35f7499c87d51205817c93e9a8d42c4baestevel break;
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel default:
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf("device id unknown\n", 0);
03831d35f7499c87d51205817c93e9a8d42c4baestevel break;
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel }
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel return (PD_SUCCESS);
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel}
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel/*
03831d35f7499c87d51205817c93e9a8d42c4baestevel * This routine walks PICL tree by "Location" class and calls prt_slot_info
03831d35f7499c87d51205817c93e9a8d42c4baestevel * routine to print the slot information
03831d35f7499c87d51205817c93e9a8d42c4baestevel */
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel/*ARGSUSED*/
03831d35f7499c87d51205817c93e9a8d42c4baestevelstatic uint32_t
03831d35f7499c87d51205817c93e9a8d42c4baestevelpd_check_slots()
03831d35f7499c87d51205817c93e9a8d42c4baestevel{
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel picl_nodehdl_t nodeh;
03831d35f7499c87d51205817c93e9a8d42c4baestevel char *c_args = NULL;
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (picl_get_root(&nodeh) != PICL_SUCCESS)
03831d35f7499c87d51205817c93e9a8d42c4baestevel return (PD_INTERNAL_FAILURE);
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (picl_walk_tree_by_class(nodeh, PICL_CLASS_LOCATION,
2983dda76a6d296fdb560c88114fe41caad1b84fMichael Bergknoff (void *)c_args, pd_prt_slot_info) != PICL_SUCCESS) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel return (PD_INTERNAL_FAILURE);
03831d35f7499c87d51205817c93e9a8d42c4baestevel }
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel return (PD_SUCCESS);
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel}
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel/*ARGSUSED*/
03831d35f7499c87d51205817c93e9a8d42c4baestevelint32_t
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevelpd_prt_slot_info(picl_nodehdl_t nodeh, void *c_args)
03831d35f7499c87d51205817c93e9a8d42c4baestevel{
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel char *valbuf;
03831d35f7499c87d51205817c93e9a8d42c4baestevel char label_txt[30];
03831d35f7499c87d51205817c93e9a8d42c4baestevel int unit_no = -1, ctr = 0;
03831d35f7499c87d51205817c93e9a8d42c4baestevel picl_nodehdl_t childh;
03831d35f7499c87d51205817c93e9a8d42c4baestevel picl_propinfo_t propinfo;
03831d35f7499c87d51205817c93e9a8d42c4baestevel picl_prophdl_t proph;
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel /* if not immediate child of "chassis" node, ignore it */
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (pd_check_location_parent(nodeh) != PD_SUCCESS)
03831d35f7499c87d51205817c93e9a8d42c4baestevel return (PD_INTERNAL_FAILURE);
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel /* get the label on the location */
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (picl_get_prop_by_name(nodeh, PICL_PROP_LABEL,
2983dda76a6d296fdb560c88114fe41caad1b84fMichael Bergknoff &proph) != PICL_SUCCESS)
03831d35f7499c87d51205817c93e9a8d42c4baestevel return (PD_INTERNAL_FAILURE);
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (picl_get_propinfo(proph, &propinfo) != PICL_SUCCESS)
03831d35f7499c87d51205817c93e9a8d42c4baestevel return (PD_INTERNAL_FAILURE);
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel valbuf = (char *) malloc(sizeof (char) * (propinfo.size));
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (valbuf == NULL)
03831d35f7499c87d51205817c93e9a8d42c4baestevel return (PD_INTERNAL_FAILURE);
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (picl_get_propval(proph, (void *)valbuf, propinfo.size)
2983dda76a6d296fdb560c88114fe41caad1b84fMichael Bergknoff != PICL_SUCCESS) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel free(valbuf);
03831d35f7499c87d51205817c93e9a8d42c4baestevel return (PD_INTERNAL_FAILURE);
03831d35f7499c87d51205817c93e9a8d42c4baestevel }
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel while (valbuf[ctr] != ' ' && valbuf[ctr] != NULL) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel label_txt[ctr] = valbuf[ctr];
03831d35f7499c87d51205817c93e9a8d42c4baestevel ++ctr;
03831d35f7499c87d51205817c93e9a8d42c4baestevel }
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel label_txt[ctr++] = '\0';
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (valbuf[ctr] != NULL) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel unit_no = atoi(valbuf+ctr);
03831d35f7499c87d51205817c93e9a8d42c4baestevel }
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel free(valbuf);
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel /* get the slot type for the location */
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (picl_get_prop_by_name(nodeh, PICL_PROP_SLOT_TYPE,
2983dda76a6d296fdb560c88114fe41caad1b84fMichael Bergknoff &proph) != PICL_SUCCESS)
03831d35f7499c87d51205817c93e9a8d42c4baestevel return (PD_INTERNAL_FAILURE);
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (picl_get_propinfo(proph, & propinfo) != PICL_SUCCESS)
03831d35f7499c87d51205817c93e9a8d42c4baestevel return (PD_INTERNAL_FAILURE);
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel valbuf = (char *) malloc(sizeof (char) * (propinfo.size));
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (valbuf == NULL)
03831d35f7499c87d51205817c93e9a8d42c4baestevel return (PD_INTERNAL_FAILURE);
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (picl_get_propval(proph, (void *)valbuf,
2983dda76a6d296fdb560c88114fe41caad1b84fMichael Bergknoff propinfo.size) != PICL_SUCCESS) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel free(valbuf);
03831d35f7499c87d51205817c93e9a8d42c4baestevel return (PD_INTERNAL_FAILURE);
03831d35f7499c87d51205817c93e9a8d42c4baestevel }
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel if ((strcmp(valbuf, PD_CPCI_SLOT_TYPE) == 0) ||
03831d35f7499c87d51205817c93e9a8d42c4baestevel (strcmp(valbuf, PD_PCI_SLOT_TYPE) == 0)) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel (void) pd_print_fruinfo_hdr();
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf("\n%s ", label_txt, 0);
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel /* For Snowbird no unit number is present on the label */
03831d35f7499c87d51205817c93e9a8d42c4baestevel unit_no = 1;
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf(" %d Yes cPSB IO Slot\n", unit_no, 0);
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (picl_get_propval_by_name(nodeh, PICL_PROP_CHILD,
2983dda76a6d296fdb560c88114fe41caad1b84fMichael Bergknoff &childh, sizeof (childh)) == PICL_SUCCESS) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel pd_prt_cpci_condition(childh);
03831d35f7499c87d51205817c93e9a8d42c4baestevel }
03831d35f7499c87d51205817c93e9a8d42c4baestevel /* For Snowbird auto configuration is always enabled */
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf("%29s Properties:\n", PD_BLANK, 0);
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf("%31s auto-config = enabled\n", PD_BLANK, 0);
03831d35f7499c87d51205817c93e9a8d42c4baestevel }
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel free(valbuf);
03831d35f7499c87d51205817c93e9a8d42c4baestevel return (PD_SUCCESS);
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel}
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevelstatic uint32_t
03831d35f7499c87d51205817c93e9a8d42c4baestevelpd_print_fruinfo_hdr()
03831d35f7499c87d51205817c93e9a8d42c4baestevel{
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf(
2983dda76a6d296fdb560c88114fe41caad1b84fMichael Bergknoff "\n %19s FRU Information \n",
2983dda76a6d296fdb560c88114fe41caad1b84fMichael Bergknoff PD_BLANK, 0);
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf(
2983dda76a6d296fdb560c88114fe41caad1b84fMichael Bergknoff "%11s ------------------------------------------------\n",
2983dda76a6d296fdb560c88114fe41caad1b84fMichael Bergknoff PD_BLANK, 0);
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf(dgettext(TEXT_DOMAIN,
2983dda76a6d296fdb560c88114fe41caad1b84fMichael Bergknoff "FRU FRU FRU Miscellaneous\n"), 0);
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf(dgettext(TEXT_DOMAIN,
2983dda76a6d296fdb560c88114fe41caad1b84fMichael Bergknoff "Type Unit# Present Information\n"), 0);
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf("---- ----- -------", 0);
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf(" --------------------------------\n", 0);
03831d35f7499c87d51205817c93e9a8d42c4baestevel return (PD_SUCCESS);
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel}
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevelstatic uint32_t
03831d35f7499c87d51205817c93e9a8d42c4baestevelpd_check_location_parent(picl_nodehdl_t nodeh)
03831d35f7499c87d51205817c93e9a8d42c4baestevel{
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel picl_nodehdl_t parenth;
03831d35f7499c87d51205817c93e9a8d42c4baestevel char *prop_name;
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (picl_get_propval_by_name(nodeh, PICL_PROP_PARENT,
2983dda76a6d296fdb560c88114fe41caad1b84fMichael Bergknoff &parenth, sizeof (parenth)) != PICL_SUCCESS) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel return (PD_FAILURE);
03831d35f7499c87d51205817c93e9a8d42c4baestevel }
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel prop_name = (char *) malloc(sizeof (char) * PICL_PROPNAMELEN_MAX);
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (prop_name == NULL) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel return (PD_FAILURE);
03831d35f7499c87d51205817c93e9a8d42c4baestevel }
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (picl_get_propval_by_name(parenth, PICL_PROP_NAME, (void *)prop_name,
2983dda76a6d296fdb560c88114fe41caad1b84fMichael Bergknoff PICL_PROPNAMELEN_MAX) != PICL_SUCCESS) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel free(prop_name);
03831d35f7499c87d51205817c93e9a8d42c4baestevel return (PD_FAILURE);
03831d35f7499c87d51205817c93e9a8d42c4baestevel }
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (strcmp(prop_name, CHASSIS_NODE_NAME) == 0) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel free(prop_name);
03831d35f7499c87d51205817c93e9a8d42c4baestevel return (PD_SUCCESS);
03831d35f7499c87d51205817c93e9a8d42c4baestevel } else {
03831d35f7499c87d51205817c93e9a8d42c4baestevel free(prop_name);
03831d35f7499c87d51205817c93e9a8d42c4baestevel return (PD_FAILURE);
03831d35f7499c87d51205817c93e9a8d42c4baestevel }
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel}
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel/*ARGSUSED*/
03831d35f7499c87d51205817c93e9a8d42c4baestevelstatic uint32_t
03831d35f7499c87d51205817c93e9a8d42c4baestevelpd_query_watchdog_state()
03831d35f7499c87d51205817c93e9a8d42c4baestevel{
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel picl_nodehdl_t nodehandle;
03831d35f7499c87d51205817c93e9a8d42c4baestevel char *c_args = NULL;
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (picl_get_root(&nodehandle) != PICL_SUCCESS) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel return (PD_INTERNAL_FAILURE);
03831d35f7499c87d51205817c93e9a8d42c4baestevel }
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (picl_walk_tree_by_class(nodehandle, PICL_CLASS_WATCHDOG_TIMER,
2983dda76a6d296fdb560c88114fe41caad1b84fMichael Bergknoff (void *)c_args, pd_check_wd_state) != PICL_SUCCESS)
03831d35f7499c87d51205817c93e9a8d42c4baestevel return (PD_INTERNAL_FAILURE);
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel return (PD_SUCCESS);
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel}
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel/*ARGSUSED*/
03831d35f7499c87d51205817c93e9a8d42c4baestevelint
03831d35f7499c87d51205817c93e9a8d42c4baestevelpd_check_wd_state(picl_nodehdl_t nodeh, void *c_args)
03831d35f7499c87d51205817c93e9a8d42c4baestevel{
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel char *prop_name, *valbuf;
03831d35f7499c87d51205817c93e9a8d42c4baestevel picl_propinfo_t propinfo;
03831d35f7499c87d51205817c93e9a8d42c4baestevel picl_prophdl_t proph;
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel prop_name = (char *) malloc(sizeof (char) * PICL_PROPNAMELEN_MAX);
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (prop_name == NULL) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel return (PICL_WALK_TERMINATE);
03831d35f7499c87d51205817c93e9a8d42c4baestevel }
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (picl_get_propval_by_name(nodeh, PICL_PROP_NAME,
2983dda76a6d296fdb560c88114fe41caad1b84fMichael Bergknoff (void *)prop_name, PICL_PROPNAMELEN_MAX) != PICL_SUCCESS) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel free(prop_name);
03831d35f7499c87d51205817c93e9a8d42c4baestevel return (PICL_WALK_TERMINATE);
03831d35f7499c87d51205817c93e9a8d42c4baestevel }
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel if ((picl_get_prop_by_name(nodeh, PICL_PROP_STATE,
2983dda76a6d296fdb560c88114fe41caad1b84fMichael Bergknoff &proph)) != PICL_SUCCESS) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel free(prop_name);
03831d35f7499c87d51205817c93e9a8d42c4baestevel return (PICL_WALK_TERMINATE);
03831d35f7499c87d51205817c93e9a8d42c4baestevel }
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel if ((picl_get_propinfo(proph, &propinfo)) != PICL_SUCCESS) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel free(prop_name);
03831d35f7499c87d51205817c93e9a8d42c4baestevel return (PICL_WALK_TERMINATE);
03831d35f7499c87d51205817c93e9a8d42c4baestevel }
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel valbuf = (char *) malloc(sizeof (char) * (propinfo.size));
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (valbuf == NULL) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel free(prop_name);
03831d35f7499c87d51205817c93e9a8d42c4baestevel return (PICL_WALK_TERMINATE);
03831d35f7499c87d51205817c93e9a8d42c4baestevel }
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel if ((picl_get_propval(proph, (void *)valbuf,
2983dda76a6d296fdb560c88114fe41caad1b84fMichael Bergknoff propinfo.size)) != PICL_SUCCESS) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel free(valbuf);
03831d35f7499c87d51205817c93e9a8d42c4baestevel free(prop_name);
03831d35f7499c87d51205817c93e9a8d42c4baestevel return (PICL_WALK_TERMINATE);
03831d35f7499c87d51205817c93e9a8d42c4baestevel }
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (pd_hdr_prt) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf("\n Watch Dog Status \n", 0);
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf(" ---------------- \n", 0);
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf("Node Status\n", 0);
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf("---- ------\n", 0);
03831d35f7499c87d51205817c93e9a8d42c4baestevel pd_hdr_prt = B_FALSE;
03831d35f7499c87d51205817c93e9a8d42c4baestevel }
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf("%s ", prop_name, 0);
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf("%s\n", valbuf, 0);
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel free(prop_name);
03831d35f7499c87d51205817c93e9a8d42c4baestevel free(valbuf);
03831d35f7499c87d51205817c93e9a8d42c4baestevel return (PICL_WALK_CONTINUE);
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel}
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevelstatic uint32_t
03831d35f7499c87d51205817c93e9a8d42c4baestevelpd_get_role_information()
03831d35f7499c87d51205817c93e9a8d42c4baestevel{
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel sc_reqmsg_t req_pkt;
03831d35f7499c87d51205817c93e9a8d42c4baestevel sc_rspmsg_t rsp_pkt;
03831d35f7499c87d51205817c93e9a8d42c4baestevel uint8_t usparc_role;
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel smc_init_smc_msg(&req_pkt, SMC_GET_ROLE_INFO,
2983dda76a6d296fdb560c88114fe41caad1b84fMichael Bergknoff DEFAULT_SEQN, 0);
03831d35f7499c87d51205817c93e9a8d42c4baestevel smc_send_msg(-1, &req_pkt, &rsp_pkt, POLL_TIMEOUT);
03831d35f7499c87d51205817c93e9a8d42c4baestevel usparc_role = rsp_pkt.data[1];
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf(dgettext(TEXT_DOMAIN,
2983dda76a6d296fdb560c88114fe41caad1b84fMichael Bergknoff "UltraSPARC Host Role\t\t\t"), 0);
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (usparc_role & 0x80) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf(
2983dda76a6d296fdb560c88114fe41caad1b84fMichael Bergknoff dgettext(TEXT_DOMAIN,
2983dda76a6d296fdb560c88114fe41caad1b84fMichael Bergknoff "System Board Computer (SBC)\n"), 0);
03831d35f7499c87d51205817c93e9a8d42c4baestevel }
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (usparc_role & 0x40) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf(dgettext(TEXT_DOMAIN,
2983dda76a6d296fdb560c88114fe41caad1b84fMichael Bergknoff "Standby System Board Computer (Standby SBC)\n"), 0);
03831d35f7499c87d51205817c93e9a8d42c4baestevel }
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (usparc_role & 0x20) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf(dgettext(TEXT_DOMAIN,
03831d35f7499c87d51205817c93e9a8d42c4baestevel "Alternate System Board Computer (Alternate SBC)\n"), 0);
03831d35f7499c87d51205817c93e9a8d42c4baestevel }
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (usparc_role & 0x10) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf(dgettext(TEXT_DOMAIN,
2983dda76a6d296fdb560c88114fe41caad1b84fMichael Bergknoff "Satellite Board Computer (SAT)\n"), 0);
03831d35f7499c87d51205817c93e9a8d42c4baestevel }
03831d35f7499c87d51205817c93e9a8d42c4baestevel return (PD_SUCCESS);
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel}
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevelstatic uint32_t
03831d35f7499c87d51205817c93e9a8d42c4baestevelpd_get_message_flags()
03831d35f7499c87d51205817c93e9a8d42c4baestevel{
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel sc_reqmsg_t req_pkt;
03831d35f7499c87d51205817c93e9a8d42c4baestevel sc_rspmsg_t rsp_pkt;
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel smc_init_smc_msg(&req_pkt, SMC_GET_MESSAGE_FLAGS,
2983dda76a6d296fdb560c88114fe41caad1b84fMichael Bergknoff DEFAULT_SEQN, 0);
03831d35f7499c87d51205817c93e9a8d42c4baestevel smc_send_msg(-1, &req_pkt, &rsp_pkt, POLL_TIMEOUT);
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (rsp_pkt.data[0] & 0x01) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf("Messages Available in queue Recieving\n", 0);
03831d35f7499c87d51205817c93e9a8d42c4baestevel } else {
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf("No messages in queue for Recieving\n", 0);
03831d35f7499c87d51205817c93e9a8d42c4baestevel }
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel return (PD_SUCCESS);
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel}
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevelstatic uint32_t
03831d35f7499c87d51205817c93e9a8d42c4baestevelpd_get_reset_mode()
03831d35f7499c87d51205817c93e9a8d42c4baestevel{
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel sc_reqmsg_t req_pkt;
03831d35f7499c87d51205817c93e9a8d42c4baestevel sc_rspmsg_t rsp_pkt;
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel smc_init_smc_msg(&req_pkt, SMC_GET_CONFIG_BLOCK,
2983dda76a6d296fdb560c88114fe41caad1b84fMichael Bergknoff DEFAULT_SEQN, 0);
03831d35f7499c87d51205817c93e9a8d42c4baestevel smc_send_msg(-1, &req_pkt, &rsp_pkt, POLL_TIMEOUT);
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf("Reset Mode\t\t\t\t%x \n", rsp_pkt.data[2], 0);
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel return (PD_SUCCESS);
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel}
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevelstatic uint32_t
03831d35f7499c87d51205817c93e9a8d42c4baestevelpd_get_sensor_reading()
03831d35f7499c87d51205817c93e9a8d42c4baestevel{
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel sc_reqmsg_t req_pkt;
03831d35f7499c87d51205817c93e9a8d42c4baestevel sc_rspmsg_t rsp_pkt;
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel req_pkt.data[0] = 0x0e;
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel smc_init_smc_msg(&req_pkt, SMC_SENSOR_READING_GET,
2983dda76a6d296fdb560c88114fe41caad1b84fMichael Bergknoff DEFAULT_SEQN, 1);
03831d35f7499c87d51205817c93e9a8d42c4baestevel smc_send_msg(-1, &req_pkt, &rsp_pkt, POLL_TIMEOUT);
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf("\nCPU Node Temperature Information\n", PD_BLANK, 0);
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf("--------------------------------\n", PD_BLANK, 0);
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf("Temperature Reading: %d\n\n", rsp_pkt.data[0], 0);
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel return (PD_SUCCESS);
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel}
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevelstatic uint32_t
03831d35f7499c87d51205817c93e9a8d42c4baestevelpd_get_sensor_threshold()
03831d35f7499c87d51205817c93e9a8d42c4baestevel{
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel sc_reqmsg_t req_pkt;
03831d35f7499c87d51205817c93e9a8d42c4baestevel sc_rspmsg_t rsp_pkt;
03831d35f7499c87d51205817c93e9a8d42c4baestevel uint8_t thres_mask;
03831d35f7499c87d51205817c93e9a8d42c4baestevel req_pkt.data[0] = 0x0e;
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel smc_init_smc_msg(&req_pkt, SMC_SENSOR_THRESHOLD_GET,
2983dda76a6d296fdb560c88114fe41caad1b84fMichael Bergknoff DEFAULT_SEQN, 1);
03831d35f7499c87d51205817c93e9a8d42c4baestevel smc_send_msg(-1, &req_pkt, &rsp_pkt, POLL_TIMEOUT);
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf("Critical Threshold Information\n", 0);
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf("------------------------------\n", 0);
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel thres_mask = rsp_pkt.data[0];
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (thres_mask & 0x20) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf("High Power-Off Threshold %9s", PD_BLANK, 0);
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (rsp_pkt.data[6] & 0x80) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf("-%d\n",
2983dda76a6d296fdb560c88114fe41caad1b84fMichael Bergknoff (int)((uint8_t)~rsp_pkt.data[6] + 1), 0);
03831d35f7499c87d51205817c93e9a8d42c4baestevel } else {
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf(" %d\n", rsp_pkt.data[6], 0);
03831d35f7499c87d51205817c93e9a8d42c4baestevel }
03831d35f7499c87d51205817c93e9a8d42c4baestevel }
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (thres_mask & 0x10) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf("High Shutdown Threshold %10s", PD_BLANK, 0);
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (rsp_pkt.data[5] & 0x80) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf("-%d\n",
2983dda76a6d296fdb560c88114fe41caad1b84fMichael Bergknoff (int)((uint8_t)~rsp_pkt.data[5] + 1), 0);
03831d35f7499c87d51205817c93e9a8d42c4baestevel } else {
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf(" %d\n", rsp_pkt.data[5], 0);
03831d35f7499c87d51205817c93e9a8d42c4baestevel }
03831d35f7499c87d51205817c93e9a8d42c4baestevel }
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (thres_mask & 0x08) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf("High Warning Threshold %11s", PD_BLANK, 0);
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (rsp_pkt.data[4] & 0x80) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf("-%d\n",
2983dda76a6d296fdb560c88114fe41caad1b84fMichael Bergknoff (int)((uint8_t)~rsp_pkt.data[4] + 1), 0);
03831d35f7499c87d51205817c93e9a8d42c4baestevel } else {
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf(" %d\n", rsp_pkt.data[4], 0);
03831d35f7499c87d51205817c93e9a8d42c4baestevel }
03831d35f7499c87d51205817c93e9a8d42c4baestevel }
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (thres_mask & 0x04) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf("Low Power Off Threshold %10s", PD_BLANK, 0);
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (rsp_pkt.data[3] & 0x80) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf("-%d\n",
2983dda76a6d296fdb560c88114fe41caad1b84fMichael Bergknoff (int)((uint8_t)~rsp_pkt.data[3] + 1), 0);
03831d35f7499c87d51205817c93e9a8d42c4baestevel } else {
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf(" %d\n", rsp_pkt.data[3], 0);
03831d35f7499c87d51205817c93e9a8d42c4baestevel }
03831d35f7499c87d51205817c93e9a8d42c4baestevel }
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (thres_mask & 0x02) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf("Low Shutdown Threshold %11s", PD_BLANK, 0);
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (rsp_pkt.data[2] & 0x80) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf("-%d\n",
2983dda76a6d296fdb560c88114fe41caad1b84fMichael Bergknoff (int)((uint8_t)~rsp_pkt.data[2] + 1), 0);
03831d35f7499c87d51205817c93e9a8d42c4baestevel } else {
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf(" %d\n", rsp_pkt.data[2], 0);
03831d35f7499c87d51205817c93e9a8d42c4baestevel }
03831d35f7499c87d51205817c93e9a8d42c4baestevel }
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (thres_mask & 0x01) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf("Low Warning Threshold %12s", PD_BLANK, 0);
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (rsp_pkt.data[1] & 0x80) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf("-%d\n",
2983dda76a6d296fdb560c88114fe41caad1b84fMichael Bergknoff (int)((uint8_t)~rsp_pkt.data[1] + 1), 0);
03831d35f7499c87d51205817c93e9a8d42c4baestevel } else {
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf(" %d\n", rsp_pkt.data[1], 0);
03831d35f7499c87d51205817c93e9a8d42c4baestevel }
03831d35f7499c87d51205817c93e9a8d42c4baestevel }
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel return (PD_SUCCESS);
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel}
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevelstatic uint32_t
03831d35f7499c87d51205817c93e9a8d42c4baestevelpd_prt_cpci_condition(picl_nodehdl_t nodeh)
03831d35f7499c87d51205817c93e9a8d42c4baestevel{
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel picl_propinfo_t propinfo;
03831d35f7499c87d51205817c93e9a8d42c4baestevel picl_prophdl_t proph;
03831d35f7499c87d51205817c93e9a8d42c4baestevel char *valbuf;
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (picl_get_prop_by_name(nodeh, PICL_PROP_CONDITION,
2983dda76a6d296fdb560c88114fe41caad1b84fMichael Bergknoff &proph) != PICL_SUCCESS) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel return (PD_FAILURE);
03831d35f7499c87d51205817c93e9a8d42c4baestevel }
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (picl_get_propinfo(proph, &propinfo) != PICL_SUCCESS) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel return (PD_FAILURE);
03831d35f7499c87d51205817c93e9a8d42c4baestevel }
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel valbuf = (char *) malloc(sizeof (char) * (propinfo.size));
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (valbuf == NULL) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel return (PD_FAILURE);
03831d35f7499c87d51205817c93e9a8d42c4baestevel }
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (picl_get_propval(proph, (void *)valbuf,
2983dda76a6d296fdb560c88114fe41caad1b84fMichael Bergknoff propinfo.size) != PICL_SUCCESS) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel free(valbuf);
03831d35f7499c87d51205817c93e9a8d42c4baestevel return (PD_FAILURE);
03831d35f7499c87d51205817c93e9a8d42c4baestevel }
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf("%29s Condition : %s\n", PD_BLANK, valbuf, 0);
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel free(valbuf);
03831d35f7499c87d51205817c93e9a8d42c4baestevel return (PD_SUCCESS);
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel}