822fb41d6f36e90a1ec836b32f869e1235e7da40tsien/*
822fb41d6f36e90a1ec836b32f869e1235e7da40tsien * CDDL HEADER START
822fb41d6f36e90a1ec836b32f869e1235e7da40tsien *
822fb41d6f36e90a1ec836b32f869e1235e7da40tsien * The contents of this file are subject to the terms of the
31e37bb439502e3f7c4c0a9a77d655ea5d56887avn * Common Development and Distribution License (the "License").
31e37bb439502e3f7c4c0a9a77d655ea5d56887avn * You may not use this file except in compliance with the License.
822fb41d6f36e90a1ec836b32f869e1235e7da40tsien *
822fb41d6f36e90a1ec836b32f869e1235e7da40tsien * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
822fb41d6f36e90a1ec836b32f869e1235e7da40tsien * or http://www.opensolaris.org/os/licensing.
822fb41d6f36e90a1ec836b32f869e1235e7da40tsien * See the License for the specific language governing permissions
822fb41d6f36e90a1ec836b32f869e1235e7da40tsien * and limitations under the License.
822fb41d6f36e90a1ec836b32f869e1235e7da40tsien *
822fb41d6f36e90a1ec836b32f869e1235e7da40tsien * When distributing Covered Code, include this CDDL HEADER in each
822fb41d6f36e90a1ec836b32f869e1235e7da40tsien * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
822fb41d6f36e90a1ec836b32f869e1235e7da40tsien * If applicable, add the following below this CDDL HEADER, with the
822fb41d6f36e90a1ec836b32f869e1235e7da40tsien * fields enclosed by brackets "[]" replaced with your own identifying
822fb41d6f36e90a1ec836b32f869e1235e7da40tsien * information: Portions Copyright [yyyy] [name of copyright owner]
822fb41d6f36e90a1ec836b32f869e1235e7da40tsien *
822fb41d6f36e90a1ec836b32f869e1235e7da40tsien * CDDL HEADER END
822fb41d6f36e90a1ec836b32f869e1235e7da40tsien */
822fb41d6f36e90a1ec836b32f869e1235e7da40tsien/*
cfb7311ca709ca6f4d930977c7498455556b5312Louis Tsien * Copyright (c) 2005, 2010, Oracle and/or its affiliates. All rights reserved.
822fb41d6f36e90a1ec836b32f869e1235e7da40tsien */
822fb41d6f36e90a1ec836b32f869e1235e7da40tsien
822fb41d6f36e90a1ec836b32f869e1235e7da40tsien/*
822fb41d6f36e90a1ec836b32f869e1235e7da40tsien * Ereport-handling routines for memory errors
822fb41d6f36e90a1ec836b32f869e1235e7da40tsien */
822fb41d6f36e90a1ec836b32f869e1235e7da40tsien
822fb41d6f36e90a1ec836b32f869e1235e7da40tsien#include <cmd_mem.h>
822fb41d6f36e90a1ec836b32f869e1235e7da40tsien#include <cmd_dimm.h>
822fb41d6f36e90a1ec836b32f869e1235e7da40tsien#include <cmd_bank.h>
822fb41d6f36e90a1ec836b32f869e1235e7da40tsien#include <cmd_page.h>
822fb41d6f36e90a1ec836b32f869e1235e7da40tsien#include <cmd_cpu.h>
fbd1c0dae6f4a2ccc2ce0527c7f19d3dd5ea90b8sd#include <cmd_branch.h>
fbd1c0dae6f4a2ccc2ce0527c7f19d3dd5ea90b8sd#include <cmd_state.h>
822fb41d6f36e90a1ec836b32f869e1235e7da40tsien#include <cmd.h>
13faa91230bde46da937bf33010b9accc5bdeb59sd#include <cmd_hc_sun4v.h>
822fb41d6f36e90a1ec836b32f869e1235e7da40tsien
31e37bb439502e3f7c4c0a9a77d655ea5d56887avn#include <assert.h>
822fb41d6f36e90a1ec836b32f869e1235e7da40tsien#include <strings.h>
822fb41d6f36e90a1ec836b32f869e1235e7da40tsien#include <string.h>
822fb41d6f36e90a1ec836b32f869e1235e7da40tsien#include <errno.h>
31e37bb439502e3f7c4c0a9a77d655ea5d56887avn#include <unistd.h>
822fb41d6f36e90a1ec836b32f869e1235e7da40tsien#include <fm/fmd_api.h>
31e37bb439502e3f7c4c0a9a77d655ea5d56887avn#include <sys/fm/ldom.h>
822fb41d6f36e90a1ec836b32f869e1235e7da40tsien#include <sys/fm/protocol.h>
822fb41d6f36e90a1ec836b32f869e1235e7da40tsien
822fb41d6f36e90a1ec836b32f869e1235e7da40tsien#include <sys/fm/cpu/UltraSPARC-T1.h>
31e37bb439502e3f7c4c0a9a77d655ea5d56887avn#include <sys/mdesc.h>
822fb41d6f36e90a1ec836b32f869e1235e7da40tsien#include <sys/async.h>
822fb41d6f36e90a1ec836b32f869e1235e7da40tsien#include <sys/errclassify.h>
6dfee4834394825da35b977ca71cdc965bc7b6a4tsien#include <sys/niagararegs.h>
31e37bb439502e3f7c4c0a9a77d655ea5d56887avn#include <sys/fm/ldom.h>
14ea4bb737263733ad80a36b4f73f681c30a6b45sd#include <ctype.h>
31e37bb439502e3f7c4c0a9a77d655ea5d56887avn
fbd1c0dae6f4a2ccc2ce0527c7f19d3dd5ea90b8sd#define VF_TS3_FCR 0x000000000000FFFFULL
fbd1c0dae6f4a2ccc2ce0527c7f19d3dd5ea90b8sd#define VF_L2ESYR_C2C 0x8000000000000000ULL
d4ac42a1cd3016618a9ba0330862d410f0058f89Trang Do#define OFFBIT 0xFFFFFFFFFFFC07FFULL
d4ac42a1cd3016618a9ba0330862d410f0058f89Trang Do#define BIT28_32 0x00000001F0000000ULL
d4ac42a1cd3016618a9ba0330862d410f0058f89Trang Do#define BIT13_17 0x000000000003E000ULL
d4ac42a1cd3016618a9ba0330862d410f0058f89Trang Do#define BIT18_19 0x00000000000C0000ULL
d4ac42a1cd3016618a9ba0330862d410f0058f89Trang Do#define BIT11_12 0x0000000000001800ULL
fbd1c0dae6f4a2ccc2ce0527c7f19d3dd5ea90b8sd#define UTS2_CPUS_PER_CHIP 64
fbd1c0dae6f4a2ccc2ce0527c7f19d3dd5ea90b8sd#define FBR_ERROR ".fbr"
2d6aa547f868d751d00f1f2e70171d9dc9317af1Louis Tsien#define DSU_ERROR ".dsu"
edf0039d316aafc2c1128aca35079119ecf024f1Trang Do#define FERG_INVALID ".invalid"
edf0039d316aafc2c1128aca35079119ecf024f1Trang Do#define DBU_ERROR ".dbu"
fbd1c0dae6f4a2ccc2ce0527c7f19d3dd5ea90b8sd
31e37bb439502e3f7c4c0a9a77d655ea5d56887avnextern ldom_hdl_t *cpumem_diagnosis_lhp;
31e37bb439502e3f7c4c0a9a77d655ea5d56887avn
31e37bb439502e3f7c4c0a9a77d655ea5d56887avnstatic fmd_hdl_t *cpumem_hdl = NULL;
31e37bb439502e3f7c4c0a9a77d655ea5d56887avn
edf0039d316aafc2c1128aca35079119ecf024f1Trang Do#define ERR_CLASS(x, y) (strcmp(strrchr(x, '.'), y))
edf0039d316aafc2c1128aca35079119ecf024f1Trang Do
31e37bb439502e3f7c4c0a9a77d655ea5d56887avnstatic void *
31e37bb439502e3f7c4c0a9a77d655ea5d56887avncpumem_alloc(size_t size)
31e37bb439502e3f7c4c0a9a77d655ea5d56887avn{
31e37bb439502e3f7c4c0a9a77d655ea5d56887avn assert(cpumem_hdl != NULL);
31e37bb439502e3f7c4c0a9a77d655ea5d56887avn
31e37bb439502e3f7c4c0a9a77d655ea5d56887avn return (fmd_hdl_alloc(cpumem_hdl, size, FMD_SLEEP));
31e37bb439502e3f7c4c0a9a77d655ea5d56887avn}
31e37bb439502e3f7c4c0a9a77d655ea5d56887avn
31e37bb439502e3f7c4c0a9a77d655ea5d56887avnstatic void
31e37bb439502e3f7c4c0a9a77d655ea5d56887avncpumem_free(void *addr, size_t size)
31e37bb439502e3f7c4c0a9a77d655ea5d56887avn{
31e37bb439502e3f7c4c0a9a77d655ea5d56887avn assert(cpumem_hdl != NULL);
31e37bb439502e3f7c4c0a9a77d655ea5d56887avn
31e37bb439502e3f7c4c0a9a77d655ea5d56887avn fmd_hdl_free(cpumem_hdl, addr, size);
31e37bb439502e3f7c4c0a9a77d655ea5d56887avn}
822fb41d6f36e90a1ec836b32f869e1235e7da40tsien
822fb41d6f36e90a1ec836b32f869e1235e7da40tsien/*ARGSUSED*/
822fb41d6f36e90a1ec836b32f869e1235e7da40tsiencmd_evdisp_t
822fb41d6f36e90a1ec836b32f869e1235e7da40tsiencmd_mem_synd_check(fmd_hdl_t *hdl, uint64_t afar, uint8_t afar_status,
822fb41d6f36e90a1ec836b32f869e1235e7da40tsien uint16_t synd, uint8_t synd_status, cmd_cpu_t *cpu)
822fb41d6f36e90a1ec836b32f869e1235e7da40tsien{
822fb41d6f36e90a1ec836b32f869e1235e7da40tsien /*
822fb41d6f36e90a1ec836b32f869e1235e7da40tsien * Niagara writebacks from L2 containing UEs are placed in memory
822fb41d6f36e90a1ec836b32f869e1235e7da40tsien * with the poison syndrome NI_DRAM_POISON_SYND_FROM_LDWU.
822fb41d6f36e90a1ec836b32f869e1235e7da40tsien * Memory UE ereports showing this syndrome are dropped because they
822fb41d6f36e90a1ec836b32f869e1235e7da40tsien * indicate an L2 problem, which should be diagnosed from the
822fb41d6f36e90a1ec836b32f869e1235e7da40tsien * corresponding L2 cache ereport.
822fb41d6f36e90a1ec836b32f869e1235e7da40tsien */
50e6accba1026e52ccc1b0d86109daeb4d7cc039td switch (cpu->cpu_type) {
50e6accba1026e52ccc1b0d86109daeb4d7cc039td case CPU_ULTRASPARC_T1:
50e6accba1026e52ccc1b0d86109daeb4d7cc039td if (synd == NI_DRAM_POISON_SYND_FROM_LDWU) {
50e6accba1026e52ccc1b0d86109daeb4d7cc039td fmd_hdl_debug(hdl,
50e6accba1026e52ccc1b0d86109daeb4d7cc039td "discarding UE due to magic syndrome %x\n",
50e6accba1026e52ccc1b0d86109daeb4d7cc039td synd);
50e6accba1026e52ccc1b0d86109daeb4d7cc039td return (CMD_EVD_UNUSED);
50e6accba1026e52ccc1b0d86109daeb4d7cc039td }
50e6accba1026e52ccc1b0d86109daeb4d7cc039td break;
50e6accba1026e52ccc1b0d86109daeb4d7cc039td case CPU_ULTRASPARC_T2:
50e6accba1026e52ccc1b0d86109daeb4d7cc039td case CPU_ULTRASPARC_T2plus:
50e6accba1026e52ccc1b0d86109daeb4d7cc039td if (synd == N2_DRAM_POISON_SYND_FROM_LDWU) {
50e6accba1026e52ccc1b0d86109daeb4d7cc039td fmd_hdl_debug(hdl,
50e6accba1026e52ccc1b0d86109daeb4d7cc039td "discarding UE due to magic syndrome %x\n",
50e6accba1026e52ccc1b0d86109daeb4d7cc039td synd);
50e6accba1026e52ccc1b0d86109daeb4d7cc039td return (CMD_EVD_UNUSED);
50e6accba1026e52ccc1b0d86109daeb4d7cc039td }
50e6accba1026e52ccc1b0d86109daeb4d7cc039td break;
50e6accba1026e52ccc1b0d86109daeb4d7cc039td default:
50e6accba1026e52ccc1b0d86109daeb4d7cc039td break;
822fb41d6f36e90a1ec836b32f869e1235e7da40tsien }
822fb41d6f36e90a1ec836b32f869e1235e7da40tsien return (CMD_EVD_OK);
822fb41d6f36e90a1ec836b32f869e1235e7da40tsien}
822fb41d6f36e90a1ec836b32f869e1235e7da40tsien
fbd1c0dae6f4a2ccc2ce0527c7f19d3dd5ea90b8sdstatic int
fbd1c0dae6f4a2ccc2ce0527c7f19d3dd5ea90b8sdcpu_present(fmd_hdl_t *hdl, nvlist_t *asru, uint32_t *cpuid)
fbd1c0dae6f4a2ccc2ce0527c7f19d3dd5ea90b8sd{
fbd1c0dae6f4a2ccc2ce0527c7f19d3dd5ea90b8sd nvlist_t *cp_asru;
fbd1c0dae6f4a2ccc2ce0527c7f19d3dd5ea90b8sd uint32_t i;
fbd1c0dae6f4a2ccc2ce0527c7f19d3dd5ea90b8sd
fbd1c0dae6f4a2ccc2ce0527c7f19d3dd5ea90b8sd if (nvlist_dup(asru, &cp_asru, 0) != 0) {
fbd1c0dae6f4a2ccc2ce0527c7f19d3dd5ea90b8sd fmd_hdl_debug(hdl, "unable to alloc asru for thread\n");
fbd1c0dae6f4a2ccc2ce0527c7f19d3dd5ea90b8sd return (-1);
fbd1c0dae6f4a2ccc2ce0527c7f19d3dd5ea90b8sd }
fbd1c0dae6f4a2ccc2ce0527c7f19d3dd5ea90b8sd
fbd1c0dae6f4a2ccc2ce0527c7f19d3dd5ea90b8sd for (i = *cpuid; i < *cpuid + UTS2_CPUS_PER_CHIP; i++) {
fbd1c0dae6f4a2ccc2ce0527c7f19d3dd5ea90b8sd
fbd1c0dae6f4a2ccc2ce0527c7f19d3dd5ea90b8sd (void) nvlist_remove_all(cp_asru, FM_FMRI_CPU_ID);
fbd1c0dae6f4a2ccc2ce0527c7f19d3dd5ea90b8sd
fbd1c0dae6f4a2ccc2ce0527c7f19d3dd5ea90b8sd if (nvlist_add_uint32(cp_asru, FM_FMRI_CPU_ID, i) == 0) {
fbd1c0dae6f4a2ccc2ce0527c7f19d3dd5ea90b8sd if (fmd_nvl_fmri_present(hdl, cp_asru) &&
fbd1c0dae6f4a2ccc2ce0527c7f19d3dd5ea90b8sd !fmd_nvl_fmri_unusable(hdl, cp_asru)) {
fbd1c0dae6f4a2ccc2ce0527c7f19d3dd5ea90b8sd nvlist_free(cp_asru);
fbd1c0dae6f4a2ccc2ce0527c7f19d3dd5ea90b8sd *cpuid = i;
fbd1c0dae6f4a2ccc2ce0527c7f19d3dd5ea90b8sd return (0);
fbd1c0dae6f4a2ccc2ce0527c7f19d3dd5ea90b8sd }
fbd1c0dae6f4a2ccc2ce0527c7f19d3dd5ea90b8sd }
fbd1c0dae6f4a2ccc2ce0527c7f19d3dd5ea90b8sd }
fbd1c0dae6f4a2ccc2ce0527c7f19d3dd5ea90b8sd nvlist_free(cp_asru);
fbd1c0dae6f4a2ccc2ce0527c7f19d3dd5ea90b8sd return (-1);
fbd1c0dae6f4a2ccc2ce0527c7f19d3dd5ea90b8sd}
fbd1c0dae6f4a2ccc2ce0527c7f19d3dd5ea90b8sd
fbd1c0dae6f4a2ccc2ce0527c7f19d3dd5ea90b8sd/*ARGSUSED*/
fbd1c0dae6f4a2ccc2ce0527c7f19d3dd5ea90b8sdcmd_evdisp_t
fbd1c0dae6f4a2ccc2ce0527c7f19d3dd5ea90b8sdcmd_c2c(fmd_hdl_t *hdl, fmd_event_t *ep, nvlist_t *nvl, const char *class,
fbd1c0dae6f4a2ccc2ce0527c7f19d3dd5ea90b8sd cmd_errcl_t clcode)
fbd1c0dae6f4a2ccc2ce0527c7f19d3dd5ea90b8sd{
fbd1c0dae6f4a2ccc2ce0527c7f19d3dd5ea90b8sd uint32_t cpuid;
fbd1c0dae6f4a2ccc2ce0527c7f19d3dd5ea90b8sd nvlist_t *det;
fbd1c0dae6f4a2ccc2ce0527c7f19d3dd5ea90b8sd int rc;
fbd1c0dae6f4a2ccc2ce0527c7f19d3dd5ea90b8sd
fbd1c0dae6f4a2ccc2ce0527c7f19d3dd5ea90b8sd (void) nvlist_lookup_nvlist(nvl, FM_EREPORT_DETECTOR, &det);
fbd1c0dae6f4a2ccc2ce0527c7f19d3dd5ea90b8sd if (nvlist_lookup_uint32(det, FM_FMRI_CPU_ID, &cpuid) == 0) {
13faa91230bde46da937bf33010b9accc5bdeb59sd
fbd1c0dae6f4a2ccc2ce0527c7f19d3dd5ea90b8sd /*
fbd1c0dae6f4a2ccc2ce0527c7f19d3dd5ea90b8sd * If the c2c bit is set, the sending cache of the
fbd1c0dae6f4a2ccc2ce0527c7f19d3dd5ea90b8sd * cpu must be faulted instead of the memory.
fbd1c0dae6f4a2ccc2ce0527c7f19d3dd5ea90b8sd * If the detector is chip0, the cache of the chip1
fbd1c0dae6f4a2ccc2ce0527c7f19d3dd5ea90b8sd * is faulted and vice versa.
fbd1c0dae6f4a2ccc2ce0527c7f19d3dd5ea90b8sd */
fbd1c0dae6f4a2ccc2ce0527c7f19d3dd5ea90b8sd if (cpuid < UTS2_CPUS_PER_CHIP)
fbd1c0dae6f4a2ccc2ce0527c7f19d3dd5ea90b8sd cpuid = UTS2_CPUS_PER_CHIP;
fbd1c0dae6f4a2ccc2ce0527c7f19d3dd5ea90b8sd else
fbd1c0dae6f4a2ccc2ce0527c7f19d3dd5ea90b8sd cpuid = 0;
fbd1c0dae6f4a2ccc2ce0527c7f19d3dd5ea90b8sd
fbd1c0dae6f4a2ccc2ce0527c7f19d3dd5ea90b8sd rc = cpu_present(hdl, det, &cpuid);
fbd1c0dae6f4a2ccc2ce0527c7f19d3dd5ea90b8sd
fbd1c0dae6f4a2ccc2ce0527c7f19d3dd5ea90b8sd if (rc != -1) {
fbd1c0dae6f4a2ccc2ce0527c7f19d3dd5ea90b8sd (void) nvlist_remove(det, FM_FMRI_CPU_ID,
fbd1c0dae6f4a2ccc2ce0527c7f19d3dd5ea90b8sd DATA_TYPE_UINT32);
fbd1c0dae6f4a2ccc2ce0527c7f19d3dd5ea90b8sd if (nvlist_add_uint32(det,
fbd1c0dae6f4a2ccc2ce0527c7f19d3dd5ea90b8sd FM_FMRI_CPU_ID, cpuid) == 0) {
fbd1c0dae6f4a2ccc2ce0527c7f19d3dd5ea90b8sd clcode |= CMD_CPU_LEVEL_CHIP;
fbd1c0dae6f4a2ccc2ce0527c7f19d3dd5ea90b8sd return (cmd_l2u(hdl, ep, nvl, class, clcode));
fbd1c0dae6f4a2ccc2ce0527c7f19d3dd5ea90b8sd }
fbd1c0dae6f4a2ccc2ce0527c7f19d3dd5ea90b8sd
fbd1c0dae6f4a2ccc2ce0527c7f19d3dd5ea90b8sd }
fbd1c0dae6f4a2ccc2ce0527c7f19d3dd5ea90b8sd }
fbd1c0dae6f4a2ccc2ce0527c7f19d3dd5ea90b8sd fmd_hdl_debug(hdl, "cmd_c2c: no cpuid discarding C2C error");
fbd1c0dae6f4a2ccc2ce0527c7f19d3dd5ea90b8sd return (CMD_EVD_BAD);
fbd1c0dae6f4a2ccc2ce0527c7f19d3dd5ea90b8sd}
fbd1c0dae6f4a2ccc2ce0527c7f19d3dd5ea90b8sd
822fb41d6f36e90a1ec836b32f869e1235e7da40tsien/*
822fb41d6f36e90a1ec836b32f869e1235e7da40tsien * sun4v's xe_common routine has an extra argument, clcode, compared
822fb41d6f36e90a1ec836b32f869e1235e7da40tsien * to routine of same name in sun4u.
822fb41d6f36e90a1ec836b32f869e1235e7da40tsien */
822fb41d6f36e90a1ec836b32f869e1235e7da40tsien
822fb41d6f36e90a1ec836b32f869e1235e7da40tsienstatic cmd_evdisp_t
822fb41d6f36e90a1ec836b32f869e1235e7da40tsienxe_common(fmd_hdl_t *hdl, fmd_event_t *ep, nvlist_t *nvl,
822fb41d6f36e90a1ec836b32f869e1235e7da40tsien const char *class, cmd_errcl_t clcode, cmd_xe_handler_f *hdlr)
822fb41d6f36e90a1ec836b32f869e1235e7da40tsien{
31e37bb439502e3f7c4c0a9a77d655ea5d56887avn uint64_t afar, l2_afar, dram_afar;
fbd1c0dae6f4a2ccc2ce0527c7f19d3dd5ea90b8sd uint64_t l2_afsr, dram_afsr, l2_esyr;
822fb41d6f36e90a1ec836b32f869e1235e7da40tsien uint16_t synd;
822fb41d6f36e90a1ec836b32f869e1235e7da40tsien uint8_t afar_status, synd_status;
822fb41d6f36e90a1ec836b32f869e1235e7da40tsien nvlist_t *rsrc;
822fb41d6f36e90a1ec836b32f869e1235e7da40tsien char *typenm;
e97130129ddee9f8432c6fff2dac3c6765280066tsien uint64_t disp = 0;
822fb41d6f36e90a1ec836b32f869e1235e7da40tsien int minorvers = 1;
822fb41d6f36e90a1ec836b32f869e1235e7da40tsien
14ea4bb737263733ad80a36b4f73f681c30a6b45sd if (nvlist_lookup_uint64(nvl,
14ea4bb737263733ad80a36b4f73f681c30a6b45sd FM_EREPORT_PAYLOAD_NAME_L2_AFSR, &l2_afsr) != 0 &&
14ea4bb737263733ad80a36b4f73f681c30a6b45sd nvlist_lookup_uint64(nvl,
14ea4bb737263733ad80a36b4f73f681c30a6b45sd FM_EREPORT_PAYLOAD_NAME_L2_ESR, &l2_afsr) != 0)
14ea4bb737263733ad80a36b4f73f681c30a6b45sd return (CMD_EVD_BAD);
14ea4bb737263733ad80a36b4f73f681c30a6b45sd
14ea4bb737263733ad80a36b4f73f681c30a6b45sd if (nvlist_lookup_uint64(nvl,
14ea4bb737263733ad80a36b4f73f681c30a6b45sd FM_EREPORT_PAYLOAD_NAME_DRAM_AFSR, &dram_afsr) != 0 &&
14ea4bb737263733ad80a36b4f73f681c30a6b45sd nvlist_lookup_uint64(nvl,
14ea4bb737263733ad80a36b4f73f681c30a6b45sd FM_EREPORT_PAYLOAD_NAME_DRAM_ESR, &dram_afsr) != 0)
14ea4bb737263733ad80a36b4f73f681c30a6b45sd return (CMD_EVD_BAD);
14ea4bb737263733ad80a36b4f73f681c30a6b45sd
14ea4bb737263733ad80a36b4f73f681c30a6b45sd if (nvlist_lookup_uint64(nvl,
14ea4bb737263733ad80a36b4f73f681c30a6b45sd FM_EREPORT_PAYLOAD_NAME_L2_AFAR, &l2_afar) != 0 &&
14ea4bb737263733ad80a36b4f73f681c30a6b45sd nvlist_lookup_uint64(nvl,
14ea4bb737263733ad80a36b4f73f681c30a6b45sd FM_EREPORT_PAYLOAD_NAME_L2_EAR, &l2_afar) != 0)
14ea4bb737263733ad80a36b4f73f681c30a6b45sd return (CMD_EVD_BAD);
14ea4bb737263733ad80a36b4f73f681c30a6b45sd
14ea4bb737263733ad80a36b4f73f681c30a6b45sd if (nvlist_lookup_uint64(nvl,
14ea4bb737263733ad80a36b4f73f681c30a6b45sd FM_EREPORT_PAYLOAD_NAME_DRAM_AFAR, &dram_afar) != 0 &&
14ea4bb737263733ad80a36b4f73f681c30a6b45sd nvlist_lookup_uint64(nvl,
14ea4bb737263733ad80a36b4f73f681c30a6b45sd FM_EREPORT_PAYLOAD_NAME_DRAM_EAR, &dram_afar) != 0)
14ea4bb737263733ad80a36b4f73f681c30a6b45sd return (CMD_EVD_BAD);
14ea4bb737263733ad80a36b4f73f681c30a6b45sd
822fb41d6f36e90a1ec836b32f869e1235e7da40tsien if (nvlist_lookup_pairs(nvl, 0,
822fb41d6f36e90a1ec836b32f869e1235e7da40tsien FM_EREPORT_PAYLOAD_NAME_ERR_TYPE, DATA_TYPE_STRING, &typenm,
822fb41d6f36e90a1ec836b32f869e1235e7da40tsien FM_EREPORT_PAYLOAD_NAME_RESOURCE, DATA_TYPE_NVLIST, &rsrc,
822fb41d6f36e90a1ec836b32f869e1235e7da40tsien NULL) != 0)
822fb41d6f36e90a1ec836b32f869e1235e7da40tsien return (CMD_EVD_BAD);
822fb41d6f36e90a1ec836b32f869e1235e7da40tsien
822fb41d6f36e90a1ec836b32f869e1235e7da40tsien synd = dram_afsr;
822fb41d6f36e90a1ec836b32f869e1235e7da40tsien
822fb41d6f36e90a1ec836b32f869e1235e7da40tsien /*
822fb41d6f36e90a1ec836b32f869e1235e7da40tsien * Niagara afar and synd validity.
822fb41d6f36e90a1ec836b32f869e1235e7da40tsien * For a given set of error registers, the payload value is valid if
822fb41d6f36e90a1ec836b32f869e1235e7da40tsien * no higher priority error status bit is set. See UltraSPARC-T1.h for
822fb41d6f36e90a1ec836b32f869e1235e7da40tsien * error status bit values and priority settings. Note that for DAC
822fb41d6f36e90a1ec836b32f869e1235e7da40tsien * and DAU, afar value is taken from l2 error registers, syndrome
822fb41d6f36e90a1ec836b32f869e1235e7da40tsien * from dram error * registers; for DSC and DSU, both afar and
822fb41d6f36e90a1ec836b32f869e1235e7da40tsien * syndrome are taken from dram * error registers. DSU afar and
822fb41d6f36e90a1ec836b32f869e1235e7da40tsien * syndrome are always valid because no
822fb41d6f36e90a1ec836b32f869e1235e7da40tsien * higher priority error will override.
822fb41d6f36e90a1ec836b32f869e1235e7da40tsien */
822fb41d6f36e90a1ec836b32f869e1235e7da40tsien switch (clcode) {
6dfee4834394825da35b977ca71cdc965bc7b6a4tsien case CMD_ERRCL_DAC:
31e37bb439502e3f7c4c0a9a77d655ea5d56887avn afar = l2_afar;
822fb41d6f36e90a1ec836b32f869e1235e7da40tsien afar_status = ((l2_afsr & NI_L2AFSR_P10) == 0) ?
822fb41d6f36e90a1ec836b32f869e1235e7da40tsien AFLT_STAT_VALID : AFLT_STAT_INVALID;
822fb41d6f36e90a1ec836b32f869e1235e7da40tsien synd_status = ((dram_afsr & NI_DMAFSR_P01) == 0) ?
822fb41d6f36e90a1ec836b32f869e1235e7da40tsien AFLT_STAT_VALID : AFLT_STAT_INVALID;
822fb41d6f36e90a1ec836b32f869e1235e7da40tsien break;
6dfee4834394825da35b977ca71cdc965bc7b6a4tsien case CMD_ERRCL_DSC:
31e37bb439502e3f7c4c0a9a77d655ea5d56887avn afar = dram_afar;
822fb41d6f36e90a1ec836b32f869e1235e7da40tsien afar_status = ((dram_afsr & NI_DMAFSR_P01) == 0) ?
822fb41d6f36e90a1ec836b32f869e1235e7da40tsien AFLT_STAT_VALID : AFLT_STAT_INVALID;
822fb41d6f36e90a1ec836b32f869e1235e7da40tsien synd_status = afar_status;
822fb41d6f36e90a1ec836b32f869e1235e7da40tsien break;
6dfee4834394825da35b977ca71cdc965bc7b6a4tsien case CMD_ERRCL_DAU:
31e37bb439502e3f7c4c0a9a77d655ea5d56887avn afar = l2_afar;
822fb41d6f36e90a1ec836b32f869e1235e7da40tsien afar_status = ((l2_afsr & NI_L2AFSR_P05) == 0) ?
822fb41d6f36e90a1ec836b32f869e1235e7da40tsien AFLT_STAT_VALID : AFLT_STAT_INVALID;
822fb41d6f36e90a1ec836b32f869e1235e7da40tsien synd_status = AFLT_STAT_VALID;
fbd1c0dae6f4a2ccc2ce0527c7f19d3dd5ea90b8sd
fbd1c0dae6f4a2ccc2ce0527c7f19d3dd5ea90b8sd if (nvlist_lookup_uint64(nvl, FM_EREPORT_PAYLOAD_NAME_L2_ESYR,
fbd1c0dae6f4a2ccc2ce0527c7f19d3dd5ea90b8sd &l2_esyr) == 0) {
fbd1c0dae6f4a2ccc2ce0527c7f19d3dd5ea90b8sd if (l2_esyr & VF_L2ESYR_C2C) {
fbd1c0dae6f4a2ccc2ce0527c7f19d3dd5ea90b8sd return (cmd_c2c(hdl, ep, nvl, class, clcode));
fbd1c0dae6f4a2ccc2ce0527c7f19d3dd5ea90b8sd }
fbd1c0dae6f4a2ccc2ce0527c7f19d3dd5ea90b8sd }
822fb41d6f36e90a1ec836b32f869e1235e7da40tsien break;
6dfee4834394825da35b977ca71cdc965bc7b6a4tsien case CMD_ERRCL_DSU:
31e37bb439502e3f7c4c0a9a77d655ea5d56887avn afar = dram_afar;
822fb41d6f36e90a1ec836b32f869e1235e7da40tsien afar_status = synd_status = AFLT_STAT_VALID;
822fb41d6f36e90a1ec836b32f869e1235e7da40tsien break;
6dfee4834394825da35b977ca71cdc965bc7b6a4tsien default:
822fb41d6f36e90a1ec836b32f869e1235e7da40tsien fmd_hdl_debug(hdl, "Niagara unrecognized mem error %llx\n",
6dfee4834394825da35b977ca71cdc965bc7b6a4tsien clcode);
822fb41d6f36e90a1ec836b32f869e1235e7da40tsien return (CMD_EVD_UNUSED);
822fb41d6f36e90a1ec836b32f869e1235e7da40tsien }
822fb41d6f36e90a1ec836b32f869e1235e7da40tsien
822fb41d6f36e90a1ec836b32f869e1235e7da40tsien return (hdlr(hdl, ep, nvl, class, afar, afar_status, synd,
822fb41d6f36e90a1ec836b32f869e1235e7da40tsien synd_status, cmd_mem_name2type(typenm, minorvers), disp, rsrc));
822fb41d6f36e90a1ec836b32f869e1235e7da40tsien}
822fb41d6f36e90a1ec836b32f869e1235e7da40tsien
fbd1c0dae6f4a2ccc2ce0527c7f19d3dd5ea90b8sd
822fb41d6f36e90a1ec836b32f869e1235e7da40tsien/*ARGSUSED*/
822fb41d6f36e90a1ec836b32f869e1235e7da40tsiencmd_evdisp_t
822fb41d6f36e90a1ec836b32f869e1235e7da40tsiencmd_ce(fmd_hdl_t *hdl, fmd_event_t *ep, nvlist_t *nvl, const char *class,
822fb41d6f36e90a1ec836b32f869e1235e7da40tsien cmd_errcl_t clcode)
822fb41d6f36e90a1ec836b32f869e1235e7da40tsien{
41d4fbbe41ff68b2451773fa974828dcb122c1e3Karl Davis if (strcmp(class, "ereport.cpu.ultraSPARC-T2plus.dsc") == 0)
41d4fbbe41ff68b2451773fa974828dcb122c1e3Karl Davis return (CMD_EVD_UNUSED); /* drop VF dsc's */
2d6aa547f868d751d00f1f2e70171d9dc9317af1Louis Tsien else
2d6aa547f868d751d00f1f2e70171d9dc9317af1Louis Tsien return (xe_common(hdl, ep, nvl, class, clcode, cmd_ce_common));
822fb41d6f36e90a1ec836b32f869e1235e7da40tsien}
822fb41d6f36e90a1ec836b32f869e1235e7da40tsien
050c9ebdc9d01dca610febe083c1796c5e013868td/*ARGSUSED*/
050c9ebdc9d01dca610febe083c1796c5e013868tdcmd_evdisp_t
050c9ebdc9d01dca610febe083c1796c5e013868tdcmd_ue_train(fmd_hdl_t *hdl, fmd_event_t *ep, nvlist_t *nvl, const char *class,
050c9ebdc9d01dca610febe083c1796c5e013868td cmd_errcl_t clcode)
050c9ebdc9d01dca610febe083c1796c5e013868td{
050c9ebdc9d01dca610febe083c1796c5e013868td cmd_evdisp_t rc, rc1;
050c9ebdc9d01dca610febe083c1796c5e013868td
050c9ebdc9d01dca610febe083c1796c5e013868td /*
050c9ebdc9d01dca610febe083c1796c5e013868td * The DAU is cause of the DAU->DCDP/ICDP train:
050c9ebdc9d01dca610febe083c1796c5e013868td * - process the cause of the event.
050c9ebdc9d01dca610febe083c1796c5e013868td * - register the error to the nop event train, so the effected errors
050c9ebdc9d01dca610febe083c1796c5e013868td * (DCDP/ICDP) will be dropped.
050c9ebdc9d01dca610febe083c1796c5e013868td */
050c9ebdc9d01dca610febe083c1796c5e013868td rc = xe_common(hdl, ep, nvl, class, clcode, cmd_ue_common);
050c9ebdc9d01dca610febe083c1796c5e013868td
050c9ebdc9d01dca610febe083c1796c5e013868td rc1 = cmd_xxcu_initial(hdl, ep, nvl, class, clcode, CMD_XR_HDLR_NOP);
050c9ebdc9d01dca610febe083c1796c5e013868td if (rc1 != 0)
050c9ebdc9d01dca610febe083c1796c5e013868td fmd_hdl_debug(hdl,
050c9ebdc9d01dca610febe083c1796c5e013868td "Fail to add error (%llx) to the train, rc = %d",
050c9ebdc9d01dca610febe083c1796c5e013868td clcode, rc1);
050c9ebdc9d01dca610febe083c1796c5e013868td
050c9ebdc9d01dca610febe083c1796c5e013868td return (rc);
050c9ebdc9d01dca610febe083c1796c5e013868td}
050c9ebdc9d01dca610febe083c1796c5e013868td
822fb41d6f36e90a1ec836b32f869e1235e7da40tsien/*ARGSUSED*/
822fb41d6f36e90a1ec836b32f869e1235e7da40tsiencmd_evdisp_t
822fb41d6f36e90a1ec836b32f869e1235e7da40tsiencmd_ue(fmd_hdl_t *hdl, fmd_event_t *ep, nvlist_t *nvl, const char *class,
822fb41d6f36e90a1ec836b32f869e1235e7da40tsien cmd_errcl_t clcode)
822fb41d6f36e90a1ec836b32f869e1235e7da40tsien{
2d6aa547f868d751d00f1f2e70171d9dc9317af1Louis Tsien if (strcmp(class, "ereport.cpu.ultraSPARC-T2plus.dsu") == 0)
2d6aa547f868d751d00f1f2e70171d9dc9317af1Louis Tsien /*
2d6aa547f868d751d00f1f2e70171d9dc9317af1Louis Tsien * VF dsu's need to be treated like branch errors,
2d6aa547f868d751d00f1f2e70171d9dc9317af1Louis Tsien * because we can't localize to a single DIMM or pair of
2d6aa547f868d751d00f1f2e70171d9dc9317af1Louis Tsien * DIMMs given missing/invalid parts of the dram-ear.
2d6aa547f868d751d00f1f2e70171d9dc9317af1Louis Tsien */
2d6aa547f868d751d00f1f2e70171d9dc9317af1Louis Tsien return (cmd_fb(hdl, ep, nvl, class, clcode));
2d6aa547f868d751d00f1f2e70171d9dc9317af1Louis Tsien else
2d6aa547f868d751d00f1f2e70171d9dc9317af1Louis Tsien return (xe_common(hdl, ep, nvl, class, clcode, cmd_ue_common));
822fb41d6f36e90a1ec836b32f869e1235e7da40tsien}
bddc11567b8dc8b10ae555463608aad4f0c6cb44db
bddc11567b8dc8b10ae555463608aad4f0c6cb44db/*ARGSUSED*/
bddc11567b8dc8b10ae555463608aad4f0c6cb44dbcmd_evdisp_t
bddc11567b8dc8b10ae555463608aad4f0c6cb44dbcmd_frx(fmd_hdl_t *hdl, fmd_event_t *ep, nvlist_t *nvl, const char *class,
bddc11567b8dc8b10ae555463608aad4f0c6cb44db cmd_errcl_t clcode)
bddc11567b8dc8b10ae555463608aad4f0c6cb44db{
bddc11567b8dc8b10ae555463608aad4f0c6cb44db return (CMD_EVD_UNUSED);
bddc11567b8dc8b10ae555463608aad4f0c6cb44db}
31e37bb439502e3f7c4c0a9a77d655ea5d56887avn
fbd1c0dae6f4a2ccc2ce0527c7f19d3dd5ea90b8sd
fbd1c0dae6f4a2ccc2ce0527c7f19d3dd5ea90b8sd/*ARGSUSED*/
fbd1c0dae6f4a2ccc2ce0527c7f19d3dd5ea90b8sdcmd_evdisp_t
fbd1c0dae6f4a2ccc2ce0527c7f19d3dd5ea90b8sdcmd_fb(fmd_hdl_t *hdl, fmd_event_t *ep, nvlist_t *nvl, const char *class,
fbd1c0dae6f4a2ccc2ce0527c7f19d3dd5ea90b8sd cmd_errcl_t clcode)
fbd1c0dae6f4a2ccc2ce0527c7f19d3dd5ea90b8sd{
fbd1c0dae6f4a2ccc2ce0527c7f19d3dd5ea90b8sd cmd_branch_t *branch;
fbd1c0dae6f4a2ccc2ce0527c7f19d3dd5ea90b8sd const char *uuid;
fbd1c0dae6f4a2ccc2ce0527c7f19d3dd5ea90b8sd nvlist_t *asru, *det;
fbd1c0dae6f4a2ccc2ce0527c7f19d3dd5ea90b8sd uint64_t ts3_fcr;
fbd1c0dae6f4a2ccc2ce0527c7f19d3dd5ea90b8sd
fbd1c0dae6f4a2ccc2ce0527c7f19d3dd5ea90b8sd if (nvlist_lookup_nvlist(nvl, FM_RSRC_RESOURCE, &asru) < 0) {
fbd1c0dae6f4a2ccc2ce0527c7f19d3dd5ea90b8sd CMD_STAT_BUMP(bad_mem_asru);
fbd1c0dae6f4a2ccc2ce0527c7f19d3dd5ea90b8sd return (NULL);
fbd1c0dae6f4a2ccc2ce0527c7f19d3dd5ea90b8sd }
fbd1c0dae6f4a2ccc2ce0527c7f19d3dd5ea90b8sd
fbd1c0dae6f4a2ccc2ce0527c7f19d3dd5ea90b8sd if (nvlist_lookup_nvlist(nvl, FM_EREPORT_DETECTOR, &det) < 0) {
fbd1c0dae6f4a2ccc2ce0527c7f19d3dd5ea90b8sd CMD_STAT_BUMP(bad_mem_asru);
fbd1c0dae6f4a2ccc2ce0527c7f19d3dd5ea90b8sd return (NULL);
fbd1c0dae6f4a2ccc2ce0527c7f19d3dd5ea90b8sd }
fbd1c0dae6f4a2ccc2ce0527c7f19d3dd5ea90b8sd
fbd1c0dae6f4a2ccc2ce0527c7f19d3dd5ea90b8sd if (fmd_nvl_fmri_expand(hdl, det) < 0) {
fbd1c0dae6f4a2ccc2ce0527c7f19d3dd5ea90b8sd fmd_hdl_debug(hdl, "Failed to expand detector");
fbd1c0dae6f4a2ccc2ce0527c7f19d3dd5ea90b8sd return (NULL);
fbd1c0dae6f4a2ccc2ce0527c7f19d3dd5ea90b8sd }
fbd1c0dae6f4a2ccc2ce0527c7f19d3dd5ea90b8sd
fbd1c0dae6f4a2ccc2ce0527c7f19d3dd5ea90b8sd branch = cmd_branch_lookup(hdl, asru);
fbd1c0dae6f4a2ccc2ce0527c7f19d3dd5ea90b8sd if (branch == NULL) {
fbd1c0dae6f4a2ccc2ce0527c7f19d3dd5ea90b8sd if ((branch = cmd_branch_create(hdl, asru)) == NULL)
fbd1c0dae6f4a2ccc2ce0527c7f19d3dd5ea90b8sd return (CMD_EVD_UNUSED);
fbd1c0dae6f4a2ccc2ce0527c7f19d3dd5ea90b8sd }
fbd1c0dae6f4a2ccc2ce0527c7f19d3dd5ea90b8sd
fbd1c0dae6f4a2ccc2ce0527c7f19d3dd5ea90b8sd if (branch->branch_case.cc_cp != NULL &&
fbd1c0dae6f4a2ccc2ce0527c7f19d3dd5ea90b8sd fmd_case_solved(hdl, branch->branch_case.cc_cp)) {
fbd1c0dae6f4a2ccc2ce0527c7f19d3dd5ea90b8sd fmd_hdl_debug(hdl, "Case solved\n");
fbd1c0dae6f4a2ccc2ce0527c7f19d3dd5ea90b8sd return (CMD_EVD_REDUND);
fbd1c0dae6f4a2ccc2ce0527c7f19d3dd5ea90b8sd }
fbd1c0dae6f4a2ccc2ce0527c7f19d3dd5ea90b8sd
fbd1c0dae6f4a2ccc2ce0527c7f19d3dd5ea90b8sd if (branch->branch_case.cc_cp == NULL) {
fbd1c0dae6f4a2ccc2ce0527c7f19d3dd5ea90b8sd branch->branch_case.cc_cp = cmd_case_create(hdl,
fbd1c0dae6f4a2ccc2ce0527c7f19d3dd5ea90b8sd &branch->branch_header, CMD_PTR_BRANCH_CASE, &uuid);
fbd1c0dae6f4a2ccc2ce0527c7f19d3dd5ea90b8sd }
fbd1c0dae6f4a2ccc2ce0527c7f19d3dd5ea90b8sd
edf0039d316aafc2c1128aca35079119ecf024f1Trang Do if (ERR_CLASS(class, FBR_ERROR) == 0) {
fbd1c0dae6f4a2ccc2ce0527c7f19d3dd5ea90b8sd if (nvlist_lookup_uint64(nvl, FM_EREPORT_PAYLOAD_NAME_TS3_FCR,
fbd1c0dae6f4a2ccc2ce0527c7f19d3dd5ea90b8sd &ts3_fcr) == 0 && (ts3_fcr != VF_TS3_FCR)) {
fbd1c0dae6f4a2ccc2ce0527c7f19d3dd5ea90b8sd fmd_hdl_debug(hdl,
fbd1c0dae6f4a2ccc2ce0527c7f19d3dd5ea90b8sd "Processing fbr with lane failover\n");
fbd1c0dae6f4a2ccc2ce0527c7f19d3dd5ea90b8sd cmd_branch_create_fault(hdl, branch,
fbd1c0dae6f4a2ccc2ce0527c7f19d3dd5ea90b8sd "fault.memory.link-f", det);
fbd1c0dae6f4a2ccc2ce0527c7f19d3dd5ea90b8sd
fbd1c0dae6f4a2ccc2ce0527c7f19d3dd5ea90b8sd } else {
fbd1c0dae6f4a2ccc2ce0527c7f19d3dd5ea90b8sd fmd_hdl_debug(hdl, "Adding fbr event to serd engine\n");
fbd1c0dae6f4a2ccc2ce0527c7f19d3dd5ea90b8sd if (branch->branch_case.cc_serdnm == NULL) {
fbd1c0dae6f4a2ccc2ce0527c7f19d3dd5ea90b8sd branch->branch_case.cc_serdnm =
fbd1c0dae6f4a2ccc2ce0527c7f19d3dd5ea90b8sd cmd_mem_serdnm_create(hdl,
fbd1c0dae6f4a2ccc2ce0527c7f19d3dd5ea90b8sd "branch", branch->branch_unum);
fbd1c0dae6f4a2ccc2ce0527c7f19d3dd5ea90b8sd
fbd1c0dae6f4a2ccc2ce0527c7f19d3dd5ea90b8sd fmd_serd_create(hdl,
fbd1c0dae6f4a2ccc2ce0527c7f19d3dd5ea90b8sd branch->branch_case.cc_serdnm,
fbd1c0dae6f4a2ccc2ce0527c7f19d3dd5ea90b8sd fmd_prop_get_int32(hdl, "fbr_n"),
fbd1c0dae6f4a2ccc2ce0527c7f19d3dd5ea90b8sd fmd_prop_get_int64(hdl, "fbr_t"));
fbd1c0dae6f4a2ccc2ce0527c7f19d3dd5ea90b8sd }
fbd1c0dae6f4a2ccc2ce0527c7f19d3dd5ea90b8sd
fbd1c0dae6f4a2ccc2ce0527c7f19d3dd5ea90b8sd if (fmd_serd_record(hdl,
fbd1c0dae6f4a2ccc2ce0527c7f19d3dd5ea90b8sd branch->branch_case.cc_serdnm, ep) == FMD_B_FALSE)
fbd1c0dae6f4a2ccc2ce0527c7f19d3dd5ea90b8sd return (CMD_EVD_OK); /* engine hasn't fired */
fbd1c0dae6f4a2ccc2ce0527c7f19d3dd5ea90b8sd
fbd1c0dae6f4a2ccc2ce0527c7f19d3dd5ea90b8sd fmd_hdl_debug(hdl, "fbr serd fired\n");
fbd1c0dae6f4a2ccc2ce0527c7f19d3dd5ea90b8sd
fbd1c0dae6f4a2ccc2ce0527c7f19d3dd5ea90b8sd fmd_case_add_serd(hdl, branch->branch_case.cc_cp,
fbd1c0dae6f4a2ccc2ce0527c7f19d3dd5ea90b8sd branch->branch_case.cc_serdnm);
fbd1c0dae6f4a2ccc2ce0527c7f19d3dd5ea90b8sd
fbd1c0dae6f4a2ccc2ce0527c7f19d3dd5ea90b8sd cmd_branch_create_fault(hdl, branch,
fbd1c0dae6f4a2ccc2ce0527c7f19d3dd5ea90b8sd "fault.memory.link-c", det);
fbd1c0dae6f4a2ccc2ce0527c7f19d3dd5ea90b8sd }
edf0039d316aafc2c1128aca35079119ecf024f1Trang Do } else if (ERR_CLASS(class, DSU_ERROR) == 0) {
2d6aa547f868d751d00f1f2e70171d9dc9317af1Louis Tsien fmd_hdl_debug(hdl, "Processing dsu event");
2d6aa547f868d751d00f1f2e70171d9dc9317af1Louis Tsien cmd_branch_create_fault(hdl, branch, "fault.memory.bank", det);
fbd1c0dae6f4a2ccc2ce0527c7f19d3dd5ea90b8sd } else {
fbd1c0dae6f4a2ccc2ce0527c7f19d3dd5ea90b8sd fmd_hdl_debug(hdl, "Processing fbu event");
fbd1c0dae6f4a2ccc2ce0527c7f19d3dd5ea90b8sd cmd_branch_create_fault(hdl, branch, "fault.memory.link-u",
fbd1c0dae6f4a2ccc2ce0527c7f19d3dd5ea90b8sd det);
fbd1c0dae6f4a2ccc2ce0527c7f19d3dd5ea90b8sd }
fbd1c0dae6f4a2ccc2ce0527c7f19d3dd5ea90b8sd
fbd1c0dae6f4a2ccc2ce0527c7f19d3dd5ea90b8sd branch->branch_flags |= CMD_MEM_F_FAULTING;
fbd1c0dae6f4a2ccc2ce0527c7f19d3dd5ea90b8sd
fbd1c0dae6f4a2ccc2ce0527c7f19d3dd5ea90b8sd if (branch->branch_case.cc_serdnm != NULL) {
fbd1c0dae6f4a2ccc2ce0527c7f19d3dd5ea90b8sd fmd_serd_destroy(hdl, branch->branch_case.cc_serdnm);
fbd1c0dae6f4a2ccc2ce0527c7f19d3dd5ea90b8sd fmd_hdl_strfree(hdl, branch->branch_case.cc_serdnm);
fbd1c0dae6f4a2ccc2ce0527c7f19d3dd5ea90b8sd branch->branch_case.cc_serdnm = NULL;
fbd1c0dae6f4a2ccc2ce0527c7f19d3dd5ea90b8sd }
fbd1c0dae6f4a2ccc2ce0527c7f19d3dd5ea90b8sd
fbd1c0dae6f4a2ccc2ce0527c7f19d3dd5ea90b8sd fmd_case_add_ereport(hdl, branch->branch_case.cc_cp, ep);
fbd1c0dae6f4a2ccc2ce0527c7f19d3dd5ea90b8sd fmd_case_solve(hdl, branch->branch_case.cc_cp);
fbd1c0dae6f4a2ccc2ce0527c7f19d3dd5ea90b8sd cmd_branch_dirty(hdl, branch);
fbd1c0dae6f4a2ccc2ce0527c7f19d3dd5ea90b8sd
fbd1c0dae6f4a2ccc2ce0527c7f19d3dd5ea90b8sd return (CMD_EVD_OK);
fbd1c0dae6f4a2ccc2ce0527c7f19d3dd5ea90b8sd}
fbd1c0dae6f4a2ccc2ce0527c7f19d3dd5ea90b8sd
050c9ebdc9d01dca610febe083c1796c5e013868td/*ARGSUSED*/
050c9ebdc9d01dca610febe083c1796c5e013868tdcmd_evdisp_t
050c9ebdc9d01dca610febe083c1796c5e013868tdcmd_fb_train(fmd_hdl_t *hdl, fmd_event_t *ep, nvlist_t *nvl, const char *class,
050c9ebdc9d01dca610febe083c1796c5e013868td cmd_errcl_t clcode)
050c9ebdc9d01dca610febe083c1796c5e013868td{
050c9ebdc9d01dca610febe083c1796c5e013868td cmd_evdisp_t rc, rc1;
050c9ebdc9d01dca610febe083c1796c5e013868td
050c9ebdc9d01dca610febe083c1796c5e013868td /*
050c9ebdc9d01dca610febe083c1796c5e013868td * The FBU is cause of the FBU->DCDP/ICDP train:
050c9ebdc9d01dca610febe083c1796c5e013868td * - process the cause of the event.
050c9ebdc9d01dca610febe083c1796c5e013868td * - register the error to the nop event train, so the effected errors
050c9ebdc9d01dca610febe083c1796c5e013868td * (DCDP/ICDP) will be dropped.
050c9ebdc9d01dca610febe083c1796c5e013868td */
050c9ebdc9d01dca610febe083c1796c5e013868td rc = cmd_fb(hdl, ep, nvl, class, clcode);
050c9ebdc9d01dca610febe083c1796c5e013868td
050c9ebdc9d01dca610febe083c1796c5e013868td rc1 = cmd_xxcu_initial(hdl, ep, nvl, class, clcode, CMD_XR_HDLR_NOP);
050c9ebdc9d01dca610febe083c1796c5e013868td if (rc1 != 0)
050c9ebdc9d01dca610febe083c1796c5e013868td fmd_hdl_debug(hdl,
050c9ebdc9d01dca610febe083c1796c5e013868td "Fail to add error (%llx) to the train, rc = %d",
050c9ebdc9d01dca610febe083c1796c5e013868td clcode, rc1);
050c9ebdc9d01dca610febe083c1796c5e013868td
050c9ebdc9d01dca610febe083c1796c5e013868td return (rc);
050c9ebdc9d01dca610febe083c1796c5e013868td}
050c9ebdc9d01dca610febe083c1796c5e013868td
edf0039d316aafc2c1128aca35079119ecf024f1Trang Do
edf0039d316aafc2c1128aca35079119ecf024f1Trang Do/*ARGSUSED*/
edf0039d316aafc2c1128aca35079119ecf024f1Trang Docmd_evdisp_t
edf0039d316aafc2c1128aca35079119ecf024f1Trang Docmd_fw_defect(fmd_hdl_t *hdl, fmd_event_t *ep, nvlist_t *nvl, const char *class,
edf0039d316aafc2c1128aca35079119ecf024f1Trang Do cmd_errcl_t clcode)
edf0039d316aafc2c1128aca35079119ecf024f1Trang Do{
edf0039d316aafc2c1128aca35079119ecf024f1Trang Do const char *fltclass = NULL;
edf0039d316aafc2c1128aca35079119ecf024f1Trang Do nvlist_t *rsc = NULL;
edf0039d316aafc2c1128aca35079119ecf024f1Trang Do int solve = 0;
edf0039d316aafc2c1128aca35079119ecf024f1Trang Do
edf0039d316aafc2c1128aca35079119ecf024f1Trang Do if ((rsc = init_mb(hdl)) == NULL)
edf0039d316aafc2c1128aca35079119ecf024f1Trang Do return (CMD_EVD_UNUSED);
edf0039d316aafc2c1128aca35079119ecf024f1Trang Do
edf0039d316aafc2c1128aca35079119ecf024f1Trang Do if (ERR_CLASS(class, FERG_INVALID) == 0) {
edf0039d316aafc2c1128aca35079119ecf024f1Trang Do fltclass = "defect.fw.generic-sparc.erpt-gen";
edf0039d316aafc2c1128aca35079119ecf024f1Trang Do } else if (ERR_CLASS(class, DBU_ERROR) == 0) {
edf0039d316aafc2c1128aca35079119ecf024f1Trang Do cmd_evdisp_t rc;
edf0039d316aafc2c1128aca35079119ecf024f1Trang Do fltclass = "defect.fw.generic-sparc.addr-oob";
edf0039d316aafc2c1128aca35079119ecf024f1Trang Do /*
edf0039d316aafc2c1128aca35079119ecf024f1Trang Do * add dbu to nop error train
edf0039d316aafc2c1128aca35079119ecf024f1Trang Do */
edf0039d316aafc2c1128aca35079119ecf024f1Trang Do rc = cmd_xxcu_initial(hdl, ep, nvl, class, clcode,
edf0039d316aafc2c1128aca35079119ecf024f1Trang Do CMD_XR_HDLR_NOP);
edf0039d316aafc2c1128aca35079119ecf024f1Trang Do if (rc != 0)
edf0039d316aafc2c1128aca35079119ecf024f1Trang Do fmd_hdl_debug(hdl,
edf0039d316aafc2c1128aca35079119ecf024f1Trang Do "Failed to add error (%llx) to the train, rc = %d",
edf0039d316aafc2c1128aca35079119ecf024f1Trang Do clcode, rc);
edf0039d316aafc2c1128aca35079119ecf024f1Trang Do } else {
edf0039d316aafc2c1128aca35079119ecf024f1Trang Do fmd_hdl_debug(hdl, "Unexpected fw defect event %s", class);
edf0039d316aafc2c1128aca35079119ecf024f1Trang Do }
edf0039d316aafc2c1128aca35079119ecf024f1Trang Do
edf0039d316aafc2c1128aca35079119ecf024f1Trang Do if (fltclass) {
edf0039d316aafc2c1128aca35079119ecf024f1Trang Do fmd_case_t *cp = NULL;
edf0039d316aafc2c1128aca35079119ecf024f1Trang Do nvlist_t *fault = NULL;
edf0039d316aafc2c1128aca35079119ecf024f1Trang Do
edf0039d316aafc2c1128aca35079119ecf024f1Trang Do fault = fmd_nvl_create_fault(hdl, fltclass, 100, NULL,
edf0039d316aafc2c1128aca35079119ecf024f1Trang Do NULL, rsc);
edf0039d316aafc2c1128aca35079119ecf024f1Trang Do if (fault != NULL) {
edf0039d316aafc2c1128aca35079119ecf024f1Trang Do cp = fmd_case_open(hdl, NULL);
edf0039d316aafc2c1128aca35079119ecf024f1Trang Do fmd_case_add_ereport(hdl, cp, ep);
edf0039d316aafc2c1128aca35079119ecf024f1Trang Do fmd_case_add_suspect(hdl, cp, fault);
edf0039d316aafc2c1128aca35079119ecf024f1Trang Do fmd_case_solve(hdl, cp);
edf0039d316aafc2c1128aca35079119ecf024f1Trang Do solve = 1;
edf0039d316aafc2c1128aca35079119ecf024f1Trang Do }
edf0039d316aafc2c1128aca35079119ecf024f1Trang Do }
edf0039d316aafc2c1128aca35079119ecf024f1Trang Do
aab83bb83be7342f6cfccaed8d5fe0b2f404855dJosef 'Jeff' Sipek nvlist_free(rsc);
edf0039d316aafc2c1128aca35079119ecf024f1Trang Do
edf0039d316aafc2c1128aca35079119ecf024f1Trang Do return (solve ? CMD_EVD_OK : CMD_EVD_UNUSED);
edf0039d316aafc2c1128aca35079119ecf024f1Trang Do}
edf0039d316aafc2c1128aca35079119ecf024f1Trang Do
fbd1c0dae6f4a2ccc2ce0527c7f19d3dd5ea90b8sdvoid
fbd1c0dae6f4a2ccc2ce0527c7f19d3dd5ea90b8sdcmd_branch_close(fmd_hdl_t *hdl, void *arg)
fbd1c0dae6f4a2ccc2ce0527c7f19d3dd5ea90b8sd{
fbd1c0dae6f4a2ccc2ce0527c7f19d3dd5ea90b8sd cmd_branch_destroy(hdl, arg);
fbd1c0dae6f4a2ccc2ce0527c7f19d3dd5ea90b8sd}
fbd1c0dae6f4a2ccc2ce0527c7f19d3dd5ea90b8sd
fbd1c0dae6f4a2ccc2ce0527c7f19d3dd5ea90b8sd
31e37bb439502e3f7c4c0a9a77d655ea5d56887avn/*ARGSUSED*/
31e37bb439502e3f7c4c0a9a77d655ea5d56887avnulong_t
31e37bb439502e3f7c4c0a9a77d655ea5d56887avncmd_mem_get_phys_pages(fmd_hdl_t *hdl)
31e37bb439502e3f7c4c0a9a77d655ea5d56887avn{
31e37bb439502e3f7c4c0a9a77d655ea5d56887avn /*
c052c24143a1cca0223719dcf30b7755cc92ff73vn * Compute and return the total physical memory in pages from the
c052c24143a1cca0223719dcf30b7755cc92ff73vn * MD/PRI.
c052c24143a1cca0223719dcf30b7755cc92ff73vn * Cache its value.
31e37bb439502e3f7c4c0a9a77d655ea5d56887avn */
c052c24143a1cca0223719dcf30b7755cc92ff73vn static ulong_t npage = 0;
31e37bb439502e3f7c4c0a9a77d655ea5d56887avn md_t *mdp;
31e37bb439502e3f7c4c0a9a77d655ea5d56887avn mde_cookie_t *listp;
31e37bb439502e3f7c4c0a9a77d655ea5d56887avn uint64_t bmem, physmem = 0;
c052c24143a1cca0223719dcf30b7755cc92ff73vn ssize_t bufsiz = 0;
31e37bb439502e3f7c4c0a9a77d655ea5d56887avn uint64_t *bufp;
31e37bb439502e3f7c4c0a9a77d655ea5d56887avn int num_nodes, nmblocks, i;
31e37bb439502e3f7c4c0a9a77d655ea5d56887avn
c052c24143a1cca0223719dcf30b7755cc92ff73vn if (npage > 0) {
c052c24143a1cca0223719dcf30b7755cc92ff73vn return (npage);
c052c24143a1cca0223719dcf30b7755cc92ff73vn }
c052c24143a1cca0223719dcf30b7755cc92ff73vn
31e37bb439502e3f7c4c0a9a77d655ea5d56887avn if (cpumem_hdl == NULL) {
31e37bb439502e3f7c4c0a9a77d655ea5d56887avn cpumem_hdl = hdl;
31e37bb439502e3f7c4c0a9a77d655ea5d56887avn }
31e37bb439502e3f7c4c0a9a77d655ea5d56887avn
c052c24143a1cca0223719dcf30b7755cc92ff73vn if ((bufsiz = ldom_get_core_md(cpumem_diagnosis_lhp, &bufp)) <= 0) {
c052c24143a1cca0223719dcf30b7755cc92ff73vn return (0);
31e37bb439502e3f7c4c0a9a77d655ea5d56887avn }
c052c24143a1cca0223719dcf30b7755cc92ff73vn if ((mdp = md_init_intern(bufp, cpumem_alloc, cpumem_free)) == NULL ||
c052c24143a1cca0223719dcf30b7755cc92ff73vn (num_nodes = md_node_count(mdp)) <= 0) {
c052c24143a1cca0223719dcf30b7755cc92ff73vn cpumem_free(bufp, (size_t)bufsiz);
31e37bb439502e3f7c4c0a9a77d655ea5d56887avn return (0);
c052c24143a1cca0223719dcf30b7755cc92ff73vn }
31e37bb439502e3f7c4c0a9a77d655ea5d56887avn
31e37bb439502e3f7c4c0a9a77d655ea5d56887avn listp = (mde_cookie_t *)cpumem_alloc(sizeof (mde_cookie_t) *
fbd1c0dae6f4a2ccc2ce0527c7f19d3dd5ea90b8sd num_nodes);
31e37bb439502e3f7c4c0a9a77d655ea5d56887avn nmblocks = md_scan_dag(mdp, MDE_INVAL_ELEM_COOKIE,
fbd1c0dae6f4a2ccc2ce0527c7f19d3dd5ea90b8sd md_find_name(mdp, "mblock"),
fbd1c0dae6f4a2ccc2ce0527c7f19d3dd5ea90b8sd md_find_name(mdp, "fwd"), listp);
31e37bb439502e3f7c4c0a9a77d655ea5d56887avn for (i = 0; i < nmblocks; i++) {
31e37bb439502e3f7c4c0a9a77d655ea5d56887avn if (md_get_prop_val(mdp, listp[i], "size", &bmem) < 0) {
31e37bb439502e3f7c4c0a9a77d655ea5d56887avn physmem = 0;
31e37bb439502e3f7c4c0a9a77d655ea5d56887avn break;
31e37bb439502e3f7c4c0a9a77d655ea5d56887avn }
31e37bb439502e3f7c4c0a9a77d655ea5d56887avn physmem += bmem;
31e37bb439502e3f7c4c0a9a77d655ea5d56887avn }
c052c24143a1cca0223719dcf30b7755cc92ff73vn npage = (ulong_t)(physmem / cmd.cmd_pagesize);
c052c24143a1cca0223719dcf30b7755cc92ff73vn
c052c24143a1cca0223719dcf30b7755cc92ff73vn cpumem_free(listp, sizeof (mde_cookie_t) * num_nodes);
c052c24143a1cca0223719dcf30b7755cc92ff73vn cpumem_free(bufp, (size_t)bufsiz);
c052c24143a1cca0223719dcf30b7755cc92ff73vn (void) md_fini(mdp);
31e37bb439502e3f7c4c0a9a77d655ea5d56887avn
c052c24143a1cca0223719dcf30b7755cc92ff73vn return (npage);
31e37bb439502e3f7c4c0a9a77d655ea5d56887avn}
14ea4bb737263733ad80a36b4f73f681c30a6b45sd
14ea4bb737263733ad80a36b4f73f681c30a6b45sdstatic int galois_mul[16][16] = {
14ea4bb737263733ad80a36b4f73f681c30a6b45sd/* 0 1 2 3 4 5 6 7 8 9 A B C D E F */
14ea4bb737263733ad80a36b4f73f681c30a6b45sd{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, /* 0 */
14ea4bb737263733ad80a36b4f73f681c30a6b45sd{ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15}, /* 1 */
14ea4bb737263733ad80a36b4f73f681c30a6b45sd{ 0, 2, 4, 6, 8, 10, 12, 14, 3, 1, 7, 5, 11, 9, 15, 13}, /* 2 */
14ea4bb737263733ad80a36b4f73f681c30a6b45sd{ 0, 3, 6, 5, 12, 15, 10, 9, 11, 8, 13, 14, 7, 4, 1, 2}, /* 3 */
14ea4bb737263733ad80a36b4f73f681c30a6b45sd{ 0, 4, 8, 12, 3, 7, 11, 15, 6, 2, 14, 10, 5, 1, 13, 9}, /* 4 */
14ea4bb737263733ad80a36b4f73f681c30a6b45sd{ 0, 5, 10, 15, 7, 2, 13, 8, 14, 11, 4, 1, 9, 12, 3, 6}, /* 5 */
14ea4bb737263733ad80a36b4f73f681c30a6b45sd{ 0, 6, 12, 10, 11, 13, 7, 1, 5, 3, 9, 15, 14, 8, 2, 4}, /* 6 */
14ea4bb737263733ad80a36b4f73f681c30a6b45sd{ 0, 7, 14, 9, 15, 8, 1, 6, 13, 10, 3, 4, 2, 5, 12, 11}, /* 7 */
14ea4bb737263733ad80a36b4f73f681c30a6b45sd{ 0, 8, 3, 11, 6, 14, 5, 13, 12, 4, 15, 7, 10, 2, 9, 1}, /* 8 */
14ea4bb737263733ad80a36b4f73f681c30a6b45sd{ 0, 9, 1, 8, 2, 11, 3, 10, 4, 13, 5, 12, 6, 15, 7, 14}, /* 9 */
14ea4bb737263733ad80a36b4f73f681c30a6b45sd{ 0, 10, 7, 13, 14, 4, 9, 3, 15, 5, 8, 2, 1, 11, 6, 12}, /* A */
14ea4bb737263733ad80a36b4f73f681c30a6b45sd{ 0, 11, 5, 14, 10, 1, 15, 4, 7, 12, 2, 9, 13, 6, 8, 3}, /* B */
14ea4bb737263733ad80a36b4f73f681c30a6b45sd{ 0, 12, 11, 7, 5, 9, 14, 2, 10, 6, 1, 13, 15, 3, 4, 8}, /* C */
14ea4bb737263733ad80a36b4f73f681c30a6b45sd{ 0, 13, 9, 4, 1, 12, 8, 5, 2, 15, 11, 6, 3, 14, 10, 7}, /* D */
14ea4bb737263733ad80a36b4f73f681c30a6b45sd{ 0, 14, 15, 1, 13, 3, 2, 12, 9, 7, 6, 8, 4, 10, 11, 5}, /* E */
14ea4bb737263733ad80a36b4f73f681c30a6b45sd{ 0, 15, 13, 2, 9, 6, 4, 11, 1, 14, 12, 3, 8, 7, 5, 10} /* F */
14ea4bb737263733ad80a36b4f73f681c30a6b45sd};
14ea4bb737263733ad80a36b4f73f681c30a6b45sd
14ea4bb737263733ad80a36b4f73f681c30a6b45sdstatic int
14ea4bb737263733ad80a36b4f73f681c30a6b45sdgalois_div(int num, int denom) {
14ea4bb737263733ad80a36b4f73f681c30a6b45sd int i;
14ea4bb737263733ad80a36b4f73f681c30a6b45sd
14ea4bb737263733ad80a36b4f73f681c30a6b45sd for (i = 0; i < 16; i++) {
14ea4bb737263733ad80a36b4f73f681c30a6b45sd if (galois_mul[denom][i] == num)
14ea4bb737263733ad80a36b4f73f681c30a6b45sd return (i);
14ea4bb737263733ad80a36b4f73f681c30a6b45sd }
14ea4bb737263733ad80a36b4f73f681c30a6b45sd return (-1);
14ea4bb737263733ad80a36b4f73f681c30a6b45sd}
14ea4bb737263733ad80a36b4f73f681c30a6b45sd
14ea4bb737263733ad80a36b4f73f681c30a6b45sd/*
14ea4bb737263733ad80a36b4f73f681c30a6b45sd * Data nibbles N0-N31 => 0-31
14ea4bb737263733ad80a36b4f73f681c30a6b45sd * check nibbles C0-3 => 32-35
14ea4bb737263733ad80a36b4f73f681c30a6b45sd */
14ea4bb737263733ad80a36b4f73f681c30a6b45sd
14ea4bb737263733ad80a36b4f73f681c30a6b45sdint
14ea4bb737263733ad80a36b4f73f681c30a6b45sdcmd_synd2upos(uint16_t syndrome) {
14ea4bb737263733ad80a36b4f73f681c30a6b45sd
14ea4bb737263733ad80a36b4f73f681c30a6b45sd uint16_t s0, s1, s2, s3;
14ea4bb737263733ad80a36b4f73f681c30a6b45sd
14ea4bb737263733ad80a36b4f73f681c30a6b45sd if (syndrome == 0)
14ea4bb737263733ad80a36b4f73f681c30a6b45sd return (-1); /* clean syndrome, not a CE */
14ea4bb737263733ad80a36b4f73f681c30a6b45sd
14ea4bb737263733ad80a36b4f73f681c30a6b45sd s0 = syndrome & 0xF;
14ea4bb737263733ad80a36b4f73f681c30a6b45sd s1 = (syndrome >> 4) & 0xF;
14ea4bb737263733ad80a36b4f73f681c30a6b45sd s2 = (syndrome >> 8) & 0xF;
14ea4bb737263733ad80a36b4f73f681c30a6b45sd s3 = (syndrome >> 12) & 0xF;
14ea4bb737263733ad80a36b4f73f681c30a6b45sd
14ea4bb737263733ad80a36b4f73f681c30a6b45sd if (s3 == 0) {
14ea4bb737263733ad80a36b4f73f681c30a6b45sd if (s2 == 0 && s1 == 0)
14ea4bb737263733ad80a36b4f73f681c30a6b45sd return (32); /* 0 0 0 e => C0 */
14ea4bb737263733ad80a36b4f73f681c30a6b45sd if (s2 == 0 && s0 == 0)
14ea4bb737263733ad80a36b4f73f681c30a6b45sd return (33); /* 0 0 e 0 => C1 */
14ea4bb737263733ad80a36b4f73f681c30a6b45sd if (s1 == 0 && s0 == 0)
14ea4bb737263733ad80a36b4f73f681c30a6b45sd return (34); /* 0 e 0 0 => C2 */
14ea4bb737263733ad80a36b4f73f681c30a6b45sd if (s2 == s1 && s1 == s0)
14ea4bb737263733ad80a36b4f73f681c30a6b45sd return (31); /* 0 d d d => N31 */
14ea4bb737263733ad80a36b4f73f681c30a6b45sd return (-1); /* multibit error */
14ea4bb737263733ad80a36b4f73f681c30a6b45sd } else if (s2 == 0) {
14ea4bb737263733ad80a36b4f73f681c30a6b45sd if (s1 == 0 && s0 == 0)
14ea4bb737263733ad80a36b4f73f681c30a6b45sd return (35); /* e 0 0 0 => C4 */
14ea4bb737263733ad80a36b4f73f681c30a6b45sd if (s1 == 0 || s0 == 0)
14ea4bb737263733ad80a36b4f73f681c30a6b45sd return (-1); /* not a 0 b c */
14ea4bb737263733ad80a36b4f73f681c30a6b45sd if (s3 != galois_div(galois_mul[s1][s1], s0))
14ea4bb737263733ad80a36b4f73f681c30a6b45sd return (-1); /* check nibble not valid */
14ea4bb737263733ad80a36b4f73f681c30a6b45sd return (galois_div(s0, s1) - 1); /* N0 - N14 */
14ea4bb737263733ad80a36b4f73f681c30a6b45sd } else if (s1 == 0) {
14ea4bb737263733ad80a36b4f73f681c30a6b45sd if (s2 == 0 || s0 == 0)
14ea4bb737263733ad80a36b4f73f681c30a6b45sd return (-1); /* not a b 0 c */
14ea4bb737263733ad80a36b4f73f681c30a6b45sd if (s3 != galois_div(galois_mul[s2][s2], s0))
14ea4bb737263733ad80a36b4f73f681c30a6b45sd return (-1); /* check nibble not valid */
14ea4bb737263733ad80a36b4f73f681c30a6b45sd return (galois_div(s0, s2) + 14); /* N15 - N29 */
14ea4bb737263733ad80a36b4f73f681c30a6b45sd } else if (s0 == 0) {
14ea4bb737263733ad80a36b4f73f681c30a6b45sd if (s3 == s2 && s2 == s1)
14ea4bb737263733ad80a36b4f73f681c30a6b45sd return (30); /* d d d 0 => N30 */
14ea4bb737263733ad80a36b4f73f681c30a6b45sd return (-1);
14ea4bb737263733ad80a36b4f73f681c30a6b45sd } else return (-1);
14ea4bb737263733ad80a36b4f73f681c30a6b45sd}
14ea4bb737263733ad80a36b4f73f681c30a6b45sd
14ea4bb737263733ad80a36b4f73f681c30a6b45sdnvlist_t *
14ea4bb737263733ad80a36b4f73f681c30a6b45sdcmd_mem2hc(fmd_hdl_t *hdl, nvlist_t *mem_fmri) {
14ea4bb737263733ad80a36b4f73f681c30a6b45sd
70818f5837509317d1f5dac4d82d7b5a2d547c29tsien char **snp;
70818f5837509317d1f5dac4d82d7b5a2d547c29tsien uint_t n;
ec8a745de87c39d7d5621fbb50494484cb9ac4d5td
14ea4bb737263733ad80a36b4f73f681c30a6b45sd if (nvlist_lookup_string_array(mem_fmri, FM_FMRI_HC_SERIAL_ID,
70818f5837509317d1f5dac4d82d7b5a2d547c29tsien &snp, &n) != 0)
70818f5837509317d1f5dac4d82d7b5a2d547c29tsien return (NULL); /* doesn't have serial id */
70818f5837509317d1f5dac4d82d7b5a2d547c29tsien
70818f5837509317d1f5dac4d82d7b5a2d547c29tsien return (cmd_find_dimm_by_sn(hdl, FM_FMRI_SCHEME_HC, *snp));
14ea4bb737263733ad80a36b4f73f681c30a6b45sd}
d4ac42a1cd3016618a9ba0330862d410f0058f89Trang Do
d4ac42a1cd3016618a9ba0330862d410f0058f89Trang Do/*
d4ac42a1cd3016618a9ba0330862d410f0058f89Trang Do * formula to convert an unhashed address to hashed address
d4ac42a1cd3016618a9ba0330862d410f0058f89Trang Do * PA[17:11] = (PA[32:28] xor PA[17:13]) :: ((PA[19:18] xor PA[12:11])
d4ac42a1cd3016618a9ba0330862d410f0058f89Trang Do */
d4ac42a1cd3016618a9ba0330862d410f0058f89Trang Dovoid
d4ac42a1cd3016618a9ba0330862d410f0058f89Trang Docmd_to_hashed_addr(uint64_t *addr, uint64_t afar, const char *class)
d4ac42a1cd3016618a9ba0330862d410f0058f89Trang Do{
d4ac42a1cd3016618a9ba0330862d410f0058f89Trang Do
d4ac42a1cd3016618a9ba0330862d410f0058f89Trang Do if (strstr(class, "ultraSPARC-T1") != NULL)
d4ac42a1cd3016618a9ba0330862d410f0058f89Trang Do *addr = afar;
d4ac42a1cd3016618a9ba0330862d410f0058f89Trang Do else {
d4ac42a1cd3016618a9ba0330862d410f0058f89Trang Do *addr = (afar & OFFBIT) |
d4ac42a1cd3016618a9ba0330862d410f0058f89Trang Do ((afar & BIT28_32) >> 15) ^ (afar & BIT13_17) |
d4ac42a1cd3016618a9ba0330862d410f0058f89Trang Do ((afar & BIT18_19) >> 7) ^ (afar & BIT11_12);
d4ac42a1cd3016618a9ba0330862d410f0058f89Trang Do }
d4ac42a1cd3016618a9ba0330862d410f0058f89Trang Do}
d4ac42a1cd3016618a9ba0330862d410f0058f89Trang Do
d4ac42a1cd3016618a9ba0330862d410f0058f89Trang Doint
d4ac42a1cd3016618a9ba0330862d410f0058f89Trang Docmd_same_datapath_dimms(cmd_dimm_t *d1, cmd_dimm_t *d2)
d4ac42a1cd3016618a9ba0330862d410f0058f89Trang Do{
d4ac42a1cd3016618a9ba0330862d410f0058f89Trang Do char *p, *q;
d4ac42a1cd3016618a9ba0330862d410f0058f89Trang Do
d4ac42a1cd3016618a9ba0330862d410f0058f89Trang Do p = strstr(d1->dimm_unum, "CMP");
d4ac42a1cd3016618a9ba0330862d410f0058f89Trang Do q = strstr(d2->dimm_unum, "CMP");
d4ac42a1cd3016618a9ba0330862d410f0058f89Trang Do if (p != NULL && q != NULL) {
d4ac42a1cd3016618a9ba0330862d410f0058f89Trang Do if (strncmp(p, q, 4) == 0)
d4ac42a1cd3016618a9ba0330862d410f0058f89Trang Do return (1);
d4ac42a1cd3016618a9ba0330862d410f0058f89Trang Do }
d4ac42a1cd3016618a9ba0330862d410f0058f89Trang Do return (0);
d4ac42a1cd3016618a9ba0330862d410f0058f89Trang Do}
d4ac42a1cd3016618a9ba0330862d410f0058f89Trang Do
d4ac42a1cd3016618a9ba0330862d410f0058f89Trang Do/*
d4ac42a1cd3016618a9ba0330862d410f0058f89Trang Do * fault the FRU of the common CMP
d4ac42a1cd3016618a9ba0330862d410f0058f89Trang Do */
d4ac42a1cd3016618a9ba0330862d410f0058f89Trang Do/*ARGSUSED*/
d4ac42a1cd3016618a9ba0330862d410f0058f89Trang Dovoid
d4ac42a1cd3016618a9ba0330862d410f0058f89Trang Docmd_gen_datapath_fault(fmd_hdl_t *hdl, cmd_dimm_t *d1, cmd_dimm_t *d2,
d4ac42a1cd3016618a9ba0330862d410f0058f89Trang Do uint16_t upos, nvlist_t *det)
d4ac42a1cd3016618a9ba0330862d410f0058f89Trang Do{
d4ac42a1cd3016618a9ba0330862d410f0058f89Trang Do fmd_case_t *cp;
d4ac42a1cd3016618a9ba0330862d410f0058f89Trang Do char *frustr;
d4ac42a1cd3016618a9ba0330862d410f0058f89Trang Do nvlist_t *rsrc, *fltlist;
d4ac42a1cd3016618a9ba0330862d410f0058f89Trang Do char *s;
8f6658897e88431fedd1dbcecab56535cb8a6ebfTrang Do char const *str1, *str2;
8f6658897e88431fedd1dbcecab56535cb8a6ebfTrang Do uint_t len, i;
d4ac42a1cd3016618a9ba0330862d410f0058f89Trang Do
d4ac42a1cd3016618a9ba0330862d410f0058f89Trang Do s = strstr(d1->dimm_unum, "CMP");
d4ac42a1cd3016618a9ba0330862d410f0058f89Trang Do if (s == NULL)
d4ac42a1cd3016618a9ba0330862d410f0058f89Trang Do return;
d4ac42a1cd3016618a9ba0330862d410f0058f89Trang Do
d4ac42a1cd3016618a9ba0330862d410f0058f89Trang Do frustr = fmd_hdl_zalloc(hdl, strlen(d1->dimm_unum), FMD_SLEEP);
d4ac42a1cd3016618a9ba0330862d410f0058f89Trang Do len = strlen(d1->dimm_unum) - strlen(s);
d4ac42a1cd3016618a9ba0330862d410f0058f89Trang Do
8f6658897e88431fedd1dbcecab56535cb8a6ebfTrang Do if (strncmp(d1->dimm_unum, d2->dimm_unum, len) != 0) {
8f6658897e88431fedd1dbcecab56535cb8a6ebfTrang Do for (i = 0, str1 = d1->dimm_unum, str2 = d2->dimm_unum;
8f6658897e88431fedd1dbcecab56535cb8a6ebfTrang Do *str1 == *str2 && i <= len;
8f6658897e88431fedd1dbcecab56535cb8a6ebfTrang Do str1++, str2++, i++)
8f6658897e88431fedd1dbcecab56535cb8a6ebfTrang Do ;
8f6658897e88431fedd1dbcecab56535cb8a6ebfTrang Do len = i;
8f6658897e88431fedd1dbcecab56535cb8a6ebfTrang Do }
8f6658897e88431fedd1dbcecab56535cb8a6ebfTrang Do
d4ac42a1cd3016618a9ba0330862d410f0058f89Trang Do (void) strncpy(frustr, d1->dimm_unum, len);
d4ac42a1cd3016618a9ba0330862d410f0058f89Trang Do
d4ac42a1cd3016618a9ba0330862d410f0058f89Trang Do rsrc = cmd_mkboard_fru(hdl, frustr, NULL, NULL);
d4ac42a1cd3016618a9ba0330862d410f0058f89Trang Do
d4ac42a1cd3016618a9ba0330862d410f0058f89Trang Do fmd_hdl_free(hdl, frustr, strlen(d1->dimm_unum));
d4ac42a1cd3016618a9ba0330862d410f0058f89Trang Do
d4ac42a1cd3016618a9ba0330862d410f0058f89Trang Do if (rsrc == NULL)
d4ac42a1cd3016618a9ba0330862d410f0058f89Trang Do return;
d4ac42a1cd3016618a9ba0330862d410f0058f89Trang Do
d4ac42a1cd3016618a9ba0330862d410f0058f89Trang Do (void) nvlist_add_nvlist(rsrc, FM_FMRI_AUTHORITY, cmd.cmd_auth);
d4ac42a1cd3016618a9ba0330862d410f0058f89Trang Do
d4ac42a1cd3016618a9ba0330862d410f0058f89Trang Do cp = fmd_case_open(hdl, NULL);
d4ac42a1cd3016618a9ba0330862d410f0058f89Trang Do
d4ac42a1cd3016618a9ba0330862d410f0058f89Trang Do fltlist = fmd_nvl_create_fault(hdl, "fault.memory.datapath", 100,
d4ac42a1cd3016618a9ba0330862d410f0058f89Trang Do rsrc, NULL, rsrc);
d4ac42a1cd3016618a9ba0330862d410f0058f89Trang Do
d4ac42a1cd3016618a9ba0330862d410f0058f89Trang Do fmd_case_add_suspect(hdl, cp, fltlist);
d4ac42a1cd3016618a9ba0330862d410f0058f89Trang Do fmd_case_solve(hdl, cp);
d4ac42a1cd3016618a9ba0330862d410f0058f89Trang Do
d4ac42a1cd3016618a9ba0330862d410f0058f89Trang Do nvlist_free(rsrc);
d4ac42a1cd3016618a9ba0330862d410f0058f89Trang Do}