(In reply to Gary Ching-Pang Lin from comment #23) > Just checked the u-boot code, it always marks the first page as WB and > RESERVED for its own spin table. > > Maybe we can change the logic of get_dram_base() in kernel from > > if (md->attribute & EFI_MEMORY_WB) { > > to > > if (md->attribute & EFI_MEMORY_WB && > md->type == EFI_CONVENTIONAL_MEMORY) { > > This way, get_dram_base() will always find the first free region. (In reply to Gary Ching-Pang Lin from comment #23) > Just checked the u-boot code, it always marks the first page as WB and > RESERVED for its own spin table. > > Maybe we can change the logic of get_dram_base() in kernel from > > if (md->attribute & EFI_MEMORY_WB) { > > to > > if (md->attribute & EFI_MEMORY_WB && > md->type == EFI_CONVENTIONAL_MEMORY) { > > This way, get_dram_base() will always find the first free region. As Gary's suggestion, I am building kernel RPM for testing: --- drivers/firmware/efi/libstub/efi-stub-helper.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) --- a/drivers/firmware/efi/libstub/efi-stub-helper.c +++ b/drivers/firmware/efi/libstub/efi-stub-helper.c @@ -153,7 +153,7 @@ unsigned long get_dram_base(efi_system_t map.map_end = map.map + map_size; for_each_efi_memory_desc_in_map(&map, md) { - if (md->attribute & EFI_MEMORY_WB) { + if ((md->type == EFI_CONVENTIONAL_MEMORY) && (md->attribute & EFI_MEMORY_WB)) { if (membase > md->phys_addr) membase = md->phys_addr; }