@@ -332,21 +332,51 @@ static void populate_dimm_info(struct dimm_data *dd, u32 addr_decode, int dimm,
332332 dd -> dtype = field_get (cfg -> reg_mad_dimm_width_mask [dimm ], addr_decode ) + DEV_X8 ;
333333}
334334
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 )
336337{
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 ;
342341 u32 addr_decode ;
342+ int i , j , k ;
343343
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 );
345347
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+ }
349370 }
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 ;
350380
351381 nr_channels = how_many_channels (pdev );
352382 layers [0 ].type = EDAC_MC_LAYER_CHIP_SELECT ;
@@ -382,38 +412,7 @@ static int ie31200_probe1(struct pci_dev *pdev, struct res_config *cfg)
382412 priv -> c1errlog = window + cfg -> reg_eccerrlog_offset [1 ];
383413 priv -> cfg = cfg ;
384414
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 );
417416 ie31200_clear_error_info (mci );
418417
419418 if (edac_mc_add_mc (mci )) {
@@ -422,19 +421,34 @@ static int ie31200_probe1(struct pci_dev *pdev, struct res_config *cfg)
422421 goto fail_unmap ;
423422 }
424423
425- /* get this far and it's successful */
426- edac_dbg (3 , "MC: success\n" );
427424 return 0 ;
428-
429425fail_unmap :
430426 iounmap (window );
431-
432427fail_free :
433428 edac_mc_free (mci );
434-
435429 return ret ;
436430}
437431
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+
438452static int ie31200_init_one (struct pci_dev * pdev ,
439453 const struct pci_device_id * ent )
440454{
0 commit comments