|
@@ -32,6 +32,15 @@
|
|
|
|
|
|
static unsigned long __chunk_size = EFI_READ_CHUNK_SIZE;
|
|
|
|
|
|
+/*
|
|
|
+ * Allow the platform to override the allocation granularity: this allows
|
|
|
+ * systems that have the capability to run with a larger page size to deal
|
|
|
+ * with the allocations for initrd and fdt more efficiently.
|
|
|
+ */
|
|
|
+#ifndef EFI_ALLOC_ALIGN
|
|
|
+#define EFI_ALLOC_ALIGN EFI_PAGE_SIZE
|
|
|
+#endif
|
|
|
+
|
|
|
struct file_info {
|
|
|
efi_file_handle_t *handle;
|
|
|
u64 size;
|
|
@@ -150,10 +159,10 @@ efi_status_t efi_high_alloc(efi_system_table_t *sys_table_arg,
|
|
|
* a specific address. We are doing page-based allocations,
|
|
|
* so we must be aligned to a page.
|
|
|
*/
|
|
|
- if (align < EFI_PAGE_SIZE)
|
|
|
- align = EFI_PAGE_SIZE;
|
|
|
+ if (align < EFI_ALLOC_ALIGN)
|
|
|
+ align = EFI_ALLOC_ALIGN;
|
|
|
|
|
|
- nr_pages = round_up(size, EFI_PAGE_SIZE) / EFI_PAGE_SIZE;
|
|
|
+ nr_pages = round_up(size, EFI_ALLOC_ALIGN) / EFI_PAGE_SIZE;
|
|
|
again:
|
|
|
for (i = 0; i < map_size / desc_size; i++) {
|
|
|
efi_memory_desc_t *desc;
|
|
@@ -235,10 +244,10 @@ efi_status_t efi_low_alloc(efi_system_table_t *sys_table_arg,
|
|
|
* a specific address. We are doing page-based allocations,
|
|
|
* so we must be aligned to a page.
|
|
|
*/
|
|
|
- if (align < EFI_PAGE_SIZE)
|
|
|
- align = EFI_PAGE_SIZE;
|
|
|
+ if (align < EFI_ALLOC_ALIGN)
|
|
|
+ align = EFI_ALLOC_ALIGN;
|
|
|
|
|
|
- nr_pages = round_up(size, EFI_PAGE_SIZE) / EFI_PAGE_SIZE;
|
|
|
+ nr_pages = round_up(size, EFI_ALLOC_ALIGN) / EFI_PAGE_SIZE;
|
|
|
for (i = 0; i < map_size / desc_size; i++) {
|
|
|
efi_memory_desc_t *desc;
|
|
|
unsigned long m = (unsigned long)map;
|
|
@@ -292,7 +301,7 @@ void efi_free(efi_system_table_t *sys_table_arg, unsigned long size,
|
|
|
if (!size)
|
|
|
return;
|
|
|
|
|
|
- nr_pages = round_up(size, EFI_PAGE_SIZE) / EFI_PAGE_SIZE;
|
|
|
+ nr_pages = round_up(size, EFI_ALLOC_ALIGN) / EFI_PAGE_SIZE;
|
|
|
efi_call_early(free_pages, addr, nr_pages);
|
|
|
}
|
|
|
|
|
@@ -561,7 +570,7 @@ efi_status_t efi_relocate_kernel(efi_system_table_t *sys_table_arg,
|
|
|
* to the preferred address. If that fails, allocate as low
|
|
|
* as possible while respecting the required alignment.
|
|
|
*/
|
|
|
- nr_pages = round_up(alloc_size, EFI_PAGE_SIZE) / EFI_PAGE_SIZE;
|
|
|
+ nr_pages = round_up(alloc_size, EFI_ALLOC_ALIGN) / EFI_PAGE_SIZE;
|
|
|
status = efi_call_early(allocate_pages,
|
|
|
EFI_ALLOCATE_ADDRESS, EFI_LOADER_DATA,
|
|
|
nr_pages, &efi_addr);
|