sb_edac: Fix support for systems with two home agents per socket
authorTony Luck <tony.luck@intel.com>
Mon, 18 May 2015 20:50:42 +0000 (17:50 -0300)
committerMauro Carvalho Chehab <mchehab@osg.samsung.com>
Wed, 3 Jun 2015 13:10:52 +0000 (10:10 -0300)
commit7d375bffa52477c1be7db5a5dda99996582512c3
tree88aed4aa63c55485d365144df334f462299e3ce6
parentbb89e7141a4e5690a046d3bdfa57b8521aab64b0
sb_edac: Fix support for systems with two home agents per socket

First noticed a problem on a 4 socket machine where EDAC only reported
half the DIMMS.  Tracked this down to the code that assumes that systems
with two home agents only have two memory channels on each agent. This
is true on 2 sockect ("-EP") machines. But four socket ("-EX") machines
have four memory channels on each home agent.

The old code would have had problems on two socket systems as it did
a shuffling trick to make the internals of the code think that the
channels from the first agent were '0' and '1', with the second agent
providing '2' and '3'. But the code didn't uniformly convert from
{ha,channel} tuples to this internal representation.

New code always considers up to eight channels.
On a machine with a single home agent these map easily to edac channels
0, 1, 2, 3. On machines with two home agents we map using:
  edac_channel = 4*ha# + channel
So on a -EP machine where each home agent supports only two channels
we'll fill in channels 0, 1, 4, 5, and on a -EX machine we use all of 0,
1, 2, 3, 4, 5, 6, 7.

[mchehab@osg.samsung.com: fold a fixup patch as per Tony's request and fixed
 a few CodingStyle issues]
Signed-off-by: Tony Luck <tony.luck@intel.com>
Acked-by: Aristeu Rozanski <aris@redhat.com>
Signed-off-by: Mauro Carvalho Chehab <mchehab@osg.samsung.com>
drivers/edac/sb_edac.c