]> git.ipfire.org Git - thirdparty/ipxe.git/commitdiff
[fdt] Add the "fdt" command
authorMichael Brown <mcb30@ipxe.org>
Thu, 27 Mar 2025 11:36:35 +0000 (11:36 +0000)
committerMichael Brown <mcb30@ipxe.org>
Thu, 27 Mar 2025 15:36:39 +0000 (15:36 +0000)
Allow a Flattened Device Tree blob (DTB) to be provided to a booted
operating system using a script such as:

  #!ipxe
  kernel /images/vmlinuz console=ttyAMA0
  initrd /images/initrd.img
  fdt /images/rk3566-radxa-zero-3e.dtb
  boot

Signed-off-by: Michael Brown <mcb30@ipxe.org>
src/config/config.c
src/config/defaults/efi.h
src/config/defaults/sbi.h
src/config/general.h
src/hci/commands/fdt_cmd.c [new file with mode: 0644]

index 254bff9952df6ed89c10058fc1131a044fb5c001..e49f236a399bf9ef903058a6faf90044ff980614 100644 (file)
@@ -308,6 +308,9 @@ REQUIRE_OBJECT ( image_crypt_cmd );
 #ifdef USB_CMD
 REQUIRE_OBJECT ( usb_cmd );
 #endif
+#ifdef FDT_CMD
+REQUIRE_OBJECT ( fdt_cmd );
+#endif
 
 /*
  * Drag in miscellaneous objects
index a0e52e7a7a0da0221da354b03c04c1f3af68ea74..0ba9f3ee752f9190088910603e8e04dc20288333 100644 (file)
@@ -64,10 +64,12 @@ FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL );
 
 #if defined ( __arm__ ) || defined ( __aarch64__ )
 #define IOAPI_ARM
+#define FDT_CMD
 #endif
 
 #if defined ( __aarch64__ )
 #define        IMAGE_GZIP              /* GZIP image support */
+#define FDT_CMD
 #endif
 
 #if defined ( __loongarch__ )
@@ -76,6 +78,7 @@ FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL );
 
 #if defined ( __riscv )
 #define IOAPI_RISCV
+#define FDT_CMD
 #endif
 
 #endif /* CONFIG_DEFAULTS_EFI_H */
index 42fb515f04cf239e32fbc12c5ff64b0ccb994f6b..27fbe0e80404b662c455bbb2da1ce54d993fe4c6 100644 (file)
@@ -32,5 +32,6 @@ FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL );
 
 #define REBOOT_CMD
 #define POWEROFF_CMD
+#define FDT_CMD
 
 #endif /* CONFIG_DEFAULTS_SBI_H */
index 7ac77bfe6c31db60d5152b4aef2227fb825cd41b..1c690328d29ec79cd05a63f7e521683a7d50fb45 100644 (file)
@@ -173,6 +173,7 @@ FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL );
 #define IMAGE_ARCHIVE_CMD      /* Archive image management commands */
 #define SHIM_CMD               /* EFI shim command (or dummy command) */
 //#define USB_CMD              /* USB commands */
+//#define FDT_CMD              /* Flattened Device Tree commands */
 
 /*
  * Certificate sources
diff --git a/src/hci/commands/fdt_cmd.c b/src/hci/commands/fdt_cmd.c
new file mode 100644 (file)
index 0000000..dbcbf44
--- /dev/null
@@ -0,0 +1,96 @@
+/*
+ * Copyright (C) 2025 Michael Brown <mbrown@fensystems.co.uk>.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of the
+ * License, or any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+ * 02110-1301, USA.
+ *
+ * You can also choose to distribute this program under the terms of
+ * the Unmodified Binary Distribution Licence (as given in the file
+ * COPYING.UBDL), provided that you have satisfied its requirements.
+ */
+
+FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL );
+
+#include <getopt.h>
+#include <ipxe/command.h>
+#include <ipxe/parseopt.h>
+#include <usr/imgmgmt.h>
+#include <usr/fdtmgmt.h>
+
+/** @file
+ *
+ * Flattened Device Tree commands
+ *
+ */
+
+/** "fdt" options */
+struct fdt_options {
+       /** Download timeout */
+       unsigned long timeout;
+};
+
+/** "fdt" option list */
+static struct option_descriptor fdt_opts[] = {
+       OPTION_DESC ( "timeout", 't', required_argument,
+                     struct fdt_options, timeout, parse_timeout ),
+};
+
+/** "fdt" command descriptor */
+static struct command_descriptor fdt_cmd =
+       COMMAND_DESC ( struct fdt_options, fdt_opts, 0, 1, "[<uri>]" );
+
+/**
+ * The "fdt" command
+ *
+ * @v argc             Argument count
+ * @v argv             Argument list
+ * @ret rc             Return status code
+ */
+static int fdt_exec ( int argc, char **argv ) {
+       struct fdt_options opts;
+       struct image *image = NULL;
+       char *name_uri;
+       int rc;
+
+       /* Parse options */
+       if ( ( rc = parse_options ( argc, argv, &fdt_cmd, &opts ) ) != 0 )
+               goto err_parse;
+
+       /* Parse name/URI string */
+       name_uri = argv[optind];
+
+       /* Acquire image, if applicable */
+       if ( name_uri && ( ( rc = imgacquire ( name_uri, opts.timeout,
+                                              &image ) ) != 0 ) ) {
+               goto err_image;
+       }
+
+       /* (Un)register as FDT */
+       if ( ( rc = imgfdt ( image ) ) != 0 )
+               goto err_fdt;
+
+ err_fdt:
+ err_image:
+ err_parse:
+       return rc;
+}
+
+/** Flattened Device Tree commands */
+struct command fdt_commands[] __command = {
+       {
+               .name = "fdt",
+               .exec = fdt_exec,
+       },
+};