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 | |
| 39 | #if defined(CONFIG_EFI_LOADER) && !defined(CONFIG_SPL_BUILD) |
| 40 | void efi_add_known_memory(void) |
| 41 | { |
| 42 | struct e820_entry e820[E820MAX]; |
| 43 | unsigned int i, num; |
| 44 | u64 start, pages; |
| 45 | int type; |
| 46 | |
| 47 | num = install_e820_map(ARRAY_SIZE(e820), e820); |
| 48 | |
| 49 | for (i = 0; i < num; ++i) { |
| 50 | start = e820[i].addr; |
| 51 | pages = ALIGN(e820[i].size, EFI_PAGE_SIZE) >> EFI_PAGE_SHIFT; |
| 52 | |
| 53 | switch (e820[i].type) { |
| 54 | case E820_RAM: |
| 55 | type = EFI_CONVENTIONAL_MEMORY; |
| 56 | break; |
| 57 | case E820_RESERVED: |
| 58 | type = EFI_RESERVED_MEMORY_TYPE; |
| 59 | break; |
| 60 | case E820_ACPI: |
| 61 | type = EFI_ACPI_RECLAIM_MEMORY; |
| 62 | break; |
| 63 | case E820_NVS: |
| 64 | type = EFI_ACPI_MEMORY_NVS; |
| 65 | break; |
| 66 | case E820_UNUSABLE: |
| 67 | default: |
| 68 | type = EFI_UNUSABLE_MEMORY; |
| 69 | break; |
| 70 | } |
| 71 | |
| 72 | efi_add_memory_map(start, pages, type, false); |
| 73 | } |
| 74 | } |
| 75 | #endif /* defined(EFI_LOADER) && !defined(CONFIG_SPL_BUILD) */ |