Commit 886db323 authored by Thiago Jung Bauermann's avatar Thiago Jung Bauermann Committed by Rob Herring

powerpc/kexec_file: Restore FDT size estimation for kdump kernel

kexec_fdt_totalsize_ppc64() includes the base FDT size in its size
calculation, but commit 3c985d31 ("powerpc: Use common
of_kexec_alloc_and_setup_fdt()") changed the kexec code to use the
generic function of_kexec_alloc_and_setup_fdt() which already includes
the base FDT size. That change made the code overestimate the size a bit
by counting twice the space required for the kernel command line and
/chosen properties.

Therefore change kexec_fdt_totalsize_ppc64() to calculate just the extra
space needed by the kdump kernel, and change the function name so that it
better reflects what the function is now doing.
Signed-off-by: default avatarThiago Jung Bauermann <bauerman@linux.ibm.com>
Reviewed-by: default avatarLakshmi Ramasubramanian <nramas@linux.microsoft.com>
Reviewed-by: default avatarHari Bathini <hbathini@linux.ibm.com>
Acked-by: default avatarMichael Ellerman <mpe@ellerman.id.au>
[robh: reword commit msg as no longer a fix from merging to branches]
Signed-off-by: default avatarRob Herring <robh@kernel.org>
Link: https://lore.kernel.org/r/20210220005204.1417200-1-bauerman@linux.ibm.com
parent dce92f6b
...@@ -124,7 +124,7 @@ int load_crashdump_segments_ppc64(struct kimage *image, ...@@ -124,7 +124,7 @@ int load_crashdump_segments_ppc64(struct kimage *image,
int setup_purgatory_ppc64(struct kimage *image, const void *slave_code, int setup_purgatory_ppc64(struct kimage *image, const void *slave_code,
const void *fdt, unsigned long kernel_load_addr, const void *fdt, unsigned long kernel_load_addr,
unsigned long fdt_load_addr); unsigned long fdt_load_addr);
unsigned int kexec_fdt_totalsize_ppc64(struct kimage *image); unsigned int kexec_extra_fdt_size_ppc64(struct kimage *image);
int setup_new_fdt_ppc64(const struct kimage *image, void *fdt, int setup_new_fdt_ppc64(const struct kimage *image, void *fdt,
unsigned long initrd_load_addr, unsigned long initrd_load_addr,
unsigned long initrd_len, const char *cmdline); unsigned long initrd_len, const char *cmdline);
......
...@@ -104,7 +104,7 @@ static void *elf64_load(struct kimage *image, char *kernel_buf, ...@@ -104,7 +104,7 @@ static void *elf64_load(struct kimage *image, char *kernel_buf,
fdt = of_kexec_alloc_and_setup_fdt(image, initrd_load_addr, fdt = of_kexec_alloc_and_setup_fdt(image, initrd_load_addr,
initrd_len, cmdline, initrd_len, cmdline,
kexec_fdt_totalsize_ppc64(image)); kexec_extra_fdt_size_ppc64(image));
if (!fdt) { if (!fdt) {
pr_err("Error setting up the new device tree.\n"); pr_err("Error setting up the new device tree.\n");
ret = -EINVAL; ret = -EINVAL;
......
...@@ -927,37 +927,27 @@ int setup_purgatory_ppc64(struct kimage *image, const void *slave_code, ...@@ -927,37 +927,27 @@ int setup_purgatory_ppc64(struct kimage *image, const void *slave_code,
} }
/** /**
* kexec_fdt_totalsize_ppc64 - Return the estimated size needed to setup FDT * kexec_extra_fdt_size_ppc64 - Return the estimated additional size needed to
* for kexec/kdump kernel. * setup FDT for kexec/kdump kernel.
* @image: kexec image being loaded. * @image: kexec image being loaded.
* *
* Returns the estimated size needed for kexec/kdump kernel FDT. * Returns the estimated extra size needed for kexec/kdump kernel FDT.
*/ */
unsigned int kexec_fdt_totalsize_ppc64(struct kimage *image) unsigned int kexec_extra_fdt_size_ppc64(struct kimage *image)
{ {
unsigned int fdt_size;
u64 usm_entries; u64 usm_entries;
/*
* The below estimate more than accounts for a typical kexec case where
* the additional space is to accommodate things like kexec cmdline,
* chosen node with properties for initrd start & end addresses and
* a property to indicate kexec boot..
*/
fdt_size = fdt_totalsize(initial_boot_params) + (2 * COMMAND_LINE_SIZE);
if (image->type != KEXEC_TYPE_CRASH) if (image->type != KEXEC_TYPE_CRASH)
return fdt_size; return 0;
/* /*
* For kdump kernel, also account for linux,usable-memory and * For kdump kernel, account for linux,usable-memory and
* linux,drconf-usable-memory properties. Get an approximate on the * linux,drconf-usable-memory properties. Get an approximate on the
* number of usable memory entries and use for FDT size estimation. * number of usable memory entries and use for FDT size estimation.
*/ */
usm_entries = ((memblock_end_of_DRAM() / drmem_lmb_size()) + usm_entries = ((memblock_end_of_DRAM() / drmem_lmb_size()) +
(2 * (resource_size(&crashk_res) / drmem_lmb_size()))); (2 * (resource_size(&crashk_res) / drmem_lmb_size())));
fdt_size += (unsigned int)(usm_entries * sizeof(u64)); return (unsigned int)(usm_entries * sizeof(u64));
return fdt_size;
} }
/** /**
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment