Tom Rini | 83d290c | 2018-05-06 17:58:06 -0400 | [diff] [blame] | 1 | // SPDX-License-Identifier: GPL-2.0+ |
Bin Meng | 59ec719 | 2015-10-07 20:19:10 -0700 | [diff] [blame] | 2 | /* |
| 3 | * Copyright (C) 2015, Bin Meng <bmeng.cn@gmail.com> |
Bin Meng | 59ec719 | 2015-10-07 20:19:10 -0700 | [diff] [blame] | 4 | */ |
| 5 | |
| 6 | #include <common.h> |
Bin Meng | abe47ca | 2018-06-27 20:38:01 -0700 | [diff] [blame] | 7 | #include <efi_loader.h> |
Bin Meng | 59ec719 | 2015-10-07 20:19:10 -0700 | [diff] [blame] | 8 | #include <asm/e820.h> |
| 9 | |
| 10 | DECLARE_GLOBAL_DATA_PTR; |
| 11 | |
| 12 | /* |
| 13 | * Install a default e820 table with 4 entries as follows: |
| 14 | * |
| 15 | * 0x000000-0x0a0000 Useable RAM |
| 16 | * 0x0a0000-0x100000 Reserved for ISA |
| 17 | * 0x100000-gd->ram_size Useable RAM |
| 18 | * CONFIG_PCIE_ECAM_BASE PCIe ECAM |
| 19 | */ |
Bin Meng | 87af71c | 2018-04-11 22:02:10 -0700 | [diff] [blame] | 20 | __weak unsigned int install_e820_map(unsigned int max_entries, |
Bin Meng | 4551992 | 2018-04-11 22:02:11 -0700 | [diff] [blame] | 21 | struct e820_entry *entries) |
Bin Meng | 59ec719 | 2015-10-07 20:19:10 -0700 | [diff] [blame] | 22 | { |
| 23 | entries[0].addr = 0; |
| 24 | entries[0].size = ISA_START_ADDRESS; |
| 25 | entries[0].type = E820_RAM; |
| 26 | entries[1].addr = ISA_START_ADDRESS; |
| 27 | entries[1].size = ISA_END_ADDRESS - ISA_START_ADDRESS; |
| 28 | entries[1].type = E820_RESERVED; |
| 29 | entries[2].addr = ISA_END_ADDRESS; |
| 30 | entries[2].size = gd->ram_size - ISA_END_ADDRESS; |
| 31 | entries[2].type = E820_RAM; |
| 32 | entries[3].addr = CONFIG_PCIE_ECAM_BASE; |
| 33 | entries[3].size = CONFIG_PCIE_ECAM_SIZE; |
| 34 | entries[3].type = E820_RESERVED; |
| 35 | |
| 36 | return 4; |
| 37 | } |
Bin Meng | abe47ca | 2018-06-27 20:38:01 -0700 | [diff] [blame] | 38 | |
Stephen Warren | 9b5e639 | 2018-08-30 15:43:43 -0600 | [diff] [blame] | 39 | #if CONFIG_IS_ENABLED(EFI_LOADER) |
Bin Meng | abe47ca | 2018-06-27 20:38:01 -0700 | [diff] [blame] | 40 | void efi_add_known_memory(void) |
| 41 | { |
| 42 | struct e820_entry e820[E820MAX]; |
| 43 | unsigned int i, num; |
Park, Aiden | 5793553 | 2019-09-03 17:43:46 +0000 | [diff] [blame] | 44 | u64 start, pages, ram_top; |
Bin Meng | abe47ca | 2018-06-27 20:38:01 -0700 | [diff] [blame] | 45 | int type; |
| 46 | |
| 47 | num = install_e820_map(ARRAY_SIZE(e820), e820); |
| 48 | |
Park, Aiden | 5793553 | 2019-09-03 17:43:46 +0000 | [diff] [blame] | 49 | ram_top = (u64)gd->ram_top & ~EFI_PAGE_MASK; |
| 50 | if (!ram_top) |
| 51 | ram_top = 0x100000000ULL; |
| 52 | |
Bin Meng | abe47ca | 2018-06-27 20:38:01 -0700 | [diff] [blame] | 53 | for (i = 0; i < num; ++i) { |
| 54 | start = e820[i].addr; |
Bin Meng | abe47ca | 2018-06-27 20:38:01 -0700 | [diff] [blame] | 55 | |
| 56 | switch (e820[i].type) { |
| 57 | case E820_RAM: |
| 58 | type = EFI_CONVENTIONAL_MEMORY; |
| 59 | break; |
| 60 | case E820_RESERVED: |
| 61 | type = EFI_RESERVED_MEMORY_TYPE; |
| 62 | break; |
| 63 | case E820_ACPI: |
| 64 | type = EFI_ACPI_RECLAIM_MEMORY; |
| 65 | break; |
| 66 | case E820_NVS: |
| 67 | type = EFI_ACPI_MEMORY_NVS; |
| 68 | break; |
| 69 | case E820_UNUSABLE: |
| 70 | default: |
| 71 | type = EFI_UNUSABLE_MEMORY; |
| 72 | break; |
| 73 | } |
| 74 | |
Park, Aiden | 5793553 | 2019-09-03 17:43:46 +0000 | [diff] [blame] | 75 | if (type == EFI_CONVENTIONAL_MEMORY) { |
| 76 | efi_add_conventional_memory_map(start, |
| 77 | start + e820[i].size, |
| 78 | ram_top); |
| 79 | } else { |
| 80 | pages = ALIGN(e820[i].size, EFI_PAGE_SIZE) |
| 81 | >> EFI_PAGE_SHIFT; |
| 82 | efi_add_memory_map(start, pages, type, false); |
| 83 | } |
Bin Meng | abe47ca | 2018-06-27 20:38:01 -0700 | [diff] [blame] | 84 | } |
| 85 | } |
Stephen Warren | 9b5e639 | 2018-08-30 15:43:43 -0600 | [diff] [blame] | 86 | #endif /* CONFIG_IS_ENABLED(EFI_LOADER) */ |