diff mbox series

[SRU,Artful,1/1] EDAC, sb_edac: Fix missing DIMM sysfs entries with KNL SNC2/SNC4 mode

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

Commit Message

Joseph Salisbury March 1, 2018, 6:51 p.m. UTC
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>
---
 drivers/edac/sb_edac.c | 19 +++----------------
 1 file changed, 3 insertions(+), 16 deletions(-)

Comments

Stefan Bader March 2, 2018, 12:58 p.m. UTC | #1
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 mbox series

Patch

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]) {