@@ -81,6 +81,18 @@ static void ghes_edac_count_dimms(const struct dmi_header *dh, void *arg)
81
81
(* num_dimm )++ ;
82
82
}
83
83
84
+ static int get_dimm_smbios_index (u16 handle )
85
+ {
86
+ struct mem_ctl_info * mci = ghes_pvt -> mci ;
87
+ int i ;
88
+
89
+ for (i = 0 ; i < mci -> tot_dimms ; i ++ ) {
90
+ if (mci -> dimms [i ]-> smbios_handle == handle )
91
+ return i ;
92
+ }
93
+ return -1 ;
94
+ }
95
+
84
96
static void ghes_edac_dmidecode (const struct dmi_header * dh , void * arg )
85
97
{
86
98
struct ghes_edac_dimm_fill * dimm_fill = arg ;
@@ -177,6 +189,8 @@ static void ghes_edac_dmidecode(const struct dmi_header *dh, void *arg)
177
189
entry -> total_width , entry -> data_width );
178
190
}
179
191
192
+ dimm -> smbios_handle = entry -> handle ;
193
+
180
194
dimm_fill -> count ++ ;
181
195
}
182
196
}
@@ -327,12 +341,21 @@ void ghes_edac_report_mem_error(int sev, struct cper_sec_mem_err *mem_err)
327
341
p += sprintf (p , "bit_pos:%d " , mem_err -> bit_pos );
328
342
if (mem_err -> validation_bits & CPER_MEM_VALID_MODULE_HANDLE ) {
329
343
const char * bank = NULL , * device = NULL ;
344
+ int index = -1 ;
345
+
330
346
dmi_memdev_name (mem_err -> mem_dev_handle , & bank , & device );
331
347
if (bank != NULL && device != NULL )
332
348
p += sprintf (p , "DIMM location:%s %s " , bank , device );
333
349
else
334
350
p += sprintf (p , "DIMM DMI handle: 0x%.4x " ,
335
351
mem_err -> mem_dev_handle );
352
+
353
+ index = get_dimm_smbios_index (mem_err -> mem_dev_handle );
354
+ if (index >= 0 ) {
355
+ e -> top_layer = index ;
356
+ e -> enable_per_layer_report = true;
357
+ }
358
+
336
359
}
337
360
if (p > e -> location )
338
361
* (p - 1 ) = '\0' ;
0 commit comments