diff options
Diffstat (limited to 'drivers/firmware/efi/memmap.c')
-rw-r--r-- | drivers/firmware/efi/memmap.c | 38 |
1 files changed, 38 insertions, 0 deletions
diff --git a/drivers/firmware/efi/memmap.c b/drivers/firmware/efi/memmap.c index f03ddecd232b..78686443cb37 100644 --- a/drivers/firmware/efi/memmap.c +++ b/drivers/firmware/efi/memmap.c | |||
@@ -9,6 +9,44 @@ | |||
9 | #include <linux/efi.h> | 9 | #include <linux/efi.h> |
10 | #include <linux/io.h> | 10 | #include <linux/io.h> |
11 | #include <asm/early_ioremap.h> | 11 | #include <asm/early_ioremap.h> |
12 | #include <linux/memblock.h> | ||
13 | #include <linux/slab.h> | ||
14 | |||
15 | static phys_addr_t __init __efi_memmap_alloc_early(unsigned long size) | ||
16 | { | ||
17 | return memblock_alloc(size, 0); | ||
18 | } | ||
19 | |||
20 | static phys_addr_t __init __efi_memmap_alloc_late(unsigned long size) | ||
21 | { | ||
22 | unsigned int order = get_order(size); | ||
23 | struct page *p = alloc_pages(GFP_KERNEL, order); | ||
24 | |||
25 | if (!p) | ||
26 | return 0; | ||
27 | |||
28 | return PFN_PHYS(page_to_pfn(p)); | ||
29 | } | ||
30 | |||
31 | /** | ||
32 | * efi_memmap_alloc - Allocate memory for the EFI memory map | ||
33 | * @num_entries: Number of entries in the allocated map. | ||
34 | * | ||
35 | * Depending on whether mm_init() has already been invoked or not, | ||
36 | * either memblock or "normal" page allocation is used. | ||
37 | * | ||
38 | * Returns the physical address of the allocated memory map on | ||
39 | * success, zero on failure. | ||
40 | */ | ||
41 | phys_addr_t __init efi_memmap_alloc(unsigned int num_entries) | ||
42 | { | ||
43 | unsigned long size = num_entries * efi.memmap.desc_size; | ||
44 | |||
45 | if (slab_is_available()) | ||
46 | return __efi_memmap_alloc_late(size); | ||
47 | |||
48 | return __efi_memmap_alloc_early(size); | ||
49 | } | ||
12 | 50 | ||
13 | /** | 51 | /** |
14 | * __efi_memmap_init - Common code for mapping the EFI memory map | 52 | * __efi_memmap_init - Common code for mapping the EFI memory map |