aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/edac
diff options
context:
space:
mode:
authorMauro Carvalho Chehab <mchehab@redhat.com>2012-06-04 12:27:43 -0400
committerMauro Carvalho Chehab <mchehab@redhat.com>2012-06-12 11:15:47 -0400
commit9eb07a7fb8a90ee39fa9d5489afc0330cfcfbea7 (patch)
tree2d034ec31225f2b82267ab3e081c4e8263e7b85f /drivers/edac
parent03f7eae80f4b913929be84e0c883ee98196fd6ff (diff)
edac: edac_mc_handle_error(): add an error_count parameter
In order to avoid loosing error events, it is desirable to group error events together and generate a single trace for several identical errors. The trace API already allows reporting multiple errors. Change the handle_error function to also allow that. The changes at the drivers were made by this small script: $file .=$_ while (<>); $file =~ s/(edac_mc_handle_error)\s*\(([^\,]+)\,([^\,]+)\,/$1($2,$3, 1,/g; print $file; Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>
Diffstat (limited to 'drivers/edac')
-rw-r--r--drivers/edac/amd64_edac.c22
-rw-r--r--drivers/edac/amd76x_edac.c4
-rw-r--r--drivers/edac/cell_edac.c4
-rw-r--r--drivers/edac/cpc925_edac.c4
-rw-r--r--drivers/edac/e752x_edac.c8
-rw-r--r--drivers/edac/e7xxx_edac.c8
-rw-r--r--drivers/edac/edac_core.h1
-rw-r--r--drivers/edac/edac_mc.c56
-rw-r--r--drivers/edac/edac_mc_sysfs.c2
-rw-r--r--drivers/edac/i3000_edac.c6
-rw-r--r--drivers/edac/i3200_edac.c6
-rw-r--r--drivers/edac/i5000_edac.c8
-rw-r--r--drivers/edac/i5100_edac.c4
-rw-r--r--drivers/edac/i5400_edac.c4
-rw-r--r--drivers/edac/i7300_edac.c4
-rw-r--r--drivers/edac/i7core_edac.c4
-rw-r--r--drivers/edac/i82443bxgx_edac.c4
-rw-r--r--drivers/edac/i82860_edac.c6
-rw-r--r--drivers/edac/i82875p_edac.c6
-rw-r--r--drivers/edac/i82975x_edac.c6
-rw-r--r--drivers/edac/mpc85xx_edac.c4
-rw-r--r--drivers/edac/mv64x60_edac.c4
-rw-r--r--drivers/edac/pasemi_edac.c4
-rw-r--r--drivers/edac/ppc4xx_edac.c4
-rw-r--r--drivers/edac/r82600_edac.c4
-rw-r--r--drivers/edac/sb_edac.c4
-rw-r--r--drivers/edac/tile_edac.c2
-rw-r--r--drivers/edac/x38_edac.c6
28 files changed, 104 insertions, 95 deletions
diff --git a/drivers/edac/amd64_edac.c b/drivers/edac/amd64_edac.c
index 6231cbe6e7c1..5a297a26211d 100644
--- a/drivers/edac/amd64_edac.c
+++ b/drivers/edac/amd64_edac.c
@@ -1046,7 +1046,7 @@ static void k8_map_sysaddr_to_csrow(struct mem_ctl_info *mci, u64 sys_addr,
1046 if (!src_mci) { 1046 if (!src_mci) {
1047 amd64_mc_err(mci, "failed to map error addr 0x%lx to a node\n", 1047 amd64_mc_err(mci, "failed to map error addr 0x%lx to a node\n",
1048 (unsigned long)sys_addr); 1048 (unsigned long)sys_addr);
1049 edac_mc_handle_error(HW_EVENT_ERR_CORRECTED, mci, 1049 edac_mc_handle_error(HW_EVENT_ERR_CORRECTED, mci, 1,
1050 page, offset, syndrome, 1050 page, offset, syndrome,
1051 -1, -1, -1, 1051 -1, -1, -1,
1052 "failed to map error addr to a node", 1052 "failed to map error addr to a node",
@@ -1057,7 +1057,7 @@ static void k8_map_sysaddr_to_csrow(struct mem_ctl_info *mci, u64 sys_addr,
1057 /* Now map the sys_addr to a CSROW */ 1057 /* Now map the sys_addr to a CSROW */
1058 csrow = sys_addr_to_csrow(src_mci, sys_addr); 1058 csrow = sys_addr_to_csrow(src_mci, sys_addr);
1059 if (csrow < 0) { 1059 if (csrow < 0) {
1060 edac_mc_handle_error(HW_EVENT_ERR_CORRECTED, mci, 1060 edac_mc_handle_error(HW_EVENT_ERR_CORRECTED, mci, 1,
1061 page, offset, syndrome, 1061 page, offset, syndrome,
1062 -1, -1, -1, 1062 -1, -1, -1,
1063 "failed to map error addr to a csrow", 1063 "failed to map error addr to a csrow",
@@ -1077,7 +1077,7 @@ static void k8_map_sysaddr_to_csrow(struct mem_ctl_info *mci, u64 sys_addr,
1077 amd64_mc_warn(src_mci, "unknown syndrome 0x%04x - " 1077 amd64_mc_warn(src_mci, "unknown syndrome 0x%04x - "
1078 "possible error reporting race\n", 1078 "possible error reporting race\n",
1079 syndrome); 1079 syndrome);
1080 edac_mc_handle_error(HW_EVENT_ERR_CORRECTED, mci, 1080 edac_mc_handle_error(HW_EVENT_ERR_CORRECTED, mci, 1,
1081 page, offset, syndrome, 1081 page, offset, syndrome,
1082 csrow, -1, -1, 1082 csrow, -1, -1,
1083 "unknown syndrome - possible error reporting race", 1083 "unknown syndrome - possible error reporting race",
@@ -1096,7 +1096,7 @@ static void k8_map_sysaddr_to_csrow(struct mem_ctl_info *mci, u64 sys_addr,
1096 channel = ((sys_addr & BIT(3)) != 0); 1096 channel = ((sys_addr & BIT(3)) != 0);
1097 } 1097 }
1098 1098
1099 edac_mc_handle_error(HW_EVENT_ERR_CORRECTED, src_mci, 1099 edac_mc_handle_error(HW_EVENT_ERR_CORRECTED, src_mci, 1,
1100 page, offset, syndrome, 1100 page, offset, syndrome,
1101 csrow, channel, -1, 1101 csrow, channel, -1,
1102 "", ""); 1102 "", "");
@@ -1608,7 +1608,7 @@ static void f1x_map_sysaddr_to_csrow(struct mem_ctl_info *mci, u64 sys_addr,
1608 csrow = f1x_translate_sysaddr_to_cs(pvt, sys_addr, &nid, &chan); 1608 csrow = f1x_translate_sysaddr_to_cs(pvt, sys_addr, &nid, &chan);
1609 1609
1610 if (csrow < 0) { 1610 if (csrow < 0) {
1611 edac_mc_handle_error(HW_EVENT_ERR_CORRECTED, mci, 1611 edac_mc_handle_error(HW_EVENT_ERR_CORRECTED, mci, 1,
1612 page, offset, syndrome, 1612 page, offset, syndrome,
1613 -1, -1, -1, 1613 -1, -1, -1,
1614 "failed to map error addr to a csrow", 1614 "failed to map error addr to a csrow",
@@ -1624,7 +1624,7 @@ static void f1x_map_sysaddr_to_csrow(struct mem_ctl_info *mci, u64 sys_addr,
1624 if (dct_ganging_enabled(pvt)) 1624 if (dct_ganging_enabled(pvt))
1625 chan = get_channel_from_ecc_syndrome(mci, syndrome); 1625 chan = get_channel_from_ecc_syndrome(mci, syndrome);
1626 1626
1627 edac_mc_handle_error(HW_EVENT_ERR_CORRECTED, mci, 1627 edac_mc_handle_error(HW_EVENT_ERR_CORRECTED, mci, 1,
1628 page, offset, syndrome, 1628 page, offset, syndrome,
1629 csrow, chan, -1, 1629 csrow, chan, -1,
1630 "", ""); 1630 "", "");
@@ -1909,7 +1909,7 @@ static void amd64_handle_ce(struct mem_ctl_info *mci, struct mce *m)
1909 /* Ensure that the Error Address is VALID */ 1909 /* Ensure that the Error Address is VALID */
1910 if (!(m->status & MCI_STATUS_ADDRV)) { 1910 if (!(m->status & MCI_STATUS_ADDRV)) {
1911 amd64_mc_err(mci, "HW has no ERROR_ADDRESS available\n"); 1911 amd64_mc_err(mci, "HW has no ERROR_ADDRESS available\n");
1912 edac_mc_handle_error(HW_EVENT_ERR_CORRECTED, mci, 1912 edac_mc_handle_error(HW_EVENT_ERR_CORRECTED, mci, 1,
1913 0, 0, 0, 1913 0, 0, 0,
1914 -1, -1, -1, 1914 -1, -1, -1,
1915 "HW has no ERROR_ADDRESS available", 1915 "HW has no ERROR_ADDRESS available",
@@ -1937,7 +1937,7 @@ static void amd64_handle_ue(struct mem_ctl_info *mci, struct mce *m)
1937 1937
1938 if (!(m->status & MCI_STATUS_ADDRV)) { 1938 if (!(m->status & MCI_STATUS_ADDRV)) {
1939 amd64_mc_err(mci, "HW has no ERROR_ADDRESS available\n"); 1939 amd64_mc_err(mci, "HW has no ERROR_ADDRESS available\n");
1940 edac_mc_handle_error(HW_EVENT_ERR_UNCORRECTED, mci, 1940 edac_mc_handle_error(HW_EVENT_ERR_UNCORRECTED, mci, 1,
1941 0, 0, 0, 1941 0, 0, 0,
1942 -1, -1, -1, 1942 -1, -1, -1,
1943 "HW has no ERROR_ADDRESS available", 1943 "HW has no ERROR_ADDRESS available",
@@ -1956,7 +1956,7 @@ static void amd64_handle_ue(struct mem_ctl_info *mci, struct mce *m)
1956 if (!src_mci) { 1956 if (!src_mci) {
1957 amd64_mc_err(mci, "ERROR ADDRESS (0x%lx) NOT mapped to a MC\n", 1957 amd64_mc_err(mci, "ERROR ADDRESS (0x%lx) NOT mapped to a MC\n",
1958 (unsigned long)sys_addr); 1958 (unsigned long)sys_addr);
1959 edac_mc_handle_error(HW_EVENT_ERR_UNCORRECTED, mci, 1959 edac_mc_handle_error(HW_EVENT_ERR_UNCORRECTED, mci, 1,
1960 page, offset, 0, 1960 page, offset, 0,
1961 -1, -1, -1, 1961 -1, -1, -1,
1962 "ERROR ADDRESS NOT mapped to a MC", 1962 "ERROR ADDRESS NOT mapped to a MC",
@@ -1970,13 +1970,13 @@ static void amd64_handle_ue(struct mem_ctl_info *mci, struct mce *m)
1970 if (csrow < 0) { 1970 if (csrow < 0) {
1971 amd64_mc_err(mci, "ERROR_ADDRESS (0x%lx) NOT mapped to CS\n", 1971 amd64_mc_err(mci, "ERROR_ADDRESS (0x%lx) NOT mapped to CS\n",
1972 (unsigned long)sys_addr); 1972 (unsigned long)sys_addr);
1973 edac_mc_handle_error(HW_EVENT_ERR_UNCORRECTED, mci, 1973 edac_mc_handle_error(HW_EVENT_ERR_UNCORRECTED, mci, 1,
1974 page, offset, 0, 1974 page, offset, 0,
1975 -1, -1, -1, 1975 -1, -1, -1,
1976 "ERROR ADDRESS NOT mapped to CS", 1976 "ERROR ADDRESS NOT mapped to CS",
1977 ""); 1977 "");
1978 } else { 1978 } else {
1979 edac_mc_handle_error(HW_EVENT_ERR_UNCORRECTED, mci, 1979 edac_mc_handle_error(HW_EVENT_ERR_UNCORRECTED, mci, 1,
1980 page, offset, 0, 1980 page, offset, 0,
1981 csrow, -1, -1, 1981 csrow, -1, -1,
1982 "", ""); 1982 "", "");
diff --git a/drivers/edac/amd76x_edac.c b/drivers/edac/amd76x_edac.c
index c7c208eae233..29eeb68a200c 100644
--- a/drivers/edac/amd76x_edac.c
+++ b/drivers/edac/amd76x_edac.c
@@ -145,7 +145,7 @@ static int amd76x_process_error_info(struct mem_ctl_info *mci,
145 145
146 if (handle_errors) { 146 if (handle_errors) {
147 row = (info->ecc_mode_status >> 4) & 0xf; 147 row = (info->ecc_mode_status >> 4) & 0xf;
148 edac_mc_handle_error(HW_EVENT_ERR_UNCORRECTED, mci, 148 edac_mc_handle_error(HW_EVENT_ERR_UNCORRECTED, mci, 1,
149 mci->csrows[row]->first_page, 0, 0, 149 mci->csrows[row]->first_page, 0, 0,
150 row, 0, -1, 150 row, 0, -1,
151 mci->ctl_name, ""); 151 mci->ctl_name, "");
@@ -160,7 +160,7 @@ static int amd76x_process_error_info(struct mem_ctl_info *mci,
160 160
161 if (handle_errors) { 161 if (handle_errors) {
162 row = info->ecc_mode_status & 0xf; 162 row = info->ecc_mode_status & 0xf;
163 edac_mc_handle_error(HW_EVENT_ERR_CORRECTED, mci, 163 edac_mc_handle_error(HW_EVENT_ERR_CORRECTED, mci, 1,
164 mci->csrows[row]->first_page, 0, 0, 164 mci->csrows[row]->first_page, 0, 0,
165 row, 0, -1, 165 row, 0, -1,
166 mci->ctl_name, ""); 166 mci->ctl_name, "");
diff --git a/drivers/edac/cell_edac.c b/drivers/edac/cell_edac.c
index 165d255e627d..a1bbd8edd257 100644
--- a/drivers/edac/cell_edac.c
+++ b/drivers/edac/cell_edac.c
@@ -48,7 +48,7 @@ static void cell_edac_count_ce(struct mem_ctl_info *mci, int chan, u64 ar)
48 syndrome = (ar & 0x000000001fe00000ul) >> 21; 48 syndrome = (ar & 0x000000001fe00000ul) >> 21;
49 49
50 /* TODO: Decoding of the error address */ 50 /* TODO: Decoding of the error address */
51 edac_mc_handle_error(HW_EVENT_ERR_CORRECTED, mci, 51 edac_mc_handle_error(HW_EVENT_ERR_CORRECTED, mci, 1,
52 csrow->first_page + pfn, offset, syndrome, 52 csrow->first_page + pfn, offset, syndrome,
53 0, chan, -1, "", ""); 53 0, chan, -1, "", "");
54} 54}
@@ -70,7 +70,7 @@ static void cell_edac_count_ue(struct mem_ctl_info *mci, int chan, u64 ar)
70 offset = address & ~PAGE_MASK; 70 offset = address & ~PAGE_MASK;
71 71
72 /* TODO: Decoding of the error address */ 72 /* TODO: Decoding of the error address */
73 edac_mc_handle_error(HW_EVENT_ERR_UNCORRECTED, mci, 73 edac_mc_handle_error(HW_EVENT_ERR_UNCORRECTED, mci, 1,
74 csrow->first_page + pfn, offset, 0, 74 csrow->first_page + pfn, offset, 0,
75 0, chan, -1, "", ""); 75 0, chan, -1, "", "");
76} 76}
diff --git a/drivers/edac/cpc925_edac.c b/drivers/edac/cpc925_edac.c
index 32e9c88dbde9..c2ef13495873 100644
--- a/drivers/edac/cpc925_edac.c
+++ b/drivers/edac/cpc925_edac.c
@@ -554,7 +554,7 @@ static void cpc925_mc_check(struct mem_ctl_info *mci)
554 if (apiexcp & CECC_EXCP_DETECTED) { 554 if (apiexcp & CECC_EXCP_DETECTED) {
555 cpc925_mc_printk(mci, KERN_INFO, "DRAM CECC Fault\n"); 555 cpc925_mc_printk(mci, KERN_INFO, "DRAM CECC Fault\n");
556 channel = cpc925_mc_find_channel(mci, syndrome); 556 channel = cpc925_mc_find_channel(mci, syndrome);
557 edac_mc_handle_error(HW_EVENT_ERR_CORRECTED, mci, 557 edac_mc_handle_error(HW_EVENT_ERR_CORRECTED, mci, 1,
558 pfn, offset, syndrome, 558 pfn, offset, syndrome,
559 csrow, channel, -1, 559 csrow, channel, -1,
560 mci->ctl_name, ""); 560 mci->ctl_name, "");
@@ -562,7 +562,7 @@ static void cpc925_mc_check(struct mem_ctl_info *mci)
562 562
563 if (apiexcp & UECC_EXCP_DETECTED) { 563 if (apiexcp & UECC_EXCP_DETECTED) {
564 cpc925_mc_printk(mci, KERN_INFO, "DRAM UECC Fault\n"); 564 cpc925_mc_printk(mci, KERN_INFO, "DRAM UECC Fault\n");
565 edac_mc_handle_error(HW_EVENT_ERR_CORRECTED, mci, 565 edac_mc_handle_error(HW_EVENT_ERR_CORRECTED, mci, 1,
566 pfn, offset, 0, 566 pfn, offset, 0,
567 csrow, -1, -1, 567 csrow, -1, -1,
568 mci->ctl_name, ""); 568 mci->ctl_name, "");
diff --git a/drivers/edac/e752x_edac.c b/drivers/edac/e752x_edac.c
index b5a8bf1292ac..a5ed6b795fd4 100644
--- a/drivers/edac/e752x_edac.c
+++ b/drivers/edac/e752x_edac.c
@@ -371,7 +371,7 @@ static void do_process_ce(struct mem_ctl_info *mci, u16 error_one,
371 channel = !(error_one & 1); 371 channel = !(error_one & 1);
372 372
373 /* e752x mc reads 34:6 of the DRAM linear address */ 373 /* e752x mc reads 34:6 of the DRAM linear address */
374 edac_mc_handle_error(HW_EVENT_ERR_CORRECTED, mci, 374 edac_mc_handle_error(HW_EVENT_ERR_CORRECTED, mci, 1,
375 page, offset_in_page(sec1_add << 4), sec1_syndrome, 375 page, offset_in_page(sec1_add << 4), sec1_syndrome,
376 row, channel, -1, 376 row, channel, -1,
377 "e752x CE", ""); 377 "e752x CE", "");
@@ -408,7 +408,7 @@ static void do_process_ue(struct mem_ctl_info *mci, u16 error_one,
408 edac_mc_find_csrow_by_page(mci, block_page); 408 edac_mc_find_csrow_by_page(mci, block_page);
409 409
410 /* e752x mc reads 34:6 of the DRAM linear address */ 410 /* e752x mc reads 34:6 of the DRAM linear address */
411 edac_mc_handle_error(HW_EVENT_ERR_UNCORRECTED, mci, 411 edac_mc_handle_error(HW_EVENT_ERR_UNCORRECTED, mci, 1,
412 block_page, 412 block_page,
413 offset_in_page(error_2b << 4), 0, 413 offset_in_page(error_2b << 4), 0,
414 row, -1, -1, 414 row, -1, -1,
@@ -427,7 +427,7 @@ static void do_process_ue(struct mem_ctl_info *mci, u16 error_one,
427 edac_mc_find_csrow_by_page(mci, block_page); 427 edac_mc_find_csrow_by_page(mci, block_page);
428 428
429 /* e752x mc reads 34:6 of the DRAM linear address */ 429 /* e752x mc reads 34:6 of the DRAM linear address */
430 edac_mc_handle_error(HW_EVENT_ERR_UNCORRECTED, mci, 430 edac_mc_handle_error(HW_EVENT_ERR_UNCORRECTED, mci, 1,
431 block_page, 431 block_page,
432 offset_in_page(error_2b << 4), 0, 432 offset_in_page(error_2b << 4), 0,
433 row, -1, -1, 433 row, -1, -1,
@@ -454,7 +454,7 @@ static inline void process_ue_no_info_wr(struct mem_ctl_info *mci,
454 return; 454 return;
455 455
456 edac_dbg(3, "\n"); 456 edac_dbg(3, "\n");
457 edac_mc_handle_error(HW_EVENT_ERR_UNCORRECTED, mci, 0, 0, 0, 457 edac_mc_handle_error(HW_EVENT_ERR_UNCORRECTED, mci, 1, 0, 0, 0,
458 -1, -1, -1, 458 -1, -1, -1,
459 "e752x UE log memory write", ""); 459 "e752x UE log memory write", "");
460} 460}
diff --git a/drivers/edac/e7xxx_edac.c b/drivers/edac/e7xxx_edac.c
index c26b69e70039..9ff57f361a43 100644
--- a/drivers/edac/e7xxx_edac.c
+++ b/drivers/edac/e7xxx_edac.c
@@ -219,14 +219,14 @@ static void process_ce(struct mem_ctl_info *mci, struct e7xxx_error_info *info)
219 row = edac_mc_find_csrow_by_page(mci, page); 219 row = edac_mc_find_csrow_by_page(mci, page);
220 /* convert syndrome to channel */ 220 /* convert syndrome to channel */
221 channel = e7xxx_find_channel(syndrome); 221 channel = e7xxx_find_channel(syndrome);
222 edac_mc_handle_error(HW_EVENT_ERR_CORRECTED, mci, page, 0, syndrome, 222 edac_mc_handle_error(HW_EVENT_ERR_CORRECTED, mci, 1, page, 0, syndrome,
223 row, channel, -1, "e7xxx CE", ""); 223 row, channel, -1, "e7xxx CE", "");
224} 224}
225 225
226static void process_ce_no_info(struct mem_ctl_info *mci) 226static void process_ce_no_info(struct mem_ctl_info *mci)
227{ 227{
228 edac_dbg(3, "\n"); 228 edac_dbg(3, "\n");
229 edac_mc_handle_error(HW_EVENT_ERR_UNCORRECTED, mci, 0, 0, 0, -1, -1, -1, 229 edac_mc_handle_error(HW_EVENT_ERR_UNCORRECTED, mci, 1, 0, 0, 0, -1, -1, -1,
230 "e7xxx CE log register overflow", ""); 230 "e7xxx CE log register overflow", "");
231} 231}
232 232
@@ -242,7 +242,7 @@ static void process_ue(struct mem_ctl_info *mci, struct e7xxx_error_info *info)
242 block_page = error_2b >> 6; /* convert to 4k address */ 242 block_page = error_2b >> 6; /* convert to 4k address */
243 row = edac_mc_find_csrow_by_page(mci, block_page); 243 row = edac_mc_find_csrow_by_page(mci, block_page);
244 244
245 edac_mc_handle_error(HW_EVENT_ERR_UNCORRECTED, mci, block_page, 0, 0, 245 edac_mc_handle_error(HW_EVENT_ERR_UNCORRECTED, mci, 1, block_page, 0, 0,
246 row, -1, -1, "e7xxx UE", ""); 246 row, -1, -1, "e7xxx UE", "");
247} 247}
248 248
@@ -250,7 +250,7 @@ static void process_ue_no_info(struct mem_ctl_info *mci)
250{ 250{
251 edac_dbg(3, "\n"); 251 edac_dbg(3, "\n");
252 252
253 edac_mc_handle_error(HW_EVENT_ERR_UNCORRECTED, mci, 0, 0, 0, -1, -1, -1, 253 edac_mc_handle_error(HW_EVENT_ERR_UNCORRECTED, mci, 1, 0, 0, 0, -1, -1, -1,
254 "e7xxx UE log register overflow", ""); 254 "e7xxx UE log register overflow", "");
255} 255}
256 256
diff --git a/drivers/edac/edac_core.h b/drivers/edac/edac_core.h
index 500ba6698986..3843222e5b9f 100644
--- a/drivers/edac/edac_core.h
+++ b/drivers/edac/edac_core.h
@@ -455,6 +455,7 @@ extern int edac_mc_find_csrow_by_page(struct mem_ctl_info *mci,
455 unsigned long page); 455 unsigned long page);
456void edac_mc_handle_error(const enum hw_event_mc_err_type type, 456void edac_mc_handle_error(const enum hw_event_mc_err_type type,
457 struct mem_ctl_info *mci, 457 struct mem_ctl_info *mci,
458 const u16 error_count,
458 const unsigned long page_frame_number, 459 const unsigned long page_frame_number,
459 const unsigned long offset_in_page, 460 const unsigned long offset_in_page,
460 const unsigned long syndrome, 461 const unsigned long syndrome,
diff --git a/drivers/edac/edac_mc.c b/drivers/edac/edac_mc.c
index fb41e38c6891..8d59378f839c 100644
--- a/drivers/edac/edac_mc.c
+++ b/drivers/edac/edac_mc.c
@@ -897,15 +897,16 @@ const char *edac_layer_name[] = {
897EXPORT_SYMBOL_GPL(edac_layer_name); 897EXPORT_SYMBOL_GPL(edac_layer_name);
898 898
899static void edac_inc_ce_error(struct mem_ctl_info *mci, 899static void edac_inc_ce_error(struct mem_ctl_info *mci,
900 bool enable_per_layer_report, 900 bool enable_per_layer_report,
901 const int pos[EDAC_MAX_LAYERS]) 901 const int pos[EDAC_MAX_LAYERS],
902 const u16 count)
902{ 903{
903 int i, index = 0; 904 int i, index = 0;
904 905
905 mci->ce_mc++; 906 mci->ce_mc += count;
906 907
907 if (!enable_per_layer_report) { 908 if (!enable_per_layer_report) {
908 mci->ce_noinfo_count++; 909 mci->ce_noinfo_count += count;
909 return; 910 return;
910 } 911 }
911 912
@@ -913,7 +914,7 @@ static void edac_inc_ce_error(struct mem_ctl_info *mci,
913 if (pos[i] < 0) 914 if (pos[i] < 0)
914 break; 915 break;
915 index += pos[i]; 916 index += pos[i];
916 mci->ce_per_layer[i][index]++; 917 mci->ce_per_layer[i][index] += count;
917 918
918 if (i < mci->n_layers - 1) 919 if (i < mci->n_layers - 1)
919 index *= mci->layers[i + 1].size; 920 index *= mci->layers[i + 1].size;
@@ -922,14 +923,15 @@ static void edac_inc_ce_error(struct mem_ctl_info *mci,
922 923
923static void edac_inc_ue_error(struct mem_ctl_info *mci, 924static void edac_inc_ue_error(struct mem_ctl_info *mci,
924 bool enable_per_layer_report, 925 bool enable_per_layer_report,
925 const int pos[EDAC_MAX_LAYERS]) 926 const int pos[EDAC_MAX_LAYERS],
927 const u16 count)
926{ 928{
927 int i, index = 0; 929 int i, index = 0;
928 930
929 mci->ue_mc++; 931 mci->ue_mc += count;
930 932
931 if (!enable_per_layer_report) { 933 if (!enable_per_layer_report) {
932 mci->ce_noinfo_count++; 934 mci->ce_noinfo_count += count;
933 return; 935 return;
934 } 936 }
935 937
@@ -937,7 +939,7 @@ static void edac_inc_ue_error(struct mem_ctl_info *mci,
937 if (pos[i] < 0) 939 if (pos[i] < 0)
938 break; 940 break;
939 index += pos[i]; 941 index += pos[i];
940 mci->ue_per_layer[i][index]++; 942 mci->ue_per_layer[i][index] += count;
941 943
942 if (i < mci->n_layers - 1) 944 if (i < mci->n_layers - 1)
943 index *= mci->layers[i + 1].size; 945 index *= mci->layers[i + 1].size;
@@ -945,6 +947,7 @@ static void edac_inc_ue_error(struct mem_ctl_info *mci,
945} 947}
946 948
947static void edac_ce_error(struct mem_ctl_info *mci, 949static void edac_ce_error(struct mem_ctl_info *mci,
950 const u16 error_count,
948 const int pos[EDAC_MAX_LAYERS], 951 const int pos[EDAC_MAX_LAYERS],
949 const char *msg, 952 const char *msg,
950 const char *location, 953 const char *location,
@@ -961,16 +964,18 @@ static void edac_ce_error(struct mem_ctl_info *mci,
961 if (edac_mc_get_log_ce()) { 964 if (edac_mc_get_log_ce()) {
962 if (other_detail && *other_detail) 965 if (other_detail && *other_detail)
963 edac_mc_printk(mci, KERN_WARNING, 966 edac_mc_printk(mci, KERN_WARNING,
964 "CE %s on %s (%s %s - %s)\n", 967 "%d CE %s on %s (%s %s - %s)\n",
968 error_count,
965 msg, label, location, 969 msg, label, location,
966 detail, other_detail); 970 detail, other_detail);
967 else 971 else
968 edac_mc_printk(mci, KERN_WARNING, 972 edac_mc_printk(mci, KERN_WARNING,
969 "CE %s on %s (%s %s)\n", 973 "%d CE %s on %s (%s %s)\n",
974 error_count,
970 msg, label, location, 975 msg, label, location,
971 detail); 976 detail);
972 } 977 }
973 edac_inc_ce_error(mci, enable_per_layer_report, pos); 978 edac_inc_ce_error(mci, enable_per_layer_report, pos, error_count);
974 979
975 if (mci->scrub_mode & SCRUB_SW_SRC) { 980 if (mci->scrub_mode & SCRUB_SW_SRC) {
976 /* 981 /*
@@ -994,6 +999,7 @@ static void edac_ce_error(struct mem_ctl_info *mci,
994} 999}
995 1000
996static void edac_ue_error(struct mem_ctl_info *mci, 1001static void edac_ue_error(struct mem_ctl_info *mci,
1002 const u16 error_count,
997 const int pos[EDAC_MAX_LAYERS], 1003 const int pos[EDAC_MAX_LAYERS],
998 const char *msg, 1004 const char *msg,
999 const char *location, 1005 const char *location,
@@ -1005,12 +1011,14 @@ static void edac_ue_error(struct mem_ctl_info *mci,
1005 if (edac_mc_get_log_ue()) { 1011 if (edac_mc_get_log_ue()) {
1006 if (other_detail && *other_detail) 1012 if (other_detail && *other_detail)
1007 edac_mc_printk(mci, KERN_WARNING, 1013 edac_mc_printk(mci, KERN_WARNING,
1008 "UE %s on %s (%s %s - %s)\n", 1014 "%d UE %s on %s (%s %s - %s)\n",
1015 error_count,
1009 msg, label, location, detail, 1016 msg, label, location, detail,
1010 other_detail); 1017 other_detail);
1011 else 1018 else
1012 edac_mc_printk(mci, KERN_WARNING, 1019 edac_mc_printk(mci, KERN_WARNING,
1013 "UE %s on %s (%s %s)\n", 1020 "%d UE %s on %s (%s %s)\n",
1021 error_count,
1014 msg, label, location, detail); 1022 msg, label, location, detail);
1015 } 1023 }
1016 1024
@@ -1023,7 +1031,7 @@ static void edac_ue_error(struct mem_ctl_info *mci,
1023 msg, label, location, detail); 1031 msg, label, location, detail);
1024 } 1032 }
1025 1033
1026 edac_inc_ue_error(mci, enable_per_layer_report, pos); 1034 edac_inc_ue_error(mci, enable_per_layer_report, pos, error_count);
1027} 1035}
1028 1036
1029#define OTHER_LABEL " or " 1037#define OTHER_LABEL " or "
@@ -1033,6 +1041,7 @@ static void edac_ue_error(struct mem_ctl_info *mci,
1033 * 1041 *
1034 * @type: severity of the error (CE/UE/Fatal) 1042 * @type: severity of the error (CE/UE/Fatal)
1035 * @mci: a struct mem_ctl_info pointer 1043 * @mci: a struct mem_ctl_info pointer
1044 * @error_count: Number of errors of the same type
1036 * @page_frame_number: mem page where the error occurred 1045 * @page_frame_number: mem page where the error occurred
1037 * @offset_in_page: offset of the error inside the page 1046 * @offset_in_page: offset of the error inside the page
1038 * @syndrome: ECC syndrome 1047 * @syndrome: ECC syndrome
@@ -1047,6 +1056,7 @@ static void edac_ue_error(struct mem_ctl_info *mci,
1047 */ 1056 */
1048void edac_mc_handle_error(const enum hw_event_mc_err_type type, 1057void edac_mc_handle_error(const enum hw_event_mc_err_type type,
1049 struct mem_ctl_info *mci, 1058 struct mem_ctl_info *mci,
1059 const u16 error_count,
1050 const unsigned long page_frame_number, 1060 const unsigned long page_frame_number,
1051 const unsigned long offset_in_page, 1061 const unsigned long offset_in_page,
1052 const unsigned long syndrome, 1062 const unsigned long syndrome,
@@ -1065,7 +1075,6 @@ void edac_mc_handle_error(const enum hw_event_mc_err_type type,
1065 int i; 1075 int i;
1066 long grain; 1076 long grain;
1067 bool enable_per_layer_report = false; 1077 bool enable_per_layer_report = false;
1068 u16 error_count; /* FIXME: make it a parameter */
1069 u8 grain_bits; 1078 u8 grain_bits;
1070 1079
1071 edac_dbg(3, "MC%d\n", mci->mc_idx); 1080 edac_dbg(3, "MC%d\n", mci->mc_idx);
@@ -1169,13 +1178,13 @@ void edac_mc_handle_error(const enum hw_event_mc_err_type type,
1169 strcpy(label, "unknown memory"); 1178 strcpy(label, "unknown memory");
1170 if (type == HW_EVENT_ERR_CORRECTED) { 1179 if (type == HW_EVENT_ERR_CORRECTED) {
1171 if (row >= 0) { 1180 if (row >= 0) {
1172 mci->csrows[row]->ce_count++; 1181 mci->csrows[row]->ce_count += error_count;
1173 if (chan >= 0) 1182 if (chan >= 0)
1174 mci->csrows[row]->channels[chan]->ce_count++; 1183 mci->csrows[row]->channels[chan]->ce_count += error_count;
1175 } 1184 }
1176 } else 1185 } else
1177 if (row >= 0) 1186 if (row >= 0)
1178 mci->csrows[row]->ue_count++; 1187 mci->csrows[row]->ue_count += error_count;
1179 } 1188 }
1180 1189
1181 /* Fill the RAM location data */ 1190 /* Fill the RAM location data */
@@ -1193,7 +1202,6 @@ void edac_mc_handle_error(const enum hw_event_mc_err_type type,
1193 1202
1194 /* Report the error via the trace interface */ 1203 /* Report the error via the trace interface */
1195 1204
1196 error_count = 1; /* FIXME: allow change it */
1197 grain_bits = fls_long(grain) + 1; 1205 grain_bits = fls_long(grain) + 1;
1198 trace_mc_event(type, msg, label, error_count, 1206 trace_mc_event(type, msg, label, error_count,
1199 mci->mc_idx, top_layer, mid_layer, low_layer, 1207 mci->mc_idx, top_layer, mid_layer, low_layer,
@@ -1206,16 +1214,16 @@ void edac_mc_handle_error(const enum hw_event_mc_err_type type,
1206 "page:0x%lx offset:0x%lx grain:%ld syndrome:0x%lx", 1214 "page:0x%lx offset:0x%lx grain:%ld syndrome:0x%lx",
1207 page_frame_number, offset_in_page, 1215 page_frame_number, offset_in_page,
1208 grain, syndrome); 1216 grain, syndrome);
1209 edac_ce_error(mci, pos, msg, location, label, detail, 1217 edac_ce_error(mci, error_count, pos, msg, location, label,
1210 other_detail, enable_per_layer_report, 1218 detail, other_detail, enable_per_layer_report,
1211 page_frame_number, offset_in_page, grain); 1219 page_frame_number, offset_in_page, grain);
1212 } else { 1220 } else {
1213 snprintf(detail, sizeof(detail), 1221 snprintf(detail, sizeof(detail),
1214 "page:0x%lx offset:0x%lx grain:%ld", 1222 "page:0x%lx offset:0x%lx grain:%ld",
1215 page_frame_number, offset_in_page, grain); 1223 page_frame_number, offset_in_page, grain);
1216 1224
1217 edac_ue_error(mci, pos, msg, location, label, detail, 1225 edac_ue_error(mci, error_count, pos, msg, location, label,
1218 other_detail, enable_per_layer_report); 1226 detail, other_detail, enable_per_layer_report);
1219 } 1227 }
1220} 1228}
1221EXPORT_SYMBOL_GPL(edac_mc_handle_error); 1229EXPORT_SYMBOL_GPL(edac_mc_handle_error);
diff --git a/drivers/edac/edac_mc_sysfs.c b/drivers/edac/edac_mc_sysfs.c
index 107e7a71678e..55b2f0a18d22 100644
--- a/drivers/edac/edac_mc_sysfs.c
+++ b/drivers/edac/edac_mc_sysfs.c
@@ -823,7 +823,7 @@ static ssize_t edac_fake_inject_write(struct file *file,
823 mci->fake_inject_layer[1], 823 mci->fake_inject_layer[1],
824 mci->fake_inject_layer[2] 824 mci->fake_inject_layer[2]
825 ); 825 );
826 edac_mc_handle_error(type, mci, 0, 0, 0, 826 edac_mc_handle_error(type, mci, 1, 0, 0, 0,
827 mci->fake_inject_layer[0], 827 mci->fake_inject_layer[0],
828 mci->fake_inject_layer[1], 828 mci->fake_inject_layer[1],
829 mci->fake_inject_layer[2], 829 mci->fake_inject_layer[2],
diff --git a/drivers/edac/i3000_edac.c b/drivers/edac/i3000_edac.c
index dd07bea34078..d3d19cc4e9a1 100644
--- a/drivers/edac/i3000_edac.c
+++ b/drivers/edac/i3000_edac.c
@@ -245,7 +245,7 @@ static int i3000_process_error_info(struct mem_ctl_info *mci,
245 return 1; 245 return 1;
246 246
247 if ((info->errsts ^ info->errsts2) & I3000_ERRSTS_BITS) { 247 if ((info->errsts ^ info->errsts2) & I3000_ERRSTS_BITS) {
248 edac_mc_handle_error(HW_EVENT_ERR_UNCORRECTED, mci, 0, 0, 0, 248 edac_mc_handle_error(HW_EVENT_ERR_UNCORRECTED, mci, 1, 0, 0, 0,
249 -1, -1, -1, 249 -1, -1, -1,
250 "UE overwrote CE", ""); 250 "UE overwrote CE", "");
251 info->errsts = info->errsts2; 251 info->errsts = info->errsts2;
@@ -258,12 +258,12 @@ static int i3000_process_error_info(struct mem_ctl_info *mci,
258 row = edac_mc_find_csrow_by_page(mci, pfn); 258 row = edac_mc_find_csrow_by_page(mci, pfn);
259 259
260 if (info->errsts & I3000_ERRSTS_UE) 260 if (info->errsts & I3000_ERRSTS_UE)
261 edac_mc_handle_error(HW_EVENT_ERR_UNCORRECTED, mci, 261 edac_mc_handle_error(HW_EVENT_ERR_UNCORRECTED, mci, 1,
262 pfn, offset, 0, 262 pfn, offset, 0,
263 row, -1, -1, 263 row, -1, -1,
264 "i3000 UE", ""); 264 "i3000 UE", "");
265 else 265 else
266 edac_mc_handle_error(HW_EVENT_ERR_CORRECTED, mci, 266 edac_mc_handle_error(HW_EVENT_ERR_CORRECTED, mci, 1,
267 pfn, offset, info->derrsyn, 267 pfn, offset, info->derrsyn,
268 row, multi_chan ? channel : 0, -1, 268 row, multi_chan ? channel : 0, -1,
269 "i3000 CE", ""); 269 "i3000 CE", "");
diff --git a/drivers/edac/i3200_edac.c b/drivers/edac/i3200_edac.c
index 07ae4426b5df..47180a08edad 100644
--- a/drivers/edac/i3200_edac.c
+++ b/drivers/edac/i3200_edac.c
@@ -218,7 +218,7 @@ static void i3200_process_error_info(struct mem_ctl_info *mci,
218 return; 218 return;
219 219
220 if ((info->errsts ^ info->errsts2) & I3200_ERRSTS_BITS) { 220 if ((info->errsts ^ info->errsts2) & I3200_ERRSTS_BITS) {
221 edac_mc_handle_error(HW_EVENT_ERR_UNCORRECTED, mci, 0, 0, 0, 221 edac_mc_handle_error(HW_EVENT_ERR_UNCORRECTED, mci, 1, 0, 0, 0,
222 -1, -1, -1, "UE overwrote CE", ""); 222 -1, -1, -1, "UE overwrote CE", "");
223 info->errsts = info->errsts2; 223 info->errsts = info->errsts2;
224 } 224 }
@@ -226,13 +226,13 @@ static void i3200_process_error_info(struct mem_ctl_info *mci,
226 for (channel = 0; channel < nr_channels; channel++) { 226 for (channel = 0; channel < nr_channels; channel++) {
227 log = info->eccerrlog[channel]; 227 log = info->eccerrlog[channel];
228 if (log & I3200_ECCERRLOG_UE) { 228 if (log & I3200_ECCERRLOG_UE) {
229 edac_mc_handle_error(HW_EVENT_ERR_UNCORRECTED, mci, 229 edac_mc_handle_error(HW_EVENT_ERR_UNCORRECTED, mci, 1,
230 0, 0, 0, 230 0, 0, 0,
231 eccerrlog_row(channel, log), 231 eccerrlog_row(channel, log),
232 -1, -1, 232 -1, -1,
233 "i3000 UE", ""); 233 "i3000 UE", "");
234 } else if (log & I3200_ECCERRLOG_CE) { 234 } else if (log & I3200_ECCERRLOG_CE) {
235 edac_mc_handle_error(HW_EVENT_ERR_UNCORRECTED, mci, 235 edac_mc_handle_error(HW_EVENT_ERR_UNCORRECTED, mci, 1,
236 0, 0, eccerrlog_syndrome(log), 236 0, 0, eccerrlog_syndrome(log),
237 eccerrlog_row(channel, log), 237 eccerrlog_row(channel, log),
238 -1, -1, 238 -1, -1,
diff --git a/drivers/edac/i5000_edac.c b/drivers/edac/i5000_edac.c
index 0406f0d4dd2f..a5c33df520ac 100644
--- a/drivers/edac/i5000_edac.c
+++ b/drivers/edac/i5000_edac.c
@@ -519,7 +519,7 @@ static void i5000_process_fatal_error_info(struct mem_ctl_info *mci,
519 bank, ras, cas, allErrors, specific); 519 bank, ras, cas, allErrors, specific);
520 520
521 /* Call the helper to output message */ 521 /* Call the helper to output message */
522 edac_mc_handle_error(HW_EVENT_ERR_FATAL, mci, 0, 0, 0, 522 edac_mc_handle_error(HW_EVENT_ERR_FATAL, mci, 1, 0, 0, 0,
523 channel >> 1, channel & 1, rank, 523 channel >> 1, channel & 1, rank,
524 rdwr ? "Write error" : "Read error", 524 rdwr ? "Write error" : "Read error",
525 msg); 525 msg);
@@ -618,7 +618,7 @@ static void i5000_process_nonfatal_error_info(struct mem_ctl_info *mci,
618 rank, bank, ras, cas, ue_errors, specific); 618 rank, bank, ras, cas, ue_errors, specific);
619 619
620 /* Call the helper to output message */ 620 /* Call the helper to output message */
621 edac_mc_handle_error(HW_EVENT_ERR_UNCORRECTED, mci, 0, 0, 0, 621 edac_mc_handle_error(HW_EVENT_ERR_UNCORRECTED, mci, 1, 0, 0, 0,
622 channel >> 1, -1, rank, 622 channel >> 1, -1, rank,
623 rdwr ? "Write error" : "Read error", 623 rdwr ? "Write error" : "Read error",
624 msg); 624 msg);
@@ -672,7 +672,7 @@ static void i5000_process_nonfatal_error_info(struct mem_ctl_info *mci,
672 specific); 672 specific);
673 673
674 /* Call the helper to output message */ 674 /* Call the helper to output message */
675 edac_mc_handle_error(HW_EVENT_ERR_CORRECTED, mci, 0, 0, 0, 675 edac_mc_handle_error(HW_EVENT_ERR_CORRECTED, mci, 1, 0, 0, 0,
676 channel >> 1, channel % 2, rank, 676 channel >> 1, channel % 2, rank,
677 rdwr ? "Write error" : "Read error", 677 rdwr ? "Write error" : "Read error",
678 msg); 678 msg);
@@ -718,7 +718,7 @@ static void i5000_process_nonfatal_error_info(struct mem_ctl_info *mci,
718 "Err=%#x (%s)", misc_errors, specific); 718 "Err=%#x (%s)", misc_errors, specific);
719 719
720 /* Call the helper to output message */ 720 /* Call the helper to output message */
721 edac_mc_handle_error(HW_EVENT_ERR_CORRECTED, mci, 0, 0, 0, 721 edac_mc_handle_error(HW_EVENT_ERR_CORRECTED, mci, 1, 0, 0, 0,
722 branch >> 1, -1, -1, 722 branch >> 1, -1, -1,
723 "Misc error", msg); 723 "Misc error", msg);
724 } 724 }
diff --git a/drivers/edac/i5100_edac.c b/drivers/edac/i5100_edac.c
index 1e5c8f668652..c4b5e5f868e8 100644
--- a/drivers/edac/i5100_edac.c
+++ b/drivers/edac/i5100_edac.c
@@ -431,7 +431,7 @@ static void i5100_handle_ce(struct mem_ctl_info *mci,
431 "bank %u, cas %u, ras %u\n", 431 "bank %u, cas %u, ras %u\n",
432 bank, cas, ras); 432 bank, cas, ras);
433 433
434 edac_mc_handle_error(HW_EVENT_ERR_CORRECTED, mci, 434 edac_mc_handle_error(HW_EVENT_ERR_CORRECTED, mci, 1,
435 0, 0, syndrome, 435 0, 0, syndrome,
436 chan, rank, -1, 436 chan, rank, -1,
437 msg, detail); 437 msg, detail);
@@ -453,7 +453,7 @@ static void i5100_handle_ue(struct mem_ctl_info *mci,
453 "bank %u, cas %u, ras %u\n", 453 "bank %u, cas %u, ras %u\n",
454 bank, cas, ras); 454 bank, cas, ras);
455 455
456 edac_mc_handle_error(HW_EVENT_ERR_UNCORRECTED, mci, 456 edac_mc_handle_error(HW_EVENT_ERR_UNCORRECTED, mci, 1,
457 0, 0, syndrome, 457 0, 0, syndrome,
458 chan, rank, -1, 458 chan, rank, -1,
459 msg, detail); 459 msg, detail);
diff --git a/drivers/edac/i5400_edac.c b/drivers/edac/i5400_edac.c
index f2bfc2660158..50069c62c8d4 100644
--- a/drivers/edac/i5400_edac.c
+++ b/drivers/edac/i5400_edac.c
@@ -554,7 +554,7 @@ static void i5400_proccess_non_recoverable_info(struct mem_ctl_info *mci,
554 "Bank=%d Buffer ID = %d RAS=%d CAS=%d Err=0x%lx (%s)", 554 "Bank=%d Buffer ID = %d RAS=%d CAS=%d Err=0x%lx (%s)",
555 bank, buf_id, ras, cas, allErrors, error_name[errnum]); 555 bank, buf_id, ras, cas, allErrors, error_name[errnum]);
556 556
557 edac_mc_handle_error(tp_event, mci, 0, 0, 0, 557 edac_mc_handle_error(tp_event, mci, 1, 0, 0, 0,
558 branch >> 1, -1, rank, 558 branch >> 1, -1, rank,
559 rdwr ? "Write error" : "Read error", 559 rdwr ? "Write error" : "Read error",
560 msg); 560 msg);
@@ -626,7 +626,7 @@ static void i5400_process_nonfatal_error_info(struct mem_ctl_info *mci,
626 branch >> 1, bank, rdwr_str(rdwr), ras, cas, 626 branch >> 1, bank, rdwr_str(rdwr), ras, cas,
627 allErrors, error_name[errnum]); 627 allErrors, error_name[errnum]);
628 628
629 edac_mc_handle_error(HW_EVENT_ERR_CORRECTED, mci, 0, 0, 0, 629 edac_mc_handle_error(HW_EVENT_ERR_CORRECTED, mci, 1, 0, 0, 0,
630 branch >> 1, channel % 2, rank, 630 branch >> 1, channel % 2, rank,
631 rdwr ? "Write error" : "Read error", 631 rdwr ? "Write error" : "Read error",
632 msg); 632 msg);
diff --git a/drivers/edac/i7300_edac.c b/drivers/edac/i7300_edac.c
index 4a8835fd12bd..a09d0667f72a 100644
--- a/drivers/edac/i7300_edac.c
+++ b/drivers/edac/i7300_edac.c
@@ -449,7 +449,7 @@ static void i7300_process_fbd_error(struct mem_ctl_info *mci)
449 "Bank=%d RAS=%d CAS=%d Err=0x%lx (%s))", 449 "Bank=%d RAS=%d CAS=%d Err=0x%lx (%s))",
450 bank, ras, cas, errors, specific); 450 bank, ras, cas, errors, specific);
451 451
452 edac_mc_handle_error(HW_EVENT_ERR_FATAL, mci, 0, 0, 0, 452 edac_mc_handle_error(HW_EVENT_ERR_FATAL, mci, 1, 0, 0, 0,
453 branch, -1, rank, 453 branch, -1, rank,
454 is_wr ? "Write error" : "Read error", 454 is_wr ? "Write error" : "Read error",
455 pvt->tmp_prt_buffer); 455 pvt->tmp_prt_buffer);
@@ -495,7 +495,7 @@ static void i7300_process_fbd_error(struct mem_ctl_info *mci)
495 "DRAM-Bank=%d RAS=%d CAS=%d, Err=0x%lx (%s))", 495 "DRAM-Bank=%d RAS=%d CAS=%d, Err=0x%lx (%s))",
496 bank, ras, cas, errors, specific); 496 bank, ras, cas, errors, specific);
497 497
498 edac_mc_handle_error(HW_EVENT_ERR_CORRECTED, mci, 0, 0, 498 edac_mc_handle_error(HW_EVENT_ERR_CORRECTED, mci, 1, 0, 0,
499 syndrome, 499 syndrome,
500 branch >> 1, channel % 2, rank, 500 branch >> 1, channel % 2, rank,
501 is_wr ? "Write error" : "Read error", 501 is_wr ? "Write error" : "Read error",
diff --git a/drivers/edac/i7core_edac.c b/drivers/edac/i7core_edac.c
index aba8d5190330..a95686e22416 100644
--- a/drivers/edac/i7core_edac.c
+++ b/drivers/edac/i7core_edac.c
@@ -1544,7 +1544,7 @@ static void i7core_rdimm_update_errcount(struct mem_ctl_info *mci,
1544 int i; 1544 int i;
1545 1545
1546 for (i = 0; i < add; i++) { 1546 for (i = 0; i < add; i++) {
1547 edac_mc_handle_error(HW_EVENT_ERR_CORRECTED, mci, 0, 0, 0, 1547 edac_mc_handle_error(HW_EVENT_ERR_CORRECTED, mci, 1, 0, 0, 0,
1548 chan, dimm, -1, "error", ""); 1548 chan, dimm, -1, "error", "");
1549 } 1549 }
1550} 1550}
@@ -1796,7 +1796,7 @@ static void i7core_mce_output_error(struct mem_ctl_info *mci,
1796 * only one event 1796 * only one event
1797 */ 1797 */
1798 if (uncorrected_error || !pvt->is_registered) 1798 if (uncorrected_error || !pvt->is_registered)
1799 edac_mc_handle_error(tp_event, mci, 1799 edac_mc_handle_error(tp_event, mci, 1,
1800 m->addr >> PAGE_SHIFT, 1800 m->addr >> PAGE_SHIFT,
1801 m->addr & ~PAGE_MASK, 1801 m->addr & ~PAGE_MASK,
1802 syndrome, 1802 syndrome,
diff --git a/drivers/edac/i82443bxgx_edac.c b/drivers/edac/i82443bxgx_edac.c
index 1c414a87195e..90f303db5d1d 100644
--- a/drivers/edac/i82443bxgx_edac.c
+++ b/drivers/edac/i82443bxgx_edac.c
@@ -156,7 +156,7 @@ static int i82443bxgx_edacmc_process_error_info(struct mem_ctl_info *mci,
156 if (info->eap & I82443BXGX_EAP_OFFSET_SBE) { 156 if (info->eap & I82443BXGX_EAP_OFFSET_SBE) {
157 error_found = 1; 157 error_found = 1;
158 if (handle_errors) 158 if (handle_errors)
159 edac_mc_handle_error(HW_EVENT_ERR_CORRECTED, mci, 159 edac_mc_handle_error(HW_EVENT_ERR_CORRECTED, mci, 1,
160 page, pageoffset, 0, 160 page, pageoffset, 0,
161 edac_mc_find_csrow_by_page(mci, page), 161 edac_mc_find_csrow_by_page(mci, page),
162 0, -1, mci->ctl_name, ""); 162 0, -1, mci->ctl_name, "");
@@ -165,7 +165,7 @@ static int i82443bxgx_edacmc_process_error_info(struct mem_ctl_info *mci,
165 if (info->eap & I82443BXGX_EAP_OFFSET_MBE) { 165 if (info->eap & I82443BXGX_EAP_OFFSET_MBE) {
166 error_found = 1; 166 error_found = 1;
167 if (handle_errors) 167 if (handle_errors)
168 edac_mc_handle_error(HW_EVENT_ERR_UNCORRECTED, mci, 168 edac_mc_handle_error(HW_EVENT_ERR_UNCORRECTED, mci, 1,
169 page, pageoffset, 0, 169 page, pageoffset, 0,
170 edac_mc_find_csrow_by_page(mci, page), 170 edac_mc_find_csrow_by_page(mci, page),
171 0, -1, mci->ctl_name, ""); 171 0, -1, mci->ctl_name, "");
diff --git a/drivers/edac/i82860_edac.c b/drivers/edac/i82860_edac.c
index ff4f590e9b90..1faa74971513 100644
--- a/drivers/edac/i82860_edac.c
+++ b/drivers/edac/i82860_edac.c
@@ -109,7 +109,7 @@ static int i82860_process_error_info(struct mem_ctl_info *mci,
109 return 1; 109 return 1;
110 110
111 if ((info->errsts ^ info->errsts2) & 0x0003) { 111 if ((info->errsts ^ info->errsts2) & 0x0003) {
112 edac_mc_handle_error(HW_EVENT_ERR_UNCORRECTED, mci, 0, 0, 0, 112 edac_mc_handle_error(HW_EVENT_ERR_UNCORRECTED, mci, 1, 0, 0, 0,
113 -1, -1, -1, "UE overwrote CE", ""); 113 -1, -1, -1, "UE overwrote CE", "");
114 info->errsts = info->errsts2; 114 info->errsts = info->errsts2;
115 } 115 }
@@ -119,12 +119,12 @@ static int i82860_process_error_info(struct mem_ctl_info *mci,
119 dimm = mci->csrows[row]->channels[0]->dimm; 119 dimm = mci->csrows[row]->channels[0]->dimm;
120 120
121 if (info->errsts & 0x0002) 121 if (info->errsts & 0x0002)
122 edac_mc_handle_error(HW_EVENT_ERR_UNCORRECTED, mci, 122 edac_mc_handle_error(HW_EVENT_ERR_UNCORRECTED, mci, 1,
123 info->eap, 0, 0, 123 info->eap, 0, 0,
124 dimm->location[0], dimm->location[1], -1, 124 dimm->location[0], dimm->location[1], -1,
125 "i82860 UE", ""); 125 "i82860 UE", "");
126 else 126 else
127 edac_mc_handle_error(HW_EVENT_ERR_UNCORRECTED, mci, 127 edac_mc_handle_error(HW_EVENT_ERR_UNCORRECTED, mci, 1,
128 info->eap, 0, info->derrsyn, 128 info->eap, 0, info->derrsyn,
129 dimm->location[0], dimm->location[1], -1, 129 dimm->location[0], dimm->location[1], -1,
130 "i82860 CE", ""); 130 "i82860 CE", "");
diff --git a/drivers/edac/i82875p_edac.c b/drivers/edac/i82875p_edac.c
index 2e3f306c9c72..3e416b1a6b53 100644
--- a/drivers/edac/i82875p_edac.c
+++ b/drivers/edac/i82875p_edac.c
@@ -236,7 +236,7 @@ static int i82875p_process_error_info(struct mem_ctl_info *mci,
236 return 1; 236 return 1;
237 237
238 if ((info->errsts ^ info->errsts2) & 0x0081) { 238 if ((info->errsts ^ info->errsts2) & 0x0081) {
239 edac_mc_handle_error(HW_EVENT_ERR_UNCORRECTED, mci, 0, 0, 0, 239 edac_mc_handle_error(HW_EVENT_ERR_UNCORRECTED, mci, 1, 0, 0, 0,
240 -1, -1, -1, 240 -1, -1, -1,
241 "UE overwrote CE", ""); 241 "UE overwrote CE", "");
242 info->errsts = info->errsts2; 242 info->errsts = info->errsts2;
@@ -246,12 +246,12 @@ static int i82875p_process_error_info(struct mem_ctl_info *mci,
246 row = edac_mc_find_csrow_by_page(mci, info->eap); 246 row = edac_mc_find_csrow_by_page(mci, info->eap);
247 247
248 if (info->errsts & 0x0080) 248 if (info->errsts & 0x0080)
249 edac_mc_handle_error(HW_EVENT_ERR_UNCORRECTED, mci, 249 edac_mc_handle_error(HW_EVENT_ERR_UNCORRECTED, mci, 1,
250 info->eap, 0, 0, 250 info->eap, 0, 0,
251 row, -1, -1, 251 row, -1, -1,
252 "i82875p UE", ""); 252 "i82875p UE", "");
253 else 253 else
254 edac_mc_handle_error(HW_EVENT_ERR_CORRECTED, mci, 254 edac_mc_handle_error(HW_EVENT_ERR_CORRECTED, mci, 1,
255 info->eap, 0, info->derrsyn, 255 info->eap, 0, info->derrsyn,
256 row, multi_chan ? (info->des & 0x1) : 0, 256 row, multi_chan ? (info->des & 0x1) : 0,
257 -1, "i82875p CE", ""); 257 -1, "i82875p CE", "");
diff --git a/drivers/edac/i82975x_edac.c b/drivers/edac/i82975x_edac.c
index c95ebe5e4d60..069e26c11c4f 100644
--- a/drivers/edac/i82975x_edac.c
+++ b/drivers/edac/i82975x_edac.c
@@ -288,7 +288,7 @@ static int i82975x_process_error_info(struct mem_ctl_info *mci,
288 return 1; 288 return 1;
289 289
290 if ((info->errsts ^ info->errsts2) & 0x0003) { 290 if ((info->errsts ^ info->errsts2) & 0x0003) {
291 edac_mc_handle_error(HW_EVENT_ERR_UNCORRECTED, mci, 0, 0, 0, 291 edac_mc_handle_error(HW_EVENT_ERR_UNCORRECTED, mci, 1, 0, 0, 0,
292 -1, -1, -1, "UE overwrote CE", ""); 292 -1, -1, -1, "UE overwrote CE", "");
293 info->errsts = info->errsts2; 293 info->errsts = info->errsts2;
294 } 294 }
@@ -314,12 +314,12 @@ static int i82975x_process_error_info(struct mem_ctl_info *mci,
314 (1 << mci->csrows[row]->channels[chan]->dimm->grain)); 314 (1 << mci->csrows[row]->channels[chan]->dimm->grain));
315 315
316 if (info->errsts & 0x0002) 316 if (info->errsts & 0x0002)
317 edac_mc_handle_error(HW_EVENT_ERR_UNCORRECTED, mci, 317 edac_mc_handle_error(HW_EVENT_ERR_UNCORRECTED, mci, 1,
318 page, offst, 0, 318 page, offst, 0,
319 row, -1, -1, 319 row, -1, -1,
320 "i82975x UE", ""); 320 "i82975x UE", "");
321 else 321 else
322 edac_mc_handle_error(HW_EVENT_ERR_CORRECTED, mci, 322 edac_mc_handle_error(HW_EVENT_ERR_CORRECTED, mci, 1,
323 page, offst, info->derrsyn, 323 page, offst, info->derrsyn,
324 row, chan ? chan : 0, -1, 324 row, chan ? chan : 0, -1,
325 "i82975x CE", ""); 325 "i82975x CE", "");
diff --git a/drivers/edac/mpc85xx_edac.c b/drivers/edac/mpc85xx_edac.c
index 56e79a053fe6..117cf00bd743 100644
--- a/drivers/edac/mpc85xx_edac.c
+++ b/drivers/edac/mpc85xx_edac.c
@@ -866,13 +866,13 @@ static void mpc85xx_mc_check(struct mem_ctl_info *mci)
866 mpc85xx_mc_printk(mci, KERN_ERR, "PFN out of range!\n"); 866 mpc85xx_mc_printk(mci, KERN_ERR, "PFN out of range!\n");
867 867
868 if (err_detect & DDR_EDE_SBE) 868 if (err_detect & DDR_EDE_SBE)
869 edac_mc_handle_error(HW_EVENT_ERR_CORRECTED, mci, 869 edac_mc_handle_error(HW_EVENT_ERR_CORRECTED, mci, 1,
870 pfn, err_addr & ~PAGE_MASK, syndrome, 870 pfn, err_addr & ~PAGE_MASK, syndrome,
871 row_index, 0, -1, 871 row_index, 0, -1,
872 mci->ctl_name, ""); 872 mci->ctl_name, "");
873 873
874 if (err_detect & DDR_EDE_MBE) 874 if (err_detect & DDR_EDE_MBE)
875 edac_mc_handle_error(HW_EVENT_ERR_UNCORRECTED, mci, 875 edac_mc_handle_error(HW_EVENT_ERR_UNCORRECTED, mci, 1,
876 pfn, err_addr & ~PAGE_MASK, syndrome, 876 pfn, err_addr & ~PAGE_MASK, syndrome,
877 row_index, 0, -1, 877 row_index, 0, -1,
878 mci->ctl_name, ""); 878 mci->ctl_name, "");
diff --git a/drivers/edac/mv64x60_edac.c b/drivers/edac/mv64x60_edac.c
index e491a297f5ec..2b315c2edc3c 100644
--- a/drivers/edac/mv64x60_edac.c
+++ b/drivers/edac/mv64x60_edac.c
@@ -611,13 +611,13 @@ static void mv64x60_mc_check(struct mem_ctl_info *mci)
611 611
612 /* first bit clear in ECC Err Reg, 1 bit error, correctable by HW */ 612 /* first bit clear in ECC Err Reg, 1 bit error, correctable by HW */
613 if (!(reg & 0x1)) 613 if (!(reg & 0x1))
614 edac_mc_handle_error(HW_EVENT_ERR_CORRECTED, mci, 614 edac_mc_handle_error(HW_EVENT_ERR_CORRECTED, mci, 1,
615 err_addr >> PAGE_SHIFT, 615 err_addr >> PAGE_SHIFT,
616 err_addr & PAGE_MASK, syndrome, 616 err_addr & PAGE_MASK, syndrome,
617 0, 0, -1, 617 0, 0, -1,
618 mci->ctl_name, ""); 618 mci->ctl_name, "");
619 else /* 2 bit error, UE */ 619 else /* 2 bit error, UE */
620 edac_mc_handle_error(HW_EVENT_ERR_UNCORRECTED, mci, 620 edac_mc_handle_error(HW_EVENT_ERR_UNCORRECTED, mci, 1,
621 err_addr >> PAGE_SHIFT, 621 err_addr >> PAGE_SHIFT,
622 err_addr & PAGE_MASK, 0, 622 err_addr & PAGE_MASK, 0,
623 0, 0, -1, 623 0, 0, -1,
diff --git a/drivers/edac/pasemi_edac.c b/drivers/edac/pasemi_edac.c
index 04851be51612..2d35b78ada3c 100644
--- a/drivers/edac/pasemi_edac.c
+++ b/drivers/edac/pasemi_edac.c
@@ -110,14 +110,14 @@ static void pasemi_edac_process_error_info(struct mem_ctl_info *mci, u32 errsta)
110 /* uncorrectable/multi-bit errors */ 110 /* uncorrectable/multi-bit errors */
111 if (errsta & (MCDEBUG_ERRSTA_MBE_STATUS | 111 if (errsta & (MCDEBUG_ERRSTA_MBE_STATUS |
112 MCDEBUG_ERRSTA_RFL_STATUS)) { 112 MCDEBUG_ERRSTA_RFL_STATUS)) {
113 edac_mc_handle_error(HW_EVENT_ERR_UNCORRECTED, mci, 113 edac_mc_handle_error(HW_EVENT_ERR_UNCORRECTED, mci, 1,
114 mci->csrows[cs]->first_page, 0, 0, 114 mci->csrows[cs]->first_page, 0, 0,
115 cs, 0, -1, mci->ctl_name, ""); 115 cs, 0, -1, mci->ctl_name, "");
116 } 116 }
117 117
118 /* correctable/single-bit errors */ 118 /* correctable/single-bit errors */
119 if (errsta & MCDEBUG_ERRSTA_SBE_STATUS) 119 if (errsta & MCDEBUG_ERRSTA_SBE_STATUS)
120 edac_mc_handle_error(HW_EVENT_ERR_CORRECTED, mci, 120 edac_mc_handle_error(HW_EVENT_ERR_CORRECTED, mci, 1,
121 mci->csrows[cs]->first_page, 0, 0, 121 mci->csrows[cs]->first_page, 0, 0,
122 cs, 0, -1, mci->ctl_name, ""); 122 cs, 0, -1, mci->ctl_name, "");
123} 123}
diff --git a/drivers/edac/ppc4xx_edac.c b/drivers/edac/ppc4xx_edac.c
index 67a29201dae7..bf0957635991 100644
--- a/drivers/edac/ppc4xx_edac.c
+++ b/drivers/edac/ppc4xx_edac.c
@@ -727,7 +727,7 @@ ppc4xx_edac_handle_ce(struct mem_ctl_info *mci,
727 727
728 for (row = 0; row < mci->nr_csrows; row++) 728 for (row = 0; row < mci->nr_csrows; row++)
729 if (ppc4xx_edac_check_bank_error(status, row)) 729 if (ppc4xx_edac_check_bank_error(status, row))
730 edac_mc_handle_error(HW_EVENT_ERR_CORRECTED, mci, 730 edac_mc_handle_error(HW_EVENT_ERR_CORRECTED, mci, 1,
731 0, 0, 0, 731 0, 0, 0,
732 row, 0, -1, 732 row, 0, -1,
733 message, ""); 733 message, "");
@@ -758,7 +758,7 @@ ppc4xx_edac_handle_ue(struct mem_ctl_info *mci,
758 758
759 for (row = 0; row < mci->nr_csrows; row++) 759 for (row = 0; row < mci->nr_csrows; row++)
760 if (ppc4xx_edac_check_bank_error(status, row)) 760 if (ppc4xx_edac_check_bank_error(status, row))
761 edac_mc_handle_error(HW_EVENT_ERR_UNCORRECTED, mci, 761 edac_mc_handle_error(HW_EVENT_ERR_UNCORRECTED, mci, 1,
762 page, offset, 0, 762 page, offset, 0,
763 row, 0, -1, 763 row, 0, -1,
764 message, ""); 764 message, "");
diff --git a/drivers/edac/r82600_edac.c b/drivers/edac/r82600_edac.c
index aa10178397fe..f854debd5533 100644
--- a/drivers/edac/r82600_edac.c
+++ b/drivers/edac/r82600_edac.c
@@ -179,7 +179,7 @@ static int r82600_process_error_info(struct mem_ctl_info *mci,
179 error_found = 1; 179 error_found = 1;
180 180
181 if (handle_errors) 181 if (handle_errors)
182 edac_mc_handle_error(HW_EVENT_ERR_CORRECTED, mci, 182 edac_mc_handle_error(HW_EVENT_ERR_CORRECTED, mci, 1,
183 page, 0, syndrome, 183 page, 0, syndrome,
184 edac_mc_find_csrow_by_page(mci, page), 184 edac_mc_find_csrow_by_page(mci, page),
185 0, -1, 185 0, -1,
@@ -191,7 +191,7 @@ static int r82600_process_error_info(struct mem_ctl_info *mci,
191 191
192 if (handle_errors) 192 if (handle_errors)
193 /* 82600 doesn't give enough info */ 193 /* 82600 doesn't give enough info */
194 edac_mc_handle_error(HW_EVENT_ERR_UNCORRECTED, mci, 194 edac_mc_handle_error(HW_EVENT_ERR_UNCORRECTED, mci, 1,
195 page, 0, 0, 195 page, 0, 0,
196 edac_mc_find_csrow_by_page(mci, page), 196 edac_mc_find_csrow_by_page(mci, page),
197 0, -1, 197 0, -1,
diff --git a/drivers/edac/sb_edac.c b/drivers/edac/sb_edac.c
index ae18d9849cc7..2809b07cbb01 100644
--- a/drivers/edac/sb_edac.c
+++ b/drivers/edac/sb_edac.c
@@ -1447,13 +1447,13 @@ static void sbridge_mce_output_error(struct mem_ctl_info *mci,
1447 /* FIXME: need support for channel mask */ 1447 /* FIXME: need support for channel mask */
1448 1448
1449 /* Call the helper to output message */ 1449 /* Call the helper to output message */
1450 edac_mc_handle_error(tp_event, mci, 1450 edac_mc_handle_error(tp_event, mci, 1,
1451 m->addr >> PAGE_SHIFT, m->addr & ~PAGE_MASK, 0, 1451 m->addr >> PAGE_SHIFT, m->addr & ~PAGE_MASK, 0,
1452 channel, dimm, -1, 1452 channel, dimm, -1,
1453 optype, msg); 1453 optype, msg);
1454 return; 1454 return;
1455err_parsing: 1455err_parsing:
1456 edac_mc_handle_error(tp_event, mci, 0, 0, 0, 1456 edac_mc_handle_error(tp_event, mci, 1, 0, 0, 0,
1457 -1, -1, -1, 1457 -1, -1, -1,
1458 msg, ""); 1458 msg, "");
1459 1459
diff --git a/drivers/edac/tile_edac.c b/drivers/edac/tile_edac.c
index 0589f56aa568..1e904b7b79a0 100644
--- a/drivers/edac/tile_edac.c
+++ b/drivers/edac/tile_edac.c
@@ -71,7 +71,7 @@ static void tile_edac_check(struct mem_ctl_info *mci)
71 if (mem_error.sbe_count != priv->ce_count) { 71 if (mem_error.sbe_count != priv->ce_count) {
72 dev_dbg(mci->pdev, "ECC CE err on node %d\n", priv->node); 72 dev_dbg(mci->pdev, "ECC CE err on node %d\n", priv->node);
73 priv->ce_count = mem_error.sbe_count; 73 priv->ce_count = mem_error.sbe_count;
74 edac_mc_handle_error(HW_EVENT_ERR_CORRECTED, mci, 74 edac_mc_handle_error(HW_EVENT_ERR_CORRECTED, mci, 1,
75 0, 0, 0, 75 0, 0, 0,
76 0, 0, -1, 76 0, 0, -1,
77 mci->ctl_name, ""); 77 mci->ctl_name, "");
diff --git a/drivers/edac/x38_edac.c b/drivers/edac/x38_edac.c
index 3d46d40987af..08a992693e62 100644
--- a/drivers/edac/x38_edac.c
+++ b/drivers/edac/x38_edac.c
@@ -215,7 +215,7 @@ static void x38_process_error_info(struct mem_ctl_info *mci,
215 return; 215 return;
216 216
217 if ((info->errsts ^ info->errsts2) & X38_ERRSTS_BITS) { 217 if ((info->errsts ^ info->errsts2) & X38_ERRSTS_BITS) {
218 edac_mc_handle_error(HW_EVENT_ERR_UNCORRECTED, mci, 0, 0, 0, 218 edac_mc_handle_error(HW_EVENT_ERR_UNCORRECTED, mci, 1, 0, 0, 0,
219 -1, -1, -1, 219 -1, -1, -1,
220 "UE overwrote CE", ""); 220 "UE overwrote CE", "");
221 info->errsts = info->errsts2; 221 info->errsts = info->errsts2;
@@ -224,13 +224,13 @@ static void x38_process_error_info(struct mem_ctl_info *mci,
224 for (channel = 0; channel < x38_channel_num; channel++) { 224 for (channel = 0; channel < x38_channel_num; channel++) {
225 log = info->eccerrlog[channel]; 225 log = info->eccerrlog[channel];
226 if (log & X38_ECCERRLOG_UE) { 226 if (log & X38_ECCERRLOG_UE) {
227 edac_mc_handle_error(HW_EVENT_ERR_UNCORRECTED, mci, 227 edac_mc_handle_error(HW_EVENT_ERR_UNCORRECTED, mci, 1,
228 0, 0, 0, 228 0, 0, 0,
229 eccerrlog_row(channel, log), 229 eccerrlog_row(channel, log),
230 -1, -1, 230 -1, -1,
231 "x38 UE", ""); 231 "x38 UE", "");
232 } else if (log & X38_ECCERRLOG_CE) { 232 } else if (log & X38_ECCERRLOG_CE) {
233 edac_mc_handle_error(HW_EVENT_ERR_CORRECTED, mci, 233 edac_mc_handle_error(HW_EVENT_ERR_CORRECTED, mci, 1,
234 0, 0, eccerrlog_syndrome(log), 234 0, 0, eccerrlog_syndrome(log),
235 eccerrlog_row(channel, log), 235 eccerrlog_row(channel, log),
236 -1, -1, 236 -1, -1,