aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/firmware/efi/arm-init.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/firmware/efi/arm-init.c')
-rw-r--r--drivers/firmware/efi/arm-init.c32
1 files changed, 17 insertions, 15 deletions
diff --git a/drivers/firmware/efi/arm-init.c b/drivers/firmware/efi/arm-init.c
index e0a511d4074f..8efe13075c92 100644
--- a/drivers/firmware/efi/arm-init.c
+++ b/drivers/firmware/efi/arm-init.c
@@ -26,9 +26,9 @@
26 26
27u64 efi_system_table; 27u64 efi_system_table;
28 28
29static int __init is_normal_ram(efi_memory_desc_t *md) 29static int __init is_memory(efi_memory_desc_t *md)
30{ 30{
31 if (md->attribute & EFI_MEMORY_WB) 31 if (md->attribute & (EFI_MEMORY_WB|EFI_MEMORY_WT|EFI_MEMORY_WC))
32 return 1; 32 return 1;
33 return 0; 33 return 0;
34} 34}
@@ -152,9 +152,9 @@ out:
152} 152}
153 153
154/* 154/*
155 * Return true for RAM regions we want to permanently reserve. 155 * Return true for regions that can be used as System RAM.
156 */ 156 */
157static __init int is_reserve_region(efi_memory_desc_t *md) 157static __init int is_usable_memory(efi_memory_desc_t *md)
158{ 158{
159 switch (md->type) { 159 switch (md->type) {
160 case EFI_LOADER_CODE: 160 case EFI_LOADER_CODE:
@@ -163,18 +163,22 @@ static __init int is_reserve_region(efi_memory_desc_t *md)
163 case EFI_BOOT_SERVICES_DATA: 163 case EFI_BOOT_SERVICES_DATA:
164 case EFI_CONVENTIONAL_MEMORY: 164 case EFI_CONVENTIONAL_MEMORY:
165 case EFI_PERSISTENT_MEMORY: 165 case EFI_PERSISTENT_MEMORY:
166 return 0; 166 /*
167 * According to the spec, these regions are no longer reserved
168 * after calling ExitBootServices(). However, we can only use
169 * them as System RAM if they can be mapped writeback cacheable.
170 */
171 return (md->attribute & EFI_MEMORY_WB);
167 default: 172 default:
168 break; 173 break;
169 } 174 }
170 return is_normal_ram(md); 175 return false;
171} 176}
172 177
173static __init void reserve_regions(void) 178static __init void reserve_regions(void)
174{ 179{
175 efi_memory_desc_t *md; 180 efi_memory_desc_t *md;
176 u64 paddr, npages, size; 181 u64 paddr, npages, size;
177 int resv;
178 182
179 if (efi_enabled(EFI_DBG)) 183 if (efi_enabled(EFI_DBG))
180 pr_info("Processing EFI memory map:\n"); 184 pr_info("Processing EFI memory map:\n");
@@ -191,25 +195,23 @@ static __init void reserve_regions(void)
191 paddr = md->phys_addr; 195 paddr = md->phys_addr;
192 npages = md->num_pages; 196 npages = md->num_pages;
193 197
194 resv = is_reserve_region(md);
195 if (efi_enabled(EFI_DBG)) { 198 if (efi_enabled(EFI_DBG)) {
196 char buf[64]; 199 char buf[64];
197 200
198 pr_info(" 0x%012llx-0x%012llx %s%s\n", 201 pr_info(" 0x%012llx-0x%012llx %s\n",
199 paddr, paddr + (npages << EFI_PAGE_SHIFT) - 1, 202 paddr, paddr + (npages << EFI_PAGE_SHIFT) - 1,
200 efi_md_typeattr_format(buf, sizeof(buf), md), 203 efi_md_typeattr_format(buf, sizeof(buf), md));
201 resv ? "*" : "");
202 } 204 }
203 205
204 memrange_efi_to_native(&paddr, &npages); 206 memrange_efi_to_native(&paddr, &npages);
205 size = npages << PAGE_SHIFT; 207 size = npages << PAGE_SHIFT;
206 208
207 if (is_normal_ram(md)) 209 if (is_memory(md)) {
208 early_init_dt_add_memory_arch(paddr, size); 210 early_init_dt_add_memory_arch(paddr, size);
209 211
210 if (resv) 212 if (!is_usable_memory(md))
211 memblock_mark_nomap(paddr, size); 213 memblock_mark_nomap(paddr, size);
212 214 }
213 } 215 }
214} 216}
215 217