Re: [PATCH v17 02/10] of: Add a common kexec FDT setup function

2021-02-12 Thread Thiago Jung Bauermann


Lakshmi Ramasubramanian  writes:

> On 2/12/21 10:24 AM, Rob Herring wrote:
>> On Fri, Feb 12, 2021 at 11:19 AM Lakshmi Ramasubramanian
>>  wrote:
>>>
>>> On 2/12/21 6:38 AM, Rob Herring wrote:
 On Thu, Feb 11, 2021 at 7:17 PM Lakshmi Ramasubramanian
  wrote:
>
> On 2/11/21 5:09 PM, Thiago Jung Bauermann wrote:
>>
>> There's actually a complication that I just noticed and needs to be
>> addressed. More below.
>>
>
> <...>
>
>>> +
>>> +/*
>>> + * of_kexec_alloc_and_setup_fdt - Alloc and setup a new Flattened 
>>> Device Tree
>>> + *
>>> + * @image:  kexec image being loaded.
>>> + * @initrd_load_addr:   Address where the next initrd will be 
>>> loaded.
>>> + * @initrd_len: Size of the next initrd, or 0 if there 
>>> will be none.
>>> + * @cmdline:Command line for the next kernel, or NULL 
>>> if there will
>>> + *  be none.
>>> + *
>>> + * Return: fdt on success, or NULL errno on error.
>>> + */
>>> +void *of_kexec_alloc_and_setup_fdt(const struct kimage *image,
>>> +   unsigned long initrd_load_addr,
>>> +   unsigned long initrd_len,
>>> +   const char *cmdline)
>>> +{
>>> +void *fdt;
>>> +int ret, chosen_node;
>>> +const void *prop;
>>> +unsigned long fdt_size;
>>> +
>>> +fdt_size = fdt_totalsize(initial_boot_params) +
>>> +   (cmdline ? strlen(cmdline) : 0) +
>>> +   FDT_EXTRA_SPACE;
>>
>> Just adding 4 KB to initial_boot_params won't be enough for crash
>> kernels on ppc64. The current powerpc code doubles the size of
>> initial_boot_params (which is normally larger than 4 KB) and even that
>> isn't enough. A patch was added to powerpc/next today which uses a more
>> precise (but arch-specific) formula:
>>
>> https://lore.kernel.org/linuxppc-dev/161243826811.119001.14083048209224609814.stgit@hbathini/
>>
>> So I believe we need a hook here where architectures can provide their
>> own specific calculation for the size of the fdt. Perhaps a weakly
>> defined function providing a default implementation which an
>> arch-specific file can override (a la arch_kexec_kernel_image_load())?
>>
>> Then the powerpc specific hook would be the kexec_fdt_totalsize_ppc64()
>> function from the patch I linked above.
>>
>
> Do you think it'd better to add "fdt_size" parameter to
> of_kexec_alloc_and_setup_fdt() so that the caller can provide the
> desired FDT buffer size?

 Yes, I guess so. But please define the param as extra size, not total
 size. The kernel command line size addition can be in the common code.
>>>
>>> Will do. Just to clarify -
>>>
>>> The common code will do:
>>>
>>> fdt_totalsize(initial_boot_params) + strlen(cmdline) + extra_fdt_size
>>>
>>> The caller will pass "extra_fdt_size"
>>> ARM64 => 4KB
>>> PPC64 => fdt_totalsize(initial_boot_params) - which will be updated when
>>> the patch Thiago had referred to is merged.
>> Yes, I'd leave the 4KB in there by default and arm64 use 0.
>> 
>
> Sounds good.
>
> common:
> fdt_totalsize(initial_boot_params) + strlen(cmdline) + 0x1000 + extra
>
> arm64 => 0 for extra
> ppc => fdt_totalsize(initial_boot_params) for extra.

Looks good to me.

-- 
Thiago Jung Bauermann
IBM Linux Technology Center


Re: [PATCH v17 02/10] of: Add a common kexec FDT setup function

2021-02-12 Thread Lakshmi Ramasubramanian

On 2/12/21 10:24 AM, Rob Herring wrote:

On Fri, Feb 12, 2021 at 11:19 AM Lakshmi Ramasubramanian
 wrote:


On 2/12/21 6:38 AM, Rob Herring wrote:

On Thu, Feb 11, 2021 at 7:17 PM Lakshmi Ramasubramanian
 wrote:


On 2/11/21 5:09 PM, Thiago Jung Bauermann wrote:


There's actually a complication that I just noticed and needs to be
addressed. More below.



<...>


+
+/*
+ * of_kexec_alloc_and_setup_fdt - Alloc and setup a new Flattened Device Tree
+ *
+ * @image:  kexec image being loaded.
+ * @initrd_load_addr:   Address where the next initrd will be loaded.
+ * @initrd_len: Size of the next initrd, or 0 if there will be 
none.
+ * @cmdline:Command line for the next kernel, or NULL if there 
will
+ *  be none.
+ *
+ * Return: fdt on success, or NULL errno on error.
+ */
+void *of_kexec_alloc_and_setup_fdt(const struct kimage *image,
+   unsigned long initrd_load_addr,
+   unsigned long initrd_len,
+   const char *cmdline)
+{
+void *fdt;
+int ret, chosen_node;
+const void *prop;
+unsigned long fdt_size;
+
+fdt_size = fdt_totalsize(initial_boot_params) +
+   (cmdline ? strlen(cmdline) : 0) +
+   FDT_EXTRA_SPACE;


Just adding 4 KB to initial_boot_params won't be enough for crash
kernels on ppc64. The current powerpc code doubles the size of
initial_boot_params (which is normally larger than 4 KB) and even that
isn't enough. A patch was added to powerpc/next today which uses a more
precise (but arch-specific) formula:

https://lore.kernel.org/linuxppc-dev/161243826811.119001.14083048209224609814.stgit@hbathini/

So I believe we need a hook here where architectures can provide their
own specific calculation for the size of the fdt. Perhaps a weakly
defined function providing a default implementation which an
arch-specific file can override (a la arch_kexec_kernel_image_load())?

Then the powerpc specific hook would be the kexec_fdt_totalsize_ppc64()
function from the patch I linked above.



Do you think it'd better to add "fdt_size" parameter to
of_kexec_alloc_and_setup_fdt() so that the caller can provide the
desired FDT buffer size?


Yes, I guess so. But please define the param as extra size, not total
size. The kernel command line size addition can be in the common code.


Will do. Just to clarify -

The common code will do:

fdt_totalsize(initial_boot_params) + strlen(cmdline) + extra_fdt_size

The caller will pass "extra_fdt_size"
ARM64 => 4KB
PPC64 => fdt_totalsize(initial_boot_params) - which will be updated when
the patch Thiago had referred to is merged.


Yes, I'd leave the 4KB in there by default and arm64 use 0.



Sounds good.

common:
fdt_totalsize(initial_boot_params) + strlen(cmdline) + 0x1000 + extra

arm64 => 0 for extra
ppc => fdt_totalsize(initial_boot_params) for extra.

 -lakshmi



Re: [PATCH v17 02/10] of: Add a common kexec FDT setup function

2021-02-12 Thread Rob Herring
On Fri, Feb 12, 2021 at 11:19 AM Lakshmi Ramasubramanian
 wrote:
>
> On 2/12/21 6:38 AM, Rob Herring wrote:
> > On Thu, Feb 11, 2021 at 7:17 PM Lakshmi Ramasubramanian
> >  wrote:
> >>
> >> On 2/11/21 5:09 PM, Thiago Jung Bauermann wrote:
> >>>
> >>> There's actually a complication that I just noticed and needs to be
> >>> addressed. More below.
> >>>
> >>
> >> <...>
> >>
>  +
>  +/*
>  + * of_kexec_alloc_and_setup_fdt - Alloc and setup a new Flattened 
>  Device Tree
>  + *
>  + * @image:  kexec image being loaded.
>  + * @initrd_load_addr:   Address where the next initrd will be 
>  loaded.
>  + * @initrd_len: Size of the next initrd, or 0 if there will 
>  be none.
>  + * @cmdline:Command line for the next kernel, or NULL 
>  if there will
>  + *  be none.
>  + *
>  + * Return: fdt on success, or NULL errno on error.
>  + */
>  +void *of_kexec_alloc_and_setup_fdt(const struct kimage *image,
>  +   unsigned long initrd_load_addr,
>  +   unsigned long initrd_len,
>  +   const char *cmdline)
>  +{
>  +void *fdt;
>  +int ret, chosen_node;
>  +const void *prop;
>  +unsigned long fdt_size;
>  +
>  +fdt_size = fdt_totalsize(initial_boot_params) +
>  +   (cmdline ? strlen(cmdline) : 0) +
>  +   FDT_EXTRA_SPACE;
> >>>
> >>> Just adding 4 KB to initial_boot_params won't be enough for crash
> >>> kernels on ppc64. The current powerpc code doubles the size of
> >>> initial_boot_params (which is normally larger than 4 KB) and even that
> >>> isn't enough. A patch was added to powerpc/next today which uses a more
> >>> precise (but arch-specific) formula:
> >>>
> >>> https://lore.kernel.org/linuxppc-dev/161243826811.119001.14083048209224609814.stgit@hbathini/
> >>>
> >>> So I believe we need a hook here where architectures can provide their
> >>> own specific calculation for the size of the fdt. Perhaps a weakly
> >>> defined function providing a default implementation which an
> >>> arch-specific file can override (a la arch_kexec_kernel_image_load())?
> >>>
> >>> Then the powerpc specific hook would be the kexec_fdt_totalsize_ppc64()
> >>> function from the patch I linked above.
> >>>
> >>
> >> Do you think it'd better to add "fdt_size" parameter to
> >> of_kexec_alloc_and_setup_fdt() so that the caller can provide the
> >> desired FDT buffer size?
> >
> > Yes, I guess so. But please define the param as extra size, not total
> > size. The kernel command line size addition can be in the common code.
>
> Will do. Just to clarify -
>
> The common code will do:
>
> fdt_totalsize(initial_boot_params) + strlen(cmdline) + extra_fdt_size
>
> The caller will pass "extra_fdt_size"
> ARM64 => 4KB
> PPC64 => fdt_totalsize(initial_boot_params) - which will be updated when
> the patch Thiago had referred to is merged.

Yes, I'd leave the 4KB in there by default and arm64 use 0.

Rob


Re: [PATCH v17 02/10] of: Add a common kexec FDT setup function

2021-02-12 Thread Lakshmi Ramasubramanian

On 2/12/21 6:38 AM, Rob Herring wrote:

On Thu, Feb 11, 2021 at 7:17 PM Lakshmi Ramasubramanian
 wrote:


On 2/11/21 5:09 PM, Thiago Jung Bauermann wrote:


There's actually a complication that I just noticed and needs to be
addressed. More below.



<...>


+
+/*
+ * of_kexec_alloc_and_setup_fdt - Alloc and setup a new Flattened Device Tree
+ *
+ * @image:  kexec image being loaded.
+ * @initrd_load_addr:   Address where the next initrd will be loaded.
+ * @initrd_len: Size of the next initrd, or 0 if there will be 
none.
+ * @cmdline:Command line for the next kernel, or NULL if there 
will
+ *  be none.
+ *
+ * Return: fdt on success, or NULL errno on error.
+ */
+void *of_kexec_alloc_and_setup_fdt(const struct kimage *image,
+   unsigned long initrd_load_addr,
+   unsigned long initrd_len,
+   const char *cmdline)
+{
+void *fdt;
+int ret, chosen_node;
+const void *prop;
+unsigned long fdt_size;
+
+fdt_size = fdt_totalsize(initial_boot_params) +
+   (cmdline ? strlen(cmdline) : 0) +
+   FDT_EXTRA_SPACE;


Just adding 4 KB to initial_boot_params won't be enough for crash
kernels on ppc64. The current powerpc code doubles the size of
initial_boot_params (which is normally larger than 4 KB) and even that
isn't enough. A patch was added to powerpc/next today which uses a more
precise (but arch-specific) formula:

https://lore.kernel.org/linuxppc-dev/161243826811.119001.14083048209224609814.stgit@hbathini/

So I believe we need a hook here where architectures can provide their
own specific calculation for the size of the fdt. Perhaps a weakly
defined function providing a default implementation which an
arch-specific file can override (a la arch_kexec_kernel_image_load())?

Then the powerpc specific hook would be the kexec_fdt_totalsize_ppc64()
function from the patch I linked above.



Do you think it'd better to add "fdt_size" parameter to
of_kexec_alloc_and_setup_fdt() so that the caller can provide the
desired FDT buffer size?


Yes, I guess so. But please define the param as extra size, not total
size. The kernel command line size addition can be in the common code.


Will do. Just to clarify -

The common code will do:

fdt_totalsize(initial_boot_params) + strlen(cmdline) + extra_fdt_size

The caller will pass "extra_fdt_size"
ARM64 => 4KB
PPC64 => fdt_totalsize(initial_boot_params) - which will be updated when 
the patch Thiago had referred to is merged.




The above change is also going to conflict, so I think this may have
to wait. Or I'll take the common and arm bits and powerpc can be
converted next cycle (or after the merge window).



thanks.

 -lakshmi




Re: [PATCH v17 02/10] of: Add a common kexec FDT setup function

2021-02-12 Thread Rob Herring
On Thu, Feb 11, 2021 at 7:17 PM Lakshmi Ramasubramanian
 wrote:
>
> On 2/11/21 5:09 PM, Thiago Jung Bauermann wrote:
> >
> > There's actually a complication that I just noticed and needs to be
> > addressed. More below.
> >
>
> <...>
>
> >> +
> >> +/*
> >> + * of_kexec_alloc_and_setup_fdt - Alloc and setup a new Flattened Device 
> >> Tree
> >> + *
> >> + * @image:  kexec image being loaded.
> >> + * @initrd_load_addr:   Address where the next initrd will be loaded.
> >> + * @initrd_len: Size of the next initrd, or 0 if there will 
> >> be none.
> >> + * @cmdline:Command line for the next kernel, or NULL if 
> >> there will
> >> + *  be none.
> >> + *
> >> + * Return: fdt on success, or NULL errno on error.
> >> + */
> >> +void *of_kexec_alloc_and_setup_fdt(const struct kimage *image,
> >> +   unsigned long initrd_load_addr,
> >> +   unsigned long initrd_len,
> >> +   const char *cmdline)
> >> +{
> >> +void *fdt;
> >> +int ret, chosen_node;
> >> +const void *prop;
> >> +unsigned long fdt_size;
> >> +
> >> +fdt_size = fdt_totalsize(initial_boot_params) +
> >> +   (cmdline ? strlen(cmdline) : 0) +
> >> +   FDT_EXTRA_SPACE;
> >
> > Just adding 4 KB to initial_boot_params won't be enough for crash
> > kernels on ppc64. The current powerpc code doubles the size of
> > initial_boot_params (which is normally larger than 4 KB) and even that
> > isn't enough. A patch was added to powerpc/next today which uses a more
> > precise (but arch-specific) formula:
> >
> > https://lore.kernel.org/linuxppc-dev/161243826811.119001.14083048209224609814.stgit@hbathini/
> >
> > So I believe we need a hook here where architectures can provide their
> > own specific calculation for the size of the fdt. Perhaps a weakly
> > defined function providing a default implementation which an
> > arch-specific file can override (a la arch_kexec_kernel_image_load())?
> >
> > Then the powerpc specific hook would be the kexec_fdt_totalsize_ppc64()
> > function from the patch I linked above.
> >
>
> Do you think it'd better to add "fdt_size" parameter to
> of_kexec_alloc_and_setup_fdt() so that the caller can provide the
> desired FDT buffer size?

Yes, I guess so. But please define the param as extra size, not total
size. The kernel command line size addition can be in the common code.

The above change is also going to conflict, so I think this may have
to wait. Or I'll take the common and arm bits and powerpc can be
converted next cycle (or after the merge window).

Rob


Re: [PATCH v17 02/10] of: Add a common kexec FDT setup function

2021-02-11 Thread Thiago Jung Bauermann


Lakshmi Ramasubramanian  writes:

> On 2/11/21 5:09 PM, Thiago Jung Bauermann wrote:
>> There's actually a complication that I just noticed and needs to be
>> addressed. More below.
>> 
>
> <...>
>
>>> +
>>> +/*
>>> + * of_kexec_alloc_and_setup_fdt - Alloc and setup a new Flattened Device 
>>> Tree
>>> + *
>>> + * @image: kexec image being loaded.
>>> + * @initrd_load_addr:  Address where the next initrd will be loaded.
>>> + * @initrd_len:Size of the next initrd, or 0 if there will be 
>>> none.
>>> + * @cmdline:   Command line for the next kernel, or NULL if 
>>> there will
>>> + * be none.
>>> + *
>>> + * Return: fdt on success, or NULL errno on error.
>>> + */
>>> +void *of_kexec_alloc_and_setup_fdt(const struct kimage *image,
>>> +  unsigned long initrd_load_addr,
>>> +  unsigned long initrd_len,
>>> +  const char *cmdline)
>>> +{
>>> +   void *fdt;
>>> +   int ret, chosen_node;
>>> +   const void *prop;
>>> +   unsigned long fdt_size;
>>> +
>>> +   fdt_size = fdt_totalsize(initial_boot_params) +
>>> +  (cmdline ? strlen(cmdline) : 0) +
>>> +  FDT_EXTRA_SPACE;
>> Just adding 4 KB to initial_boot_params won't be enough for crash
>> kernels on ppc64. The current powerpc code doubles the size of
>> initial_boot_params (which is normally larger than 4 KB) and even that
>> isn't enough. A patch was added to powerpc/next today which uses a more
>> precise (but arch-specific) formula:
>> https://lore.kernel.org/linuxppc-dev/161243826811.119001.14083048209224609814.stgit@hbathini/
>> So I believe we need a hook here where architectures can provide their
>> own specific calculation for the size of the fdt. Perhaps a weakly
>> defined function providing a default implementation which an
>> arch-specific file can override (a la arch_kexec_kernel_image_load())?
>> Then the powerpc specific hook would be the kexec_fdt_totalsize_ppc64()
>> function from the patch I linked above.
>> 
>
> Do you think it'd better to add "fdt_size" parameter to
> of_kexec_alloc_and_setup_fdt() so that the caller can provide the 
> desired FDT buffer size?

Yes, that is actually simpler and better than my idea. :-)

-- 
Thiago Jung Bauermann
IBM Linux Technology Center


Re: [PATCH v17 02/10] of: Add a common kexec FDT setup function

2021-02-11 Thread Lakshmi Ramasubramanian

On 2/11/21 5:09 PM, Thiago Jung Bauermann wrote:


There's actually a complication that I just noticed and needs to be
addressed. More below.



<...>


+
+/*
+ * of_kexec_alloc_and_setup_fdt - Alloc and setup a new Flattened Device Tree
+ *
+ * @image: kexec image being loaded.
+ * @initrd_load_addr:  Address where the next initrd will be loaded.
+ * @initrd_len:Size of the next initrd, or 0 if there will be 
none.
+ * @cmdline:   Command line for the next kernel, or NULL if there will
+ * be none.
+ *
+ * Return: fdt on success, or NULL errno on error.
+ */
+void *of_kexec_alloc_and_setup_fdt(const struct kimage *image,
+  unsigned long initrd_load_addr,
+  unsigned long initrd_len,
+  const char *cmdline)
+{
+   void *fdt;
+   int ret, chosen_node;
+   const void *prop;
+   unsigned long fdt_size;
+
+   fdt_size = fdt_totalsize(initial_boot_params) +
+  (cmdline ? strlen(cmdline) : 0) +
+  FDT_EXTRA_SPACE;


Just adding 4 KB to initial_boot_params won't be enough for crash
kernels on ppc64. The current powerpc code doubles the size of
initial_boot_params (which is normally larger than 4 KB) and even that
isn't enough. A patch was added to powerpc/next today which uses a more
precise (but arch-specific) formula:

https://lore.kernel.org/linuxppc-dev/161243826811.119001.14083048209224609814.stgit@hbathini/

So I believe we need a hook here where architectures can provide their
own specific calculation for the size of the fdt. Perhaps a weakly
defined function providing a default implementation which an
arch-specific file can override (a la arch_kexec_kernel_image_load())?

Then the powerpc specific hook would be the kexec_fdt_totalsize_ppc64()
function from the patch I linked above.



Do you think it'd better to add "fdt_size" parameter to 
of_kexec_alloc_and_setup_fdt() so that the caller can provide the 
desired FDT buffer size?


thanks,
 -lakshmi


Re: [PATCH v17 02/10] of: Add a common kexec FDT setup function

2021-02-11 Thread Thiago Jung Bauermann


There's actually a complication that I just noticed and needs to be
addressed. More below.

Lakshmi Ramasubramanian  writes:

> From: Rob Herring 
>
> Both arm64 and powerpc do essentially the same FDT /chosen setup for
> kexec.  The differences are either omissions that arm64 should have
> or additional properties that will be ignored.  The setup code can be
> combined and shared by both powerpc and arm64.
>
> The differences relative to the arm64 version:
>  - If /chosen doesn't exist, it will be created (should never happen).
>  - Any old dtb and initrd reserved memory will be released.
>  - The new initrd and elfcorehdr are marked reserved.
>  - "linux,booted-from-kexec" is set.
>
> The differences relative to the powerpc version:
>  - "kaslr-seed" and "rng-seed" may be set.
>  - "linux,elfcorehdr" is set.
>  - Any existing "linux,usable-memory-range" is removed.
>
> Combine the code for setting up the /chosen node in the FDT and updating
> the memory reservation for kexec, for powerpc and arm64, in
> of_kexec_alloc_and_setup_fdt() and move it to "drivers/of/kexec.c".
>
> Signed-off-by: Rob Herring 
> Signed-off-by: Lakshmi Ramasubramanian 
> ---
>  drivers/of/Makefile |   6 ++
>  drivers/of/kexec.c  | 258 
>  include/linux/of.h  |  13 +++
>  3 files changed, 277 insertions(+)
>  create mode 100644 drivers/of/kexec.c
>
> diff --git a/drivers/of/Makefile b/drivers/of/Makefile
> index 6e1e5212f058..c13b982084a3 100644
> --- a/drivers/of/Makefile
> +++ b/drivers/of/Makefile
> @@ -14,4 +14,10 @@ obj-$(CONFIG_OF_RESOLVE)  += resolver.o
>  obj-$(CONFIG_OF_OVERLAY) += overlay.o
>  obj-$(CONFIG_OF_NUMA) += of_numa.o
>  
> +ifdef CONFIG_KEXEC_FILE
> +ifdef CONFIG_OF_FLATTREE
> +obj-y+= kexec.o
> +endif
> +endif
> +
>  obj-$(CONFIG_OF_UNITTEST) += unittest-data/
> diff --git a/drivers/of/kexec.c b/drivers/of/kexec.c
> new file mode 100644
> index ..469e09613cdd
> --- /dev/null
> +++ b/drivers/of/kexec.c
> @@ -0,0 +1,258 @@
> +// SPDX-License-Identifier: GPL-2.0-only
> +/*
> + * Copyright (C) 2020 Arm Limited
> + *
> + * Based on arch/arm64/kernel/machine_kexec_file.c:
> + *  Copyright (C) 2018 Linaro Limited
> + *
> + * And arch/powerpc/kexec/file_load.c:
> + *  Copyright (C) 2016  IBM Corporation
> + */
> +
> +#include 
> +#include 
> +#include 
> +#include 
> +#include 
> +#include 
> +#include 
> +
> +/* relevant device tree properties */
> +#define FDT_PROP_KEXEC_ELFHDR"linux,elfcorehdr"
> +#define FDT_PROP_MEM_RANGE   "linux,usable-memory-range"
> +#define FDT_PROP_INITRD_START"linux,initrd-start"
> +#define FDT_PROP_INITRD_END  "linux,initrd-end"
> +#define FDT_PROP_BOOTARGS"bootargs"
> +#define FDT_PROP_KASLR_SEED  "kaslr-seed"
> +#define FDT_PROP_RNG_SEED"rng-seed"
> +#define RNG_SEED_SIZE128
> +
> +/**
> + * fdt_find_and_del_mem_rsv - delete memory reservation with given address 
> and size
> + *
> + * @fdt: Flattened device tree for the current kernel.
> + * @start:   Starting address of the reserved memory.
> + * @size:Size of the reserved memory.
> + *
> + * Return: 0 on success, or negative errno on error.
> + */
> +static int fdt_find_and_del_mem_rsv(void *fdt, unsigned long start, unsigned 
> long size)
> +{
> + int i, ret, num_rsvs = fdt_num_mem_rsv(fdt);
> +
> + for (i = 0; i < num_rsvs; i++) {
> + u64 rsv_start, rsv_size;
> +
> + ret = fdt_get_mem_rsv(fdt, i, &rsv_start, &rsv_size);
> + if (ret) {
> + pr_err("Malformed device tree.\n");
> + return -EINVAL;
> + }
> +
> + if (rsv_start == start && rsv_size == size) {
> + ret = fdt_del_mem_rsv(fdt, i);
> + if (ret) {
> + pr_err("Error deleting device tree 
> reservation.\n");
> + return -EINVAL;
> + }
> +
> + return 0;
> + }
> + }
> +
> + return -ENOENT;
> +}
> +
> +/*
> + * of_kexec_alloc_and_setup_fdt - Alloc and setup a new Flattened Device Tree
> + *
> + * @image:   kexec image being loaded.
> + * @initrd_load_addr:Address where the next initrd will be loaded.
> + * @initrd_len:  Size of the next initrd, or 0 if there will be 
> none.
> + * @cmdline: Command line for the next kernel, or NULL if there will
> + *   be none.
> + *
> + * Return: fdt on success, or NULL errno on error.
> + */
> +void *of_kexec_alloc_and_setup_fdt(const struct kimage *image,
> +unsigned long initrd_load_addr,
> +unsigned long initrd_len,
> +const char *cmdline)
> +{
> + void *fdt;
> + int ret, chosen_node;
> + const void *prop;
> + unsigned long fdt_size;
> +
> + fdt_size = fdt_totalsize(initial_boot_params) +
> +(

Re: [PATCH v17 02/10] of: Add a common kexec FDT setup function

2021-02-10 Thread Thiago Jung Bauermann


Lakshmi Ramasubramanian  writes:

> From: Rob Herring 
>
> Both arm64 and powerpc do essentially the same FDT /chosen setup for
> kexec.  The differences are either omissions that arm64 should have
> or additional properties that will be ignored.  The setup code can be
> combined and shared by both powerpc and arm64.
>
> The differences relative to the arm64 version:
>  - If /chosen doesn't exist, it will be created (should never happen).
>  - Any old dtb and initrd reserved memory will be released.
>  - The new initrd and elfcorehdr are marked reserved.
>  - "linux,booted-from-kexec" is set.
>
> The differences relative to the powerpc version:
>  - "kaslr-seed" and "rng-seed" may be set.
>  - "linux,elfcorehdr" is set.
>  - Any existing "linux,usable-memory-range" is removed.
>
> Combine the code for setting up the /chosen node in the FDT and updating
> the memory reservation for kexec, for powerpc and arm64, in
> of_kexec_alloc_and_setup_fdt() and move it to "drivers/of/kexec.c".
>
> Signed-off-by: Rob Herring 
> Signed-off-by: Lakshmi Ramasubramanian 
> ---
>  drivers/of/Makefile |   6 ++
>  drivers/of/kexec.c  | 258 
>  include/linux/of.h  |  13 +++
>  3 files changed, 277 insertions(+)
>  create mode 100644 drivers/of/kexec.c

Reviewed-by: Thiago Jung Bauermann 

-- 
Thiago Jung Bauermann
IBM Linux Technology Center


Re: [PATCH v17 02/10] of: Add a common kexec FDT setup function

2021-02-10 Thread Lakshmi Ramasubramanian

On 2/10/21 9:23 AM, Rob Herring wrote:

On Tue, Feb 09, 2021 at 10:21:52AM -0800, Lakshmi Ramasubramanian wrote:

From: Rob Herring 

Both arm64 and powerpc do essentially the same FDT /chosen setup for
kexec.  The differences are either omissions that arm64 should have
or additional properties that will be ignored.  The setup code can be
combined and shared by both powerpc and arm64.

The differences relative to the arm64 version:
  - If /chosen doesn't exist, it will be created (should never happen).
  - Any old dtb and initrd reserved memory will be released.
  - The new initrd and elfcorehdr are marked reserved.
  - "linux,booted-from-kexec" is set.

The differences relative to the powerpc version:
  - "kaslr-seed" and "rng-seed" may be set.
  - "linux,elfcorehdr" is set.
  - Any existing "linux,usable-memory-range" is removed.

Combine the code for setting up the /chosen node in the FDT and updating
the memory reservation for kexec, for powerpc and arm64, in
of_kexec_alloc_and_setup_fdt() and move it to "drivers/of/kexec.c".

Signed-off-by: Rob Herring 
Signed-off-by: Lakshmi Ramasubramanian 
---
  drivers/of/Makefile |   6 ++
  drivers/of/kexec.c  | 258 
  include/linux/of.h  |  13 +++
  3 files changed, 277 insertions(+)
  create mode 100644 drivers/of/kexec.c




diff --git a/include/linux/of.h b/include/linux/of.h
index 4b27c9a27df3..f0eff5e84353 100644
--- a/include/linux/of.h
+++ b/include/linux/of.h
@@ -560,6 +560,19 @@ int of_map_id(struct device_node *np, u32 id,
  
  phys_addr_t of_dma_get_max_cpu_address(struct device_node *np);
  
+/*

+ * Additional space needed for the buffer to build the new FDT
+ * so that we can add initrd, bootargs, kaslr-seed, rng-seed,
+ * userable-memory-range and elfcorehdr.
+ */
+#define FDT_EXTRA_SPACE 0x1000


No need for this to be public now. Move it to of/kexec.c.



Will do.

 -lakshmi




Re: [PATCH v17 02/10] of: Add a common kexec FDT setup function

2021-02-10 Thread Rob Herring
On Tue, Feb 09, 2021 at 10:21:52AM -0800, Lakshmi Ramasubramanian wrote:
> From: Rob Herring 
> 
> Both arm64 and powerpc do essentially the same FDT /chosen setup for
> kexec.  The differences are either omissions that arm64 should have
> or additional properties that will be ignored.  The setup code can be
> combined and shared by both powerpc and arm64.
> 
> The differences relative to the arm64 version:
>  - If /chosen doesn't exist, it will be created (should never happen).
>  - Any old dtb and initrd reserved memory will be released.
>  - The new initrd and elfcorehdr are marked reserved.
>  - "linux,booted-from-kexec" is set.
> 
> The differences relative to the powerpc version:
>  - "kaslr-seed" and "rng-seed" may be set.
>  - "linux,elfcorehdr" is set.
>  - Any existing "linux,usable-memory-range" is removed.
> 
> Combine the code for setting up the /chosen node in the FDT and updating
> the memory reservation for kexec, for powerpc and arm64, in
> of_kexec_alloc_and_setup_fdt() and move it to "drivers/of/kexec.c".
> 
> Signed-off-by: Rob Herring 
> Signed-off-by: Lakshmi Ramasubramanian 
> ---
>  drivers/of/Makefile |   6 ++
>  drivers/of/kexec.c  | 258 
>  include/linux/of.h  |  13 +++
>  3 files changed, 277 insertions(+)
>  create mode 100644 drivers/of/kexec.c
> 
> diff --git a/drivers/of/Makefile b/drivers/of/Makefile
> index 6e1e5212f058..c13b982084a3 100644
> --- a/drivers/of/Makefile
> +++ b/drivers/of/Makefile
> @@ -14,4 +14,10 @@ obj-$(CONFIG_OF_RESOLVE)  += resolver.o
>  obj-$(CONFIG_OF_OVERLAY) += overlay.o
>  obj-$(CONFIG_OF_NUMA) += of_numa.o
>  
> +ifdef CONFIG_KEXEC_FILE
> +ifdef CONFIG_OF_FLATTREE
> +obj-y+= kexec.o
> +endif
> +endif
> +
>  obj-$(CONFIG_OF_UNITTEST) += unittest-data/
> diff --git a/drivers/of/kexec.c b/drivers/of/kexec.c
> new file mode 100644
> index ..469e09613cdd
> --- /dev/null
> +++ b/drivers/of/kexec.c
> @@ -0,0 +1,258 @@
> +// SPDX-License-Identifier: GPL-2.0-only
> +/*
> + * Copyright (C) 2020 Arm Limited
> + *
> + * Based on arch/arm64/kernel/machine_kexec_file.c:
> + *  Copyright (C) 2018 Linaro Limited
> + *
> + * And arch/powerpc/kexec/file_load.c:
> + *  Copyright (C) 2016  IBM Corporation
> + */
> +
> +#include 
> +#include 
> +#include 
> +#include 
> +#include 
> +#include 
> +#include 
> +
> +/* relevant device tree properties */
> +#define FDT_PROP_KEXEC_ELFHDR"linux,elfcorehdr"
> +#define FDT_PROP_MEM_RANGE   "linux,usable-memory-range"
> +#define FDT_PROP_INITRD_START"linux,initrd-start"
> +#define FDT_PROP_INITRD_END  "linux,initrd-end"
> +#define FDT_PROP_BOOTARGS"bootargs"
> +#define FDT_PROP_KASLR_SEED  "kaslr-seed"
> +#define FDT_PROP_RNG_SEED"rng-seed"
> +#define RNG_SEED_SIZE128
> +
> +/**
> + * fdt_find_and_del_mem_rsv - delete memory reservation with given address 
> and size
> + *
> + * @fdt: Flattened device tree for the current kernel.
> + * @start:   Starting address of the reserved memory.
> + * @size:Size of the reserved memory.
> + *
> + * Return: 0 on success, or negative errno on error.
> + */
> +static int fdt_find_and_del_mem_rsv(void *fdt, unsigned long start, unsigned 
> long size)
> +{
> + int i, ret, num_rsvs = fdt_num_mem_rsv(fdt);
> +
> + for (i = 0; i < num_rsvs; i++) {
> + u64 rsv_start, rsv_size;
> +
> + ret = fdt_get_mem_rsv(fdt, i, &rsv_start, &rsv_size);
> + if (ret) {
> + pr_err("Malformed device tree.\n");
> + return -EINVAL;
> + }
> +
> + if (rsv_start == start && rsv_size == size) {
> + ret = fdt_del_mem_rsv(fdt, i);
> + if (ret) {
> + pr_err("Error deleting device tree 
> reservation.\n");
> + return -EINVAL;
> + }
> +
> + return 0;
> + }
> + }
> +
> + return -ENOENT;
> +}
> +
> +/*
> + * of_kexec_alloc_and_setup_fdt - Alloc and setup a new Flattened Device Tree
> + *
> + * @image:   kexec image being loaded.
> + * @initrd_load_addr:Address where the next initrd will be loaded.
> + * @initrd_len:  Size of the next initrd, or 0 if there will be 
> none.
> + * @cmdline: Command line for the next kernel, or NULL if there will
> + *   be none.
> + *
> + * Return: fdt on success, or NULL errno on error.
> + */
> +void *of_kexec_alloc_and_setup_fdt(const struct kimage *image,
> +unsigned long initrd_load_addr,
> +unsigned long initrd_len,
> +const char *cmdline)
> +{
> + void *fdt;
> + int ret, chosen_node;
> + const void *prop;
> + unsigned long fdt_size;
> +
> + fdt_size = fdt_totalsize(initial_boot_params) +
> +(cmdline ? strlen(cmdline) : 0) +
> +