mirror of
https://github.com/AsahiLinux/u-boot
synced 2024-11-24 21:54:01 +00:00
ARM: tegra: reserve unmapped RAM so EFI doesn't use it
Tegra U-Boot ensures that board_get_usable_ram_top() never returns a value
over 4GB, since some peripherals can't access such addresses. However, on
systems with more than 2GB of RAM, RAM bank 1 does describe this extra
RAM, so that Linux (or whatever OS) can use it, subject to DMA
limitations. Since board_get_usable_ram_top() points at the top of RAM
bank 0, the memory locations describes by RAM bank 1 are not mapped by
U-Boot's MMU configuration, and so cannot be used for anything.
For some completely inexplicable reason, U-Boot's EFI support ignores the
value returned by board_get_usable_ram_top(), and EFI memory allocation
routines will return values above U-Boot's RAM top. This causes U-Boot to
crash when it accesses that RAM, since it isn't mapped by the MMU. One
use-case where this happens is TFTP download of a file on Jetson TX1
(p2371-2180).
This change explicitly tells the EFI code that this extra RAM should not
be used, thus avoiding the crash.
A previous attempt to make EFI honor board_get_usable_ram_top() was
rejected. So, this patch will need to be replicated for any board that
implements board_get_usable_ram_top().
Fixes: aa909462d0
("efi_loader: efi_allocate_pages is too restrictive")
Signed-off-by: Stephen Warren <swarren@nvidia.com>
Signed-off-by: Alexander Graf <agraf@suse.de>
This commit is contained in:
parent
9b5e6396bf
commit
0797f7f0b7
1 changed files with 14 additions and 0 deletions
|
@ -6,6 +6,7 @@
|
|||
|
||||
#include <common.h>
|
||||
#include <dm.h>
|
||||
#include <efi_loader.h>
|
||||
#include <errno.h>
|
||||
#include <ns16550.h>
|
||||
#include <usb.h>
|
||||
|
@ -210,6 +211,19 @@ int board_early_init_f(void)
|
|||
|
||||
int board_late_init(void)
|
||||
{
|
||||
#if CONFIG_IS_ENABLED(EFI_LOADER)
|
||||
if (gd->bd->bi_dram[1].start) {
|
||||
/*
|
||||
* Only bank 0 is below board_get_usable_ram_top(), so all of
|
||||
* bank 1 is not mapped by the U-Boot MMU configuration, and so
|
||||
* we must prevent EFI from using it.
|
||||
*/
|
||||
efi_add_memory_map(gd->bd->bi_dram[1].start,
|
||||
gd->bd->bi_dram[1].size >> EFI_PAGE_SHIFT,
|
||||
EFI_BOOT_SERVICES_DATA, false);
|
||||
}
|
||||
#endif
|
||||
|
||||
#if defined(CONFIG_TEGRA_SUPPORT_NON_SECURE)
|
||||
if (tegra_cpu_is_non_secure()) {
|
||||
printf("CPU is in NS mode\n");
|
||||
|
|
Loading…
Reference in a new issue