Message ID | bf5dc139cf06ea1eb8a2d8e651c63cad09b109ed.1519761266.git.joseph.salisbury@canonical.com |
---|---|
State | New |
Headers | show |
Series | EDAC, sb_edac: Fix missing DIMM sysfs entries with KNL SNC2/SNC4 mode | expand |
On 01.03.2018 19:52, Joseph Salisbury wrote: > From: Luis Felipe Sandoval Castro <luis.felipe.sandoval.castro@intel.com> > > BugLink: http://bugs.launchpad.net/bugs/1743856 > > When figuring out the size of the DIMMs and the cluster mode is SNC2 or SNC4 the > current algorithm ignores the contribution of some of the channels resulting in > EDAC never knowing of the existence of some DIMMs attached to such channels (thus > sysfs is not populated). > > Instead of selectively iterating from 0 to interlv_ways when looking for all the > participants in the interleave, do an exhaustive search and iterate from 0 to > KNL_MAX_CHANNELS. The algorithm is already smart enough to consider participants > only one time. > > This works fine in all KNL cluster modes and even when there are missing DIMMs > as the contribution of those channels is 0. > > Signed-off-by: Luis Felipe Sandoval Castro <luis.felipe.sandoval.castro@intel.com> > Acked-by: Tony Luck <tony.luck@intel.com> > Cc: Mauro Carvalho Chehab <mchehab@kernel.org> > Cc: arozansk@redhat.com > Cc: linux-edac <linux-edac@vger.kernel.org> > Cc: qiuxu.zhuo@intel.com > Link: http://lkml.kernel.org/r/1506606882-90521-1-git-send-email-luis.felipe.sandoval.castro@intel.com > Signed-off-by: Borislav Petkov <bp@suse.de> > (cherry picked from commit 24281a2f4ca569d44e44e4cbc500cf08e7bb4c36) > Signed-off-by: Joseph Salisbury <joseph.salisbury@canonical.com> Acked-by: Stefan Bader <stefan.bader@canonical.com> > --- > drivers/edac/sb_edac.c | 19 +++---------------- > 1 file changed, 3 insertions(+), 16 deletions(-) > > diff --git a/drivers/edac/sb_edac.c b/drivers/edac/sb_edac.c > index 80d860c..b870c39 100644 > --- a/drivers/edac/sb_edac.c > +++ b/drivers/edac/sb_edac.c > @@ -1311,9 +1311,7 @@ static int knl_get_dimm_capacity(struct sbridge_pvt *pvt, u64 *mc_sizes) > int cur_reg_start; > int mc; > int channel; > - int way; > int participants[KNL_MAX_CHANNELS]; > - int participant_count = 0; > > for (i = 0; i < KNL_MAX_CHANNELS; i++) > mc_sizes[i] = 0; > @@ -1488,21 +1486,14 @@ static int knl_get_dimm_capacity(struct sbridge_pvt *pvt, u64 *mc_sizes) > * this channel mapped to the given target? > */ > for (channel = 0; channel < KNL_MAX_CHANNELS; channel++) { > - for (way = 0; way < intrlv_ways; way++) { > - int target; > - int cha; > - > - if (KNL_MOD3(dram_rule)) > - target = way; > - else > - target = 0x7 & sad_pkg( > - pvt->info.interleave_pkg, interleave_reg, way); > + int target; > + int cha; > > + for (target = 0; target < KNL_MAX_CHANNELS; target++) { > for (cha = 0; cha < KNL_MAX_CHAS; cha++) { > if (knl_get_mc_route(target, > mc_route_reg[cha]) == channel > && !participants[channel]) { > - participant_count++; > participants[channel] = 1; > break; > } > @@ -1510,10 +1501,6 @@ static int knl_get_dimm_capacity(struct sbridge_pvt *pvt, u64 *mc_sizes) > } > } > > - if (participant_count != intrlv_ways) > - edac_dbg(0, "participant_count (%d) != interleave_ways (%d): DIMM size may be incorrect\n", > - participant_count, intrlv_ways); > - > for (channel = 0; channel < KNL_MAX_CHANNELS; channel++) { > mc = knl_channel_mc(channel); > if (participants[channel]) { >
diff --git a/drivers/edac/sb_edac.c b/drivers/edac/sb_edac.c index 80d860c..b870c39 100644 --- a/drivers/edac/sb_edac.c +++ b/drivers/edac/sb_edac.c @@ -1311,9 +1311,7 @@ static int knl_get_dimm_capacity(struct sbridge_pvt *pvt, u64 *mc_sizes) int cur_reg_start; int mc; int channel; - int way; int participants[KNL_MAX_CHANNELS]; - int participant_count = 0; for (i = 0; i < KNL_MAX_CHANNELS; i++) mc_sizes[i] = 0; @@ -1488,21 +1486,14 @@ static int knl_get_dimm_capacity(struct sbridge_pvt *pvt, u64 *mc_sizes) * this channel mapped to the given target? */ for (channel = 0; channel < KNL_MAX_CHANNELS; channel++) { - for (way = 0; way < intrlv_ways; way++) { - int target; - int cha; - - if (KNL_MOD3(dram_rule)) - target = way; - else - target = 0x7 & sad_pkg( - pvt->info.interleave_pkg, interleave_reg, way); + int target; + int cha; + for (target = 0; target < KNL_MAX_CHANNELS; target++) { for (cha = 0; cha < KNL_MAX_CHAS; cha++) { if (knl_get_mc_route(target, mc_route_reg[cha]) == channel && !participants[channel]) { - participant_count++; participants[channel] = 1; break; } @@ -1510,10 +1501,6 @@ static int knl_get_dimm_capacity(struct sbridge_pvt *pvt, u64 *mc_sizes) } } - if (participant_count != intrlv_ways) - edac_dbg(0, "participant_count (%d) != interleave_ways (%d): DIMM size may be incorrect\n", - participant_count, intrlv_ways); - for (channel = 0; channel < KNL_MAX_CHANNELS; channel++) { mc = knl_channel_mc(channel); if (participants[channel]) {