All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH v2 1/2] memory: tegra30-emc: Print additional memory info
@ 2021-12-22  4:32 Dmitry Osipenko
  2021-12-22  4:32 ` [PATCH v2 2/2] memory: tegra20-emc: Correct memory device mask Dmitry Osipenko
  2021-12-22 12:00 ` [PATCH v2 1/2] memory: tegra30-emc: Print additional memory info Krzysztof Kozlowski
  0 siblings, 2 replies; 4+ messages in thread
From: Dmitry Osipenko @ 2021-12-22  4:32 UTC (permalink / raw)
  To: Thierry Reding, Jonathan Hunter, Krzysztof Kozlowski, Svyatoslav Ryhel
  Cc: linux-kernel, linux-tegra

Print out memory type and LPDDR2 configuration on Tegra30, making it
similar to the memory info printed by the Tegra20 memory driver. This
info is useful for debugging purposes.

Tested-by: Svyatoslav Ryhel <clamor95@gmail.com> # T30 ASUS TF201 LPDDR2
Signed-off-by: Dmitry Osipenko <digetx@gmail.com>
---

Changelog:

v2: - Corrected swapped chip-select mask in emc_read_lpddr_mode_register().

 drivers/memory/tegra/Kconfig       |   1 +
 drivers/memory/tegra/tegra30-emc.c | 131 ++++++++++++++++++++++++++---
 2 files changed, 122 insertions(+), 10 deletions(-)

diff --git a/drivers/memory/tegra/Kconfig b/drivers/memory/tegra/Kconfig
index 7951764b4efe..3fe83d7c2bf8 100644
--- a/drivers/memory/tegra/Kconfig
+++ b/drivers/memory/tegra/Kconfig
@@ -28,6 +28,7 @@ config TEGRA30_EMC
 	default y
 	depends on ARCH_TEGRA_3x_SOC || COMPILE_TEST
 	select PM_OPP
+	select DDR
 	help
 	  This driver is for the External Memory Controller (EMC) found on
 	  Tegra30 chips. The EMC controls the external DRAM on the board.
diff --git a/drivers/memory/tegra/tegra30-emc.c b/drivers/memory/tegra/tegra30-emc.c
index 80f98d717e13..9ba2a9e5316b 100644
--- a/drivers/memory/tegra/tegra30-emc.c
+++ b/drivers/memory/tegra/tegra30-emc.c
@@ -9,6 +9,7 @@
  * Copyright (C) 2019 GRATE-DRIVER project
  */
 
+#include <linux/bitfield.h>
 #include <linux/clk.h>
 #include <linux/clk/tegra.h>
 #include <linux/debugfs.h>
@@ -31,11 +32,15 @@
 #include <soc/tegra/common.h>
 #include <soc/tegra/fuse.h>
 
+#include "../jedec_ddr.h"
+#include "../of_memory.h"
+
 #include "mc.h"
 
 #define EMC_INTSTATUS				0x000
 #define EMC_INTMASK				0x004
 #define EMC_DBG					0x008
+#define EMC_ADR_CFG				0x010
 #define EMC_CFG					0x00c
 #define EMC_REFCTRL				0x020
 #define EMC_TIMING_CONTROL			0x028
@@ -81,6 +86,7 @@
 #define EMC_EMRS				0x0d0
 #define EMC_SELF_REF				0x0e0
 #define EMC_MRW					0x0e8
+#define EMC_MRR					0x0ec
 #define EMC_XM2DQSPADCTRL3			0x0f8
 #define EMC_FBIO_SPARE				0x100
 #define EMC_FBIO_CFG5				0x104
@@ -208,6 +214,13 @@
 
 #define EMC_REFRESH_OVERFLOW_INT		BIT(3)
 #define EMC_CLKCHANGE_COMPLETE_INT		BIT(4)
+#define EMC_MRR_DIVLD_INT			BIT(5)
+
+#define EMC_MRR_DEV_SELECTN			GENMASK(31, 30)
+#define EMC_MRR_MRR_MA				GENMASK(23, 16)
+#define EMC_MRR_MRR_DATA			GENMASK(15, 0)
+
+#define EMC_ADR_CFG_EMEM_NUMDEV			BIT(0)
 
 enum emc_dram_type {
 	DRAM_TYPE_DDR3,
@@ -378,6 +391,8 @@ struct tegra_emc {
 
 	/* protect shared rate-change code path */
 	struct mutex rate_lock;
+
+	bool mrr_error;
 };
 
 static int emc_seq_update_timing(struct tegra_emc *emc)
@@ -1008,12 +1023,18 @@ static int emc_load_timings_from_dt(struct tegra_emc *emc,
 	return 0;
 }
 
-static struct device_node *emc_find_node_by_ram_code(struct device *dev)
+static struct device_node *emc_find_node_by_ram_code(struct tegra_emc *emc)
 {
+	struct device *dev = emc->dev;
 	struct device_node *np;
 	u32 value, ram_code;
 	int err;
 
+	if (emc->mrr_error) {
+		dev_warn(dev, "memory timings skipped due to MRR error\n");
+		return NULL;
+	}
+
 	if (of_get_child_count(dev->of_node) == 0) {
 		dev_info_once(dev, "device-tree doesn't have memory timings\n");
 		return NULL;
@@ -1035,11 +1056,73 @@ static struct device_node *emc_find_node_by_ram_code(struct device *dev)
 	return NULL;
 }
 
+static int emc_read_lpddr_mode_register(struct tegra_emc *emc,
+					unsigned int emem_dev,
+					unsigned int register_addr,
+					unsigned int *register_data)
+{
+	u32 memory_dev = emem_dev ? 1 : 2;
+	u32 val, mr_mask = 0xff;
+	int err;
+
+	/* clear data-valid interrupt status */
+	writel_relaxed(EMC_MRR_DIVLD_INT, emc->regs + EMC_INTSTATUS);
+
+	/* issue mode register read request */
+	val  = FIELD_PREP(EMC_MRR_DEV_SELECTN, memory_dev);
+	val |= FIELD_PREP(EMC_MRR_MRR_MA, register_addr);
+
+	writel_relaxed(val, emc->regs + EMC_MRR);
+
+	/* wait for the LPDDR2 data-valid interrupt */
+	err = readl_relaxed_poll_timeout_atomic(emc->regs + EMC_INTSTATUS, val,
+						val & EMC_MRR_DIVLD_INT,
+						1, 100);
+	if (err) {
+		dev_err(emc->dev, "mode register %u read failed: %d\n",
+			register_addr, err);
+		emc->mrr_error = true;
+		return err;
+	}
+
+	/* read out mode register data */
+	val = readl_relaxed(emc->regs + EMC_MRR);
+	*register_data = FIELD_GET(EMC_MRR_MRR_DATA, val) & mr_mask;
+
+	return 0;
+}
+
+static void emc_read_lpddr_sdram_info(struct tegra_emc *emc,
+				      unsigned int emem_dev)
+{
+	union lpddr2_basic_config4 basic_conf4;
+	unsigned int manufacturer_id;
+	unsigned int revision_id1;
+	unsigned int revision_id2;
+
+	/* these registers are standard for all LPDDR JEDEC memory chips */
+	emc_read_lpddr_mode_register(emc, emem_dev, 5, &manufacturer_id);
+	emc_read_lpddr_mode_register(emc, emem_dev, 6, &revision_id1);
+	emc_read_lpddr_mode_register(emc, emem_dev, 7, &revision_id2);
+	emc_read_lpddr_mode_register(emc, emem_dev, 8, &basic_conf4.value);
+
+	dev_info(emc->dev, "SDRAM[dev%u]: manufacturer: 0x%x (%s) rev1: 0x%x rev2: 0x%x prefetch: S%u density: %uMbit iowidth: %ubit\n",
+		 emem_dev, manufacturer_id,
+		 lpddr2_jedec_manufacturer(manufacturer_id),
+		 revision_id1, revision_id2,
+		 4 >> basic_conf4.arch_type,
+		 64 << basic_conf4.density,
+		 32 >> basic_conf4.io_width);
+}
+
 static int emc_setup_hw(struct tegra_emc *emc)
 {
+	u32 fbio_cfg5, emc_cfg, emc_dbg, emc_adr_cfg;
 	u32 intmask = EMC_REFRESH_OVERFLOW_INT;
-	u32 fbio_cfg5, emc_cfg, emc_dbg;
+	static bool print_sdram_info_once;
 	enum emc_dram_type dram_type;
+	const char *dram_type_str;
+	unsigned int emem_numdev;
 
 	fbio_cfg5 = readl_relaxed(emc->regs + EMC_FBIO_CFG5);
 	dram_type = fbio_cfg5 & EMC_FBIO_CFG5_DRAM_TYPE_MASK;
@@ -1076,6 +1159,34 @@ static int emc_setup_hw(struct tegra_emc *emc)
 	emc_dbg &= ~EMC_DBG_FORCE_UPDATE;
 	writel_relaxed(emc_dbg, emc->regs + EMC_DBG);
 
+	switch (dram_type) {
+	case DRAM_TYPE_DDR1:
+		dram_type_str = "DDR1";
+		break;
+	case DRAM_TYPE_LPDDR2:
+		dram_type_str = "LPDDR2";
+		break;
+	case DRAM_TYPE_DDR2:
+		dram_type_str = "DDR2";
+		break;
+	case DRAM_TYPE_DDR3:
+		dram_type_str = "DDR3";
+		break;
+	}
+
+	emc_adr_cfg = readl_relaxed(emc->regs + EMC_ADR_CFG);
+	emem_numdev = FIELD_GET(EMC_ADR_CFG_EMEM_NUMDEV, emc_adr_cfg) + 1;
+
+	dev_info_once(emc->dev, "%u %s %s attached\n", emem_numdev,
+		      dram_type_str, emem_numdev == 2 ? "devices" : "device");
+
+	if (dram_type == DRAM_TYPE_LPDDR2 && !print_sdram_info_once) {
+		while (emem_numdev--)
+			emc_read_lpddr_sdram_info(emc, emem_numdev);
+
+		print_sdram_info_once = true;
+	}
+
 	return 0;
 }
 
@@ -1538,14 +1649,6 @@ static int tegra_emc_probe(struct platform_device *pdev)
 	emc->clk_nb.notifier_call = emc_clk_change_notify;
 	emc->dev = &pdev->dev;
 
-	np = emc_find_node_by_ram_code(&pdev->dev);
-	if (np) {
-		err = emc_load_timings_from_dt(emc, np);
-		of_node_put(np);
-		if (err)
-			return err;
-	}
-
 	emc->regs = devm_platform_ioremap_resource(pdev, 0);
 	if (IS_ERR(emc->regs))
 		return PTR_ERR(emc->regs);
@@ -1554,6 +1657,14 @@ static int tegra_emc_probe(struct platform_device *pdev)
 	if (err)
 		return err;
 
+	np = emc_find_node_by_ram_code(emc);
+	if (np) {
+		err = emc_load_timings_from_dt(emc, np);
+		of_node_put(np);
+		if (err)
+			return err;
+	}
+
 	err = platform_get_irq(pdev, 0);
 	if (err < 0)
 		return err;
-- 
2.33.1


^ permalink raw reply related	[flat|nested] 4+ messages in thread

* [PATCH v2 2/2] memory: tegra20-emc: Correct memory device mask
  2021-12-22  4:32 [PATCH v2 1/2] memory: tegra30-emc: Print additional memory info Dmitry Osipenko
@ 2021-12-22  4:32 ` Dmitry Osipenko
  2021-12-22 12:00 ` [PATCH v2 1/2] memory: tegra30-emc: Print additional memory info Krzysztof Kozlowski
  1 sibling, 0 replies; 4+ messages in thread
From: Dmitry Osipenko @ 2021-12-22  4:32 UTC (permalink / raw)
  To: Thierry Reding, Jonathan Hunter, Krzysztof Kozlowski, Svyatoslav Ryhel
  Cc: linux-kernel, linux-tegra

Memory chip select is swapped when we read mode register, correct it.
We didn't have devices that use a single LPDDR chip and both chips are
always identical, hence this change is just a minor improvement.

Signed-off-by: Dmitry Osipenko <digetx@gmail.com>
---

Changelog:

v2: - New patch in v2.

 drivers/memory/tegra/tegra20-emc.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/drivers/memory/tegra/tegra20-emc.c b/drivers/memory/tegra/tegra20-emc.c
index 497b6edbf3ca..25ba3c5e4ad6 100644
--- a/drivers/memory/tegra/tegra20-emc.c
+++ b/drivers/memory/tegra/tegra20-emc.c
@@ -540,7 +540,7 @@ static int emc_read_lpddr_mode_register(struct tegra_emc *emc,
 					unsigned int register_addr,
 					unsigned int *register_data)
 {
-	u32 memory_dev = emem_dev + 1;
+	u32 memory_dev = emem_dev ? 1 : 2;
 	u32 val, mr_mask = 0xff;
 	int err;
 
-- 
2.33.1


^ permalink raw reply related	[flat|nested] 4+ messages in thread

* Re: [PATCH v2 1/2] memory: tegra30-emc: Print additional memory info
  2021-12-22  4:32 [PATCH v2 1/2] memory: tegra30-emc: Print additional memory info Dmitry Osipenko
  2021-12-22  4:32 ` [PATCH v2 2/2] memory: tegra20-emc: Correct memory device mask Dmitry Osipenko
@ 2021-12-22 12:00 ` Krzysztof Kozlowski
  1 sibling, 0 replies; 4+ messages in thread
From: Krzysztof Kozlowski @ 2021-12-22 12:00 UTC (permalink / raw)
  To: Thierry Reding, Svyatoslav Ryhel, Dmitry Osipenko, Jonathan Hunter
  Cc: Krzysztof Kozlowski, linux-kernel, linux-tegra

On Wed, 22 Dec 2021 07:32:14 +0300, Dmitry Osipenko wrote:
> Print out memory type and LPDDR2 configuration on Tegra30, making it
> similar to the memory info printed by the Tegra20 memory driver. This
> info is useful for debugging purposes.
> 
> 

Applied, thanks!

[1/2] memory: tegra30-emc: Print additional memory info
      commit: 23a0ea001466a9d063f65254110ac7f07f5c3937
[2/2] memory: tegra20-emc: Correct memory device mask
      commit: e2f01d07fad2c3fd3875a2d7dd62e1903fdf874c

Best regards,
-- 
Krzysztof Kozlowski <krzysztof.kozlowski@canonical.com>

^ permalink raw reply	[flat|nested] 4+ messages in thread

* Re: [PATCH v2 1/2] memory: tegra30-emc: Print additional memory info
@ 2021-12-29 17:28 kernel test robot
  0 siblings, 0 replies; 4+ messages in thread
From: kernel test robot @ 2021-12-29 17:28 UTC (permalink / raw)
  To: kbuild

[-- Attachment #1: Type: text/plain, Size: 21996 bytes --]

CC: llvm(a)lists.linux.dev
CC: kbuild-all(a)lists.01.org
In-Reply-To: <20211222043215.28237-1-digetx@gmail.com>
References: <20211222043215.28237-1-digetx@gmail.com>
TO: Dmitry Osipenko <digetx@gmail.com>

Hi Dmitry,

I love your patch! Perhaps something to improve:

[auto build test WARNING on tegra/for-next]
[also build test WARNING on v5.16-rc7]
[cannot apply to next-20211224]
[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]

url:    https://github.com/0day-ci/linux/commits/Dmitry-Osipenko/memory-tegra30-emc-Print-additional-memory-info/20211222-123518
base:   https://git.kernel.org/pub/scm/linux/kernel/git/tegra/linux.git for-next
:::::: branch date: 8 days ago
:::::: commit date: 8 days ago
config: arm-randconfig-c002-20211226 (https://download.01.org/0day-ci/archive/20211230/202112300102.VBqWE1HN-lkp(a)intel.com/config)
compiler: clang version 14.0.0 (https://github.com/llvm/llvm-project 0c553cc1af2e4c14100df6cf4a6fc91987e778e6)
reproduce (this is a W=1 build):
        wget https://raw.githubusercontent.com/intel/lkp-tests/master/sbin/make.cross -O ~/bin/make.cross
        chmod +x ~/bin/make.cross
        # install arm cross compiling tool for clang build
        # apt-get install binutils-arm-linux-gnueabi
        # https://github.com/0day-ci/linux/commit/8290e021c14675d913f01981125996647bb3fee3
        git remote add linux-review https://github.com/0day-ci/linux
        git fetch --no-tags linux-review Dmitry-Osipenko/memory-tegra30-emc-Print-additional-memory-info/20211222-123518
        git checkout 8290e021c14675d913f01981125996647bb3fee3
        # save the config file to linux build tree
        COMPILER_INSTALL_PATH=$HOME/0day COMPILER=clang make.cross ARCH=arm clang-analyzer 

If you fix the issue, kindly add following tag as appropriate
Reported-by: kernel test robot <lkp@intel.com>


clang-analyzer warnings: (new ones prefixed by >>)
   2 warnings generated.
   Suppressed 2 warnings (2 in non-user code).
   Use -header-filter=.* to display errors from all non-system headers. Use -system-headers to display errors from system headers as well.
   3 warnings generated.
   Suppressed 3 warnings (3 in non-user code).
   Use -header-filter=.* to display errors from all non-system headers. Use -system-headers to display errors from system headers as well.
   2 warnings generated.
   Suppressed 2 warnings (2 in non-user code).
   Use -header-filter=.* to display errors from all non-system headers. Use -system-headers to display errors from system headers as well.
   3 warnings generated.
   Suppressed 3 warnings (3 in non-user code).
   Use -header-filter=.* to display errors from all non-system headers. Use -system-headers to display errors from system headers as well.
   6 warnings generated.
   drivers/media/dvb-frontends/stv0367.c:1103:2: warning: Value stored to 'temp' is never read [clang-analyzer-deadcode.DeadStores]
           temp = stv0367_readbits(state, F367TER_TRL_NOMRATE_HI) * 512 +
           ^      ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
   drivers/media/dvb-frontends/stv0367.c:1103:2: note: Value stored to 'temp' is never read
           temp = stv0367_readbits(state, F367TER_TRL_NOMRATE_HI) * 512 +
           ^      ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
   drivers/media/dvb-frontends/stv0367.c:1109:2: warning: Value stored to 'temp' is never read [clang-analyzer-deadcode.DeadStores]
           temp = stv0367_readbits(state, F367TER_GAIN_SRC_HI) * 256 +
           ^      ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
   drivers/media/dvb-frontends/stv0367.c:1109:2: note: Value stored to 'temp' is never read
           temp = stv0367_readbits(state, F367TER_GAIN_SRC_HI) * 256 +
           ^      ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
   drivers/media/dvb-frontends/stv0367.c:1530:3: warning: Value stored to 'tber' is never read [clang-analyzer-deadcode.DeadStores]
                   tber = ter_state->pBER;
                   ^      ~~~~~~~~~~~~~~~
   drivers/media/dvb-frontends/stv0367.c:1530:3: note: Value stored to 'tber' is never read
                   tber = ter_state->pBER;
                   ^      ~~~~~~~~~~~~~~~
   Suppressed 3 warnings (3 in non-user code).
   Use -header-filter=.* to display errors from all non-system headers. Use -system-headers to display errors from system headers as well.
   6 warnings generated.
   drivers/media/dvb-frontends/cxd2841er.c:3600:25: warning: Value stored to 'priv' during its initialization is never read [clang-analyzer-deadcode.DeadStores]
           struct cxd2841er_priv *priv = fe->demodulator_priv;
                                  ^~~~   ~~~~~~~~~~~~~~~~~~~~
   drivers/media/dvb-frontends/cxd2841er.c:3600:25: note: Value stored to 'priv' during its initialization is never read
           struct cxd2841er_priv *priv = fe->demodulator_priv;
                                  ^~~~   ~~~~~~~~~~~~~~~~~~~~
   drivers/media/dvb-frontends/cxd2841er.c:3759:25: warning: Value stored to 'priv' during its initialization is never read [clang-analyzer-deadcode.DeadStores]
           struct cxd2841er_priv *priv = fe->demodulator_priv;
                                  ^~~~   ~~~~~~~~~~~~~~~~~~~~
   drivers/media/dvb-frontends/cxd2841er.c:3759:25: note: Value stored to 'priv' during its initialization is never read
           struct cxd2841er_priv *priv = fe->demodulator_priv;
                                  ^~~~   ~~~~~~~~~~~~~~~~~~~~
   drivers/media/dvb-frontends/cxd2841er.c:3812:34: warning: Value stored to 'p' during its initialization is never read [clang-analyzer-deadcode.DeadStores]
           struct dtv_frontend_properties *p = &fe->dtv_property_cache;
                                           ^   ~~~~~~~~~~~~~~~~~~~~~~~
   drivers/media/dvb-frontends/cxd2841er.c:3812:34: note: Value stored to 'p' during its initialization is never read
           struct dtv_frontend_properties *p = &fe->dtv_property_cache;
                                           ^   ~~~~~~~~~~~~~~~~~~~~~~~
   Suppressed 3 warnings (3 in non-user code).
   Use -header-filter=.* to display errors from all non-system headers. Use -system-headers to display errors from system headers as well.
   5 warnings generated.
   drivers/media/test-drivers/vidtv/vidtv_bridge.c:123:6: warning: Value stored to 'mux_buf_sz' during its initialization is never read [clang-analyzer-deadcode.DeadStores]
           u32 mux_buf_sz = mux_buf_sz_pkts * TS_PACKET_LEN;
               ^~~~~~~~~~   ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
   drivers/media/test-drivers/vidtv/vidtv_bridge.c:123:6: note: Value stored to 'mux_buf_sz' during its initialization is never read
           u32 mux_buf_sz = mux_buf_sz_pkts * TS_PACKET_LEN;
               ^~~~~~~~~~   ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
   drivers/media/test-drivers/vidtv/vidtv_bridge.c:206:17: warning: Value stored to 'dev' during its initialization is never read [clang-analyzer-deadcode.DeadStores]
           struct device *dev = &dvb->pdev->dev;
                          ^~~   ~~~~~~~~~~~~~~~
   drivers/media/test-drivers/vidtv/vidtv_bridge.c:206:17: note: Value stored to 'dev' during its initialization is never read
           struct device *dev = &dvb->pdev->dev;
                          ^~~   ~~~~~~~~~~~~~~~
   Suppressed 3 warnings (3 in non-user code).
   Use -header-filter=.* to display errors from all non-system headers. Use -system-headers to display errors from system headers as well.
   2 warnings generated.
   Suppressed 2 warnings (2 in non-user code).
   Use -header-filter=.* to display errors from all non-system headers. Use -system-headers to display errors from system headers as well.
   2 warnings generated.
   Suppressed 2 warnings (2 in non-user code).
   Use -header-filter=.* to display errors from all non-system headers. Use -system-headers to display errors from system headers as well.
   2 warnings generated.
   Suppressed 2 warnings (2 in non-user code).
   Use -header-filter=.* to display errors from all non-system headers. Use -system-headers to display errors from system headers as well.
   2 warnings generated.
   Suppressed 2 warnings (2 in non-user code).
   Use -header-filter=.* to display errors from all non-system headers. Use -system-headers to display errors from system headers as well.
   3 warnings generated.
   drivers/media/test-drivers/vidtv/vidtv_s302m.c:383:3: warning: Value stored to 'nbytes_per_unit' is never read [clang-analyzer-deadcode.DeadStores]
                   nbytes_per_unit = 0;
                   ^                 ~
   drivers/media/test-drivers/vidtv/vidtv_s302m.c:383:3: note: Value stored to 'nbytes_per_unit' is never read
                   nbytes_per_unit = 0;
                   ^                 ~
   Suppressed 2 warnings (2 in non-user code).
   Use -header-filter=.* to display errors from all non-system headers. Use -system-headers to display errors from system headers as well.
   3 warnings generated.
   Suppressed 3 warnings (3 in non-user code).
   Use -header-filter=.* to display errors from all non-system headers. Use -system-headers to display errors from system headers as well.
   3 warnings generated.
   Suppressed 3 warnings (3 in non-user code).
   Use -header-filter=.* to display errors from all non-system headers. Use -system-headers to display errors from system headers as well.
   3 warnings generated.
   Suppressed 3 warnings (3 in non-user code).
   Use -header-filter=.* to display errors from all non-system headers. Use -system-headers to display errors from system headers as well.
   6 warnings generated.
>> drivers/memory/tegra/tegra30-emc.c:1164:3: warning: Value stored to 'dram_type_str' is never read [clang-analyzer-deadcode.DeadStores]
                   dram_type_str = "DDR1";
                   ^               ~~~~~~
   drivers/memory/tegra/tegra30-emc.c:1164:3: note: Value stored to 'dram_type_str' is never read
                   dram_type_str = "DDR1";
                   ^               ~~~~~~
   drivers/memory/tegra/tegra30-emc.c:1167:3: warning: Value stored to 'dram_type_str' is never read [clang-analyzer-deadcode.DeadStores]
                   dram_type_str = "LPDDR2";
                   ^               ~~~~~~~~
   drivers/memory/tegra/tegra30-emc.c:1167:3: note: Value stored to 'dram_type_str' is never read
                   dram_type_str = "LPDDR2";
                   ^               ~~~~~~~~
   drivers/memory/tegra/tegra30-emc.c:1170:3: warning: Value stored to 'dram_type_str' is never read [clang-analyzer-deadcode.DeadStores]
                   dram_type_str = "DDR2";
                   ^               ~~~~~~
   drivers/memory/tegra/tegra30-emc.c:1170:3: note: Value stored to 'dram_type_str' is never read
                   dram_type_str = "DDR2";
                   ^               ~~~~~~
   drivers/memory/tegra/tegra30-emc.c:1173:3: warning: Value stored to 'dram_type_str' is never read [clang-analyzer-deadcode.DeadStores]
                   dram_type_str = "DDR3";
                   ^               ~~~~~~
   drivers/memory/tegra/tegra30-emc.c:1173:3: note: Value stored to 'dram_type_str' is never read
                   dram_type_str = "DDR3";
                   ^               ~~~~~~
   Suppressed 2 warnings (2 in non-user code).
   Use -header-filter=.* to display errors from all non-system headers. Use -system-headers to display errors from system headers as well.
   2 warnings generated.
   Suppressed 2 warnings (2 in non-user code).
   Use -header-filter=.* to display errors from all non-system headers. Use -system-headers to display errors from system headers as well.
   7 warnings generated.
   drivers/vme/vme.c:297:16: warning: Access to field 'next' results in a dereference of a null pointer (loaded from variable 'slave_pos') [clang-analyzer-core.NullDereference]
           list_for_each(slave_pos, &bridge->slave_resources) {
                         ^
   include/linux/list.h:573:48: note: expanded from macro 'list_for_each'
           for (pos = (head)->next; pos != (head); pos = pos->next)
                                                         ^~~
   drivers/vme/vme.c:291:6: note: Assuming 'bridge' is non-null
           if (!bridge) {
               ^~~~~~~
   drivers/vme/vme.c:291:2: note: Taking false branch
           if (!bridge) {
           ^
   drivers/vme/vme.c:297:16: note: Value assigned to 'slave_pos'
           list_for_each(slave_pos, &bridge->slave_resources) {
                         ^
   include/linux/list.h:573:7: note: expanded from macro 'list_for_each'
           for (pos = (head)->next; pos != (head); pos = pos->next)
                ^~~~~~~~~~~~~~~~~~
   drivers/vme/vme.c:297:2: note: Loop condition is true.  Entering loop body
           list_for_each(slave_pos, &bridge->slave_resources) {
           ^
   include/linux/list.h:573:2: note: expanded from macro 'list_for_each'
           for (pos = (head)->next; pos != (head); pos = pos->next)
           ^
   drivers/vme/vme.c:301:7: note: Assuming 'slave_image' is null
                   if (!slave_image) {
                       ^~~~~~~~~~~~
   drivers/vme/vme.c:301:3: note: Taking true branch
                   if (!slave_image) {
                   ^
   drivers/vme/vme.c:302:4: note: Loop condition is false.  Exiting loop
                           printk(KERN_ERR "Registered NULL Slave resource\n");
                           ^
   include/linux/printk.h:446:26: note: expanded from macro 'printk'
   #define printk(fmt, ...) printk_index_wrap(_printk, fmt, ##__VA_ARGS__)
                            ^
   include/linux/printk.h:417:3: note: expanded from macro 'printk_index_wrap'
                   __printk_index_emit(_fmt, NULL, NULL);                  \
                   ^
   include/linux/printk.h:392:34: note: expanded from macro '__printk_index_emit'
   #define __printk_index_emit(...) do {} while (0)
                                    ^
   drivers/vme/vme.c:303:4: note:  Execution continues on line 297
                           continue;
                           ^
   drivers/vme/vme.c:297:16: note: Access to field 'next' results in a dereference of a null pointer (loaded from variable 'slave_pos')
           list_for_each(slave_pos, &bridge->slave_resources) {
                         ^
   include/linux/list.h:573:48: note: expanded from macro 'list_for_each'
           for (pos = (head)->next; pos != (head); pos = pos->next)
                                                         ^~~
   drivers/vme/vme.c:498:16: warning: Access to field 'next' results in a dereference of a null pointer (loaded from variable 'master_pos') [clang-analyzer-core.NullDereference]
           list_for_each(master_pos, &bridge->master_resources) {
                         ^
   include/linux/list.h:573:48: note: expanded from macro 'list_for_each'
           for (pos = (head)->next; pos != (head); pos = pos->next)
                                                         ^~~
   drivers/vme/vme.c:492:6: note: Assuming 'bridge' is non-null
           if (!bridge) {
               ^~~~~~~
   drivers/vme/vme.c:492:2: note: Taking false branch
           if (!bridge) {
           ^
   drivers/vme/vme.c:498:16: note: Value assigned to 'master_pos'
           list_for_each(master_pos, &bridge->master_resources) {
                         ^
   include/linux/list.h:573:7: note: expanded from macro 'list_for_each'
           for (pos = (head)->next; pos != (head); pos = pos->next)
                ^~~~~~~~~~~~~~~~~~
   drivers/vme/vme.c:498:2: note: Loop condition is true.  Entering loop body
           list_for_each(master_pos, &bridge->master_resources) {

vim +/dram_type_str +1164 drivers/memory/tegra/tegra30-emc.c

8290e021c14675 Dmitry Osipenko 2021-12-22  1117  
e34212c75a6899 Dmitry Osipenko 2019-08-12  1118  static int emc_setup_hw(struct tegra_emc *emc)
e34212c75a6899 Dmitry Osipenko 2019-08-12  1119  {
8290e021c14675 Dmitry Osipenko 2021-12-22  1120  	u32 fbio_cfg5, emc_cfg, emc_dbg, emc_adr_cfg;
930c68180ffb05 Dmitry Osipenko 2020-03-19  1121  	u32 intmask = EMC_REFRESH_OVERFLOW_INT;
8290e021c14675 Dmitry Osipenko 2021-12-22  1122  	static bool print_sdram_info_once;
e34212c75a6899 Dmitry Osipenko 2019-08-12  1123  	enum emc_dram_type dram_type;
8290e021c14675 Dmitry Osipenko 2021-12-22  1124  	const char *dram_type_str;
8290e021c14675 Dmitry Osipenko 2021-12-22  1125  	unsigned int emem_numdev;
e34212c75a6899 Dmitry Osipenko 2019-08-12  1126  
e34212c75a6899 Dmitry Osipenko 2019-08-12  1127  	fbio_cfg5 = readl_relaxed(emc->regs + EMC_FBIO_CFG5);
e34212c75a6899 Dmitry Osipenko 2019-08-12  1128  	dram_type = fbio_cfg5 & EMC_FBIO_CFG5_DRAM_TYPE_MASK;
e34212c75a6899 Dmitry Osipenko 2019-08-12  1129  
e34212c75a6899 Dmitry Osipenko 2019-08-12  1130  	emc_cfg = readl_relaxed(emc->regs + EMC_CFG_2);
e34212c75a6899 Dmitry Osipenko 2019-08-12  1131  
e34212c75a6899 Dmitry Osipenko 2019-08-12  1132  	/* enable EMC and CAR to handshake on PLL divider/source changes */
e34212c75a6899 Dmitry Osipenko 2019-08-12  1133  	emc_cfg |= EMC_CLKCHANGE_REQ_ENABLE;
e34212c75a6899 Dmitry Osipenko 2019-08-12  1134  
e34212c75a6899 Dmitry Osipenko 2019-08-12  1135  	/* configure clock change mode accordingly to DRAM type */
e34212c75a6899 Dmitry Osipenko 2019-08-12  1136  	switch (dram_type) {
e34212c75a6899 Dmitry Osipenko 2019-08-12  1137  	case DRAM_TYPE_LPDDR2:
e34212c75a6899 Dmitry Osipenko 2019-08-12  1138  		emc_cfg |= EMC_CLKCHANGE_PD_ENABLE;
e34212c75a6899 Dmitry Osipenko 2019-08-12  1139  		emc_cfg &= ~EMC_CLKCHANGE_SR_ENABLE;
e34212c75a6899 Dmitry Osipenko 2019-08-12  1140  		break;
e34212c75a6899 Dmitry Osipenko 2019-08-12  1141  
e34212c75a6899 Dmitry Osipenko 2019-08-12  1142  	default:
e34212c75a6899 Dmitry Osipenko 2019-08-12  1143  		emc_cfg &= ~EMC_CLKCHANGE_SR_ENABLE;
e34212c75a6899 Dmitry Osipenko 2019-08-12  1144  		emc_cfg &= ~EMC_CLKCHANGE_PD_ENABLE;
e34212c75a6899 Dmitry Osipenko 2019-08-12  1145  		break;
e34212c75a6899 Dmitry Osipenko 2019-08-12  1146  	}
e34212c75a6899 Dmitry Osipenko 2019-08-12  1147  
e34212c75a6899 Dmitry Osipenko 2019-08-12  1148  	writel_relaxed(emc_cfg, emc->regs + EMC_CFG_2);
e34212c75a6899 Dmitry Osipenko 2019-08-12  1149  
e34212c75a6899 Dmitry Osipenko 2019-08-12  1150  	/* initialize interrupt */
e34212c75a6899 Dmitry Osipenko 2019-08-12  1151  	writel_relaxed(intmask, emc->regs + EMC_INTMASK);
e34212c75a6899 Dmitry Osipenko 2019-08-12  1152  	writel_relaxed(0xffffffff, emc->regs + EMC_INTSTATUS);
e34212c75a6899 Dmitry Osipenko 2019-08-12  1153  
e34212c75a6899 Dmitry Osipenko 2019-08-12  1154  	/* ensure that unwanted debug features are disabled */
e34212c75a6899 Dmitry Osipenko 2019-08-12  1155  	emc_dbg = readl_relaxed(emc->regs + EMC_DBG);
e34212c75a6899 Dmitry Osipenko 2019-08-12  1156  	emc_dbg |= EMC_DBG_CFG_PRIORITY;
e34212c75a6899 Dmitry Osipenko 2019-08-12  1157  	emc_dbg &= ~EMC_DBG_READ_MUX_ASSEMBLY;
e34212c75a6899 Dmitry Osipenko 2019-08-12  1158  	emc_dbg &= ~EMC_DBG_WRITE_MUX_ACTIVE;
e34212c75a6899 Dmitry Osipenko 2019-08-12  1159  	emc_dbg &= ~EMC_DBG_FORCE_UPDATE;
e34212c75a6899 Dmitry Osipenko 2019-08-12  1160  	writel_relaxed(emc_dbg, emc->regs + EMC_DBG);
e34212c75a6899 Dmitry Osipenko 2019-08-12  1161  
8290e021c14675 Dmitry Osipenko 2021-12-22  1162  	switch (dram_type) {
8290e021c14675 Dmitry Osipenko 2021-12-22  1163  	case DRAM_TYPE_DDR1:
8290e021c14675 Dmitry Osipenko 2021-12-22 @1164  		dram_type_str = "DDR1";
8290e021c14675 Dmitry Osipenko 2021-12-22  1165  		break;
8290e021c14675 Dmitry Osipenko 2021-12-22  1166  	case DRAM_TYPE_LPDDR2:
8290e021c14675 Dmitry Osipenko 2021-12-22  1167  		dram_type_str = "LPDDR2";
8290e021c14675 Dmitry Osipenko 2021-12-22  1168  		break;
8290e021c14675 Dmitry Osipenko 2021-12-22  1169  	case DRAM_TYPE_DDR2:
8290e021c14675 Dmitry Osipenko 2021-12-22  1170  		dram_type_str = "DDR2";
8290e021c14675 Dmitry Osipenko 2021-12-22  1171  		break;
8290e021c14675 Dmitry Osipenko 2021-12-22  1172  	case DRAM_TYPE_DDR3:
8290e021c14675 Dmitry Osipenko 2021-12-22  1173  		dram_type_str = "DDR3";
8290e021c14675 Dmitry Osipenko 2021-12-22  1174  		break;
8290e021c14675 Dmitry Osipenko 2021-12-22  1175  	}
8290e021c14675 Dmitry Osipenko 2021-12-22  1176  
8290e021c14675 Dmitry Osipenko 2021-12-22  1177  	emc_adr_cfg = readl_relaxed(emc->regs + EMC_ADR_CFG);
8290e021c14675 Dmitry Osipenko 2021-12-22  1178  	emem_numdev = FIELD_GET(EMC_ADR_CFG_EMEM_NUMDEV, emc_adr_cfg) + 1;
8290e021c14675 Dmitry Osipenko 2021-12-22  1179  
8290e021c14675 Dmitry Osipenko 2021-12-22  1180  	dev_info_once(emc->dev, "%u %s %s attached\n", emem_numdev,
8290e021c14675 Dmitry Osipenko 2021-12-22  1181  		      dram_type_str, emem_numdev == 2 ? "devices" : "device");
8290e021c14675 Dmitry Osipenko 2021-12-22  1182  
8290e021c14675 Dmitry Osipenko 2021-12-22  1183  	if (dram_type == DRAM_TYPE_LPDDR2 && !print_sdram_info_once) {
8290e021c14675 Dmitry Osipenko 2021-12-22  1184  		while (emem_numdev--)
8290e021c14675 Dmitry Osipenko 2021-12-22  1185  			emc_read_lpddr_sdram_info(emc, emem_numdev);
8290e021c14675 Dmitry Osipenko 2021-12-22  1186  
8290e021c14675 Dmitry Osipenko 2021-12-22  1187  		print_sdram_info_once = true;
8290e021c14675 Dmitry Osipenko 2021-12-22  1188  	}
8290e021c14675 Dmitry Osipenko 2021-12-22  1189  
e34212c75a6899 Dmitry Osipenko 2019-08-12  1190  	return 0;
e34212c75a6899 Dmitry Osipenko 2019-08-12  1191  }
e34212c75a6899 Dmitry Osipenko 2019-08-12  1192  

---
0-DAY CI Kernel Test Service, Intel Corporation
https://lists.01.org/hyperkitty/list/kbuild-all(a)lists.01.org

^ permalink raw reply	[flat|nested] 4+ messages in thread

end of thread, other threads:[~2021-12-29 17:28 UTC | newest]

Thread overview: 4+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2021-12-22  4:32 [PATCH v2 1/2] memory: tegra30-emc: Print additional memory info Dmitry Osipenko
2021-12-22  4:32 ` [PATCH v2 2/2] memory: tegra20-emc: Correct memory device mask Dmitry Osipenko
2021-12-22 12:00 ` [PATCH v2 1/2] memory: tegra30-emc: Print additional memory info Krzysztof Kozlowski
2021-12-29 17:28 kernel test robot

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.