diff options
Diffstat (limited to 'drivers/firmware/efi/arm-init.c')
-rw-r--r-- | drivers/firmware/efi/arm-init.c | 32 |
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 | ||
27 | u64 efi_system_table; | 27 | u64 efi_system_table; |
28 | 28 | ||
29 | static int __init is_normal_ram(efi_memory_desc_t *md) | 29 | static 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 | */ |
157 | static __init int is_reserve_region(efi_memory_desc_t *md) | 157 | static __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 | ||
173 | static __init void reserve_regions(void) | 178 | static __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 | ||