mirror of
https://xff.cz/git/u-boot/
synced 2025-09-01 08:42:12 +02:00
efi_loader: Change return type of efi_add_memory_map()
We currently have some inconsistent use of efi_add_memory_map() throughout the code. In particular the return value of efi_add_memory_map() is not interpreted the same way by various users in the codebase. This patch does the following: - Changes efi_add_memory_map() to return efi_status_t. - Adds a method description to efi_add_memory_map(). - Changes efi_add_memory_map() to return EFI_SUCCESS - Returns non-zero for error in efi_add_memory_map() - Updates efi_allocate_pages() to new efi_add_memory_map() - Updates efi_free_pages() to new efi_add_memory_map() - Updates efi_carve_out_dt_rsv() to new efi_add_memory_map() - Updates efi_add_runtime_mmio() to new efi_add_memory_map() Fixes:5d00995c36
("efi_loader: Implement memory allocation and map") Fixes:74c16acce3
("efi_loader: Don't allocate from memory holes") Suggested-by: Heinrich Schuchardt <xypron.glpk@gmx.de> Cc: Alexander Graf <agraf@csgraf.de> Signed-off-by: Bryan O'Donoghue <pure.logic@nexus-software.ie> Reviewed-by: Heinrich Schuchardt <xypron.glpk@gmx.de>
This commit is contained in:
committed by
Heinrich Schuchardt
parent
112464f325
commit
b225c92fd0
@@ -169,8 +169,8 @@ static void efi_carve_out_dt_rsv(void *fdt)
|
|||||||
|
|
||||||
pages = efi_size_in_pages(size + (addr & EFI_PAGE_MASK));
|
pages = efi_size_in_pages(size + (addr & EFI_PAGE_MASK));
|
||||||
addr &= ~EFI_PAGE_MASK;
|
addr &= ~EFI_PAGE_MASK;
|
||||||
if (!efi_add_memory_map(addr, pages, EFI_RESERVED_MEMORY_TYPE,
|
if (efi_add_memory_map(addr, pages, EFI_RESERVED_MEMORY_TYPE,
|
||||||
false))
|
false) != EFI_SUCCESS)
|
||||||
printf("FDT memrsv map %d: Failed to add to map\n", i);
|
printf("FDT memrsv map %d: Failed to add to map\n", i);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -476,8 +476,8 @@ efi_status_t efi_get_memory_map(efi_uintn_t *memory_map_size,
|
|||||||
efi_uintn_t *descriptor_size,
|
efi_uintn_t *descriptor_size,
|
||||||
uint32_t *descriptor_version);
|
uint32_t *descriptor_version);
|
||||||
/* Adds a range into the EFI memory map */
|
/* Adds a range into the EFI memory map */
|
||||||
uint64_t efi_add_memory_map(uint64_t start, uint64_t pages, int memory_type,
|
efi_status_t efi_add_memory_map(uint64_t start, uint64_t pages, int memory_type,
|
||||||
bool overlap_only_ram);
|
bool overlap_only_ram);
|
||||||
/* Called by board init to initialize the EFI drivers */
|
/* Called by board init to initialize the EFI drivers */
|
||||||
efi_status_t efi_driver_init(void);
|
efi_status_t efi_driver_init(void);
|
||||||
/* Called by board init to initialize the EFI memory map */
|
/* Called by board init to initialize the EFI memory map */
|
||||||
|
@@ -223,8 +223,17 @@ static s64 efi_mem_carve_out(struct efi_mem_list *map,
|
|||||||
return EFI_CARVE_LOOP_AGAIN;
|
return EFI_CARVE_LOOP_AGAIN;
|
||||||
}
|
}
|
||||||
|
|
||||||
uint64_t efi_add_memory_map(uint64_t start, uint64_t pages, int memory_type,
|
/**
|
||||||
bool overlap_only_ram)
|
* efi_add_memory_map() - add memory area to the memory map
|
||||||
|
*
|
||||||
|
* @start: start address, must be a multiple of EFI_PAGE_SIZE
|
||||||
|
* @pages: number of pages to add
|
||||||
|
* @memory_type: type of memory added
|
||||||
|
* @overlap_only_ram: the memory area must overlap existing
|
||||||
|
* Return: status code
|
||||||
|
*/
|
||||||
|
efi_status_t efi_add_memory_map(uint64_t start, uint64_t pages, int memory_type,
|
||||||
|
bool overlap_only_ram)
|
||||||
{
|
{
|
||||||
struct list_head *lhandle;
|
struct list_head *lhandle;
|
||||||
struct efi_mem_list *newlist;
|
struct efi_mem_list *newlist;
|
||||||
@@ -239,7 +248,7 @@ uint64_t efi_add_memory_map(uint64_t start, uint64_t pages, int memory_type,
|
|||||||
return EFI_INVALID_PARAMETER;
|
return EFI_INVALID_PARAMETER;
|
||||||
|
|
||||||
if (!pages)
|
if (!pages)
|
||||||
return start;
|
return EFI_SUCCESS;
|
||||||
|
|
||||||
++efi_memory_map_key;
|
++efi_memory_map_key;
|
||||||
newlist = calloc(1, sizeof(*newlist));
|
newlist = calloc(1, sizeof(*newlist));
|
||||||
@@ -277,7 +286,7 @@ uint64_t efi_add_memory_map(uint64_t start, uint64_t pages, int memory_type,
|
|||||||
* The user requested to only have RAM overlaps,
|
* The user requested to only have RAM overlaps,
|
||||||
* but we hit a non-RAM region. Error out.
|
* but we hit a non-RAM region. Error out.
|
||||||
*/
|
*/
|
||||||
return 0;
|
return EFI_NO_MAPPING;
|
||||||
case EFI_CARVE_NO_OVERLAP:
|
case EFI_CARVE_NO_OVERLAP:
|
||||||
/* Just ignore this list entry */
|
/* Just ignore this list entry */
|
||||||
break;
|
break;
|
||||||
@@ -307,7 +316,7 @@ uint64_t efi_add_memory_map(uint64_t start, uint64_t pages, int memory_type,
|
|||||||
* The payload wanted to have RAM overlaps, but we overlapped
|
* The payload wanted to have RAM overlaps, but we overlapped
|
||||||
* with an unallocated region. Error out.
|
* with an unallocated region. Error out.
|
||||||
*/
|
*/
|
||||||
return 0;
|
return EFI_NO_MAPPING;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Add our new map */
|
/* Add our new map */
|
||||||
@@ -326,7 +335,7 @@ uint64_t efi_add_memory_map(uint64_t start, uint64_t pages, int memory_type,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return start;
|
return EFI_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -455,7 +464,7 @@ efi_status_t efi_allocate_pages(int type, int memory_type,
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* Reserve that map in our memory maps */
|
/* Reserve that map in our memory maps */
|
||||||
if (efi_add_memory_map(addr, pages, memory_type, true) != addr)
|
if (efi_add_memory_map(addr, pages, memory_type, true) != EFI_SUCCESS)
|
||||||
/* Map would overlap, bail out */
|
/* Map would overlap, bail out */
|
||||||
return EFI_OUT_OF_RESOURCES;
|
return EFI_OUT_OF_RESOURCES;
|
||||||
|
|
||||||
@@ -487,7 +496,6 @@ void *efi_alloc(uint64_t len, int memory_type)
|
|||||||
*/
|
*/
|
||||||
efi_status_t efi_free_pages(uint64_t memory, efi_uintn_t pages)
|
efi_status_t efi_free_pages(uint64_t memory, efi_uintn_t pages)
|
||||||
{
|
{
|
||||||
uint64_t r = 0;
|
|
||||||
efi_status_t ret;
|
efi_status_t ret;
|
||||||
|
|
||||||
ret = efi_check_allocated(memory, true);
|
ret = efi_check_allocated(memory, true);
|
||||||
@@ -501,13 +509,13 @@ efi_status_t efi_free_pages(uint64_t memory, efi_uintn_t pages)
|
|||||||
return EFI_INVALID_PARAMETER;
|
return EFI_INVALID_PARAMETER;
|
||||||
}
|
}
|
||||||
|
|
||||||
r = efi_add_memory_map(memory, pages, EFI_CONVENTIONAL_MEMORY, false);
|
ret = efi_add_memory_map(memory, pages, EFI_CONVENTIONAL_MEMORY, false);
|
||||||
/* Merging of adjacent free regions is missing */
|
/* Merging of adjacent free regions is missing */
|
||||||
|
|
||||||
if (r == memory)
|
if (ret != EFI_SUCCESS)
|
||||||
return EFI_SUCCESS;
|
return EFI_NOT_FOUND;
|
||||||
|
|
||||||
return EFI_NOT_FOUND;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@@ -694,10 +694,10 @@ efi_status_t efi_add_runtime_mmio(void *mmio_ptr, u64 len)
|
|||||||
struct efi_runtime_mmio_list *newmmio;
|
struct efi_runtime_mmio_list *newmmio;
|
||||||
u64 pages = (len + EFI_PAGE_MASK) >> EFI_PAGE_SHIFT;
|
u64 pages = (len + EFI_PAGE_MASK) >> EFI_PAGE_SHIFT;
|
||||||
uint64_t addr = *(uintptr_t *)mmio_ptr;
|
uint64_t addr = *(uintptr_t *)mmio_ptr;
|
||||||
uint64_t retaddr;
|
efi_status_t ret;
|
||||||
|
|
||||||
retaddr = efi_add_memory_map(addr, pages, EFI_MMAP_IO, false);
|
ret = efi_add_memory_map(addr, pages, EFI_MMAP_IO, false);
|
||||||
if (retaddr != addr)
|
if (ret != EFI_SUCCESS)
|
||||||
return EFI_OUT_OF_RESOURCES;
|
return EFI_OUT_OF_RESOURCES;
|
||||||
|
|
||||||
newmmio = calloc(1, sizeof(*newmmio));
|
newmmio = calloc(1, sizeof(*newmmio));
|
||||||
|
Reference in New Issue
Block a user