[PATCH v2] cmd: pxe: add support for FDT overlays

classic Classic list List threaded Threaded
7 messages Options
Reply | Threaded
Open this post in threaded view
|

[PATCH v2] cmd: pxe: add support for FDT overlays

Neil Armstrong
This adds support for specifying FDT overlays in an extlinux/pxelinux
configuration file.

Without this, there is no simple way to apply overlays when the kernel
and fdt is loaded by the pxe command.

This change adds the 'fdtoverlays' keyword for a label, supporting multiple
overlay files to be applied on top of the fdt specified in the 'fdt' or
'devicetree' keyword.

Example:
  label linux
    kernel /Image
    devicetree /soc-board.dtb
    fdtoverlays /soc-board-function.dtbo
    append console=ttyS0,115200 root=/dev/mmcblk0p2 rootwait

This code makes usage of a new variable called fdtoverlay_addr_r used to load
the overlay files without overwritting anything important.

Cc: Tom Rini <[hidden email]>
Cc: Andre Heider <[hidden email]>
Cc: Jernej Škrabec <[hidden email]>
Cc: Jonas Karlman <[hidden email]>
Signed-off-by: Neil Armstrong <[hidden email]>
---
Hi Tom,

This is repost of my last year's attempt.
It fills a hole to allow loading FDT overlays using PXE/Extlinux without
using FIT.

V2 adds documentation.

Neil


 cmd/pxe_utils.c | 103 ++++++++++++++++++++++++++++++++++++++++++++++++
 cmd/pxe_utils.h |   1 +
 doc/README.pxe  |   9 +++++
 3 files changed, 113 insertions(+)

diff --git a/cmd/pxe_utils.c b/cmd/pxe_utils.c
index 8716e782f6..25367190a7 100644
--- a/cmd/pxe_utils.c
+++ b/cmd/pxe_utils.c
@@ -13,6 +13,8 @@
 #include <mapmem.h>
 #include <lcd.h>
 #include <net.h>
+#include <fdt_support.h>
+#include <linux/libfdt.h>
 #include <linux/string.h>
 #include <linux/ctype.h>
 #include <errno.h>
@@ -284,6 +286,9 @@ static void label_destroy(struct pxe_label *label)
  if (label->fdtdir)
  free(label->fdtdir);
 
+ if (label->fdtoverlays)
+ free(label->fdtoverlays);
+
  free(label);
 }
 
@@ -331,6 +336,92 @@ static int label_localboot(struct pxe_label *label)
  return run_command_list(localcmd, strlen(localcmd), 0);
 }
 
+/*
+ * Loads fdt overlays specified in 'fdtoverlays'.
+ */
+#ifdef CONFIG_OF_LIBFDT_OVERLAY
+static void label_boot_fdtoverlay(struct cmd_tbl *cmdtp, struct pxe_label *label)
+{
+ char *fdtoverlay = label->fdtoverlays;
+ struct fdt_header *working_fdt;
+ char *fdtoverlay_addr_env;
+ ulong fdtoverlay_addr;
+ ulong fdt_addr;
+ int err;
+
+ /* Get the main fdt and map it */
+ fdt_addr = simple_strtoul(env_get("fdt_addr_r"), NULL, 16);
+ working_fdt = map_sysmem(fdt_addr, 0);
+ err = fdt_check_header(working_fdt);
+ if (err)
+ return;
+
+ /* Get the specific overlay loading address */
+ fdtoverlay_addr_env = env_get("fdtoverlay_addr_r");
+ if (!fdtoverlay_addr_env) {
+ printf("Invalid fdtoverlay_addr_r for loading overlays\n");
+ return;
+ }
+
+ fdtoverlay_addr = simple_strtoul(fdtoverlay_addr_env, NULL, 16);
+
+ /* Cycle over the overlay files and apply them in order */
+ do {
+ struct fdt_header *blob;
+ char *overlayfile;
+ char *end;
+ int len;
+
+ /* Drop leading spaces */
+ while (*fdtoverlay == ' ')
+ ++fdtoverlay;
+
+ /* Copy a single filename if multiple provided */
+ end = strstr(fdtoverlay, " ");
+ if (end) {
+ len = (int)(end - fdtoverlay);
+ overlayfile = malloc(len + 1);
+ strncpy(overlayfile, fdtoverlay, len);
+ overlayfile[len] = '\0';
+ } else
+ overlayfile = fdtoverlay;
+
+ if (!strlen(overlayfile))
+ goto skip_overlay;
+
+ /* Load overlay file */
+ err = get_relfile_envaddr(cmdtp, overlayfile,
+  "fdtoverlay_addr_r");
+ if (err < 0) {
+ printf("Failed loading overlay %s\n", overlayfile);
+ goto skip_overlay;
+ }
+
+ /* Resize main fdt */
+ fdt_shrink_to_minimum(working_fdt, 8192);
+
+ blob = map_sysmem(fdtoverlay_addr, 0);
+ err = fdt_check_header(blob);
+ if (err) {
+ printf("Invalid overlay %s, skipping\n",
+       overlayfile);
+ goto skip_overlay;
+ }
+
+ err = fdt_overlay_apply_verbose(working_fdt, blob);
+ if (err) {
+ printf("Failed to apply overlay %s, skipping\n",
+       overlayfile);
+ goto skip_overlay;
+ }
+
+skip_overlay:
+ if (end)
+ free(overlayfile);
+ } while ((fdtoverlay = strstr(fdtoverlay, " ")));
+}
+#endif
+
 /*
  * Boot according to the contents of a pxe_label.
  *
@@ -525,6 +616,11 @@ static int label_boot(struct cmd_tbl *cmdtp, struct pxe_label *label)
        label->name);
  goto cleanup;
  }
+
+#ifdef CONFIG_OF_LIBFDT_OVERLAY
+ if (label->fdtoverlays)
+ label_boot_fdtoverlay(cmdtp, label);
+#endif
  } else {
  bootm_argv[3] = NULL;
  }
@@ -582,6 +678,7 @@ enum token_type {
  T_INCLUDE,
  T_FDT,
  T_FDTDIR,
+ T_FDTOVERLAYS,
  T_ONTIMEOUT,
  T_IPAPPEND,
  T_BACKGROUND,
@@ -616,6 +713,7 @@ static const struct token keywords[] = {
  {"fdt", T_FDT},
  {"devicetreedir", T_FDTDIR},
  {"fdtdir", T_FDTDIR},
+ {"fdtoverlays", T_FDTOVERLAYS},
  {"ontimeout", T_ONTIMEOUT,},
  {"ipappend", T_IPAPPEND,},
  {"background", T_BACKGROUND,},
@@ -1048,6 +1146,11 @@ static int parse_label(char **c, struct pxe_menu *cfg)
  err = parse_sliteral(c, &label->fdtdir);
  break;
 
+ case T_FDTOVERLAYS:
+ if (!label->fdtoverlays)
+ err = parse_sliteral(c, &label->fdtoverlays);
+ break;
+
  case T_LOCALBOOT:
  label->localboot = 1;
  err = parse_integer(c, &label->localboot_val);
diff --git a/cmd/pxe_utils.h b/cmd/pxe_utils.h
index 77d2588875..6af9523734 100644
--- a/cmd/pxe_utils.h
+++ b/cmd/pxe_utils.h
@@ -43,6 +43,7 @@ struct pxe_label {
  char *initrd;
  char *fdt;
  char *fdtdir;
+ char *fdtoverlays;
  int ipappend;
  int attempted;
  int localboot;
diff --git a/doc/README.pxe b/doc/README.pxe
index 42f913c61f..352415b581 100644
--- a/doc/README.pxe
+++ b/doc/README.pxe
@@ -89,6 +89,9 @@ pxe boot
      fdt_addr - the location of a fdt blob. 'fdt_addr' will be passed to bootm
      command if it is set and 'fdt_addr_r' is not passed to bootm command.
 
+     fdtoverlay_addr_r - location in RAM at which 'pxe boot' will temporarily store
+     fdt overlay(s) before applying them to the fdt blob stored at 'fdt_addr_r'.
+
 pxe file format
 ===============
 The pxe file format is nearly a subset of the PXELINUX file format; see
@@ -148,6 +151,12 @@ kernel <path>    - if this label is chosen, use tftp to retrieve the kernel
       It useful for overlay selection in pxe file
       (see: doc/uImage.FIT/overlay-fdt-boot.txt)
 
+fdtoverlays <path> [...] - if this label is chosen, use tftp to retrieve the DT
+                      overlay(s) at <path>. it will temporarily stored at the
+                      address indicated in the fdtoverlay_addr_r environment variable,
+                      and then applied in the load order to the fdt blob stored at the
+                      address indicated in the fdt_addr_r environment variable.
+
 append <string>    - use <string> as the kernel command line when booting this
       label.
 
--
2.25.1

Reply | Threaded
Open this post in threaded view
|

Re: [PATCH v2] cmd: pxe: add support for FDT overlays

Tom Rini-4
On Mon, Jan 04, 2021 at 03:33:43PM +0100, Neil Armstrong wrote:

> This adds support for specifying FDT overlays in an extlinux/pxelinux
> configuration file.
>
> Without this, there is no simple way to apply overlays when the kernel
> and fdt is loaded by the pxe command.
>
> This change adds the 'fdtoverlays' keyword for a label, supporting multiple
> overlay files to be applied on top of the fdt specified in the 'fdt' or
> 'devicetree' keyword.
>
> Example:
>   label linux
>     kernel /Image
>     devicetree /soc-board.dtb
>     fdtoverlays /soc-board-function.dtbo
>     append console=ttyS0,115200 root=/dev/mmcblk0p2 rootwait
>
> This code makes usage of a new variable called fdtoverlay_addr_r used to load
> the overlay files without overwritting anything important.
>
> Cc: Tom Rini <[hidden email]>
> Cc: Andre Heider <[hidden email]>
> Cc: Jernej Škrabec <[hidden email]>
> Cc: Jonas Karlman <[hidden email]>
> Signed-off-by: Neil Armstrong <[hidden email]>
> ---
> Hi Tom,
>
> This is repost of my last year's attempt.
> It fills a hole to allow loading FDT overlays using PXE/Extlinux without
> using FIT.
>
> V2 adds documentation.
Thanks for following up.  I assume this follows what the spec says for
this file?

--
Tom

signature.asc (673 bytes) Download Attachment
Reply | Threaded
Open this post in threaded view
|

Re: [PATCH v2] cmd: pxe: add support for FDT overlays

Jernej Škrabec-2
Dne ponedeljek, 04. januar 2021 ob 15:41:17 CET je Tom Rini napisal(a):

> On Mon, Jan 04, 2021 at 03:33:43PM +0100, Neil Armstrong wrote:
> > This adds support for specifying FDT overlays in an extlinux/pxelinux
> > configuration file.
> >
> > Without this, there is no simple way to apply overlays when the kernel
> > and fdt is loaded by the pxe command.
> >
> > This change adds the 'fdtoverlays' keyword for a label, supporting
> > multiple
> > overlay files to be applied on top of the fdt specified in the 'fdt' or
> > 'devicetree' keyword.
> >
> > Example:
> >   label linux
> >  
> >     kernel /Image
> >     devicetree /soc-board.dtb

This should be "fdt /soc-board.dtb",

> >     fdtoverlays /soc-board-function.dtbo
> >     append console=ttyS0,115200 root=/dev/mmcblk0p2 rootwait
> >
> > This code makes usage of a new variable called fdtoverlay_addr_r used to
> > load the overlay files without overwritting anything important.
> >
> > Cc: Tom Rini <[hidden email]>
> > Cc: Andre Heider <[hidden email]>
> > Cc: Jernej Škrabec <[hidden email]>
> > Cc: Jonas Karlman <[hidden email]>
> > Signed-off-by: Neil Armstrong <[hidden email]>

Tested-by: Jernej Skrabec <[hidden email]>

With above fix:
Reviewed-by: Jernej Skrabec <[hidden email]>

> > ---
> > Hi Tom,
> >
> > This is repost of my last year's attempt.
> > It fills a hole to allow loading FDT overlays using PXE/Extlinux without
> > using FIT.
> >
> > V2 adds documentation.
>
> Thanks for following up.  I assume this follows what the spec says for
> this file?

Which specs? Official extlinux configuration specs [1] don't say anything about
device tree files, so anything related to that is an extension (I hope I found
correct specs). I think this one is extremely useful, users can easily specify
which overlay file(s) they want to be applied in a text file.

Best regards,
Jernej

[1] https://repo.or.cz/syslinux.git/blob/HEAD:/doc/syslinux.txt


Reply | Threaded
Open this post in threaded view
|

Re: [PATCH v2] cmd: pxe: add support for FDT overlays

Neil Armstrong
On 04/01/2021 17:21, Jernej Škrabec wrote:

> Dne ponedeljek, 04. januar 2021 ob 15:41:17 CET je Tom Rini napisal(a):
>> On Mon, Jan 04, 2021 at 03:33:43PM +0100, Neil Armstrong wrote:
>>> This adds support for specifying FDT overlays in an extlinux/pxelinux
>>> configuration file.
>>>
>>> Without this, there is no simple way to apply overlays when the kernel
>>> and fdt is loaded by the pxe command.
>>>
>>> This change adds the 'fdtoverlays' keyword for a label, supporting
>>> multiple
>>> overlay files to be applied on top of the fdt specified in the 'fdt' or
>>> 'devicetree' keyword.
>>>
>>> Example:
>>>   label linux
>>>  
>>>     kernel /Image
>>>     devicetree /soc-board.dtb
>
> This should be "fdt /soc-board.dtb",

>
>>>     fdtoverlays /soc-board-function.dtbo
>>>     append console=ttyS0,115200 root=/dev/mmcblk0p2 rootwait
>>>
>>> This code makes usage of a new variable called fdtoverlay_addr_r used to
>>> load the overlay files without overwritting anything important.
>>>
>>> Cc: Tom Rini <[hidden email]>
>>> Cc: Andre Heider <[hidden email]>
>>> Cc: Jernej Škrabec <[hidden email]>
>>> Cc: Jonas Karlman <[hidden email]>
>>> Signed-off-by: Neil Armstrong <[hidden email]>
>
> Tested-by: Jernej Skrabec <[hidden email]>
>
> With above fix:
> Reviewed-by: Jernej Skrabec <[hidden email]>
>
>>> ---
>>> Hi Tom,
>>>
>>> This is repost of my last year's attempt.
>>> It fills a hole to allow loading FDT overlays using PXE/Extlinux without
>>> using FIT.
>>>
>>> V2 adds documentation.
>>
>> Thanks for following up.  I assume this follows what the spec says for
>> this file?
>
> Which specs? Official extlinux configuration specs [1] don't say anything about
> device tree files, so anything related to that is an extension (I hope I found
> correct specs). I think this one is extremely useful, users can easily specify
> which overlay file(s) they want to be applied in a text file.
>
> Best regards,
> Jernej
>
> [1] https://repo.or.cz/syslinux.git/blob/HEAD:/doc/syslinux.txt
>
>

Reply | Threaded
Open this post in threaded view
|

Re: [PATCH v2] cmd: pxe: add support for FDT overlays

Neil Armstrong
In reply to this post by Jernej Škrabec-2
On 04/01/2021 17:21, Jernej Škrabec wrote:

> Dne ponedeljek, 04. januar 2021 ob 15:41:17 CET je Tom Rini napisal(a):
>> On Mon, Jan 04, 2021 at 03:33:43PM +0100, Neil Armstrong wrote:
>>> This adds support for specifying FDT overlays in an extlinux/pxelinux
>>> configuration file.
>>>
>>> Without this, there is no simple way to apply overlays when the kernel
>>> and fdt is loaded by the pxe command.
>>>
>>> This change adds the 'fdtoverlays' keyword for a label, supporting
>>> multiple
>>> overlay files to be applied on top of the fdt specified in the 'fdt' or
>>> 'devicetree' keyword.
>>>
>>> Example:
>>>   label linux
>>>  
>>>     kernel /Image
>>>     devicetree /soc-board.dtb
>
> This should be "fdt /soc-board.dtb",


Indeed, thx

>
>>>     fdtoverlays /soc-board-function.dtbo
>>>     append console=ttyS0,115200 root=/dev/mmcblk0p2 rootwait
>>>
>>> This code makes usage of a new variable called fdtoverlay_addr_r used to
>>> load the overlay files without overwritting anything important.
>>>
>>> Cc: Tom Rini <[hidden email]>
>>> Cc: Andre Heider <[hidden email]>
>>> Cc: Jernej Škrabec <[hidden email]>
>>> Cc: Jonas Karlman <[hidden email]>
>>> Signed-off-by: Neil Armstrong <[hidden email]>
>
> Tested-by: Jernej Skrabec <[hidden email]>
>
> With above fix:
> Reviewed-by: Jernej Skrabec <[hidden email]>
>
>>> ---
>>> Hi Tom,
>>>
>>> This is repost of my last year's attempt.
>>> It fills a hole to allow loading FDT overlays using PXE/Extlinux without
>>> using FIT.
>>>
>>> V2 adds documentation.
>>
>> Thanks for following up.  I assume this follows what the spec says for
>> this file?
>
> Which specs? Official extlinux configuration specs [1] don't say anything about
> device tree files, so anything related to that is an extension (I hope I found
> correct specs). I think this one is extremely useful, users can easily specify
> which overlay file(s) they want to be applied in a text file.

Indeed, it follows the spec by not breaking it and simply extends the already
u-boot specific pxe format.

Neil


>
> Best regards,
> Jernej
>
> [1] https://repo.or.cz/syslinux.git/blob/HEAD:/doc/syslinux.txt
>
>

Reply | Threaded
Open this post in threaded view
|

Re: [PATCH v2] cmd: pxe: add support for FDT overlays

Tom Rini-4
On Tue, Jan 05, 2021 at 09:14:24AM +0100, Neil Armstrong wrote:

> On 04/01/2021 17:21, Jernej Škrabec wrote:
> > Dne ponedeljek, 04. januar 2021 ob 15:41:17 CET je Tom Rini napisal(a):
> >> On Mon, Jan 04, 2021 at 03:33:43PM +0100, Neil Armstrong wrote:
> >>> This adds support for specifying FDT overlays in an extlinux/pxelinux
> >>> configuration file.
> >>>
> >>> Without this, there is no simple way to apply overlays when the kernel
> >>> and fdt is loaded by the pxe command.
> >>>
> >>> This change adds the 'fdtoverlays' keyword for a label, supporting
> >>> multiple
> >>> overlay files to be applied on top of the fdt specified in the 'fdt' or
> >>> 'devicetree' keyword.
> >>>
> >>> Example:
> >>>   label linux
> >>>  
> >>>     kernel /Image
> >>>     devicetree /soc-board.dtb
> >
> > This should be "fdt /soc-board.dtb",
>
>
> Indeed, thx
>
> >
> >>>     fdtoverlays /soc-board-function.dtbo
> >>>     append console=ttyS0,115200 root=/dev/mmcblk0p2 rootwait
> >>>
> >>> This code makes usage of a new variable called fdtoverlay_addr_r used to
> >>> load the overlay files without overwritting anything important.
> >>>
> >>> Cc: Tom Rini <[hidden email]>
> >>> Cc: Andre Heider <[hidden email]>
> >>> Cc: Jernej Škrabec <[hidden email]>
> >>> Cc: Jonas Karlman <[hidden email]>
> >>> Signed-off-by: Neil Armstrong <[hidden email]>
> >
> > Tested-by: Jernej Skrabec <[hidden email]>
> >
> > With above fix:
> > Reviewed-by: Jernej Skrabec <[hidden email]>
> >
> >>> ---
> >>> Hi Tom,
> >>>
> >>> This is repost of my last year's attempt.
> >>> It fills a hole to allow loading FDT overlays using PXE/Extlinux without
> >>> using FIT.
> >>>
> >>> V2 adds documentation.
> >>
> >> Thanks for following up.  I assume this follows what the spec says for
> >> this file?
> >
> > Which specs? Official extlinux configuration specs [1] don't say anything about
> > device tree files, so anything related to that is an extension (I hope I found
> > correct specs). I think this one is extremely useful, users can easily specify
> > which overlay file(s) they want to be applied in a text file.
>
> Indeed, it follows the spec by not breaking it and simply extends the already
> u-boot specific pxe format.
I could have sworn that the spec on freedesktop.org had been extended
for overlays, but I don't see it now.  Thanks!

--
Tom

signature.asc (673 bytes) Download Attachment
Reply | Threaded
Open this post in threaded view
|

Re: [PATCH v2] cmd: pxe: add support for FDT overlays

Tom Rini-4
In reply to this post by Neil Armstrong
On Tue, Jan 05, 2021 at 09:14:24AM +0100, Neil Armstrong wrote:

> On 04/01/2021 17:21, Jernej Škrabec wrote:
> > Dne ponedeljek, 04. januar 2021 ob 15:41:17 CET je Tom Rini napisal(a):
> >> On Mon, Jan 04, 2021 at 03:33:43PM +0100, Neil Armstrong wrote:
> >>> This adds support for specifying FDT overlays in an extlinux/pxelinux
> >>> configuration file.
> >>>
> >>> Without this, there is no simple way to apply overlays when the kernel
> >>> and fdt is loaded by the pxe command.
> >>>
> >>> This change adds the 'fdtoverlays' keyword for a label, supporting
> >>> multiple
> >>> overlay files to be applied on top of the fdt specified in the 'fdt' or
> >>> 'devicetree' keyword.
> >>>
> >>> Example:
> >>>   label linux
> >>>  
> >>>     kernel /Image
> >>>     devicetree /soc-board.dtb
> >
> > This should be "fdt /soc-board.dtb",
>
>
> Indeed, thx
>
> >
> >>>     fdtoverlays /soc-board-function.dtbo
> >>>     append console=ttyS0,115200 root=/dev/mmcblk0p2 rootwait
> >>>
> >>> This code makes usage of a new variable called fdtoverlay_addr_r used to
> >>> load the overlay files without overwritting anything important.
> >>>
> >>> Cc: Tom Rini <[hidden email]>
> >>> Cc: Andre Heider <[hidden email]>
> >>> Cc: Jernej Škrabec <[hidden email]>
> >>> Cc: Jonas Karlman <[hidden email]>
> >>> Signed-off-by: Neil Armstrong <[hidden email]>
> >
> > Tested-by: Jernej Skrabec <[hidden email]>
> >
> > With above fix:
> > Reviewed-by: Jernej Skrabec <[hidden email]>
Since I'll almost certainly forget when applying, can I get a v3 with
the change?  Thanks!

--
Tom

signature.asc (673 bytes) Download Attachment