From: Emanuele Ghidoli <ghidoliemanuele@gmail.com>
To: Tom Rini <trini@konsulko.com>,
Stefano Babic <sbabic@nabladev.com>,
Fabio Estevam <festevam@gmail.com>,
"NXP i.MX U-Boot Team" <uboot-imx@nxp.com>,
Francesco Dolcini <francesco.dolcini@toradex.com>
Cc: Emanuele Ghidoli <emanuele.ghidoli@toradex.com>,
"Peng Fan" <peng.fan@nxp.com>, "Alice Guo" <alice.guo@nxp.com>,
"Sumit Garg" <sumit.garg@oss.qualcomm.com>,
Simon Glass <sjg@chromium.org>,
u-boot@lists.denx.de
Subject: [PATCH v2 1/3] common: memsize: add RAM size probe based on alias detection
Date: Fri, 17 Apr 2026 09:13:31 +0200 [thread overview]
Message-ID: <20260417071546.1610330-2-ghidoliemanuele@gmail.com> (raw)
In-Reply-To: <20260417071546.1610330-1-ghidoliemanuele@gmail.com>
From: Emanuele Ghidoli <emanuele.ghidoli@toradex.com>
Add probe_ram_size_by_alias() to detect RAM size by checking whether a
write to one address aliases to another address.
Compared to get_ram_size(), this function allows the caller to:
- limit probing to a small set of required accesses
- avoid touching reserved or already used memory regions
- handle non-linear alias patterns
On the iMX95 SoC, when used with LPDDR5, accesses beyond the end of an 8GB DDR
configuration do not alias to the expected linear wrap-around addresses.
Instead, the aliased addresses appear to follow a pattern related to the
DDRC bank and bank-group addresses mapping. Experimentally, the observed
pattern is:
Write Read
y00000000 -> x0001c000
y00004000 -> x00018000
y00008000 -> x00014000
y0000c000 -> x00010000
y00010000 -> x0000c000
y00014000 -> x00008000
y00018000 -> x00004000
y0001c000 -> x00000000
This helper makes it possible to probe RAM size by explicitly specifying
the probed address and the expected alias address for each size check.
Signed-off-by: Emanuele Ghidoli <emanuele.ghidoli@toradex.com>
---
common/memsize.c | 59 ++++++++++++++++++++++++++++++++++++++++++++++++
include/init.h | 7 ++++++
2 files changed, 66 insertions(+)
diff --git a/common/memsize.c b/common/memsize.c
index 1abf3fc47d73..3ecf9bac2aac 100644
--- a/common/memsize.c
+++ b/common/memsize.c
@@ -127,6 +127,65 @@ long get_ram_size(long *base, long maxsize)
return (maxsize);
}
+/**
+ * probe_ram_size_by_alias() - Detect RAM size using known alias addresses
+ * @checks: Array of RAM alias probe descriptors, terminated by a NULL
+ * @probe_addr entry
+ *
+ * Probe RAM size by writing a test pattern to each @probe_addr and checking
+ * whether the same pattern does not appear at the corresponding @alias_addr.
+ * This is useful on systems where address wrap-around does not alias to the
+ * base of memory in a linear way, so get_ram_size() cannot be used directly.
+ * It is also useful on systems where the base of the physical memory cannot
+ * be safely accessed, so get_ram_size() cannot be used at all.
+ *
+ * Return: The size associated with the first matching entry, or 0 if no match
+ * is found.
+ */
+long probe_ram_size_by_alias(const struct ram_alias_check *checks)
+{
+ long save[2];
+ int dcache_en = 0;
+ long ret = 0;
+
+ if (!CONFIG_IS_ENABLED(SYS_DCACHE_OFF))
+ dcache_en = dcache_status();
+
+ while (checks->probe_addr && !ret) {
+ volatile long *d = checks->probe_addr;
+ volatile long *s = checks->alias_addr;
+
+ save[0] = *s;
+ save[1] = *d;
+ /* Ensure s is written and not cached */
+ if (dcache_en)
+ dcache_flush_invalidate(s);
+
+ *d = ~save[0];
+ sync();
+ if (dcache_en)
+ dcache_flush_invalidate(d);
+
+ if (*s != ~save[0])
+ ret = checks->size;
+
+ /* Restore content */
+ *d = save[1];
+ sync();
+ if (dcache_en)
+ dcache_flush_invalidate(d);
+
+ *s = save[0];
+ sync();
+ if (dcache_en)
+ dcache_flush_invalidate(s);
+
+ checks++;
+ }
+
+ return ret;
+}
+
phys_size_t __weak get_effective_memsize(void)
{
phys_size_t ram_size = gd->ram_size;
diff --git a/include/init.h b/include/init.h
index 1e375da48936..c31ebd83b85e 100644
--- a/include/init.h
+++ b/include/init.h
@@ -14,6 +14,12 @@
#include <linux/types.h>
+struct ram_alias_check {
+ void *probe_addr;
+ void *alias_addr;
+ long size;
+};
+
/*
* In case of the EFI app the UEFI firmware provides the low-level
* initialisation.
@@ -88,6 +94,7 @@ int dram_init(void);
int dram_init_banksize(void);
long get_ram_size(long *base, long size);
+long probe_ram_size_by_alias(const struct ram_alias_check *checks);
phys_size_t get_effective_memsize(void);
int testdram(void);
--
2.43.0
next prev parent reply other threads:[~2026-04-17 7:16 UTC|newest]
Thread overview: 8+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-04-17 7:13 [PATCH v2 0/3] add Toradex Verdin iMX95 support Emanuele Ghidoli
2026-04-17 7:13 ` Emanuele Ghidoli [this message]
2026-04-17 8:15 ` [PATCH v2 1/3] common: memsize: add RAM size probe based on alias detection Emanuele Ghidoli
2026-04-17 7:13 ` [PATCH v2 2/3] board: toradex: add Toradex Verdin iMX95 Emanuele Ghidoli
2026-04-17 8:15 ` Emanuele Ghidoli
2026-04-17 7:13 ` [PATCH v2 3/3] toradex: tdx-cfg-block: add verdin imx95 0226, 0227 and 0228 pid4 Emanuele Ghidoli
2026-04-17 8:15 ` Emanuele Ghidoli
2026-04-17 7:46 ` [PATCH v2 0/3] add Toradex Verdin iMX95 support Francesco Dolcini
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=20260417071546.1610330-2-ghidoliemanuele@gmail.com \
--to=ghidoliemanuele@gmail.com \
--cc=alice.guo@nxp.com \
--cc=emanuele.ghidoli@toradex.com \
--cc=festevam@gmail.com \
--cc=francesco.dolcini@toradex.com \
--cc=peng.fan@nxp.com \
--cc=sbabic@nabladev.com \
--cc=sjg@chromium.org \
--cc=sumit.garg@oss.qualcomm.com \
--cc=trini@konsulko.com \
--cc=u-boot@lists.denx.de \
--cc=uboot-imx@nxp.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