mirror of
https://github.com/brain-hackers/u-boot-brain
synced 2024-09-27 23:20:26 +09: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:
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));
|
||||
addr &= ~EFI_PAGE_MASK;
|
||||
if (!efi_add_memory_map(addr, pages, EFI_RESERVED_MEMORY_TYPE,
|
||||
false))
|
||||
if (efi_add_memory_map(addr, pages, EFI_RESERVED_MEMORY_TYPE,
|
||||
false) != EFI_SUCCESS)
|
||||
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,
|
||||
uint32_t *descriptor_version);
|
||||
/* Adds a range into the EFI memory map */
|
||||
uint64_t efi_add_memory_map(uint64_t start, uint64_t pages, int memory_type,
|
||||
bool overlap_only_ram);
|
||||
efi_status_t efi_add_memory_map(uint64_t start, uint64_t pages, int memory_type,
|
||||
bool overlap_only_ram);
|
||||
/* Called by board init to initialize the EFI drivers */
|
||||
efi_status_t efi_driver_init(void);
|
||||
/* 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;
|
||||
}
|
||||
|
||||
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 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;
|
||||
|
||||
if (!pages)
|
||||
return start;
|
||||
return EFI_SUCCESS;
|
||||
|
||||
++efi_memory_map_key;
|
||||
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,
|
||||
* but we hit a non-RAM region. Error out.
|
||||
*/
|
||||
return 0;
|
||||
return EFI_NO_MAPPING;
|
||||
case EFI_CARVE_NO_OVERLAP:
|
||||
/* Just ignore this list entry */
|
||||
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
|
||||
* with an unallocated region. Error out.
|
||||
*/
|
||||
return 0;
|
||||
return EFI_NO_MAPPING;
|
||||
}
|
||||
|
||||
/* 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 */
|
||||
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 */
|
||||
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)
|
||||
{
|
||||
uint64_t r = 0;
|
||||
efi_status_t ret;
|
||||
|
||||
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;
|
||||
}
|
||||
|
||||
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 */
|
||||
|
||||
if (r == memory)
|
||||
return EFI_SUCCESS;
|
||||
if (ret != 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;
|
||||
u64 pages = (len + EFI_PAGE_MASK) >> EFI_PAGE_SHIFT;
|
||||
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);
|
||||
if (retaddr != addr)
|
||||
ret = efi_add_memory_map(addr, pages, EFI_MMAP_IO, false);
|
||||
if (ret != EFI_SUCCESS)
|
||||
return EFI_OUT_OF_RESOURCES;
|
||||
|
||||
newmmio = calloc(1, sizeof(*newmmio));
|
||||
|
Loading…
Reference in New Issue
Block a user