Skip to content
  • Mauro Carvalho Chehab's avatar
    i3200_edac: Fix the logic that detects filled memories · 61734e18
    Mauro Carvalho Chehab authored
    
    
    After running a series of tests on an HP DL320, filled with different
    memory sizes, it was noticed that, when filled with just one DIMM
    on such hardware, the driver wrongly detects twice the memory, and
    thinks that both channels 0 and 1 are filled.
    
    It seems to be partially caused by the BIOS and partially by the driver.
    
    The i3200_edac current logic would be working fine if the BIOS were
    disabling the unused second channel when just one DIMM is connected,
    in order to do power-saving, as recommended on this chipset's datasheet.
    
    However, the BIOS on this particular machine doesn't do it:
    
    [   16.741421] EDAC DEBUG: how_many_channels: In dual channel mode
    [   16.741424] EDAC DEBUG: how_many_channels: 2 DIMMS per channel enabled
    
    So, the driver were assuming that 2 channels are enabled (well, they are,
    but the second is unused).
    
    Combined with that, I found two issues at the logic that creates the
    EDAC data, that were failing when the two channels are not equally
    filled (AFAICT, that happens only when just 1 DIMM is plugged).
    
    The first one is that a 0 at DRB means that nothing is filled. The
    driver's logic, however, do some calculation with that.
    
    The second one is that the logic that fills the DIMM data currently
    assumes that both channels are equally filled.
    
    I tested the system already with the current configuration and my
    patch and it is now working fine. So, for a 2R single DIMM 2Gb memory
    at dimm slot 01 (channel 0), it is now displaying:
    
    [   16.741406] EDAC DEBUG: i3200_get_drbs: drb[0][0] = 16, drb[1][0] = 0
    [   16.741410] EDAC DEBUG: i3200_get_drbs: drb[0][1] = 32, drb[1][1] = 0
    [   16.741413] EDAC DEBUG: i3200_get_drbs: drb[0][2] = 32, drb[1][2] = 0
    [   16.741416] EDAC DEBUG: i3200_get_drbs: drb[0][3] = 32, drb[1][3] = 0
    ...
    [   16.741896] EDAC DEBUG: i3200_probe1: csrow 0, channel 0, size = 1024 Mb
    [   16.741899] EDAC DEBUG: i3200_probe1: csrow 1, channel 0, size = 1024 Mb
    
    and the corresponding sysfs nodes are now properly filled.
    
    Signed-off-by: default avatarMauro Carvalho Chehab <mchehab@redhat.com>
    61734e18