From: Serge Semin <fancer.lancer@gmail.com>
To: Michal Simek <michal.simek@amd.com>,
Alexander Stein <alexander.stein@ew.tq-group.com>,
Borislav Petkov <bp@alien8.de>, Tony Luck <tony.luck@intel.com>,
James Morse <james.morse@arm.com>,
Mauro Carvalho Chehab <mchehab@kernel.org>,
Robert Richter <rric@kernel.org>
Cc: Serge Semin <fancer.lancer@gmail.com>,
Punnaiah Choudary Kalluri <punnaiah.choudary.kalluri@xilinx.com>,
Dinh Nguyen <dinguyen@kernel.org>, Arnd Bergmann <arnd@arndb.de>,
Greg Kroah-Hartman <gregkh@linuxfoundation.org>,
linux-arm-kernel@lists.infradead.org, linux-edac@vger.kernel.org,
linux-kernel@vger.kernel.org
Subject: [PATCH v4 03/18] EDAC/synopsys: Extend memtypes supported by controller
Date: Wed, 20 Sep 2023 22:26:48 +0300 [thread overview]
Message-ID: <20230920192806.29960-4-fancer.lancer@gmail.com> (raw)
In-Reply-To: <20230920192806.29960-1-fancer.lancer@gmail.com>
In accordance with [1] the DW uMCTL2 DDR controllers can support the next
DDR protocols: LPDDR, (LP)DDR(2|3|4). Even if the controller is configured
to support several of these memory chip types only one of these modes
could be enabled at runtime [2].
Taking all of that into account update the snps_get_mtype() procedure so
the DW uMCTL2 DDRC driver would be able to detect all the claimed to be
supported memory types in accordance with the table defined in [2]. Note
alas it's not possible do determine which MEMC DDR configs were enabled at
the IP-core synthesize. Therefore there is no other choice but to
initialize the EDAC MC mem-types capability field with all the types
claimed to be supported by the IP-core.
[1] DesignWare® Cores Enhanced Universal DDR Memory Controller (uMCTL2)
Databook, Version 3.91a, October 2020, p.501
[2] DesignWare® Cores Enhanced Universal DDR Memory Controller (uMCTL2)
Databook, Version 3.91a, October 2020, p.501
Signed-off-by: Serge Semin <fancer.lancer@gmail.com>
---
drivers/edac/synopsys_edac.c | 41 ++++++++++++++++++++++++------------
1 file changed, 27 insertions(+), 14 deletions(-)
diff --git a/drivers/edac/synopsys_edac.c b/drivers/edac/synopsys_edac.c
index 10716f365c6f..e08e9f3c81cb 100644
--- a/drivers/edac/synopsys_edac.c
+++ b/drivers/edac/synopsys_edac.c
@@ -102,11 +102,14 @@
#define DDR_MSTR_BUSWIDTH_16 2
#define DDR_MSTR_BUSWIDTH_32 1
#define DDR_MSTR_BUSWIDTH_64 0
+#define DDR_MSTR_MEM_MASK GENMASK(5, 0)
#define DDR_MSTR_MEM_LPDDR4 BIT(5)
#define DDR_MSTR_MEM_DDR4 BIT(4)
#define DDR_MSTR_MEM_LPDDR3 BIT(3)
-#define DDR_MSTR_MEM_DDR2 BIT(2)
+#define DDR_MSTR_MEM_LPDDR2 BIT(2)
+#define DDR_MSTR_MEM_LPDDR BIT(1)
#define DDR_MSTR_MEM_DDR3 BIT(0)
+#define DDR_MSTR_MEM_DDR2 0
/* ECC CFG0 register definitions */
#define ECC_CFG0_MODE_MASK GENMASK(2, 0)
@@ -535,21 +538,29 @@ static u32 snps_get_memsize(void)
*/
static enum mem_type snps_get_mtype(const void __iomem *base)
{
- enum mem_type mt;
- u32 memtype;
+ u32 regval;
- memtype = readl(base + DDR_MSTR_OFST);
+ regval = readl(base + DDR_MSTR_OFST);
+ regval = FIELD_GET(DDR_MSTR_MEM_MASK, regval);
- if ((memtype & DDR_MSTR_MEM_DDR3) || (memtype & DDR_MSTR_MEM_LPDDR3))
- mt = MEM_DDR3;
- else if (memtype & DDR_MSTR_MEM_DDR2)
- mt = MEM_RDDR2;
- else if ((memtype & DDR_MSTR_MEM_LPDDR4) || (memtype & DDR_MSTR_MEM_DDR4))
- mt = MEM_DDR4;
- else
- mt = MEM_EMPTY;
+ switch (regval) {
+ case DDR_MSTR_MEM_DDR2:
+ return MEM_DDR2;
+ case DDR_MSTR_MEM_DDR3:
+ return MEM_DDR3;
+ case DDR_MSTR_MEM_LPDDR:
+ return MEM_LPDDR;
+ case DDR_MSTR_MEM_LPDDR2:
+ return MEM_LPDDR2;
+ case DDR_MSTR_MEM_LPDDR3:
+ return MEM_LPDDR3;
+ case DDR_MSTR_MEM_DDR4:
+ return MEM_DDR4;
+ case DDR_MSTR_MEM_LPDDR4:
+ return MEM_LPDDR4;
+ }
- return mt;
+ return MEM_RESERVED;
}
/**
@@ -597,7 +608,9 @@ static void snps_mc_init(struct mem_ctl_info *mci, struct platform_device *pdev)
platform_set_drvdata(pdev, mci);
/* Initialize controller capabilities and configuration */
- mci->mtype_cap = MEM_FLAG_DDR3 | MEM_FLAG_DDR2;
+ mci->mtype_cap = MEM_FLAG_LPDDR | MEM_FLAG_DDR2 | MEM_FLAG_LPDDR2 |
+ MEM_FLAG_DDR3 | MEM_FLAG_LPDDR3 |
+ MEM_FLAG_DDR4 | MEM_FLAG_LPDDR4;
mci->edac_ctl_cap = EDAC_FLAG_NONE | EDAC_FLAG_SECDED;
mci->scrub_cap = SCRUB_FLAG_HW_SRC;
mci->scrub_mode = SCRUB_NONE;
--
2.41.0
next prev parent reply other threads:[~2023-09-20 19:28 UTC|newest]
Thread overview: 22+ messages / expand[flat|nested] mbox.gz Atom feed top
2023-09-20 19:26 [PATCH v4 00/18] EDAC/synopsys: Add generic DDRC info and address mapping Serge Semin
2023-09-20 19:26 ` [PATCH v4 01/18] EDAC/synopsys: Convert sysfs nodes to debugfs ones Serge Semin
2023-09-20 19:26 ` [PATCH v4 02/18] EDAC/mc: Extend memtypes with LPDDR(mDDR) and LPDDR2 Serge Semin
2023-09-20 19:26 ` Serge Semin [this message]
2023-09-20 19:26 ` [PATCH v4 04/18] EDAC/synopsys: Detach private data from mci instance Serge Semin
2023-09-20 19:26 ` [PATCH v4 05/18] EDAC/synopsys: Add DDRC basic parameters infrastructure Serge Semin
2023-09-26 8:07 ` kernel test robot
2023-09-26 8:56 ` Serge Semin
2023-09-20 19:26 ` [PATCH v4 06/18] EDAC/synopsys: Convert plat-data to plat-init function Serge Semin
2023-09-20 19:26 ` [PATCH v4 07/18] EDAC/synopsys: Parse ADDRMAP[7-8] CSRs for (LP)DDR4 only Serge Semin
2023-09-20 19:26 ` [PATCH v4 08/18] EDAC/synopsys: Parse ADDRMAP[0] CSR for multi-ranks case only Serge Semin
2023-09-20 19:26 ` [PATCH v4 09/18] EDAC/synopsys: Set actual DIMM ECC errors grain Serge Semin
2023-09-20 19:26 ` [PATCH v4 10/18] EDAC/synopsys: Get corrected bit position Serge Semin
2023-09-20 19:26 ` [PATCH v4 11/18] EDAC/synopsys: Pass syndrome to EDAC error handler Serge Semin
2023-09-20 19:26 ` [PATCH v4 12/18] EDAC/synopsys: Read full data+ecc pattern on errors Serge Semin
2023-09-20 19:26 ` [PATCH v4 13/18] EDAC/synopsys: Introduce System/SDRAM address translation interface Serge Semin
2023-09-27 7:13 ` kernel test robot
2023-09-20 19:26 ` [PATCH v4 14/18] EDAC/synopsys: Simplify HIF/SDRAM column mapping get procedure Serge Semin
2023-09-20 19:27 ` [PATCH v4 15/18] EDAC/synopsys: Add HIF/SDRAM mapping debugfs node Serge Semin
2023-09-20 19:46 ` [PATCH v4 16/18] EDAC/synopsys: Add erroneous page-frame/offset reporting Serge Semin
2023-09-20 19:50 ` [PATCH v4 17/18] EDAC/synopsys: Add system address regions support Serge Semin
2023-09-20 19:50 ` [PATCH v4 18/18] EDAC/synopsys: Add mapping-based memory size calculation Serge Semin
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20230920192806.29960-4-fancer.lancer@gmail.com \
--to=fancer.lancer@gmail.com \
--cc=alexander.stein@ew.tq-group.com \
--cc=arnd@arndb.de \
--cc=bp@alien8.de \
--cc=dinguyen@kernel.org \
--cc=gregkh@linuxfoundation.org \
--cc=james.morse@arm.com \
--cc=linux-arm-kernel@lists.infradead.org \
--cc=linux-edac@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=mchehab@kernel.org \
--cc=michal.simek@amd.com \
--cc=punnaiah.choudary.kalluri@xilinx.com \
--cc=rric@kernel.org \
--cc=tony.luck@intel.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox