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 14/18] EDAC/synopsys: Simplify HIF/SDRAM column mapping get procedure
Date: Wed, 20 Sep 2023 22:26:59 +0300 [thread overview]
Message-ID: <20230920192806.29960-15-fancer.lancer@gmail.com> (raw)
In-Reply-To: <20230920192806.29960-1-fancer.lancer@gmail.com>
What is currently implemented in the driver by means of the multiple
if-else-if-else statements in fact is described in the hardware reference
manual [1]. It says:
1. All of the column bits shift up 1 bit when only half of the data bus is
in use. (In this case, for instance, you need to look at
ADDRMAP3.addrmap_col_b6 instead to determine the value of column address
bit 7.)
2. All of the column bits shift up 2 bits when only a quarter of the data
bus is in use. (In this case, for instance, you need to look at
ADDRMAP2.addrmap_col_b5 instead to determine the value of column address
bit 7.)
3. In addition to the above, the column bit 10 is reserved for the
auto-precharge command in DDR2/3/4/mDDR. So the column bits must be
further shifted up 1 bit when one of these DDR protocols is enabled.
So taking into account all of the notes above and what the column bit 12
is always reserved, the SDRAM column bits mapping procedure can be
significantly simplified: initially read the mapping as if for the
LPDDR2/3/4 memory with Full DQ-bus utilized; then shift the column bits up
in accordance with the detected DQ-bus width mode. That's it. Simple,
canonical and scalable.
[1] DesignWare® Cores Enhanced Universal DDR Memory Controller (uMCTL2)
Databook, Version 3.91a, October 2020, p.154
Signed-off-by: Serge Semin <fancer.lancer@gmail.com>
---
drivers/edac/synopsys_edac.c | 83 ++++++++++++------------------------
1 file changed, 27 insertions(+), 56 deletions(-)
diff --git a/drivers/edac/synopsys_edac.c b/drivers/edac/synopsys_edac.c
index 204d7f1fc7e2..a359018c261c 100644
--- a/drivers/edac/synopsys_edac.c
+++ b/drivers/edac/synopsys_edac.c
@@ -996,8 +996,22 @@ static void snps_get_hif_col_map(struct snps_edac_priv *priv, u32 *addrmap)
map->col[9] = map->col[9] == DDR_ADDRMAP_MAX_15 ?
DDR_ADDRMAP_UNUSED : map->col[9] + COL_B9_BASE;
+ map->col[10] = FIELD_GET(DDR_ADDRMAP_B0_M15, addrmap[4]);
+ map->col[10] = map->col[10] == DDR_ADDRMAP_MAX_15 ?
+ DDR_ADDRMAP_UNUSED : map->col[10] + COL_B10_BASE;
+
+ map->col[11] = FIELD_GET(DDR_ADDRMAP_B8_M15, addrmap[4]);
+ map->col[11] = map->col[11] == DDR_ADDRMAP_MAX_15 ?
+ DDR_ADDRMAP_UNUSED : map->col[11] + COL_B11_BASE;
+
+ /*
+ * In case of the non-Full DQ bus mode the lowest columns are
+ * unmapped and used by the controller to read the full DQ word
+ * in multiple cycles (col[0] for the Half bus mode, col[0:1] for
+ * the Quarter bus mode).
+ */
if (priv->info.dq_mode) {
- for (i = 9; i > priv->info.dq_mode; i--) {
+ for (i = 11 + priv->info.dq_mode; i >= priv->info.dq_mode; i--) {
map->col[i] = map->col[i - priv->info.dq_mode];
map->col[i - priv->info.dq_mode] = DDR_ADDRMAP_UNUSED;
}
@@ -1007,65 +1021,22 @@ static void snps_get_hif_col_map(struct snps_edac_priv *priv, u32 *addrmap)
* Per JEDEC DDR2/3/4/mDDR specification, column address bit 10 is
* reserved for indicating auto-precharge, and hence no source
* address bit can be mapped to col[10].
+ */
+ if (priv->info.sdram_mode == MEM_LPDDR || priv->info.sdram_mode == MEM_DDR2 ||
+ priv->info.sdram_mode == MEM_DDR3 || priv->info.sdram_mode == MEM_DDR4) {
+ for (i = 12 + priv->info.dq_mode; i > 10; i--) {
+ map->col[i] = map->col[i - 1];
+ map->col[i - 1] = DDR_ADDRMAP_UNUSED;
+ }
+ }
+
+ /*
* Per JEDEC specification, column address bit 12 is reserved
* for the Burst-chop status, so no source address bit mapping
* for col[12] either.
*/
- if (priv->info.dq_mode == SNPS_DQ_FULL) {
- if (priv->info.sdram_mode == MEM_LPDDR3) {
- map->col[10] = FIELD_GET(DDR_ADDRMAP_B0_M15, addrmap[4]);
- map->col[10] = map->col[10] == DDR_ADDRMAP_MAX_15 ?
- DDR_ADDRMAP_UNUSED : map->col[10] + COL_B10_BASE;
-
- map->col[11] = FIELD_GET(DDR_ADDRMAP_B8_M15, addrmap[4]);
- map->col[11] = map->col[11] == DDR_ADDRMAP_MAX_15 ?
- DDR_ADDRMAP_UNUSED : map->col[11] + COL_B11_BASE;
- } else {
- map->col[11] = FIELD_GET(DDR_ADDRMAP_B0_M15, addrmap[4]);
- map->col[11] = map->col[11] == DDR_ADDRMAP_MAX_15 ?
- DDR_ADDRMAP_UNUSED : map->col[11] + COL_B10_BASE;
-
- map->col[13] = FIELD_GET(DDR_ADDRMAP_B8_M15, addrmap[4]);
- map->col[13] = map->col[13] == DDR_ADDRMAP_MAX_15 ?
- DDR_ADDRMAP_UNUSED : map->col[13] + COL_B11_BASE;
- }
- } else if (priv->info.dq_mode == SNPS_DQ_HALF) {
- if (priv->info.sdram_mode == MEM_LPDDR3) {
- map->col[10] = FIELD_GET(DDR_ADDRMAP_B24_M15, addrmap[3]);
- map->col[10] = map->col[10] == DDR_ADDRMAP_MAX_15 ?
- DDR_ADDRMAP_UNUSED : map->col[10] + COL_B9_BASE;
-
- map->col[11] = FIELD_GET(DDR_ADDRMAP_B0_M15, addrmap[4]);
- map->col[11] = map->col[11] == DDR_ADDRMAP_MAX_15 ?
- DDR_ADDRMAP_UNUSED : map->col[11] + COL_B10_BASE;
- } else {
- map->col[11] = FIELD_GET(DDR_ADDRMAP_B24_M15, addrmap[3]);
- map->col[11] = map->col[11] == DDR_ADDRMAP_MAX_15 ?
- DDR_ADDRMAP_UNUSED : map->col[11] + COL_B9_BASE;
-
- map->col[13] = FIELD_GET(DDR_ADDRMAP_B0_M15, addrmap[4]);
- map->col[13] = map->col[13] == DDR_ADDRMAP_MAX_15 ?
- DDR_ADDRMAP_UNUSED : map->col[13] + COL_B10_BASE;
- }
- } else {
- if (priv->info.sdram_mode == MEM_LPDDR3) {
- map->col[10] = FIELD_GET(DDR_ADDRMAP_B16_M15, addrmap[3]);
- map->col[10] = map->col[10] == DDR_ADDRMAP_MAX_15 ?
- DDR_ADDRMAP_UNUSED : map->col[10] + COL_B8_BASE;
-
- map->col[11] = FIELD_GET(DDR_ADDRMAP_B24_M15, addrmap[3]);
- map->col[11] = map->col[11] == DDR_ADDRMAP_MAX_15 ?
- DDR_ADDRMAP_UNUSED : map->col[11] + COL_B9_BASE;
- } else {
- map->col[11] = FIELD_GET(DDR_ADDRMAP_B16_M15, addrmap[3]);
- map->col[11] = map->col[11] == DDR_ADDRMAP_MAX_15 ?
- DDR_ADDRMAP_UNUSED : map->col[11] + COL_B8_BASE;
-
- map->col[11] = FIELD_GET(DDR_ADDRMAP_B24_M15, addrmap[3]);
- map->col[13] = map->col[13] == DDR_ADDRMAP_MAX_15 ?
- DDR_ADDRMAP_UNUSED : map->col[13] + COL_B9_BASE;
- }
- }
+ map->col[13] = map->col[12];
+ map->col[12] = DDR_ADDRMAP_UNUSED;
}
/**
--
2.41.0
next prev parent reply other threads:[~2023-09-20 19:29 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 ` [PATCH v4 03/18] EDAC/synopsys: Extend memtypes supported by controller Serge Semin
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 ` Serge Semin [this message]
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-15-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