03831d35f7499c87d51205817c93e9a8d42c4baestevel * CDDL HEADER START
03831d35f7499c87d51205817c93e9a8d42c4baestevel * The contents of this file are subject to the terms of the
03831d35f7499c87d51205817c93e9a8d42c4baestevel * Common Development and Distribution License, Version 1.0 only
03831d35f7499c87d51205817c93e9a8d42c4baestevel * (the "License"). You may not use this file except in compliance
03831d35f7499c87d51205817c93e9a8d42c4baestevel * 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
03831d35f7499c87d51205817c93e9a8d42c4baestevel * Copyright 1999-2002 Sun Microsystems, Inc. All rights reserved.
03831d35f7499c87d51205817c93e9a8d42c4baestevel * Use is subject to license terms.
03831d35f7499c87d51205817c93e9a8d42c4baestevel * Javelin Platform specific functions.
03831d35f7499c87d51205817c93e9a8d42c4baestevel * called when :
03831d35f7499c87d51205817c93e9a8d42c4baestevel * machine_type == MTYPE_JAVELIN
03831d35f7499c87d51205817c93e9a8d42c4baestevel#pragma ident "%Z%%M% %I% %E% SMI"
03831d35f7499c87d51205817c93e9a8d42c4baestevel * these functions will overlay the symbol table of libprtdiag
03831d35f7499c87d51205817c93e9a8d42c4baestevel * at runtime (workgroup server systems only)
03831d35f7499c87d51205817c93e9a8d42c4baestevelint error_check(Sys_tree *tree, struct system_kstat_data *kstats);
03831d35f7499c87d51205817c93e9a8d42c4baestevelvoid display_memoryconf(Sys_tree *tree, struct grp_info *grps);
03831d35f7499c87d51205817c93e9a8d42c4baestevelvoid display_hp_fail_fault(Sys_tree *tree, struct system_kstat_data *kstats);
03831d35f7499c87d51205817c93e9a8d42c4baestevelvoid display_diaginfo(int flag, Prom_node *root, Sys_tree *tree,
03831d35f7499c87d51205817c93e9a8d42c4baestevel struct bd_kstat_data *bdp, struct envctrl_kstat_data *ep);
03831d35f7499c87d51205817c93e9a8d42c4baestevel/* local functions */
03831d35f7499c87d51205817c93e9a8d42c4baestevelstatic int disp_envc_status(struct system_kstat_data *);
03831d35f7499c87d51205817c93e9a8d42c4baestevelstatic int tazmo_physical_slot(Prom_node *, Prom_node *, int, char *);
03831d35f7499c87d51205817c93e9a8d42c4baestevelstatic Prom_node *dev_next_node_sibling(Prom_node *root, char *name);
03831d35f7499c87d51205817c93e9a8d42c4baestevelerror_check(Sys_tree *tree, struct system_kstat_data *kstats)
03831d35f7499c87d51205817c93e9a8d42c4baestevel * silently check for any types of machine errors
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (disp_fail_parts(tree) || disp_envc_status(kstats)) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel /* set exit_code to show failures */
03831d35f7499c87d51205817c93e9a8d42c4baestevel/* Search for and return the node's sibling */
03831d35f7499c87d51205817c93e9a8d42c4baestevel /* look at your siblings */
03831d35f7499c87d51205817c93e9a8d42c4baestevel * This function displays memory configurations specific to Tazmo/Javelin.
03831d35f7499c87d51205817c93e9a8d42c4baestevel * The PROM device tree is read to obtain this information.
03831d35f7499c87d51205817c93e9a8d42c4baestevel * Some of the information obtained is memory interleave factor,
03831d35f7499c87d51205817c93e9a8d42c4baestevel * DIMM sizes, DIMM socket names.
03831d35f7499c87d51205817c93e9a8d42c4baesteveldisplay_memoryconf(Sys_tree *tree, struct grp_info *grps)
03831d35f7499c87d51205817c93e9a8d42c4baestevel preg = (uint_t *)(get_prop_val(find_prop(memory, "interleave")));
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf("Memory Interleave Factor = %d-way\n\n", interlv, 0);
03831d35f7499c87d51205817c93e9a8d42c4baestevel for (bank = dev_find_node(bnode->nodes, "bank"); bank != NULL;
03831d35f7499c87d51205817c93e9a8d42c4baestevel * Skip empty banks
03831d35f7499c87d51205817c93e9a8d42c4baestevel preg = (uint_t *)(get_prop_val(find_prop(bank, "reg")));
03831d35f7499c87d51205817c93e9a8d42c4baestevel for (dimm = dev_find_node(bank, "dimm"); dimm != NULL;
03831d35f7499c87d51205817c93e9a8d42c4baestevel preg = (uint_t *)(get_prop_val(find_prop(dimm, "reg")));
03831d35f7499c87d51205817c93e9a8d42c4baestevel if ((status_prop = find_prop(dimm, "status")) == NULL) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel * disp_fail_parts
03831d35f7499c87d51205817c93e9a8d42c4baestevel * Display the failed parts in the system. This function looks for
03831d35f7499c87d51205817c93e9a8d42c4baestevel * the status property in all PROM nodes. On systems where
03831d35f7499c87d51205817c93e9a8d42c4baestevel * the PROM does not supports passing diagnostic information
03831d35f7499c87d51205817c93e9a8d42c4baestevel * thruogh the device tree, this routine will be silent.
03831d35f7499c87d51205817c93e9a8d42c4baestevel /* go through all of the boards looking for failed units. */
03831d35f7499c87d51205817c93e9a8d42c4baestevel /* find failed chips */
03831d35f7499c87d51205817c93e9a8d42c4baestevel "Replaceable Units (FRU) in System:\n"), 0);
03831d35f7499c87d51205817c93e9a8d42c4baestevel "====================\n", 0);
03831d35f7499c87d51205817c93e9a8d42c4baestevel /* sanity check of data retreived from PROM */
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf(dgettext(TEXT_DOMAIN, "%s unavailable :\n"),
03831d35f7499c87d51205817c93e9a8d42c4baestevel "Replaceable Unit is "), 0);
03831d35f7499c87d51205817c93e9a8d42c4baestevel * Determine whether FRU is CPU module, system
03831d35f7499c87d51205817c93e9a8d42c4baestevel * board, or SBus card.
03831d35f7499c87d51205817c93e9a8d42c4baestevel "board\n"), 0);
03831d35f7499c87d51205817c93e9a8d42c4baestevel } else if (((type = get_node_type(pnode)) != NULL) &&
03831d35f7499c87d51205817c93e9a8d42c4baestevel "module Module %d\n"),
03831d35f7499c87d51205817c93e9a8d42c4baestevel } else if (((type = get_node_type(pnode)) != NULL) &&
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf(dgettext(TEXT_DOMAIN, "No failures found "
03831d35f7499c87d51205817c93e9a8d42c4baestevel "in System\n"), 0);
03831d35f7499c87d51205817c93e9a8d42c4baestevel return (1);
03831d35f7499c87d51205817c93e9a8d42c4baestevel return (0);
03831d35f7499c87d51205817c93e9a8d42c4baesteveldisplay_hp_fail_fault(Sys_tree *tree, struct system_kstat_data *kstats)
03831d35f7499c87d51205817c93e9a8d42c4baestevel /* Display failed units */
03831d35f7499c87d51205817c93e9a8d42c4baesteveldisplay_diaginfo(int flag, Prom_node *root, Sys_tree *tree,
03831d35f7499c87d51205817c93e9a8d42c4baestevel * Now display the last powerfail time and the fatal hardware
03831d35f7499c87d51205817c93e9a8d42c4baestevel * reset information. We do this under a couple of conditions.
03831d35f7499c87d51205817c93e9a8d42c4baestevel * First if the user asks for it. The second is iof the user
03831d35f7499c87d51205817c93e9a8d42c4baestevel * told us to do logging, and we found a system failure.
03831d35f7499c87d51205817c93e9a8d42c4baestevel * display time of latest powerfail. Not all systems
03831d35f7499c87d51205817c93e9a8d42c4baestevel * have this capability. For those that do not, this
03831d35f7499c87d51205817c93e9a8d42c4baestevel * is just a no-op.
03831d35f7499c87d51205817c93e9a8d42c4baestevel/* ARGSUSED */
03831d35f7499c87d51205817c93e9a8d42c4baestevel * display_pci
03831d35f7499c87d51205817c93e9a8d42c4baestevel * Display all the PCI IO cards on this board.
03831d35f7499c87d51205817c93e9a8d42c4baestevel/* ARGSUSED */
03831d35f7499c87d51205817c93e9a8d42c4baestevel /* Initialize all the common information */
03831d35f7499c87d51205817c93e9a8d42c4baestevel for (pci = dev_find_node(board->nodes, PCI_NAME); pci != NULL;
03831d35f7499c87d51205817c93e9a8d42c4baestevel * If we have reached a pci-to-pci bridge node,
03831d35f7499c87d51205817c93e9a8d42c4baestevel * we are one level below the 'pci' nodes level
03831d35f7499c87d51205817c93e9a8d42c4baestevel * in the device tree. To get back to that level,
03831d35f7499c87d51205817c93e9a8d42c4baestevel * the search should continue with the sibling of
03831d35f7499c87d51205817c93e9a8d42c4baestevel * the parent or else the remaining 'pci' cards
03831d35f7499c87d51205817c93e9a8d42c4baestevel * will not show up in the output.
03831d35f7499c87d51205817c93e9a8d42c4baestevel /* Skip all failed nodes for now */
03831d35f7499c87d51205817c93e9a8d42c4baestevel /* Fill in frequency */
03831d35f7499c87d51205817c93e9a8d42c4baestevel value = get_prop_val(find_prop(pci, "clock-frequency"));
03831d35f7499c87d51205817c93e9a8d42c4baestevel /* Walk through the PSYCHO children */
03831d35f7499c87d51205817c93e9a8d42c4baestevel /* If it doesn't have a name, skip it */
03831d35f7499c87d51205817c93e9a8d42c4baestevel * If this is a PCI bridge, then display its
03831d35f7499c87d51205817c93e9a8d42c4baestevel * children.
03831d35f7499c87d51205817c93e9a8d42c4baestevel /* Get the slot number for this card */
03831d35f7499c87d51205817c93e9a8d42c4baestevel "slot2dev"),
03831d35f7499c87d51205817c93e9a8d42c4baestevel * Check that duplicate devices are not reported
03831d35f7499c87d51205817c93e9a8d42c4baestevel * on Tazmo.
03831d35f7499c87d51205817c93e9a8d42c4baestevel /* XXX - Don't know how to get status for PCI cards */
03831d35f7499c87d51205817c93e9a8d42c4baestevel /* Get the model of this card */
03831d35f7499c87d51205817c93e9a8d42c4baestevel * Check if further processing is necessary to display
03831d35f7499c87d51205817c93e9a8d42c4baestevel * this card uniquely.
03831d35f7499c87d51205817c93e9a8d42c4baestevel distinguish_identical_io_cards(name, card_node, &card);
03831d35f7499c87d51205817c93e9a8d42c4baestevel * If we haven't figured out the frequency yet,
03831d35f7499c87d51205817c93e9a8d42c4baestevel * try and get it from the card.
03831d35f7499c87d51205817c93e9a8d42c4baestevel value = get_prop_val(find_prop(pci, "clock-frequency"));
03831d35f7499c87d51205817c93e9a8d42c4baestevel "compatible"));
03831d35f7499c87d51205817c93e9a8d42c4baestevel * On Tazmo, we would like to print out the last
03831d35f7499c87d51205817c93e9a8d42c4baestevel * string of the "compatible" property if it exists.
03831d35f7499c87d51205817c93e9a8d42c4baestevel * The IEEE 1275 spec. states that this last string
03831d35f7499c87d51205817c93e9a8d42c4baestevel * will be the classcode name.
03831d35f7499c87d51205817c93e9a8d42c4baestevel * If we are done with the children of the pci bridge,
03831d35f7499c87d51205817c93e9a8d42c4baestevel * we must continue with the remaining siblings of
03831d35f7499c87d51205817c93e9a8d42c4baestevel * the pci-to-pci bridge.
03831d35f7499c87d51205817c93e9a8d42c4baestevel if ((card_node->sibling == NULL) && pci_pci_bridge) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel * Print out all the io cards in the list. Also print the column
03831d35f7499c87d51205817c93e9a8d42c4baestevel * headers if told to do so.
03831d35f7499c87d51205817c93e9a8d42c4baestevel static int banner = 0; /* Have we printed the column headings? */
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (banner == 0) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel "Model", 0);
03831d35f7499c87d51205817c93e9a8d42c4baestevel "-------------------------------- "
03831d35f7499c87d51205817c93e9a8d42c4baestevel "----------------------", 0);
03831d35f7499c87d51205817c93e9a8d42c4baestevel * display_ffb
03831d35f7499c87d51205817c93e9a8d42c4baestevel * Display all FFBs on this board. It can either be in tabular format,
03831d35f7499c87d51205817c93e9a8d42c4baestevel * or a more verbose format.
03831d35f7499c87d51205817c93e9a8d42c4baestevel /* Fill in common information */
03831d35f7499c87d51205817c93e9a8d42c4baestevel for (ffb = dev_find_node(board->nodes, FFB_NAME); ffb != NULL;
03831d35f7499c87d51205817c93e9a8d42c4baestevel /* Print out in table format */
03831d35f7499c87d51205817c93e9a8d42c4baestevel /* XXX - Get the slot number (hack) */
03831d35f7499c87d51205817c93e9a8d42c4baestevel /* Find out if it's single or double buffered */
03831d35f7499c87d51205817c93e9a8d42c4baestevel "FFB, Double Buffered");
03831d35f7499c87d51205817c93e9a8d42c4baestevel "FFB, Single Buffered");
03831d35f7499c87d51205817c93e9a8d42c4baestevel /* Print model number */
03831d35f7499c87d51205817c93e9a8d42c4baestevel /* print in long format */
03831d35f7499c87d51205817c93e9a8d42c4baestevel /* Find the device node using upa address */
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf("-----------------------------------\n", 0);
03831d35f7499c87d51205817c93e9a8d42c4baestevel * This module does the reading and interpreting of javelin system
03831d35f7499c87d51205817c93e9a8d42c4baestevel * kstats. These kstats are created by the environ drivers.
03831d35f7499c87d51205817c93e9a8d42c4baestevelread_platform_kstats(Sys_tree *tree, struct system_kstat_data *sys_kstat,
03831d35f7499c87d51205817c93e9a8d42c4baestevel struct bd_kstat_data *bdp, struct envctrl_kstat_data *ep)
03831d35f7499c87d51205817c93e9a8d42c4baestevel /* read the envctrltwo kstats */
03831d35f7499c87d51205817c93e9a8d42c4baestevel /* Read the power supply kstats */
03831d35f7499c87d51205817c93e9a8d42c4baestevel ksp = kstat_lookup(kc, ENVCTRL_MODULE_NAME, INSTANCE_0,
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (ksp != NULL && (kstat_read(kc, ksp, NULL) != -1)) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel /* Read the fan status kstats */
03831d35f7499c87d51205817c93e9a8d42c4baestevel ksp = kstat_lookup(kc, ENVCTRL_MODULE_NAME, INSTANCE_0,
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (ksp != NULL && (kstat_read(kc, ksp, NULL) != -1)) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel /* Read the enclosure kstats */
03831d35f7499c87d51205817c93e9a8d42c4baestevel ksp = kstat_lookup(kc, ENVCTRL_MODULE_NAME, INSTANCE_0,
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (ksp != NULL && (kstat_read(kc, ksp, NULL) != -1)) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel /* Read the temperature kstats */
03831d35f7499c87d51205817c93e9a8d42c4baestevel ksp = kstat_lookup(kc, ENVCTRL_MODULE_NAME, INSTANCE_0,
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (ksp != NULL && (kstat_read(kc, ksp, NULL) != -1)) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel /* Read the disk kstats */
03831d35f7499c87d51205817c93e9a8d42c4baestevel ksp = kstat_lookup(kc, ENVCTRL_MODULE_NAME, INSTANCE_0,
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (ksp != NULL && (kstat_read(kc, ksp, NULL) != -1)) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel * Walk the PROM device tree and build the system tree and root tree.
03831d35f7499c87d51205817c93e9a8d42c4baestevel * Nodes that have a board number property are placed in the board
03831d35f7499c87d51205817c93e9a8d42c4baestevel * structures for easier processing later. Child nodes are placed
03831d35f7499c87d51205817c93e9a8d42c4baestevel * under their parents. ffb (Fusion Frame Buffer) nodes are handled
03831d35f7499c87d51205817c93e9a8d42c4baestevel * specially, because they do not contain board number properties.
03831d35f7499c87d51205817c93e9a8d42c4baestevel * This was requested from OBP, but was not granted. So this code
03831d35f7499c87d51205817c93e9a8d42c4baestevel * must parse the MID of the FFB to find the board#.
03831d35f7499c87d51205817c93e9a8d42c4baestevel /* allocate a node for this level */
03831d35f7499c87d51205817c93e9a8d42c4baestevel if ((pnode = (Prom_node *) malloc(sizeof (struct prom_node))) ==
03831d35f7499c87d51205817c93e9a8d42c4baestevel /* assign parent Prom_node */
03831d35f7499c87d51205817c93e9a8d42c4baestevel /* read properties for this node */
03831d35f7499c87d51205817c93e9a8d42c4baestevel * Place a node in a 'board' if it has 'board'-ness. The definition
03831d35f7499c87d51205817c93e9a8d42c4baestevel * is that all nodes that are children of root should have a
03831d35f7499c87d51205817c93e9a8d42c4baestevel * board# property. But the PROM tree does not exactly follow
03831d35f7499c87d51205817c93e9a8d42c4baestevel * this. This is where we start hacking. The name 'ffb' can
03831d35f7499c87d51205817c93e9a8d42c4baestevel * change, so watch out for this.
03831d35f7499c87d51205817c93e9a8d42c4baestevel * The UltraSPARC, sbus, pci and ffb nodes will exit in
03831d35f7499c87d51205817c93e9a8d42c4baestevel * the desktops and will not have board# properties. These
03831d35f7499c87d51205817c93e9a8d42c4baestevel * cases must be handled here.
03831d35f7499c87d51205817c93e9a8d42c4baestevel * PCI to PCI bridges also have the name "pci", but with different
03831d35f7499c87d51205817c93e9a8d42c4baestevel * model property values. They should not be put under 'board'.
03831d35f7499c87d51205817c93e9a8d42c4baestevel model = (char *)get_prop_val(find_prop(pnode, "model"));
03831d35f7499c87d51205817c93e9a8d42c4baestevel printf("node not added: name=%s type=%s\n", name, type);
03831d35f7499c87d51205817c93e9a8d42c4baestevel * local functions
03831d35f7499c87d51205817c93e9a8d42c4baestevel * disp_envc_status
03831d35f7499c87d51205817c93e9a8d42c4baestevel * This routine displays the environmental status passed up from
03831d35f7499c87d51205817c93e9a8d42c4baestevel * device drivers via kstats. The kstat names are defined in
03831d35f7499c87d51205817c93e9a8d42c4baestevel * kernel header files included by this module.
03831d35f7499c87d51205817c93e9a8d42c4baestevel * This is a Javelin specific environmental information display routine.
03831d35f7499c87d51205817c93e9a8d42c4baesteveldisp_envc_status(struct system_kstat_data *sys_kstats)
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf(dgettext(TEXT_DOMAIN, "Environmental information "
03831d35f7499c87d51205817c93e9a8d42c4baestevel "is not available\n"), 0);
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf(dgettext(TEXT_DOMAIN, "Environmental driver may "
03831d35f7499c87d51205817c93e9a8d42c4baestevel "not be installed\n"), 0);
03831d35f7499c87d51205817c93e9a8d42c4baestevel return (1);
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf(dgettext(TEXT_DOMAIN, " Environmental Status "), 0);
03831d35f7499c87d51205817c93e9a8d42c4baestevel } else if (temp_ks.value >= temp_ks.warning_threshold) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf("=================================\n", 0);
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf("Keyswitch position is in %s mode.\n", state);
03831d35f7499c87d51205817c93e9a8d42c4baestevel ENVCTRL_UE250_FSP_PS_ERR | ENVCTRL_UE250_FSP_TEMP_ERR |
03831d35f7499c87d51205817c93e9a8d42c4baestevel ENVCTRL_UE250_FSP_GEN_ERR | ENVCTRL_UE250_FSP_ACTIVE);
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf("System LED Status: DISK ERROR POWER \n", 0);
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (val & (ENVCTRL_UE250_FSP_DISK_ERR | ENVCTRL_UE250_FSP_PS_ERR |
03831d35f7499c87d51205817c93e9a8d42c4baestevel ENVCTRL_UE250_FSP_GEN_ERR | ENVCTRL_UE250_FSP_TEMP_ERR)) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf("=================================\n", 0);
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf("Disk LED Status: OK = GREEN ERROR = YELLOW\n", 0);
03831d35f7499c87d51205817c93e9a8d42c4baestevel disk_fl & ENVCTRL_DISK_5 ? "[ERROR]" : "[OK]" : "[EMPTY]",
03831d35f7499c87d51205817c93e9a8d42c4baestevel disk_fl & ENVCTRL_DISK_3 ? "[ERROR]" : "[OK]" : "[EMPTY]",
03831d35f7499c87d51205817c93e9a8d42c4baestevel disk_fl & ENVCTRL_DISK_1 ? "[ERROR]" : "[OK]" : "[EMPTY]");
03831d35f7499c87d51205817c93e9a8d42c4baestevel disk_fl & ENVCTRL_DISK_4 ? "[ERROR]" : "[OK]" : "[EMPTY]",
03831d35f7499c87d51205817c93e9a8d42c4baestevel disk_fl & ENVCTRL_DISK_2 ? "[ERROR]" : "[OK]" : "[EMPTY]",
03831d35f7499c87d51205817c93e9a8d42c4baestevel disk_fl & ENVCTRL_DISK_0 ? "[ERROR]" : "[OK]" : "[EMPTY]");
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf("=================================\n", 0);
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf("=================================\n", 0);
03831d35f7499c87d51205817c93e9a8d42c4baestevel "Power Failure");
03831d35f7499c87d51205817c93e9a8d42c4baestevel /* Print the header */
03831d35f7499c87d51205817c93e9a8d42c4baestevel /* Find sysio and print rev */
03831d35f7499c87d51205817c93e9a8d42c4baestevel for (pnode = dev_find_node(bnode->nodes, "sbus"); pnode != NULL;
03831d35f7499c87d51205817c93e9a8d42c4baestevel version = (int *)get_prop_val(find_prop(pnode, "version#"));
03831d35f7499c87d51205817c93e9a8d42c4baestevel /* Find Psycho and print rev */
03831d35f7499c87d51205817c93e9a8d42c4baestevel for (pnode = dev_find_node(bnode->nodes, "pci"); pnode != NULL;
03831d35f7499c87d51205817c93e9a8d42c4baestevel version = (int *)get_prop_val(find_prop(pnode, "version#"));
03831d35f7499c87d51205817c93e9a8d42c4baestevel /* Find Cheerio and print rev */
03831d35f7499c87d51205817c93e9a8d42c4baestevel for (pnode = dev_find_node(bnode->nodes, "ebus"); pnode != NULL;
03831d35f7499c87d51205817c93e9a8d42c4baestevel version = (int *)get_prop_val(find_prop(pnode, "revision-id"));
03831d35f7499c87d51205817c93e9a8d42c4baestevel /* Find System Controller and print rev */
03831d35f7499c87d51205817c93e9a8d42c4baestevel for (pnode = dev_find_node(bnode->nodes, "sc"); pnode != NULL;
03831d35f7499c87d51205817c93e9a8d42c4baestevel version = (int *)get_prop_val(find_prop(pnode, "version#"));
03831d35f7499c87d51205817c93e9a8d42c4baestevel model = (char *)get_prop_val(find_prop(pnode, "model"));
03831d35f7499c87d51205817c93e9a8d42c4baestevel /* Find the FEPS and print rev */
03831d35f7499c87d51205817c93e9a8d42c4baestevel for (pnode = dev_find_node(bnode->nodes, "SUNW,hme"); pnode != NULL;
03831d35f7499c87d51205817c93e9a8d42c4baestevel version = (int *)get_prop_val(find_prop(pnode, "hm-rev"));
03831d35f7499c87d51205817c93e9a8d42c4baestevel * Determine the physical PCI slot based on which Psycho is the parent
03831d35f7499c87d51205817c93e9a8d42c4baestevel * of the PCI card.
03831d35f7499c87d51205817c93e9a8d42c4baesteveltazmo_physical_slot(Prom_node *slotd, Prom_node *parent, int device, char *str)
03831d35f7499c87d51205817c93e9a8d42c4baestevel * If slotd != NULL, then we must return the physical PCI slot
03831d35f7499c87d51205817c93e9a8d42c4baestevel * number based on the information in the slot2dev associations
03831d35f7499c87d51205817c93e9a8d42c4baestevel * node. This routine is called from display_pci() with slotd
03831d35f7499c87d51205817c93e9a8d42c4baestevel * != NULL. If so, we return without obtaining the slot name.
03831d35f7499c87d51205817c93e9a8d42c4baestevel * If slotd == NULL, we look for the slot name through the
03831d35f7499c87d51205817c93e9a8d42c4baestevel * slot-names property in the bus node.
03831d35f7499c87d51205817c93e9a8d42c4baestevel if ((prop = find_prop(parent, "upa-portid")) != NULL)
03831d35f7499c87d51205817c93e9a8d42c4baestevel return (-1);
03831d35f7499c87d51205817c93e9a8d42c4baestevel * Javelin and future projects will use 0 based
03831d35f7499c87d51205817c93e9a8d42c4baestevel * numbering for slots.
03831d35f7499c87d51205817c93e9a8d42c4baestevel return (-1);
03831d35f7499c87d51205817c93e9a8d42c4baestevel * Get slot-names property from parent node.
03831d35f7499c87d51205817c93e9a8d42c4baestevel * This property consists of a 32 bit mask indicating which
03831d35f7499c87d51205817c93e9a8d42c4baestevel * devices are relevant to this bus node. Following are a
03831d35f7499c87d51205817c93e9a8d42c4baestevel * number of strings depending on how many bits are set in the
03831d35f7499c87d51205817c93e9a8d42c4baestevel * bit mask; the first string gives the label that is printed
03831d35f7499c87d51205817c93e9a8d42c4baestevel * on the chassis for the smallest device number, and so on.
03831d35f7499c87d51205817c93e9a8d42c4baestevel return (-1);
03831d35f7499c87d51205817c93e9a8d42c4baestevel * Shift through the bitmask looking to see if the
03831d35f7499c87d51205817c93e9a8d42c4baestevel * bit corresponding to "device" is set. If so, copy
03831d35f7499c87d51205817c93e9a8d42c4baestevel * the correcsponding string to the provided pointer.
03831d35f7499c87d51205817c93e9a8d42c4baestevel return (0);
03831d35f7499c87d51205817c93e9a8d42c4baestevel return (-1);