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>
56 #define RESERVED_RNGS_SZ 16384 /* 16K - 128 entries */
61 reserved_mrange_info = { "reserved", rngs, RESERVED_RNGS_SZ, 0, RESERVED_RNGS_CNT, true };
69 * fadump_cma_init() - Initialize CMA area from a fadump reserved memory
71 * This function initializes CMA area from fadump reserved memory.
72 * The total size of fadump reserved memory covers for boot memory size
74 * Initialize only the area equivalent to boot memory size for CMA use.
75 * The remaining portion of fadump reserved memory will be not given
76 * to CMA and pages for those will stay reserved. boot memory size is
78 * But for some reason even if it fails we still have the memory reservation
96 * [base, end) should be reserved during early init in in fadump_cma_init()
99 * Here we give the aligned chunk of this reserved memory to CMA. in fadump_cma_init()
107 size = end - base; in fadump_cma_init()
110 pr_warn("%s: Too less memory to give to CMA\n", __func__); in fadump_cma_init()
116 pr_err("Failed to init cma area for firmware-assisted dump,%d\n", rc); in fadump_cma_init()
118 * Though the CMA init has failed we still have memory in fadump_cma_init()
119 * reservation with us. The reserved memory will be in fadump_cma_init()
127 * If CMA activation fails, keep the pages reserved, instead of in fadump_cma_init()
136 "bytes of memory reserved for firmware-assisted dump\n", in fadump_cma_init()
171 if (len + strlen(append_args) >= COMMAND_LINE_SIZE - 1) in fadump_append_bootargs()
175 snprintf(boot_command_line + len, COMMAND_LINE_SIZE - len, " %s", append_args); in fadump_append_bootargs()
205 * If fadump is registered, check if the memory provided
206 * falls within boot memory area and reserved memory area.
239 * Returns true, if there are no holes in memory area between d_start to d_end,
252 /* Memory hole from d_start to start */ in is_fadump_mem_area_contiguous()
269 * Returns true, if there are no holes in reserved memory area,
286 pr_debug("Support for firmware-assisted dump (fadump): %s\n", in fadump_show_config()
299 pr_debug(" Boot memory size : %lx\n", fw_dump.boot_memory_size); in fadump_show_config()
300 pr_debug(" Boot memory top : %llx\n", fw_dump.boot_mem_top); in fadump_show_config()
301 pr_debug("Boot memory regions cnt: %llx\n", fw_dump.boot_mem_regs_cnt); in fadump_show_config()
311 * Function to find the largest memory size we need to reserve during early
312 * boot process. This will be the size of the memory that is required for a
315 * This function has been taken from phyp-assisted dump feature implementation.
319 * TODO: Come up with better approach to find out more accurate memory size
334 * memory at a predefined offset. in fadump_calculate_reserve_size()
342 pr_info("Using 'crashkernel=' parameter for memory reservation.\n"); in fadump_calculate_reserve_size()
347 * Adjust if the boot memory size specified is above in fadump_calculate_reserve_size()
353 pr_info("Adjusted boot memory size to %luMB\n", in fadump_calculate_reserve_size()
360 * 'fadump_reserve_mem=' is being used to reserve memory in fadump_calculate_reserve_size()
361 * for firmware-assisted dump. in fadump_calculate_reserve_size()
372 /* Truncate to memory_limit. We don't want to over reserve the memory.*/ in fadump_calculate_reserve_size()
376 bootmem_min = fw_dump.ops->fadump_get_bootmem_min(); in fadump_calculate_reserve_size()
381 * Calculate the total memory size required to be reserved for
382 * firmware-assisted dump registration.
391 * Account for pagesize alignment of boot memory area destination address. in get_fadump_area_size()
392 * This faciliates in mmap reading of first kernel's memory. in get_fadump_area_size()
399 size += (fw_dump.ops->fadump_get_metadata_size ? in get_fadump_area_size()
400 fw_dump.ops->fadump_get_metadata_size() : 0); in get_fadump_area_size()
407 int max_boot_mem_rgns = fw_dump.ops->fadump_max_boot_mem_rgns(); in add_boot_mem_region()
415 pr_debug("Added boot memory range[%d] [%#016lx-%#016lx)\n", in add_boot_mem_region()
424 * Honour that by splitting a memory range into multiple regions.
444 msize -= rsize; in add_boot_mem_regions()
465 size = reg_end - reg_start; in fadump_get_boot_mem_regions()
466 hole_size += (reg_start - last_end); in fadump_get_boot_mem_regions()
469 size = (mem_size - cur_size); in fadump_get_boot_mem_regions()
474 mem_size -= size; in fadump_get_boot_mem_regions()
488 * Returns true, if the given range overlaps with reserved memory ranges
489 * starting at idx. Also, updates idx to index of overlapping memory range
490 * with the given memory range.
516 * Locate a suitable memory area to reserve memory for FADump. While at it,
517 * lookup reserved-ranges & avoid overlap with them, as they are used by F/W.
535 while ((mend > base) && ((mend - base) >= size)) { in fadump_locate_reserve_mem()
559 pr_info("Firmware-Assisted Dump is not supported on this hardware\n"); in fadump_reserve_mem()
564 * Initialize boot memory size in fadump_reserve_mem()
572 bootmem_min = fw_dump.ops->fadump_get_bootmem_min(); in fadump_reserve_mem()
574 pr_err("Can't enable fadump with boot memory size (0x%lx) less than 0x%llx\n", in fadump_reserve_mem()
580 pr_err("Too many holes in boot memory area to enable fadump\n"); in fadump_reserve_mem()
594 pr_info("Firmware-assisted dump is active.\n"); in fadump_reserve_mem()
605 * If last boot has crashed then reserve all the memory in fadump_reserve_mem()
606 * above boot memory size so that we don't touch it until in fadump_reserve_mem()
607 * dump is written to disk by userspace tool. This memory in fadump_reserve_mem()
617 * Reserve memory at an offset closer to bottom of the RAM to in fadump_reserve_mem()
618 * minimize the impact of memory hot-remove operation. in fadump_reserve_mem()
623 pr_err("Failed to find memory chunk for reservation!\n"); in fadump_reserve_mem()
632 if (fw_dump.ops->fadump_setup_metadata && in fadump_reserve_mem()
633 (fw_dump.ops->fadump_setup_metadata(&fw_dump) < 0)) in fadump_reserve_mem()
637 pr_err("Failed to reserve memory!\n"); in fadump_reserve_mem()
641 pr_info("Reserved %lldMB of memory at %#016llx (System RAM: %lldMB)\n", in fadump_reserve_mem()
690 unsigned int ncpus = num_online_cpus() - 1; in crash_fadump()
696 * old_cpu == -1 means this is the first CPU which has come here, in crash_fadump()
699 * old_cpu != -1 means some other CPU has already on its way in crash_fadump()
703 old_cpu = cmpxchg(&crashing_cpu, -1, this_cpu); in crash_fadump()
705 if (old_cpu != -1) { in crash_fadump()
710 * is in force. If we race with fadump un-registration this in crash_fadump()
721 fdh->crashing_cpu = crashing_cpu; in crash_fadump()
725 fdh->regs = *regs; in crash_fadump()
727 ppc_save_regs(&fdh->regs); in crash_fadump()
729 fdh->cpu_mask = *cpu_online_mask; in crash_fadump()
735 if (TRAP(&(fdh->regs)) == INTERRUPT_SYSTEM_RESET) { in crash_fadump()
737 while ((atomic_read(&cpus_in_fadump) < ncpus) && (--msecs > 0)) in crash_fadump()
741 fw_dump.ops->fadump_trigger(fdh, str); in crash_fadump()
768 if (phdr->p_type == PT_NOTE) { in fadump_update_elfcore_header()
769 phdr->p_paddr = __pa(fw_dump.cpu_notes_buf_vaddr); in fadump_update_elfcore_header()
770 phdr->p_offset = phdr->p_paddr; in fadump_update_elfcore_header()
771 phdr->p_filesz = fw_dump.cpu_notes_buf_size; in fadump_update_elfcore_header()
772 phdr->p_memsz = fw_dump.cpu_notes_buf_size; in fadump_update_elfcore_header()
796 free_reserved_area((void *)vaddr, (void *)(vaddr + size), -1, NULL); in fadump_free_buffer()
809 return -ENOMEM; in fadump_setup_cpu_notes_buf()
831 if (mrange_info->is_static) { in fadump_free_mem_ranges()
832 mrange_info->mem_range_cnt = 0; in fadump_free_mem_ranges()
836 kfree(mrange_info->mem_ranges); in fadump_free_mem_ranges()
838 (sizeof(struct fadump_mrange_info) - RNG_NAME_SZ)); in fadump_free_mem_ranges()
850 new_size = mrange_info->mem_ranges_sz + PAGE_SIZE; in fadump_alloc_mem_ranges()
851 pr_debug("Allocating %llu bytes of memory for %s memory ranges\n", in fadump_alloc_mem_ranges()
852 new_size, mrange_info->name); in fadump_alloc_mem_ranges()
854 new_array = krealloc(mrange_info->mem_ranges, new_size, GFP_KERNEL); in fadump_alloc_mem_ranges()
856 pr_err("Insufficient memory for setting up %s memory ranges\n", in fadump_alloc_mem_ranges()
857 mrange_info->name); in fadump_alloc_mem_ranges()
859 return -ENOMEM; in fadump_alloc_mem_ranges()
862 mrange_info->mem_ranges = new_array; in fadump_alloc_mem_ranges()
863 mrange_info->mem_ranges_sz = new_size; in fadump_alloc_mem_ranges()
864 mrange_info->max_mem_ranges = (new_size / in fadump_alloc_mem_ranges()
871 struct fadump_memory_range *mem_ranges = mrange_info->mem_ranges; in fadump_add_mem_range()
879 * Fold adjacent memory ranges to bring down the memory ranges/ in fadump_add_mem_range()
882 if (mrange_info->mem_range_cnt) { in fadump_add_mem_range()
883 start = mem_ranges[mrange_info->mem_range_cnt - 1].base; in fadump_add_mem_range()
884 size = mem_ranges[mrange_info->mem_range_cnt - 1].size; in fadump_add_mem_range()
887 * Boot memory area needs separate PT_LOAD segment(s) as it in fadump_add_mem_range()
889 * So, fold only if the region is not boot memory area. in fadump_add_mem_range()
896 if (mrange_info->mem_range_cnt == mrange_info->max_mem_ranges) { in fadump_add_mem_range()
899 if (mrange_info->is_static) { in fadump_add_mem_range()
900 pr_err("Reached array size limit for %s memory ranges\n", in fadump_add_mem_range()
901 mrange_info->name); in fadump_add_mem_range()
902 return -ENOSPC; in fadump_add_mem_range()
910 mem_ranges = mrange_info->mem_ranges; in fadump_add_mem_range()
914 mem_ranges[mrange_info->mem_range_cnt].base = start; in fadump_add_mem_range()
915 mrange_info->mem_range_cnt++; in fadump_add_mem_range()
918 mem_ranges[mrange_info->mem_range_cnt - 1].size = (end - start); in fadump_add_mem_range()
919 pr_debug("%s_memory_range[%d] [%#016llx-%#016llx], %#llx bytes\n", in fadump_add_mem_range()
920 mrange_info->name, (mrange_info->mem_range_cnt - 1), in fadump_add_mem_range()
921 start, end - 1, (end - start)); in fadump_add_mem_range()
931 memcpy(elf->e_ident, ELFMAG, SELFMAG); in fadump_init_elfcore_header()
932 elf->e_ident[EI_CLASS] = ELF_CLASS; in fadump_init_elfcore_header()
933 elf->e_ident[EI_DATA] = ELF_DATA; in fadump_init_elfcore_header()
934 elf->e_ident[EI_VERSION] = EV_CURRENT; in fadump_init_elfcore_header()
935 elf->e_ident[EI_OSABI] = ELF_OSABI; in fadump_init_elfcore_header()
936 memset(elf->e_ident+EI_PAD, 0, EI_NIDENT-EI_PAD); in fadump_init_elfcore_header()
937 elf->e_type = ET_CORE; in fadump_init_elfcore_header()
938 elf->e_machine = ELF_ARCH; in fadump_init_elfcore_header()
939 elf->e_version = EV_CURRENT; in fadump_init_elfcore_header()
940 elf->e_entry = 0; in fadump_init_elfcore_header()
941 elf->e_phoff = sizeof(struct elfhdr); in fadump_init_elfcore_header()
942 elf->e_shoff = 0; in fadump_init_elfcore_header()
945 elf->e_flags = 2; in fadump_init_elfcore_header()
947 elf->e_flags = 1; in fadump_init_elfcore_header()
949 elf->e_flags = 0; in fadump_init_elfcore_header()
951 elf->e_ehsize = sizeof(struct elfhdr); in fadump_init_elfcore_header()
952 elf->e_phentsize = sizeof(struct elf_phdr); in fadump_init_elfcore_header()
953 elf->e_phnum = 0; in fadump_init_elfcore_header()
954 elf->e_shentsize = 0; in fadump_init_elfcore_header()
955 elf->e_shnum = 0; in fadump_init_elfcore_header()
956 elf->e_shstrndx = 0; in fadump_init_elfcore_header()
962 * If the given physical address falls within the boot memory region then
963 * return the relocated address that points to the dump region reserved
964 * for saving initial boot memory contents.
977 hole_size += (rstart - rlast); in fadump_relocate()
980 raddr += fw_dump.boot_mem_dest_addr - hole_size; in fadump_relocate()
994 phdr->p_align = 0; in populate_elf_pt_load()
995 phdr->p_memsz = size; in populate_elf_pt_load()
996 phdr->p_filesz = size; in populate_elf_pt_load()
997 phdr->p_paddr = start; in populate_elf_pt_load()
998 phdr->p_offset = offset; in populate_elf_pt_load()
999 phdr->p_type = PT_LOAD; in populate_elf_pt_load()
1000 phdr->p_flags = PF_R|PF_W|PF_X; in populate_elf_pt_load()
1001 phdr->p_vaddr = (unsigned long)__va(start); in populate_elf_pt_load()
1019 * The notes info will be populated later by platform-specific code. in fadump_populate_elfcorehdr()
1026 phdr->p_type = PT_NOTE; in fadump_populate_elfcorehdr()
1027 phdr->p_flags = 0; in fadump_populate_elfcorehdr()
1028 phdr->p_vaddr = 0; in fadump_populate_elfcorehdr()
1029 phdr->p_align = 0; in fadump_populate_elfcorehdr()
1030 phdr->p_offset = 0; in fadump_populate_elfcorehdr()
1031 phdr->p_paddr = 0; in fadump_populate_elfcorehdr()
1032 phdr->p_filesz = 0; in fadump_populate_elfcorehdr()
1033 phdr->p_memsz = 0; in fadump_populate_elfcorehdr()
1035 (elf->e_phnum)++; in fadump_populate_elfcorehdr()
1040 phdr->p_type = PT_NOTE; in fadump_populate_elfcorehdr()
1041 phdr->p_flags = 0; in fadump_populate_elfcorehdr()
1042 phdr->p_vaddr = 0; in fadump_populate_elfcorehdr()
1043 phdr->p_align = 0; in fadump_populate_elfcorehdr()
1044 phdr->p_paddr = phdr->p_offset = fdh->vmcoreinfo_raddr; in fadump_populate_elfcorehdr()
1045 phdr->p_memsz = phdr->p_filesz = fdh->vmcoreinfo_size; in fadump_populate_elfcorehdr()
1047 (elf->e_phnum)++; in fadump_populate_elfcorehdr()
1050 * Setup PT_LOAD sections. first include boot memory regions in fadump_populate_elfcorehdr()
1051 * and then add rest of the memory regions. in fadump_populate_elfcorehdr()
1061 (elf->e_phnum)++; in fadump_populate_elfcorehdr()
1065 /* Memory reserved for fadump in first kernel */ in fadump_populate_elfcorehdr()
1072 /* Boot memory regions already added, skip them now */ in fadump_populate_elfcorehdr()
1080 /* Handle memblock regions overlaps with fadump reserved area */ in fadump_populate_elfcorehdr()
1083 populate_elf_pt_load(phdr, mstart, ra_start - mstart, mstart); in fadump_populate_elfcorehdr()
1085 (elf->e_phnum)++; in fadump_populate_elfcorehdr()
1088 populate_elf_pt_load(phdr, ra_end, mend - ra_end, ra_end); in fadump_populate_elfcorehdr()
1090 populate_elf_pt_load(phdr, mstart, ra_start - mstart, mstart); in fadump_populate_elfcorehdr()
1092 populate_elf_pt_load(phdr, ra_end, mend - ra_end, ra_end); in fadump_populate_elfcorehdr()
1095 /* No overlap with fadump reserved memory region */ in fadump_populate_elfcorehdr()
1096 populate_elf_pt_load(phdr, mstart, mend - mstart, mstart); in fadump_populate_elfcorehdr()
1100 (elf->e_phnum)++; in fadump_populate_elfcorehdr()
1117 fdh->magic_number = FADUMP_CRASH_INFO_MAGIC; in init_fadump_header()
1118 fdh->version = FADUMP_HEADER_VERSION; in init_fadump_header()
1120 fdh->crashing_cpu = FADUMP_CPU_UNKNOWN; in init_fadump_header()
1126 fdh->vmcoreinfo_raddr = fadump_relocate(paddr_vmcoreinfo_note()); in init_fadump_header()
1127 fdh->vmcoreinfo_size = VMCOREINFO_NOTE_SIZE; in init_fadump_header()
1130 fdh->pt_regs_sz = sizeof(struct pt_regs); in init_fadump_header()
1135 fdh->cpu_mask = *cpu_possible_mask; in init_fadump_header()
1136 fdh->cpu_mask_sz = sizeof(struct cpumask); in init_fadump_header()
1146 * If no memory is reserved then we can not register for firmware- in register_fadump()
1150 return -ENODEV; in register_fadump()
1158 pr_debug("Registering for firmware-assisted kernel dump...\n"); in register_fadump()
1159 return fw_dump.ops->fadump_register(&fw_dump); in register_fadump()
1169 pr_debug("Invalidating firmware-assisted dump registration\n"); in fadump_cleanup()
1170 fw_dump.ops->fadump_invalidate(&fw_dump); in fadump_cleanup()
1172 /* Un-register Firmware-assisted dump if it was registered. */ in fadump_cleanup()
1173 fw_dump.ops->fadump_unregister(&fw_dump); in fadump_cleanup()
1176 if (fw_dump.ops->fadump_cleanup) in fadump_cleanup()
1177 fw_dump.ops->fadump_cleanup(&fw_dump); in fadump_cleanup()
1186 pr_info("freeing reserved memory (0x%llx - 0x%llx)\n", in fadump_free_reserved_memory()
1200 * Skip memory holes and free memory that was actually reserved.
1227 * Sort the mem ranges in-place and merge adjacent ranges
1228 * to minimize the memory ranges count.
1239 /* Sort the memory ranges */ in sort_and_merge_mem_ranges()
1240 mem_ranges = mrange_info->mem_ranges; in sort_and_merge_mem_ranges()
1241 for (i = 0; i < mrange_info->mem_range_cnt; i++) { in sort_and_merge_mem_ranges()
1243 for (j = (i + 1); j < mrange_info->mem_range_cnt; j++) { in sort_and_merge_mem_ranges()
1251 /* Merge adjacent reserved ranges */ in sort_and_merge_mem_ranges()
1253 for (i = 1; i < mrange_info->mem_range_cnt; i++) { in sort_and_merge_mem_ranges()
1254 base = mem_ranges[i-1].base; in sort_and_merge_mem_ranges()
1255 size = mem_ranges[i-1].size; in sort_and_merge_mem_ranges()
1266 mrange_info->mem_range_cnt = idx + 1; in sort_and_merge_mem_ranges()
1270 * Scan reserved-ranges to consider them while reserving/releasing
1271 * memory for FADump.
1276 int len, ret = -1; in early_init_dt_scan_reserved_ranges()
1279 /* reserved-ranges already scanned */ in early_init_dt_scan_reserved_ranges()
1283 prop = of_get_flat_dt_prop(node, "reserved-ranges", &len); in early_init_dt_scan_reserved_ranges()
1288 * Each reserved range is an (address,size) pair, 2 cells each, in early_init_dt_scan_reserved_ranges()
1301 pr_warn("some reserved ranges are ignored!\n"); in early_init_dt_scan_reserved_ranges()
1307 /* Compact reserved ranges */ in early_init_dt_scan_reserved_ranges()
1312 * Release the memory that was reserved during early boot to preserve the
1313 * crash'ed kernel's memory contents except reserved dump area (permanent
1314 * reservation) and reserved ranges used by F/W. The released memory will
1326 * If reserved ranges array limit is hit, overwrite the last reserved in fadump_release_memory()
1327 * memory range with reserved dump area to ensure it is excluded from in fadump_release_memory()
1328 * the memory being released (reused for next FADump registration). in fadump_release_memory()
1332 reserved_mrange_info.mem_range_cnt--; in fadump_release_memory()
1338 /* Get the reserved ranges list in order first. */ in fadump_release_memory()
1341 /* Exclude reserved ranges and release remaining memory */ in fadump_release_memory()
1365 * Before freeing the memory of `elfcorehdr`, reset the global in fadump_free_elfcorehdr_buf()
1367 * invalid memory. in fadump_free_elfcorehdr_buf()
1392 * memory structure for FADump re-registration. in fadump_invalidate_release_mem()
1394 if (fw_dump.ops->fadump_setup_metadata && in fadump_invalidate_release_mem()
1395 (fw_dump.ops->fadump_setup_metadata(&fw_dump) < 0)) in fadump_invalidate_release_mem()
1397 fw_dump.ops->fadump_init_mem_struct(&fw_dump); in fadump_invalidate_release_mem()
1404 int input = -1; in release_mem_store()
1407 return -EPERM; in release_mem_store()
1410 return -EINVAL; in release_mem_store()
1415 * memory, hence it will not be valid anymore. in release_mem_store()
1423 return -EINVAL; in release_mem_store()
1427 /* Release the reserved memory and disable the FADump */
1446 * to usersapce that fadump re-registration is not required on memory
1484 return -EPERM; in bootargs_append_store()
1487 return -EINVAL; in bootargs_append_store()
1495 return -ENOSPC; in bootargs_append_store()
1501 if (params[count-1] == '\n') in bootargs_append_store()
1502 params[count-1] = '\0'; in bootargs_append_store()
1512 int input = -1; in registered_store()
1515 return -EPERM; in registered_store()
1518 return -EINVAL; in registered_store()
1528 /* Un-register Firmware-assisted dump */ in registered_store()
1529 pr_debug("Un-register firmware-assisted dump\n"); in registered_store()
1530 fw_dump.ops->fadump_unregister(&fw_dump); in registered_store()
1534 /* Un-register Firmware-assisted dump */ in registered_store()
1535 fw_dump.ops->fadump_unregister(&fw_dump); in registered_store()
1537 /* Register Firmware-assisted dump */ in registered_store()
1541 ret = -EINVAL; in registered_store()
1556 fw_dump.ops->fadump_region_show(&fw_dump, m); in fadump_region_show()
1618 * - fadump_enabled -> fadump/enabled in fadump_init_files()
1619 * - fadump_registered -> fadump/registered in fadump_init_files()
1620 * - fadump_release_mem -> fadump/release_mem in fadump_init_files()
1658 * memory regions. in fadump_setup_elfcorehdr_buf()
1660 elf_phdr_cnt = 2 + fw_dump.boot_mem_regs_cnt + memblock_num_regions(memory); in fadump_setup_elfcorehdr_buf()
1668 return -ENOMEM; in fadump_setup_elfcorehdr_buf()
1677 * It checks the magic number, endianness, and size of non-primitive type
1682 if (fdh->magic_number == FADUMP_CRASH_INFO_MAGIC_OLD) { in is_fadump_header_compatible()
1687 if (fdh->magic_number != FADUMP_CRASH_INFO_MAGIC) { in is_fadump_header_compatible()
1688 if (fdh->magic_number == swab64(FADUMP_CRASH_INFO_MAGIC)) in is_fadump_header_compatible()
1697 * Dump collection is not safe if the size of non-primitive type members in is_fadump_header_compatible()
1700 if (fdh->pt_regs_sz != sizeof(struct pt_regs) || in is_fadump_header_compatible()
1701 fdh->cpu_mask_sz != sizeof(struct cpumask)) { in is_fadump_header_compatible()
1730 if (fw_dump.ops->fadump_process(&fw_dump) < 0) in fadump_process()
1747 * Reserve memory to store additional parameters to be passed
1757 /* This memory can't be used by PFW or bootloader as it is shared across kernels */ in fadump_setup_param_area()
1760 * Anywhere in the upper half should be good enough as all memory in fadump_setup_param_area()
1768 * if the first memory block size is 768MB or higher. in fadump_setup_param_area()
1775 * memory for passing additional parameters in this range to avoid in fadump_setup_param_area()
1795 * Prepare for firmware-assisted dump.
1815 /* Initialize the kernel dump memory structure and register with f/w */ in setup_fadump()
1817 fw_dump.ops->fadump_init_mem_struct(&fw_dump); in setup_fadump()
1852 * preserve crash data. The subsequent memory preserving kernel boot
1859 * If last boot has crashed then reserve all the memory in fadump_reserve_mem()
1860 * above boot memory to preserve crash data. in fadump_reserve_mem()
1865 pr_debug("FADump-aware kernel..\n"); in fadump_reserve_mem()
1877 msize = mend - mstart; in fadump_reserve_crash_area()
1883 msize -= (base - mstart); in fadump_reserve_crash_area()
1887 pr_info("Reserving %lluMB of memory at %#016llx for preserving crash data", in fadump_reserve_crash_area()