diff --git a/src/config/config.c b/src/config/config.c index 254bff995..e49f236a3 100644 --- a/src/config/config.c +++ b/src/config/config.c @@ -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 diff --git a/src/config/defaults/efi.h b/src/config/defaults/efi.h index a0e52e7a7..0ba9f3ee7 100644 --- a/src/config/defaults/efi.h +++ b/src/config/defaults/efi.h @@ -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 */ diff --git a/src/config/defaults/sbi.h b/src/config/defaults/sbi.h index 42fb515f0..27fbe0e80 100644 --- a/src/config/defaults/sbi.h +++ b/src/config/defaults/sbi.h @@ -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 */ diff --git a/src/config/general.h b/src/config/general.h index 7ac77bfe6..1c690328d 100644 --- a/src/config/general.h +++ b/src/config/general.h @@ -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 index 000000000..dbcbf4447 --- /dev/null +++ b/src/hci/commands/fdt_cmd.c @@ -0,0 +1,96 @@ +/* + * Copyright (C) 2025 Michael Brown . + * + * 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 +#include +#include +#include +#include + +/** @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, "[]" ); + +/** + * 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, + }, +};