All of lore.kernel.org
 help / color / mirror / Atom feed
From: Simon Glass <sjg@chromium.org>
To: u-boot@lists.denx.de
Subject: [PATCH v2 49/50] image: Split up boot_get_fdt()
Date: Thu,  6 May 2021 08:24:37 -0600	[thread overview]
Message-ID: <20210506142438.1310977-22-sjg@chromium.org> (raw)
In-Reply-To: <20210506142438.1310977-1-sjg@chromium.org>

This function is far too long. Before trying to remove #ifdefs, split out
the code that deals with selecting the FDT into a separate function.

Signed-off-by: Simon Glass <sjg@chromium.org>
---

(no changes since v1)

 common/image-fdt.c | 227 +++++++++++++++++++++++++--------------------
 1 file changed, 127 insertions(+), 100 deletions(-)

diff --git a/common/image-fdt.c b/common/image-fdt.c
index 524adbd1339..53976e39796 100644
--- a/common/image-fdt.c
+++ b/common/image-fdt.c
@@ -245,53 +245,29 @@ error:
 }
 
 /**
- * boot_get_fdt - main fdt handling routine
- * @argc: command argument count
- * @argv: command argument list
- * @arch: architecture (IH_ARCH_...)
- * @images: pointer to the bootm images structure
- * @of_flat_tree: pointer to a char* variable, will hold fdt start address
- * @of_size: pointer to a ulong variable, will hold fdt length
+ * select_fdt() - Select and locate the FDT to use
  *
- * boot_get_fdt() is responsible for finding a valid flat device tree image.
- * Curently supported are the following ramdisk sources:
- *      - multicomponent kernel/ramdisk image,
- *      - commandline provided address of decicated ramdisk image.
- *
- * returns:
- *     0, if fdt image was found and valid, or skipped
- *     of_flat_tree and of_size are set to fdt start address and length if
- *     fdt image is found and valid
- *
- *     1, if fdt image is found but corrupted
- *     of_flat_tree and of_size are set to 0 if no fdt exists
+ * @images: pointer to the bootm images structure
+ * @select: name of FDT to select, or NULL for any
+ * @arch: expected FDT architecture
+ * @fdt_addrp: pointer to a ulong variable, will hold FDT pointer
+ * @return 0 if OK, -ENOPKG if no FDT (but an error should not be reported),
+ *	other -ve value on other error
  */
-int boot_get_fdt(int flag, int argc, char *const argv[], uint8_t arch,
-		 bootm_headers_t *images, char **of_flat_tree, ulong *of_size)
-{
-	ulong		img_addr;
-	ulong		fdt_addr;
-	char		*fdt_blob = NULL;
-	void		*buf;
-	const char *select = NULL;
 
-	*of_flat_tree = NULL;
-	*of_size = 0;
-
-	img_addr = (argc == 0) ? image_load_addr :
-			simple_strtoul(argv[0], NULL, 16);
-	buf = map_sysmem(img_addr, 0);
+static int select_fdt(bootm_headers_t *images, const char *select, u8 arch,
+		      ulong *fdt_addrp)
+{
+	const char *buf;
+	ulong fdt_addr;
 
-	if (argc > 2)
-		select = argv[2];
-	if (select || genimg_has_config(images)) {
 #if CONFIG_IS_ENABLED(FIT)
-		const char *fit_uname_config = images->fit_uname_cfg;
-		const char *fit_uname_fdt = NULL;
-		ulong default_addr;
-		int fdt_noffset;
+	const char *fit_uname_config = images->fit_uname_cfg;
+	const char *fit_uname_fdt = NULL;
+	ulong default_addr;
+	int fdt_noffset;
 
-		if (select) {
+	if (select) {
 			/*
 			 * If the FDT blob comes from the FIT image and the
 			 * FIT image address is omitted in the command line
@@ -305,48 +281,47 @@ int boot_get_fdt(int flag, int argc, char *const argv[], uint8_t arch,
 			else
 				default_addr = image_load_addr;
 
-			if (fit_parse_conf(select, default_addr,
-					   &fdt_addr, &fit_uname_config)) {
+			if (fit_parse_conf(select, default_addr, &fdt_addr,
+					   &fit_uname_config)) {
 				debug("*  fdt: config '%s' from image at 0x%08lx\n",
 				      fit_uname_config, fdt_addr);
-			} else if (fit_parse_subimage(select, default_addr,
-				   &fdt_addr, &fit_uname_fdt)) {
+			} else if (fit_parse_subimage(select, default_addr, &fdt_addr,
+				   &fit_uname_fdt)) {
 				debug("*  fdt: subimage '%s' from image at 0x%08lx\n",
 				      fit_uname_fdt, fdt_addr);
 			} else
 #endif
-			{
-				fdt_addr = simple_strtoul(select, NULL, 16);
-				debug("*  fdt: cmdline image address = 0x%08lx\n",
-				      fdt_addr);
-			}
-#if CONFIG_IS_ENABLED(FIT)
-		} else {
-			/* use FIT configuration provided in first bootm
-			 * command argument
-			 */
-			fdt_addr = map_to_sysmem(images->fit_hdr_os);
-			fdt_noffset = fit_get_node_from_config(images,
-							       FIT_FDT_PROP,
-							       fdt_addr);
-			if (fdt_noffset == -ENOENT)
-				return 0;
-			else if (fdt_noffset < 0)
-				return 1;
+		{
+			fdt_addr = simple_strtoul(select, NULL, 16);
+			debug("*  fdt: cmdline image address = 0x%08lx\n",
+			      fdt_addr);
 		}
-#endif
-		debug("## Checking for 'FDT'/'FDT Image' at %08lx\n",
-		      fdt_addr);
-
-		/*
-		 * Check if there is an FDT image@the
-		 * address provided in the second bootm argument
-		 * check image type, for FIT images get a FIT node.
+#if CONFIG_IS_ENABLED(FIT)
+	} else {
+		/* use FIT configuration provided in first bootm
+		 * command argument
 		 */
-		buf = map_sysmem(fdt_addr, 0);
-		switch (genimg_get_format(buf)) {
+		fdt_addr = map_to_sysmem(images->fit_hdr_os);
+		fdt_noffset = fit_get_node_from_config(images, FIT_FDT_PROP,
+						       fdt_addr);
+		if (fdt_noffset == -ENOENT)
+			return -ENOPKG;
+		else if (fdt_noffset < 0)
+			return fdt_noffset;
+	}
+#endif
+	debug("## Checking for 'FDT'/'FDT Image' at %08lx\n",
+	      fdt_addr);
+
+	/*
+	 * Check if there is an FDT image@the
+	 * address provided in the second bootm argument
+	 * check image type, for FIT images get a FIT node.
+	 */
+	buf = map_sysmem(fdt_addr, 0);
+	switch (genimg_get_format(buf)) {
 #if CONFIG_IS_ENABLED(LEGACY_IMAGE_FORMAT)
-		case IMAGE_FORMAT_LEGACY: {
+	case IMAGE_FORMAT_LEGACY: {
 			const image_header_t *fdt_hdr;
 			ulong load, load_end;
 			ulong image_start, image_data, image_end;
@@ -356,7 +331,7 @@ int boot_get_fdt(int flag, int argc, char *const argv[], uint8_t arch,
 			       fdt_addr);
 			fdt_hdr = image_get_fdt(fdt_addr);
 			if (!fdt_hdr)
-				goto no_fdt;
+				return -ENOPKG;
 
 			/*
 			 * move image data to the load address,
@@ -377,7 +352,7 @@ int boot_get_fdt(int flag, int argc, char *const argv[], uint8_t arch,
 
 			if ((load < image_end) && (load_end > image_start)) {
 				fdt_error("fdt overwritten");
-				goto error;
+				return -EFAULT;
 			}
 
 			debug("   Loading FDT from 0x%08lx to 0x%08lx\n",
@@ -391,24 +366,24 @@ int boot_get_fdt(int flag, int argc, char *const argv[], uint8_t arch,
 			break;
 		}
 #endif
-		case IMAGE_FORMAT_FIT:
-			/*
-			 * This case will catch both: new uImage format
-			 * (libfdt based) and raw FDT blob (also libfdt
-			 * based).
-			 */
+	case IMAGE_FORMAT_FIT:
+		/*
+		 * This case will catch both: new uImage format
+		 * (libfdt based) and raw FDT blob (also libfdt
+		 * based).
+		 */
 #if CONFIG_IS_ENABLED(FIT)
 			/* check FDT blob vs FIT blob */
 			if (!fit_check_format(buf, IMAGE_SIZE_INVAL)) {
 				ulong load, len;
 
-				fdt_noffset = boot_get_fdt_fit(images,
-					fdt_addr, &fit_uname_fdt,
-					&fit_uname_config,
-					arch, &load, &len);
+				fdt_noffset = boot_get_fdt_fit(images, fdt_addr,
+							       &fit_uname_fdt,
+							       &fit_uname_config,
+							       arch, &load, &len);
 
 				if (fdt_noffset < 0)
-					goto error;
+					return -ENOENT;
 
 				images->fit_hdr_fdt = map_sysmem(fdt_addr, 0);
 				images->fit_uname_fdt = fit_uname_fdt;
@@ -416,22 +391,74 @@ int boot_get_fdt(int flag, int argc, char *const argv[], uint8_t arch,
 				fdt_addr = load;
 
 				break;
-			} else
+		} else
 #endif
-			{
-				/*
-				 * FDT blob
-				 */
-				debug("*  fdt: raw FDT blob\n");
-				printf("## Flattened Device Tree blob at %08lx\n",
-				       (long)fdt_addr);
-			}
-			break;
-		default:
-			puts("ERROR: Did not find a cmdline Flattened Device Tree\n");
-			goto error;
+		{
+			/*
+			 * FDT blob
+			 */
+			debug("*  fdt: raw FDT blob\n");
+			printf("## Flattened Device Tree blob at %08lx\n",
+			       (long)fdt_addr);
 		}
+		break;
+	default:
+		puts("ERROR: Did not find a cmdline Flattened Device Tree\n");
+		return -ENOENT;
+	}
+	*fdt_addrp = fdt_addr;
+
+	return 0;
+}
 
+/**
+ * boot_get_fdt - main fdt handling routine
+ * @argc: command argument count
+ * @argv: command argument list
+ * @arch: architecture (IH_ARCH_...)
+ * @images: pointer to the bootm images structure
+ * @of_flat_tree: pointer to a char* variable, will hold fdt start address
+ * @of_size: pointer to a ulong variable, will hold fdt length
+ *
+ * boot_get_fdt() is responsible for finding a valid flat device tree image.
+ * Currently supported are the following ramdisk sources:
+ *      - multicomponent kernel/ramdisk image,
+ *      - commandline provided address of decicated ramdisk image.
+ *
+ * returns:
+ *     0, if fdt image was found and valid, or skipped
+ *     of_flat_tree and of_size are set to fdt start address and length if
+ *     fdt image is found and valid
+ *
+ *     1, if fdt image is found but corrupted
+ *     of_flat_tree and of_size are set to 0 if no fdt exists
+ */
+int boot_get_fdt(int flag, int argc, char *const argv[], uint8_t arch,
+		 bootm_headers_t *images, char **of_flat_tree, ulong *of_size)
+{
+	ulong		img_addr;
+	ulong		fdt_addr;
+	char		*fdt_blob = NULL;
+	void		*buf;
+	const char *select = NULL;
+
+	*of_flat_tree = NULL;
+	*of_size = 0;
+
+	img_addr = (argc == 0) ? image_load_addr :
+			simple_strtoul(argv[0], NULL, 16);
+	buf = map_sysmem(img_addr, 0);
+
+	if (argc > 2)
+		select = argv[2];
+	if (select || genimg_has_config(images)) {
+		int ret;
+
+		ret = select_fdt(images, select, arch, &fdt_addr);
+		if (ret == -ENOPKG)
+			goto no_fdt;
+		else if (ret)
+			return 1;
 		printf("   Booting using the fdt blob at %#08lx\n", fdt_addr);
 		fdt_blob = map_sysmem(fdt_addr, 0);
 	} else if (images->legacy_hdr_valid &&
-- 
2.31.1.607.g51e8a6a459-goog

  parent reply	other threads:[~2021-05-06 14:24 UTC|newest]

Thread overview: 91+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2021-05-06 14:23 [PATCH v2 00/50] image: Reduce #ifdefs and ad-hoc defines in image code Simon Glass
2021-05-06 14:23 ` [PATCH v2 01/50] lib: Add memdup() Simon Glass
2021-05-06 17:07   ` Pratyush Yadav
2021-05-06 17:41     ` Simon Glass
2021-05-06 17:57       ` Sean Anderson
2021-05-10  9:00       ` Rasmus Villemoes
2021-05-10 11:21         ` Heinrich Schuchardt
2021-05-10 16:28         ` Simon Glass
2021-05-06 14:23 ` [PATCH v2 02/50] Add support for an owned buffer Simon Glass
2021-05-06 14:23 ` [PATCH v2 03/50] compiler: Add a comment to host_build() Simon Glass
2021-05-06 14:23 ` [PATCH v2 04/50] zstd: Create a function for use from U-Boot Simon Glass
2021-05-06 14:23 ` [PATCH v2 05/50] btrfs: Use U-Boot API for decompression Simon Glass
2021-05-06 14:23 ` [PATCH v2 06/50] image: Avoid switch default in image_decomp() Simon Glass
2021-05-06 14:23 ` [PATCH v2 07/50] image: Update zstd to avoid reporting error twice Simon Glass
2021-05-06 14:23 ` [PATCH v2 08/50] gzip: Avoid use of u64 Simon Glass
2021-05-06 14:23 ` [PATCH v2 09/50] image: Update image_decomp() to avoid ifdefs Simon Glass
2021-05-06 14:23 ` [PATCH v2 10/50] image: Split board code out into its own file Simon Glass
2021-05-06 14:23 ` [PATCH v2 11/50] image: Fix up checkpatch warnings in image-board.c Simon Glass
2021-05-06 14:24 ` [PATCH v2 12/50] image: Split host code out into its own file Simon Glass
2021-05-06 14:24 ` [PATCH v2 13/50] image: Create a function to do manual relocation Simon Glass
2021-05-06 14:24 ` [PATCH v2 14/50] image: Avoid #ifdefs for " Simon Glass
2021-05-06 14:24 ` [PATCH v2 15/50] image: Remove ifdefs around image_setup_linux() el at Simon Glass
2021-05-06 14:24 ` [PATCH v2 16/50] image: Add Kconfig options for FIT in the host build Simon Glass
2021-05-11 19:57   ` Alex G.
2021-05-11 22:34     ` Tom Rini
2021-05-12  0:50       ` Alex G.
2021-05-12  1:10         ` Tom Rini
2021-05-12 15:52           ` Simon Glass
2021-05-12 16:19             ` Alex G.
2021-05-12 17:14               ` Tom Rini
2021-05-17 22:29                 ` Alex G.
2021-05-18  1:23                   ` AKASHI Takahiro
2021-05-19 15:49                     ` Alex G
2021-05-12 14:51     ` Simon Glass
2021-05-12 15:48       ` Alex G.
2021-05-12 15:54         ` Simon Glass
2021-05-12 16:18           ` Alex G.
2021-05-12 17:30             ` Simon Glass
2021-05-13 16:21               ` Alex G.
2021-05-13 23:56                 ` Simon Glass
2021-05-14 15:12                   ` Alex G.
2021-05-15 15:20                     ` Simon Glass
2021-05-06 14:24 ` [PATCH v2 17/50] kconfig: Add host support to CONFIG_IS_ENABLED() Simon Glass
2021-05-06 14:24 ` [PATCH v2 18/50] image: Shorten FIT_ENABLE_SHAxxx_SUPPORT Simon Glass
2021-05-14 15:30   ` Alex G.
2021-05-06 14:24 ` [PATCH v2 19/50] image: Rename SPL_SHAxxx_SUPPORT to SPL_FIT_SHAxxx Simon Glass
2021-05-14 15:34   ` Alex G.
2021-05-06 14:24 ` [PATCH v2 20/50] hash: Use Kconfig to enable hashing in host tools Simon Glass
2021-05-06 14:24 ` [PATCH v2 21/50] hash: Drop some #ifdefs in hash.c Simon Glass
2021-05-14 15:37   ` Alex G.
2021-05-14 20:43     ` Tom Rini
2021-05-06 14:24 ` [PATCH v2 22/50] image: Drop IMAGE_ENABLE_FIT Simon Glass
2021-05-06 14:24 ` [PATCH v2 23/50] image: Drop IMAGE_ENABLE_OF_LIBFDT Simon Glass
2021-05-06 14:24 ` [PATCH v2 24/50] image: Use Kconfig to enable CONFIG_FIT_VERBOSE on host Simon Glass
2021-05-06 14:24 ` [PATCH v2 25/50] image: Rename CONFIG_FIT_ENABLE_RSASSA_PSS_SUPPORT Simon Glass
2021-05-06 14:24 ` [PATCH v2 26/50] image: Use Kconfig to enable FIT_RSASSA_PSS on host Simon Glass
2021-05-06 14:24 ` [PATCH v2 27/50] Kconfig: Rename SPL_CRC32_SUPPORT to SPL_CRC32 Simon Glass
2021-05-14 21:31   ` Alex G.
2021-05-06 14:24 ` [PATCH v2 28/50] image: Drop IMAGE_ENABLE_CRC32 Simon Glass
2021-05-06 14:24 ` [PATCH v2 29/50] Kconfig: Rename SPL_MD5_SUPPORT to SPL_MD5 Simon Glass
2021-05-14 21:31   ` Alex G.
2021-05-06 14:24 ` [PATCH v2 30/50] image: Drop IMAGE_ENABLE_MD5 Simon Glass
2021-05-06 14:24 ` [PATCH v2 31/50] image: Drop IMAGE_ENABLE_SHA1 Simon Glass
2021-05-06 14:24 ` [PATCH v2 32/50] image: Drop IMAGE_ENABLE_SHAxxx Simon Glass
2021-05-06 14:24 ` [PATCH v2 33/50] image: Drop IMAGE_BOOT_GET_CMDLINE Simon Glass
2021-05-06 14:24 ` [PATCH v2 34/50] image: Drop IMAGE_OF_BOARD_SETUP Simon Glass
2021-05-06 14:24 ` [PATCH v2 35/50] image: Drop IMAGE_OF_SYSTEM_SETUP Simon Glass
2021-05-06 14:24 ` [PATCH v2 36/50] image: Drop IMAGE_ENABLE_IGNORE Simon Glass
2021-05-06 14:24 ` [PATCH v2 37/50] image: Drop IMAGE_ENABLE_SIGN/VERIFY defines Simon Glass
2021-05-14 20:38   ` Alex G.
2021-05-14 20:44     ` Simon Glass
2021-05-14 21:17       ` Alex G.
2021-05-15 15:20         ` Simon Glass
2021-05-06 14:24 ` [PATCH v2 38/50] image: Drop IMAGE_ENABLE_BEST_MATCH Simon Glass
2021-05-14 21:32   ` Alex G.
2021-05-06 14:24 ` [PATCH v2 39/50] image: Drop IMAGE_ENABLE_EN/DECRYPT defines Simon Glass
2021-05-06 14:24 ` [PATCH v2 40/50] image: Tidy up fit_unsupported_reset() Simon Glass
2021-05-06 14:24 ` [PATCH v2 41/50] image: Drop unnecessary #ifdefs from image.h Simon Glass
2021-05-14 21:45   ` Alex G.
2021-05-06 14:24 ` [PATCH v2 42/50] image: Drop #ifdefs for fit_print_contents() Simon Glass
2021-05-14 21:46   ` Alex G.
2021-05-06 14:24 ` [PATCH v2 43/50] image: Drop most #ifdefs in image-board.c Simon Glass
2021-05-06 14:24 ` [PATCH v2 44/50] image: Reduce variable scope in boot_get_ramdisk() Simon Glass
2021-05-06 14:24 ` [PATCH v2 45/50] image: Split up boot_get_ramdisk() Simon Glass
2021-05-06 14:24 ` [PATCH v2 46/50] image: Remove #ifdefs from select_ramdisk() Simon Glass
2021-05-06 14:24 ` [PATCH v2 47/50] image: Remove some #ifdefs from image-fit and image-fit-sig Simon Glass
2021-05-14 21:50   ` Alex G.
2021-05-15 15:20     ` Simon Glass
2021-05-06 14:24 ` [PATCH v2 48/50] image: Reduce variable scope in boot_get_fdt() Simon Glass
2021-05-06 14:24 ` Simon Glass [this message]
2021-05-06 14:24 ` [PATCH v2 50/50] image: Remove #ifdefs from select_fdt() Simon Glass

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20210506142438.1310977-22-sjg@chromium.org \
    --to=sjg@chromium.org \
    --cc=u-boot@lists.denx.de \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.