822fb41d6f36e90a1ec836b32f869e1235e7da40tsien * CDDL HEADER START
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 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
822fb41d6f36e90a1ec836b32f869e1235e7da40tsien * See the License for the specific language governing permissions
822fb41d6f36e90a1ec836b32f869e1235e7da40tsien * and limitations under the License.
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 * CDDL HEADER END
cfb7311ca709ca6f4d930977c7498455556b5312Louis Tsien * Copyright (c) 2005, 2010, Oracle and/or its affiliates. All rights reserved.
822fb41d6f36e90a1ec836b32f869e1235e7da40tsien * Ereport-handling routines for memory errors
edf0039d316aafc2c1128aca35079119ecf024f1Trang Do#define ERR_CLASS(x, y) (strcmp(strrchr(x, '.'), y))
31e37bb439502e3f7c4c0a9a77d655ea5d56887avnstatic void *
31e37bb439502e3f7c4c0a9a77d655ea5d56887avnstatic void
822fb41d6f36e90a1ec836b32f869e1235e7da40tsien/*ARGSUSED*/
822fb41d6f36e90a1ec836b32f869e1235e7da40tsiencmd_mem_synd_check(fmd_hdl_t *hdl, uint64_t afar, uint8_t afar_status,
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.
50e6accba1026e52ccc1b0d86109daeb4d7cc039td "discarding UE due to magic syndrome %x\n",
50e6accba1026e52ccc1b0d86109daeb4d7cc039td "discarding UE due to magic syndrome %x\n",
fbd1c0dae6f4a2ccc2ce0527c7f19d3dd5ea90b8sdcpu_present(fmd_hdl_t *hdl, nvlist_t *asru, uint32_t *cpuid)
fbd1c0dae6f4a2ccc2ce0527c7f19d3dd5ea90b8sd return (-1);
fbd1c0dae6f4a2ccc2ce0527c7f19d3dd5ea90b8sd if (nvlist_add_uint32(cp_asru, FM_FMRI_CPU_ID, i) == 0) {
fbd1c0dae6f4a2ccc2ce0527c7f19d3dd5ea90b8sd return (0);
fbd1c0dae6f4a2ccc2ce0527c7f19d3dd5ea90b8sd return (-1);
fbd1c0dae6f4a2ccc2ce0527c7f19d3dd5ea90b8sd/*ARGSUSED*/
fbd1c0dae6f4a2ccc2ce0527c7f19d3dd5ea90b8sdcmd_c2c(fmd_hdl_t *hdl, fmd_event_t *ep, nvlist_t *nvl, const char *class,
fbd1c0dae6f4a2ccc2ce0527c7f19d3dd5ea90b8sd (void) nvlist_lookup_nvlist(nvl, FM_EREPORT_DETECTOR, &det);
fbd1c0dae6f4a2ccc2ce0527c7f19d3dd5ea90b8sd if (nvlist_lookup_uint32(det, FM_FMRI_CPU_ID, &cpuid) == 0) {
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 fmd_hdl_debug(hdl, "cmd_c2c: no cpuid discarding C2C error");
822fb41d6f36e90a1ec836b32f869e1235e7da40tsien * sun4v's xe_common routine has an extra argument, clcode, compared
822fb41d6f36e90a1ec836b32f869e1235e7da40tsien * to routine of same name in sun4u.
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 FM_EREPORT_PAYLOAD_NAME_ERR_TYPE, DATA_TYPE_STRING, &typenm,
822fb41d6f36e90a1ec836b32f869e1235e7da40tsien FM_EREPORT_PAYLOAD_NAME_RESOURCE, DATA_TYPE_NVLIST, &rsrc,
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.
fbd1c0dae6f4a2ccc2ce0527c7f19d3dd5ea90b8sd if (nvlist_lookup_uint64(nvl, FM_EREPORT_PAYLOAD_NAME_L2_ESYR,
822fb41d6f36e90a1ec836b32f869e1235e7da40tsien fmd_hdl_debug(hdl, "Niagara unrecognized mem error %llx\n",
822fb41d6f36e90a1ec836b32f869e1235e7da40tsien return (hdlr(hdl, ep, nvl, class, afar, afar_status, synd,
822fb41d6f36e90a1ec836b32f869e1235e7da40tsien synd_status, cmd_mem_name2type(typenm, minorvers), disp, rsrc));
822fb41d6f36e90a1ec836b32f869e1235e7da40tsien/*ARGSUSED*/
822fb41d6f36e90a1ec836b32f869e1235e7da40tsiencmd_ce(fmd_hdl_t *hdl, fmd_event_t *ep, nvlist_t *nvl, const char *class,
41d4fbbe41ff68b2451773fa974828dcb122c1e3Karl Davis if (strcmp(class, "ereport.cpu.ultraSPARC-T2plus.dsc") == 0)
2d6aa547f868d751d00f1f2e70171d9dc9317af1Louis Tsien return (xe_common(hdl, ep, nvl, class, clcode, cmd_ce_common));
050c9ebdc9d01dca610febe083c1796c5e013868td/*ARGSUSED*/
050c9ebdc9d01dca610febe083c1796c5e013868tdcmd_ue_train(fmd_hdl_t *hdl, fmd_event_t *ep, nvlist_t *nvl, const char *class,
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 rc = xe_common(hdl, ep, nvl, class, clcode, cmd_ue_common);
050c9ebdc9d01dca610febe083c1796c5e013868td rc1 = cmd_xxcu_initial(hdl, ep, nvl, class, clcode, CMD_XR_HDLR_NOP);
050c9ebdc9d01dca610febe083c1796c5e013868td "Fail to add error (%llx) to the train, rc = %d",
050c9ebdc9d01dca610febe083c1796c5e013868td return (rc);
822fb41d6f36e90a1ec836b32f869e1235e7da40tsien/*ARGSUSED*/
822fb41d6f36e90a1ec836b32f869e1235e7da40tsiencmd_ue(fmd_hdl_t *hdl, fmd_event_t *ep, nvlist_t *nvl, const char *class,
2d6aa547f868d751d00f1f2e70171d9dc9317af1Louis Tsien if (strcmp(class, "ereport.cpu.ultraSPARC-T2plus.dsu") == 0)
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 return (xe_common(hdl, ep, nvl, class, clcode, cmd_ue_common));
bddc11567b8dc8b10ae555463608aad4f0c6cb44db/*ARGSUSED*/
bddc11567b8dc8b10ae555463608aad4f0c6cb44dbcmd_frx(fmd_hdl_t *hdl, fmd_event_t *ep, nvlist_t *nvl, const char *class,
fbd1c0dae6f4a2ccc2ce0527c7f19d3dd5ea90b8sd/*ARGSUSED*/
fbd1c0dae6f4a2ccc2ce0527c7f19d3dd5ea90b8sdcmd_fb(fmd_hdl_t *hdl, fmd_event_t *ep, nvlist_t *nvl, const char *class,
fbd1c0dae6f4a2ccc2ce0527c7f19d3dd5ea90b8sd if (nvlist_lookup_nvlist(nvl, FM_RSRC_RESOURCE, &asru) < 0) {
fbd1c0dae6f4a2ccc2ce0527c7f19d3dd5ea90b8sd if (nvlist_lookup_nvlist(nvl, FM_EREPORT_DETECTOR, &det) < 0) {
fbd1c0dae6f4a2ccc2ce0527c7f19d3dd5ea90b8sd if (nvlist_lookup_uint64(nvl, FM_EREPORT_PAYLOAD_NAME_TS3_FCR,
fbd1c0dae6f4a2ccc2ce0527c7f19d3dd5ea90b8sd "Processing fbr with lane failover\n");
2d6aa547f868d751d00f1f2e70171d9dc9317af1Louis Tsien cmd_branch_create_fault(hdl, branch, "fault.memory.bank", det);
fbd1c0dae6f4a2ccc2ce0527c7f19d3dd5ea90b8sd cmd_branch_create_fault(hdl, branch, "fault.memory.link-u",
fbd1c0dae6f4a2ccc2ce0527c7f19d3dd5ea90b8sd fmd_case_add_ereport(hdl, branch->branch_case.cc_cp, ep);
050c9ebdc9d01dca610febe083c1796c5e013868td/*ARGSUSED*/
050c9ebdc9d01dca610febe083c1796c5e013868tdcmd_fb_train(fmd_hdl_t *hdl, fmd_event_t *ep, nvlist_t *nvl, const char *class,
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 rc1 = cmd_xxcu_initial(hdl, ep, nvl, class, clcode, CMD_XR_HDLR_NOP);
050c9ebdc9d01dca610febe083c1796c5e013868td "Fail to add error (%llx) to the train, rc = %d",
050c9ebdc9d01dca610febe083c1796c5e013868td return (rc);
edf0039d316aafc2c1128aca35079119ecf024f1Trang Do/*ARGSUSED*/
edf0039d316aafc2c1128aca35079119ecf024f1Trang Docmd_fw_defect(fmd_hdl_t *hdl, fmd_event_t *ep, nvlist_t *nvl, const char *class,
edf0039d316aafc2c1128aca35079119ecf024f1Trang Do * add dbu to nop error train
edf0039d316aafc2c1128aca35079119ecf024f1Trang Do "Failed to add error (%llx) to the train, rc = %d",
edf0039d316aafc2c1128aca35079119ecf024f1Trang Do fmd_hdl_debug(hdl, "Unexpected fw defect event %s", class);
edf0039d316aafc2c1128aca35079119ecf024f1Trang Do fault = fmd_nvl_create_fault(hdl, fltclass, 100, NULL,
31e37bb439502e3f7c4c0a9a77d655ea5d56887avn/*ARGSUSED*/
c052c24143a1cca0223719dcf30b7755cc92ff73vn * Compute and return the total physical memory in pages from the
c052c24143a1cca0223719dcf30b7755cc92ff73vn * Cache its value.
c052c24143a1cca0223719dcf30b7755cc92ff73vn if (npage > 0) {
c052c24143a1cca0223719dcf30b7755cc92ff73vn if ((bufsiz = ldom_get_core_md(cpumem_diagnosis_lhp, &bufp)) <= 0) {
c052c24143a1cca0223719dcf30b7755cc92ff73vn return (0);
c052c24143a1cca0223719dcf30b7755cc92ff73vn if ((mdp = md_init_intern(bufp, cpumem_alloc, cpumem_free)) == NULL ||
31e37bb439502e3f7c4c0a9a77d655ea5d56887avn return (0);
31e37bb439502e3f7c4c0a9a77d655ea5d56887avn listp = (mde_cookie_t *)cpumem_alloc(sizeof (mde_cookie_t) *
31e37bb439502e3f7c4c0a9a77d655ea5d56887avn for (i = 0; i < nmblocks; i++) {
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 for (i = 0; i < 16; i++) {
14ea4bb737263733ad80a36b4f73f681c30a6b45sd return (i);
14ea4bb737263733ad80a36b4f73f681c30a6b45sd return (-1);
14ea4bb737263733ad80a36b4f73f681c30a6b45sd * Data nibbles N0-N31 => 0-31
14ea4bb737263733ad80a36b4f73f681c30a6b45sd * check nibbles C0-3 => 32-35
14ea4bb737263733ad80a36b4f73f681c30a6b45sd if (s3 == 0) {
14ea4bb737263733ad80a36b4f73f681c30a6b45sd } else if (s2 == 0) {
14ea4bb737263733ad80a36b4f73f681c30a6b45sd } else if (s1 == 0) {
14ea4bb737263733ad80a36b4f73f681c30a6b45sd } else if (s0 == 0) {
14ea4bb737263733ad80a36b4f73f681c30a6b45sd return (-1);
14ea4bb737263733ad80a36b4f73f681c30a6b45sd } else return (-1);
14ea4bb737263733ad80a36b4f73f681c30a6b45sd if (nvlist_lookup_string_array(mem_fmri, FM_FMRI_HC_SERIAL_ID,
70818f5837509317d1f5dac4d82d7b5a2d547c29tsien &snp, &n) != 0)
70818f5837509317d1f5dac4d82d7b5a2d547c29tsien return (cmd_find_dimm_by_sn(hdl, FM_FMRI_SCHEME_HC, *snp));
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 Docmd_to_hashed_addr(uint64_t *addr, uint64_t afar, const char *class)
d4ac42a1cd3016618a9ba0330862d410f0058f89Trang Docmd_same_datapath_dimms(cmd_dimm_t *d1, cmd_dimm_t *d2)
d4ac42a1cd3016618a9ba0330862d410f0058f89Trang Do char *p, *q;
d4ac42a1cd3016618a9ba0330862d410f0058f89Trang Do return (1);
d4ac42a1cd3016618a9ba0330862d410f0058f89Trang Do return (0);
d4ac42a1cd3016618a9ba0330862d410f0058f89Trang Do * fault the FRU of the common CMP
d4ac42a1cd3016618a9ba0330862d410f0058f89Trang Do/*ARGSUSED*/
d4ac42a1cd3016618a9ba0330862d410f0058f89Trang Docmd_gen_datapath_fault(fmd_hdl_t *hdl, cmd_dimm_t *d1, cmd_dimm_t *d2,
d4ac42a1cd3016618a9ba0330862d410f0058f89Trang Do frustr = fmd_hdl_zalloc(hdl, strlen(d1->dimm_unum), FMD_SLEEP);
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;
d4ac42a1cd3016618a9ba0330862d410f0058f89Trang Do (void) nvlist_add_nvlist(rsrc, FM_FMRI_AUTHORITY, cmd.cmd_auth);
d4ac42a1cd3016618a9ba0330862d410f0058f89Trang Do fltlist = fmd_nvl_create_fault(hdl, "fault.memory.datapath", 100,