Lines Matching +full:reserved +full:- +full:memory
1 // SPDX-License-Identifier: GPL-2.0-or-later
6 * memory contents. The most of the code implementation has been adapted
33 #include <asm/fadump-internal.h>
57 #define RESERVED_RNGS_SZ 16384 /* 16K - 128 entries */
62 reserved_mrange_info = { "reserved", rngs, RESERVED_RNGS_SZ, 0, RESERVED_RNGS_CNT, true };
70 * fadump_cma_init() - Initialize CMA area from a fadump reserved memory
72 * This function initializes CMA area from fadump reserved memory.
73 * The total size of fadump reserved memory covers for boot memory size
75 * Initialize only the area equivalent to boot memory size for CMA use.
76 * The remaining portion of fadump reserved memory will be not given
77 * to CMA and pages for those will stay reserved. boot memory size is
79 * But for some reason even if it fails we still have the memory reservation
97 * [base, end) should be reserved during early init in in fadump_cma_init()
100 * Here we give the aligned chunk of this reserved memory to CMA. in fadump_cma_init()
108 size = end - base; in fadump_cma_init()
111 pr_warn("%s: Too less memory to give to CMA\n", __func__); in fadump_cma_init()
117 pr_err("Failed to init cma area for firmware-assisted dump,%d\n", rc); in fadump_cma_init()
119 * Though the CMA init has failed we still have memory in fadump_cma_init()
120 * reservation with us. The reserved memory will be in fadump_cma_init()
128 * If CMA activation fails, keep the pages reserved, instead of in fadump_cma_init()
137 "bytes of memory reserved for firmware-assisted dump\n", in fadump_cma_init()
172 if (len + strlen(append_args) >= COMMAND_LINE_SIZE - 1) in fadump_append_bootargs()
176 snprintf(boot_command_line + len, COMMAND_LINE_SIZE - len, " %s", append_args); in fadump_append_bootargs()
206 * If fadump is registered, check if the memory provided
207 * falls within boot memory area and reserved memory area.
240 * Returns true, if there are no holes in memory area between d_start to d_end,
253 /* Memory hole from d_start to start */ in is_fadump_mem_area_contiguous()
270 * Returns true, if there are no holes in reserved memory area,
287 pr_debug("Support for firmware-assisted dump (fadump): %s\n", in fadump_show_config()
300 pr_debug(" Boot memory size : %lx\n", fw_dump.boot_memory_size); in fadump_show_config()
301 pr_debug(" Boot memory top : %llx\n", fw_dump.boot_mem_top); in fadump_show_config()
302 pr_debug("Boot memory regions cnt: %llx\n", fw_dump.boot_mem_regs_cnt); in fadump_show_config()
312 * Function to find the largest memory size we need to reserve during early
313 * boot process. This will be the size of the memory that is required for a
316 * This function has been taken from phyp-assisted dump feature implementation.
320 * TODO: Come up with better approach to find out more accurate memory size
335 * memory at a predefined offset. in fadump_calculate_reserve_size()
343 pr_info("Using 'crashkernel=' parameter for memory reservation.\n"); in fadump_calculate_reserve_size()
348 * Adjust if the boot memory size specified is above in fadump_calculate_reserve_size()
354 pr_info("Adjusted boot memory size to %luMB\n", in fadump_calculate_reserve_size()
361 * 'fadump_reserve_mem=' is being used to reserve memory in fadump_calculate_reserve_size()
362 * for firmware-assisted dump. in fadump_calculate_reserve_size()
373 /* Truncate to memory_limit. We don't want to over reserve the memory.*/ in fadump_calculate_reserve_size()
377 bootmem_min = fw_dump.ops->fadump_get_bootmem_min(); in fadump_calculate_reserve_size()
382 * Calculate the total memory size required to be reserved for
383 * firmware-assisted dump registration.
392 * Account for pagesize alignment of boot memory area destination address. in get_fadump_area_size()
393 * This faciliates in mmap reading of first kernel's memory. in get_fadump_area_size()
400 size += (fw_dump.ops->fadump_get_metadata_size ? in get_fadump_area_size()
401 fw_dump.ops->fadump_get_metadata_size() : 0); in get_fadump_area_size()
408 int max_boot_mem_rgns = fw_dump.ops->fadump_max_boot_mem_rgns(); in add_boot_mem_region()
416 pr_debug("Added boot memory range[%d] [%#016lx-%#016lx)\n", in add_boot_mem_region()
425 * Honour that by splitting a memory range into multiple regions.
445 msize -= rsize; in add_boot_mem_regions()
466 size = reg_end - reg_start; in fadump_get_boot_mem_regions()
467 hole_size += (reg_start - last_end); in fadump_get_boot_mem_regions()
470 size = (mem_size - cur_size); in fadump_get_boot_mem_regions()
475 mem_size -= size; in fadump_get_boot_mem_regions()
489 * Returns true, if the given range overlaps with reserved memory ranges
490 * starting at idx. Also, updates idx to index of overlapping memory range
491 * with the given memory range.
517 * Locate a suitable memory area to reserve memory for FADump. While at it,
518 * lookup reserved-ranges & avoid overlap with them, as they are used by F/W.
536 while ((mend > base) && ((mend - base) >= size)) { in fadump_locate_reserve_mem()
560 pr_info("Firmware-Assisted Dump is not supported on this hardware\n"); in fadump_reserve_mem()
565 * Initialize boot memory size in fadump_reserve_mem()
573 bootmem_min = fw_dump.ops->fadump_get_bootmem_min(); in fadump_reserve_mem()
575 pr_err("Can't enable fadump with boot memory size (0x%lx) less than 0x%llx\n", in fadump_reserve_mem()
581 pr_err("Too many holes in boot memory area to enable fadump\n"); in fadump_reserve_mem()
595 pr_info("Firmware-assisted dump is active.\n"); in fadump_reserve_mem()
606 * If last boot has crashed then reserve all the memory in fadump_reserve_mem()
607 * above boot memory size so that we don't touch it until in fadump_reserve_mem()
608 * dump is written to disk by userspace tool. This memory in fadump_reserve_mem()
618 * Reserve memory at an offset closer to bottom of the RAM to in fadump_reserve_mem()
619 * minimize the impact of memory hot-remove operation. in fadump_reserve_mem()
624 pr_err("Failed to find memory chunk for reservation!\n"); in fadump_reserve_mem()
633 if (fw_dump.ops->fadump_setup_metadata && in fadump_reserve_mem()
634 (fw_dump.ops->fadump_setup_metadata(&fw_dump) < 0)) in fadump_reserve_mem()
638 pr_err("Failed to reserve memory!\n"); in fadump_reserve_mem()
642 pr_info("Reserved %lldMB of memory at %#016llx (System RAM: %lldMB)\n", in fadump_reserve_mem()
691 unsigned int ncpus = num_online_cpus() - 1; in crash_fadump()
697 * old_cpu == -1 means this is the first CPU which has come here, in crash_fadump()
700 * old_cpu != -1 means some other CPU has already on its way in crash_fadump()
704 old_cpu = cmpxchg(&crashing_cpu, -1, this_cpu); in crash_fadump()
706 if (old_cpu != -1) { in crash_fadump()
711 * is in force. If we race with fadump un-registration this in crash_fadump()
722 fdh->crashing_cpu = crashing_cpu; in crash_fadump()
726 fdh->regs = *regs; in crash_fadump()
728 ppc_save_regs(&fdh->regs); in crash_fadump()
730 fdh->cpu_mask = *cpu_online_mask; in crash_fadump()
736 if (TRAP(&(fdh->regs)) == INTERRUPT_SYSTEM_RESET) { in crash_fadump()
738 while ((atomic_read(&cpus_in_fadump) < ncpus) && (--msecs > 0)) in crash_fadump()
742 fw_dump.ops->fadump_trigger(fdh, str); in crash_fadump()
769 if (phdr->p_type == PT_NOTE) { in fadump_update_elfcore_header()
770 phdr->p_paddr = __pa(fw_dump.cpu_notes_buf_vaddr); in fadump_update_elfcore_header()
771 phdr->p_offset = phdr->p_paddr; in fadump_update_elfcore_header()
772 phdr->p_filesz = fw_dump.cpu_notes_buf_size; in fadump_update_elfcore_header()
773 phdr->p_memsz = fw_dump.cpu_notes_buf_size; in fadump_update_elfcore_header()
797 free_reserved_area((void *)vaddr, (void *)(vaddr + size), -1, NULL); in fadump_free_buffer()
810 return -ENOMEM; in fadump_setup_cpu_notes_buf()
832 if (mrange_info->is_static) { in fadump_free_mem_ranges()
833 mrange_info->mem_range_cnt = 0; in fadump_free_mem_ranges()
837 kfree(mrange_info->mem_ranges); in fadump_free_mem_ranges()
839 (sizeof(struct fadump_mrange_info) - RNG_NAME_SZ)); in fadump_free_mem_ranges()
851 new_size = mrange_info->mem_ranges_sz + PAGE_SIZE; in fadump_alloc_mem_ranges()
852 pr_debug("Allocating %llu bytes of memory for %s memory ranges\n", in fadump_alloc_mem_ranges()
853 new_size, mrange_info->name); in fadump_alloc_mem_ranges()
855 new_array = krealloc(mrange_info->mem_ranges, new_size, GFP_KERNEL); in fadump_alloc_mem_ranges()
857 pr_err("Insufficient memory for setting up %s memory ranges\n", in fadump_alloc_mem_ranges()
858 mrange_info->name); in fadump_alloc_mem_ranges()
860 return -ENOMEM; in fadump_alloc_mem_ranges()
863 mrange_info->mem_ranges = new_array; in fadump_alloc_mem_ranges()
864 mrange_info->mem_ranges_sz = new_size; in fadump_alloc_mem_ranges()
865 mrange_info->max_mem_ranges = (new_size / in fadump_alloc_mem_ranges()
872 struct fadump_memory_range *mem_ranges = mrange_info->mem_ranges; in fadump_add_mem_range()
880 * Fold adjacent memory ranges to bring down the memory ranges/ in fadump_add_mem_range()
883 if (mrange_info->mem_range_cnt) { in fadump_add_mem_range()
884 start = mem_ranges[mrange_info->mem_range_cnt - 1].base; in fadump_add_mem_range()
885 size = mem_ranges[mrange_info->mem_range_cnt - 1].size; in fadump_add_mem_range()
888 * Boot memory area needs separate PT_LOAD segment(s) as it in fadump_add_mem_range()
890 * So, fold only if the region is not boot memory area. in fadump_add_mem_range()
897 if (mrange_info->mem_range_cnt == mrange_info->max_mem_ranges) { in fadump_add_mem_range()
900 if (mrange_info->is_static) { in fadump_add_mem_range()
901 pr_err("Reached array size limit for %s memory ranges\n", in fadump_add_mem_range()
902 mrange_info->name); in fadump_add_mem_range()
903 return -ENOSPC; in fadump_add_mem_range()
911 mem_ranges = mrange_info->mem_ranges; in fadump_add_mem_range()
915 mem_ranges[mrange_info->mem_range_cnt].base = start; in fadump_add_mem_range()
916 mrange_info->mem_range_cnt++; in fadump_add_mem_range()
919 mem_ranges[mrange_info->mem_range_cnt - 1].size = (end - start); in fadump_add_mem_range()
920 pr_debug("%s_memory_range[%d] [%#016llx-%#016llx], %#llx bytes\n", in fadump_add_mem_range()
921 mrange_info->name, (mrange_info->mem_range_cnt - 1), in fadump_add_mem_range()
922 start, end - 1, (end - start)); in fadump_add_mem_range()
932 memcpy(elf->e_ident, ELFMAG, SELFMAG); in fadump_init_elfcore_header()
933 elf->e_ident[EI_CLASS] = ELF_CLASS; in fadump_init_elfcore_header()
934 elf->e_ident[EI_DATA] = ELF_DATA; in fadump_init_elfcore_header()
935 elf->e_ident[EI_VERSION] = EV_CURRENT; in fadump_init_elfcore_header()
936 elf->e_ident[EI_OSABI] = ELF_OSABI; in fadump_init_elfcore_header()
937 memset(elf->e_ident+EI_PAD, 0, EI_NIDENT-EI_PAD); in fadump_init_elfcore_header()
938 elf->e_type = ET_CORE; in fadump_init_elfcore_header()
939 elf->e_machine = ELF_ARCH; in fadump_init_elfcore_header()
940 elf->e_version = EV_CURRENT; in fadump_init_elfcore_header()
941 elf->e_entry = 0; in fadump_init_elfcore_header()
942 elf->e_phoff = sizeof(struct elfhdr); in fadump_init_elfcore_header()
943 elf->e_shoff = 0; in fadump_init_elfcore_header()
946 elf->e_flags = 2; in fadump_init_elfcore_header()
948 elf->e_flags = 1; in fadump_init_elfcore_header()
950 elf->e_flags = 0; in fadump_init_elfcore_header()
952 elf->e_ehsize = sizeof(struct elfhdr); in fadump_init_elfcore_header()
953 elf->e_phentsize = sizeof(struct elf_phdr); in fadump_init_elfcore_header()
954 elf->e_phnum = 0; in fadump_init_elfcore_header()
955 elf->e_shentsize = 0; in fadump_init_elfcore_header()
956 elf->e_shnum = 0; in fadump_init_elfcore_header()
957 elf->e_shstrndx = 0; in fadump_init_elfcore_header()
963 * If the given physical address falls within the boot memory region then
964 * return the relocated address that points to the dump region reserved
965 * for saving initial boot memory contents.
978 hole_size += (rstart - rlast); in fadump_relocate()
981 raddr += fw_dump.boot_mem_dest_addr - hole_size; in fadump_relocate()
995 phdr->p_align = 0; in populate_elf_pt_load()
996 phdr->p_memsz = size; in populate_elf_pt_load()
997 phdr->p_filesz = size; in populate_elf_pt_load()
998 phdr->p_paddr = start; in populate_elf_pt_load()
999 phdr->p_offset = offset; in populate_elf_pt_load()
1000 phdr->p_type = PT_LOAD; in populate_elf_pt_load()
1001 phdr->p_flags = PF_R|PF_W|PF_X; in populate_elf_pt_load()
1002 phdr->p_vaddr = (unsigned long)__va(start); in populate_elf_pt_load()
1020 * The notes info will be populated later by platform-specific code. in fadump_populate_elfcorehdr()
1027 phdr->p_type = PT_NOTE; in fadump_populate_elfcorehdr()
1028 phdr->p_flags = 0; in fadump_populate_elfcorehdr()
1029 phdr->p_vaddr = 0; in fadump_populate_elfcorehdr()
1030 phdr->p_align = 0; in fadump_populate_elfcorehdr()
1031 phdr->p_offset = 0; in fadump_populate_elfcorehdr()
1032 phdr->p_paddr = 0; in fadump_populate_elfcorehdr()
1033 phdr->p_filesz = 0; in fadump_populate_elfcorehdr()
1034 phdr->p_memsz = 0; in fadump_populate_elfcorehdr()
1036 (elf->e_phnum)++; in fadump_populate_elfcorehdr()
1041 phdr->p_type = PT_NOTE; in fadump_populate_elfcorehdr()
1042 phdr->p_flags = 0; in fadump_populate_elfcorehdr()
1043 phdr->p_vaddr = 0; in fadump_populate_elfcorehdr()
1044 phdr->p_align = 0; in fadump_populate_elfcorehdr()
1045 phdr->p_paddr = phdr->p_offset = fdh->vmcoreinfo_raddr; in fadump_populate_elfcorehdr()
1046 phdr->p_memsz = phdr->p_filesz = fdh->vmcoreinfo_size; in fadump_populate_elfcorehdr()
1048 (elf->e_phnum)++; in fadump_populate_elfcorehdr()
1051 * Setup PT_LOAD sections. first include boot memory regions in fadump_populate_elfcorehdr()
1052 * and then add rest of the memory regions. in fadump_populate_elfcorehdr()
1062 (elf->e_phnum)++; in fadump_populate_elfcorehdr()
1066 /* Memory reserved for fadump in first kernel */ in fadump_populate_elfcorehdr()
1073 /* Boot memory regions already added, skip them now */ in fadump_populate_elfcorehdr()
1081 /* Handle memblock regions overlaps with fadump reserved area */ in fadump_populate_elfcorehdr()
1084 populate_elf_pt_load(phdr, mstart, ra_start - mstart, mstart); in fadump_populate_elfcorehdr()
1086 (elf->e_phnum)++; in fadump_populate_elfcorehdr()
1089 populate_elf_pt_load(phdr, ra_end, mend - ra_end, ra_end); in fadump_populate_elfcorehdr()
1091 populate_elf_pt_load(phdr, mstart, ra_start - mstart, mstart); in fadump_populate_elfcorehdr()
1093 populate_elf_pt_load(phdr, ra_end, mend - ra_end, ra_end); in fadump_populate_elfcorehdr()
1096 /* No overlap with fadump reserved memory region */ in fadump_populate_elfcorehdr()
1097 populate_elf_pt_load(phdr, mstart, mend - mstart, mstart); in fadump_populate_elfcorehdr()
1101 (elf->e_phnum)++; in fadump_populate_elfcorehdr()
1118 fdh->magic_number = FADUMP_CRASH_INFO_MAGIC; in init_fadump_header()
1119 fdh->version = FADUMP_HEADER_VERSION; in init_fadump_header()
1121 fdh->crashing_cpu = FADUMP_CPU_UNKNOWN; in init_fadump_header()
1127 fdh->vmcoreinfo_raddr = fadump_relocate(paddr_vmcoreinfo_note()); in init_fadump_header()
1128 fdh->vmcoreinfo_size = VMCOREINFO_NOTE_SIZE; in init_fadump_header()
1131 fdh->pt_regs_sz = sizeof(struct pt_regs); in init_fadump_header()
1136 fdh->cpu_mask = *cpu_possible_mask; in init_fadump_header()
1137 fdh->cpu_mask_sz = sizeof(struct cpumask); in init_fadump_header()
1147 * If no memory is reserved then we can not register for firmware- in register_fadump()
1151 return -ENODEV; in register_fadump()
1159 pr_debug("Registering for firmware-assisted kernel dump...\n"); in register_fadump()
1160 return fw_dump.ops->fadump_register(&fw_dump); in register_fadump()
1170 pr_debug("Invalidating firmware-assisted dump registration\n"); in fadump_cleanup()
1171 fw_dump.ops->fadump_invalidate(&fw_dump); in fadump_cleanup()
1173 /* Un-register Firmware-assisted dump if it was registered. */ in fadump_cleanup()
1174 fw_dump.ops->fadump_unregister(&fw_dump); in fadump_cleanup()
1177 if (fw_dump.ops->fadump_cleanup) in fadump_cleanup()
1178 fw_dump.ops->fadump_cleanup(&fw_dump); in fadump_cleanup()
1187 pr_info("freeing reserved memory (0x%llx - 0x%llx)\n", in fadump_free_reserved_memory()
1201 * Skip memory holes and free memory that was actually reserved.
1228 * Sort the mem ranges in-place and merge adjacent ranges
1229 * to minimize the memory ranges count.
1240 /* Sort the memory ranges */ in sort_and_merge_mem_ranges()
1241 mem_ranges = mrange_info->mem_ranges; in sort_and_merge_mem_ranges()
1242 for (i = 0; i < mrange_info->mem_range_cnt; i++) { in sort_and_merge_mem_ranges()
1244 for (j = (i + 1); j < mrange_info->mem_range_cnt; j++) { in sort_and_merge_mem_ranges()
1252 /* Merge adjacent reserved ranges */ in sort_and_merge_mem_ranges()
1254 for (i = 1; i < mrange_info->mem_range_cnt; i++) { in sort_and_merge_mem_ranges()
1255 base = mem_ranges[i-1].base; in sort_and_merge_mem_ranges()
1256 size = mem_ranges[i-1].size; in sort_and_merge_mem_ranges()
1267 mrange_info->mem_range_cnt = idx + 1; in sort_and_merge_mem_ranges()
1271 * Scan reserved-ranges to consider them while reserving/releasing
1272 * memory for FADump.
1277 int len, ret = -1; in early_init_dt_scan_reserved_ranges()
1280 /* reserved-ranges already scanned */ in early_init_dt_scan_reserved_ranges()
1284 prop = of_get_flat_dt_prop(node, "reserved-ranges", &len); in early_init_dt_scan_reserved_ranges()
1289 * Each reserved range is an (address,size) pair, 2 cells each, in early_init_dt_scan_reserved_ranges()
1302 pr_warn("some reserved ranges are ignored!\n"); in early_init_dt_scan_reserved_ranges()
1308 /* Compact reserved ranges */ in early_init_dt_scan_reserved_ranges()
1313 * Release the memory that was reserved during early boot to preserve the
1314 * crash'ed kernel's memory contents except reserved dump area (permanent
1315 * reservation) and reserved ranges used by F/W. The released memory will
1327 * If reserved ranges array limit is hit, overwrite the last reserved in fadump_release_memory()
1328 * memory range with reserved dump area to ensure it is excluded from in fadump_release_memory()
1329 * the memory being released (reused for next FADump registration). in fadump_release_memory()
1333 reserved_mrange_info.mem_range_cnt--; in fadump_release_memory()
1339 /* Get the reserved ranges list in order first. */ in fadump_release_memory()
1342 /* Exclude reserved ranges and release remaining memory */ in fadump_release_memory()
1366 * Before freeing the memory of `elfcorehdr`, reset the global in fadump_free_elfcorehdr_buf()
1368 * invalid memory. in fadump_free_elfcorehdr_buf()
1393 * memory structure for FADump re-registration. in fadump_invalidate_release_mem()
1395 if (fw_dump.ops->fadump_setup_metadata && in fadump_invalidate_release_mem()
1396 (fw_dump.ops->fadump_setup_metadata(&fw_dump) < 0)) in fadump_invalidate_release_mem()
1398 fw_dump.ops->fadump_init_mem_struct(&fw_dump); in fadump_invalidate_release_mem()
1405 int input = -1; in release_mem_store()
1408 return -EPERM; in release_mem_store()
1411 return -EINVAL; in release_mem_store()
1416 * memory, hence it will not be valid anymore. in release_mem_store()
1424 return -EINVAL; in release_mem_store()
1428 /* Release the reserved memory and disable the FADump */
1447 * to usersapce that fadump re-registration is not required on memory
1485 return -EPERM; in bootargs_append_store()
1488 return -EINVAL; in bootargs_append_store()
1496 return -ENOSPC; in bootargs_append_store()
1502 if (params[count-1] == '\n') in bootargs_append_store()
1503 params[count-1] = '\0'; in bootargs_append_store()
1513 int input = -1; in registered_store()
1516 return -EPERM; in registered_store()
1519 return -EINVAL; in registered_store()
1529 /* Un-register Firmware-assisted dump */ in registered_store()
1530 pr_debug("Un-register firmware-assisted dump\n"); in registered_store()
1531 fw_dump.ops->fadump_unregister(&fw_dump); in registered_store()
1535 /* Un-register Firmware-assisted dump */ in registered_store()
1536 fw_dump.ops->fadump_unregister(&fw_dump); in registered_store()
1538 /* Register Firmware-assisted dump */ in registered_store()
1542 ret = -EINVAL; in registered_store()
1557 fw_dump.ops->fadump_region_show(&fw_dump, m); in fadump_region_show()
1619 * - fadump_enabled -> fadump/enabled in fadump_init_files()
1620 * - fadump_registered -> fadump/registered in fadump_init_files()
1621 * - fadump_release_mem -> fadump/release_mem in fadump_init_files()
1659 * memory regions. in fadump_setup_elfcorehdr_buf()
1661 elf_phdr_cnt = 2 + fw_dump.boot_mem_regs_cnt + memblock_num_regions(memory); in fadump_setup_elfcorehdr_buf()
1669 return -ENOMEM; in fadump_setup_elfcorehdr_buf()
1678 * It checks the magic number, endianness, and size of non-primitive type
1683 if (fdh->magic_number == FADUMP_CRASH_INFO_MAGIC_OLD) { in is_fadump_header_compatible()
1688 if (fdh->magic_number != FADUMP_CRASH_INFO_MAGIC) { in is_fadump_header_compatible()
1689 if (fdh->magic_number == swab64(FADUMP_CRASH_INFO_MAGIC)) in is_fadump_header_compatible()
1698 * Dump collection is not safe if the size of non-primitive type members in is_fadump_header_compatible()
1701 if (fdh->pt_regs_sz != sizeof(struct pt_regs) || in is_fadump_header_compatible()
1702 fdh->cpu_mask_sz != sizeof(struct cpumask)) { in is_fadump_header_compatible()
1731 if (fw_dump.ops->fadump_process(&fw_dump) < 0) in fadump_process()
1748 * Reserve memory to store additional parameters to be passed
1758 /* This memory can't be used by PFW or bootloader as it is shared across kernels */ in fadump_setup_param_area()
1761 * Anywhere in the upper half should be good enough as all memory in fadump_setup_param_area()
1768 * Memory range for passing additional parameters for HASH MMU in fadump_setup_param_area()
1770 * 1. The first memory block size must be higher than the in fadump_setup_param_area()
1771 * minimum RMA (MIN_RMA) size. Bootloader can use memory in fadump_setup_param_area()
1774 * 3. It must not overlap with the fadump reserved area. in fadump_setup_param_area()
1796 * Prepare for firmware-assisted dump.
1816 /* Initialize the kernel dump memory structure and register with f/w */ in setup_fadump()
1818 fw_dump.ops->fadump_init_mem_struct(&fw_dump); in setup_fadump()
1853 * preserve crash data. The subsequent memory preserving kernel boot
1860 * If last boot has crashed then reserve all the memory in fadump_reserve_mem()
1861 * above boot memory to preserve crash data. in fadump_reserve_mem()
1866 pr_debug("FADump-aware kernel..\n"); in fadump_reserve_mem()
1878 msize = mend - mstart; in fadump_reserve_crash_area()
1884 msize -= (base - mstart); in fadump_reserve_crash_area()
1888 pr_info("Reserving %lluMB of memory at %#016llx for preserving crash data", in fadump_reserve_crash_area()