mem.c 1.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263
  1. // SPDX-License-Identifier: GPL-2.0-or-later
  2. /*
  3. * Copyright (C) 2020-2022 Loongson Technology Corporation Limited
  4. */
  5. #include <linux/efi.h>
  6. #include <linux/initrd.h>
  7. #include <linux/memblock.h>
  8. #include <asm/bootinfo.h>
  9. #include <asm/loongson.h>
  10. #include <asm/sections.h>
  11. void __init memblock_init(void)
  12. {
  13. u32 mem_type;
  14. u64 mem_start, mem_end, mem_size;
  15. efi_memory_desc_t *md;
  16. /* Parse memory information */
  17. for_each_efi_memory_desc(md) {
  18. mem_type = md->type;
  19. mem_start = md->phys_addr;
  20. mem_size = md->num_pages << EFI_PAGE_SHIFT;
  21. mem_end = mem_start + mem_size;
  22. switch (mem_type) {
  23. case EFI_LOADER_CODE:
  24. case EFI_LOADER_DATA:
  25. case EFI_BOOT_SERVICES_CODE:
  26. case EFI_BOOT_SERVICES_DATA:
  27. case EFI_PERSISTENT_MEMORY:
  28. case EFI_CONVENTIONAL_MEMORY:
  29. memblock_add(mem_start, mem_size);
  30. if (max_low_pfn < (mem_end >> PAGE_SHIFT))
  31. max_low_pfn = mem_end >> PAGE_SHIFT;
  32. break;
  33. case EFI_PAL_CODE:
  34. case EFI_UNUSABLE_MEMORY:
  35. case EFI_ACPI_RECLAIM_MEMORY:
  36. memblock_add(mem_start, mem_size);
  37. fallthrough;
  38. case EFI_RESERVED_TYPE:
  39. case EFI_RUNTIME_SERVICES_CODE:
  40. case EFI_RUNTIME_SERVICES_DATA:
  41. case EFI_MEMORY_MAPPED_IO:
  42. case EFI_MEMORY_MAPPED_IO_PORT_SPACE:
  43. memblock_reserve(mem_start, mem_size);
  44. break;
  45. }
  46. }
  47. memblock_set_current_limit(PFN_PHYS(max_low_pfn));
  48. /* Reserve the first 2MB */
  49. memblock_reserve(PHYS_OFFSET, 0x200000);
  50. /* Reserve the kernel text/data/bss */
  51. memblock_reserve(__pa_symbol(&_text),
  52. __pa_symbol(&_end) - __pa_symbol(&_text));
  53. memblock_set_node(0, PHYS_ADDR_MAX, &memblock.memory, 0);
  54. memblock_set_node(0, PHYS_ADDR_MAX, &memblock.reserved, 0);
  55. }