diff mbox series

[v2] EDAC/synopsys: Fix the injection of the errors

Message ID 20240603114026.4927-1-shubhrajyoti.datta@amd.com (mailing list archive)
State New
Headers show
Series [v2] EDAC/synopsys: Fix the injection of the errors | expand

Commit Message

Datta, Shubhrajyoti June 3, 2024, 11:40 a.m. UTC
The Zynq UltraScale+ MPSoC DDR has a disjoint memory from 2GB to 32GB.
However the DDR host interface has a contiguous memory. So while
injecting the errors the address has to remove the hole.
Introduce get_mem_info function pointer and set it for zu+ platform
to return host interface address.

Fixes: 1a81361f75d8 ("EDAC, synopsys: Add Error Injection support for ZynqMP DDR controller")
Signed-off-by: Shubhrajyoti Datta <shubhrajyoti.datta@amd.com>
---

Changes in v2:
get_mem_info under debug flag

 drivers/edac/synopsys_edac.c | 36 +++++++++++++++++++++++++++++++++++-
 1 file changed, 35 insertions(+), 1 deletion(-)

Comments

kernel test robot June 6, 2024, 10:09 p.m. UTC | #1
Hi Shubhrajyoti,

kernel test robot noticed the following build warnings:

[auto build test WARNING on linus/master]
[also build test WARNING on v6.10-rc2 next-20240606]
[cannot apply to xilinx-xlnx/master]
[If your patch is applied to the wrong git tree, kindly drop us a note.
And when submitting patch, we suggest to use '--base' as documented in
https://git-scm.com/docs/git-format-patch#_base_tree_information]

url:    https://github.com/intel-lab-lkp/linux/commits/Shubhrajyoti-Datta/EDAC-synopsys-Fix-the-injection-of-the-errors/20240603-195015
base:   linus/master
patch link:    https://lore.kernel.org/r/20240603114026.4927-1-shubhrajyoti.datta%40amd.com
patch subject: [PATCH v2] EDAC/synopsys: Fix the injection of the errors
config: arm-randconfig-002-20240607 (https://download.01.org/0day-ci/archive/20240607/202406070554.klyVxRJT-lkp@intel.com/config)
compiler: clang version 14.0.6 (https://github.com/llvm/llvm-project f28c006a5895fc0e329fe15fead81e37457cb1d1)
reproduce (this is a W=1 build): (https://download.01.org/0day-ci/archive/20240607/202406070554.klyVxRJT-lkp@intel.com/reproduce)

If you fix the issue in a separate patch/commit (i.e. not just a new version of
the same patch/commit), kindly add following tags
| Reported-by: kernel test robot <lkp@intel.com>
| Closes: https://lore.kernel.org/oe-kbuild-all/202406070554.klyVxRJT-lkp@intel.com/

All warnings (new ones prefixed by >>):

>> drivers/edac/synopsys_edac.c:423:18: warning: result of comparison of constant 34359738368 with expression of type 'ulong' (aka 'unsigned long') is always false [-Wtautological-constant-out-of-range-compare]
           if (linear_addr >= SZ_32G)
               ~~~~~~~~~~~ ^  ~~~~~~
   1 warning generated.


vim +423 drivers/edac/synopsys_edac.c

   409	
   410	#ifdef CONFIG_EDAC_DEBUG
   411	/**
   412	 * zynqmp_get_mem_info - Get the current memory info.
   413	 * @priv:	DDR memory controller private instance data.
   414	 *
   415	 * Return: host interface address.
   416	 */
   417	static ulong zynqmp_get_mem_info(struct synps_edac_priv *priv)
   418	{
   419		ulong hif_addr = 0;
   420		ulong linear_addr;
   421	
   422		linear_addr = priv->poison_addr;
 > 423		if (linear_addr >= SZ_32G)
   424			linear_addr = linear_addr - SZ_32G + SZ_2G;
   425		hif_addr = linear_addr >> 3;
   426		return hif_addr;
   427	}
   428	#endif
   429
diff mbox series

Patch

diff --git a/drivers/edac/synopsys_edac.c b/drivers/edac/synopsys_edac.c
index ea7a9a342dd3..4dd821de295a 100644
--- a/drivers/edac/synopsys_edac.c
+++ b/drivers/edac/synopsys_edac.c
@@ -10,6 +10,7 @@ 
 #include <linux/module.h>
 #include <linux/platform_device.h>
 #include <linux/spinlock.h>
+#include <linux/sizes.h>
 #include <linux/interrupt.h>
 #include <linux/of.h>
 
@@ -337,6 +338,7 @@  struct synps_edac_priv {
  * @get_mtype:		Get mtype.
  * @get_dtype:		Get dtype.
  * @get_ecc_state:	Get ECC state.
+ * @get_mem_info:	Get EDAC memory info
  * @quirks:		To differentiate IPs.
  */
 struct synps_platform_data {
@@ -344,6 +346,9 @@  struct synps_platform_data {
 	enum mem_type (*get_mtype)(const void __iomem *base);
 	enum dev_type (*get_dtype)(const void __iomem *base);
 	bool (*get_ecc_state)(void __iomem *base);
+#ifdef CONFIG_EDAC_DEBUG
+	ulong (*get_mem_info)(struct synps_edac_priv *priv);
+#endif
 	int quirks;
 };
 
@@ -402,6 +407,26 @@  static int zynq_get_error_info(struct synps_edac_priv *priv)
 	return 0;
 }
 
+#ifdef CONFIG_EDAC_DEBUG
+/**
+ * zynqmp_get_mem_info - Get the current memory info.
+ * @priv:	DDR memory controller private instance data.
+ *
+ * Return: host interface address.
+ */
+static ulong zynqmp_get_mem_info(struct synps_edac_priv *priv)
+{
+	ulong hif_addr = 0;
+	ulong linear_addr;
+
+	linear_addr = priv->poison_addr;
+	if (linear_addr >= SZ_32G)
+		linear_addr = linear_addr - SZ_32G + SZ_2G;
+	hif_addr = linear_addr >> 3;
+	return hif_addr;
+}
+#endif
+
 /**
  * zynqmp_get_error_info - Get the current ECC error info.
  * @priv:	DDR memory controller private instance data.
@@ -922,6 +947,9 @@  static const struct synps_platform_data zynqmp_edac_def = {
 	.get_mtype	= zynqmp_get_mtype,
 	.get_dtype	= zynqmp_get_dtype,
 	.get_ecc_state	= zynqmp_get_ecc_state,
+#ifdef CONFIG_EDAC_DEBUG
+	.get_mem_info	= zynqmp_get_mem_info,
+#endif
 	.quirks         = (DDR_ECC_INTR_SUPPORT
 #ifdef CONFIG_EDAC_DEBUG
 			  | DDR_ECC_DATA_POISON_SUPPORT
@@ -975,10 +1003,16 @@  MODULE_DEVICE_TABLE(of, synps_edac_match);
 static void ddr_poison_setup(struct synps_edac_priv *priv)
 {
 	int col = 0, row = 0, bank = 0, bankgrp = 0, rank = 0, regval;
+	const struct synps_platform_data *p_data;
 	int index;
 	ulong hif_addr = 0;
 
-	hif_addr = priv->poison_addr >> 3;
+	p_data = priv->p_data;
+
+	if (p_data->get_mem_info)
+		hif_addr = p_data->get_mem_info(priv);
+	else
+		hif_addr = priv->poison_addr >> 3;
 
 	for (index = 0; index < DDR_MAX_ROW_SHIFT; index++) {
 		if (priv->row_shift[index])