U-Boot Archive on lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH 0/3] Add RITY devicetree preparation support
@ 2026-08-28  8:39 Carlo Caione
  2026-08-28  8:39 ` [PATCH 1/3] arm: mediatek: add RITY devicetree preparation Carlo Caione
                   ` (3 more replies)
  0 siblings, 4 replies; 6+ messages in thread
From: Carlo Caione @ 2026-08-28  8:39 UTC (permalink / raw)
  To: GSS_MTK_Uboot_upstream, u-boot
  Cc: Tom Rini, Ilias Apalodimas, Ryder Lee, Weijie Gao, Chunfeng Yun,
	Igor Belwon, David Lechner, Julien Stephan, Johan Jonker,
	Macpaul Lin, Chris-QJ Chen, Pablo Sun (孫毓翔),
	Carlo Caione

RITY images select a base devicetree and an ordered list of overlays
through the storage, storage_dev, dtb_path, boot_dtb, fdtfile and list_dtbo
environment variables. EFI boot needs the selected tree to be assembled
and published through fdt_addr before the operating system is started.

Add MediaTek support to consume that interface. It locates the selected
source on GPT block partitions or on the RITY UBI/UBIFS NOR layout, loads
the base DTB, applies list_dtbo in order and publishes the completed tree.
Both raw and authenticated DTB and DTBO inputs are supported.

Expose mtk_fdt_prepare for interactive use. Retain the dtbprobe and
fdtprobe command names and positional arguments used by RITY EFI boot
environments. Also provide bootembedded for legacy boot. It locates and
runs the appended RITY boot script through the standard source command,
leaving the legacy policy and authentication to source and bootm.

The implementation uses existing block, MTD, UBI/UBIFS, libfdt overlay,
image verification, source and bootm services.

Signed-off-by: Carlo Caione <ccaione@baylibre.com>
---
Carlo Caione (3):
      arm: mediatek: add RITY devicetree preparation
      arm: mediatek: add RITY devicetree compatibility commands
      arm: mediatek: add bootembedded compatibility command

 arch/arm/mach-mediatek/Kconfig            |  45 +++
 arch/arm/mach-mediatek/Makefile           |   3 +
 arch/arm/mach-mediatek/cmd_bootembedded.c |  59 ++++
 arch/arm/mach-mediatek/cmd_fdt_prepare.c  |  66 ++++
 arch/arm/mach-mediatek/fdt_prepare.c      | 502 ++++++++++++++++++++++++++++++
 arch/arm/mach-mediatek/fdt_prepare.h      |  10 +
 6 files changed, 685 insertions(+)
---
base-commit: 964ad5b5c91b7be56e443e899d7f873e6aa8c9fc
change-id: 20260827-ccaione-upstream-mtk-fdt-prepare-68f51a5fd2ea

Best regards,
--  
Carlo Caione <ccaione@baylibre.com>


^ permalink raw reply	[flat|nested] 6+ messages in thread

* [PATCH 1/3] arm: mediatek: add RITY devicetree preparation
  2026-08-28  8:39 [PATCH 0/3] Add RITY devicetree preparation support Carlo Caione
@ 2026-08-28  8:39 ` Carlo Caione
  2026-08-28  8:39 ` [PATCH 2/3] arm: mediatek: add RITY devicetree compatibility commands Carlo Caione
                   ` (2 subsequent siblings)
  3 siblings, 0 replies; 6+ messages in thread
From: Carlo Caione @ 2026-08-28  8:39 UTC (permalink / raw)
  To: GSS_MTK_Uboot_upstream, u-boot
  Cc: Tom Rini, Ilias Apalodimas, Ryder Lee, Weijie Gao, Chunfeng Yun,
	Igor Belwon, David Lechner, Julien Stephan, Johan Jonker,
	Macpaul Lin, Chris-QJ Chen, Pablo Sun (孫毓翔),
	Carlo Caione

RITY images select a base devicetree and an ordered list of overlays
through the storage, storage_dev, dtb_path, boot_dtb, fdtfile and list_dtbo
environment variables. The selected tree must be assembled before EFI
boot and published through the standard fdt_addr variable.

Add a MediaTek preparation service which consumes that established
interface. For block devices, locate the source partition by the existing
MediaTek GPT type GUID. Also support the RITY NOR layout through MTD, UBI
and UBIFS when those subsystems are enabled.

Load the base tree and apply the overlays in list order.
Non-authenticated builds consume raw DTB and DTBO files. With MTK_FDT_AUTH
enabled, treat each same-named file as a single-image FIT, verify its
flat-devicetree payload and extract it before using the common assembly
path.

Publish the result through fdt_addr only after the whole tree has been
prepared successfully. Clear fdt_addr on failure and remove fdtfile from
the EFI fallback search so a preparation failure cannot silently fall back
to a different tree.

Run the service at EVT_POST_PREBOOT for EFI-capable boot targets, while
leaving embedded legacy boot unchanged. Provide a separately selectable
mtk_fdt_prepare command so an interactive user can rebuild the tree after
changing a selector. It accepts either no arguments, using the environment,
or explicit interface, device and directory arguments.

Signed-off-by: Carlo Caione <ccaione@baylibre.com>
---
 arch/arm/mach-mediatek/Kconfig           |  35 +++
 arch/arm/mach-mediatek/Makefile          |   2 +
 arch/arm/mach-mediatek/cmd_fdt_prepare.c |  31 ++
 arch/arm/mach-mediatek/fdt_prepare.c     | 502 +++++++++++++++++++++++++++++++
 arch/arm/mach-mediatek/fdt_prepare.h     |  10 +
 5 files changed, 580 insertions(+)

diff --git a/arch/arm/mach-mediatek/Kconfig b/arch/arm/mach-mediatek/Kconfig
index 5e6c50ca64d..75fa88a1510 100644
--- a/arch/arm/mach-mediatek/Kconfig
+++ b/arch/arm/mach-mediatek/Kconfig
@@ -215,4 +215,39 @@ config MTK_TZ_MOVABLE
 	select OF_SYSTEM_SETUP
 	bool
 
+config MTK_FDT_PREPARE
+	bool "Prepare a MediaTek RITY devicetree"
+	select EVENT
+	select PARTITION_TYPE_GUID
+	depends on OF_LIBFDT_OVERLAY
+	help
+	  Load the base devicetree and the overlays selected by list_dtbo,
+	  assemble them before autoboot and publish the resulting tree through
+	  the standard fdt_addr environment variable.
+
+	  The source and selection are described by the RITY environment
+	  variables storage, storage_dev, dtb_path, boot_dtb, fdtfile and
+	  list_dtbo. Both block filesystems and, when enabled, UBI/UBIFS
+	  storage are supported.
+
+config CMD_MTK_FDT_PREPARE
+	bool "Enable the 'mtk_fdt_prepare' command"
+	depends on MTK_FDT_PREPARE
+	help
+	  Provide the mtk_fdt_prepare command so the assembled devicetree can
+	  be rebuilt after changing a selector at the U-Boot prompt. With no
+	  arguments the command uses storage, storage_dev and dtb_path from the
+	  environment. It also accepts the interface, device and path arguments
+	  explicitly.
+
+config MTK_FDT_AUTH
+	bool "Authenticate MediaTek RITY devicetrees"
+	depends on MTK_FDT_PREPARE && FIT_SIGNATURE
+	select RSA
+	select RSA_VERIFY
+	help
+	  Treat every loose-named DTB and DTBO as a signed single-image FIT,
+	  authenticate its default flat-devicetree image and extract the
+	  verified payload before assembling the final tree.
+
 endif
diff --git a/arch/arm/mach-mediatek/Makefile b/arch/arm/mach-mediatek/Makefile
index 35f748a70d6..e11fddd27bc 100644
--- a/arch/arm/mach-mediatek/Makefile
+++ b/arch/arm/mach-mediatek/Makefile
@@ -3,6 +3,8 @@
 obj-$(CONFIG_ARM64) += armv8-mem-map.o
 obj-y	+= cpu.o
 obj-$(CONFIG_MTK_TZ_MOVABLE)	+= tzcfg.o
+obj-$(CONFIG_MTK_FDT_PREPARE)	+= fdt_prepare.o
+obj-$(CONFIG_CMD_MTK_FDT_PREPARE)	+= cmd_fdt_prepare.o
 obj-$(CONFIG_XPL_BUILD)	+= spl.o
 
 obj-$(CONFIG_TARGET_MT7622) += mt7622/
diff --git a/arch/arm/mach-mediatek/cmd_fdt_prepare.c b/arch/arm/mach-mediatek/cmd_fdt_prepare.c
new file mode 100644
index 00000000000..91d56f747ef
--- /dev/null
+++ b/arch/arm/mach-mediatek/cmd_fdt_prepare.c
@@ -0,0 +1,31 @@
+// SPDX-License-Identifier: GPL-2.0+
+/*
+ * Copyright (C) 2026 Carlo Caione <ccaione@baylibre.com>
+ */
+
+#include <command.h>
+
+#include "fdt_prepare.h"
+
+static int do_mtk_fdt_prepare(struct cmd_tbl *cmdtp, int flag, int argc,
+			      char *const argv[])
+{
+	int ret;
+
+	if (argc == 1)
+		ret = mtk_fdt_prepare();
+	else if (argc == 4)
+		ret = mtk_fdt_prepare_from(argv[1], argv[2], argv[3]);
+	else
+		return CMD_RET_USAGE;
+
+	return ret ? CMD_RET_FAILURE : CMD_RET_SUCCESS;
+}
+
+#define MTK_FDT_PREPARE_USAGE \
+	"[<interface> <dev> <probe_base>]\n" \
+	"    - use the environment when no source arguments are given"
+
+U_BOOT_CMD(mtk_fdt_prepare, 4, 1, do_mtk_fdt_prepare,
+	   "load and assemble the MediaTek RITY devicetree",
+	   MTK_FDT_PREPARE_USAGE);
diff --git a/arch/arm/mach-mediatek/fdt_prepare.c b/arch/arm/mach-mediatek/fdt_prepare.c
new file mode 100644
index 00000000000..ff5e1e02820
--- /dev/null
+++ b/arch/arm/mach-mediatek/fdt_prepare.c
@@ -0,0 +1,502 @@
+// SPDX-License-Identifier: GPL-2.0+
+/*
+ * Copyright (C) 2026 Carlo Caione <ccaione@baylibre.com>
+ */
+
+#include <blk.h>
+#include <env.h>
+#include <event.h>
+#include <fdt_support.h>
+#include <fs.h>
+#include <image.h>
+#include <log.h>
+#include <malloc.h>
+#include <mapmem.h>
+#include <part.h>
+#include <vsprintf.h>
+#include <linux/errno.h>
+#include <linux/libfdt.h>
+#include <linux/string.h>
+
+#include "fdt_prepare.h"
+
+#if CONFIG_IS_ENABLED(MTD) && CONFIG_IS_ENABLED(CMD_UBI) && \
+	CONFIG_IS_ENABLED(CMD_UBIFS)
+#include <mtd.h>
+#include <ubi_uboot.h>
+#include <ubifs_uboot.h>
+#define MTK_FDT_HAS_UBI 1
+#else
+#define MTK_FDT_HAS_UBI 0
+#endif
+
+#define MTK_FW_PART_GUID	"384e979b-eb76-435a-a3a6-1a071dbad91d"
+#define MTK_FDT_PATH_MAX	512
+
+enum mtk_fdt_source_type {
+	MTK_FDT_SOURCE_BLOCK,
+	MTK_FDT_SOURCE_UBI,
+};
+
+struct mtk_fdt_source {
+	enum mtk_fdt_source_type type;
+	struct blk_desc *desc;
+	int part;
+};
+
+static int mtk_fdt_make_path(char *path, size_t size, const char *dir,
+			     const char *name)
+{
+	int len;
+
+	if (!dir || !*dir || !name || !*name)
+		return -EINVAL;
+
+	len = snprintf(path, size, "%s%s%s", dir,
+		       dir[strlen(dir) - 1] == '/' ? "" : "/", name);
+	if (len < 0 || (size_t)len >= size)
+		return -ENOSPC;
+
+	return 0;
+}
+
+static int mtk_fdt_block_read(struct mtk_fdt_source *source,
+			      const char *path, ulong addr, loff_t *sizep)
+{
+	int ret;
+
+	ret = fs_set_blk_dev_with_part(source->desc, source->part);
+	if (ret)
+		return ret;
+
+	return fs_read(path, addr, 0, 0, sizep);
+}
+
+static int mtk_fdt_block_exists(struct blk_desc *desc, int part,
+				const char *path)
+{
+	int ret;
+
+	ret = fs_set_blk_dev_with_part(desc, part);
+	if (ret)
+		return ret;
+
+	return fs_exists(path) ? 0 : -ENOENT;
+}
+
+static int mtk_fdt_select_block(struct mtk_fdt_source *source,
+				const char *path, const char *ifname,
+				const char *devnum)
+{
+	const char *boot_dtb = env_get("boot_dtb");
+	const char *type_guid = env_get("fw_fdt_part_type_uuid");
+	struct disk_partition info;
+	struct blk_desc *desc;
+	ulong selected = 0;
+	int part, ret;
+
+	if (!ifname || !devnum)
+		return -EINVAL;
+	if (!type_guid || !*type_guid)
+		type_guid = MTK_FW_PART_GUID;
+
+	if (boot_dtb && *boot_dtb &&
+	    strict_strtoul(boot_dtb, 10, &selected)) {
+		printf("Invalid boot_dtb partition number: %s\n", boot_dtb);
+		return -EINVAL;
+	}
+
+	ret = blk_get_device_by_str(ifname, devnum, &desc);
+	if (ret < 0)
+		return ret;
+
+	for (part = 1; part <= MAX_SEARCH_PARTITIONS; part++) {
+		ret = part_get_info(desc, part, &info);
+		if (ret)
+			continue;
+		if (strcasecmp(info.type_guid, type_guid))
+			continue;
+		if (selected && selected != part)
+			continue;
+
+		printf("Probing %s %s:%d for RITY devicetree...\n",
+		       ifname, devnum, part);
+		ret = mtk_fdt_block_exists(desc, part, path);
+		if (ret)
+			continue;
+
+		source->type = MTK_FDT_SOURCE_BLOCK;
+		source->desc = desc;
+		source->part = part;
+		return 0;
+	}
+
+	return -ENOENT;
+}
+
+#if MTK_FDT_HAS_UBI
+static int mtk_fdt_ubi_read(const char *path, ulong addr, loff_t *sizep)
+{
+	int ret;
+
+	ret = ubifs_load(path, addr, 0);
+	if (!ret)
+		*sizep = env_get_hex("filesize", 0);
+
+	return ret;
+}
+
+static int mtk_fdt_try_ubi_source(struct mtk_fdt_source *source,
+				  const struct mtd_info *mtd,
+				  const char *devnum, const char *path)
+{
+	char volume[UBI_VOL_NAME_MAX + 16];
+	int ret;
+
+	ret = ubi_part(mtd->name, NULL);
+	if (ret)
+		return ret;
+
+	ret = snprintf(volume, sizeof(volume), "ubi%s:%s", devnum, mtd->name);
+	if (ret < 0 || (size_t)ret >= sizeof(volume))
+		return -ENOSPC;
+
+	ret = cmd_ubifs_mount(volume);
+	if (ret)
+		return ret;
+	if (!ubifs_exists(path))
+		return -ENOENT;
+
+	source->type = MTK_FDT_SOURCE_UBI;
+	return 0;
+}
+
+static int mtk_fdt_select_ubi(struct mtk_fdt_source *source,
+			      const char *path, const char *devnum)
+{
+	const char *boot_dtb = env_get("boot_dtb");
+	const char *match = env_get("fw_fdt_mtd_name");
+	struct mtd_info *mtd;
+	ulong selected = 0;
+	int ret;
+
+	if (!devnum)
+		return -EINVAL;
+	if (!match || !*match)
+		match = "firmware";
+
+	if (boot_dtb && *boot_dtb &&
+	    strict_strtoul(boot_dtb, 10, &selected)) {
+		printf("Invalid boot_dtb MTD index: %s\n", boot_dtb);
+		return -EINVAL;
+	}
+
+	ret = mtd_probe_devices();
+	if (ret)
+		return ret;
+
+	mtd_for_each_device(mtd) {
+		if (!mtd_is_partition(mtd) || !mtd->name)
+			continue;
+		if (!strstr(mtd->name, match))
+			continue;
+		if (selected && selected != mtd->index)
+			continue;
+
+		printf("Probing UBI source %s for RITY devicetree...\n",
+		       mtd->name);
+		ret = mtk_fdt_try_ubi_source(source, mtd, devnum, path);
+		if (!ret)
+			return 0;
+	}
+
+	return -ENOENT;
+}
+#else
+static int mtk_fdt_select_ubi(struct mtk_fdt_source *source,
+			      const char *path, const char *devnum)
+{
+	printf("MediaTek RITY devicetree UBI support is not enabled\n");
+	return -ENOSYS;
+}
+#endif
+
+static int mtk_fdt_select_source(struct mtk_fdt_source *source,
+				 const char *path, const char *storage,
+				 const char *storage_dev)
+{
+	if (!storage || !storage_dev)
+		return -EINVAL;
+	if (!strcmp(storage, "ubi"))
+		return mtk_fdt_select_ubi(source, path, storage_dev);
+
+	return mtk_fdt_select_block(source, path, storage, storage_dev);
+}
+
+static int mtk_fdt_source_read(struct mtk_fdt_source *source,
+			       const char *path, ulong addr, loff_t *sizep)
+{
+	if (source->type == MTK_FDT_SOURCE_BLOCK)
+		return mtk_fdt_block_read(source, path, addr, sizep);
+
+#if MTK_FDT_HAS_UBI
+	return mtk_fdt_ubi_read(path, addr, sizep);
+#else
+	return -ENOSYS;
+#endif
+}
+
+#if CONFIG_IS_ENABLED(MTK_FDT_AUTH)
+static int mtk_fdt_extract_verified(ulong fit_addr, loff_t fit_size,
+				    ulong dest_addr, size_t *sizep)
+{
+	const void *fit_data;
+	const char *uname;
+	void *dest, *fit;
+	size_t fit_len;
+	int images, node, ret;
+
+	fit = map_sysmem(fit_addr, fit_size);
+	ret = fit_check_format(fit, fit_size);
+	if (ret)
+		goto out;
+
+	images = fdt_path_offset(fit, FIT_IMAGES_PATH);
+	if (images < 0) {
+		ret = images;
+		goto out;
+	}
+
+	uname = fdt_getprop(fit, images, FIT_DEFAULT_PROP, NULL);
+	if (!uname) {
+		ret = -ENOENT;
+		goto out;
+	}
+
+	node = fit_image_get_node(fit, uname);
+	if (node < 0) {
+		ret = node;
+		goto out;
+	}
+	if (!fit_image_check_type(fit, node, IH_TYPE_FLATDT)) {
+		ret = -ENOEXEC;
+		goto out;
+	}
+	if (!fit_image_verify(fit, node)) {
+		ret = -EACCES;
+		goto out;
+	}
+
+	ret = fit_image_get_data(fit, node, &fit_data, &fit_len);
+	if (ret)
+		goto out;
+
+	dest = map_sysmem(dest_addr, fit_len);
+	memmove(dest, fit_data, fit_len);
+	unmap_sysmem(dest);
+	*sizep = fit_len;
+out:
+	unmap_sysmem(fit);
+	return ret;
+}
+#endif
+
+static int mtk_fdt_load(struct mtk_fdt_source *source, const char *path,
+			ulong dest_addr, size_t *sizep)
+{
+	loff_t size;
+	ulong load_addr = dest_addr;
+	int ret;
+
+#if CONFIG_IS_ENABLED(MTK_FDT_AUTH)
+	load_addr = env_get_hex("fw_fdt_wrapper_addr_r", 0);
+	if (!load_addr) {
+		printf("fw_fdt_wrapper_addr_r is not set\n");
+		return -EINVAL;
+	}
+#endif
+
+	printf("Loading RITY devicetree '%s'\n", path);
+	ret = mtk_fdt_source_read(source, path, load_addr, &size);
+	if (ret)
+		return ret;
+	if (!size)
+		return -EINVAL;
+
+#if CONFIG_IS_ENABLED(MTK_FDT_AUTH)
+	ret = mtk_fdt_extract_verified(load_addr, size, dest_addr, sizep);
+	if (ret) {
+		printf("Authentication failed for '%s' (%d)\n", path, ret);
+		return -EKEYREJECTED;
+	}
+
+	return 0;
+#else
+	*sizep = size;
+	return 0;
+#endif
+}
+
+static int mtk_fdt_apply_overlays(struct mtk_fdt_source *source,
+				  void *working_fdt, const char *dtb_path)
+{
+	const char *list = env_get("list_dtbo");
+	ulong overlay_addr = env_get_hex("fdtoverlay_addr_r", 0);
+	char path[MTK_FDT_PATH_MAX];
+	char *copy, *overlay, *next;
+	size_t size;
+	void *blob;
+	int ret = 0;
+
+	if (!list || !*list)
+		return 0;
+	if (!overlay_addr)
+		return -EINVAL;
+
+	copy = strdup(list);
+	if (!copy)
+		return -ENOMEM;
+	next = copy;
+
+	while ((overlay = strsep(&next, " "))) {
+		if (!*overlay)
+			continue;
+
+		ret = mtk_fdt_make_path(path, sizeof(path), dtb_path, overlay);
+		if (ret)
+			break;
+		ret = mtk_fdt_load(source, path, overlay_addr, &size);
+		if (ret)
+			break;
+
+		blob = map_sysmem(overlay_addr, size);
+		ret = fdt_check_header(blob);
+		if (!ret)
+			ret = fdt_overlay_apply_verbose(working_fdt, blob);
+		unmap_sysmem(blob);
+		if (ret)
+			break;
+	}
+
+	free(copy);
+	return ret;
+}
+
+int mtk_fdt_prepare_from(const char *storage, const char *storage_dev,
+			 const char *dtb_path)
+{
+	const char *fdtfile = env_get("fdtfile");
+	struct mtk_fdt_source source = {};
+	ulong fdt_addr = env_get_hex("fdt_addr_r", 0);
+	ulong fdt_resize = env_get_hex("fdt_resize", 0);
+	char path[MTK_FDT_PATH_MAX];
+	void *working_fdt;
+	size_t size;
+	int ret;
+
+	/*
+	 * Never leave a previous or fallback tree published after an error.
+	 * Publish zero rather than deleting fdt_addr: efi_install_fdt() falls
+	 * back to fdtcontroladdr when fdt_addr is absent, while a zero value
+	 * shadows that fallback and is rejected, so a failed preparation
+	 * cannot boot an OS with the U-Boot control devicetree.
+	 */
+	env_set_hex("fdt_addr", 0);
+	env_set_hex("fw_fdt_size", 0);
+
+	if (fdtfile && *fdtfile) {
+		ret = env_set("fw_fdtfile", fdtfile);
+		if (ret)
+			return ret;
+	}
+	env_set("fdtfile", NULL);
+	fdtfile = env_get("fw_fdtfile");
+
+	if (!fdt_addr || !dtb_path || !fdtfile || !*fdtfile)
+		return -EINVAL;
+
+	ret = mtk_fdt_make_path(path, sizeof(path), dtb_path, fdtfile);
+	if (ret)
+		return ret;
+	ret = mtk_fdt_select_source(&source, path, storage, storage_dev);
+	if (ret) {
+		printf("No RITY devicetree source contains '%s'\n", path);
+		return ret;
+	}
+
+	ret = mtk_fdt_load(&source, path, fdt_addr, &size);
+	if (ret)
+		return ret;
+
+	working_fdt = map_sysmem(fdt_addr, size);
+	ret = fdt_check_header(working_fdt);
+	if (ret)
+		goto out;
+
+	ret = fdt_shrink_to_minimum(working_fdt, fdt_resize);
+	if (ret < 0)
+		goto out;
+
+	ret = mtk_fdt_apply_overlays(&source, working_fdt, dtb_path);
+	if (ret)
+		goto out;
+
+	size = fdt_totalsize(working_fdt);
+	ret = env_set_hex("fw_fdt_size", size);
+	if (!ret)
+		ret = env_set_hex("fdt_addr", fdt_addr);
+	if (!ret)
+		printf("Prepared RITY devicetree at 0x%lx (%zu bytes)\n",
+		       fdt_addr, size);
+out:
+	unmap_sysmem(working_fdt);
+	return ret;
+}
+
+int mtk_fdt_prepare(void)
+{
+	return mtk_fdt_prepare_from(env_get("storage"), env_get("storage_dev"),
+				    env_get("dtb_path"));
+}
+
+static bool mtk_fdt_has_efi_target(void)
+{
+	const char *targets = env_get("boot_targets");
+	char *copy, *next, *target;
+	bool has_efi = false;
+
+	/* With no explicit policy, bootstd may still discover an EFI bootflow. */
+	if (!targets || !*targets)
+		return true;
+
+	copy = strdup(targets);
+	if (!copy)
+		return true;
+	next = copy;
+	while ((target = strsep(&next, " "))) {
+		if (*target && strcmp(target, "embedded")) {
+			has_efi = true;
+			break;
+		}
+	}
+	free(copy);
+
+	return has_efi;
+}
+
+static int mtk_fdt_post_preboot(void)
+{
+	int ret;
+
+	if (!mtk_fdt_has_efi_target())
+		return 0;
+
+	ret = mtk_fdt_prepare();
+	if (ret)
+		printf("RITY devicetree preparation failed (%d)\n", ret);
+
+	/* Keep the prompt and legacy boot path available; EFI fails via fdt_addr=0. */
+	return 0;
+}
+
+EVENT_SPY_SIMPLE(EVT_POST_PREBOOT, mtk_fdt_post_preboot);
diff --git a/arch/arm/mach-mediatek/fdt_prepare.h b/arch/arm/mach-mediatek/fdt_prepare.h
new file mode 100644
index 00000000000..5c140e3e335
--- /dev/null
+++ b/arch/arm/mach-mediatek/fdt_prepare.h
@@ -0,0 +1,10 @@
+/* SPDX-License-Identifier: GPL-2.0+ */
+
+#ifndef __MTK_FDT_PREPARE_H
+#define __MTK_FDT_PREPARE_H
+
+int mtk_fdt_prepare(void);
+int mtk_fdt_prepare_from(const char *storage, const char *storage_dev,
+			 const char *dtb_path);
+
+#endif

-- 
2.55.0


^ permalink raw reply related	[flat|nested] 6+ messages in thread

* [PATCH 2/3] arm: mediatek: add RITY devicetree compatibility commands
  2026-08-28  8:39 [PATCH 0/3] Add RITY devicetree preparation support Carlo Caione
  2026-08-28  8:39 ` [PATCH 1/3] arm: mediatek: add RITY devicetree preparation Carlo Caione
@ 2026-08-28  8:39 ` Carlo Caione
  2026-08-28  8:39 ` [PATCH 3/3] arm: mediatek: add bootembedded compatibility command Carlo Caione
  2026-08-28 14:59 ` [PATCH 0/3] Add RITY devicetree preparation support Tom Rini
  3 siblings, 0 replies; 6+ messages in thread
From: Carlo Caione @ 2026-08-28  8:39 UTC (permalink / raw)
  To: GSS_MTK_Uboot_upstream, u-boot
  Cc: Tom Rini, Ilias Apalodimas, Ryder Lee, Weijie Gao, Chunfeng Yun,
	Igor Belwon, David Lechner, Julien Stephan, Johan Jonker,
	Macpaul Lin, Chris-QJ Chen, Pablo Sun (孫毓翔),
	Carlo Caione

RITY boot environments invoke dtbprobe before EFI boot, or fdtprobe when
devicetree authentication is enabled. These command names and their
positional arguments form part of the RITY image interface.

Register compatibility aliases beside mtk_fdt_prepare and share the common
argument parser and preparation service. Expose only the alias appropriate
to the selected security mode.

Keep the authenticated fdtprobe failure policy: failure to authenticate a
signed DTB or DTBO wrapper is fatal and panics with the established
diagnostic. Other preparation failures return to the caller, and
mtk_fdt_prepare remains recoverable for interactive diagnosis.

Signed-off-by: Carlo Caione <ccaione@baylibre.com>
---
 arch/arm/mach-mediatek/Kconfig           |  3 ++
 arch/arm/mach-mediatek/cmd_fdt_prepare.c | 47 ++++++++++++++++++++++++++++----
 2 files changed, 44 insertions(+), 6 deletions(-)

diff --git a/arch/arm/mach-mediatek/Kconfig b/arch/arm/mach-mediatek/Kconfig
index 75fa88a1510..aedc5992965 100644
--- a/arch/arm/mach-mediatek/Kconfig
+++ b/arch/arm/mach-mediatek/Kconfig
@@ -240,6 +240,9 @@ config CMD_MTK_FDT_PREPARE
 	  environment. It also accepts the interface, device and path arguments
 	  explicitly.
 
+	  Also provide the RITY-compatible dtbprobe command, or fdtprobe
+	  when devicetree authentication is enabled.
+
 config MTK_FDT_AUTH
 	bool "Authenticate MediaTek RITY devicetrees"
 	depends on MTK_FDT_PREPARE && FIT_SIGNATURE
diff --git a/arch/arm/mach-mediatek/cmd_fdt_prepare.c b/arch/arm/mach-mediatek/cmd_fdt_prepare.c
index 91d56f747ef..5184aa851a7 100644
--- a/arch/arm/mach-mediatek/cmd_fdt_prepare.c
+++ b/arch/arm/mach-mediatek/cmd_fdt_prepare.c
@@ -4,21 +4,32 @@
  */
 
 #include <command.h>
+#include <vsprintf.h>
+#include <linux/errno.h>
 
 #include "fdt_prepare.h"
 
-static int do_mtk_fdt_prepare(struct cmd_tbl *cmdtp, int flag, int argc,
-			      char *const argv[])
+static int run_mtk_fdt_prepare(int argc, char *const argv[], int *retp)
 {
-	int ret;
-
 	if (argc == 1)
-		ret = mtk_fdt_prepare();
+		*retp = mtk_fdt_prepare();
 	else if (argc == 4)
-		ret = mtk_fdt_prepare_from(argv[1], argv[2], argv[3]);
+		*retp = mtk_fdt_prepare_from(argv[1], argv[2], argv[3]);
 	else
 		return CMD_RET_USAGE;
 
+	return CMD_RET_SUCCESS;
+}
+
+static int do_mtk_fdt_prepare(struct cmd_tbl *cmdtp, int flag, int argc,
+			      char *const argv[])
+{
+	int ret, status;
+
+	status = run_mtk_fdt_prepare(argc, argv, &ret);
+	if (status)
+		return status;
+
 	return ret ? CMD_RET_FAILURE : CMD_RET_SUCCESS;
 }
 
@@ -29,3 +40,27 @@ static int do_mtk_fdt_prepare(struct cmd_tbl *cmdtp, int flag, int argc,
 U_BOOT_CMD(mtk_fdt_prepare, 4, 1, do_mtk_fdt_prepare,
 	   "load and assemble the MediaTek RITY devicetree",
 	   MTK_FDT_PREPARE_USAGE);
+
+#if CONFIG_IS_ENABLED(MTK_FDT_AUTH)
+static int do_mtk_fdt_prepare_auth(struct cmd_tbl *cmdtp, int flag, int argc,
+				   char *const argv[])
+{
+	int ret, status;
+
+	status = run_mtk_fdt_prepare(argc, argv, &ret);
+	if (status)
+		return status;
+	if (ret == -EKEYREJECTED)
+		panic("Invalid dtb/dtbo.");
+
+	return ret ? CMD_RET_FAILURE : CMD_RET_SUCCESS;
+}
+
+U_BOOT_CMD(fdtprobe, 4, 1, do_mtk_fdt_prepare_auth,
+	   "load and assemble an authenticated MediaTek RITY devicetree",
+	   MTK_FDT_PREPARE_USAGE);
+#else
+U_BOOT_CMD(dtbprobe, 4, 1, do_mtk_fdt_prepare,
+	   "load and assemble a MediaTek RITY devicetree",
+	   MTK_FDT_PREPARE_USAGE);
+#endif

-- 
2.55.0


^ permalink raw reply related	[flat|nested] 6+ messages in thread

* [PATCH 3/3] arm: mediatek: add bootembedded compatibility command
  2026-08-28  8:39 [PATCH 0/3] Add RITY devicetree preparation support Carlo Caione
  2026-08-28  8:39 ` [PATCH 1/3] arm: mediatek: add RITY devicetree preparation Carlo Caione
  2026-08-28  8:39 ` [PATCH 2/3] arm: mediatek: add RITY devicetree compatibility commands Carlo Caione
@ 2026-08-28  8:39 ` Carlo Caione
  2026-08-28 14:59 ` [PATCH 0/3] Add RITY devicetree preparation support Tom Rini
  3 siblings, 0 replies; 6+ messages in thread
From: Carlo Caione @ 2026-08-28  8:39 UTC (permalink / raw)
  To: GSS_MTK_Uboot_upstream, u-boot
  Cc: Tom Rini, Ilias Apalodimas, Ryder Lee, Weijie Gao, Chunfeng Yun,
	Igor Belwon, David Lechner, Julien Stephan, Johan Jonker,
	Macpaul Lin, Chris-QJ Chen, Pablo Sun (孫毓翔),
	Carlo Caione

RITY boot environments use bootembedded as the legacy boot target. The
command is part of the interface shared by the generated environment and
U-Boot.

Locate the appended RITY FIT script after U-Boot's separate control
devicetree and execute it through the standard source command. This avoids
duplicating the legacy boot policy in C and retains source and bootm
authentication for secure builds.

Keep the command independently selectable because legacy FIT boot does
not depend on mtk_fdt_prepare.

Signed-off-by: Carlo Caione <ccaione@baylibre.com>
---
 arch/arm/mach-mediatek/Kconfig            |  7 ++++
 arch/arm/mach-mediatek/Makefile           |  1 +
 arch/arm/mach-mediatek/cmd_bootembedded.c | 59 +++++++++++++++++++++++++++++++
 3 files changed, 67 insertions(+)

diff --git a/arch/arm/mach-mediatek/Kconfig b/arch/arm/mach-mediatek/Kconfig
index aedc5992965..a5541db13cf 100644
--- a/arch/arm/mach-mediatek/Kconfig
+++ b/arch/arm/mach-mediatek/Kconfig
@@ -243,6 +243,13 @@ config CMD_MTK_FDT_PREPARE
 	  Also provide the RITY-compatible dtbprobe command, or fdtprobe
 	  when devicetree authentication is enabled.
 
+config CMD_MTK_BOOTEMBEDDED
+	bool "Enable the RITY-compatible 'bootembedded' command"
+	depends on CMD_SOURCE && OF_SEPARATE
+	help
+	  Provide the RITY legacy-boot command. Locate and run the boot script
+	  appended after the separate U-Boot control devicetree.
+
 config MTK_FDT_AUTH
 	bool "Authenticate MediaTek RITY devicetrees"
 	depends on MTK_FDT_PREPARE && FIT_SIGNATURE
diff --git a/arch/arm/mach-mediatek/Makefile b/arch/arm/mach-mediatek/Makefile
index e11fddd27bc..9c595af75c4 100644
--- a/arch/arm/mach-mediatek/Makefile
+++ b/arch/arm/mach-mediatek/Makefile
@@ -5,6 +5,7 @@ obj-y	+= cpu.o
 obj-$(CONFIG_MTK_TZ_MOVABLE)	+= tzcfg.o
 obj-$(CONFIG_MTK_FDT_PREPARE)	+= fdt_prepare.o
 obj-$(CONFIG_CMD_MTK_FDT_PREPARE)	+= cmd_fdt_prepare.o
+obj-$(CONFIG_CMD_MTK_BOOTEMBEDDED)	+= cmd_bootembedded.o
 obj-$(CONFIG_XPL_BUILD)	+= spl.o
 
 obj-$(CONFIG_TARGET_MT7622) += mt7622/
diff --git a/arch/arm/mach-mediatek/cmd_bootembedded.c b/arch/arm/mach-mediatek/cmd_bootembedded.c
new file mode 100644
index 00000000000..99f92667223
--- /dev/null
+++ b/arch/arm/mach-mediatek/cmd_bootembedded.c
@@ -0,0 +1,59 @@
+// SPDX-License-Identifier: GPL-2.0+
+/*
+ * Copyright (C) 2026 Carlo Caione <ccaione@baylibre.com>
+ */
+
+#include <asm-generic/sections.h>
+#include <command.h>
+#include <mapmem.h>
+#include <linux/kernel.h>
+#include <linux/libfdt.h>
+
+static int do_bootembedded(struct cmd_tbl *cmdtp, int flag, int argc,
+			   char *const argv[])
+{
+	ulong control_fdt_addr, script_addr;
+	const void *control_fdt, *script;
+	int ret;
+
+	/*
+	 * The control devicetree and the boot script are appended to the
+	 * U-Boot binary, so they stay at the load address even after U-Boot
+	 * has relocated itself. Derive that address from the image size,
+	 * which is relocation invariant, instead of from _end, which moves
+	 * with the relocated image.
+	 */
+	control_fdt_addr = CONFIG_TEXT_BASE + (ulong)(_end - (char *)&_start);
+	control_fdt = map_sysmem(control_fdt_addr, 0);
+	ret = fdt_check_header(control_fdt);
+	if (ret) {
+		printf("Invalid appended U-Boot control devicetree (%d)\n", ret);
+		goto unmap_control_fdt;
+	}
+
+	/*
+	 * RITY image generation pads the image to a multiple of 8 bytes before
+	 * appending the script ('dd bs=8 conv=sync'), because libfdt requires
+	 * 8-byte alignment. Keep both sides in sync.
+	 */
+	script_addr = ALIGN(control_fdt_addr + fdt_totalsize(control_fdt), 8);
+	unmap_sysmem(control_fdt);
+
+	script = map_sysmem(script_addr, 0);
+	ret = fdt_check_header(script);
+	unmap_sysmem(script);
+	if (ret) {
+		printf("No valid appended MediaTek boot script (%d)\n", ret);
+		return CMD_RET_FAILURE;
+	}
+
+	printf("Running appended MediaTek boot script at 0x%lx\n", script_addr);
+	return run_commandf("source %lx", script_addr);
+
+unmap_control_fdt:
+	unmap_sysmem(control_fdt);
+	return CMD_RET_FAILURE;
+}
+
+U_BOOT_CMD(bootembedded, 1, 1, do_bootembedded,
+	   "run the appended MediaTek embedded boot script", "");

-- 
2.55.0


^ permalink raw reply related	[flat|nested] 6+ messages in thread

* Re: [PATCH 0/3] Add RITY devicetree preparation support
  2026-08-28  8:39 [PATCH 0/3] Add RITY devicetree preparation support Carlo Caione
                   ` (2 preceding siblings ...)
  2026-08-28  8:39 ` [PATCH 3/3] arm: mediatek: add bootembedded compatibility command Carlo Caione
@ 2026-08-28 14:59 ` Tom Rini
  2026-08-29 13:59   ` Carlo Caione
  3 siblings, 1 reply; 6+ messages in thread
From: Tom Rini @ 2026-08-28 14:59 UTC (permalink / raw)
  To: Carlo Caione
  Cc: GSS_MTK_Uboot_upstream, u-boot, Ilias Apalodimas, Ryder Lee,
	Weijie Gao, Chunfeng Yun, Igor Belwon, David Lechner,
	Julien Stephan, Johan Jonker, Macpaul Lin, Chris-QJ Chen,
	Pablo Sun (孫毓翔)

[-- Attachment #1: Type: text/plain, Size: 1933 bytes --]

On Fri, Aug 28, 2026 at 10:39:55AM +0200, Carlo Caione wrote:
> RITY images select a base devicetree and an ordered list of overlays
> through the storage, storage_dev, dtb_path, boot_dtb, fdtfile and list_dtbo
> environment variables. EFI boot needs the selected tree to be assembled
> and published through fdt_addr before the operating system is started.
> 
> Add MediaTek support to consume that interface. It locates the selected
> source on GPT block partitions or on the RITY UBI/UBIFS NOR layout, loads
> the base DTB, applies list_dtbo in order and publishes the completed tree.
> Both raw and authenticated DTB and DTBO inputs are supported.
> 
> Expose mtk_fdt_prepare for interactive use. Retain the dtbprobe and
> fdtprobe command names and positional arguments used by RITY EFI boot
> environments. Also provide bootembedded for legacy boot. It locates and
> runs the appended RITY boot script through the standard source command,
> leaving the legacy policy and authentication to source and bootm.
> 
> The implementation uses existing block, MTD, UBI/UBIFS, libfdt overlay,
> image verification, source and bootm services.
> 
> Signed-off-by: Carlo Caione <ccaione@baylibre.com>
> ---
> Carlo Caione (3):
>       arm: mediatek: add RITY devicetree preparation
>       arm: mediatek: add RITY devicetree compatibility commands
>       arm: mediatek: add bootembedded compatibility command
> 
>  arch/arm/mach-mediatek/Kconfig            |  45 +++
>  arch/arm/mach-mediatek/Makefile           |   3 +
>  arch/arm/mach-mediatek/cmd_bootembedded.c |  59 ++++
>  arch/arm/mach-mediatek/cmd_fdt_prepare.c  |  66 ++++
>  arch/arm/mach-mediatek/fdt_prepare.c      | 502 ++++++++++++++++++++++++++++++
>  arch/arm/mach-mediatek/fdt_prepare.h      |  10 +

Is this some mediatek specific format? But even if so, cmds should go
under something like cmd/mediatek (and get docs..).

-- 
Tom

[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 228 bytes --]

^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: [PATCH 0/3] Add RITY devicetree preparation support
  2026-08-28 14:59 ` [PATCH 0/3] Add RITY devicetree preparation support Tom Rini
@ 2026-08-29 13:59   ` Carlo Caione
  0 siblings, 0 replies; 6+ messages in thread
From: Carlo Caione @ 2026-08-29 13:59 UTC (permalink / raw)
  To: Tom Rini, Carlo Caione
  Cc: GSS_MTK_Uboot_upstream, u-boot, Ilias Apalodimas, Ryder Lee,
	Weijie Gao, Chunfeng Yun, Igor Belwon, David Lechner,
	Julien Stephan, Johan Jonker, Macpaul Lin, Chris-QJ Chen,
	Pablo Sun (孫毓翔)

On Fri Aug 28, 2026 at 4:59 PM CEST, Tom Rini wrote:
> On Fri, Aug 28, 2026 at 10:39:55AM +0200, Carlo Caione wrote:
>> RITY images select a base devicetree and an ordered list of overlays
>> through the storage, storage_dev, dtb_path, boot_dtb, fdtfile and list_dtbo
>> environment variables. EFI boot needs the selected tree to be assembled
>> and published through fdt_addr before the operating system is started.
>> 
>> Add MediaTek support to consume that interface. It locates the selected
>> source on GPT block partitions or on the RITY UBI/UBIFS NOR layout, loads
>> the base DTB, applies list_dtbo in order and publishes the completed tree.
>> Both raw and authenticated DTB and DTBO inputs are supported.
>> 
>> Expose mtk_fdt_prepare for interactive use. Retain the dtbprobe and
>> fdtprobe command names and positional arguments used by RITY EFI boot
>> environments. Also provide bootembedded for legacy boot. It locates and
>> runs the appended RITY boot script through the standard source command,
>> leaving the legacy policy and authentication to source and bootm.
>> 
>> The implementation uses existing block, MTD, UBI/UBIFS, libfdt overlay,
>> image verification, source and bootm services.
>> 
>> Signed-off-by: Carlo Caione <ccaione@baylibre.com>
>> ---
>> Carlo Caione (3):
>>       arm: mediatek: add RITY devicetree preparation
>>       arm: mediatek: add RITY devicetree compatibility commands
>>       arm: mediatek: add bootembedded compatibility command
>> 
>>  arch/arm/mach-mediatek/Kconfig            |  45 +++
>>  arch/arm/mach-mediatek/Makefile           |   3 +
>>  arch/arm/mach-mediatek/cmd_bootembedded.c |  59 ++++
>>  arch/arm/mach-mediatek/cmd_fdt_prepare.c  |  66 ++++
>>  arch/arm/mach-mediatek/fdt_prepare.c      | 502 ++++++++++++++++++++++++++++++
>>  arch/arm/mach-mediatek/fdt_prepare.h      |  10 +
>
> Is this some mediatek specific format? But even if so, cmds should go
> under something like cmd/mediatek (and get docs..).

Yes, this is Mediatek-specific. I’ll move the commands under
cmd/mediatek (didn't notice that) and add documentation in v2.

Cheers,

--
Carlo Caione

^ permalink raw reply	[flat|nested] 6+ messages in thread

end of thread, other threads:[~2026-08-29 13:59 UTC | newest]

Thread overview: 6+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2026-08-28  8:39 [PATCH 0/3] Add RITY devicetree preparation support Carlo Caione
2026-08-28  8:39 ` [PATCH 1/3] arm: mediatek: add RITY devicetree preparation Carlo Caione
2026-08-28  8:39 ` [PATCH 2/3] arm: mediatek: add RITY devicetree compatibility commands Carlo Caione
2026-08-28  8:39 ` [PATCH 3/3] arm: mediatek: add bootembedded compatibility command Carlo Caione
2026-08-28 14:59 ` [PATCH 0/3] Add RITY devicetree preparation support Tom Rini
2026-08-29 13:59   ` Carlo Caione

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox