03831d35f7499c87d51205817c93e9a8d42c4baestevel/*
03831d35f7499c87d51205817c93e9a8d42c4baestevel * CDDL HEADER START
03831d35f7499c87d51205817c93e9a8d42c4baestevel *
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 *
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/*
03831d35f7499c87d51205817c93e9a8d42c4baestevel * Copyright 1999-2002 Sun Microsystems, Inc. All rights reserved.
03831d35f7499c87d51205817c93e9a8d42c4baestevel * Use is subject to license terms.
03831d35f7499c87d51205817c93e9a8d42c4baestevel *
03831d35f7499c87d51205817c93e9a8d42c4baestevel * Javelin Platform specific functions.
03831d35f7499c87d51205817c93e9a8d42c4baestevel *
03831d35f7499c87d51205817c93e9a8d42c4baestevel * called when :
03831d35f7499c87d51205817c93e9a8d42c4baestevel * machine_type == MTYPE_JAVELIN
03831d35f7499c87d51205817c93e9a8d42c4baestevel *
03831d35f7499c87d51205817c93e9a8d42c4baestevel */
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel#pragma ident "%Z%%M% %I% %E% SMI"
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel#include <stdio.h>
03831d35f7499c87d51205817c93e9a8d42c4baestevel#include <stdlib.h>
03831d35f7499c87d51205817c93e9a8d42c4baestevel#include <unistd.h>
03831d35f7499c87d51205817c93e9a8d42c4baestevel#include <ctype.h>
03831d35f7499c87d51205817c93e9a8d42c4baestevel#include <string.h>
03831d35f7499c87d51205817c93e9a8d42c4baestevel#include <kvm.h>
03831d35f7499c87d51205817c93e9a8d42c4baestevel#include <varargs.h>
03831d35f7499c87d51205817c93e9a8d42c4baestevel#include <errno.h>
03831d35f7499c87d51205817c93e9a8d42c4baestevel#include <time.h>
03831d35f7499c87d51205817c93e9a8d42c4baestevel#include <dirent.h>
03831d35f7499c87d51205817c93e9a8d42c4baestevel#include <fcntl.h>
03831d35f7499c87d51205817c93e9a8d42c4baestevel#include <sys/param.h>
03831d35f7499c87d51205817c93e9a8d42c4baestevel#include <sys/stat.h>
03831d35f7499c87d51205817c93e9a8d42c4baestevel#include <sys/types.h>
03831d35f7499c87d51205817c93e9a8d42c4baestevel#include <sys/utsname.h>
03831d35f7499c87d51205817c93e9a8d42c4baestevel#include <sys/openpromio.h>
03831d35f7499c87d51205817c93e9a8d42c4baestevel#include <kstat.h>
03831d35f7499c87d51205817c93e9a8d42c4baestevel#include <libintl.h>
03831d35f7499c87d51205817c93e9a8d42c4baestevel#include <syslog.h>
03831d35f7499c87d51205817c93e9a8d42c4baestevel#include <sys/dkio.h>
03831d35f7499c87d51205817c93e9a8d42c4baestevel#include "pdevinfo.h"
03831d35f7499c87d51205817c93e9a8d42c4baestevel#include "display.h"
03831d35f7499c87d51205817c93e9a8d42c4baestevel#include "pdevinfo_sun4u.h"
03831d35f7499c87d51205817c93e9a8d42c4baestevel#include "display_sun4u.h"
03831d35f7499c87d51205817c93e9a8d42c4baestevel#include "libprtdiag.h"
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel#if !defined(TEXT_DOMAIN)
03831d35f7499c87d51205817c93e9a8d42c4baestevel#define TEXT_DOMAIN "SYS_TEST"
03831d35f7499c87d51205817c93e9a8d42c4baestevel#endif
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevelextern int print_flag;
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel/*
03831d35f7499c87d51205817c93e9a8d42c4baestevel * these functions will overlay the symbol table of libprtdiag
03831d35f7499c87d51205817c93e9a8d42c4baestevel * at runtime (workgroup server systems only)
03831d35f7499c87d51205817c93e9a8d42c4baestevel */
03831d35f7499c87d51205817c93e9a8d42c4baestevelint error_check(Sys_tree *tree, struct system_kstat_data *kstats);
03831d35f7499c87d51205817c93e9a8d42c4baestevelvoid display_memoryconf(Sys_tree *tree, struct grp_info *grps);
03831d35f7499c87d51205817c93e9a8d42c4baestevelint disp_fail_parts(Sys_tree *tree);
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 system_kstat_data *kstats);
03831d35f7499c87d51205817c93e9a8d42c4baestevelvoid display_boardnum(int num);
03831d35f7499c87d51205817c93e9a8d42c4baestevelvoid display_pci(Board_node *);
03831d35f7499c87d51205817c93e9a8d42c4baestevelvoid display_io_cards(struct io_card *list);
03831d35f7499c87d51205817c93e9a8d42c4baestevelvoid display_ffb(Board_node *, int);
03831d35f7499c87d51205817c93e9a8d42c4baestevelvoid read_platform_kstats(Sys_tree *tree,
03831d35f7499c87d51205817c93e9a8d42c4baestevel struct system_kstat_data *sys_kstat,
03831d35f7499c87d51205817c93e9a8d42c4baestevel struct bd_kstat_data *bdp, struct envctrl_kstat_data *ep);
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel/* local functions */
03831d35f7499c87d51205817c93e9a8d42c4baestevelstatic int disp_envc_status(struct system_kstat_data *);
03831d35f7499c87d51205817c93e9a8d42c4baestevelstatic void tazjav_disp_asic_revs(Sys_tree *);
03831d35f7499c87d51205817c93e9a8d42c4baestevelstatic int tazmo_physical_slot(Prom_node *, Prom_node *, int, char *);
03831d35f7499c87d51205817c93e9a8d42c4baestevelstatic Prom_node *dev_next_node_sibling(Prom_node *root, char *name);
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevelint
03831d35f7499c87d51205817c93e9a8d42c4baestevelerror_check(Sys_tree *tree, struct system_kstat_data *kstats)
03831d35f7499c87d51205817c93e9a8d42c4baestevel{
03831d35f7499c87d51205817c93e9a8d42c4baestevel int exit_code = 0; /* init to all OK */
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel#ifdef lint
03831d35f7499c87d51205817c93e9a8d42c4baestevel kstats = kstats;
03831d35f7499c87d51205817c93e9a8d42c4baestevel#endif
03831d35f7499c87d51205817c93e9a8d42c4baestevel /*
03831d35f7499c87d51205817c93e9a8d42c4baestevel * silently check for any types of machine errors
03831d35f7499c87d51205817c93e9a8d42c4baestevel */
03831d35f7499c87d51205817c93e9a8d42c4baestevel print_flag = 0;
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (disp_fail_parts(tree) || disp_envc_status(kstats)) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel /* set exit_code to show failures */
03831d35f7499c87d51205817c93e9a8d42c4baestevel exit_code = 1;
03831d35f7499c87d51205817c93e9a8d42c4baestevel }
03831d35f7499c87d51205817c93e9a8d42c4baestevel print_flag = 1;
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel return (exit_code);
03831d35f7499c87d51205817c93e9a8d42c4baestevel}
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel/* Search for and return the node's sibling */
03831d35f7499c87d51205817c93e9a8d42c4baestevelstatic Prom_node *
03831d35f7499c87d51205817c93e9a8d42c4baesteveldev_next_node_sibling(Prom_node *root, char *name)
03831d35f7499c87d51205817c93e9a8d42c4baestevel{
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (root == NULL)
03831d35f7499c87d51205817c93e9a8d42c4baestevel return (NULL);
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel /* look at your siblings */
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (dev_find_node(root->sibling, name) != NULL)
03831d35f7499c87d51205817c93e9a8d42c4baestevel return (root->sibling);
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel return (NULL); /* not found */
03831d35f7499c87d51205817c93e9a8d42c4baestevel}
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel/*
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.
03831d35f7499c87d51205817c93e9a8d42c4baestevel */
03831d35f7499c87d51205817c93e9a8d42c4baestevelvoid
03831d35f7499c87d51205817c93e9a8d42c4baesteveldisplay_memoryconf(Sys_tree *tree, struct grp_info *grps)
03831d35f7499c87d51205817c93e9a8d42c4baestevel{
03831d35f7499c87d51205817c93e9a8d42c4baestevel Board_node *bnode;
03831d35f7499c87d51205817c93e9a8d42c4baestevel Prom_node *memory;
03831d35f7499c87d51205817c93e9a8d42c4baestevel Prom_node *bank;
03831d35f7499c87d51205817c93e9a8d42c4baestevel Prom_node *dimm;
03831d35f7499c87d51205817c93e9a8d42c4baestevel uint_t *preg;
03831d35f7499c87d51205817c93e9a8d42c4baestevel uint_t interlv;
03831d35f7499c87d51205817c93e9a8d42c4baestevel unsigned long size = 0;
03831d35f7499c87d51205817c93e9a8d42c4baestevel int bank_count = 0;
03831d35f7499c87d51205817c93e9a8d42c4baestevel char *sock_name;
03831d35f7499c87d51205817c93e9a8d42c4baestevel char *status;
03831d35f7499c87d51205817c93e9a8d42c4baestevel Prop *status_prop;
03831d35f7499c87d51205817c93e9a8d42c4baestevel char interleave[8];
03831d35f7499c87d51205817c93e9a8d42c4baestevel int total_size = 0;
03831d35f7499c87d51205817c93e9a8d42c4baestevel#ifdef lint
03831d35f7499c87d51205817c93e9a8d42c4baestevel grps = grps;
03831d35f7499c87d51205817c93e9a8d42c4baestevel#endif
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf("\n", 0);
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf("=========================", 0);
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf(dgettext(TEXT_DOMAIN, " Memory "), 0);
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf("=========================", 0);
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf("\n", 0);
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf("\n", 0);
03831d35f7499c87d51205817c93e9a8d42c4baestevel bnode = tree->bd_list;
03831d35f7499c87d51205817c93e9a8d42c4baestevel memory = dev_find_node(bnode->nodes, "memory");
03831d35f7499c87d51205817c93e9a8d42c4baestevel preg = (uint_t *)(get_prop_val(find_prop(memory, "interleave")));
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (preg) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel interlv = preg[4];
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf("Memory Interleave Factor = %d-way\n\n", interlv, 0);
03831d35f7499c87d51205817c93e9a8d42c4baestevel }
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf(" Interlv. Socket Size\n", 0);
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf("Bank Group Name (MB) Status\n", 0);
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf("---- ----- ------ ---- ------\n", 0);
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel dimm = bnode->nodes;
03831d35f7499c87d51205817c93e9a8d42c4baestevel for (bank = dev_find_node(bnode->nodes, "bank"); bank != NULL;
03831d35f7499c87d51205817c93e9a8d42c4baestevel bank = dev_next_node(bank, "bank")) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel int bank_size = 0;
03831d35f7499c87d51205817c93e9a8d42c4baestevel uint_t *reg_prop;
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel preg = (uint_t *)(get_prop_val(
03831d35f7499c87d51205817c93e9a8d42c4baestevel find_prop(bank, "bank-interleave")));
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel reg_prop = (uint_t *)(get_prop_val(
03831d35f7499c87d51205817c93e9a8d42c4baestevel find_prop(bank, "reg")));
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel /*
03831d35f7499c87d51205817c93e9a8d42c4baestevel * Skip empty banks
03831d35f7499c87d51205817c93e9a8d42c4baestevel */
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (((reg_prop[2]<<12) + (reg_prop[3]>>20)) == 0) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel bank_count++;
03831d35f7499c87d51205817c93e9a8d42c4baestevel continue;
03831d35f7499c87d51205817c93e9a8d42c4baestevel }
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (preg) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel interlv = preg[2];
03831d35f7499c87d51205817c93e9a8d42c4baestevel (void) sprintf(interleave, " %d ", interlv);
03831d35f7499c87d51205817c93e9a8d42c4baestevel bank_size = (preg[0]<<12) + (preg[1]>>20);
03831d35f7499c87d51205817c93e9a8d42c4baestevel } else {
03831d35f7499c87d51205817c93e9a8d42c4baestevel (void) sprintf(interleave, "%s", "none");
03831d35f7499c87d51205817c93e9a8d42c4baestevel preg = (uint_t *)(get_prop_val(find_prop(bank, "reg")));
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (preg) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel bank_size = (preg[2]<<12) + (preg[3]>>20);
03831d35f7499c87d51205817c93e9a8d42c4baestevel }
03831d35f7499c87d51205817c93e9a8d42c4baestevel }
03831d35f7499c87d51205817c93e9a8d42c4baestevel for (dimm = dev_find_node(bank, "dimm"); dimm != NULL;
03831d35f7499c87d51205817c93e9a8d42c4baestevel dimm = dev_next_node_sibling(dimm, "dimm")) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel char dimm_status[16];
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel sock_name = (char *)(get_prop_val(
03831d35f7499c87d51205817c93e9a8d42c4baestevel find_prop(dimm, "socket-name")));
03831d35f7499c87d51205817c93e9a8d42c4baestevel preg = (uint_t *)(get_prop_val(find_prop(dimm, "reg")));
03831d35f7499c87d51205817c93e9a8d42c4baestevel size = (preg[2]<<12) + (preg[3]>>20);
03831d35f7499c87d51205817c93e9a8d42c4baestevel if ((status_prop = find_prop(dimm, "status")) == NULL) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel (void) sprintf(dimm_status, "%s", "OK");
03831d35f7499c87d51205817c93e9a8d42c4baestevel } else {
03831d35f7499c87d51205817c93e9a8d42c4baestevel status = (char *)(get_prop_val(status_prop));
03831d35f7499c87d51205817c93e9a8d42c4baestevel (void) sprintf(dimm_status, "%s", status);
03831d35f7499c87d51205817c93e9a8d42c4baestevel }
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf("%3d %5s %6s %4d %6s\n",
03831d35f7499c87d51205817c93e9a8d42c4baestevel bank_count, interleave, sock_name,
03831d35f7499c87d51205817c93e9a8d42c4baestevel size, dimm_status, 0);
03831d35f7499c87d51205817c93e9a8d42c4baestevel }
03831d35f7499c87d51205817c93e9a8d42c4baestevel total_size += bank_size;
03831d35f7499c87d51205817c93e9a8d42c4baestevel bank_count++;
03831d35f7499c87d51205817c93e9a8d42c4baestevel }
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf("\n", 0);
03831d35f7499c87d51205817c93e9a8d42c4baestevel}
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel/*
03831d35f7499c87d51205817c93e9a8d42c4baestevel * disp_fail_parts
03831d35f7499c87d51205817c93e9a8d42c4baestevel *
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 */
03831d35f7499c87d51205817c93e9a8d42c4baestevelint
03831d35f7499c87d51205817c93e9a8d42c4baesteveldisp_fail_parts(Sys_tree *tree)
03831d35f7499c87d51205817c93e9a8d42c4baestevel{
03831d35f7499c87d51205817c93e9a8d42c4baestevel int exit_code;
03831d35f7499c87d51205817c93e9a8d42c4baestevel int system_failed = 0;
03831d35f7499c87d51205817c93e9a8d42c4baestevel Board_node *bnode = tree->bd_list;
03831d35f7499c87d51205817c93e9a8d42c4baestevel Prom_node *pnode;
03831d35f7499c87d51205817c93e9a8d42c4baestevel char *fru;
03831d35f7499c87d51205817c93e9a8d42c4baestevel char *sock_name;
03831d35f7499c87d51205817c93e9a8d42c4baestevel char slot_str[MAXSTRLEN];
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel exit_code = 0;
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel /* go through all of the boards looking for failed units. */
03831d35f7499c87d51205817c93e9a8d42c4baestevel while (bnode != NULL) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel /* find failed chips */
03831d35f7499c87d51205817c93e9a8d42c4baestevel pnode = find_failed_node(bnode->nodes);
03831d35f7499c87d51205817c93e9a8d42c4baestevel if ((pnode != NULL) && !system_failed) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel system_failed = 1;
03831d35f7499c87d51205817c93e9a8d42c4baestevel exit_code = 1;
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (print_flag == 0) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel return (exit_code);
03831d35f7499c87d51205817c93e9a8d42c4baestevel }
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf("\n", 0);
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf(dgettext(TEXT_DOMAIN, "Failed Field "
03831d35f7499c87d51205817c93e9a8d42c4baestevel "Replaceable Units (FRU) in System:\n"), 0);
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf("=========================="
03831d35f7499c87d51205817c93e9a8d42c4baestevel "====================\n", 0);
03831d35f7499c87d51205817c93e9a8d42c4baestevel }
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel while (pnode != NULL) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel void *value;
03831d35f7499c87d51205817c93e9a8d42c4baestevel char *name; /* node name string */
03831d35f7499c87d51205817c93e9a8d42c4baestevel char *type; /* node type string */
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel value = get_prop_val(find_prop(pnode, "status"));
03831d35f7499c87d51205817c93e9a8d42c4baestevel name = get_node_name(pnode);
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel /* sanity check of data retreived from PROM */
03831d35f7499c87d51205817c93e9a8d42c4baestevel if ((value == NULL) || (name == NULL)) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel pnode = next_failed_node(pnode);
03831d35f7499c87d51205817c93e9a8d42c4baestevel continue;
03831d35f7499c87d51205817c93e9a8d42c4baestevel }
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf(dgettext(TEXT_DOMAIN, "%s unavailable :\n"),
03831d35f7499c87d51205817c93e9a8d42c4baestevel name, 0);
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf(dgettext(TEXT_DOMAIN, "\tPROM fault "
03831d35f7499c87d51205817c93e9a8d42c4baestevel "string: %s\n"), value, 0);
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf(dgettext(TEXT_DOMAIN, "\tFailed Field "
03831d35f7499c87d51205817c93e9a8d42c4baestevel "Replaceable Unit is "), 0);
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel /*
03831d35f7499c87d51205817c93e9a8d42c4baestevel * Determine whether FRU is CPU module, system
03831d35f7499c87d51205817c93e9a8d42c4baestevel * board, or SBus card.
03831d35f7499c87d51205817c93e9a8d42c4baestevel */
03831d35f7499c87d51205817c93e9a8d42c4baestevel if ((name != NULL) && (strstr(name, "sbus"))) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf(dgettext(TEXT_DOMAIN, "SBus "
03831d35f7499c87d51205817c93e9a8d42c4baestevel "Card %d\n"), get_sbus_slot(pnode), 0);
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel } else if (((name = get_node_name(pnode)) !=
03831d35f7499c87d51205817c93e9a8d42c4baestevel NULL) && (strstr(name, "pci"))) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf(dgettext(TEXT_DOMAIN, "system "
03831d35f7499c87d51205817c93e9a8d42c4baestevel "board\n"), 0);
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel } else if (((name = get_node_name(pnode)) !=
03831d35f7499c87d51205817c93e9a8d42c4baestevel NULL) && (strstr(name, "ffb"))) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf(dgettext(TEXT_DOMAIN, "FFB "
03831d35f7499c87d51205817c93e9a8d42c4baestevel "Card %d\n"), tazmo_physical_slot(
03831d35f7499c87d51205817c93e9a8d42c4baestevel dev_find_node(bnode->nodes, "slot2dev"),
03831d35f7499c87d51205817c93e9a8d42c4baestevel pnode, -1, slot_str), 0);
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel } else if (((name = get_node_name(pnode->parent)) !=
03831d35f7499c87d51205817c93e9a8d42c4baestevel NULL) && (strstr(name, "pci"))) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel (void) tazmo_physical_slot(
03831d35f7499c87d51205817c93e9a8d42c4baestevel NULL,
03831d35f7499c87d51205817c93e9a8d42c4baestevel pnode->parent,
03831d35f7499c87d51205817c93e9a8d42c4baestevel get_pci_device(pnode),
03831d35f7499c87d51205817c93e9a8d42c4baestevel slot_str);
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf(dgettext(TEXT_DOMAIN, "PCI Card "
03831d35f7499c87d51205817c93e9a8d42c4baestevel "in %s\n"), slot_str, 0);
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel } else if (((type = get_node_type(pnode)) != NULL) &&
03831d35f7499c87d51205817c93e9a8d42c4baestevel (strstr(type, "cpu"))) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf(
03831d35f7499c87d51205817c93e9a8d42c4baestevel dgettext(TEXT_DOMAIN, "UltraSPARC "
03831d35f7499c87d51205817c93e9a8d42c4baestevel "module Module %d\n"),
03831d35f7499c87d51205817c93e9a8d42c4baestevel get_id(pnode));
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel } else if (((type = get_node_type(pnode)) != NULL) &&
03831d35f7499c87d51205817c93e9a8d42c4baestevel (strstr(type, "memory-module"))) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel fru = (char *)(get_prop_val(
03831d35f7499c87d51205817c93e9a8d42c4baestevel find_prop(pnode, "fru")));
03831d35f7499c87d51205817c93e9a8d42c4baestevel sock_name = (char *)(get_prop_val(
03831d35f7499c87d51205817c93e9a8d42c4baestevel find_prop(pnode, "socket-name")));
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf(
03831d35f7499c87d51205817c93e9a8d42c4baestevel dgettext(TEXT_DOMAIN, "%s in "
03831d35f7499c87d51205817c93e9a8d42c4baestevel "socket %s\n"), fru,
03831d35f7499c87d51205817c93e9a8d42c4baestevel sock_name, 0);
03831d35f7499c87d51205817c93e9a8d42c4baestevel }
03831d35f7499c87d51205817c93e9a8d42c4baestevel pnode = next_failed_node(pnode);
03831d35f7499c87d51205817c93e9a8d42c4baestevel }
03831d35f7499c87d51205817c93e9a8d42c4baestevel bnode = bnode->next;
03831d35f7499c87d51205817c93e9a8d42c4baestevel }
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (!system_failed) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf("\n", 0);
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf(dgettext(TEXT_DOMAIN, "No failures found "
03831d35f7499c87d51205817c93e9a8d42c4baestevel "in System\n"), 0);
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf("===========================\n", 0);
03831d35f7499c87d51205817c93e9a8d42c4baestevel }
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (system_failed)
03831d35f7499c87d51205817c93e9a8d42c4baestevel return (1);
03831d35f7499c87d51205817c93e9a8d42c4baestevel else
03831d35f7499c87d51205817c93e9a8d42c4baestevel return (0);
03831d35f7499c87d51205817c93e9a8d42c4baestevel}
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevelvoid
03831d35f7499c87d51205817c93e9a8d42c4baesteveldisplay_hp_fail_fault(Sys_tree *tree, struct system_kstat_data *kstats)
03831d35f7499c87d51205817c93e9a8d42c4baestevel{
03831d35f7499c87d51205817c93e9a8d42c4baestevel#ifdef lint
03831d35f7499c87d51205817c93e9a8d42c4baestevel kstats = kstats;
03831d35f7499c87d51205817c93e9a8d42c4baestevel#endif
03831d35f7499c87d51205817c93e9a8d42c4baestevel /* Display failed units */
03831d35f7499c87d51205817c93e9a8d42c4baestevel (void) disp_fail_parts(tree);
03831d35f7499c87d51205817c93e9a8d42c4baestevel}
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevelvoid
03831d35f7499c87d51205817c93e9a8d42c4baesteveldisplay_diaginfo(int flag, Prom_node *root, Sys_tree *tree,
03831d35f7499c87d51205817c93e9a8d42c4baestevel struct system_kstat_data *kstats)
03831d35f7499c87d51205817c93e9a8d42c4baestevel{
03831d35f7499c87d51205817c93e9a8d42c4baestevel /*
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 */
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (flag) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel /*
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 */
03831d35f7499c87d51205817c93e9a8d42c4baestevel disp_powerfail(root);
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel (void) disp_envc_status(kstats);
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel tazjav_disp_asic_revs(tree);
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel platform_disp_prom_version(tree);
03831d35f7499c87d51205817c93e9a8d42c4baestevel }
03831d35f7499c87d51205817c93e9a8d42c4baestevel return;
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel}
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel/* ARGSUSED */
03831d35f7499c87d51205817c93e9a8d42c4baestevelvoid
03831d35f7499c87d51205817c93e9a8d42c4baesteveldisplay_boardnum(int num)
03831d35f7499c87d51205817c93e9a8d42c4baestevel{
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf("SYS ", 0);
03831d35f7499c87d51205817c93e9a8d42c4baestevel}
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel/*
03831d35f7499c87d51205817c93e9a8d42c4baestevel * display_pci
03831d35f7499c87d51205817c93e9a8d42c4baestevel * Display all the PCI IO cards on this board.
03831d35f7499c87d51205817c93e9a8d42c4baestevel */
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel/* ARGSUSED */
03831d35f7499c87d51205817c93e9a8d42c4baestevelvoid
03831d35f7499c87d51205817c93e9a8d42c4baesteveldisplay_pci(Board_node *board)
03831d35f7499c87d51205817c93e9a8d42c4baestevel{
03831d35f7499c87d51205817c93e9a8d42c4baestevel struct io_card *card_list = NULL;
03831d35f7499c87d51205817c93e9a8d42c4baestevel struct io_card card;
03831d35f7499c87d51205817c93e9a8d42c4baestevel void *value;
03831d35f7499c87d51205817c93e9a8d42c4baestevel Prom_node *pci;
03831d35f7499c87d51205817c93e9a8d42c4baestevel Prom_node *card_node;
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (board == NULL)
03831d35f7499c87d51205817c93e9a8d42c4baestevel return;
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel /* Initialize all the common information */
03831d35f7499c87d51205817c93e9a8d42c4baestevel card.display = 1;
03831d35f7499c87d51205817c93e9a8d42c4baestevel card.board = board->board_num;
03831d35f7499c87d51205817c93e9a8d42c4baestevel (void) sprintf(card.bus_type, "PCI");
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel for (pci = dev_find_node(board->nodes, PCI_NAME); pci != NULL;
03831d35f7499c87d51205817c93e9a8d42c4baestevel pci = dev_next_node(pci, PCI_NAME)) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel char *name;
03831d35f7499c87d51205817c93e9a8d42c4baestevel Prom_node *prev_parent = NULL;
03831d35f7499c87d51205817c93e9a8d42c4baestevel int prev_device = -1;
03831d35f7499c87d51205817c93e9a8d42c4baestevel int pci_pci_bridge = 0;
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel /*
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 */
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (find_prop(pci, "upa-portid") == NULL) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel if ((pci->parent->sibling != NULL) &&
03831d35f7499c87d51205817c93e9a8d42c4baestevel (strcmp(get_prop_val(
03831d35f7499c87d51205817c93e9a8d42c4baestevel find_prop(pci->parent->sibling,
03831d35f7499c87d51205817c93e9a8d42c4baestevel "name")), PCI_NAME) == 0))
03831d35f7499c87d51205817c93e9a8d42c4baestevel pci = pci->parent->sibling;
03831d35f7499c87d51205817c93e9a8d42c4baestevel else {
03831d35f7499c87d51205817c93e9a8d42c4baestevel pci = pci->parent->sibling;
03831d35f7499c87d51205817c93e9a8d42c4baestevel continue;
03831d35f7499c87d51205817c93e9a8d42c4baestevel }
03831d35f7499c87d51205817c93e9a8d42c4baestevel }
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel /* Skip all failed nodes for now */
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (node_failed(pci))
03831d35f7499c87d51205817c93e9a8d42c4baestevel continue;
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel /* Fill in frequency */
03831d35f7499c87d51205817c93e9a8d42c4baestevel value = get_prop_val(find_prop(pci, "clock-frequency"));
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (value == NULL)
03831d35f7499c87d51205817c93e9a8d42c4baestevel card.freq = -1;
03831d35f7499c87d51205817c93e9a8d42c4baestevel else
03831d35f7499c87d51205817c93e9a8d42c4baestevel card.freq = ((*(int *)value) + 500000) / 1000000;
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel /* Walk through the PSYCHO children */
03831d35f7499c87d51205817c93e9a8d42c4baestevel card_node = pci->child;
03831d35f7499c87d51205817c93e9a8d42c4baestevel while (card_node != NULL) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel Prop *compat = NULL;
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel /* If it doesn't have a name, skip it */
03831d35f7499c87d51205817c93e9a8d42c4baestevel name = (char *)get_prop_val(
03831d35f7499c87d51205817c93e9a8d42c4baestevel find_prop(card_node, "name"));
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (name == NULL) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel card_node = card_node->sibling;
03831d35f7499c87d51205817c93e9a8d42c4baestevel continue;
03831d35f7499c87d51205817c93e9a8d42c4baestevel }
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel /*
03831d35f7499c87d51205817c93e9a8d42c4baestevel * If this is a PCI bridge, then display its
03831d35f7499c87d51205817c93e9a8d42c4baestevel * children.
03831d35f7499c87d51205817c93e9a8d42c4baestevel */
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (strcmp(name, "pci") == 0) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel card_node = card_node->child;
03831d35f7499c87d51205817c93e9a8d42c4baestevel pci_pci_bridge = 1;
03831d35f7499c87d51205817c93e9a8d42c4baestevel continue;
03831d35f7499c87d51205817c93e9a8d42c4baestevel }
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel /* Get the slot number for this card */
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (pci_pci_bridge) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel card.slot = tazmo_physical_slot(
03831d35f7499c87d51205817c93e9a8d42c4baestevel dev_find_node(board->nodes, "slot2dev"),
03831d35f7499c87d51205817c93e9a8d42c4baestevel pci,
03831d35f7499c87d51205817c93e9a8d42c4baestevel get_pci_to_pci_device(
03831d35f7499c87d51205817c93e9a8d42c4baestevel card_node->parent),
03831d35f7499c87d51205817c93e9a8d42c4baestevel card.slot_str);
03831d35f7499c87d51205817c93e9a8d42c4baestevel } else
03831d35f7499c87d51205817c93e9a8d42c4baestevel card.slot = tazmo_physical_slot(
03831d35f7499c87d51205817c93e9a8d42c4baestevel dev_find_node(board->nodes,
03831d35f7499c87d51205817c93e9a8d42c4baestevel "slot2dev"),
03831d35f7499c87d51205817c93e9a8d42c4baestevel pci,
03831d35f7499c87d51205817c93e9a8d42c4baestevel get_pci_device(card_node),
03831d35f7499c87d51205817c93e9a8d42c4baestevel card.slot_str);
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel /*
03831d35f7499c87d51205817c93e9a8d42c4baestevel * Check that duplicate devices are not reported
03831d35f7499c87d51205817c93e9a8d42c4baestevel * on Tazmo.
03831d35f7499c87d51205817c93e9a8d42c4baestevel */
03831d35f7499c87d51205817c93e9a8d42c4baestevel if ((card_node->parent == prev_parent) &&
03831d35f7499c87d51205817c93e9a8d42c4baestevel (get_pci_device(card_node) == prev_device) &&
03831d35f7499c87d51205817c93e9a8d42c4baestevel (pci_pci_bridge == 0))
03831d35f7499c87d51205817c93e9a8d42c4baestevel card.slot = -1;
03831d35f7499c87d51205817c93e9a8d42c4baestevel prev_parent = card_node->parent;
03831d35f7499c87d51205817c93e9a8d42c4baestevel prev_device = get_pci_device(card_node);
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (card.slot == -1 || strstr(name, "ebus")) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel card_node = card_node->sibling;
03831d35f7499c87d51205817c93e9a8d42c4baestevel continue;
03831d35f7499c87d51205817c93e9a8d42c4baestevel }
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel /* XXX - Don't know how to get status for PCI cards */
03831d35f7499c87d51205817c93e9a8d42c4baestevel card.status[0] = '\0';
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel /* Get the model of this card */
03831d35f7499c87d51205817c93e9a8d42c4baestevel value = get_prop_val(find_prop(card_node, "model"));
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (value == NULL)
03831d35f7499c87d51205817c93e9a8d42c4baestevel card.model[0] = '\0';
03831d35f7499c87d51205817c93e9a8d42c4baestevel else
03831d35f7499c87d51205817c93e9a8d42c4baestevel (void) sprintf(card.model, "%s",
03831d35f7499c87d51205817c93e9a8d42c4baestevel (char *)value);
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel /*
03831d35f7499c87d51205817c93e9a8d42c4baestevel * Check if further processing is necessary to display
03831d35f7499c87d51205817c93e9a8d42c4baestevel * this card uniquely.
03831d35f7499c87d51205817c93e9a8d42c4baestevel */
03831d35f7499c87d51205817c93e9a8d42c4baestevel distinguish_identical_io_cards(name, card_node, &card);
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel /*
03831d35f7499c87d51205817c93e9a8d42c4baestevel * If we haven't figured out the frequency yet,
03831d35f7499c87d51205817c93e9a8d42c4baestevel * try and get it from the card.
03831d35f7499c87d51205817c93e9a8d42c4baestevel */
03831d35f7499c87d51205817c93e9a8d42c4baestevel value = get_prop_val(find_prop(pci, "clock-frequency"));
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (value != NULL && card.freq == -1)
03831d35f7499c87d51205817c93e9a8d42c4baestevel card.freq = ((*(int *)value) + 500000)
03831d35f7499c87d51205817c93e9a8d42c4baestevel / 1000000;
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel value = get_prop_val(find_prop(card_node,
03831d35f7499c87d51205817c93e9a8d42c4baestevel "compatible"));
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel /*
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 */
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (value != NULL) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel char *tval;
03831d35f7499c87d51205817c93e9a8d42c4baestevel int index;
03831d35f7499c87d51205817c93e9a8d42c4baestevel const int always = 1;
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel tval = (char *)value;
03831d35f7499c87d51205817c93e9a8d42c4baestevel index = 0;
03831d35f7499c87d51205817c93e9a8d42c4baestevel compat = find_prop(card_node, "compatible");
03831d35f7499c87d51205817c93e9a8d42c4baestevel while (always) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel if ((strlen(tval) + 1) ==
03831d35f7499c87d51205817c93e9a8d42c4baestevel (compat->size - index))
03831d35f7499c87d51205817c93e9a8d42c4baestevel break;
03831d35f7499c87d51205817c93e9a8d42c4baestevel index += strlen(tval) + 1;
03831d35f7499c87d51205817c93e9a8d42c4baestevel tval += strlen(tval) + 1;
03831d35f7499c87d51205817c93e9a8d42c4baestevel }
03831d35f7499c87d51205817c93e9a8d42c4baestevel value = (void *)tval;
03831d35f7499c87d51205817c93e9a8d42c4baestevel }
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (value != NULL)
03831d35f7499c87d51205817c93e9a8d42c4baestevel (void) sprintf(card.name, "%s-%s",
03831d35f7499c87d51205817c93e9a8d42c4baestevel (char *)name, (char *)value);
03831d35f7499c87d51205817c93e9a8d42c4baestevel else
03831d35f7499c87d51205817c93e9a8d42c4baestevel (void) sprintf(card.name, "%s",
03831d35f7499c87d51205817c93e9a8d42c4baestevel (char *)name);
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (card.freq != -1)
03831d35f7499c87d51205817c93e9a8d42c4baestevel card_list = insert_io_card(card_list, &card);
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel /*
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 */
03831d35f7499c87d51205817c93e9a8d42c4baestevel if ((card_node->sibling == NULL) && pci_pci_bridge) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel card_node = card_node->parent->sibling;
03831d35f7499c87d51205817c93e9a8d42c4baestevel pci_pci_bridge = 0;
03831d35f7499c87d51205817c93e9a8d42c4baestevel } else
03831d35f7499c87d51205817c93e9a8d42c4baestevel card_node = card_node->sibling;
03831d35f7499c87d51205817c93e9a8d42c4baestevel }
03831d35f7499c87d51205817c93e9a8d42c4baestevel }
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel display_io_cards(card_list);
03831d35f7499c87d51205817c93e9a8d42c4baestevel free_io_cards(card_list);
03831d35f7499c87d51205817c93e9a8d42c4baestevel}
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel/*
03831d35f7499c87d51205817c93e9a8d42c4baestevel * Print out all the io cards in the list. Also print the column
03831d35f7499c87d51205817c93e9a8d42c4baestevel * headers if told to do so.
03831d35f7499c87d51205817c93e9a8d42c4baestevel */
03831d35f7499c87d51205817c93e9a8d42c4baestevelvoid
03831d35f7499c87d51205817c93e9a8d42c4baesteveldisplay_io_cards(struct io_card *list)
03831d35f7499c87d51205817c93e9a8d42c4baestevel{
03831d35f7499c87d51205817c93e9a8d42c4baestevel static int banner = 0; /* Have we printed the column headings? */
03831d35f7499c87d51205817c93e9a8d42c4baestevel struct io_card *p;
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (list == NULL)
03831d35f7499c87d51205817c93e9a8d42c4baestevel return;
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (banner == 0) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf(" Bus Freq\n", 0);
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf("Brd Type MHz Slot "
03831d35f7499c87d51205817c93e9a8d42c4baestevel "Name "
03831d35f7499c87d51205817c93e9a8d42c4baestevel "Model", 0);
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf("\n", 0);
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf("--- ---- ---- ---- "
03831d35f7499c87d51205817c93e9a8d42c4baestevel "-------------------------------- "
03831d35f7499c87d51205817c93e9a8d42c4baestevel "----------------------", 0);
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf("\n", 0);
03831d35f7499c87d51205817c93e9a8d42c4baestevel banner = 1;
03831d35f7499c87d51205817c93e9a8d42c4baestevel }
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel for (p = list; p != NULL; p = p -> next) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf("SYS ", p->board, 0);
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf("%-4s ", p->bus_type, 0);
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf("%3d ", p->freq, 0);
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf("%3d ", p->slot, 0);
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf("%-32.32s", p->name, 0);
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (strlen(p->name) > 32)
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf("+ ", 0);
03831d35f7499c87d51205817c93e9a8d42c4baestevel else
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf(" ", 0);
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf("%-22.22s", p->model, 0);
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (strlen(p->model) > 22)
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf("+", 0);
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf("\n", 0);
03831d35f7499c87d51205817c93e9a8d42c4baestevel }
03831d35f7499c87d51205817c93e9a8d42c4baestevel}
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel/*
03831d35f7499c87d51205817c93e9a8d42c4baestevel * display_ffb
03831d35f7499c87d51205817c93e9a8d42c4baestevel * Display all FFBs on this board. It can either be in tabular format,
03831d35f7499c87d51205817c93e9a8d42c4baestevel * or a more verbose format.
03831d35f7499c87d51205817c93e9a8d42c4baestevel */
03831d35f7499c87d51205817c93e9a8d42c4baestevelvoid
03831d35f7499c87d51205817c93e9a8d42c4baesteveldisplay_ffb(Board_node *board, int table)
03831d35f7499c87d51205817c93e9a8d42c4baestevel{
03831d35f7499c87d51205817c93e9a8d42c4baestevel Prom_node *ffb;
03831d35f7499c87d51205817c93e9a8d42c4baestevel void *value;
03831d35f7499c87d51205817c93e9a8d42c4baestevel struct io_card *card_list = NULL;
03831d35f7499c87d51205817c93e9a8d42c4baestevel struct io_card card;
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (board == NULL)
03831d35f7499c87d51205817c93e9a8d42c4baestevel return;
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel /* Fill in common information */
03831d35f7499c87d51205817c93e9a8d42c4baestevel card.display = 1;
03831d35f7499c87d51205817c93e9a8d42c4baestevel card.board = board->board_num;
03831d35f7499c87d51205817c93e9a8d42c4baestevel (void) sprintf(card.bus_type, "UPA");
03831d35f7499c87d51205817c93e9a8d42c4baestevel card.freq = sys_clk;
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel for (ffb = dev_find_node(board->nodes, FFB_NAME); ffb != NULL;
03831d35f7499c87d51205817c93e9a8d42c4baestevel ffb = dev_next_node(ffb, FFB_NAME)) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (table == 1) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel /* Print out in table format */
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel /* XXX - Get the slot number (hack) */
03831d35f7499c87d51205817c93e9a8d42c4baestevel card.slot = tazmo_physical_slot(
03831d35f7499c87d51205817c93e9a8d42c4baestevel dev_find_node(board->nodes, "slot2dev"),
03831d35f7499c87d51205817c93e9a8d42c4baestevel ffb,
03831d35f7499c87d51205817c93e9a8d42c4baestevel -1,
03831d35f7499c87d51205817c93e9a8d42c4baestevel card.slot_str);
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel /* Find out if it's single or double buffered */
03831d35f7499c87d51205817c93e9a8d42c4baestevel (void) sprintf(card.name, "FFB");
03831d35f7499c87d51205817c93e9a8d42c4baestevel value = get_prop_val(find_prop(ffb, "board_type"));
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (value != NULL)
03831d35f7499c87d51205817c93e9a8d42c4baestevel if ((*(int *)value) & FFB_B_BUFF)
03831d35f7499c87d51205817c93e9a8d42c4baestevel (void) sprintf(card.name,
03831d35f7499c87d51205817c93e9a8d42c4baestevel "FFB, Double Buffered");
03831d35f7499c87d51205817c93e9a8d42c4baestevel else
03831d35f7499c87d51205817c93e9a8d42c4baestevel (void) sprintf(card.name,
03831d35f7499c87d51205817c93e9a8d42c4baestevel "FFB, Single Buffered");
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel /* Print model number */
03831d35f7499c87d51205817c93e9a8d42c4baestevel card.model[0] = '\0';
03831d35f7499c87d51205817c93e9a8d42c4baestevel value = get_prop_val(find_prop(ffb, "model"));
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (value != NULL)
03831d35f7499c87d51205817c93e9a8d42c4baestevel (void) sprintf(card.model, "%s",
03831d35f7499c87d51205817c93e9a8d42c4baestevel (char *)value);
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel card_list = insert_io_card(card_list, &card);
03831d35f7499c87d51205817c93e9a8d42c4baestevel } else {
03831d35f7499c87d51205817c93e9a8d42c4baestevel /* print in long format */
03831d35f7499c87d51205817c93e9a8d42c4baestevel char device[MAXSTRLEN];
03831d35f7499c87d51205817c93e9a8d42c4baestevel int fd = -1;
03831d35f7499c87d51205817c93e9a8d42c4baestevel struct dirent *direntp;
03831d35f7499c87d51205817c93e9a8d42c4baestevel DIR *dirp;
03831d35f7499c87d51205817c93e9a8d42c4baestevel union strap_un strap;
03831d35f7499c87d51205817c93e9a8d42c4baestevel struct ffb_sys_info fsi;
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel /* Find the device node using upa address */
03831d35f7499c87d51205817c93e9a8d42c4baestevel value = get_prop_val(find_prop(ffb, "upa-portid"));
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (value == NULL)
03831d35f7499c87d51205817c93e9a8d42c4baestevel continue;
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel (void) sprintf(device, "%s@%x", FFB_NAME,
03831d35f7499c87d51205817c93e9a8d42c4baestevel *(int *)value);
03831d35f7499c87d51205817c93e9a8d42c4baestevel if ((dirp = opendir("/devices")) == NULL)
03831d35f7499c87d51205817c93e9a8d42c4baestevel continue;
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel while ((direntp = readdir(dirp)) != NULL) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (strstr(direntp->d_name, device) != NULL) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel (void) sprintf(device, "/devices/%s",
03831d35f7499c87d51205817c93e9a8d42c4baestevel direntp->d_name);
03831d35f7499c87d51205817c93e9a8d42c4baestevel fd = open(device, O_RDWR, 0666);
03831d35f7499c87d51205817c93e9a8d42c4baestevel break;
03831d35f7499c87d51205817c93e9a8d42c4baestevel }
03831d35f7499c87d51205817c93e9a8d42c4baestevel }
03831d35f7499c87d51205817c93e9a8d42c4baestevel (void) closedir(dirp);
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (fd == -1)
03831d35f7499c87d51205817c93e9a8d42c4baestevel continue;
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (ioctl(fd, FFB_SYS_INFO, &fsi) < 0)
03831d35f7499c87d51205817c93e9a8d42c4baestevel continue;
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf("FFB Hardware Configuration:\n", 0);
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf("-----------------------------------\n", 0);
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel strap.ffb_strap_bits = fsi.ffb_strap_bits;
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf("\tBoard rev: %d\n",
03831d35f7499c87d51205817c93e9a8d42c4baestevel (int)strap.fld.board_rev, 0);
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf("\tFBC version: "
03831d35f7499c87d51205817c93e9a8d42c4baestevel "0x%x\n", fsi.fbc_version, 0);
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf("\tDAC: %s\n",
03831d35f7499c87d51205817c93e9a8d42c4baestevel fmt_manf_id(fsi.dac_version, device), 0);
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf("\t3DRAM: %s\n",
03831d35f7499c87d51205817c93e9a8d42c4baestevel fmt_manf_id(fsi.fbram_version, device), 0);
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf("\n", 0);
03831d35f7499c87d51205817c93e9a8d42c4baestevel }
03831d35f7499c87d51205817c93e9a8d42c4baestevel }
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel display_io_cards(card_list);
03831d35f7499c87d51205817c93e9a8d42c4baestevel free_io_cards(card_list);
03831d35f7499c87d51205817c93e9a8d42c4baestevel}
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel/*
03831d35f7499c87d51205817c93e9a8d42c4baestevel * This module does the reading and interpreting of javelin system
03831d35f7499c87d51205817c93e9a8d42c4baestevel * kstats. These kstats are created by the environ drivers.
03831d35f7499c87d51205817c93e9a8d42c4baestevel */
03831d35f7499c87d51205817c93e9a8d42c4baestevelvoid
03831d35f7499c87d51205817c93e9a8d42c4baestevelread_platform_kstats(Sys_tree *tree, struct system_kstat_data *sys_kstat,
03831d35f7499c87d51205817c93e9a8d42c4baestevel struct bd_kstat_data *bdp, struct envctrl_kstat_data *ep)
03831d35f7499c87d51205817c93e9a8d42c4baestevel{
03831d35f7499c87d51205817c93e9a8d42c4baestevel kstat_ctl_t *kc;
03831d35f7499c87d51205817c93e9a8d42c4baestevel struct envctrltwo_kstat_data *ecp;
03831d35f7499c87d51205817c93e9a8d42c4baestevel kstat_t *ksp;
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel if ((kc = kstat_open()) == NULL) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel return;
03831d35f7499c87d51205817c93e9a8d42c4baestevel }
03831d35f7499c87d51205817c93e9a8d42c4baestevel#ifdef lint
03831d35f7499c87d51205817c93e9a8d42c4baestevel tree = tree;
03831d35f7499c87d51205817c93e9a8d42c4baestevel bdp = bdp;
03831d35f7499c87d51205817c93e9a8d42c4baestevel ep = ep;
03831d35f7499c87d51205817c93e9a8d42c4baestevel#endif
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel /* read the envctrltwo kstats */
03831d35f7499c87d51205817c93e9a8d42c4baestevel ecp = &sys_kstat->envc_data;
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel /* Read the power supply kstats */
03831d35f7499c87d51205817c93e9a8d42c4baestevel ksp = kstat_lookup(kc, ENVCTRL_MODULE_NAME, INSTANCE_0,
03831d35f7499c87d51205817c93e9a8d42c4baestevel ENVCTRL_KSTAT_PSNAME2);
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (ksp != NULL && (kstat_read(kc, ksp, NULL) != -1)) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel (void) memcpy(ecp->ps_kstats, ksp->ks_data,
03831d35f7499c87d51205817c93e9a8d42c4baestevel ksp->ks_ndata * sizeof (envctrl_ps2_t));
03831d35f7499c87d51205817c93e9a8d42c4baestevel } else {
03831d35f7499c87d51205817c93e9a8d42c4baestevel sys_kstat->envctrltwo_kstat_ok = B_FALSE;
03831d35f7499c87d51205817c93e9a8d42c4baestevel return;
03831d35f7499c87d51205817c93e9a8d42c4baestevel }
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel ecp->num_ps_kstats = ksp->ks_ndata;
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel /* Read the fan status kstats */
03831d35f7499c87d51205817c93e9a8d42c4baestevel ksp = kstat_lookup(kc, ENVCTRL_MODULE_NAME, INSTANCE_0,
03831d35f7499c87d51205817c93e9a8d42c4baestevel ENVCTRL_KSTAT_FANSTAT);
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (ksp != NULL && (kstat_read(kc, ksp, NULL) != -1)) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel (void) memcpy(ecp->fan_kstats, ksp->ks_data,
03831d35f7499c87d51205817c93e9a8d42c4baestevel ksp->ks_ndata * sizeof (envctrl_fan_t));
03831d35f7499c87d51205817c93e9a8d42c4baestevel } else {
03831d35f7499c87d51205817c93e9a8d42c4baestevel sys_kstat->envctrltwo_kstat_ok = B_FALSE;
03831d35f7499c87d51205817c93e9a8d42c4baestevel return;
03831d35f7499c87d51205817c93e9a8d42c4baestevel }
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel ecp->num_fan_kstats = ksp->ks_ndata;
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel /* Read the enclosure kstats */
03831d35f7499c87d51205817c93e9a8d42c4baestevel ksp = kstat_lookup(kc, ENVCTRL_MODULE_NAME, INSTANCE_0,
03831d35f7499c87d51205817c93e9a8d42c4baestevel ENVCTRL_KSTAT_ENCL);
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (ksp != NULL && (kstat_read(kc, ksp, NULL) != -1)) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel (void) memcpy(ecp->encl_kstats, ksp->ks_data,
03831d35f7499c87d51205817c93e9a8d42c4baestevel ksp->ks_ndata * sizeof (envctrl_encl_t));
03831d35f7499c87d51205817c93e9a8d42c4baestevel } else {
03831d35f7499c87d51205817c93e9a8d42c4baestevel sys_kstat->envctrltwo_kstat_ok = B_FALSE;
03831d35f7499c87d51205817c93e9a8d42c4baestevel return;
03831d35f7499c87d51205817c93e9a8d42c4baestevel }
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel ecp->num_encl_kstats = ksp->ks_ndata;
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel /* Read the temperature kstats */
03831d35f7499c87d51205817c93e9a8d42c4baestevel ksp = kstat_lookup(kc, ENVCTRL_MODULE_NAME, INSTANCE_0,
03831d35f7499c87d51205817c93e9a8d42c4baestevel ENVCTRL_KSTAT_TEMPERATURE);
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (ksp != NULL && (kstat_read(kc, ksp, NULL) != -1)) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel (void) memcpy(ecp->temp_kstats, ksp->ks_data,
03831d35f7499c87d51205817c93e9a8d42c4baestevel ksp->ks_ndata * sizeof (envctrl_temp_t));
03831d35f7499c87d51205817c93e9a8d42c4baestevel } else {
03831d35f7499c87d51205817c93e9a8d42c4baestevel sys_kstat->envctrltwo_kstat_ok = B_FALSE;
03831d35f7499c87d51205817c93e9a8d42c4baestevel return;
03831d35f7499c87d51205817c93e9a8d42c4baestevel }
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel ecp->num_temp_kstats = ksp->ks_ndata;
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel /* Read the disk kstats */
03831d35f7499c87d51205817c93e9a8d42c4baestevel ksp = kstat_lookup(kc, ENVCTRL_MODULE_NAME, INSTANCE_0,
03831d35f7499c87d51205817c93e9a8d42c4baestevel ENVCTRL_KSTAT_DISK);
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (ksp != NULL && (kstat_read(kc, ksp, NULL) != -1)) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel (void) memcpy(ecp->disk_kstats, ksp->ks_data,
03831d35f7499c87d51205817c93e9a8d42c4baestevel ksp->ks_ndata * sizeof (envctrl_disk_t));
03831d35f7499c87d51205817c93e9a8d42c4baestevel } else {
03831d35f7499c87d51205817c93e9a8d42c4baestevel sys_kstat->envctrltwo_kstat_ok = B_FALSE;
03831d35f7499c87d51205817c93e9a8d42c4baestevel return;
03831d35f7499c87d51205817c93e9a8d42c4baestevel }
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel ecp->num_disk_kstats = ksp->ks_ndata;
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel sys_kstat->envctrltwo_kstat_ok = 1;
03831d35f7499c87d51205817c93e9a8d42c4baestevel return;
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel}
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel/*
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 */
03831d35f7499c87d51205817c93e9a8d42c4baestevelProm_node *
03831d35f7499c87d51205817c93e9a8d42c4baestevelwalk(Sys_tree *tree, Prom_node *root, int id)
03831d35f7499c87d51205817c93e9a8d42c4baestevel{
03831d35f7499c87d51205817c93e9a8d42c4baestevel register int curnode;
03831d35f7499c87d51205817c93e9a8d42c4baestevel Prom_node *pnode;
03831d35f7499c87d51205817c93e9a8d42c4baestevel char *name;
03831d35f7499c87d51205817c93e9a8d42c4baestevel char *type;
03831d35f7499c87d51205817c93e9a8d42c4baestevel char *model;
03831d35f7499c87d51205817c93e9a8d42c4baestevel int board_node = 0;
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel /* allocate a node for this level */
03831d35f7499c87d51205817c93e9a8d42c4baestevel if ((pnode = (Prom_node *) malloc(sizeof (struct prom_node))) ==
03831d35f7499c87d51205817c93e9a8d42c4baestevel NULL) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel perror("malloc");
03831d35f7499c87d51205817c93e9a8d42c4baestevel exit(2); /* program errors cause exit 2 */
03831d35f7499c87d51205817c93e9a8d42c4baestevel }
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel /* assign parent Prom_node */
03831d35f7499c87d51205817c93e9a8d42c4baestevel pnode->parent = root;
03831d35f7499c87d51205817c93e9a8d42c4baestevel pnode->sibling = NULL;
03831d35f7499c87d51205817c93e9a8d42c4baestevel pnode->child = NULL;
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel /* read properties for this node */
03831d35f7499c87d51205817c93e9a8d42c4baestevel dump_node(pnode);
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel /*
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 *
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 *
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 */
03831d35f7499c87d51205817c93e9a8d42c4baestevel name = get_node_name(pnode);
03831d35f7499c87d51205817c93e9a8d42c4baestevel type = get_node_type(pnode);
03831d35f7499c87d51205817c93e9a8d42c4baestevel model = (char *)get_prop_val(find_prop(pnode, "model"));
03831d35f7499c87d51205817c93e9a8d42c4baestevel#ifdef DEBUG
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (name != NULL)
03831d35f7499c87d51205817c93e9a8d42c4baestevel printf("name=%s ", name);
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (type != NULL)
03831d35f7499c87d51205817c93e9a8d42c4baestevel printf("type=%s ", type);
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (model != NULL)
03831d35f7499c87d51205817c93e9a8d42c4baestevel printf("model=%s", model);
03831d35f7499c87d51205817c93e9a8d42c4baestevel printf("\n");
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (model == NULL)
03831d35f7499c87d51205817c93e9a8d42c4baestevel model = "";
03831d35f7499c87d51205817c93e9a8d42c4baestevel#endif
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (type == NULL)
03831d35f7499c87d51205817c93e9a8d42c4baestevel type = "";
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (name != NULL) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (has_board_num(pnode)) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel add_node(tree, pnode);
03831d35f7499c87d51205817c93e9a8d42c4baestevel board_node = 1;
03831d35f7499c87d51205817c93e9a8d42c4baestevel#ifdef DEBUG
03831d35f7499c87d51205817c93e9a8d42c4baestevel printf("ADDED BOARD name=%s type=%s model=%s\n",
03831d35f7499c87d51205817c93e9a8d42c4baestevel name, type, model);
03831d35f7499c87d51205817c93e9a8d42c4baestevel#endif
03831d35f7499c87d51205817c93e9a8d42c4baestevel } else if ((strcmp(name, FFB_NAME) == 0) ||
03831d35f7499c87d51205817c93e9a8d42c4baestevel (strcmp(type, "cpu") == 0) ||
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel ((strcmp(name, "pci") == 0) && (model != NULL) &&
03831d35f7499c87d51205817c93e9a8d42c4baestevel (strcmp(model, "SUNW,psycho") == 0)) ||
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel ((strcmp(name, "pci") == 0) && (model != NULL) &&
03831d35f7499c87d51205817c93e9a8d42c4baestevel (strcmp(model, "SUNW,sabre") == 0)) ||
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel (strcmp(name, "counter-timer") == 0) ||
03831d35f7499c87d51205817c93e9a8d42c4baestevel (strcmp(name, "sbus") == 0) ||
03831d35f7499c87d51205817c93e9a8d42c4baestevel (strcmp(name, "memory") == 0) ||
03831d35f7499c87d51205817c93e9a8d42c4baestevel (strcmp(name, "mc") == 0) ||
03831d35f7499c87d51205817c93e9a8d42c4baestevel (strcmp(name, "associations") == 0)) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel add_node(tree, pnode);
03831d35f7499c87d51205817c93e9a8d42c4baestevel board_node = 1;
03831d35f7499c87d51205817c93e9a8d42c4baestevel#ifdef DEBUG
03831d35f7499c87d51205817c93e9a8d42c4baestevel printf("ADDED BOARD name=%s type=%s model=%s\n",
03831d35f7499c87d51205817c93e9a8d42c4baestevel name, type, model);
03831d35f7499c87d51205817c93e9a8d42c4baestevel#endif
03831d35f7499c87d51205817c93e9a8d42c4baestevel }
03831d35f7499c87d51205817c93e9a8d42c4baestevel#ifdef DEBUG
03831d35f7499c87d51205817c93e9a8d42c4baestevel else
03831d35f7499c87d51205817c93e9a8d42c4baestevel printf("node not added: name=%s type=%s\n", name, type);
03831d35f7499c87d51205817c93e9a8d42c4baestevel#endif
03831d35f7499c87d51205817c93e9a8d42c4baestevel }
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (curnode = child(id)) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel pnode->child = walk(tree, pnode, curnode);
03831d35f7499c87d51205817c93e9a8d42c4baestevel }
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (curnode = next(id)) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (board_node) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel return (walk(tree, root, curnode));
03831d35f7499c87d51205817c93e9a8d42c4baestevel } else {
03831d35f7499c87d51205817c93e9a8d42c4baestevel pnode->sibling = walk(tree, root, curnode);
03831d35f7499c87d51205817c93e9a8d42c4baestevel }
03831d35f7499c87d51205817c93e9a8d42c4baestevel }
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (board_node) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel return (NULL);
03831d35f7499c87d51205817c93e9a8d42c4baestevel } else {
03831d35f7499c87d51205817c93e9a8d42c4baestevel return (pnode);
03831d35f7499c87d51205817c93e9a8d42c4baestevel }
03831d35f7499c87d51205817c93e9a8d42c4baestevel}
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel/*
03831d35f7499c87d51205817c93e9a8d42c4baestevel * local functions
03831d35f7499c87d51205817c93e9a8d42c4baestevel */
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel/*
03831d35f7499c87d51205817c93e9a8d42c4baestevel * disp_envc_status
03831d35f7499c87d51205817c93e9a8d42c4baestevel *
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.
03831d35f7499c87d51205817c93e9a8d42c4baestevel */
03831d35f7499c87d51205817c93e9a8d42c4baestevelstatic int
03831d35f7499c87d51205817c93e9a8d42c4baesteveldisp_envc_status(struct system_kstat_data *sys_kstats)
03831d35f7499c87d51205817c93e9a8d42c4baestevel{
03831d35f7499c87d51205817c93e9a8d42c4baestevel struct envctrltwo_kstat_data *ecp;
03831d35f7499c87d51205817c93e9a8d42c4baestevel envctrl_ps2_t ps_ks;
03831d35f7499c87d51205817c93e9a8d42c4baestevel envctrl_fan_t fans_ks;
03831d35f7499c87d51205817c93e9a8d42c4baestevel envctrl_encl_t encl_ks;
03831d35f7499c87d51205817c93e9a8d42c4baestevel envctrl_temp_t temp_ks;
03831d35f7499c87d51205817c93e9a8d42c4baestevel envctrl_disk_t disk_ks;
03831d35f7499c87d51205817c93e9a8d42c4baestevel char state[48];
03831d35f7499c87d51205817c93e9a8d42c4baestevel uchar_t val, fsp_value;
03831d35f7499c87d51205817c93e9a8d42c4baestevel uchar_t disk_pr, disk_fl;
03831d35f7499c87d51205817c93e9a8d42c4baestevel int i;
03831d35f7499c87d51205817c93e9a8d42c4baestevel int exit_code = 0;
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (sys_kstats->envctrltwo_kstat_ok == 0) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf("\n", 0);
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 log_printf("\n", 0);
03831d35f7499c87d51205817c93e9a8d42c4baestevel return (1);
03831d35f7499c87d51205817c93e9a8d42c4baestevel }
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel ecp = &sys_kstats->envc_data;
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf("\n", 0);
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf("=========================", 0);
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf(dgettext(TEXT_DOMAIN, " Environmental Status "), 0);
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf("=========================", 0);
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf("\n", 0);
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf("\n", 0);
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf("System Temperatures (Celsius):\n", 0);
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf("------------------------------\n", 0);
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel for (i = 0; i < ecp->num_temp_kstats; i++) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel temp_ks = ecp->temp_kstats[i];
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf("%10s %d", temp_ks.label, temp_ks.value);
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (temp_ks.value >= temp_ks.shutdown_threshold) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf(" CRITICAL\n", 0);
03831d35f7499c87d51205817c93e9a8d42c4baestevel exit_code = 1;
03831d35f7499c87d51205817c93e9a8d42c4baestevel } else if (temp_ks.value >= temp_ks.warning_threshold) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf(" WARNING\n", 0);
03831d35f7499c87d51205817c93e9a8d42c4baestevel exit_code = 1;
03831d35f7499c87d51205817c93e9a8d42c4baestevel } else if (temp_ks.value < temp_ks.min) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf(" WARNING\n", 0);
03831d35f7499c87d51205817c93e9a8d42c4baestevel exit_code = 1;
03831d35f7499c87d51205817c93e9a8d42c4baestevel } else
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf("\n", 0);
03831d35f7499c87d51205817c93e9a8d42c4baestevel }
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf("\n", 0);
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf("=================================\n", 0);
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf("\n", 0);
03831d35f7499c87d51205817c93e9a8d42c4baestevel encl_ks = ecp->encl_kstats[0];
03831d35f7499c87d51205817c93e9a8d42c4baestevel val = encl_ks.value & ENVCTRL_UE250_FSP_KEYMASK;
03831d35f7499c87d51205817c93e9a8d42c4baestevel fsp_value = encl_ks.value;
03831d35f7499c87d51205817c93e9a8d42c4baestevel switch (val) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel case ENVCTRL_UE250_FSP_KEYOFF:
03831d35f7499c87d51205817c93e9a8d42c4baestevel (void) sprintf(state, "%s", "Off");
03831d35f7499c87d51205817c93e9a8d42c4baestevel break;
03831d35f7499c87d51205817c93e9a8d42c4baestevel case ENVCTRL_UE250_FSP_KEYON:
03831d35f7499c87d51205817c93e9a8d42c4baestevel (void) sprintf(state, "%s", "On");
03831d35f7499c87d51205817c93e9a8d42c4baestevel break;
03831d35f7499c87d51205817c93e9a8d42c4baestevel case ENVCTRL_UE250_FSP_KEYDIAG:
03831d35f7499c87d51205817c93e9a8d42c4baestevel (void) sprintf(state, "%s", "Diagnostic");
03831d35f7499c87d51205817c93e9a8d42c4baestevel break;
03831d35f7499c87d51205817c93e9a8d42c4baestevel case ENVCTRL_UE250_FSP_KEYLOCKED:
03831d35f7499c87d51205817c93e9a8d42c4baestevel (void) sprintf(state, "%s", "Secure");
03831d35f7499c87d51205817c93e9a8d42c4baestevel break;
03831d35f7499c87d51205817c93e9a8d42c4baestevel default:
03831d35f7499c87d51205817c93e9a8d42c4baestevel (void) sprintf(state, "%s", "Broken!");
03831d35f7499c87d51205817c93e9a8d42c4baestevel exit_code = 1;
03831d35f7499c87d51205817c93e9a8d42c4baestevel break;
03831d35f7499c87d51205817c93e9a8d42c4baestevel }
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf("Front Status Panel:\n", 0);
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf("-------------------\n", 0);
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf("Keyswitch position is in %s mode.\n", state);
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf("\n", 0);
03831d35f7499c87d51205817c93e9a8d42c4baestevel val = fsp_value & (ENVCTRL_UE250_FSP_DISK_ERR |
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 log_printf(" [%3s] [ ON] \n",
03831d35f7499c87d51205817c93e9a8d42c4baestevel val & ENVCTRL_UE250_FSP_DISK_ERR ? "ON" : "OFF");
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf(" POWER SUPPLY ERROR ACTIVITY \n", 0);
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf(" [%3s] [%3s] \n",
03831d35f7499c87d51205817c93e9a8d42c4baestevel val & ENVCTRL_UE250_FSP_PS_ERR ? "ON" : "OFF",
03831d35f7499c87d51205817c93e9a8d42c4baestevel val & ENVCTRL_UE250_FSP_ACTIVE ? "ON" : "OFF");
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf(" GENERAL ERROR THERMAL ERROR \n", 0);
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf(" [%3s] [%3s] \n",
03831d35f7499c87d51205817c93e9a8d42c4baestevel val & ENVCTRL_UE250_FSP_GEN_ERR ? "ON" : "OFF",
03831d35f7499c87d51205817c93e9a8d42c4baestevel val & ENVCTRL_UE250_FSP_TEMP_ERR ? "ON" : "OFF");
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 exit_code = 1;
03831d35f7499c87d51205817c93e9a8d42c4baestevel }
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf("\n", 0);
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf("=================================\n", 0);
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf("\n", 0);
03831d35f7499c87d51205817c93e9a8d42c4baestevel disk_pr = disk_fl = 0;
03831d35f7499c87d51205817c93e9a8d42c4baestevel for (i = 0; i < ecp->num_disk_kstats; i++) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel disk_ks = ecp->disk_kstats[i];
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (disk_ks.slot == -1)
03831d35f7499c87d51205817c93e9a8d42c4baestevel continue;
03831d35f7499c87d51205817c93e9a8d42c4baestevel disk_pr |= 1 << disk_ks.slot;
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (disk_ks.disk_ok == 0)
03831d35f7499c87d51205817c93e9a8d42c4baestevel disk_fl |= 1 << disk_ks.slot;
03831d35f7499c87d51205817c93e9a8d42c4baestevel }
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf("Disk LED Status: OK = GREEN ERROR = YELLOW\n", 0);
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf(" DISK 5: %7s DISK 3: %7s DISK 1: %7s\n",
03831d35f7499c87d51205817c93e9a8d42c4baestevel disk_pr & ENVCTRL_DISK_5 ?
03831d35f7499c87d51205817c93e9a8d42c4baestevel disk_fl & ENVCTRL_DISK_5 ? "[ERROR]" : "[OK]" : "[EMPTY]",
03831d35f7499c87d51205817c93e9a8d42c4baestevel disk_pr & ENVCTRL_DISK_3 ?
03831d35f7499c87d51205817c93e9a8d42c4baestevel disk_fl & ENVCTRL_DISK_3 ? "[ERROR]" : "[OK]" : "[EMPTY]",
03831d35f7499c87d51205817c93e9a8d42c4baestevel disk_pr & ENVCTRL_DISK_1 ?
03831d35f7499c87d51205817c93e9a8d42c4baestevel disk_fl & ENVCTRL_DISK_1 ? "[ERROR]" : "[OK]" : "[EMPTY]");
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf(" DISK 4: %7s DISK 2: %7s DISK 0: %7s\n",
03831d35f7499c87d51205817c93e9a8d42c4baestevel disk_pr & ENVCTRL_DISK_4 ?
03831d35f7499c87d51205817c93e9a8d42c4baestevel disk_fl & ENVCTRL_DISK_4 ? "[ERROR]" : "[OK]" : "[EMPTY]",
03831d35f7499c87d51205817c93e9a8d42c4baestevel disk_pr & ENVCTRL_DISK_2 ?
03831d35f7499c87d51205817c93e9a8d42c4baestevel disk_fl & ENVCTRL_DISK_2 ? "[ERROR]" : "[OK]" : "[EMPTY]",
03831d35f7499c87d51205817c93e9a8d42c4baestevel disk_pr & ENVCTRL_DISK_0 ?
03831d35f7499c87d51205817c93e9a8d42c4baestevel disk_fl & ENVCTRL_DISK_0 ? "[ERROR]" : "[OK]" : "[EMPTY]");
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf("\n", 0);
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf("=================================\n", 0);
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf("\n", 0);
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf("Fan Bank :\n", 0);
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf("----------\n", 0);
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf("\n", 0);
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel fans_ks = ecp->fan_kstats[0];
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf("Bank Speed Status\n", 0);
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf(" (0-255) \n", 0);
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf("---- ----- ------\n", 0);
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (fans_ks.fans_ok == B_TRUE)
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf(" SYS %5d OK\n", fans_ks.fanspeed);
03831d35f7499c87d51205817c93e9a8d42c4baestevel else if (fans_ks.fans_ok != B_TRUE) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf(" SYS %5d FAILED\n", fans_ks.fanspeed);
03831d35f7499c87d51205817c93e9a8d42c4baestevel exit_code = 1;
03831d35f7499c87d51205817c93e9a8d42c4baestevel }
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf("\n", 0);
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf("=================================\n", 0);
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf("\n", 0);
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf("Power Supplies:\n", 0);
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf("---------------\n", 0);
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf("\n", 0);
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf("Supply Status\n", 0);
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf("------ ------\n", 0);
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel for (i = 0; i < ecp->num_ps_kstats; i++) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel ps_ks = ecp->ps_kstats[i];
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (ps_ks.ps_ok == B_TRUE)
03831d35f7499c87d51205817c93e9a8d42c4baestevel (void) sprintf(state, "%s", " OK ");
03831d35f7499c87d51205817c93e9a8d42c4baestevel else if (ps_ks.ps_ok != B_TRUE) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel (void) sprintf(state, "%s", "FAILED: DC "
03831d35f7499c87d51205817c93e9a8d42c4baestevel "Power Failure");
03831d35f7499c87d51205817c93e9a8d42c4baestevel exit_code = 1;
03831d35f7499c87d51205817c93e9a8d42c4baestevel }
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf(" %2d %s\n", ps_ks.slot, state);
03831d35f7499c87d51205817c93e9a8d42c4baestevel }
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel return (exit_code);
03831d35f7499c87d51205817c93e9a8d42c4baestevel}
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevelvoid
03831d35f7499c87d51205817c93e9a8d42c4baesteveltazjav_disp_asic_revs(Sys_tree *tree)
03831d35f7499c87d51205817c93e9a8d42c4baestevel{
03831d35f7499c87d51205817c93e9a8d42c4baestevel Board_node *bnode;
03831d35f7499c87d51205817c93e9a8d42c4baestevel Prom_node *pnode;
03831d35f7499c87d51205817c93e9a8d42c4baestevel char *name;
03831d35f7499c87d51205817c93e9a8d42c4baestevel int *version;
03831d35f7499c87d51205817c93e9a8d42c4baestevel char *model;
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel /* Print the header */
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf("\n", 0);
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf("=========================", 0);
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf(" HW Revisions ", 0);
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf("=========================", 0);
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf("\n", 0);
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf("\n", 0);
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel bnode = tree->bd_list;
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf("ASIC Revisions:\n", 0);
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf("---------------\n", 0);
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel /* Find sysio and print rev */
03831d35f7499c87d51205817c93e9a8d42c4baestevel for (pnode = dev_find_node(bnode->nodes, "sbus"); pnode != NULL;
03831d35f7499c87d51205817c93e9a8d42c4baestevel pnode = dev_next_node(pnode, "sbus")) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel version = (int *)get_prop_val(find_prop(pnode, "version#"));
03831d35f7499c87d51205817c93e9a8d42c4baestevel name = get_prop_val(find_prop(pnode, "name"));
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel if ((version != NULL) && (name != NULL)) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf("SBus: %s Rev %d\n", name, *version, 0);
03831d35f7499c87d51205817c93e9a8d42c4baestevel }
03831d35f7499c87d51205817c93e9a8d42c4baestevel }
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel /* Find Psycho and print rev */
03831d35f7499c87d51205817c93e9a8d42c4baestevel for (pnode = dev_find_node(bnode->nodes, "pci"); pnode != NULL;
03831d35f7499c87d51205817c93e9a8d42c4baestevel pnode = dev_next_node(pnode, "pci")) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel Prom_node *parsib = pnode->parent->sibling;
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (find_prop(pnode, "upa-portid") == NULL) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel if ((parsib != NULL) &&
03831d35f7499c87d51205817c93e9a8d42c4baestevel (strcmp(get_prop_val(
03831d35f7499c87d51205817c93e9a8d42c4baestevel find_prop(parsib, "name")),
03831d35f7499c87d51205817c93e9a8d42c4baestevel PCI_NAME) == 0))
03831d35f7499c87d51205817c93e9a8d42c4baestevel pnode = parsib;
03831d35f7499c87d51205817c93e9a8d42c4baestevel else {
03831d35f7499c87d51205817c93e9a8d42c4baestevel pnode = parsib;
03831d35f7499c87d51205817c93e9a8d42c4baestevel continue;
03831d35f7499c87d51205817c93e9a8d42c4baestevel }
03831d35f7499c87d51205817c93e9a8d42c4baestevel }
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel version = (int *)get_prop_val(find_prop(pnode, "version#"));
03831d35f7499c87d51205817c93e9a8d42c4baestevel name = get_prop_val(find_prop(pnode, "name"));
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel if ((version != NULL) && (name != NULL))
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (get_pci_bus(pnode) == 0)
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf("STP2223BGA: Rev %d\n", *version, 0);
03831d35f7499c87d51205817c93e9a8d42c4baestevel }
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel /* Find Cheerio and print rev */
03831d35f7499c87d51205817c93e9a8d42c4baestevel for (pnode = dev_find_node(bnode->nodes, "ebus"); pnode != NULL;
03831d35f7499c87d51205817c93e9a8d42c4baestevel pnode = dev_next_node(pnode, "ebus")) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel version = (int *)get_prop_val(find_prop(pnode, "revision-id"));
03831d35f7499c87d51205817c93e9a8d42c4baestevel name = get_prop_val(find_prop(pnode, "name"));
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel if ((version != NULL) && (name != NULL))
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf("STP2003QFP: Rev %d\n", *version, 0);
03831d35f7499c87d51205817c93e9a8d42c4baestevel }
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel /* Find System Controller and print rev */
03831d35f7499c87d51205817c93e9a8d42c4baestevel for (pnode = dev_find_node(bnode->nodes, "sc"); pnode != NULL;
03831d35f7499c87d51205817c93e9a8d42c4baestevel pnode = dev_next_node(pnode, "sc")) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel version = (int *)get_prop_val(find_prop(pnode, "version#"));
03831d35f7499c87d51205817c93e9a8d42c4baestevel model = (char *)get_prop_val(find_prop(pnode, "model"));
03831d35f7499c87d51205817c93e9a8d42c4baestevel name = get_prop_val(find_prop(pnode, "name"));
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel if ((version != NULL) && (name != NULL)) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel if ((strcmp(model, "SUNW,sc-marvin") == 0))
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf("STP2205BGA: Rev %d\n", *version, 0);
03831d35f7499c87d51205817c93e9a8d42c4baestevel }
03831d35f7499c87d51205817c93e9a8d42c4baestevel }
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel /* Find the FEPS and print rev */
03831d35f7499c87d51205817c93e9a8d42c4baestevel for (pnode = dev_find_node(bnode->nodes, "SUNW,hme"); pnode != NULL;
03831d35f7499c87d51205817c93e9a8d42c4baestevel pnode = dev_next_node(pnode, "SUNW,hme")) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel version = (int *)get_prop_val(find_prop(pnode, "hm-rev"));
03831d35f7499c87d51205817c93e9a8d42c4baestevel name = get_prop_val(find_prop(pnode, "name"));
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel if ((version != NULL) && (name != NULL)) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf("FEPS: %s Rev ", name);
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (*version == 0xa0) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf("2.0\n", 0);
03831d35f7499c87d51205817c93e9a8d42c4baestevel } else if (*version == 0x20) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf("2.1\n", 0);
03831d35f7499c87d51205817c93e9a8d42c4baestevel } else {
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf("%x\n", *version, 0);
03831d35f7499c87d51205817c93e9a8d42c4baestevel }
03831d35f7499c87d51205817c93e9a8d42c4baestevel }
03831d35f7499c87d51205817c93e9a8d42c4baestevel }
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf("\n", 0);
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (dev_find_node(bnode->nodes, FFB_NAME) != NULL) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel display_ffb(bnode, 0);
03831d35f7499c87d51205817c93e9a8d42c4baestevel }
03831d35f7499c87d51205817c93e9a8d42c4baestevel}
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel/*
03831d35f7499c87d51205817c93e9a8d42c4baestevel * Determine the physical PCI slot based on which Psycho is the parent
03831d35f7499c87d51205817c93e9a8d42c4baestevel * of the PCI card.
03831d35f7499c87d51205817c93e9a8d42c4baestevel */
03831d35f7499c87d51205817c93e9a8d42c4baestevelstatic int
03831d35f7499c87d51205817c93e9a8d42c4baesteveltazmo_physical_slot(Prom_node *slotd, Prom_node *parent, int device, char *str)
03831d35f7499c87d51205817c93e9a8d42c4baestevel{
03831d35f7499c87d51205817c93e9a8d42c4baestevel int *upa_id = NULL;
03831d35f7499c87d51205817c93e9a8d42c4baestevel int *reg = NULL;
03831d35f7499c87d51205817c93e9a8d42c4baestevel int offset;
03831d35f7499c87d51205817c93e9a8d42c4baestevel char controller[MAXSTRLEN];
03831d35f7499c87d51205817c93e9a8d42c4baestevel char *name;
03831d35f7499c87d51205817c93e9a8d42c4baestevel Prop *prop;
03831d35f7499c87d51205817c93e9a8d42c4baestevel char *devpath_p;
03831d35f7499c87d51205817c93e9a8d42c4baestevel char slotx[16] = "";
03831d35f7499c87d51205817c93e9a8d42c4baestevel int *slot_names_mask;
03831d35f7499c87d51205817c93e9a8d42c4baestevel char *slot_names;
03831d35f7499c87d51205817c93e9a8d42c4baestevel int shift = 0;
03831d35f7499c87d51205817c93e9a8d42c4baestevel int slot;
03831d35f7499c87d51205817c93e9a8d42c4baestevel int slots, start_slot;
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel /*
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 */
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (slotd != NULL) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel (void) strcpy(str, "");
03831d35f7499c87d51205817c93e9a8d42c4baestevel if ((prop = find_prop(parent, "upa-portid")) != NULL)
03831d35f7499c87d51205817c93e9a8d42c4baestevel upa_id = (int *)(get_prop_val(prop));
03831d35f7499c87d51205817c93e9a8d42c4baestevel if ((prop = find_prop(parent, "reg")) != NULL)
03831d35f7499c87d51205817c93e9a8d42c4baestevel reg = (int *)(get_prop_val(prop));
03831d35f7499c87d51205817c93e9a8d42c4baestevel if ((prop = find_prop(parent, "name")) != NULL)
03831d35f7499c87d51205817c93e9a8d42c4baestevel name = (char *)(get_prop_val(prop));
03831d35f7499c87d51205817c93e9a8d42c4baestevel if ((upa_id == NULL) || (reg == NULL)) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel return (-1);
03831d35f7499c87d51205817c93e9a8d42c4baestevel }
03831d35f7499c87d51205817c93e9a8d42c4baestevel offset = reg[1];
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (strcmp(name, "pci") == 0) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel (void) sprintf(controller, "/pci@%x,%x/*@%x,*",
03831d35f7499c87d51205817c93e9a8d42c4baestevel *upa_id, offset, device);
03831d35f7499c87d51205817c93e9a8d42c4baestevel slots = 20;
03831d35f7499c87d51205817c93e9a8d42c4baestevel } else if (strcmp(name, "SUNW,ffb") == 0) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel (void) sprintf(controller, "/*@%x,0", *upa_id);
03831d35f7499c87d51205817c93e9a8d42c4baestevel slots = 2;
03831d35f7499c87d51205817c93e9a8d42c4baestevel }
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel /*
03831d35f7499c87d51205817c93e9a8d42c4baestevel * Javelin and future projects will use 0 based
03831d35f7499c87d51205817c93e9a8d42c4baestevel * numbering for slots.
03831d35f7499c87d51205817c93e9a8d42c4baestevel */
03831d35f7499c87d51205817c93e9a8d42c4baestevel start_slot = 0;
03831d35f7499c87d51205817c93e9a8d42c4baestevel slots = slots - 1;
03831d35f7499c87d51205817c93e9a8d42c4baestevel for (slot = start_slot; slot <= slots; slot++) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (strcmp(name, "pci") == 0)
03831d35f7499c87d51205817c93e9a8d42c4baestevel (void) sprintf(slotx, "pci-slot#%d", slot);
03831d35f7499c87d51205817c93e9a8d42c4baestevel else if (strcmp(name, "SUNW,ffb") == 0)
03831d35f7499c87d51205817c93e9a8d42c4baestevel (void) sprintf(slotx, "graphics#%d", slot);
03831d35f7499c87d51205817c93e9a8d42c4baestevel if ((prop = find_prop(slotd, slotx)) != NULL)
03831d35f7499c87d51205817c93e9a8d42c4baestevel if ((devpath_p = (char *)(get_prop_val
03831d35f7499c87d51205817c93e9a8d42c4baestevel (prop))) != NULL)
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (strcmp(devpath_p, controller) ==
03831d35f7499c87d51205817c93e9a8d42c4baestevel NULL)
03831d35f7499c87d51205817c93e9a8d42c4baestevel return (slot);
03831d35f7499c87d51205817c93e9a8d42c4baestevel }
03831d35f7499c87d51205817c93e9a8d42c4baestevel return (-1);
03831d35f7499c87d51205817c93e9a8d42c4baestevel }
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel /*
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 */
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel prop = find_prop(parent, "slot-names");
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (prop == NULL) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel (void) strcpy(str, "");
03831d35f7499c87d51205817c93e9a8d42c4baestevel return (-1);
03831d35f7499c87d51205817c93e9a8d42c4baestevel }
03831d35f7499c87d51205817c93e9a8d42c4baestevel slot_names_mask = (int *)(get_prop_val(prop));
03831d35f7499c87d51205817c93e9a8d42c4baestevel slot_names = (char *)slot_names_mask;
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel slot = 1;
03831d35f7499c87d51205817c93e9a8d42c4baestevel slot_names += 4; /* Skip the 4 byte bitmask */
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel while (shift < 32) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel /*
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 */
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (*slot_names_mask & slot) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (shift == device) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel (void) strcpy(str, slot_names);
03831d35f7499c87d51205817c93e9a8d42c4baestevel return (0);
03831d35f7499c87d51205817c93e9a8d42c4baestevel }
03831d35f7499c87d51205817c93e9a8d42c4baestevel slot_names += strlen(slot_names)+1;
03831d35f7499c87d51205817c93e9a8d42c4baestevel }
03831d35f7499c87d51205817c93e9a8d42c4baestevel shift++;
03831d35f7499c87d51205817c93e9a8d42c4baestevel slot = slot << 1;
03831d35f7499c87d51205817c93e9a8d42c4baestevel }
03831d35f7499c87d51205817c93e9a8d42c4baestevel return (-1);
03831d35f7499c87d51205817c93e9a8d42c4baestevel}