03831d35f7499c87d51205817c93e9a8d42c4baestevel * CDDL HEADER START
03831d35f7499c87d51205817c93e9a8d42c4baestevel * The contents of this file are subject to the terms of the
03831d35f7499c87d51205817c93e9a8d42c4baestevel * Common Development and Distribution License, Version 1.0 only
03831d35f7499c87d51205817c93e9a8d42c4baestevel * (the "License"). You may not use this file except in compliance
03831d35f7499c87d51205817c93e9a8d42c4baestevel * with the License.
03831d35f7499c87d51205817c93e9a8d42c4baestevel * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
03831d35f7499c87d51205817c93e9a8d42c4baestevel * See the License for the specific language governing permissions
03831d35f7499c87d51205817c93e9a8d42c4baestevel * and limitations under the License.
03831d35f7499c87d51205817c93e9a8d42c4baestevel * When distributing Covered Code, include this CDDL HEADER in each
03831d35f7499c87d51205817c93e9a8d42c4baestevel * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
03831d35f7499c87d51205817c93e9a8d42c4baestevel * If applicable, add the following below this CDDL HEADER, with the
03831d35f7499c87d51205817c93e9a8d42c4baestevel * fields enclosed by brackets "[]" replaced with your own identifying
03831d35f7499c87d51205817c93e9a8d42c4baestevel * information: Portions Copyright [yyyy] [name of copyright owner]
03831d35f7499c87d51205817c93e9a8d42c4baestevel * CDDL HEADER END
03831d35f7499c87d51205817c93e9a8d42c4baestevel * Copyright 2005 Sun Microsystems, Inc. All rights reserved.
03831d35f7499c87d51205817c93e9a8d42c4baestevel * Use is subject to license terms.
03831d35f7499c87d51205817c93e9a8d42c4baestevel * Sunfire Platform specific functions.
03831d35f7499c87d51205817c93e9a8d42c4baestevel * called when :
03831d35f7499c87d51205817c93e9a8d42c4baestevel * machine_type == MTYPE_SUNFIRE
03831d35f7499c87d51205817c93e9a8d42c4baestevel#pragma ident "%Z%%M% %I% %E% SMI"
03831d35f7499c87d51205817c93e9a8d42c4baestevel/* Macros for manipulating UPA IDs and board numbers on Sunfire. */
03831d35f7499c87d51205817c93e9a8d42c4baestevel * these functions will overlay the symbol table of libprtdiag
03831d35f7499c87d51205817c93e9a8d42c4baestevel * at runtime (sunfire systems only)
03831d35f7499c87d51205817c93e9a8d42c4baestevelint error_check(Sys_tree *tree, struct system_kstat_data *kstats);
03831d35f7499c87d51205817c93e9a8d42c4baestevelvoid display_memoryconf(Sys_tree *tree, struct grp_info *grps);
03831d35f7499c87d51205817c93e9a8d42c4baestevelvoid display_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/* local functions */
03831d35f7499c87d51205817c93e9a8d42c4baestevelstatic void build_mem_tables(Sys_tree *, struct system_kstat_data *,
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_env_status(struct system_kstat_data *);
03831d35f7499c87d51205817c93e9a8d42c4baestevelstatic int disp_keysw_and_leds(struct system_kstat_data *);
03831d35f7499c87d51205817c93e9a8d42c4baestevelstatic void erase_msgs(char **);
03831d35f7499c87d51205817c93e9a8d42c4baestevelstatic void sunfire_disp_asic_revs(Sys_tree *, struct system_kstat_data *);
03831d35f7499c87d51205817c93e9a8d42c4baestevelstatic void display_hp_boards(struct system_kstat_data *);
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/* Define special bits */
03831d35f7499c87d51205817c93e9a8d42c4baestevel * These defines comne from async.h, but it does not get exported from
03831d35f7499c87d51205817c93e9a8d42c4baestevel * uts/sun4u/sys, so they must be redefined.
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/* List of parts possible */
03831d35f7499c87d51205817c93e9a8d42c4baestevel/* List of possible parts */
03831d35f7499c87d51205817c93e9a8d42c4baestevel/* Ecache parity error messages. Tells which bits are bad. */
03831d35f7499c87d51205817c93e9a8d42c4baestevel "Bits 7:0 ",
03831d35f7499c87d51205817c93e9a8d42c4baestevel "Bits 15:8 ",
03831d35f7499c87d51205817c93e9a8d42c4baestevel "Bits 21:16 ",
03831d35f7499c87d51205817c93e9a8d42c4baestevel "Bits 24:22 "
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 * 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 "UPA Port A Error",
03831d35f7499c87d51205817c93e9a8d42c4baestevel { UPA_A_PART, 0, 0, 0, 0 },
03831d35f7499c87d51205817c93e9a8d42c4baestevel "UPA Port B Error",
03831d35f7499c87d51205817c93e9a8d42c4baestevel { UPA_B_PART, 0, 0, 0, 0 },
03831d35f7499c87d51205817c93e9a8d42c4baestevel { RSVD_PART, 0, 0, 0, 0 },
03831d35f7499c87d51205817c93e9a8d42c4baestevel { RSVD_PART, 0, 0, 0, 0 },
03831d35f7499c87d51205817c93e9a8d42c4baestevel "UPA Interrupt to unmapped destination",
03831d35f7499c87d51205817c93e9a8d42c4baestevel { BOARD_PART, 0, 0, 0, 0 },
03831d35f7499c87d51205817c93e9a8d42c4baestevel "UPA Non-cacheable write to unmapped destination",
03831d35f7499c87d51205817c93e9a8d42c4baestevel { BOARD_PART, 0, 0, 0, 0 },
03831d35f7499c87d51205817c93e9a8d42c4baestevel "UPA Cacheable write to unmapped destination",
03831d35f7499c87d51205817c93e9a8d42c4baestevel { BOARD_PART, 0, 0, 0, 0 },
03831d35f7499c87d51205817c93e9a8d42c4baestevel "Illegal Write Received",
03831d35f7499c87d51205817c93e9a8d42c4baestevel { BOARD_PART, 0, 0, 0, 0 },
03831d35f7499c87d51205817c93e9a8d42c4baestevel "Local Writeback match with line in state S",
03831d35f7499c87d51205817c93e9a8d42c4baestevel "Local Read match with valid line in Tags",
03831d35f7499c87d51205817c93e9a8d42c4baestevel { RSVD_PART, 0, 0, 0, 0 },
03831d35f7499c87d51205817c93e9a8d42c4baestevel { RSVD_PART, 0, 0, 0, 0 },
03831d35f7499c87d51205817c93e9a8d42c4baestevel "Tag and Victim were valid during lookup",
03831d35f7499c87d51205817c93e9a8d42c4baestevel "Local Writeback matches a victim in state S",
03831d35f7499c87d51205817c93e9a8d42c4baestevel "Local Read matches valid line in victim buffer",
03831d35f7499c87d51205817c93e9a8d42c4baestevel "Local Read victim bit set and victim is S state",
03831d35f7499c87d51205817c93e9a8d42c4baestevel "Local Read Victim bit set and Valid Victim Buffer",
03831d35f7499c87d51205817c93e9a8d42c4baestevel { RSVD_PART, 0, 0, 0, 0 },
03831d35f7499c87d51205817c93e9a8d42c4baestevel { RSVD_PART, 0, 0, 0, 0 },
03831d35f7499c87d51205817c93e9a8d42c4baestevel { RSVD_PART, 0, 0, 0, 0 },
03831d35f7499c87d51205817c93e9a8d42c4baestevel "UPA Transaction received in Sleep mode",
03831d35f7499c87d51205817c93e9a8d42c4baestevel { AC_PART, 0, 0, 0, 0 },
03831d35f7499c87d51205817c93e9a8d42c4baestevel "P_FERR error P_REPLY received from UPA Port",
03831d35f7499c87d51205817c93e9a8d42c4baestevel "Illegal P_REPLY received from UPA Port",
03831d35f7499c87d51205817c93e9a8d42c4baestevel { RSVD_PART, 0, 0, 0, 0 },
03831d35f7499c87d51205817c93e9a8d42c4baestevel "Timeout on a UPA Master Port",
03831d35f7499c87d51205817c93e9a8d42c4baestevel { RSVD_PART, 0, 0, 0, 0 },
03831d35f7499c87d51205817c93e9a8d42c4baestevel { RSVD_PART, 0, 0, 0, 0 },
03831d35f7499c87d51205817c93e9a8d42c4baestevel { RSVD_PART, 0, 0, 0, 0 },
03831d35f7499c87d51205817c93e9a8d42c4baestevel "Coherent Transactions Queue Overflow Error",
03831d35f7499c87d51205817c93e9a8d42c4baestevel { BACK_PIN_PART, BOARD_CONN_PART, AC_PART, AC_ANY_PART, 0 },
03831d35f7499c87d51205817c93e9a8d42c4baestevel "Non-cacheable Request Queue Overflow Error",
03831d35f7499c87d51205817c93e9a8d42c4baestevel "Non-cacheable Reply Queue Overflow Error",
03831d35f7499c87d51205817c93e9a8d42c4baestevel { AC_PART, 0, 0, 0, 0 },
03831d35f7499c87d51205817c93e9a8d42c4baestevel "PREQ Queue Overflow Error",
03831d35f7499c87d51205817c93e9a8d42c4baestevel "Foreign DID CAM Overflow Error",
03831d35f7499c87d51205817c93e9a8d42c4baestevel "FT->UPA Queue Overflow Error",
03831d35f7499c87d51205817c93e9a8d42c4baestevel { BACK_PIN_PART, BOARD_CONN_PART, AC_PART, AC_ANY_PART, 0 },
03831d35f7499c87d51205817c93e9a8d42c4baestevel { RSVD_PART, 0, 0, 0, 0 },
03831d35f7499c87d51205817c93e9a8d42c4baestevel { RSVD_PART, 0, 0, 0, 0 },
03831d35f7499c87d51205817c93e9a8d42c4baestevel "UPA Port B Dtag Parity Error",
03831d35f7499c87d51205817c93e9a8d42c4baestevel "UPA Port A Dtag Parity Error",
03831d35f7499c87d51205817c93e9a8d42c4baestevel { RSVD_PART, 0, 0, 0, 0 },
03831d35f7499c87d51205817c93e9a8d42c4baestevel { RSVD_PART, 0, 0, 0, 0 },
03831d35f7499c87d51205817c93e9a8d42c4baestevel "UPA Bus Parity Error",
03831d35f7499c87d51205817c93e9a8d42c4baestevel "Data ID Line Mismatch",
03831d35f7499c87d51205817c93e9a8d42c4baestevel "Arbitration Line Mismatch",
03831d35f7499c87d51205817c93e9a8d42c4baestevel "Shared Line Parity Mismatch",
03831d35f7499c87d51205817c93e9a8d42c4baestevel "FireTruck Control Line Parity Error",
03831d35f7499c87d51205817c93e9a8d42c4baestevel "FireTruck Address Bus Parity Error",
03831d35f7499c87d51205817c93e9a8d42c4baestevel "Internal RAM Parity Error",
03831d35f7499c87d51205817c93e9a8d42c4baestevel { AC_PART, 0, 0, 0, 0 },
03831d35f7499c87d51205817c93e9a8d42c4baestevel { RSVD_PART, 0, 0, 0, 0 },
03831d35f7499c87d51205817c93e9a8d42c4baestevel "Internal Hardware Error",
03831d35f7499c87d51205817c93e9a8d42c4baestevel { AC_PART, 0, 0, 0, 0 },
03831d35f7499c87d51205817c93e9a8d42c4baestevel "FHC Communications Error",
03831d35f7499c87d51205817c93e9a8d42c4baestevel /* Bits 50-63 are reserved in this implementation. */
03831d35f7499c87d51205817c93e9a8d42c4baestevel#define MAX_BITS (sizeof (ac_errors)/ sizeof (ac_err))
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.
03831d35f7499c87d51205817c93e9a8d42c4baestevelstatic char dc_overflow_txt[] = "Board %d DC %d Overflow Error";
03831d35f7499c87d51205817c93e9a8d42c4baestevelstatic char dc_parity_txt[] = "Board %d DC %d Parity Error";
03831d35f7499c87d51205817c93e9a8d42c4baestevel/* defines for the sysio */
03831d35f7499c87d51205817c93e9a8d42c4baestevelerror_check(Sys_tree *tree, struct system_kstat_data *kstats)
03831d35f7499c87d51205817c93e9a8d42c4baestevel * silently check for any types of machine errors
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (disp_fail_parts(tree) || disp_fault_list(tree, kstats) ||
03831d35f7499c87d51205817c93e9a8d42c4baestevel /* set exit_code to show failures */
03831d35f7499c87d51205817c93e9a8d42c4baestevel * disp_fail_parts
03831d35f7499c87d51205817c93e9a8d42c4baestevel * Display the failed parts in the system. This function looks for
03831d35f7499c87d51205817c93e9a8d42c4baestevel * the status property in all PROM nodes. On systems where
03831d35f7499c87d51205817c93e9a8d42c4baestevel * the PROM does not supports passing diagnostic information
03831d35f7499c87d51205817c93e9a8d42c4baestevel * thruogh the device tree, this routine will be silent.
03831d35f7499c87d51205817c93e9a8d42c4baestevel /* go through all of the boards looking for failed units. */
03831d35f7499c87d51205817c93e9a8d42c4baestevel /* find failed chips */
03831d35f7499c87d51205817c93e9a8d42c4baestevel "Failed Field Replaceable Units (FRU) "
03831d35f7499c87d51205817c93e9a8d42c4baestevel "in System:\n"), 0);
03831d35f7499c87d51205817c93e9a8d42c4baestevel "====================\n", 0);
03831d35f7499c87d51205817c93e9a8d42c4baestevel /* sanity check of data retreived from PROM */
03831d35f7499c87d51205817c93e9a8d42c4baestevel /* Find the board type of this board */
03831d35f7499c87d51205817c93e9a8d42c4baestevel "%s unavailable on %s Board #%d\n"),
03831d35f7499c87d51205817c93e9a8d42c4baestevel "\tFailed Field Replaceable Unit is "), 0);
03831d35f7499c87d51205817c93e9a8d42c4baestevel * Determine whether FRU is CPU module, system
03831d35f7499c87d51205817c93e9a8d42c4baestevel * board, or SBus card.
03831d35f7499c87d51205817c93e9a8d42c4baestevel "SBus Card %d\n"),
03831d35f7499c87d51205817c93e9a8d42c4baestevel "PCI Card %d"),
03831d35f7499c87d51205817c93e9a8d42c4baestevel } else if (((type = get_node_type(pnode)) != NULL) &&
03831d35f7499c87d51205817c93e9a8d42c4baestevel "UltraSPARC module "
03831d35f7499c87d51205817c93e9a8d42c4baestevel "Board %d Module %d\n"),
03831d35f7499c87d51205817c93e9a8d42c4baestevel "No failures found in System\n"), 0);
03831d35f7499c87d51205817c93e9a8d42c4baestevel return (1);
03831d35f7499c87d51205817c93e9a8d42c4baestevel return (0);
03831d35f7499c87d51205817c93e9a8d42c4baesteveldisplay_memorysize(Sys_tree *tree, struct system_kstat_data *kstats,
03831d35f7499c87d51205817c93e9a8d42c4baestevel struct grp_info *grps, struct mem_total *memory_total) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel /* Build the memory group tables and interleave data */
03831d35f7499c87d51205817c93e9a8d42c4baestevel /* display total usable installed memory */
03831d35f7499c87d51205817c93e9a8d42c4baestevel /* We display the NVSIMM size totals separately. */
03831d35f7499c87d51205817c93e9a8d42c4baestevel * This routine displays the memory configuration for all boards in the
03831d35f7499c87d51205817c93e9a8d42c4baesteveldisplay_memoryconf(Sys_tree *tree, struct grp_info *grps)
03831d35f7499c87d51205817c93e9a8d42c4baestevel char *status_str[] = { "Unknown", " Empty ", " Failed", " Active",
03831d35f7499c87d51205817c93e9a8d42c4baestevel " Spare " };
03831d35f7499c87d51205817c93e9a8d42c4baestevel char *cond_str[] = { " Unknown ", " OK ", " Failing ",
03831d35f7499c87d51205817c93e9a8d42c4baestevel /* Print the header for the memory section. */
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 /* Print the Memory groups information. */
03831d35f7499c87d51205817c93e9a8d42c4baestevel /* If this board is not a CPU or MEM board, skip it. */
03831d35f7499c87d51205817c93e9a8d42c4baestevel if ((grp->type != MEM_BOARD) && (grp->type != CPU_BOARD)) {
03831d35f7499c87d51205817c93e9a8d42c4baesteveldisplay_hp_fail_fault(Sys_tree *tree, struct system_kstat_data *kstats)
03831d35f7499c87d51205817c93e9a8d42c4baestevel /* Display Hot plugged, disabled and failed boards */
03831d35f7499c87d51205817c93e9a8d42c4baestevel /* Display failed units */
03831d35f7499c87d51205817c93e9a8d42c4baestevel /* Display fault info */
03831d35f7499c87d51205817c93e9a8d42c4baesteveldisplay_diaginfo(int flag, Prom_node *root, Sys_tree *tree,
03831d35f7499c87d51205817c93e9a8d42c4baestevel * Now display the last powerfail time and the fatal hardware
03831d35f7499c87d51205817c93e9a8d42c4baestevel * reset information. We do this under a couple of conditions.
03831d35f7499c87d51205817c93e9a8d42c4baestevel * First if the user asks for it. The second is iof the user
03831d35f7499c87d51205817c93e9a8d42c4baestevel * told us to do logging, and we found a system failure.
03831d35f7499c87d51205817c93e9a8d42c4baestevel * display time of latest powerfail. Not all systems
03831d35f7499c87d51205817c93e9a8d42c4baestevel * have this capability. For those that do not, this
03831d35f7499c87d51205817c93e9a8d42c4baestevel * is just a no-op.
03831d35f7499c87d51205817c93e9a8d42c4baestevel /* Display system environmental conditions. */
03831d35f7499c87d51205817c93e9a8d42c4baestevel /* Display ASIC Chip revs for all boards. */
03831d35f7499c87d51205817c93e9a8d42c4baestevel /* Print the PROM revisions here */
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 * display_pci
03831d35f7499c87d51205817c93e9a8d42c4baestevel * Call the generic psycho version of this function.
03831d35f7499c87d51205817c93e9a8d42c4baestevel * display_ffb
03831d35f7499c87d51205817c93e9a8d42c4baestevel * Display all FFBs on this board. It can either be in tabular format,
03831d35f7499c87d51205817c93e9a8d42c4baestevel * or a more verbose format.
03831d35f7499c87d51205817c93e9a8d42c4baestevel /* Fill in common information */
03831d35f7499c87d51205817c93e9a8d42c4baestevel for (ffb = dev_find_node(board->nodes, FFB_NAME); ffb != NULL;
03831d35f7499c87d51205817c93e9a8d42c4baestevel /* Print out in table format */
03831d35f7499c87d51205817c93e9a8d42c4baestevel /* XXX - Get the slot number (hack) */
03831d35f7499c87d51205817c93e9a8d42c4baestevel /* Find out if it's single or double buffered */
03831d35f7499c87d51205817c93e9a8d42c4baestevel "Double Buffered");
03831d35f7499c87d51205817c93e9a8d42c4baestevel "Single Buffered");
03831d35f7499c87d51205817c93e9a8d42c4baestevel /* Print model number */
03831d35f7499c87d51205817c93e9a8d42c4baestevel /* print in long format */
03831d35f7499c87d51205817c93e9a8d42c4baestevel /* Find the device node using upa address */
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf("-----------------------------------\n", 0);
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf("\tFBC version: 0x%x\n", fsi.fbc_version, 0);
03831d35f7499c87d51205817c93e9a8d42c4baestevel * This function adds a board node to the board structure where that
03831d35f7499c87d51205817c93e9a8d42c4baestevel * that node's physical component lives.
03831d35f7499c87d51205817c93e9a8d42c4baestevel /* add this node to the Board list of the appropriate board */
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 /* extract the board number from the 'reg' prop. */
03831d35f7499c87d51205817c93e9a8d42c4baestevel /* find the node with the same board number */
03831d35f7499c87d51205817c93e9a8d42c4baestevel /* now attach this prom node to the board list */
03831d35f7499c87d51205817c93e9a8d42c4baestevel /* Insert this node at the end of the list */
03831d35f7499c87d51205817c93e9a8d42c4baestevel * Function resolve_board_types
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 } else if (strcmp(type, IO_2SBUS_SOCPLUS_BD_NAME) == 0) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel } else if (strcmp(type, IO_SBUS_FFB_SOCPLUS_BD_NAME) == 0) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel * local functions
03831d35f7499c87d51205817c93e9a8d42c4baestevel /* Display Prom revision header */
03831d35f7499c87d51205817c93e9a8d42c4baestevel /* For each board, print the POST and OBP versions */
03831d35f7499c87d51205817c93e9a8d42c4baestevel for (bnode = tree->bd_list; bnode != NULL; bnode = bnode->next) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel /* find a flashprom node for this board */
03831d35f7499c87d51205817c93e9a8d42c4baestevel flashprom = dev_find_node(bnode->nodes, "flashprom");
03831d35f7499c87d51205817c93e9a8d42c4baestevel /* If no flashprom node found, continue */
03831d35f7499c87d51205817c93e9a8d42c4baestevel /* flashprom node found, display board# */
03831d35f7499c87d51205817c93e9a8d42c4baestevel * functions that are only needed inside this library
03831d35f7499c87d51205817c93e9a8d42c4baestevel * build_mem_tables
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 * 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 struct mem_inter inter_grps; /* temp structure for interleaves */
03831d35f7499c87d51205817c93e9a8d42c4baestevel /* initialize the interleave lists */
03831d35f7499c87d51205817c93e9a8d42c4baestevel for (i = 0, intrp = &inter_grps.i_grp[0]; i < MAX_GROUPS; i++,
03831d35f7499c87d51205817c93e9a8d42c4baestevel * Copy the board type field into the group record.
03831d35f7499c87d51205817c93e9a8d42c4baestevel /* Make sure we have kstats for this board */
03831d35f7499c87d51205817c93e9a8d42c4baestevel /* Mark this group as invalid and move to next one */
03831d35f7499c87d51205817c93e9a8d42c4baestevel /* Find the bank status property */
03831d35f7499c87d51205817c93e9a8d42c4baestevel grp->condition = bksp->mem_stat[grp->group].condition;
03831d35f7499c87d51205817c93e9a8d42c4baestevel /* base the group size off of the simmstat kstat. */
03831d35f7499c87d51205817c93e9a8d42c4baestevel /* Is it bank 0 or bank 1 */
03831d35f7499c87d51205817c93e9a8d42c4baestevel /* Now decode the size field. */
03831d35f7499c87d51205817c93e9a8d42c4baestevel /* Decode the speed field */
03831d35f7499c87d51205817c93e9a8d42c4baestevel grp->base = GRP_BASE(bksp->ac_memdecode[grp->group]);
03831d35f7499c87d51205817c93e9a8d42c4baestevel } else { /* assume it is group 1 */
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 while ((i < MAX_GROUPS) && !found && (intrp->valid != 0)) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel * We did not find a matching base. So now i and intrp
03831d35f7499c87d51205817c93e9a8d42c4baestevel * now point to the next interleave group in the list.
03831d35f7499c87d51205817c93e9a8d42c4baestevelget_mem_total(struct mem_total *mem_total, struct grp_info *grps)
03831d35f7499c87d51205817c93e9a8d42c4baestevel /* Start with total of zero */
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++) {
03831d35f7499c87d51205817c93e9a8d42c4baesteveldisp_fault_list(Sys_tree *tree, struct system_kstat_data *kstats)
03831d35f7499c87d51205817c93e9a8d42c4baestevel for (i = 0, ftp = kstats->ft_array; i < kstats->nfaults; i++, ftp++) {
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 * If any nodes under this board have a
03831d35f7499c87d51205817c93e9a8d42c4baestevel * status containing "fail", print it out.
03831d35f7499c87d51205817c93e9a8d42c4baestevel "status"));
03831d35f7499c87d51205817c93e9a8d42c4baestevel } else if ((ftp->type == FT_CORE_PS) || (ftp->type == FT_PPS)) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel * disp_err_log
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 * 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 char *err_msgs[MAX_MSGS]; /* holds all messages for a system board */
03831d35f7499c87d51205817c93e9a8d42c4baestevel /* start by initializing the err_msgs array to all NULLs */
03831d35f7499c87d51205817c93e9a8d42c4baestevel for (i = 0; i < MAX_MSGS; i++) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel /* First check to see that the reset-info kstats are present. */
03831d35f7499c87d51205817c93e9a8d42c4baestevel /* Everything is OK, so print out time/date stamp first */
03831d35f7499c87d51205817c93e9a8d42c4baestevel "Analysis of most recent Fatal Hardware Watchdog:\n"),
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf("======================================================\n",
03831d35f7499c87d51205817c93e9a8d42c4baestevel /* initialize the vector and the message index. */
03831d35f7499c87d51205817c93e9a8d42c4baestevel /* Loop Through all of the boards. */
03831d35f7499c87d51205817c93e9a8d42c4baestevel /* Is there data for this board? */
03831d35f7499c87d51205817c93e9a8d42c4baestevel if ((bdp->board_desc & BD_STATE_MASK) == BD_NOT_PRESENT) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel /* If it is a CPU Board, look for CPU data. */
03831d35f7499c87d51205817c93e9a8d42c4baestevel /* analyze CPU 0 if present */
03831d35f7499c87d51205817c93e9a8d42c4baestevel /* analyze CPU1 if present. */
03831d35f7499c87d51205817c93e9a8d42c4baestevel /* Always Analyze the AC and the DCs on a board. */
03831d35f7499c87d51205817c93e9a8d42c4baestevel /* If any messages are logged, we have errors */
03831d35f7499c87d51205817c93e9a8d42c4baestevel /* reset the vector and the message index */
03831d35f7499c87d51205817c93e9a8d42c4baestevel for (i = 0; (*msgs != NULL) && (i < MAX_MSGS); i++, msgs++) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel /* display the header for this board */
03831d35f7499c87d51205817c93e9a8d42c4baestevel for (i = 0; (*msgs != NULL) && (i < MAX_MSGS); i++, msgs++) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel * disp_keysw_and_leds
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 /* Check the first valid board to determeine the diag bit */
03831d35f7499c87d51205817c93e9a8d42c4baestevel /* Find the first valid board */
03831d35f7499c87d51205817c93e9a8d42c4baestevel /* If this was successful, break out of loop */
03831d35f7499c87d51205817c93e9a8d42c4baestevel * Check the register on the clock-board to determine the
03831d35f7499c87d51205817c93e9a8d42c4baestevel * secure bit.
03831d35f7499c87d51205817c93e9a8d42c4baestevel /* The secure bit is negative logic. */
03831d35f7499c87d51205817c93e9a8d42c4baestevel * The system cannot be in diag and secure mode. This is
03831d35f7499c87d51205817c93e9a8d42c4baestevel /* Now print the keyswitch position. */
03831d35f7499c87d51205817c93e9a8d42c4baestevel } else if (secure_mode) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel /* display the redundant power status */
03831d35f7499c87d51205817c93e9a8d42c4baestevel * If the center LED is on, then we return a non-zero
03831d35f7499c87d51205817c93e9a8d42c4baestevel "GREEN\n", 0);
03831d35f7499c87d51205817c93e9a8d42c4baestevel * Left LED is negative logic, center and right LEDs
03831d35f7499c87d51205817c93e9a8d42c4baestevel * are positive logic.
03831d35f7499c87d51205817c93e9a8d42c4baestevel * disp_env_status
03831d35f7499c87d51205817c93e9a8d42c4baestevel * This routine displays the environmental status passed up from
03831d35f7499c87d51205817c93e9a8d42c4baestevel * device drivers via kstats. The kstat names are defined in
03831d35f7499c87d51205817c93e9a8d42c4baestevel * kernel header files included by this module.
03831d35f7499c87d51205817c93e9a8d42c4baestevel * 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 "rapidly falling",
03831d35f7499c87d51205817c93e9a8d42c4baestevel "rapidly rising",
03831d35f7499c87d51205817c93e9a8d42c4baestevel "unknown (noisy)"
03831d35f7499c87d51205817c93e9a8d42c4baestevel "WARNING ",
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf(dgettext(TEXT_DOMAIN, " Environmental Status "), 0);
03831d35f7499c87d51205817c93e9a8d42c4baestevel "*** Error: Unavailable ***\n\n"));
03831d35f7499c87d51205817c93e9a8d42c4baestevel return (1);
03831d35f7499c87d51205817c93e9a8d42c4baestevel * for purposes within this routine,
03831d35f7499c87d51205817c93e9a8d42c4baestevel * 5 slot behaves the same as a 4 slot
03831d35f7499c87d51205817c93e9a8d42c4baestevel /* Check the status of the Rack Fans */
03831d35f7499c87d51205817c93e9a8d42c4baestevel * keyswitch and ac box are on 8 & 16 slot only
03831d35f7499c87d51205817c93e9a8d42c4baestevel /* Check the status of the Keyswitch Fan assembly. */
03831d35f7499c87d51205817c93e9a8d42c4baestevel * peripheral fan is on 4 slot only
03831d35f7499c87d51205817c93e9a8d42c4baestevel * XXX might want to indicate transient states too
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf("--- ------- ------- --- --- -----\n", 0);
03831d35f7499c87d51205817c93e9a8d42c4baestevel for (i = 0, bksp = &kstats->bd_ksp_list[0]; i < MAX_BOARDS;
03831d35f7499c87d51205817c93e9a8d42c4baestevel /* Make sure we have kstats for this board first */
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 /* Print the current temperature */
03831d35f7499c87d51205817c93e9a8d42c4baestevel curr_temp = bksp->tempstat.l1[bksp->tempstat.index % L1_SZ];
03831d35f7499c87d51205817c93e9a8d42c4baestevel /* Print the minimum recorded temperature */
03831d35f7499c87d51205817c93e9a8d42c4baestevel /* Print the maximum recorded temperature */
03831d35f7499c87d51205817c93e9a8d42c4baestevel /* Print the current trend in temperature (if available) */
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf("%s\n", temp_trend_msg[bksp->tempstat.trend], 0);
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 /* Print the current temperature */
03831d35f7499c87d51205817c93e9a8d42c4baestevel curr_temp = kstats->tempstat.l1[kstats->tempstat.index % L1_SZ];
03831d35f7499c87d51205817c93e9a8d42c4baestevel /* Print the minimum recorded temperature */
03831d35f7499c87d51205817c93e9a8d42c4baestevel /* Print the maximum recorded temperature */
03831d35f7499c87d51205817c93e9a8d42c4baestevel /* Print the current trend in temperature (if available) */
03831d35f7499c87d51205817c93e9a8d42c4baestevel for (i = 0; i < SYS_PS_COUNT; i++) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel /* skip core power supplies that are not present */
03831d35f7499c87d51205817c93e9a8d42c4baestevel /* Display the unit Number */
03831d35f7499c87d51205817c93e9a8d42c4baestevel switch (i) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel case SYS_V5_AUX_INDEX: ps = " Auxiliary 5.0v"; break;
03831d35f7499c87d51205817c93e9a8d42c4baestevel " Peripheral 5.0v precharge";
03831d35f7499c87d51205817c93e9a8d42c4baestevel " Peripheral 12v precharge";
03831d35f7499c87d51205817c93e9a8d42c4baestevel " System 3.3v precharge"; break;
03831d35f7499c87d51205817c93e9a8d42c4baestevel " System 5.0v precharge"; break;
03831d35f7499c87d51205817c93e9a8d42c4baestevel /* skip the peripheral fan here */
03831d35f7499c87d51205817c93e9a8d42c4baestevel /* what is the state? */
03831d35f7499c87d51205817c93e9a8d42c4baestevel /* XXX is this an exit_code condition? */
03831d35f7499c87d51205817c93e9a8d42c4baestevel /* Check status of the system AC Power Source */
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.
03831d35f7499c87d51205817c93e9a8d42c4baestevelsunfire_disp_asic_revs(Sys_tree *tree, struct system_kstat_data *kstats)
03831d35f7499c87d51205817c93e9a8d42c4baestevel char *board_str[] = { "Uninitialized", "Unknown", "CPU",
03831d35f7499c87d51205817c93e9a8d42c4baestevel /* Print the header */
03831d35f7499c87d51205817c93e9a8d42c4baestevel /* Else this is a Sunfire or campfire */
03831d35f7499c87d51205817c93e9a8d42c4baestevel /* Display Firetruck ASIC Revisions first */
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf("Brd FHC AC SBus0 SBus1 PCI0 PCI1 FEPS", 0);
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf("--- --- -- ----- ----- ---- ---- ----", 0);
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 /* Display the header with the board number */
03831d35f7499c87d51205817c93e9a8d42c4baestevel /* display the FHC version */
03831d35f7499c87d51205817c93e9a8d42c4baestevel if ((pnode = dev_find_node(bnode->nodes, "fhc")) == NULL) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel /* display the AC version */
03831d35f7499c87d51205817c93e9a8d42c4baestevel if ((pnode = dev_find_node(bnode->nodes, "ac")) == NULL) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel /* Find sysio 0 on board and print rev */
03831d35f7499c87d51205817c93e9a8d42c4baestevel if ((pnode = find_device(bnode, upa, "sbus")) == NULL) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel /* Find sysio 1 on board and print rev */
03831d35f7499c87d51205817c93e9a8d42c4baestevel if ((pnode = find_device(bnode, upa+1, "sbus")) == NULL) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel /* Find Psycho 0 on board and print rev */
03831d35f7499c87d51205817c93e9a8d42c4baestevel if ((pnode = find_device(bnode, upa, "pci")) == NULL) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel /* Find Psycho 1 on board and print rev */
03831d35f7499c87d51205817c93e9a8d42c4baestevel if ((pnode = find_device(bnode, upa+1, "pci")) == NULL) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel /* Find the FEPS on board and print rev */
03831d35f7499c87d51205817c93e9a8d42c4baestevel if ((pnode = dev_find_node(bnode->nodes, "SUNW,hme")) != NULL) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel /* print out the board type */
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf("%-16s", board_str[bnode->board_type], 0);
03831d35f7499c87d51205817c93e9a8d42c4baestevel /* Now display the FFB board component revisions */
03831d35f7499c87d51205817c93e9a8d42c4baestevel for (bnode = tree->bd_list; bnode != NULL; bnode = bnode->next) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel for (i = 0, hp = &kstats->hp_info[0]; i < MAX_BOARDS; i++, hp++) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel /* return if there are no hotplug boards in the system. */
03831d35f7499c87d51205817c93e9a8d42c4baestevel "-------------------------------------\n", 0);
03831d35f7499c87d51205817c93e9a8d42c4baestevel /* Display all detached boards */
03831d35f7499c87d51205817c93e9a8d42c4baestevel for (i = 0, hp = &kstats->hp_info[0]; i < MAX_BOARDS; i++, hp++) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel /* Cannot display CPU info for disabled boards */
03831d35f7499c87d51205817c93e9a8d42c4baestevel /* Display both CPUs if present */
03831d35f7499c87d51205817c93e9a8d42c4baestevel /* Print the rated speed of the CPU. */
03831d35f7499c87d51205817c93e9a8d42c4baestevel /* Display the size of the cache */
03831d35f7499c87d51205817c93e9a8d42c4baestevel log_printf("%-14s ", IO_SBUS_FFB_SOCPLUS_BD_NAME, 0);
03831d35f7499c87d51205817c93e9a8d42c4baestevel for (j = 0; j < 2; j++) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel * Analysis functions:
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 * 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 * analyze_cpu
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.
03831d35f7499c87d51205817c93e9a8d42c4baestevelanalyze_cpu(char **msgs, int cpu_id, u_longlong_t afsr)
03831d35f7499c87d51205817c93e9a8d42c4baestevel (void) sprintf(msgbuf, "CPU %d Ecache Tag Parity Error, ",
03831d35f7499c87d51205817c93e9a8d42c4baestevel /* extract syndrome for afsr */
03831d35f7499c87d51205817c93e9a8d42c4baestevel /* now concat the parity syndrome msg */
03831d35f7499c87d51205817c93e9a8d42c4baestevel for (i = 0; i < 4; i++) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel "CPU %d Incoming System Address Parity Error\n",
03831d35f7499c87d51205817c93e9a8d42c4baestevel * analyze_ac
03831d35f7499c87d51205817c93e9a8d42c4baestevel * This function checks the AC error register passed in and checks
03831d35f7499c87d51205817c93e9a8d42c4baestevel * for any errors that occured during the fatal hardware reset.
03831d35f7499c87d51205817c93e9a8d42c4baestevel /* display the part that might cause this */
03831d35f7499c87d51205817c93e9a8d42c4baestevel * analyze_dc
03831d35f7499c87d51205817c93e9a8d42c4baestevel * This routine checks the DC shdow chain and tries to determine
03831d35f7499c87d51205817c93e9a8d42c4baestevel * what type of error might have caused the fatal hardware reset
03831d35f7499c87d51205817c93e9a8d42c4baestevelanalyze_dc(int board, char **msgs, u_longlong_t dc_error)
03831d35f7499c87d51205817c93e9a8d42c4baestevel * The DC scan data is contained in 8 bytes, one byte per
03831d35f7499c87d51205817c93e9a8d42c4baestevel * DC. There are 8 DCs on a system board.
03831d35f7499c87d51205817c93e9a8d42c4baestevel for (i = 0; i < 8; i++) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel dc_error = dc_error >> 8; /* shift over to next byte */
03831d35f7499c87d51205817c93e9a8d42c4baesteveldisp_parts(char **msgs, u_longlong_t ac_error, int type)
03831d35f7499c87d51205817c93e9a8d42c4baestevel (void) sprintf(msgbuf, "\tThe error could be caused by:\n");