@@ -332,21 +332,51 @@ static void populate_dimm_info(struct dimm_data *dd, u32 addr_decode, int dimm,
332
332
dd -> dtype = field_get (cfg -> reg_mad_dimm_width_mask [dimm ], addr_decode ) + DEV_X8 ;
333
333
}
334
334
335
- static int ie31200_probe1 (struct pci_dev * pdev , struct res_config * cfg )
335
+ static void ie31200_get_dimm_config (struct mem_ctl_info * mci , void __iomem * window ,
336
+ struct res_config * cfg )
336
337
{
337
- int i , j , k , ret ;
338
- struct mem_ctl_info * mci = NULL ;
339
- struct edac_mc_layer layers [2 ];
340
- void __iomem * window ;
341
- struct ie31200_priv * priv ;
338
+ struct dimm_data dimm_info ;
339
+ struct dimm_info * dimm ;
340
+ unsigned long nr_pages ;
342
341
u32 addr_decode ;
342
+ int i , j , k ;
343
343
344
- edac_dbg (0 , "MC:\n" );
344
+ for (i = 0 ; i < IE31200_CHANNELS ; i ++ ) {
345
+ addr_decode = readl (window + cfg -> reg_mad_dimm_offset [i ]);
346
+ edac_dbg (0 , "addr_decode: 0x%x\n" , addr_decode );
345
347
346
- if (!ecc_capable (pdev )) {
347
- ie31200_printk (KERN_INFO , "No ECC support\n" );
348
- return - ENODEV ;
348
+ for (j = 0 ; j < IE31200_DIMMS_PER_CHANNEL ; j ++ ) {
349
+ populate_dimm_info (& dimm_info , addr_decode , j , cfg );
350
+ edac_dbg (0 , "channel: %d, dimm: %d, size: %lld MiB, ranks: %d, DRAM chip type: %d\n" ,
351
+ i , j , dimm_info .size >> 20 ,
352
+ dimm_info .ranks ,
353
+ dimm_info .dtype );
354
+
355
+ nr_pages = MiB_TO_PAGES (dimm_info .size >> 20 );
356
+ if (nr_pages == 0 )
357
+ continue ;
358
+
359
+ nr_pages = nr_pages / dimm_info .ranks ;
360
+ for (k = 0 ; k < dimm_info .ranks ; k ++ ) {
361
+ dimm = edac_get_dimm (mci , (j * dimm_info .ranks ) + k , i , 0 );
362
+ dimm -> nr_pages = nr_pages ;
363
+ edac_dbg (0 , "set nr pages: 0x%lx\n" , nr_pages );
364
+ dimm -> grain = 8 ; /* just a guess */
365
+ dimm -> mtype = cfg -> mtype ;
366
+ dimm -> dtype = dimm_info .dtype ;
367
+ dimm -> edac_mode = EDAC_UNKNOWN ;
368
+ }
369
+ }
349
370
}
371
+ }
372
+
373
+ static int ie31200_register_mci (struct pci_dev * pdev , struct res_config * cfg )
374
+ {
375
+ struct edac_mc_layer layers [2 ];
376
+ struct ie31200_priv * priv ;
377
+ struct mem_ctl_info * mci ;
378
+ void __iomem * window ;
379
+ int ret ;
350
380
351
381
nr_channels = how_many_channels (pdev );
352
382
layers [0 ].type = EDAC_MC_LAYER_CHIP_SELECT ;
@@ -382,38 +412,7 @@ static int ie31200_probe1(struct pci_dev *pdev, struct res_config *cfg)
382
412
priv -> c1errlog = window + cfg -> reg_eccerrlog_offset [1 ];
383
413
priv -> cfg = cfg ;
384
414
385
- for (i = 0 ; i < IE31200_CHANNELS ; i ++ ) {
386
- addr_decode = readl (window + cfg -> reg_mad_dimm_offset [i ]);
387
- edac_dbg (0 , "addr_decode: 0x%x\n" , addr_decode );
388
-
389
- for (j = 0 ; j < IE31200_DIMMS_PER_CHANNEL ; j ++ ) {
390
- struct dimm_data dimm_info ;
391
- struct dimm_info * dimm ;
392
- unsigned long nr_pages ;
393
-
394
- populate_dimm_info (& dimm_info , addr_decode , j , cfg );
395
- edac_dbg (0 , "channel: %d, dimm: %d, size: %lld MiB, ranks: %d, DRAM chip type: %d\n" ,
396
- i , j , dimm_info .size >> 20 ,
397
- dimm_info .ranks ,
398
- dimm_info .dtype );
399
-
400
- nr_pages = MiB_TO_PAGES (dimm_info .size >> 20 );
401
- if (nr_pages == 0 )
402
- continue ;
403
-
404
- nr_pages = nr_pages / dimm_info .ranks ;
405
- for (k = 0 ; k < dimm_info .ranks ; k ++ ) {
406
- dimm = edac_get_dimm (mci , (j * dimm_info .ranks ) + k , i , 0 );
407
- dimm -> nr_pages = nr_pages ;
408
- edac_dbg (0 , "set nr pages: 0x%lx\n" , nr_pages );
409
- dimm -> grain = 8 ; /* just a guess */
410
- dimm -> mtype = cfg -> mtype ;
411
- dimm -> dtype = dimm_info .dtype ;
412
- dimm -> edac_mode = EDAC_UNKNOWN ;
413
- }
414
- }
415
- }
416
-
415
+ ie31200_get_dimm_config (mci , window , cfg );
417
416
ie31200_clear_error_info (mci );
418
417
419
418
if (edac_mc_add_mc (mci )) {
@@ -422,19 +421,34 @@ static int ie31200_probe1(struct pci_dev *pdev, struct res_config *cfg)
422
421
goto fail_unmap ;
423
422
}
424
423
425
- /* get this far and it's successful */
426
- edac_dbg (3 , "MC: success\n" );
427
424
return 0 ;
428
-
429
425
fail_unmap :
430
426
iounmap (window );
431
-
432
427
fail_free :
433
428
edac_mc_free (mci );
434
-
435
429
return ret ;
436
430
}
437
431
432
+ static int ie31200_probe1 (struct pci_dev * pdev , struct res_config * cfg )
433
+ {
434
+ int ret ;
435
+
436
+ edac_dbg (0 , "MC:\n" );
437
+
438
+ if (!ecc_capable (pdev )) {
439
+ ie31200_printk (KERN_INFO , "No ECC support\n" );
440
+ return - ENODEV ;
441
+ }
442
+
443
+ ret = ie31200_register_mci (pdev , cfg );
444
+ if (ret )
445
+ return ret ;
446
+
447
+ /* get this far and it's successful. */
448
+ edac_dbg (3 , "MC: success\n" );
449
+ return 0 ;
450
+ }
451
+
438
452
static int ie31200_init_one (struct pci_dev * pdev ,
439
453
const struct pci_device_id * ent )
440
454
{
0 commit comments