1 // SPDX-License-Identifier: GPL-2.0+ 2 /* 3 * EFI application memory management 4 * 5 * Copyright (c) 2016 Alexander Graf 6 */ 7 8 #include <common.h> 9 #include <efi_loader.h> 10 #include <inttypes.h> 11 #include <malloc.h> 12 #include <watchdog.h> 13 #include <linux/list_sort.h> 14 15 DECLARE_GLOBAL_DATA_PTR; 16 17 struct efi_mem_list { 18 struct list_head link; 19 struct efi_mem_desc desc; 20 }; 21 22 #define EFI_CARVE_NO_OVERLAP -1 23 #define EFI_CARVE_LOOP_AGAIN -2 24 #define EFI_CARVE_OVERLAPS_NONRAM -3 25 26 /* This list contains all memory map items */ 27 LIST_HEAD(efi_mem); 28 29 #ifdef CONFIG_EFI_LOADER_BOUNCE_BUFFER 30 void *efi_bounce_buffer; 31 #endif 32 33 /* 34 * U-Boot services each EFI AllocatePool request as a separate 35 * (multiple) page allocation. We have to track the number of pages 36 * to be able to free the correct amount later. 37 * EFI requires 8 byte alignment for pool allocations, so we can 38 * prepend each allocation with an 64 bit header tracking the 39 * allocation size, and hand out the remainder to the caller. 40 */ 41 struct efi_pool_allocation { 42 u64 num_pages; 43 char data[] __aligned(ARCH_DMA_MINALIGN); 44 }; 45 46 /* 47 * Sorts the memory list from highest address to lowest address 48 * 49 * When allocating memory we should always start from the highest 50 * address chunk, so sort the memory list such that the first list 51 * iterator gets the highest address and goes lower from there. 52 */ 53 static int efi_mem_cmp(void *priv, struct list_head *a, struct list_head *b) 54 { 55 struct efi_mem_list *mema = list_entry(a, struct efi_mem_list, link); 56 struct efi_mem_list *memb = list_entry(b, struct efi_mem_list, link); 57 58 if (mema->desc.physical_start == memb->desc.physical_start) 59 return 0; 60 else if (mema->desc.physical_start < memb->desc.physical_start) 61 return 1; 62 else 63 return -1; 64 } 65 66 static void efi_mem_sort(void) 67 { 68 list_sort(NULL, &efi_mem, efi_mem_cmp); 69 } 70 71 /** efi_mem_carve_out - unmap memory region 72 * 73 * @map: memory map 74 * @carve_desc: memory region to unmap 75 * @overlap_only_ram: the carved out region may only overlap RAM 76 * Return Value: the number of overlapping pages which have been 77 * removed from the map, 78 * EFI_CARVE_NO_OVERLAP, if the regions don't overlap, 79 * EFI_CARVE_OVERLAPS_NONRAM, if the carve and map overlap, 80 * and the map contains anything but free ram 81 * (only when overlap_only_ram is true), 82 * EFI_CARVE_LOOP_AGAIN, if the mapping list should be 83 * traversed again, as it has been altered. 84 * 85 * Unmaps all memory occupied by the carve_desc region from the list entry 86 * pointed to by map. 87 * 88 * In case of EFI_CARVE_OVERLAPS_NONRAM it is the callers responsibility 89 * to re-add the already carved out pages to the mapping. 90 */ 91 static s64 efi_mem_carve_out(struct efi_mem_list *map, 92 struct efi_mem_desc *carve_desc, 93 bool overlap_only_ram) 94 { 95 struct efi_mem_list *newmap; 96 struct efi_mem_desc *map_desc = &map->desc; 97 uint64_t map_start = map_desc->physical_start; 98 uint64_t map_end = map_start + (map_desc->num_pages << EFI_PAGE_SHIFT); 99 uint64_t carve_start = carve_desc->physical_start; 100 uint64_t carve_end = carve_start + 101 (carve_desc->num_pages << EFI_PAGE_SHIFT); 102 103 /* check whether we're overlapping */ 104 if ((carve_end <= map_start) || (carve_start >= map_end)) 105 return EFI_CARVE_NO_OVERLAP; 106 107 /* We're overlapping with non-RAM, warn the caller if desired */ 108 if (overlap_only_ram && (map_desc->type != EFI_CONVENTIONAL_MEMORY)) 109 return EFI_CARVE_OVERLAPS_NONRAM; 110 111 /* Sanitize carve_start and carve_end to lie within our bounds */ 112 carve_start = max(carve_start, map_start); 113 carve_end = min(carve_end, map_end); 114 115 /* Carving at the beginning of our map? Just move it! */ 116 if (carve_start == map_start) { 117 if (map_end == carve_end) { 118 /* Full overlap, just remove map */ 119 list_del(&map->link); 120 free(map); 121 } else { 122 map->desc.physical_start = carve_end; 123 map->desc.num_pages = (map_end - carve_end) 124 >> EFI_PAGE_SHIFT; 125 } 126 127 return (carve_end - carve_start) >> EFI_PAGE_SHIFT; 128 } 129 130 /* 131 * Overlapping maps, just split the list map at carve_start, 132 * it will get moved or removed in the next iteration. 133 * 134 * [ map_desc |__carve_start__| newmap ] 135 */ 136 137 /* Create a new map from [ carve_start ... map_end ] */ 138 newmap = calloc(1, sizeof(*newmap)); 139 newmap->desc = map->desc; 140 newmap->desc.physical_start = carve_start; 141 newmap->desc.num_pages = (map_end - carve_start) >> EFI_PAGE_SHIFT; 142 /* Insert before current entry (descending address order) */ 143 list_add_tail(&newmap->link, &map->link); 144 145 /* Shrink the map to [ map_start ... carve_start ] */ 146 map_desc->num_pages = (carve_start - map_start) >> EFI_PAGE_SHIFT; 147 148 return EFI_CARVE_LOOP_AGAIN; 149 } 150 151 uint64_t efi_add_memory_map(uint64_t start, uint64_t pages, int memory_type, 152 bool overlap_only_ram) 153 { 154 struct list_head *lhandle; 155 struct efi_mem_list *newlist; 156 bool carve_again; 157 uint64_t carved_pages = 0; 158 159 debug("%s: 0x%" PRIx64 " 0x%" PRIx64 " %d %s\n", __func__, 160 start, pages, memory_type, overlap_only_ram ? "yes" : "no"); 161 162 if (!pages) 163 return start; 164 165 newlist = calloc(1, sizeof(*newlist)); 166 newlist->desc.type = memory_type; 167 newlist->desc.physical_start = start; 168 newlist->desc.virtual_start = start; 169 newlist->desc.num_pages = pages; 170 171 switch (memory_type) { 172 case EFI_RUNTIME_SERVICES_CODE: 173 case EFI_RUNTIME_SERVICES_DATA: 174 newlist->desc.attribute = (1 << EFI_MEMORY_WB_SHIFT) | 175 (1ULL << EFI_MEMORY_RUNTIME_SHIFT); 176 break; 177 case EFI_MMAP_IO: 178 newlist->desc.attribute = 1ULL << EFI_MEMORY_RUNTIME_SHIFT; 179 break; 180 default: 181 newlist->desc.attribute = 1 << EFI_MEMORY_WB_SHIFT; 182 break; 183 } 184 185 /* Add our new map */ 186 do { 187 carve_again = false; 188 list_for_each(lhandle, &efi_mem) { 189 struct efi_mem_list *lmem; 190 s64 r; 191 192 lmem = list_entry(lhandle, struct efi_mem_list, link); 193 r = efi_mem_carve_out(lmem, &newlist->desc, 194 overlap_only_ram); 195 switch (r) { 196 case EFI_CARVE_OVERLAPS_NONRAM: 197 /* 198 * The user requested to only have RAM overlaps, 199 * but we hit a non-RAM region. Error out. 200 */ 201 return 0; 202 case EFI_CARVE_NO_OVERLAP: 203 /* Just ignore this list entry */ 204 break; 205 case EFI_CARVE_LOOP_AGAIN: 206 /* 207 * We split an entry, but need to loop through 208 * the list again to actually carve it. 209 */ 210 carve_again = true; 211 break; 212 default: 213 /* We carved a number of pages */ 214 carved_pages += r; 215 carve_again = true; 216 break; 217 } 218 219 if (carve_again) { 220 /* The list changed, we need to start over */ 221 break; 222 } 223 } 224 } while (carve_again); 225 226 if (overlap_only_ram && (carved_pages != pages)) { 227 /* 228 * The payload wanted to have RAM overlaps, but we overlapped 229 * with an unallocated region. Error out. 230 */ 231 return 0; 232 } 233 234 /* Add our new map */ 235 list_add_tail(&newlist->link, &efi_mem); 236 237 /* And make sure memory is listed in descending order */ 238 efi_mem_sort(); 239 240 return start; 241 } 242 243 static uint64_t efi_find_free_memory(uint64_t len, uint64_t max_addr) 244 { 245 struct list_head *lhandle; 246 247 list_for_each(lhandle, &efi_mem) { 248 struct efi_mem_list *lmem = list_entry(lhandle, 249 struct efi_mem_list, link); 250 struct efi_mem_desc *desc = &lmem->desc; 251 uint64_t desc_len = desc->num_pages << EFI_PAGE_SHIFT; 252 uint64_t desc_end = desc->physical_start + desc_len; 253 uint64_t curmax = min(max_addr, desc_end); 254 uint64_t ret = curmax - len; 255 256 /* We only take memory from free RAM */ 257 if (desc->type != EFI_CONVENTIONAL_MEMORY) 258 continue; 259 260 /* Out of bounds for max_addr */ 261 if ((ret + len) > max_addr) 262 continue; 263 264 /* Out of bounds for upper map limit */ 265 if ((ret + len) > desc_end) 266 continue; 267 268 /* Out of bounds for lower map limit */ 269 if (ret < desc->physical_start) 270 continue; 271 272 /* Return the highest address in this map within bounds */ 273 return ret; 274 } 275 276 return 0; 277 } 278 279 /* 280 * Allocate memory pages. 281 * 282 * @type type of allocation to be performed 283 * @memory_type usage type of the allocated memory 284 * @pages number of pages to be allocated 285 * @memory allocated memory 286 * @return status code 287 */ 288 efi_status_t efi_allocate_pages(int type, int memory_type, 289 efi_uintn_t pages, uint64_t *memory) 290 { 291 u64 len = pages << EFI_PAGE_SHIFT; 292 efi_status_t r = EFI_SUCCESS; 293 uint64_t addr; 294 295 switch (type) { 296 case EFI_ALLOCATE_ANY_PAGES: 297 /* Any page */ 298 addr = efi_find_free_memory(len, gd->start_addr_sp); 299 if (!addr) { 300 r = EFI_NOT_FOUND; 301 break; 302 } 303 break; 304 case EFI_ALLOCATE_MAX_ADDRESS: 305 /* Max address */ 306 addr = efi_find_free_memory(len, *memory); 307 if (!addr) { 308 r = EFI_NOT_FOUND; 309 break; 310 } 311 break; 312 case EFI_ALLOCATE_ADDRESS: 313 /* Exact address, reserve it. The addr is already in *memory. */ 314 addr = *memory; 315 break; 316 default: 317 /* UEFI doesn't specify other allocation types */ 318 r = EFI_INVALID_PARAMETER; 319 break; 320 } 321 322 if (r == EFI_SUCCESS) { 323 uint64_t ret; 324 325 /* Reserve that map in our memory maps */ 326 ret = efi_add_memory_map(addr, pages, memory_type, true); 327 if (ret == addr) { 328 *memory = addr; 329 } else { 330 /* Map would overlap, bail out */ 331 r = EFI_OUT_OF_RESOURCES; 332 } 333 } 334 335 return r; 336 } 337 338 void *efi_alloc(uint64_t len, int memory_type) 339 { 340 uint64_t ret = 0; 341 uint64_t pages = (len + EFI_PAGE_MASK) >> EFI_PAGE_SHIFT; 342 efi_status_t r; 343 344 r = efi_allocate_pages(EFI_ALLOCATE_ANY_PAGES, memory_type, pages, 345 &ret); 346 if (r == EFI_SUCCESS) 347 return (void*)(uintptr_t)ret; 348 349 return NULL; 350 } 351 352 /* 353 * Free memory pages. 354 * 355 * @memory start of the memory area to be freed 356 * @pages number of pages to be freed 357 * @return status code 358 */ 359 efi_status_t efi_free_pages(uint64_t memory, efi_uintn_t pages) 360 { 361 uint64_t r = 0; 362 363 r = efi_add_memory_map(memory, pages, EFI_CONVENTIONAL_MEMORY, false); 364 /* Merging of adjacent free regions is missing */ 365 366 if (r == memory) 367 return EFI_SUCCESS; 368 369 return EFI_NOT_FOUND; 370 } 371 372 /* 373 * Allocate memory from pool. 374 * 375 * @pool_type type of the pool from which memory is to be allocated 376 * @size number of bytes to be allocated 377 * @buffer allocated memory 378 * @return status code 379 */ 380 efi_status_t efi_allocate_pool(int pool_type, efi_uintn_t size, void **buffer) 381 { 382 efi_status_t r; 383 efi_physical_addr_t t; 384 u64 num_pages = (size + sizeof(struct efi_pool_allocation) + 385 EFI_PAGE_MASK) >> EFI_PAGE_SHIFT; 386 387 if (size == 0) { 388 *buffer = NULL; 389 return EFI_SUCCESS; 390 } 391 392 r = efi_allocate_pages(EFI_ALLOCATE_ANY_PAGES, pool_type, num_pages, 393 &t); 394 395 if (r == EFI_SUCCESS) { 396 struct efi_pool_allocation *alloc = (void *)(uintptr_t)t; 397 alloc->num_pages = num_pages; 398 *buffer = alloc->data; 399 } 400 401 return r; 402 } 403 404 /* 405 * Free memory from pool. 406 * 407 * @buffer start of memory to be freed 408 * @return status code 409 */ 410 efi_status_t efi_free_pool(void *buffer) 411 { 412 efi_status_t r; 413 struct efi_pool_allocation *alloc; 414 415 if (buffer == NULL) 416 return EFI_INVALID_PARAMETER; 417 418 alloc = container_of(buffer, struct efi_pool_allocation, data); 419 /* Sanity check, was the supplied address returned by allocate_pool */ 420 assert(((uintptr_t)alloc & EFI_PAGE_MASK) == 0); 421 422 r = efi_free_pages((uintptr_t)alloc, alloc->num_pages); 423 424 return r; 425 } 426 427 /* 428 * Get map describing memory usage. 429 * 430 * @memory_map_size on entry the size, in bytes, of the memory map buffer, 431 * on exit the size of the copied memory map 432 * @memory_map buffer to which the memory map is written 433 * @map_key key for the memory map 434 * @descriptor_size size of an individual memory descriptor 435 * @descriptor_version version number of the memory descriptor structure 436 * @return status code 437 */ 438 efi_status_t efi_get_memory_map(efi_uintn_t *memory_map_size, 439 struct efi_mem_desc *memory_map, 440 efi_uintn_t *map_key, 441 efi_uintn_t *descriptor_size, 442 uint32_t *descriptor_version) 443 { 444 efi_uintn_t map_size = 0; 445 int map_entries = 0; 446 struct list_head *lhandle; 447 efi_uintn_t provided_map_size = *memory_map_size; 448 449 list_for_each(lhandle, &efi_mem) 450 map_entries++; 451 452 map_size = map_entries * sizeof(struct efi_mem_desc); 453 454 *memory_map_size = map_size; 455 456 if (provided_map_size < map_size) 457 return EFI_BUFFER_TOO_SMALL; 458 459 if (descriptor_size) 460 *descriptor_size = sizeof(struct efi_mem_desc); 461 462 if (descriptor_version) 463 *descriptor_version = EFI_MEMORY_DESCRIPTOR_VERSION; 464 465 /* Copy list into array */ 466 if (memory_map) { 467 /* Return the list in ascending order */ 468 memory_map = &memory_map[map_entries - 1]; 469 list_for_each(lhandle, &efi_mem) { 470 struct efi_mem_list *lmem; 471 472 lmem = list_entry(lhandle, struct efi_mem_list, link); 473 *memory_map = lmem->desc; 474 memory_map--; 475 } 476 } 477 478 *map_key = 0; 479 480 return EFI_SUCCESS; 481 } 482 483 __weak void efi_add_known_memory(void) 484 { 485 int i; 486 487 /* Add RAM */ 488 for (i = 0; i < CONFIG_NR_DRAM_BANKS; i++) { 489 u64 ram_start = gd->bd->bi_dram[i].start; 490 u64 ram_size = gd->bd->bi_dram[i].size; 491 u64 start = (ram_start + EFI_PAGE_MASK) & ~EFI_PAGE_MASK; 492 u64 pages = (ram_size + EFI_PAGE_MASK) >> EFI_PAGE_SHIFT; 493 494 efi_add_memory_map(start, pages, EFI_CONVENTIONAL_MEMORY, 495 false); 496 } 497 } 498 499 int efi_memory_init(void) 500 { 501 unsigned long runtime_start, runtime_end, runtime_pages; 502 unsigned long uboot_start, uboot_pages; 503 unsigned long uboot_stack_size = 16 * 1024 * 1024; 504 505 efi_add_known_memory(); 506 507 /* Add U-Boot */ 508 uboot_start = (gd->start_addr_sp - uboot_stack_size) & ~EFI_PAGE_MASK; 509 uboot_pages = (gd->ram_top - uboot_start) >> EFI_PAGE_SHIFT; 510 efi_add_memory_map(uboot_start, uboot_pages, EFI_LOADER_DATA, false); 511 512 /* Add Runtime Services */ 513 runtime_start = (ulong)&__efi_runtime_start & ~EFI_PAGE_MASK; 514 runtime_end = (ulong)&__efi_runtime_stop; 515 runtime_end = (runtime_end + EFI_PAGE_MASK) & ~EFI_PAGE_MASK; 516 runtime_pages = (runtime_end - runtime_start) >> EFI_PAGE_SHIFT; 517 efi_add_memory_map(runtime_start, runtime_pages, 518 EFI_RUNTIME_SERVICES_CODE, false); 519 520 #ifdef CONFIG_EFI_LOADER_BOUNCE_BUFFER 521 /* Request a 32bit 64MB bounce buffer region */ 522 uint64_t efi_bounce_buffer_addr = 0xffffffff; 523 524 if (efi_allocate_pages(EFI_ALLOCATE_MAX_ADDRESS, EFI_LOADER_DATA, 525 (64 * 1024 * 1024) >> EFI_PAGE_SHIFT, 526 &efi_bounce_buffer_addr) != EFI_SUCCESS) 527 return -1; 528 529 efi_bounce_buffer = (void*)(uintptr_t)efi_bounce_buffer_addr; 530 #endif 531 532 return 0; 533 } 534