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 2005 Sun Microsystems, Inc. All rights reserved.
03831d35f7499c87d51205817c93e9a8d42c4baestevel * Use is subject to license terms.
03831d35f7499c87d51205817c93e9a8d42c4baestevel *
03831d35f7499c87d51205817c93e9a8d42c4baestevel * Sunfire Platform specific functions.
03831d35f7499c87d51205817c93e9a8d42c4baestevel *
03831d35f7499c87d51205817c93e9a8d42c4baestevel * called when :
03831d35f7499c87d51205817c93e9a8d42c4baestevel * machine_type == MTYPE_SUNFIRE
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 <time.h>
03831d35f7499c87d51205817c93e9a8d42c4baestevel#include <dirent.h>
03831d35f7499c87d51205817c93e9a8d42c4baestevel#include <fcntl.h>
03831d35f7499c87d51205817c93e9a8d42c4baestevel#include <errno.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 <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
03831d35f7499c87d51205817c93e9a8d42c4baestevel/* Macros for manipulating UPA IDs and board numbers on Sunfire. */
03831d35f7499c87d51205817c93e9a8d42c4baestevel#define bd_to_upa(bd) ((bd) << 1)
03831d35f7499c87d51205817c93e9a8d42c4baestevel#define upa_to_bd(upa) ((upa) >> 1)
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel#define MAX_MSGS 64
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevelextern int print_flag;
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel/*
03831d35f7499c87d51205817c93e9a8d42c4baestevel * these functions will overlay the symbol table of libprtdiag
03831d35f7499c87d51205817c93e9a8d42c4baestevel * at runtime (sunfire 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_memorysize(Sys_tree *tree, struct system_kstat_data *kstats,
03831d35f7499c87d51205817c93e9a8d42c4baestevel struct grp_info *grps, struct mem_total *memory_total);
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_mid(int mid);
03831d35f7499c87d51205817c93e9a8d42c4baestevelvoid display_pci(Board_node *);
03831d35f7499c87d51205817c93e9a8d42c4baestevelvoid display_ffb(Board_node *, int);
03831d35f7499c87d51205817c93e9a8d42c4baestevelvoid add_node(Sys_tree *, Prom_node *);
03831d35f7499c87d51205817c93e9a8d42c4baestevelvoid resolve_board_types(Sys_tree *);
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel/* local functions */
03831d35f7499c87d51205817c93e9a8d42c4baestevelstatic void build_mem_tables(Sys_tree *, struct system_kstat_data *,
03831d35f7499c87d51205817c93e9a8d42c4baestevel struct grp_info *);
03831d35f7499c87d51205817c93e9a8d42c4baestevelstatic void get_mem_total(struct mem_total *, struct grp_info *);
03831d35f7499c87d51205817c93e9a8d42c4baestevelstatic int disp_fault_list(Sys_tree *, struct system_kstat_data *);
03831d35f7499c87d51205817c93e9a8d42c4baestevelstatic int disp_err_log(struct system_kstat_data *);
03831d35f7499c87d51205817c93e9a8d42c4baestevelstatic int disp_env_status(struct system_kstat_data *);
03831d35f7499c87d51205817c93e9a8d42c4baestevelstatic int disp_keysw_and_leds(struct system_kstat_data *);
03831d35f7499c87d51205817c93e9a8d42c4baestevelstatic void sunfire_disp_prom_versions(Sys_tree *);
03831d35f7499c87d51205817c93e9a8d42c4baestevelstatic void erase_msgs(char **);
03831d35f7499c87d51205817c93e9a8d42c4baestevelstatic void display_msgs(char **msgs, int board);
03831d35f7499c87d51205817c93e9a8d42c4baestevelstatic void sunfire_disp_asic_revs(Sys_tree *, struct system_kstat_data *);
03831d35f7499c87d51205817c93e9a8d42c4baestevelstatic void display_hp_boards(struct system_kstat_data *);
03831d35f7499c87d51205817c93e9a8d42c4baestevelstatic int disp_parts(char **, u_longlong_t, int);
03831d35f7499c87d51205817c93e9a8d42c4baestevel/*
03831d35f7499c87d51205817c93e9a8d42c4baestevel * Error analysis routines. These routines decode data from specified
03831d35f7499c87d51205817c93e9a8d42c4baestevel * error registers. They are meant to be used for decoding the fatal
03831d35f7499c87d51205817c93e9a8d42c4baestevel * hardware reset data passed to the kernel by sun4u POST.
03831d35f7499c87d51205817c93e9a8d42c4baestevel */
03831d35f7499c87d51205817c93e9a8d42c4baestevelstatic int analyze_cpu(char **, int, u_longlong_t);
03831d35f7499c87d51205817c93e9a8d42c4baestevelstatic int analyze_ac(char **, u_longlong_t);
03831d35f7499c87d51205817c93e9a8d42c4baestevelstatic int analyze_dc(int, char **, u_longlong_t);
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel#define RESERVED_STR "Reserved"
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel#define MAX_PARTS 5
03831d35f7499c87d51205817c93e9a8d42c4baestevel#define MAX_FRUS 5
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel#define MAXSTRLEN 256
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel/* Define special bits */
03831d35f7499c87d51205817c93e9a8d42c4baestevel#define UPA_PORT_A 0x1
03831d35f7499c87d51205817c93e9a8d42c4baestevel#define UPA_PORT_B 0x2
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel/*
03831d35f7499c87d51205817c93e9a8d42c4baestevel * These defines comne from async.h, but it does not get exported from
03831d35f7499c87d51205817c93e9a8d42c4baestevel * uts/sun4u/sys, so they must be redefined.
03831d35f7499c87d51205817c93e9a8d42c4baestevel */
03831d35f7499c87d51205817c93e9a8d42c4baestevel#define P_AFSR_ISAP 0x0000000040000000ULL /* incoming addr. parity err */
03831d35f7499c87d51205817c93e9a8d42c4baestevel#define P_AFSR_ETP 0x0000000020000000ULL /* ecache tag parity */
03831d35f7499c87d51205817c93e9a8d42c4baestevel#define P_AFSR_ETS 0x00000000000F0000ULL /* cache tag parity syndrome */
03831d35f7499c87d51205817c93e9a8d42c4baestevel#define ETS_SHIFT 16
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel/* List of parts possible */
03831d35f7499c87d51205817c93e9a8d42c4baestevel#define RSVD_PART 1
03831d35f7499c87d51205817c93e9a8d42c4baestevel#define UPA_PART 2
03831d35f7499c87d51205817c93e9a8d42c4baestevel#define UPA_A_PART 3
03831d35f7499c87d51205817c93e9a8d42c4baestevel#define UPA_B_PART 4
03831d35f7499c87d51205817c93e9a8d42c4baestevel#define SOFTWARE_PART 5
03831d35f7499c87d51205817c93e9a8d42c4baestevel#define AC_PART 6
03831d35f7499c87d51205817c93e9a8d42c4baestevel#define AC_ANY_PART 7
03831d35f7499c87d51205817c93e9a8d42c4baestevel#define DTAG_PART 8
03831d35f7499c87d51205817c93e9a8d42c4baestevel#define DTAG_A_PART 9
03831d35f7499c87d51205817c93e9a8d42c4baestevel#define DTAG_B_PART 10
03831d35f7499c87d51205817c93e9a8d42c4baestevel#define FHC_PART 11
03831d35f7499c87d51205817c93e9a8d42c4baestevel#define BOARD_PART 12
03831d35f7499c87d51205817c93e9a8d42c4baestevel#define BOARD_ANY_PART 13
03831d35f7499c87d51205817c93e9a8d42c4baestevel#define BOARD_CONN_PART 14
03831d35f7499c87d51205817c93e9a8d42c4baestevel#define BACK_PIN_PART 15
03831d35f7499c87d51205817c93e9a8d42c4baestevel#define BACK_TERM_PART 16
03831d35f7499c87d51205817c93e9a8d42c4baestevel#define CPU_PART 17
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel/* List of possible parts */
03831d35f7499c87d51205817c93e9a8d42c4baestevelstatic char *part_str[] = {
03831d35f7499c87d51205817c93e9a8d42c4baestevel "", /* 0, a placeholder for indexing */
03831d35f7499c87d51205817c93e9a8d42c4baestevel "", /* 1, reserved strings shouldn't be printed */
03831d35f7499c87d51205817c93e9a8d42c4baestevel "UPA devices", /* 2 */
03831d35f7499c87d51205817c93e9a8d42c4baestevel "UPA Port A device", /* 3 */
03831d35f7499c87d51205817c93e9a8d42c4baestevel "UPA Port B device", /* 4 */
03831d35f7499c87d51205817c93e9a8d42c4baestevel "Software error", /* 5 */
03831d35f7499c87d51205817c93e9a8d42c4baestevel "Address Controller", /* 6 */
03831d35f7499c87d51205817c93e9a8d42c4baestevel "Undetermined Address Controller in system", /* 7 */
03831d35f7499c87d51205817c93e9a8d42c4baestevel "Data Tags", /* 8 */
03831d35f7499c87d51205817c93e9a8d42c4baestevel "Data Tags for UPA Port A", /* 9 */
03831d35f7499c87d51205817c93e9a8d42c4baestevel "Data Tags for UPA Port B", /* 10 */
03831d35f7499c87d51205817c93e9a8d42c4baestevel "Firehose Controller", /* 11 */
03831d35f7499c87d51205817c93e9a8d42c4baestevel "This Board", /* 12 */
03831d35f7499c87d51205817c93e9a8d42c4baestevel "Undetermined Board in system", /* 13 */
03831d35f7499c87d51205817c93e9a8d42c4baestevel "Board Connector", /* 14 */
03831d35f7499c87d51205817c93e9a8d42c4baestevel "Centerplane pins ", /* 15 */
03831d35f7499c87d51205817c93e9a8d42c4baestevel "Centerplane terminators", /* 16 */
03831d35f7499c87d51205817c93e9a8d42c4baestevel "CPU", /* 17 */
03831d35f7499c87d51205817c93e9a8d42c4baestevel};
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel/* Ecache parity error messages. Tells which bits are bad. */
03831d35f7499c87d51205817c93e9a8d42c4baestevelstatic char *ecache_parity[] = {
03831d35f7499c87d51205817c93e9a8d42c4baestevel "Bits 7:0 ",
03831d35f7499c87d51205817c93e9a8d42c4baestevel "Bits 15:8 ",
03831d35f7499c87d51205817c93e9a8d42c4baestevel "Bits 21:16 ",
03831d35f7499c87d51205817c93e9a8d42c4baestevel "Bits 24:22 "
03831d35f7499c87d51205817c93e9a8d42c4baestevel};
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevelstruct ac_error {
03831d35f7499c87d51205817c93e9a8d42c4baestevel char *error;
03831d35f7499c87d51205817c93e9a8d42c4baestevel int part[MAX_PARTS];
03831d35f7499c87d51205817c93e9a8d42c4baestevel};
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baesteveltypedef struct ac_error ac_err;
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel/*
03831d35f7499c87d51205817c93e9a8d42c4baestevel * Hardware error register meanings, failed parts and FRUs. The
03831d35f7499c87d51205817c93e9a8d42c4baestevel * following strings are indexed for the bit positions of the
03831d35f7499c87d51205817c93e9a8d42c4baestevel * corresponding bits in the hardware. The code checks bit x of
03831d35f7499c87d51205817c93e9a8d42c4baestevel * the hardware error register and prints out string[x] if the bit
03831d35f7499c87d51205817c93e9a8d42c4baestevel * is turned on.
03831d35f7499c87d51205817c93e9a8d42c4baestevel *
03831d35f7499c87d51205817c93e9a8d42c4baestevel * This database of parts which are probably failed and which FRU's
03831d35f7499c87d51205817c93e9a8d42c4baestevel * to replace was based on knowledge of the Sunfire Programmers Spec.
03831d35f7499c87d51205817c93e9a8d42c4baestevel * and discussions with the hardware designers. The order of the part
03831d35f7499c87d51205817c93e9a8d42c4baestevel * lists and consequently the FRU lists are in the order of most
03831d35f7499c87d51205817c93e9a8d42c4baestevel * likely cause first.
03831d35f7499c87d51205817c93e9a8d42c4baestevel */
03831d35f7499c87d51205817c93e9a8d42c4baestevelstatic ac_err ac_errors[] = {
03831d35f7499c87d51205817c93e9a8d42c4baestevel { /* 0 */
03831d35f7499c87d51205817c93e9a8d42c4baestevel "UPA Port A Error",
03831d35f7499c87d51205817c93e9a8d42c4baestevel { UPA_A_PART, 0, 0, 0, 0 },
03831d35f7499c87d51205817c93e9a8d42c4baestevel },
03831d35f7499c87d51205817c93e9a8d42c4baestevel { /* 1 */
03831d35f7499c87d51205817c93e9a8d42c4baestevel "UPA Port B Error",
03831d35f7499c87d51205817c93e9a8d42c4baestevel { UPA_B_PART, 0, 0, 0, 0 },
03831d35f7499c87d51205817c93e9a8d42c4baestevel },
03831d35f7499c87d51205817c93e9a8d42c4baestevel { /* 2 */
03831d35f7499c87d51205817c93e9a8d42c4baestevel NULL,
03831d35f7499c87d51205817c93e9a8d42c4baestevel { RSVD_PART, 0, 0, 0, 0 },
03831d35f7499c87d51205817c93e9a8d42c4baestevel },
03831d35f7499c87d51205817c93e9a8d42c4baestevel { /* 3 */
03831d35f7499c87d51205817c93e9a8d42c4baestevel NULL,
03831d35f7499c87d51205817c93e9a8d42c4baestevel { RSVD_PART, 0, 0, 0, 0 },
03831d35f7499c87d51205817c93e9a8d42c4baestevel },
03831d35f7499c87d51205817c93e9a8d42c4baestevel { /* 4 */
03831d35f7499c87d51205817c93e9a8d42c4baestevel "UPA Interrupt to unmapped destination",
03831d35f7499c87d51205817c93e9a8d42c4baestevel { BOARD_PART, 0, 0, 0, 0 },
03831d35f7499c87d51205817c93e9a8d42c4baestevel },
03831d35f7499c87d51205817c93e9a8d42c4baestevel { /* 5 */
03831d35f7499c87d51205817c93e9a8d42c4baestevel "UPA Non-cacheable write to unmapped destination",
03831d35f7499c87d51205817c93e9a8d42c4baestevel { BOARD_PART, 0, 0, 0, 0 },
03831d35f7499c87d51205817c93e9a8d42c4baestevel },
03831d35f7499c87d51205817c93e9a8d42c4baestevel { /* 6 */
03831d35f7499c87d51205817c93e9a8d42c4baestevel "UPA Cacheable write to unmapped destination",
03831d35f7499c87d51205817c93e9a8d42c4baestevel { BOARD_PART, 0, 0, 0, 0 },
03831d35f7499c87d51205817c93e9a8d42c4baestevel },
03831d35f7499c87d51205817c93e9a8d42c4baestevel { /* 7 */
03831d35f7499c87d51205817c93e9a8d42c4baestevel "Illegal Write Received",
03831d35f7499c87d51205817c93e9a8d42c4baestevel { BOARD_PART, 0, 0, 0, 0 },
03831d35f7499c87d51205817c93e9a8d42c4baestevel },
03831d35f7499c87d51205817c93e9a8d42c4baestevel { /* 8 */
03831d35f7499c87d51205817c93e9a8d42c4baestevel "Local Writeback match with line in state S",
03831d35f7499c87d51205817c93e9a8d42c4baestevel { AC_PART, DTAG_PART, 0, 0, 0 },
03831d35f7499c87d51205817c93e9a8d42c4baestevel },
03831d35f7499c87d51205817c93e9a8d42c4baestevel { /* 9 */
03831d35f7499c87d51205817c93e9a8d42c4baestevel "Local Read match with valid line in Tags",
03831d35f7499c87d51205817c93e9a8d42c4baestevel { AC_PART, DTAG_PART, 0, 0, 0 },
03831d35f7499c87d51205817c93e9a8d42c4baestevel },
03831d35f7499c87d51205817c93e9a8d42c4baestevel { /* 10 */
03831d35f7499c87d51205817c93e9a8d42c4baestevel NULL,
03831d35f7499c87d51205817c93e9a8d42c4baestevel { RSVD_PART, 0, 0, 0, 0 },
03831d35f7499c87d51205817c93e9a8d42c4baestevel },
03831d35f7499c87d51205817c93e9a8d42c4baestevel { /* 11 */
03831d35f7499c87d51205817c93e9a8d42c4baestevel NULL,
03831d35f7499c87d51205817c93e9a8d42c4baestevel { RSVD_PART, 0, 0, 0, 0 },
03831d35f7499c87d51205817c93e9a8d42c4baestevel },
03831d35f7499c87d51205817c93e9a8d42c4baestevel { /* 12 */
03831d35f7499c87d51205817c93e9a8d42c4baestevel "Tag and Victim were valid during lookup",
03831d35f7499c87d51205817c93e9a8d42c4baestevel { AC_PART, DTAG_PART, 0, 0, 0 },
03831d35f7499c87d51205817c93e9a8d42c4baestevel },
03831d35f7499c87d51205817c93e9a8d42c4baestevel { /* 13 */
03831d35f7499c87d51205817c93e9a8d42c4baestevel "Local Writeback matches a victim in state S",
03831d35f7499c87d51205817c93e9a8d42c4baestevel { AC_PART, CPU_PART, 0, 0, 0 },
03831d35f7499c87d51205817c93e9a8d42c4baestevel },
03831d35f7499c87d51205817c93e9a8d42c4baestevel { /* 14 */
03831d35f7499c87d51205817c93e9a8d42c4baestevel "Local Read matches valid line in victim buffer",
03831d35f7499c87d51205817c93e9a8d42c4baestevel { AC_PART, CPU_PART, 0, 0, 0 },
03831d35f7499c87d51205817c93e9a8d42c4baestevel },
03831d35f7499c87d51205817c93e9a8d42c4baestevel { /* 15 */
03831d35f7499c87d51205817c93e9a8d42c4baestevel "Local Read victim bit set and victim is S state",
03831d35f7499c87d51205817c93e9a8d42c4baestevel { AC_PART, CPU_PART, 0, 0, 0 },
03831d35f7499c87d51205817c93e9a8d42c4baestevel },
03831d35f7499c87d51205817c93e9a8d42c4baestevel { /* 16 */
03831d35f7499c87d51205817c93e9a8d42c4baestevel "Local Read Victim bit set and Valid Victim Buffer",
03831d35f7499c87d51205817c93e9a8d42c4baestevel { AC_PART, CPU_PART, 0, 0, 0 },
03831d35f7499c87d51205817c93e9a8d42c4baestevel },
03831d35f7499c87d51205817c93e9a8d42c4baestevel { /* 17 */
03831d35f7499c87d51205817c93e9a8d42c4baestevel NULL,
03831d35f7499c87d51205817c93e9a8d42c4baestevel { RSVD_PART, 0, 0, 0, 0 },
03831d35f7499c87d51205817c93e9a8d42c4baestevel },
03831d35f7499c87d51205817c93e9a8d42c4baestevel { /* 18 */
03831d35f7499c87d51205817c93e9a8d42c4baestevel NULL,
03831d35f7499c87d51205817c93e9a8d42c4baestevel { RSVD_PART, 0, 0, 0, 0 },
03831d35f7499c87d51205817c93e9a8d42c4baestevel },
03831d35f7499c87d51205817c93e9a8d42c4baestevel { /* 19 */
03831d35f7499c87d51205817c93e9a8d42c4baestevel NULL,
03831d35f7499c87d51205817c93e9a8d42c4baestevel { RSVD_PART, 0, 0, 0, 0 },
03831d35f7499c87d51205817c93e9a8d42c4baestevel },
03831d35f7499c87d51205817c93e9a8d42c4baestevel { /* 20 */
03831d35f7499c87d51205817c93e9a8d42c4baestevel "UPA Transaction received in Sleep mode",
03831d35f7499c87d51205817c93e9a8d42c4baestevel { AC_PART, 0, 0, 0, 0 },
03831d35f7499c87d51205817c93e9a8d42c4baestevel },
03831d35f7499c87d51205817c93e9a8d42c4baestevel { /* 21 */
03831d35f7499c87d51205817c93e9a8d42c4baestevel "P_FERR error P_REPLY received from UPA Port",
03831d35f7499c87d51205817c93e9a8d42c4baestevel { CPU_PART, AC_PART, 0, 0, 0 },
03831d35f7499c87d51205817c93e9a8d42c4baestevel },
03831d35f7499c87d51205817c93e9a8d42c4baestevel { /* 22 */
03831d35f7499c87d51205817c93e9a8d42c4baestevel "Illegal P_REPLY received from UPA Port",
03831d35f7499c87d51205817c93e9a8d42c4baestevel { CPU_PART, AC_PART, 0, 0, 0 },
03831d35f7499c87d51205817c93e9a8d42c4baestevel },
03831d35f7499c87d51205817c93e9a8d42c4baestevel { /* 23 */
03831d35f7499c87d51205817c93e9a8d42c4baestevel NULL,
03831d35f7499c87d51205817c93e9a8d42c4baestevel { RSVD_PART, 0, 0, 0, 0 },
03831d35f7499c87d51205817c93e9a8d42c4baestevel },
03831d35f7499c87d51205817c93e9a8d42c4baestevel { /* 24 */
03831d35f7499c87d51205817c93e9a8d42c4baestevel "Timeout on a UPA Master Port",
03831d35f7499c87d51205817c93e9a8d42c4baestevel { AC_ANY_PART, BOARD_ANY_PART, 0, 0, 0 },
03831d35f7499c87d51205817c93e9a8d42c4baestevel },
03831d35f7499c87d51205817c93e9a8d42c4baestevel { /* 25 */
03831d35f7499c87d51205817c93e9a8d42c4baestevel NULL,
03831d35f7499c87d51205817c93e9a8d42c4baestevel { RSVD_PART, 0, 0, 0, 0 },
03831d35f7499c87d51205817c93e9a8d42c4baestevel },
03831d35f7499c87d51205817c93e9a8d42c4baestevel { /* 26 */
03831d35f7499c87d51205817c93e9a8d42c4baestevel NULL,
03831d35f7499c87d51205817c93e9a8d42c4baestevel { RSVD_PART, 0, 0, 0, 0 },
03831d35f7499c87d51205817c93e9a8d42c4baestevel },
03831d35f7499c87d51205817c93e9a8d42c4baestevel { /* 27 */
03831d35f7499c87d51205817c93e9a8d42c4baestevel NULL,
03831d35f7499c87d51205817c93e9a8d42c4baestevel { RSVD_PART, 0, 0, 0, 0 },
03831d35f7499c87d51205817c93e9a8d42c4baestevel },
03831d35f7499c87d51205817c93e9a8d42c4baestevel { /* 28 */
03831d35f7499c87d51205817c93e9a8d42c4baestevel "Coherent Transactions Queue Overflow Error",
03831d35f7499c87d51205817c93e9a8d42c4baestevel { BACK_PIN_PART, BOARD_CONN_PART, AC_PART, AC_ANY_PART, 0 },
03831d35f7499c87d51205817c93e9a8d42c4baestevel },
03831d35f7499c87d51205817c93e9a8d42c4baestevel { /* 29 */
03831d35f7499c87d51205817c93e9a8d42c4baestevel "Non-cacheable Request Queue Overflow Error",
03831d35f7499c87d51205817c93e9a8d42c4baestevel { AC_PART, AC_ANY_PART, 0, 0, 0 },
03831d35f7499c87d51205817c93e9a8d42c4baestevel },
03831d35f7499c87d51205817c93e9a8d42c4baestevel { /* 30 */
03831d35f7499c87d51205817c93e9a8d42c4baestevel "Non-cacheable Reply Queue Overflow Error",
03831d35f7499c87d51205817c93e9a8d42c4baestevel { AC_PART, 0, 0, 0, 0 },
03831d35f7499c87d51205817c93e9a8d42c4baestevel },
03831d35f7499c87d51205817c93e9a8d42c4baestevel { /* 31 */
03831d35f7499c87d51205817c93e9a8d42c4baestevel "PREQ Queue Overflow Error",
03831d35f7499c87d51205817c93e9a8d42c4baestevel { CPU_PART, AC_PART, 0, 0, 0 },
03831d35f7499c87d51205817c93e9a8d42c4baestevel },
03831d35f7499c87d51205817c93e9a8d42c4baestevel { /* 32 */
03831d35f7499c87d51205817c93e9a8d42c4baestevel "Foreign DID CAM Overflow Error",
03831d35f7499c87d51205817c93e9a8d42c4baestevel { AC_PART, AC_ANY_PART, 0, 0, 0 },
03831d35f7499c87d51205817c93e9a8d42c4baestevel },
03831d35f7499c87d51205817c93e9a8d42c4baestevel { /* 33 */
03831d35f7499c87d51205817c93e9a8d42c4baestevel "FT->UPA Queue Overflow Error",
03831d35f7499c87d51205817c93e9a8d42c4baestevel { BACK_PIN_PART, BOARD_CONN_PART, AC_PART, AC_ANY_PART, 0 },
03831d35f7499c87d51205817c93e9a8d42c4baestevel },
03831d35f7499c87d51205817c93e9a8d42c4baestevel { /* 34 */
03831d35f7499c87d51205817c93e9a8d42c4baestevel NULL,
03831d35f7499c87d51205817c93e9a8d42c4baestevel { RSVD_PART, 0, 0, 0, 0 },
03831d35f7499c87d51205817c93e9a8d42c4baestevel },
03831d35f7499c87d51205817c93e9a8d42c4baestevel { /* 35 */
03831d35f7499c87d51205817c93e9a8d42c4baestevel NULL,
03831d35f7499c87d51205817c93e9a8d42c4baestevel { RSVD_PART, 0, 0, 0, 0 },
03831d35f7499c87d51205817c93e9a8d42c4baestevel },
03831d35f7499c87d51205817c93e9a8d42c4baestevel { /* 36 */
03831d35f7499c87d51205817c93e9a8d42c4baestevel "UPA Port B Dtag Parity Error",
03831d35f7499c87d51205817c93e9a8d42c4baestevel { DTAG_B_PART, AC_PART, 0, 0, 0 },
03831d35f7499c87d51205817c93e9a8d42c4baestevel },
03831d35f7499c87d51205817c93e9a8d42c4baestevel { /* 37 */
03831d35f7499c87d51205817c93e9a8d42c4baestevel "UPA Port A Dtag Parity Error",
03831d35f7499c87d51205817c93e9a8d42c4baestevel { DTAG_A_PART, AC_PART, 0, 0, 0 },
03831d35f7499c87d51205817c93e9a8d42c4baestevel },
03831d35f7499c87d51205817c93e9a8d42c4baestevel { /* 38 */
03831d35f7499c87d51205817c93e9a8d42c4baestevel NULL,
03831d35f7499c87d51205817c93e9a8d42c4baestevel { RSVD_PART, 0, 0, 0, 0 },
03831d35f7499c87d51205817c93e9a8d42c4baestevel },
03831d35f7499c87d51205817c93e9a8d42c4baestevel { /* 39 */
03831d35f7499c87d51205817c93e9a8d42c4baestevel NULL,
03831d35f7499c87d51205817c93e9a8d42c4baestevel { RSVD_PART, 0, 0, 0, 0 },
03831d35f7499c87d51205817c93e9a8d42c4baestevel },
03831d35f7499c87d51205817c93e9a8d42c4baestevel { /* 40 */
03831d35f7499c87d51205817c93e9a8d42c4baestevel "UPA Bus Parity Error",
03831d35f7499c87d51205817c93e9a8d42c4baestevel { UPA_PART, AC_PART, 0, 0, 0 },
03831d35f7499c87d51205817c93e9a8d42c4baestevel },
03831d35f7499c87d51205817c93e9a8d42c4baestevel { /* 41 */
03831d35f7499c87d51205817c93e9a8d42c4baestevel "Data ID Line Mismatch",
03831d35f7499c87d51205817c93e9a8d42c4baestevel { BACK_PIN_PART, BOARD_CONN_PART, AC_PART, 0, 0 },
03831d35f7499c87d51205817c93e9a8d42c4baestevel },
03831d35f7499c87d51205817c93e9a8d42c4baestevel { /* 42 */
03831d35f7499c87d51205817c93e9a8d42c4baestevel "Arbitration Line Mismatch",
03831d35f7499c87d51205817c93e9a8d42c4baestevel { BACK_PIN_PART, BOARD_CONN_PART, AC_PART, 0, 0 },
03831d35f7499c87d51205817c93e9a8d42c4baestevel },
03831d35f7499c87d51205817c93e9a8d42c4baestevel { /* 43 */
03831d35f7499c87d51205817c93e9a8d42c4baestevel "Shared Line Parity Mismatch",
03831d35f7499c87d51205817c93e9a8d42c4baestevel { BACK_PIN_PART, BOARD_CONN_PART, AC_PART, 0, 0 },
03831d35f7499c87d51205817c93e9a8d42c4baestevel },
03831d35f7499c87d51205817c93e9a8d42c4baestevel { /* 44 */
03831d35f7499c87d51205817c93e9a8d42c4baestevel "FireTruck Control Line Parity Error",
03831d35f7499c87d51205817c93e9a8d42c4baestevel { AC_PART, BACK_PIN_PART, 0, 0, 0 },
03831d35f7499c87d51205817c93e9a8d42c4baestevel },
03831d35f7499c87d51205817c93e9a8d42c4baestevel { /* 45 */
03831d35f7499c87d51205817c93e9a8d42c4baestevel "FireTruck Address Bus Parity Error",
03831d35f7499c87d51205817c93e9a8d42c4baestevel { AC_PART, BACK_PIN_PART, 0, 0, 0 },
03831d35f7499c87d51205817c93e9a8d42c4baestevel },
03831d35f7499c87d51205817c93e9a8d42c4baestevel { /* 46 */
03831d35f7499c87d51205817c93e9a8d42c4baestevel "Internal RAM Parity Error",
03831d35f7499c87d51205817c93e9a8d42c4baestevel { AC_PART, 0, 0, 0, 0 },
03831d35f7499c87d51205817c93e9a8d42c4baestevel },
03831d35f7499c87d51205817c93e9a8d42c4baestevel { /* 47 */
03831d35f7499c87d51205817c93e9a8d42c4baestevel NULL,
03831d35f7499c87d51205817c93e9a8d42c4baestevel { RSVD_PART, 0, 0, 0, 0 },
03831d35f7499c87d51205817c93e9a8d42c4baestevel },
03831d35f7499c87d51205817c93e9a8d42c4baestevel { /* 48 */
03831d35f7499c87d51205817c93e9a8d42c4baestevel "Internal Hardware Error",
03831d35f7499c87d51205817c93e9a8d42c4baestevel { AC_PART, 0, 0, 0, 0 },
03831d35f7499c87d51205817c93e9a8d42c4baestevel },
03831d35f7499c87d51205817c93e9a8d42c4baestevel { /* 49 */
03831d35f7499c87d51205817c93e9a8d42c4baestevel "FHC Communications Error",
03831d35f7499c87d51205817c93e9a8d42c4baestevel { FHC_PART, AC_PART, 0, 0, 0 },
03831d35f7499c87d51205817c93e9a8d42c4baestevel },
03831d35f7499c87d51205817c93e9a8d42c4baestevel /* Bits 50-63 are reserved in this implementation. */
03831d35f7499c87d51205817c93e9a8d42c4baestevel};
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel#define MAX_BITS (sizeof (ac_errors)/ sizeof (ac_err))
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel/*
03831d35f7499c87d51205817c93e9a8d42c4baestevel * There are only two error bits in the DC shadow chain that are
03831d35f7499c87d51205817c93e9a8d42c4baestevel * important. They indicate an overflow error and a parity error,
03831d35f7499c87d51205817c93e9a8d42c4baestevel * respectively. The other bits are not error bits and should not
03831d35f7499c87d51205817c93e9a8d42c4baestevel * be checked for.
03831d35f7499c87d51205817c93e9a8d42c4baestevel */
03831d35f7499c87d51205817c93e9a8d42c4baestevel#define DC_OVERFLOW 0x2
03831d35f7499c87d51205817c93e9a8d42c4baestevel#define DC_PARITY 0x4
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevelstatic char dc_overflow_txt[] = "Board %d DC %d Overflow Error";
03831d35f7499c87d51205817c93e9a8d42c4baestevelstatic char dc_parity_txt[] = "Board %d DC %d Parity Error";
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel/* defines for the sysio */
03831d35f7499c87d51205817c93e9a8d42c4baestevel#define UPA_APERR 0x4
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevelint
03831d35f7499c87d51205817c93e9a8d42c4baestevelerror_check(Sys_tree *tree, struct system_kstat_data *kstats)
03831d35f7499c87d51205817c93e9a8d42c4baestevel{
03831d35f7499c87d51205817c93e9a8d42c4baestevel int exit_code = 0; /* init to all OK */
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel /*
03831d35f7499c87d51205817c93e9a8d42c4baestevel * silently check for any types of machine errors
03831d35f7499c87d51205817c93e9a8d42c4baestevel */
03831d35f7499c87d51205817c93e9a8d42c4baestevel print_flag = 0;
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (disp_fail_parts(tree) || disp_fault_list(tree, kstats) ||
03831d35f7499c87d51205817c93e9a8d42c4baestevel disp_err_log(kstats) || disp_env_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/*
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
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,
03831d35f7499c87d51205817c93e9a8d42c4baestevel "Failed Field Replaceable Units (FRU) "
03831d35f7499c87d51205817c93e9a8d42c4baestevel "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 char *board_type = NULL;
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 /* Find the board type of this board */
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (bnode->board_type == CPU_BOARD) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel board_type = "CPU";
03831d35f7499c87d51205817c93e9a8d42c4baestevel } else {
03831d35f7499c87d51205817c93e9a8d42c4baestevel board_type = "IO";
03831d35f7499c87d51205817c93e9a8d42c4baestevel }
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf(dgettext(TEXT_DOMAIN,
03831d35f7499c87d51205817c93e9a8d42c4baestevel "%s unavailable on %s Board #%d\n"),
03831d35f7499c87d51205817c93e9a8d42c4baestevel name, board_type, bnode->board_num, 0);
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf(dgettext(TEXT_DOMAIN,
03831d35f7499c87d51205817c93e9a8d42c4baestevel "\tPROM fault string: %s\n"), value, 0);
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf(dgettext(TEXT_DOMAIN,
03831d35f7499c87d51205817c93e9a8d42c4baestevel "\tFailed Field 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,
03831d35f7499c87d51205817c93e9a8d42c4baestevel "SBus Card %d\n"),
03831d35f7499c87d51205817c93e9a8d42c4baestevel get_sbus_slot(pnode), 0);
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel } else if (((name = get_node_name(pnode->parent)) !=
03831d35f7499c87d51205817c93e9a8d42c4baestevel NULL) && (strstr(name, "pci"))) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf(dgettext(TEXT_DOMAIN,
03831d35f7499c87d51205817c93e9a8d42c4baestevel "PCI Card %d"),
03831d35f7499c87d51205817c93e9a8d42c4baestevel get_pci_device(pnode), 0);
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel } else if (((type = get_node_type(pnode)) != NULL) &&
03831d35f7499c87d51205817c93e9a8d42c4baestevel (strstr(type, "cpu"))) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf(dgettext(TEXT_DOMAIN,
03831d35f7499c87d51205817c93e9a8d42c4baestevel "UltraSPARC module "
03831d35f7499c87d51205817c93e9a8d42c4baestevel "Board %d Module %d\n"),
03831d35f7499c87d51205817c93e9a8d42c4baestevel get_id(pnode) >> 1,
03831d35f7499c87d51205817c93e9a8d42c4baestevel get_id(pnode) & 0x1);
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel } else {
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf(dgettext(TEXT_DOMAIN,
03831d35f7499c87d51205817c93e9a8d42c4baestevel "%s board %d\n"), board_type,
03831d35f7499c87d51205817c93e9a8d42c4baestevel bnode->board_num, 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,
03831d35f7499c87d51205817c93e9a8d42c4baestevel "No failures found 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_memorysize(Sys_tree *tree, struct system_kstat_data *kstats,
03831d35f7499c87d51205817c93e9a8d42c4baestevel struct grp_info *grps, struct mem_total *memory_total) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel /* Build the memory group tables and interleave data */
03831d35f7499c87d51205817c93e9a8d42c4baestevel build_mem_tables(tree, kstats, grps);
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel /* display total usable installed memory */
03831d35f7499c87d51205817c93e9a8d42c4baestevel get_mem_total(memory_total, grps);
03831d35f7499c87d51205817c93e9a8d42c4baestevel (void) log_printf(dgettext(TEXT_DOMAIN,
03831d35f7499c87d51205817c93e9a8d42c4baestevel "Memory size: %4dMb\n"), memory_total->dram, 0);
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel /* We display the NVSIMM size totals separately. */
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (memory_total->nvsimm != 0) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel (void) log_printf(dgettext(TEXT_DOMAIN,
03831d35f7499c87d51205817c93e9a8d42c4baestevel "NVSIMM size: %4dMb\n"), memory_total->nvsimm);
03831d35f7499c87d51205817c93e9a8d42c4baestevel }
03831d35f7499c87d51205817c93e9a8d42c4baestevel}
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel/*
03831d35f7499c87d51205817c93e9a8d42c4baestevel * This routine displays the memory configuration for all boards in the
03831d35f7499c87d51205817c93e9a8d42c4baestevel * system.
03831d35f7499c87d51205817c93e9a8d42c4baestevel */
03831d35f7499c87d51205817c93e9a8d42c4baestevelvoid
03831d35f7499c87d51205817c93e9a8d42c4baesteveldisplay_memoryconf(Sys_tree *tree, struct grp_info *grps)
03831d35f7499c87d51205817c93e9a8d42c4baestevel{
03831d35f7499c87d51205817c93e9a8d42c4baestevel int group;
03831d35f7499c87d51205817c93e9a8d42c4baestevel char *status_str[] = { "Unknown", " Empty ", " Failed", " Active",
03831d35f7499c87d51205817c93e9a8d42c4baestevel " Spare " };
03831d35f7499c87d51205817c93e9a8d42c4baestevel char *cond_str[] = { " Unknown ", " OK ", " Failing ",
03831d35f7499c87d51205817c93e9a8d42c4baestevel " Failed ", " Uninit. " };
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel#ifdef lint
03831d35f7499c87d51205817c93e9a8d42c4baestevel tree = tree;
03831d35f7499c87d51205817c93e9a8d42c4baestevel#endif
03831d35f7499c87d51205817c93e9a8d42c4baestevel /* Print the header for the memory section. */
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 log_printf(" Intrlv. "
03831d35f7499c87d51205817c93e9a8d42c4baestevel "Intrlv.\n", 0);
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf("Brd Bank MB Status Condition Speed Factor "
03831d35f7499c87d51205817c93e9a8d42c4baestevel " With\n", 0);
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf("--- ----- ---- ------- ---------- ----- ------- "
03831d35f7499c87d51205817c93e9a8d42c4baestevel "-------\n", 0);
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel /* Print the Memory groups information. */
03831d35f7499c87d51205817c93e9a8d42c4baestevel for (group = 0; group < MAX_GROUPS; group++) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel struct grp *grp;
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel grp = &grps->grp[group];
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel /* If this board is not a CPU or MEM board, skip it. */
03831d35f7499c87d51205817c93e9a8d42c4baestevel if ((grp->type != MEM_BOARD) && (grp->type != CPU_BOARD)) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel continue;
03831d35f7499c87d51205817c93e9a8d42c4baestevel }
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (grp->valid) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf("%2d ", grp->board, 0);
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf(" %1d ", grp->group, 0);
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf("%4d ", grp->size, 0);
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf("%7s ", status_str[grp->status], 0);
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf("%10s ", cond_str[grp->condition], 0);
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf("%3dns ", grp->speed, 0);
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf("%3d-way ", grp->factor, 0);
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (grp->factor > 1) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf("%4c", grp->groupid, 0);
03831d35f7499c87d51205817c93e9a8d42c4baestevel }
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf("\n", 0);
03831d35f7499c87d51205817c93e9a8d42c4baestevel }
03831d35f7499c87d51205817c93e9a8d42c4baestevel }
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel}
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevelvoid
03831d35f7499c87d51205817c93e9a8d42c4baesteveldisplay_hp_fail_fault(Sys_tree *tree, struct system_kstat_data *kstats)
03831d35f7499c87d51205817c93e9a8d42c4baestevel{
03831d35f7499c87d51205817c93e9a8d42c4baestevel /* Display Hot plugged, disabled and failed boards */
03831d35f7499c87d51205817c93e9a8d42c4baestevel (void) display_hp_boards(kstats);
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel /* Display failed units */
03831d35f7499c87d51205817c93e9a8d42c4baestevel (void) disp_fail_parts(tree);
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel /* Display fault info */
03831d35f7499c87d51205817c93e9a8d42c4baestevel (void) disp_fault_list(tree, kstats);
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 /* Display system environmental conditions. */
03831d35f7499c87d51205817c93e9a8d42c4baestevel (void) disp_env_status(kstats);
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel /* Display ASIC Chip revs for all boards. */
03831d35f7499c87d51205817c93e9a8d42c4baestevel sunfire_disp_asic_revs(tree, kstats);
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel /* Print the PROM revisions here */
03831d35f7499c87d51205817c93e9a8d42c4baestevel sunfire_disp_prom_versions(tree);
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel /*
03831d35f7499c87d51205817c93e9a8d42c4baestevel * Display the latest system fatal hardware
03831d35f7499c87d51205817c93e9a8d42c4baestevel * error data, if any. The system holds this
03831d35f7499c87d51205817c93e9a8d42c4baestevel * data in SRAM, so it does not persist
03831d35f7499c87d51205817c93e9a8d42c4baestevel * across power-on resets.
03831d35f7499c87d51205817c93e9a8d42c4baestevel */
03831d35f7499c87d51205817c93e9a8d42c4baestevel (void) disp_err_log(kstats);
03831d35f7499c87d51205817c93e9a8d42c4baestevel }
03831d35f7499c87d51205817c93e9a8d42c4baestevel}
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevelvoid
03831d35f7499c87d51205817c93e9a8d42c4baesteveldisplay_mid(int mid)
03831d35f7499c87d51205817c93e9a8d42c4baestevel{
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf(" %2d ", mid % 2, 0);
03831d35f7499c87d51205817c93e9a8d42c4baestevel}
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel/*
03831d35f7499c87d51205817c93e9a8d42c4baestevel * display_pci
03831d35f7499c87d51205817c93e9a8d42c4baestevel * Call the generic psycho version of this function.
03831d35f7499c87d51205817c93e9a8d42c4baestevel */
03831d35f7499c87d51205817c93e9a8d42c4baestevelvoid
03831d35f7499c87d51205817c93e9a8d42c4baesteveldisplay_pci(Board_node *board)
03831d35f7499c87d51205817c93e9a8d42c4baestevel{
03831d35f7499c87d51205817c93e9a8d42c4baestevel display_psycho_pci(board);
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 = get_id(ffb);
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, "FFB, "
03831d35f7499c87d51205817c93e9a8d42c4baestevel "Double Buffered");
03831d35f7499c87d51205817c93e9a8d42c4baestevel else
03831d35f7499c87d51205817c93e9a8d42c4baestevel (void) sprintf(card.name, "FFB, "
03831d35f7499c87d51205817c93e9a8d42c4baestevel "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("Board %d FFB Hardware Configuration:\n",
03831d35f7499c87d51205817c93e9a8d42c4baestevel board->board_num, 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: 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 * add_node
03831d35f7499c87d51205817c93e9a8d42c4baestevel *
03831d35f7499c87d51205817c93e9a8d42c4baestevel * This function adds a board node to the board structure where that
03831d35f7499c87d51205817c93e9a8d42c4baestevel * that node's physical component lives.
03831d35f7499c87d51205817c93e9a8d42c4baestevel */
03831d35f7499c87d51205817c93e9a8d42c4baestevelvoid
03831d35f7499c87d51205817c93e9a8d42c4baesteveladd_node(Sys_tree *root, Prom_node *pnode)
03831d35f7499c87d51205817c93e9a8d42c4baestevel{
03831d35f7499c87d51205817c93e9a8d42c4baestevel int board;
03831d35f7499c87d51205817c93e9a8d42c4baestevel Board_node *bnode;
03831d35f7499c87d51205817c93e9a8d42c4baestevel char *name = get_node_name(pnode);
03831d35f7499c87d51205817c93e9a8d42c4baestevel Prom_node *p;
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel /* add this node to the Board list of the appropriate board */
03831d35f7499c87d51205817c93e9a8d42c4baestevel if ((board = get_board_num(pnode)) == -1) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel void *value;
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel /*
03831d35f7499c87d51205817c93e9a8d42c4baestevel * if it is a server, pci nodes and ffb nodes never have
03831d35f7499c87d51205817c93e9a8d42c4baestevel * board number properties and software can find the board
03831d35f7499c87d51205817c93e9a8d42c4baestevel * number from the reg property. It is derived from the
03831d35f7499c87d51205817c93e9a8d42c4baestevel * high word of the 'reg' property, which contains the
03831d35f7499c87d51205817c93e9a8d42c4baestevel * mid.
03831d35f7499c87d51205817c93e9a8d42c4baestevel */
03831d35f7499c87d51205817c93e9a8d42c4baestevel if ((name != NULL) &&
03831d35f7499c87d51205817c93e9a8d42c4baestevel ((strcmp(name, FFB_NAME) == 0) ||
03831d35f7499c87d51205817c93e9a8d42c4baestevel (strcmp(name, "pci") == 0) ||
03831d35f7499c87d51205817c93e9a8d42c4baestevel (strcmp(name, "counter-timer") == 0))) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel /* extract the board number from the 'reg' prop. */
03831d35f7499c87d51205817c93e9a8d42c4baestevel if ((value = get_prop_val(find_prop(pnode,
03831d35f7499c87d51205817c93e9a8d42c4baestevel "reg"))) == NULL) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel (void) printf("add_node() no reg property\n");
03831d35f7499c87d51205817c93e9a8d42c4baestevel exit(2);
03831d35f7499c87d51205817c93e9a8d42c4baestevel }
03831d35f7499c87d51205817c93e9a8d42c4baestevel board = (*(int *)value - 0x1c0) / 4;
03831d35f7499c87d51205817c93e9a8d42c4baestevel }
03831d35f7499c87d51205817c93e9a8d42c4baestevel }
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel /* find the node with the same board number */
03831d35f7499c87d51205817c93e9a8d42c4baestevel if ((bnode = find_board(root, board)) == NULL) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel bnode = insert_board(root, board);
03831d35f7499c87d51205817c93e9a8d42c4baestevel bnode->board_type = UNKNOWN_BOARD;
03831d35f7499c87d51205817c93e9a8d42c4baestevel }
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel /* now attach this prom node to the board list */
03831d35f7499c87d51205817c93e9a8d42c4baestevel /* Insert this node at the end of the list */
03831d35f7499c87d51205817c93e9a8d42c4baestevel pnode->sibling = NULL;
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (bnode->nodes == NULL)
03831d35f7499c87d51205817c93e9a8d42c4baestevel bnode->nodes = pnode;
03831d35f7499c87d51205817c93e9a8d42c4baestevel else {
03831d35f7499c87d51205817c93e9a8d42c4baestevel p = bnode->nodes;
03831d35f7499c87d51205817c93e9a8d42c4baestevel while (p->sibling != NULL)
03831d35f7499c87d51205817c93e9a8d42c4baestevel p = p->sibling;
03831d35f7499c87d51205817c93e9a8d42c4baestevel p->sibling = pnode;
03831d35f7499c87d51205817c93e9a8d42c4baestevel }
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel}
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel/*
03831d35f7499c87d51205817c93e9a8d42c4baestevel * Function resolve_board_types
03831d35f7499c87d51205817c93e9a8d42c4baestevel *
03831d35f7499c87d51205817c93e9a8d42c4baestevel * After the tree is walked and all the information is gathered, this
03831d35f7499c87d51205817c93e9a8d42c4baestevel * function is called to resolve the type of each board.
03831d35f7499c87d51205817c93e9a8d42c4baestevel */
03831d35f7499c87d51205817c93e9a8d42c4baestevelvoid
03831d35f7499c87d51205817c93e9a8d42c4baestevelresolve_board_types(Sys_tree *tree)
03831d35f7499c87d51205817c93e9a8d42c4baestevel{
03831d35f7499c87d51205817c93e9a8d42c4baestevel Board_node *bnode;
03831d35f7499c87d51205817c93e9a8d42c4baestevel Prom_node *pnode;
03831d35f7499c87d51205817c93e9a8d42c4baestevel char *type;
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel bnode = tree->bd_list;
03831d35f7499c87d51205817c93e9a8d42c4baestevel while (bnode != NULL) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel bnode->board_type = UNKNOWN_BOARD;
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel pnode = dev_find_node(bnode->nodes, "fhc");
03831d35f7499c87d51205817c93e9a8d42c4baestevel type = get_prop_val(find_prop(pnode, "board-type"));
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (type == NULL) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel bnode = bnode->next;
03831d35f7499c87d51205817c93e9a8d42c4baestevel continue;
03831d35f7499c87d51205817c93e9a8d42c4baestevel }
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (strcmp(type, CPU_BD_NAME) == 0) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel bnode->board_type = CPU_BOARD;
03831d35f7499c87d51205817c93e9a8d42c4baestevel } else if (strcmp(type, MEM_BD_NAME) == 0) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel bnode->board_type = MEM_BOARD;
03831d35f7499c87d51205817c93e9a8d42c4baestevel } else if (strcmp(type, DISK_BD_NAME) == 0) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel bnode->board_type = DISK_BOARD;
03831d35f7499c87d51205817c93e9a8d42c4baestevel } else if (strcmp(type, IO_SBUS_FFB_BD_NAME) == 0) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel bnode->board_type = IO_SBUS_FFB_BOARD;
03831d35f7499c87d51205817c93e9a8d42c4baestevel } else if (strcmp(type, IO_2SBUS_BD_NAME) == 0) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel bnode->board_type = IO_2SBUS_BOARD;
03831d35f7499c87d51205817c93e9a8d42c4baestevel } else if (strcmp(type, IO_PCI_BD_NAME) == 0) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel bnode->board_type = IO_PCI_BOARD;
03831d35f7499c87d51205817c93e9a8d42c4baestevel } else if (strcmp(type, IO_2SBUS_SOCPLUS_BD_NAME) == 0) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel bnode->board_type = IO_2SBUS_SOCPLUS_BOARD;
03831d35f7499c87d51205817c93e9a8d42c4baestevel } else if (strcmp(type, IO_SBUS_FFB_SOCPLUS_BD_NAME) == 0) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel bnode->board_type = IO_SBUS_FFB_SOCPLUS_BOARD;
03831d35f7499c87d51205817c93e9a8d42c4baestevel }
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel bnode = bnode->next;
03831d35f7499c87d51205817c93e9a8d42c4baestevel }
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel}
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel/*
03831d35f7499c87d51205817c93e9a8d42c4baestevel * local functions
03831d35f7499c87d51205817c93e9a8d42c4baestevel */
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevelstatic void
03831d35f7499c87d51205817c93e9a8d42c4baestevelsunfire_disp_prom_versions(Sys_tree *tree)
03831d35f7499c87d51205817c93e9a8d42c4baestevel{
03831d35f7499c87d51205817c93e9a8d42c4baestevel Board_node *bnode;
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel /* Display Prom revision header */
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf("System Board PROM revisions:\n", 0);
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf("----------------------------\n", 0);
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel /* For each board, print the POST and OBP versions */
03831d35f7499c87d51205817c93e9a8d42c4baestevel for (bnode = tree->bd_list; bnode != NULL; bnode = bnode->next) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel Prom_node *flashprom; /* flashprom device node */
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel /* find a flashprom node for this board */
03831d35f7499c87d51205817c93e9a8d42c4baestevel flashprom = dev_find_node(bnode->nodes, "flashprom");
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel /* If no flashprom node found, continue */
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (flashprom == NULL)
03831d35f7499c87d51205817c93e9a8d42c4baestevel continue;
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel /* flashprom node found, display board# */
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf("Board %2d: ", bnode->board_num, 0);
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel disp_prom_version(flashprom);
03831d35f7499c87d51205817c93e9a8d42c4baestevel }
03831d35f7499c87d51205817c93e9a8d42c4baestevel}
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel/*
03831d35f7499c87d51205817c93e9a8d42c4baestevel * functions that are only needed inside this library
03831d35f7499c87d51205817c93e9a8d42c4baestevel */
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel/*
03831d35f7499c87d51205817c93e9a8d42c4baestevel * build_mem_tables
03831d35f7499c87d51205817c93e9a8d42c4baestevel *
03831d35f7499c87d51205817c93e9a8d42c4baestevel * This routine builds the memory table which tells how much memory
03831d35f7499c87d51205817c93e9a8d42c4baestevel * is present in each SIMM group of each board, what the interleave
03831d35f7499c87d51205817c93e9a8d42c4baestevel * factors are, and the group ID of the interleave group.
03831d35f7499c87d51205817c93e9a8d42c4baestevel *
03831d35f7499c87d51205817c93e9a8d42c4baestevel * The algorithms used are:
03831d35f7499c87d51205817c93e9a8d42c4baestevel * First fill in the sizes of groups.
03831d35f7499c87d51205817c93e9a8d42c4baestevel * Next build lists of all groups with same physical base.
03831d35f7499c87d51205817c93e9a8d42c4baestevel * From #of members in each list, interleave factor is
03831d35f7499c87d51205817c93e9a8d42c4baestevel * determined.
03831d35f7499c87d51205817c93e9a8d42c4baestevel * All members of a certain list get the same interleave
03831d35f7499c87d51205817c93e9a8d42c4baestevel * group ID.
03831d35f7499c87d51205817c93e9a8d42c4baestevel */
03831d35f7499c87d51205817c93e9a8d42c4baestevelstatic void
03831d35f7499c87d51205817c93e9a8d42c4baestevelbuild_mem_tables(Sys_tree *tree,
03831d35f7499c87d51205817c93e9a8d42c4baestevel struct system_kstat_data *kstats,
03831d35f7499c87d51205817c93e9a8d42c4baestevel struct grp_info *grps)
03831d35f7499c87d51205817c93e9a8d42c4baestevel{
03831d35f7499c87d51205817c93e9a8d42c4baestevel struct mem_inter inter_grps; /* temp structure for interleaves */
03831d35f7499c87d51205817c93e9a8d42c4baestevel struct inter_grp *intrp;
03831d35f7499c87d51205817c93e9a8d42c4baestevel int group;
03831d35f7499c87d51205817c93e9a8d42c4baestevel int i;
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel /* initialize the interleave lists */
03831d35f7499c87d51205817c93e9a8d42c4baestevel for (i = 0, intrp = &inter_grps.i_grp[0]; i < MAX_GROUPS; i++,
03831d35f7499c87d51205817c93e9a8d42c4baestevel intrp++) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel intrp->valid = 0;
03831d35f7499c87d51205817c93e9a8d42c4baestevel intrp->count = 0;
03831d35f7499c87d51205817c93e9a8d42c4baestevel intrp->groupid = '\0';
03831d35f7499c87d51205817c93e9a8d42c4baestevel intrp->base = 0;
03831d35f7499c87d51205817c93e9a8d42c4baestevel }
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel for (group = 0; group < MAX_GROUPS; group++) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel int found;
03831d35f7499c87d51205817c93e9a8d42c4baestevel int board;
03831d35f7499c87d51205817c93e9a8d42c4baestevel struct grp *grp;
03831d35f7499c87d51205817c93e9a8d42c4baestevel struct bd_kstat_data *bksp;
03831d35f7499c87d51205817c93e9a8d42c4baestevel uchar_t simm_reg;
03831d35f7499c87d51205817c93e9a8d42c4baestevel Board_node *bnode;
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel board = group/2;
03831d35f7499c87d51205817c93e9a8d42c4baestevel bksp = &kstats->bd_ksp_list[board];
03831d35f7499c87d51205817c93e9a8d42c4baestevel grp = &grps->grp[group];
03831d35f7499c87d51205817c93e9a8d42c4baestevel grp->group = group % 2;
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel /*
03831d35f7499c87d51205817c93e9a8d42c4baestevel * Copy the board type field into the group record.
03831d35f7499c87d51205817c93e9a8d42c4baestevel */
03831d35f7499c87d51205817c93e9a8d42c4baestevel if ((bnode = find_board(tree, board)) != NULL) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel grp->type = bnode->board_type;
03831d35f7499c87d51205817c93e9a8d42c4baestevel } else {
03831d35f7499c87d51205817c93e9a8d42c4baestevel grp->type = UNKNOWN_BOARD;
03831d35f7499c87d51205817c93e9a8d42c4baestevel continue;
03831d35f7499c87d51205817c93e9a8d42c4baestevel }
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel /* Make sure we have kstats for this board */
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (bksp->ac_kstats_ok == 0) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel /* Mark this group as invalid and move to next one */
03831d35f7499c87d51205817c93e9a8d42c4baestevel grp->valid = 0;
03831d35f7499c87d51205817c93e9a8d42c4baestevel continue;
03831d35f7499c87d51205817c93e9a8d42c4baestevel }
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel /* Find the bank status property */
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (bksp->ac_memstat_ok) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel grp->status = bksp->mem_stat[grp->group].status;
03831d35f7499c87d51205817c93e9a8d42c4baestevel grp->condition = bksp->mem_stat[grp->group].condition;
03831d35f7499c87d51205817c93e9a8d42c4baestevel } else {
03831d35f7499c87d51205817c93e9a8d42c4baestevel grp->status = StUnknown;
03831d35f7499c87d51205817c93e9a8d42c4baestevel grp->condition = ConUnknown;
03831d35f7499c87d51205817c93e9a8d42c4baestevel }
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel switch (grp->status) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel case StBad:
03831d35f7499c87d51205817c93e9a8d42c4baestevel case StActive:
03831d35f7499c87d51205817c93e9a8d42c4baestevel case StSpare:
03831d35f7499c87d51205817c93e9a8d42c4baestevel break;
03831d35f7499c87d51205817c93e9a8d42c4baestevel default:
03831d35f7499c87d51205817c93e9a8d42c4baestevel grp->status = StUnknown;
03831d35f7499c87d51205817c93e9a8d42c4baestevel break;
03831d35f7499c87d51205817c93e9a8d42c4baestevel }
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel switch (grp->condition) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel case ConOK:
03831d35f7499c87d51205817c93e9a8d42c4baestevel case ConFailing:
03831d35f7499c87d51205817c93e9a8d42c4baestevel case ConFailed:
03831d35f7499c87d51205817c93e9a8d42c4baestevel case ConTest:
03831d35f7499c87d51205817c93e9a8d42c4baestevel case ConBad:
03831d35f7499c87d51205817c93e9a8d42c4baestevel break;
03831d35f7499c87d51205817c93e9a8d42c4baestevel default:
03831d35f7499c87d51205817c93e9a8d42c4baestevel grp->condition = ConUnknown;
03831d35f7499c87d51205817c93e9a8d42c4baestevel break;
03831d35f7499c87d51205817c93e9a8d42c4baestevel }
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel /* base the group size off of the simmstat kstat. */
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (bksp->simmstat_kstats_ok == 0) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel grp->valid = 0;
03831d35f7499c87d51205817c93e9a8d42c4baestevel continue;
03831d35f7499c87d51205817c93e9a8d42c4baestevel }
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel /* Is it bank 0 or bank 1 */
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (grp->group == 0) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel simm_reg = bksp->simm_status[0];
03831d35f7499c87d51205817c93e9a8d42c4baestevel } else {
03831d35f7499c87d51205817c93e9a8d42c4baestevel simm_reg = bksp->simm_status[1];
03831d35f7499c87d51205817c93e9a8d42c4baestevel }
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel /* Now decode the size field. */
03831d35f7499c87d51205817c93e9a8d42c4baestevel switch (simm_reg & 0x1f) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel case MEM_SIZE_64M:
03831d35f7499c87d51205817c93e9a8d42c4baestevel grp->size = 64;
03831d35f7499c87d51205817c93e9a8d42c4baestevel break;
03831d35f7499c87d51205817c93e9a8d42c4baestevel case MEM_SIZE_256M:
03831d35f7499c87d51205817c93e9a8d42c4baestevel grp->size = 256;
03831d35f7499c87d51205817c93e9a8d42c4baestevel break;
03831d35f7499c87d51205817c93e9a8d42c4baestevel case MEM_SIZE_1G:
03831d35f7499c87d51205817c93e9a8d42c4baestevel grp->size = 1024;
03831d35f7499c87d51205817c93e9a8d42c4baestevel break;
03831d35f7499c87d51205817c93e9a8d42c4baestevel case MEM_SIZE_2G:
03831d35f7499c87d51205817c93e9a8d42c4baestevel grp->size = 2048;
03831d35f7499c87d51205817c93e9a8d42c4baestevel break;
03831d35f7499c87d51205817c93e9a8d42c4baestevel default:
03831d35f7499c87d51205817c93e9a8d42c4baestevel grp->valid = 0;
03831d35f7499c87d51205817c93e9a8d42c4baestevel continue;
03831d35f7499c87d51205817c93e9a8d42c4baestevel }
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel /* Decode the speed field */
03831d35f7499c87d51205817c93e9a8d42c4baestevel switch ((simm_reg & 0x60) >> 5) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel case MEM_SPEED_50ns:
03831d35f7499c87d51205817c93e9a8d42c4baestevel grp->speed = 50;
03831d35f7499c87d51205817c93e9a8d42c4baestevel break;
03831d35f7499c87d51205817c93e9a8d42c4baestevel case MEM_SPEED_60ns:
03831d35f7499c87d51205817c93e9a8d42c4baestevel grp->speed = 60;
03831d35f7499c87d51205817c93e9a8d42c4baestevel break;
03831d35f7499c87d51205817c93e9a8d42c4baestevel case MEM_SPEED_70ns:
03831d35f7499c87d51205817c93e9a8d42c4baestevel grp->speed = 70;
03831d35f7499c87d51205817c93e9a8d42c4baestevel break;
03831d35f7499c87d51205817c93e9a8d42c4baestevel case MEM_SPEED_80ns:
03831d35f7499c87d51205817c93e9a8d42c4baestevel grp->speed = 80;
03831d35f7499c87d51205817c93e9a8d42c4baestevel break;
03831d35f7499c87d51205817c93e9a8d42c4baestevel }
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel grp->valid = 1;
03831d35f7499c87d51205817c93e9a8d42c4baestevel grp->base = GRP_BASE(bksp->ac_memdecode[grp->group]);
03831d35f7499c87d51205817c93e9a8d42c4baestevel grp->board = board;
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (grp->group == 0) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel grp->factor = INTLV0(bksp->ac_memctl);
03831d35f7499c87d51205817c93e9a8d42c4baestevel } else { /* assume it is group 1 */
03831d35f7499c87d51205817c93e9a8d42c4baestevel grp->factor = INTLV1(bksp->ac_memctl);
03831d35f7499c87d51205817c93e9a8d42c4baestevel }
03831d35f7499c87d51205817c93e9a8d42c4baestevel grp->groupid = '\0'; /* Not in a group yet */
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel /*
03831d35f7499c87d51205817c93e9a8d42c4baestevel * find the interleave list this group belongs on. If the
03831d35f7499c87d51205817c93e9a8d42c4baestevel * interleave list corresponding to this base address is
03831d35f7499c87d51205817c93e9a8d42c4baestevel * not found, then create a new one.
03831d35f7499c87d51205817c93e9a8d42c4baestevel */
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel i = 0;
03831d35f7499c87d51205817c93e9a8d42c4baestevel intrp = &inter_grps.i_grp[0];
03831d35f7499c87d51205817c93e9a8d42c4baestevel found = 0;
03831d35f7499c87d51205817c93e9a8d42c4baestevel while ((i < MAX_GROUPS) && !found && (intrp->valid != 0)) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel if ((intrp->valid != 0) &&
03831d35f7499c87d51205817c93e9a8d42c4baestevel (intrp->base == grp->base)) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel grp->groupid = intrp->groupid;
03831d35f7499c87d51205817c93e9a8d42c4baestevel intrp->count++;
03831d35f7499c87d51205817c93e9a8d42c4baestevel found = 1;
03831d35f7499c87d51205817c93e9a8d42c4baestevel }
03831d35f7499c87d51205817c93e9a8d42c4baestevel i++;
03831d35f7499c87d51205817c93e9a8d42c4baestevel intrp++;
03831d35f7499c87d51205817c93e9a8d42c4baestevel }
03831d35f7499c87d51205817c93e9a8d42c4baestevel /*
03831d35f7499c87d51205817c93e9a8d42c4baestevel * We did not find a matching base. So now i and intrp
03831d35f7499c87d51205817c93e9a8d42c4baestevel * now point to the next interleave group in the list.
03831d35f7499c87d51205817c93e9a8d42c4baestevel */
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (!found) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel intrp->count++;
03831d35f7499c87d51205817c93e9a8d42c4baestevel intrp->valid = 1;
03831d35f7499c87d51205817c93e9a8d42c4baestevel intrp->groupid = 'A' + (char)i;
03831d35f7499c87d51205817c93e9a8d42c4baestevel intrp->base = grp->base;
03831d35f7499c87d51205817c93e9a8d42c4baestevel grp->groupid = intrp->groupid;
03831d35f7499c87d51205817c93e9a8d42c4baestevel }
03831d35f7499c87d51205817c93e9a8d42c4baestevel }
03831d35f7499c87d51205817c93e9a8d42c4baestevel}
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevelstatic void
03831d35f7499c87d51205817c93e9a8d42c4baestevelget_mem_total(struct mem_total *mem_total, struct grp_info *grps)
03831d35f7499c87d51205817c93e9a8d42c4baestevel{
03831d35f7499c87d51205817c93e9a8d42c4baestevel struct grp *grp;
03831d35f7499c87d51205817c93e9a8d42c4baestevel int i;
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel /* Start with total of zero */
03831d35f7499c87d51205817c93e9a8d42c4baestevel mem_total->dram = 0;
03831d35f7499c87d51205817c93e9a8d42c4baestevel mem_total->nvsimm = 0;
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel /* For now we ignore NVSIMMs. We might want to fix this later. */
03831d35f7499c87d51205817c93e9a8d42c4baestevel for (i = 0, grp = &grps->grp[0]; i < MAX_GROUPS; i++, grp++) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (grp->valid == 1 && grp->status == StActive) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel mem_total->dram += grp->size;
03831d35f7499c87d51205817c93e9a8d42c4baestevel }
03831d35f7499c87d51205817c93e9a8d42c4baestevel }
03831d35f7499c87d51205817c93e9a8d42c4baestevel}
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevelstatic int
03831d35f7499c87d51205817c93e9a8d42c4baesteveldisp_fault_list(Sys_tree *tree, struct system_kstat_data *kstats)
03831d35f7499c87d51205817c93e9a8d42c4baestevel{
03831d35f7499c87d51205817c93e9a8d42c4baestevel struct ft_list *ftp;
03831d35f7499c87d51205817c93e9a8d42c4baestevel int i;
03831d35f7499c87d51205817c93e9a8d42c4baestevel int result = 0;
03831d35f7499c87d51205817c93e9a8d42c4baestevel time_t t;
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (!kstats->ft_kstat_ok) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel return (result);
03831d35f7499c87d51205817c93e9a8d42c4baestevel }
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel for (i = 0, ftp = kstats->ft_array; i < kstats->nfaults; i++, ftp++) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (!result) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf("\n", 0);
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf("Detected System Faults\n", 0);
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf("======================\n", 0);
03831d35f7499c87d51205817c93e9a8d42c4baestevel }
03831d35f7499c87d51205817c93e9a8d42c4baestevel result = 1;
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (ftp->fclass == FT_BOARD) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf("Board %d fault: %s\n", ftp->unit,
03831d35f7499c87d51205817c93e9a8d42c4baestevel ftp->msg, 0);
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel /*
03831d35f7499c87d51205817c93e9a8d42c4baestevel * If the fault on this board is PROM inherited, see
03831d35f7499c87d51205817c93e9a8d42c4baestevel * if we can find some failed component information
03831d35f7499c87d51205817c93e9a8d42c4baestevel * in the PROM device tree. The general solution
03831d35f7499c87d51205817c93e9a8d42c4baestevel * would be to fix the fhc driver and have it put in
03831d35f7499c87d51205817c93e9a8d42c4baestevel * more descriptive messages, but that's for another
03831d35f7499c87d51205817c93e9a8d42c4baestevel * day.
03831d35f7499c87d51205817c93e9a8d42c4baestevel */
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (ftp->type == FT_PROM) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel Board_node *bn;
03831d35f7499c87d51205817c93e9a8d42c4baestevel Prom_node *pn;
03831d35f7499c87d51205817c93e9a8d42c4baestevel char *str;
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel bn = find_board(tree, ftp->unit);
03831d35f7499c87d51205817c93e9a8d42c4baestevel /*
03831d35f7499c87d51205817c93e9a8d42c4baestevel * If any nodes under this board have a
03831d35f7499c87d51205817c93e9a8d42c4baestevel * status containing "fail", print it out.
03831d35f7499c87d51205817c93e9a8d42c4baestevel */
03831d35f7499c87d51205817c93e9a8d42c4baestevel pn = find_failed_node(bn->nodes);
03831d35f7499c87d51205817c93e9a8d42c4baestevel while (pn) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel str = get_prop_val(find_prop(pn,
03831d35f7499c87d51205817c93e9a8d42c4baestevel "status"));
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (str != NULL) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf("Fault: %s\n", str,
03831d35f7499c87d51205817c93e9a8d42c4baestevel 0);
03831d35f7499c87d51205817c93e9a8d42c4baestevel }
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel pn = next_failed_node(pn);
03831d35f7499c87d51205817c93e9a8d42c4baestevel }
03831d35f7499c87d51205817c93e9a8d42c4baestevel }
03831d35f7499c87d51205817c93e9a8d42c4baestevel } else if ((ftp->type == FT_CORE_PS) || (ftp->type == FT_PPS)) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf("Unit %d %s failure\n", ftp->unit,
03831d35f7499c87d51205817c93e9a8d42c4baestevel ftp->msg, 0);
03831d35f7499c87d51205817c93e9a8d42c4baestevel } else if ((ftp->type == FT_OVERTEMP) &&
03831d35f7499c87d51205817c93e9a8d42c4baestevel (ftp->fclass == FT_SYSTEM)) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf("Clock board %s\n", ftp->msg, 0);
03831d35f7499c87d51205817c93e9a8d42c4baestevel } else {
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf("%s failure\n", ftp->msg, 0);
03831d35f7499c87d51205817c93e9a8d42c4baestevel }
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel t = (time_t)ftp->create_time;
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf("\tDetected %s",
03831d35f7499c87d51205817c93e9a8d42c4baestevel asctime(localtime(&t)), 0);
03831d35f7499c87d51205817c93e9a8d42c4baestevel }
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (!result) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf("\n", 0);
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf("No System Faults found\n", 0);
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf("======================\n", 0);
03831d35f7499c87d51205817c93e9a8d42c4baestevel }
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf("\n", 0);
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel return (result);
03831d35f7499c87d51205817c93e9a8d42c4baestevel}
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel/*
03831d35f7499c87d51205817c93e9a8d42c4baestevel * disp_err_log
03831d35f7499c87d51205817c93e9a8d42c4baestevel *
03831d35f7499c87d51205817c93e9a8d42c4baestevel * Display the fatal hardware reset system error logs. These logs are
03831d35f7499c87d51205817c93e9a8d42c4baestevel * collected by POST and passed up through the kernel to userland.
03831d35f7499c87d51205817c93e9a8d42c4baestevel * They will not necessarily be present in all systems. Their form
03831d35f7499c87d51205817c93e9a8d42c4baestevel * might also be different in different systems.
03831d35f7499c87d51205817c93e9a8d42c4baestevel *
03831d35f7499c87d51205817c93e9a8d42c4baestevel * NOTE - We are comparing POST defined board types here. Do not confuse
03831d35f7499c87d51205817c93e9a8d42c4baestevel * them with kernel board types. The structure being analyzed in this
03831d35f7499c87d51205817c93e9a8d42c4baestevel * function is created by POST. All the defines for it are in reset_info.h,
03831d35f7499c87d51205817c93e9a8d42c4baestevel * which was ported from POST header files.
03831d35f7499c87d51205817c93e9a8d42c4baestevel */
03831d35f7499c87d51205817c93e9a8d42c4baestevelstatic int
03831d35f7499c87d51205817c93e9a8d42c4baesteveldisp_err_log(struct system_kstat_data *kstats)
03831d35f7499c87d51205817c93e9a8d42c4baestevel{
03831d35f7499c87d51205817c93e9a8d42c4baestevel int exit_code = 0;
03831d35f7499c87d51205817c93e9a8d42c4baestevel int i;
03831d35f7499c87d51205817c93e9a8d42c4baestevel struct reset_info *rst_info;
03831d35f7499c87d51205817c93e9a8d42c4baestevel struct board_info *bdp;
03831d35f7499c87d51205817c93e9a8d42c4baestevel char *err_msgs[MAX_MSGS]; /* holds all messages for a system board */
03831d35f7499c87d51205817c93e9a8d42c4baestevel int msg_idx; /* current msg number */
03831d35f7499c87d51205817c93e9a8d42c4baestevel int count; /* number added by last analyze call */
03831d35f7499c87d51205817c93e9a8d42c4baestevel char **msgs;
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel /* start by initializing the err_msgs array to all NULLs */
03831d35f7499c87d51205817c93e9a8d42c4baestevel for (i = 0; i < MAX_MSGS; i++) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel err_msgs[i] = NULL;
03831d35f7499c87d51205817c93e9a8d42c4baestevel }
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel /* First check to see that the reset-info kstats are present. */
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (kstats->reset_kstats_ok == 0) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel return (exit_code);
03831d35f7499c87d51205817c93e9a8d42c4baestevel }
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel rst_info = &kstats->reset_info;
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel /* Everything is OK, so print out time/date stamp first */
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf("\n", 0);
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf(
03831d35f7499c87d51205817c93e9a8d42c4baestevel dgettext(TEXT_DOMAIN,
03831d35f7499c87d51205817c93e9a8d42c4baestevel "Analysis of most recent Fatal Hardware Watchdog:\n"),
03831d35f7499c87d51205817c93e9a8d42c4baestevel 0);
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf("======================================================\n",
03831d35f7499c87d51205817c93e9a8d42c4baestevel 0);
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf("Log Date: %s\n",
03831d35f7499c87d51205817c93e9a8d42c4baestevel get_time(&kstats->reset_info.tod_timestamp[0]), 0);
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel /* initialize the vector and the message index. */
03831d35f7499c87d51205817c93e9a8d42c4baestevel msgs = err_msgs;
03831d35f7499c87d51205817c93e9a8d42c4baestevel msg_idx = 0;
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel /* Loop Through all of the boards. */
03831d35f7499c87d51205817c93e9a8d42c4baestevel bdp = &rst_info->bd_reset_info[0];
03831d35f7499c87d51205817c93e9a8d42c4baestevel for (i = 0; i < MAX_BOARDS; i++, bdp++) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel /* Is there data for this board? */
03831d35f7499c87d51205817c93e9a8d42c4baestevel if ((bdp->board_desc & BD_STATE_MASK) == BD_NOT_PRESENT) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel continue;
03831d35f7499c87d51205817c93e9a8d42c4baestevel }
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel /* If it is a CPU Board, look for CPU data. */
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (BOARD_TYPE(bdp->board_desc) == CPU_TYPE) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel /* analyze CPU 0 if present */
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (bdp->board_desc & CPU0_OK) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel count = analyze_cpu(msgs, 0,
03831d35f7499c87d51205817c93e9a8d42c4baestevel bdp->cpu[0].afsr);
03831d35f7499c87d51205817c93e9a8d42c4baestevel msgs += count;
03831d35f7499c87d51205817c93e9a8d42c4baestevel msg_idx += count;
03831d35f7499c87d51205817c93e9a8d42c4baestevel }
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel /* analyze CPU1 if present. */
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (bdp->board_desc & CPU1_OK) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel count = analyze_cpu(msgs, 1,
03831d35f7499c87d51205817c93e9a8d42c4baestevel bdp->cpu[1].afsr);
03831d35f7499c87d51205817c93e9a8d42c4baestevel msgs += count;
03831d35f7499c87d51205817c93e9a8d42c4baestevel msg_idx += count;
03831d35f7499c87d51205817c93e9a8d42c4baestevel }
03831d35f7499c87d51205817c93e9a8d42c4baestevel }
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel /* Always Analyze the AC and the DCs on a board. */
03831d35f7499c87d51205817c93e9a8d42c4baestevel count = analyze_ac(msgs, bdp->ac_error_status);
03831d35f7499c87d51205817c93e9a8d42c4baestevel msgs += count;
03831d35f7499c87d51205817c93e9a8d42c4baestevel msg_idx += count;
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel count = analyze_dc(i, msgs, bdp->dc_shadow_chain);
03831d35f7499c87d51205817c93e9a8d42c4baestevel msgs += count;
03831d35f7499c87d51205817c93e9a8d42c4baestevel msg_idx += count;
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (msg_idx != 0)
03831d35f7499c87d51205817c93e9a8d42c4baestevel display_msgs(err_msgs, i);
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel erase_msgs(err_msgs);
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel /* If any messages are logged, we have errors */
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (msg_idx != 0) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel exit_code = 1;
03831d35f7499c87d51205817c93e9a8d42c4baestevel }
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel /* reset the vector and the message index */
03831d35f7499c87d51205817c93e9a8d42c4baestevel msg_idx = 0;
03831d35f7499c87d51205817c93e9a8d42c4baestevel msgs = &err_msgs[0];
03831d35f7499c87d51205817c93e9a8d42c4baestevel }
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel return (exit_code);
03831d35f7499c87d51205817c93e9a8d42c4baestevel}
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevelstatic void
03831d35f7499c87d51205817c93e9a8d42c4baestevelerase_msgs(char **msgs)
03831d35f7499c87d51205817c93e9a8d42c4baestevel{
03831d35f7499c87d51205817c93e9a8d42c4baestevel int i;
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel for (i = 0; (*msgs != NULL) && (i < MAX_MSGS); i++, msgs++) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel free(*msgs);
03831d35f7499c87d51205817c93e9a8d42c4baestevel *msgs = NULL;
03831d35f7499c87d51205817c93e9a8d42c4baestevel }
03831d35f7499c87d51205817c93e9a8d42c4baestevel}
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevelstatic void
03831d35f7499c87d51205817c93e9a8d42c4baesteveldisplay_msgs(char **msgs, int board)
03831d35f7499c87d51205817c93e9a8d42c4baestevel{
03831d35f7499c87d51205817c93e9a8d42c4baestevel int i;
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel /* display the header for this board */
03831d35f7499c87d51205817c93e9a8d42c4baestevel print_header(board);
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel for (i = 0; (*msgs != NULL) && (i < MAX_MSGS); i++, msgs++) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf(*msgs, 0);
03831d35f7499c87d51205817c93e9a8d42c4baestevel }
03831d35f7499c87d51205817c93e9a8d42c4baestevel}
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel/*
03831d35f7499c87d51205817c93e9a8d42c4baestevel * disp_keysw_and_leds
03831d35f7499c87d51205817c93e9a8d42c4baestevel *
03831d35f7499c87d51205817c93e9a8d42c4baestevel * This routine displays the position of the keyswitch and the front panel
03831d35f7499c87d51205817c93e9a8d42c4baestevel * system LEDs. The keyswitch can be in either normal, diagnostic, or
03831d35f7499c87d51205817c93e9a8d42c4baestevel * secure position. The three front panel LEDs are of importance because
03831d35f7499c87d51205817c93e9a8d42c4baestevel * the center LED indicates component failure on the system.
03831d35f7499c87d51205817c93e9a8d42c4baestevel */
03831d35f7499c87d51205817c93e9a8d42c4baestevelstatic int
03831d35f7499c87d51205817c93e9a8d42c4baesteveldisp_keysw_and_leds(struct system_kstat_data *kstats)
03831d35f7499c87d51205817c93e9a8d42c4baestevel{
03831d35f7499c87d51205817c93e9a8d42c4baestevel int board;
03831d35f7499c87d51205817c93e9a8d42c4baestevel int diag_mode = 0;
03831d35f7499c87d51205817c93e9a8d42c4baestevel int secure_mode = 0;
03831d35f7499c87d51205817c93e9a8d42c4baestevel int result = 0;
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel /* Check the first valid board to determeine the diag bit */
03831d35f7499c87d51205817c93e9a8d42c4baestevel /* Find the first valid board */
03831d35f7499c87d51205817c93e9a8d42c4baestevel for (board = 0; board < MAX_BOARDS; board++) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (kstats->bd_ksp_list[board].fhc_kstats_ok != 0) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel /* If this was successful, break out of loop */
03831d35f7499c87d51205817c93e9a8d42c4baestevel if ((kstats->bd_ksp_list[board].fhc_bsr &
03831d35f7499c87d51205817c93e9a8d42c4baestevel FHC_DIAG_MODE) == 0)
03831d35f7499c87d51205817c93e9a8d42c4baestevel diag_mode = 1;
03831d35f7499c87d51205817c93e9a8d42c4baestevel break;
03831d35f7499c87d51205817c93e9a8d42c4baestevel }
03831d35f7499c87d51205817c93e9a8d42c4baestevel }
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel /*
03831d35f7499c87d51205817c93e9a8d42c4baestevel * Check the register on the clock-board to determine the
03831d35f7499c87d51205817c93e9a8d42c4baestevel * secure bit.
03831d35f7499c87d51205817c93e9a8d42c4baestevel */
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (kstats->sys_kstats_ok) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel /* The secure bit is negative logic. */
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (kstats->keysw_status == KEY_SECURE) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel secure_mode = 1;
03831d35f7499c87d51205817c93e9a8d42c4baestevel }
03831d35f7499c87d51205817c93e9a8d42c4baestevel }
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel /*
03831d35f7499c87d51205817c93e9a8d42c4baestevel * The system cannot be in diag and secure mode. This is
03831d35f7499c87d51205817c93e9a8d42c4baestevel * illegal.
03831d35f7499c87d51205817c93e9a8d42c4baestevel */
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (secure_mode && diag_mode) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel result = 2;
03831d35f7499c87d51205817c93e9a8d42c4baestevel return (result);
03831d35f7499c87d51205817c93e9a8d42c4baestevel }
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel /* Now print the keyswitch position. */
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf("Keyswitch position is in ", 0);
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (diag_mode) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf("Diagnostic Mode\n");
03831d35f7499c87d51205817c93e9a8d42c4baestevel } else if (secure_mode) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf("Secure Mode\n", 0);
03831d35f7499c87d51205817c93e9a8d42c4baestevel } else {
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf("Normal Mode\n");
03831d35f7499c87d51205817c93e9a8d42c4baestevel }
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel /* display the redundant power status */
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (kstats->sys_kstats_ok) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf("System Power Status: ", 0);
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel switch (kstats->power_state) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel case REDUNDANT:
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf("Redundant\n", 0);
03831d35f7499c87d51205817c93e9a8d42c4baestevel break;
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel case MINIMUM:
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf("Minimum Available\n", 0);
03831d35f7499c87d51205817c93e9a8d42c4baestevel break;
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel case BELOW_MINIMUM:
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf("Insufficient Power Available\n", 0);
03831d35f7499c87d51205817c93e9a8d42c4baestevel break;
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel default:
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf("Unknown\n", 0);
03831d35f7499c87d51205817c93e9a8d42c4baestevel break;
03831d35f7499c87d51205817c93e9a8d42c4baestevel }
03831d35f7499c87d51205817c93e9a8d42c4baestevel }
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (kstats->sys_kstats_ok) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel /*
03831d35f7499c87d51205817c93e9a8d42c4baestevel * If the center LED is on, then we return a non-zero
03831d35f7499c87d51205817c93e9a8d42c4baestevel * result.
03831d35f7499c87d51205817c93e9a8d42c4baestevel */
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf("System LED Status: GREEN YELLOW "
03831d35f7499c87d51205817c93e9a8d42c4baestevel "GREEN\n", 0);
03831d35f7499c87d51205817c93e9a8d42c4baestevel if ((kstats->sysctrl & SYS_LED_MID) != 0) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf("WARNING ", 0);
03831d35f7499c87d51205817c93e9a8d42c4baestevel } else {
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf("Normal ", 0);
03831d35f7499c87d51205817c93e9a8d42c4baestevel }
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel /*
03831d35f7499c87d51205817c93e9a8d42c4baestevel * Left LED is negative logic, center and right LEDs
03831d35f7499c87d51205817c93e9a8d42c4baestevel * are positive logic.
03831d35f7499c87d51205817c93e9a8d42c4baestevel */
03831d35f7499c87d51205817c93e9a8d42c4baestevel if ((kstats->sysctrl & SYS_LED_LEFT) == 0) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf("ON ", 0);
03831d35f7499c87d51205817c93e9a8d42c4baestevel } else {
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf("OFF", 0);
03831d35f7499c87d51205817c93e9a8d42c4baestevel }
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf(" ", 0);
03831d35f7499c87d51205817c93e9a8d42c4baestevel if ((kstats->sysctrl & SYS_LED_MID) != 0) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf("ON ", 0);
03831d35f7499c87d51205817c93e9a8d42c4baestevel } else {
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf("OFF", 0);
03831d35f7499c87d51205817c93e9a8d42c4baestevel }
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf(" BLINKING", 0);
03831d35f7499c87d51205817c93e9a8d42c4baestevel }
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf("\n", 0);
03831d35f7499c87d51205817c93e9a8d42c4baestevel return (result);
03831d35f7499c87d51205817c93e9a8d42c4baestevel}
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel/*
03831d35f7499c87d51205817c93e9a8d42c4baestevel * disp_env_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 */
03831d35f7499c87d51205817c93e9a8d42c4baestevelstatic int
03831d35f7499c87d51205817c93e9a8d42c4baesteveldisp_env_status(struct system_kstat_data *kstats)
03831d35f7499c87d51205817c93e9a8d42c4baestevel{
03831d35f7499c87d51205817c93e9a8d42c4baestevel struct bd_kstat_data *bksp;
03831d35f7499c87d51205817c93e9a8d42c4baestevel int exit_code = 0;
03831d35f7499c87d51205817c93e9a8d42c4baestevel int i;
03831d35f7499c87d51205817c93e9a8d42c4baestevel uchar_t curr_temp;
03831d35f7499c87d51205817c93e9a8d42c4baestevel int is4slot = 0;
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel /*
03831d35f7499c87d51205817c93e9a8d42c4baestevel * Define some message arrays to make life simpler. These
03831d35f7499c87d51205817c93e9a8d42c4baestevel * messages correspond to definitions in <sys/fhc.c> for
03831d35f7499c87d51205817c93e9a8d42c4baestevel * temperature trend (enum temp_trend) and temperature state
03831d35f7499c87d51205817c93e9a8d42c4baestevel * (enum temp_state).
03831d35f7499c87d51205817c93e9a8d42c4baestevel */
03831d35f7499c87d51205817c93e9a8d42c4baestevel static char *temp_trend_msg[] = { "unknown",
03831d35f7499c87d51205817c93e9a8d42c4baestevel "rapidly falling",
03831d35f7499c87d51205817c93e9a8d42c4baestevel "falling",
03831d35f7499c87d51205817c93e9a8d42c4baestevel "stable",
03831d35f7499c87d51205817c93e9a8d42c4baestevel "rising",
03831d35f7499c87d51205817c93e9a8d42c4baestevel "rapidly rising",
03831d35f7499c87d51205817c93e9a8d42c4baestevel "unknown (noisy)"
03831d35f7499c87d51205817c93e9a8d42c4baestevel };
03831d35f7499c87d51205817c93e9a8d42c4baestevel static char *temp_state_msg[] = { " OK ",
03831d35f7499c87d51205817c93e9a8d42c4baestevel "WARNING ",
03831d35f7499c87d51205817c93e9a8d42c4baestevel " DANGER "
03831d35f7499c87d51205817c93e9a8d42c4baestevel };
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
03831d35f7499c87d51205817c93e9a8d42c4baestevel exit_code = disp_keysw_and_leds(kstats);
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (!kstats->sys_kstats_ok) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf(dgettext(TEXT_DOMAIN,
03831d35f7499c87d51205817c93e9a8d42c4baestevel "*** Error: Unavailable ***\n\n"));
03831d35f7499c87d51205817c93e9a8d42c4baestevel return (1);
03831d35f7499c87d51205817c93e9a8d42c4baestevel }
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel /*
03831d35f7499c87d51205817c93e9a8d42c4baestevel * for purposes within this routine,
03831d35f7499c87d51205817c93e9a8d42c4baestevel * 5 slot behaves the same as a 4 slot
03831d35f7499c87d51205817c93e9a8d42c4baestevel */
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (SYS_TYPE(kstats->sysstat1) == SYS_4_SLOT)
03831d35f7499c87d51205817c93e9a8d42c4baestevel is4slot = 1;
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf("\n", 0);
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf("\nFans:\n", 0);
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf("-----\n", 0);
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf("Unit Status\n", 0);
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf("---- ------\n", 0);
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf("%-4s ", is4slot ? "Disk" : "Rack", 0);
03831d35f7499c87d51205817c93e9a8d42c4baestevel /* Check the status of the Rack Fans */
03831d35f7499c87d51205817c93e9a8d42c4baestevel if ((kstats->fan_status & SYS_RACK_FANFAIL) == 0) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf("OK\n", 0);
03831d35f7499c87d51205817c93e9a8d42c4baestevel } else {
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf("FAIL\n", 0);
03831d35f7499c87d51205817c93e9a8d42c4baestevel exit_code = 1;
03831d35f7499c87d51205817c93e9a8d42c4baestevel }
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (!is4slot) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel /*
03831d35f7499c87d51205817c93e9a8d42c4baestevel * keyswitch and ac box are on 8 & 16 slot only
03831d35f7499c87d51205817c93e9a8d42c4baestevel */
03831d35f7499c87d51205817c93e9a8d42c4baestevel /* Check the status of the Keyswitch Fan assembly. */
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf("%-4s ", "Key", 0);
03831d35f7499c87d51205817c93e9a8d42c4baestevel if ((kstats->fan_status & SYS_KEYSW_FAN_OK) != 0) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf("OK\n", 0);
03831d35f7499c87d51205817c93e9a8d42c4baestevel } else {
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf("FAIL\n", 0);
03831d35f7499c87d51205817c93e9a8d42c4baestevel exit_code = 1;
03831d35f7499c87d51205817c93e9a8d42c4baestevel }
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf("%-4s ", "AC", 0);
03831d35f7499c87d51205817c93e9a8d42c4baestevel if ((kstats->fan_status & SYS_AC_FAN_OK) != 0) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf("OK\n", 0);
03831d35f7499c87d51205817c93e9a8d42c4baestevel } else {
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf("FAIL\n", 0);
03831d35f7499c87d51205817c93e9a8d42c4baestevel exit_code = 1;
03831d35f7499c87d51205817c93e9a8d42c4baestevel }
03831d35f7499c87d51205817c93e9a8d42c4baestevel } else {
03831d35f7499c87d51205817c93e9a8d42c4baestevel /*
03831d35f7499c87d51205817c93e9a8d42c4baestevel * peripheral fan is on 4 slot only
03831d35f7499c87d51205817c93e9a8d42c4baestevel * XXX might want to indicate transient states too
03831d35f7499c87d51205817c93e9a8d42c4baestevel */
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (kstats->psstat_kstat_ok) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (kstats->ps_shadow[SYS_P_FAN_INDEX] == PS_OK) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf("PPS OK\n", 0);
03831d35f7499c87d51205817c93e9a8d42c4baestevel } else if (kstats->ps_shadow[SYS_P_FAN_INDEX] ==
03831d35f7499c87d51205817c93e9a8d42c4baestevel PS_FAIL) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf("PPS FAIL\n", 0);
03831d35f7499c87d51205817c93e9a8d42c4baestevel exit_code = 1;
03831d35f7499c87d51205817c93e9a8d42c4baestevel }
03831d35f7499c87d51205817c93e9a8d42c4baestevel }
03831d35f7499c87d51205817c93e9a8d42c4baestevel }
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf("\n", 0);
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf("System Temperatures (Celsius):\n", 0);
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf("------------------------------\n", 0);
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf("Brd State Current Min Max Trend\n", 0);
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf("--- ------- ------- --- --- -----\n", 0);
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel for (i = 0, bksp = &kstats->bd_ksp_list[0]; i < MAX_BOARDS;
03831d35f7499c87d51205817c93e9a8d42c4baestevel i++, bksp++) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel /* Make sure we have kstats for this board first */
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (!bksp->temp_kstat_ok) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel continue;
03831d35f7499c87d51205817c93e9a8d42c4baestevel }
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf("%2d ", i, 0);
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel /* Print the current state of the temperature */
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf("%s", temp_state_msg[bksp->tempstat.state], 0);
03831d35f7499c87d51205817c93e9a8d42c4baestevel /* Set exit code for WARNING and DANGER */
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (bksp->tempstat.state != 0)
03831d35f7499c87d51205817c93e9a8d42c4baestevel exit_code = 1;
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel /* Print the current temperature */
03831d35f7499c87d51205817c93e9a8d42c4baestevel curr_temp = bksp->tempstat.l1[bksp->tempstat.index % L1_SZ];
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf(" %2d ", curr_temp, 0);
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel /* Print the minimum recorded temperature */
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf(" %2d ", bksp->tempstat.min, 0);
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel /* Print the maximum recorded temperature */
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf(" %2d ", bksp->tempstat.max, 0);
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel /* Print the current trend in temperature (if available) */
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (bksp->tempstat.version < 2)
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf("unknown\n", 0);
03831d35f7499c87d51205817c93e9a8d42c4baestevel else
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf("%s\n", temp_trend_msg[bksp->tempstat.trend], 0);
03831d35f7499c87d51205817c93e9a8d42c4baestevel }
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (kstats->temp_kstat_ok) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf("CLK ", 0);
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel /* Print the current state of the temperature */
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf("%s", temp_state_msg[kstats->tempstat.state], 0);
03831d35f7499c87d51205817c93e9a8d42c4baestevel /* Set exit code for WARNING or DANGER */
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (kstats->tempstat.state != 0)
03831d35f7499c87d51205817c93e9a8d42c4baestevel exit_code = 1;
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel /* Print the current temperature */
03831d35f7499c87d51205817c93e9a8d42c4baestevel curr_temp = kstats->tempstat.l1[kstats->tempstat.index % L1_SZ];
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf(" %2d ", curr_temp, 0);
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel /* Print the minimum recorded temperature */
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf(" %2d ", kstats->tempstat.min, 0);
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel /* Print the maximum recorded temperature */
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf(" %2d ", kstats->tempstat.max, 0);
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel /* Print the current trend in temperature (if available) */
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (kstats->tempstat.version < 2)
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf("unknown\n\n", 0);
03831d35f7499c87d51205817c93e9a8d42c4baestevel else
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf("%s\n\n",
03831d35f7499c87d51205817c93e9a8d42c4baestevel temp_trend_msg[kstats->tempstat.trend], 0);
03831d35f7499c87d51205817c93e9a8d42c4baestevel } else {
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf("\n");
03831d35f7499c87d51205817c93e9a8d42c4baestevel }
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf("\n", 0);
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf("Power Supplies:\n", 0);
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf("---------------\n", 0);
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf("Supply Status\n", 0);
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf("--------- ------\n", 0);
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (kstats->psstat_kstat_ok) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel for (i = 0; i < SYS_PS_COUNT; i++) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel char *ps, *state;
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel /* skip core power supplies that are not present */
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (i <= SYS_PPS0_INDEX && kstats->ps_shadow[i] ==
03831d35f7499c87d51205817c93e9a8d42c4baestevel PS_OUT)
03831d35f7499c87d51205817c93e9a8d42c4baestevel continue;
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel /* Display the unit Number */
03831d35f7499c87d51205817c93e9a8d42c4baestevel switch (i) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel case 0: ps = "0"; break;
03831d35f7499c87d51205817c93e9a8d42c4baestevel case 1: ps = "1"; break;
03831d35f7499c87d51205817c93e9a8d42c4baestevel case 2: ps = "2"; break;
03831d35f7499c87d51205817c93e9a8d42c4baestevel case 3: ps = "3"; break;
03831d35f7499c87d51205817c93e9a8d42c4baestevel case 4: ps = "4"; break;
03831d35f7499c87d51205817c93e9a8d42c4baestevel case 5: ps = "5"; break;
03831d35f7499c87d51205817c93e9a8d42c4baestevel case 6: ps = "6"; break;
03831d35f7499c87d51205817c93e9a8d42c4baestevel case 7: ps = is4slot ? "2nd PPS" : "7"; break;
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel case SYS_PPS0_INDEX: ps = "PPS"; break;
03831d35f7499c87d51205817c93e9a8d42c4baestevel case SYS_CLK_33_INDEX: ps = " System 3.3v"; break;
03831d35f7499c87d51205817c93e9a8d42c4baestevel case SYS_CLK_50_INDEX: ps = " System 5.0v"; break;
03831d35f7499c87d51205817c93e9a8d42c4baestevel case SYS_V5_P_INDEX: ps = " Peripheral 5.0v"; break;
03831d35f7499c87d51205817c93e9a8d42c4baestevel case SYS_V12_P_INDEX: ps = " Peripheral 12v"; break;
03831d35f7499c87d51205817c93e9a8d42c4baestevel case SYS_V5_AUX_INDEX: ps = " Auxiliary 5.0v"; break;
03831d35f7499c87d51205817c93e9a8d42c4baestevel case SYS_V5_P_PCH_INDEX: ps =
03831d35f7499c87d51205817c93e9a8d42c4baestevel " Peripheral 5.0v precharge";
03831d35f7499c87d51205817c93e9a8d42c4baestevel break;
03831d35f7499c87d51205817c93e9a8d42c4baestevel case SYS_V12_P_PCH_INDEX: ps =
03831d35f7499c87d51205817c93e9a8d42c4baestevel " Peripheral 12v precharge";
03831d35f7499c87d51205817c93e9a8d42c4baestevel break;
03831d35f7499c87d51205817c93e9a8d42c4baestevel case SYS_V3_PCH_INDEX: ps =
03831d35f7499c87d51205817c93e9a8d42c4baestevel " System 3.3v precharge"; break;
03831d35f7499c87d51205817c93e9a8d42c4baestevel case SYS_V5_PCH_INDEX: ps =
03831d35f7499c87d51205817c93e9a8d42c4baestevel " System 5.0v precharge"; break;
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel /* skip the peripheral fan here */
03831d35f7499c87d51205817c93e9a8d42c4baestevel case SYS_P_FAN_INDEX:
03831d35f7499c87d51205817c93e9a8d42c4baestevel continue;
03831d35f7499c87d51205817c93e9a8d42c4baestevel }
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel /* what is the state? */
03831d35f7499c87d51205817c93e9a8d42c4baestevel switch (kstats->ps_shadow[i]) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel case PS_OK:
03831d35f7499c87d51205817c93e9a8d42c4baestevel state = "OK";
03831d35f7499c87d51205817c93e9a8d42c4baestevel break;
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel case PS_FAIL:
03831d35f7499c87d51205817c93e9a8d42c4baestevel state = "FAIL";
03831d35f7499c87d51205817c93e9a8d42c4baestevel exit_code = 1;
03831d35f7499c87d51205817c93e9a8d42c4baestevel break;
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel /* XXX is this an exit_code condition? */
03831d35f7499c87d51205817c93e9a8d42c4baestevel case PS_OUT:
03831d35f7499c87d51205817c93e9a8d42c4baestevel state = "PPS Out";
03831d35f7499c87d51205817c93e9a8d42c4baestevel exit_code = 1;
03831d35f7499c87d51205817c93e9a8d42c4baestevel break;
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel case PS_UNKNOWN:
03831d35f7499c87d51205817c93e9a8d42c4baestevel state = "Unknown";
03831d35f7499c87d51205817c93e9a8d42c4baestevel break;
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel default:
03831d35f7499c87d51205817c93e9a8d42c4baestevel state = "Illegal State";
03831d35f7499c87d51205817c93e9a8d42c4baestevel break;
03831d35f7499c87d51205817c93e9a8d42c4baestevel }
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf("%-32s %s\n", ps, state, 0);
03831d35f7499c87d51205817c93e9a8d42c4baestevel }
03831d35f7499c87d51205817c93e9a8d42c4baestevel }
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel /* Check status of the system AC Power Source */
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf("%-32s ", "AC Power", 0);
03831d35f7499c87d51205817c93e9a8d42c4baestevel if ((kstats->sysstat2 & SYS_AC_FAIL) == 0) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf("OK\n", 0);
03831d35f7499c87d51205817c93e9a8d42c4baestevel } else {
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf("failed\n", 0);
03831d35f7499c87d51205817c93e9a8d42c4baestevel exit_code = 1;
03831d35f7499c87d51205817c93e9a8d42c4baestevel }
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf("\n", 0);
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel return (exit_code);
03831d35f7499c87d51205817c93e9a8d42c4baestevel}
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel/*
03831d35f7499c87d51205817c93e9a8d42c4baestevel * Many of the ASICs present in fusion machines have implementation and
03831d35f7499c87d51205817c93e9a8d42c4baestevel * version numbers stored in the OBP device tree. These codes are displayed
03831d35f7499c87d51205817c93e9a8d42c4baestevel * in this routine in an effort to aid Engineering and Field service
03831d35f7499c87d51205817c93e9a8d42c4baestevel * in detecting old ASICs which may have bugs in them.
03831d35f7499c87d51205817c93e9a8d42c4baestevel */
03831d35f7499c87d51205817c93e9a8d42c4baestevelstatic void
03831d35f7499c87d51205817c93e9a8d42c4baestevelsunfire_disp_asic_revs(Sys_tree *tree, struct system_kstat_data *kstats)
03831d35f7499c87d51205817c93e9a8d42c4baestevel{
03831d35f7499c87d51205817c93e9a8d42c4baestevel Board_node *bnode;
03831d35f7499c87d51205817c93e9a8d42c4baestevel Prom_node *pnode;
03831d35f7499c87d51205817c93e9a8d42c4baestevel int isplusbrd;
03831d35f7499c87d51205817c93e9a8d42c4baestevel char *board_str[] = { "Uninitialized", "Unknown", "CPU",
03831d35f7499c87d51205817c93e9a8d42c4baestevel "Memory", "Dual-SBus", "UPA-SBus",
03831d35f7499c87d51205817c93e9a8d42c4baestevel "Dual-PCI", "Disk", "Clock",
03831d35f7499c87d51205817c93e9a8d42c4baestevel "Dual-SBus-SOC+", "UPA-SBus-SOC+"};
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 /* Else this is a Sunfire or campfire */
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf("ASIC Revisions:\n", 0);
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf("---------------\n", 0);
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel /* Display Firetruck ASIC Revisions first */
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf("Brd FHC AC SBus0 SBus1 PCI0 PCI1 FEPS", 0);
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf(" Board Type Attributes", 0);
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf("\n", 0);
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf("--- --- -- ----- ----- ---- ---- ----", 0);
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf(" ---------- ----------", 0);
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf("\n", 0);
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel /*
03831d35f7499c87d51205817c93e9a8d42c4baestevel * Display all of the FHC, AC, and chip revisions for the entire
03831d35f7499c87d51205817c93e9a8d42c4baestevel * machine. The AC anf FHC chip revs are available from the device
03831d35f7499c87d51205817c93e9a8d42c4baestevel * tree that was read out of the PROM, but the DC chip revs will be
03831d35f7499c87d51205817c93e9a8d42c4baestevel * read via a kstat. The interfaces for this are not completely
03831d35f7499c87d51205817c93e9a8d42c4baestevel * available at this time.
03831d35f7499c87d51205817c93e9a8d42c4baestevel */
03831d35f7499c87d51205817c93e9a8d42c4baestevel bnode = tree->bd_list;
03831d35f7499c87d51205817c93e9a8d42c4baestevel while (bnode != NULL) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel int *version;
03831d35f7499c87d51205817c93e9a8d42c4baestevel int upa = bd_to_upa(bnode->board_num);
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel /* Display the header with the board number */
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf("%2d ", bnode->board_num, 0);
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel /* display the FHC version */
03831d35f7499c87d51205817c93e9a8d42c4baestevel if ((pnode = dev_find_node(bnode->nodes, "fhc")) == NULL) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf(" ", 0);
03831d35f7499c87d51205817c93e9a8d42c4baestevel } else {
03831d35f7499c87d51205817c93e9a8d42c4baestevel if ((version = (int *)get_prop_val(find_prop(pnode,
03831d35f7499c87d51205817c93e9a8d42c4baestevel "version#"))) == NULL) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf(" ", 0);
03831d35f7499c87d51205817c93e9a8d42c4baestevel } else {
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf(" %d ", *version, 0);
03831d35f7499c87d51205817c93e9a8d42c4baestevel }
03831d35f7499c87d51205817c93e9a8d42c4baestevel }
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel /* display the AC version */
03831d35f7499c87d51205817c93e9a8d42c4baestevel if ((pnode = dev_find_node(bnode->nodes, "ac")) == NULL) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf(" ", 0);
03831d35f7499c87d51205817c93e9a8d42c4baestevel } else {
03831d35f7499c87d51205817c93e9a8d42c4baestevel if ((version = (int *)get_prop_val(find_prop(pnode,
03831d35f7499c87d51205817c93e9a8d42c4baestevel "version#"))) == NULL) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf(" ", 0);
03831d35f7499c87d51205817c93e9a8d42c4baestevel } else {
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf(" %d ", *version, 0);
03831d35f7499c87d51205817c93e9a8d42c4baestevel }
03831d35f7499c87d51205817c93e9a8d42c4baestevel }
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel /* Find sysio 0 on board and print rev */
03831d35f7499c87d51205817c93e9a8d42c4baestevel if ((pnode = find_device(bnode, upa, "sbus")) == NULL) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf(" ", 0);
03831d35f7499c87d51205817c93e9a8d42c4baestevel } else {
03831d35f7499c87d51205817c93e9a8d42c4baestevel if ((version = (int *)get_prop_val(find_prop(pnode,
03831d35f7499c87d51205817c93e9a8d42c4baestevel "version#"))) == NULL) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf(" ", 0);
03831d35f7499c87d51205817c93e9a8d42c4baestevel } else {
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf(" %d ", *version, 0);
03831d35f7499c87d51205817c93e9a8d42c4baestevel }
03831d35f7499c87d51205817c93e9a8d42c4baestevel }
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel /* Find sysio 1 on board and print rev */
03831d35f7499c87d51205817c93e9a8d42c4baestevel if ((pnode = find_device(bnode, upa+1, "sbus")) == NULL) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf(" ", 0);
03831d35f7499c87d51205817c93e9a8d42c4baestevel } else {
03831d35f7499c87d51205817c93e9a8d42c4baestevel if ((version = (int *)get_prop_val(find_prop(pnode,
03831d35f7499c87d51205817c93e9a8d42c4baestevel "version#"))) == NULL) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf(" ", 0);
03831d35f7499c87d51205817c93e9a8d42c4baestevel } else {
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf(" %d ", *version, 0);
03831d35f7499c87d51205817c93e9a8d42c4baestevel }
03831d35f7499c87d51205817c93e9a8d42c4baestevel }
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel /* Find Psycho 0 on board and print rev */
03831d35f7499c87d51205817c93e9a8d42c4baestevel if ((pnode = find_device(bnode, upa, "pci")) == NULL) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf(" ", 0);
03831d35f7499c87d51205817c93e9a8d42c4baestevel } else {
03831d35f7499c87d51205817c93e9a8d42c4baestevel if ((version = (int *)get_prop_val(find_prop(pnode,
03831d35f7499c87d51205817c93e9a8d42c4baestevel "version#"))) == NULL) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf(" ", 0);
03831d35f7499c87d51205817c93e9a8d42c4baestevel } else {
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf(" %d ", *version, 0);
03831d35f7499c87d51205817c93e9a8d42c4baestevel }
03831d35f7499c87d51205817c93e9a8d42c4baestevel }
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel /* Find Psycho 1 on board and print rev */
03831d35f7499c87d51205817c93e9a8d42c4baestevel if ((pnode = find_device(bnode, upa+1, "pci")) == NULL) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf(" ", 0);
03831d35f7499c87d51205817c93e9a8d42c4baestevel } else {
03831d35f7499c87d51205817c93e9a8d42c4baestevel if ((version = (int *)get_prop_val(find_prop(pnode,
03831d35f7499c87d51205817c93e9a8d42c4baestevel "version#"))) == NULL) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf(" ", 0);
03831d35f7499c87d51205817c93e9a8d42c4baestevel } else {
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf(" %d ", *version, 0);
03831d35f7499c87d51205817c93e9a8d42c4baestevel }
03831d35f7499c87d51205817c93e9a8d42c4baestevel }
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel /* Find the FEPS on board and print rev */
03831d35f7499c87d51205817c93e9a8d42c4baestevel if ((pnode = dev_find_node(bnode->nodes, "SUNW,hme")) != NULL) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel if ((version = (int *)get_prop_val(find_prop(pnode,
03831d35f7499c87d51205817c93e9a8d42c4baestevel "hm-rev"))) != NULL) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (*version == 0xa0) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf(" 2.0 ", 0);
03831d35f7499c87d51205817c93e9a8d42c4baestevel } else if (*version == 0x20) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf(" 2.1 ", 0);
03831d35f7499c87d51205817c93e9a8d42c4baestevel } else {
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf(" %2x ", *version, 0);
03831d35f7499c87d51205817c93e9a8d42c4baestevel }
03831d35f7499c87d51205817c93e9a8d42c4baestevel }
03831d35f7499c87d51205817c93e9a8d42c4baestevel } else
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf(" ", 0);
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel /* print out the board type */
03831d35f7499c87d51205817c93e9a8d42c4baestevel isplusbrd = ISPLUSBRD(kstats->bd_ksp_list
03831d35f7499c87d51205817c93e9a8d42c4baestevel [bnode->board_num].fhc_bsr);
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf("%-16s", board_str[bnode->board_type], 0);
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (isplusbrd)
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf("100MHz Capable", 0);
03831d35f7499c87d51205817c93e9a8d42c4baestevel else
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf("84MHz Capable", 0);
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf("\n", 0);
03831d35f7499c87d51205817c93e9a8d42c4baestevel bnode = bnode->next;
03831d35f7499c87d51205817c93e9a8d42c4baestevel }
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf("\n", 0);
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel /* Now display the FFB board component revisions */
03831d35f7499c87d51205817c93e9a8d42c4baestevel for (bnode = tree->bd_list; bnode != NULL; bnode = bnode->next) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel display_ffb(bnode, 0);
03831d35f7499c87d51205817c93e9a8d42c4baestevel }
03831d35f7499c87d51205817c93e9a8d42c4baestevel}
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevelstatic void
03831d35f7499c87d51205817c93e9a8d42c4baesteveldisplay_hp_boards(struct system_kstat_data *kstats)
03831d35f7499c87d51205817c93e9a8d42c4baestevel{
03831d35f7499c87d51205817c93e9a8d42c4baestevel int i;
03831d35f7499c87d51205817c93e9a8d42c4baestevel int j;
03831d35f7499c87d51205817c93e9a8d42c4baestevel int hp_found = 0;
03831d35f7499c87d51205817c93e9a8d42c4baestevel struct hp_info *hp;
03831d35f7499c87d51205817c93e9a8d42c4baestevel char *state;
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel for (i = 0, hp = &kstats->hp_info[0]; i < MAX_BOARDS; i++, hp++) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (!hp->kstat_ok) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel continue;
03831d35f7499c87d51205817c93e9a8d42c4baestevel }
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel hp_found = 1;
03831d35f7499c87d51205817c93e9a8d42c4baestevel }
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel /* return if there are no hotplug boards in the system. */
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (!hp_found) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel return;
03831d35f7499c87d51205817c93e9a8d42c4baestevel }
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (hp_found != 0) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf("\n", 0);
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf("Detached Boards\n", 0);
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf("===============\n", 0);
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf(" Slot State Type Info\n", 0);
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf(" ---- --------- ------ ----"
03831d35f7499c87d51205817c93e9a8d42c4baestevel "-------------------------------------\n", 0);
03831d35f7499c87d51205817c93e9a8d42c4baestevel }
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel /* Display all detached boards */
03831d35f7499c87d51205817c93e9a8d42c4baestevel for (i = 0, hp = &kstats->hp_info[0]; i < MAX_BOARDS; i++, hp++) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel struct cpu_info *cpu;
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (hp->kstat_ok == 0) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel continue;
03831d35f7499c87d51205817c93e9a8d42c4baestevel }
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel switch (hp->bd_info.state) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel case UNKNOWN_STATE:
03831d35f7499c87d51205817c93e9a8d42c4baestevel state = "unknown";
03831d35f7499c87d51205817c93e9a8d42c4baestevel break;
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel case ACTIVE_STATE:
03831d35f7499c87d51205817c93e9a8d42c4baestevel state = "active";
03831d35f7499c87d51205817c93e9a8d42c4baestevel break;
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel case LOWPOWER_STATE:
03831d35f7499c87d51205817c93e9a8d42c4baestevel state = "low-power";
03831d35f7499c87d51205817c93e9a8d42c4baestevel break;
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel case HOTPLUG_STATE:
03831d35f7499c87d51205817c93e9a8d42c4baestevel state = "hot-plug";
03831d35f7499c87d51205817c93e9a8d42c4baestevel break;
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel case DISABLED_STATE:
03831d35f7499c87d51205817c93e9a8d42c4baestevel state = "disabled";
03831d35f7499c87d51205817c93e9a8d42c4baestevel break;
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel case FAILED_STATE:
03831d35f7499c87d51205817c93e9a8d42c4baestevel state = "failed";
03831d35f7499c87d51205817c93e9a8d42c4baestevel break;
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel default:
03831d35f7499c87d51205817c93e9a8d42c4baestevel state = "unknown";
03831d35f7499c87d51205817c93e9a8d42c4baestevel break;
03831d35f7499c87d51205817c93e9a8d42c4baestevel }
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf(" %2d %9s ", i, state, 0);
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel switch (hp->bd_info.type) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel case MEM_BOARD:
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf("%-14s ", MEM_BD_NAME, 0);
03831d35f7499c87d51205817c93e9a8d42c4baestevel break;
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel case CPU_BOARD:
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf("%-14s ", CPU_BD_NAME, 0);
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel /* Cannot display CPU info for disabled boards */
03831d35f7499c87d51205817c93e9a8d42c4baestevel if ((hp->bd_info.state == DISABLED_STATE) ||
03831d35f7499c87d51205817c93e9a8d42c4baestevel (hp->bd_info.state == FAILED_STATE)) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel break;
03831d35f7499c87d51205817c93e9a8d42c4baestevel }
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel /* Display both CPUs if present */
03831d35f7499c87d51205817c93e9a8d42c4baestevel cpu = &hp->bd_info.bd.cpu[0];
03831d35f7499c87d51205817c93e9a8d42c4baestevel for (j = 0; j < 2; j++, cpu++) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf("CPU %d: ", j, 0);
03831d35f7499c87d51205817c93e9a8d42c4baestevel /* Print the rated speed of the CPU. */
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (cpu->cpu_speed > 1) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf("%3d MHz", cpu->cpu_speed,
03831d35f7499c87d51205817c93e9a8d42c4baestevel 0);
03831d35f7499c87d51205817c93e9a8d42c4baestevel } else {
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf("no CPU ", 0);
03831d35f7499c87d51205817c93e9a8d42c4baestevel continue;
03831d35f7499c87d51205817c93e9a8d42c4baestevel }
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel /* Display the size of the cache */
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (cpu->cache_size != 0) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf(" %0.1fM ",
03831d35f7499c87d51205817c93e9a8d42c4baestevel (float)cpu->cache_size /
03831d35f7499c87d51205817c93e9a8d42c4baestevel (float)(1024*1024), 0);
03831d35f7499c87d51205817c93e9a8d42c4baestevel } else {
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf(" ", 0);
03831d35f7499c87d51205817c93e9a8d42c4baestevel }
03831d35f7499c87d51205817c93e9a8d42c4baestevel }
03831d35f7499c87d51205817c93e9a8d42c4baestevel break;
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel case IO_2SBUS_BOARD:
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf("%-14s ", IO_2SBUS_BD_NAME, 0);
03831d35f7499c87d51205817c93e9a8d42c4baestevel break;
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel case IO_2SBUS_SOCPLUS_BOARD:
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf("%-14s ", IO_2SBUS_SOCPLUS_BD_NAME, 0);
03831d35f7499c87d51205817c93e9a8d42c4baestevel break;
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel case IO_SBUS_FFB_BOARD:
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf("%-14s ", IO_SBUS_FFB_BD_NAME, 0);
03831d35f7499c87d51205817c93e9a8d42c4baestevel switch (hp->bd_info.bd.io2.ffb_size) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel case FFB_SINGLE:
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf("Single buffered FFB", 0);
03831d35f7499c87d51205817c93e9a8d42c4baestevel break;
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel case FFB_DOUBLE:
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf("Double buffered FFB", 0);
03831d35f7499c87d51205817c93e9a8d42c4baestevel break;
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel case FFB_NOT_FOUND:
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf("No FFB installed", 0);
03831d35f7499c87d51205817c93e9a8d42c4baestevel break;
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel default:
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf("Illegal FFB size", 0);
03831d35f7499c87d51205817c93e9a8d42c4baestevel break;
03831d35f7499c87d51205817c93e9a8d42c4baestevel }
03831d35f7499c87d51205817c93e9a8d42c4baestevel break;
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel case IO_SBUS_FFB_SOCPLUS_BOARD:
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf("%-14s ", IO_SBUS_FFB_SOCPLUS_BD_NAME, 0);
03831d35f7499c87d51205817c93e9a8d42c4baestevel switch (hp->bd_info.bd.io2.ffb_size) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel case FFB_SINGLE:
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf("Single buffered FFB", 0);
03831d35f7499c87d51205817c93e9a8d42c4baestevel break;
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel case FFB_DOUBLE:
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf("Double buffered FFB", 0);
03831d35f7499c87d51205817c93e9a8d42c4baestevel break;
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel case FFB_NOT_FOUND:
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf("No FFB installed", 0);
03831d35f7499c87d51205817c93e9a8d42c4baestevel break;
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel default:
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf("Illegal FFB size", 0);
03831d35f7499c87d51205817c93e9a8d42c4baestevel break;
03831d35f7499c87d51205817c93e9a8d42c4baestevel }
03831d35f7499c87d51205817c93e9a8d42c4baestevel break;
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel case IO_PCI_BOARD:
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf("%-14s ", IO_PCI_BD_NAME, 0);
03831d35f7499c87d51205817c93e9a8d42c4baestevel break;
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel case DISK_BOARD:
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf("%-14s ", "disk", 0);
03831d35f7499c87d51205817c93e9a8d42c4baestevel for (j = 0; j < 2; j++) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf("Disk %d:", j, 0);
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (hp->bd_info.bd.dsk.disk_pres[j]) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf(" Target: %2d ",
03831d35f7499c87d51205817c93e9a8d42c4baestevel hp->bd_info.bd.dsk.disk_id[j],
03831d35f7499c87d51205817c93e9a8d42c4baestevel 0);
03831d35f7499c87d51205817c93e9a8d42c4baestevel } else {
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf(" no disk ", 0);
03831d35f7499c87d51205817c93e9a8d42c4baestevel }
03831d35f7499c87d51205817c93e9a8d42c4baestevel }
03831d35f7499c87d51205817c93e9a8d42c4baestevel break;
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel case UNKNOWN_BOARD:
03831d35f7499c87d51205817c93e9a8d42c4baestevel case UNINIT_BOARD:
03831d35f7499c87d51205817c93e9a8d42c4baestevel default:
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf("UNKNOWN ", 0);
03831d35f7499c87d51205817c93e9a8d42c4baestevel break;
03831d35f7499c87d51205817c93e9a8d42c4baestevel }
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf("\n");
03831d35f7499c87d51205817c93e9a8d42c4baestevel }
03831d35f7499c87d51205817c93e9a8d42c4baestevel}
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel/*
03831d35f7499c87d51205817c93e9a8d42c4baestevel * Analysis functions:
03831d35f7499c87d51205817c93e9a8d42c4baestevel *
03831d35f7499c87d51205817c93e9a8d42c4baestevel * Most of the Fatal error data analyzed from error registers is not
03831d35f7499c87d51205817c93e9a8d42c4baestevel * very complicated. This is because the FRUs for errors detected by
03831d35f7499c87d51205817c93e9a8d42c4baestevel * most parts is either a CPU module, a FFB, or the system board
03831d35f7499c87d51205817c93e9a8d42c4baestevel * itself.
03831d35f7499c87d51205817c93e9a8d42c4baestevel * The analysis of the Address Controller errors is the most complicated.
03831d35f7499c87d51205817c93e9a8d42c4baestevel * These errors can be caused by other boards as well as the local board.
03831d35f7499c87d51205817c93e9a8d42c4baestevel */
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel/*
03831d35f7499c87d51205817c93e9a8d42c4baestevel * analyze_cpu
03831d35f7499c87d51205817c93e9a8d42c4baestevel *
03831d35f7499c87d51205817c93e9a8d42c4baestevel * Analyze the CPU MFSR passed in and determine what type of fatal
03831d35f7499c87d51205817c93e9a8d42c4baestevel * hardware errors occurred at the time of the crash. This function
03831d35f7499c87d51205817c93e9a8d42c4baestevel * returns a pointer to a string to the calling routine.
03831d35f7499c87d51205817c93e9a8d42c4baestevel */
03831d35f7499c87d51205817c93e9a8d42c4baestevelstatic int
03831d35f7499c87d51205817c93e9a8d42c4baestevelanalyze_cpu(char **msgs, int cpu_id, u_longlong_t afsr)
03831d35f7499c87d51205817c93e9a8d42c4baestevel{
03831d35f7499c87d51205817c93e9a8d42c4baestevel int count = 0;
03831d35f7499c87d51205817c93e9a8d42c4baestevel int i;
03831d35f7499c87d51205817c93e9a8d42c4baestevel int syndrome;
03831d35f7499c87d51205817c93e9a8d42c4baestevel char msgbuf[MAXSTRLEN];
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (msgs == NULL) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel return (count);
03831d35f7499c87d51205817c93e9a8d42c4baestevel }
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (afsr & P_AFSR_ETP) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel (void) sprintf(msgbuf, "CPU %d Ecache Tag Parity Error, ",
03831d35f7499c87d51205817c93e9a8d42c4baestevel cpu_id);
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel /* extract syndrome for afsr */
03831d35f7499c87d51205817c93e9a8d42c4baestevel syndrome = (afsr & P_AFSR_ETS) >> ETS_SHIFT;
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel /* now concat the parity syndrome msg */
03831d35f7499c87d51205817c93e9a8d42c4baestevel for (i = 0; i < 4; i++) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel if ((0x1 << i) & syndrome) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel (void) strcat(msgbuf, ecache_parity[i]);
03831d35f7499c87d51205817c93e9a8d42c4baestevel }
03831d35f7499c87d51205817c93e9a8d42c4baestevel }
03831d35f7499c87d51205817c93e9a8d42c4baestevel (void) strcat(msgbuf, "\n");
03831d35f7499c87d51205817c93e9a8d42c4baestevel *msgs++ = strdup(msgbuf);
03831d35f7499c87d51205817c93e9a8d42c4baestevel count++;
03831d35f7499c87d51205817c93e9a8d42c4baestevel }
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (afsr & P_AFSR_ISAP) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel (void) sprintf(msgbuf,
03831d35f7499c87d51205817c93e9a8d42c4baestevel "CPU %d Incoming System Address Parity Error\n",
03831d35f7499c87d51205817c93e9a8d42c4baestevel cpu_id);
03831d35f7499c87d51205817c93e9a8d42c4baestevel *msgs++ = strdup(msgbuf);
03831d35f7499c87d51205817c93e9a8d42c4baestevel count++;
03831d35f7499c87d51205817c93e9a8d42c4baestevel }
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel return (count);
03831d35f7499c87d51205817c93e9a8d42c4baestevel}
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel/*
03831d35f7499c87d51205817c93e9a8d42c4baestevel * analyze_ac
03831d35f7499c87d51205817c93e9a8d42c4baestevel *
03831d35f7499c87d51205817c93e9a8d42c4baestevel * This function checks the AC error register passed in and checks
03831d35f7499c87d51205817c93e9a8d42c4baestevel * for any errors that occured during the fatal hardware reset.
03831d35f7499c87d51205817c93e9a8d42c4baestevel */
03831d35f7499c87d51205817c93e9a8d42c4baestevelstatic int
03831d35f7499c87d51205817c93e9a8d42c4baestevelanalyze_ac(char **msgs, u_longlong_t ac_error)
03831d35f7499c87d51205817c93e9a8d42c4baestevel{
03831d35f7499c87d51205817c93e9a8d42c4baestevel int i;
03831d35f7499c87d51205817c93e9a8d42c4baestevel int count = 0;
03831d35f7499c87d51205817c93e9a8d42c4baestevel char msgbuf[MAXSTRLEN];
03831d35f7499c87d51205817c93e9a8d42c4baestevel int tmp_cnt;
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (msgs == NULL) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel return (count);
03831d35f7499c87d51205817c93e9a8d42c4baestevel }
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel for (i = 2; i < MAX_BITS; i++) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel if ((((u_longlong_t)0x1 << i) & ac_error) != 0) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (ac_errors[i].error != NULL) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel (void) sprintf(msgbuf, "AC: %s\n",
03831d35f7499c87d51205817c93e9a8d42c4baestevel ac_errors[i].error);
03831d35f7499c87d51205817c93e9a8d42c4baestevel *msgs++ = strdup(msgbuf);
03831d35f7499c87d51205817c93e9a8d42c4baestevel count++;
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel /* display the part that might cause this */
03831d35f7499c87d51205817c93e9a8d42c4baestevel tmp_cnt = disp_parts(msgs, ac_error, i);
03831d35f7499c87d51205817c93e9a8d42c4baestevel count += tmp_cnt;
03831d35f7499c87d51205817c93e9a8d42c4baestevel msgs += tmp_cnt;
03831d35f7499c87d51205817c93e9a8d42c4baestevel }
03831d35f7499c87d51205817c93e9a8d42c4baestevel }
03831d35f7499c87d51205817c93e9a8d42c4baestevel }
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel return (count);
03831d35f7499c87d51205817c93e9a8d42c4baestevel}
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel/*
03831d35f7499c87d51205817c93e9a8d42c4baestevel * analyze_dc
03831d35f7499c87d51205817c93e9a8d42c4baestevel *
03831d35f7499c87d51205817c93e9a8d42c4baestevel * This routine checks the DC shdow chain and tries to determine
03831d35f7499c87d51205817c93e9a8d42c4baestevel * what type of error might have caused the fatal hardware reset
03831d35f7499c87d51205817c93e9a8d42c4baestevel * error.
03831d35f7499c87d51205817c93e9a8d42c4baestevel */
03831d35f7499c87d51205817c93e9a8d42c4baestevelstatic int
03831d35f7499c87d51205817c93e9a8d42c4baestevelanalyze_dc(int board, char **msgs, u_longlong_t dc_error)
03831d35f7499c87d51205817c93e9a8d42c4baestevel{
03831d35f7499c87d51205817c93e9a8d42c4baestevel int i;
03831d35f7499c87d51205817c93e9a8d42c4baestevel int count = 0;
03831d35f7499c87d51205817c93e9a8d42c4baestevel char msgbuf[MAXSTRLEN];
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (msgs == NULL) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel return (count);
03831d35f7499c87d51205817c93e9a8d42c4baestevel }
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel /*
03831d35f7499c87d51205817c93e9a8d42c4baestevel * The DC scan data is contained in 8 bytes, one byte per
03831d35f7499c87d51205817c93e9a8d42c4baestevel * DC. There are 8 DCs on a system board.
03831d35f7499c87d51205817c93e9a8d42c4baestevel */
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel for (i = 0; i < 8; i++) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (dc_error & DC_OVERFLOW) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel (void) sprintf(msgbuf, dc_overflow_txt, board, i);
03831d35f7499c87d51205817c93e9a8d42c4baestevel *msgs++ = strdup(msgbuf);
03831d35f7499c87d51205817c93e9a8d42c4baestevel count++;
03831d35f7499c87d51205817c93e9a8d42c4baestevel }
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (dc_error & DC_PARITY) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel (void) sprintf(msgbuf, dc_parity_txt, board, i);
03831d35f7499c87d51205817c93e9a8d42c4baestevel *msgs++ = strdup(msgbuf);
03831d35f7499c87d51205817c93e9a8d42c4baestevel count++;
03831d35f7499c87d51205817c93e9a8d42c4baestevel }
03831d35f7499c87d51205817c93e9a8d42c4baestevel dc_error = dc_error >> 8; /* shift over to next byte */
03831d35f7499c87d51205817c93e9a8d42c4baestevel }
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel return (count);
03831d35f7499c87d51205817c93e9a8d42c4baestevel}
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevelstatic int
03831d35f7499c87d51205817c93e9a8d42c4baesteveldisp_parts(char **msgs, u_longlong_t ac_error, int type)
03831d35f7499c87d51205817c93e9a8d42c4baestevel{
03831d35f7499c87d51205817c93e9a8d42c4baestevel int count = 0;
03831d35f7499c87d51205817c93e9a8d42c4baestevel int part;
03831d35f7499c87d51205817c93e9a8d42c4baestevel char msgbuf[MAXSTRLEN];
03831d35f7499c87d51205817c93e9a8d42c4baestevel int i;
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (msgs == NULL) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel return (count);
03831d35f7499c87d51205817c93e9a8d42c4baestevel }
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel (void) sprintf(msgbuf, "\tThe error could be caused by:\n");
03831d35f7499c87d51205817c93e9a8d42c4baestevel *msgs++ = strdup(msgbuf);
03831d35f7499c87d51205817c93e9a8d42c4baestevel count++;
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel for (i = 0; (i < MAX_FRUS) && ac_errors[type].part[i]; i++) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel part = ac_errors[type].part[i];
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (part == UPA_PART) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (ac_error & UPA_PORT_A) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel part = UPA_A_PART;
03831d35f7499c87d51205817c93e9a8d42c4baestevel } else if (ac_error & UPA_PORT_B) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel part = UPA_B_PART;
03831d35f7499c87d51205817c93e9a8d42c4baestevel }
03831d35f7499c87d51205817c93e9a8d42c4baestevel }
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (part == DTAG_PART) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (ac_error & UPA_PORT_A) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel part = DTAG_A_PART;
03831d35f7499c87d51205817c93e9a8d42c4baestevel } else if (ac_error & UPA_PORT_B) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel part = DTAG_B_PART;
03831d35f7499c87d51205817c93e9a8d42c4baestevel }
03831d35f7499c87d51205817c93e9a8d42c4baestevel }
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel (void) sprintf(msgbuf, "\t\t%s\n", part_str[part]);
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel *msgs++ = strdup(msgbuf);
03831d35f7499c87d51205817c93e9a8d42c4baestevel count++;
03831d35f7499c87d51205817c93e9a8d42c4baestevel }
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel return (count);
03831d35f7499c87d51205817c93e9a8d42c4baestevel}