Kernel components that use Flattened Device Tree (FDT) allocate kernel memory and call fdt_open_into() to reorganize the tree into a form suitable for the read-write operations. These operations can be combined into a single function to allocate and initialize the FDT so the different architecures do not have to duplicate the code. Define of_alloc_and_init_fdt() and of_free_fdt() in drivers/of/kexec.c to allocate and initialize FDT, and to free the FDT buffer respectively. Signed-off-by: Lakshmi Ramasubramanian <nramas@xxxxxxxxxxxxxxxxxxx> Suggested-by: Rob Herring <robh@xxxxxxxxxx> Suggested-by: Joe Perches <joe@xxxxxxxxxxx> --- drivers/of/kexec.c | 37 +++++++++++++++++++++++++++++++++++++ include/linux/of.h | 2 ++ 2 files changed, 39 insertions(+) diff --git a/drivers/of/kexec.c b/drivers/of/kexec.c index 5ae0e5d90f55..197e71104f47 100644 --- a/drivers/of/kexec.c +++ b/drivers/of/kexec.c @@ -11,6 +11,7 @@ #include <linux/kernel.h> #include <linux/kexec.h> +#include <linux/mm.h> #include <linux/memblock.h> #include <linux/libfdt.h> #include <linux/of.h> @@ -28,6 +29,42 @@ #define FDT_PROP_RNG_SEED "rng-seed" #define RNG_SEED_SIZE 128 +/** + * of_alloc_and_init_fdt - Allocate and initialize a Flattened device tree + * + * @fdt_size: Flattened device tree size + * + * Return the allocated FDT buffer on success, or NULL on error. + */ +void *of_alloc_and_init_fdt(unsigned int fdt_size) +{ + void *fdt; + int ret; + + fdt = kvmalloc(fdt_size, GFP_KERNEL); + if (!fdt) + return NULL; + + ret = fdt_open_into(initial_boot_params, fdt, fdt_size); + if (ret < 0) { + pr_err("Error setting up the new device tree.\n"); + kvfree(fdt); + fdt = NULL; + } + + return fdt; +} + +/** + * of_free_fdt - Free the buffer for Flattened device tree + * + * @fdt: Flattened device tree buffer to free + */ +void of_free_fdt(void *fdt) +{ + kvfree(fdt); +} + /** * fdt_find_and_del_mem_rsv - delete memory reservation with given address and size * diff --git a/include/linux/of.h b/include/linux/of.h index 19f77dd12507..9f0261761e28 100644 --- a/include/linux/of.h +++ b/include/linux/of.h @@ -563,6 +563,8 @@ struct kimage; int of_kexec_setup_new_fdt(const struct kimage *image, void *fdt, unsigned long initrd_load_addr, unsigned long initrd_len, const char *cmdline); +void *of_alloc_and_init_fdt(unsigned int fdt_size); +void of_free_fdt(void *fdt); #ifdef CONFIG_IMA_KEXEC int of_ima_add_kexec_buffer(struct kimage *image, -- 2.30.0