On 30.11.18 01:05, Heinrich Schuchardt wrote: > On 11/30/18 12:47 AM, Alexander Graf wrote: >> On some systems, not all RAM may be usable within U-Boot. Maybe the >> memory maps are incomplete, maybe it's used as workaround for broken >> DMA. But whatever the reason may be, a platform can say that it does >> not wish to have its RAM accessed above a certain address by defining >> board_get_usable_ram_top(). >> >> In the efi_loader world, we ignored that hint, mostly because very few >> boards actually have real restrictions around this. >> >> So let's honor the board's wish to not access high addresses during >> boot time. The best way to do so is by indicating the respective pages >> as "allocated by firmware". That way, Operating Systems will still >> use the pages after boot, but before boot no allocation will use them. >> >> Reported-by: Baruch Siach <bar...@tkos.co.il> >> Signed-off-by: Alexander Graf <ag...@suse.de> >> --- >> include/common.h | 11 +++++++++++ >> lib/efi_loader/efi_memory.c | 9 +++++++++ >> 2 files changed, 20 insertions(+) >> >> diff --git a/include/common.h b/include/common.h >> index 3f69943887..8f295c2f30 100644 >> --- a/include/common.h >> +++ b/include/common.h >> @@ -106,6 +106,17 @@ int mdm_init(void); >> void board_show_dram(phys_size_t size); >> >> /** >> + * Get the uppermost pointer that is valid to access >> + * >> + * Some systems may not map all of their address space. This function allows >> + * boards to indicate what their highest support pointer value is for DRAM >> + * access. >> + * >> + * @param total_size Size of U-Boot (unused?) >> + */ >> +ulong board_get_usable_ram_top(ulong total_size); >> + >> +/** >> * arch_fixup_fdt() - Write arch-specific information to fdt >> * >> * Defined in arch/$(ARCH)/lib/bootm-fdt.c >> diff --git a/lib/efi_loader/efi_memory.c b/lib/efi_loader/efi_memory.c >> index f225a9028c..2f13bf8a75 100644 >> --- a/lib/efi_loader/efi_memory.c >> +++ b/lib/efi_loader/efi_memory.c >> @@ -551,6 +551,7 @@ efi_status_t efi_get_memory_map(efi_uintn_t >> *memory_map_size, >> >> __weak void efi_add_known_memory(void) >> { >> + u64 ram_top = board_get_usable_ram_top(0) & ~EFI_PAGE_MASK;
^ >> int i; >> >> /* Add RAM */ >> @@ -570,6 +571,14 @@ __weak void efi_add_known_memory(void) >> efi_add_memory_map(ram_start, pages, >> EFI_CONVENTIONAL_MEMORY, false); >> } >> + >> + /* Reserve memory above ram_top, as that may not be mapped */ >> + if ((ram_top >= ram_start) && (ram_top < ram_end)) { >> + pages = (ram_end - ram_top) >> EFI_PAGE_SHIFT; > > Please, do not assume that ram_end is page aligned. See above. I align it manually, no? Alex > You could use the > macro efi_size_in_pages() here. See > https://patchwork.ozlabs.org/patch/999522/ > > Best regards > > Heinrich > >> + >> + efi_add_memory_map(ram_top, pages, >> + EFI_BOOT_SERVICES_DATA, true); >> + } >> } >> } >> >> > _______________________________________________ U-Boot mailing list U-Boot@lists.denx.de https://lists.denx.de/listinfo/u-boot