6916726 FMA: Certain DIMMs can give a false fault.memory.dram-ue-imminent
authorLouis Tsien <Louis.Tsien@Sun.COM>
Mon, 12 Apr 2010 20:16:52 -0400
changeset 12144 376b396df845
parent 12143 7f2a331705c9
child 12145 59a99c56fb40
6916726 FMA: Certain DIMMs can give a false fault.memory.dram-ue-imminent
usr/src/cmd/fm/modules/sun4/cpumem-diagnosis/cmd_dimm.h
usr/src/cmd/fm/modules/sun4/cpumem-diagnosis/cmd_mem.h
usr/src/cmd/fm/modules/sun4/cpumem-diagnosis/cmd_memerr.c
usr/src/cmd/fm/modules/sun4u/cpumem-diagnosis/cmd_memerr_arch.c
usr/src/cmd/fm/modules/sun4v/cpumem-diagnosis/cmd_memerr_arch.c
usr/src/cmd/fm/modules/sun4v/generic-mem/gmem_dimm.h
usr/src/cmd/fm/modules/sun4v/generic-mem/gmem_memerr.c
--- a/usr/src/cmd/fm/modules/sun4/cpumem-diagnosis/cmd_dimm.h	Mon Apr 12 16:53:16 2010 -0700
+++ b/usr/src/cmd/fm/modules/sun4/cpumem-diagnosis/cmd_dimm.h	Mon Apr 12 20:16:52 2010 -0400
@@ -19,8 +19,7 @@
  * CDDL HEADER END
  */
 /*
- * Copyright 2008 Sun Microsystems, Inc.  All rights reserved.
- * Use is subject to license terms.
+ * Copyright (c) 2004, 2010, Oracle and/or its affiliates. All rights reserved.
  */
 
 #ifndef _CMD_DIMM_H
@@ -117,7 +116,6 @@
 	uint16_t mq_ckwd;		/* phys addr mod 64 */
 	uint64_t mq_phys_addr;		/* from ereport */
 	uint16_t mq_unit_position;	/* bit for sun4u, nibble for sun4v */
-	int16_t mq_dram;		/* by table lookup from unit pos */
 	fmd_event_t *mq_ep;		/* ereport - for potential fault */
 	char *mq_serdnm;		/* serd eng to retain CE events */
 } cmd_mq_t;
--- a/usr/src/cmd/fm/modules/sun4/cpumem-diagnosis/cmd_mem.h	Mon Apr 12 16:53:16 2010 -0700
+++ b/usr/src/cmd/fm/modules/sun4/cpumem-diagnosis/cmd_mem.h	Mon Apr 12 20:16:52 2010 -0400
@@ -19,8 +19,7 @@
  * CDDL HEADER END
  */
 /*
- * Copyright 2009 Sun Microsystems, Inc.  All rights reserved.
- * Use is subject to license terms.
+ * Copyright (c) 2004, 2010, Oracle and/or its affiliates. All rights reserved.
  */
 
 #ifndef _CMD_MEM_H
@@ -115,7 +114,6 @@
 
 extern ce_dispact_t cmd_mem_name2type(const char *, int);
 extern int cmd_synd2upos(uint16_t);
-extern int cmd_upos2dram(uint16_t);
 extern cmd_evdisp_t cmd_ce(fmd_hdl_t *, fmd_event_t *, nvlist_t *,
     const char *, cmd_errcl_t);
 extern cmd_evdisp_t cmd_ue(fmd_hdl_t *, fmd_event_t *, nvlist_t *,
--- a/usr/src/cmd/fm/modules/sun4/cpumem-diagnosis/cmd_memerr.c	Mon Apr 12 16:53:16 2010 -0700
+++ b/usr/src/cmd/fm/modules/sun4/cpumem-diagnosis/cmd_memerr.c	Mon Apr 12 20:16:52 2010 -0400
@@ -19,8 +19,7 @@
  * CDDL HEADER END
  */
 /*
- * Copyright 2008 Sun Microsystems, Inc.  All rights reserved.
- * Use is subject to license terms.
+ * Copyright (c) 2004, 2010, Oracle and/or its affiliates. All rights reserved.
  */
 
 /*
@@ -184,7 +183,6 @@
 	cp->mq_ckwd = ckwd;
 	cp->mq_phys_addr = afar;
 	cp->mq_unit_position = upos;
-	cp->mq_dram = cmd_upos2dram(upos);
 	cp->mq_ep = ep;
 	cp->mq_serdnm =
 	    cmd_mq_serdnm_create(hdl, "mq", afar, ckwd, upos);
@@ -296,9 +294,8 @@
 
 /*
  * Check the MQSC index lists (one for each checkword) by making a
- * complete pass through each list, checking if the criteria for either
- * Rule 4A or 4B have been met.  Rule 4A checking is done for each checkword;
- * 4B check is done at end.
+ * complete pass through each list, checking if the criteria for
+ * Rule 4A has been met.  Rule 4A checking is done for each checkword.
  *
  * Rule 4A: fault a DIMM  "whenever Solaris reports two or more CEs from
  * two or more different physical addresses on each of two or more different
@@ -308,27 +305,15 @@
  * from one bit position, with unique addresses, and two from another,
  * also with unique addresses, and the lower 6 bits of all the addresses
  * are the same."
- *
- * Rule 4B: fault a DIMM "whenever Solaris reports two or more CEs from
- * two or more different physical addresses on each of three or more
- * different outputs from the same DRAM within 72 hours of each other, as
- * long as the three outputs do not all correspond to the same relative
- * bit position in their respective checkwords.  [Note: This means at least
- * 6 CEs; two from one DRAM output signal, with unique addresses, two from
- * another output from the same DRAM, also with unique addresses, and two
- * more from yet another output from the same DRAM, again with unique
- * addresses, as long as the three outputs do not all correspond to the
- * same relative bit position in their respective checkwords.]"
  */
 
 void
 mq_check(fmd_hdl_t *hdl, cmd_dimm_t *dimm)
 {
-	int upos_pairs, curr_upos, cw, i, j, k;
+	int upos_pairs, curr_upos, cw, i, j;
 	nvlist_t *flt;
 	typedef struct upos_pair {
 		int upos;
-		int dram;
 		cmd_mq_t *mq1;
 		cmd_mq_t *mq2;
 	} upos_pair_t;
@@ -378,7 +363,6 @@
 				 * Have a pair, add to upos_array[].
 				 */
 				upos_array[i].upos = curr_upos;
-				upos_array[i].dram = ip->mq_dram;
 				upos_array[i].mq1 = cmd_list_prev(ip);
 				upos_array[i].mq2 = ip;
 				upos_array[++i].mq1 = NULL;
@@ -407,88 +391,6 @@
 		upos_pairs = i;
 		assert(upos_pairs < 8);
 	}
-
-	if (upos_pairs < 3)
-		return; /* 4B violation needs at least 3 pairs */
-
-	/*
-	 * Walk through checking for a rule 4B violation.
-	 * Since we only keep track of two CE pairs per CW we'll only have
-	 * a max of potentially 8 elements in the array. So as not to run
-	 * off the end of the array, need to be careful with i and j indexes.
-	 */
-	for (i = 0; i < (upos_pairs - 2); i++) {
-		if (upos_array[i].dram == -1) {
-			/*
-			 * Don't match failure codes. There is
-			 * no platform DRAM xlation - return.
-			 */
-			fmd_hdl_debug(hdl, "Unable to determine DRAM"
-			    " from the unit position\n");
-			return;
-		}
-
-		for (j = i+1; j < (upos_pairs - 1); j++) {
-			if (upos_array[i].dram != upos_array[j].dram) {
-				/*
-				 * These two pairs aren't the same dram;
-				 * continue looking for pairs that are.
-				 */
-				continue;
-			}
-
-			for (k = j+1; k < upos_pairs; k++) {
-				if (upos_array[j].dram != upos_array[k].dram) {
-					/*
-					 * DRAMs must be the same for a rule
-					 * 4B violation. Continue looking for
-					 * pairs that have the same DRAMs.
-					 */
-					continue;
-				}
-
-				if ((upos_array[i].upos !=
-				    upos_array[j].upos) ||
-				    (upos_array[j].upos !=
-				    upos_array[k].upos)) {
-					/*
-					 * We've determined that all the dram
-					 * CEs are the same dram, if all the
-					 * unit positions are not the same,
-					 * then we have a rule 4B violation.
-					 */
-					flt = cmd_dimm_create_fault(hdl, dimm,
-					    "fault.memory.dram-ue-imminent",
-					    CMD_FLTMAXCONF);
-					fmd_case_add_ereport(hdl,
-					    dimm->dimm_case.cc_cp,
-					    upos_array[i].mq1->mq_ep);
-					fmd_case_add_ereport(hdl,
-					    dimm->dimm_case.cc_cp,
-					    upos_array[i].mq2->mq_ep);
-					fmd_case_add_ereport(hdl,
-					    dimm->dimm_case.cc_cp,
-					    upos_array[j].mq1->mq_ep);
-					fmd_case_add_ereport(hdl,
-					    dimm->dimm_case.cc_cp,
-					    upos_array[j].mq2->mq_ep);
-					fmd_case_add_ereport(hdl,
-					    dimm->dimm_case.cc_cp,
-					    upos_array[k].mq1->mq_ep);
-					fmd_case_add_ereport(hdl,
-					    dimm->dimm_case.cc_cp,
-					    upos_array[k].mq2->mq_ep);
-					dimm->dimm_flags |= CMD_MEM_F_FAULTING;
-					cmd_dimm_dirty(hdl, dimm);
-					fmd_case_add_suspect(hdl,
-					    dimm->dimm_case.cc_cp, flt);
-					fmd_case_solve(hdl,
-					    dimm->dimm_case.cc_cp);
-					return;
-				}
-			}
-		}
-	}
 }
 
 /*ARGSUSED*/
--- a/usr/src/cmd/fm/modules/sun4u/cpumem-diagnosis/cmd_memerr_arch.c	Mon Apr 12 16:53:16 2010 -0700
+++ b/usr/src/cmd/fm/modules/sun4u/cpumem-diagnosis/cmd_memerr_arch.c	Mon Apr 12 20:16:52 2010 -0400
@@ -20,8 +20,7 @@
  */
 
 /*
- * Copyright 2008 Sun Microsystems, Inc.  All rights reserved.
- * Use is subject to license terms.
+ * Copyright (c) 2005, 2010, Oracle and/or its affiliates. All rights reserved.
  */
 
 /*
@@ -541,227 +540,6 @@
 }
 
 /*
- * DRAM by bit.  Note that this is independent of check-word or DIMM side.
- * Actual DRAM pin *is* dependent on both check-word and DIMM side.
- * DRAMs are numbered D0 to D35, but that doesn't tell us what DIMM
- * they're on!
- *
- * Data bits are numbers, 0 - 127.
- * ECC bits C0 - C8 => 128-136
- * MTAG bits MT0 - MT2 => 137-139
- * MTAG ECC bits MTC0 - MTC3 => 140-143
- *
- *
- * Uniboard Server Systems.
- */
-int unib_upos2dram[] = {
-	/* 0 */ 3, /* 1 */ 3, /* 2 */ 3, /* 3 */ 1,
-	/* 4 */ 2, /* 5 */ 0, /* 6 */ 1, /* 7 */ 2,
-	/* 8 */ 4, /* 9 */ 4, /* 10 */ 4, /* 11 */ 4,
-	/* 12 */ 5, /* 13 */ 5, /* 14 */ 5, /* 15 */ 5,
-	/* 16 */ 6, /* 17 */ 6, /* 18 */ 6, /* 19 */ 6,
-	/* 20 */ 7, /* 21 */ 7, /* 22 */ 7, /* 23 */ 7,
-	/* 24 */ 8, /* 25 */ 8, /* 26 */ 8, /* 27 */ 8,
-	/* 28 */ 9, /* 29 */ 9, /* 30 */ 9, /* 31 */ 9,
-	/* 32 */ 10, /* 33 */ 10, /* 34 */ 10, /* 35 */ 10,
-	/* 36 */ 11, /* 37 */ 11, /* 38 */ 11, /* 39 */ 11,
-	/* 40 */ 12, /* 41 */ 12, /* 42 */ 12, /* 43 */ 12,
-	/* 44 */ 13, /* 45 */ 13, /* 46 */ 13, /* 47 */ 13,
-	/* 48 */ 14, /* 49 */ 14, /* 50 */ 14, /* 51 */ 15,
-	/* 52 */ 15, /* 53 */ 15, /* 54 */ 16, /* 55 */ 16,
-	/* 56 */ 17, /* 57 */ 17, /* 58 */ 17, /* 59 */ 17,
-	/* 60 */ 18, /* 61 */ 18, /* 62 */ 18, /* 63 */ 18,
-	/* 64 */ 19, /* 65 */ 19, /* 66 */ 19, /* 67 */ 19,
-	/* 68 */ 20, /* 69 */ 20, /* 70 */ 20, /* 71 */ 20,
-	/* 72 */ 21, /* 73 */ 21, /* 74 */ 22, /* 75 */ 22,
-	/* 76 */ 22, /* 77 */ 23, /* 78 */ 23, /* 79 */ 23,
-	/* 80 */ 24, /* 81 */ 24, /* 82 */ 24, /* 83 */ 24,
-	/* 84 */ 25, /* 85 */ 25, /* 86 */ 25, /* 87 */ 25,
-	/* 88 */ 26, /* 89 */ 26, /* 90 */ 26, /* 91 */ 26,
-	/* 92 */ 27, /* 93 */ 27, /* 94 */ 27, /* 95 */ 27,
-	/* 96 */ 28, /* 97 */ 28, /* 98 */ 28, /* 99 */ 28,
-	/* 100 */ 29, /* 101 */ 29, /* 102 */ 29, /* 103 */ 29,
-	/* 104 */ 30, /* 105 */ 30, /* 106 */ 30, /* 107 */ 30,
-	/* 108 */ 31, /* 109 */ 31, /* 110 */ 31, /* 111 */ 31,
-	/* 112 */ 32, /* 113 */ 32, /* 114 */ 32, /* 115 */ 32,
-	/* 116 */ 33, /* 117 */ 33, /* 118 */ 33, /* 119 */ 33,
-	/* 120 */ 34, /* 121 */ 34, /* 122 */ 34, /* 123 */ 34,
-	/* 124 */ 35, /* 125 */ 35, /* 126 */ 35, /* 127 */ 35,
-	/* 128 */ 16, /* 129 */ 15, /* 130 */ 14, /* 131 */ 16,
-	/* 132 */ 0, /* 133 */ 21, /* 134 */ 23, /* 135 */ 22,
-	/* 136 */ 21, /* 137 */ 0, /* 138 */ 1, /* 139 */ 2,
-	/* 140 */ 0, /* 141 */ 1, /* 142 */ 2, /* 143 */ 3
-};
-
-/*
- * Camelot Server Systems.
- */
-int cams_upos2dram[] = {
-	/* 0 */ 5, /* 1 */ 5, /* 2 */ 5, /* 3 */ 5,
-	/* 4 */ 7, /* 5 */ 7, /* 6 */ 7, /* 7 */ 7,
-	/* 8 */ 6, /* 9 */ 6, /* 10 */ 6, /* 11 */ 6,
-	/* 12 */ 8, /* 13 */ 8, /* 14 */ 8, /* 15 */ 8,
-	/* 16 */ 4, /* 17 */ 4, /* 18 */ 4, /* 19 */ 4,
-	/* 20 */ 0, /* 21 */ 0, /* 22 */ 0, /* 23 */ 0,
-	/* 24 */ 3, /* 25 */ 3, /* 26 */ 3, /* 27 */ 3,
-	/* 28 */ 2, /* 29 */ 2, /* 30 */ 2, /* 31 */ 2,
-	/* 32 */ 1, /* 33 */ 1, /* 34 */ 1, /* 35 */ 1,
-	/* 36 */ 14, /* 37 */ 14, /* 38 */ 14, /* 39 */ 14,
-	/* 40 */ 16, /* 41 */ 16, /* 42 */ 16, /* 43 */ 16,
-	/* 44 */ 17, /* 45 */ 17, /* 46 */ 15, /* 47 */ 15,
-	/* 48 */ 13, /* 49 */ 13, /* 50 */ 13, /* 51 */ 9,
-	/* 52 */ 9, /* 53 */ 9, /* 54 */ 12, /* 55 */ 12,
-	/* 56 */ 11, /* 57 */ 11, /* 58 */ 11, /* 59 */ 11,
-	/* 60 */ 10, /* 61 */ 10, /* 62 */ 10, /* 63 */ 10,
-	/* 64 */ 23, /* 65 */ 23, /* 66 */ 23, /* 67 */ 23,
-	/* 68 */ 25, /* 69 */ 25, /* 70 */ 25, /* 71 */ 25,
-	/* 72 */ 24, /* 73 */ 24, /* 74 */ 26, /* 75 */ 26,
-	/* 76 */ 26, /* 77 */ 22, /* 78 */ 22, /* 79 */ 22,
-	/* 80 */ 18, /* 81 */ 21, /* 82 */ 21, /* 83 */ 21,
-	/* 84 */ 20, /* 85 */ 20, /* 86 */ 20, /* 87 */ 20,
-	/* 88 */ 19, /* 89 */ 19, /* 90 */ 19, /* 91 */ 19,
-	/* 92 */ 32, /* 93 */ 32, /* 94 */ 32, /* 95 */ 32,
-	/* 96 */ 34, /* 97 */ 34, /* 98 */ 34, /* 99 */ 34,
-	/* 100 */ 33, /* 101 */ 33, /* 102 */ 33, /* 103 */ 33,
-	/* 104 */ 35, /* 105 */ 35, /* 106 */ 35, /* 107 */ 35,
-	/* 108 */ 31, /* 109 */ 31, /* 110 */ 31, /* 111 */ 31,
-	/* 112 */ 27, /* 113 */ 27, /* 114 */ 27, /* 115 */ 27,
-	/* 116 */ 30, /* 117 */ 30, /* 118 */ 30, /* 119 */ 30,
-	/* 120 */ 29, /* 121 */ 29, /* 122 */ 29, /* 123 */ 29,
-	/* 124 */ 28, /* 125 */ 28, /* 126 */ 28, /* 127 */ 28,
-	/* 128 */ 12, /* 129 */ 9, /* 130 */ 13, /* 131 */ 12,
-	/* 132 */  18, /* 133 */ 24, /* 134 */ 22, /* 135 */ 26,
-	/* 136 */ 24, /* 137 */ 21, /* 138 */ 18, /* 139 */ 18,
-	/* 140 */ 15, /* 141 */ 15, /* 142 */ 17, /* 143 */ 17
-};
-
-/*
- * Camelot Tower Systems.
- */
-int camt_upos2dram[] = {
-	/* 0 */ 18, /* 1 */ 0, /* 2 */ 0, /* 3 */ 0,
-	/* 4 */ 9, /* 5 */ 18, /* 6 */ 27, /* 7 */ 9,
-	/* 8 */ 28, /* 9 */ 28, /* 10 */ 28, /* 11 */ 28,
-	/* 12 */ 29, /* 13 */ 29, /* 14 */ 29, /* 15 */ 29,
-	/* 16 */ 30, /* 17 */ 30, /* 18 */ 30, /* 19 */ 30,
-	/* 20 */ 21, /* 21 */ 21, /* 22 */ 21, /* 23 */ 21,
-	/* 24 */ 12, /* 25 */ 12, /* 26 */ 12, /* 27 */ 12,
-	/* 28 */ 22, /* 29 */ 22, /* 30 */ 22, /* 31 */ 22,
-	/* 32 */ 31, /* 33 */ 31, /* 34 */ 31, /* 35 */ 31,
-	/* 36 */ 32, /* 37 */ 32, /* 38 */ 32, /* 39 */ 32,
-	/* 40 */ 33, /* 41 */ 33, /* 42 */ 33, /* 43 */ 33,
-	/* 44 */ 24, /* 45 */ 24, /* 46 */ 24, /* 47 */ 24,
-	/* 48 */ 15, /* 49 */ 15, /* 50 */ 15, /* 51 */ 25,
-	/* 52 */ 25, /* 53 */ 25, /* 54 */ 34, /* 55 */ 34,
-	/* 56 */ 35, /* 57 */ 35, /* 58 */ 35, /* 59 */ 35,
-	/* 60 */ 19, /* 61 */ 19, /* 62 */ 19, /* 63 */ 19,
-	/* 64 */ 10, /* 65 */ 10, /* 66 */ 10, /* 67 */ 10,
-	/* 68 */ 1, /* 69 */ 1, /* 70 */ 1, /* 71 */ 1,
-	/* 72 */ 20, /* 73 */ 20, /* 74 */ 11, /* 75 */ 11,
-	/* 76 */ 11, /* 77 */ 2, /* 78 */ 2, /* 79 */ 2,
-	/* 80 */ 3, /* 81 */ 3, /* 82 */ 3, /* 83 */ 3,
-	/* 84 */ 4, /* 85 */ 4, /* 86 */ 4, /* 87 */ 4,
-	/* 88 */ 13, /* 89 */ 13, /* 90 */ 13, /* 91 */ 13,
-	/* 92 */ 23, /* 93 */ 23, /* 94 */ 23, /* 95 */ 23,
-	/* 96 */ 14, /* 97 */ 14, /* 98 */ 14, /* 99 */ 14,
-	/* 100 */ 5, /* 101 */ 5, /* 102 */ 5, /* 103 */ 5,
-	/* 104 */ 6, /* 105 */ 6, /* 106 */ 6, /* 107 */ 6,
-	/* 108 */ 7, /* 109 */ 7, /* 110 */ 7, /* 111 */ 7,
-	/* 112 */ 16, /* 113 */ 16, /* 114 */ 16, /* 115 */ 16,
-	/* 116 */ 26, /* 117 */ 26, /* 118 */ 26, /* 119 */ 26,
-	/* 120 */ 17, /* 121 */ 17, /* 122 */ 17, /* 123 */ 17,
-	/* 124 */ 8, /* 125 */ 8, /* 126 */ 8, /* 127 */ 8,
-	/* 128 */ 34, /* 129 */ 25, /* 130 */ 15, /* 131 */ 34,
-	/* 132 */  27, /* 133 */ 20, /* 134 */ 2, /* 135 */ 11,
-	/* 136 */ 20, /* 137 */ 9, /* 138 */ 18, /* 139 */ 27,
-	/* 140 */ 0, /* 141 */ 9, /* 142 */ 18, /* 143 */ 27
-};
-
-/*
- * Fiesta Server Systems.
- */
-int fies_upos2dram[] = {
-	/* 0 */ 7, /* 1 */ 7, /* 2 */ 7, /* 3 */ 7,
-	/* 4 */ 16, /* 5 */ 16, /* 6 */ 16, /* 7 */ 16,
-	/* 8 */ 25, /* 9 */ 25, /* 10 */ 25, /* 11 */ 25,
-	/* 12 */ 34, /* 13 */ 34, /* 14 */ 34, /* 15 */ 34,
-	/* 16 */ 6, /* 17 */ 6, /* 18 */ 6, /* 19 */ 6,
-	/* 20 */ 15, /* 21 */ 15, /* 22 */ 15, /* 23 */ 15,
-	/* 24 */ 24, /* 25 */ 24, /* 26 */ 24, /* 27 */ 24,
-	/* 28 */ 33, /* 29 */ 33, /* 30 */ 33, /* 31 */ 33,
-	/* 32 */ 23, /* 33 */ 23, /* 34 */ 23, /* 35 */ 23,
-	/* 36 */ 32, /* 37 */ 32, /* 38 */ 32, /* 39 */ 32,
-	/* 40 */ 22, /* 41 */ 22, /* 42 */ 22, /* 43 */ 22,
-	/* 44 */ 31, /* 45 */ 31, /* 46 */ 31, /* 47 */ 31,
-	/* 48 */ 5, /* 49 */ 5, /* 50 */ 5, /* 51 */ 5,
-	/* 52 */ 14, /* 53 */ 14, /* 54 */ 14, /* 55 */ 14,
-	/* 56 */ 4, /* 57 */ 4, /* 58 */ 4, /* 59 */ 4,
-	/* 60 */ 13, /* 61 */ 13, /* 62 */ 13, /* 63 */ 13,
-	/* 64 */ 18, /* 65 */ 18, /* 66 */ 18, /* 67 */ 18,
-	/* 68 */ 27, /* 69 */ 27, /* 70 */ 27, /* 71 */ 27,
-	/* 72 */ 0, /* 73 */ 0, /* 74 */ 0, /* 75 */ 0,
-	/* 76 */ 9, /* 77 */ 9, /* 78 */ 9, /* 79 */ 9,
-	/* 80 */ 19, /* 81 */ 19, /* 82 */ 19, /* 83 */ 19,
-	/* 84 */ 28, /* 85 */ 28, /* 86 */ 28, /* 87 */ 28,
-	/* 88 */ 1, /* 89 */ 1, /* 90 */ 1, /* 91 */ 1,
-	/* 92 */ 10, /* 93 */ 10, /* 94 */ 10, /* 95 */ 10,
-	/* 96 */ 3, /* 97 */ 3, /* 98 */ 3, /* 99 */ 3,
-	/* 100 */ 12, /* 101 */ 12, /* 102 */ 12, /* 103 */ 12,
-	/* 104 */ 20, /* 105 */ 20, /* 106 */ 20, /* 107 */ 20,
-	/* 108 */ 29, /* 109 */ 29, /* 110 */ 29, /* 111 */ 29,
-	/* 112 */ 8, /* 113 */ 8, /* 114 */ 8, /* 115 */ 8,
-	/* 116 */ 17, /* 117 */ 17, /* 118 */ 17, /* 119 */ 17,
-	/* 120 */ 21, /* 121 */ 21, /* 122 */ 21, /* 123 */ 21,
-	/* 124 */ 30, /* 125 */ 30, /* 126 */ 30, /* 127 */ 30,
-	/* 128 */ 2, /* 129 */ 2, /* 130 */ 2, /* 131 */ 2,
-	/* 132 */ 11, /* 133 */ 11, /* 134 */ 11, /* 135 */ 11,
-	/* 136 */ 26, /* 137 */ 26, /* 138 */ 26, /* 139 */ 26,
-	/* 140 */ 35, /* 141 */ 35, /* 142 */ 35, /* 143 */ 35
-};
-
-/*
- * Fiesta Tower Systems.
- */
-int fiet_upos2dram[] = {
-	/* 0 */ 0, /* 1 */ 0, /* 2 */ 0, /* 3 */ 0,
-	/* 4 */ 9, /* 5 */ 9, /* 6 */ 9, /* 7 */ 9,
-	/* 8 */ 18, /* 9 */ 18, /* 10 */ 18, /* 11 */ 18,
-	/* 12 */ 27, /* 13 */ 27, /* 14 */ 27, /* 15 */ 27,
-	/* 16 */ 19, /* 17 */ 19, /* 18 */ 19, /* 19 */ 19,
-	/* 20 */ 28, /* 21 */ 28, /* 22 */ 28, /* 23 */ 28,
-	/* 24 */ 1, /* 25 */ 1, /* 26 */ 1, /* 27 */ 1,
-	/* 28 */ 10, /* 29 */ 10, /* 30 */ 10, /* 31 */ 10,
-	/* 32 */ 20, /* 33 */ 20, /* 34 */ 20, /* 35 */ 20,
-	/* 36 */ 29, /* 37 */ 29, /* 38 */ 29, /* 39 */ 29,
-	/* 40 */ 2, /* 41 */ 2, /* 42 */ 2, /* 43 */ 2,
-	/* 44 */ 11, /* 45 */ 11, /* 46 */ 11, /* 47 */ 11,
-	/* 48 */ 21, /* 49 */ 21, /* 50 */ 21, /* 51 */ 21,
-	/* 52 */ 30, /* 53 */ 30, /* 54 */ 30, /* 55 */ 30,
-	/* 56 */ 3, /* 57 */ 3, /* 58 */ 3, /* 59 */ 3,
-	/* 60 */ 12, /* 61 */ 12, /* 62 */ 12, /* 63 */ 12,
-	/* 64 */ 8, /* 65 */ 8, /* 66 */ 8, /* 67 */ 8,
-	/* 68 */ 17, /* 69 */ 17, /* 70 */ 17, /* 71 */ 17,
-	/* 72 */ 22, /* 73 */ 22, /* 74 */ 22, /* 75 */ 22,
-	/* 76 */ 31, /* 77 */ 31, /* 78 */ 31, /* 79 */ 31,
-	/* 80 */ 4, /* 81 */ 4, /* 82 */ 4, /* 83 */ 4,
-	/* 84 */ 13, /* 85 */ 13, /* 86 */ 13, /* 87 */ 13,
-	/* 88 */ 23, /* 89 */ 23, /* 90 */ 23, /* 91 */ 23,
-	/* 92 */ 32, /* 93 */ 32, /* 94 */ 32, /* 95 */ 32,
-	/* 96 */ 5, /* 97 */ 5, /* 98 */ 5, /* 99 */ 5,
-	/* 100 */ 14, /* 101 */ 14, /* 102 */ 14, /* 103 */ 14,
-	/* 104 */ 24, /* 105 */ 24, /* 106 */ 24, /* 107 */ 24,
-	/* 108 */ 33, /* 109 */ 33, /* 110 */ 33, /* 111 */ 33,
-	/* 112 */ 6, /* 113 */ 6, /* 114 */ 6, /* 115 */ 6,
-	/* 116 */ 15, /* 117 */ 15, /* 118 */ 15, /* 119 */ 15,
-	/* 120 */ 25, /* 121 */ 25, /* 122 */ 25, /* 123 */ 25,
-	/* 124 */ 34, /* 125 */ 34, /* 126 */ 34, /* 127 */ 34,
-	/* 128 */ 7, /* 129 */ 7, /* 130 */ 7, /* 131 */ 7,
-	/* 132 */ 16, /* 133 */ 16, /* 134 */ 16, /* 135 */ 16,
-	/* 136 */ 26, /* 137 */ 26, /* 138 */ 26, /* 139 */ 26,
-	/* 140 */ 35, /* 141 */ 35, /* 142 */ 35, /* 143 */ 35
-};
-
-/*
  * sun4u bit position as function of e_synd,
  * from JPS1 Implementation Supplement table P-7
  * Encode bit positions as follows:
@@ -844,82 +622,9 @@
 	-1, 139,  -1,  -1
 };
 
-typedef enum plats2dram {
-	UNI_S_PLAT = 0,	/* UniBoard Server Systems */
-	CAM_S_PLAT,	/* Camelot Server Systems */
-	CAM_T_PLAT,	/* Camelot Tower Systems */
-	FIE_S_PLAT,	/* Fiesta Server Systems */
-	FIE_T_PLAT,	/* Fiesta Tower Systems */
-	NONE
-} plats_t;
-
-struct plat2dram_map {
-	char	*platnm;
-	plats_t	plat;
-} dram_plat[] = {
-	/* Platform name		DRAM Map	Code Name */
-	{"SUNW,Sun-Fire-15000",		UNI_S_PLAT}, /* Starcat */
-	{"SUNW,Sun-Fire",		UNI_S_PLAT}, /* Serengeti */
-	{"SUNW,Netra-T12",		UNI_S_PLAT}, /* Lightweight 8 */
-	{"SUNW,Sun-Fire-480R",		CAM_S_PLAT}, /* Cherrystone */
-	{"SUNW,Sun-Fire-880",		CAM_S_PLAT}, /* Daktari */
-	{"SUNW,Sun-Fire-V490",		CAM_S_PLAT}, /* Sebring */
-	{"SUNW,Sun-Fire-V890",		CAM_S_PLAT}, /* Silverstone */
-	{"SUNW,Sun-Blade-1000",		CAM_T_PLAT}, /* Excalibur */
-	{"SUNW,Netra-T4",		CAM_T_PLAT}, /* Netra 20 */
-	{"SUNW,Sun-Fire-V440",		FIE_S_PLAT}, /* Chalupa */
-	{"SUNW,Sun-Fire-V445",		FIE_S_PLAT}, /* Boston */
-	{"SUNW,A70",			FIE_S_PLAT}, /* Chicago */
-	{"SUNW,Sun-Fire-V215",		FIE_S_PLAT}, /* Seattle 1U */
-	{"SUNW,Sun-Fire-V245",		FIE_S_PLAT}, /* Seattle 2U */
-	{"SUNW,Netra-440",		FIE_S_PLAT}, /* Netra 440 */
-	{"SUNW,Sun-Blade-1500",		FIE_T_PLAT}, /* Taco */
-	{"SUNW,Sun-Blade-2500",		FIE_T_PLAT}, /* Enchilada */
-	{"SUNW,Sun-Fire-V210",		FIE_T_PLAT}, /* Enchilada 1U */
-	{"SUNW,Sun-Fire-V240",		FIE_T_PLAT}, /* Enchilada 2U */
-	{"SUNW,Sun-Fire-V250",		FIE_T_PLAT}, /* Enchilada 2P */
-	{"SUNW,Netra-210",		FIE_T_PLAT}, /* Netra 210 */
-	{"SUNW,Netra-240",		FIE_T_PLAT}, /* Netra 240 */
-	{NULL,				NONE}
-};
-
 int
 cmd_synd2upos(uint16_t syndrome) {
 	return (esynd2bit[syndrome]);
 }
 
 const char *fmd_fmri_get_platform();
-
-/*
- * Return the DRAM within the DIMM associated with the unit position.
- */
-int
-cmd_upos2dram(uint16_t unit_position) {
-
-	int		i, dram;
-	plats_t		plat = NONE;
-	const char 	*plat_name = fmd_fmri_get_platform();
-	int		*plat_upos2dram[] = {
-		unib_upos2dram,
-		cams_upos2dram,
-		camt_upos2dram,
-		fies_upos2dram,
-		fiet_upos2dram
-	};
-
-	/* get DRAM map from platform name */
-	for (i = 0; dram_plat[i].platnm != NULL; i++) {
-		if (strcmp(plat_name, dram_plat[i].platnm) == 0) {
-			plat = dram_plat[i].plat;
-			break;
-		}
-	}
-
-	if (plat != NONE) {
-		dram = plat_upos2dram[plat][unit_position];
-	} else {
-		dram = -1;
-	}
-
-	return (dram);
-}
--- a/usr/src/cmd/fm/modules/sun4v/cpumem-diagnosis/cmd_memerr_arch.c	Mon Apr 12 16:53:16 2010 -0700
+++ b/usr/src/cmd/fm/modules/sun4v/cpumem-diagnosis/cmd_memerr_arch.c	Mon Apr 12 20:16:52 2010 -0400
@@ -19,8 +19,7 @@
  * CDDL HEADER END
  */
 /*
- * Copyright 2009 Sun Microsystems, Inc.  All rights reserved.
- * Use is subject to license terms.
+ * Copyright (c) 2005, 2010, Oracle and/or its affiliates. All rights reserved.
  */
 
 /*
@@ -668,18 +667,6 @@
 	} else return (-1);
 }
 
-int
-cmd_upos2dram(uint16_t upos) {
-
-	/*
-	 * If and/or when x8 DIMMs are used on sun4v systems, this
-	 * function will become more complicated.
-	 */
-
-	return ((int)upos);
-
-}
-
 nvlist_t *
 cmd_mem2hc(fmd_hdl_t *hdl, nvlist_t *mem_fmri) {
 
--- a/usr/src/cmd/fm/modules/sun4v/generic-mem/gmem_dimm.h	Mon Apr 12 16:53:16 2010 -0700
+++ b/usr/src/cmd/fm/modules/sun4v/generic-mem/gmem_dimm.h	Mon Apr 12 20:16:52 2010 -0400
@@ -19,8 +19,7 @@
  * CDDL HEADER END
  */
 /*
- * Copyright 2008 Sun Microsystems, Inc.  All rights reserved.
- * Use is subject to license terms.
+ * Copyright (c) 2008, 2010, Oracle and/or its affiliates. All rights reserved.
  */
 
 #ifndef _GMEM_DIMM_H
@@ -86,7 +85,6 @@
 	uint16_t mq_ckwd;		/* phys addr mod 64 */
 	uint64_t mq_phys_addr;		/* from ereport */
 	uint16_t mq_unit_position;	/* bit for sun4u, nibble for sun4v */
-	int16_t mq_dram;		/* by table lookup from unit pos */
 	fmd_event_t *mq_ep;		/* ereport - for potential fault */
 	char *mq_serdnm;		/* serd eng to retain CE events */
 } gmem_mq_t;
--- a/usr/src/cmd/fm/modules/sun4v/generic-mem/gmem_memerr.c	Mon Apr 12 16:53:16 2010 -0700
+++ b/usr/src/cmd/fm/modules/sun4v/generic-mem/gmem_memerr.c	Mon Apr 12 20:16:52 2010 -0400
@@ -19,8 +19,7 @@
  * CDDL HEADER END
  */
 /*
- * Copyright 2008 Sun Microsystems, Inc.  All rights reserved.
- * Use is subject to license terms.
+ * Copyright (c) 2008, 2010, Oracle and/or its affiliates. All rights reserved.
  */
 
 
@@ -106,7 +105,7 @@
  */
 gmem_mq_t *
 mq_create(fmd_hdl_t *hdl, fmd_event_t *ep,
-    uint64_t afar, uint16_t upos, uint16_t dram, uint16_t ckwd, uint64_t now)
+    uint64_t afar, uint16_t upos, uint16_t ckwd, uint64_t now)
 {
 	gmem_mq_t *cp;
 	cp = fmd_hdl_zalloc(hdl, sizeof (gmem_mq_t), FMD_SLEEP);
@@ -114,7 +113,6 @@
 	cp->mq_ckwd = ckwd;
 	cp->mq_phys_addr = afar;
 	cp->mq_unit_position = upos;
-	cp->mq_dram = (int16_t)dram;
 	cp->mq_ep = ep;
 	cp->mq_serdnm =
 	    gmem_mq_serdnm_create(hdl, "mq", afar, ckwd, upos);
@@ -158,7 +156,7 @@
  */
 void
 mq_add(fmd_hdl_t *hdl, gmem_dimm_t *dimm, fmd_event_t *ep,
-    uint64_t afar, uint16_t unit_position, uint16_t dram, uint16_t ckwd,
+    uint64_t afar, uint16_t unit_position, uint16_t ckwd,
     uint64_t now)
 {
 	gmem_mq_t *ip, *jp;
@@ -180,7 +178,7 @@
 			ip = gmem_list_next(ip);
 		}
 	}
-	jp = mq_create(hdl, ep, afar, unit_position, dram, cw, now);
+	jp = mq_create(hdl, ep, afar, unit_position, cw, now);
 	if (ip == NULL)
 		gmem_list_append(&dimm->mq_root[cw], jp);
 	else
@@ -216,9 +214,8 @@
 
 /*
  * Check the MQSC index lists (one for each checkword) by making a
- * complete pass through each list, checking if the criteria for either
- * Rule 4A or 4B have been met.  Rule 4A checking is done for each checkword;
- * 4B check is done at end.
+ * complete pass through each list, checking if the criteria for
+ * Rule 4A has been met.  Rule 4A checking is done for each checkword.
  *
  * Rule 4A: fault a DIMM  "whenever Solaris reports two or more CEs from
  * two or more different physical addresses on each of two or more different
@@ -228,27 +225,15 @@
  * from one bit position, with unique addresses, and two from another,
  * also with unique addresses, and the lower 6 bits of all the addresses
  * are the same."
- *
- * Rule 4B: fault a DIMM "whenever Solaris reports two or more CEs from
- * two or more different physical addresses on each of three or more
- * different outputs from the same DRAM within 72 hours of each other, as
- * long as the three outputs do not all correspond to the same relative
- * bit position in their respective checkwords.  [Note: This means at least
- * 6 CEs; two from one DRAM output signal, with unique addresses, two from
- * another output from the same DRAM, also with unique addresses, and two
- * more from yet another output from the same DRAM, again with unique
- * addresses, as long as the three outputs do not all correspond to the
- * same relative bit position in their respective checkwords.]"
  */
 
 void
-mq_check(fmd_hdl_t *hdl, gmem_dimm_t *dimm, int16_t dram)
+mq_check(fmd_hdl_t *hdl, gmem_dimm_t *dimm)
 {
-	int upos_pairs, curr_upos, cw, i, j, k;
+	int upos_pairs, curr_upos, cw, i, j;
 	nvlist_t *flt, *rsc;
 	typedef struct upos_pair {
 		int upos;
-		int dram;
 		gmem_mq_t *mq1;
 		gmem_mq_t *mq2;
 	} upos_pair_t;
@@ -293,10 +278,9 @@
 				continue;
 			} else if (upos_array[i].mq1 == NULL) {
 				/* Have a pair. Add to upos_array[] */
-				fmd_hdl_debug(hdl, "pair:upos=%d dram=%d",
-				    curr_upos, ip->mq_dram);
+				fmd_hdl_debug(hdl, "pair:upos=%d",
+				    curr_upos);
 				upos_array[i].upos = curr_upos;
-				upos_array[i].dram = ip->mq_dram;
 				upos_array[i].mq1 = gmem_list_prev(ip);
 				upos_array[i].mq2 = ip;
 				upos_array[++i].mq1 = NULL;
@@ -326,84 +310,15 @@
 		upos_pairs = i;
 		assert(upos_pairs < 16);
 	}
-
-	if ((dram == INVALID_DRAM) || (upos_pairs  < 3)) {
-		fmd_hdl_debug(hdl, "Skip rules 4B upos_pairs=%d\n", upos_pairs);
-		return; /* 4B violation needs at least 3 pairs */
-	}
-
-	/*
-	 * Walk through checking for a rule 4B violation.
-	 * Since we only keep track of two CE pairs per CW we'll only have
-	 * a max of potentially 16 lements in the array. So as not to run
-	 * off the end of the array, need to be careful with i and j indexes.
-	 */
-	for (i = 0; i < (upos_pairs - 2); i++) {
-		for (j = i+1; j < (upos_pairs - 1); j++) {
-			if (upos_array[i].dram != upos_array[j].dram)
-				/*
-				 * These two pairs aren't the same dram;
-				 * continue looking for pairs that are.
-				 */
-				continue;
-			for (k = j+1; k < upos_pairs; k++) {
-				if (upos_array[j].dram != upos_array[k].dram)
-					/*
-					 * DRAMs must be the same for a rule
-					 * 4B violation. Continue looking for
-					 * pairs that have the same DRAMs.
-					 */
-					continue;
-				if ((upos_array[i].upos !=
-				    upos_array[j].upos) ||
-				    (upos_array[j].upos !=
-				    upos_array[k].upos)) {
-					rsc = gmem_find_dimm_rsc(hdl,
-					    dimm->dimm_serial);
-					flt = fmd_nvl_create_fault(hdl,
-					    GMEM_FAULT_DIMM_4B, GMEM_FLTMAXCONF,
-					    NULL, gmem_dimm_fru(dimm), rsc);
-					fmd_case_add_ereport(hdl,
-					    dimm->dimm_case.cc_cp,
-					    upos_array[i].mq1->mq_ep);
-					fmd_case_add_ereport(hdl,
-					    dimm->dimm_case.cc_cp,
-					    upos_array[i].mq2->mq_ep);
-					fmd_case_add_ereport(hdl,
-					    dimm->dimm_case.cc_cp,
-					    upos_array[j].mq1->mq_ep);
-					fmd_case_add_ereport(hdl,
-					    dimm->dimm_case.cc_cp,
-					    upos_array[j].mq2->mq_ep);
-					fmd_case_add_ereport(hdl,
-					    dimm->dimm_case.cc_cp,
-					    upos_array[k].mq1->mq_ep);
-					fmd_case_add_ereport(hdl,
-					    dimm->dimm_case.cc_cp,
-					    upos_array[k].mq2->mq_ep);
-					fmd_case_add_suspect(hdl,
-					    dimm->dimm_case.cc_cp, flt);
-					fmd_case_solve(hdl,
-					    dimm->dimm_case.cc_cp);
-					dimm->dimm_flags |= GMEM_F_FAULTING;
-					gmem_dimm_dirty(hdl, dimm);
-					if (rsc != NULL)
-						nvlist_free(rsc);
-					return;
-				}
-			}
-		}
-	}
 }
 
 /*ARGSUSED*/
 gmem_evdisp_t
 gmem_ce(fmd_hdl_t *hdl, fmd_event_t *ep, nvlist_t *nvl, const char *class)
 {
-	uint16_t symbol_pos, erpt_dram, cw;
+	uint16_t symbol_pos, cw;
 	uint64_t phyaddr, offset;
 	uint32_t filter_ratio = 0;
-	int16_t dram;
 	gmem_dimm_t *dimm;
 	gmem_page_t *page;
 	nvlist_t *fru = NULL;
@@ -468,31 +383,26 @@
 	/*
 	 * Add to MQSC correlation lists all CEs which pass validity
 	 * checks above. If there is no symbol_pos & relative ckword
-	 * in the ereport, skip rules 4A & 4B checking.
-	 * If there is no dram in the ereport, skip the rule 4B checking.
+	 * in the ereport, skip rule 4A checking.
 	 */
-	if (nvlist_lookup_uint16(nvl, GMEM_ERPT_PAYLOAD_DRAM, &erpt_dram) != 0)
-		dram = INVALID_DRAM;
-	else
-		dram = (int16_t)erpt_dram;
 
 	err = nvlist_lookup_uint16(nvl, GMEM_ERPT_PAYLOAD_SYMBOLPOS,
 	    &symbol_pos);
 	err |= nvlist_lookup_uint16(nvl, GMEM_ERPT_PAYLOAD_CKW, &cw);
 
 	if (err == 0)
-		fmd_hdl_debug(hdl, "symbol_pos=%d dram=%d cw=%d",
-		    symbol_pos, dram, cw);
+		fmd_hdl_debug(hdl, "symbol_pos=%d cw=%d",
+		    symbol_pos, cw);
 
 	if (!(dimm->dimm_flags & GMEM_F_FAULTING) && (err == 0)) {
 		uint64_t *now;
 		uint_t nelem;
 		if (nvlist_lookup_uint64_array(nvl,
 		    "__tod", &now, &nelem) == 0) {
-			mq_add(hdl, dimm, ep, phyaddr, symbol_pos, dram,
+			mq_add(hdl, dimm, ep, phyaddr, symbol_pos,
 			    cw, *now);
 			mq_prune(hdl, dimm, *now);
-			mq_check(hdl, dimm, dram);
+			mq_check(hdl, dimm);
 		}
 	}