mirror of
https://github.com/u-boot/u-boot.git
synced 2025-04-22 12:54:37 +00:00
efi_loader: consider no-map property of reserved memory
The device tree may contain a /reserved-memory node. The no-map property of the sub-nodes signals if the memory may be accessed by the UEFI payload or not. In the EBBR specification (https://github.com/arm-software/ebbr) the modeling of the reserved memory has been clarified. If a reserved memory node in the device tree has the no-map property map, create a EfiReservedMemoryType memory map entry else use EfiBootServicesData. Signed-off-by: Heinrich Schuchardt <xypron.glpk@gmx.de>
This commit is contained in:
parent
4b71f6dc4e
commit
4cbb2930bd
1 changed files with 28 additions and 6 deletions
|
@ -135,12 +135,29 @@ done:
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void efi_reserve_memory(u64 addr, u64 size)
|
/**
|
||||||
|
* efi_reserve_memory() - add reserved memory to memory map
|
||||||
|
*
|
||||||
|
* @addr: start address of the reserved memory range
|
||||||
|
* @size: size of the reserved memory range
|
||||||
|
* @nomap: indicates that the memory range shall not be accessed by the
|
||||||
|
* UEFI payload
|
||||||
|
*/
|
||||||
|
static void efi_reserve_memory(u64 addr, u64 size, bool nomap)
|
||||||
{
|
{
|
||||||
|
int type;
|
||||||
|
efi_uintn_t ret;
|
||||||
|
|
||||||
/* Convert from sandbox address space. */
|
/* Convert from sandbox address space. */
|
||||||
addr = (uintptr_t)map_sysmem(addr, 0);
|
addr = (uintptr_t)map_sysmem(addr, 0);
|
||||||
if (efi_add_memory_map(addr, size,
|
|
||||||
EFI_RESERVED_MEMORY_TYPE) != EFI_SUCCESS)
|
if (nomap)
|
||||||
|
type = EFI_RESERVED_MEMORY_TYPE;
|
||||||
|
else
|
||||||
|
type = EFI_BOOT_SERVICES_DATA;
|
||||||
|
|
||||||
|
ret = efi_add_memory_map(addr, size, type);
|
||||||
|
if (ret != EFI_SUCCESS)
|
||||||
log_err("Reserved memory mapping failed addr %llx size %llx\n",
|
log_err("Reserved memory mapping failed addr %llx size %llx\n",
|
||||||
addr, size);
|
addr, size);
|
||||||
}
|
}
|
||||||
|
@ -166,7 +183,7 @@ static void efi_carve_out_dt_rsv(void *fdt)
|
||||||
for (i = 0; i < nr_rsv; i++) {
|
for (i = 0; i < nr_rsv; i++) {
|
||||||
if (fdt_get_mem_rsv(fdt, i, &addr, &size) != 0)
|
if (fdt_get_mem_rsv(fdt, i, &addr, &size) != 0)
|
||||||
continue;
|
continue;
|
||||||
efi_reserve_memory(addr, size);
|
efi_reserve_memory(addr, size, false);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* process reserved-memory */
|
/* process reserved-memory */
|
||||||
|
@ -186,8 +203,13 @@ static void efi_carve_out_dt_rsv(void *fdt)
|
||||||
* a size instead of a reg property.
|
* a size instead of a reg property.
|
||||||
*/
|
*/
|
||||||
if (fdt_addr != FDT_ADDR_T_NONE &&
|
if (fdt_addr != FDT_ADDR_T_NONE &&
|
||||||
fdtdec_get_is_enabled(fdt, subnode))
|
fdtdec_get_is_enabled(fdt, subnode)) {
|
||||||
efi_reserve_memory(fdt_addr, fdt_size);
|
bool nomap;
|
||||||
|
|
||||||
|
nomap = !!fdt_getprop(fdt, subnode, "no-map",
|
||||||
|
NULL);
|
||||||
|
efi_reserve_memory(fdt_addr, fdt_size, nomap);
|
||||||
|
}
|
||||||
subnode = fdt_next_subnode(fdt, subnode);
|
subnode = fdt_next_subnode(fdt, subnode);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Reference in a new issue