diff options
author | Gabe Black <gabeblack@google.com> | 2014-02-08 05:17:38 -0800 |
---|---|---|
committer | Marc Jones <marc.jones@se-eng.com> | 2014-11-12 02:25:31 +0100 |
commit | 5cbbc702456ceab01b52bda49a2b991fde1658e7 (patch) | |
tree | 65ab30a8c7720a013613594dd5ee5289952434bc /src/soc | |
parent | f220df6ff9876fdc3f9e3abc08f0965ac4f55814 (diff) |
tegra124: nyan: Keep in memory structures below 4GB.
We'd been putting some data structures like the framebuffer and the cbmem at
the end of memory, but that may not actually be addressable as identity mapped
memory. This change clamps the addresses those structures are placed at so
they stay below 4GB.
BUG=None
TEST=Booted on nyan. Went into recovery mode and verified that there was a
recovery screen. Forced memory size to be 4GB and verified that the recovery
screen still shows up.
BRANCH=None
Original-Change-Id: I9e6b28212c113107d4f480b3dd846dd2349b3a91
Original-Signed-off-by: Gabe Black <gabeblack@google.com>
Original-Reviewed-on: https://chromium-review.googlesource.com/185571
Original-Reviewed-by: David Hendricks <dhendrix@chromium.org>
Original-Commit-Queue: Gabe Black <gabeblack@chromium.org>
Original-Tested-by: Gabe Black <gabeblack@chromium.org>
(cherry picked from commit 63ea1274a838dc739d302d7551f1db42034c5bd0)
Signed-off-by: Marc Jones <marc.jones@se-eng.com>
Change-Id: I970c1285270cb648bc67fa114d44c0841eab1615
Reviewed-on: http://review.coreboot.org/7397
Reviewed-by: Edward O'Callaghan <eocallaghan@alterapraxis.com>
Tested-by: build bot (Jenkins)
Diffstat (limited to 'src/soc')
-rw-r--r-- | src/soc/nvidia/tegra124/cbmem.c | 3 | ||||
-rw-r--r-- | src/soc/nvidia/tegra124/display.c | 2 | ||||
-rw-r--r-- | src/soc/nvidia/tegra124/sdram.c | 6 | ||||
-rw-r--r-- | src/soc/nvidia/tegra124/sdram.h | 1 | ||||
-rw-r--r-- | src/soc/nvidia/tegra124/soc.c | 9 |
5 files changed, 17 insertions, 4 deletions
diff --git a/src/soc/nvidia/tegra124/cbmem.c b/src/soc/nvidia/tegra124/cbmem.c index 7f20702e63..9a754a0fea 100644 --- a/src/soc/nvidia/tegra124/cbmem.c +++ b/src/soc/nvidia/tegra124/cbmem.c @@ -23,6 +23,5 @@ void *cbmem_top(void) { - return (void *)(CONFIG_SYS_SDRAM_BASE + - ((sdram_size_mb() - FB_SIZE_MB)<< 20UL)); + return (void *)((sdram_max_addressable_mb() - FB_SIZE_MB) << 20UL); } diff --git a/src/soc/nvidia/tegra124/display.c b/src/soc/nvidia/tegra124/display.c index 00dfbb694d..2fbec50cf8 100644 --- a/src/soc/nvidia/tegra124/display.c +++ b/src/soc/nvidia/tegra124/display.c @@ -228,7 +228,7 @@ static void update_window(struct display_controller *dc, uint32_t fb_base_mb(void) { - return CONFIG_SYS_SDRAM_BASE/MiB + (sdram_size_mb() - FB_SIZE_MB); + return sdram_max_addressable_mb() - FB_SIZE_MB; } /* this is really aimed at the lcd panel. That said, there are two display diff --git a/src/soc/nvidia/tegra124/sdram.c b/src/soc/nvidia/tegra124/sdram.c index dcab810a45..1854e1dbd9 100644 --- a/src/soc/nvidia/tegra124/sdram.c +++ b/src/soc/nvidia/tegra124/sdram.c @@ -22,6 +22,7 @@ #include <delay.h> #include <soc/addressmap.h> #include <soc/clock.h> +#include <stdlib.h> #include "emc.h" #include "mc.h" @@ -639,3 +640,8 @@ int sdram_size_mb(void) printk(BIOS_DEBUG, "%s: Total SDRAM (MB): %u\n", __func__, total_size); return total_size; } + +uintptr_t sdram_max_addressable_mb(void) +{ + return MIN((CONFIG_SYS_SDRAM_BASE/MiB) + sdram_size_mb(), 4096); +} diff --git a/src/soc/nvidia/tegra124/sdram.h b/src/soc/nvidia/tegra124/sdram.h index 66dbaa1ba5..d32ce37770 100644 --- a/src/soc/nvidia/tegra124/sdram.h +++ b/src/soc/nvidia/tegra124/sdram.h @@ -25,6 +25,7 @@ uint32_t sdram_get_ram_code(void); void sdram_init(const struct sdram_params *param); int sdram_size_mb(void); +uintptr_t sdram_max_addressable_mb(void); /* Save params to PMC scratch registers for use by BootROM on LP0 resume. */ void sdram_lp0_save_params(const struct sdram_params *sdram); diff --git a/src/soc/nvidia/tegra124/soc.c b/src/soc/nvidia/tegra124/soc.c index 8ad1aa9730..bc47954790 100644 --- a/src/soc/nvidia/tegra124/soc.c +++ b/src/soc/nvidia/tegra124/soc.c @@ -35,8 +35,15 @@ static void soc_enable(device_t dev) unsigned long fb_size = FB_SIZE_MB; ram_resource(dev, 0, CONFIG_SYS_SDRAM_BASE/KiB, - (sdram_size_mb() - fb_size)*KiB); + (sdram_max_addressable_mb() - fb_size)*KiB - + CONFIG_SYS_SDRAM_BASE/KiB); mmio_resource(dev, 1, lcdbase*KiB, fb_size*KiB); + + u32 sdram_end_mb = sdram_size_mb() + CONFIG_SYS_SDRAM_BASE/MiB; + + if (sdram_end_mb > sdram_max_addressable_mb()) + ram_resource(dev, 2, sdram_max_addressable_mb()*KiB, + (sdram_end_mb - sdram_max_addressable_mb())*KiB); } static void soc_init(device_t dev) |