[PATCH] lmb: Reinstate access to memory above ram_top
Gary Guo
gary at garyguo.net
Mon Mar 23 19:07:50 CET 2026
On Mon Mar 23, 2026 at 5:26 PM GMT, Marek Vasut wrote:
> On 3/23/26 6:11 PM, Gary Guo wrote:
>> On Sun Mar 22, 2026 at 11:25 PM GMT, Mark Kettenis wrote:
>>>> Does something like this make the issue go away ?
>>>>
>>>> "
>>>> diff --git a/lib/efi_loader/efi_memory.c b/lib/efi_loader/efi_memory.c
>>>> index b77c2f980cc..44eccc0cf35 100644
>>>> --- a/lib/efi_loader/efi_memory.c
>>>> +++ b/lib/efi_loader/efi_memory.c
>>>> @@ -475,8 +475,10 @@ efi_status_t efi_allocate_pages(enum
>>>> efi_allocate_type type,
>>>> flags = LMB_NOOVERWRITE | LMB_NONOTIFY;
>>>> switch (type) {
>>>> case EFI_ALLOCATE_ANY_PAGES:
>>>> + addr = map_to_sysmem((void *)(uintptr_t)0xffff0000);
>>>> +
>>>> /* Any page */
>>>> - err = lmb_alloc_mem(LMB_MEM_ALLOC_ANY, EFI_PAGE_SIZE, &addr,
>>>> + err = lmb_alloc_mem(LMB_MEM_ALLOC_MAX, EFI_PAGE_SIZE, &addr,
>>>> len, flags);
>>>> if (err)
>>>> return EFI_OUT_OF_RESOURCES;
>>>> "
>>>>
>>>> If so, then maybe we need a temporary config option which limits the
>>>> EFI_ALLOCATE_ANY_PAGES below 4 GiB on hardware that has DMA limitations.
>>>
>>> Note that some arm64 systems (e.g. Apple Silicon) have *no* memory
>>> below 4 GiB. So that change must indeed be behind a config option and
>>> care must be taken on what systems to enabled it.
>>
>> Perhaps a good short-term fix it to use gd->ram_top here rather than hardcoding
>> 4 GiB. This way it should work on all systems without a config option.
> Looking at my notes from last DMA32 investigation, this may indeed do
> the trick in the meantime. But it would be really good to have this
> temporary workaround guarded by some Kconfig symbol, so it can be fixed
> up once the DMA32 allocator is available.
>
> Does the gd->ram_top fix the RPi5 too ?
Yes, I can boot my RPi5 with the following diff, which makes sense as it has
ram_top of 0x3fc00000. Testing on devices with ram_top > 4 GiB would be needed
to know if this is a proper fix.
Best,
Gary
diff --git a/lib/efi_loader/efi_memory.c b/lib/efi_loader/efi_memory.c
index b77c2f980cc0..76ae89e31f47 100644
--- a/lib/efi_loader/efi_memory.c
+++ b/lib/efi_loader/efi_memory.c
@@ -475,8 +475,10 @@ efi_status_t efi_allocate_pages(enum efi_allocate_type type,
flags = LMB_NOOVERWRITE | LMB_NONOTIFY;
switch (type) {
case EFI_ALLOCATE_ANY_PAGES:
+ addr = map_to_sysmem((void *)gd->ram_top);
+
/* Any page */
- err = lmb_alloc_mem(LMB_MEM_ALLOC_ANY, EFI_PAGE_SIZE, &addr,
+ err = lmb_alloc_mem(LMB_MEM_ALLOC_MAX, EFI_PAGE_SIZE, &addr,
len, flags);
if (err)
return EFI_OUT_OF_RESOURCES;
More information about the U-Boot
mailing list