summaryrefslogtreecommitdiff
path: root/common
diff options
context:
space:
mode:
authorStephen Warren <swarren@nvidia.com>2014-12-23 10:34:49 -0700
committerTom Warren <twarren@nvidia.com>2015-03-04 10:08:55 -0700
commit1e4d11a58c0d68443c7953fff6577fd6d339a34b (patch)
treee8a2ebabde2c514c54815125b71e2bcd253cde31 /common
parent02251eefc95c477f4ff6aa7568dfd4be7c69c31f (diff)
downloadu-boot-imx-1e4d11a58c0d68443c7953fff6577fd6d339a34b.zip
u-boot-imx-1e4d11a58c0d68443c7953fff6577fd6d339a34b.tar.gz
u-boot-imx-1e4d11a58c0d68443c7953fff6577fd6d339a34b.tar.bz2
common: board: support systems with where RAM ends beyond 4GB
Some systems have so much RAM that the end of RAM is beyond 4GB. An example would be a Tegra124 system (where RAM starts at 2GB physical) that has more than 2GB of RAM. In this case, we can gd->ram_size to represent the actual RAM size, so that the actual RAM size is passed to the OS. This is useful if the OS implements LPAE, and can actually use the "extra" RAM. However, U-Boot does not implement LPAE and so must deal with 32-bit physical addresses. To this end, we enhance board_get_usable_ram_top() to detect the "over-sized" case, and limit the relocation addres so that it fits into 32-bits of physical address space. Signed-off-by: Stephen Warren <swarren@nvidia.com> Reviewed-by: Simon Glass <sjg@chromium.org> Signed-off-by: Tom Warren <twarren@nvidia.com>
Diffstat (limited to 'common')
-rw-r--r--common/board_f.c12
1 files changed, 12 insertions, 0 deletions
diff --git a/common/board_f.c b/common/board_f.c
index 4d8b8a6..62fdaeb 100644
--- a/common/board_f.c
+++ b/common/board_f.c
@@ -360,6 +360,18 @@ static int setup_fdt(void)
/* Get the top of usable RAM */
__weak ulong board_get_usable_ram_top(ulong total_size)
{
+#ifdef CONFIG_SYS_SDRAM_BASE
+ /*
+ * Detect whether we have so much RAM it goes past the end of our
+ * 32-bit address space. If so, clip the usable RAM so it doesn't.
+ */
+ if (gd->ram_top < CONFIG_SYS_SDRAM_BASE)
+ /*
+ * Will wrap back to top of 32-bit space when reservations
+ * are made.
+ */
+ return 0;
+#endif
return gd->ram_top;
}