All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH v2 00/50] image: Reduce #ifdefs and ad-hoc defines in image code
@ 2021-05-06 14:23 Simon Glass
  2021-05-06 14:23 ` [PATCH v2 01/50] lib: Add memdup() Simon Glass
                   ` (49 more replies)
  0 siblings, 50 replies; 91+ messages in thread
From: Simon Glass @ 2021-05-06 14:23 UTC (permalink / raw)
  To: u-boot

Much of the image-handling code predates the introduction of Kconfig and
has quite a few #ifdefs in it. It also uses its own IMAGE_... defines to
help reduce the #ifdefs, which is unnecessary now that we can use
IS_ENABLED() et al.

The image code is also where quite a bit of code is shared with the host
tools. At present this uses a lot of checks of USE_HOSTCC.

This series introduces 'host' Kconfig options and a way to use
CONFIG_IS_ENABLED() to check them. This works in a similar way to SPL, so

   CONFIG_IS_ENABLED(FIT)

will evaluate to true on the host build (USE_HOSTCC) if CONFIG_HOST_FIT is
enabled. This allows quite a bit of clean-up of the image.h header file
and many of the image C files.

The 'host' Kconfig options should help to solve a more general problem in
that we mostly want the host tools to build with all features enabled, no
matter which features the 'target' build actually uses. This is a pain to
arrange at present, but with 'host' Kconfigs, we can just define them all
to y.

There are cases where the host tools do not have features which are
present on the target, for example environment and physical addressing.
To help with this, some of the core image code is split out into
image-board.c and image-host.c files.

Even with these changes, some #ifdefs remain (101 down to 42 in
common/image*). But the code is somewhat easier to follow and there are
fewer build paths.

In service of the above, this series includes a patch to add an API function
for zstd, so the code can be dropped from bootm.c

It also introduces a function to handle manual relocation.

Changes in v2:
- Add a patch to introduce a memdup() function
- Add new abuf_init_set() function
- Update abuf_realloc() to return after every case
- Use const for abuf_data() and abuf_size()
- Make use of memdup()
- Add abuf_init_move()
- Add comments about the assumptions made by lib_test_abuf_realloc()
- Add better comments about why some tests are skipped at present
- Correct 'hose' typo
- Fix up comment to put an underscore after every CONFIG
- Correct comment about USE_HOSTCC being undefined in CONFIG_VAL()
- Add SPL_ Kconfigs also, since otherwise hashing algorithms drop from SPL
- Drop unnecessary setting of rd_len, etc.
- Correct logic for the non-FIT case
- Consider selecting a raw FDT to be success

Simon Glass (50):
  lib: Add memdup()
  Add support for an owned buffer
  compiler: Add a comment to host_build()
  zstd: Create a function for use from U-Boot
  btrfs: Use U-Boot API for decompression
  image: Avoid switch default in image_decomp()
  image: Update zstd to avoid reporting error twice
  gzip: Avoid use of u64
  image: Update image_decomp() to avoid ifdefs
  image: Split board code out into its own file
  image: Fix up checkpatch warnings in image-board.c
  image: Split host code out into its own file
  image: Create a function to do manual relocation
  image: Avoid #ifdefs for manual relocation
  image: Remove ifdefs around image_setup_linux() el at
  image: Add Kconfig options for FIT in the host build
  kconfig: Add host support to CONFIG_IS_ENABLED()
  image: Shorten FIT_ENABLE_SHAxxx_SUPPORT
  image: Rename SPL_SHAxxx_SUPPORT to SPL_FIT_SHAxxx
  hash: Use Kconfig to enable hashing in host tools
  hash: Drop some #ifdefs in hash.c
  image: Drop IMAGE_ENABLE_FIT
  image: Drop IMAGE_ENABLE_OF_LIBFDT
  image: Use Kconfig to enable CONFIG_FIT_VERBOSE on host
  image: Rename CONFIG_FIT_ENABLE_RSASSA_PSS_SUPPORT
  image: Use Kconfig to enable FIT_RSASSA_PSS on host
  Kconfig: Rename SPL_CRC32_SUPPORT to SPL_CRC32
  image: Drop IMAGE_ENABLE_CRC32
  Kconfig: Rename SPL_MD5_SUPPORT to SPL_MD5
  image: Drop IMAGE_ENABLE_MD5
  image: Drop IMAGE_ENABLE_SHA1
  image: Drop IMAGE_ENABLE_SHAxxx
  image: Drop IMAGE_BOOT_GET_CMDLINE
  image: Drop IMAGE_OF_BOARD_SETUP
  image: Drop IMAGE_OF_SYSTEM_SETUP
  image: Drop IMAGE_ENABLE_IGNORE
  image: Drop IMAGE_ENABLE_SIGN/VERIFY defines
  image: Drop IMAGE_ENABLE_BEST_MATCH
  image: Drop IMAGE_ENABLE_EN/DECRYPT defines
  image: Tidy up fit_unsupported_reset()
  image: Drop unnecessary #ifdefs from image.h
  image: Drop #ifdefs for fit_print_contents()
  image: Drop most #ifdefs in image-board.c
  image: Reduce variable scope in boot_get_ramdisk()
  image: Split up boot_get_ramdisk()
  image: Remove #ifdefs from select_ramdisk()
  image: Remove some #ifdefs from image-fit and image-fit-sig
  image: Reduce variable scope in boot_get_fdt()
  image: Split up boot_get_fdt()
  image: Remove #ifdefs from select_fdt()

 arch/arc/lib/bootm.c                      |    2 +-
 arch/arm/lib/bootm.c                      |    4 +-
 arch/arm/mach-imx/hab.c                   |    2 +-
 arch/microblaze/lib/bootm.c               |    2 +-
 arch/nds32/lib/bootm.c                    |    4 +-
 arch/riscv/lib/bootm.c                    |    4 +-
 board/synopsys/hsdk/hsdk.c                |    2 +-
 common/Kconfig.boot                       |   18 +-
 common/Makefile                           |    2 +-
 common/bootm.c                            |   30 +-
 common/bootm_os.c                         |    8 +
 common/hash.c                             |   96 +-
 common/image-board.c                      |  957 +++++++++++++++++
 common/image-cipher.c                     |    6 +-
 common/image-fdt.c                        |  276 ++---
 common/image-fit-sig.c                    |    7 +-
 common/image-fit.c                        |   42 +-
 common/image-host.c                       |   27 +
 common/image-sig.c                        |   57 +-
 common/image.c                            | 1179 ++-------------------
 common/spl/Kconfig                        |   90 +-
 configs/axm_defconfig                     |    2 +-
 configs/bcm963158_ram_defconfig           |    2 +-
 configs/chromebit_mickey_defconfig        |    2 +-
 configs/chromebook_jerry_defconfig        |    2 +-
 configs/chromebook_minnie_defconfig       |    2 +-
 configs/chromebook_speedy_defconfig       |    2 +-
 configs/evb-px30_defconfig                |    2 +-
 configs/firefly-px30_defconfig            |    2 +-
 configs/imxrt1020-evk_defconfig           |    2 +-
 configs/imxrt1050-evk_defconfig           |    2 +-
 configs/mt8516_pumpkin_defconfig          |    2 +-
 configs/odroid-go2_defconfig              |    2 +-
 configs/px30-core-ctouch2-px30_defconfig  |    2 +-
 configs/px30-core-edimm2.2-px30_defconfig |    2 +-
 configs/sandbox_defconfig                 |    3 +-
 configs/socfpga_agilex_atf_defconfig      |    2 +-
 configs/socfpga_agilex_vab_defconfig      |    2 +-
 configs/socfpga_stratix10_atf_defconfig   |    2 +-
 configs/taurus_defconfig                  |    2 +-
 fs/btrfs/compression.c                    |   51 +-
 include/abuf.h                            |  159 +++
 include/compiler.h                        |    8 +
 include/fdt_support.h                     |    2 +-
 include/gzip.h                            |    8 +-
 include/image.h                           |  178 +---
 include/linux/kconfig.h                   |   13 +-
 include/linux/string.h                    |   13 +
 include/linux/zstd.h                      |   11 +
 include/relocate.h                        |   30 +-
 include/u-boot/aes.h                      |    8 +-
 include/u-boot/ecdsa.h                    |    2 +-
 include/u-boot/hash-checksum.h            |    5 +-
 include/u-boot/rsa.h                      |   12 +-
 lib/Kconfig                               |    5 +
 lib/Makefile                              |    5 +-
 lib/abuf.c                                |  109 ++
 lib/gunzip.c                              |   28 +-
 lib/hash-checksum.c                       |    2 +-
 lib/lmb.c                                 |    2 +-
 lib/rsa/rsa-sign.c                        |    4 +-
 lib/rsa/rsa-verify.c                      |    4 +-
 lib/string.c                              |   13 +
 lib/zstd/Makefile                         |    2 +-
 lib/zstd/zstd.c                           |   64 ++
 test/lib/Makefile                         |    1 +
 test/lib/abuf.c                           |  344 ++++++
 test/lib/string.c                         |   32 +
 tools/Kconfig                             |  111 ++
 tools/Makefile                            |   19 +-
 tools/image-host.c                        |    6 +-
 71 files changed, 2455 insertions(+), 1650 deletions(-)
 create mode 100644 common/image-board.c
 create mode 100644 common/image-host.c
 create mode 100644 include/abuf.h
 create mode 100644 lib/abuf.c
 create mode 100644 lib/zstd/zstd.c
 create mode 100644 test/lib/abuf.c

-- 
2.31.1.607.g51e8a6a459-goog

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

* [PATCH v2 01/50] lib: Add memdup()
  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 ` Simon Glass
  2021-05-06 17:07   ` Pratyush Yadav
  2021-05-06 14:23 ` [PATCH v2 02/50] Add support for an owned buffer Simon Glass
                   ` (48 subsequent siblings)
  49 siblings, 1 reply; 91+ messages in thread
From: Simon Glass @ 2021-05-06 14:23 UTC (permalink / raw)
  To: u-boot

Add a function to duplicate a memory region, a little like strdup().

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

Changes in v2:
- Add a patch to introduce a memdup() function

 include/linux/string.h | 13 +++++++++++++
 lib/string.c           | 13 +++++++++++++
 test/lib/string.c      | 32 ++++++++++++++++++++++++++++++++
 3 files changed, 58 insertions(+)

diff --git a/include/linux/string.h b/include/linux/string.h
index dd255f21633..3169c93796e 100644
--- a/include/linux/string.h
+++ b/include/linux/string.h
@@ -129,6 +129,19 @@ extern void * memchr(const void *,int,__kernel_size_t);
 void *memchr_inv(const void *, int, size_t);
 #endif
 
+/**
+ * memdup() - allocate a buffer and copy in the contents
+ *
+ * Note that this returns a valid pointer even if @len is 0
+ *
+ * @src: data to copy in
+ * @len: number of bytes to copy
+ * @return allocated buffer with the copied contents, or NULL if not enough
+ *	memory is available
+ *
+ */
+char *memdup(const void *src, size_t len);
+
 unsigned long ustrtoul(const char *cp, char **endp, unsigned int base);
 unsigned long long ustrtoull(const char *cp, char **endp, unsigned int base);
 
diff --git a/lib/string.c b/lib/string.c
index a0cff8fe88e..1be61ee0499 100644
--- a/lib/string.c
+++ b/lib/string.c
@@ -658,6 +658,19 @@ void * memscan(void * addr, int c, size_t size)
 }
 #endif
 
+char *memdup(const void *src, size_t len)
+{
+	char *p;
+
+	p = malloc(len);
+	if (!p)
+		return NULL;
+
+	memcpy(p, src, len);
+
+	return p;
+}
+
 #ifndef __HAVE_ARCH_STRSTR
 /**
  * strstr - Find the first substring in a %NUL terminated string
diff --git a/test/lib/string.c b/test/lib/string.c
index 64234bef36c..5dcf4d6db00 100644
--- a/test/lib/string.c
+++ b/test/lib/string.c
@@ -23,6 +23,8 @@
 /* Allow for copying up to 32 bytes */
 #define BUFLEN (SWEEP + 33)
 
+#define TEST_STR	"hello"
+
 /**
  * init_buffer() - initialize buffer
  *
@@ -193,3 +195,33 @@ static int lib_memmove(struct unit_test_state *uts)
 }
 
 LIB_TEST(lib_memmove, 0);
+
+/** lib_memdup() - unit test for memdup() */
+static int lib_memdup(struct unit_test_state *uts)
+{
+	char buf[BUFLEN];
+	size_t len;
+	char *p, *q;
+
+	/* Zero size should do nothing */
+	p = memdup(NULL, 0);
+	ut_assertnonnull(p);
+	free(p);
+
+	p = memdup(buf, 0);
+	ut_assertnonnull(p);
+	free(p);
+
+	strcpy(buf, TEST_STR);
+	len = sizeof(TEST_STR);
+	p = memdup(buf, len);
+	ut_asserteq_mem(p, buf, len);
+
+	q = memdup(p, len);
+	ut_asserteq_mem(q, buf, len);
+	free(q);
+	free(p);
+
+	return 0;
+}
+LIB_TEST(lib_memdup, 0);
-- 
2.31.1.607.g51e8a6a459-goog

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

* [PATCH v2 02/50] Add support for an owned buffer
  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 14:23 ` Simon Glass
  2021-05-06 14:23 ` [PATCH v2 03/50] compiler: Add a comment to host_build() Simon Glass
                   ` (47 subsequent siblings)
  49 siblings, 0 replies; 91+ messages in thread
From: Simon Glass @ 2021-05-06 14:23 UTC (permalink / raw)
  To: u-boot

When passing a data buffer back from a function, it is not always clear
who owns the buffer, i.e. who is responsible for freeing the memory used.
An example of this is where multiple files are decompressed from the
firmware image, using a temporary buffer for reading (since the
compressed data has to live somewhere) and producing a temporary or
permanent buffer with the resuilts.

Where the firmware image can be memory-mapped, as on x86, the compressed
data does not need to be buffered, but the complexity of having a buffer
which is either allocated or not, makes the code hard to understand.

Introduce a new 'abuf' which supports simple buffer operations:

- encapsulating a buffer and its size
- either allocated with malloc() or not
- able to be reliably freed if necessary
- able to be converted to an allocated buffer if needed

This simple API makes it easier to deal with allocated and memory-mapped
buffers.

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

Changes in v2:
- Add new abuf_init_set() function
- Update abuf_realloc() to return after every case
- Use const for abuf_data() and abuf_size()
- Make use of memdup()
- Add abuf_init_move()
- Add comments about the assumptions made by lib_test_abuf_realloc()
- Add better comments about why some tests are skipped at present

 include/abuf.h    | 159 +++++++++++++++++++++
 lib/Makefile      |   1 +
 lib/abuf.c        | 109 +++++++++++++++
 test/lib/Makefile |   1 +
 test/lib/abuf.c   | 344 ++++++++++++++++++++++++++++++++++++++++++++++
 5 files changed, 614 insertions(+)
 create mode 100644 include/abuf.h
 create mode 100644 lib/abuf.c
 create mode 100644 test/lib/abuf.c

diff --git a/include/abuf.h b/include/abuf.h
new file mode 100644
index 00000000000..d230f72806d
--- /dev/null
+++ b/include/abuf.h
@@ -0,0 +1,159 @@
+/* SPDX-License-Identifier: GPL-2.0+ */
+/*
+ * Handles a buffer that can be allocated and freed
+ *
+ * Copyright 2021 Google LLC
+ * Written by Simon Glass <sjg@chromium.org>
+ */
+
+#ifndef __ABUF_H
+#define __ABUF_H
+
+#include <linux/types.h>
+
+/**
+ * struct abuf - buffer that can be allocated and freed
+ *
+ * This is useful for a block of data which may be allocated with malloc(), or
+ * not, so that it needs to be freed correctly when finished with.
+ *
+ * For now it has a very simple purpose.
+ *
+ * Using memset() to zero all fields is guaranteed to be equivalent to
+ * abuf_init().
+ *
+ * @data: Pointer to data
+ * @size: Size of data in bytes
+ * @alloced: true if allocated with malloc(), so must be freed after use
+ */
+struct abuf {
+	void *data;
+	size_t size;
+	bool alloced;
+};
+
+static inline void *abuf_data(const struct abuf *abuf)
+{
+	return abuf->data;
+}
+
+static inline size_t abuf_size(const struct abuf *abuf)
+{
+	return abuf->size;
+}
+
+/**
+ * abuf_set() - set the (unallocated) data in a buffer
+ *
+ * This simply makes the abuf point to the supplied data, which must be live
+ * for the lifetime of the abuf. It is not alloced.
+ *
+ * Any existing data in the abuf is freed and the alloced member is set to
+ * false.
+ *
+ * @abuf: abuf to adjust
+ * @data: New contents of abuf
+ * @size: New size of abuf
+ */
+void abuf_set(struct abuf *abuf, void *data, size_t size);
+
+/**
+ * abuf_map_sysmem() - calls map_sysmem() to set up an abuf
+ *
+ * This is equivalent to abuf_set(abuf, map_sysmem(addr, size), size)
+ *
+ * Any existing data in the abuf is freed and the alloced member is set to
+ * false.
+ *
+ * @abuf: abuf to adjust
+ * @addr: Address to set the abuf to
+ * @size: New size of abuf
+ */
+void abuf_map_sysmem(struct abuf *abuf, ulong addr, size_t size);
+
+/**
+ * abuf_realloc() - Change the size of a buffer
+ *
+ * This uses realloc() to change the size of the buffer, with the same semantics
+ * as that function. If the abuf is not currently alloced, then it will alloc
+ * it if the size needs to increase (i.e. set the alloced member to true)
+ *
+ * @abuf: abuf to adjust
+ * @new_size: new size in bytes.
+ *	if 0, the abuf is freed
+ *	if greater than the current size, the abuf is extended and the new
+ *	   space is not inited. The alloced member is set to true
+ *	if less than the current size, the abuf is contracted and the data at
+ *	   the end is lost. If @new_size is 0, this sets the alloced member to
+ *	   false
+ * @return true if OK, false if out of memory
+ */
+bool abuf_realloc(struct abuf *abuf, size_t new_size);
+
+/**
+ * abuf_uninit_move() - Return the allocated contents and uninit the abuf
+ *
+ * This returns the abuf data to the caller, allocating it if necessary, so that
+ * the caller receives data that it can be sure will hang around. The caller is
+ * responsible for freeing the data.
+ *
+ * If the abuf has allocated data, it is returned. If the abuf has data but it
+ * is not allocated, then it is first allocated, then returned.
+ *
+ * If the abuf size is 0, this returns NULL
+ *
+ * The abuf is uninited as part of this, except if the allocation fails, in
+ * which NULL is returned and the abuf remains untouched.
+ *
+ * The abuf must be inited before this can be called.
+ *
+ * @abuf: abuf to uninit
+ * @sizep: if non-NULL, returns the size of the returned data
+ * @return data contents, allocated with malloc(), or NULL if the data could not
+ *	be allocated, or the data size is 0
+ */
+void *abuf_uninit_move(struct abuf *abuf, size_t *sizep);
+
+/**
+ * abuf_init_move() - Make abuf take over the management of an allocated region
+ *
+ * After this, @data must not be used. All access must be via the abuf.
+ *
+ * @abuf: abuf to init
+ * @data: Existing allocated buffer to place in the abuf
+ * @size: Size of allocated buffer
+ */
+void abuf_init_move(struct abuf *abuf, void *data, size_t size);
+
+/**
+ * abuf_init_set() - Set up a new abuf
+ *
+ * Inits a new abuf and sets up its (unallocated) data
+ *
+ * @abuf: abuf to set up
+ * @data: New contents of abuf
+ * @size: New size of abuf
+ */
+void abuf_init_set(struct abuf *abuf, void *data, size_t size);
+
+/**
+ * abuf_uninit() - Free any memory used by an abuf
+ *
+ * The buffer must be inited before this can be called.
+ *
+ * @abuf: abuf to uninit
+ */
+void abuf_uninit(struct abuf *abuf);
+
+/**
+ * abuf_init() - Set up a new abuf
+ *
+ * This initially has no data and alloced is set to false. This is equivalent to
+ * setting all fields to 0, e.g. with memset(), so callers can do that instead
+ * if desired.
+ *
+ * @abuf: abuf to set up
+ */
+void abuf_init(struct abuf *abuf);
+
+#endif
diff --git a/lib/Makefile b/lib/Makefile
index 68256719555..39acbac123b 100644
--- a/lib/Makefile
+++ b/lib/Makefile
@@ -132,6 +132,7 @@ obj-$(CONFIG_OID_REGISTRY) += oid_registry.o
 obj-$(CONFIG_SSCANF) += sscanf.o
 endif
 
+obj-y += abuf.o
 obj-y += date.o
 obj-$(CONFIG_LIB_ELF) += elf.o
 
diff --git a/lib/abuf.c b/lib/abuf.c
new file mode 100644
index 00000000000..4b17e0b8c0d
--- /dev/null
+++ b/lib/abuf.c
@@ -0,0 +1,109 @@
+// SPDX-License-Identifier: GPL-2.0+
+/*
+ * Handles a buffer that can be allocated and freed
+ *
+ * Copyright 2021 Google LLC
+ * Written by Simon Glass <sjg@chromium.org>
+ */
+
+#include <common.h>
+#include <abuf.h>
+#include <malloc.h>
+#include <mapmem.h>
+#include <string.h>
+
+void abuf_set(struct abuf *abuf, void *data, size_t size)
+{
+	abuf_uninit(abuf);
+	abuf->data = data;
+	abuf->size = size;
+}
+
+void abuf_map_sysmem(struct abuf *abuf, ulong addr, size_t size)
+{
+	abuf_set(abuf, map_sysmem(addr, size), size);
+}
+
+bool abuf_realloc(struct abuf *abuf, size_t new_size)
+{
+	void *ptr;
+
+	if (!new_size) {
+		/* easy case, just need to uninit, freeing any allocation */
+		abuf_uninit(abuf);
+		return true;
+	} else if (abuf->alloced) {
+		/* currently allocated, so need to reallocate */
+		ptr = realloc(abuf->data, new_size);
+		if (!ptr)
+			return false;
+		abuf->data = ptr;
+		abuf->size = new_size;
+		return true;
+	} else if (new_size <= abuf->size) {
+		/*
+		 * not currently alloced and new size is no larger. Just update
+		 * it. Data is lost off the end if new_size < abuf->size
+		 */
+		abuf->size = new_size;
+		return true;
+	} else {
+		/* not currently allocated and new size is larger. Alloc and
+		 * copy in data. The new space is not inited.
+		 */
+		ptr = memdup(abuf->data, new_size);
+		if (!ptr)
+			return false;
+		abuf->data = ptr;
+		abuf->size = new_size;
+		abuf->alloced = true;
+		return true;
+	}
+}
+
+void *abuf_uninit_move(struct abuf *abuf, size_t *sizep)
+{
+	void *ptr;
+
+	if (sizep)
+		*sizep = abuf->size;
+	if (!abuf->size)
+		return NULL;
+	if (abuf->alloced) {
+		ptr = abuf->data;
+	} else {
+		ptr = memdup(abuf->data, abuf->size);
+		if (!ptr)
+			return NULL;
+	}
+	/* Clear everything out so there is no record of the data */
+	abuf_init(abuf);
+
+	return ptr;
+}
+
+void abuf_init_set(struct abuf *abuf, void *data, size_t size)
+{
+	abuf_init(abuf);
+	abuf_set(abuf, data, size);
+}
+
+void abuf_init_move(struct abuf *abuf, void *data, size_t size)
+{
+	abuf_init_set(abuf, data, size);
+	abuf->alloced = true;
+}
+
+void abuf_uninit(struct abuf *abuf)
+{
+	if (abuf->alloced)
+		free(abuf->data);
+	abuf_init(abuf);
+}
+
+void abuf_init(struct abuf *abuf)
+{
+	abuf->data = NULL;
+	abuf->size = 0;
+	abuf->alloced = false;
+}
diff --git a/test/lib/Makefile b/test/lib/Makefile
index aa2e66bc7f4..02e7cda532d 100644
--- a/test/lib/Makefile
+++ b/test/lib/Makefile
@@ -3,6 +3,7 @@
 # (C) Copyright 2018
 # Mario Six, Guntermann & Drunck GmbH, mario.six at gdsys.cc
 obj-y += cmd_ut_lib.o
+obj-y += abuf.o
 obj-$(CONFIG_EFI_LOADER) += efi_device_path.o
 obj-$(CONFIG_EFI_SECURE_BOOT) += efi_image_region.o
 obj-y += hexdump.o
diff --git a/test/lib/abuf.c b/test/lib/abuf.c
new file mode 100644
index 00000000000..086c9b22821
--- /dev/null
+++ b/test/lib/abuf.c
@@ -0,0 +1,344 @@
+// SPDX-License-Identifier: GPL-2.0+
+/*
+ * Copyright 2021 Google LLC
+ * Written by Simon Glass <sjg@chromium.org>
+ */
+
+#include <common.h>
+#include <abuf.h>
+#include <mapmem.h>
+#include <test/lib.h>
+#include <test/test.h>
+#include <test/ut.h>
+
+static char test_data[] = "1234";
+#define TEST_DATA_LEN	sizeof(test_data)
+
+/* Test abuf_set() */
+static int lib_test_abuf_set(struct unit_test_state *uts)
+{
+	struct abuf buf;
+	ulong start;
+
+	start = ut_check_free();
+
+	abuf_init(&buf);
+	abuf_set(&buf, test_data, TEST_DATA_LEN);
+	ut_asserteq_ptr(test_data, buf.data);
+	ut_asserteq(TEST_DATA_LEN, buf.size);
+	ut_asserteq(false, buf.alloced);
+
+	/* Force it to allocate */
+	ut_asserteq(true, abuf_realloc(&buf, TEST_DATA_LEN + 1));
+	ut_assertnonnull(buf.data);
+	ut_asserteq(TEST_DATA_LEN + 1, buf.size);
+	ut_asserteq(true, buf.alloced);
+
+	/* Now set it again, to force it to free */
+	abuf_set(&buf, test_data, TEST_DATA_LEN);
+	ut_asserteq_ptr(test_data, buf.data);
+	ut_asserteq(TEST_DATA_LEN, buf.size);
+	ut_asserteq(false, buf.alloced);
+
+	/* Check for memory leaks */
+	ut_assertok(ut_check_delta(start));
+
+	return 0;
+}
+LIB_TEST(lib_test_abuf_set, 0);
+
+/* Test abuf_map_sysmem() */
+static int lib_test_abuf_map_sysmem(struct unit_test_state *uts)
+{
+	struct abuf buf;
+	ulong addr;
+
+	abuf_init(&buf);
+	addr = 0x100;
+	abuf_map_sysmem(&buf, addr, TEST_DATA_LEN);
+
+	ut_asserteq_ptr(map_sysmem(0x100, 0), buf.data);
+	ut_asserteq(TEST_DATA_LEN, buf.size);
+	ut_asserteq(false, buf.alloced);
+
+	return 0;
+}
+LIB_TEST(lib_test_abuf_map_sysmem, 0);
+
+/* Test abuf_realloc() */
+static int lib_test_abuf_realloc(struct unit_test_state *uts)
+{
+	struct abuf buf;
+	ulong start;
+	void *ptr;
+
+	/*
+	 * TODO: crashes on sandbox sometimes due to an apparent bug in
+	 * realloc().
+	 */
+	return 0;
+
+	start = ut_check_free();
+
+	abuf_init(&buf);
+
+	/* Allocate an empty buffer */
+	ut_asserteq(true, abuf_realloc(&buf, 0));
+	ut_assertnull(buf.data);
+	ut_asserteq(0, buf.size);
+	ut_asserteq(false, buf.alloced);
+
+	/* Allocate a non-empty abuf */
+	ut_asserteq(true, abuf_realloc(&buf, TEST_DATA_LEN));
+	ut_assertnonnull(buf.data);
+	ut_asserteq(TEST_DATA_LEN, buf.size);
+	ut_asserteq(true, buf.alloced);
+	ptr = buf.data;
+
+	/*
+	 * Make it smaller; the pointer should remain the same. Note this relies
+	 * on knowledge of how U-Boot's realloc() works
+	 */
+	ut_asserteq(true, abuf_realloc(&buf, TEST_DATA_LEN - 1));
+	ut_asserteq(TEST_DATA_LEN - 1, buf.size);
+	ut_asserteq(true, buf.alloced);
+	ut_asserteq_ptr(ptr, buf.data);
+
+	/*
+	 * Make it larger, forcing reallocation. Note this relies on knowledge
+	 * of how U-Boot's realloc() works
+	 */
+	ut_asserteq(true, abuf_realloc(&buf, 0x1000));
+	ut_assert(buf.data != ptr);
+	ut_asserteq(0x1000, buf.size);
+	ut_asserteq(true, buf.alloced);
+
+	/* Free it */
+	ut_asserteq(true, abuf_realloc(&buf, 0));
+	ut_assertnull(buf.data);
+	ut_asserteq(0, buf.size);
+	ut_asserteq(false, buf.alloced);
+
+	/* Check for memory leaks */
+	ut_assertok(ut_check_delta(start));
+
+	return 0;
+}
+LIB_TEST(lib_test_abuf_realloc, 0);
+
+/* Test handling of buffers that are too large */
+static int lib_test_abuf_large(struct unit_test_state *uts)
+{
+	struct abuf buf;
+	ulong start;
+	size_t size;
+	int delta;
+	void *ptr;
+
+	/*
+	 * This crashes at present due to trying to allocate more memory than
+	 * available, which breaks something on sandbox.
+	 */
+	return 0;
+
+	start = ut_check_free();
+
+	/* Try an impossible size */
+	abuf_init(&buf);
+	ut_asserteq(false, abuf_realloc(&buf, CONFIG_SYS_MALLOC_LEN));
+	ut_assertnull(buf.data);
+	ut_asserteq(0, buf.size);
+	ut_asserteq(false, buf.alloced);
+
+	abuf_uninit(&buf);
+	ut_assertnull(buf.data);
+	ut_asserteq(0, buf.size);
+	ut_asserteq(false, buf.alloced);
+
+	/* Start with a normal size then try to increase it, to check realloc */
+	ut_asserteq(true, abuf_realloc(&buf, TEST_DATA_LEN));
+	ut_assertnonnull(buf.data);
+	ut_asserteq(TEST_DATA_LEN, buf.size);
+	ut_asserteq(true, buf.alloced);
+	ptr = buf.data;
+	delta = ut_check_delta(start);
+	ut_assert(delta > 0);
+
+	/* try to increase it */
+	ut_asserteq(false, abuf_realloc(&buf, CONFIG_SYS_MALLOC_LEN));
+	ut_asserteq_ptr(ptr, buf.data);
+	ut_asserteq(TEST_DATA_LEN, buf.size);
+	ut_asserteq(true, buf.alloced);
+	ut_asserteq(delta, ut_check_delta(start));
+
+	/* Check for memory leaks */
+	abuf_uninit(&buf);
+	ut_assertok(ut_check_delta(start));
+
+	/* Start with a huge unallocated buf and try to move it */
+	abuf_init(&buf);
+	abuf_map_sysmem(&buf, 0, CONFIG_SYS_MALLOC_LEN);
+	ut_asserteq(CONFIG_SYS_MALLOC_LEN, buf.size);
+	ut_asserteq(false, buf.alloced);
+	ut_assertnull(abuf_uninit_move(&buf, &size));
+
+	/* Check for memory leaks */
+	abuf_uninit(&buf);
+	ut_assertok(ut_check_delta(start));
+
+	return 0;
+}
+LIB_TEST(lib_test_abuf_large, 0);
+
+/* Test abuf_uninit_move() */
+static int lib_test_abuf_uninit_move(struct unit_test_state *uts)
+{
+	void *ptr, *orig_ptr;
+	struct abuf buf;
+	size_t size;
+	ulong start;
+	int delta;
+
+	start = ut_check_free();
+
+	/*
+	 * TODO: crashes on sandbox sometimes due to an apparent bug in
+	 * realloc().
+	 */
+	return 0;
+
+	/* Move an empty buffer */
+	abuf_init(&buf);
+	ut_assertnull(abuf_uninit_move(&buf, &size));
+	ut_asserteq(0, size);
+	ut_assertnull(abuf_uninit_move(&buf, NULL));
+
+	/* Move an unallocated buffer */
+	abuf_set(&buf, test_data, TEST_DATA_LEN);
+	ut_assertok(ut_check_delta(start));
+	ptr = abuf_uninit_move(&buf, &size);
+	ut_asserteq(TEST_DATA_LEN, size);
+	ut_asserteq_str(ptr, test_data);
+	ut_assertnonnull(ptr);
+	ut_assertnull(buf.data);
+	ut_asserteq(0, buf.size);
+	ut_asserteq(false, buf.alloced);
+
+	/* Check that freeing it frees the only allocation */
+	delta = ut_check_delta(start);
+	ut_assert(delta > 0);
+	free(ptr);
+	ut_assertok(ut_check_delta(start));
+
+	/* Move an allocated buffer */
+	ut_asserteq(true, abuf_realloc(&buf, TEST_DATA_LEN));
+	orig_ptr = buf.data;
+	strcpy(orig_ptr, test_data);
+
+	delta = ut_check_delta(start);
+	ut_assert(delta > 0);
+	ptr = abuf_uninit_move(&buf, &size);
+	ut_asserteq(TEST_DATA_LEN, size);
+	ut_assertnonnull(ptr);
+	ut_asserteq_ptr(ptr, orig_ptr);
+	ut_asserteq_str(ptr, test_data);
+	ut_assertnull(buf.data);
+	ut_asserteq(0, buf.size);
+	ut_asserteq(false, buf.alloced);
+
+	/* Check there was no new allocation */
+	ut_asserteq(delta, ut_check_delta(start));
+
+	/* Check that freeing it frees the only allocation */
+	free(ptr);
+	ut_assertok(ut_check_delta(start));
+
+	/* Move an unallocated buffer, without the size */
+	abuf_set(&buf, test_data, TEST_DATA_LEN);
+	ut_assertok(ut_check_delta(start));
+	ptr = abuf_uninit_move(&buf, NULL);
+	ut_asserteq_str(ptr, test_data);
+
+	return 0;
+}
+LIB_TEST(lib_test_abuf_uninit_move, 0);
+
+/* Test abuf_uninit() */
+static int lib_test_abuf_uninit(struct unit_test_state *uts)
+{
+	struct abuf buf;
+
+	/* Nothing in the buffer */
+	abuf_init(&buf);
+	abuf_uninit(&buf);
+	ut_assertnull(buf.data);
+	ut_asserteq(0, buf.size);
+	ut_asserteq(false, buf.alloced);
+
+	/* Not allocated */
+	abuf_set(&buf, test_data, TEST_DATA_LEN);
+	abuf_uninit(&buf);
+	ut_assertnull(buf.data);
+	ut_asserteq(0, buf.size);
+	ut_asserteq(false, buf.alloced);
+
+	return 0;
+}
+LIB_TEST(lib_test_abuf_uninit, 0);
+
+/* Test abuf_init_set() */
+static int lib_test_abuf_init_set(struct unit_test_state *uts)
+{
+	struct abuf buf;
+
+	abuf_init_set(&buf, test_data, TEST_DATA_LEN);
+	ut_asserteq_ptr(test_data, buf.data);
+	ut_asserteq(TEST_DATA_LEN, buf.size);
+	ut_asserteq(false, buf.alloced);
+
+	return 0;
+}
+LIB_TEST(lib_test_abuf_init_set, 0);
+
+/* Test abuf_init_move() */
+static int lib_test_abuf_init_move(struct unit_test_state *uts)
+{
+	struct abuf buf;
+	void *ptr;
+
+	/*
+	 * TODO: crashes on sandbox sometimes due to an apparent bug in
+	 * realloc().
+	 */
+	return 0;
+
+	ptr = strdup(test_data);
+	ut_assertnonnull(ptr);
+
+	free(ptr);
+
+	abuf_init_move(&buf, ptr, TEST_DATA_LEN);
+	ut_asserteq_ptr(ptr, abuf_data(&buf));
+	ut_asserteq(TEST_DATA_LEN, abuf_size(&buf));
+	ut_asserteq(true, buf.alloced);
+
+	return 0;
+}
+LIB_TEST(lib_test_abuf_init_move, 0);
+
+/* Test abuf_init() */
+static int lib_test_abuf_init(struct unit_test_state *uts)
+{
+	struct abuf buf;
+
+	buf.data = &buf;
+	buf.size = 123;
+	buf.alloced = true;
+	abuf_init(&buf);
+	ut_assertnull(buf.data);
+	ut_asserteq(0, buf.size);
+	ut_asserteq(false, buf.alloced);
+
+	return 0;
+}
+LIB_TEST(lib_test_abuf_init, 0);
-- 
2.31.1.607.g51e8a6a459-goog

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

* [PATCH v2 03/50] compiler: Add a comment to host_build()
  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 14:23 ` [PATCH v2 02/50] Add support for an owned buffer Simon Glass
@ 2021-05-06 14:23 ` Simon Glass
  2021-05-06 14:23 ` [PATCH v2 04/50] zstd: Create a function for use from U-Boot Simon Glass
                   ` (46 subsequent siblings)
  49 siblings, 0 replies; 91+ messages in thread
From: Simon Glass @ 2021-05-06 14:23 UTC (permalink / raw)
  To: u-boot

This function should have a comment explaining what it does. Add one.

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

Changes in v2:
- Correct 'hose' typo

 include/compiler.h | 5 +++++
 1 file changed, 5 insertions(+)

diff --git a/include/compiler.h b/include/compiler.h
index 27b9843497a..67e52050b12 100644
--- a/include/compiler.h
+++ b/include/compiler.h
@@ -151,6 +151,11 @@ typedef unsigned long int uintptr_t;
 #define MEM_SUPPORT_64BIT_DATA	0
 #endif
 
+/**
+ * host_build() - check if we are building for the host
+ *
+ * @return true if building for the host, false if for a target
+ */
 static inline bool host_build(void) {
 #ifdef USE_HOSTCC
 	return true;
-- 
2.31.1.607.g51e8a6a459-goog

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

* [PATCH v2 04/50] zstd: Create a function for use from U-Boot
  2021-05-06 14:23 [PATCH v2 00/50] image: Reduce #ifdefs and ad-hoc defines in image code Simon Glass
                   ` (2 preceding siblings ...)
  2021-05-06 14:23 ` [PATCH v2 03/50] compiler: Add a comment to host_build() Simon Glass
@ 2021-05-06 14:23 ` Simon Glass
  2021-05-06 14:23 ` [PATCH v2 05/50] btrfs: Use U-Boot API for decompression Simon Glass
                   ` (45 subsequent siblings)
  49 siblings, 0 replies; 91+ messages in thread
From: Simon Glass @ 2021-05-06 14:23 UTC (permalink / raw)
  To: u-boot

The existing zstd API requires the same sequence of calls to perform its
task. Create a helper for U-Boot, to avoid code duplication, as is done
with other compression algorithms. Make use of of this from the image
code.

Note that the zstd code lacks a test in test/compression.c and this should
be added by the maintainer.

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

(no changes since v1)

 common/image.c       | 50 +++++++---------------------------
 include/linux/zstd.h | 11 ++++++++
 lib/zstd/Makefile    |  2 +-
 lib/zstd/zstd.c      | 64 ++++++++++++++++++++++++++++++++++++++++++++
 4 files changed, 85 insertions(+), 42 deletions(-)
 create mode 100644 lib/zstd/zstd.c

diff --git a/common/image.c b/common/image.c
index 51854aae5dd..062e08886fd 100644
--- a/common/image.c
+++ b/common/image.c
@@ -22,6 +22,7 @@
 #include <status_led.h>
 #endif
 
+#include <abuf.h>
 #include <rtc.h>
 
 #include <gzip.h>
@@ -525,50 +526,17 @@ int image_decomp(int comp, ulong load, ulong image_start, int type,
 #ifndef USE_HOSTCC
 #if CONFIG_IS_ENABLED(ZSTD)
 	case IH_COMP_ZSTD: {
-		size_t size = unc_len;
-		ZSTD_DStream *dstream;
-		ZSTD_inBuffer in_buf;
-		ZSTD_outBuffer out_buf;
-		void *workspace;
-		size_t wsize;
-
-		wsize = ZSTD_DStreamWorkspaceBound(image_len);
-		workspace = malloc(wsize);
-		if (!workspace) {
-			debug("%s: cannot allocate workspace of size %zu\n", __func__,
-			      wsize);
-			return -1;
-		}
-
-		dstream = ZSTD_initDStream(image_len, workspace, wsize);
-		if (!dstream) {
-			printf("%s: ZSTD_initDStream failed\n", __func__);
-			return ZSTD_getErrorCode(ret);
-		}
-
-		in_buf.src = image_buf;
-		in_buf.pos = 0;
-		in_buf.size = image_len;
+		struct abuf in, out;
 
-		out_buf.dst = load_buf;
-		out_buf.pos = 0;
-		out_buf.size = size;
-
-		while (1) {
-			size_t ret;
-
-			ret = ZSTD_decompressStream(dstream, &out_buf, &in_buf);
-			if (ZSTD_isError(ret)) {
-				printf("%s: ZSTD_decompressStream error %d\n", __func__,
-				       ZSTD_getErrorCode(ret));
-				return ZSTD_getErrorCode(ret);
-			}
-
-			if (in_buf.pos >= image_len || !ret)
-				break;
+		abuf_init_set(&in, image_buf, image_len);
+		abuf_init_set(&in, load_buf, unc_len);
+		ret = zstd_decompress(&in, &out);
+		if (ret < 0) {
+			printf("ZSTD decompression failed\n");
+			return ret;
 		}
 
-		image_len = out_buf.pos;
+		image_len = ret;
 
 		break;
 	}
diff --git a/include/linux/zstd.h b/include/linux/zstd.h
index 724f69350e0..35ba4c90aa4 100644
--- a/include/linux/zstd.h
+++ b/include/linux/zstd.h
@@ -1144,4 +1144,15 @@ size_t ZSTD_decompressBlock(ZSTD_DCtx *dctx, void *dst, size_t dstCapacity,
 size_t ZSTD_insertBlock(ZSTD_DCtx *dctx, const void *blockStart,
 	size_t blockSize);
 
+struct abuf;
+
+/**
+ * zstd_decompress() - Decompress Zstandard data
+ *
+ * @in: Input buffer to decompress
+ * @out: Output buffer to hold the results (must be large enough)
+ * @return size of the decompressed data, or -ve on error
+ */
+int zstd_decompress(struct abuf *in, struct abuf *out);
+
 #endif  /* ZSTD_H */
diff --git a/lib/zstd/Makefile b/lib/zstd/Makefile
index 33c1df48ec8..12170892923 100644
--- a/lib/zstd/Makefile
+++ b/lib/zstd/Makefile
@@ -1,4 +1,4 @@
 obj-y += zstd_decompress.o
 
 zstd_decompress-y := huf_decompress.o decompress.o \
-		     entropy_common.o fse_decompress.o zstd_common.o
+		     entropy_common.o fse_decompress.o zstd_common.o zstd.o
diff --git a/lib/zstd/zstd.c b/lib/zstd/zstd.c
new file mode 100644
index 00000000000..bf9cd19cfa3
--- /dev/null
+++ b/lib/zstd/zstd.c
@@ -0,0 +1,64 @@
+// SPDX-License-Identifier: GPL-2.0+
+/*
+ * Copyright 2021 Google LLC
+ */
+
+#define LOG_CATEGORY	LOGC_BOOT
+
+#include <common.h>
+#include <abuf.h>
+#include <log.h>
+#include <malloc.h>
+#include <linux/zstd.h>
+
+int zstd_decompress(struct abuf *in, struct abuf *out)
+{
+	ZSTD_DStream *dstream;
+	ZSTD_inBuffer in_buf;
+	ZSTD_outBuffer out_buf;
+	void *workspace;
+	size_t wsize;
+	int ret;
+
+	wsize = ZSTD_DStreamWorkspaceBound(abuf_size(in));
+	workspace = malloc(wsize);
+	if (!workspace) {
+		debug("%s: cannot allocate workspace of size %zu\n", __func__,
+			wsize);
+		return -ENOMEM;
+	}
+
+	dstream = ZSTD_initDStream(abuf_size(in), workspace, wsize);
+	if (!dstream) {
+		log_err("%s: ZSTD_initDStream failed\n", __func__);
+		ret = -EPERM;
+		goto do_free;
+	}
+
+	in_buf.src = abuf_data(in);
+	in_buf.pos = 0;
+	in_buf.size = abuf_size(in);
+
+	out_buf.dst = abuf_data(out);
+	out_buf.pos = 0;
+	out_buf.size = abuf_size(out);
+
+	while (1) {
+		size_t res;
+
+		res = ZSTD_decompressStream(dstream, &out_buf, &in_buf);
+		if (ZSTD_isError(res)) {
+			ret = ZSTD_getErrorCode(res);
+			log_err("ZSTD_decompressStream error %d\n", ret);
+			goto do_free;
+		}
+
+		if (in_buf.pos >= abuf_size(in) || !res)
+			break;
+	}
+
+	ret = out_buf.pos;
+do_free:
+	free(workspace);
+	return ret;
+}
-- 
2.31.1.607.g51e8a6a459-goog

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

* [PATCH v2 05/50] btrfs: Use U-Boot API for decompression
  2021-05-06 14:23 [PATCH v2 00/50] image: Reduce #ifdefs and ad-hoc defines in image code Simon Glass
                   ` (3 preceding siblings ...)
  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 ` Simon Glass
  2021-05-06 14:23 ` [PATCH v2 06/50] image: Avoid switch default in image_decomp() Simon Glass
                   ` (44 subsequent siblings)
  49 siblings, 0 replies; 91+ messages in thread
From: Simon Glass @ 2021-05-06 14:23 UTC (permalink / raw)
  To: u-boot

Use the common function to avoid code duplication.

Acked-by: Qu Wenruo <wqu@suse.com>
Signed-off-by: Simon Glass <sjg@chromium.org>
---

(no changes since v1)

 fs/btrfs/compression.c | 51 +++++-------------------------------------
 1 file changed, 5 insertions(+), 46 deletions(-)

diff --git a/fs/btrfs/compression.c b/fs/btrfs/compression.c
index 23efefa1997..7adfbb04a7c 100644
--- a/fs/btrfs/compression.c
+++ b/fs/btrfs/compression.c
@@ -6,6 +6,7 @@
  */
 
 #include "btrfs.h"
+#include <abuf.h>
 #include <log.h>
 #include <malloc.h>
 #include <linux/lzo.h>
@@ -136,54 +137,12 @@ static u32 decompress_zlib(const u8 *_cbuf, u32 clen, u8 *dbuf, u32 dlen)
 
 static u32 decompress_zstd(const u8 *cbuf, u32 clen, u8 *dbuf, u32 dlen)
 {
-	ZSTD_DStream *dstream;
-	ZSTD_inBuffer in_buf;
-	ZSTD_outBuffer out_buf;
-	void *workspace;
-	size_t wsize;
-	u32 res = -1;
-
-	wsize = ZSTD_DStreamWorkspaceBound(ZSTD_BTRFS_MAX_INPUT);
-	workspace = malloc(wsize);
-	if (!workspace) {
-		debug("%s: cannot allocate workspace of size %zu\n", __func__,
-		      wsize);
-		return -1;
-	}
-
-	dstream = ZSTD_initDStream(ZSTD_BTRFS_MAX_INPUT, workspace, wsize);
-	if (!dstream) {
-		printf("%s: ZSTD_initDStream failed\n", __func__);
-		goto err_free;
-	}
+	struct abuf in, out;
 
-	in_buf.src = cbuf;
-	in_buf.pos = 0;
-	in_buf.size = clen;
+	abuf_init_set(&in, (u8 *)cbuf, clen);
+	abuf_init_set(&out, dbuf, dlen);
 
-	out_buf.dst = dbuf;
-	out_buf.pos = 0;
-	out_buf.size = dlen;
-
-	while (1) {
-		size_t ret;
-
-		ret = ZSTD_decompressStream(dstream, &out_buf, &in_buf);
-		if (ZSTD_isError(ret)) {
-			printf("%s: ZSTD_decompressStream error %d\n", __func__,
-			       ZSTD_getErrorCode(ret));
-			goto err_free;
-		}
-
-		if (in_buf.pos >= clen || !ret)
-			break;
-	}
-
-	res = out_buf.pos;
-
-err_free:
-	free(workspace);
-	return res;
+	return zstd_decompress(&in, &out);
 }
 
 u32 btrfs_decompress(u8 type, const char *c, u32 clen, char *d, u32 dlen)
-- 
2.31.1.607.g51e8a6a459-goog

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

* [PATCH v2 06/50] image: Avoid switch default in image_decomp()
  2021-05-06 14:23 [PATCH v2 00/50] image: Reduce #ifdefs and ad-hoc defines in image code Simon Glass
                   ` (4 preceding siblings ...)
  2021-05-06 14:23 ` [PATCH v2 05/50] btrfs: Use U-Boot API for decompression Simon Glass
@ 2021-05-06 14:23 ` Simon Glass
  2021-05-06 14:23 ` [PATCH v2 07/50] image: Update zstd to avoid reporting error twice Simon Glass
                   ` (43 subsequent siblings)
  49 siblings, 0 replies; 91+ messages in thread
From: Simon Glass @ 2021-05-06 14:23 UTC (permalink / raw)
  To: u-boot

At present this function is full of preprocessor macros. Adjust it to
check for an unsupported algorithm after the switch(). This will allow
us to drop the macros.

Fix up the return-value path and an extra blank line while we are here.

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

(no changes since v1)

 common/image.c | 14 ++++++++------
 1 file changed, 8 insertions(+), 6 deletions(-)

diff --git a/common/image.c b/common/image.c
index 062e08886fd..6c38211efce 100644
--- a/common/image.c
+++ b/common/image.c
@@ -444,7 +444,7 @@ int image_decomp(int comp, ulong load, ulong image_start, int type,
 		 void *load_buf, void *image_buf, ulong image_len,
 		 uint unc_len, ulong *load_end)
 {
-	int ret = 0;
+	int ret = -ENOSYS;
 
 	*load_end = load;
 	print_decomp_msg(comp, type, load == image_start);
@@ -456,6 +456,7 @@ int image_decomp(int comp, ulong load, ulong image_start, int type,
 	 */
 	switch (comp) {
 	case IH_COMP_NONE:
+		ret = 0;
 		if (load == image_start)
 			break;
 		if (image_len <= unc_len)
@@ -537,22 +538,23 @@ int image_decomp(int comp, ulong load, ulong image_start, int type,
 		}
 
 		image_len = ret;
-
 		break;
 	}
 #endif /* CONFIG_ZSTD */
 #endif
-	default:
+	}
+	if (ret == -ENOSYS) {
 		printf("Unimplemented compression type %d\n", comp);
-		return -ENOSYS;
+		return ret;
 	}
+	if (ret)
+		return ret;
 
 	*load_end = load + image_len;
 
-	return ret;
+	return 0;
 }
 
-
 #ifndef USE_HOSTCC
 #if CONFIG_IS_ENABLED(LEGACY_IMAGE_FORMAT)
 /**
-- 
2.31.1.607.g51e8a6a459-goog

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

* [PATCH v2 07/50] image: Update zstd to avoid reporting error twice
  2021-05-06 14:23 [PATCH v2 00/50] image: Reduce #ifdefs and ad-hoc defines in image code Simon Glass
                   ` (5 preceding siblings ...)
  2021-05-06 14:23 ` [PATCH v2 06/50] image: Avoid switch default in image_decomp() Simon Glass
@ 2021-05-06 14:23 ` Simon Glass
  2021-05-06 14:23 ` [PATCH v2 08/50] gzip: Avoid use of u64 Simon Glass
                   ` (42 subsequent siblings)
  49 siblings, 0 replies; 91+ messages in thread
From: Simon Glass @ 2021-05-06 14:23 UTC (permalink / raw)
  To: u-boot

The zstd implementation prints the error in image_decomp() which is
incorrect and does not match other algorithms. Drop this and let the
caller report the error.

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

(no changes since v1)

 common/image.c | 8 +++-----
 1 file changed, 3 insertions(+), 5 deletions(-)

diff --git a/common/image.c b/common/image.c
index 6c38211efce..bd71bf7ec29 100644
--- a/common/image.c
+++ b/common/image.c
@@ -532,12 +532,10 @@ int image_decomp(int comp, ulong load, ulong image_start, int type,
 		abuf_init_set(&in, image_buf, image_len);
 		abuf_init_set(&in, load_buf, unc_len);
 		ret = zstd_decompress(&in, &out);
-		if (ret < 0) {
-			printf("ZSTD decompression failed\n");
-			return ret;
+		if (ret >= 0) {
+			image_len = ret;
+			ret = 0;
 		}
-
-		image_len = ret;
 		break;
 	}
 #endif /* CONFIG_ZSTD */
-- 
2.31.1.607.g51e8a6a459-goog

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

* [PATCH v2 08/50] gzip: Avoid use of u64
  2021-05-06 14:23 [PATCH v2 00/50] image: Reduce #ifdefs and ad-hoc defines in image code Simon Glass
                   ` (6 preceding siblings ...)
  2021-05-06 14:23 ` [PATCH v2 07/50] image: Update zstd to avoid reporting error twice Simon Glass
@ 2021-05-06 14:23 ` Simon Glass
  2021-05-06 14:23 ` [PATCH v2 09/50] image: Update image_decomp() to avoid ifdefs Simon Glass
                   ` (41 subsequent siblings)
  49 siblings, 0 replies; 91+ messages in thread
From: Simon Glass @ 2021-05-06 14:23 UTC (permalink / raw)
  To: u-boot

The gzip API uses the u64 type in it, which is not available in the host
build. This makes it impossible to include the header file.

We could make this type available, but it seems unnecessary. Limiting the
compression size to that of the 'unsigned long' type seems good enough. On
32-bit machines the limit then becomes 4GB, which likely exceeds available
RAM anyway, therefore it should be sufficient. On 64-bit machines this is
effectively u64 anyway.

Update the header file and implementation to use 'ulong' instead of 'u64'.

Add a definition of u32 for the cases that seem to need exactly that
length. This should be safe enough.

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

(no changes since v1)

 include/compiler.h |  3 +++
 include/gzip.h     |  8 ++++----
 lib/gunzip.c       | 28 ++++++++++++++--------------
 3 files changed, 21 insertions(+), 18 deletions(-)

diff --git a/include/compiler.h b/include/compiler.h
index 67e52050b12..6b0d3bf5374 100644
--- a/include/compiler.h
+++ b/include/compiler.h
@@ -68,6 +68,9 @@ typedef uint32_t __u32;
 typedef unsigned int uint;
 typedef unsigned long ulong;
 
+/* Define these on the host so we can build some target code */
+typedef __u32 u32;
+
 #define uswap_16(x) \
 	((((x) & 0xff00) >> 8) | \
 	 (((x) & 0x00ff) << 8))
diff --git a/include/gzip.h b/include/gzip.h
index 783acbb60d2..cb4db3d70fe 100644
--- a/include/gzip.h
+++ b/include/gzip.h
@@ -54,11 +54,11 @@ int zunzip(void *dst, int dstlen, unsigned char *src, unsigned long *lenp,
  *	gzwrite_progress_finish called@end of loop to
  *		indicate success (retcode=0) or failure
  */
-void gzwrite_progress_init(u64 expected_size);
+void gzwrite_progress_init(ulong expected_size);
 
-void gzwrite_progress(int iteration, u64 bytes_written, u64 total_bytes);
+void gzwrite_progress(int iteration, ulong bytes_written, ulong total_bytes);
 
-void gzwrite_progress_finish(int retcode, u64 totalwritten, u64 totalsize,
+void gzwrite_progress_finish(int retcode, ulong totalwritten, ulong totalsize,
 			     u32 expected_crc, u32 calculated_crc);
 
 /**
@@ -74,7 +74,7 @@ void gzwrite_progress_finish(int retcode, u64 totalwritten, u64 totalsize,
  * @return 0 if OK, -1 on error
  */
 int gzwrite(unsigned char *src, int len, struct blk_desc *dev, ulong szwritebuf,
-	    u64 startoffs, u64 szexpected);
+	    ulong startoffs, ulong szexpected);
 
 /**
  * gzip()- Compress data into a buffer using the gzip algorithm
diff --git a/lib/gunzip.c b/lib/gunzip.c
index bee3b9261f3..a8e498d98d8 100644
--- a/lib/gunzip.c
+++ b/lib/gunzip.c
@@ -84,32 +84,32 @@ int gunzip(void *dst, int dstlen, unsigned char *src, unsigned long *lenp)
 
 #ifdef CONFIG_CMD_UNZIP
 __weak
-void gzwrite_progress_init(u64 expectedsize)
+void gzwrite_progress_init(ulong expectedsize)
 {
 	putc('\n');
 }
 
 __weak
 void gzwrite_progress(int iteration,
-		     u64 bytes_written,
-		     u64 total_bytes)
+		     ulong bytes_written,
+		     ulong total_bytes)
 {
 	if (0 == (iteration & 3))
-		printf("%llu/%llu\r", bytes_written, total_bytes);
+		printf("%lu/%lu\r", bytes_written, total_bytes);
 }
 
 __weak
 void gzwrite_progress_finish(int returnval,
-			     u64 bytes_written,
-			     u64 total_bytes,
+			     ulong bytes_written,
+			     ulong total_bytes,
 			     u32 expected_crc,
 			     u32 calculated_crc)
 {
 	if (0 == returnval) {
-		printf("\n\t%llu bytes, crc 0x%08x\n",
+		printf("\n\t%lu bytes, crc 0x%08x\n",
 		       total_bytes, calculated_crc);
 	} else {
-		printf("\n\tuncompressed %llu of %llu\n"
+		printf("\n\tuncompressed %lu of %lu\n"
 		       "\tcrcs == 0x%08x/0x%08x\n",
 		       bytes_written, total_bytes,
 		       expected_crc, calculated_crc);
@@ -119,15 +119,15 @@ void gzwrite_progress_finish(int returnval,
 int gzwrite(unsigned char *src, int len,
 	    struct blk_desc *dev,
 	    unsigned long szwritebuf,
-	    u64 startoffs,
-	    u64 szexpected)
+	    ulong startoffs,
+	    ulong szexpected)
 {
 	int i, flags;
 	z_stream s;
 	int r = 0;
 	unsigned char *writebuf;
 	unsigned crc = 0;
-	u64 totalfilled = 0;
+	ulong totalfilled = 0;
 	lbaint_t blksperbuf, outblock;
 	u32 expected_crc;
 	u32 payload_size;
@@ -142,7 +142,7 @@ int gzwrite(unsigned char *src, int len,
 	}
 
 	if (startoffs & (dev->blksz-1)) {
-		printf("%s: start offset %llu not a multiple of %lu\n",
+		printf("%s: start offset %lu not a multiple of %lu\n",
 		       __func__, startoffs, dev->blksz);
 		return -1;
 	}
@@ -182,12 +182,12 @@ int gzwrite(unsigned char *src, int len,
 	if (szexpected == 0) {
 		szexpected = le32_to_cpu(szuncompressed);
 	} else if (szuncompressed != (u32)szexpected) {
-		printf("size of %llx doesn't match trailer low bits %x\n",
+		printf("size of %lx doesn't match trailer low bits %x\n",
 		       szexpected, szuncompressed);
 		return -1;
 	}
 	if (lldiv(szexpected, dev->blksz) > (dev->lba - outblock)) {
-		printf("%s: uncompressed size %llu exceeds device size\n",
+		printf("%s: uncompressed size %lu exceeds device size\n",
 		       __func__, szexpected);
 		return -1;
 	}
-- 
2.31.1.607.g51e8a6a459-goog

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

* [PATCH v2 09/50] image: Update image_decomp() to avoid ifdefs
  2021-05-06 14:23 [PATCH v2 00/50] image: Reduce #ifdefs and ad-hoc defines in image code Simon Glass
                   ` (7 preceding siblings ...)
  2021-05-06 14:23 ` [PATCH v2 08/50] gzip: Avoid use of u64 Simon Glass
@ 2021-05-06 14:23 ` Simon Glass
  2021-05-06 14:23 ` [PATCH v2 10/50] image: Split board code out into its own file Simon Glass
                   ` (40 subsequent siblings)
  49 siblings, 0 replies; 91+ messages in thread
From: Simon Glass @ 2021-05-06 14:23 UTC (permalink / raw)
  To: u-boot

Adjust this function so that preprocessor macros are not needed. With
this, the host build uses more of the same header files as the target
build.

Rather than definining CONFIG_SYS_MALLOC_LEN, add a CONSERVE_MEMORY
define, since that is the purpose of the value.

This appears to have no impact on code size from a spot check of a few
boards (snow, firefly-rk3288, boston32r2el, m53menlo).

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

(no changes since v1)

 common/image.c            | 145 ++++++++++++++++++--------------------
 configs/sandbox_defconfig |   1 +
 2 files changed, 69 insertions(+), 77 deletions(-)

diff --git a/common/image.c b/common/image.c
index bd71bf7ec29..a41e8067b11 100644
--- a/common/image.c
+++ b/common/image.c
@@ -22,12 +22,9 @@
 #include <status_led.h>
 #endif
 
-#include <abuf.h>
 #include <rtc.h>
 
-#include <gzip.h>
 #include <image.h>
-#include <lz4.h>
 #include <mapmem.h>
 
 #if IMAGE_ENABLE_FIT || IMAGE_ENABLE_OF_LIBFDT
@@ -43,13 +40,6 @@
 #include <linux/errno.h>
 #include <asm/io.h>
 
-#include <bzlib.h>
-#include <linux/lzo.h>
-#include <lzma/LzmaTypes.h>
-#include <lzma/LzmaDec.h>
-#include <lzma/LzmaTools.h>
-#include <linux/zstd.h>
-
 #ifdef CONFIG_CMD_BDI
 extern int do_bdinfo(struct cmd_tbl *cmdtp, int flag, int argc,
 		     char *const argv[]);
@@ -61,7 +51,15 @@ DECLARE_GLOBAL_DATA_PTR;
 static const image_header_t *image_get_ramdisk(ulong rd_addr, uint8_t arch,
 						int verify);
 #endif
+
+/* Set this if we have less than 4 MB of malloc() space */
+#if CONFIG_SYS_MALLOC_LEN < (4096 * 1024)
+#define CONSERVE_MEMORY		true
 #else
+#define CONSERVE_MEMORY		false
+#endif
+
+#else /* USE_HOSTCC */
 #include "mkimage.h"
 #include <u-boot/md5.h>
 #include <time.h>
@@ -70,10 +68,23 @@ static const image_header_t *image_get_ramdisk(ulong rd_addr, uint8_t arch,
 #ifndef __maybe_unused
 # define __maybe_unused		/* unimplemented */
 #endif
+
+#define CONSERVE_MEMORY		false
+
 #endif /* !USE_HOSTCC*/
 
-#include <u-boot/crc.h>
+#include <abuf.h>
+#include <bzlib.h>
+#include <gzip.h>
+#include <lz4.h>
 #include <imximage.h>
+#include <linux/lzo.h>
+#include <linux/zstd.h>
+#include <linux/kconfig.h>
+#include <lzma/LzmaTypes.h>
+#include <lzma/LzmaDec.h>
+#include <lzma/LzmaTools.h>
+#include <u-boot/crc.h>
 
 #ifndef CONFIG_SYS_BARGSIZE
 #define CONFIG_SYS_BARGSIZE 512
@@ -464,83 +475,63 @@ int image_decomp(int comp, ulong load, ulong image_start, int type,
 		else
 			ret = -ENOSPC;
 		break;
-#ifndef USE_HOSTCC
-#if CONFIG_IS_ENABLED(GZIP)
-	case IH_COMP_GZIP: {
-		ret = gunzip(load_buf, unc_len, image_buf, &image_len);
+	case IH_COMP_GZIP:
+		if (!host_build() && CONFIG_IS_ENABLED(GZIP))
+			ret = gunzip(load_buf, unc_len, image_buf, &image_len);
 		break;
-	}
-#endif /* CONFIG_GZIP */
-#endif
-#ifndef USE_HOSTCC
-#if CONFIG_IS_ENABLED(BZIP2)
-	case IH_COMP_BZIP2: {
-		uint size = unc_len;
+	case IH_COMP_BZIP2:
+		if (!host_build() && CONFIG_IS_ENABLED(BZIP2)) {
+			uint size = unc_len;
 
-		/*
-		 * If we've got less than 4 MB of malloc() space,
-		 * use slower decompression algorithm which requires
-		 * at most 2300 KB of memory.
-		 */
-		ret = BZ2_bzBuffToBuffDecompress(load_buf, &size,
-			image_buf, image_len,
-			CONFIG_SYS_MALLOC_LEN < (4096 * 1024), 0);
-		image_len = size;
+			/*
+			 * If we've got less than 4 MB of malloc() space,
+			 * use slower decompression algorithm which requires
+			 *@most 2300 KB of memory.
+			 */
+			ret = BZ2_bzBuffToBuffDecompress(load_buf, &size,
+				image_buf, image_len, CONSERVE_MEMORY, 0);
+			image_len = size;
+		}
 		break;
-	}
-#endif /* CONFIG_BZIP2 */
-#endif
-#ifndef USE_HOSTCC
-#if CONFIG_IS_ENABLED(LZMA)
-	case IH_COMP_LZMA: {
-		SizeT lzma_len = unc_len;
+	case IH_COMP_LZMA:
+		if (!host_build() && CONFIG_IS_ENABLED(LZMA)) {
+			SizeT lzma_len = unc_len;
 
-		ret = lzmaBuffToBuffDecompress(load_buf, &lzma_len,
-					       image_buf, image_len);
-		image_len = lzma_len;
+			ret = lzmaBuffToBuffDecompress(load_buf, &lzma_len,
+						       image_buf, image_len);
+			image_len = lzma_len;
+		}
 		break;
-	}
-#endif /* CONFIG_LZMA */
-#endif
-#ifndef USE_HOSTCC
-#if CONFIG_IS_ENABLED(LZO)
-	case IH_COMP_LZO: {
-		size_t size = unc_len;
+	case IH_COMP_LZO:
+		if (!host_build() && CONFIG_IS_ENABLED(LZO)) {
+			size_t size = unc_len;
 
-		ret = lzop_decompress(image_buf, image_len, load_buf, &size);
-		image_len = size;
+			ret = lzop_decompress(image_buf, image_len, load_buf, &size);
+			image_len = size;
+		}
 		break;
-	}
-#endif /* CONFIG_LZO */
-#endif
-#ifndef USE_HOSTCC
-#if CONFIG_IS_ENABLED(LZ4)
-	case IH_COMP_LZ4: {
-		size_t size = unc_len;
+	case IH_COMP_LZ4:
+		if (!host_build() && CONFIG_IS_ENABLED(LZ4)) {
+			size_t size = unc_len;
 
-		ret = ulz4fn(image_buf, image_len, load_buf, &size);
-		image_len = size;
+			ret = ulz4fn(image_buf, image_len, load_buf, &size);
+			image_len = size;
+		}
 		break;
-	}
-#endif /* CONFIG_LZ4 */
-#endif
-#ifndef USE_HOSTCC
-#if CONFIG_IS_ENABLED(ZSTD)
-	case IH_COMP_ZSTD: {
-		struct abuf in, out;
-
-		abuf_init_set(&in, image_buf, image_len);
-		abuf_init_set(&in, load_buf, unc_len);
-		ret = zstd_decompress(&in, &out);
-		if (ret >= 0) {
-			image_len = ret;
-			ret = 0;
+	case IH_COMP_ZSTD:
+		if (!host_build() && CONFIG_IS_ENABLED(ZSTD)) {
+			struct abuf in, out;
+
+			abuf_init_set(&in, image_buf, image_len);
+			abuf_init_set(&in, load_buf, unc_len);
+			ret = zstd_decompress(&in, &out);
+			if (ret >= 0) {
+				image_len = ret;
+				ret = 0;
+			}
 		}
 		break;
 	}
-#endif /* CONFIG_ZSTD */
-#endif
-	}
 	if (ret == -ENOSYS) {
 		printf("Unimplemented compression type %d\n", comp);
 		return ret;
@@ -958,7 +949,7 @@ int get_table_entry_id(const table_entry_t *table,
 	const table_entry_t *t;
 
 	for (t = table; t->id >= 0; ++t) {
-#ifdef CONFIG_NEEDS_MANUAL_RELOC
+#if !defined(USE_HOSTCC) && defined(CONFIG_NEEDS_MANUAL_RELOC)
 		if (t->sname && strcasecmp(t->sname + gd->reloc_off, name) == 0)
 #else
 		if (t->sname && strcasecmp(t->sname, name) == 0)
diff --git a/configs/sandbox_defconfig b/configs/sandbox_defconfig
index 00befc8b407..33446322a46 100644
--- a/configs/sandbox_defconfig
+++ b/configs/sandbox_defconfig
@@ -46,6 +46,7 @@ CONFIG_CMD_MEMINFO=y
 CONFIG_CMD_MEM_SEARCH=y
 CONFIG_CMD_MX_CYCLIC=y
 CONFIG_CMD_MEMTEST=y
+CONFIG_CMD_UNZIP=y
 CONFIG_CMD_BIND=y
 CONFIG_CMD_DEMO=y
 CONFIG_CMD_GPIO=y
-- 
2.31.1.607.g51e8a6a459-goog

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

* [PATCH v2 10/50] image: Split board code out into its own file
  2021-05-06 14:23 [PATCH v2 00/50] image: Reduce #ifdefs and ad-hoc defines in image code Simon Glass
                   ` (8 preceding siblings ...)
  2021-05-06 14:23 ` [PATCH v2 09/50] image: Update image_decomp() to avoid ifdefs Simon Glass
@ 2021-05-06 14:23 ` Simon Glass
  2021-05-06 14:23 ` [PATCH v2 11/50] image: Fix up checkpatch warnings in image-board.c Simon Glass
                   ` (39 subsequent siblings)
  49 siblings, 0 replies; 91+ messages in thread
From: Simon Glass @ 2021-05-06 14:23 UTC (permalink / raw)
  To: u-boot

To avoid a large #ifdef in the image.c file, move the affected code into
a separate file.

Avoid any style fix-ups for easier review. Those are in the next patch.

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

(no changes since v1)

 common/Makefile      |   2 +-
 common/image-board.c | 925 +++++++++++++++++++++++++++++++++++++++++++
 common/image.c       | 925 +------------------------------------------
 3 files changed, 928 insertions(+), 924 deletions(-)
 create mode 100644 common/image-board.c

diff --git a/common/Makefile b/common/Makefile
index 829ea5fb426..b71b0496022 100644
--- a/common/Makefile
+++ b/common/Makefile
@@ -104,7 +104,7 @@ obj-y += malloc_simple.o
 endif
 endif
 
-obj-y += image.o
+obj-y += image.o image-board.o
 obj-$(CONFIG_ANDROID_AB) += android_ab.o
 obj-$(CONFIG_ANDROID_BOOT_IMAGE) += image-android.o image-android-dt.o
 obj-$(CONFIG_$(SPL_TPL_)OF_LIBFDT) += image-fdt.o
diff --git a/common/image-board.c b/common/image-board.c
new file mode 100644
index 00000000000..0c4e32e14e4
--- /dev/null
+++ b/common/image-board.c
@@ -0,0 +1,925 @@
+// SPDX-License-Identifier: GPL-2.0+
+/*
+ * Image code used by boards (and not host tools)
+ *
+ * (C) Copyright 2008 Semihalf
+ *
+ * (C) Copyright 2000-2006
+ * Wolfgang Denk, DENX Software Engineering, wd at denx.de.
+ */
+
+#include <common.h>
+#include <bootstage.h>
+#include <cpu_func.h>
+#include <env.h>
+#include <fpga.h>
+#include <image.h>
+#include <mapmem.h>
+#include <watchdog.h>
+#include <asm/cache.h>
+#include <asm/global_data.h>
+
+#ifndef CONFIG_SYS_BARGSIZE
+#define CONFIG_SYS_BARGSIZE 512
+#endif
+
+DECLARE_GLOBAL_DATA_PTR;
+
+#if CONFIG_IS_ENABLED(LEGACY_IMAGE_FORMAT)
+/**
+ * image_get_ramdisk - get and verify ramdisk image
+ * @rd_addr: ramdisk image start address
+ * @arch: expected ramdisk architecture
+ * @verify: checksum verification flag
+ *
+ * image_get_ramdisk() returns a pointer to the verified ramdisk image
+ * header. Routine receives image start address and expected architecture
+ * flag. Verification done covers data and header integrity and os/type/arch
+ * fields checking.
+ *
+ * returns:
+ *     pointer to a ramdisk image header, if image was found and valid
+ *     otherwise, return NULL
+ */
+static const image_header_t *image_get_ramdisk(ulong rd_addr, uint8_t arch,
+						int verify)
+{
+	const image_header_t *rd_hdr = (const image_header_t *)rd_addr;
+
+	if (!image_check_magic(rd_hdr)) {
+		puts("Bad Magic Number\n");
+		bootstage_error(BOOTSTAGE_ID_RD_MAGIC);
+		return NULL;
+	}
+
+	if (!image_check_hcrc(rd_hdr)) {
+		puts("Bad Header Checksum\n");
+		bootstage_error(BOOTSTAGE_ID_RD_HDR_CHECKSUM);
+		return NULL;
+	}
+
+	bootstage_mark(BOOTSTAGE_ID_RD_MAGIC);
+	image_print_contents(rd_hdr);
+
+	if (verify) {
+		puts("   Verifying Checksum ... ");
+		if (!image_check_dcrc(rd_hdr)) {
+			puts("Bad Data CRC\n");
+			bootstage_error(BOOTSTAGE_ID_RD_CHECKSUM);
+			return NULL;
+		}
+		puts("OK\n");
+	}
+
+	bootstage_mark(BOOTSTAGE_ID_RD_HDR_CHECKSUM);
+
+	if (!image_check_os(rd_hdr, IH_OS_LINUX) ||
+	    !image_check_arch(rd_hdr, arch) ||
+	    !image_check_type(rd_hdr, IH_TYPE_RAMDISK)) {
+		printf("No Linux %s Ramdisk Image\n",
+				genimg_get_arch_name(arch));
+		bootstage_error(BOOTSTAGE_ID_RAMDISK);
+		return NULL;
+	}
+
+	return rd_hdr;
+}
+#endif
+
+/*****************************************************************************/
+/* Shared dual-format routines */
+/*****************************************************************************/
+ulong image_load_addr = CONFIG_SYS_LOAD_ADDR;	/* Default Load Address */
+ulong image_save_addr;			/* Default Save Address */
+ulong image_save_size;			/* Default Save Size (in bytes) */
+
+static int on_loadaddr(const char *name, const char *value, enum env_op op,
+	int flags)
+{
+	switch (op) {
+	case env_op_create:
+	case env_op_overwrite:
+		image_load_addr = simple_strtoul(value, NULL, 16);
+		break;
+	default:
+		break;
+	}
+
+	return 0;
+}
+U_BOOT_ENV_CALLBACK(loadaddr, on_loadaddr);
+
+ulong env_get_bootm_low(void)
+{
+	char *s = env_get("bootm_low");
+	if (s) {
+		ulong tmp = simple_strtoul(s, NULL, 16);
+		return tmp;
+	}
+
+#if defined(CONFIG_SYS_SDRAM_BASE)
+	return CONFIG_SYS_SDRAM_BASE;
+#elif defined(CONFIG_ARM) || defined(CONFIG_MICROBLAZE)
+	return gd->bd->bi_dram[0].start;
+#else
+	return 0;
+#endif
+}
+
+phys_size_t env_get_bootm_size(void)
+{
+	phys_size_t tmp, size;
+	phys_addr_t start;
+	char *s = env_get("bootm_size");
+	if (s) {
+		tmp = (phys_size_t)simple_strtoull(s, NULL, 16);
+		return tmp;
+	}
+
+	start = gd->ram_base;
+	size = gd->ram_size;
+
+	if (start + size > gd->ram_top)
+		size = gd->ram_top - start;
+
+	s = env_get("bootm_low");
+	if (s)
+		tmp = (phys_size_t)simple_strtoull(s, NULL, 16);
+	else
+		tmp = start;
+
+	return size - (tmp - start);
+}
+
+phys_size_t env_get_bootm_mapsize(void)
+{
+	phys_size_t tmp;
+	char *s = env_get("bootm_mapsize");
+	if (s) {
+		tmp = (phys_size_t)simple_strtoull(s, NULL, 16);
+		return tmp;
+	}
+
+#if defined(CONFIG_SYS_BOOTMAPSZ)
+	return CONFIG_SYS_BOOTMAPSZ;
+#else
+	return env_get_bootm_size();
+#endif
+}
+
+void memmove_wd(void *to, void *from, size_t len, ulong chunksz)
+{
+	if (to == from)
+		return;
+
+#if defined(CONFIG_HW_WATCHDOG) || defined(CONFIG_WATCHDOG)
+	if (to > from) {
+		from += len;
+		to += len;
+	}
+	while (len > 0) {
+		size_t tail = (len > chunksz) ? chunksz : len;
+		WATCHDOG_RESET();
+		if (to > from) {
+			to -= tail;
+			from -= tail;
+		}
+		memmove(to, from, tail);
+		if (to < from) {
+			to += tail;
+			from += tail;
+		}
+		len -= tail;
+	}
+#else	/* !(CONFIG_HW_WATCHDOG || CONFIG_WATCHDOG) */
+	memmove(to, from, len);
+#endif	/* CONFIG_HW_WATCHDOG || CONFIG_WATCHDOG */
+}
+
+/**
+ * genimg_get_kernel_addr_fit - get the real kernel address and return 2
+ *                              FIT strings
+ * @img_addr: a string might contain real image address
+ * @fit_uname_config: double pointer to a char, will hold pointer to a
+ *                    configuration unit name
+ * @fit_uname_kernel: double pointer to a char, will hold pointer to a subimage
+ *                    name
+ *
+ * genimg_get_kernel_addr_fit get the real kernel start address from a string
+ * which is normally the first argv of bootm/bootz
+ *
+ * returns:
+ *     kernel start address
+ */
+ulong genimg_get_kernel_addr_fit(char * const img_addr,
+			     const char **fit_uname_config,
+			     const char **fit_uname_kernel)
+{
+	ulong kernel_addr;
+
+	/* find out kernel image address */
+	if (!img_addr) {
+		kernel_addr = image_load_addr;
+		debug("*  kernel: default image load address = 0x%08lx\n",
+		      image_load_addr);
+#if CONFIG_IS_ENABLED(FIT)
+	} else if (fit_parse_conf(img_addr, image_load_addr, &kernel_addr,
+				  fit_uname_config)) {
+		debug("*  kernel: config '%s' from image at 0x%08lx\n",
+		      *fit_uname_config, kernel_addr);
+	} else if (fit_parse_subimage(img_addr, image_load_addr, &kernel_addr,
+				     fit_uname_kernel)) {
+		debug("*  kernel: subimage '%s' from image@0x%08lx\n",
+		      *fit_uname_kernel, kernel_addr);
+#endif
+	} else {
+		kernel_addr = simple_strtoul(img_addr, NULL, 16);
+		debug("*  kernel: cmdline image address = 0x%08lx\n",
+		      kernel_addr);
+	}
+
+	return kernel_addr;
+}
+
+/**
+ * genimg_get_kernel_addr() is the simple version of
+ * genimg_get_kernel_addr_fit(). It ignores those return FIT strings
+ */
+ulong genimg_get_kernel_addr(char * const img_addr)
+{
+	const char *fit_uname_config = NULL;
+	const char *fit_uname_kernel = NULL;
+
+	return genimg_get_kernel_addr_fit(img_addr, &fit_uname_config,
+					  &fit_uname_kernel);
+}
+
+/**
+ * genimg_get_format - get image format type
+ * @img_addr: image start address
+ *
+ * genimg_get_format() checks whether provided address points to a valid
+ * legacy or FIT image.
+ *
+ * New uImage format and FDT blob are based on a libfdt. FDT blob
+ * may be passed directly or embedded in a FIT image. In both situations
+ * genimg_get_format() must be able to dectect libfdt header.
+ *
+ * returns:
+ *     image format type or IMAGE_FORMAT_INVALID if no image is present
+ */
+int genimg_get_format(const void *img_addr)
+{
+#if CONFIG_IS_ENABLED(LEGACY_IMAGE_FORMAT)
+	const image_header_t *hdr;
+
+	hdr = (const image_header_t *)img_addr;
+	if (image_check_magic(hdr))
+		return IMAGE_FORMAT_LEGACY;
+#endif
+#if IMAGE_ENABLE_FIT || IMAGE_ENABLE_OF_LIBFDT
+	if (fdt_check_header(img_addr) == 0)
+		return IMAGE_FORMAT_FIT;
+#endif
+#ifdef CONFIG_ANDROID_BOOT_IMAGE
+	if (android_image_check_header(img_addr) == 0)
+		return IMAGE_FORMAT_ANDROID;
+#endif
+
+	return IMAGE_FORMAT_INVALID;
+}
+
+/**
+ * fit_has_config - check if there is a valid FIT configuration
+ * @images: pointer to the bootm command headers structure
+ *
+ * fit_has_config() checks if there is a FIT configuration in use
+ * (if FTI support is present).
+ *
+ * returns:
+ *     0, no FIT support or no configuration found
+ *     1, configuration found
+ */
+int genimg_has_config(bootm_headers_t *images)
+{
+#if IMAGE_ENABLE_FIT
+	if (images->fit_uname_cfg)
+		return 1;
+#endif
+	return 0;
+}
+
+/**
+ * boot_get_ramdisk - main ramdisk handling routine
+ * @argc: command argument count
+ * @argv: command argument list
+ * @images: pointer to the bootm images structure
+ * @arch: expected ramdisk architecture
+ * @rd_start: pointer to a ulong variable, will hold ramdisk start address
+ * @rd_end: pointer to a ulong variable, will hold ramdisk end
+ *
+ * boot_get_ramdisk() is responsible for finding a valid ramdisk image.
+ * Curently supported are the following ramdisk sources:
+ *      - multicomponent kernel/ramdisk image,
+ *      - commandline provided address of decicated ramdisk image.
+ *
+ * returns:
+ *     0, if ramdisk image was found and valid, or skiped
+ *     rd_start and rd_end are set to ramdisk start/end addresses if
+ *     ramdisk image is found and valid
+ *
+ *     1, if ramdisk image is found but corrupted, or invalid
+ *     rd_start and rd_end are set to 0 if no ramdisk exists
+ */
+int boot_get_ramdisk(int argc, char *const argv[], bootm_headers_t *images,
+		     uint8_t arch, ulong *rd_start, ulong *rd_end)
+{
+	ulong rd_addr, rd_load;
+	ulong rd_data, rd_len;
+#if CONFIG_IS_ENABLED(LEGACY_IMAGE_FORMAT)
+	const image_header_t *rd_hdr;
+#endif
+	void *buf;
+#ifdef CONFIG_SUPPORT_RAW_INITRD
+	char *end;
+#endif
+#if IMAGE_ENABLE_FIT
+	const char	*fit_uname_config = images->fit_uname_cfg;
+	const char	*fit_uname_ramdisk = NULL;
+	ulong		default_addr;
+	int		rd_noffset;
+#endif
+	const char *select = NULL;
+
+	*rd_start = 0;
+	*rd_end = 0;
+
+#ifdef CONFIG_ANDROID_BOOT_IMAGE
+	/*
+	 * Look for an Android boot image.
+	 */
+	buf = map_sysmem(images->os.start, 0);
+	if (buf && genimg_get_format(buf) == IMAGE_FORMAT_ANDROID)
+		select = (argc == 0) ? env_get("loadaddr") : argv[0];
+#endif
+
+	if (argc >= 2)
+		select = argv[1];
+
+	/*
+	 * Look for a '-' which indicates to ignore the
+	 * ramdisk argument
+	 */
+	if (select && strcmp(select, "-") ==  0) {
+		debug("## Skipping init Ramdisk\n");
+		rd_len = rd_data = 0;
+	} else if (select || genimg_has_config(images)) {
+#if IMAGE_ENABLE_FIT
+		if (select) {
+			/*
+			 * If the init ramdisk comes from the FIT image and
+			 * the FIT image address is omitted in the command
+			 * line argument, try to use os FIT image address or
+			 * default load address.
+			 */
+			if (images->fit_uname_os)
+				default_addr = (ulong)images->fit_hdr_os;
+			else
+				default_addr = image_load_addr;
+
+			if (fit_parse_conf(select, default_addr,
+					   &rd_addr, &fit_uname_config)) {
+				debug("*  ramdisk: config '%s' from image at "
+						"0x%08lx\n",
+						fit_uname_config, rd_addr);
+			} else if (fit_parse_subimage(select, default_addr,
+						&rd_addr, &fit_uname_ramdisk)) {
+				debug("*  ramdisk: subimage '%s' from image at "
+						"0x%08lx\n",
+						fit_uname_ramdisk, rd_addr);
+			} else
+#endif
+			{
+				rd_addr = simple_strtoul(select, NULL, 16);
+				debug("*  ramdisk: cmdline image address = "
+						"0x%08lx\n",
+						rd_addr);
+			}
+#if IMAGE_ENABLE_FIT
+		} else {
+			/* use FIT configuration provided in first bootm
+			 * command argument. If the property is not defined,
+			 * quit silently.
+			 */
+			rd_addr = map_to_sysmem(images->fit_hdr_os);
+			rd_noffset = fit_get_node_from_config(images,
+					FIT_RAMDISK_PROP, rd_addr);
+			if (rd_noffset == -ENOENT)
+				return 0;
+			else if (rd_noffset < 0)
+				return 1;
+		}
+#endif
+
+		/*
+		 * Check if there is an initrd image at the
+		 * address provided in the second bootm argument
+		 * check image type, for FIT images get FIT node.
+		 */
+		buf = map_sysmem(rd_addr, 0);
+		switch (genimg_get_format(buf)) {
+#if CONFIG_IS_ENABLED(LEGACY_IMAGE_FORMAT)
+		case IMAGE_FORMAT_LEGACY:
+			printf("## Loading init Ramdisk from Legacy "
+					"Image@%08lx ...\n", rd_addr);
+
+			bootstage_mark(BOOTSTAGE_ID_CHECK_RAMDISK);
+			rd_hdr = image_get_ramdisk(rd_addr, arch,
+							images->verify);
+
+			if (rd_hdr == NULL)
+				return 1;
+
+			rd_data = image_get_data(rd_hdr);
+			rd_len = image_get_data_size(rd_hdr);
+			rd_load = image_get_load(rd_hdr);
+			break;
+#endif
+#if IMAGE_ENABLE_FIT
+		case IMAGE_FORMAT_FIT:
+			rd_noffset = fit_image_load(images,
+					rd_addr, &fit_uname_ramdisk,
+					&fit_uname_config, arch,
+					IH_TYPE_RAMDISK,
+					BOOTSTAGE_ID_FIT_RD_START,
+					FIT_LOAD_OPTIONAL_NON_ZERO,
+					&rd_data, &rd_len);
+			if (rd_noffset < 0)
+				return 1;
+
+			images->fit_hdr_rd = map_sysmem(rd_addr, 0);
+			images->fit_uname_rd = fit_uname_ramdisk;
+			images->fit_noffset_rd = rd_noffset;
+			break;
+#endif
+#ifdef CONFIG_ANDROID_BOOT_IMAGE
+		case IMAGE_FORMAT_ANDROID:
+			android_image_get_ramdisk((void *)images->os.start,
+				&rd_data, &rd_len);
+			break;
+#endif
+		default:
+#ifdef CONFIG_SUPPORT_RAW_INITRD
+			end = NULL;
+			if (select)
+				end = strchr(select, ':');
+			if (end) {
+				rd_len = simple_strtoul(++end, NULL, 16);
+				rd_data = rd_addr;
+			} else
+#endif
+			{
+				puts("Wrong Ramdisk Image Format\n");
+				rd_data = rd_len = rd_load = 0;
+				return 1;
+			}
+		}
+	} else if (images->legacy_hdr_valid &&
+			image_check_type(&images->legacy_hdr_os_copy,
+						IH_TYPE_MULTI)) {
+
+		/*
+		 * Now check if we have a legacy mult-component image,
+		 * get second entry data start address and len.
+		 */
+		bootstage_mark(BOOTSTAGE_ID_RAMDISK);
+		printf("## Loading init Ramdisk from multi component "
+				"Legacy Image at %08lx ...\n",
+				(ulong)images->legacy_hdr_os);
+
+		image_multi_getimg(images->legacy_hdr_os, 1, &rd_data, &rd_len);
+	} else {
+		/*
+		 * no initrd image
+		 */
+		bootstage_mark(BOOTSTAGE_ID_NO_RAMDISK);
+		rd_len = rd_data = 0;
+	}
+
+	if (!rd_data) {
+		debug("## No init Ramdisk\n");
+	} else {
+		*rd_start = rd_data;
+		*rd_end = rd_data + rd_len;
+	}
+	debug("   ramdisk start = 0x%08lx, ramdisk end = 0x%08lx\n",
+			*rd_start, *rd_end);
+
+	return 0;
+}
+
+#ifdef CONFIG_SYS_BOOT_RAMDISK_HIGH
+/**
+ * boot_ramdisk_high - relocate init ramdisk
+ * @lmb: pointer to lmb handle, will be used for memory mgmt
+ * @rd_data: ramdisk data start address
+ * @rd_len: ramdisk data length
+ * @initrd_start: pointer to a ulong variable, will hold final init ramdisk
+ *      start address (after possible relocation)
+ * @initrd_end: pointer to a ulong variable, will hold final init ramdisk
+ *      end address (after possible relocation)
+ *
+ * boot_ramdisk_high() takes a relocation hint from "initrd_high" environment
+ * variable and if requested ramdisk data is moved to a specified location.
+ *
+ * Initrd_start and initrd_end are set to final (after relocation) ramdisk
+ * start/end addresses if ramdisk image start and len were provided,
+ * otherwise set initrd_start and initrd_end set to zeros.
+ *
+ * returns:
+ *      0 - success
+ *     -1 - failure
+ */
+int boot_ramdisk_high(struct lmb *lmb, ulong rd_data, ulong rd_len,
+		  ulong *initrd_start, ulong *initrd_end)
+{
+	char	*s;
+	ulong	initrd_high;
+	int	initrd_copy_to_ram = 1;
+
+	s = env_get("initrd_high");
+	if (s) {
+		/* a value of "no" or a similar string will act like 0,
+		 * turning the "load high" feature off. This is intentional.
+		 */
+		initrd_high = simple_strtoul(s, NULL, 16);
+		if (initrd_high == ~0)
+			initrd_copy_to_ram = 0;
+	} else {
+		initrd_high = env_get_bootm_mapsize() + env_get_bootm_low();
+	}
+
+
+	debug("## initrd_high = 0x%08lx, copy_to_ram = %d\n",
+			initrd_high, initrd_copy_to_ram);
+
+	if (rd_data) {
+		if (!initrd_copy_to_ram) {	/* zero-copy ramdisk support */
+			debug("   in-place initrd\n");
+			*initrd_start = rd_data;
+			*initrd_end = rd_data + rd_len;
+			lmb_reserve(lmb, rd_data, rd_len);
+		} else {
+			if (initrd_high)
+				*initrd_start = (ulong)lmb_alloc_base(lmb,
+						rd_len, 0x1000, initrd_high);
+			else
+				*initrd_start = (ulong)lmb_alloc(lmb, rd_len,
+								 0x1000);
+
+			if (*initrd_start == 0) {
+				puts("ramdisk - allocation error\n");
+				goto error;
+			}
+			bootstage_mark(BOOTSTAGE_ID_COPY_RAMDISK);
+
+			*initrd_end = *initrd_start + rd_len;
+			printf("   Loading Ramdisk to %08lx, end %08lx ... ",
+					*initrd_start, *initrd_end);
+
+			memmove_wd((void *)*initrd_start,
+					(void *)rd_data, rd_len, CHUNKSZ);
+
+#ifdef CONFIG_MP
+			/*
+			 * Ensure the image is flushed to memory to handle
+			 * AMP boot scenarios in which we might not be
+			 * HW cache coherent
+			 */
+			flush_cache((unsigned long)*initrd_start,
+				    ALIGN(rd_len, ARCH_DMA_MINALIGN));
+#endif
+			puts("OK\n");
+		}
+	} else {
+		*initrd_start = 0;
+		*initrd_end = 0;
+	}
+	debug("   ramdisk load start = 0x%08lx, ramdisk load end = 0x%08lx\n",
+			*initrd_start, *initrd_end);
+
+	return 0;
+
+error:
+	return -1;
+}
+#endif /* CONFIG_SYS_BOOT_RAMDISK_HIGH */
+
+int boot_get_setup(bootm_headers_t *images, uint8_t arch,
+		   ulong *setup_start, ulong *setup_len)
+{
+#if IMAGE_ENABLE_FIT
+	return boot_get_setup_fit(images, arch, setup_start, setup_len);
+#else
+	return -ENOENT;
+#endif
+}
+
+#if IMAGE_ENABLE_FIT
+#if defined(CONFIG_FPGA)
+int boot_get_fpga(int argc, char *const argv[], bootm_headers_t *images,
+		  uint8_t arch, const ulong *ld_start, ulong * const ld_len)
+{
+	ulong tmp_img_addr, img_data, img_len;
+	void *buf;
+	int conf_noffset;
+	int fit_img_result;
+	const char *uname, *name;
+	int err;
+	int devnum = 0; /* TODO support multi fpga platforms */
+
+	/* Check to see if the images struct has a FIT configuration */
+	if (!genimg_has_config(images)) {
+		debug("## FIT configuration was not specified\n");
+		return 0;
+	}
+
+	/*
+	 * Obtain the os FIT header from the images struct
+	 */
+	tmp_img_addr = map_to_sysmem(images->fit_hdr_os);
+	buf = map_sysmem(tmp_img_addr, 0);
+	/*
+	 * Check image type. For FIT images get FIT node
+	 * and attempt to locate a generic binary.
+	 */
+	switch (genimg_get_format(buf)) {
+	case IMAGE_FORMAT_FIT:
+		conf_noffset = fit_conf_get_node(buf, images->fit_uname_cfg);
+
+		uname = fdt_stringlist_get(buf, conf_noffset, FIT_FPGA_PROP, 0,
+					   NULL);
+		if (!uname) {
+			debug("## FPGA image is not specified\n");
+			return 0;
+		}
+		fit_img_result = fit_image_load(images,
+						tmp_img_addr,
+						(const char **)&uname,
+						&(images->fit_uname_cfg),
+						arch,
+						IH_TYPE_FPGA,
+						BOOTSTAGE_ID_FPGA_INIT,
+						FIT_LOAD_OPTIONAL_NON_ZERO,
+						&img_data, &img_len);
+
+		debug("FPGA image (%s) loaded to 0x%lx/size 0x%lx\n",
+		      uname, img_data, img_len);
+
+		if (fit_img_result < 0) {
+			/* Something went wrong! */
+			return fit_img_result;
+		}
+
+		if (!fpga_is_partial_data(devnum, img_len)) {
+			name = "full";
+			err = fpga_loadbitstream(devnum, (char *)img_data,
+						 img_len, BIT_FULL);
+			if (err)
+				err = fpga_load(devnum, (const void *)img_data,
+						img_len, BIT_FULL);
+		} else {
+			name = "partial";
+			err = fpga_loadbitstream(devnum, (char *)img_data,
+						 img_len, BIT_PARTIAL);
+			if (err)
+				err = fpga_load(devnum, (const void *)img_data,
+						img_len, BIT_PARTIAL);
+		}
+
+		if (err)
+			return err;
+
+		printf("   Programming %s bitstream... OK\n", name);
+		break;
+	default:
+		printf("The given image format is not supported (corrupt?)\n");
+		return 1;
+	}
+
+	return 0;
+}
+#endif
+
+static void fit_loadable_process(uint8_t img_type,
+				 ulong img_data,
+				 ulong img_len)
+{
+	int i;
+	const unsigned int count =
+			ll_entry_count(struct fit_loadable_tbl, fit_loadable);
+	struct fit_loadable_tbl *fit_loadable_handler =
+			ll_entry_start(struct fit_loadable_tbl, fit_loadable);
+	/* For each loadable handler */
+	for (i = 0; i < count; i++, fit_loadable_handler++)
+		/* matching this type */
+		if (fit_loadable_handler->type == img_type)
+			/* call that handler with this image data */
+			fit_loadable_handler->handler(img_data, img_len);
+}
+
+int boot_get_loadable(int argc, char *const argv[], bootm_headers_t *images,
+		      uint8_t arch, const ulong *ld_start, ulong * const ld_len)
+{
+	/*
+	 * These variables are used to hold the current image location
+	 * in system memory.
+	 */
+	ulong tmp_img_addr;
+	/*
+	 * These two variables are requirements for fit_image_load, but
+	 * their values are not used
+	 */
+	ulong img_data, img_len;
+	void *buf;
+	int loadables_index;
+	int conf_noffset;
+	int fit_img_result;
+	const char *uname;
+	uint8_t img_type;
+
+	/* Check to see if the images struct has a FIT configuration */
+	if (!genimg_has_config(images)) {
+		debug("## FIT configuration was not specified\n");
+		return 0;
+	}
+
+	/*
+	 * Obtain the os FIT header from the images struct
+	 */
+	tmp_img_addr = map_to_sysmem(images->fit_hdr_os);
+	buf = map_sysmem(tmp_img_addr, 0);
+	/*
+	 * Check image type. For FIT images get FIT node
+	 * and attempt to locate a generic binary.
+	 */
+	switch (genimg_get_format(buf)) {
+	case IMAGE_FORMAT_FIT:
+		conf_noffset = fit_conf_get_node(buf, images->fit_uname_cfg);
+
+		for (loadables_index = 0;
+		     uname = fdt_stringlist_get(buf, conf_noffset,
+					FIT_LOADABLE_PROP, loadables_index,
+					NULL), uname;
+		     loadables_index++)
+		{
+			fit_img_result = fit_image_load(images,
+				tmp_img_addr,
+				&uname,
+				&(images->fit_uname_cfg), arch,
+				IH_TYPE_LOADABLE,
+				BOOTSTAGE_ID_FIT_LOADABLE_START,
+				FIT_LOAD_OPTIONAL_NON_ZERO,
+				&img_data, &img_len);
+			if (fit_img_result < 0) {
+				/* Something went wrong! */
+				return fit_img_result;
+			}
+
+			fit_img_result = fit_image_get_node(buf, uname);
+			if (fit_img_result < 0) {
+				/* Something went wrong! */
+				return fit_img_result;
+			}
+			fit_img_result = fit_image_get_type(buf,
+							    fit_img_result,
+							    &img_type);
+			if (fit_img_result < 0) {
+				/* Something went wrong! */
+				return fit_img_result;
+			}
+
+			fit_loadable_process(img_type, img_data, img_len);
+		}
+		break;
+	default:
+		printf("The given image format is not supported (corrupt?)\n");
+		return 1;
+	}
+
+	return 0;
+}
+#endif
+
+#ifdef CONFIG_SYS_BOOT_GET_CMDLINE
+/**
+ * boot_get_cmdline - allocate and initialize kernel cmdline
+ * @lmb: pointer to lmb handle, will be used for memory mgmt
+ * @cmd_start: pointer to a ulong variable, will hold cmdline start
+ * @cmd_end: pointer to a ulong variable, will hold cmdline end
+ *
+ * boot_get_cmdline() allocates space for kernel command line below
+ * BOOTMAPSZ + env_get_bootm_low() address. If "bootargs" U-Boot environment
+ * variable is present its contents is copied to allocated kernel
+ * command line.
+ *
+ * returns:
+ *      0 - success
+ *     -1 - failure
+ */
+int boot_get_cmdline(struct lmb *lmb, ulong *cmd_start, ulong *cmd_end)
+{
+	char *cmdline;
+	char *s;
+
+	cmdline = (char *)(ulong)lmb_alloc_base(lmb, CONFIG_SYS_BARGSIZE, 0xf,
+				env_get_bootm_mapsize() + env_get_bootm_low());
+
+	if (cmdline == NULL)
+		return -1;
+
+	s = env_get("bootargs");
+	if (!s)
+		s = "";
+
+	strcpy(cmdline, s);
+
+	*cmd_start = (ulong) & cmdline[0];
+	*cmd_end = *cmd_start + strlen(cmdline);
+
+	debug("## cmdline@0x%08lx ... 0x%08lx\n", *cmd_start, *cmd_end);
+
+	return 0;
+}
+#endif /* CONFIG_SYS_BOOT_GET_CMDLINE */
+
+#ifdef CONFIG_SYS_BOOT_GET_KBD
+/**
+ * boot_get_kbd - allocate and initialize kernel copy of board info
+ * @lmb: pointer to lmb handle, will be used for memory mgmt
+ * @kbd: double pointer to board info data
+ *
+ * boot_get_kbd() allocates space for kernel copy of board info data below
+ * BOOTMAPSZ + env_get_bootm_low() address and kernel board info is initialized
+ * with the current u-boot board info data.
+ *
+ * returns:
+ *      0 - success
+ *     -1 - failure
+ */
+int boot_get_kbd(struct lmb *lmb, struct bd_info **kbd)
+{
+	*kbd = (struct bd_info *)(ulong)lmb_alloc_base(lmb,
+						       sizeof(struct bd_info),
+						       0xf,
+						       env_get_bootm_mapsize() + env_get_bootm_low());
+	if (*kbd == NULL)
+		return -1;
+
+	**kbd = *(gd->bd);
+
+	debug("## kernel board info at 0x%08lx\n", (ulong)*kbd);
+
+#if defined(DEBUG) && defined(CONFIG_CMD_BDI)
+	do_bdinfo(NULL, 0, 0, NULL);
+#endif
+
+	return 0;
+}
+#endif /* CONFIG_SYS_BOOT_GET_KBD */
+
+#ifdef CONFIG_LMB
+int image_setup_linux(bootm_headers_t *images)
+{
+	ulong of_size = images->ft_len;
+	char **of_flat_tree = &images->ft_addr;
+	struct lmb *lmb = &images->lmb;
+	int ret;
+
+	if (IMAGE_ENABLE_OF_LIBFDT)
+		boot_fdt_add_mem_rsv_regions(lmb, *of_flat_tree);
+
+	if (IMAGE_BOOT_GET_CMDLINE) {
+		ret = boot_get_cmdline(lmb, &images->cmdline_start,
+				&images->cmdline_end);
+		if (ret) {
+			puts("ERROR with allocation of cmdline\n");
+			return ret;
+		}
+	}
+
+	if (IMAGE_ENABLE_OF_LIBFDT) {
+		ret = boot_relocate_fdt(lmb, of_flat_tree, &of_size);
+		if (ret)
+			return ret;
+	}
+
+	if (IMAGE_ENABLE_OF_LIBFDT && of_size) {
+		ret = image_setup_libfdt(images, *of_flat_tree, of_size, lmb);
+		if (ret)
+			return ret;
+	}
+
+	return 0;
+}
+#endif /* CONFIG_LMB */
diff --git a/common/image.c b/common/image.c
index a41e8067b11..e9658e3ab1b 100644
--- a/common/image.c
+++ b/common/image.c
@@ -8,15 +8,11 @@
 
 #ifndef USE_HOSTCC
 #include <common.h>
-#include <bootstage.h>
-#include <cpu_func.h>
 #include <env.h>
 #include <lmb.h>
 #include <log.h>
 #include <malloc.h>
-#include <asm/cache.h>
 #include <u-boot/crc.h>
-#include <watchdog.h>
 
 #ifdef CONFIG_SHOW_BOOT_PROGRESS
 #include <status_led.h>
@@ -24,14 +20,9 @@
 
 #include <rtc.h>
 
-#include <image.h>
-#include <mapmem.h>
-
 #if IMAGE_ENABLE_FIT || IMAGE_ENABLE_OF_LIBFDT
 #include <linux/libfdt.h>
 #include <fdt_support.h>
-#include <fpga.h>
-#include <xilinx.h>
 #endif
 
 #include <asm/global_data.h>
@@ -47,11 +38,6 @@ extern int do_bdinfo(struct cmd_tbl *cmdtp, int flag, int argc,
 
 DECLARE_GLOBAL_DATA_PTR;
 
-#if CONFIG_IS_ENABLED(LEGACY_IMAGE_FORMAT)
-static const image_header_t *image_get_ramdisk(ulong rd_addr, uint8_t arch,
-						int verify);
-#endif
-
 /* Set this if we have less than 4 MB of malloc() space */
 #if CONFIG_SYS_MALLOC_LEN < (4096 * 1024)
 #define CONSERVE_MEMORY		true
@@ -63,7 +49,6 @@ static const image_header_t *image_get_ramdisk(ulong rd_addr, uint8_t arch,
 #include "mkimage.h"
 #include <u-boot/md5.h>
 #include <time.h>
-#include <image.h>
 
 #ifndef __maybe_unused
 # define __maybe_unused		/* unimplemented */
@@ -76,6 +61,7 @@ static const image_header_t *image_get_ramdisk(ulong rd_addr, uint8_t arch,
 #include <abuf.h>
 #include <bzlib.h>
 #include <gzip.h>
+#include <image.h>
 #include <lz4.h>
 #include <imximage.h>
 #include <linux/lzo.h>
@@ -86,10 +72,6 @@ static const image_header_t *image_get_ramdisk(ulong rd_addr, uint8_t arch,
 #include <lzma/LzmaTools.h>
 #include <u-boot/crc.h>
 
-#ifndef CONFIG_SYS_BARGSIZE
-#define CONFIG_SYS_BARGSIZE 512
-#endif
-
 static const table_entry_t uimage_arch[] = {
 	{	IH_ARCH_INVALID,	"invalid",	"Invalid ARCH",	},
 	{	IH_ARCH_ALPHA,		"alpha",	"Alpha",	},
@@ -544,180 +526,7 @@ int image_decomp(int comp, ulong load, ulong image_start, int type,
 	return 0;
 }
 
-#ifndef USE_HOSTCC
-#if CONFIG_IS_ENABLED(LEGACY_IMAGE_FORMAT)
-/**
- * image_get_ramdisk - get and verify ramdisk image
- * @rd_addr: ramdisk image start address
- * @arch: expected ramdisk architecture
- * @verify: checksum verification flag
- *
- * image_get_ramdisk() returns a pointer to the verified ramdisk image
- * header. Routine receives image start address and expected architecture
- * flag. Verification done covers data and header integrity and os/type/arch
- * fields checking.
- *
- * returns:
- *     pointer to a ramdisk image header, if image was found and valid
- *     otherwise, return NULL
- */
-static const image_header_t *image_get_ramdisk(ulong rd_addr, uint8_t arch,
-						int verify)
-{
-	const image_header_t *rd_hdr = (const image_header_t *)rd_addr;
-
-	if (!image_check_magic(rd_hdr)) {
-		puts("Bad Magic Number\n");
-		bootstage_error(BOOTSTAGE_ID_RD_MAGIC);
-		return NULL;
-	}
-
-	if (!image_check_hcrc(rd_hdr)) {
-		puts("Bad Header Checksum\n");
-		bootstage_error(BOOTSTAGE_ID_RD_HDR_CHECKSUM);
-		return NULL;
-	}
-
-	bootstage_mark(BOOTSTAGE_ID_RD_MAGIC);
-	image_print_contents(rd_hdr);
-
-	if (verify) {
-		puts("   Verifying Checksum ... ");
-		if (!image_check_dcrc(rd_hdr)) {
-			puts("Bad Data CRC\n");
-			bootstage_error(BOOTSTAGE_ID_RD_CHECKSUM);
-			return NULL;
-		}
-		puts("OK\n");
-	}
-
-	bootstage_mark(BOOTSTAGE_ID_RD_HDR_CHECKSUM);
-
-	if (!image_check_os(rd_hdr, IH_OS_LINUX) ||
-	    !image_check_arch(rd_hdr, arch) ||
-	    !image_check_type(rd_hdr, IH_TYPE_RAMDISK)) {
-		printf("No Linux %s Ramdisk Image\n",
-				genimg_get_arch_name(arch));
-		bootstage_error(BOOTSTAGE_ID_RAMDISK);
-		return NULL;
-	}
-
-	return rd_hdr;
-}
-#endif
-#endif /* !USE_HOSTCC */
-
-/*****************************************************************************/
-/* Shared dual-format routines */
-/*****************************************************************************/
-#ifndef USE_HOSTCC
-ulong image_load_addr = CONFIG_SYS_LOAD_ADDR;	/* Default Load Address */
-ulong image_save_addr;			/* Default Save Address */
-ulong image_save_size;			/* Default Save Size (in bytes) */
-
-static int on_loadaddr(const char *name, const char *value, enum env_op op,
-	int flags)
-{
-	switch (op) {
-	case env_op_create:
-	case env_op_overwrite:
-		image_load_addr = simple_strtoul(value, NULL, 16);
-		break;
-	default:
-		break;
-	}
-
-	return 0;
-}
-U_BOOT_ENV_CALLBACK(loadaddr, on_loadaddr);
-
-ulong env_get_bootm_low(void)
-{
-	char *s = env_get("bootm_low");
-	if (s) {
-		ulong tmp = simple_strtoul(s, NULL, 16);
-		return tmp;
-	}
-
-#if defined(CONFIG_SYS_SDRAM_BASE)
-	return CONFIG_SYS_SDRAM_BASE;
-#elif defined(CONFIG_ARM) || defined(CONFIG_MICROBLAZE)
-	return gd->bd->bi_dram[0].start;
-#else
-	return 0;
-#endif
-}
-
-phys_size_t env_get_bootm_size(void)
-{
-	phys_size_t tmp, size;
-	phys_addr_t start;
-	char *s = env_get("bootm_size");
-	if (s) {
-		tmp = (phys_size_t)simple_strtoull(s, NULL, 16);
-		return tmp;
-	}
-
-	start = gd->ram_base;
-	size = gd->ram_size;
-
-	if (start + size > gd->ram_top)
-		size = gd->ram_top - start;
-
-	s = env_get("bootm_low");
-	if (s)
-		tmp = (phys_size_t)simple_strtoull(s, NULL, 16);
-	else
-		tmp = start;
-
-	return size - (tmp - start);
-}
-
-phys_size_t env_get_bootm_mapsize(void)
-{
-	phys_size_t tmp;
-	char *s = env_get("bootm_mapsize");
-	if (s) {
-		tmp = (phys_size_t)simple_strtoull(s, NULL, 16);
-		return tmp;
-	}
-
-#if defined(CONFIG_SYS_BOOTMAPSZ)
-	return CONFIG_SYS_BOOTMAPSZ;
-#else
-	return env_get_bootm_size();
-#endif
-}
-
-void memmove_wd(void *to, void *from, size_t len, ulong chunksz)
-{
-	if (to == from)
-		return;
-
-#if defined(CONFIG_HW_WATCHDOG) || defined(CONFIG_WATCHDOG)
-	if (to > from) {
-		from += len;
-		to += len;
-	}
-	while (len > 0) {
-		size_t tail = (len > chunksz) ? chunksz : len;
-		WATCHDOG_RESET();
-		if (to > from) {
-			to -= tail;
-			from -= tail;
-		}
-		memmove(to, from, tail);
-		if (to < from) {
-			to += tail;
-			from += tail;
-		}
-		len -= tail;
-	}
-#else	/* !(CONFIG_HW_WATCHDOG || CONFIG_WATCHDOG) */
-	memmove(to, from, len);
-#endif	/* CONFIG_HW_WATCHDOG || CONFIG_WATCHDOG */
-}
-#else	/* USE_HOSTCC */
+#ifdef USE_HOSTCC
 void memmove_wd(void *to, void *from, size_t len, ulong chunksz)
 {
 	memmove(to, from, len);
@@ -980,733 +789,3 @@ int genimg_get_comp_id(const char *name)
 {
 	return (get_table_entry_id(uimage_comp, "Compression", name));
 }
-
-#ifndef USE_HOSTCC
-/**
- * genimg_get_kernel_addr_fit - get the real kernel address and return 2
- *                              FIT strings
- * @img_addr: a string might contain real image address
- * @fit_uname_config: double pointer to a char, will hold pointer to a
- *                    configuration unit name
- * @fit_uname_kernel: double pointer to a char, will hold pointer to a subimage
- *                    name
- *
- * genimg_get_kernel_addr_fit get the real kernel start address from a string
- * which is normally the first argv of bootm/bootz
- *
- * returns:
- *     kernel start address
- */
-ulong genimg_get_kernel_addr_fit(char * const img_addr,
-			     const char **fit_uname_config,
-			     const char **fit_uname_kernel)
-{
-	ulong kernel_addr;
-
-	/* find out kernel image address */
-	if (!img_addr) {
-		kernel_addr = image_load_addr;
-		debug("*  kernel: default image load address = 0x%08lx\n",
-		      image_load_addr);
-#if CONFIG_IS_ENABLED(FIT)
-	} else if (fit_parse_conf(img_addr, image_load_addr, &kernel_addr,
-				  fit_uname_config)) {
-		debug("*  kernel: config '%s' from image at 0x%08lx\n",
-		      *fit_uname_config, kernel_addr);
-	} else if (fit_parse_subimage(img_addr, image_load_addr, &kernel_addr,
-				     fit_uname_kernel)) {
-		debug("*  kernel: subimage '%s' from image@0x%08lx\n",
-		      *fit_uname_kernel, kernel_addr);
-#endif
-	} else {
-		kernel_addr = simple_strtoul(img_addr, NULL, 16);
-		debug("*  kernel: cmdline image address = 0x%08lx\n",
-		      kernel_addr);
-	}
-
-	return kernel_addr;
-}
-
-/**
- * genimg_get_kernel_addr() is the simple version of
- * genimg_get_kernel_addr_fit(). It ignores those return FIT strings
- */
-ulong genimg_get_kernel_addr(char * const img_addr)
-{
-	const char *fit_uname_config = NULL;
-	const char *fit_uname_kernel = NULL;
-
-	return genimg_get_kernel_addr_fit(img_addr, &fit_uname_config,
-					  &fit_uname_kernel);
-}
-
-/**
- * genimg_get_format - get image format type
- * @img_addr: image start address
- *
- * genimg_get_format() checks whether provided address points to a valid
- * legacy or FIT image.
- *
- * New uImage format and FDT blob are based on a libfdt. FDT blob
- * may be passed directly or embedded in a FIT image. In both situations
- * genimg_get_format() must be able to dectect libfdt header.
- *
- * returns:
- *     image format type or IMAGE_FORMAT_INVALID if no image is present
- */
-int genimg_get_format(const void *img_addr)
-{
-#if CONFIG_IS_ENABLED(LEGACY_IMAGE_FORMAT)
-	const image_header_t *hdr;
-
-	hdr = (const image_header_t *)img_addr;
-	if (image_check_magic(hdr))
-		return IMAGE_FORMAT_LEGACY;
-#endif
-#if IMAGE_ENABLE_FIT || IMAGE_ENABLE_OF_LIBFDT
-	if (fdt_check_header(img_addr) == 0)
-		return IMAGE_FORMAT_FIT;
-#endif
-#ifdef CONFIG_ANDROID_BOOT_IMAGE
-	if (android_image_check_header(img_addr) == 0)
-		return IMAGE_FORMAT_ANDROID;
-#endif
-
-	return IMAGE_FORMAT_INVALID;
-}
-
-/**
- * fit_has_config - check if there is a valid FIT configuration
- * @images: pointer to the bootm command headers structure
- *
- * fit_has_config() checks if there is a FIT configuration in use
- * (if FTI support is present).
- *
- * returns:
- *     0, no FIT support or no configuration found
- *     1, configuration found
- */
-int genimg_has_config(bootm_headers_t *images)
-{
-#if IMAGE_ENABLE_FIT
-	if (images->fit_uname_cfg)
-		return 1;
-#endif
-	return 0;
-}
-
-/**
- * boot_get_ramdisk - main ramdisk handling routine
- * @argc: command argument count
- * @argv: command argument list
- * @images: pointer to the bootm images structure
- * @arch: expected ramdisk architecture
- * @rd_start: pointer to a ulong variable, will hold ramdisk start address
- * @rd_end: pointer to a ulong variable, will hold ramdisk end
- *
- * boot_get_ramdisk() is responsible for finding a valid ramdisk image.
- * Curently supported are the following ramdisk sources:
- *      - multicomponent kernel/ramdisk image,
- *      - commandline provided address of decicated ramdisk image.
- *
- * returns:
- *     0, if ramdisk image was found and valid, or skiped
- *     rd_start and rd_end are set to ramdisk start/end addresses if
- *     ramdisk image is found and valid
- *
- *     1, if ramdisk image is found but corrupted, or invalid
- *     rd_start and rd_end are set to 0 if no ramdisk exists
- */
-int boot_get_ramdisk(int argc, char *const argv[], bootm_headers_t *images,
-		     uint8_t arch, ulong *rd_start, ulong *rd_end)
-{
-	ulong rd_addr, rd_load;
-	ulong rd_data, rd_len;
-#if CONFIG_IS_ENABLED(LEGACY_IMAGE_FORMAT)
-	const image_header_t *rd_hdr;
-#endif
-	void *buf;
-#ifdef CONFIG_SUPPORT_RAW_INITRD
-	char *end;
-#endif
-#if IMAGE_ENABLE_FIT
-	const char	*fit_uname_config = images->fit_uname_cfg;
-	const char	*fit_uname_ramdisk = NULL;
-	ulong		default_addr;
-	int		rd_noffset;
-#endif
-	const char *select = NULL;
-
-	*rd_start = 0;
-	*rd_end = 0;
-
-#ifdef CONFIG_ANDROID_BOOT_IMAGE
-	/*
-	 * Look for an Android boot image.
-	 */
-	buf = map_sysmem(images->os.start, 0);
-	if (buf && genimg_get_format(buf) == IMAGE_FORMAT_ANDROID)
-		select = (argc == 0) ? env_get("loadaddr") : argv[0];
-#endif
-
-	if (argc >= 2)
-		select = argv[1];
-
-	/*
-	 * Look for a '-' which indicates to ignore the
-	 * ramdisk argument
-	 */
-	if (select && strcmp(select, "-") ==  0) {
-		debug("## Skipping init Ramdisk\n");
-		rd_len = rd_data = 0;
-	} else if (select || genimg_has_config(images)) {
-#if IMAGE_ENABLE_FIT
-		if (select) {
-			/*
-			 * If the init ramdisk comes from the FIT image and
-			 * the FIT image address is omitted in the command
-			 * line argument, try to use os FIT image address or
-			 * default load address.
-			 */
-			if (images->fit_uname_os)
-				default_addr = (ulong)images->fit_hdr_os;
-			else
-				default_addr = image_load_addr;
-
-			if (fit_parse_conf(select, default_addr,
-					   &rd_addr, &fit_uname_config)) {
-				debug("*  ramdisk: config '%s' from image at "
-						"0x%08lx\n",
-						fit_uname_config, rd_addr);
-			} else if (fit_parse_subimage(select, default_addr,
-						&rd_addr, &fit_uname_ramdisk)) {
-				debug("*  ramdisk: subimage '%s' from image at "
-						"0x%08lx\n",
-						fit_uname_ramdisk, rd_addr);
-			} else
-#endif
-			{
-				rd_addr = simple_strtoul(select, NULL, 16);
-				debug("*  ramdisk: cmdline image address = "
-						"0x%08lx\n",
-						rd_addr);
-			}
-#if IMAGE_ENABLE_FIT
-		} else {
-			/* use FIT configuration provided in first bootm
-			 * command argument. If the property is not defined,
-			 * quit silently.
-			 */
-			rd_addr = map_to_sysmem(images->fit_hdr_os);
-			rd_noffset = fit_get_node_from_config(images,
-					FIT_RAMDISK_PROP, rd_addr);
-			if (rd_noffset == -ENOENT)
-				return 0;
-			else if (rd_noffset < 0)
-				return 1;
-		}
-#endif
-
-		/*
-		 * Check if there is an initrd image at the
-		 * address provided in the second bootm argument
-		 * check image type, for FIT images get FIT node.
-		 */
-		buf = map_sysmem(rd_addr, 0);
-		switch (genimg_get_format(buf)) {
-#if CONFIG_IS_ENABLED(LEGACY_IMAGE_FORMAT)
-		case IMAGE_FORMAT_LEGACY:
-			printf("## Loading init Ramdisk from Legacy "
-					"Image@%08lx ...\n", rd_addr);
-
-			bootstage_mark(BOOTSTAGE_ID_CHECK_RAMDISK);
-			rd_hdr = image_get_ramdisk(rd_addr, arch,
-							images->verify);
-
-			if (rd_hdr == NULL)
-				return 1;
-
-			rd_data = image_get_data(rd_hdr);
-			rd_len = image_get_data_size(rd_hdr);
-			rd_load = image_get_load(rd_hdr);
-			break;
-#endif
-#if IMAGE_ENABLE_FIT
-		case IMAGE_FORMAT_FIT:
-			rd_noffset = fit_image_load(images,
-					rd_addr, &fit_uname_ramdisk,
-					&fit_uname_config, arch,
-					IH_TYPE_RAMDISK,
-					BOOTSTAGE_ID_FIT_RD_START,
-					FIT_LOAD_OPTIONAL_NON_ZERO,
-					&rd_data, &rd_len);
-			if (rd_noffset < 0)
-				return 1;
-
-			images->fit_hdr_rd = map_sysmem(rd_addr, 0);
-			images->fit_uname_rd = fit_uname_ramdisk;
-			images->fit_noffset_rd = rd_noffset;
-			break;
-#endif
-#ifdef CONFIG_ANDROID_BOOT_IMAGE
-		case IMAGE_FORMAT_ANDROID:
-			android_image_get_ramdisk((void *)images->os.start,
-				&rd_data, &rd_len);
-			break;
-#endif
-		default:
-#ifdef CONFIG_SUPPORT_RAW_INITRD
-			end = NULL;
-			if (select)
-				end = strchr(select, ':');
-			if (end) {
-				rd_len = simple_strtoul(++end, NULL, 16);
-				rd_data = rd_addr;
-			} else
-#endif
-			{
-				puts("Wrong Ramdisk Image Format\n");
-				rd_data = rd_len = rd_load = 0;
-				return 1;
-			}
-		}
-	} else if (images->legacy_hdr_valid &&
-			image_check_type(&images->legacy_hdr_os_copy,
-						IH_TYPE_MULTI)) {
-
-		/*
-		 * Now check if we have a legacy mult-component image,
-		 * get second entry data start address and len.
-		 */
-		bootstage_mark(BOOTSTAGE_ID_RAMDISK);
-		printf("## Loading init Ramdisk from multi component "
-				"Legacy Image at %08lx ...\n",
-				(ulong)images->legacy_hdr_os);
-
-		image_multi_getimg(images->legacy_hdr_os, 1, &rd_data, &rd_len);
-	} else {
-		/*
-		 * no initrd image
-		 */
-		bootstage_mark(BOOTSTAGE_ID_NO_RAMDISK);
-		rd_len = rd_data = 0;
-	}
-
-	if (!rd_data) {
-		debug("## No init Ramdisk\n");
-	} else {
-		*rd_start = rd_data;
-		*rd_end = rd_data + rd_len;
-	}
-	debug("   ramdisk start = 0x%08lx, ramdisk end = 0x%08lx\n",
-			*rd_start, *rd_end);
-
-	return 0;
-}
-
-#ifdef CONFIG_SYS_BOOT_RAMDISK_HIGH
-/**
- * boot_ramdisk_high - relocate init ramdisk
- * @lmb: pointer to lmb handle, will be used for memory mgmt
- * @rd_data: ramdisk data start address
- * @rd_len: ramdisk data length
- * @initrd_start: pointer to a ulong variable, will hold final init ramdisk
- *      start address (after possible relocation)
- * @initrd_end: pointer to a ulong variable, will hold final init ramdisk
- *      end address (after possible relocation)
- *
- * boot_ramdisk_high() takes a relocation hint from "initrd_high" environment
- * variable and if requested ramdisk data is moved to a specified location.
- *
- * Initrd_start and initrd_end are set to final (after relocation) ramdisk
- * start/end addresses if ramdisk image start and len were provided,
- * otherwise set initrd_start and initrd_end set to zeros.
- *
- * returns:
- *      0 - success
- *     -1 - failure
- */
-int boot_ramdisk_high(struct lmb *lmb, ulong rd_data, ulong rd_len,
-		  ulong *initrd_start, ulong *initrd_end)
-{
-	char	*s;
-	ulong	initrd_high;
-	int	initrd_copy_to_ram = 1;
-
-	s = env_get("initrd_high");
-	if (s) {
-		/* a value of "no" or a similar string will act like 0,
-		 * turning the "load high" feature off. This is intentional.
-		 */
-		initrd_high = simple_strtoul(s, NULL, 16);
-		if (initrd_high == ~0)
-			initrd_copy_to_ram = 0;
-	} else {
-		initrd_high = env_get_bootm_mapsize() + env_get_bootm_low();
-	}
-
-
-	debug("## initrd_high = 0x%08lx, copy_to_ram = %d\n",
-			initrd_high, initrd_copy_to_ram);
-
-	if (rd_data) {
-		if (!initrd_copy_to_ram) {	/* zero-copy ramdisk support */
-			debug("   in-place initrd\n");
-			*initrd_start = rd_data;
-			*initrd_end = rd_data + rd_len;
-			lmb_reserve(lmb, rd_data, rd_len);
-		} else {
-			if (initrd_high)
-				*initrd_start = (ulong)lmb_alloc_base(lmb,
-						rd_len, 0x1000, initrd_high);
-			else
-				*initrd_start = (ulong)lmb_alloc(lmb, rd_len,
-								 0x1000);
-
-			if (*initrd_start == 0) {
-				puts("ramdisk - allocation error\n");
-				goto error;
-			}
-			bootstage_mark(BOOTSTAGE_ID_COPY_RAMDISK);
-
-			*initrd_end = *initrd_start + rd_len;
-			printf("   Loading Ramdisk to %08lx, end %08lx ... ",
-					*initrd_start, *initrd_end);
-
-			memmove_wd((void *)*initrd_start,
-					(void *)rd_data, rd_len, CHUNKSZ);
-
-#ifdef CONFIG_MP
-			/*
-			 * Ensure the image is flushed to memory to handle
-			 * AMP boot scenarios in which we might not be
-			 * HW cache coherent
-			 */
-			flush_cache((unsigned long)*initrd_start,
-				    ALIGN(rd_len, ARCH_DMA_MINALIGN));
-#endif
-			puts("OK\n");
-		}
-	} else {
-		*initrd_start = 0;
-		*initrd_end = 0;
-	}
-	debug("   ramdisk load start = 0x%08lx, ramdisk load end = 0x%08lx\n",
-			*initrd_start, *initrd_end);
-
-	return 0;
-
-error:
-	return -1;
-}
-#endif /* CONFIG_SYS_BOOT_RAMDISK_HIGH */
-
-int boot_get_setup(bootm_headers_t *images, uint8_t arch,
-		   ulong *setup_start, ulong *setup_len)
-{
-#if IMAGE_ENABLE_FIT
-	return boot_get_setup_fit(images, arch, setup_start, setup_len);
-#else
-	return -ENOENT;
-#endif
-}
-
-#if IMAGE_ENABLE_FIT
-#if defined(CONFIG_FPGA)
-int boot_get_fpga(int argc, char *const argv[], bootm_headers_t *images,
-		  uint8_t arch, const ulong *ld_start, ulong * const ld_len)
-{
-	ulong tmp_img_addr, img_data, img_len;
-	void *buf;
-	int conf_noffset;
-	int fit_img_result;
-	const char *uname, *name;
-	int err;
-	int devnum = 0; /* TODO support multi fpga platforms */
-
-	/* Check to see if the images struct has a FIT configuration */
-	if (!genimg_has_config(images)) {
-		debug("## FIT configuration was not specified\n");
-		return 0;
-	}
-
-	/*
-	 * Obtain the os FIT header from the images struct
-	 */
-	tmp_img_addr = map_to_sysmem(images->fit_hdr_os);
-	buf = map_sysmem(tmp_img_addr, 0);
-	/*
-	 * Check image type. For FIT images get FIT node
-	 * and attempt to locate a generic binary.
-	 */
-	switch (genimg_get_format(buf)) {
-	case IMAGE_FORMAT_FIT:
-		conf_noffset = fit_conf_get_node(buf, images->fit_uname_cfg);
-
-		uname = fdt_stringlist_get(buf, conf_noffset, FIT_FPGA_PROP, 0,
-					   NULL);
-		if (!uname) {
-			debug("## FPGA image is not specified\n");
-			return 0;
-		}
-		fit_img_result = fit_image_load(images,
-						tmp_img_addr,
-						(const char **)&uname,
-						&(images->fit_uname_cfg),
-						arch,
-						IH_TYPE_FPGA,
-						BOOTSTAGE_ID_FPGA_INIT,
-						FIT_LOAD_OPTIONAL_NON_ZERO,
-						&img_data, &img_len);
-
-		debug("FPGA image (%s) loaded to 0x%lx/size 0x%lx\n",
-		      uname, img_data, img_len);
-
-		if (fit_img_result < 0) {
-			/* Something went wrong! */
-			return fit_img_result;
-		}
-
-		if (!fpga_is_partial_data(devnum, img_len)) {
-			name = "full";
-			err = fpga_loadbitstream(devnum, (char *)img_data,
-						 img_len, BIT_FULL);
-			if (err)
-				err = fpga_load(devnum, (const void *)img_data,
-						img_len, BIT_FULL);
-		} else {
-			name = "partial";
-			err = fpga_loadbitstream(devnum, (char *)img_data,
-						 img_len, BIT_PARTIAL);
-			if (err)
-				err = fpga_load(devnum, (const void *)img_data,
-						img_len, BIT_PARTIAL);
-		}
-
-		if (err)
-			return err;
-
-		printf("   Programming %s bitstream... OK\n", name);
-		break;
-	default:
-		printf("The given image format is not supported (corrupt?)\n");
-		return 1;
-	}
-
-	return 0;
-}
-#endif
-
-static void fit_loadable_process(uint8_t img_type,
-				 ulong img_data,
-				 ulong img_len)
-{
-	int i;
-	const unsigned int count =
-			ll_entry_count(struct fit_loadable_tbl, fit_loadable);
-	struct fit_loadable_tbl *fit_loadable_handler =
-			ll_entry_start(struct fit_loadable_tbl, fit_loadable);
-	/* For each loadable handler */
-	for (i = 0; i < count; i++, fit_loadable_handler++)
-		/* matching this type */
-		if (fit_loadable_handler->type == img_type)
-			/* call that handler with this image data */
-			fit_loadable_handler->handler(img_data, img_len);
-}
-
-int boot_get_loadable(int argc, char *const argv[], bootm_headers_t *images,
-		      uint8_t arch, const ulong *ld_start, ulong * const ld_len)
-{
-	/*
-	 * These variables are used to hold the current image location
-	 * in system memory.
-	 */
-	ulong tmp_img_addr;
-	/*
-	 * These two variables are requirements for fit_image_load, but
-	 * their values are not used
-	 */
-	ulong img_data, img_len;
-	void *buf;
-	int loadables_index;
-	int conf_noffset;
-	int fit_img_result;
-	const char *uname;
-	uint8_t img_type;
-
-	/* Check to see if the images struct has a FIT configuration */
-	if (!genimg_has_config(images)) {
-		debug("## FIT configuration was not specified\n");
-		return 0;
-	}
-
-	/*
-	 * Obtain the os FIT header from the images struct
-	 */
-	tmp_img_addr = map_to_sysmem(images->fit_hdr_os);
-	buf = map_sysmem(tmp_img_addr, 0);
-	/*
-	 * Check image type. For FIT images get FIT node
-	 * and attempt to locate a generic binary.
-	 */
-	switch (genimg_get_format(buf)) {
-	case IMAGE_FORMAT_FIT:
-		conf_noffset = fit_conf_get_node(buf, images->fit_uname_cfg);
-
-		for (loadables_index = 0;
-		     uname = fdt_stringlist_get(buf, conf_noffset,
-					FIT_LOADABLE_PROP, loadables_index,
-					NULL), uname;
-		     loadables_index++)
-		{
-			fit_img_result = fit_image_load(images,
-				tmp_img_addr,
-				&uname,
-				&(images->fit_uname_cfg), arch,
-				IH_TYPE_LOADABLE,
-				BOOTSTAGE_ID_FIT_LOADABLE_START,
-				FIT_LOAD_OPTIONAL_NON_ZERO,
-				&img_data, &img_len);
-			if (fit_img_result < 0) {
-				/* Something went wrong! */
-				return fit_img_result;
-			}
-
-			fit_img_result = fit_image_get_node(buf, uname);
-			if (fit_img_result < 0) {
-				/* Something went wrong! */
-				return fit_img_result;
-			}
-			fit_img_result = fit_image_get_type(buf,
-							    fit_img_result,
-							    &img_type);
-			if (fit_img_result < 0) {
-				/* Something went wrong! */
-				return fit_img_result;
-			}
-
-			fit_loadable_process(img_type, img_data, img_len);
-		}
-		break;
-	default:
-		printf("The given image format is not supported (corrupt?)\n");
-		return 1;
-	}
-
-	return 0;
-}
-#endif
-
-#ifdef CONFIG_SYS_BOOT_GET_CMDLINE
-/**
- * boot_get_cmdline - allocate and initialize kernel cmdline
- * @lmb: pointer to lmb handle, will be used for memory mgmt
- * @cmd_start: pointer to a ulong variable, will hold cmdline start
- * @cmd_end: pointer to a ulong variable, will hold cmdline end
- *
- * boot_get_cmdline() allocates space for kernel command line below
- * BOOTMAPSZ + env_get_bootm_low() address. If "bootargs" U-Boot environment
- * variable is present its contents is copied to allocated kernel
- * command line.
- *
- * returns:
- *      0 - success
- *     -1 - failure
- */
-int boot_get_cmdline(struct lmb *lmb, ulong *cmd_start, ulong *cmd_end)
-{
-	char *cmdline;
-	char *s;
-
-	cmdline = (char *)(ulong)lmb_alloc_base(lmb, CONFIG_SYS_BARGSIZE, 0xf,
-				env_get_bootm_mapsize() + env_get_bootm_low());
-
-	if (cmdline == NULL)
-		return -1;
-
-	s = env_get("bootargs");
-	if (!s)
-		s = "";
-
-	strcpy(cmdline, s);
-
-	*cmd_start = (ulong) & cmdline[0];
-	*cmd_end = *cmd_start + strlen(cmdline);
-
-	debug("## cmdline@0x%08lx ... 0x%08lx\n", *cmd_start, *cmd_end);
-
-	return 0;
-}
-#endif /* CONFIG_SYS_BOOT_GET_CMDLINE */
-
-#ifdef CONFIG_SYS_BOOT_GET_KBD
-/**
- * boot_get_kbd - allocate and initialize kernel copy of board info
- * @lmb: pointer to lmb handle, will be used for memory mgmt
- * @kbd: double pointer to board info data
- *
- * boot_get_kbd() allocates space for kernel copy of board info data below
- * BOOTMAPSZ + env_get_bootm_low() address and kernel board info is initialized
- * with the current u-boot board info data.
- *
- * returns:
- *      0 - success
- *     -1 - failure
- */
-int boot_get_kbd(struct lmb *lmb, struct bd_info **kbd)
-{
-	*kbd = (struct bd_info *)(ulong)lmb_alloc_base(lmb,
-						       sizeof(struct bd_info),
-						       0xf,
-						       env_get_bootm_mapsize() + env_get_bootm_low());
-	if (*kbd == NULL)
-		return -1;
-
-	**kbd = *(gd->bd);
-
-	debug("## kernel board info at 0x%08lx\n", (ulong)*kbd);
-
-#if defined(DEBUG) && defined(CONFIG_CMD_BDI)
-	do_bdinfo(NULL, 0, 0, NULL);
-#endif
-
-	return 0;
-}
-#endif /* CONFIG_SYS_BOOT_GET_KBD */
-
-#ifdef CONFIG_LMB
-int image_setup_linux(bootm_headers_t *images)
-{
-	ulong of_size = images->ft_len;
-	char **of_flat_tree = &images->ft_addr;
-	struct lmb *lmb = &images->lmb;
-	int ret;
-
-	if (IMAGE_ENABLE_OF_LIBFDT)
-		boot_fdt_add_mem_rsv_regions(lmb, *of_flat_tree);
-
-	if (IMAGE_BOOT_GET_CMDLINE) {
-		ret = boot_get_cmdline(lmb, &images->cmdline_start,
-				&images->cmdline_end);
-		if (ret) {
-			puts("ERROR with allocation of cmdline\n");
-			return ret;
-		}
-	}
-
-	if (IMAGE_ENABLE_OF_LIBFDT) {
-		ret = boot_relocate_fdt(lmb, of_flat_tree, &of_size);
-		if (ret)
-			return ret;
-	}
-
-	if (IMAGE_ENABLE_OF_LIBFDT && of_size) {
-		ret = image_setup_libfdt(images, *of_flat_tree, of_size, lmb);
-		if (ret)
-			return ret;
-	}
-
-	return 0;
-}
-#endif /* CONFIG_LMB */
-#endif /* !USE_HOSTCC */
-- 
2.31.1.607.g51e8a6a459-goog

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

* [PATCH v2 11/50] image: Fix up checkpatch warnings in image-board.c
  2021-05-06 14:23 [PATCH v2 00/50] image: Reduce #ifdefs and ad-hoc defines in image code Simon Glass
                   ` (9 preceding siblings ...)
  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 ` Simon Glass
  2021-05-06 14:24 ` [PATCH v2 12/50] image: Split host code out into its own file Simon Glass
                   ` (38 subsequent siblings)
  49 siblings, 0 replies; 91+ messages in thread
From: Simon Glass @ 2021-05-06 14:23 UTC (permalink / raw)
  To: u-boot

Tidy up the warnings.

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

(no changes since v1)

 common/image-board.c | 142 ++++++++++++++++++++++---------------------
 1 file changed, 72 insertions(+), 70 deletions(-)

diff --git a/common/image-board.c b/common/image-board.c
index 0c4e32e14e4..5d3eafb5245 100644
--- a/common/image-board.c
+++ b/common/image-board.c
@@ -41,8 +41,8 @@ DECLARE_GLOBAL_DATA_PTR;
  *     pointer to a ramdisk image header, if image was found and valid
  *     otherwise, return NULL
  */
-static const image_header_t *image_get_ramdisk(ulong rd_addr, uint8_t arch,
-						int verify)
+static const image_header_t *image_get_ramdisk(ulong rd_addr, u8 arch,
+					       int verify)
 {
 	const image_header_t *rd_hdr = (const image_header_t *)rd_addr;
 
@@ -77,7 +77,7 @@ static const image_header_t *image_get_ramdisk(ulong rd_addr, uint8_t arch,
 	    !image_check_arch(rd_hdr, arch) ||
 	    !image_check_type(rd_hdr, IH_TYPE_RAMDISK)) {
 		printf("No Linux %s Ramdisk Image\n",
-				genimg_get_arch_name(arch));
+		       genimg_get_arch_name(arch));
 		bootstage_error(BOOTSTAGE_ID_RAMDISK);
 		return NULL;
 	}
@@ -94,7 +94,7 @@ ulong image_save_addr;			/* Default Save Address */
 ulong image_save_size;			/* Default Save Size (in bytes) */
 
 static int on_loadaddr(const char *name, const char *value, enum env_op op,
-	int flags)
+		       int flags)
 {
 	switch (op) {
 	case env_op_create:
@@ -112,6 +112,7 @@ U_BOOT_ENV_CALLBACK(loadaddr, on_loadaddr);
 ulong env_get_bootm_low(void)
 {
 	char *s = env_get("bootm_low");
+
 	if (s) {
 		ulong tmp = simple_strtoul(s, NULL, 16);
 		return tmp;
@@ -131,6 +132,7 @@ phys_size_t env_get_bootm_size(void)
 	phys_size_t tmp, size;
 	phys_addr_t start;
 	char *s = env_get("bootm_size");
+
 	if (s) {
 		tmp = (phys_size_t)simple_strtoull(s, NULL, 16);
 		return tmp;
@@ -155,6 +157,7 @@ phys_size_t env_get_bootm_mapsize(void)
 {
 	phys_size_t tmp;
 	char *s = env_get("bootm_mapsize");
+
 	if (s) {
 		tmp = (phys_size_t)simple_strtoull(s, NULL, 16);
 		return tmp;
@@ -179,6 +182,7 @@ void memmove_wd(void *to, void *from, size_t len, ulong chunksz)
 	}
 	while (len > 0) {
 		size_t tail = (len > chunksz) ? chunksz : len;
+
 		WATCHDOG_RESET();
 		if (to > from) {
 			to -= tail;
@@ -212,8 +216,8 @@ void memmove_wd(void *to, void *from, size_t len, ulong chunksz)
  *     kernel start address
  */
 ulong genimg_get_kernel_addr_fit(char * const img_addr,
-			     const char **fit_uname_config,
-			     const char **fit_uname_kernel)
+				 const char **fit_uname_config,
+				 const char **fit_uname_kernel)
 {
 	ulong kernel_addr;
 
@@ -319,7 +323,7 @@ int genimg_has_config(bootm_headers_t *images)
  * @rd_end: pointer to a ulong variable, will hold ramdisk end
  *
  * boot_get_ramdisk() is responsible for finding a valid ramdisk image.
- * Curently supported are the following ramdisk sources:
+ * Currently supported are the following ramdisk sources:
  *      - multicomponent kernel/ramdisk image,
  *      - commandline provided address of decicated ramdisk image.
  *
@@ -332,7 +336,7 @@ int genimg_has_config(bootm_headers_t *images)
  *     rd_start and rd_end are set to 0 if no ramdisk exists
  */
 int boot_get_ramdisk(int argc, char *const argv[], bootm_headers_t *images,
-		     uint8_t arch, ulong *rd_start, ulong *rd_end)
+		     u8 arch, ulong *rd_start, ulong *rd_end)
 {
 	ulong rd_addr, rd_load;
 	ulong rd_data, rd_len;
@@ -372,7 +376,8 @@ int boot_get_ramdisk(int argc, char *const argv[], bootm_headers_t *images,
 	 */
 	if (select && strcmp(select, "-") ==  0) {
 		debug("## Skipping init Ramdisk\n");
-		rd_len = rd_data = 0;
+		rd_len = 0;
+		rd_data = 0;
 	} else if (select || genimg_has_config(images)) {
 #if IMAGE_ENABLE_FIT
 		if (select) {
@@ -389,21 +394,19 @@ int boot_get_ramdisk(int argc, char *const argv[], bootm_headers_t *images,
 
 			if (fit_parse_conf(select, default_addr,
 					   &rd_addr, &fit_uname_config)) {
-				debug("*  ramdisk: config '%s' from image at "
-						"0x%08lx\n",
-						fit_uname_config, rd_addr);
+				debug("*  ramdisk: config '%s' from image at 0x%08lx\n",
+				      fit_uname_config, rd_addr);
 			} else if (fit_parse_subimage(select, default_addr,
-						&rd_addr, &fit_uname_ramdisk)) {
-				debug("*  ramdisk: subimage '%s' from image at "
-						"0x%08lx\n",
-						fit_uname_ramdisk, rd_addr);
+						      &rd_addr,
+						      &fit_uname_ramdisk)) {
+				debug("*  ramdisk: subimage '%s' from image at 0x%08lx\n",
+				      fit_uname_ramdisk, rd_addr);
 			} else
 #endif
 			{
 				rd_addr = simple_strtoul(select, NULL, 16);
-				debug("*  ramdisk: cmdline image address = "
-						"0x%08lx\n",
-						rd_addr);
+				debug("*  ramdisk: cmdline image address = 0x%08lx\n",
+				      rd_addr);
 			}
 #if IMAGE_ENABLE_FIT
 		} else {
@@ -413,7 +416,8 @@ int boot_get_ramdisk(int argc, char *const argv[], bootm_headers_t *images,
 			 */
 			rd_addr = map_to_sysmem(images->fit_hdr_os);
 			rd_noffset = fit_get_node_from_config(images,
-					FIT_RAMDISK_PROP, rd_addr);
+							      FIT_RAMDISK_PROP,
+							      rd_addr);
 			if (rd_noffset == -ENOENT)
 				return 0;
 			else if (rd_noffset < 0)
@@ -430,14 +434,14 @@ int boot_get_ramdisk(int argc, char *const argv[], bootm_headers_t *images,
 		switch (genimg_get_format(buf)) {
 #if CONFIG_IS_ENABLED(LEGACY_IMAGE_FORMAT)
 		case IMAGE_FORMAT_LEGACY:
-			printf("## Loading init Ramdisk from Legacy "
-					"Image at %08lx ...\n", rd_addr);
+			printf("## Loading init Ramdisk from Legacy Image@%08lx ...\n",
+			       rd_addr);
 
 			bootstage_mark(BOOTSTAGE_ID_CHECK_RAMDISK);
 			rd_hdr = image_get_ramdisk(rd_addr, arch,
-							images->verify);
+						   images->verify);
 
-			if (rd_hdr == NULL)
+			if (!rd_hdr)
 				return 1;
 
 			rd_data = image_get_data(rd_hdr);
@@ -448,12 +452,12 @@ int boot_get_ramdisk(int argc, char *const argv[], bootm_headers_t *images,
 #if IMAGE_ENABLE_FIT
 		case IMAGE_FORMAT_FIT:
 			rd_noffset = fit_image_load(images,
-					rd_addr, &fit_uname_ramdisk,
-					&fit_uname_config, arch,
-					IH_TYPE_RAMDISK,
-					BOOTSTAGE_ID_FIT_RD_START,
-					FIT_LOAD_OPTIONAL_NON_ZERO,
-					&rd_data, &rd_len);
+						    rd_addr, &fit_uname_ramdisk,
+						    &fit_uname_config, arch,
+						    IH_TYPE_RAMDISK,
+						    BOOTSTAGE_ID_FIT_RD_START,
+						    FIT_LOAD_OPTIONAL_NON_ZERO,
+						    &rd_data, &rd_len);
 			if (rd_noffset < 0)
 				return 1;
 
@@ -465,7 +469,7 @@ int boot_get_ramdisk(int argc, char *const argv[], bootm_headers_t *images,
 #ifdef CONFIG_ANDROID_BOOT_IMAGE
 		case IMAGE_FORMAT_ANDROID:
 			android_image_get_ramdisk((void *)images->os.start,
-				&rd_data, &rd_len);
+						  &rd_data, &rd_len);
 			break;
 #endif
 		default:
@@ -480,22 +484,22 @@ int boot_get_ramdisk(int argc, char *const argv[], bootm_headers_t *images,
 #endif
 			{
 				puts("Wrong Ramdisk Image Format\n");
-				rd_data = rd_len = rd_load = 0;
+				rd_data = 0;
+				rd_len = 0;
+				rd_load = 0;
 				return 1;
 			}
 		}
 	} else if (images->legacy_hdr_valid &&
 			image_check_type(&images->legacy_hdr_os_copy,
-						IH_TYPE_MULTI)) {
-
+					 IH_TYPE_MULTI)) {
 		/*
 		 * Now check if we have a legacy mult-component image,
 		 * get second entry data start address and len.
 		 */
 		bootstage_mark(BOOTSTAGE_ID_RAMDISK);
-		printf("## Loading init Ramdisk from multi component "
-				"Legacy Image at %08lx ...\n",
-				(ulong)images->legacy_hdr_os);
+		printf("## Loading init Ramdisk from multi component Legacy Image at %08lx ...\n",
+		       (ulong)images->legacy_hdr_os);
 
 		image_multi_getimg(images->legacy_hdr_os, 1, &rd_data, &rd_len);
 	} else {
@@ -503,7 +507,8 @@ int boot_get_ramdisk(int argc, char *const argv[], bootm_headers_t *images,
 		 * no initrd image
 		 */
 		bootstage_mark(BOOTSTAGE_ID_NO_RAMDISK);
-		rd_len = rd_data = 0;
+		rd_len = 0;
+		rd_data = 0;
 	}
 
 	if (!rd_data) {
@@ -513,7 +518,7 @@ int boot_get_ramdisk(int argc, char *const argv[], bootm_headers_t *images,
 		*rd_end = rd_data + rd_len;
 	}
 	debug("   ramdisk start = 0x%08lx, ramdisk end = 0x%08lx\n",
-			*rd_start, *rd_end);
+	      *rd_start, *rd_end);
 
 	return 0;
 }
@@ -541,7 +546,7 @@ int boot_get_ramdisk(int argc, char *const argv[], bootm_headers_t *images,
  *     -1 - failure
  */
 int boot_ramdisk_high(struct lmb *lmb, ulong rd_data, ulong rd_len,
-		  ulong *initrd_start, ulong *initrd_end)
+		      ulong *initrd_start, ulong *initrd_end)
 {
 	char	*s;
 	ulong	initrd_high;
@@ -559,9 +564,8 @@ int boot_ramdisk_high(struct lmb *lmb, ulong rd_data, ulong rd_len,
 		initrd_high = env_get_bootm_mapsize() + env_get_bootm_low();
 	}
 
-
 	debug("## initrd_high = 0x%08lx, copy_to_ram = %d\n",
-			initrd_high, initrd_copy_to_ram);
+	      initrd_high, initrd_copy_to_ram);
 
 	if (rd_data) {
 		if (!initrd_copy_to_ram) {	/* zero-copy ramdisk support */
@@ -585,10 +589,10 @@ int boot_ramdisk_high(struct lmb *lmb, ulong rd_data, ulong rd_len,
 
 			*initrd_end = *initrd_start + rd_len;
 			printf("   Loading Ramdisk to %08lx, end %08lx ... ",
-					*initrd_start, *initrd_end);
+			       *initrd_start, *initrd_end);
 
 			memmove_wd((void *)*initrd_start,
-					(void *)rd_data, rd_len, CHUNKSZ);
+				   (void *)rd_data, rd_len, CHUNKSZ);
 
 #ifdef CONFIG_MP
 			/*
@@ -606,7 +610,7 @@ int boot_ramdisk_high(struct lmb *lmb, ulong rd_data, ulong rd_len,
 		*initrd_end = 0;
 	}
 	debug("   ramdisk load start = 0x%08lx, ramdisk load end = 0x%08lx\n",
-			*initrd_start, *initrd_end);
+	      *initrd_start, *initrd_end);
 
 	return 0;
 
@@ -615,7 +619,7 @@ error:
 }
 #endif /* CONFIG_SYS_BOOT_RAMDISK_HIGH */
 
-int boot_get_setup(bootm_headers_t *images, uint8_t arch,
+int boot_get_setup(bootm_headers_t *images, u8 arch,
 		   ulong *setup_start, ulong *setup_len)
 {
 #if IMAGE_ENABLE_FIT
@@ -628,7 +632,7 @@ int boot_get_setup(bootm_headers_t *images, uint8_t arch,
 #if IMAGE_ENABLE_FIT
 #if defined(CONFIG_FPGA)
 int boot_get_fpga(int argc, char *const argv[], bootm_headers_t *images,
-		  uint8_t arch, const ulong *ld_start, ulong * const ld_len)
+		  u8 arch, const ulong *ld_start, ulong * const ld_len)
 {
 	ulong tmp_img_addr, img_data, img_len;
 	void *buf;
@@ -666,7 +670,7 @@ int boot_get_fpga(int argc, char *const argv[], bootm_headers_t *images,
 		fit_img_result = fit_image_load(images,
 						tmp_img_addr,
 						(const char **)&uname,
-						&(images->fit_uname_cfg),
+						&images->fit_uname_cfg,
 						arch,
 						IH_TYPE_FPGA,
 						BOOTSTAGE_ID_FPGA_INIT,
@@ -711,7 +715,7 @@ int boot_get_fpga(int argc, char *const argv[], bootm_headers_t *images,
 }
 #endif
 
-static void fit_loadable_process(uint8_t img_type,
+static void fit_loadable_process(u8 img_type,
 				 ulong img_data,
 				 ulong img_len)
 {
@@ -729,7 +733,7 @@ static void fit_loadable_process(uint8_t img_type,
 }
 
 int boot_get_loadable(int argc, char *const argv[], bootm_headers_t *images,
-		      uint8_t arch, const ulong *ld_start, ulong * const ld_len)
+		      u8 arch, const ulong *ld_start, ulong * const ld_len)
 {
 	/*
 	 * These variables are used to hold the current image location
@@ -746,7 +750,7 @@ int boot_get_loadable(int argc, char *const argv[], bootm_headers_t *images,
 	int conf_noffset;
 	int fit_img_result;
 	const char *uname;
-	uint8_t img_type;
+	u8 img_type;
 
 	/* Check to see if the images struct has a FIT configuration */
 	if (!genimg_has_config(images)) {
@@ -769,18 +773,16 @@ int boot_get_loadable(int argc, char *const argv[], bootm_headers_t *images,
 
 		for (loadables_index = 0;
 		     uname = fdt_stringlist_get(buf, conf_noffset,
-					FIT_LOADABLE_PROP, loadables_index,
-					NULL), uname;
-		     loadables_index++)
-		{
-			fit_img_result = fit_image_load(images,
-				tmp_img_addr,
-				&uname,
-				&(images->fit_uname_cfg), arch,
-				IH_TYPE_LOADABLE,
-				BOOTSTAGE_ID_FIT_LOADABLE_START,
-				FIT_LOAD_OPTIONAL_NON_ZERO,
-				&img_data, &img_len);
+						FIT_LOADABLE_PROP,
+						loadables_index, NULL), uname;
+		     loadables_index++) {
+			fit_img_result = fit_image_load(images, tmp_img_addr,
+							&uname,
+							&images->fit_uname_cfg,
+							arch, IH_TYPE_LOADABLE,
+							BOOTSTAGE_ID_FIT_LOADABLE_START,
+							FIT_LOAD_OPTIONAL_NON_ZERO,
+							&img_data, &img_len);
 			if (fit_img_result < 0) {
 				/* Something went wrong! */
 				return fit_img_result;
@@ -834,8 +836,7 @@ int boot_get_cmdline(struct lmb *lmb, ulong *cmd_start, ulong *cmd_end)
 
 	cmdline = (char *)(ulong)lmb_alloc_base(lmb, CONFIG_SYS_BARGSIZE, 0xf,
 				env_get_bootm_mapsize() + env_get_bootm_low());
-
-	if (cmdline == NULL)
+	if (!cmdline)
 		return -1;
 
 	s = env_get("bootargs");
@@ -844,7 +845,7 @@ int boot_get_cmdline(struct lmb *lmb, ulong *cmd_start, ulong *cmd_end)
 
 	strcpy(cmdline, s);
 
-	*cmd_start = (ulong) & cmdline[0];
+	*cmd_start = (ulong)cmdline;
 	*cmd_end = *cmd_start + strlen(cmdline);
 
 	debug("## cmdline@0x%08lx ... 0x%08lx\n", *cmd_start, *cmd_end);
@@ -872,11 +873,12 @@ int boot_get_kbd(struct lmb *lmb, struct bd_info **kbd)
 	*kbd = (struct bd_info *)(ulong)lmb_alloc_base(lmb,
 						       sizeof(struct bd_info),
 						       0xf,
-						       env_get_bootm_mapsize() + env_get_bootm_low());
-	if (*kbd == NULL)
+						       env_get_bootm_mapsize() +
+						       env_get_bootm_low());
+	if (!*kbd)
 		return -1;
 
-	**kbd = *(gd->bd);
+	**kbd = *gd->bd;
 
 	debug("## kernel board info at 0x%08lx\n", (ulong)*kbd);
 
@@ -901,7 +903,7 @@ int image_setup_linux(bootm_headers_t *images)
 
 	if (IMAGE_BOOT_GET_CMDLINE) {
 		ret = boot_get_cmdline(lmb, &images->cmdline_start,
-				&images->cmdline_end);
+				       &images->cmdline_end);
 		if (ret) {
 			puts("ERROR with allocation of cmdline\n");
 			return ret;
-- 
2.31.1.607.g51e8a6a459-goog

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

* [PATCH v2 12/50] image: Split host code out into its own file
  2021-05-06 14:23 [PATCH v2 00/50] image: Reduce #ifdefs and ad-hoc defines in image code Simon Glass
                   ` (10 preceding siblings ...)
  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 ` Simon Glass
  2021-05-06 14:24 ` [PATCH v2 13/50] image: Create a function to do manual relocation Simon Glass
                   ` (37 subsequent siblings)
  49 siblings, 0 replies; 91+ messages in thread
From: Simon Glass @ 2021-05-06 14:24 UTC (permalink / raw)
  To: u-boot

To avoid having #ifdefs in a few functions which are completely different
in the board and host code, create a new image-host.c file.

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

(no changes since v1)

 common/image-board.c | 17 +++++++++++++++++
 common/image-host.c  | 27 +++++++++++++++++++++++++++
 common/image.c       | 38 +-------------------------------------
 tools/Makefile       |  1 +
 4 files changed, 46 insertions(+), 37 deletions(-)
 create mode 100644 common/image-host.c

diff --git a/common/image-board.c b/common/image-board.c
index 5d3eafb5245..b46062c86b9 100644
--- a/common/image-board.c
+++ b/common/image-board.c
@@ -15,6 +15,7 @@
 #include <fpga.h>
 #include <image.h>
 #include <mapmem.h>
+#include <rtc.h>
 #include <watchdog.h>
 #include <asm/cache.h>
 #include <asm/global_data.h>
@@ -925,3 +926,19 @@ int image_setup_linux(bootm_headers_t *images)
 	return 0;
 }
 #endif /* CONFIG_LMB */
+
+void genimg_print_size(uint32_t size)
+{
+	printf("%d Bytes = ", size);
+	print_size(size, "\n");
+}
+
+void genimg_print_time(time_t timestamp)
+{
+	struct rtc_time tm;
+
+	rtc_to_tm(timestamp, &tm);
+	printf("%4d-%02d-%02d  %2d:%02d:%02d UTC\n",
+	       tm.tm_year, tm.tm_mon, tm.tm_mday,
+	       tm.tm_hour, tm.tm_min, tm.tm_sec);
+}
diff --git a/common/image-host.c b/common/image-host.c
new file mode 100644
index 00000000000..20a9521948b
--- /dev/null
+++ b/common/image-host.c
@@ -0,0 +1,27 @@
+// SPDX-License-Identifier: GPL-2.0+
+/*
+ * Image code used by host tools (and not boards)
+ *
+ * (C) Copyright 2008 Semihalf
+ *
+ * (C) Copyright 2000-2006
+ * Wolfgang Denk, DENX Software Engineering, wd at denx.de.
+ */
+
+#include <time.h>
+
+void memmove_wd(void *to, void *from, size_t len, ulong chunksz)
+{
+	memmove(to, from, len);
+}
+
+void genimg_print_size(uint32_t size)
+{
+	printf("%d Bytes = %.2f KiB = %.2f MiB\n", size, (double)size / 1.024e3,
+	       (double)size / 1.048576e6);
+}
+
+void genimg_print_time(time_t timestamp)
+{
+	printf("%s", ctime(&timestamp));
+}
diff --git a/common/image.c b/common/image.c
index e9658e3ab1b..0ef8f30fcfa 100644
--- a/common/image.c
+++ b/common/image.c
@@ -18,8 +18,6 @@
 #include <status_led.h>
 #endif
 
-#include <rtc.h>
-
 #if IMAGE_ENABLE_FIT || IMAGE_ENABLE_OF_LIBFDT
 #include <linux/libfdt.h>
 #include <fdt_support.h>
@@ -60,6 +58,7 @@ DECLARE_GLOBAL_DATA_PTR;
 
 #include <abuf.h>
 #include <bzlib.h>
+#include <display_options.h>
 #include <gzip.h>
 #include <image.h>
 #include <lz4.h>
@@ -526,41 +525,6 @@ int image_decomp(int comp, ulong load, ulong image_start, int type,
 	return 0;
 }
 
-#ifdef USE_HOSTCC
-void memmove_wd(void *to, void *from, size_t len, ulong chunksz)
-{
-	memmove(to, from, len);
-}
-#endif /* !USE_HOSTCC */
-
-void genimg_print_size(uint32_t size)
-{
-#ifndef USE_HOSTCC
-	printf("%d Bytes = ", size);
-	print_size(size, "\n");
-#else
-	printf("%d Bytes = %.2f KiB = %.2f MiB\n",
-			size, (double)size / 1.024e3,
-			(double)size / 1.048576e6);
-#endif
-}
-
-#if IMAGE_ENABLE_TIMESTAMP
-void genimg_print_time(time_t timestamp)
-{
-#ifndef USE_HOSTCC
-	struct rtc_time tm;
-
-	rtc_to_tm(timestamp, &tm);
-	printf("%4d-%02d-%02d  %2d:%02d:%02d UTC\n",
-			tm.tm_year, tm.tm_mon, tm.tm_mday,
-			tm.tm_hour, tm.tm_min, tm.tm_sec);
-#else
-	printf("%s", ctime(&timestamp));
-#endif
-}
-#endif
-
 const table_entry_t *get_table_entry(const table_entry_t *table, int id)
 {
 	for (; table->id >= 0; ++table) {
diff --git a/tools/Makefile b/tools/Makefile
index d020c55d664..2b4bc547abd 100644
--- a/tools/Makefile
+++ b/tools/Makefile
@@ -94,6 +94,7 @@ dumpimage-mkimage-objs := aisimage.o \
 			lib/fdtdec_common.o \
 			lib/fdtdec.o \
 			common/image.o \
+			common/image-host.o \
 			imagetool.o \
 			imximage.o \
 			imx8image.o \
-- 
2.31.1.607.g51e8a6a459-goog

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

* [PATCH v2 13/50] image: Create a function to do manual relocation
  2021-05-06 14:23 [PATCH v2 00/50] image: Reduce #ifdefs and ad-hoc defines in image code Simon Glass
                   ` (11 preceding siblings ...)
  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 ` Simon Glass
  2021-05-06 14:24 ` [PATCH v2 14/50] image: Avoid #ifdefs for " Simon Glass
                   ` (36 subsequent siblings)
  49 siblings, 0 replies; 91+ messages in thread
From: Simon Glass @ 2021-05-06 14:24 UTC (permalink / raw)
  To: u-boot

Rather than adding an #ifdef and open-coding this calculation, add a
helper function to handle it. Use this in the image code.

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

(no changes since v1)

 common/image.c     | 33 +++++++--------------------------
 include/relocate.h | 24 +++++++++++++++++++++++-
 2 files changed, 30 insertions(+), 27 deletions(-)

diff --git a/common/image.c b/common/image.c
index 0ef8f30fcfa..086ae609f29 100644
--- a/common/image.c
+++ b/common/image.c
@@ -63,6 +63,7 @@ DECLARE_GLOBAL_DATA_PTR;
 #include <image.h>
 #include <lz4.h>
 #include <imximage.h>
+#include <relocate.h>
 #include <linux/lzo.h>
 #include <linux/zstd.h>
 #include <linux/kconfig.h>
@@ -563,11 +564,7 @@ const char *genimg_get_cat_name(enum ih_category category, uint id)
 	entry = get_table_entry(table_info[category].table, id);
 	if (!entry)
 		return unknown_msg(category);
-#if defined(USE_HOSTCC) || !defined(CONFIG_NEEDS_MANUAL_RELOC)
-	return entry->lname;
-#else
-	return entry->lname + gd->reloc_off;
-#endif
+	return manual_reloc(entry->lname);
 }
 
 /**
@@ -587,11 +584,7 @@ const char *genimg_get_cat_short_name(enum ih_category category, uint id)
 	entry = get_table_entry(table_info[category].table, id);
 	if (!entry)
 		return unknown_msg(category);
-#if defined(USE_HOSTCC) || !defined(CONFIG_NEEDS_MANUAL_RELOC)
-	return entry->sname;
-#else
-	return entry->sname + gd->reloc_off;
-#endif
+	return manual_reloc(entry->sname);
 }
 
 int genimg_get_cat_count(enum ih_category category)
@@ -641,11 +634,7 @@ char *get_table_entry_name(const table_entry_t *table, char *msg, int id)
 	table = get_table_entry(table, id);
 	if (!table)
 		return msg;
-#if defined(USE_HOSTCC) || !defined(CONFIG_NEEDS_MANUAL_RELOC)
-	return table->lname;
-#else
-	return table->lname + gd->reloc_off;
-#endif
+	return manual_reloc(table->lname);
 }
 
 const char *genimg_get_os_name(uint8_t os)
@@ -675,11 +664,7 @@ static const char *genimg_get_short_name(const table_entry_t *table, int val)
 	table = get_table_entry(table, val);
 	if (!table)
 		return "unknown";
-#if defined(USE_HOSTCC) || !defined(CONFIG_NEEDS_MANUAL_RELOC)
-	return table->sname;
-#else
-	return table->sname + gd->reloc_off;
-#endif
+	return manual_reloc(table->sname);
 }
 
 const char *genimg_get_type_short_name(uint8_t type)
@@ -722,12 +707,8 @@ int get_table_entry_id(const table_entry_t *table,
 	const table_entry_t *t;
 
 	for (t = table; t->id >= 0; ++t) {
-#if !defined(USE_HOSTCC) && defined(CONFIG_NEEDS_MANUAL_RELOC)
-		if (t->sname && strcasecmp(t->sname + gd->reloc_off, name) == 0)
-#else
-		if (t->sname && strcasecmp(t->sname, name) == 0)
-#endif
-			return (t->id);
+		if (t->sname && !strcasecmp(manual_reloc(t->sname), name))
+			return t->id;
 	}
 	debug("Invalid %s Type: %s\n", table_name, name);
 
diff --git a/include/relocate.h b/include/relocate.h
index 9ceeecdbe71..c4fad336128 100644
--- a/include/relocate.h
+++ b/include/relocate.h
@@ -7,7 +7,11 @@
 #ifndef _RELOCATE_H_
 #define _RELOCATE_H_
 
-#include <common.h>
+#ifndef USE_HOSTCC
+#include <asm/global_data.h>
+
+DECLARE_GLOBAL_DATA_PTR;
+#endif
 
 /**
  * copy_uboot_to_ram() - Copy U-Boot to its new relocated position
@@ -35,4 +39,22 @@ int clear_bss(void);
  */
 int do_elf_reloc_fixups(void);
 
+/**
+ * manual_reloc() - Manually relocate a pointer if needed
+ *
+ * This is a nop in almost all cases, except for the systems with a broken gcc
+ * which need to manually relocate some things.
+ *
+ * @ptr: Pointer to relocate
+ * @return new pointer value
+ */
+static inline void *manual_reloc(void *ptr)
+{
+#ifndef USE_HOSTCC
+	if (IS_ENABLED(CONFIG_NEEDS_MANUAL_RELOC))
+		return ptr + gd->reloc_off;
+#endif
+		return ptr;
+}
+
 #endif	/* _RELOCATE_H_ */
-- 
2.31.1.607.g51e8a6a459-goog

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

* [PATCH v2 14/50] image: Avoid #ifdefs for manual relocation
  2021-05-06 14:23 [PATCH v2 00/50] image: Reduce #ifdefs and ad-hoc defines in image code Simon Glass
                   ` (12 preceding siblings ...)
  2021-05-06 14:24 ` [PATCH v2 13/50] image: Create a function to do manual relocation Simon Glass
@ 2021-05-06 14:24 ` Simon Glass
  2021-05-06 14:24 ` [PATCH v2 15/50] image: Remove ifdefs around image_setup_linux() el at Simon Glass
                   ` (35 subsequent siblings)
  49 siblings, 0 replies; 91+ messages in thread
From: Simon Glass @ 2021-05-06 14:24 UTC (permalink / raw)
  To: u-boot

Add a macro to handle manually relocating a pointer. Update the iamge code
to use this to avoid needing #ifdefs.

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

(no changes since v1)

 common/image-sig.c | 43 ++++++++++++++++++++++++-------------------
 include/relocate.h |  6 ++++++
 2 files changed, 30 insertions(+), 19 deletions(-)

diff --git a/common/image-sig.c b/common/image-sig.c
index 0f8e592aba7..12310bfca1a 100644
--- a/common/image-sig.c
+++ b/common/image-sig.c
@@ -16,6 +16,7 @@
 DECLARE_GLOBAL_DATA_PTR;
 #endif /* !USE_HOSTCC*/
 #include <image.h>
+#include <relocate.h>
 #include <u-boot/ecdsa.h>
 #include <u-boot/rsa.h>
 #include <u-boot/hash-checksum.h>
@@ -112,20 +113,22 @@ struct checksum_algo *image_get_checksum_algo(const char *full_name)
 	int i;
 	const char *name;
 
-#if !defined(USE_HOSTCC) && defined(CONFIG_NEEDS_MANUAL_RELOC)
-	static bool done;
+	if (IS_ENABLED(CONFIG_NEEDS_MANUAL_RELOC)) {
+		static bool done;
 
-	if (!done) {
-		done = true;
-		for (i = 0; i < ARRAY_SIZE(checksum_algos); i++) {
-			checksum_algos[i].name += gd->reloc_off;
+		if (!done) {
+			done = true;
+			for (i = 0; i < ARRAY_SIZE(checksum_algos); i++) {
+				struct checksum_algo *algo = &checksum_algos[i];
+
+				MANUAL_RELOC(algo->name);
 #if IMAGE_ENABLE_SIGN
-			checksum_algos[i].calculate_sign += gd->reloc_off;
+				MANUAL_RELOC(algo->calculate_sign);
 #endif
-			checksum_algos[i].calculate += gd->reloc_off;
+				MANUAL_RELOC(algo->calculate);
+			}
 		}
 	}
-#endif
 
 	for (i = 0; i < ARRAY_SIZE(checksum_algos); i++) {
 		name = checksum_algos[i].name;
@@ -143,19 +146,21 @@ struct crypto_algo *image_get_crypto_algo(const char *full_name)
 	int i;
 	const char *name;
 
-#if !defined(USE_HOSTCC) && defined(CONFIG_NEEDS_MANUAL_RELOC)
-	static bool done;
+	if (IS_ENABLED(CONFIG_NEEDS_MANUAL_RELOC)) {
+		static bool done;
 
-	if (!done) {
-		done = true;
-		for (i = 0; i < ARRAY_SIZE(crypto_algos); i++) {
-			crypto_algos[i].name += gd->reloc_off;
-			crypto_algos[i].sign += gd->reloc_off;
-			crypto_algos[i].add_verify_data += gd->reloc_off;
-			crypto_algos[i].verify += gd->reloc_off;
+		if (!done) {
+			done = true;
+			for (i = 0; i < ARRAY_SIZE(crypto_algos); i++) {
+				struct crypto_algo *algo = &crypto_algos[i];
+
+				MANUAL_RELOC(algo->name);
+				MANUAL_RELOC(algo->sign);
+				MANUAL_RELOC(algo->add_verify_data);
+				MANUAL_RELOC(algo->verify);
+			}
 		}
 	}
-#endif
 
 	/* Move name to after the comma */
 	name = strchr(full_name, ',');
diff --git a/include/relocate.h b/include/relocate.h
index c4fad336128..26682da955f 100644
--- a/include/relocate.h
+++ b/include/relocate.h
@@ -57,4 +57,10 @@ static inline void *manual_reloc(void *ptr)
 		return ptr;
 }
 
+#if !defined(USE_HOSTCC) && defined(CONFIG_NEEDS_MANUAL_RELOC)
+#define MANUAL_RELOC(ptr)	(ptr) = manual_reloc(ptr)
+#else
+#define MANUAL_RELOC(ptr)	(void)(ptr)
+#endif
+
 #endif	/* _RELOCATE_H_ */
-- 
2.31.1.607.g51e8a6a459-goog

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

* [PATCH v2 15/50] image: Remove ifdefs around image_setup_linux() el at
  2021-05-06 14:23 [PATCH v2 00/50] image: Reduce #ifdefs and ad-hoc defines in image code Simon Glass
                   ` (13 preceding siblings ...)
  2021-05-06 14:24 ` [PATCH v2 14/50] image: Avoid #ifdefs for " Simon Glass
@ 2021-05-06 14:24 ` Simon Glass
  2021-05-06 14:24 ` [PATCH v2 16/50] image: Add Kconfig options for FIT in the host build Simon Glass
                   ` (34 subsequent siblings)
  49 siblings, 0 replies; 91+ messages in thread
From: Simon Glass @ 2021-05-06 14:24 UTC (permalink / raw)
  To: u-boot

Drop some more ifdefs in image-board.c and also the FPGA part of bootm.c
which calls into it.

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

(no changes since v1)

 common/bootm.c       | 16 ++++++++--------
 common/image-board.c | 11 +++--------
 2 files changed, 11 insertions(+), 16 deletions(-)

diff --git a/common/bootm.c b/common/bootm.c
index ea71522d0c9..fe17d1da9e5 100644
--- a/common/bootm.c
+++ b/common/bootm.c
@@ -296,15 +296,15 @@ int bootm_find_images(int flag, int argc, char *const argv[], ulong start,
 #endif
 
 #if IMAGE_ENABLE_FIT
-#if defined(CONFIG_FPGA)
-	/* find bitstreams */
-	ret = boot_get_fpga(argc, argv, &images, IH_ARCH_DEFAULT,
-			    NULL, NULL);
-	if (ret) {
-		printf("FPGA image is corrupted or invalid\n");
-		return 1;
+	if (IS_ENABLED(CONFIG_FPGA)) {
+		/* find bitstreams */
+		ret = boot_get_fpga(argc, argv, &images, IH_ARCH_DEFAULT,
+				    NULL, NULL);
+		if (ret) {
+			printf("FPGA image is corrupted or invalid\n");
+			return 1;
+		}
 	}
-#endif
 
 	/* find all of the loadables */
 	ret = boot_get_loadable(argc, argv, &images, IH_ARCH_DEFAULT,
diff --git a/common/image-board.c b/common/image-board.c
index b46062c86b9..0f41ede1e98 100644
--- a/common/image-board.c
+++ b/common/image-board.c
@@ -814,7 +814,6 @@ int boot_get_loadable(int argc, char *const argv[], bootm_headers_t *images,
 }
 #endif
 
-#ifdef CONFIG_SYS_BOOT_GET_CMDLINE
 /**
  * boot_get_cmdline - allocate and initialize kernel cmdline
  * @lmb: pointer to lmb handle, will be used for memory mgmt
@@ -853,9 +852,7 @@ int boot_get_cmdline(struct lmb *lmb, ulong *cmd_start, ulong *cmd_end)
 
 	return 0;
 }
-#endif /* CONFIG_SYS_BOOT_GET_CMDLINE */
 
-#ifdef CONFIG_SYS_BOOT_GET_KBD
 /**
  * boot_get_kbd - allocate and initialize kernel copy of board info
  * @lmb: pointer to lmb handle, will be used for memory mgmt
@@ -883,15 +880,14 @@ int boot_get_kbd(struct lmb *lmb, struct bd_info **kbd)
 
 	debug("## kernel board info at 0x%08lx\n", (ulong)*kbd);
 
-#if defined(DEBUG) && defined(CONFIG_CMD_BDI)
-	do_bdinfo(NULL, 0, 0, NULL);
+#if defined(DEBUG)
+	if (IS_ENABLED(CONFIG_CMD_BDI)
+		do_bdinfo(NULL, 0, 0, NULL);
 #endif
 
 	return 0;
 }
-#endif /* CONFIG_SYS_BOOT_GET_KBD */
 
-#ifdef CONFIG_LMB
 int image_setup_linux(bootm_headers_t *images)
 {
 	ulong of_size = images->ft_len;
@@ -925,7 +921,6 @@ int image_setup_linux(bootm_headers_t *images)
 
 	return 0;
 }
-#endif /* CONFIG_LMB */
 
 void genimg_print_size(uint32_t size)
 {
-- 
2.31.1.607.g51e8a6a459-goog

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

* [PATCH v2 16/50] image: Add Kconfig options for FIT in the host build
  2021-05-06 14:23 [PATCH v2 00/50] image: Reduce #ifdefs and ad-hoc defines in image code Simon Glass
                   ` (14 preceding siblings ...)
  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 ` Simon Glass
  2021-05-11 19:57   ` Alex G.
  2021-05-06 14:24 ` [PATCH v2 17/50] kconfig: Add host support to CONFIG_IS_ENABLED() Simon Glass
                   ` (33 subsequent siblings)
  49 siblings, 1 reply; 91+ messages in thread
From: Simon Glass @ 2021-05-06 14:24 UTC (permalink / raw)
  To: u-boot

In preparation for enabling CONFIG_IS_ENABLED() on the host build, add
some options to enable the various FIT options expected in these tools.
This will ensure that the code builds correctly when CONFIG_HOST_xxx
is distinct from CONFIG_xxx.

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

(no changes since v1)

 common/image-fit-sig.c |  3 ++-
 common/image-fit.c     |  4 ++--
 tools/Kconfig          | 25 +++++++++++++++++++++++++
 tools/Makefile         | 18 +++++++++---------
 4 files changed, 38 insertions(+), 12 deletions(-)

diff --git a/common/image-fit-sig.c b/common/image-fit-sig.c
index 55ddf1879ed..12a6745c642 100644
--- a/common/image-fit-sig.c
+++ b/common/image-fit-sig.c
@@ -72,11 +72,12 @@ static int fit_image_setup_verify(struct image_sign_info *info,
 	char *algo_name;
 	const char *padding_name;
 
+#ifndef USE_HOSTCC
 	if (fdt_totalsize(fit) > CONFIG_FIT_SIGNATURE_MAX_SIZE) {
 		*err_msgp = "Total size too large";
 		return 1;
 	}
-
+#endif
 	if (fit_image_hash_get_algo(fit, noffset, &algo_name)) {
 		*err_msgp = "Can't get hash algo property";
 		return -1;
diff --git a/common/image-fit.c b/common/image-fit.c
index e614643fe39..a16e2dd54a5 100644
--- a/common/image-fit.c
+++ b/common/image-fit.c
@@ -165,7 +165,7 @@ int fit_get_subimage_count(const void *fit, int images_noffset)
 	return count;
 }
 
-#if CONFIG_IS_ENABLED(FIT_PRINT) || CONFIG_IS_ENABLED(SPL_FIT_PRINT)
+#if CONFIG_IS_ENABLED(FIT_PRINT)
 /**
  * fit_image_print_data() - prints out the hash node details
  * @fit: pointer to the FIT format image header
@@ -573,7 +573,7 @@ void fit_image_print(const void *fit, int image_noffset, const char *p)
 #else
 void fit_print_contents(const void *fit) { }
 void fit_image_print(const void *fit, int image_noffset, const char *p) { }
-#endif /* CONFIG_IS_ENABLED(FIR_PRINT) || CONFIG_IS_ENABLED(SPL_FIT_PRINT) */
+#endif /* CONFIG_IS_ENABLED(FIT_PRINT) */
 
 /**
  * fit_get_desc - get node description property
diff --git a/tools/Kconfig b/tools/Kconfig
index b2f5012240c..f00ab661135 100644
--- a/tools/Kconfig
+++ b/tools/Kconfig
@@ -9,4 +9,29 @@ config MKIMAGE_DTC_PATH
 	  some cases the system dtc may not support all required features
 	  and the path to a different version should be given here.
 
+config HOST_FIT
+	def_bool y
+	help
+	  Enable FIT support in the host build.
+
+config HOST_FIT_FULL_CHECK
+	def_bool y
+	help
+	  Do a full check of the FIT before using it in the host build
+
+config HOST_FIT_PRINT
+	def_bool y
+	help
+	  Print the content of the FIT verbosely in the host build
+
+config HOST_FIT_SIGNATURE
+	def_bool y
+	help
+	  Enable signature verification of FIT uImages in the host build
+
+config HOST_FIT_SIGNATURE_MAX_SIZE
+	hex
+	depends on HOST_FIT_SIGNATURE
+	default 0x10000000
+
 endmenu
diff --git a/tools/Makefile b/tools/Makefile
index 2b4bc547abd..d143198f7c9 100644
--- a/tools/Makefile
+++ b/tools/Makefile
@@ -53,12 +53,12 @@ hostprogs-y += mkenvimage
 mkenvimage-objs := mkenvimage.o os_support.o lib/crc32.o
 
 hostprogs-y += dumpimage mkimage
-hostprogs-$(CONFIG_FIT_SIGNATURE) += fit_info fit_check_sign
+hostprogs-$(CONFIG_HOST_FIT_SIGNATURE) += fit_info fit_check_sign
 
 hostprogs-$(CONFIG_CMD_BOOTEFI_SELFTEST) += file2include
 
-FIT_OBJS-$(CONFIG_FIT) := fit_common.o fit_image.o image-host.o common/image-fit.o
-FIT_SIG_OBJS-$(CONFIG_FIT_SIGNATURE) := common/image-sig.o common/image-fit-sig.o
+FIT_OBJS-$(CONFIG_HOST_FIT) := fit_common.o fit_image.o image-host.o common/image-fit.o
+FIT_SIG_OBJS-$(CONFIG_HOST_FIT_SIGNATURE) := common/image-sig.o common/image-fit-sig.o
 FIT_CIPHER_OBJS-$(CONFIG_FIT_CIPHER) := common/image-cipher.o
 
 # The following files are synced with upstream DTC.
@@ -66,17 +66,17 @@ FIT_CIPHER_OBJS-$(CONFIG_FIT_CIPHER) := common/image-cipher.o
 LIBFDT_OBJS := $(addprefix libfdt/, fdt.o fdt_ro.o fdt_wip.o fdt_sw.o fdt_rw.o \
 		fdt_strerror.o fdt_empty_tree.o fdt_addresses.o fdt_overlay.o)
 
-RSA_OBJS-$(CONFIG_FIT_SIGNATURE) := $(addprefix lib/rsa/, \
+RSA_OBJS-$(CONFIG_HOST_FIT_SIGNATURE) := $(addprefix lib/rsa/, \
 					rsa-sign.o rsa-verify.o \
 					rsa-mod-exp.o)
 
-ECDSA_OBJS-$(CONFIG_FIT_SIGNATURE) := $(addprefix lib/ecdsa/, ecdsa-libcrypto.o)
+ECDSA_OBJS-$(CONFIG_HOST_FIT_SIGNATURE) := $(addprefix lib/ecdsa/, ecdsa-libcrypto.o)
 
 AES_OBJS-$(CONFIG_FIT_CIPHER) := $(addprefix lib/aes/, \
 					aes-encrypt.o aes-decrypt.o)
 
 # Cryptographic helpers that depend on openssl/libcrypto
-LIBCRYPTO_OBJS-$(CONFIG_FIT_SIGNATURE) := $(addprefix lib/, \
+LIBCRYPTO_OBJS-$(CONFIG_HOST_FIT_SIGNATURE) := $(addprefix lib/, \
 					fdt-libcrypto.o)
 
 ROCKCHIP_OBS = lib/rc4.o rkcommon.o rkimage.o rksd.o rkspi.o
@@ -137,13 +137,13 @@ fit_info-objs   := $(dumpimage-mkimage-objs) fit_info.o
 fit_check_sign-objs   := $(dumpimage-mkimage-objs) fit_check_sign.o
 file2include-objs := file2include.o
 
-ifneq ($(CONFIG_MX23)$(CONFIG_MX28)$(CONFIG_FIT_SIGNATURE),)
+ifneq ($(CONFIG_MX23)$(CONFIG_MX28)$(CONFIG_HOST_FIT_SIGNATURE),)
 # Add CONFIG_MXS into host CFLAGS, so we can check whether or not register
 # the mxsimage support within tools/mxsimage.c .
 HOSTCFLAGS_mxsimage.o += -DCONFIG_MXS
 endif
 
-ifdef CONFIG_FIT_SIGNATURE
+ifdef CONFIG_HOST_FIT_SIGNATURE
 # This affects include/image.h, but including the board config file
 # is tricky, so manually define this options here.
 HOST_EXTRACFLAGS	+= -DCONFIG_FIT_SIGNATURE
@@ -165,7 +165,7 @@ HOSTCFLAGS_kwbimage.o += -DCONFIG_KWB_SECURE
 endif
 
 # MXSImage needs LibSSL
-ifneq ($(CONFIG_MX23)$(CONFIG_MX28)$(CONFIG_ARMADA_38X)$(CONFIG_FIT_SIGNATURE)$(CONFIG_FIT_CIPHER),)
+ifneq ($(CONFIG_MX23)$(CONFIG_MX28)$(CONFIG_ARMADA_38X)$(CONFIG_HOST_FIT_SIGNATURE)$(CONFIG_FIT_CIPHER),)
 HOSTCFLAGS_kwbimage.o += \
 	$(shell pkg-config --cflags libssl libcrypto 2> /dev/null || echo "")
 HOSTLDLIBS_mkimage += \
-- 
2.31.1.607.g51e8a6a459-goog

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

* [PATCH v2 17/50] kconfig: Add host support to CONFIG_IS_ENABLED()
  2021-05-06 14:23 [PATCH v2 00/50] image: Reduce #ifdefs and ad-hoc defines in image code Simon Glass
                   ` (15 preceding siblings ...)
  2021-05-06 14:24 ` [PATCH v2 16/50] image: Add Kconfig options for FIT in the host build Simon Glass
@ 2021-05-06 14:24 ` Simon Glass
  2021-05-06 14:24 ` [PATCH v2 18/50] image: Shorten FIT_ENABLE_SHAxxx_SUPPORT Simon Glass
                   ` (32 subsequent siblings)
  49 siblings, 0 replies; 91+ messages in thread
From: Simon Glass @ 2021-05-06 14:24 UTC (permalink / raw)
  To: u-boot

At present we must separately test for the host build for many options,
since we force them to be enabled. For example, CONFIG_FIT is always
enabled in the host tools, even if CONFIG_FIT is not enabled by the
board itself.

It would be more convenient if we could use, for example,
CONFIG_IS_ENABLED(FIT) and get CONFIG_HOST_FIT, when building for the
host. Add support for this.

Signed-off-by: Simon Glass <sjg@chromium.org>
Suggested-by: Rasmus Villemoes <rasmus.villemoes@prevas.dk> # b4f73886
---

Changes in v2:
- Fix up comment to put an underscore after every CONFIG
- Correct comment about USE_HOSTCC being undefined in CONFIG_VAL()

 include/linux/kconfig.h | 13 ++++++++++---
 1 file changed, 10 insertions(+), 3 deletions(-)

diff --git a/include/linux/kconfig.h b/include/linux/kconfig.h
index d109ed3119e..179b9fd1e0d 100644
--- a/include/linux/kconfig.h
+++ b/include/linux/kconfig.h
@@ -31,11 +31,14 @@
 	(config_enabled(option))
 
 /*
- * U-Boot add-on: Helper macros to reference to different macros
- * (CONFIG_ or CONFIG_SPL_ prefixed), depending on the build context.
+ * U-Boot add-on: Helper macros to reference to different macros (prefixed by
+ * CONFIG_, CONFIG_SPL_, CONFIG_TPL_ or CONFIG_HOST_), depending on the build
+ * context.
  */
 
-#if defined(CONFIG_TPL_BUILD)
+#ifdef USE_HOSTCC
+#define _CONFIG_PREFIX HOST_
+#elif defined(CONFIG_TPL_BUILD)
 #define _CONFIG_PREFIX TPL_
 #elif defined(CONFIG_SPL_BUILD)
 #define _CONFIG_PREFIX SPL_
@@ -49,6 +52,7 @@
 
 /*
  * CONFIG_VAL(FOO) evaluates to the value of
+ *  CONFIG_HOST_FOO if USE_HOSTCC is defined,
  *  CONFIG_FOO if CONFIG_SPL_BUILD is undefined,
  *  CONFIG_SPL_FOO if CONFIG_SPL_BUILD is defined.
  *  CONFIG_TPL_FOO if CONFIG_TPL_BUILD is defined.
@@ -76,18 +80,21 @@
 
 /*
  * CONFIG_IS_ENABLED(FOO) expands to
+ *  1 if USE_HOSTCC is defined and CONFIG_HOST_FOO is set to 'y',
  *  1 if CONFIG_SPL_BUILD is undefined and CONFIG_FOO is set to 'y',
  *  1 if CONFIG_SPL_BUILD is defined and CONFIG_SPL_FOO is set to 'y',
  *  1 if CONFIG_TPL_BUILD is defined and CONFIG_TPL_FOO is set to 'y',
  *  0 otherwise.
  *
  * CONFIG_IS_ENABLED(FOO, (abc)) expands to
+ *  abc if USE_HOSTCC is defined and CONFIG_HOST_FOO is set to 'y',
  *  abc if CONFIG_SPL_BUILD is undefined and CONFIG_FOO is set to 'y',
  *  abc if CONFIG_SPL_BUILD is defined and CONFIG_SPL_FOO is set to 'y',
  *  abc if CONFIG_TPL_BUILD is defined and CONFIG_TPL_FOO is set to 'y',
  *  nothing otherwise.
  *
  * CONFIG_IS_ENABLED(FOO, (abc), (def)) expands to
+ *  abc if USE_HOSTCC is defined and CONFIG_HOST_FOO is set to 'y',
  *  abc if CONFIG_SPL_BUILD is undefined and CONFIG_FOO is set to 'y',
  *  abc if CONFIG_SPL_BUILD is defined and CONFIG_SPL_FOO is set to 'y',
  *  abc if CONFIG_TPL_BUILD is defined and CONFIG_TPL_FOO is set to 'y',
-- 
2.31.1.607.g51e8a6a459-goog

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

* [PATCH v2 18/50] image: Shorten FIT_ENABLE_SHAxxx_SUPPORT
  2021-05-06 14:23 [PATCH v2 00/50] image: Reduce #ifdefs and ad-hoc defines in image code Simon Glass
                   ` (16 preceding siblings ...)
  2021-05-06 14:24 ` [PATCH v2 17/50] kconfig: Add host support to CONFIG_IS_ENABLED() Simon Glass
@ 2021-05-06 14:24 ` 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
                   ` (31 subsequent siblings)
  49 siblings, 1 reply; 91+ messages in thread
From: Simon Glass @ 2021-05-06 14:24 UTC (permalink / raw)
  To: u-boot

The ENABLE part of this name is redundant, since all boolean Kconfig
options serve to enable something. The SUPPORT part is also redundant
since Kconfigs can be assumed to enable support for something. Together
they just serve to make these options overly long and inconsistent
with other options.

Rename FIT_ENABLE_SHAxxx_SUPPORT to FIT_SHAxxx

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

(no changes since v1)

 common/Kconfig.boot              |  6 +++---
 configs/mt8516_pumpkin_defconfig |  2 +-
 include/image.h                  | 12 ++++++------
 3 files changed, 10 insertions(+), 10 deletions(-)

diff --git a/common/Kconfig.boot b/common/Kconfig.boot
index 5a18d62d780..af3325a7ce2 100644
--- a/common/Kconfig.boot
+++ b/common/Kconfig.boot
@@ -35,7 +35,7 @@ config FIT_EXTERNAL_OFFSET
 	  could be put in the hole between data payload and fit image
 	  header, such as CSF data on i.MX platform.
 
-config FIT_ENABLE_SHA256_SUPPORT
+config FIT_SHA256
 	bool "Support SHA256 checksum of FIT image contents"
 	default y
 	select SHA256
@@ -44,7 +44,7 @@ config FIT_ENABLE_SHA256_SUPPORT
 	  SHA256 checksum is a 256-bit (32-byte) hash value used to check that
 	  the image contents have not been corrupted.
 
-config FIT_ENABLE_SHA384_SUPPORT
+config FIT_SHA384
 	bool "Support SHA384 checksum of FIT image contents"
 	default n
 	select SHA384
@@ -54,7 +54,7 @@ config FIT_ENABLE_SHA384_SUPPORT
 	  the image contents have not been corrupted. Use this for the highest
 	  security.
 
-config FIT_ENABLE_SHA512_SUPPORT
+config FIT_SHA512
 	bool "Support SHA512 checksum of FIT image contents"
 	default n
 	select SHA512
diff --git a/configs/mt8516_pumpkin_defconfig b/configs/mt8516_pumpkin_defconfig
index 5270ec28cbd..d330c03db3c 100644
--- a/configs/mt8516_pumpkin_defconfig
+++ b/configs/mt8516_pumpkin_defconfig
@@ -13,7 +13,7 @@ CONFIG_DEBUG_UART_CLOCK=26000000
 CONFIG_DEFAULT_DEVICE_TREE="mt8516-pumpkin"
 CONFIG_DEBUG_UART=y
 CONFIG_FIT=y
-# CONFIG_FIT_ENABLE_SHA256_SUPPORT is not set
+# CONFIG_FIT_SHA256 is not set
 # CONFIG_ARCH_FIXUP_FDT_MEMORY is not set
 CONFIG_DEFAULT_FDT_FILE="mt8516-pumpkin"
 # CONFIG_DISPLAY_BOARDINFO is not set
diff --git a/include/image.h b/include/image.h
index 459685d4d43..9319a779b93 100644
--- a/include/image.h
+++ b/include/image.h
@@ -31,9 +31,9 @@ struct fdt_region;
 #define IMAGE_ENABLE_OF_LIBFDT	1
 #define CONFIG_FIT_VERBOSE	1 /* enable fit_format_{error,warning}() */
 #define CONFIG_FIT_ENABLE_RSASSA_PSS_SUPPORT 1
-#define CONFIG_FIT_ENABLE_SHA256_SUPPORT
-#define CONFIG_FIT_ENABLE_SHA384_SUPPORT
-#define CONFIG_FIT_ENABLE_SHA512_SUPPORT
+#define CONFIG_FIT_SHA256
+#define CONFIG_FIT_SHA384
+#define CONFIG_FIT_SHA512
 #define CONFIG_SHA1
 #define CONFIG_SHA256
 #define CONFIG_SHA384
@@ -89,21 +89,21 @@ struct fdt_region;
 #define IMAGE_ENABLE_SHA1	0
 #endif
 
-#if defined(CONFIG_FIT_ENABLE_SHA256_SUPPORT) || \
+#if defined(CONFIG_FIT_SHA256) || \
 	defined(CONFIG_SPL_SHA256_SUPPORT)
 #define IMAGE_ENABLE_SHA256	1
 #else
 #define IMAGE_ENABLE_SHA256	0
 #endif
 
-#if defined(CONFIG_FIT_ENABLE_SHA384_SUPPORT) || \
+#if defined(CONFIG_FIT_SHA384) || \
 	defined(CONFIG_SPL_SHA384_SUPPORT)
 #define IMAGE_ENABLE_SHA384	1
 #else
 #define IMAGE_ENABLE_SHA384	0
 #endif
 
-#if defined(CONFIG_FIT_ENABLE_SHA512_SUPPORT) || \
+#if defined(CONFIG_FIT_SHA512) || \
 	defined(CONFIG_SPL_SHA512_SUPPORT)
 #define IMAGE_ENABLE_SHA512	1
 #else
-- 
2.31.1.607.g51e8a6a459-goog

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

* [PATCH v2 19/50] image: Rename SPL_SHAxxx_SUPPORT to SPL_FIT_SHAxxx
  2021-05-06 14:23 [PATCH v2 00/50] image: Reduce #ifdefs and ad-hoc defines in image code Simon Glass
                   ` (17 preceding siblings ...)
  2021-05-06 14:24 ` [PATCH v2 18/50] image: Shorten FIT_ENABLE_SHAxxx_SUPPORT Simon Glass
@ 2021-05-06 14:24 ` 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
                   ` (30 subsequent siblings)
  49 siblings, 1 reply; 91+ messages in thread
From: Simon Glass @ 2021-05-06 14:24 UTC (permalink / raw)
  To: u-boot

These option are named inconsistently with other SPL options, thus making
them incompatible with the CONFIG_IS_ENABLED() macro. Rename them.

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

(no changes since v1)

 common/spl/Kconfig | 8 ++++----
 include/image.h    | 8 ++++----
 2 files changed, 8 insertions(+), 8 deletions(-)

diff --git a/common/spl/Kconfig b/common/spl/Kconfig
index df5468f1ac2..d94b9892175 100644
--- a/common/spl/Kconfig
+++ b/common/spl/Kconfig
@@ -429,7 +429,7 @@ config SPL_MD5_SUPPORT
 	  applications where images may be changed maliciously, you should
 	  consider SHA256 or SHA384.
 
-config SPL_SHA1_SUPPORT
+config SPL_FIT_SHA1
 	bool "Support SHA1"
 	depends on SPL_FIT
 	select SHA1
@@ -441,7 +441,7 @@ config SPL_SHA1_SUPPORT
 	  due to the expanding computing power available to brute-force
 	  attacks. For more security, consider SHA256 or SHA384.
 
-config SPL_SHA256_SUPPORT
+config SPL_FIT_SHA256
 	bool "Support SHA256"
 	depends on SPL_FIT
 	select SHA256
@@ -450,7 +450,7 @@ config SPL_SHA256_SUPPORT
 	  checksum is a 256-bit (32-byte) hash value used to check that the
 	  image contents have not been corrupted.
 
-config SPL_SHA384_SUPPORT
+config SPL_FIT_SHA384
 	bool "Support SHA384"
 	depends on SPL_FIT
 	select SHA384
@@ -461,7 +461,7 @@ config SPL_SHA384_SUPPORT
 	  image contents have not been corrupted. Use this for the highest
 	  security.
 
-config SPL_SHA512_SUPPORT
+config SPL_FIT_SHA512
 	bool "Support SHA512"
 	depends on SPL_FIT
 	select SHA512
diff --git a/include/image.h b/include/image.h
index 9319a779b93..3284f36c97a 100644
--- a/include/image.h
+++ b/include/image.h
@@ -68,7 +68,7 @@ struct fdt_region;
 #  ifdef CONFIG_SPL_MD5_SUPPORT
 #   define IMAGE_ENABLE_MD5	1
 #  endif
-#  ifdef CONFIG_SPL_SHA1_SUPPORT
+#  ifdef CONFIG_SPL_FIT_SHA1
 #   define IMAGE_ENABLE_SHA1	1
 #  endif
 # else
@@ -90,21 +90,21 @@ struct fdt_region;
 #endif
 
 #if defined(CONFIG_FIT_SHA256) || \
-	defined(CONFIG_SPL_SHA256_SUPPORT)
+	defined(CONFIG_SPL_FIT_SHA256)
 #define IMAGE_ENABLE_SHA256	1
 #else
 #define IMAGE_ENABLE_SHA256	0
 #endif
 
 #if defined(CONFIG_FIT_SHA384) || \
-	defined(CONFIG_SPL_SHA384_SUPPORT)
+	defined(CONFIG_SPL_FIT_SHA384)
 #define IMAGE_ENABLE_SHA384	1
 #else
 #define IMAGE_ENABLE_SHA384	0
 #endif
 
 #if defined(CONFIG_FIT_SHA512) || \
-	defined(CONFIG_SPL_SHA512_SUPPORT)
+	defined(CONFIG_SPL_FIT_SHA512)
 #define IMAGE_ENABLE_SHA512	1
 #else
 #define IMAGE_ENABLE_SHA512	0
-- 
2.31.1.607.g51e8a6a459-goog

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

* [PATCH v2 20/50] hash: Use Kconfig to enable hashing in host tools
  2021-05-06 14:23 [PATCH v2 00/50] image: Reduce #ifdefs and ad-hoc defines in image code Simon Glass
                   ` (18 preceding siblings ...)
  2021-05-06 14:24 ` [PATCH v2 19/50] image: Rename SPL_SHAxxx_SUPPORT to SPL_FIT_SHAxxx Simon Glass
@ 2021-05-06 14:24 ` Simon Glass
  2021-05-06 14:24 ` [PATCH v2 21/50] hash: Drop some #ifdefs in hash.c Simon Glass
                   ` (29 subsequent siblings)
  49 siblings, 0 replies; 91+ messages in thread
From: Simon Glass @ 2021-05-06 14:24 UTC (permalink / raw)
  To: u-boot

At present when building host tools, we force CONFIG_SHA1 to be enabled
regardless of the board Kconfig setting. This is done in the image.h
header file.

Clean this up by adding new Kconfig options to enable hashing on the host,
relying on CONFIG_IS_ENABLED() to deal with the different builds.

To make this work, we need to add hashing Kconfig options for SPL as well.

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

Changes in v2:
- Add SPL_ Kconfigs also, since otherwise hashing algorithms drop from SPL

 common/hash.c      | 37 ++++++++++++++-------------
 common/spl/Kconfig | 63 ++++++++++++++++++++++++++++++++++++++++++++++
 include/image.h    |  4 ---
 tools/Kconfig      | 20 +++++++++++++++
 4 files changed, 102 insertions(+), 22 deletions(-)

diff --git a/common/hash.c b/common/hash.c
index 10dff7ddb0e..987d238c66c 100644
--- a/common/hash.c
+++ b/common/hash.c
@@ -25,6 +25,7 @@
 #else
 #include "mkimage.h"
 #include <time.h>
+#include <linux/kconfig.h>
 #endif /* !USE_HOSTCC*/
 
 #include <hash.h>
@@ -41,7 +42,7 @@ DECLARE_GLOBAL_DATA_PTR;
 
 static void reloc_update(void);
 
-#if defined(CONFIG_SHA1) && !defined(CONFIG_SHA_PROG_HW_ACCEL)
+#if CONFIG_IS_ENABLED(SHA1) && !CONFIG_IS_ENABLED(SHA_PROG_HW_ACCEL)
 static int hash_init_sha1(struct hash_algo *algo, void **ctxp)
 {
 	sha1_context *ctx = malloc(sizeof(sha1_context));
@@ -69,7 +70,7 @@ static int hash_finish_sha1(struct hash_algo *algo, void *ctx, void *dest_buf,
 }
 #endif
 
-#if defined(CONFIG_SHA256) && !defined(CONFIG_SHA_PROG_HW_ACCEL)
+#if CONFIG_IS_ENABLED(SHA256) && !CONFIG_IS_ENABLED(SHA_PROG_HW_ACCEL)
 static int hash_init_sha256(struct hash_algo *algo, void **ctxp)
 {
 	sha256_context *ctx = malloc(sizeof(sha256_context));
@@ -97,7 +98,7 @@ static int hash_finish_sha256(struct hash_algo *algo, void *ctx, void
 }
 #endif
 
-#if defined(CONFIG_SHA384) && !defined(CONFIG_SHA_PROG_HW_ACCEL)
+#if CONFIG_IS_ENABLED(SHA384) && !CONFIG_IS_ENABLED(SHA_PROG_HW_ACCEL)
 static int hash_init_sha384(struct hash_algo *algo, void **ctxp)
 {
 	sha512_context *ctx = malloc(sizeof(sha512_context));
@@ -125,7 +126,7 @@ static int hash_finish_sha384(struct hash_algo *algo, void *ctx, void
 }
 #endif
 
-#if defined(CONFIG_SHA512) && !defined(CONFIG_SHA_PROG_HW_ACCEL)
+#if CONFIG_IS_ENABLED(SHA512) && !CONFIG_IS_ENABLED(SHA_PROG_HW_ACCEL)
 static int hash_init_sha512(struct hash_algo *algo, void **ctxp)
 {
 	sha512_context *ctx = malloc(sizeof(sha512_context));
@@ -213,17 +214,17 @@ static int hash_finish_crc32(struct hash_algo *algo, void *ctx, void *dest_buf,
  * Note that algorithm names must be in lower case.
  */
 static struct hash_algo hash_algo[] = {
-#ifdef CONFIG_SHA1
+#if CONFIG_IS_ENABLED(SHA1)
 	{
 		.name 		= "sha1",
 		.digest_size	= SHA1_SUM_LEN,
 		.chunk_size	= CHUNKSZ_SHA1,
-#ifdef CONFIG_SHA_HW_ACCEL
+#if CONFIG_IS_ENABLED(SHA_HW_ACCEL)
 		.hash_func_ws	= hw_sha1,
 #else
 		.hash_func_ws	= sha1_csum_wd,
 #endif
-#ifdef CONFIG_SHA_PROG_HW_ACCEL
+#if CONFIG_IS_ENABLED(SHA_PROG_HW_ACCEL)
 		.hash_init	= hw_sha_init,
 		.hash_update	= hw_sha_update,
 		.hash_finish	= hw_sha_finish,
@@ -234,17 +235,17 @@ static struct hash_algo hash_algo[] = {
 #endif
 	},
 #endif
-#ifdef CONFIG_SHA256
+#if CONFIG_IS_ENABLED(SHA256)
 	{
 		.name		= "sha256",
 		.digest_size	= SHA256_SUM_LEN,
 		.chunk_size	= CHUNKSZ_SHA256,
-#ifdef CONFIG_SHA_HW_ACCEL
+#if CONFIG_IS_ENABLED(SHA_HW_ACCEL)
 		.hash_func_ws	= hw_sha256,
 #else
 		.hash_func_ws	= sha256_csum_wd,
 #endif
-#ifdef CONFIG_SHA_PROG_HW_ACCEL
+#if CONFIG_IS_ENABLED(SHA_PROG_HW_ACCEL)
 		.hash_init	= hw_sha_init,
 		.hash_update	= hw_sha_update,
 		.hash_finish	= hw_sha_finish,
@@ -255,17 +256,17 @@ static struct hash_algo hash_algo[] = {
 #endif
 	},
 #endif
-#ifdef CONFIG_SHA384
+#if CONFIG_IS_ENABLED(SHA384)
 	{
 		.name		= "sha384",
 		.digest_size	= SHA384_SUM_LEN,
 		.chunk_size	= CHUNKSZ_SHA384,
-#ifdef CONFIG_SHA_HW_ACCEL
+#if CONFIG_IS_ENABLED(SHA_HW_ACCEL)
 		.hash_func_ws	= hw_sha384,
 #else
 		.hash_func_ws	= sha384_csum_wd,
 #endif
-#ifdef CONFIG_SHA_PROG_HW_ACCEL
+#if CONFIG_IS_ENABLED(SHA_PROG_HW_ACCEL)
 		.hash_init	= hw_sha_init,
 		.hash_update	= hw_sha_update,
 		.hash_finish	= hw_sha_finish,
@@ -276,17 +277,17 @@ static struct hash_algo hash_algo[] = {
 #endif
 	},
 #endif
-#ifdef CONFIG_SHA512
+#if CONFIG_IS_ENABLED(SHA512)
 	{
 		.name		= "sha512",
 		.digest_size	= SHA512_SUM_LEN,
 		.chunk_size	= CHUNKSZ_SHA512,
-#ifdef CONFIG_SHA_HW_ACCEL
+#if CONFIG_IS_ENABLED(SHA_HW_ACCEL)
 		.hash_func_ws	= hw_sha512,
 #else
 		.hash_func_ws	= sha512_csum_wd,
 #endif
-#ifdef CONFIG_SHA_PROG_HW_ACCEL
+#if CONFIG_IS_ENABLED(SHA_PROG_HW_ACCEL)
 		.hash_init	= hw_sha_init,
 		.hash_update	= hw_sha_update,
 		.hash_finish	= hw_sha_finish,
@@ -318,9 +319,9 @@ static struct hash_algo hash_algo[] = {
 };
 
 /* Try to minimize code size for boards that don't want much hashing */
-#if defined(CONFIG_SHA256) || defined(CONFIG_CMD_SHA1SUM) || \
+#if CONFIG_IS_ENABLED(SHA256) || defined(CONFIG_CMD_SHA1SUM) || \
 	defined(CONFIG_CRC32_VERIFY) || defined(CONFIG_CMD_HASH) || \
-	defined(CONFIG_SHA384) || defined(CONFIG_SHA512)
+	CONFIG_IS_ENABLED(SHA384) || CONFIG_IS_ENABLED(SHA512)
 #define multi_hash()	1
 #else
 #define multi_hash()	0
diff --git a/common/spl/Kconfig b/common/spl/Kconfig
index d94b9892175..2570b220891 100644
--- a/common/spl/Kconfig
+++ b/common/spl/Kconfig
@@ -519,6 +519,69 @@ config SPL_HASH_SUPPORT
 	  this option to build system-specific drivers for hash acceleration
 	  as part of an SPL build.
 
+if SPL_HASH_SUPPORT
+
+config SPL_SHA1
+	bool "Enable SHA1 support in SPL"
+	depends on SHA1
+	default y
+	help
+	  This option enables support of hashing using SHA1 algorithm.
+	  The hash is calculated in software.
+	  The SHA1 algorithm produces a 160-bit (20-byte) hash value
+	  (digest).
+
+config SPL_SHA256
+	bool "Enable SHA256 support in SPL"
+	depends on SHA256
+	default y
+	help
+	  This option enables support of hashing using SHA256 algorithm.
+	  The hash is calculated in software.
+	  The SHA256 algorithm produces a 256-bit (32-byte) hash value
+	  (digest).
+
+config SPL_SHA384
+	bool "Enable SHA384 support in SPL"
+	depends on SHA384
+	default y
+	help
+	  This option enables support of hashing using SHA384 algorithm.
+	  The hash is calculated in software.
+	  The SHA384 algorithm produces a 384-bit (48-byte) hash value
+	  (digest).
+
+config SPL_SHA512
+	bool "Enable SHA512 support in SPL"
+	depends on SHA512
+	default y
+	help
+	  This option enables support of hashing using SHA512 algorithm.
+	  The hash is calculated in software.
+	  The SHA512 algorithm produces a 512-bit (64-byte) hash value
+	  (digest).
+
+config SPL_SHA_HW_ACCEL
+	bool "Enable hashing using hardware in SPL"
+	depends on SHA_HW_ACCEL
+	default y
+	help
+	  This option enables hardware acceleration for SHA hashing.
+	  This affects the 'hash' command and also the hash_lookup_algo()
+	  function.
+
+config SPL_SHA_PROG_HW_ACCEL
+	bool "Enable Progressive hashing support using hardware in SPL"
+	depends on SHA_PROG_HW_ACCEL
+	default y
+	help
+	  This option enables hardware-acceleration for SHA progressive
+	  hashing.
+	  Data can be streamed in a block at a time and the hashing is
+	  performed in hardware.
+
+endif
+
 config TPL_HASH_SUPPORT
 	bool "Support hashing drivers in TPL"
 	depends on TPL
diff --git a/include/image.h b/include/image.h
index 3284f36c97a..61da0abace7 100644
--- a/include/image.h
+++ b/include/image.h
@@ -34,10 +34,6 @@ struct fdt_region;
 #define CONFIG_FIT_SHA256
 #define CONFIG_FIT_SHA384
 #define CONFIG_FIT_SHA512
-#define CONFIG_SHA1
-#define CONFIG_SHA256
-#define CONFIG_SHA384
-#define CONFIG_SHA512
 
 #define IMAGE_ENABLE_IGNORE	0
 #define IMAGE_INDENT_STRING	""
diff --git a/tools/Kconfig b/tools/Kconfig
index f00ab661135..5c3e485a298 100644
--- a/tools/Kconfig
+++ b/tools/Kconfig
@@ -34,4 +34,24 @@ config HOST_FIT_SIGNATURE_MAX_SIZE
 	depends on HOST_FIT_SIGNATURE
 	default 0x10000000
 
+config HOST_SHA1
+	def_bool y
+	help
+	  Enable SHA1 support in the host build.
+
+config HOST_SHA256
+	def_bool y
+	help
+	  Enable SHA256 support in the host build.
+
+config HOST_SHA384
+	def_bool y
+	help
+	  Enable SHA384 support in the host build.
+
+config HOST_SHA512
+	def_bool y
+	help
+	  Enable SHA512 support in the host build.
+
 endmenu
-- 
2.31.1.607.g51e8a6a459-goog

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

* [PATCH v2 21/50] hash: Drop some #ifdefs in hash.c
  2021-05-06 14:23 [PATCH v2 00/50] image: Reduce #ifdefs and ad-hoc defines in image code Simon Glass
                   ` (19 preceding siblings ...)
  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 ` Simon Glass
  2021-05-14 15:37   ` Alex G.
  2021-05-06 14:24 ` [PATCH v2 22/50] image: Drop IMAGE_ENABLE_FIT Simon Glass
                   ` (28 subsequent siblings)
  49 siblings, 1 reply; 91+ messages in thread
From: Simon Glass @ 2021-05-06 14:24 UTC (permalink / raw)
  To: u-boot

We can use the __maybe_unused attribute to avoid some of the #ifdefs in
this file. Update the functions accordingly.

Note: The actual hashing interface is still a mess, with four separate
combinations and lots of #ifdefs. This should really use a driver
approach, e.g. as is done with partition drivers.

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

(no changes since v1)

 common/hash.c | 54 ++++++++++++++++++++++++---------------------------
 1 file changed, 25 insertions(+), 29 deletions(-)

diff --git a/common/hash.c b/common/hash.c
index 987d238c66c..1ccc62f162d 100644
--- a/common/hash.c
+++ b/common/hash.c
@@ -24,6 +24,7 @@
 #include <u-boot/crc.h>
 #else
 #include "mkimage.h"
+#include <linux/compiler_attributes.h>
 #include <time.h>
 #include <linux/kconfig.h>
 #endif /* !USE_HOSTCC*/
@@ -42,8 +43,7 @@ DECLARE_GLOBAL_DATA_PTR;
 
 static void reloc_update(void);
 
-#if CONFIG_IS_ENABLED(SHA1) && !CONFIG_IS_ENABLED(SHA_PROG_HW_ACCEL)
-static int hash_init_sha1(struct hash_algo *algo, void **ctxp)
+static int __maybe_unused hash_init_sha1(struct hash_algo *algo, void **ctxp)
 {
 	sha1_context *ctx = malloc(sizeof(sha1_context));
 	sha1_starts(ctx);
@@ -51,15 +51,16 @@ static int hash_init_sha1(struct hash_algo *algo, void **ctxp)
 	return 0;
 }
 
-static int hash_update_sha1(struct hash_algo *algo, void *ctx, const void *buf,
-			    unsigned int size, int is_last)
+static int __maybe_unused hash_update_sha1(struct hash_algo *algo, void *ctx,
+					   const void *buf, unsigned int size,
+					   int is_last)
 {
 	sha1_update((sha1_context *)ctx, buf, size);
 	return 0;
 }
 
-static int hash_finish_sha1(struct hash_algo *algo, void *ctx, void *dest_buf,
-			    int size)
+static int __maybe_unused hash_finish_sha1(struct hash_algo *algo, void *ctx,
+					   void *dest_buf, int size)
 {
 	if (size < algo->digest_size)
 		return -1;
@@ -68,10 +69,8 @@ static int hash_finish_sha1(struct hash_algo *algo, void *ctx, void *dest_buf,
 	free(ctx);
 	return 0;
 }
-#endif
 
-#if CONFIG_IS_ENABLED(SHA256) && !CONFIG_IS_ENABLED(SHA_PROG_HW_ACCEL)
-static int hash_init_sha256(struct hash_algo *algo, void **ctxp)
+static int __maybe_unused hash_init_sha256(struct hash_algo *algo, void **ctxp)
 {
 	sha256_context *ctx = malloc(sizeof(sha256_context));
 	sha256_starts(ctx);
@@ -79,15 +78,16 @@ static int hash_init_sha256(struct hash_algo *algo, void **ctxp)
 	return 0;
 }
 
-static int hash_update_sha256(struct hash_algo *algo, void *ctx,
-			      const void *buf, unsigned int size, int is_last)
+static int __maybe_unused hash_update_sha256(struct hash_algo *algo, void *ctx,
+					     const void *buf, uint size,
+					     int is_last)
 {
 	sha256_update((sha256_context *)ctx, buf, size);
 	return 0;
 }
 
-static int hash_finish_sha256(struct hash_algo *algo, void *ctx, void
-			      *dest_buf, int size)
+static int __maybe_unused hash_finish_sha256(struct hash_algo *algo, void *ctx,
+					     void *dest_buf, int size)
 {
 	if (size < algo->digest_size)
 		return -1;
@@ -96,10 +96,8 @@ static int hash_finish_sha256(struct hash_algo *algo, void *ctx, void
 	free(ctx);
 	return 0;
 }
-#endif
 
-#if CONFIG_IS_ENABLED(SHA384) && !CONFIG_IS_ENABLED(SHA_PROG_HW_ACCEL)
-static int hash_init_sha384(struct hash_algo *algo, void **ctxp)
+static int __maybe_unused hash_init_sha384(struct hash_algo *algo, void **ctxp)
 {
 	sha512_context *ctx = malloc(sizeof(sha512_context));
 	sha384_starts(ctx);
@@ -107,15 +105,16 @@ static int hash_init_sha384(struct hash_algo *algo, void **ctxp)
 	return 0;
 }
 
-static int hash_update_sha384(struct hash_algo *algo, void *ctx,
-			      const void *buf, unsigned int size, int is_last)
+static int __maybe_unused hash_update_sha384(struct hash_algo *algo, void *ctx,
+					     const void *buf, uint size,
+					     int is_last)
 {
 	sha384_update((sha512_context *)ctx, buf, size);
 	return 0;
 }
 
-static int hash_finish_sha384(struct hash_algo *algo, void *ctx, void
-			      *dest_buf, int size)
+static int __maybe_unused hash_finish_sha384(struct hash_algo *algo, void *ctx,
+					     void *dest_buf, int size)
 {
 	if (size < algo->digest_size)
 		return -1;
@@ -124,10 +123,8 @@ static int hash_finish_sha384(struct hash_algo *algo, void *ctx, void
 	free(ctx);
 	return 0;
 }
-#endif
 
-#if CONFIG_IS_ENABLED(SHA512) && !CONFIG_IS_ENABLED(SHA_PROG_HW_ACCEL)
-static int hash_init_sha512(struct hash_algo *algo, void **ctxp)
+static int __maybe_unused hash_init_sha512(struct hash_algo *algo, void **ctxp)
 {
 	sha512_context *ctx = malloc(sizeof(sha512_context));
 	sha512_starts(ctx);
@@ -135,15 +132,16 @@ static int hash_init_sha512(struct hash_algo *algo, void **ctxp)
 	return 0;
 }
 
-static int hash_update_sha512(struct hash_algo *algo, void *ctx,
-			      const void *buf, unsigned int size, int is_last)
+static int __maybe_unused hash_update_sha512(struct hash_algo *algo, void *ctx,
+					     const void *buf, uint size,
+					     int is_last)
 {
 	sha512_update((sha512_context *)ctx, buf, size);
 	return 0;
 }
 
-static int hash_finish_sha512(struct hash_algo *algo, void *ctx, void
-			      *dest_buf, int size)
+static int __maybe_unused hash_finish_sha512(struct hash_algo *algo, void *ctx,
+					     void *dest_buf, int size)
 {
 	if (size < algo->digest_size)
 		return -1;
@@ -152,8 +150,6 @@ static int hash_finish_sha512(struct hash_algo *algo, void *ctx, void
 	free(ctx);
 	return 0;
 }
-#endif
-
 
 static int hash_init_crc16_ccitt(struct hash_algo *algo, void **ctxp)
 {
-- 
2.31.1.607.g51e8a6a459-goog

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

* [PATCH v2 22/50] image: Drop IMAGE_ENABLE_FIT
  2021-05-06 14:23 [PATCH v2 00/50] image: Reduce #ifdefs and ad-hoc defines in image code Simon Glass
                   ` (20 preceding siblings ...)
  2021-05-06 14:24 ` [PATCH v2 21/50] hash: Drop some #ifdefs in hash.c Simon Glass
@ 2021-05-06 14:24 ` Simon Glass
  2021-05-06 14:24 ` [PATCH v2 23/50] image: Drop IMAGE_ENABLE_OF_LIBFDT Simon Glass
                   ` (27 subsequent siblings)
  49 siblings, 0 replies; 91+ messages in thread
From: Simon Glass @ 2021-05-06 14:24 UTC (permalink / raw)
  To: u-boot

Make use of the host Kconfig for FIT. With this we can use
CONFIG_IS_ENABLED(FIT) directly in the host build, so drop the unnecessary
indirection.

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

(no changes since v1)

 arch/arm/mach-imx/hab.c |  2 +-
 common/bootm.c          | 10 +++++-----
 common/image-board.c    | 16 ++++++++--------
 common/image.c          |  2 +-
 include/fdt_support.h   |  2 +-
 include/image.h         | 22 +++++++++-------------
 tools/Kconfig           | 20 ++++++++++++++++++++
 7 files changed, 45 insertions(+), 29 deletions(-)

diff --git a/arch/arm/mach-imx/hab.c b/arch/arm/mach-imx/hab.c
index 00bd157d0e0..cf522226f67 100644
--- a/arch/arm/mach-imx/hab.c
+++ b/arch/arm/mach-imx/hab.c
@@ -591,7 +591,7 @@ static ulong get_image_ivt_offset(ulong img_addr)
 		return (image_get_image_size((image_header_t *)img_addr)
 			+ 0x1000 - 1)  & ~(0x1000 - 1);
 #endif
-#if IMAGE_ENABLE_FIT
+#if CONFIG_IS_ENABLED(FIT)
 	case IMAGE_FORMAT_FIT:
 		return (fit_get_size(buf) + 0x1000 - 1)  & ~(0x1000 - 1);
 #endif
diff --git a/common/bootm.c b/common/bootm.c
index fe17d1da9e5..8d614fe140e 100644
--- a/common/bootm.c
+++ b/common/bootm.c
@@ -115,7 +115,7 @@ static int bootm_find_os(struct cmd_tbl *cmdtp, int flag, int argc,
 		images.os.arch = image_get_arch(os_hdr);
 		break;
 #endif
-#if IMAGE_ENABLE_FIT
+#if CONFIG_IS_ENABLED(FIT)
 	case IMAGE_FORMAT_FIT:
 		if (fit_image_get_type(images.fit_hdr_os,
 				       images.fit_noffset_os,
@@ -187,7 +187,7 @@ static int bootm_find_os(struct cmd_tbl *cmdtp, int flag, int argc,
 		/* Kernel entry point is the setup.bin */
 	} else if (images.legacy_hdr_valid) {
 		images.ep = image_get_ep(&images.legacy_hdr_os_copy);
-#if IMAGE_ENABLE_FIT
+#if CONFIG_IS_ENABLED(FIT)
 	} else if (images.fit_uname_os) {
 		int ret;
 
@@ -295,7 +295,7 @@ int bootm_find_images(int flag, int argc, char *const argv[], ulong start,
 		set_working_fdt_addr(map_to_sysmem(images.ft_addr));
 #endif
 
-#if IMAGE_ENABLE_FIT
+#if CONFIG_IS_ENABLED(FIT)
 	if (IS_ENABLED(CONFIG_FPGA)) {
 		/* find bitstreams */
 		ret = boot_get_fpga(argc, argv, &images, IH_ARCH_DEFAULT,
@@ -858,7 +858,7 @@ static const void *boot_get_kernel(struct cmd_tbl *cmdtp, int flag, int argc,
 	const void *buf;
 	const char	*fit_uname_config = NULL;
 	const char	*fit_uname_kernel = NULL;
-#if IMAGE_ENABLE_FIT
+#if CONFIG_IS_ENABLED(FIT)
 	int		os_noffset;
 #endif
 
@@ -916,7 +916,7 @@ static const void *boot_get_kernel(struct cmd_tbl *cmdtp, int flag, int argc,
 		bootstage_mark(BOOTSTAGE_ID_DECOMP_IMAGE);
 		break;
 #endif
-#if IMAGE_ENABLE_FIT
+#if CONFIG_IS_ENABLED(FIT)
 	case IMAGE_FORMAT_FIT:
 		os_noffset = fit_image_load(images, img_addr,
 				&fit_uname_kernel, &fit_uname_config,
diff --git a/common/image-board.c b/common/image-board.c
index 0f41ede1e98..05eeaaac8b0 100644
--- a/common/image-board.c
+++ b/common/image-board.c
@@ -282,7 +282,7 @@ int genimg_get_format(const void *img_addr)
 	if (image_check_magic(hdr))
 		return IMAGE_FORMAT_LEGACY;
 #endif
-#if IMAGE_ENABLE_FIT || IMAGE_ENABLE_OF_LIBFDT
+#if CONFIG_IS_ENABLED(FIT) || IMAGE_ENABLE_OF_LIBFDT
 	if (fdt_check_header(img_addr) == 0)
 		return IMAGE_FORMAT_FIT;
 #endif
@@ -307,7 +307,7 @@ int genimg_get_format(const void *img_addr)
  */
 int genimg_has_config(bootm_headers_t *images)
 {
-#if IMAGE_ENABLE_FIT
+#if CONFIG_IS_ENABLED(FIT)
 	if (images->fit_uname_cfg)
 		return 1;
 #endif
@@ -348,7 +348,7 @@ int boot_get_ramdisk(int argc, char *const argv[], bootm_headers_t *images,
 #ifdef CONFIG_SUPPORT_RAW_INITRD
 	char *end;
 #endif
-#if IMAGE_ENABLE_FIT
+#if CONFIG_IS_ENABLED(FIT)
 	const char	*fit_uname_config = images->fit_uname_cfg;
 	const char	*fit_uname_ramdisk = NULL;
 	ulong		default_addr;
@@ -380,7 +380,7 @@ int boot_get_ramdisk(int argc, char *const argv[], bootm_headers_t *images,
 		rd_len = 0;
 		rd_data = 0;
 	} else if (select || genimg_has_config(images)) {
-#if IMAGE_ENABLE_FIT
+#if CONFIG_IS_ENABLED(FIT)
 		if (select) {
 			/*
 			 * If the init ramdisk comes from the FIT image and
@@ -409,7 +409,7 @@ int boot_get_ramdisk(int argc, char *const argv[], bootm_headers_t *images,
 				debug("*  ramdisk: cmdline image address = 0x%08lx\n",
 				      rd_addr);
 			}
-#if IMAGE_ENABLE_FIT
+#if CONFIG_IS_ENABLED(FIT)
 		} else {
 			/* use FIT configuration provided in first bootm
 			 * command argument. If the property is not defined,
@@ -450,7 +450,7 @@ int boot_get_ramdisk(int argc, char *const argv[], bootm_headers_t *images,
 			rd_load = image_get_load(rd_hdr);
 			break;
 #endif
-#if IMAGE_ENABLE_FIT
+#if CONFIG_IS_ENABLED(FIT)
 		case IMAGE_FORMAT_FIT:
 			rd_noffset = fit_image_load(images,
 						    rd_addr, &fit_uname_ramdisk,
@@ -623,14 +623,14 @@ error:
 int boot_get_setup(bootm_headers_t *images, u8 arch,
 		   ulong *setup_start, ulong *setup_len)
 {
-#if IMAGE_ENABLE_FIT
+#if CONFIG_IS_ENABLED(FIT)
 	return boot_get_setup_fit(images, arch, setup_start, setup_len);
 #else
 	return -ENOENT;
 #endif
 }
 
-#if IMAGE_ENABLE_FIT
+#if CONFIG_IS_ENABLED(FIT)
 #if defined(CONFIG_FPGA)
 int boot_get_fpga(int argc, char *const argv[], bootm_headers_t *images,
 		  u8 arch, const ulong *ld_start, ulong * const ld_len)
diff --git a/common/image.c b/common/image.c
index 086ae609f29..f105b5e8857 100644
--- a/common/image.c
+++ b/common/image.c
@@ -18,7 +18,7 @@
 #include <status_led.h>
 #endif
 
-#if IMAGE_ENABLE_FIT || IMAGE_ENABLE_OF_LIBFDT
+#if CONFIG_IS_ENABLED(FIT) || IMAGE_ENABLE_OF_LIBFDT
 #include <linux/libfdt.h>
 #include <fdt_support.h>
 #endif
diff --git a/include/fdt_support.h b/include/fdt_support.h
index 46eb1dbbb24..9b2929a982e 100644
--- a/include/fdt_support.h
+++ b/include/fdt_support.h
@@ -7,7 +7,7 @@
 #ifndef __FDT_SUPPORT_H
 #define __FDT_SUPPORT_H
 
-#ifdef CONFIG_OF_LIBFDT
+#if !defined(USE_HOSTCC) && defined(CONFIG_OF_LIBFDT)
 
 #include <asm/u-boot.h>
 #include <linux/libfdt.h>
diff --git a/include/image.h b/include/image.h
index 61da0abace7..522e9dbff5f 100644
--- a/include/image.h
+++ b/include/image.h
@@ -25,15 +25,12 @@ struct fdt_region;
 
 #ifdef USE_HOSTCC
 #include <sys/types.h>
+#include <linux/kconfig.h>
 
 /* new uImage format support enabled on host */
-#define IMAGE_ENABLE_FIT	1
 #define IMAGE_ENABLE_OF_LIBFDT	1
 #define CONFIG_FIT_VERBOSE	1 /* enable fit_format_{error,warning}() */
 #define CONFIG_FIT_ENABLE_RSASSA_PSS_SUPPORT 1
-#define CONFIG_FIT_SHA256
-#define CONFIG_FIT_SHA384
-#define CONFIG_FIT_SHA512
 
 #define IMAGE_ENABLE_IGNORE	0
 #define IMAGE_INDENT_STRING	""
@@ -48,12 +45,11 @@ struct fdt_region;
 #define IMAGE_ENABLE_IGNORE	1
 #define IMAGE_INDENT_STRING	"   "
 
-#define IMAGE_ENABLE_FIT	CONFIG_IS_ENABLED(FIT)
 #define IMAGE_ENABLE_OF_LIBFDT	CONFIG_IS_ENABLED(OF_LIBFDT)
 
 #endif /* USE_HOSTCC */
 
-#if IMAGE_ENABLE_FIT
+#if CONFIG_IS_ENABLED(FIT)
 #include <hash.h>
 #include <linux/libfdt.h>
 #include <fdt_support.h>
@@ -106,7 +102,7 @@ struct fdt_region;
 #define IMAGE_ENABLE_SHA512	0
 #endif
 
-#endif /* IMAGE_ENABLE_FIT */
+#endif /* FIT */
 
 #ifdef CONFIG_SYS_BOOT_GET_CMDLINE
 # define IMAGE_BOOT_GET_CMDLINE		1
@@ -379,7 +375,7 @@ typedef struct bootm_headers {
 	image_header_t	legacy_hdr_os_copy;	/* header copy */
 	ulong		legacy_hdr_valid;
 
-#if IMAGE_ENABLE_FIT
+#if CONFIG_IS_ENABLED(FIT)
 	const char	*fit_uname_cfg;	/* configuration node unit name */
 
 	void		*fit_hdr_os;	/* os FIT image header */
@@ -1034,7 +1030,7 @@ int booti_setup(ulong image, ulong *relocated_addr, ulong *size,
 
 #define FIT_MAX_HASH_LEN	HASH_MAX_DIGEST_SIZE
 
-#if IMAGE_ENABLE_FIT
+#if CONFIG_IS_ENABLED(FIT)
 /* cmdline argument format parsing */
 int fit_parse_conf(const char *spec, ulong addr_curr,
 		ulong *addr, const char **conf_name);
@@ -1208,7 +1204,7 @@ int fit_conf_get_prop_node(const void *fit, int noffset,
 
 int fit_check_ramdisk(const void *fit, int os_noffset,
 		uint8_t arch, int verify);
-#endif /* IMAGE_ENABLE_FIT */
+#endif /* FIT */
 
 int calculate_hash(const void *data, int data_len, const char *algo,
 			uint8_t *value, int *value_len);
@@ -1237,7 +1233,7 @@ int calculate_hash(const void *data, int data_len, const char *algo,
 # define FIT_IMAGE_ENABLE_VERIFY	CONFIG_IS_ENABLED(FIT_SIGNATURE)
 #endif
 
-#if IMAGE_ENABLE_FIT
+#if CONFIG_IS_ENABLED(FIT)
 #ifdef USE_HOSTCC
 void *image_get_host_blob(void);
 void image_set_host_blob(void *host_blob);
@@ -1251,7 +1247,7 @@ void image_set_host_blob(void *host_blob);
 #else
 #define IMAGE_ENABLE_BEST_MATCH	0
 #endif
-#endif /* IMAGE_ENABLE_FIT */
+#endif /* FIT */
 
 /*
  * Information passed to the signing routines
@@ -1389,7 +1385,7 @@ struct crypto_algo *image_get_crypto_algo(const char *full_name);
  */
 struct padding_algo *image_get_padding_algo(const char *name);
 
-#if IMAGE_ENABLE_FIT
+#if CONFIG_IS_ENABLED(FIT)
 
 /**
  * fit_image_verify_required_sigs() - Verify signatures marked as 'required'
diff --git a/tools/Kconfig b/tools/Kconfig
index 5c3e485a298..8af66a51c09 100644
--- a/tools/Kconfig
+++ b/tools/Kconfig
@@ -24,6 +24,26 @@ config HOST_FIT_PRINT
 	help
 	  Print the content of the FIT verbosely in the host build
 
+config HOST_FIT_SHA1
+	def_bool y
+	help
+	  Support SHA256 checksum of FIT image contents in the host build
+
+config HOST_FIT_SHA256
+	def_bool y
+	help
+	  Support SHA256 checksum of FIT image contents in the host build
+
+config HOST_FIT_SHA384
+	def_bool y
+	help
+	  Support SHA384 checksum of FIT image contents in the host build
+
+config HOST_FIT_SHA512
+	def_bool y
+	help
+	  Support SHA512 checksum of FIT image contents in the host build
+
 config HOST_FIT_SIGNATURE
 	def_bool y
 	help
-- 
2.31.1.607.g51e8a6a459-goog

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

* [PATCH v2 23/50] image: Drop IMAGE_ENABLE_OF_LIBFDT
  2021-05-06 14:23 [PATCH v2 00/50] image: Reduce #ifdefs and ad-hoc defines in image code Simon Glass
                   ` (21 preceding siblings ...)
  2021-05-06 14:24 ` [PATCH v2 22/50] image: Drop IMAGE_ENABLE_FIT Simon Glass
@ 2021-05-06 14:24 ` Simon Glass
  2021-05-06 14:24 ` [PATCH v2 24/50] image: Use Kconfig to enable CONFIG_FIT_VERBOSE on host Simon Glass
                   ` (26 subsequent siblings)
  49 siblings, 0 replies; 91+ messages in thread
From: Simon Glass @ 2021-05-06 14:24 UTC (permalink / raw)
  To: u-boot

Add a host Kconfig for OF_LIBFDT. With this we can use
CONFIG_IS_ENABLED(OF_LIBFDT) directly in the host build, so drop the
unnecessary indirection.

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

(no changes since v1)

 arch/arc/lib/bootm.c        | 2 +-
 arch/arm/lib/bootm.c        | 4 ++--
 arch/microblaze/lib/bootm.c | 2 +-
 arch/nds32/lib/bootm.c      | 4 ++--
 arch/riscv/lib/bootm.c      | 4 ++--
 board/synopsys/hsdk/hsdk.c  | 2 +-
 common/bootm.c              | 4 ++--
 common/image-board.c        | 8 ++++----
 common/image.c              | 2 +-
 include/image.h             | 3 ---
 lib/lmb.c                   | 2 +-
 tools/Kconfig               | 5 +++++
 12 files changed, 22 insertions(+), 20 deletions(-)

diff --git a/arch/arc/lib/bootm.c b/arch/arc/lib/bootm.c
index 8a8d394a5f0..2e139611e59 100644
--- a/arch/arc/lib/bootm.c
+++ b/arch/arc/lib/bootm.c
@@ -93,7 +93,7 @@ static void boot_jump_linux(bootm_headers_t *images, int flag)
 	       "(fake run for tracing)" : "");
 	bootstage_mark_name(BOOTSTAGE_ID_BOOTM_HANDOFF, "start_kernel");
 
-	if (IMAGE_ENABLE_OF_LIBFDT && images->ft_len) {
+	if (CONFIG_IS_ENABLED(OF_LIBFDT) && images->ft_len) {
 		r0 = 2;
 		r2 = (unsigned int)images->ft_addr;
 	} else {
diff --git a/arch/arm/lib/bootm.c b/arch/arm/lib/bootm.c
index f60ee3a7e6a..493c9e1df19 100644
--- a/arch/arm/lib/bootm.c
+++ b/arch/arm/lib/bootm.c
@@ -244,7 +244,7 @@ static void boot_prep_linux(bootm_headers_t *images)
 {
 	char *commandline = env_get("bootargs");
 
-	if (IMAGE_ENABLE_OF_LIBFDT && images->ft_len) {
+	if (CONFIG_IS_ENABLED(OF_LIBFDT) && images->ft_len) {
 #ifdef CONFIG_OF_LIBFDT
 		debug("using: FDT\n");
 		if (image_setup_linux(images)) {
@@ -401,7 +401,7 @@ static void boot_jump_linux(bootm_headers_t *images, int flag)
 	bootstage_mark(BOOTSTAGE_ID_RUN_OS);
 	announce_and_cleanup(fake);
 
-	if (IMAGE_ENABLE_OF_LIBFDT && images->ft_len)
+	if (CONFIG_IS_ENABLED(OF_LIBFDT) && images->ft_len)
 		r2 = (unsigned long)images->ft_addr;
 	else
 		r2 = gd->bd->bi_boot_params;
diff --git a/arch/microblaze/lib/bootm.c b/arch/microblaze/lib/bootm.c
index 6695ac63c77..1e041fb5685 100644
--- a/arch/microblaze/lib/bootm.c
+++ b/arch/microblaze/lib/bootm.c
@@ -101,7 +101,7 @@ static void boot_jump_linux(bootm_headers_t *images, int flag)
 
 static void boot_prep_linux(bootm_headers_t *images)
 {
-	if (IMAGE_ENABLE_OF_LIBFDT && images->ft_len) {
+	if (CONFIG_IS_ENABLED(OF_LIBFDT) && images->ft_len) {
 		debug("using: FDT\n");
 		if (image_setup_linux(images)) {
 			printf("FDT creation failed! hanging...");
diff --git a/arch/nds32/lib/bootm.c b/arch/nds32/lib/bootm.c
index b3b8bc29037..394564a3f5b 100644
--- a/arch/nds32/lib/bootm.c
+++ b/arch/nds32/lib/bootm.c
@@ -73,7 +73,7 @@ int do_bootm_linux(int flag, int argc, char *argv[], bootm_headers_t *images)
 	debug("## Transferring control to Linux (at address %08lx) ...\n",
 	       (ulong)theKernel);
 
-	if (IMAGE_ENABLE_OF_LIBFDT && images->ft_len) {
+	if (CONFIG_IS_ENABLED(OF_LIBFDT) && images->ft_len) {
 #ifdef CONFIG_OF_LIBFDT
 		debug("using: FDT\n");
 		if (image_setup_linux(images)) {
@@ -118,7 +118,7 @@ int do_bootm_linux(int flag, int argc, char *argv[], bootm_headers_t *images)
 #endif
 	}
 	cleanup_before_linux();
-	if (IMAGE_ENABLE_OF_LIBFDT && images->ft_len)
+	if (CONFIG_IS_ENABLED(OF_LIBFDT) && images->ft_len)
 		theKernel(0, machid, (unsigned long)images->ft_addr);
 	else
 		theKernel(0, machid, bd->bi_boot_params);
diff --git a/arch/riscv/lib/bootm.c b/arch/riscv/lib/bootm.c
index 8dd18205403..6c9e7eb6547 100644
--- a/arch/riscv/lib/bootm.c
+++ b/arch/riscv/lib/bootm.c
@@ -64,7 +64,7 @@ static void announce_and_cleanup(int fake)
 
 static void boot_prep_linux(bootm_headers_t *images)
 {
-	if (IMAGE_ENABLE_OF_LIBFDT && images->ft_len) {
+	if (CONFIG_IS_ENABLED(OF_LIBFDT) && images->ft_len) {
 #ifdef CONFIG_OF_LIBFDT
 		debug("using: FDT\n");
 		if (image_setup_linux(images)) {
@@ -96,7 +96,7 @@ static void boot_jump_linux(bootm_headers_t *images, int flag)
 	announce_and_cleanup(fake);
 
 	if (!fake) {
-		if (IMAGE_ENABLE_OF_LIBFDT && images->ft_len) {
+		if (CONFIG_IS_ENABLED(OF_LIBFDT) && images->ft_len) {
 #ifdef CONFIG_SMP
 			ret = smp_call_function(images->ep,
 						(ulong)images->ft_addr, 0, 0);
diff --git a/board/synopsys/hsdk/hsdk.c b/board/synopsys/hsdk/hsdk.c
index 892b94bb083..226fbba6296 100644
--- a/board/synopsys/hsdk/hsdk.c
+++ b/board/synopsys/hsdk/hsdk.c
@@ -871,7 +871,7 @@ int board_prep_linux(bootm_headers_t *images)
 	if (env_common.core_mask.val == ALL_CPU_MASK)
 		return 0;
 
-	if (!IMAGE_ENABLE_OF_LIBFDT || !images->ft_len) {
+	if (!CONFIG_IS_ENABLED(OF_LIBFDT) || !images->ft_len) {
 		pr_err("WARN: core_mask setup will work properly only with external DTB!\n");
 		return 0;
 	}
diff --git a/common/bootm.c b/common/bootm.c
index 8d614fe140e..4482f84b40a 100644
--- a/common/bootm.c
+++ b/common/bootm.c
@@ -271,7 +271,7 @@ int bootm_find_images(int flag, int argc, char *const argv[], ulong start,
 		return 1;
 	}
 
-#if IMAGE_ENABLE_OF_LIBFDT
+#if CONFIG_IS_ENABLED(OF_LIBFDT)
 	/* find flattened device tree */
 	ret = boot_get_fdt(flag, argc, argv, IH_ARCH_DEFAULT, &images,
 			   &images.ft_addr, &images.ft_len);
@@ -706,7 +706,7 @@ int do_bootm_states(struct cmd_tbl *cmdtp, int flag, int argc,
 		}
 	}
 #endif
-#if IMAGE_ENABLE_OF_LIBFDT && defined(CONFIG_LMB)
+#if CONFIG_IS_ENABLED(OF_LIBFDT) && defined(CONFIG_LMB)
 	if (!ret && (states & BOOTM_STATE_FDT)) {
 		boot_fdt_add_mem_rsv_regions(&images->lmb, images->ft_addr);
 		ret = boot_relocate_fdt(&images->lmb, &images->ft_addr,
diff --git a/common/image-board.c b/common/image-board.c
index 05eeaaac8b0..0b9809c3f6b 100644
--- a/common/image-board.c
+++ b/common/image-board.c
@@ -282,7 +282,7 @@ int genimg_get_format(const void *img_addr)
 	if (image_check_magic(hdr))
 		return IMAGE_FORMAT_LEGACY;
 #endif
-#if CONFIG_IS_ENABLED(FIT) || IMAGE_ENABLE_OF_LIBFDT
+#if CONFIG_IS_ENABLED(FIT) || CONFIG_IS_ENABLED(OF_LIBFDT)
 	if (fdt_check_header(img_addr) == 0)
 		return IMAGE_FORMAT_FIT;
 #endif
@@ -895,7 +895,7 @@ int image_setup_linux(bootm_headers_t *images)
 	struct lmb *lmb = &images->lmb;
 	int ret;
 
-	if (IMAGE_ENABLE_OF_LIBFDT)
+	if (CONFIG_IS_ENABLED(OF_LIBFDT))
 		boot_fdt_add_mem_rsv_regions(lmb, *of_flat_tree);
 
 	if (IMAGE_BOOT_GET_CMDLINE) {
@@ -907,13 +907,13 @@ int image_setup_linux(bootm_headers_t *images)
 		}
 	}
 
-	if (IMAGE_ENABLE_OF_LIBFDT) {
+	if (CONFIG_IS_ENABLED(OF_LIBFDT)) {
 		ret = boot_relocate_fdt(lmb, of_flat_tree, &of_size);
 		if (ret)
 			return ret;
 	}
 
-	if (IMAGE_ENABLE_OF_LIBFDT && of_size) {
+	if (CONFIG_IS_ENABLED(OF_LIBFDT) && of_size) {
 		ret = image_setup_libfdt(images, *of_flat_tree, of_size, lmb);
 		if (ret)
 			return ret;
diff --git a/common/image.c b/common/image.c
index f105b5e8857..9531a6d6820 100644
--- a/common/image.c
+++ b/common/image.c
@@ -18,7 +18,7 @@
 #include <status_led.h>
 #endif
 
-#if CONFIG_IS_ENABLED(FIT) || IMAGE_ENABLE_OF_LIBFDT
+#if CONFIG_IS_ENABLED(FIT) || CONFIG_IS_ENABLED(OF_LIBFDT)
 #include <linux/libfdt.h>
 #include <fdt_support.h>
 #endif
diff --git a/include/image.h b/include/image.h
index 522e9dbff5f..bdf19a4cc04 100644
--- a/include/image.h
+++ b/include/image.h
@@ -28,7 +28,6 @@ struct fdt_region;
 #include <linux/kconfig.h>
 
 /* new uImage format support enabled on host */
-#define IMAGE_ENABLE_OF_LIBFDT	1
 #define CONFIG_FIT_VERBOSE	1 /* enable fit_format_{error,warning}() */
 #define CONFIG_FIT_ENABLE_RSASSA_PSS_SUPPORT 1
 
@@ -45,8 +44,6 @@ struct fdt_region;
 #define IMAGE_ENABLE_IGNORE	1
 #define IMAGE_INDENT_STRING	"   "
 
-#define IMAGE_ENABLE_OF_LIBFDT	CONFIG_IS_ENABLED(OF_LIBFDT)
-
 #endif /* USE_HOSTCC */
 
 #if CONFIG_IS_ENABLED(FIT)
diff --git a/lib/lmb.c b/lib/lmb.c
index c08c4d942b7..d50beffab78 100644
--- a/lib/lmb.c
+++ b/lib/lmb.c
@@ -113,7 +113,7 @@ static void lmb_reserve_common(struct lmb *lmb, void *fdt_blob)
 	arch_lmb_reserve(lmb);
 	board_lmb_reserve(lmb);
 
-	if (IMAGE_ENABLE_OF_LIBFDT && fdt_blob)
+	if (CONFIG_IS_ENABLED(OF_LIBFDT) && fdt_blob)
 		boot_fdt_add_mem_rsv_regions(lmb, fdt_blob);
 }
 
diff --git a/tools/Kconfig b/tools/Kconfig
index 8af66a51c09..c67dc04f5ed 100644
--- a/tools/Kconfig
+++ b/tools/Kconfig
@@ -54,6 +54,11 @@ config HOST_FIT_SIGNATURE_MAX_SIZE
 	depends on HOST_FIT_SIGNATURE
 	default 0x10000000
 
+config HOST_OF_LIBFDT
+	def_bool y
+	help
+	  Enable libfdt support in the host build.
+
 config HOST_SHA1
 	def_bool y
 	help
-- 
2.31.1.607.g51e8a6a459-goog

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

* [PATCH v2 24/50] image: Use Kconfig to enable CONFIG_FIT_VERBOSE on host
  2021-05-06 14:23 [PATCH v2 00/50] image: Reduce #ifdefs and ad-hoc defines in image code Simon Glass
                   ` (22 preceding siblings ...)
  2021-05-06 14:24 ` [PATCH v2 23/50] image: Drop IMAGE_ENABLE_OF_LIBFDT Simon Glass
@ 2021-05-06 14:24 ` Simon Glass
  2021-05-06 14:24 ` [PATCH v2 25/50] image: Rename CONFIG_FIT_ENABLE_RSASSA_PSS_SUPPORT Simon Glass
                   ` (25 subsequent siblings)
  49 siblings, 0 replies; 91+ messages in thread
From: Simon Glass @ 2021-05-06 14:24 UTC (permalink / raw)
  To: u-boot

Add a host Kconfig for FIT_VERBOSE. With this we can use
CONFIG_IS_ENABLED(FIT_VERBOSE) directly in the host build, so drop the
forcing of this in the image.h header.

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

(no changes since v1)

 include/image.h | 5 ++---
 tools/Kconfig   | 5 +++++
 2 files changed, 7 insertions(+), 3 deletions(-)

diff --git a/include/image.h b/include/image.h
index bdf19a4cc04..b08ae2bb6c0 100644
--- a/include/image.h
+++ b/include/image.h
@@ -28,7 +28,6 @@ struct fdt_region;
 #include <linux/kconfig.h>
 
 /* new uImage format support enabled on host */
-#define CONFIG_FIT_VERBOSE	1 /* enable fit_format_{error,warning}() */
 #define CONFIG_FIT_ENABLE_RSASSA_PSS_SUPPORT 1
 
 #define IMAGE_ENABLE_IGNORE	0
@@ -1509,7 +1508,7 @@ int fit_image_cipher_get_algo(const void *fit, int noffset, char **algo);
 
 struct cipher_algo *image_get_cipher_algo(const char *full_name);
 
-#ifdef CONFIG_FIT_VERBOSE
+#if CONFIG_IS_ENABLED(FIT_VERBOSE)
 #define fit_unsupported(msg)	printf("! %s:%d " \
 				"FIT images not supported for '%s'\n", \
 				__FILE__, __LINE__, (msg))
@@ -1521,7 +1520,7 @@ struct cipher_algo *image_get_cipher_algo(const char *full_name);
 #else
 #define fit_unsupported(msg)
 #define fit_unsupported_reset(msg)
-#endif /* CONFIG_FIT_VERBOSE */
+#endif /* FIT_VERBOSE */
 #endif /* CONFIG_FIT */
 
 #if !defined(USE_HOSTCC)
diff --git a/tools/Kconfig b/tools/Kconfig
index c67dc04f5ed..6d0f4565a80 100644
--- a/tools/Kconfig
+++ b/tools/Kconfig
@@ -54,6 +54,11 @@ config HOST_FIT_SIGNATURE_MAX_SIZE
 	depends on HOST_FIT_SIGNATURE
 	default 0x10000000
 
+config HOST_FIT_VERBOSE
+	def_bool y
+	help
+	  Support verbose FIT output in the host build
+
 config HOST_OF_LIBFDT
 	def_bool y
 	help
-- 
2.31.1.607.g51e8a6a459-goog

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

* [PATCH v2 25/50] image: Rename CONFIG_FIT_ENABLE_RSASSA_PSS_SUPPORT
  2021-05-06 14:23 [PATCH v2 00/50] image: Reduce #ifdefs and ad-hoc defines in image code Simon Glass
                   ` (23 preceding siblings ...)
  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 ` Simon Glass
  2021-05-06 14:24 ` [PATCH v2 26/50] image: Use Kconfig to enable FIT_RSASSA_PSS on host Simon Glass
                   ` (24 subsequent siblings)
  49 siblings, 0 replies; 91+ messages in thread
From: Simon Glass @ 2021-05-06 14:24 UTC (permalink / raw)
  To: u-boot

Drop the ENABLE and SUPPORT parts of this, which are redundant.

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

(no changes since v1)

 common/Kconfig.boot             | 2 +-
 common/image-sig.c              | 4 ++--
 configs/bcm963158_ram_defconfig | 2 +-
 configs/sandbox_defconfig       | 2 +-
 include/image.h                 | 2 +-
 include/u-boot/rsa.h            | 8 ++++----
 lib/rsa/rsa-sign.c              | 4 ++--
 lib/rsa/rsa-verify.c            | 2 +-
 8 files changed, 13 insertions(+), 13 deletions(-)

diff --git a/common/Kconfig.boot b/common/Kconfig.boot
index af3325a7ce2..03a6e6f214f 100644
--- a/common/Kconfig.boot
+++ b/common/Kconfig.boot
@@ -103,7 +103,7 @@ config FIT_SIGNATURE_MAX_SIZE
 	  device memory. Assure this size does not extend past expected storage
 	  space.
 
-config FIT_ENABLE_RSASSA_PSS_SUPPORT
+config FIT_RSASSA_PSS
 	bool "Support rsassa-pss signature scheme of FIT image contents"
 	depends on FIT_SIGNATURE
 	default n
diff --git a/common/image-sig.c b/common/image-sig.c
index 12310bfca1a..31a4fd46061 100644
--- a/common/image-sig.c
+++ b/common/image-sig.c
@@ -100,12 +100,12 @@ struct padding_algo padding_algos[] = {
 		.name = "pkcs-1.5",
 		.verify = padding_pkcs_15_verify,
 	},
-#ifdef CONFIG_FIT_ENABLE_RSASSA_PSS_SUPPORT
+#ifdef CONFIG_FIT_RSASSA_PSS
 	{
 		.name = "pss",
 		.verify = padding_pss_verify,
 	}
-#endif /* CONFIG_FIT_ENABLE_RSASSA_PSS_SUPPORT */
+#endif /* CONFIG_FIT_RSASSA_PSS */
 };
 
 struct checksum_algo *image_get_checksum_algo(const char *full_name)
diff --git a/configs/bcm963158_ram_defconfig b/configs/bcm963158_ram_defconfig
index 0be1e0981ab..ec006514d13 100644
--- a/configs/bcm963158_ram_defconfig
+++ b/configs/bcm963158_ram_defconfig
@@ -11,7 +11,7 @@ CONFIG_DEFAULT_DEVICE_TREE="bcm963158"
 CONFIG_ENV_VARS_UBOOT_CONFIG=y
 CONFIG_FIT=y
 CONFIG_FIT_SIGNATURE=y
-CONFIG_FIT_ENABLE_RSASSA_PSS_SUPPORT=y
+CONFIG_FIT_RSASSA_PSS=y
 CONFIG_FIT_VERBOSE=y
 CONFIG_LEGACY_IMAGE_FORMAT=y
 CONFIG_SUPPORT_RAW_INITRD=y
diff --git a/configs/sandbox_defconfig b/configs/sandbox_defconfig
index 33446322a46..b4aa2dec7ec 100644
--- a/configs/sandbox_defconfig
+++ b/configs/sandbox_defconfig
@@ -10,7 +10,7 @@ CONFIG_DEBUG_UART=y
 CONFIG_DISTRO_DEFAULTS=y
 CONFIG_FIT=y
 CONFIG_FIT_SIGNATURE=y
-CONFIG_FIT_ENABLE_RSASSA_PSS_SUPPORT=y
+CONFIG_FIT_RSASSA_PSS=y
 CONFIG_FIT_CIPHER=y
 CONFIG_FIT_VERBOSE=y
 CONFIG_BOOTSTAGE=y
diff --git a/include/image.h b/include/image.h
index b08ae2bb6c0..0356d03b2ce 100644
--- a/include/image.h
+++ b/include/image.h
@@ -28,7 +28,7 @@ struct fdt_region;
 #include <linux/kconfig.h>
 
 /* new uImage format support enabled on host */
-#define CONFIG_FIT_ENABLE_RSASSA_PSS_SUPPORT 1
+#define CONFIG_FIT_RSASSA_PSS 1
 
 #define IMAGE_ENABLE_IGNORE	0
 #define IMAGE_INDENT_STRING	""
diff --git a/include/u-boot/rsa.h b/include/u-boot/rsa.h
index bed1c097c2c..bc564d56fa3 100644
--- a/include/u-boot/rsa.h
+++ b/include/u-boot/rsa.h
@@ -119,11 +119,11 @@ int padding_pkcs_15_verify(struct image_sign_info *info,
 			   uint8_t *msg, int msg_len,
 			   const uint8_t *hash, int hash_len);
 
-#ifdef CONFIG_FIT_ENABLE_RSASSA_PSS_SUPPORT
+#ifdef CONFIG_FIT_RSASSA_PSS
 int padding_pss_verify(struct image_sign_info *info,
 		       uint8_t *msg, int msg_len,
 		       const uint8_t *hash, int hash_len);
-#endif /* CONFIG_FIT_ENABLE_RSASSA_PSS_SUPPORT */
+#endif /* CONFIG_FIT_RSASSA_PSS */
 #else
 static inline int rsa_verify_hash(struct image_sign_info *info,
 				  const uint8_t *hash,
@@ -146,14 +146,14 @@ static inline int padding_pkcs_15_verify(struct image_sign_info *info,
 	return -ENXIO;
 }
 
-#ifdef CONFIG_FIT_ENABLE_RSASSA_PSS_SUPPORT
+#ifdef CONFIG_FIT_RSASSA_PSS
 static inline int padding_pss_verify(struct image_sign_info *info,
 				     uint8_t *msg, int msg_len,
 				     const uint8_t *hash, int hash_len)
 {
 	return -ENXIO;
 }
-#endif /* CONFIG_FIT_ENABLE_RSASSA_PSS_SUPPORT */
+#endif /* CONFIG_FIT_RSASSA_PSS */
 #endif
 
 #define RSA_DEFAULT_PADDING_NAME		"pkcs-1.5"
diff --git a/lib/rsa/rsa-sign.c b/lib/rsa/rsa-sign.c
index 5a1583b8f75..f4ed11e74a4 100644
--- a/lib/rsa/rsa-sign.c
+++ b/lib/rsa/rsa-sign.c
@@ -442,7 +442,7 @@ static int rsa_sign_with_key(EVP_PKEY *pkey, struct padding_algo *padding_algo,
 		goto err_sign;
 	}
 
-#ifdef CONFIG_FIT_ENABLE_RSASSA_PSS_SUPPORT
+#ifdef CONFIG_FIT_RSASSA_PSS
 	if (padding_algo && !strcmp(padding_algo->name, "pss")) {
 		if (EVP_PKEY_CTX_set_rsa_padding(ckey,
 						 RSA_PKCS1_PSS_PADDING) <= 0) {
@@ -450,7 +450,7 @@ static int rsa_sign_with_key(EVP_PKEY *pkey, struct padding_algo *padding_algo,
 			goto err_sign;
 		}
 	}
-#endif /* CONFIG_FIT_ENABLE_RSASSA_PSS_SUPPORT */
+#endif /* CONFIG_FIT_RSASSA_PSS */
 
 	for (i = 0; i < region_count; i++) {
 		if (!EVP_DigestSignUpdate(context, region[i].data,
diff --git a/lib/rsa/rsa-verify.c b/lib/rsa/rsa-verify.c
index aee76f42d57..1998c773fc7 100644
--- a/lib/rsa/rsa-verify.c
+++ b/lib/rsa/rsa-verify.c
@@ -95,7 +95,7 @@ int padding_pkcs_15_verify(struct image_sign_info *info,
 	return 0;
 }
 
-#ifdef CONFIG_FIT_ENABLE_RSASSA_PSS_SUPPORT
+#ifdef CONFIG_FIT_RSASSA_PSS
 static void u32_i2osp(uint32_t val, uint8_t *buf)
 {
 	buf[0] = (uint8_t)((val >> 24) & 0xff);
-- 
2.31.1.607.g51e8a6a459-goog

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

* [PATCH v2 26/50] image: Use Kconfig to enable FIT_RSASSA_PSS on host
  2021-05-06 14:23 [PATCH v2 00/50] image: Reduce #ifdefs and ad-hoc defines in image code Simon Glass
                   ` (24 preceding siblings ...)
  2021-05-06 14:24 ` [PATCH v2 25/50] image: Rename CONFIG_FIT_ENABLE_RSASSA_PSS_SUPPORT Simon Glass
@ 2021-05-06 14:24 ` Simon Glass
  2021-05-06 14:24 ` [PATCH v2 27/50] Kconfig: Rename SPL_CRC32_SUPPORT to SPL_CRC32 Simon Glass
                   ` (23 subsequent siblings)
  49 siblings, 0 replies; 91+ messages in thread
From: Simon Glass @ 2021-05-06 14:24 UTC (permalink / raw)
  To: u-boot

Add a host Kconfig for FIT_RSASSA_PSS. With this we can use
CONFIG_IS_ENABLED(FIT_RSASSA_PSS) directly in the host build, so drop the
forcing of this in the image.h header.

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

(no changes since v1)

 common/image-sig.c   | 4 ++--
 include/image.h      | 3 ---
 include/u-boot/rsa.h | 8 ++++----
 lib/rsa/rsa-sign.c   | 4 ++--
 lib/rsa/rsa-verify.c | 4 ++--
 tools/Kconfig        | 5 +++++
 6 files changed, 15 insertions(+), 13 deletions(-)

diff --git a/common/image-sig.c b/common/image-sig.c
index 31a4fd46061..bbc6bb3b1e3 100644
--- a/common/image-sig.c
+++ b/common/image-sig.c
@@ -100,12 +100,12 @@ struct padding_algo padding_algos[] = {
 		.name = "pkcs-1.5",
 		.verify = padding_pkcs_15_verify,
 	},
-#ifdef CONFIG_FIT_RSASSA_PSS
+#if CONFIG_IS_ENABLED(FIT_RSASSA_PSS)
 	{
 		.name = "pss",
 		.verify = padding_pss_verify,
 	}
-#endif /* CONFIG_FIT_RSASSA_PSS */
+#endif /* FIT_RSASSA_PSS */
 };
 
 struct checksum_algo *image_get_checksum_algo(const char *full_name)
diff --git a/include/image.h b/include/image.h
index 0356d03b2ce..3bb12ee3821 100644
--- a/include/image.h
+++ b/include/image.h
@@ -27,9 +27,6 @@ struct fdt_region;
 #include <sys/types.h>
 #include <linux/kconfig.h>
 
-/* new uImage format support enabled on host */
-#define CONFIG_FIT_RSASSA_PSS 1
-
 #define IMAGE_ENABLE_IGNORE	0
 #define IMAGE_INDENT_STRING	""
 
diff --git a/include/u-boot/rsa.h b/include/u-boot/rsa.h
index bc564d56fa3..45fe3509093 100644
--- a/include/u-boot/rsa.h
+++ b/include/u-boot/rsa.h
@@ -119,11 +119,11 @@ int padding_pkcs_15_verify(struct image_sign_info *info,
 			   uint8_t *msg, int msg_len,
 			   const uint8_t *hash, int hash_len);
 
-#ifdef CONFIG_FIT_RSASSA_PSS
+#if CONFIG_IS_ENABLED(FIT_RSASSA_PSS)
 int padding_pss_verify(struct image_sign_info *info,
 		       uint8_t *msg, int msg_len,
 		       const uint8_t *hash, int hash_len);
-#endif /* CONFIG_FIT_RSASSA_PSS */
+#endif /* FIT_RSASSA_PSS */
 #else
 static inline int rsa_verify_hash(struct image_sign_info *info,
 				  const uint8_t *hash,
@@ -146,14 +146,14 @@ static inline int padding_pkcs_15_verify(struct image_sign_info *info,
 	return -ENXIO;
 }
 
-#ifdef CONFIG_FIT_RSASSA_PSS
+#if CONFIG_IS_ENABLED(FIT_RSASSA_PSS)
 static inline int padding_pss_verify(struct image_sign_info *info,
 				     uint8_t *msg, int msg_len,
 				     const uint8_t *hash, int hash_len)
 {
 	return -ENXIO;
 }
-#endif /* CONFIG_FIT_RSASSA_PSS */
+#endif /* FIT_RSASSA_PSS */
 #endif
 
 #define RSA_DEFAULT_PADDING_NAME		"pkcs-1.5"
diff --git a/lib/rsa/rsa-sign.c b/lib/rsa/rsa-sign.c
index f4ed11e74a4..5ae77621fc6 100644
--- a/lib/rsa/rsa-sign.c
+++ b/lib/rsa/rsa-sign.c
@@ -442,7 +442,7 @@ static int rsa_sign_with_key(EVP_PKEY *pkey, struct padding_algo *padding_algo,
 		goto err_sign;
 	}
 
-#ifdef CONFIG_FIT_RSASSA_PSS
+#if CONFIG_IS_ENABLED(FIT_RSASSA_PSS)
 	if (padding_algo && !strcmp(padding_algo->name, "pss")) {
 		if (EVP_PKEY_CTX_set_rsa_padding(ckey,
 						 RSA_PKCS1_PSS_PADDING) <= 0) {
@@ -450,7 +450,7 @@ static int rsa_sign_with_key(EVP_PKEY *pkey, struct padding_algo *padding_algo,
 			goto err_sign;
 		}
 	}
-#endif /* CONFIG_FIT_RSASSA_PSS */
+#endif /* FIT_RSASSA_PSS */
 
 	for (i = 0; i < region_count; i++) {
 		if (!EVP_DigestSignUpdate(context, region[i].data,
diff --git a/lib/rsa/rsa-verify.c b/lib/rsa/rsa-verify.c
index 1998c773fc7..b1abfa8eacc 100644
--- a/lib/rsa/rsa-verify.c
+++ b/lib/rsa/rsa-verify.c
@@ -95,7 +95,7 @@ int padding_pkcs_15_verify(struct image_sign_info *info,
 	return 0;
 }
 
-#ifdef CONFIG_FIT_RSASSA_PSS
+#if CONFIG_IS_ENABLED(FIT_RSASSA_PSS)
 static void u32_i2osp(uint32_t val, uint8_t *buf)
 {
 	buf[0] = (uint8_t)((val >> 24) & 0xff);
@@ -296,7 +296,7 @@ out:
 
 	return ret;
 }
-#endif
+#endif /* FIT_RSASSA_PSS */
 
 #if CONFIG_IS_ENABLED(FIT_SIGNATURE) || CONFIG_IS_ENABLED(RSA_VERIFY_WITH_PKEY)
 /**
diff --git a/tools/Kconfig b/tools/Kconfig
index 6d0f4565a80..8bd782cf5b9 100644
--- a/tools/Kconfig
+++ b/tools/Kconfig
@@ -24,6 +24,11 @@ config HOST_FIT_PRINT
 	help
 	  Print the content of the FIT verbosely in the host build
 
+config HOST_FIT_RSASSA_PSS
+	def_bool y
+	help
+	  Support the rsassa-pss signature scheme in the host build
+
 config HOST_FIT_SHA1
 	def_bool y
 	help
-- 
2.31.1.607.g51e8a6a459-goog

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

* [PATCH v2 27/50] Kconfig: Rename SPL_CRC32_SUPPORT to SPL_CRC32
  2021-05-06 14:23 [PATCH v2 00/50] image: Reduce #ifdefs and ad-hoc defines in image code Simon Glass
                   ` (25 preceding siblings ...)
  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 ` 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
                   ` (22 subsequent siblings)
  49 siblings, 1 reply; 91+ messages in thread
From: Simon Glass @ 2021-05-06 14:24 UTC (permalink / raw)
  To: u-boot

Drop the _SUPPORT suffix so we can use CONFIG_IS_ENABLED() with this
option.

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

(no changes since v1)

 common/spl/Kconfig                        | 4 ++--
 configs/axm_defconfig                     | 2 +-
 configs/chromebit_mickey_defconfig        | 2 +-
 configs/chromebook_jerry_defconfig        | 2 +-
 configs/chromebook_minnie_defconfig       | 2 +-
 configs/chromebook_speedy_defconfig       | 2 +-
 configs/evb-px30_defconfig                | 2 +-
 configs/firefly-px30_defconfig            | 2 +-
 configs/imxrt1020-evk_defconfig           | 2 +-
 configs/imxrt1050-evk_defconfig           | 2 +-
 configs/odroid-go2_defconfig              | 2 +-
 configs/px30-core-ctouch2-px30_defconfig  | 2 +-
 configs/px30-core-edimm2.2-px30_defconfig | 2 +-
 configs/socfpga_agilex_atf_defconfig      | 2 +-
 configs/socfpga_agilex_vab_defconfig      | 2 +-
 configs/socfpga_stratix10_atf_defconfig   | 2 +-
 configs/taurus_defconfig                  | 2 +-
 include/image.h                           | 2 +-
 18 files changed, 19 insertions(+), 19 deletions(-)

diff --git a/common/spl/Kconfig b/common/spl/Kconfig
index 2570b220891..39fc260566b 100644
--- a/common/spl/Kconfig
+++ b/common/spl/Kconfig
@@ -204,7 +204,7 @@ config SPL_LEGACY_IMAGE_SUPPORT
 config SPL_LEGACY_IMAGE_CRC_CHECK
 	bool "Check CRC of Legacy images"
 	depends on SPL_LEGACY_IMAGE_SUPPORT
-	select SPL_CRC32_SUPPORT
+	select SPL_CRC32
 	help
 	  Enable this to check the CRC of Legacy images. While this increases
 	  reliability, it affects both code size and boot duration.
@@ -407,7 +407,7 @@ config SYS_MMCSD_RAW_MODE_EMMC_BOOT_PARTITION
 	  the eMMC EXT_CSC_PART_CONFIG selection should be overridden in SPL
 	  by user defined partition number.
 
-config SPL_CRC32_SUPPORT
+config SPL_CRC32
 	bool "Support CRC32"
 	default y if SPL_LEGACY_IMAGE_SUPPORT
 	help
diff --git a/configs/axm_defconfig b/configs/axm_defconfig
index 0bfd7548b09..4e776fd6953 100644
--- a/configs/axm_defconfig
+++ b/configs/axm_defconfig
@@ -32,7 +32,7 @@ CONFIG_BOOTCOMMAND="run flash_self"
 CONFIG_BOARD_EARLY_INIT_F=y
 # CONFIG_SPL_LEGACY_IMAGE_SUPPORT is not set
 CONFIG_SPL_SYS_MALLOC_SIMPLE=y
-CONFIG_SPL_CRC32_SUPPORT=y
+CONFIG_SPL_CRC32=y
 CONFIG_SPL_NAND_SUPPORT=y
 CONFIG_SPL_NAND_DRIVERS=y
 CONFIG_SPL_NAND_ECC=y
diff --git a/configs/chromebit_mickey_defconfig b/configs/chromebit_mickey_defconfig
index c09b63b9462..2b664e118cf 100644
--- a/configs/chromebit_mickey_defconfig
+++ b/configs/chromebit_mickey_defconfig
@@ -25,7 +25,7 @@ CONFIG_BOARD_EARLY_INIT_R=y
 CONFIG_SPL_STACK_R=y
 CONFIG_SPL_STACK_R_MALLOC_SIMPLE_LEN=0x2000
 # CONFIG_SYS_MMCSD_RAW_MODE_U_BOOT_USE_SECTOR is not set
-# CONFIG_SPL_CRC32_SUPPORT is not set
+# CONFIG_SPL_CRC32 is not set
 CONFIG_SPL_SPI_LOAD=y
 CONFIG_CMD_GPIO=y
 CONFIG_CMD_GPT=y
diff --git a/configs/chromebook_jerry_defconfig b/configs/chromebook_jerry_defconfig
index 692b630174d..a757d259f58 100644
--- a/configs/chromebook_jerry_defconfig
+++ b/configs/chromebook_jerry_defconfig
@@ -26,7 +26,7 @@ CONFIG_BOARD_EARLY_INIT_R=y
 CONFIG_SPL_STACK_R=y
 CONFIG_SPL_STACK_R_MALLOC_SIMPLE_LEN=0x2000
 # CONFIG_SYS_MMCSD_RAW_MODE_U_BOOT_USE_SECTOR is not set
-# CONFIG_SPL_CRC32_SUPPORT is not set
+# CONFIG_SPL_CRC32 is not set
 CONFIG_SPL_SPI_LOAD=y
 CONFIG_CMD_GPIO=y
 CONFIG_CMD_GPT=y
diff --git a/configs/chromebook_minnie_defconfig b/configs/chromebook_minnie_defconfig
index ae55842e3bf..353aa01ea9e 100644
--- a/configs/chromebook_minnie_defconfig
+++ b/configs/chromebook_minnie_defconfig
@@ -26,7 +26,7 @@ CONFIG_BOARD_EARLY_INIT_R=y
 CONFIG_SPL_STACK_R=y
 CONFIG_SPL_STACK_R_MALLOC_SIMPLE_LEN=0x2000
 # CONFIG_SYS_MMCSD_RAW_MODE_U_BOOT_USE_SECTOR is not set
-# CONFIG_SPL_CRC32_SUPPORT is not set
+# CONFIG_SPL_CRC32 is not set
 CONFIG_SPL_SPI_LOAD=y
 CONFIG_CMD_GPIO=y
 CONFIG_CMD_GPT=y
diff --git a/configs/chromebook_speedy_defconfig b/configs/chromebook_speedy_defconfig
index 4b460ee6a9e..c5be5597b10 100644
--- a/configs/chromebook_speedy_defconfig
+++ b/configs/chromebook_speedy_defconfig
@@ -26,7 +26,7 @@ CONFIG_BOARD_EARLY_INIT_R=y
 CONFIG_SPL_STACK_R=y
 CONFIG_SPL_STACK_R_MALLOC_SIMPLE_LEN=0x2000
 # CONFIG_SYS_MMCSD_RAW_MODE_U_BOOT_USE_SECTOR is not set
-# CONFIG_SPL_CRC32_SUPPORT is not set
+# CONFIG_SPL_CRC32 is not set
 CONFIG_SPL_SPI_LOAD=y
 CONFIG_CMD_GPIO=y
 CONFIG_CMD_GPT=y
diff --git a/configs/evb-px30_defconfig b/configs/evb-px30_defconfig
index d2fdfef2938..55e2702a172 100644
--- a/configs/evb-px30_defconfig
+++ b/configs/evb-px30_defconfig
@@ -29,7 +29,7 @@ CONFIG_SPL_BOOTROM_SUPPORT=y
 # CONFIG_SPL_RAW_IMAGE_SUPPORT is not set
 CONFIG_SPL_STACK_R=y
 # CONFIG_TPL_BANNER_PRINT is not set
-CONFIG_SPL_CRC32_SUPPORT=y
+CONFIG_SPL_CRC32=y
 CONFIG_SPL_ATF=y
 # CONFIG_TPL_FRAMEWORK is not set
 # CONFIG_CMD_BOOTD is not set
diff --git a/configs/firefly-px30_defconfig b/configs/firefly-px30_defconfig
index 6487615fe08..978a3604053 100644
--- a/configs/firefly-px30_defconfig
+++ b/configs/firefly-px30_defconfig
@@ -30,7 +30,7 @@ CONFIG_SPL_BOOTROM_SUPPORT=y
 # CONFIG_SPL_RAW_IMAGE_SUPPORT is not set
 CONFIG_SPL_STACK_R=y
 # CONFIG_TPL_BANNER_PRINT is not set
-CONFIG_SPL_CRC32_SUPPORT=y
+CONFIG_SPL_CRC32=y
 CONFIG_SPL_ATF=y
 # CONFIG_TPL_FRAMEWORK is not set
 # CONFIG_CMD_BOOTD is not set
diff --git a/configs/imxrt1020-evk_defconfig b/configs/imxrt1020-evk_defconfig
index 9bddb69cd41..ca7c1c90799 100644
--- a/configs/imxrt1020-evk_defconfig
+++ b/configs/imxrt1020-evk_defconfig
@@ -24,7 +24,7 @@ CONFIG_SPL_BOARD_INIT=y
 CONFIG_SPL_SYS_MALLOC_SIMPLE=y
 CONFIG_SYS_MMCSD_RAW_MODE_U_BOOT_USE_SECTOR=y
 CONFIG_SYS_MMCSD_RAW_MODE_U_BOOT_SECTOR=0x100
-# CONFIG_SPL_CRC32_SUPPORT is not set
+# CONFIG_SPL_CRC32 is not set
 # CONFIG_BOOTM_NETBSD is not set
 # CONFIG_BOOTM_PLAN9 is not set
 # CONFIG_BOOTM_RTEMS is not set
diff --git a/configs/imxrt1050-evk_defconfig b/configs/imxrt1050-evk_defconfig
index f639ea76230..ca53bccb5fd 100644
--- a/configs/imxrt1050-evk_defconfig
+++ b/configs/imxrt1050-evk_defconfig
@@ -27,7 +27,7 @@ CONFIG_SPL_BOARD_INIT=y
 CONFIG_SPL_SYS_MALLOC_SIMPLE=y
 CONFIG_SYS_MMCSD_RAW_MODE_U_BOOT_USE_SECTOR=y
 CONFIG_SYS_MMCSD_RAW_MODE_U_BOOT_SECTOR=0x100
-# CONFIG_SPL_CRC32_SUPPORT is not set
+# CONFIG_SPL_CRC32 is not set
 # CONFIG_BOOTM_NETBSD is not set
 # CONFIG_BOOTM_PLAN9 is not set
 # CONFIG_BOOTM_RTEMS is not set
diff --git a/configs/odroid-go2_defconfig b/configs/odroid-go2_defconfig
index 6aa41e37557..82e340a16ee 100644
--- a/configs/odroid-go2_defconfig
+++ b/configs/odroid-go2_defconfig
@@ -33,7 +33,7 @@ CONFIG_SPL_BOOTROM_SUPPORT=y
 # CONFIG_SPL_RAW_IMAGE_SUPPORT is not set
 CONFIG_SPL_STACK_R=y
 # CONFIG_TPL_BANNER_PRINT is not set
-CONFIG_SPL_CRC32_SUPPORT=y
+CONFIG_SPL_CRC32=y
 CONFIG_SPL_I2C_SUPPORT=y
 CONFIG_SPL_POWER_SUPPORT=y
 CONFIG_SPL_ATF=y
diff --git a/configs/px30-core-ctouch2-px30_defconfig b/configs/px30-core-ctouch2-px30_defconfig
index 1afc146bbf2..3ac0ea4ccc9 100644
--- a/configs/px30-core-ctouch2-px30_defconfig
+++ b/configs/px30-core-ctouch2-px30_defconfig
@@ -30,7 +30,7 @@ CONFIG_SPL_BOOTROM_SUPPORT=y
 # CONFIG_SPL_RAW_IMAGE_SUPPORT is not set
 CONFIG_SPL_STACK_R=y
 # CONFIG_TPL_BANNER_PRINT is not set
-CONFIG_SPL_CRC32_SUPPORT=y
+CONFIG_SPL_CRC32=y
 CONFIG_SPL_ATF=y
 # CONFIG_TPL_FRAMEWORK is not set
 # CONFIG_CMD_BOOTD is not set
diff --git a/configs/px30-core-edimm2.2-px30_defconfig b/configs/px30-core-edimm2.2-px30_defconfig
index 9d78eee84d7..f208297de5e 100644
--- a/configs/px30-core-edimm2.2-px30_defconfig
+++ b/configs/px30-core-edimm2.2-px30_defconfig
@@ -30,7 +30,7 @@ CONFIG_SPL_BOOTROM_SUPPORT=y
 # CONFIG_SPL_RAW_IMAGE_SUPPORT is not set
 CONFIG_SPL_STACK_R=y
 # CONFIG_TPL_BANNER_PRINT is not set
-CONFIG_SPL_CRC32_SUPPORT=y
+CONFIG_SPL_CRC32=y
 CONFIG_SPL_ATF=y
 # CONFIG_TPL_FRAMEWORK is not set
 # CONFIG_CMD_BOOTD is not set
diff --git a/configs/socfpga_agilex_atf_defconfig b/configs/socfpga_agilex_atf_defconfig
index 0de65a22a0c..c265e57e6ce 100644
--- a/configs/socfpga_agilex_atf_defconfig
+++ b/configs/socfpga_agilex_atf_defconfig
@@ -23,7 +23,7 @@ CONFIG_USE_BOOTARGS=y
 CONFIG_BOOTARGS="earlycon"
 CONFIG_USE_BOOTCOMMAND=y
 CONFIG_BOOTCOMMAND="run fatscript; run mmcfitload; run linux_qspi_enable; run mmcfitboot"
-CONFIG_SPL_CRC32_SUPPORT=y
+CONFIG_SPL_CRC32=y
 CONFIG_SPL_CACHE=y
 CONFIG_SPL_SPI_LOAD=y
 CONFIG_SPL_ATF=y
diff --git a/configs/socfpga_agilex_vab_defconfig b/configs/socfpga_agilex_vab_defconfig
index d575dadcfbf..68b6b5e0b4a 100644
--- a/configs/socfpga_agilex_vab_defconfig
+++ b/configs/socfpga_agilex_vab_defconfig
@@ -24,7 +24,7 @@ CONFIG_USE_BOOTARGS=y
 CONFIG_BOOTARGS="earlycon"
 CONFIG_USE_BOOTCOMMAND=y
 CONFIG_BOOTCOMMAND="run fatscript; run mmcfitload; run mmcfitboot"
-CONFIG_SPL_CRC32_SUPPORT=y
+CONFIG_SPL_CRC32=y
 CONFIG_SPL_CACHE=y
 CONFIG_SPL_SPI_LOAD=y
 CONFIG_SPL_ATF=y
diff --git a/configs/socfpga_stratix10_atf_defconfig b/configs/socfpga_stratix10_atf_defconfig
index c187987dd83..8fcabe1f868 100644
--- a/configs/socfpga_stratix10_atf_defconfig
+++ b/configs/socfpga_stratix10_atf_defconfig
@@ -23,7 +23,7 @@ CONFIG_USE_BOOTARGS=y
 CONFIG_BOOTARGS="earlycon"
 CONFIG_USE_BOOTCOMMAND=y
 CONFIG_BOOTCOMMAND="run fatscript; run mmcfitload; run linux_qspi_enable; run mmcfitboot"
-CONFIG_SPL_CRC32_SUPPORT=y
+CONFIG_SPL_CRC32=y
 CONFIG_SPL_SPI_LOAD=y
 CONFIG_SPL_ATF=y
 CONFIG_SPL_ATF_NO_PLATFORM_PARAM=y
diff --git a/configs/taurus_defconfig b/configs/taurus_defconfig
index a79cdf3fa7c..5caf9ab30d6 100644
--- a/configs/taurus_defconfig
+++ b/configs/taurus_defconfig
@@ -36,7 +36,7 @@ CONFIG_BOOTCOMMAND="nand read 0x22000000 0x200000 0x300000; bootm"
 CONFIG_BOARD_EARLY_INIT_F=y
 # CONFIG_SPL_LEGACY_IMAGE_SUPPORT is not set
 CONFIG_SPL_SYS_MALLOC_SIMPLE=y
-CONFIG_SPL_CRC32_SUPPORT=y
+CONFIG_SPL_CRC32=y
 CONFIG_SPL_NAND_SUPPORT=y
 CONFIG_SPL_NAND_DRIVERS=y
 CONFIG_SPL_NAND_ECC=y
diff --git a/include/image.h b/include/image.h
index 3bb12ee3821..5aedc1bb23b 100644
--- a/include/image.h
+++ b/include/image.h
@@ -47,7 +47,7 @@ struct fdt_region;
 #include <linux/libfdt.h>
 #include <fdt_support.h>
 # ifdef CONFIG_SPL_BUILD
-#  ifdef CONFIG_SPL_CRC32_SUPPORT
+#  ifdef CONFIG_SPL_CRC32
 #   define IMAGE_ENABLE_CRC32	1
 #  endif
 #  ifdef CONFIG_SPL_MD5_SUPPORT
-- 
2.31.1.607.g51e8a6a459-goog

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

* [PATCH v2 28/50] image: Drop IMAGE_ENABLE_CRC32
  2021-05-06 14:23 [PATCH v2 00/50] image: Reduce #ifdefs and ad-hoc defines in image code Simon Glass
                   ` (26 preceding siblings ...)
  2021-05-06 14:24 ` [PATCH v2 27/50] Kconfig: Rename SPL_CRC32_SUPPORT to SPL_CRC32 Simon Glass
@ 2021-05-06 14:24 ` Simon Glass
  2021-05-06 14:24 ` [PATCH v2 29/50] Kconfig: Rename SPL_MD5_SUPPORT to SPL_MD5 Simon Glass
                   ` (21 subsequent siblings)
  49 siblings, 0 replies; 91+ messages in thread
From: Simon Glass @ 2021-05-06 14:24 UTC (permalink / raw)
  To: u-boot

Add a host Kconfig for CRC32. With this we can use CONFIG_IS_ENABLED(CRC32)
directly in the host build, so drop the unnecessary indirection.

Add a few more conditions to SPL_CRC32 to avoid build failures as well as
TPL_CRC32. Also update hash.c to make crc32 optional.

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

(no changes since v1)

 common/hash.c      | 13 ++++++++-----
 common/image-fit.c |  2 +-
 common/spl/Kconfig | 13 ++++++++++++-
 include/image.h    |  8 --------
 lib/Kconfig        |  5 +++++
 lib/Makefile       |  4 +---
 tools/Kconfig      |  5 +++++
 7 files changed, 32 insertions(+), 18 deletions(-)

diff --git a/common/hash.c b/common/hash.c
index 1ccc62f162d..67e81e6150d 100644
--- a/common/hash.c
+++ b/common/hash.c
@@ -178,7 +178,7 @@ static int hash_finish_crc16_ccitt(struct hash_algo *algo, void *ctx,
 	return 0;
 }
 
-static int hash_init_crc32(struct hash_algo *algo, void **ctxp)
+static int __maybe_unused hash_init_crc32(struct hash_algo *algo, void **ctxp)
 {
 	uint32_t *ctx = malloc(sizeof(uint32_t));
 	*ctx = 0;
@@ -186,15 +186,16 @@ static int hash_init_crc32(struct hash_algo *algo, void **ctxp)
 	return 0;
 }
 
-static int hash_update_crc32(struct hash_algo *algo, void *ctx,
-			     const void *buf, unsigned int size, int is_last)
+static int __maybe_unused hash_update_crc32(struct hash_algo *algo, void *ctx,
+					    const void *buf, unsigned int size,
+					    int is_last)
 {
 	*((uint32_t *)ctx) = crc32(*((uint32_t *)ctx), buf, size);
 	return 0;
 }
 
-static int hash_finish_crc32(struct hash_algo *algo, void *ctx, void *dest_buf,
-			     int size)
+static int __maybe_unused hash_finish_crc32(struct hash_algo *algo, void *ctx,
+					    void *dest_buf, int size)
 {
 	if (size < algo->digest_size)
 		return -1;
@@ -303,6 +304,7 @@ static struct hash_algo hash_algo[] = {
 		.hash_update	= hash_update_crc16_ccitt,
 		.hash_finish	= hash_finish_crc16_ccitt,
 	},
+#if CONFIG_IS_ENABLED(CRC32)
 	{
 		.name		= "crc32",
 		.digest_size	= 4,
@@ -312,6 +314,7 @@ static struct hash_algo hash_algo[] = {
 		.hash_update	= hash_update_crc32,
 		.hash_finish	= hash_finish_crc32,
 	},
+#endif
 };
 
 /* Try to minimize code size for boards that don't want much hashing */
diff --git a/common/image-fit.c b/common/image-fit.c
index a16e2dd54a5..1ce46a5c72d 100644
--- a/common/image-fit.c
+++ b/common/image-fit.c
@@ -1213,7 +1213,7 @@ int fit_set_timestamp(void *fit, int noffset, time_t timestamp)
 int calculate_hash(const void *data, int data_len, const char *algo,
 			uint8_t *value, int *value_len)
 {
-	if (IMAGE_ENABLE_CRC32 && strcmp(algo, "crc32") == 0) {
+	if (CONFIG_IS_ENABLED(CRC32) && strcmp(algo, "crc32") == 0) {
 		*((uint32_t *)value) = crc32_wd(0, data, data_len,
 							CHUNKSZ_CRC32);
 		*((uint32_t *)value) = cpu_to_uimage(*((uint32_t *)value));
diff --git a/common/spl/Kconfig b/common/spl/Kconfig
index 39fc260566b..8cd41eb1b29 100644
--- a/common/spl/Kconfig
+++ b/common/spl/Kconfig
@@ -409,7 +409,8 @@ config SYS_MMCSD_RAW_MODE_EMMC_BOOT_PARTITION
 
 config SPL_CRC32
 	bool "Support CRC32"
-	default y if SPL_LEGACY_IMAGE_SUPPORT
+	default y if SPL_LEGACY_IMAGE_SUPPORT || SPL_EFI_PARTITION
+	default y if SPL_ENV_SUPPORT || TPL_BLOBLIST
 	help
 	  Enable this to support CRC32 in uImages or FIT images within SPL.
 	  This is a 32-bit checksum value that can be used to verify images.
@@ -1530,6 +1531,16 @@ config TPL_BOOTROM_SUPPORT
 	  BOOT_DEVICE_BOOTROM (or fall-through to the next boot device in the
 	  boot device list, if not implemented for a given board)
 
+config TPL_CRC32
+	bool "Support CRC32 in TPL"
+	default y if TPL_ENV_SUPPORT || TPL_BLOBLIST
+	help
+	  Enable this to support CRC32 in uImages or FIT images within SPL.
+	  This is a 32-bit checksum value that can be used to verify images.
+	  For FIT images, this is the least secure type of checksum, suitable
+	  for detected accidental image corruption. For secure applications you
+	  should consider SHA1 or SHA256.
+
 config TPL_DRIVERS_MISC_SUPPORT
 	bool "Support misc drivers in TPL"
 	help
diff --git a/include/image.h b/include/image.h
index 5aedc1bb23b..e68c2cbf621 100644
--- a/include/image.h
+++ b/include/image.h
@@ -47,9 +47,6 @@ struct fdt_region;
 #include <linux/libfdt.h>
 #include <fdt_support.h>
 # ifdef CONFIG_SPL_BUILD
-#  ifdef CONFIG_SPL_CRC32
-#   define IMAGE_ENABLE_CRC32	1
-#  endif
 #  ifdef CONFIG_SPL_MD5_SUPPORT
 #   define IMAGE_ENABLE_MD5	1
 #  endif
@@ -57,15 +54,10 @@ struct fdt_region;
 #   define IMAGE_ENABLE_SHA1	1
 #  endif
 # else
-#  define IMAGE_ENABLE_CRC32	1
 #  define IMAGE_ENABLE_MD5	1
 #  define IMAGE_ENABLE_SHA1	1
 # endif
 
-#ifndef IMAGE_ENABLE_CRC32
-#define IMAGE_ENABLE_CRC32	0
-#endif
-
 #ifndef IMAGE_ENABLE_MD5
 #define IMAGE_ENABLE_MD5	0
 #endif
diff --git a/lib/Kconfig b/lib/Kconfig
index 6d2d41de301..7d9bf8f6f4e 100644
--- a/lib/Kconfig
+++ b/lib/Kconfig
@@ -422,6 +422,11 @@ config SPL_MD5
 	  security applications, but it can be useful for providing a quick
 	  checksum of a block of data.
 
+config CRC32
+	def_bool y
+	help
+	  Enables CRC32 support in U-Boot. This is normally required.
+
 config CRC32C
 	bool
 
diff --git a/lib/Makefile b/lib/Makefile
index 39acbac123b..da943891bd8 100644
--- a/lib/Makefile
+++ b/lib/Makefile
@@ -94,9 +94,7 @@ obj-y += display_options.o
 CFLAGS_display_options.o := $(if $(BUILD_TAG),-DBUILD_TAG='"$(BUILD_TAG)"')
 obj-$(CONFIG_BCH) += bch.o
 obj-$(CONFIG_MMC_SPI) += crc7.o
-#ifndef CONFIG_TPL_BUILD
-obj-y += crc32.o
-#endif
+obj-$(CONFIG_$(SPL_TPL_)CRC32) += crc32.o
 obj-$(CONFIG_CRC32C) += crc32c.o
 obj-y += ctype.o
 obj-y += div64.o
diff --git a/tools/Kconfig b/tools/Kconfig
index 8bd782cf5b9..e27826fae9f 100644
--- a/tools/Kconfig
+++ b/tools/Kconfig
@@ -9,6 +9,11 @@ config MKIMAGE_DTC_PATH
 	  some cases the system dtc may not support all required features
 	  and the path to a different version should be given here.
 
+config HOST_CRC32
+	def_bool y
+	help
+	  Enable CRC32 support in the host build
+
 config HOST_FIT
 	def_bool y
 	help
-- 
2.31.1.607.g51e8a6a459-goog

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

* [PATCH v2 29/50] Kconfig: Rename SPL_MD5_SUPPORT to SPL_MD5
  2021-05-06 14:23 [PATCH v2 00/50] image: Reduce #ifdefs and ad-hoc defines in image code Simon Glass
                   ` (27 preceding siblings ...)
  2021-05-06 14:24 ` [PATCH v2 28/50] image: Drop IMAGE_ENABLE_CRC32 Simon Glass
@ 2021-05-06 14:24 ` 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
                   ` (20 subsequent siblings)
  49 siblings, 1 reply; 91+ messages in thread
From: Simon Glass @ 2021-05-06 14:24 UTC (permalink / raw)
  To: u-boot

Drop the _SUPPORT suffix so we can use CONFIG_IS_ENABLED() with this
option.

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

(no changes since v1)

 common/spl/Kconfig | 2 +-
 include/image.h    | 2 +-
 2 files changed, 2 insertions(+), 2 deletions(-)

diff --git a/common/spl/Kconfig b/common/spl/Kconfig
index 8cd41eb1b29..e6d00caaa85 100644
--- a/common/spl/Kconfig
+++ b/common/spl/Kconfig
@@ -418,7 +418,7 @@ config SPL_CRC32
 	  for detected accidental image corruption. For secure applications you
 	  should consider SHA1 or SHA256.
 
-config SPL_MD5_SUPPORT
+config SPL_MD5
 	bool "Support MD5"
 	depends on SPL_FIT
 	help
diff --git a/include/image.h b/include/image.h
index e68c2cbf621..e1e4bf6806f 100644
--- a/include/image.h
+++ b/include/image.h
@@ -47,7 +47,7 @@ struct fdt_region;
 #include <linux/libfdt.h>
 #include <fdt_support.h>
 # ifdef CONFIG_SPL_BUILD
-#  ifdef CONFIG_SPL_MD5_SUPPORT
+#  ifdef CONFIG_SPL_MD5
 #   define IMAGE_ENABLE_MD5	1
 #  endif
 #  ifdef CONFIG_SPL_FIT_SHA1
-- 
2.31.1.607.g51e8a6a459-goog

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

* [PATCH v2 30/50] image: Drop IMAGE_ENABLE_MD5
  2021-05-06 14:23 [PATCH v2 00/50] image: Reduce #ifdefs and ad-hoc defines in image code Simon Glass
                   ` (28 preceding siblings ...)
  2021-05-06 14:24 ` [PATCH v2 29/50] Kconfig: Rename SPL_MD5_SUPPORT to SPL_MD5 Simon Glass
@ 2021-05-06 14:24 ` Simon Glass
  2021-05-06 14:24 ` [PATCH v2 31/50] image: Drop IMAGE_ENABLE_SHA1 Simon Glass
                   ` (19 subsequent siblings)
  49 siblings, 0 replies; 91+ messages in thread
From: Simon Glass @ 2021-05-06 14:24 UTC (permalink / raw)
  To: u-boot

Add a host Kconfig for MD5. With this we can use CONFIG_IS_ENABLED(MD5)
directly in the host build, so drop the unnecessary indirection.

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

(no changes since v1)

 common/image-fit.c | 2 +-
 include/image.h    | 8 --------
 tools/Kconfig      | 5 +++++
 3 files changed, 6 insertions(+), 9 deletions(-)

diff --git a/common/image-fit.c b/common/image-fit.c
index 1ce46a5c72d..19a2d3c91df 100644
--- a/common/image-fit.c
+++ b/common/image-fit.c
@@ -1234,7 +1234,7 @@ int calculate_hash(const void *data, int data_len, const char *algo,
 		sha512_csum_wd((unsigned char *)data, data_len,
 			       (unsigned char *)value, CHUNKSZ_SHA512);
 		*value_len = SHA512_SUM_LEN;
-	} else if (IMAGE_ENABLE_MD5 && strcmp(algo, "md5") == 0) {
+	} else if (CONFIG_IS_ENABLED(MD5) && strcmp(algo, "md5") == 0) {
 		md5_wd((unsigned char *)data, data_len, value, CHUNKSZ_MD5);
 		*value_len = 16;
 	} else {
diff --git a/include/image.h b/include/image.h
index e1e4bf6806f..9f665a597b0 100644
--- a/include/image.h
+++ b/include/image.h
@@ -47,21 +47,13 @@ struct fdt_region;
 #include <linux/libfdt.h>
 #include <fdt_support.h>
 # ifdef CONFIG_SPL_BUILD
-#  ifdef CONFIG_SPL_MD5
-#   define IMAGE_ENABLE_MD5	1
-#  endif
 #  ifdef CONFIG_SPL_FIT_SHA1
 #   define IMAGE_ENABLE_SHA1	1
 #  endif
 # else
-#  define IMAGE_ENABLE_MD5	1
 #  define IMAGE_ENABLE_SHA1	1
 # endif
 
-#ifndef IMAGE_ENABLE_MD5
-#define IMAGE_ENABLE_MD5	0
-#endif
-
 #ifndef IMAGE_ENABLE_SHA1
 #define IMAGE_ENABLE_SHA1	0
 #endif
diff --git a/tools/Kconfig b/tools/Kconfig
index e27826fae9f..bbd6e8b9d79 100644
--- a/tools/Kconfig
+++ b/tools/Kconfig
@@ -69,6 +69,11 @@ config HOST_FIT_VERBOSE
 	help
 	  Support verbose FIT output in the host build
 
+config HOST_MD5
+	def_bool y
+	help
+	  Enable MD5 support in the host build
+
 config HOST_OF_LIBFDT
 	def_bool y
 	help
-- 
2.31.1.607.g51e8a6a459-goog

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

* [PATCH v2 31/50] image: Drop IMAGE_ENABLE_SHA1
  2021-05-06 14:23 [PATCH v2 00/50] image: Reduce #ifdefs and ad-hoc defines in image code Simon Glass
                   ` (29 preceding siblings ...)
  2021-05-06 14:24 ` [PATCH v2 30/50] image: Drop IMAGE_ENABLE_MD5 Simon Glass
@ 2021-05-06 14:24 ` Simon Glass
  2021-05-06 14:24 ` [PATCH v2 32/50] image: Drop IMAGE_ENABLE_SHAxxx Simon Glass
                   ` (18 subsequent siblings)
  49 siblings, 0 replies; 91+ messages in thread
From: Simon Glass @ 2021-05-06 14:24 UTC (permalink / raw)
  To: u-boot

We already have a host Kconfig for SHA1. Use CONFIG_IS_ENABLED(SHA1)
directly in the code shared with the host build, so we can drop the
unnecessary indirection.

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

(no changes since v1)

 common/image-fit.c |  2 +-
 include/image.h    | 11 -----------
 2 files changed, 1 insertion(+), 12 deletions(-)

diff --git a/common/image-fit.c b/common/image-fit.c
index 19a2d3c91df..96794074b63 100644
--- a/common/image-fit.c
+++ b/common/image-fit.c
@@ -1218,7 +1218,7 @@ int calculate_hash(const void *data, int data_len, const char *algo,
 							CHUNKSZ_CRC32);
 		*((uint32_t *)value) = cpu_to_uimage(*((uint32_t *)value));
 		*value_len = 4;
-	} else if (IMAGE_ENABLE_SHA1 && strcmp(algo, "sha1") == 0) {
+	} else if (CONFIG_IS_ENABLED(SHA1) && strcmp(algo, "sha1") == 0) {
 		sha1_csum_wd((unsigned char *)data, data_len,
 			     (unsigned char *)value, CHUNKSZ_SHA1);
 		*value_len = 20;
diff --git a/include/image.h b/include/image.h
index 9f665a597b0..f5ff77bf0ca 100644
--- a/include/image.h
+++ b/include/image.h
@@ -46,17 +46,6 @@ struct fdt_region;
 #include <hash.h>
 #include <linux/libfdt.h>
 #include <fdt_support.h>
-# ifdef CONFIG_SPL_BUILD
-#  ifdef CONFIG_SPL_FIT_SHA1
-#   define IMAGE_ENABLE_SHA1	1
-#  endif
-# else
-#  define IMAGE_ENABLE_SHA1	1
-# endif
-
-#ifndef IMAGE_ENABLE_SHA1
-#define IMAGE_ENABLE_SHA1	0
-#endif
 
 #if defined(CONFIG_FIT_SHA256) || \
 	defined(CONFIG_SPL_FIT_SHA256)
-- 
2.31.1.607.g51e8a6a459-goog

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

* [PATCH v2 32/50] image: Drop IMAGE_ENABLE_SHAxxx
  2021-05-06 14:23 [PATCH v2 00/50] image: Reduce #ifdefs and ad-hoc defines in image code Simon Glass
                   ` (30 preceding siblings ...)
  2021-05-06 14:24 ` [PATCH v2 31/50] image: Drop IMAGE_ENABLE_SHA1 Simon Glass
@ 2021-05-06 14:24 ` Simon Glass
  2021-05-06 14:24 ` [PATCH v2 33/50] image: Drop IMAGE_BOOT_GET_CMDLINE Simon Glass
                   ` (17 subsequent siblings)
  49 siblings, 0 replies; 91+ messages in thread
From: Simon Glass @ 2021-05-06 14:24 UTC (permalink / raw)
  To: u-boot

We already have a host Kconfig for these SHA options. Use
CONFIG_IS_ENABLED(SHAxxx) directly in the code shared with the host build,
so we can drop the unnecessary indirections.

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

(no changes since v1)

 common/image-fit.c |  6 +++---
 include/image.h    | 21 ---------------------
 2 files changed, 3 insertions(+), 24 deletions(-)

diff --git a/common/image-fit.c b/common/image-fit.c
index 96794074b63..070835b3a87 100644
--- a/common/image-fit.c
+++ b/common/image-fit.c
@@ -1222,15 +1222,15 @@ int calculate_hash(const void *data, int data_len, const char *algo,
 		sha1_csum_wd((unsigned char *)data, data_len,
 			     (unsigned char *)value, CHUNKSZ_SHA1);
 		*value_len = 20;
-	} else if (IMAGE_ENABLE_SHA256 && strcmp(algo, "sha256") == 0) {
+	} else if (CONFIG_IS_ENABLED(SHA256) && strcmp(algo, "sha256") == 0) {
 		sha256_csum_wd((unsigned char *)data, data_len,
 			       (unsigned char *)value, CHUNKSZ_SHA256);
 		*value_len = SHA256_SUM_LEN;
-	} else if (IMAGE_ENABLE_SHA384 && strcmp(algo, "sha384") == 0) {
+	} else if (CONFIG_IS_ENABLED(SHA384) && strcmp(algo, "sha384") == 0) {
 		sha384_csum_wd((unsigned char *)data, data_len,
 			       (unsigned char *)value, CHUNKSZ_SHA384);
 		*value_len = SHA384_SUM_LEN;
-	} else if (IMAGE_ENABLE_SHA512 && strcmp(algo, "sha512") == 0) {
+	} else if (CONFIG_IS_ENABLED(SHA512) && strcmp(algo, "sha512") == 0) {
 		sha512_csum_wd((unsigned char *)data, data_len,
 			       (unsigned char *)value, CHUNKSZ_SHA512);
 		*value_len = SHA512_SUM_LEN;
diff --git a/include/image.h b/include/image.h
index f5ff77bf0ca..f4b8dd7dd0f 100644
--- a/include/image.h
+++ b/include/image.h
@@ -47,27 +47,6 @@ struct fdt_region;
 #include <linux/libfdt.h>
 #include <fdt_support.h>
 
-#if defined(CONFIG_FIT_SHA256) || \
-	defined(CONFIG_SPL_FIT_SHA256)
-#define IMAGE_ENABLE_SHA256	1
-#else
-#define IMAGE_ENABLE_SHA256	0
-#endif
-
-#if defined(CONFIG_FIT_SHA384) || \
-	defined(CONFIG_SPL_FIT_SHA384)
-#define IMAGE_ENABLE_SHA384	1
-#else
-#define IMAGE_ENABLE_SHA384	0
-#endif
-
-#if defined(CONFIG_FIT_SHA512) || \
-	defined(CONFIG_SPL_FIT_SHA512)
-#define IMAGE_ENABLE_SHA512	1
-#else
-#define IMAGE_ENABLE_SHA512	0
-#endif
-
 #endif /* FIT */
 
 #ifdef CONFIG_SYS_BOOT_GET_CMDLINE
-- 
2.31.1.607.g51e8a6a459-goog

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

* [PATCH v2 33/50] image: Drop IMAGE_BOOT_GET_CMDLINE
  2021-05-06 14:23 [PATCH v2 00/50] image: Reduce #ifdefs and ad-hoc defines in image code Simon Glass
                   ` (31 preceding siblings ...)
  2021-05-06 14:24 ` [PATCH v2 32/50] image: Drop IMAGE_ENABLE_SHAxxx Simon Glass
@ 2021-05-06 14:24 ` Simon Glass
  2021-05-06 14:24 ` [PATCH v2 34/50] image: Drop IMAGE_OF_BOARD_SETUP Simon Glass
                   ` (16 subsequent siblings)
  49 siblings, 0 replies; 91+ messages in thread
From: Simon Glass @ 2021-05-06 14:24 UTC (permalink / raw)
  To: u-boot

This is not needed with Kconfig, since we can use IS_ENABLED() easily
enough. Update the only place where this is used and drop it.

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

(no changes since v1)

 common/image-board.c | 2 +-
 include/image.h      | 6 ------
 2 files changed, 1 insertion(+), 7 deletions(-)

diff --git a/common/image-board.c b/common/image-board.c
index 0b9809c3f6b..1a3b0bc7efc 100644
--- a/common/image-board.c
+++ b/common/image-board.c
@@ -898,7 +898,7 @@ int image_setup_linux(bootm_headers_t *images)
 	if (CONFIG_IS_ENABLED(OF_LIBFDT))
 		boot_fdt_add_mem_rsv_regions(lmb, *of_flat_tree);
 
-	if (IMAGE_BOOT_GET_CMDLINE) {
+	if (IS_ENABLED(CONFIG_SYS_BOOT_GET_CMDLINE)) {
 		ret = boot_get_cmdline(lmb, &images->cmdline_start,
 				       &images->cmdline_end);
 		if (ret) {
diff --git a/include/image.h b/include/image.h
index f4b8dd7dd0f..122fc25e1b4 100644
--- a/include/image.h
+++ b/include/image.h
@@ -49,12 +49,6 @@ struct fdt_region;
 
 #endif /* FIT */
 
-#ifdef CONFIG_SYS_BOOT_GET_CMDLINE
-# define IMAGE_BOOT_GET_CMDLINE		1
-#else
-# define IMAGE_BOOT_GET_CMDLINE		0
-#endif
-
 #ifdef CONFIG_OF_BOARD_SETUP
 # define IMAGE_OF_BOARD_SETUP		1
 #else
-- 
2.31.1.607.g51e8a6a459-goog

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

* [PATCH v2 34/50] image: Drop IMAGE_OF_BOARD_SETUP
  2021-05-06 14:23 [PATCH v2 00/50] image: Reduce #ifdefs and ad-hoc defines in image code Simon Glass
                   ` (32 preceding siblings ...)
  2021-05-06 14:24 ` [PATCH v2 33/50] image: Drop IMAGE_BOOT_GET_CMDLINE Simon Glass
@ 2021-05-06 14:24 ` Simon Glass
  2021-05-06 14:24 ` [PATCH v2 35/50] image: Drop IMAGE_OF_SYSTEM_SETUP Simon Glass
                   ` (15 subsequent siblings)
  49 siblings, 0 replies; 91+ messages in thread
From: Simon Glass @ 2021-05-06 14:24 UTC (permalink / raw)
  To: u-boot

This is not needed with Kconfig, since we can use IS_ENABLED() easily
enough. Drop it.

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

(no changes since v1)

 common/image-fdt.c | 4 ++--
 include/image.h    | 6 ------
 2 files changed, 2 insertions(+), 8 deletions(-)

diff --git a/common/image-fdt.c b/common/image-fdt.c
index d50e1ba3feb..c2d9710bfaa 100644
--- a/common/image-fdt.c
+++ b/common/image-fdt.c
@@ -575,7 +575,7 @@ int image_setup_libfdt(bootm_headers_t *images, void *blob,
 	/* Append PStore configuration */
 	fdt_fixup_pstore(blob);
 #endif
-	if (IMAGE_OF_BOARD_SETUP) {
+	if (IS_ENABLED(CONFIG_OF_BOARD_SETUP)) {
 		const char *skip_board_fixup;
 
 		skip_board_fixup = env_get("skip_board_fixup");
@@ -622,7 +622,7 @@ int image_setup_libfdt(bootm_headers_t *images, void *blob,
 		goto err;
 
 #if defined(CONFIG_SOC_KEYSTONE)
-	if (IMAGE_OF_BOARD_SETUP)
+	if (IS_ENABLED(CONFIG_OF_BOARD_SETUP))
 		ft_board_setup_ex(blob, gd->bd);
 #endif
 
diff --git a/include/image.h b/include/image.h
index 122fc25e1b4..deb690d168b 100644
--- a/include/image.h
+++ b/include/image.h
@@ -49,12 +49,6 @@ struct fdt_region;
 
 #endif /* FIT */
 
-#ifdef CONFIG_OF_BOARD_SETUP
-# define IMAGE_OF_BOARD_SETUP		1
-#else
-# define IMAGE_OF_BOARD_SETUP		0
-#endif
-
 #ifdef CONFIG_OF_SYSTEM_SETUP
 # define IMAGE_OF_SYSTEM_SETUP	1
 #else
-- 
2.31.1.607.g51e8a6a459-goog

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

* [PATCH v2 35/50] image: Drop IMAGE_OF_SYSTEM_SETUP
  2021-05-06 14:23 [PATCH v2 00/50] image: Reduce #ifdefs and ad-hoc defines in image code Simon Glass
                   ` (33 preceding siblings ...)
  2021-05-06 14:24 ` [PATCH v2 34/50] image: Drop IMAGE_OF_BOARD_SETUP Simon Glass
@ 2021-05-06 14:24 ` Simon Glass
  2021-05-06 14:24 ` [PATCH v2 36/50] image: Drop IMAGE_ENABLE_IGNORE Simon Glass
                   ` (14 subsequent siblings)
  49 siblings, 0 replies; 91+ messages in thread
From: Simon Glass @ 2021-05-06 14:24 UTC (permalink / raw)
  To: u-boot

This is not needed with Kconfig, since we can use IS_ENABLED() easily
enough. Drop it.

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

(no changes since v1)

 common/image-fdt.c | 2 +-
 include/image.h    | 6 ------
 2 files changed, 1 insertion(+), 7 deletions(-)

diff --git a/common/image-fdt.c b/common/image-fdt.c
index c2d9710bfaa..80bfa625ab2 100644
--- a/common/image-fdt.c
+++ b/common/image-fdt.c
@@ -590,7 +590,7 @@ int image_setup_libfdt(bootm_headers_t *images, void *blob,
 			}
 		}
 	}
-	if (IMAGE_OF_SYSTEM_SETUP) {
+	if (IS_ENABLED(CONFIG_OF_SYSTEM_SETUP)) {
 		fdt_ret = ft_system_setup(blob, gd->bd);
 		if (fdt_ret) {
 			printf("ERROR: system-specific fdt fixup failed: %s\n",
diff --git a/include/image.h b/include/image.h
index deb690d168b..eb5ca8a32d3 100644
--- a/include/image.h
+++ b/include/image.h
@@ -49,12 +49,6 @@ struct fdt_region;
 
 #endif /* FIT */
 
-#ifdef CONFIG_OF_SYSTEM_SETUP
-# define IMAGE_OF_SYSTEM_SETUP	1
-#else
-# define IMAGE_OF_SYSTEM_SETUP	0
-#endif
-
 extern ulong image_load_addr;		/* Default Load Address */
 extern ulong image_save_addr;		/* Default Save Address */
 extern ulong image_save_size;		/* Default Save Size */
-- 
2.31.1.607.g51e8a6a459-goog

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

* [PATCH v2 36/50] image: Drop IMAGE_ENABLE_IGNORE
  2021-05-06 14:23 [PATCH v2 00/50] image: Reduce #ifdefs and ad-hoc defines in image code Simon Glass
                   ` (34 preceding siblings ...)
  2021-05-06 14:24 ` [PATCH v2 35/50] image: Drop IMAGE_OF_SYSTEM_SETUP Simon Glass
@ 2021-05-06 14:24 ` Simon Glass
  2021-05-06 14:24 ` [PATCH v2 37/50] image: Drop IMAGE_ENABLE_SIGN/VERIFY defines Simon Glass
                   ` (13 subsequent siblings)
  49 siblings, 0 replies; 91+ messages in thread
From: Simon Glass @ 2021-05-06 14:24 UTC (permalink / raw)
  To: u-boot

We can use the new host_build() function for this, so drop it.

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

(no changes since v1)

 common/image-fit.c | 2 +-
 include/image.h    | 3 ---
 2 files changed, 1 insertion(+), 4 deletions(-)

diff --git a/common/image-fit.c b/common/image-fit.c
index 070835b3a87..c13ff6bba24 100644
--- a/common/image-fit.c
+++ b/common/image-fit.c
@@ -1262,7 +1262,7 @@ static int fit_image_check_hash(const void *fit, int noffset, const void *data,
 	}
 	printf("%s", algo);
 
-	if (IMAGE_ENABLE_IGNORE) {
+	if (!host_build()) {
 		fit_image_hash_get_ignore(fit, noffset, &ignore);
 		if (ignore) {
 			printf("-skipped ");
diff --git a/include/image.h b/include/image.h
index eb5ca8a32d3..64866c609f4 100644
--- a/include/image.h
+++ b/include/image.h
@@ -27,7 +27,6 @@ struct fdt_region;
 #include <sys/types.h>
 #include <linux/kconfig.h>
 
-#define IMAGE_ENABLE_IGNORE	0
 #define IMAGE_INDENT_STRING	""
 
 #else
@@ -36,8 +35,6 @@ struct fdt_region;
 #include <asm/u-boot.h>
 #include <command.h>
 
-/* Take notice of the 'ignore' property for hashes */
-#define IMAGE_ENABLE_IGNORE	1
 #define IMAGE_INDENT_STRING	"   "
 
 #endif /* USE_HOSTCC */
-- 
2.31.1.607.g51e8a6a459-goog

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

* [PATCH v2 37/50] image: Drop IMAGE_ENABLE_SIGN/VERIFY defines
  2021-05-06 14:23 [PATCH v2 00/50] image: Reduce #ifdefs and ad-hoc defines in image code Simon Glass
                   ` (35 preceding siblings ...)
  2021-05-06 14:24 ` [PATCH v2 36/50] image: Drop IMAGE_ENABLE_IGNORE Simon Glass
@ 2021-05-06 14:24 ` Simon Glass
  2021-05-14 20:38   ` Alex G.
  2021-05-06 14:24 ` [PATCH v2 38/50] image: Drop IMAGE_ENABLE_BEST_MATCH Simon Glass
                   ` (12 subsequent siblings)
  49 siblings, 1 reply; 91+ messages in thread
From: Simon Glass @ 2021-05-06 14:24 UTC (permalink / raw)
  To: u-boot

Add host Kconfigs for FIT_SIGN and RSA_VERIFY. With these we can use
CONFIG_IS_ENABLED() directly in the host build, so drop the unnecessary
indirections IMAGE_ENABLE_SIGN and HOST_RSA_VERIFY. Also drop
FIT_IMAGE_ENABLE_VERIFY which is not actually used.

Leave IMAGE_ENABLE_VERIFY_ECDSA along since this feature is incomplete
and needs to be integrated with RSA.

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

(no changes since v1)

 common/image-fit.c     |  6 +++---
 common/image-sig.c     | 10 +++++-----
 include/image.h        | 13 ++-----------
 include/u-boot/ecdsa.h |  2 +-
 include/u-boot/rsa.h   |  4 ++--
 tools/Kconfig          | 10 ++++++++++
 tools/image-host.c     |  4 ++--
 7 files changed, 25 insertions(+), 24 deletions(-)

diff --git a/common/image-fit.c b/common/image-fit.c
index c13ff6bba24..e81a0858dc1 100644
--- a/common/image-fit.c
+++ b/common/image-fit.c
@@ -1301,7 +1301,7 @@ int fit_image_verify_with_data(const void *fit, int image_noffset,
 	int ret;
 
 	/* Verify all required signatures */
-	if (FIT_IMAGE_ENABLE_VERIFY &&
+	if (CONFIG_IS_ENABLED(RSA_VERIFY) &&
 	    fit_image_verify_required_sigs(fit, image_noffset, data, size,
 					   gd_fdt_blob(), &verify_all)) {
 		err_msg = "Unable to verify required signature";
@@ -1323,7 +1323,7 @@ int fit_image_verify_with_data(const void *fit, int image_noffset,
 						 &err_msg))
 				goto error;
 			puts("+ ");
-		} else if (FIT_IMAGE_ENABLE_VERIFY && verify_all &&
+		} else if (CONFIG_IS_ENABLED(RSA_VERIFY) && verify_all &&
 				!strncmp(name, FIT_SIG_NODENAME,
 					strlen(FIT_SIG_NODENAME))) {
 			ret = fit_image_check_sig(fit, noffset, data,
@@ -2045,7 +2045,7 @@ int fit_image_load(bootm_headers_t *images, ulong addr,
 		if (image_type == IH_TYPE_KERNEL)
 			images->fit_uname_cfg = fit_base_uname_config;
 
-		if (FIT_IMAGE_ENABLE_VERIFY && images->verify) {
+		if (CONFIG_IS_ENABLED(RSA_VERIFY) && images->verify) {
 			puts("   Verifying Hash Integrity ... ");
 			if (fit_config_verify(fit, cfg_noffset)) {
 				puts("Bad Data Hash\n");
diff --git a/common/image-sig.c b/common/image-sig.c
index bbc6bb3b1e3..74ca96a39e9 100644
--- a/common/image-sig.c
+++ b/common/image-sig.c
@@ -29,7 +29,7 @@ struct checksum_algo checksum_algos[] = {
 		.checksum_len = SHA1_SUM_LEN,
 		.der_len = SHA1_DER_LEN,
 		.der_prefix = sha1_der_prefix,
-#if IMAGE_ENABLE_SIGN
+#if CONFIG_IS_ENABLED(FIT_SIGN)
 		.calculate_sign = EVP_sha1,
 #endif
 		.calculate = hash_calculate,
@@ -39,7 +39,7 @@ struct checksum_algo checksum_algos[] = {
 		.checksum_len = SHA256_SUM_LEN,
 		.der_len = SHA256_DER_LEN,
 		.der_prefix = sha256_der_prefix,
-#if IMAGE_ENABLE_SIGN
+#if CONFIG_IS_ENABLED(FIT_SIGN)
 		.calculate_sign = EVP_sha256,
 #endif
 		.calculate = hash_calculate,
@@ -50,7 +50,7 @@ struct checksum_algo checksum_algos[] = {
 		.checksum_len = SHA384_SUM_LEN,
 		.der_len = SHA384_DER_LEN,
 		.der_prefix = sha384_der_prefix,
-#if IMAGE_ENABLE_SIGN
+#if CONFIG_IS_ENABLED(FIT_SIGN)
 		.calculate_sign = EVP_sha384,
 #endif
 		.calculate = hash_calculate,
@@ -62,7 +62,7 @@ struct checksum_algo checksum_algos[] = {
 		.checksum_len = SHA512_SUM_LEN,
 		.der_len = SHA512_DER_LEN,
 		.der_prefix = sha512_der_prefix,
-#if IMAGE_ENABLE_SIGN
+#if CONFIG_IS_ENABLED(FIT_SIGN)
 		.calculate_sign = EVP_sha512,
 #endif
 		.calculate = hash_calculate,
@@ -122,7 +122,7 @@ struct checksum_algo *image_get_checksum_algo(const char *full_name)
 				struct checksum_algo *algo = &checksum_algos[i];
 
 				MANUAL_RELOC(algo->name);
-#if IMAGE_ENABLE_SIGN
+#if CONFIG_IS_ENABLED(FIT_SIGN)
 				MANUAL_RELOC(algo->calculate_sign);
 #endif
 				MANUAL_RELOC(algo->calculate);
diff --git a/include/image.h b/include/image.h
index 64866c609f4..12043abd049 100644
--- a/include/image.h
+++ b/include/image.h
@@ -1139,22 +1139,13 @@ int calculate_hash(const void *data, int data_len, const char *algo,
  */
 #if defined(USE_HOSTCC)
 # if defined(CONFIG_FIT_SIGNATURE)
-#  define IMAGE_ENABLE_SIGN	1
-#  define IMAGE_ENABLE_VERIFY	1
 #  define IMAGE_ENABLE_VERIFY_ECDSA	1
-#  define FIT_IMAGE_ENABLE_VERIFY	1
 #  include <openssl/evp.h>
 # else
-#  define IMAGE_ENABLE_SIGN	0
-#  define IMAGE_ENABLE_VERIFY	0
 # define IMAGE_ENABLE_VERIFY_ECDSA	0
-#  define FIT_IMAGE_ENABLE_VERIFY	0
 # endif
 #else
-# define IMAGE_ENABLE_SIGN	0
-# define IMAGE_ENABLE_VERIFY		CONFIG_IS_ENABLED(RSA_VERIFY)
 # define IMAGE_ENABLE_VERIFY_ECDSA	0
-# define FIT_IMAGE_ENABLE_VERIFY	CONFIG_IS_ENABLED(FIT_SIGNATURE)
 #endif
 
 #if CONFIG_IS_ENABLED(FIT)
@@ -1209,7 +1200,7 @@ struct image_region {
 	int size;
 };
 
-#if IMAGE_ENABLE_VERIFY
+#if CONFIG_IS_ENABLED(RSA_VERIFY)
 # include <u-boot/hash-checksum.h>
 #endif
 struct checksum_algo {
@@ -1217,7 +1208,7 @@ struct checksum_algo {
 	const int checksum_len;
 	const int der_len;
 	const uint8_t *der_prefix;
-#if IMAGE_ENABLE_SIGN
+#if CONFIG_IS_ENABLED(FIT_SIGN)
 	const EVP_MD *(*calculate_sign)(void);
 #endif
 	int (*calculate)(const char *name,
diff --git a/include/u-boot/ecdsa.h b/include/u-boot/ecdsa.h
index 979690d9660..a446b656a29 100644
--- a/include/u-boot/ecdsa.h
+++ b/include/u-boot/ecdsa.h
@@ -15,7 +15,7 @@
  * @see "struct crypto_algo"
  * @{
  */
-#if IMAGE_ENABLE_SIGN
+#if CONFIG_IS_ENABLED(FIT_SIGN)
 /**
  * sign() - calculate and return signature for given input data
  *
diff --git a/include/u-boot/rsa.h b/include/u-boot/rsa.h
index 45fe3509093..84cefbab442 100644
--- a/include/u-boot/rsa.h
+++ b/include/u-boot/rsa.h
@@ -31,7 +31,7 @@ struct rsa_public_key {
 
 struct image_sign_info;
 
-#if IMAGE_ENABLE_SIGN
+#if CONFIG_IS_ENABLED(FIT_SIGN)
 /**
  * sign() - calculate and return signature for given input data
  *
@@ -81,7 +81,7 @@ static inline int rsa_add_verify_data(struct image_sign_info *info,
 }
 #endif
 
-#if IMAGE_ENABLE_VERIFY
+#if CONFIG_IS_ENABLED(RSA_VERIFY)
 /**
  * rsa_verify_hash() - Verify a signature against a hash
  *
diff --git a/tools/Kconfig b/tools/Kconfig
index bbd6e8b9d79..13f923c7ac7 100644
--- a/tools/Kconfig
+++ b/tools/Kconfig
@@ -59,6 +59,11 @@ config HOST_FIT_SIGNATURE
 	help
 	  Enable signature verification of FIT uImages in the host build
 
+config HOST_FIT_SIGN
+	def_bool y
+	help
+	  Enable signing FIT uImages in the host build
+
 config HOST_FIT_SIGNATURE_MAX_SIZE
 	hex
 	depends on HOST_FIT_SIGNATURE
@@ -79,6 +84,11 @@ config HOST_OF_LIBFDT
 	help
 	  Enable libfdt support in the host build.
 
+config HOST_RSA_VERIFY
+	def_bool y
+	help
+	  Enable RSA verification support in the host build.
+
 config HOST_SHA1
 	def_bool y
 	help
diff --git a/tools/image-host.c b/tools/image-host.c
index 270d36fe451..2be897db943 100644
--- a/tools/image-host.c
+++ b/tools/image-host.c
@@ -636,7 +636,7 @@ int fit_image_add_verification_data(const char *keydir, const char *keyfile,
 			     strlen(FIT_HASH_NODENAME))) {
 			ret = fit_image_process_hash(fit, image_name, noffset,
 						data, size);
-		} else if (IMAGE_ENABLE_SIGN && (keydir || keyfile) &&
+		} else if (CONFIG_IS_ENABLED(FIT_SIGN) && (keydir || keyfile) &&
 			   !strncmp(node_name, FIT_SIG_NODENAME,
 				strlen(FIT_SIG_NODENAME))) {
 			ret = fit_image_process_sig(keydir, keyfile, keydest,
@@ -1086,7 +1086,7 @@ int fit_add_verification_data(const char *keydir, const char *keyfile,
 	}
 
 	/* If there are no keys, we can't sign configurations */
-	if (!IMAGE_ENABLE_SIGN || !(keydir || keyfile))
+	if (!CONFIG_IS_ENABLED(FIT_SIGN) || !(keydir || keyfile))
 		return 0;
 
 	/* Find configurations parent node offset */
-- 
2.31.1.607.g51e8a6a459-goog

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

* [PATCH v2 38/50] image: Drop IMAGE_ENABLE_BEST_MATCH
  2021-05-06 14:23 [PATCH v2 00/50] image: Reduce #ifdefs and ad-hoc defines in image code Simon Glass
                   ` (36 preceding siblings ...)
  2021-05-06 14:24 ` [PATCH v2 37/50] image: Drop IMAGE_ENABLE_SIGN/VERIFY defines Simon Glass
@ 2021-05-06 14:24 ` 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
                   ` (11 subsequent siblings)
  49 siblings, 1 reply; 91+ messages in thread
From: Simon Glass @ 2021-05-06 14:24 UTC (permalink / raw)
  To: u-boot

This is not needed with Kconfig, since we can use IS_ENABLED() easily
enough. Drop it.

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

(no changes since v1)

 common/image-fit.c | 2 +-
 include/image.h    | 5 -----
 2 files changed, 1 insertion(+), 6 deletions(-)

diff --git a/common/image-fit.c b/common/image-fit.c
index e81a0858dc1..a0987fd52c8 100644
--- a/common/image-fit.c
+++ b/common/image-fit.c
@@ -2026,7 +2026,7 @@ int fit_image_load(bootm_headers_t *images, ulong addr,
 		 * fit_conf_get_node() will try to find default config node
 		 */
 		bootstage_mark(bootstage_id + BOOTSTAGE_SUB_NO_UNIT_NAME);
-		if (IMAGE_ENABLE_BEST_MATCH && !fit_uname_config) {
+		if (IS_ENABLED(CONFIG_FIT_BEST_MATCH) && !fit_uname_config) {
 			cfg_noffset = fit_conf_find_compat(fit, gd_fdt_blob());
 		} else {
 			cfg_noffset = fit_conf_get_node(fit,
diff --git a/include/image.h b/include/image.h
index 12043abd049..b388684cbdc 100644
--- a/include/image.h
+++ b/include/image.h
@@ -1157,11 +1157,6 @@ void image_set_host_blob(void *host_blob);
 # define gd_fdt_blob()		(gd->fdt_blob)
 #endif
 
-#ifdef CONFIG_FIT_BEST_MATCH
-#define IMAGE_ENABLE_BEST_MATCH	1
-#else
-#define IMAGE_ENABLE_BEST_MATCH	0
-#endif
 #endif /* FIT */
 
 /*
-- 
2.31.1.607.g51e8a6a459-goog

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

* [PATCH v2 39/50] image: Drop IMAGE_ENABLE_EN/DECRYPT defines
  2021-05-06 14:23 [PATCH v2 00/50] image: Reduce #ifdefs and ad-hoc defines in image code Simon Glass
                   ` (37 preceding siblings ...)
  2021-05-06 14:24 ` [PATCH v2 38/50] image: Drop IMAGE_ENABLE_BEST_MATCH Simon Glass
@ 2021-05-06 14:24 ` Simon Glass
  2021-05-06 14:24 ` [PATCH v2 40/50] image: Tidy up fit_unsupported_reset() Simon Glass
                   ` (10 subsequent siblings)
  49 siblings, 0 replies; 91+ messages in thread
From: Simon Glass @ 2021-05-06 14:24 UTC (permalink / raw)
  To: u-boot

Add a host Kconfigs for IMAGE_ENABLE_ENCRYPT. With this we can use
CONFIG_IS_ENABLED() directly in the host build, so drop the unnecessary
indirections IMAGE_IMAGE_ENABLE_ENCRYPT and IMAGE_IMAGE_ENABLE_DECRYPT.

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

(no changes since v1)

 common/image-cipher.c |  6 +++---
 common/image-fit.c    |  2 +-
 include/image.h       | 16 +++-------------
 include/u-boot/aes.h  |  8 ++++----
 tools/Kconfig         | 11 +++++++++++
 tools/image-host.c    |  2 +-
 6 files changed, 23 insertions(+), 22 deletions(-)

diff --git a/common/image-cipher.c b/common/image-cipher.c
index b9061489396..453bab8c492 100644
--- a/common/image-cipher.c
+++ b/common/image-cipher.c
@@ -21,7 +21,7 @@ struct cipher_algo cipher_algos[] = {
 		.name = "aes128",
 		.key_len = AES128_KEY_LENGTH,
 		.iv_len  = AES_BLOCK_LENGTH,
-#if IMAGE_ENABLE_ENCRYPT
+#if CONFIG_IS_ENABLED(FIT_CIPHER_ENCRYPT)
 		.calculate_type = EVP_aes_128_cbc,
 #endif
 		.encrypt = image_aes_encrypt,
@@ -32,7 +32,7 @@ struct cipher_algo cipher_algos[] = {
 		.name = "aes192",
 		.key_len = AES192_KEY_LENGTH,
 		.iv_len  = AES_BLOCK_LENGTH,
-#if IMAGE_ENABLE_ENCRYPT
+#if CONFIG_IS_ENABLED(FIT_CIPHER_ENCRYPT)
 		.calculate_type = EVP_aes_192_cbc,
 #endif
 		.encrypt = image_aes_encrypt,
@@ -43,7 +43,7 @@ struct cipher_algo cipher_algos[] = {
 		.name = "aes256",
 		.key_len = AES256_KEY_LENGTH,
 		.iv_len  = AES_BLOCK_LENGTH,
-#if IMAGE_ENABLE_ENCRYPT
+#if CONFIG_IS_ENABLED(FIT_CIPHER_ENCRYPT)
 		.calculate_type = EVP_aes_256_cbc,
 #endif
 		.encrypt = image_aes_encrypt,
diff --git a/common/image-fit.c b/common/image-fit.c
index a0987fd52c8..3ee306143b3 100644
--- a/common/image-fit.c
+++ b/common/image-fit.c
@@ -2132,7 +2132,7 @@ int fit_image_load(bootm_headers_t *images, ulong addr,
 	}
 
 	/* Decrypt data before uncompress/move */
-	if (IS_ENABLED(CONFIG_FIT_CIPHER) && IMAGE_ENABLE_DECRYPT) {
+	if (IS_ENABLED(CONFIG_FIT_CIPHER) && CONFIG_IS_ENABLED(FIT_CIPHER)) {
 		puts("   Decrypting Data ... ");
 		if (fit_image_uncipher(fit, noffset, &buf, &size)) {
 			puts("Error\n");
diff --git a/include/image.h b/include/image.h
index b388684cbdc..9adbda8ab70 100644
--- a/include/image.h
+++ b/include/image.h
@@ -1368,18 +1368,8 @@ static inline int fit_image_check_target_arch(const void *fdt, int node)
  * At present we only support ciphering on the host, and unciphering on the
  * device
  */
-#if defined(USE_HOSTCC)
-# if defined(CONFIG_FIT_CIPHER)
-#  define IMAGE_ENABLE_ENCRYPT	1
-#  define IMAGE_ENABLE_DECRYPT	1
-#  include <openssl/evp.h>
-# else
-#  define IMAGE_ENABLE_ENCRYPT	0
-#  define IMAGE_ENABLE_DECRYPT	0
-# endif
-#else
-# define IMAGE_ENABLE_ENCRYPT	0
-# define IMAGE_ENABLE_DECRYPT	CONFIG_IS_ENABLED(FIT_CIPHER)
+#if CONFIG_IS_ENABLED(FIT_CIPHER_ENCRYPT)
+#include <openssl/evp.h>
 #endif
 
 /* Information passed to the ciphering routines */
@@ -1402,7 +1392,7 @@ struct cipher_algo {
 	int key_len;			/* Length of the key */
 	int iv_len;			/* Length of the IV */
 
-#if IMAGE_ENABLE_ENCRYPT
+#if CONFIG_IS_ENABLED(FIT_CIPHER_ENCRYPT)
 	const EVP_CIPHER * (*calculate_type)(void);
 #endif
 
diff --git a/include/u-boot/aes.h b/include/u-boot/aes.h
index acbc50b9e6f..1c064610952 100644
--- a/include/u-boot/aes.h
+++ b/include/u-boot/aes.h
@@ -9,7 +9,7 @@
 #include <errno.h>
 #include <image.h>
 
-#if IMAGE_ENABLE_ENCRYPT
+#if CONFIG_IS_ENABLED(FIT_CIPHER_ENCRYPT)
 int image_aes_encrypt(struct image_cipher_info *info,
 		      const unsigned char *data, int size,
 		      unsigned char **cipher, int *cipher_len);
@@ -28,9 +28,9 @@ int image_aes_add_cipher_data(struct image_cipher_info *info, void *keydest,
 {
 	return -ENXIO;
 }
-#endif /* IMAGE_ENABLE_ENCRYPT */
+#endif /* FIT_CIPHER_ENCRYPT */
 
-#if IMAGE_ENABLE_DECRYPT
+#if CONFIG_IS_ENABLED(FIT_CIPHER)
 int image_aes_decrypt(struct image_cipher_info *info,
 		      const void *cipher, size_t cipher_len,
 		      void **data, size_t *size);
@@ -41,6 +41,6 @@ int image_aes_decrypt(struct image_cipher_info *info,
 {
 	return -ENXIO;
 }
-#endif /* IMAGE_ENABLE_DECRYPT */
+#endif /* CONFIG_IS_ENABLED(FIT_CIPHER) */
 
 #endif
diff --git a/tools/Kconfig b/tools/Kconfig
index 13f923c7ac7..5dd33fcbc55 100644
--- a/tools/Kconfig
+++ b/tools/Kconfig
@@ -19,6 +19,17 @@ config HOST_FIT
 	help
 	  Enable FIT support in the host build.
 
+config HOST_FIT_CIPHER
+	def_bool y
+	help
+	 Enable ciphering data in a FIT in the host build
+
+config HOST_FIT_CIPHER_ENCRYPT
+	def_bool y
+	depends on FIT_CIPHER
+	help
+	  Enables encryption in a FIT in the host build
+
 config HOST_FIT_FULL_CHECK
 	def_bool y
 	help
diff --git a/tools/image-host.c b/tools/image-host.c
index 2be897db943..1d2d9a6e323 100644
--- a/tools/image-host.c
+++ b/tools/image-host.c
@@ -560,7 +560,7 @@ int fit_image_cipher_data(const char *keydir, void *keydest,
 		printf("Failure getting cipher node\n");
 		return -1;
 	}
-	if (!IMAGE_ENABLE_ENCRYPT || !keydir)
+	if (!CONFIG_IS_ENABLED(FIT_CIPHER_ENCRYPT) || !keydir)
 		return 0;
 	return fit_image_process_cipher(keydir, keydest, fit, image_name,
 		image_noffset, cipher_node_offset, data, size, cmdname);
-- 
2.31.1.607.g51e8a6a459-goog

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

* [PATCH v2 40/50] image: Tidy up fit_unsupported_reset()
  2021-05-06 14:23 [PATCH v2 00/50] image: Reduce #ifdefs and ad-hoc defines in image code Simon Glass
                   ` (38 preceding siblings ...)
  2021-05-06 14:24 ` [PATCH v2 39/50] image: Drop IMAGE_ENABLE_EN/DECRYPT defines Simon Glass
@ 2021-05-06 14:24 ` Simon Glass
  2021-05-06 14:24 ` [PATCH v2 41/50] image: Drop unnecessary #ifdefs from image.h Simon Glass
                   ` (9 subsequent siblings)
  49 siblings, 0 replies; 91+ messages in thread
From: Simon Glass @ 2021-05-06 14:24 UTC (permalink / raw)
  To: u-boot

This function is only used in one place and does not need to use the
preprocessor. Move it to the C file and convert it to a normal function.

Drop fit_unsupported() since it is not used.

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

(no changes since v1)

 common/bootm_os.c |  8 ++++++++
 include/image.h   | 13 -------------
 2 files changed, 8 insertions(+), 13 deletions(-)

diff --git a/common/bootm_os.c b/common/bootm_os.c
index 0b6325db660..70fad4efb55 100644
--- a/common/bootm_os.c
+++ b/common/bootm_os.c
@@ -58,6 +58,14 @@ static void copy_args(char *dest, int argc, char *const argv[], char delim)
 }
 #endif
 
+static void __maybe_unused fit_unsupported_reset(const char *msg)
+{
+	if (CONFIG_IS_ENABLED(FIT_VERBOSE)) {
+		printf("! FIT images not supported for '%s' - must reset board to recover!\n",
+		       msg);
+	}
+}
+
 #ifdef CONFIG_BOOTM_NETBSD
 static int do_bootm_netbsd(int flag, int argc, char *const argv[],
 			   bootm_headers_t *images)
diff --git a/include/image.h b/include/image.h
index 9adbda8ab70..d7e0c829841 100644
--- a/include/image.h
+++ b/include/image.h
@@ -1412,19 +1412,6 @@ int fit_image_cipher_get_algo(const void *fit, int noffset, char **algo);
 
 struct cipher_algo *image_get_cipher_algo(const char *full_name);
 
-#if CONFIG_IS_ENABLED(FIT_VERBOSE)
-#define fit_unsupported(msg)	printf("! %s:%d " \
-				"FIT images not supported for '%s'\n", \
-				__FILE__, __LINE__, (msg))
-
-#define fit_unsupported_reset(msg)	printf("! %s:%d " \
-				"FIT images not supported for '%s' " \
-				"- must reset board to recover!\n", \
-				__FILE__, __LINE__, (msg))
-#else
-#define fit_unsupported(msg)
-#define fit_unsupported_reset(msg)
-#endif /* FIT_VERBOSE */
 #endif /* CONFIG_FIT */
 
 #if !defined(USE_HOSTCC)
-- 
2.31.1.607.g51e8a6a459-goog

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

* [PATCH v2 41/50] image: Drop unnecessary #ifdefs from image.h
  2021-05-06 14:23 [PATCH v2 00/50] image: Reduce #ifdefs and ad-hoc defines in image code Simon Glass
                   ` (39 preceding siblings ...)
  2021-05-06 14:24 ` [PATCH v2 40/50] image: Tidy up fit_unsupported_reset() Simon Glass
@ 2021-05-06 14:24 ` 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
                   ` (8 subsequent siblings)
  49 siblings, 1 reply; 91+ messages in thread
From: Simon Glass @ 2021-05-06 14:24 UTC (permalink / raw)
  To: u-boot

This file has a lot of conditional code and much of it is unnecessary.
Clean this up to reduce the number of build combinations.

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

(no changes since v1)

 include/image.h                | 40 ++++------------------------------
 include/u-boot/hash-checksum.h |  5 +++--
 lib/hash-checksum.c            |  2 +-
 3 files changed, 8 insertions(+), 39 deletions(-)

diff --git a/include/image.h b/include/image.h
index d7e0c829841..a8b10a8fddb 100644
--- a/include/image.h
+++ b/include/image.h
@@ -39,12 +39,10 @@ struct fdt_region;
 
 #endif /* USE_HOSTCC */
 
-#if CONFIG_IS_ENABLED(FIT)
 #include <hash.h>
 #include <linux/libfdt.h>
 #include <fdt_support.h>
-
-#endif /* FIT */
+#include <u-boot/hash-checksum.h>
 
 extern ulong image_load_addr;		/* Default Load Address */
 extern ulong image_save_addr;		/* Default Save Address */
@@ -504,8 +502,7 @@ int genimg_get_type_id(const char *name);
 int genimg_get_comp_id(const char *name);
 void genimg_print_size(uint32_t size);
 
-#if defined(CONFIG_TIMESTAMP) || defined(CONFIG_CMD_DATE) || \
-	defined(USE_HOSTCC)
+#if defined(CONFIG_TIMESTAMP) || defined(CONFIG_CMD_DATE) || defined(USE_HOSTCC)
 #define IMAGE_ENABLE_TIMESTAMP 1
 #else
 #define IMAGE_ENABLE_TIMESTAMP 0
@@ -523,12 +520,9 @@ enum fit_load_op {
 int boot_get_setup(bootm_headers_t *images, uint8_t arch, ulong *setup_start,
 		   ulong *setup_len);
 
-#ifndef USE_HOSTCC
 /* Image format types, returned by _get_format() routine */
 #define IMAGE_FORMAT_INVALID	0x00
-#if defined(CONFIG_LEGACY_IMAGE_FORMAT)
 #define IMAGE_FORMAT_LEGACY	0x01	/* legacy image_header based format */
-#endif
 #define IMAGE_FORMAT_FIT	0x02	/* new, libfdt based format */
 #define IMAGE_FORMAT_ANDROID	0x03	/* Android boot image */
 
@@ -567,7 +561,6 @@ int boot_get_ramdisk(int argc, char *const argv[], bootm_headers_t *images,
  */
 int boot_get_loadable(int argc, char *const argv[], bootm_headers_t *images,
 		      uint8_t arch, const ulong *ld_start, ulong *const ld_len);
-#endif /* !USE_HOSTCC */
 
 int boot_get_setup_fit(bootm_headers_t *images, uint8_t arch,
 		       ulong *setup_start, ulong *setup_len);
@@ -644,7 +637,6 @@ int fit_image_load(bootm_headers_t *images, ulong addr,
  */
 int image_source_script(ulong addr, const char *fit_uname);
 
-#ifndef USE_HOSTCC
 /**
  * fit_get_node_from_config() - Look up an image a FIT by type
  *
@@ -684,10 +676,7 @@ int boot_relocate_fdt(struct lmb *lmb, char **of_flat_tree, ulong *of_size);
 int boot_ramdisk_high(struct lmb *lmb, ulong rd_data, ulong rd_len,
 		  ulong *initrd_start, ulong *initrd_end);
 int boot_get_cmdline(struct lmb *lmb, ulong *cmd_start, ulong *cmd_end);
-#ifdef CONFIG_SYS_BOOT_GET_KBD
 int boot_get_kbd(struct lmb *lmb, struct bd_info **kbd);
-#endif /* CONFIG_SYS_BOOT_GET_KBD */
-#endif /* !USE_HOSTCC */
 
 /*******************************************************************/
 /* Legacy format specific code (prefixed with image_) */
@@ -802,11 +791,9 @@ static inline int image_check_type(const image_header_t *hdr, uint8_t type)
 }
 static inline int image_check_arch(const image_header_t *hdr, uint8_t arch)
 {
-#ifndef USE_HOSTCC
 	/* Let's assume that sandbox can load any architecture */
-	if (IS_ENABLED(CONFIG_SANDBOX))
+	if (!host_build() && IS_ENABLED(CONFIG_SANDBOX))
 		return true;
-#endif
 	return (image_get_arch(hdr) == arch) ||
 		(image_get_arch(hdr) == IH_ARCH_ARM && arch == IH_ARCH_ARM64);
 }
@@ -954,7 +941,6 @@ int booti_setup(ulong image, ulong *relocated_addr, ulong *size,
 
 #define FIT_MAX_HASH_LEN	HASH_MAX_DIGEST_SIZE
 
-#if CONFIG_IS_ENABLED(FIT)
 /* cmdline argument format parsing */
 int fit_parse_conf(const char *spec, ulong addr_curr,
 		ulong *addr, const char **conf_name);
@@ -1128,7 +1114,6 @@ int fit_conf_get_prop_node(const void *fit, int noffset,
 
 int fit_check_ramdisk(const void *fit, int os_noffset,
 		uint8_t arch, int verify);
-#endif /* FIT */
 
 int calculate_hash(const void *data, int data_len, const char *algo,
 			uint8_t *value, int *value_len);
@@ -1148,7 +1133,6 @@ int calculate_hash(const void *data, int data_len, const char *algo,
 # define IMAGE_ENABLE_VERIFY_ECDSA	0
 #endif
 
-#if CONFIG_IS_ENABLED(FIT)
 #ifdef USE_HOSTCC
 void *image_get_host_blob(void);
 void image_set_host_blob(void *host_blob);
@@ -1157,8 +1141,6 @@ void image_set_host_blob(void *host_blob);
 # define gd_fdt_blob()		(gd->fdt_blob)
 #endif
 
-#endif /* FIT */
-
 /*
  * Information passed to the signing routines
  *
@@ -1195,9 +1177,6 @@ struct image_region {
 	int size;
 };
 
-#if CONFIG_IS_ENABLED(RSA_VERIFY)
-# include <u-boot/hash-checksum.h>
-#endif
 struct checksum_algo {
 	const char *name;
 	const int checksum_len;
@@ -1207,7 +1186,7 @@ struct checksum_algo {
 	const EVP_MD *(*calculate_sign)(void);
 #endif
 	int (*calculate)(const char *name,
-			 const struct image_region region[],
+			 const struct image_region *region,
 			 int region_count, uint8_t *checksum);
 };
 
@@ -1295,8 +1274,6 @@ struct crypto_algo *image_get_crypto_algo(const char *full_name);
  */
 struct padding_algo *image_get_padding_algo(const char *name);
 
-#if CONFIG_IS_ENABLED(FIT)
-
 /**
  * fit_image_verify_required_sigs() - Verify signatures marked as 'required'
  *
@@ -1412,10 +1389,6 @@ int fit_image_cipher_get_algo(const void *fit, int noffset, char **algo);
 
 struct cipher_algo *image_get_cipher_algo(const char *full_name);
 
-#endif /* CONFIG_FIT */
-
-#if !defined(USE_HOSTCC)
-#if defined(CONFIG_ANDROID_BOOT_IMAGE)
 struct andr_img_hdr;
 int android_image_check_header(const struct andr_img_hdr *hdr);
 int android_image_get_kernel(const struct andr_img_hdr *hdr, int verify,
@@ -1431,12 +1404,7 @@ ulong android_image_get_end(const struct andr_img_hdr *hdr);
 ulong android_image_get_kload(const struct andr_img_hdr *hdr);
 ulong android_image_get_kcomp(const struct andr_img_hdr *hdr);
 void android_print_contents(const struct andr_img_hdr *hdr);
-#if !defined(CONFIG_SPL_BUILD)
 bool android_image_print_dtb_contents(ulong hdr_addr);
-#endif
-
-#endif /* CONFIG_ANDROID_BOOT_IMAGE */
-#endif /* !USE_HOSTCC */
 
 /**
  * board_fit_config_name_match() - Check for a matching board name
diff --git a/include/u-boot/hash-checksum.h b/include/u-boot/hash-checksum.h
index 54e6a73744e..7f16b37a9ab 100644
--- a/include/u-boot/hash-checksum.h
+++ b/include/u-boot/hash-checksum.h
@@ -7,11 +7,12 @@
 #define _RSA_CHECKSUM_H
 
 #include <errno.h>
-#include <image.h>
 #include <u-boot/sha1.h>
 #include <u-boot/sha256.h>
 #include <u-boot/sha512.h>
 
+struct image_region;
+
 /**
  * hash_calculate() - Calculate hash over the data
  *
@@ -23,7 +24,7 @@
  * @return 0 if OK, < 0 if error
  */
 int hash_calculate(const char *name,
-		   const struct image_region region[], int region_count,
+		   const struct image_region *region, int region_count,
 		   uint8_t *checksum);
 
 #endif
diff --git a/lib/hash-checksum.c b/lib/hash-checksum.c
index d732ecc38fd..8f2a42f9a08 100644
--- a/lib/hash-checksum.c
+++ b/lib/hash-checksum.c
@@ -17,7 +17,7 @@
 #include <image.h>
 
 int hash_calculate(const char *name,
-		    const struct image_region region[],
+		    const struct image_region *region,
 		    int region_count, uint8_t *checksum)
 {
 	struct hash_algo *algo;
-- 
2.31.1.607.g51e8a6a459-goog

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

* [PATCH v2 42/50] image: Drop #ifdefs for fit_print_contents()
  2021-05-06 14:23 [PATCH v2 00/50] image: Reduce #ifdefs and ad-hoc defines in image code Simon Glass
                   ` (40 preceding siblings ...)
  2021-05-06 14:24 ` [PATCH v2 41/50] image: Drop unnecessary #ifdefs from image.h Simon Glass
@ 2021-05-06 14:24 ` 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
                   ` (7 subsequent siblings)
  49 siblings, 1 reply; 91+ messages in thread
From: Simon Glass @ 2021-05-06 14:24 UTC (permalink / raw)
  To: u-boot

Use a simple return to drop the unwanted code.

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

(no changes since v1)

 common/image-fit.c | 11 ++++++-----
 1 file changed, 6 insertions(+), 5 deletions(-)

diff --git a/common/image-fit.c b/common/image-fit.c
index 3ee306143b3..f8aa61fc99d 100644
--- a/common/image-fit.c
+++ b/common/image-fit.c
@@ -165,7 +165,6 @@ int fit_get_subimage_count(const void *fit, int images_noffset)
 	return count;
 }
 
-#if CONFIG_IS_ENABLED(FIT_PRINT)
 /**
  * fit_image_print_data() - prints out the hash node details
  * @fit: pointer to the FIT format image header
@@ -375,6 +374,9 @@ void fit_print_contents(const void *fit)
 	const char *p;
 	time_t timestamp;
 
+	if (!CONFIG_IS_ENABLED(FIT_PRINT))
+		return;
+
 	/* Indent string is defined in header image.h */
 	p = IMAGE_INDENT_STRING;
 
@@ -477,6 +479,9 @@ void fit_image_print(const void *fit, int image_noffset, const char *p)
 	int ndepth;
 	int ret;
 
+	if (!CONFIG_IS_ENABLED(FIT_PRINT))
+		return;
+
 	/* Mandatory properties */
 	ret = fit_get_desc(fit, image_noffset, &desc);
 	printf("%s  Description:  ", p);
@@ -570,10 +575,6 @@ void fit_image_print(const void *fit, int image_noffset, const char *p)
 		}
 	}
 }
-#else
-void fit_print_contents(const void *fit) { }
-void fit_image_print(const void *fit, int image_noffset, const char *p) { }
-#endif /* CONFIG_IS_ENABLED(FIT_PRINT) */
 
 /**
  * fit_get_desc - get node description property
-- 
2.31.1.607.g51e8a6a459-goog

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

* [PATCH v2 43/50] image: Drop most #ifdefs in image-board.c
  2021-05-06 14:23 [PATCH v2 00/50] image: Reduce #ifdefs and ad-hoc defines in image code Simon Glass
                   ` (41 preceding siblings ...)
  2021-05-06 14:24 ` [PATCH v2 42/50] image: Drop #ifdefs for fit_print_contents() Simon Glass
@ 2021-05-06 14:24 ` Simon Glass
  2021-05-06 14:24 ` [PATCH v2 44/50] image: Reduce variable scope in boot_get_ramdisk() Simon Glass
                   ` (6 subsequent siblings)
  49 siblings, 0 replies; 91+ messages in thread
From: Simon Glass @ 2021-05-06 14:24 UTC (permalink / raw)
  To: u-boot

Remove ifdefs in this file, so far as possible without too much
refactoring.

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

(no changes since v1)

 common/image-board.c | 111 +++++++++++++++++++------------------------
 include/image.h      |   7 ++-
 2 files changed, 55 insertions(+), 63 deletions(-)

diff --git a/common/image-board.c b/common/image-board.c
index 1a3b0bc7efc..f671a349cfc 100644
--- a/common/image-board.c
+++ b/common/image-board.c
@@ -227,16 +227,16 @@ ulong genimg_get_kernel_addr_fit(char * const img_addr,
 		kernel_addr = image_load_addr;
 		debug("*  kernel: default image load address = 0x%08lx\n",
 		      image_load_addr);
-#if CONFIG_IS_ENABLED(FIT)
-	} else if (fit_parse_conf(img_addr, image_load_addr, &kernel_addr,
+	} else if (CONFIG_IS_ENABLED(FIT) &&
+		   fit_parse_conf(img_addr, image_load_addr, &kernel_addr,
 				  fit_uname_config)) {
 		debug("*  kernel: config '%s' from image at 0x%08lx\n",
 		      *fit_uname_config, kernel_addr);
-	} else if (fit_parse_subimage(img_addr, image_load_addr, &kernel_addr,
-				     fit_uname_kernel)) {
+	} else if (CONFIG_IS_ENABLED(FIT) &&
+		   fit_parse_subimage(img_addr, image_load_addr, &kernel_addr,
+				      fit_uname_kernel)) {
 		debug("*  kernel: subimage '%s' from image at 0x%08lx\n",
 		      *fit_uname_kernel, kernel_addr);
-#endif
 	} else {
 		kernel_addr = simple_strtoul(img_addr, NULL, 16);
 		debug("*  kernel: cmdline image address = 0x%08lx\n",
@@ -275,21 +275,20 @@ ulong genimg_get_kernel_addr(char * const img_addr)
  */
 int genimg_get_format(const void *img_addr)
 {
-#if CONFIG_IS_ENABLED(LEGACY_IMAGE_FORMAT)
-	const image_header_t *hdr;
+	if (CONFIG_IS_ENABLED(LEGACY_IMAGE_FORMAT)) {
+		const image_header_t *hdr;
 
-	hdr = (const image_header_t *)img_addr;
-	if (image_check_magic(hdr))
-		return IMAGE_FORMAT_LEGACY;
-#endif
-#if CONFIG_IS_ENABLED(FIT) || CONFIG_IS_ENABLED(OF_LIBFDT)
-	if (fdt_check_header(img_addr) == 0)
-		return IMAGE_FORMAT_FIT;
-#endif
-#ifdef CONFIG_ANDROID_BOOT_IMAGE
-	if (android_image_check_header(img_addr) == 0)
+		hdr = (const image_header_t *)img_addr;
+		if (image_check_magic(hdr))
+			return IMAGE_FORMAT_LEGACY;
+	}
+	if (CONFIG_IS_ENABLED(FIT) || CONFIG_IS_ENABLED(OF_LIBFDT)) {
+		if (!fdt_check_header(img_addr))
+			return IMAGE_FORMAT_FIT;
+	}
+	if (IS_ENABLED(CONFIG_ANDROID_BOOT_IMAGE) &&
+	    !android_image_check_header(img_addr))
 		return IMAGE_FORMAT_ANDROID;
-#endif
 
 	return IMAGE_FORMAT_INVALID;
 }
@@ -307,10 +306,9 @@ int genimg_get_format(const void *img_addr)
  */
 int genimg_has_config(bootm_headers_t *images)
 {
-#if CONFIG_IS_ENABLED(FIT)
-	if (images->fit_uname_cfg)
+	if (CONFIG_IS_ENABLED(FIT) && images->fit_uname_cfg)
 		return 1;
-#endif
+
 	return 0;
 }
 
@@ -345,9 +343,6 @@ int boot_get_ramdisk(int argc, char *const argv[], bootm_headers_t *images,
 	const image_header_t *rd_hdr;
 #endif
 	void *buf;
-#ifdef CONFIG_SUPPORT_RAW_INITRD
-	char *end;
-#endif
 #if CONFIG_IS_ENABLED(FIT)
 	const char	*fit_uname_config = images->fit_uname_cfg;
 	const char	*fit_uname_ramdisk = NULL;
@@ -359,14 +354,12 @@ int boot_get_ramdisk(int argc, char *const argv[], bootm_headers_t *images,
 	*rd_start = 0;
 	*rd_end = 0;
 
-#ifdef CONFIG_ANDROID_BOOT_IMAGE
-	/*
-	 * Look for an Android boot image.
-	 */
-	buf = map_sysmem(images->os.start, 0);
-	if (buf && genimg_get_format(buf) == IMAGE_FORMAT_ANDROID)
-		select = (argc == 0) ? env_get("loadaddr") : argv[0];
-#endif
+	if (IS_ENABLED(CONFIG_ANDROID_BOOT_IMAGE)) {
+		/* Look for an Android boot image */
+		buf = map_sysmem(images->os.start, 0);
+		if (buf && genimg_get_format(buf) == IMAGE_FORMAT_ANDROID)
+			select = (argc == 0) ? env_get("loadaddr") : argv[0];
+	}
 
 	if (argc >= 2)
 		select = argv[1];
@@ -474,22 +467,22 @@ int boot_get_ramdisk(int argc, char *const argv[], bootm_headers_t *images,
 			break;
 #endif
 		default:
-#ifdef CONFIG_SUPPORT_RAW_INITRD
-			end = NULL;
-			if (select)
-				end = strchr(select, ':');
-			if (end) {
-				rd_len = simple_strtoul(++end, NULL, 16);
-				rd_data = rd_addr;
-			} else
-#endif
-			{
-				puts("Wrong Ramdisk Image Format\n");
-				rd_data = 0;
-				rd_len = 0;
-				rd_load = 0;
-				return 1;
+			if (IS_ENABLED(CONFIG_SUPPORT_RAW_INITRD)) {
+				char *end = NULL;
+
+				if (select)
+					end = strchr(select, ':');
+				if (end) {
+					rd_len = simple_strtoul(++end, NULL, 16);
+					rd_data = rd_addr;
+					break;
+				}
 			}
+			puts("Wrong Ramdisk Image Format\n");
+			rd_data = 0;
+			rd_len = 0;
+			rd_load = 0;
+			return 1;
 		}
 	} else if (images->legacy_hdr_valid &&
 			image_check_type(&images->legacy_hdr_os_copy,
@@ -524,7 +517,6 @@ int boot_get_ramdisk(int argc, char *const argv[], bootm_headers_t *images,
 	return 0;
 }
 
-#ifdef CONFIG_SYS_BOOT_RAMDISK_HIGH
 /**
  * boot_ramdisk_high - relocate init ramdisk
  * @lmb: pointer to lmb handle, will be used for memory mgmt
@@ -595,15 +587,15 @@ int boot_ramdisk_high(struct lmb *lmb, ulong rd_data, ulong rd_len,
 			memmove_wd((void *)*initrd_start,
 				   (void *)rd_data, rd_len, CHUNKSZ);
 
-#ifdef CONFIG_MP
 			/*
 			 * Ensure the image is flushed to memory to handle
 			 * AMP boot scenarios in which we might not be
 			 * HW cache coherent
 			 */
-			flush_cache((unsigned long)*initrd_start,
-				    ALIGN(rd_len, ARCH_DMA_MINALIGN));
-#endif
+			if (IS_ENABLED(CONFIG_MP)) {
+				flush_cache((unsigned long)*initrd_start,
+					    ALIGN(rd_len, ARCH_DMA_MINALIGN));
+			}
 			puts("OK\n");
 		}
 	} else {
@@ -618,20 +610,16 @@ int boot_ramdisk_high(struct lmb *lmb, ulong rd_data, ulong rd_len,
 error:
 	return -1;
 }
-#endif /* CONFIG_SYS_BOOT_RAMDISK_HIGH */
 
 int boot_get_setup(bootm_headers_t *images, u8 arch,
 		   ulong *setup_start, ulong *setup_len)
 {
-#if CONFIG_IS_ENABLED(FIT)
+	if (!CONFIG_IS_ENABLED(FIT))
+		return -ENOENT;
+
 	return boot_get_setup_fit(images, arch, setup_start, setup_len);
-#else
-	return -ENOENT;
-#endif
 }
 
-#if CONFIG_IS_ENABLED(FIT)
-#if defined(CONFIG_FPGA)
 int boot_get_fpga(int argc, char *const argv[], bootm_headers_t *images,
 		  u8 arch, const ulong *ld_start, ulong * const ld_len)
 {
@@ -643,6 +631,9 @@ int boot_get_fpga(int argc, char *const argv[], bootm_headers_t *images,
 	int err;
 	int devnum = 0; /* TODO support multi fpga platforms */
 
+	if (!IS_ENABLED(CONFIG_FPGA))
+		return -ENOSYS;
+
 	/* Check to see if the images struct has a FIT configuration */
 	if (!genimg_has_config(images)) {
 		debug("## FIT configuration was not specified\n");
@@ -714,7 +705,6 @@ int boot_get_fpga(int argc, char *const argv[], bootm_headers_t *images,
 
 	return 0;
 }
-#endif
 
 static void fit_loadable_process(u8 img_type,
 				 ulong img_data,
@@ -812,7 +802,6 @@ int boot_get_loadable(int argc, char *const argv[], bootm_headers_t *images,
 
 	return 0;
 }
-#endif
 
 /**
  * boot_get_cmdline - allocate and initialize kernel cmdline
diff --git a/include/image.h b/include/image.h
index a8b10a8fddb..6336e55928c 100644
--- a/include/image.h
+++ b/include/image.h
@@ -297,7 +297,11 @@ typedef struct bootm_headers {
 	image_header_t	legacy_hdr_os_copy;	/* header copy */
 	ulong		legacy_hdr_valid;
 
-#if CONFIG_IS_ENABLED(FIT)
+	/*
+	 * The fit_ members are only used with FIT, but it involves a lot of
+	 * #ifdefs to avoid compiling that code. Since FIT is the standard
+	 * format, even for SPL, this extra data size seems worth it.
+	 */
 	const char	*fit_uname_cfg;	/* configuration node unit name */
 
 	void		*fit_hdr_os;	/* os FIT image header */
@@ -315,7 +319,6 @@ typedef struct bootm_headers {
 	void		*fit_hdr_setup;	/* x86 setup FIT image header */
 	const char	*fit_uname_setup; /* x86 setup subimage node name */
 	int		fit_noffset_setup;/* x86 setup subimage node offset */
-#endif
 
 #ifndef USE_HOSTCC
 	image_info_t	os;		/* os image info */
-- 
2.31.1.607.g51e8a6a459-goog

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

* [PATCH v2 44/50] image: Reduce variable scope in boot_get_ramdisk()
  2021-05-06 14:23 [PATCH v2 00/50] image: Reduce #ifdefs and ad-hoc defines in image code Simon Glass
                   ` (42 preceding siblings ...)
  2021-05-06 14:24 ` [PATCH v2 43/50] image: Drop most #ifdefs in image-board.c Simon Glass
@ 2021-05-06 14:24 ` Simon Glass
  2021-05-06 14:24 ` [PATCH v2 45/50] image: Split up boot_get_ramdisk() Simon Glass
                   ` (5 subsequent siblings)
  49 siblings, 0 replies; 91+ messages in thread
From: Simon Glass @ 2021-05-06 14:24 UTC (permalink / raw)
  To: u-boot

Move the variables declarations to where they are needed, to reduce the
number of #ifdefs needed.

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

(no changes since v1)

 common/image-board.c | 22 +++++++++++-----------
 1 file changed, 11 insertions(+), 11 deletions(-)

diff --git a/common/image-board.c b/common/image-board.c
index f671a349cfc..3692edaa5c8 100644
--- a/common/image-board.c
+++ b/common/image-board.c
@@ -337,18 +337,8 @@ int genimg_has_config(bootm_headers_t *images)
 int boot_get_ramdisk(int argc, char *const argv[], bootm_headers_t *images,
 		     u8 arch, ulong *rd_start, ulong *rd_end)
 {
-	ulong rd_addr, rd_load;
 	ulong rd_data, rd_len;
-#if CONFIG_IS_ENABLED(LEGACY_IMAGE_FORMAT)
-	const image_header_t *rd_hdr;
-#endif
 	void *buf;
-#if CONFIG_IS_ENABLED(FIT)
-	const char	*fit_uname_config = images->fit_uname_cfg;
-	const char	*fit_uname_ramdisk = NULL;
-	ulong		default_addr;
-	int		rd_noffset;
-#endif
 	const char *select = NULL;
 
 	*rd_start = 0;
@@ -373,8 +363,15 @@ int boot_get_ramdisk(int argc, char *const argv[], bootm_headers_t *images,
 		rd_len = 0;
 		rd_data = 0;
 	} else if (select || genimg_has_config(images)) {
+		ulong rd_addr, rd_load;
+
 #if CONFIG_IS_ENABLED(FIT)
+		const char *fit_uname_config = images->fit_uname_cfg;
+		const char *fit_uname_ramdisk = NULL;
+		int rd_noffset;
+
 		if (select) {
+			ulong default_addr;
 			/*
 			 * If the init ramdisk comes from the FIT image and
 			 * the FIT image address is omitted in the command
@@ -427,7 +424,9 @@ int boot_get_ramdisk(int argc, char *const argv[], bootm_headers_t *images,
 		buf = map_sysmem(rd_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 *rd_hdr;
+
 			printf("## Loading init Ramdisk from Legacy Image at %08lx ...\n",
 			       rd_addr);
 
@@ -442,6 +441,7 @@ int boot_get_ramdisk(int argc, char *const argv[], bootm_headers_t *images,
 			rd_len = image_get_data_size(rd_hdr);
 			rd_load = image_get_load(rd_hdr);
 			break;
+		}
 #endif
 #if CONFIG_IS_ENABLED(FIT)
 		case IMAGE_FORMAT_FIT:
-- 
2.31.1.607.g51e8a6a459-goog

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

* [PATCH v2 45/50] image: Split up boot_get_ramdisk()
  2021-05-06 14:23 [PATCH v2 00/50] image: Reduce #ifdefs and ad-hoc defines in image code Simon Glass
                   ` (43 preceding siblings ...)
  2021-05-06 14:24 ` [PATCH v2 44/50] image: Reduce variable scope in boot_get_ramdisk() Simon Glass
@ 2021-05-06 14:24 ` Simon Glass
  2021-05-06 14:24 ` [PATCH v2 46/50] image: Remove #ifdefs from select_ramdisk() Simon Glass
                   ` (4 subsequent siblings)
  49 siblings, 0 replies; 91+ messages in thread
From: Simon Glass @ 2021-05-06 14:24 UTC (permalink / raw)
  To: u-boot

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

Leave the code indented as it was for easier review. The next patch cleans
this up along with checkpatch violations.

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

Changes in v2:
- Drop unnecessary setting of rd_len, etc.

 common/image-board.c | 148 +++++++++++++++++++++++++------------------
 1 file changed, 86 insertions(+), 62 deletions(-)

diff --git a/common/image-board.c b/common/image-board.c
index 3692edaa5c8..d6f7ab26f59 100644
--- a/common/image-board.c
+++ b/common/image-board.c
@@ -313,57 +313,21 @@ int genimg_has_config(bootm_headers_t *images)
 }
 
 /**
- * boot_get_ramdisk - main ramdisk handling routine
- * @argc: command argument count
- * @argv: command argument list
+ * select_ramdisk() - Select and locate the ramdisk to use
+ *
  * @images: pointer to the bootm images structure
+ * @select: name of ramdisk to select, or NULL for any
  * @arch: expected ramdisk architecture
- * @rd_start: pointer to a ulong variable, will hold ramdisk start address
- * @rd_end: pointer to a ulong variable, will hold ramdisk end
- *
- * boot_get_ramdisk() is responsible for finding a valid ramdisk image.
- * Currently supported are the following ramdisk sources:
- *      - multicomponent kernel/ramdisk image,
- *      - commandline provided address of decicated ramdisk image.
- *
- * returns:
- *     0, if ramdisk image was found and valid, or skiped
- *     rd_start and rd_end are set to ramdisk start/end addresses if
- *     ramdisk image is found and valid
- *
- *     1, if ramdisk image is found but corrupted, or invalid
- *     rd_start and rd_end are set to 0 if no ramdisk exists
+ * @rd_datap: pointer to a ulong variable, will hold ramdisk pointer
+ * @rd_lenp: pointer to a ulong variable, will hold ramdisk length
+ * @return 0 if OK, -ENOPKG if no ramdisk (but an error should not be reported),
+ *	other -ve value on other error
  */
-int boot_get_ramdisk(int argc, char *const argv[], bootm_headers_t *images,
-		     u8 arch, ulong *rd_start, ulong *rd_end)
+static int select_ramdisk(bootm_headers_t *images, const char *select, u8 arch,
+			  ulong *rd_datap, ulong *rd_lenp)
 {
-	ulong rd_data, rd_len;
-	void *buf;
-	const char *select = NULL;
-
-	*rd_start = 0;
-	*rd_end = 0;
-
-	if (IS_ENABLED(CONFIG_ANDROID_BOOT_IMAGE)) {
-		/* Look for an Android boot image */
-		buf = map_sysmem(images->os.start, 0);
-		if (buf && genimg_get_format(buf) == IMAGE_FORMAT_ANDROID)
-			select = (argc == 0) ? env_get("loadaddr") : argv[0];
-	}
-
-	if (argc >= 2)
-		select = argv[1];
-
-	/*
-	 * Look for a '-' which indicates to ignore the
-	 * ramdisk argument
-	 */
-	if (select && strcmp(select, "-") ==  0) {
-		debug("## Skipping init Ramdisk\n");
-		rd_len = 0;
-		rd_data = 0;
-	} else if (select || genimg_has_config(images)) {
-		ulong rd_addr, rd_load;
+	ulong rd_addr, rd_load;
+	char *buf;
 
 #if CONFIG_IS_ENABLED(FIT)
 		const char *fit_uname_config = images->fit_uname_cfg;
@@ -403,16 +367,16 @@ int boot_get_ramdisk(int argc, char *const argv[], bootm_headers_t *images,
 		} else {
 			/* use FIT configuration provided in first bootm
 			 * command argument. If the property is not defined,
-			 * quit silently.
+			 * quit silently (with -ENOPKG)
 			 */
 			rd_addr = map_to_sysmem(images->fit_hdr_os);
 			rd_noffset = fit_get_node_from_config(images,
 							      FIT_RAMDISK_PROP,
 							      rd_addr);
 			if (rd_noffset == -ENOENT)
-				return 0;
+				return -ENOPKG;
 			else if (rd_noffset < 0)
-				return 1;
+				return rd_noffset;
 		}
 #endif
 
@@ -435,10 +399,10 @@ int boot_get_ramdisk(int argc, char *const argv[], bootm_headers_t *images,
 						   images->verify);
 
 			if (!rd_hdr)
-				return 1;
+				return -ENOENT;
 
-			rd_data = image_get_data(rd_hdr);
-			rd_len = image_get_data_size(rd_hdr);
+			*rd_datap = image_get_data(rd_hdr);
+			*rd_lenp = image_get_data_size(rd_hdr);
 			rd_load = image_get_load(rd_hdr);
 			break;
 		}
@@ -451,9 +415,9 @@ int boot_get_ramdisk(int argc, char *const argv[], bootm_headers_t *images,
 						    IH_TYPE_RAMDISK,
 						    BOOTSTAGE_ID_FIT_RD_START,
 						    FIT_LOAD_OPTIONAL_NON_ZERO,
-						    &rd_data, &rd_len);
+						    rd_datap, rd_lenp);
 			if (rd_noffset < 0)
-				return 1;
+				return rd_noffset;
 
 			images->fit_hdr_rd = map_sysmem(rd_addr, 0);
 			images->fit_uname_rd = fit_uname_ramdisk;
@@ -463,7 +427,7 @@ int boot_get_ramdisk(int argc, char *const argv[], bootm_headers_t *images,
 #ifdef CONFIG_ANDROID_BOOT_IMAGE
 		case IMAGE_FORMAT_ANDROID:
 			android_image_get_ramdisk((void *)images->os.start,
-						  &rd_data, &rd_len);
+						  rd_datap, rd_lenp);
 			break;
 #endif
 		default:
@@ -473,17 +437,77 @@ int boot_get_ramdisk(int argc, char *const argv[], bootm_headers_t *images,
 				if (select)
 					end = strchr(select, ':');
 				if (end) {
-					rd_len = simple_strtoul(++end, NULL, 16);
-					rd_data = rd_addr;
+					*rd_lenp = simple_strtoul(++end, NULL, 16);
+					*rd_datap = rd_addr;
 					break;
 				}
 			}
 			puts("Wrong Ramdisk Image Format\n");
-			rd_data = 0;
-			rd_len = 0;
-			rd_load = 0;
-			return 1;
+			return -EINVAL;
 		}
+
+	return 0;
+}
+
+/**
+ * boot_get_ramdisk - main ramdisk handling routine
+ * @argc: command argument count
+ * @argv: command argument list
+ * @images: pointer to the bootm images structure
+ * @arch: expected ramdisk architecture
+ * @rd_start: pointer to a ulong variable, will hold ramdisk start address
+ * @rd_end: pointer to a ulong variable, will hold ramdisk end
+ *
+ * boot_get_ramdisk() is responsible for finding a valid ramdisk image.
+ * Currently supported are the following ramdisk sources:
+ *      - multicomponent kernel/ramdisk image,
+ *      - commandline provided address of decicated ramdisk image.
+ *
+ * returns:
+ *     0, if ramdisk image was found and valid, or skiped
+ *     rd_start and rd_end are set to ramdisk start/end addresses if
+ *     ramdisk image is found and valid
+ *
+ *     1, if ramdisk image is found but corrupted, or invalid
+ *     rd_start and rd_end are set to 0 if no ramdisk exists
+ */
+int boot_get_ramdisk(int argc, char *const argv[], bootm_headers_t *images,
+		     u8 arch, ulong *rd_start, ulong *rd_end)
+{
+	ulong rd_data, rd_len;
+	const char *select = NULL;
+
+	*rd_start = 0;
+	*rd_end = 0;
+
+	if (IS_ENABLED(CONFIG_ANDROID_BOOT_IMAGE)) {
+		char *buf;
+
+		/* Look for an Android boot image */
+		buf = map_sysmem(images->os.start, 0);
+		if (buf && genimg_get_format(buf) == IMAGE_FORMAT_ANDROID)
+			select = (argc == 0) ? env_get("loadaddr") : argv[0];
+	}
+
+	if (argc >= 2)
+		select = argv[1];
+
+	/*
+	 * Look for a '-' which indicates to ignore the
+	 * ramdisk argument
+	 */
+	if (select && strcmp(select, "-") ==  0) {
+		debug("## Skipping init Ramdisk\n");
+		rd_len = 0;
+		rd_data = 0;
+	} else if (select || genimg_has_config(images)) {
+		int ret;
+
+		ret = select_ramdisk(images, select, arch, &rd_data, &rd_len);
+		if (ret == -ENOPKG)
+			return 0;
+		else if (ret)
+			return ret;
 	} else if (images->legacy_hdr_valid &&
 			image_check_type(&images->legacy_hdr_os_copy,
 					 IH_TYPE_MULTI)) {
-- 
2.31.1.607.g51e8a6a459-goog

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

* [PATCH v2 46/50] image: Remove #ifdefs from select_ramdisk()
  2021-05-06 14:23 [PATCH v2 00/50] image: Reduce #ifdefs and ad-hoc defines in image code Simon Glass
                   ` (44 preceding siblings ...)
  2021-05-06 14:24 ` [PATCH v2 45/50] image: Split up boot_get_ramdisk() Simon Glass
@ 2021-05-06 14:24 ` Simon Glass
  2021-05-06 14:24 ` [PATCH v2 47/50] image: Remove some #ifdefs from image-fit and image-fit-sig Simon Glass
                   ` (3 subsequent siblings)
  49 siblings, 0 replies; 91+ messages in thread
From: Simon Glass @ 2021-05-06 14:24 UTC (permalink / raw)
  To: u-boot

Use boolean variables to deal with the strange #ifdef logic of this
function, so we can remove the #ifdefs.

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

(no changes since v1)

 common/image-board.c | 139 ++++++++++++++++++++++---------------------
 1 file changed, 72 insertions(+), 67 deletions(-)

diff --git a/common/image-board.c b/common/image-board.c
index d6f7ab26f59..09b4e37bc73 100644
--- a/common/image-board.c
+++ b/common/image-board.c
@@ -26,7 +26,6 @@
 
 DECLARE_GLOBAL_DATA_PTR;
 
-#if CONFIG_IS_ENABLED(LEGACY_IMAGE_FORMAT)
 /**
  * image_get_ramdisk - get and verify ramdisk image
  * @rd_addr: ramdisk image start address
@@ -85,7 +84,6 @@ static const image_header_t *image_get_ramdisk(ulong rd_addr, u8 arch,
 
 	return rd_hdr;
 }
-#endif
 
 /*****************************************************************************/
 /* Shared dual-format routines */
@@ -326,16 +324,18 @@ int genimg_has_config(bootm_headers_t *images)
 static int select_ramdisk(bootm_headers_t *images, const char *select, u8 arch,
 			  ulong *rd_datap, ulong *rd_lenp)
 {
-	ulong rd_addr, rd_load;
+	ulong rd_addr = 0, rd_load;
 	char *buf;
+	const char *fit_uname_config = images->fit_uname_cfg;
+	const char *fit_uname_ramdisk = NULL;
+	bool processed;
+	int rd_noffset;
 
-#if CONFIG_IS_ENABLED(FIT)
-		const char *fit_uname_config = images->fit_uname_cfg;
-		const char *fit_uname_ramdisk = NULL;
-		int rd_noffset;
+	if (select) {
+		ulong default_addr;
+		bool done = true;
 
-		if (select) {
-			ulong default_addr;
+		if (CONFIG_IS_ENABLED(FIT)) {
 			/*
 			 * If the init ramdisk comes from the FIT image and
 			 * the FIT image address is omitted in the command
@@ -347,8 +347,8 @@ static int select_ramdisk(bootm_headers_t *images, const char *select, u8 arch,
 			else
 				default_addr = image_load_addr;
 
-			if (fit_parse_conf(select, default_addr,
-					   &rd_addr, &fit_uname_config)) {
+			if (fit_parse_conf(select, default_addr, &rd_addr,
+					   &fit_uname_config)) {
 				debug("*  ramdisk: config '%s' from image at 0x%08lx\n",
 				      fit_uname_config, rd_addr);
 			} else if (fit_parse_subimage(select, default_addr,
@@ -356,61 +356,59 @@ static int select_ramdisk(bootm_headers_t *images, const char *select, u8 arch,
 						      &fit_uname_ramdisk)) {
 				debug("*  ramdisk: subimage '%s' from image at 0x%08lx\n",
 				      fit_uname_ramdisk, rd_addr);
-			} else
-#endif
-			{
-				rd_addr = simple_strtoul(select, NULL, 16);
-				debug("*  ramdisk: cmdline image address = 0x%08lx\n",
-				      rd_addr);
+			} else {
+				done = false;
 			}
-#if CONFIG_IS_ENABLED(FIT)
-		} else {
-			/* use FIT configuration provided in first bootm
-			 * command argument. If the property is not defined,
-			 * quit silently (with -ENOPKG)
-			 */
-			rd_addr = map_to_sysmem(images->fit_hdr_os);
-			rd_noffset = fit_get_node_from_config(images,
-							      FIT_RAMDISK_PROP,
-							      rd_addr);
-			if (rd_noffset == -ENOENT)
-				return -ENOPKG;
-			else if (rd_noffset < 0)
-				return rd_noffset;
 		}
-#endif
-
-		/*
-		 * Check if there is an initrd image@the
-		 * address provided in the second bootm argument
-		 * check image type, for FIT images get FIT node.
+		if (!done) {
+			rd_addr = simple_strtoul(select, NULL, 16);
+			debug("*  ramdisk: cmdline image address = 0x%08lx\n",
+			      rd_addr);
+		}
+	} else if (CONFIG_IS_ENABLED(FIT)) {
+		/* use FIT configuration provided in first bootm
+		 * command argument. If the property is not defined,
+		 * quit silently (with -ENOPKG	)
 		 */
-		buf = map_sysmem(rd_addr, 0);
-		switch (genimg_get_format(buf)) {
-#if CONFIG_IS_ENABLED(LEGACY_IMAGE_FORMAT)
-		case IMAGE_FORMAT_LEGACY: {
+		rd_addr = map_to_sysmem(images->fit_hdr_os);
+		rd_noffset = fit_get_node_from_config(images, FIT_RAMDISK_PROP,
+						      rd_addr);
+		if (rd_noffset == -ENOENT)
+			return -ENOPKG;
+		else if (rd_noffset < 0)
+			return rd_noffset;
+	}
+
+	/*
+	 * Check if there is an initrd image at the
+	 * address provided in the second bootm argument
+	 * check image type, for FIT images get FIT node.
+	 */
+	buf = map_sysmem(rd_addr, 0);
+	processed = false;
+	switch (genimg_get_format(buf)) {
+	case IMAGE_FORMAT_LEGACY:
+		if (CONFIG_IS_ENABLED(LEGACY_IMAGE_FORMAT)) {
 			const image_header_t *rd_hdr;
 
 			printf("## Loading init Ramdisk from Legacy Image@%08lx ...\n",
 			       rd_addr);
 
 			bootstage_mark(BOOTSTAGE_ID_CHECK_RAMDISK);
-			rd_hdr = image_get_ramdisk(rd_addr, arch,
-						   images->verify);
-
+			rd_hdr = image_get_ramdisk(rd_addr, arch, images->verify);
 			if (!rd_hdr)
 				return -ENOENT;
 
 			*rd_datap = image_get_data(rd_hdr);
 			*rd_lenp = image_get_data_size(rd_hdr);
 			rd_load = image_get_load(rd_hdr);
-			break;
+			processed = true;
 		}
-#endif
-#if CONFIG_IS_ENABLED(FIT)
-		case IMAGE_FORMAT_FIT:
-			rd_noffset = fit_image_load(images,
-						    rd_addr, &fit_uname_ramdisk,
+		break;
+	case IMAGE_FORMAT_FIT:
+		if (CONFIG_IS_ENABLED(FIT)) {
+			rd_noffset = fit_image_load(images, rd_addr,
+						    &fit_uname_ramdisk,
 						    &fit_uname_config, arch,
 						    IH_TYPE_RAMDISK,
 						    BOOTSTAGE_ID_FIT_RD_START,
@@ -422,29 +420,36 @@ static int select_ramdisk(bootm_headers_t *images, const char *select, u8 arch,
 			images->fit_hdr_rd = map_sysmem(rd_addr, 0);
 			images->fit_uname_rd = fit_uname_ramdisk;
 			images->fit_noffset_rd = rd_noffset;
-			break;
-#endif
-#ifdef CONFIG_ANDROID_BOOT_IMAGE
-		case IMAGE_FORMAT_ANDROID:
+			processed = true;
+		}
+		break;
+	case IMAGE_FORMAT_ANDROID:
+		if (IS_ENABLED(CONFIG_ANDROID_BOOT_IMAGE)) {
 			android_image_get_ramdisk((void *)images->os.start,
 						  rd_datap, rd_lenp);
-			break;
-#endif
-		default:
-			if (IS_ENABLED(CONFIG_SUPPORT_RAW_INITRD)) {
-				char *end = NULL;
-
-				if (select)
-					end = strchr(select, ':');
-				if (end) {
-					*rd_lenp = simple_strtoul(++end, NULL, 16);
-					*rd_datap = rd_addr;
-					break;
-				}
+			processed = true;
+		}
+		break;
+	}
+
+	if (!processed) {
+		if (IS_ENABLED(CONFIG_SUPPORT_RAW_INITRD)) {
+			char *end = NULL;
+
+			if (select)
+				end = strchr(select, ':');
+			if (end) {
+				*rd_lenp = simple_strtoul(++end, NULL, 16);
+				*rd_datap = rd_addr;
+				processed = true;
 			}
+		}
+
+		if (!processed) {
 			puts("Wrong Ramdisk Image Format\n");
 			return -EINVAL;
 		}
+	}
 
 	return 0;
 }
-- 
2.31.1.607.g51e8a6a459-goog

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

* [PATCH v2 47/50] image: Remove some #ifdefs from image-fit and image-fit-sig
  2021-05-06 14:23 [PATCH v2 00/50] image: Reduce #ifdefs and ad-hoc defines in image code Simon Glass
                   ` (45 preceding siblings ...)
  2021-05-06 14:24 ` [PATCH v2 46/50] image: Remove #ifdefs from select_ramdisk() Simon Glass
@ 2021-05-06 14:24 ` Simon Glass
  2021-05-14 21:50   ` Alex G.
  2021-05-06 14:24 ` [PATCH v2 48/50] image: Reduce variable scope in boot_get_fdt() Simon Glass
                   ` (2 subsequent siblings)
  49 siblings, 1 reply; 91+ messages in thread
From: Simon Glass @ 2021-05-06 14:24 UTC (permalink / raw)
  To: u-boot

Drop the #ifdefs which are easy to remove without refactoring.

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

(no changes since v1)

 common/Kconfig.boot    | 10 ++++++++++
 common/image-fit-sig.c |  8 ++------
 common/image-fit.c     |  7 ++++---
 3 files changed, 16 insertions(+), 9 deletions(-)

diff --git a/common/Kconfig.boot b/common/Kconfig.boot
index 03a6e6f214f..a31d9847124 100644
--- a/common/Kconfig.boot
+++ b/common/Kconfig.boot
@@ -191,6 +191,16 @@ config SPL_FIT_SIGNATURE
 	select SPL_IMAGE_SIGN_INFO
 	select SPL_FIT_FULL_CHECK
 
+config SPL_FIT_SIGNATURE_MAX_SIZE
+	hex "Max size of signed FIT structures in SPL"
+	depends on SPL_FIT_SIGNATURE
+	default 0x10000000
+	help
+	  This option sets a max size in bytes for verified FIT uImages.
+	  A sane value of 256MB protects corrupted DTB structures from overlapping
+	  device memory. Assure this size does not extend past expected storage
+	  space.
+
 config SPL_LOAD_FIT
 	bool "Enable SPL loading U-Boot as a FIT (basic fitImage features)"
 	select SPL_FIT
diff --git a/common/image-fit-sig.c b/common/image-fit-sig.c
index 12a6745c642..22f89861048 100644
--- a/common/image-fit-sig.c
+++ b/common/image-fit-sig.c
@@ -49,10 +49,8 @@ struct image_region *fit_region_make_list(const void *fit,
 	 * Use malloc() except in SPL (to save code size). In SPL the caller
 	 * must allocate the array.
 	 */
-#ifndef CONFIG_SPL_BUILD
-	if (!region)
+	if (!IS_ENABLED(CONFIG_SPL_BUILD) && !region)
 		region = calloc(sizeof(*region), count);
-#endif
 	if (!region)
 		return NULL;
 	for (i = 0; i < count; i++) {
@@ -72,12 +70,10 @@ static int fit_image_setup_verify(struct image_sign_info *info,
 	char *algo_name;
 	const char *padding_name;
 
-#ifndef USE_HOSTCC
-	if (fdt_totalsize(fit) > CONFIG_FIT_SIGNATURE_MAX_SIZE) {
+	if (fdt_totalsize(fit) > CONFIG_VAL(FIT_SIGNATURE_MAX_SIZE)) {
 		*err_msgp = "Total size too large";
 		return 1;
 	}
-#endif
 	if (fit_image_hash_get_algo(fit, noffset, &algo_name)) {
 		*err_msgp = "Can't get hash algo property";
 		return -1;
diff --git a/common/image-fit.c b/common/image-fit.c
index f8aa61fc99d..882e872144f 100644
--- a/common/image-fit.c
+++ b/common/image-fit.c
@@ -1993,9 +1993,6 @@ int fit_image_load(bootm_headers_t *images, ulong addr,
 	int type_ok, os_ok;
 	ulong load, load_end, data, len;
 	uint8_t os, comp;
-#ifndef USE_HOSTCC
-	uint8_t os_arch;
-#endif
 	const char *prop_name;
 	int ret;
 
@@ -2087,8 +2084,12 @@ int fit_image_load(bootm_headers_t *images, ulong addr,
 	}
 
 #ifndef USE_HOSTCC
+	{
+	uint8_t os_arch;
+
 	fit_image_get_arch(fit, noffset, &os_arch);
 	images->os.arch = os_arch;
+	}
 #endif
 
 	bootstage_mark(bootstage_id + BOOTSTAGE_SUB_CHECK_ALL);
-- 
2.31.1.607.g51e8a6a459-goog

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

* [PATCH v2 48/50] image: Reduce variable scope in boot_get_fdt()
  2021-05-06 14:23 [PATCH v2 00/50] image: Reduce #ifdefs and ad-hoc defines in image code Simon Glass
                   ` (46 preceding siblings ...)
  2021-05-06 14:24 ` [PATCH v2 47/50] image: Remove some #ifdefs from image-fit and image-fit-sig Simon Glass
@ 2021-05-06 14:24 ` Simon Glass
  2021-05-06 14:24 ` [PATCH v2 49/50] image: Split up boot_get_fdt() Simon Glass
  2021-05-06 14:24 ` [PATCH v2 50/50] image: Remove #ifdefs from select_fdt() Simon Glass
  49 siblings, 0 replies; 91+ messages in thread
From: Simon Glass @ 2021-05-06 14:24 UTC (permalink / raw)
  To: u-boot

Move the variables declarations to where they are needed, to reduce the
number of #ifdefs needed.

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

(no changes since v1)

 common/image-fdt.c | 23 +++++++++++------------
 1 file changed, 11 insertions(+), 12 deletions(-)

diff --git a/common/image-fdt.c b/common/image-fdt.c
index 80bfa625ab2..524adbd1339 100644
--- a/common/image-fdt.c
+++ b/common/image-fdt.c
@@ -269,21 +269,10 @@ 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)
 {
-#if CONFIG_IS_ENABLED(LEGACY_IMAGE_FORMAT)
-	const image_header_t *fdt_hdr;
-	ulong		load, load_end;
-	ulong		image_start, image_data, image_end;
-#endif
 	ulong		img_addr;
 	ulong		fdt_addr;
 	char		*fdt_blob = NULL;
 	void		*buf;
-#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;
-#endif
 	const char *select = NULL;
 
 	*of_flat_tree = NULL;
@@ -297,6 +286,11 @@ int boot_get_fdt(int flag, int argc, char *const argv[], uint8_t arch,
 		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;
+
 		if (select) {
 			/*
 			 * If the FDT blob comes from the FIT image and the
@@ -352,7 +346,11 @@ int boot_get_fdt(int flag, int argc, char *const argv[], uint8_t arch,
 		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;
+
 			/* verify fdt_addr points to a valid image header */
 			printf("## Flattened Device Tree from Legacy Image at %08lx\n",
 			       fdt_addr);
@@ -391,6 +389,7 @@ int boot_get_fdt(int flag, int argc, char *const argv[], uint8_t arch,
 
 			fdt_addr = load;
 			break;
+		}
 #endif
 		case IMAGE_FORMAT_FIT:
 			/*
-- 
2.31.1.607.g51e8a6a459-goog

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

* [PATCH v2 49/50] image: Split up boot_get_fdt()
  2021-05-06 14:23 [PATCH v2 00/50] image: Reduce #ifdefs and ad-hoc defines in image code Simon Glass
                   ` (47 preceding siblings ...)
  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
  2021-05-06 14:24 ` [PATCH v2 50/50] image: Remove #ifdefs from select_fdt() Simon Glass
  49 siblings, 0 replies; 91+ messages in thread
From: Simon Glass @ 2021-05-06 14:24 UTC (permalink / raw)
  To: u-boot

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

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

* [PATCH v2 50/50] image: Remove #ifdefs from select_fdt()
  2021-05-06 14:23 [PATCH v2 00/50] image: Reduce #ifdefs and ad-hoc defines in image code Simon Glass
                   ` (48 preceding siblings ...)
  2021-05-06 14:24 ` [PATCH v2 49/50] image: Split up boot_get_fdt() Simon Glass
@ 2021-05-06 14:24 ` Simon Glass
  49 siblings, 0 replies; 91+ messages in thread
From: Simon Glass @ 2021-05-06 14:24 UTC (permalink / raw)
  To: u-boot

Use boolean variables to deal with the strange #ifdef logic of this
function, so we can remove the #ifdefs. Also drop one from its caller,
boot_get_fdt()

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

Changes in v2:
- Correct logic for the non-FIT case
- Consider selecting a raw FDT to be success

 common/image-fdt.c | 62 +++++++++++++++++++++++-----------------------
 1 file changed, 31 insertions(+), 31 deletions(-)

diff --git a/common/image-fdt.c b/common/image-fdt.c
index 53976e39796..e7646c28e4a 100644
--- a/common/image-fdt.c
+++ b/common/image-fdt.c
@@ -39,7 +39,6 @@ static void fdt_error(const char *msg)
 	puts(" - must RESET the board to recover.\n");
 }
 
-#if CONFIG_IS_ENABLED(LEGACY_IMAGE_FORMAT)
 static const image_header_t *image_get_fdt(ulong fdt_addr)
 {
 	const image_header_t *fdt_hdr = map_sysmem(fdt_addr, 0);
@@ -72,7 +71,6 @@ static const image_header_t *image_get_fdt(ulong fdt_addr)
 	}
 	return fdt_hdr;
 }
-#endif
 
 static void boot_fdt_reserve_region(struct lmb *lmb, uint64_t addr,
 				    uint64_t size)
@@ -258,16 +256,18 @@ error:
 static int select_fdt(bootm_headers_t *images, const char *select, u8 arch,
 		      ulong *fdt_addrp)
 {
-	const char *buf;
-	ulong fdt_addr;
-
-#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 *buf;
+	bool processed;
+	ulong fdt_addr = 0;
 
 	if (select) {
+		ulong default_addr;
+		bool done = false;
+
+		if (CONFIG_IS_ENABLED(FIT)) {
 			/*
 			 * If the FDT blob comes from the FIT image and the
 			 * FIT image address is omitted in the command line
@@ -283,21 +283,22 @@ static int select_fdt(bootm_headers_t *images, const char *select, u8 arch,
 
 			if (fit_parse_conf(select, default_addr, &fdt_addr,
 					   &fit_uname_config)) {
+				done = true;
 				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)) {
+				done = true;
 				debug("*  fdt: subimage '%s' from image at 0x%08lx\n",
 				      fit_uname_fdt, fdt_addr);
-			} else
-#endif
-		{
+			}
+		}
+		if (!done) {
 			fdt_addr = simple_strtoul(select, NULL, 16);
 			debug("*  fdt: cmdline image address = 0x%08lx\n",
 			      fdt_addr);
 		}
-#if CONFIG_IS_ENABLED(FIT)
-	} else {
+	} else if (CONFIG_IS_ENABLED(FIT)) {
 		/* use FIT configuration provided in first bootm
 		 * command argument
 		 */
@@ -309,7 +310,6 @@ static int select_fdt(bootm_headers_t *images, const char *select, u8 arch,
 		else if (fdt_noffset < 0)
 			return fdt_noffset;
 	}
-#endif
 	debug("## Checking for 'FDT'/'FDT Image' at %08lx\n",
 	      fdt_addr);
 
@@ -319,13 +319,15 @@ static int select_fdt(bootm_headers_t *images, const char *select, u8 arch,
 	 * check image type, for FIT images get a FIT node.
 	 */
 	buf = map_sysmem(fdt_addr, 0);
+	processed = false;
 	switch (genimg_get_format(buf)) {
-#if CONFIG_IS_ENABLED(LEGACY_IMAGE_FORMAT)
-	case IMAGE_FORMAT_LEGACY: {
+	case IMAGE_FORMAT_LEGACY:
+		if (CONFIG_IS_ENABLED(LEGACY_IMAGE_FORMAT)) {
 			const image_header_t *fdt_hdr;
 			ulong load, load_end;
 			ulong image_start, image_data, image_end;
 
+			processed = true;
 			/* verify fdt_addr points to a valid image header */
 			printf("## Flattened Device Tree from Legacy Image@%08lx\n",
 			       fdt_addr);
@@ -350,7 +352,7 @@ static int select_fdt(bootm_headers_t *images, const char *select, u8 arch,
 				break;
 			}
 
-			if ((load < image_end) && (load_end > image_start)) {
+			if (load < image_end && load_end > image_start) {
 				fdt_error("fdt overwritten");
 				return -EFAULT;
 			}
@@ -363,16 +365,15 @@ static int select_fdt(bootm_headers_t *images, const char *select, u8 arch,
 				image_get_data_size(fdt_hdr));
 
 			fdt_addr = load;
-			break;
 		}
-#endif
+		break;
 	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)
+		if (CONFIG_IS_ENABLED(FIT)) {
 			/* check FDT blob vs FIT blob */
 			if (!fit_check_format(buf, IMAGE_SIZE_INVAL)) {
 				ulong load, len;
@@ -389,20 +390,20 @@ static int select_fdt(bootm_headers_t *images, const char *select, u8 arch,
 				images->fit_uname_fdt = fit_uname_fdt;
 				images->fit_noffset_fdt = fdt_noffset;
 				fdt_addr = load;
-
-				break;
-		} else
-#endif
-		{
-			/*
-			 * FDT blob
-			 */
+				processed = true;
+			}
+		}
+		if (!processed) {
+			/* FDT blob */
 			debug("*  fdt: raw FDT blob\n");
 			printf("## Flattened Device Tree blob at %08lx\n",
 			       (long)fdt_addr);
+			processed = true;
 		}
 		break;
-	default:
+	}
+
+	if (!processed) {
 		puts("ERROR: Did not find a cmdline Flattened Device Tree\n");
 		return -ENOENT;
 	}
@@ -492,8 +493,8 @@ int boot_get_fdt(int flag, int argc, char *const argv[], uint8_t arch,
 			debug("## No Flattened Device Tree\n");
 			goto no_fdt;
 		}
-#ifdef CONFIG_ANDROID_BOOT_IMAGE
-	} else if (genimg_get_format(buf) == IMAGE_FORMAT_ANDROID) {
+	} else if (IS_ENABLED(CONFIG_ANDROID_BOOT_IMAGE) &&
+		   genimg_get_format(buf) == IMAGE_FORMAT_ANDROID) {
 		struct andr_img_hdr *hdr = buf;
 		ulong		fdt_data, fdt_len;
 		u32			fdt_size, dtb_idx;
@@ -525,7 +526,6 @@ int boot_get_fdt(int flag, int argc, char *const argv[], uint8_t arch,
 
 			debug("## Using FDT at ${fdtaddr}=Ox%lx\n", fdt_addr);
 		}
-#endif
 	} else {
 		debug("## No Flattened Device Tree\n");
 		goto no_fdt;
-- 
2.31.1.607.g51e8a6a459-goog

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

* [PATCH v2 01/50] lib: Add memdup()
  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
  0 siblings, 1 reply; 91+ messages in thread
From: Pratyush Yadav @ 2021-05-06 17:07 UTC (permalink / raw)
  To: u-boot

On 06/05/21 08:23AM, Simon Glass wrote:
> Add a function to duplicate a memory region, a little like strdup().
> 
> Signed-off-by: Simon Glass <sjg@chromium.org>
> ---
> 
> Changes in v2:
> - Add a patch to introduce a memdup() function
> 
>  include/linux/string.h | 13 +++++++++++++
>  lib/string.c           | 13 +++++++++++++
>  test/lib/string.c      | 32 ++++++++++++++++++++++++++++++++
>  3 files changed, 58 insertions(+)
> 
> diff --git a/include/linux/string.h b/include/linux/string.h
> index dd255f21633..3169c93796e 100644
> --- a/include/linux/string.h
> +++ b/include/linux/string.h
> @@ -129,6 +129,19 @@ extern void * memchr(const void *,int,__kernel_size_t);
>  void *memchr_inv(const void *, int, size_t);
>  #endif
>  
> +/**
> + * memdup() - allocate a buffer and copy in the contents
> + *
> + * Note that this returns a valid pointer even if @len is 0

I'm uneducated about U-Boot's memory allocator. But I wonder how it 
returns a valid pointer even on 0 length allocations. What location does 
it point to? What are users expected to do with that pointer? They 
obviously can't read/write to it since it is supposed to be a 0 byte 
long allocation. If another positive length allocation happens before 
the said pointer is freed, will it point to the same memory location? If 
not, isn't the 0-length pointer actually at least a 1-length pointer?

> + *
> + * @src: data to copy in
> + * @len: number of bytes to copy
> + * @return allocated buffer with the copied contents, or NULL if not enough
> + *	memory is available
> + *
> + */
> +char *memdup(const void *src, size_t len);
> +
>  unsigned long ustrtoul(const char *cp, char **endp, unsigned int base);
>  unsigned long long ustrtoull(const char *cp, char **endp, unsigned int base);
>  
> diff --git a/lib/string.c b/lib/string.c
> index a0cff8fe88e..1be61ee0499 100644
> --- a/lib/string.c
> +++ b/lib/string.c
> @@ -658,6 +658,19 @@ void * memscan(void * addr, int c, size_t size)
>  }
>  #endif
>  
> +char *memdup(const void *src, size_t len)
> +{
> +	char *p;
> +
> +	p = malloc(len);
> +	if (!p)
> +		return NULL;
> +
> +	memcpy(p, src, len);
> +
> +	return p;
> +}
> +
>  #ifndef __HAVE_ARCH_STRSTR
>  /**
>   * strstr - Find the first substring in a %NUL terminated string
[...]

-- 
Regards,
Pratyush Yadav
Texas Instruments Inc.

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

* [PATCH v2 01/50] lib: Add memdup()
  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
  0 siblings, 2 replies; 91+ messages in thread
From: Simon Glass @ 2021-05-06 17:41 UTC (permalink / raw)
  To: u-boot

Hi Pratyush,

On Thu, 6 May 2021 at 10:07, Pratyush Yadav <p.yadav@ti.com> wrote:
>
> On 06/05/21 08:23AM, Simon Glass wrote:
> > Add a function to duplicate a memory region, a little like strdup().
> >
> > Signed-off-by: Simon Glass <sjg@chromium.org>
> > ---
> >
> > Changes in v2:
> > - Add a patch to introduce a memdup() function
> >
> >  include/linux/string.h | 13 +++++++++++++
> >  lib/string.c           | 13 +++++++++++++
> >  test/lib/string.c      | 32 ++++++++++++++++++++++++++++++++
> >  3 files changed, 58 insertions(+)
> >
> > diff --git a/include/linux/string.h b/include/linux/string.h
> > index dd255f21633..3169c93796e 100644
> > --- a/include/linux/string.h
> > +++ b/include/linux/string.h
> > @@ -129,6 +129,19 @@ extern void * memchr(const void *,int,__kernel_size_t);
> >  void *memchr_inv(const void *, int, size_t);
> >  #endif
> >
> > +/**
> > + * memdup() - allocate a buffer and copy in the contents
> > + *
> > + * Note that this returns a valid pointer even if @len is 0
>
> I'm uneducated about U-Boot's memory allocator. But I wonder how it
> returns a valid pointer even on 0 length allocations. What location does
> it point to? What are users expected to do with that pointer? They
> obviously can't read/write to it since it is supposed to be a 0 byte
> long allocation. If another positive length allocation happens before
> the said pointer is freed, will it point to the same memory location? If
> not, isn't the 0-length pointer actually at least a 1-length pointer?

I think it is just a 0-length pointer and that the only thing you can
do with it is call free().

I am certainly no expert on this sort of thing though. It seems that
some implementations return NULL for a zero size, some return a valid
pointer which can be passed to free(). Of course, U-Boot lets you pass
NULL to free() anyway.

Regards,
Simon

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

* [PATCH v2 01/50] lib: Add memdup()
  2021-05-06 17:41     ` Simon Glass
@ 2021-05-06 17:57       ` Sean Anderson
  2021-05-10  9:00       ` Rasmus Villemoes
  1 sibling, 0 replies; 91+ messages in thread
From: Sean Anderson @ 2021-05-06 17:57 UTC (permalink / raw)
  To: u-boot



On 5/6/21 1:41 PM, Simon Glass wrote:
 > Hi Pratyush,
 >
 > On Thu, 6 May 2021 at 10:07, Pratyush Yadav <p.yadav@ti.com> wrote:
 >>
 >> On 06/05/21 08:23AM, Simon Glass wrote:
 >>> Add a function to duplicate a memory region, a little like strdup().
 >>>
 >>> Signed-off-by: Simon Glass <sjg@chromium.org>
 >>> ---
 >>>
 >>> Changes in v2:
 >>> - Add a patch to introduce a memdup() function
 >>>
 >>>   include/linux/string.h | 13 +++++++++++++
 >>>   lib/string.c           | 13 +++++++++++++
 >>>   test/lib/string.c      | 32 ++++++++++++++++++++++++++++++++
 >>>   3 files changed, 58 insertions(+)
 >>>
 >>> diff --git a/include/linux/string.h b/include/linux/string.h
 >>> index dd255f21633..3169c93796e 100644
 >>> --- a/include/linux/string.h
 >>> +++ b/include/linux/string.h
 >>> @@ -129,6 +129,19 @@ extern void * memchr(const void *,int,__kernel_size_t);
 >>>   void *memchr_inv(const void *, int, size_t);
 >>>   #endif
 >>>
 >>> +/**
 >>> + * memdup() - allocate a buffer and copy in the contents
 >>> + *
 >>> + * Note that this returns a valid pointer even if @len is 0
 >>
 >> I'm uneducated about U-Boot's memory allocator. But I wonder how it
 >> returns a valid pointer even on 0 length allocations. What location does
 >> it point to? What are users expected to do with that pointer? They
 >> obviously can't read/write to it since it is supposed to be a 0 byte
 >> long allocation. If another positive length allocation happens before
 >> the said pointer is freed, will it point to the same memory location? If
 >> not, isn't the 0-length pointer actually at least a 1-length pointer?
 >
 > I think it is just a 0-length pointer and that the only thing you can
 > do with it is call free().
 >
 > I am certainly no expert on this sort of thing though. It seems that
 > some implementations return NULL for a zero size, some return a valid
 > pointer which can be passed to free(). Of course, U-Boot lets you pass
 > NULL to free() anyway.

dlmalloc has a minimum allocation size of 2*sizeof(void *) (e.g.
MINSIZE - 2*SIZE_SZ). If you request less than this, you will get an
allocation of this size. This is the same as other requests, which are
rounded up the the nearest multiple of MALLOC_ALIGNMENT. Of course,
malloc_simple will actually give you a zero-byte allocation, so don't
rely on being able to store anything there ;)

--Sean

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

* [PATCH v2 01/50] lib: Add memdup()
  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
  1 sibling, 2 replies; 91+ messages in thread
From: Rasmus Villemoes @ 2021-05-10  9:00 UTC (permalink / raw)
  To: u-boot

On 06/05/2021 19.41, Simon Glass wrote:
> Hi Pratyush,
> 
> On Thu, 6 May 2021 at 10:07, Pratyush Yadav <p.yadav@ti.com> wrote:
>>
>> On 06/05/21 08:23AM, Simon Glass wrote:
>>> Add a function to duplicate a memory region, a little like strdup().
>>>
>>> Signed-off-by: Simon Glass <sjg@chromium.org>
>>> ---
>>>
>>> Changes in v2:
>>> - Add a patch to introduce a memdup() function
>>>
>>>  include/linux/string.h | 13 +++++++++++++
>>>  lib/string.c           | 13 +++++++++++++
>>>  test/lib/string.c      | 32 ++++++++++++++++++++++++++++++++
>>>  3 files changed, 58 insertions(+)
>>>
>>> diff --git a/include/linux/string.h b/include/linux/string.h
>>> index dd255f21633..3169c93796e 100644
>>> --- a/include/linux/string.h
>>> +++ b/include/linux/string.h
>>> @@ -129,6 +129,19 @@ extern void * memchr(const void *,int,__kernel_size_t);
>>>  void *memchr_inv(const void *, int, size_t);
>>>  #endif
>>>
>>> +/**
>>> + * memdup() - allocate a buffer and copy in the contents
>>> + *
>>> + * Note that this returns a valid pointer even if @len is 0
>>
>> I'm uneducated about U-Boot's memory allocator. But I wonder how it
>> returns a valid pointer even on 0 length allocations. What location does
>> it point to? What are users expected to do with that pointer? They
>> obviously can't read/write to it since it is supposed to be a 0 byte
>> long allocation. If another positive length allocation happens before
>> the said pointer is freed, will it point to the same memory location? If
>> not, isn't the 0-length pointer actually at least a 1-length pointer?
> 
> I think it is just a 0-length pointer and that the only thing you can
> do with it is call free().
> 
> I am certainly no expert on this sort of thing though. It seems that
> some implementations return NULL for a zero size, some return a valid
> pointer which can be passed to free(). 

It's implementation-defined, which means that one cannot know for
certain that a given malloc implementation won't return NULL for a
request of 0 bytes. The linux kernel solved that problem by introducing
ZERO_SIZE_PTR which is basically just (void*)16L or something like that
- that way callers don't have to write their "did the allocation
succeed" test in the ugly

  if (!p && size != 0)
    error_out;

way. Of course kfree() must then accept that in addition to NULL, but
it's not really more expensive to have that early nop check be

  if ((unsigned long)ptr <= 16)
     return;

instead of

  if (!ptr)
    return;


"man malloc" says

RETURN VALUE
       The malloc() and calloc() functions return a pointer to the
allocated memory, which is suitably aligned for any built-in type.  On
error,  these  functions
       return  NULL.   NULL may also be returned by a successful call to
malloc() with a size of zero, or by a successful call to calloc() with
nmemb or size equal
       to zero.


Anyway, I don't think this helper should be put in string.c - it needs
to be in some C file that's easily compiled for both board, sandbox and
host tools (for the latter probably via the "tiny one-line wrapper that
just includes the whole real C file"). I see there's linux_string.c already.

Rasmus

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

* [PATCH v2 01/50] lib: Add memdup()
  2021-05-10  9:00       ` Rasmus Villemoes
@ 2021-05-10 11:21         ` Heinrich Schuchardt
  2021-05-10 16:28         ` Simon Glass
  1 sibling, 0 replies; 91+ messages in thread
From: Heinrich Schuchardt @ 2021-05-10 11:21 UTC (permalink / raw)
  To: u-boot

On 5/10/21 11:00 AM, Rasmus Villemoes wrote:
> On 06/05/2021 19.41, Simon Glass wrote:
>> Hi Pratyush,
>>
>> On Thu, 6 May 2021 at 10:07, Pratyush Yadav <p.yadav@ti.com> wrote:
>>>
>>> On 06/05/21 08:23AM, Simon Glass wrote:
>>>> Add a function to duplicate a memory region, a little like strdup().
>>>>
>>>> Signed-off-by: Simon Glass <sjg@chromium.org>
>>>> ---
>>>>
>>>> Changes in v2:
>>>> - Add a patch to introduce a memdup() function
>>>>
>>>>   include/linux/string.h | 13 +++++++++++++
>>>>   lib/string.c           | 13 +++++++++++++
>>>>   test/lib/string.c      | 32 ++++++++++++++++++++++++++++++++
>>>>   3 files changed, 58 insertions(+)
>>>>
>>>> diff --git a/include/linux/string.h b/include/linux/string.h
>>>> index dd255f21633..3169c93796e 100644
>>>> --- a/include/linux/string.h
>>>> +++ b/include/linux/string.h
>>>> @@ -129,6 +129,19 @@ extern void * memchr(const void *,int,__kernel_size_t);
>>>>   void *memchr_inv(const void *, int, size_t);
>>>>   #endif
>>>>
>>>> +/**
>>>> + * memdup() - allocate a buffer and copy in the contents
>>>> + *
>>>> + * Note that this returns a valid pointer even if @len is 0
>>>
>>> I'm uneducated about U-Boot's memory allocator. But I wonder how it
>>> returns a valid pointer even on 0 length allocations. What location does
>>> it point to? What are users expected to do with that pointer? They
>>> obviously can't read/write to it since it is supposed to be a 0 byte
>>> long allocation. If another positive length allocation happens before
>>> the said pointer is freed, will it point to the same memory location? If
>>> not, isn't the 0-length pointer actually at least a 1-length pointer?
>>
>> I think it is just a 0-length pointer and that the only thing you can
>> do with it is call free().
>>
>> I am certainly no expert on this sort of thing though. It seems that
>> some implementations return NULL for a zero size, some return a valid
>> pointer which can be passed to free().
>
> It's implementation-defined, which means that one cannot know for
> certain that a given malloc implementation won't return NULL for a
> request of 0 bytes. The linux kernel solved that problem by introducing
> ZERO_SIZE_PTR which is basically just (void*)16L or something like that
> - that way callers don't have to write their "did the allocation
> succeed" test in the ugly
>
>    if (!p && size != 0)
>      error_out;
>
> way. Of course kfree() must then accept that in addition to NULL, but
> it's not really more expensive to have that early nop check be
>
>    if ((unsigned long)ptr <= 16)
>       return;
>
> instead of
>
>    if (!ptr)
>      return;
>
>
> "man malloc" says
>
> RETURN VALUE
>         The malloc() and calloc() functions return a pointer to the
> allocated memory, which is suitably aligned for any built-in type.  On
> error,  these  functions
>         return  NULL.   NULL may also be returned by a successful call to
> malloc() with a size of zero, or by a successful call to calloc() with
> nmemb or size equal
>         to zero.
>
>
> Anyway, I don't think this helper should be put in string.c - it needs
> to be in some C file that's easily compiled for both board, sandbox and
> host tools (for the latter probably via the "tiny one-line wrapper that
> just includes the whole real C file"). I see there's linux_string.c already.
>
> Rasmus
>

Our malloc() implementation allocates space for metadata of type struct
malloc_chunk even if the argument is zero.

This metadata is used to check that a call to free() refers to a valid
pointer.

I don't see a need to change this behavior.

Best regards

Heinrich

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

* [PATCH v2 01/50] lib: Add memdup()
  2021-05-10  9:00       ` Rasmus Villemoes
  2021-05-10 11:21         ` Heinrich Schuchardt
@ 2021-05-10 16:28         ` Simon Glass
  1 sibling, 0 replies; 91+ messages in thread
From: Simon Glass @ 2021-05-10 16:28 UTC (permalink / raw)
  To: u-boot

Hi Rasmus,

On Mon, 10 May 2021 at 03:00, Rasmus Villemoes
<rasmus.villemoes@prevas.dk> wrote:
>
> On 06/05/2021 19.41, Simon Glass wrote:
> > Hi Pratyush,
> >
> > On Thu, 6 May 2021 at 10:07, Pratyush Yadav <p.yadav@ti.com> wrote:
> >>
> >> On 06/05/21 08:23AM, Simon Glass wrote:
> >>> Add a function to duplicate a memory region, a little like strdup().
> >>>
> >>> Signed-off-by: Simon Glass <sjg@chromium.org>
> >>> ---
> >>>
> >>> Changes in v2:
> >>> - Add a patch to introduce a memdup() function
> >>>
> >>>  include/linux/string.h | 13 +++++++++++++
> >>>  lib/string.c           | 13 +++++++++++++
> >>>  test/lib/string.c      | 32 ++++++++++++++++++++++++++++++++
> >>>  3 files changed, 58 insertions(+)
> >>>
> >>> diff --git a/include/linux/string.h b/include/linux/string.h
> >>> index dd255f21633..3169c93796e 100644
> >>> --- a/include/linux/string.h
> >>> +++ b/include/linux/string.h
> >>> @@ -129,6 +129,19 @@ extern void * memchr(const void *,int,__kernel_size_t);
> >>>  void *memchr_inv(const void *, int, size_t);
> >>>  #endif
> >>>
> >>> +/**
> >>> + * memdup() - allocate a buffer and copy in the contents
> >>> + *
> >>> + * Note that this returns a valid pointer even if @len is 0
> >>
> >> I'm uneducated about U-Boot's memory allocator. But I wonder how it
> >> returns a valid pointer even on 0 length allocations. What location does
> >> it point to? What are users expected to do with that pointer? They
> >> obviously can't read/write to it since it is supposed to be a 0 byte
> >> long allocation. If another positive length allocation happens before
> >> the said pointer is freed, will it point to the same memory location? If
> >> not, isn't the 0-length pointer actually at least a 1-length pointer?
> >
> > I think it is just a 0-length pointer and that the only thing you can
> > do with it is call free().
> >
> > I am certainly no expert on this sort of thing though. It seems that
> > some implementations return NULL for a zero size, some return a valid
> > pointer which can be passed to free().
>
> It's implementation-defined, which means that one cannot know for
> certain that a given malloc implementation won't return NULL for a
> request of 0 bytes. The linux kernel solved that problem by introducing

This function is for U-Boot board code. Note that the C-library
malloc() is used for tools and we don't run these tests using that, so
it is safe to assume that it is the U-Boot malloc() that is used in
all cases where this function is used.

> ZERO_SIZE_PTR which is basically just (void*)16L or something like that
> - that way callers don't have to write their "did the allocation
> succeed" test in the ugly
>
>   if (!p && size != 0)
>     error_out;
>
> way. Of course kfree() must then accept that in addition to NULL, but
> it's not really more expensive to have that early nop check be
>
>   if ((unsigned long)ptr <= 16)
>      return;
>
> instead of
>
>   if (!ptr)
>     return;
>
>
> "man malloc" says
>
> RETURN VALUE
>        The malloc() and calloc() functions return a pointer to the
> allocated memory, which is suitably aligned for any built-in type.  On
> error,  these  functions
>        return  NULL.   NULL may also be returned by a successful call to
> malloc() with a size of zero, or by a successful call to calloc() with
> nmemb or size equal
>        to zero.
>
>
> Anyway, I don't think this helper should be put in string.c - it needs
> to be in some C file that's easily compiled for both board, sandbox and
> host tools (for the latter probably via the "tiny one-line wrapper that
> just includes the whole real C file"). I see there's linux_string.c already.

I'm not a big fan of adding a function that can be used from tools as
well as U-Boot. Sandbox just uses the U-Boot libraries, so far as
possible. Only a few files even compile with the host C libraries
(e.g. os.c).

So if we want this functionality in the host tools, I suggest we add
it into the tools dir somewhere.

Regards,
SImon

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

* [PATCH v2 16/50] image: Add Kconfig options for FIT in the host build
  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 14:51     ` Simon Glass
  0 siblings, 2 replies; 91+ messages in thread
From: Alex G. @ 2021-05-11 19:57 UTC (permalink / raw)
  To: u-boot

On 5/6/21 9:24 AM, Simon Glass wrote:
> In preparation for enabling CONFIG_IS_ENABLED() on the host build, add
> some options to enable the various FIT options expected in these tools.
> This will ensure that the code builds correctly when CONFIG_HOST_xxx
> is distinct from CONFIG_xxx.
> 
> Signed-off-by: Simon Glass <sjg@chromium.org>

Reviewed-by: Alexandru Gagniuc <mr.nuke.me@gmail.com>

This makes me wonder whether we should just always enable host features. 
Right now, each defconfig can have a different mkimage config. So we 
should really have mkimage-imx8, mkimage-stm32mp, etc, which support 
different feature sets. This doesn't make much sense.

The alternative is to get rid of all these configs and always enable 
mkimage features. The disadvantage is that we'd require openssl for 
building target code.

A second alternative is to have a mkimage-nossl that gets built and used 
when openssl isn't available. It's really just openssl that causes such 
a schism.

Alex

> ---
> 
> (no changes since v1)
> 
>   common/image-fit-sig.c |  3 ++-
>   common/image-fit.c     |  4 ++--
>   tools/Kconfig          | 25 +++++++++++++++++++++++++
>   tools/Makefile         | 18 +++++++++---------
>   4 files changed, 38 insertions(+), 12 deletions(-)
> 
> diff --git a/common/image-fit-sig.c b/common/image-fit-sig.c
> index 55ddf1879ed..12a6745c642 100644
> --- a/common/image-fit-sig.c
> +++ b/common/image-fit-sig.c
> @@ -72,11 +72,12 @@ static int fit_image_setup_verify(struct image_sign_info *info,
>   	char *algo_name;
>   	const char *padding_name;
>   
> +#ifndef USE_HOSTCC
>   	if (fdt_totalsize(fit) > CONFIG_FIT_SIGNATURE_MAX_SIZE) {
>   		*err_msgp = "Total size too large";
>   		return 1;
>   	}
> -
> +#endif
>   	if (fit_image_hash_get_algo(fit, noffset, &algo_name)) {
>   		*err_msgp = "Can't get hash algo property";
>   		return -1;
> diff --git a/common/image-fit.c b/common/image-fit.c
> index e614643fe39..a16e2dd54a5 100644
> --- a/common/image-fit.c
> +++ b/common/image-fit.c
> @@ -165,7 +165,7 @@ int fit_get_subimage_count(const void *fit, int images_noffset)
>   	return count;
>   }
>   
> -#if CONFIG_IS_ENABLED(FIT_PRINT) || CONFIG_IS_ENABLED(SPL_FIT_PRINT)
> +#if CONFIG_IS_ENABLED(FIT_PRINT)
>   /**
>    * fit_image_print_data() - prints out the hash node details
>    * @fit: pointer to the FIT format image header
> @@ -573,7 +573,7 @@ void fit_image_print(const void *fit, int image_noffset, const char *p)
>   #else
>   void fit_print_contents(const void *fit) { }
>   void fit_image_print(const void *fit, int image_noffset, const char *p) { }
> -#endif /* CONFIG_IS_ENABLED(FIR_PRINT) || CONFIG_IS_ENABLED(SPL_FIT_PRINT) */
> +#endif /* CONFIG_IS_ENABLED(FIT_PRINT) */
>   
>   /**
>    * fit_get_desc - get node description property
> diff --git a/tools/Kconfig b/tools/Kconfig
> index b2f5012240c..f00ab661135 100644
> --- a/tools/Kconfig
> +++ b/tools/Kconfig
> @@ -9,4 +9,29 @@ config MKIMAGE_DTC_PATH
>   	  some cases the system dtc may not support all required features
>   	  and the path to a different version should be given here.
>   
> +config HOST_FIT
> +	def_bool y
> +	help
> +	  Enable FIT support in the host build.

Don't we always want to enable this for mkimage?

> +
> +config HOST_FIT_FULL_CHECK
> +	def_bool y
> +	help
> +	  Do a full check of the FIT before using it in the host build

How would this be used? FIT vs FIT_FULL is mostly an SPL distinction. I 
don't think we should have it in host tools.

> +
> +config HOST_FIT_PRINT
> +	def_bool y
> +	help
> +	  Print the content of the FIT verbosely in the host build

This option also doesn't make sense.This seems to do what 'mkimage -l' 
already supports.

> +
> +config HOST_FIT_SIGNATURE
> +	def_bool y
> +	help
> +	  Enable signature verification of FIT uImages in the host build

s/verification/signing and verification/

> +
> +config HOST_FIT_SIGNATURE_MAX_SIZE
> +	hex
> +	depends on HOST_FIT_SIGNATURE
> +	default 0x10000000
> +

The only use of FIT_SIGNATURE_MAX_SIZE is under "#ifndef USE_HOSTCC". So 
this wouldn't make any sense for the host.

>   endmenu
> diff --git a/tools/Makefile b/tools/Makefile
> index 2b4bc547abd..d143198f7c9 100644
> --- a/tools/Makefile
> +++ b/tools/Makefile
> @@ -53,12 +53,12 @@ hostprogs-y += mkenvimage
>   mkenvimage-objs := mkenvimage.o os_support.o lib/crc32.o
>   
>   hostprogs-y += dumpimage mkimage
> -hostprogs-$(CONFIG_FIT_SIGNATURE) += fit_info fit_check_sign
> +hostprogs-$(CONFIG_HOST_FIT_SIGNATURE) += fit_info fit_check_sign
>   
>   hostprogs-$(CONFIG_CMD_BOOTEFI_SELFTEST) += file2include
>   
> -FIT_OBJS-$(CONFIG_FIT) := fit_common.o fit_image.o image-host.o common/image-fit.o
> -FIT_SIG_OBJS-$(CONFIG_FIT_SIGNATURE) := common/image-sig.o common/image-fit-sig.o
> +FIT_OBJS-$(CONFIG_HOST_FIT) := fit_common.o fit_image.o image-host.o common/image-fit.o
> +FIT_SIG_OBJS-$(CONFIG_HOST_FIT_SIGNATURE) := common/image-sig.o common/image-fit-sig.o
>   FIT_CIPHER_OBJS-$(CONFIG_FIT_CIPHER) := common/image-cipher.o
>   
>   # The following files are synced with upstream DTC.
> @@ -66,17 +66,17 @@ FIT_CIPHER_OBJS-$(CONFIG_FIT_CIPHER) := common/image-cipher.o
>   LIBFDT_OBJS := $(addprefix libfdt/, fdt.o fdt_ro.o fdt_wip.o fdt_sw.o fdt_rw.o \
>   		fdt_strerror.o fdt_empty_tree.o fdt_addresses.o fdt_overlay.o)
>   
> -RSA_OBJS-$(CONFIG_FIT_SIGNATURE) := $(addprefix lib/rsa/, \
> +RSA_OBJS-$(CONFIG_HOST_FIT_SIGNATURE) := $(addprefix lib/rsa/, \
>   					rsa-sign.o rsa-verify.o \
>   					rsa-mod-exp.o)
>   
> -ECDSA_OBJS-$(CONFIG_FIT_SIGNATURE) := $(addprefix lib/ecdsa/, ecdsa-libcrypto.o)
> +ECDSA_OBJS-$(CONFIG_HOST_FIT_SIGNATURE) := $(addprefix lib/ecdsa/, ecdsa-libcrypto.o)
>   
>   AES_OBJS-$(CONFIG_FIT_CIPHER) := $(addprefix lib/aes/, \
>   					aes-encrypt.o aes-decrypt.o)
>   
>   # Cryptographic helpers that depend on openssl/libcrypto
> -LIBCRYPTO_OBJS-$(CONFIG_FIT_SIGNATURE) := $(addprefix lib/, \
> +LIBCRYPTO_OBJS-$(CONFIG_HOST_FIT_SIGNATURE) := $(addprefix lib/, \
>   					fdt-libcrypto.o)
>   
>   ROCKCHIP_OBS = lib/rc4.o rkcommon.o rkimage.o rksd.o rkspi.o
> @@ -137,13 +137,13 @@ fit_info-objs   := $(dumpimage-mkimage-objs) fit_info.o
>   fit_check_sign-objs   := $(dumpimage-mkimage-objs) fit_check_sign.o
>   file2include-objs := file2include.o
>   
> -ifneq ($(CONFIG_MX23)$(CONFIG_MX28)$(CONFIG_FIT_SIGNATURE),)
> +ifneq ($(CONFIG_MX23)$(CONFIG_MX28)$(CONFIG_HOST_FIT_SIGNATURE),)
>   # Add CONFIG_MXS into host CFLAGS, so we can check whether or not register
>   # the mxsimage support within tools/mxsimage.c .
>   HOSTCFLAGS_mxsimage.o += -DCONFIG_MXS
>   endif
>   
> -ifdef CONFIG_FIT_SIGNATURE
> +ifdef CONFIG_HOST_FIT_SIGNATURE
>   # This affects include/image.h, but including the board config file
>   # is tricky, so manually define this options here.
>   HOST_EXTRACFLAGS	+= -DCONFIG_FIT_SIGNATURE
> @@ -165,7 +165,7 @@ HOSTCFLAGS_kwbimage.o += -DCONFIG_KWB_SECURE
>   endif
>   
>   # MXSImage needs LibSSL
> -ifneq ($(CONFIG_MX23)$(CONFIG_MX28)$(CONFIG_ARMADA_38X)$(CONFIG_FIT_SIGNATURE)$(CONFIG_FIT_CIPHER),)
> +ifneq ($(CONFIG_MX23)$(CONFIG_MX28)$(CONFIG_ARMADA_38X)$(CONFIG_HOST_FIT_SIGNATURE)$(CONFIG_FIT_CIPHER),)
>   HOSTCFLAGS_kwbimage.o += \
>   	$(shell pkg-config --cflags libssl libcrypto 2> /dev/null || echo "")
>   HOSTLDLIBS_mkimage += \
> 

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

* [PATCH v2 16/50] image: Add Kconfig options for FIT in the host build
  2021-05-11 19:57   ` Alex G.
@ 2021-05-11 22:34     ` Tom Rini
  2021-05-12  0:50       ` Alex G.
  2021-05-12 14:51     ` Simon Glass
  1 sibling, 1 reply; 91+ messages in thread
From: Tom Rini @ 2021-05-11 22:34 UTC (permalink / raw)
  To: u-boot

On Tue, May 11, 2021 at 02:57:03PM -0500, Alex G. wrote:
> On 5/6/21 9:24 AM, Simon Glass wrote:
> > In preparation for enabling CONFIG_IS_ENABLED() on the host build, add
> > some options to enable the various FIT options expected in these tools.
> > This will ensure that the code builds correctly when CONFIG_HOST_xxx
> > is distinct from CONFIG_xxx.
> > 
> > Signed-off-by: Simon Glass <sjg@chromium.org>
> 
> Reviewed-by: Alexandru Gagniuc <mr.nuke.me@gmail.com>
> 
> This makes me wonder whether we should just always enable host features.
> Right now, each defconfig can have a different mkimage config. So we should
> really have mkimage-imx8, mkimage-stm32mp, etc, which support different
> feature sets. This doesn't make much sense.
> 
> The alternative is to get rid of all these configs and always enable mkimage
> features. The disadvantage is that we'd require openssl for building target
> code.
> 
> A second alternative is to have a mkimage-nossl that gets built and used
> when openssl isn't available. It's really just openssl that causes such a
> schism.

It would probably be best to have a single mkimage for everyone, with
everything on.  But before then we really need to move from openssl to
gnutls or some other library that's compatible as it's been raised
before that linking with openssl like we do is a license violation I
believe.

-- 
Tom
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 659 bytes
Desc: not available
URL: <https://lists.denx.de/pipermail/u-boot/attachments/20210511/fe2ac551/attachment.sig>

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

* [PATCH v2 16/50] image: Add Kconfig options for FIT in the host build
  2021-05-11 22:34     ` Tom Rini
@ 2021-05-12  0:50       ` Alex G.
  2021-05-12  1:10         ` Tom Rini
  0 siblings, 1 reply; 91+ messages in thread
From: Alex G. @ 2021-05-12  0:50 UTC (permalink / raw)
  To: u-boot

On 5/11/21 5:34 PM, Tom Rini wrote:
> On Tue, May 11, 2021 at 02:57:03PM -0500, Alex G. wrote:
>> On 5/6/21 9:24 AM, Simon Glass wrote:
>>> In preparation for enabling CONFIG_IS_ENABLED() on the host build, add
>>> some options to enable the various FIT options expected in these tools.
>>> This will ensure that the code builds correctly when CONFIG_HOST_xxx
>>> is distinct from CONFIG_xxx.
>>>
>>> Signed-off-by: Simon Glass <sjg@chromium.org>
>>
>> Reviewed-by: Alexandru Gagniuc <mr.nuke.me@gmail.com>
>>
>> This makes me wonder whether we should just always enable host features.
>> Right now, each defconfig can have a different mkimage config. So we should
>> really have mkimage-imx8, mkimage-stm32mp, etc, which support different
>> feature sets. This doesn't make much sense.
>>
>> The alternative is to get rid of all these configs and always enable mkimage
>> features. The disadvantage is that we'd require openssl for building target
>> code.
>>
>> A second alternative is to have a mkimage-nossl that gets built and used
>> when openssl isn't available. It's really just openssl that causes such a
>> schism.
> 
> It would probably be best to have a single mkimage for everyone, with
> everything on.  But before then we really need to move from openssl to
> gnutls or some other library that's compatible as it's been raised
> before that linking with openssl like we do is a license violation I
> believe.

How about the former alternative for now? i.e. compile mkimage with or 
without openssl, and have that be the only host side switch.

Alex

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

* [PATCH v2 16/50] image: Add Kconfig options for FIT in the host build
  2021-05-12  0:50       ` Alex G.
@ 2021-05-12  1:10         ` Tom Rini
  2021-05-12 15:52           ` Simon Glass
  0 siblings, 1 reply; 91+ messages in thread
From: Tom Rini @ 2021-05-12  1:10 UTC (permalink / raw)
  To: u-boot

On Tue, May 11, 2021 at 07:50:38PM -0500, Alex G. wrote:
> On 5/11/21 5:34 PM, Tom Rini wrote:
> > On Tue, May 11, 2021 at 02:57:03PM -0500, Alex G. wrote:
> > > On 5/6/21 9:24 AM, Simon Glass wrote:
> > > > In preparation for enabling CONFIG_IS_ENABLED() on the host build, add
> > > > some options to enable the various FIT options expected in these tools.
> > > > This will ensure that the code builds correctly when CONFIG_HOST_xxx
> > > > is distinct from CONFIG_xxx.
> > > > 
> > > > Signed-off-by: Simon Glass <sjg@chromium.org>
> > > 
> > > Reviewed-by: Alexandru Gagniuc <mr.nuke.me@gmail.com>
> > > 
> > > This makes me wonder whether we should just always enable host features.
> > > Right now, each defconfig can have a different mkimage config. So we should
> > > really have mkimage-imx8, mkimage-stm32mp, etc, which support different
> > > feature sets. This doesn't make much sense.
> > > 
> > > The alternative is to get rid of all these configs and always enable mkimage
> > > features. The disadvantage is that we'd require openssl for building target
> > > code.
> > > 
> > > A second alternative is to have a mkimage-nossl that gets built and used
> > > when openssl isn't available. It's really just openssl that causes such a
> > > schism.
> > 
> > It would probably be best to have a single mkimage for everyone, with
> > everything on.  But before then we really need to move from openssl to
> > gnutls or some other library that's compatible as it's been raised
> > before that linking with openssl like we do is a license violation I
> > believe.
> 
> How about the former alternative for now? i.e. compile mkimage with or
> without openssl, and have that be the only host side switch.

That would be a step in the right direction, yeah.

-- 
Tom
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 659 bytes
Desc: not available
URL: <https://lists.denx.de/pipermail/u-boot/attachments/20210511/eeb715c2/attachment.sig>

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

* [PATCH v2 16/50] image: Add Kconfig options for FIT in the host build
  2021-05-11 19:57   ` Alex G.
  2021-05-11 22:34     ` Tom Rini
@ 2021-05-12 14:51     ` Simon Glass
  2021-05-12 15:48       ` Alex G.
  1 sibling, 1 reply; 91+ messages in thread
From: Simon Glass @ 2021-05-12 14:51 UTC (permalink / raw)
  To: u-boot

Hi Alex,

On Tue, 11 May 2021 at 13:57, Alex G. <mr.nuke.me@gmail.com> wrote:
>
> On 5/6/21 9:24 AM, Simon Glass wrote:
> > In preparation for enabling CONFIG_IS_ENABLED() on the host build, add
> > some options to enable the various FIT options expected in these tools.
> > This will ensure that the code builds correctly when CONFIG_HOST_xxx
> > is distinct from CONFIG_xxx.
> >
> > Signed-off-by: Simon Glass <sjg@chromium.org>
>
> Reviewed-by: Alexandru Gagniuc <mr.nuke.me@gmail.com>
>
> This makes me wonder whether we should just always enable host features.
> Right now, each defconfig can have a different mkimage config. So we
> should really have mkimage-imx8, mkimage-stm32mp, etc, which support
> different feature sets. This doesn't make much sense.

My intent is that we enable all features in host tools. For
distributions they build the tools-only config and make things work
that way. But perhaps we could avoid building the tools, or do it
separately, if there were no different between boards.

>
> The alternative is to get rid of all these configs and always enable
> mkimage features. The disadvantage is that we'd require openssl for
> building target code.
>
> A second alternative is to have a mkimage-nossl that gets built and used
> when openssl isn't available. It's really just openssl that causes such
> a schism.

Why is openssl such a problem?

>
> Alex
>
> > ---
> >
> > (no changes since v1)
> >
> >   common/image-fit-sig.c |  3 ++-
> >   common/image-fit.c     |  4 ++--
> >   tools/Kconfig          | 25 +++++++++++++++++++++++++
> >   tools/Makefile         | 18 +++++++++---------
> >   4 files changed, 38 insertions(+), 12 deletions(-)
> >
> > diff --git a/common/image-fit-sig.c b/common/image-fit-sig.c
> > index 55ddf1879ed..12a6745c642 100644
> > --- a/common/image-fit-sig.c
> > +++ b/common/image-fit-sig.c
> > @@ -72,11 +72,12 @@ static int fit_image_setup_verify(struct image_sign_info *info,
> >       char *algo_name;
> >       const char *padding_name;
> >
> > +#ifndef USE_HOSTCC
> >       if (fdt_totalsize(fit) > CONFIG_FIT_SIGNATURE_MAX_SIZE) {
> >               *err_msgp = "Total size too large";
> >               return 1;
> >       }
> > -
> > +#endif
> >       if (fit_image_hash_get_algo(fit, noffset, &algo_name)) {
> >               *err_msgp = "Can't get hash algo property";
> >               return -1;
> > diff --git a/common/image-fit.c b/common/image-fit.c
> > index e614643fe39..a16e2dd54a5 100644
> > --- a/common/image-fit.c
> > +++ b/common/image-fit.c
> > @@ -165,7 +165,7 @@ int fit_get_subimage_count(const void *fit, int images_noffset)
> >       return count;
> >   }
> >
> > -#if CONFIG_IS_ENABLED(FIT_PRINT) || CONFIG_IS_ENABLED(SPL_FIT_PRINT)
> > +#if CONFIG_IS_ENABLED(FIT_PRINT)
> >   /**
> >    * fit_image_print_data() - prints out the hash node details
> >    * @fit: pointer to the FIT format image header
> > @@ -573,7 +573,7 @@ void fit_image_print(const void *fit, int image_noffset, const char *p)
> >   #else
> >   void fit_print_contents(const void *fit) { }
> >   void fit_image_print(const void *fit, int image_noffset, const char *p) { }
> > -#endif /* CONFIG_IS_ENABLED(FIR_PRINT) || CONFIG_IS_ENABLED(SPL_FIT_PRINT) */
> > +#endif /* CONFIG_IS_ENABLED(FIT_PRINT) */
> >
> >   /**
> >    * fit_get_desc - get node description property
> > diff --git a/tools/Kconfig b/tools/Kconfig
> > index b2f5012240c..f00ab661135 100644
> > --- a/tools/Kconfig
> > +++ b/tools/Kconfig
> > @@ -9,4 +9,29 @@ config MKIMAGE_DTC_PATH
> >         some cases the system dtc may not support all required features
> >         and the path to a different version should be given here.
> >
> > +config HOST_FIT
> > +     def_bool y
> > +     help
> > +       Enable FIT support in the host build.
>
> Don't we always want to enable this for mkimage?

Yes, that's right.

>
> > +
> > +config HOST_FIT_FULL_CHECK
> > +     def_bool y
> > +     help
> > +       Do a full check of the FIT before using it in the host build
>
> How would this be used? FIT vs FIT_FULL is mostly an SPL distinction. I
> don't think we should have it in host tools.

It allows us to use CONFIG_IS_ENABLED() everywhere, including in code
built as part of host tools. In fact that is the main purpose of this
series.

>
> > +
> > +config HOST_FIT_PRINT
> > +     def_bool y
> > +     help
> > +       Print the content of the FIT verbosely in the host build
>
> This option also doesn't make sense.This seems to do what 'mkimage -l'
> already supports.

Are you sure you have looked at the goal of the CONFIG_IS_ENABLED()
changes? This is here purely to avoid #ifdefs in the share code.

>
> > +
> > +config HOST_FIT_SIGNATURE
> > +     def_bool y
> > +     help
> > +       Enable signature verification of FIT uImages in the host build
>
> s/verification/signing and verification/

OK, yes it does control that in the tools, by virtue of tools/Makefile

>
> > +
> > +config HOST_FIT_SIGNATURE_MAX_SIZE
> > +     hex
> > +     depends on HOST_FIT_SIGNATURE
> > +     default 0x10000000
> > +
>
> The only use of FIT_SIGNATURE_MAX_SIZE is under "#ifndef USE_HOSTCC". So
> this wouldn't make any sense for the host.

This is used in fit_image_setup_verify() which is build by tools.

[..]

Regards,
Simon

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

* [PATCH v2 16/50] image: Add Kconfig options for FIT in the host build
  2021-05-12 14:51     ` Simon Glass
@ 2021-05-12 15:48       ` Alex G.
  2021-05-12 15:54         ` Simon Glass
  0 siblings, 1 reply; 91+ messages in thread
From: Alex G. @ 2021-05-12 15:48 UTC (permalink / raw)
  To: u-boot



On 5/12/21 9:51 AM, Simon Glass wrote:
> Hi Alex,
> 
> On Tue, 11 May 2021 at 13:57, Alex G. <mr.nuke.me@gmail.com> wrote:
>>
>> On 5/6/21 9:24 AM, Simon Glass wrote:

[snip]

>>
>>> +
>>> +config HOST_FIT_PRINT
>>> +     def_bool y
>>> +     help
>>> +       Print the content of the FIT verbosely in the host build
>>
>> This option also doesn't make sense.This seems to do what 'mkimage -l'
>> already supports.
> 
> Are you sure you have looked at the goal of the CONFIG_IS_ENABLED()
> changes? This is here purely to avoid #ifdefs in the share code.

On the one hand, we have the cosmetic inconvenience caused by #ifdefs. 
On the other hand we have the config system. To most users, the config 
system is likely more visible, while it's mostly developers who will 
ever see the ifdefs.

Therefore, in order to get the developer convenience of less ifdefs, we 
have to sacrifice user convenience by cloberring the Kconfig options. I 
think this is back-to-front.

Can we reduce the host config count to just SLL/NOSSL?

Alex

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

* [PATCH v2 16/50] image: Add Kconfig options for FIT in the host build
  2021-05-12  1:10         ` Tom Rini
@ 2021-05-12 15:52           ` Simon Glass
  2021-05-12 16:19             ` Alex G.
  0 siblings, 1 reply; 91+ messages in thread
From: Simon Glass @ 2021-05-12 15:52 UTC (permalink / raw)
  To: u-boot

Hi,

On Tue, 11 May 2021 at 19:10, Tom Rini <trini@konsulko.com> wrote:
>
> On Tue, May 11, 2021 at 07:50:38PM -0500, Alex G. wrote:
> > On 5/11/21 5:34 PM, Tom Rini wrote:
> > > On Tue, May 11, 2021 at 02:57:03PM -0500, Alex G. wrote:
> > > > On 5/6/21 9:24 AM, Simon Glass wrote:
> > > > > In preparation for enabling CONFIG_IS_ENABLED() on the host build, add
> > > > > some options to enable the various FIT options expected in these tools.
> > > > > This will ensure that the code builds correctly when CONFIG_HOST_xxx
> > > > > is distinct from CONFIG_xxx.
> > > > >
> > > > > Signed-off-by: Simon Glass <sjg@chromium.org>
> > > >
> > > > Reviewed-by: Alexandru Gagniuc <mr.nuke.me@gmail.com>
> > > >
> > > > This makes me wonder whether we should just always enable host features.
> > > > Right now, each defconfig can have a different mkimage config. So we should
> > > > really have mkimage-imx8, mkimage-stm32mp, etc, which support different
> > > > feature sets. This doesn't make much sense.
> > > >
> > > > The alternative is to get rid of all these configs and always enable mkimage
> > > > features. The disadvantage is that we'd require openssl for building target
> > > > code.
> > > >
> > > > A second alternative is to have a mkimage-nossl that gets built and used
> > > > when openssl isn't available. It's really just openssl that causes such a
> > > > schism.
> > >
> > > It would probably be best to have a single mkimage for everyone, with
> > > everything on.  But before then we really need to move from openssl to
> > > gnutls or some other library that's compatible as it's been raised
> > > before that linking with openssl like we do is a license violation I
> > > believe.
> >
> > How about the former alternative for now? i.e. compile mkimage with or
> > without openssl, and have that be the only host side switch.
>
> That would be a step in the right direction, yeah.

We have a NO_SDL build-time control. Perhaps have a NO_SSL one as well?

Regards,
Simon

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

* [PATCH v2 16/50] image: Add Kconfig options for FIT in the host build
  2021-05-12 15:48       ` Alex G.
@ 2021-05-12 15:54         ` Simon Glass
  2021-05-12 16:18           ` Alex G.
  0 siblings, 1 reply; 91+ messages in thread
From: Simon Glass @ 2021-05-12 15:54 UTC (permalink / raw)
  To: u-boot

Hi Alex,

On Wed, 12 May 2021 at 09:48, Alex G. <mr.nuke.me@gmail.com> wrote:
>
>
>
> On 5/12/21 9:51 AM, Simon Glass wrote:
> > Hi Alex,
> >
> > On Tue, 11 May 2021 at 13:57, Alex G. <mr.nuke.me@gmail.com> wrote:
> >>
> >> On 5/6/21 9:24 AM, Simon Glass wrote:
>
> [snip]
>
> >>
> >>> +
> >>> +config HOST_FIT_PRINT
> >>> +     def_bool y
> >>> +     help
> >>> +       Print the content of the FIT verbosely in the host build
> >>
> >> This option also doesn't make sense.This seems to do what 'mkimage -l'
> >> already supports.
> >
> > Are you sure you have looked at the goal of the CONFIG_IS_ENABLED()
> > changes? This is here purely to avoid #ifdefs in the share code.
>
> On the one hand, we have the cosmetic inconvenience caused by #ifdefs.
> On the other hand we have the config system. To most users, the config
> system is likely more visible, while it's mostly developers who will
> ever see the ifdefs.
>
> Therefore, in order to get the developer convenience of less ifdefs, we
> have to sacrifice user convenience by cloberring the Kconfig options. I
> think this is back-to-front.

These Kconfig options are not visible to users. They cannot be updated
in defconfig, nor in 'make menuconfig', etc. They are purely there for
the build system.

>
> Can we reduce the host config count to just SLL/NOSSL?

The point here is that the code has a special case for host builds,
and this is a means to remove that special case and make the code
easier to maintain and follow.

Regards,
Simon

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

* [PATCH v2 16/50] image: Add Kconfig options for FIT in the host build
  2021-05-12 15:54         ` Simon Glass
@ 2021-05-12 16:18           ` Alex G.
  2021-05-12 17:30             ` Simon Glass
  0 siblings, 1 reply; 91+ messages in thread
From: Alex G. @ 2021-05-12 16:18 UTC (permalink / raw)
  To: u-boot



On 5/12/21 10:54 AM, Simon Glass wrote:
> Hi Alex,
> 
> On Wed, 12 May 2021 at 09:48, Alex G. <mr.nuke.me@gmail.com> wrote:
>>
>>
>>
>> On 5/12/21 9:51 AM, Simon Glass wrote:
>>> Hi Alex,
>>>
>>> On Tue, 11 May 2021 at 13:57, Alex G. <mr.nuke.me@gmail.com> wrote:
>>>>
>>>> On 5/6/21 9:24 AM, Simon Glass wrote:
>>
>> [snip]
>>
>>>>
>>>>> +
>>>>> +config HOST_FIT_PRINT
>>>>> +     def_bool y
>>>>> +     help
>>>>> +       Print the content of the FIT verbosely in the host build
>>>>
>>>> This option also doesn't make sense.This seems to do what 'mkimage -l'
>>>> already supports.
>>>
>>> Are you sure you have looked at the goal of the CONFIG_IS_ENABLED()
>>> changes? This is here purely to avoid #ifdefs in the share code.
>>
>> On the one hand, we have the cosmetic inconvenience caused by #ifdefs.
>> On the other hand we have the config system. To most users, the config
>> system is likely more visible, while it's mostly developers who will
>> ever see the ifdefs.
>>
>> Therefore, in order to get the developer convenience of less ifdefs, we
>> have to sacrifice user convenience by cloberring the Kconfig options. I
>> think this is back-to-front.
> 
> These Kconfig options are not visible to users. They cannot be updated
> in defconfig, nor in 'make menuconfig', etc. They are purely there for
> the build system.
> 
>>
>> Can we reduce the host config count to just SLL/NOSSL?
> 
> The point here is that the code has a special case for host builds,
> and this is a means to remove that special case and make the code
> easier to maintain and follow.

I understand where you're coming from. Without these changes, the code 
knows what it should and should not do, correct? My argument is that if 
the code has the logic to do the correct thing, that logic should not be 
split with the config system.

I agree with the goal of reducing clutter in the source code. I disagree 
with this specific course of fixing it. Instead, I propose a single 
kconfig for host tools for SSL on/off.

The disadvantage of my proposal is that we have to refactor the common 
code in a way consistent with the goals, instead of just changing some 
#ifdefs to if(CONFIG_IS_ENABLED()). I admit that, off the top of my 
head, I don't have a detailed plan on how to achieve this.

Alex

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

* [PATCH v2 16/50] image: Add Kconfig options for FIT in the host build
  2021-05-12 15:52           ` Simon Glass
@ 2021-05-12 16:19             ` Alex G.
  2021-05-12 17:14               ` Tom Rini
  0 siblings, 1 reply; 91+ messages in thread
From: Alex G. @ 2021-05-12 16:19 UTC (permalink / raw)
  To: u-boot



On 5/12/21 10:52 AM, Simon Glass wrote:
> Hi,
> 
> On Tue, 11 May 2021 at 19:10, Tom Rini <trini@konsulko.com> wrote:
>>
>> On Tue, May 11, 2021 at 07:50:38PM -0500, Alex G. wrote:
>>> On 5/11/21 5:34 PM, Tom Rini wrote:
>>>> On Tue, May 11, 2021 at 02:57:03PM -0500, Alex G. wrote:
>>>>> On 5/6/21 9:24 AM, Simon Glass wrote:
>>>>>> In preparation for enabling CONFIG_IS_ENABLED() on the host build, add
>>>>>> some options to enable the various FIT options expected in these tools.
>>>>>> This will ensure that the code builds correctly when CONFIG_HOST_xxx
>>>>>> is distinct from CONFIG_xxx.
>>>>>>
>>>>>> Signed-off-by: Simon Glass <sjg@chromium.org>
>>>>>
>>>>> Reviewed-by: Alexandru Gagniuc <mr.nuke.me@gmail.com>
>>>>>
>>>>> This makes me wonder whether we should just always enable host features.
>>>>> Right now, each defconfig can have a different mkimage config. So we should
>>>>> really have mkimage-imx8, mkimage-stm32mp, etc, which support different
>>>>> feature sets. This doesn't make much sense.
>>>>>
>>>>> The alternative is to get rid of all these configs and always enable mkimage
>>>>> features. The disadvantage is that we'd require openssl for building target
>>>>> code.
>>>>>
>>>>> A second alternative is to have a mkimage-nossl that gets built and used
>>>>> when openssl isn't available. It's really just openssl that causes such a
>>>>> schism.
>>>>
>>>> It would probably be best to have a single mkimage for everyone, with
>>>> everything on.  But before then we really need to move from openssl to
>>>> gnutls or some other library that's compatible as it's been raised
>>>> before that linking with openssl like we do is a license violation I
>>>> believe.
>>>
>>> How about the former alternative for now? i.e. compile mkimage with or
>>> without openssl, and have that be the only host side switch.
>>
>> That would be a step in the right direction, yeah.
> 
> We have a NO_SDL build-time control. Perhaps have a NO_SSL one as well?

It could be a config option instead of an environment variable. I think 
it can be independent of target options, since we don't sign images in 
the buildsystem anyway -- we can enable FIT verification, but mkimage 
without openssl.

Alex

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

* [PATCH v2 16/50] image: Add Kconfig options for FIT in the host build
  2021-05-12 16:19             ` Alex G.
@ 2021-05-12 17:14               ` Tom Rini
  2021-05-17 22:29                 ` Alex G.
  0 siblings, 1 reply; 91+ messages in thread
From: Tom Rini @ 2021-05-12 17:14 UTC (permalink / raw)
  To: u-boot

On Wed, May 12, 2021 at 11:19:52AM -0500, Alex G. wrote:
> 
> 
> On 5/12/21 10:52 AM, Simon Glass wrote:
> > Hi,
> > 
> > On Tue, 11 May 2021 at 19:10, Tom Rini <trini@konsulko.com> wrote:
> > > 
> > > On Tue, May 11, 2021 at 07:50:38PM -0500, Alex G. wrote:
> > > > On 5/11/21 5:34 PM, Tom Rini wrote:
> > > > > On Tue, May 11, 2021 at 02:57:03PM -0500, Alex G. wrote:
> > > > > > On 5/6/21 9:24 AM, Simon Glass wrote:
> > > > > > > In preparation for enabling CONFIG_IS_ENABLED() on the host build, add
> > > > > > > some options to enable the various FIT options expected in these tools.
> > > > > > > This will ensure that the code builds correctly when CONFIG_HOST_xxx
> > > > > > > is distinct from CONFIG_xxx.
> > > > > > > 
> > > > > > > Signed-off-by: Simon Glass <sjg@chromium.org>
> > > > > > 
> > > > > > Reviewed-by: Alexandru Gagniuc <mr.nuke.me@gmail.com>
> > > > > > 
> > > > > > This makes me wonder whether we should just always enable host features.
> > > > > > Right now, each defconfig can have a different mkimage config. So we should
> > > > > > really have mkimage-imx8, mkimage-stm32mp, etc, which support different
> > > > > > feature sets. This doesn't make much sense.
> > > > > > 
> > > > > > The alternative is to get rid of all these configs and always enable mkimage
> > > > > > features. The disadvantage is that we'd require openssl for building target
> > > > > > code.
> > > > > > 
> > > > > > A second alternative is to have a mkimage-nossl that gets built and used
> > > > > > when openssl isn't available. It's really just openssl that causes such a
> > > > > > schism.
> > > > > 
> > > > > It would probably be best to have a single mkimage for everyone, with
> > > > > everything on.  But before then we really need to move from openssl to
> > > > > gnutls or some other library that's compatible as it's been raised
> > > > > before that linking with openssl like we do is a license violation I
> > > > > believe.
> > > > 
> > > > How about the former alternative for now? i.e. compile mkimage with or
> > > > without openssl, and have that be the only host side switch.
> > > 
> > > That would be a step in the right direction, yeah.
> > 
> > We have a NO_SDL build-time control. Perhaps have a NO_SSL one as well?
> 
> It could be a config option instead of an environment variable. I think it
> can be independent of target options, since we don't sign images in the
> buildsystem anyway -- we can enable FIT verification, but mkimage without
> openssl.

As people point out from time to time, "NO_SDL" is very non-obvious and
doesn't fit with how the rest of U-Boot is configured.  So I would
rather not see NO_SSL added.  Frankly, given everything else that's
needed to build today, I don't think just enabling the support for
verified boot in mkimage by default and making it a bit odd to turn off
is a problem.  But given:
https://lists.denx.de/pipermail/u-boot/2017-December/313742.html
I would really like to see the switch to gnutls or some other clearly
compatibly licensed library first.

-- 
Tom
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 659 bytes
Desc: not available
URL: <https://lists.denx.de/pipermail/u-boot/attachments/20210512/de2137be/attachment.sig>

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

* [PATCH v2 16/50] image: Add Kconfig options for FIT in the host build
  2021-05-12 16:18           ` Alex G.
@ 2021-05-12 17:30             ` Simon Glass
  2021-05-13 16:21               ` Alex G.
  0 siblings, 1 reply; 91+ messages in thread
From: Simon Glass @ 2021-05-12 17:30 UTC (permalink / raw)
  To: u-boot

Hi Alex,

On Wed, 12 May 2021 at 10:18, Alex G. <mr.nuke.me@gmail.com> wrote:
>
>
>
> On 5/12/21 10:54 AM, Simon Glass wrote:
> > Hi Alex,
> >
> > On Wed, 12 May 2021 at 09:48, Alex G. <mr.nuke.me@gmail.com> wrote:
> >>
> >>
> >>
> >> On 5/12/21 9:51 AM, Simon Glass wrote:
> >>> Hi Alex,
> >>>
> >>> On Tue, 11 May 2021 at 13:57, Alex G. <mr.nuke.me@gmail.com> wrote:
> >>>>
> >>>> On 5/6/21 9:24 AM, Simon Glass wrote:
> >>
> >> [snip]
> >>
> >>>>
> >>>>> +
> >>>>> +config HOST_FIT_PRINT
> >>>>> +     def_bool y
> >>>>> +     help
> >>>>> +       Print the content of the FIT verbosely in the host build
> >>>>
> >>>> This option also doesn't make sense.This seems to do what 'mkimage -l'
> >>>> already supports.
> >>>
> >>> Are you sure you have looked at the goal of the CONFIG_IS_ENABLED()
> >>> changes? This is here purely to avoid #ifdefs in the share code.
> >>
> >> On the one hand, we have the cosmetic inconvenience caused by #ifdefs.
> >> On the other hand we have the config system. To most users, the config
> >> system is likely more visible, while it's mostly developers who will
> >> ever see the ifdefs.
> >>
> >> Therefore, in order to get the developer convenience of less ifdefs, we
> >> have to sacrifice user convenience by cloberring the Kconfig options. I
> >> think this is back-to-front.
> >
> > These Kconfig options are not visible to users. They cannot be updated
> > in defconfig, nor in 'make menuconfig', etc. They are purely there for
> > the build system.
> >
> >>
> >> Can we reduce the host config count to just SLL/NOSSL?
> >
> > The point here is that the code has a special case for host builds,
> > and this is a means to remove that special case and make the code
> > easier to maintain and follow.
>
> I understand where you're coming from. Without these changes, the code
> knows what it should and should not do, correct? My argument is that if
> the code has the logic to do the correct thing, that logic should not be
> split with the config system.
>
> I agree with the goal of reducing clutter in the source code. I disagree
> with this specific course of fixing it. Instead, I propose a single
> kconfig for host tools for SSL on/off.
>
> The disadvantage of my proposal is that we have to refactor the common
> code in a way consistent with the goals, instead of just changing some
> #ifdefs to if(CONFIG_IS_ENABLED()). I admit that, off the top of my
> head, I don't have a detailed plan on how to achieve this.

You are mostly describing the status quo, so far as I understand it.
The problem is with the code that is built for both boards and tools.
For boards, we want this code to be compiled conditionally, depending
on what options are enabled. For tools, we want the code to be
compiled unconditionally.

I can think of only three ways to do this:

- status quo (add #ifdefs USE_HOSTCC wherever we need to)
- my series (make use of hidden Kconfig options to avoid that)
- put every single feature and associated lines of code in separate
files and compile them conditionally for boards, but always for tools

I believe the last option is actually impossible, or at least
impractical. It would cause an explosion of source files to deal with
all the various combinations, and would be quite painful to maintain
also.

Regards,
SImon

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

* [PATCH v2 16/50] image: Add Kconfig options for FIT in the host build
  2021-05-12 17:30             ` Simon Glass
@ 2021-05-13 16:21               ` Alex G.
  2021-05-13 23:56                 ` Simon Glass
  0 siblings, 1 reply; 91+ messages in thread
From: Alex G. @ 2021-05-13 16:21 UTC (permalink / raw)
  To: u-boot



On 5/12/21 12:30 PM, Simon Glass wrote:
> Hi Alex,
> 
> On Wed, 12 May 2021 at 10:18, Alex G. <mr.nuke.me@gmail.com> wrote:
>>
>>
>>
>> On 5/12/21 10:54 AM, Simon Glass wrote:
>>> Hi Alex,
>>>
>>> On Wed, 12 May 2021 at 09:48, Alex G. <mr.nuke.me@gmail.com> wrote:
>>>>
>>>>
>>>>
>>>> On 5/12/21 9:51 AM, Simon Glass wrote:
>>>>> Hi Alex,
>>>>>
>>>>> On Tue, 11 May 2021 at 13:57, Alex G. <mr.nuke.me@gmail.com> wrote:
>>>>>>
>>>>>> On 5/6/21 9:24 AM, Simon Glass wrote:
>>>>
>>>> [snip]
>>>>
>>>>>>
>>>>>>> +
>>>>>>> +config HOST_FIT_PRINT
>>>>>>> +     def_bool y
>>>>>>> +     help
>>>>>>> +       Print the content of the FIT verbosely in the host build
>>>>>>
>>>>>> This option also doesn't make sense.This seems to do what 'mkimage -l'
>>>>>> already supports.
>>>>>
>>>>> Are you sure you have looked at the goal of the CONFIG_IS_ENABLED()
>>>>> changes? This is here purely to avoid #ifdefs in the share code.
>>>>
>>>> On the one hand, we have the cosmetic inconvenience caused by #ifdefs.
>>>> On the other hand we have the config system. To most users, the config
>>>> system is likely more visible, while it's mostly developers who will
>>>> ever see the ifdefs.
>>>>
>>>> Therefore, in order to get the developer convenience of less ifdefs, we
>>>> have to sacrifice user convenience by cloberring the Kconfig options. I
>>>> think this is back-to-front.
>>>
>>> These Kconfig options are not visible to users. They cannot be updated
>>> in defconfig, nor in 'make menuconfig', etc. They are purely there for
>>> the build system.
>>>
>>>>
>>>> Can we reduce the host config count to just SLL/NOSSL?
>>>
>>> The point here is that the code has a special case for host builds,
>>> and this is a means to remove that special case and make the code
>>> easier to maintain and follow.
>>
>> I understand where you're coming from. Without these changes, the code
>> knows what it should and should not do, correct? My argument is that if
>> the code has the logic to do the correct thing, that logic should not be
>> split with the config system.
>>
>> I agree with the goal of reducing clutter in the source code. I disagree
>> with this specific course of fixing it. Instead, I propose a single
>> kconfig for host tools for SSL on/off.
>>
>> The disadvantage of my proposal is that we have to refactor the common
>> code in a way consistent with the goals, instead of just changing some
>> #ifdefs to if(CONFIG_IS_ENABLED()). I admit that, off the top of my
>> head, I don't have a detailed plan on how to achieve this.
> 
> You are mostly describing the status quo, so far as I understand it.
> The problem is with the code that is built for both boards and tools.
> For boards, we want this code to be compiled conditionally, depending
> on what options are enabled. For tools, we want the code to be
> compiled unconditionally.
> 
> I can think of only three ways to do this:
> 
> - status quo (add #ifdefs USE_HOSTCC wherever we need to)
> - my series (make use of hidden Kconfig options to avoid that)
> - put every single feature and associated lines of code in separate
> files and compile them conditionally for boards, but always for tools
> 
> I believe the last option is actually impossible, or at least
> impractical. It would cause an explosion of source files to deal with
> all the various combinations, and would be quite painful to maintain
> also.

I don't think the status quo is such a terrible solution, so I am 
looking at the aspects that can benefit from improvement. Hence why it 
may appear I am talking about the status quo.

Let's assume CONFIG_IS_ENABLED() returns true on host builds, and for 
those cases where you need to know if IS_HOST_BUILD(), there's a macro 
for that. You have the oddball case that uses a CONFIG_ value that's 
only defined on the target, and those you would have to split according 
to your option #3.

I don't think the above is as dire an explosion in source files as it seems.

Another point of contention is checksum_algos and crypto_algos arrays 
image-sig.c. On the target side, these should be in .u-boot-list. Status 
quo is the definition of rsa_verify is hidden behind #if macros, which 
just pushes the complexity out into the rsa.h headers.

The two ideas here are CONFIG_IS_ENABLED() returns true for host code, 
and image-sig.c is split bwtween host and target versions, the target 
version making use of .uboot-list. Using these as the starting points, I 
think we can get to a much better solution

Alex

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

* [PATCH v2 16/50] image: Add Kconfig options for FIT in the host build
  2021-05-13 16:21               ` Alex G.
@ 2021-05-13 23:56                 ` Simon Glass
  2021-05-14 15:12                   ` Alex G.
  0 siblings, 1 reply; 91+ messages in thread
From: Simon Glass @ 2021-05-13 23:56 UTC (permalink / raw)
  To: u-boot

Hi Alex,

On Thu, 13 May 2021 at 10:21, Alex G. <mr.nuke.me@gmail.com> wrote:
>
>
>
> On 5/12/21 12:30 PM, Simon Glass wrote:
> > Hi Alex,
> >
> > On Wed, 12 May 2021 at 10:18, Alex G. <mr.nuke.me@gmail.com> wrote:
> >>
> >>
> >>
> >> On 5/12/21 10:54 AM, Simon Glass wrote:
> >>> Hi Alex,
> >>>
> >>> On Wed, 12 May 2021 at 09:48, Alex G. <mr.nuke.me@gmail.com> wrote:
> >>>>
> >>>>
> >>>>
> >>>> On 5/12/21 9:51 AM, Simon Glass wrote:
> >>>>> Hi Alex,
> >>>>>
> >>>>> On Tue, 11 May 2021 at 13:57, Alex G. <mr.nuke.me@gmail.com> wrote:
> >>>>>>
> >>>>>> On 5/6/21 9:24 AM, Simon Glass wrote:
> >>>>
> >>>> [snip]
> >>>>
> >>>>>>
> >>>>>>> +
> >>>>>>> +config HOST_FIT_PRINT
> >>>>>>> +     def_bool y
> >>>>>>> +     help
> >>>>>>> +       Print the content of the FIT verbosely in the host build
> >>>>>>
> >>>>>> This option also doesn't make sense.This seems to do what 'mkimage -l'
> >>>>>> already supports.
> >>>>>
> >>>>> Are you sure you have looked at the goal of the CONFIG_IS_ENABLED()
> >>>>> changes? This is here purely to avoid #ifdefs in the share code.
> >>>>
> >>>> On the one hand, we have the cosmetic inconvenience caused by #ifdefs.
> >>>> On the other hand we have the config system. To most users, the config
> >>>> system is likely more visible, while it's mostly developers who will
> >>>> ever see the ifdefs.
> >>>>
> >>>> Therefore, in order to get the developer convenience of less ifdefs, we
> >>>> have to sacrifice user convenience by cloberring the Kconfig options. I
> >>>> think this is back-to-front.
> >>>
> >>> These Kconfig options are not visible to users. They cannot be updated
> >>> in defconfig, nor in 'make menuconfig', etc. They are purely there for
> >>> the build system.
> >>>
> >>>>
> >>>> Can we reduce the host config count to just SLL/NOSSL?
> >>>
> >>> The point here is that the code has a special case for host builds,
> >>> and this is a means to remove that special case and make the code
> >>> easier to maintain and follow.
> >>
> >> I understand where you're coming from. Without these changes, the code
> >> knows what it should and should not do, correct? My argument is that if
> >> the code has the logic to do the correct thing, that logic should not be
> >> split with the config system.
> >>
> >> I agree with the goal of reducing clutter in the source code. I disagree
> >> with this specific course of fixing it. Instead, I propose a single
> >> kconfig for host tools for SSL on/off.
> >>
> >> The disadvantage of my proposal is that we have to refactor the common
> >> code in a way consistent with the goals, instead of just changing some
> >> #ifdefs to if(CONFIG_IS_ENABLED()). I admit that, off the top of my
> >> head, I don't have a detailed plan on how to achieve this.
> >
> > You are mostly describing the status quo, so far as I understand it.
> > The problem is with the code that is built for both boards and tools.
> > For boards, we want this code to be compiled conditionally, depending
> > on what options are enabled. For tools, we want the code to be
> > compiled unconditionally.
> >
> > I can think of only three ways to do this:
> >
> > - status quo (add #ifdefs USE_HOSTCC wherever we need to)
> > - my series (make use of hidden Kconfig options to avoid that)
> > - put every single feature and associated lines of code in separate
> > files and compile them conditionally for boards, but always for tools
> >
> > I believe the last option is actually impossible, or at least
> > impractical. It would cause an explosion of source files to deal with
> > all the various combinations, and would be quite painful to maintain
> > also.
>
> I don't think the status quo is such a terrible solution, so I am
> looking at the aspects that can benefit from improvement. Hence why it
> may appear I am talking about the status quo.
>
> Let's assume CONFIG_IS_ENABLED() returns true on host builds, and for
> those cases where you need to know if IS_HOST_BUILD(), there's a macro
> for that. You have the oddball case that uses a CONFIG_ value that's
> only defined on the target, and those you would have to split according
> to your option #3.
>
> I don't think the above is as dire an explosion in source files as it seems.
>
> Another point of contention is checksum_algos and crypto_algos arrays
> image-sig.c. On the target side, these should be in .u-boot-list. Status
> quo is the definition of rsa_verify is hidden behind #if macros, which
> just pushes the complexity out into the rsa.h headers.
>
> The two ideas here are CONFIG_IS_ENABLED() returns true for host code,
> and image-sig.c is split bwtween host and target versions, the target
> version making use of .uboot-list. Using these as the starting points, I
> think we can get to a much better solution

I did consider simply defining CONFIG_IS_ENABLED() to true for the
host, but rejected that because I worried it would break down at some
point. Examples I can think of at the moment:

- conflicting or alternative options (OF_LIVE, OF_HOST_FILE, OF_SEPARATE)
- code that is not actually wanted on the host (WATCHDOG,
NEEDS_MANUAL_RELOC, FPGA)
- code that we want on the host but not the board (so we end up with a
dummy CONFIG for the boards?)
- all the SPL / TPL / VPL options which would always end up being
true, when in fact we probably want none of them

I think you should more clearly explain your objection to the hidden
Kconfig options, since your original reason ("clobbering the Kconfig
space") doesn't seem to have survived further analysis.

Having said that, I can imagine with a lot of refactoring it might be
possible to address some of those. I just don't see it as a feasible
option from here. The effort would be better spent improving testing,
I think. But if you'd like to code something up for it, I'd be
interested to see it.

Re the linker-list stuff, yes we should push more things to those
instead of #ifdefs and weak functions. Hashing and crypto are prime
examples. In fact host tools can use linker lists too if we need that.

Regards,
Simon

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

* [PATCH v2 16/50] image: Add Kconfig options for FIT in the host build
  2021-05-13 23:56                 ` Simon Glass
@ 2021-05-14 15:12                   ` Alex G.
  2021-05-15 15:20                     ` Simon Glass
  0 siblings, 1 reply; 91+ messages in thread
From: Alex G. @ 2021-05-14 15:12 UTC (permalink / raw)
  To: u-boot



On 5/13/21 6:56 PM, Simon Glass wrote:
> Hi Alex,
> 
> On Thu, 13 May 2021 at 10:21, Alex G. <mr.nuke.me@gmail.com> wrote:
>>
>>
>>
>> On 5/12/21 12:30 PM, Simon Glass wrote:
>>> Hi Alex,
>>>
>>> On Wed, 12 May 2021 at 10:18, Alex G. <mr.nuke.me@gmail.com> wrote:
>>>>
>>>>
>>>>
>>>> On 5/12/21 10:54 AM, Simon Glass wrote:
>>>>> Hi Alex,
>>>>>
>>>>> On Wed, 12 May 2021 at 09:48, Alex G. <mr.nuke.me@gmail.com> wrote:
>>>>>>
>>>>>>
>>>>>>
>>>>>> On 5/12/21 9:51 AM, Simon Glass wrote:
>>>>>>> Hi Alex,
>>>>>>>
>>>>>>> On Tue, 11 May 2021 at 13:57, Alex G. <mr.nuke.me@gmail.com> wrote:
>>>>>>>>
>>>>>>>> On 5/6/21 9:24 AM, Simon Glass wrote:
>>>>>>
>>>>>> [snip]
>>>>>>
>>>>>>>>
>>>>>>>>> +
>>>>>>>>> +config HOST_FIT_PRINT
>>>>>>>>> +     def_bool y
>>>>>>>>> +     help
>>>>>>>>> +       Print the content of the FIT verbosely in the host build
>>>>>>>>
>>>>>>>> This option also doesn't make sense.This seems to do what 'mkimage -l'
>>>>>>>> already supports.
>>>>>>>
>>>>>>> Are you sure you have looked at the goal of the CONFIG_IS_ENABLED()
>>>>>>> changes? This is here purely to avoid #ifdefs in the share code.
>>>>>>
>>>>>> On the one hand, we have the cosmetic inconvenience caused by #ifdefs.
>>>>>> On the other hand we have the config system. To most users, the config
>>>>>> system is likely more visible, while it's mostly developers who will
>>>>>> ever see the ifdefs.
>>>>>>
>>>>>> Therefore, in order to get the developer convenience of less ifdefs, we
>>>>>> have to sacrifice user convenience by cloberring the Kconfig options. I
>>>>>> think this is back-to-front.
>>>>>
>>>>> These Kconfig options are not visible to users. They cannot be updated
>>>>> in defconfig, nor in 'make menuconfig', etc. They are purely there for
>>>>> the build system.
>>>>>
>>>>>>
>>>>>> Can we reduce the host config count to just SLL/NOSSL?
>>>>>
>>>>> The point here is that the code has a special case for host builds,
>>>>> and this is a means to remove that special case and make the code
>>>>> easier to maintain and follow.
>>>>
>>>> I understand where you're coming from. Without these changes, the code
>>>> knows what it should and should not do, correct? My argument is that if
>>>> the code has the logic to do the correct thing, that logic should not be
>>>> split with the config system.
>>>>
>>>> I agree with the goal of reducing clutter in the source code. I disagree
>>>> with this specific course of fixing it. Instead, I propose a single
>>>> kconfig for host tools for SSL on/off.
>>>>
>>>> The disadvantage of my proposal is that we have to refactor the common
>>>> code in a way consistent with the goals, instead of just changing some
>>>> #ifdefs to if(CONFIG_IS_ENABLED()). I admit that, off the top of my
>>>> head, I don't have a detailed plan on how to achieve this.
>>>
>>> You are mostly describing the status quo, so far as I understand it.
>>> The problem is with the code that is built for both boards and tools.
>>> For boards, we want this code to be compiled conditionally, depending
>>> on what options are enabled. For tools, we want the code to be
>>> compiled unconditionally.
>>>
>>> I can think of only three ways to do this:
>>>
>>> - status quo (add #ifdefs USE_HOSTCC wherever we need to)
>>> - my series (make use of hidden Kconfig options to avoid that)
>>> - put every single feature and associated lines of code in separate
>>> files and compile them conditionally for boards, but always for tools
>>>
>>> I believe the last option is actually impossible, or at least
>>> impractical. It would cause an explosion of source files to deal with
>>> all the various combinations, and would be quite painful to maintain
>>> also.
>>
>> I don't think the status quo is such a terrible solution, so I am
>> looking at the aspects that can benefit from improvement. Hence why it
>> may appear I am talking about the status quo.
>>
>> Let's assume CONFIG_IS_ENABLED() returns true on host builds, and for
>> those cases where you need to know if IS_HOST_BUILD(), there's a macro
>> for that. You have the oddball case that uses a CONFIG_ value that's
>> only defined on the target, and those you would have to split according
>> to your option #3.
>>
>> I don't think the above is as dire an explosion in source files as it seems.
>>
>> Another point of contention is checksum_algos and crypto_algos arrays
>> image-sig.c. On the target side, these should be in .u-boot-list. Status
>> quo is the definition of rsa_verify is hidden behind #if macros, which
>> just pushes the complexity out into the rsa.h headers.
>>
>> The two ideas here are CONFIG_IS_ENABLED() returns true for host code,
>> and image-sig.c is split bwtween host and target versions, the target
>> version making use of .uboot-list. Using these as the starting points, I
>> think we can get to a much better solution
> 
> I did consider simply defining CONFIG_IS_ENABLED() to true for the
> host, but rejected that because I worried it would break down at some
> point. Examples I can think of at the moment:
> 
> - conflicting or alternative options (OF_LIVE, OF_HOST_FILE, OF_SEPARATE)
> - code that is not actually wanted on the host (WATCHDOG,
> NEEDS_MANUAL_RELOC, FPGA)
> - code that we want on the host but not the board (so we end up with a
> dummy CONFIG for the boards?)
> - all the SPL / TPL / VPL options which would always end up being
> true, when in fact we probably want none of them
> 
> I think you should more clearly explain your objection to the hidden
> Kconfig options, since your original reason ("clobbering the Kconfig
> space") doesn't seem to have survived further analysis.

I thought it to have been already explained and settled. It objectively 
increase the complexity of the logic. Instead of the logic being defined 
in one place (code), it is now defined in two places (code and Kconfig).

And subjectively, when adding ECDSA support, I found the ifs/ifdefs that 
were derived from kconfig code to be extremely confusing. It would have 
helped trememdously if the host code would flow with less 'kconfig' 
decision points. I don't find this series to improve on that.

> Having said that, I can imagine with a lot of refactoring it might be
> possible to address some of those. I just don't see it as a feasible
> option from here. The effort would be better spent improving testing,
> I think. But if you'd like to code something up for it, I'd be
> interested to see it.

We are in agreement that refactoring will improve the situation. I don't 
think it's so dire that it's unfeasible. However, if you'd like, we can 
start in smaller chunks.

> Re the linker-list stuff, yes we should push more things to those
> instead of #ifdefs and weak functions. Hashing and crypto are prime
> examples. In fact host tools can use linker lists too if we need that.

Pretty low hanging fruit here. Let me try to code something up.

> Regards,
> Simon
> 

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

* [PATCH v2 18/50] image: Shorten FIT_ENABLE_SHAxxx_SUPPORT
  2021-05-06 14:24 ` [PATCH v2 18/50] image: Shorten FIT_ENABLE_SHAxxx_SUPPORT Simon Glass
@ 2021-05-14 15:30   ` Alex G.
  0 siblings, 0 replies; 91+ messages in thread
From: Alex G. @ 2021-05-14 15:30 UTC (permalink / raw)
  To: u-boot



On 5/6/21 9:24 AM, Simon Glass wrote:
> The ENABLE part of this name is redundant, since all boolean Kconfig
> options serve to enable something. The SUPPORT part is also redundant
> since Kconfigs can be assumed to enable support for something. Together
> they just serve to make these options overly long and inconsistent
> with other options.
> 
> Rename FIT_ENABLE_SHAxxx_SUPPORT to FIT_SHAxxx
> 
> Signed-off-by: Simon Glass <sjg@chromium.org>

Reviewed-by: Alexandru Gagniuc <mr.nuke.me@gmail.com>

> ---
> 
> (no changes since v1)
> 
>   common/Kconfig.boot              |  6 +++---
>   configs/mt8516_pumpkin_defconfig |  2 +-
>   include/image.h                  | 12 ++++++------
>   3 files changed, 10 insertions(+), 10 deletions(-)
> 
> diff --git a/common/Kconfig.boot b/common/Kconfig.boot
> index 5a18d62d780..af3325a7ce2 100644
> --- a/common/Kconfig.boot
> +++ b/common/Kconfig.boot
> @@ -35,7 +35,7 @@ config FIT_EXTERNAL_OFFSET
>   	  could be put in the hole between data payload and fit image
>   	  header, such as CSF data on i.MX platform.
>   
> -config FIT_ENABLE_SHA256_SUPPORT
> +config FIT_SHA256
>   	bool "Support SHA256 checksum of FIT image contents"
>   	default y
>   	select SHA256
> @@ -44,7 +44,7 @@ config FIT_ENABLE_SHA256_SUPPORT
>   	  SHA256 checksum is a 256-bit (32-byte) hash value used to check that
>   	  the image contents have not been corrupted.
>   
> -config FIT_ENABLE_SHA384_SUPPORT
> +config FIT_SHA384
>   	bool "Support SHA384 checksum of FIT image contents"
>   	default n
>   	select SHA384
> @@ -54,7 +54,7 @@ config FIT_ENABLE_SHA384_SUPPORT
>   	  the image contents have not been corrupted. Use this for the highest
>   	  security.
>   
> -config FIT_ENABLE_SHA512_SUPPORT
> +config FIT_SHA512
>   	bool "Support SHA512 checksum of FIT image contents"
>   	default n
>   	select SHA512
> diff --git a/configs/mt8516_pumpkin_defconfig b/configs/mt8516_pumpkin_defconfig
> index 5270ec28cbd..d330c03db3c 100644
> --- a/configs/mt8516_pumpkin_defconfig
> +++ b/configs/mt8516_pumpkin_defconfig
> @@ -13,7 +13,7 @@ CONFIG_DEBUG_UART_CLOCK=26000000
>   CONFIG_DEFAULT_DEVICE_TREE="mt8516-pumpkin"
>   CONFIG_DEBUG_UART=y
>   CONFIG_FIT=y
> -# CONFIG_FIT_ENABLE_SHA256_SUPPORT is not set
> +# CONFIG_FIT_SHA256 is not set
>   # CONFIG_ARCH_FIXUP_FDT_MEMORY is not set
>   CONFIG_DEFAULT_FDT_FILE="mt8516-pumpkin"
>   # CONFIG_DISPLAY_BOARDINFO is not set
> diff --git a/include/image.h b/include/image.h
> index 459685d4d43..9319a779b93 100644
> --- a/include/image.h
> +++ b/include/image.h
> @@ -31,9 +31,9 @@ struct fdt_region;
>   #define IMAGE_ENABLE_OF_LIBFDT	1
>   #define CONFIG_FIT_VERBOSE	1 /* enable fit_format_{error,warning}() */
>   #define CONFIG_FIT_ENABLE_RSASSA_PSS_SUPPORT 1
> -#define CONFIG_FIT_ENABLE_SHA256_SUPPORT
> -#define CONFIG_FIT_ENABLE_SHA384_SUPPORT
> -#define CONFIG_FIT_ENABLE_SHA512_SUPPORT
> +#define CONFIG_FIT_SHA256
> +#define CONFIG_FIT_SHA384
> +#define CONFIG_FIT_SHA512
>   #define CONFIG_SHA1
>   #define CONFIG_SHA256
>   #define CONFIG_SHA384
> @@ -89,21 +89,21 @@ struct fdt_region;
>   #define IMAGE_ENABLE_SHA1	0
>   #endif
>   
> -#if defined(CONFIG_FIT_ENABLE_SHA256_SUPPORT) || \
> +#if defined(CONFIG_FIT_SHA256) || \
>   	defined(CONFIG_SPL_SHA256_SUPPORT)
>   #define IMAGE_ENABLE_SHA256	1
>   #else
>   #define IMAGE_ENABLE_SHA256	0
>   #endif
>   
> -#if defined(CONFIG_FIT_ENABLE_SHA384_SUPPORT) || \
> +#if defined(CONFIG_FIT_SHA384) || \
>   	defined(CONFIG_SPL_SHA384_SUPPORT)
>   #define IMAGE_ENABLE_SHA384	1
>   #else
>   #define IMAGE_ENABLE_SHA384	0
>   #endif
>   
> -#if defined(CONFIG_FIT_ENABLE_SHA512_SUPPORT) || \
> +#if defined(CONFIG_FIT_SHA512) || \
>   	defined(CONFIG_SPL_SHA512_SUPPORT)
>   #define IMAGE_ENABLE_SHA512	1
>   #else
> 

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

* [PATCH v2 19/50] image: Rename SPL_SHAxxx_SUPPORT to SPL_FIT_SHAxxx
  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.
  0 siblings, 0 replies; 91+ messages in thread
From: Alex G. @ 2021-05-14 15:34 UTC (permalink / raw)
  To: u-boot



On 5/6/21 9:24 AM, Simon Glass wrote:
> These option are named inconsistently with other SPL options, thus making
> them incompatible with the CONFIG_IS_ENABLED() macro. Rename them.
> 
> Signed-off-by: Simon Glass <sjg@chromium.org>

Reviewed-by: Alexandru Gagniuc <mr.nuke.me@gmail.com>

> ---
> 
> (no changes since v1)
> 
>   common/spl/Kconfig | 8 ++++----
>   include/image.h    | 8 ++++----
>   2 files changed, 8 insertions(+), 8 deletions(-)
> 
> diff --git a/common/spl/Kconfig b/common/spl/Kconfig

FIT_SHAxxx is in common/Kconfig.boot, so it seems unnatural to have the 
SPL equivalents in a different file. I have a patch out to address this 
and move the options to the correct Kconfig, although your approach 
focuses FIT_SHA strictly.

> index df5468f1ac2..d94b9892175 100644
> --- a/common/spl/Kconfig
> +++ b/common/spl/Kconfig
> @@ -429,7 +429,7 @@ config SPL_MD5_SUPPORT
>   	  applications where images may be changed maliciously, you should
>   	  consider SHA256 or SHA384.
>   
> -config SPL_SHA1_SUPPORT
> +config SPL_FIT_SHA1
>   	bool "Support SHA1"
>   	depends on SPL_FIT
>   	select SHA1
> @@ -441,7 +441,7 @@ config SPL_SHA1_SUPPORT
>   	  due to the expanding computing power available to brute-force
>   	  attacks. For more security, consider SHA256 or SHA384.
>   
> -config SPL_SHA256_SUPPORT
> +config SPL_FIT_SHA256
>   	bool "Support SHA256"
>   	depends on SPL_FIT
>   	select SHA256
> @@ -450,7 +450,7 @@ config SPL_SHA256_SUPPORT
>   	  checksum is a 256-bit (32-byte) hash value used to check that the
>   	  image contents have not been corrupted.
>   
> -config SPL_SHA384_SUPPORT
> +config SPL_FIT_SHA384
>   	bool "Support SHA384"
>   	depends on SPL_FIT
>   	select SHA384
> @@ -461,7 +461,7 @@ config SPL_SHA384_SUPPORT
>   	  image contents have not been corrupted. Use this for the highest
>   	  security.
>   
> -config SPL_SHA512_SUPPORT
> +config SPL_FIT_SHA512
>   	bool "Support SHA512"
>   	depends on SPL_FIT
>   	select SHA512
> diff --git a/include/image.h b/include/image.h
> index 9319a779b93..3284f36c97a 100644
> --- a/include/image.h
> +++ b/include/image.h
> @@ -68,7 +68,7 @@ struct fdt_region;
>   #  ifdef CONFIG_SPL_MD5_SUPPORT
>   #   define IMAGE_ENABLE_MD5	1
>   #  endif
> -#  ifdef CONFIG_SPL_SHA1_SUPPORT
> +#  ifdef CONFIG_SPL_FIT_SHA1
>   #   define IMAGE_ENABLE_SHA1	1
>   #  endif
>   # else
> @@ -90,21 +90,21 @@ struct fdt_region;
>   #endif
>   
>   #if defined(CONFIG_FIT_SHA256) || \
> -	defined(CONFIG_SPL_SHA256_SUPPORT)
> +	defined(CONFIG_SPL_FIT_SHA256)
>   #define IMAGE_ENABLE_SHA256	1
>   #else
>   #define IMAGE_ENABLE_SHA256	0
>   #endif
>   
>   #if defined(CONFIG_FIT_SHA384) || \
> -	defined(CONFIG_SPL_SHA384_SUPPORT)
> +	defined(CONFIG_SPL_FIT_SHA384)
>   #define IMAGE_ENABLE_SHA384	1
>   #else
>   #define IMAGE_ENABLE_SHA384	0
>   #endif
>   
>   #if defined(CONFIG_FIT_SHA512) || \
> -	defined(CONFIG_SPL_SHA512_SUPPORT)
> +	defined(CONFIG_SPL_FIT_SHA512)
>   #define IMAGE_ENABLE_SHA512	1
>   #else
>   #define IMAGE_ENABLE_SHA512	0
> 

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

* [PATCH v2 21/50] hash: Drop some #ifdefs in hash.c
  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
  0 siblings, 1 reply; 91+ messages in thread
From: Alex G. @ 2021-05-14 15:37 UTC (permalink / raw)
  To: u-boot



On 5/6/21 9:24 AM, Simon Glass wrote:
> We can use the __maybe_unused attribute to avoid some of the #ifdefs in
> this file. Update the functions accordingly.

What is __maybe_unused? Does u-boot support booting quantum computers?


> Note: The actual hashing interface is still a mess, with four separate
> combinations and lots of #ifdefs. This should really use a driver
> approach, e.g. as is done with partition drivers.
> 
> Signed-off-by: Simon Glass <sjg@chromium.org>
> ---
> 
> (no changes since v1)
> 
>   common/hash.c | 54 ++++++++++++++++++++++++---------------------------
>   1 file changed, 25 insertions(+), 29 deletions(-)
> 
> diff --git a/common/hash.c b/common/hash.c
> index 987d238c66c..1ccc62f162d 100644
> --- a/common/hash.c
> +++ b/common/hash.c
> @@ -24,6 +24,7 @@
>   #include <u-boot/crc.h>
>   #else
>   #include "mkimage.h"
> +#include <linux/compiler_attributes.h>
>   #include <time.h>
>   #include <linux/kconfig.h>
>   #endif /* !USE_HOSTCC*/
> @@ -42,8 +43,7 @@ DECLARE_GLOBAL_DATA_PTR;
>   
>   static void reloc_update(void);
>   
> -#if CONFIG_IS_ENABLED(SHA1) && !CONFIG_IS_ENABLED(SHA_PROG_HW_ACCEL)
> -static int hash_init_sha1(struct hash_algo *algo, void **ctxp)
> +static int __maybe_unused hash_init_sha1(struct hash_algo *algo, void **ctxp)
>   {
>   	sha1_context *ctx = malloc(sizeof(sha1_context));
>   	sha1_starts(ctx);
> @@ -51,15 +51,16 @@ static int hash_init_sha1(struct hash_algo *algo, void **ctxp)
>   	return 0;
>   }
>   
> -static int hash_update_sha1(struct hash_algo *algo, void *ctx, const void *buf,
> -			    unsigned int size, int is_last)
> +static int __maybe_unused hash_update_sha1(struct hash_algo *algo, void *ctx,
> +					   const void *buf, unsigned int size,
> +					   int is_last)
>   {
>   	sha1_update((sha1_context *)ctx, buf, size);
>   	return 0;
>   }
>   
> -static int hash_finish_sha1(struct hash_algo *algo, void *ctx, void *dest_buf,
> -			    int size)
> +static int __maybe_unused hash_finish_sha1(struct hash_algo *algo, void *ctx,
> +					   void *dest_buf, int size)
>   {
>   	if (size < algo->digest_size)
>   		return -1;
> @@ -68,10 +69,8 @@ static int hash_finish_sha1(struct hash_algo *algo, void *ctx, void *dest_buf,
>   	free(ctx);
>   	return 0;
>   }
> -#endif
>   
> -#if CONFIG_IS_ENABLED(SHA256) && !CONFIG_IS_ENABLED(SHA_PROG_HW_ACCEL)
> -static int hash_init_sha256(struct hash_algo *algo, void **ctxp)
> +static int __maybe_unused hash_init_sha256(struct hash_algo *algo, void **ctxp)
>   {
>   	sha256_context *ctx = malloc(sizeof(sha256_context));
>   	sha256_starts(ctx);
> @@ -79,15 +78,16 @@ static int hash_init_sha256(struct hash_algo *algo, void **ctxp)
>   	return 0;
>   }
>   
> -static int hash_update_sha256(struct hash_algo *algo, void *ctx,
> -			      const void *buf, unsigned int size, int is_last)
> +static int __maybe_unused hash_update_sha256(struct hash_algo *algo, void *ctx,
> +					     const void *buf, uint size,
> +					     int is_last)
>   {
>   	sha256_update((sha256_context *)ctx, buf, size);
>   	return 0;
>   }
>   
> -static int hash_finish_sha256(struct hash_algo *algo, void *ctx, void
> -			      *dest_buf, int size)
> +static int __maybe_unused hash_finish_sha256(struct hash_algo *algo, void *ctx,
> +					     void *dest_buf, int size)
>   {
>   	if (size < algo->digest_size)
>   		return -1;
> @@ -96,10 +96,8 @@ static int hash_finish_sha256(struct hash_algo *algo, void *ctx, void
>   	free(ctx);
>   	return 0;
>   }
> -#endif
>   
> -#if CONFIG_IS_ENABLED(SHA384) && !CONFIG_IS_ENABLED(SHA_PROG_HW_ACCEL)
> -static int hash_init_sha384(struct hash_algo *algo, void **ctxp)
> +static int __maybe_unused hash_init_sha384(struct hash_algo *algo, void **ctxp)
>   {
>   	sha512_context *ctx = malloc(sizeof(sha512_context));
>   	sha384_starts(ctx);
> @@ -107,15 +105,16 @@ static int hash_init_sha384(struct hash_algo *algo, void **ctxp)
>   	return 0;
>   }
>   
> -static int hash_update_sha384(struct hash_algo *algo, void *ctx,
> -			      const void *buf, unsigned int size, int is_last)
> +static int __maybe_unused hash_update_sha384(struct hash_algo *algo, void *ctx,
> +					     const void *buf, uint size,
> +					     int is_last)
>   {
>   	sha384_update((sha512_context *)ctx, buf, size);
>   	return 0;
>   }
>   
> -static int hash_finish_sha384(struct hash_algo *algo, void *ctx, void
> -			      *dest_buf, int size)
> +static int __maybe_unused hash_finish_sha384(struct hash_algo *algo, void *ctx,
> +					     void *dest_buf, int size)
>   {
>   	if (size < algo->digest_size)
>   		return -1;
> @@ -124,10 +123,8 @@ static int hash_finish_sha384(struct hash_algo *algo, void *ctx, void
>   	free(ctx);
>   	return 0;
>   }
> -#endif
>   
> -#if CONFIG_IS_ENABLED(SHA512) && !CONFIG_IS_ENABLED(SHA_PROG_HW_ACCEL)
> -static int hash_init_sha512(struct hash_algo *algo, void **ctxp)
> +static int __maybe_unused hash_init_sha512(struct hash_algo *algo, void **ctxp)
>   {
>   	sha512_context *ctx = malloc(sizeof(sha512_context));
>   	sha512_starts(ctx);
> @@ -135,15 +132,16 @@ static int hash_init_sha512(struct hash_algo *algo, void **ctxp)
>   	return 0;
>   }
>   
> -static int hash_update_sha512(struct hash_algo *algo, void *ctx,
> -			      const void *buf, unsigned int size, int is_last)
> +static int __maybe_unused hash_update_sha512(struct hash_algo *algo, void *ctx,
> +					     const void *buf, uint size,
> +					     int is_last)
>   {
>   	sha512_update((sha512_context *)ctx, buf, size);
>   	return 0;
>   }
>   
> -static int hash_finish_sha512(struct hash_algo *algo, void *ctx, void
> -			      *dest_buf, int size)
> +static int __maybe_unused hash_finish_sha512(struct hash_algo *algo, void *ctx,
> +					     void *dest_buf, int size)
>   {
>   	if (size < algo->digest_size)
>   		return -1;
> @@ -152,8 +150,6 @@ static int hash_finish_sha512(struct hash_algo *algo, void *ctx, void
>   	free(ctx);
>   	return 0;
>   }
> -#endif
> -
>   
>   static int hash_init_crc16_ccitt(struct hash_algo *algo, void **ctxp)
>   {
> 

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

* [PATCH v2 37/50] image: Drop IMAGE_ENABLE_SIGN/VERIFY defines
  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
  0 siblings, 1 reply; 91+ messages in thread
From: Alex G. @ 2021-05-14 20:38 UTC (permalink / raw)
  To: u-boot



On 5/6/21 9:24 AM, Simon Glass wrote:
> Add host Kconfigs for FIT_SIGN and RSA_VERIFY. With these we can use
> CONFIG_IS_ENABLED() directly in the host build, so drop the unnecessary
> indirections IMAGE_ENABLE_SIGN and HOST_RSA_VERIFY. Also drop
> FIT_IMAGE_ENABLE_VERIFY which is not actually used.
> 
> Leave IMAGE_ENABLE_VERIFY_ECDSA along since this feature is incomplete
> and needs to be integrated with RSA.
> 
> Signed-off-by: Simon Glass <sjg@chromium.org>
> ---
> 
> (no changes since v1)
> 
>   common/image-fit.c     |  6 +++---
>   common/image-sig.c     | 10 +++++-----
>   include/image.h        | 13 ++-----------
>   include/u-boot/ecdsa.h |  2 +-
>   include/u-boot/rsa.h   |  4 ++--
>   tools/Kconfig          | 10 ++++++++++
>   tools/image-host.c     |  4 ++--
>   7 files changed, 25 insertions(+), 24 deletions(-)
> 
> diff --git a/common/image-fit.c b/common/image-fit.c
> index c13ff6bba24..e81a0858dc1 100644
> --- a/common/image-fit.c
> +++ b/common/image-fit.c
> @@ -1301,7 +1301,7 @@ int fit_image_verify_with_data(const void *fit, int image_noffset,
>   	int ret;
>   
>   	/* Verify all required signatures */
> -	if (FIT_IMAGE_ENABLE_VERIFY &&
> +	if (CONFIG_IS_ENABLED(RSA_VERIFY) &&

NAK. Having verification depend directly on CONFIG_RSA_VERIFY will make 
adding ECDSA support that much more convoluted.


>   	    fit_image_verify_required_sigs(fit, image_noffset, data, size,
>   					   gd_fdt_blob(), &verify_all)) {
>   		err_msg = "Unable to verify required signature";
> @@ -1323,7 +1323,7 @@ int fit_image_verify_with_data(const void *fit, int image_noffset,
>   						 &err_msg))
>   				goto error;
>   			puts("+ ");
> -		} else if (FIT_IMAGE_ENABLE_VERIFY && verify_all &&
> +		} else if (CONFIG_IS_ENABLED(RSA_VERIFY) && verify_all &&
>   				!strncmp(name, FIT_SIG_NODENAME,
>   					strlen(FIT_SIG_NODENAME))) {
>   			ret = fit_image_check_sig(fit, noffset, data,
> @@ -2045,7 +2045,7 @@ int fit_image_load(bootm_headers_t *images, ulong addr,
>   		if (image_type == IH_TYPE_KERNEL)
>   			images->fit_uname_cfg = fit_base_uname_config;
>   
> -		if (FIT_IMAGE_ENABLE_VERIFY && images->verify) {
> +		if (CONFIG_IS_ENABLED(RSA_VERIFY) && images->verify) {
>   			puts("   Verifying Hash Integrity ... ");
>   			if (fit_config_verify(fit, cfg_noffset)) {
>   				puts("Bad Data Hash\n");
> diff --git a/common/image-sig.c b/common/image-sig.c
> index bbc6bb3b1e3..74ca96a39e9 100644
> --- a/common/image-sig.c
> +++ b/common/image-sig.c
> @@ -29,7 +29,7 @@ struct checksum_algo checksum_algos[] = {
>   		.checksum_len = SHA1_SUM_LEN,
>   		.der_len = SHA1_DER_LEN,
>   		.der_prefix = sha1_der_prefix,
> -#if IMAGE_ENABLE_SIGN
> +#if CONFIG_IS_ENABLED(FIT_SIGN)
>   		.calculate_sign = EVP_sha1,
>   #endif
>   		.calculate = hash_calculate,
> @@ -39,7 +39,7 @@ struct checksum_algo checksum_algos[] = {
>   		.checksum_len = SHA256_SUM_LEN,
>   		.der_len = SHA256_DER_LEN,
>   		.der_prefix = sha256_der_prefix,
> -#if IMAGE_ENABLE_SIGN
> +#if CONFIG_IS_ENABLED(FIT_SIGN)
>   		.calculate_sign = EVP_sha256,
>   #endif
>   		.calculate = hash_calculate,
> @@ -50,7 +50,7 @@ struct checksum_algo checksum_algos[] = {
>   		.checksum_len = SHA384_SUM_LEN,
>   		.der_len = SHA384_DER_LEN,
>   		.der_prefix = sha384_der_prefix,
> -#if IMAGE_ENABLE_SIGN
> +#if CONFIG_IS_ENABLED(FIT_SIGN)
>   		.calculate_sign = EVP_sha384,
>   #endif
>   		.calculate = hash_calculate,
> @@ -62,7 +62,7 @@ struct checksum_algo checksum_algos[] = {
>   		.checksum_len = SHA512_SUM_LEN,
>   		.der_len = SHA512_DER_LEN,
>   		.der_prefix = sha512_der_prefix,
> -#if IMAGE_ENABLE_SIGN
> +#if CONFIG_IS_ENABLED(FIT_SIGN)
>   		.calculate_sign = EVP_sha512,
>   #endif
>   		.calculate = hash_calculate,
> @@ -122,7 +122,7 @@ struct checksum_algo *image_get_checksum_algo(const char *full_name)
>   				struct checksum_algo *algo = &checksum_algos[i];
>   
>   				MANUAL_RELOC(algo->name);
> -#if IMAGE_ENABLE_SIGN
> +#if CONFIG_IS_ENABLED(FIT_SIGN)
>   				MANUAL_RELOC(algo->calculate_sign);
>   #endif
>   				MANUAL_RELOC(algo->calculate);
> diff --git a/include/image.h b/include/image.h
> index 64866c609f4..12043abd049 100644
> --- a/include/image.h
> +++ b/include/image.h
> @@ -1139,22 +1139,13 @@ int calculate_hash(const void *data, int data_len, const char *algo,
>    */
>   #if defined(USE_HOSTCC)
>   # if defined(CONFIG_FIT_SIGNATURE)
> -#  define IMAGE_ENABLE_SIGN	1
> -#  define IMAGE_ENABLE_VERIFY	1
>   #  define IMAGE_ENABLE_VERIFY_ECDSA	1
> -#  define FIT_IMAGE_ENABLE_VERIFY	1
>   #  include <openssl/evp.h>
>   # else
> -#  define IMAGE_ENABLE_SIGN	0
> -#  define IMAGE_ENABLE_VERIFY	0
>   # define IMAGE_ENABLE_VERIFY_ECDSA	0
> -#  define FIT_IMAGE_ENABLE_VERIFY	0
>   # endif
>   #else
> -# define IMAGE_ENABLE_SIGN	0
> -# define IMAGE_ENABLE_VERIFY		CONFIG_IS_ENABLED(RSA_VERIFY)
>   # define IMAGE_ENABLE_VERIFY_ECDSA	0
> -# define FIT_IMAGE_ENABLE_VERIFY	CONFIG_IS_ENABLED(FIT_SIGNATURE)
>   #endif
>   
>   #if CONFIG_IS_ENABLED(FIT)
> @@ -1209,7 +1200,7 @@ struct image_region {
>   	int size;
>   };
>   
> -#if IMAGE_ENABLE_VERIFY
> +#if CONFIG_IS_ENABLED(RSA_VERIFY)
>   # include <u-boot/hash-checksum.h>
>   #endif
>   struct checksum_algo {
> @@ -1217,7 +1208,7 @@ struct checksum_algo {
>   	const int checksum_len;
>   	const int der_len;
>   	const uint8_t *der_prefix;
> -#if IMAGE_ENABLE_SIGN
> +#if CONFIG_IS_ENABLED(FIT_SIGN)
>   	const EVP_MD *(*calculate_sign)(void);
>   #endif
>   	int (*calculate)(const char *name,
> diff --git a/include/u-boot/ecdsa.h b/include/u-boot/ecdsa.h
> index 979690d9660..a446b656a29 100644
> --- a/include/u-boot/ecdsa.h
> +++ b/include/u-boot/ecdsa.h
> @@ -15,7 +15,7 @@
>    * @see "struct crypto_algo"
>    * @{
>    */
> -#if IMAGE_ENABLE_SIGN
> +#if CONFIG_IS_ENABLED(FIT_SIGN)
>   /**
>    * sign() - calculate and return signature for given input data
>    *
> diff --git a/include/u-boot/rsa.h b/include/u-boot/rsa.h
> index 45fe3509093..84cefbab442 100644
> --- a/include/u-boot/rsa.h
> +++ b/include/u-boot/rsa.h
> @@ -31,7 +31,7 @@ struct rsa_public_key {
>   
>   struct image_sign_info;
>   
> -#if IMAGE_ENABLE_SIGN
> +#if CONFIG_IS_ENABLED(FIT_SIGN)
>   /**
>    * sign() - calculate and return signature for given input data
>    *
> @@ -81,7 +81,7 @@ static inline int rsa_add_verify_data(struct image_sign_info *info,
>   }
>   #endif
>   
> -#if IMAGE_ENABLE_VERIFY
> +#if CONFIG_IS_ENABLED(RSA_VERIFY)
>   /**
>    * rsa_verify_hash() - Verify a signature against a hash
>    *
> diff --git a/tools/Kconfig b/tools/Kconfig
> index bbd6e8b9d79..13f923c7ac7 100644
> --- a/tools/Kconfig
> +++ b/tools/Kconfig
> @@ -59,6 +59,11 @@ config HOST_FIT_SIGNATURE
>   	help
>   	  Enable signature verification of FIT uImages in the host build
>   
> +config HOST_FIT_SIGN
> +	def_bool y
> +	help
> +	  Enable signing FIT uImages in the host build
> +
>   config HOST_FIT_SIGNATURE_MAX_SIZE
>   	hex
>   	depends on HOST_FIT_SIGNATURE
> @@ -79,6 +84,11 @@ config HOST_OF_LIBFDT
>   	help
>   	  Enable libfdt support in the host build.
>   
> +config HOST_RSA_VERIFY
> +	def_bool y
> +	help
> +	  Enable RSA verification support in the host build.
> +
>   config HOST_SHA1
>   	def_bool y
>   	help
> diff --git a/tools/image-host.c b/tools/image-host.c
> index 270d36fe451..2be897db943 100644
> --- a/tools/image-host.c
> +++ b/tools/image-host.c
> @@ -636,7 +636,7 @@ int fit_image_add_verification_data(const char *keydir, const char *keyfile,
>   			     strlen(FIT_HASH_NODENAME))) {
>   			ret = fit_image_process_hash(fit, image_name, noffset,
>   						data, size);
> -		} else if (IMAGE_ENABLE_SIGN && (keydir || keyfile) &&
> +		} else if (CONFIG_IS_ENABLED(FIT_SIGN) && (keydir || keyfile) &&
>   			   !strncmp(node_name, FIT_SIG_NODENAME,
>   				strlen(FIT_SIG_NODENAME))) {
>   			ret = fit_image_process_sig(keydir, keyfile, keydest,
> @@ -1086,7 +1086,7 @@ int fit_add_verification_data(const char *keydir, const char *keyfile,
>   	}
>   
>   	/* If there are no keys, we can't sign configurations */
> -	if (!IMAGE_ENABLE_SIGN || !(keydir || keyfile))
> +	if (!CONFIG_IS_ENABLED(FIT_SIGN) || !(keydir || keyfile))
>   		return 0;
>   
>   	/* Find configurations parent node offset */
> 

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

* [PATCH v2 21/50] hash: Drop some #ifdefs in hash.c
  2021-05-14 15:37   ` Alex G.
@ 2021-05-14 20:43     ` Tom Rini
  0 siblings, 0 replies; 91+ messages in thread
From: Tom Rini @ 2021-05-14 20:43 UTC (permalink / raw)
  To: u-boot

On Fri, May 14, 2021 at 10:37:54AM -0500, Alex G. wrote:
> 
> 
> On 5/6/21 9:24 AM, Simon Glass wrote:
> > We can use the __maybe_unused attribute to avoid some of the #ifdefs in
> > this file. Update the functions accordingly.
> 
> What is __maybe_unused? Does u-boot support booting quantum computers?

It's from <linux/compiler.h> and tells the compiler to not warn about
unused functions in that specific case.  Since we'll garbage collect
them later, it means we don't need to #ifdef around functions and it can
end up reading cleaner.

-- 
Tom
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 659 bytes
Desc: not available
URL: <https://lists.denx.de/pipermail/u-boot/attachments/20210514/e7fbb9cd/attachment.sig>

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

* [PATCH v2 37/50] image: Drop IMAGE_ENABLE_SIGN/VERIFY defines
  2021-05-14 20:38   ` Alex G.
@ 2021-05-14 20:44     ` Simon Glass
  2021-05-14 21:17       ` Alex G.
  0 siblings, 1 reply; 91+ messages in thread
From: Simon Glass @ 2021-05-14 20:44 UTC (permalink / raw)
  To: u-boot

Hi Alex,

On Fri, 14 May 2021 at 14:38, Alex G. <mr.nuke.me@gmail.com> wrote:
>
>
>
> On 5/6/21 9:24 AM, Simon Glass wrote:
> > Add host Kconfigs for FIT_SIGN and RSA_VERIFY. With these we can use
> > CONFIG_IS_ENABLED() directly in the host build, so drop the unnecessary
> > indirections IMAGE_ENABLE_SIGN and HOST_RSA_VERIFY. Also drop
> > FIT_IMAGE_ENABLE_VERIFY which is not actually used.
> >
> > Leave IMAGE_ENABLE_VERIFY_ECDSA along since this feature is incomplete
> > and needs to be integrated with RSA.
> >
> > Signed-off-by: Simon Glass <sjg@chromium.org>
> > ---
> >
> > (no changes since v1)
> >
> >   common/image-fit.c     |  6 +++---
> >   common/image-sig.c     | 10 +++++-----
> >   include/image.h        | 13 ++-----------
> >   include/u-boot/ecdsa.h |  2 +-
> >   include/u-boot/rsa.h   |  4 ++--
> >   tools/Kconfig          | 10 ++++++++++
> >   tools/image-host.c     |  4 ++--
> >   7 files changed, 25 insertions(+), 24 deletions(-)
> >
> > diff --git a/common/image-fit.c b/common/image-fit.c
> > index c13ff6bba24..e81a0858dc1 100644
> > --- a/common/image-fit.c
> > +++ b/common/image-fit.c
> > @@ -1301,7 +1301,7 @@ int fit_image_verify_with_data(const void *fit, int image_noffset,
> >       int ret;
> >
> >       /* Verify all required signatures */
> > -     if (FIT_IMAGE_ENABLE_VERIFY &&
> > +     if (CONFIG_IS_ENABLED(RSA_VERIFY) &&
>
> NAK. Having verification depend directly on CONFIG_RSA_VERIFY will make
> adding ECDSA support that much more convoluted.

Let me counter-NAK.

The ECDSA needs to be integrated into the RSA stuff, as we have done
with hashing. E.g. CONFIG_VERIFY that enables the feature, with a
driver to select which methods are supported.

I think I mentioned that in the original review.

Regards,
Simon

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

* [PATCH v2 37/50] image: Drop IMAGE_ENABLE_SIGN/VERIFY defines
  2021-05-14 20:44     ` Simon Glass
@ 2021-05-14 21:17       ` Alex G.
  2021-05-15 15:20         ` Simon Glass
  0 siblings, 1 reply; 91+ messages in thread
From: Alex G. @ 2021-05-14 21:17 UTC (permalink / raw)
  To: u-boot



On 5/14/21 3:44 PM, Simon Glass wrote:
> Hi Alex,
> 
> On Fri, 14 May 2021 at 14:38, Alex G. <mr.nuke.me@gmail.com> wrote:
>> 
>> 
>> 
>> On 5/6/21 9:24 AM, Simon Glass wrote:
>>> Add host Kconfigs for FIT_SIGN and RSA_VERIFY. With these we can
>>> use CONFIG_IS_ENABLED() directly in the host build, so drop the
>>> unnecessary indirections IMAGE_ENABLE_SIGN and HOST_RSA_VERIFY.
>>> Also drop FIT_IMAGE_ENABLE_VERIFY which is not actually used.
>>> 
>>> Leave IMAGE_ENABLE_VERIFY_ECDSA along since this feature is
>>> incomplete and needs to be integrated with RSA.
>>> 
>>> Signed-off-by: Simon Glass <sjg@chromium.org> ---
>>> 
>>> (no changes since v1)
>>> 
>>> common/image-fit.c     |  6 +++--- common/image-sig.c     | 10
>>> +++++----- include/image.h        | 13 ++----------- 
>>> include/u-boot/ecdsa.h |  2 +- include/u-boot/rsa.h   |  4 ++-- 
>>> tools/Kconfig          | 10 ++++++++++ tools/image-host.c     |
>>> 4 ++-- 7 files changed, 25 insertions(+), 24 deletions(-)
>>> 
>>> diff --git a/common/image-fit.c b/common/image-fit.c index
>>> c13ff6bba24..e81a0858dc1 100644 --- a/common/image-fit.c +++
>>> b/common/image-fit.c @@ -1301,7 +1301,7 @@ int
>>> fit_image_verify_with_data(const void *fit, int image_noffset, 
>>> int ret;
>>> 
>>> /* Verify all required signatures */ -     if
>>> (FIT_IMAGE_ENABLE_VERIFY && +     if
>>> (CONFIG_IS_ENABLED(RSA_VERIFY) &&
>> 
>> NAK. Having verification depend directly on CONFIG_RSA_VERIFY will
>> make adding ECDSA support that much more convoluted.
> 
> Let me counter-NAK.
> 
> The ECDSA needs to be integrated into the RSA stuff, as we have done 
> with hashing. E.g. CONFIG_VERIFY that enables the feature, with a 
> driver to select which methods are supported.

Then why not add a CONFIG_(SPL_)VERIFY to this patch instead of 
replacing a common define with an algo-secific CONFIG?

> I think I mentioned that in the original review.

You did. Integrating ECDSA with RSA is orthogonal to ECDSA verification.
I like the motivation behind this cosmetic series, but it is
creating unnecessary complications to adding the ECDSA features.

     "It is relatively straightforward to add new algorithms if required.
      [...] If another algorithm is needed (such as DSA) then it can be
      placed alongside rsa.c, and its functions added to the table in
      image-sig.c also."

That's from doc/uImage.FIT/signature.txt. Seems like we're changing goal 
posts as the balls are already in the air. I want to tone down this 
series, pick a few patches that I really like, combine them with some of 
my changes and submit a co-authored series with the uncontroversial changes.

I posted a parallel series which eliminates IMAGE_ENABLE_VERIFY_ECDSA, 
and is far less intrusive. I was already trying to combine it with some 
patches in this series. Let's see how that goes

Alex

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

* [PATCH v2 27/50] Kconfig: Rename SPL_CRC32_SUPPORT to SPL_CRC32
  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.
  0 siblings, 0 replies; 91+ messages in thread
From: Alex G. @ 2021-05-14 21:31 UTC (permalink / raw)
  To: u-boot



On 5/6/21 9:24 AM, Simon Glass wrote:
> Drop the _SUPPORT suffix so we can use CONFIG_IS_ENABLED() with this
> option.
> 
> Signed-off-by: Simon Glass <sjg@chromium.org>

Reviewed-by: Alexandru Gagniuc <mr.nuke.me@gmail.com>

> ---
> 
> (no changes since v1)
> 
>   common/spl/Kconfig                        | 4 ++--
>   configs/axm_defconfig                     | 2 +-
>   configs/chromebit_mickey_defconfig        | 2 +-
>   configs/chromebook_jerry_defconfig        | 2 +-
>   configs/chromebook_minnie_defconfig       | 2 +-
>   configs/chromebook_speedy_defconfig       | 2 +-
>   configs/evb-px30_defconfig                | 2 +-
>   configs/firefly-px30_defconfig            | 2 +-
>   configs/imxrt1020-evk_defconfig           | 2 +-
>   configs/imxrt1050-evk_defconfig           | 2 +-
>   configs/odroid-go2_defconfig              | 2 +-
>   configs/px30-core-ctouch2-px30_defconfig  | 2 +-
>   configs/px30-core-edimm2.2-px30_defconfig | 2 +-
>   configs/socfpga_agilex_atf_defconfig      | 2 +-
>   configs/socfpga_agilex_vab_defconfig      | 2 +-
>   configs/socfpga_stratix10_atf_defconfig   | 2 +-
>   configs/taurus_defconfig                  | 2 +-
>   include/image.h                           | 2 +-
>   18 files changed, 19 insertions(+), 19 deletions(-)
> 
> diff --git a/common/spl/Kconfig b/common/spl/Kconfig
> index 2570b220891..39fc260566b 100644
> --- a/common/spl/Kconfig
> +++ b/common/spl/Kconfig
> @@ -204,7 +204,7 @@ config SPL_LEGACY_IMAGE_SUPPORT
>   config SPL_LEGACY_IMAGE_CRC_CHECK
>   	bool "Check CRC of Legacy images"
>   	depends on SPL_LEGACY_IMAGE_SUPPORT
> -	select SPL_CRC32_SUPPORT
> +	select SPL_CRC32
>   	help
>   	  Enable this to check the CRC of Legacy images. While this increases
>   	  reliability, it affects both code size and boot duration.
> @@ -407,7 +407,7 @@ config SYS_MMCSD_RAW_MODE_EMMC_BOOT_PARTITION
>   	  the eMMC EXT_CSC_PART_CONFIG selection should be overridden in SPL
>   	  by user defined partition number.
>   
> -config SPL_CRC32_SUPPORT
> +config SPL_CRC32
>   	bool "Support CRC32"
>   	default y if SPL_LEGACY_IMAGE_SUPPORT
>   	help
> diff --git a/configs/axm_defconfig b/configs/axm_defconfig
> index 0bfd7548b09..4e776fd6953 100644
> --- a/configs/axm_defconfig
> +++ b/configs/axm_defconfig
> @@ -32,7 +32,7 @@ CONFIG_BOOTCOMMAND="run flash_self"
>   CONFIG_BOARD_EARLY_INIT_F=y
>   # CONFIG_SPL_LEGACY_IMAGE_SUPPORT is not set
>   CONFIG_SPL_SYS_MALLOC_SIMPLE=y
> -CONFIG_SPL_CRC32_SUPPORT=y
> +CONFIG_SPL_CRC32=y
>   CONFIG_SPL_NAND_SUPPORT=y
>   CONFIG_SPL_NAND_DRIVERS=y
>   CONFIG_SPL_NAND_ECC=y
> diff --git a/configs/chromebit_mickey_defconfig b/configs/chromebit_mickey_defconfig
> index c09b63b9462..2b664e118cf 100644
> --- a/configs/chromebit_mickey_defconfig
> +++ b/configs/chromebit_mickey_defconfig
> @@ -25,7 +25,7 @@ CONFIG_BOARD_EARLY_INIT_R=y
>   CONFIG_SPL_STACK_R=y
>   CONFIG_SPL_STACK_R_MALLOC_SIMPLE_LEN=0x2000
>   # CONFIG_SYS_MMCSD_RAW_MODE_U_BOOT_USE_SECTOR is not set
> -# CONFIG_SPL_CRC32_SUPPORT is not set
> +# CONFIG_SPL_CRC32 is not set
>   CONFIG_SPL_SPI_LOAD=y
>   CONFIG_CMD_GPIO=y
>   CONFIG_CMD_GPT=y
> diff --git a/configs/chromebook_jerry_defconfig b/configs/chromebook_jerry_defconfig
> index 692b630174d..a757d259f58 100644
> --- a/configs/chromebook_jerry_defconfig
> +++ b/configs/chromebook_jerry_defconfig
> @@ -26,7 +26,7 @@ CONFIG_BOARD_EARLY_INIT_R=y
>   CONFIG_SPL_STACK_R=y
>   CONFIG_SPL_STACK_R_MALLOC_SIMPLE_LEN=0x2000
>   # CONFIG_SYS_MMCSD_RAW_MODE_U_BOOT_USE_SECTOR is not set
> -# CONFIG_SPL_CRC32_SUPPORT is not set
> +# CONFIG_SPL_CRC32 is not set
>   CONFIG_SPL_SPI_LOAD=y
>   CONFIG_CMD_GPIO=y
>   CONFIG_CMD_GPT=y
> diff --git a/configs/chromebook_minnie_defconfig b/configs/chromebook_minnie_defconfig
> index ae55842e3bf..353aa01ea9e 100644
> --- a/configs/chromebook_minnie_defconfig
> +++ b/configs/chromebook_minnie_defconfig
> @@ -26,7 +26,7 @@ CONFIG_BOARD_EARLY_INIT_R=y
>   CONFIG_SPL_STACK_R=y
>   CONFIG_SPL_STACK_R_MALLOC_SIMPLE_LEN=0x2000
>   # CONFIG_SYS_MMCSD_RAW_MODE_U_BOOT_USE_SECTOR is not set
> -# CONFIG_SPL_CRC32_SUPPORT is not set
> +# CONFIG_SPL_CRC32 is not set
>   CONFIG_SPL_SPI_LOAD=y
>   CONFIG_CMD_GPIO=y
>   CONFIG_CMD_GPT=y
> diff --git a/configs/chromebook_speedy_defconfig b/configs/chromebook_speedy_defconfig
> index 4b460ee6a9e..c5be5597b10 100644
> --- a/configs/chromebook_speedy_defconfig
> +++ b/configs/chromebook_speedy_defconfig
> @@ -26,7 +26,7 @@ CONFIG_BOARD_EARLY_INIT_R=y
>   CONFIG_SPL_STACK_R=y
>   CONFIG_SPL_STACK_R_MALLOC_SIMPLE_LEN=0x2000
>   # CONFIG_SYS_MMCSD_RAW_MODE_U_BOOT_USE_SECTOR is not set
> -# CONFIG_SPL_CRC32_SUPPORT is not set
> +# CONFIG_SPL_CRC32 is not set
>   CONFIG_SPL_SPI_LOAD=y
>   CONFIG_CMD_GPIO=y
>   CONFIG_CMD_GPT=y
> diff --git a/configs/evb-px30_defconfig b/configs/evb-px30_defconfig
> index d2fdfef2938..55e2702a172 100644
> --- a/configs/evb-px30_defconfig
> +++ b/configs/evb-px30_defconfig
> @@ -29,7 +29,7 @@ CONFIG_SPL_BOOTROM_SUPPORT=y
>   # CONFIG_SPL_RAW_IMAGE_SUPPORT is not set
>   CONFIG_SPL_STACK_R=y
>   # CONFIG_TPL_BANNER_PRINT is not set
> -CONFIG_SPL_CRC32_SUPPORT=y
> +CONFIG_SPL_CRC32=y
>   CONFIG_SPL_ATF=y
>   # CONFIG_TPL_FRAMEWORK is not set
>   # CONFIG_CMD_BOOTD is not set
> diff --git a/configs/firefly-px30_defconfig b/configs/firefly-px30_defconfig
> index 6487615fe08..978a3604053 100644
> --- a/configs/firefly-px30_defconfig
> +++ b/configs/firefly-px30_defconfig
> @@ -30,7 +30,7 @@ CONFIG_SPL_BOOTROM_SUPPORT=y
>   # CONFIG_SPL_RAW_IMAGE_SUPPORT is not set
>   CONFIG_SPL_STACK_R=y
>   # CONFIG_TPL_BANNER_PRINT is not set
> -CONFIG_SPL_CRC32_SUPPORT=y
> +CONFIG_SPL_CRC32=y
>   CONFIG_SPL_ATF=y
>   # CONFIG_TPL_FRAMEWORK is not set
>   # CONFIG_CMD_BOOTD is not set
> diff --git a/configs/imxrt1020-evk_defconfig b/configs/imxrt1020-evk_defconfig
> index 9bddb69cd41..ca7c1c90799 100644
> --- a/configs/imxrt1020-evk_defconfig
> +++ b/configs/imxrt1020-evk_defconfig
> @@ -24,7 +24,7 @@ CONFIG_SPL_BOARD_INIT=y
>   CONFIG_SPL_SYS_MALLOC_SIMPLE=y
>   CONFIG_SYS_MMCSD_RAW_MODE_U_BOOT_USE_SECTOR=y
>   CONFIG_SYS_MMCSD_RAW_MODE_U_BOOT_SECTOR=0x100
> -# CONFIG_SPL_CRC32_SUPPORT is not set
> +# CONFIG_SPL_CRC32 is not set
>   # CONFIG_BOOTM_NETBSD is not set
>   # CONFIG_BOOTM_PLAN9 is not set
>   # CONFIG_BOOTM_RTEMS is not set
> diff --git a/configs/imxrt1050-evk_defconfig b/configs/imxrt1050-evk_defconfig
> index f639ea76230..ca53bccb5fd 100644
> --- a/configs/imxrt1050-evk_defconfig
> +++ b/configs/imxrt1050-evk_defconfig
> @@ -27,7 +27,7 @@ CONFIG_SPL_BOARD_INIT=y
>   CONFIG_SPL_SYS_MALLOC_SIMPLE=y
>   CONFIG_SYS_MMCSD_RAW_MODE_U_BOOT_USE_SECTOR=y
>   CONFIG_SYS_MMCSD_RAW_MODE_U_BOOT_SECTOR=0x100
> -# CONFIG_SPL_CRC32_SUPPORT is not set
> +# CONFIG_SPL_CRC32 is not set
>   # CONFIG_BOOTM_NETBSD is not set
>   # CONFIG_BOOTM_PLAN9 is not set
>   # CONFIG_BOOTM_RTEMS is not set
> diff --git a/configs/odroid-go2_defconfig b/configs/odroid-go2_defconfig
> index 6aa41e37557..82e340a16ee 100644
> --- a/configs/odroid-go2_defconfig
> +++ b/configs/odroid-go2_defconfig
> @@ -33,7 +33,7 @@ CONFIG_SPL_BOOTROM_SUPPORT=y
>   # CONFIG_SPL_RAW_IMAGE_SUPPORT is not set
>   CONFIG_SPL_STACK_R=y
>   # CONFIG_TPL_BANNER_PRINT is not set
> -CONFIG_SPL_CRC32_SUPPORT=y
> +CONFIG_SPL_CRC32=y
>   CONFIG_SPL_I2C_SUPPORT=y
>   CONFIG_SPL_POWER_SUPPORT=y
>   CONFIG_SPL_ATF=y
> diff --git a/configs/px30-core-ctouch2-px30_defconfig b/configs/px30-core-ctouch2-px30_defconfig
> index 1afc146bbf2..3ac0ea4ccc9 100644
> --- a/configs/px30-core-ctouch2-px30_defconfig
> +++ b/configs/px30-core-ctouch2-px30_defconfig
> @@ -30,7 +30,7 @@ CONFIG_SPL_BOOTROM_SUPPORT=y
>   # CONFIG_SPL_RAW_IMAGE_SUPPORT is not set
>   CONFIG_SPL_STACK_R=y
>   # CONFIG_TPL_BANNER_PRINT is not set
> -CONFIG_SPL_CRC32_SUPPORT=y
> +CONFIG_SPL_CRC32=y
>   CONFIG_SPL_ATF=y
>   # CONFIG_TPL_FRAMEWORK is not set
>   # CONFIG_CMD_BOOTD is not set
> diff --git a/configs/px30-core-edimm2.2-px30_defconfig b/configs/px30-core-edimm2.2-px30_defconfig
> index 9d78eee84d7..f208297de5e 100644
> --- a/configs/px30-core-edimm2.2-px30_defconfig
> +++ b/configs/px30-core-edimm2.2-px30_defconfig
> @@ -30,7 +30,7 @@ CONFIG_SPL_BOOTROM_SUPPORT=y
>   # CONFIG_SPL_RAW_IMAGE_SUPPORT is not set
>   CONFIG_SPL_STACK_R=y
>   # CONFIG_TPL_BANNER_PRINT is not set
> -CONFIG_SPL_CRC32_SUPPORT=y
> +CONFIG_SPL_CRC32=y
>   CONFIG_SPL_ATF=y
>   # CONFIG_TPL_FRAMEWORK is not set
>   # CONFIG_CMD_BOOTD is not set
> diff --git a/configs/socfpga_agilex_atf_defconfig b/configs/socfpga_agilex_atf_defconfig
> index 0de65a22a0c..c265e57e6ce 100644
> --- a/configs/socfpga_agilex_atf_defconfig
> +++ b/configs/socfpga_agilex_atf_defconfig
> @@ -23,7 +23,7 @@ CONFIG_USE_BOOTARGS=y
>   CONFIG_BOOTARGS="earlycon"
>   CONFIG_USE_BOOTCOMMAND=y
>   CONFIG_BOOTCOMMAND="run fatscript; run mmcfitload; run linux_qspi_enable; run mmcfitboot"
> -CONFIG_SPL_CRC32_SUPPORT=y
> +CONFIG_SPL_CRC32=y
>   CONFIG_SPL_CACHE=y
>   CONFIG_SPL_SPI_LOAD=y
>   CONFIG_SPL_ATF=y
> diff --git a/configs/socfpga_agilex_vab_defconfig b/configs/socfpga_agilex_vab_defconfig
> index d575dadcfbf..68b6b5e0b4a 100644
> --- a/configs/socfpga_agilex_vab_defconfig
> +++ b/configs/socfpga_agilex_vab_defconfig
> @@ -24,7 +24,7 @@ CONFIG_USE_BOOTARGS=y
>   CONFIG_BOOTARGS="earlycon"
>   CONFIG_USE_BOOTCOMMAND=y
>   CONFIG_BOOTCOMMAND="run fatscript; run mmcfitload; run mmcfitboot"
> -CONFIG_SPL_CRC32_SUPPORT=y
> +CONFIG_SPL_CRC32=y
>   CONFIG_SPL_CACHE=y
>   CONFIG_SPL_SPI_LOAD=y
>   CONFIG_SPL_ATF=y
> diff --git a/configs/socfpga_stratix10_atf_defconfig b/configs/socfpga_stratix10_atf_defconfig
> index c187987dd83..8fcabe1f868 100644
> --- a/configs/socfpga_stratix10_atf_defconfig
> +++ b/configs/socfpga_stratix10_atf_defconfig
> @@ -23,7 +23,7 @@ CONFIG_USE_BOOTARGS=y
>   CONFIG_BOOTARGS="earlycon"
>   CONFIG_USE_BOOTCOMMAND=y
>   CONFIG_BOOTCOMMAND="run fatscript; run mmcfitload; run linux_qspi_enable; run mmcfitboot"
> -CONFIG_SPL_CRC32_SUPPORT=y
> +CONFIG_SPL_CRC32=y
>   CONFIG_SPL_SPI_LOAD=y
>   CONFIG_SPL_ATF=y
>   CONFIG_SPL_ATF_NO_PLATFORM_PARAM=y
> diff --git a/configs/taurus_defconfig b/configs/taurus_defconfig
> index a79cdf3fa7c..5caf9ab30d6 100644
> --- a/configs/taurus_defconfig
> +++ b/configs/taurus_defconfig
> @@ -36,7 +36,7 @@ CONFIG_BOOTCOMMAND="nand read 0x22000000 0x200000 0x300000; bootm"
>   CONFIG_BOARD_EARLY_INIT_F=y
>   # CONFIG_SPL_LEGACY_IMAGE_SUPPORT is not set
>   CONFIG_SPL_SYS_MALLOC_SIMPLE=y
> -CONFIG_SPL_CRC32_SUPPORT=y
> +CONFIG_SPL_CRC32=y
>   CONFIG_SPL_NAND_SUPPORT=y
>   CONFIG_SPL_NAND_DRIVERS=y
>   CONFIG_SPL_NAND_ECC=y
> diff --git a/include/image.h b/include/image.h
> index 3bb12ee3821..5aedc1bb23b 100644
> --- a/include/image.h
> +++ b/include/image.h
> @@ -47,7 +47,7 @@ struct fdt_region;
>   #include <linux/libfdt.h>
>   #include <fdt_support.h>
>   # ifdef CONFIG_SPL_BUILD
> -#  ifdef CONFIG_SPL_CRC32_SUPPORT
> +#  ifdef CONFIG_SPL_CRC32
>   #   define IMAGE_ENABLE_CRC32	1
>   #  endif
>   #  ifdef CONFIG_SPL_MD5_SUPPORT
> 

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

* [PATCH v2 29/50] Kconfig: Rename SPL_MD5_SUPPORT to SPL_MD5
  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.
  0 siblings, 0 replies; 91+ messages in thread
From: Alex G. @ 2021-05-14 21:31 UTC (permalink / raw)
  To: u-boot



On 5/6/21 9:24 AM, Simon Glass wrote:
> Drop the _SUPPORT suffix so we can use CONFIG_IS_ENABLED() with this
> option.
> 
> Signed-off-by: Simon Glass <sjg@chromium.org>

Reviewed-by: Alexandru Gagniuc <mr.nuke.me@gmail.com>

> ---
> 
> (no changes since v1)
> 
>   common/spl/Kconfig | 2 +-
>   include/image.h    | 2 +-
>   2 files changed, 2 insertions(+), 2 deletions(-)
> 
> diff --git a/common/spl/Kconfig b/common/spl/Kconfig
> index 8cd41eb1b29..e6d00caaa85 100644
> --- a/common/spl/Kconfig
> +++ b/common/spl/Kconfig
> @@ -418,7 +418,7 @@ config SPL_CRC32
>   	  for detected accidental image corruption. For secure applications you
>   	  should consider SHA1 or SHA256.
>   
> -config SPL_MD5_SUPPORT
> +config SPL_MD5
>   	bool "Support MD5"
>   	depends on SPL_FIT
>   	help
> diff --git a/include/image.h b/include/image.h
> index e68c2cbf621..e1e4bf6806f 100644
> --- a/include/image.h
> +++ b/include/image.h
> @@ -47,7 +47,7 @@ struct fdt_region;
>   #include <linux/libfdt.h>
>   #include <fdt_support.h>
>   # ifdef CONFIG_SPL_BUILD
> -#  ifdef CONFIG_SPL_MD5_SUPPORT
> +#  ifdef CONFIG_SPL_MD5
>   #   define IMAGE_ENABLE_MD5	1
>   #  endif
>   #  ifdef CONFIG_SPL_FIT_SHA1
> 

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

* [PATCH v2 38/50] image: Drop IMAGE_ENABLE_BEST_MATCH
  2021-05-06 14:24 ` [PATCH v2 38/50] image: Drop IMAGE_ENABLE_BEST_MATCH Simon Glass
@ 2021-05-14 21:32   ` Alex G.
  0 siblings, 0 replies; 91+ messages in thread
From: Alex G. @ 2021-05-14 21:32 UTC (permalink / raw)
  To: u-boot



On 5/6/21 9:24 AM, Simon Glass wrote:
> This is not needed with Kconfig, since we can use IS_ENABLED() easily
> enough. Drop it.
> 
> Signed-off-by: Simon Glass <sjg@chromium.org>


Reviewed-by: Alexandru Gagniuc <mr.nuke.me@gmail.com>

> ---
> 
> (no changes since v1)
> 
>   common/image-fit.c | 2 +-
>   include/image.h    | 5 -----
>   2 files changed, 1 insertion(+), 6 deletions(-)
> 
> diff --git a/common/image-fit.c b/common/image-fit.c
> index e81a0858dc1..a0987fd52c8 100644
> --- a/common/image-fit.c
> +++ b/common/image-fit.c
> @@ -2026,7 +2026,7 @@ int fit_image_load(bootm_headers_t *images, ulong addr,
>   		 * fit_conf_get_node() will try to find default config node
>   		 */
>   		bootstage_mark(bootstage_id + BOOTSTAGE_SUB_NO_UNIT_NAME);
> -		if (IMAGE_ENABLE_BEST_MATCH && !fit_uname_config) {
> +		if (IS_ENABLED(CONFIG_FIT_BEST_MATCH) && !fit_uname_config) {
>   			cfg_noffset = fit_conf_find_compat(fit, gd_fdt_blob());
>   		} else {
>   			cfg_noffset = fit_conf_get_node(fit,
> diff --git a/include/image.h b/include/image.h
> index 12043abd049..b388684cbdc 100644
> --- a/include/image.h
> +++ b/include/image.h
> @@ -1157,11 +1157,6 @@ void image_set_host_blob(void *host_blob);
>   # define gd_fdt_blob()		(gd->fdt_blob)
>   #endif
>   
> -#ifdef CONFIG_FIT_BEST_MATCH
> -#define IMAGE_ENABLE_BEST_MATCH	1
> -#else
> -#define IMAGE_ENABLE_BEST_MATCH	0
> -#endif
>   #endif /* FIT */
>   
>   /*
> 

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

* [PATCH v2 41/50] image: Drop unnecessary #ifdefs from image.h
  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.
  0 siblings, 0 replies; 91+ messages in thread
From: Alex G. @ 2021-05-14 21:45 UTC (permalink / raw)
  To: u-boot



On 5/6/21 9:24 AM, Simon Glass wrote:
> This file has a lot of conditional code and much of it is unnecessary.
> Clean this up to reduce the number of build combinations.
> 
> Signed-off-by: Simon Glass <sjg@chromium.org>
> ---

[snip]

> @@ -523,12 +520,9 @@ enum fit_load_op {
>   int boot_get_setup(bootm_headers_t *images, uint8_t arch, ulong *setup_start,
>   		   ulong *setup_len);
>   
> -#ifndef USE_HOSTCC
>   /* Image format types, returned by _get_format() routine */
>   #define IMAGE_FORMAT_INVALID	0x00
> -#if defined(CONFIG_LEGACY_IMAGE_FORMAT)
>   #define IMAGE_FORMAT_LEGACY	0x01	/* legacy image_header based format */
> -#endif
>   #define IMAGE_FORMAT_FIT	0x02	/* new, libfdt based format */
>   #define IMAGE_FORMAT_ANDROID	0x03	/* Android boot image */

I've hit build errors in stm32 before because IMAGE_FORMAT_LEGACY wasn't 
defined. I'm with you on this one.

[snip]

>   /**
>    * board_fit_config_name_match() - Check for a matching board name
> diff --git a/include/u-boot/hash-checksum.h b/include/u-boot/hash-checksum.h
> index 54e6a73744e..7f16b37a9ab 100644
> --- a/include/u-boot/hash-checksum.h
> +++ b/include/u-boot/hash-checksum.h
> @@ -7,11 +7,12 @@
>   #define _RSA_CHECKSUM_H
>   
>   #include <errno.h>
> -#include <image.h>
>   #include <u-boot/sha1.h>
>   #include <u-boot/sha256.h>
>   #include <u-boot/sha512.h>
>   
> +struct image_region;
> +
>   /**
>    * hash_calculate() - Calculate hash over the data
>    *
> @@ -23,7 +24,7 @@
>    * @return 0 if OK, < 0 if error
>    */
>   int hash_calculate(const char *name,
> -		   const struct image_region region[], int region_count,
> +		   const struct image_region *region, int region_count,
>   		   uint8_t *checksum);

This doesn't have to do anything with ifdefs. Should id be a separate 
change?

>   
>   #endif
> diff --git a/lib/hash-checksum.c b/lib/hash-checksum.c
> index d732ecc38fd..8f2a42f9a08 100644
> --- a/lib/hash-checksum.c
> +++ b/lib/hash-checksum.c
> @@ -17,7 +17,7 @@
>   #include <image.h>
>   
>   int hash_calculate(const char *name,
> -		    const struct image_region region[],
> +		    const struct image_region *region,
>   		    int region_count, uint8_t *checksum)
>   {
>   	struct hash_algo *algo;

Ditto

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

* [PATCH v2 42/50] image: Drop #ifdefs for fit_print_contents()
  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.
  0 siblings, 0 replies; 91+ messages in thread
From: Alex G. @ 2021-05-14 21:46 UTC (permalink / raw)
  To: u-boot



On 5/6/21 9:24 AM, Simon Glass wrote:
> Use a simple return to drop the unwanted code.
> 
> Signed-off-by: Simon Glass <sjg@chromium.org>

Reviewed-by: Alexandru Gagniuc <mr.nuke.me@gmail.com>

> ---
> 
> (no changes since v1)
> 
>   common/image-fit.c | 11 ++++++-----
>   1 file changed, 6 insertions(+), 5 deletions(-)
> 
> diff --git a/common/image-fit.c b/common/image-fit.c
> index 3ee306143b3..f8aa61fc99d 100644
> --- a/common/image-fit.c
> +++ b/common/image-fit.c
> @@ -165,7 +165,6 @@ int fit_get_subimage_count(const void *fit, int images_noffset)
>   	return count;
>   }
>   
> -#if CONFIG_IS_ENABLED(FIT_PRINT)
>   /**
>    * fit_image_print_data() - prints out the hash node details
>    * @fit: pointer to the FIT format image header
> @@ -375,6 +374,9 @@ void fit_print_contents(const void *fit)
>   	const char *p;
>   	time_t timestamp;
>   
> +	if (!CONFIG_IS_ENABLED(FIT_PRINT))
> +		return;
> +
>   	/* Indent string is defined in header image.h */
>   	p = IMAGE_INDENT_STRING;
>   
> @@ -477,6 +479,9 @@ void fit_image_print(const void *fit, int image_noffset, const char *p)
>   	int ndepth;
>   	int ret;
>   
> +	if (!CONFIG_IS_ENABLED(FIT_PRINT))
> +		return;
> +
>   	/* Mandatory properties */
>   	ret = fit_get_desc(fit, image_noffset, &desc);
>   	printf("%s  Description:  ", p);
> @@ -570,10 +575,6 @@ void fit_image_print(const void *fit, int image_noffset, const char *p)
>   		}
>   	}
>   }
> -#else
> -void fit_print_contents(const void *fit) { }
> -void fit_image_print(const void *fit, int image_noffset, const char *p) { }
> -#endif /* CONFIG_IS_ENABLED(FIT_PRINT) */
>   
>   /**
>    * fit_get_desc - get node description property
> 

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

* [PATCH v2 47/50] image: Remove some #ifdefs from image-fit and image-fit-sig
  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
  0 siblings, 1 reply; 91+ messages in thread
From: Alex G. @ 2021-05-14 21:50 UTC (permalink / raw)
  To: u-boot



On 5/6/21 9:24 AM, Simon Glass wrote:
> Drop the #ifdefs which are easy to remove without refactoring.
> 
> Signed-off-by: Simon Glass <sjg@chromium.org>
> ---
> 
> (no changes since v1)
> 
>   common/Kconfig.boot    | 10 ++++++++++
>   common/image-fit-sig.c |  8 ++------
>   common/image-fit.c     |  7 ++++---
>   3 files changed, 16 insertions(+), 9 deletions(-)
> 
> diff --git a/common/Kconfig.boot b/common/Kconfig.boot
> index 03a6e6f214f..a31d9847124 100644
> --- a/common/Kconfig.boot
> +++ b/common/Kconfig.boot
> @@ -191,6 +191,16 @@ config SPL_FIT_SIGNATURE
>   	select SPL_IMAGE_SIGN_INFO
>   	select SPL_FIT_FULL_CHECK
>   
> +config SPL_FIT_SIGNATURE_MAX_SIZE
> +	hex "Max size of signed FIT structures in SPL"
> +	depends on SPL_FIT_SIGNATURE
> +	default 0x10000000
> +	help
> +	  This option sets a max size in bytes for verified FIT uImages.
> +	  A sane value of 256MB protects corrupted DTB structures from overlapping
> +	  device memory. Assure this size does not extend past expected storage
> +	  space.
> +

I can't find an argument of why we'd want a separate 
FIT_SIGNATURE_MAX_SIZE for SPL. This also seems unrelated to the commit 
message of reducing ifdefs.


>   config SPL_LOAD_FIT
>   	bool "Enable SPL loading U-Boot as a FIT (basic fitImage features)"
>   	select SPL_FIT
> diff --git a/common/image-fit-sig.c b/common/image-fit-sig.c
> index 12a6745c642..22f89861048 100644
> --- a/common/image-fit-sig.c
> +++ b/common/image-fit-sig.c
> @@ -49,10 +49,8 @@ struct image_region *fit_region_make_list(const void *fit,
>   	 * Use malloc() except in SPL (to save code size). In SPL the caller
>   	 * must allocate the array.
>   	 */
> -#ifndef CONFIG_SPL_BUILD
> -	if (!region)
> +	if (!IS_ENABLED(CONFIG_SPL_BUILD) && !region)
>   		region = calloc(sizeof(*region), count);
> -#endif
>   	if (!region)
>   		return NULL;
>   	for (i = 0; i < count; i++) {
> @@ -72,12 +70,10 @@ static int fit_image_setup_verify(struct image_sign_info *info,
>   	char *algo_name;
>   	const char *padding_name;
>   
> -#ifndef USE_HOSTCC
> -	if (fdt_totalsize(fit) > CONFIG_FIT_SIGNATURE_MAX_SIZE) {
> +	if (fdt_totalsize(fit) > CONFIG_VAL(FIT_SIGNATURE_MAX_SIZE)) {
>   		*err_msgp = "Total size too large";
>   		return 1;
>   	}
> -#endif
>   	if (fit_image_hash_get_algo(fit, noffset, &algo_name)) {
>   		*err_msgp = "Can't get hash algo property";
>   		return -1;
> diff --git a/common/image-fit.c b/common/image-fit.c
> index f8aa61fc99d..882e872144f 100644
> --- a/common/image-fit.c
> +++ b/common/image-fit.c
> @@ -1993,9 +1993,6 @@ int fit_image_load(bootm_headers_t *images, ulong addr,
>   	int type_ok, os_ok;
>   	ulong load, load_end, data, len;
>   	uint8_t os, comp;
> -#ifndef USE_HOSTCC
> -	uint8_t os_arch;
> -#endif
>   	const char *prop_name;
>   	int ret;
>   
> @@ -2087,8 +2084,12 @@ int fit_image_load(bootm_headers_t *images, ulong addr,
>   	}
>   
>   #ifndef USE_HOSTCC
> +	{
> +	uint8_t os_arch;
> +
>   	fit_image_get_arch(fit, noffset, &os_arch);
>   	images->os.arch = os_arch;
> +	}
>   #endif
>   
>   	bootstage_mark(bootstage_id + BOOTSTAGE_SUB_CHECK_ALL);
> 

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

* [PATCH v2 16/50] image: Add Kconfig options for FIT in the host build
  2021-05-14 15:12                   ` Alex G.
@ 2021-05-15 15:20                     ` Simon Glass
  0 siblings, 0 replies; 91+ messages in thread
From: Simon Glass @ 2021-05-15 15:20 UTC (permalink / raw)
  To: u-boot

Hi Alex,

On Fri, 14 May 2021 at 09:12, Alex G. <mr.nuke.me@gmail.com> wrote:
>
>
>
> On 5/13/21 6:56 PM, Simon Glass wrote:
> > Hi Alex,
> >
> > On Thu, 13 May 2021 at 10:21, Alex G. <mr.nuke.me@gmail.com> wrote:
> >>
> >>
> >>
> >> On 5/12/21 12:30 PM, Simon Glass wrote:
> >>> Hi Alex,
> >>>
> >>> On Wed, 12 May 2021 at 10:18, Alex G. <mr.nuke.me@gmail.com> wrote:
> >>>>
> >>>>
> >>>>
> >>>> On 5/12/21 10:54 AM, Simon Glass wrote:
> >>>>> Hi Alex,
> >>>>>
> >>>>> On Wed, 12 May 2021 at 09:48, Alex G. <mr.nuke.me@gmail.com> wrote:
> >>>>>>
> >>>>>>
> >>>>>>
> >>>>>> On 5/12/21 9:51 AM, Simon Glass wrote:
> >>>>>>> Hi Alex,
> >>>>>>>
> >>>>>>> On Tue, 11 May 2021 at 13:57, Alex G. <mr.nuke.me@gmail.com> wrote:
> >>>>>>>>
> >>>>>>>> On 5/6/21 9:24 AM, Simon Glass wrote:
> >>>>>>
> >>>>>> [snip]
> >>>>>>
> >>>>>>>>
> >>>>>>>>> +
> >>>>>>>>> +config HOST_FIT_PRINT
> >>>>>>>>> +     def_bool y
> >>>>>>>>> +     help
> >>>>>>>>> +       Print the content of the FIT verbosely in the host build
> >>>>>>>>
> >>>>>>>> This option also doesn't make sense.This seems to do what 'mkimage -l'
> >>>>>>>> already supports.
> >>>>>>>
> >>>>>>> Are you sure you have looked at the goal of the CONFIG_IS_ENABLED()
> >>>>>>> changes? This is here purely to avoid #ifdefs in the share code.
> >>>>>>
> >>>>>> On the one hand, we have the cosmetic inconvenience caused by #ifdefs.
> >>>>>> On the other hand we have the config system. To most users, the config
> >>>>>> system is likely more visible, while it's mostly developers who will
> >>>>>> ever see the ifdefs.
> >>>>>>
> >>>>>> Therefore, in order to get the developer convenience of less ifdefs, we
> >>>>>> have to sacrifice user convenience by cloberring the Kconfig options. I
> >>>>>> think this is back-to-front.
> >>>>>
> >>>>> These Kconfig options are not visible to users. They cannot be updated
> >>>>> in defconfig, nor in 'make menuconfig', etc. They are purely there for
> >>>>> the build system.
> >>>>>
> >>>>>>
> >>>>>> Can we reduce the host config count to just SLL/NOSSL?
> >>>>>
> >>>>> The point here is that the code has a special case for host builds,
> >>>>> and this is a means to remove that special case and make the code
> >>>>> easier to maintain and follow.
> >>>>
> >>>> I understand where you're coming from. Without these changes, the code
> >>>> knows what it should and should not do, correct? My argument is that if
> >>>> the code has the logic to do the correct thing, that logic should not be
> >>>> split with the config system.
> >>>>
> >>>> I agree with the goal of reducing clutter in the source code. I disagree
> >>>> with this specific course of fixing it. Instead, I propose a single
> >>>> kconfig for host tools for SSL on/off.
> >>>>
> >>>> The disadvantage of my proposal is that we have to refactor the common
> >>>> code in a way consistent with the goals, instead of just changing some
> >>>> #ifdefs to if(CONFIG_IS_ENABLED()). I admit that, off the top of my
> >>>> head, I don't have a detailed plan on how to achieve this.
> >>>
> >>> You are mostly describing the status quo, so far as I understand it.
> >>> The problem is with the code that is built for both boards and tools.
> >>> For boards, we want this code to be compiled conditionally, depending
> >>> on what options are enabled. For tools, we want the code to be
> >>> compiled unconditionally.
> >>>
> >>> I can think of only three ways to do this:
> >>>
> >>> - status quo (add #ifdefs USE_HOSTCC wherever we need to)
> >>> - my series (make use of hidden Kconfig options to avoid that)
> >>> - put every single feature and associated lines of code in separate
> >>> files and compile them conditionally for boards, but always for tools
> >>>
> >>> I believe the last option is actually impossible, or at least
> >>> impractical. It would cause an explosion of source files to deal with
> >>> all the various combinations, and would be quite painful to maintain
> >>> also.
> >>
> >> I don't think the status quo is such a terrible solution, so I am
> >> looking at the aspects that can benefit from improvement. Hence why it
> >> may appear I am talking about the status quo.
> >>
> >> Let's assume CONFIG_IS_ENABLED() returns true on host builds, and for
> >> those cases where you need to know if IS_HOST_BUILD(), there's a macro
> >> for that. You have the oddball case that uses a CONFIG_ value that's
> >> only defined on the target, and those you would have to split according
> >> to your option #3.
> >>
> >> I don't think the above is as dire an explosion in source files as it seems.
> >>
> >> Another point of contention is checksum_algos and crypto_algos arrays
> >> image-sig.c. On the target side, these should be in .u-boot-list. Status
> >> quo is the definition of rsa_verify is hidden behind #if macros, which
> >> just pushes the complexity out into the rsa.h headers.
> >>
> >> The two ideas here are CONFIG_IS_ENABLED() returns true for host code,
> >> and image-sig.c is split bwtween host and target versions, the target
> >> version making use of .uboot-list. Using these as the starting points, I
> >> think we can get to a much better solution
> >
> > I did consider simply defining CONFIG_IS_ENABLED() to true for the
> > host, but rejected that because I worried it would break down at some
> > point. Examples I can think of at the moment:
> >
> > - conflicting or alternative options (OF_LIVE, OF_HOST_FILE, OF_SEPARATE)
> > - code that is not actually wanted on the host (WATCHDOG,
> > NEEDS_MANUAL_RELOC, FPGA)
> > - code that we want on the host but not the board (so we end up with a
> > dummy CONFIG for the boards?)
> > - all the SPL / TPL / VPL options which would always end up being
> > true, when in fact we probably want none of them
> >
> > I think you should more clearly explain your objection to the hidden
> > Kconfig options, since your original reason ("clobbering the Kconfig
> > space") doesn't seem to have survived further analysis.
>
> I thought it to have been already explained and settled. It objectively
> increase the complexity of the logic. Instead of the logic being defined
> in one place (code), it is now defined in two places (code and Kconfig).
>
> And subjectively, when adding ECDSA support, I found the ifs/ifdefs that
> were derived from kconfig code to be extremely confusing. It would have
> helped trememdously if the host code would flow with less 'kconfig'
> decision points. I don't find this series to improve on that.

I think separating out host code is fine. But we do need to be
careful. A few years back someone added fit_check_sign and something
else that runs the board code. If we had had separate code at that
point, the additional of that tool would have been a huge lift.

So I think we should:
- separate out cost that is clearly host-only (perhaps into the tools/ dir)
- don't separate out board code, since we will likely want to run it
with a tool one day

>
> > Having said that, I can imagine with a lot of refactoring it might be
> > possible to address some of those. I just don't see it as a feasible
> > option from here. The effort would be better spent improving testing,
> > I think. But if you'd like to code something up for it, I'd be
> > interested to see it.
>
> We are in agreement that refactoring will improve the situation. I don't
> think it's so dire that it's unfeasible. However, if you'd like, we can
> start in smaller chunks.

OK.

>
> > Re the linker-list stuff, yes we should push more things to those
> > instead of #ifdefs and weak functions. Hashing and crypto are prime
> > examples. In fact host tools can use linker lists too if we need that.
>
> Pretty low hanging fruit here. Let me try to code something up.

OK. Perhaps with some separation, the Kconfig stuff will become easier.

Regards,
Simon

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

* [PATCH v2 37/50] image: Drop IMAGE_ENABLE_SIGN/VERIFY defines
  2021-05-14 21:17       ` Alex G.
@ 2021-05-15 15:20         ` Simon Glass
  0 siblings, 0 replies; 91+ messages in thread
From: Simon Glass @ 2021-05-15 15:20 UTC (permalink / raw)
  To: u-boot

Hi Alex,

On Fri, 14 May 2021 at 15:17, Alex G. <mr.nuke.me@gmail.com> wrote:
>
>
>
> On 5/14/21 3:44 PM, Simon Glass wrote:
> > Hi Alex,
> >
> > On Fri, 14 May 2021 at 14:38, Alex G. <mr.nuke.me@gmail.com> wrote:
> >>
> >>
> >>
> >> On 5/6/21 9:24 AM, Simon Glass wrote:
> >>> Add host Kconfigs for FIT_SIGN and RSA_VERIFY. With these we can
> >>> use CONFIG_IS_ENABLED() directly in the host build, so drop the
> >>> unnecessary indirections IMAGE_ENABLE_SIGN and HOST_RSA_VERIFY.
> >>> Also drop FIT_IMAGE_ENABLE_VERIFY which is not actually used.
> >>>
> >>> Leave IMAGE_ENABLE_VERIFY_ECDSA along since this feature is
> >>> incomplete and needs to be integrated with RSA.
> >>>
> >>> Signed-off-by: Simon Glass <sjg@chromium.org> ---
> >>>
> >>> (no changes since v1)
> >>>
> >>> common/image-fit.c     |  6 +++--- common/image-sig.c     | 10
> >>> +++++----- include/image.h        | 13 ++-----------
> >>> include/u-boot/ecdsa.h |  2 +- include/u-boot/rsa.h   |  4 ++--
> >>> tools/Kconfig          | 10 ++++++++++ tools/image-host.c     |
> >>> 4 ++-- 7 files changed, 25 insertions(+), 24 deletions(-)
> >>>
> >>> diff --git a/common/image-fit.c b/common/image-fit.c index
> >>> c13ff6bba24..e81a0858dc1 100644 --- a/common/image-fit.c +++
> >>> b/common/image-fit.c @@ -1301,7 +1301,7 @@ int
> >>> fit_image_verify_with_data(const void *fit, int image_noffset,
> >>> int ret;
> >>>
> >>> /* Verify all required signatures */ -     if
> >>> (FIT_IMAGE_ENABLE_VERIFY && +     if
> >>> (CONFIG_IS_ENABLED(RSA_VERIFY) &&
> >>
> >> NAK. Having verification depend directly on CONFIG_RSA_VERIFY will
> >> make adding ECDSA support that much more convoluted.
> >
> > Let me counter-NAK.
> >
> > The ECDSA needs to be integrated into the RSA stuff, as we have done
> > with hashing. E.g. CONFIG_VERIFY that enables the feature, with a
> > driver to select which methods are supported.
>
> Then why not add a CONFIG_(SPL_)VERIFY to this patch instead of
> replacing a common define with an algo-secific CONFIG?

That would be a separate series. CONFIG_RSA_VERIFY is not new and
adding an SPL / host version of it is the goal here.

>
> > I think I mentioned that in the original review.
>
> You did. Integrating ECDSA with RSA is orthogonal to ECDSA verification.
> I like the motivation behind this cosmetic series, but it is
> creating unnecessary complications to adding the ECDSA features.

RSA and ECDSA should have a common API on the board, with a linker
list. The sooner that happens (even with an dummy ECDSA impl), the
better.

>
>      "It is relatively straightforward to add new algorithms if required.
>       [...] If another algorithm is needed (such as DSA) then it can be
>       placed alongside rsa.c, and its functions added to the table in
>       image-sig.c also."
>
> That's from doc/uImage.FIT/signature.txt. Seems like we're changing goal
> posts as the balls are already in the air. I want to tone down this
> series, pick a few patches that I really like, combine them with some of
> my changes and submit a co-authored series with the uncontroversial changes.
>
> I posted a parallel series which eliminates IMAGE_ENABLE_VERIFY_ECDSA,
> and is far less intrusive. I was already trying to combine it with some
> patches in this series. Let's see how that goes

See above. The goal of my series is to remove #ifdefs from image code.
If your approach can do that, or some combination, that is fine with
me.

Regards,
SImon

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

* [PATCH v2 47/50] image: Remove some #ifdefs from image-fit and image-fit-sig
  2021-05-14 21:50   ` Alex G.
@ 2021-05-15 15:20     ` Simon Glass
  0 siblings, 0 replies; 91+ messages in thread
From: Simon Glass @ 2021-05-15 15:20 UTC (permalink / raw)
  To: u-boot

Hi Alex,

On Fri, 14 May 2021 at 15:50, Alex G. <mr.nuke.me@gmail.com> wrote:
>
>
>
> On 5/6/21 9:24 AM, Simon Glass wrote:
> > Drop the #ifdefs which are easy to remove without refactoring.
> >
> > Signed-off-by: Simon Glass <sjg@chromium.org>
> > ---
> >
> > (no changes since v1)
> >
> >   common/Kconfig.boot    | 10 ++++++++++
> >   common/image-fit-sig.c |  8 ++------
> >   common/image-fit.c     |  7 ++++---
> >   3 files changed, 16 insertions(+), 9 deletions(-)
> >
> > diff --git a/common/Kconfig.boot b/common/Kconfig.boot
> > index 03a6e6f214f..a31d9847124 100644
> > --- a/common/Kconfig.boot
> > +++ b/common/Kconfig.boot
> > @@ -191,6 +191,16 @@ config SPL_FIT_SIGNATURE
> >       select SPL_IMAGE_SIGN_INFO
> >       select SPL_FIT_FULL_CHECK
> >
> > +config SPL_FIT_SIGNATURE_MAX_SIZE
> > +     hex "Max size of signed FIT structures in SPL"
> > +     depends on SPL_FIT_SIGNATURE
> > +     default 0x10000000
> > +     help
> > +       This option sets a max size in bytes for verified FIT uImages.
> > +       A sane value of 256MB protects corrupted DTB structures from overlapping
> > +       device memory. Assure this size does not extend past expected storage
> > +       space.
> > +
>
> I can't find an argument of why we'd want a separate
> FIT_SIGNATURE_MAX_SIZE for SPL. This also seems unrelated to the commit
> message of reducing ifdefs.

Often SPL has lower limits, e.g. since there is only so much SRAM, a
large file might indicate some sort of attack.

Regards,
SImon

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

* [PATCH v2 16/50] image: Add Kconfig options for FIT in the host build
  2021-05-12 17:14               ` Tom Rini
@ 2021-05-17 22:29                 ` Alex G.
  2021-05-18  1:23                   ` AKASHI Takahiro
  0 siblings, 1 reply; 91+ messages in thread
From: Alex G. @ 2021-05-17 22:29 UTC (permalink / raw)
  To: u-boot

On 5/12/21 12:14 PM, Tom Rini wrote:
> On Wed, May 12, 2021 at 11:19:52AM -0500, Alex G. wrote:
>>
>>
>> On 5/12/21 10:52 AM, Simon Glass wrote:

[snip]

>>> We have a NO_SDL build-time control. Perhaps have a NO_SSL one as well?
>>
>> It could be a config option instead of an environment variable. I think it
>> can be independent of target options, since we don't sign images in the
>> buildsystem anyway -- we can enable FIT verification, but mkimage without
>> openssl.
> 
> As people point out from time to time, "NO_SDL" is very non-obvious and
> doesn't fit with how the rest of U-Boot is configured.  So I would
> rather not see NO_SSL added. 

FYI, I have a proof-of-concept for the NO_SSL idea using Kconfig [1] 
instead of environment variahles. It's not yet ready for publication.

[1] 
https://github.com/mrnuke/u-boot/commit/c054c546a8de54e41d3802fe60ad9389095e673b


> Frankly, given everything else that's
> needed to build today, I don't think just enabling the support for
> verified boot in mkimage by default and making it a bit odd to turn off
> is a problem.  But given:
> https://lists.denx.de/pipermail/u-boot/2017-December/313742.html
> I would really like to see the switch to gnutls or some other clearly
> compatibly licensed library first.

Might be interesting to switch to gnutls, even if only because it 
doesn't burn your eyes looking at function names and variable types. I 
wouldn't mind looking into this, but I just don't have the bandwidth 
nowadays.

Alex

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

* [PATCH v2 16/50] image: Add Kconfig options for FIT in the host build
  2021-05-17 22:29                 ` Alex G.
@ 2021-05-18  1:23                   ` AKASHI Takahiro
  2021-05-19 15:49                     ` Alex G
  0 siblings, 1 reply; 91+ messages in thread
From: AKASHI Takahiro @ 2021-05-18  1:23 UTC (permalink / raw)
  To: u-boot

On Mon, May 17, 2021 at 05:29:44PM -0500, Alex G. wrote:
> On 5/12/21 12:14 PM, Tom Rini wrote:
> > On Wed, May 12, 2021 at 11:19:52AM -0500, Alex G. wrote:
> > > 
> > > 
> > > On 5/12/21 10:52 AM, Simon Glass wrote:
> 
> [snip]
> 
> > > > We have a NO_SDL build-time control. Perhaps have a NO_SSL one as well?
> > > 
> > > It could be a config option instead of an environment variable. I think it
> > > can be independent of target options, since we don't sign images in the
> > > buildsystem anyway -- we can enable FIT verification, but mkimage without
> > > openssl.
> > 
> > As people point out from time to time, "NO_SDL" is very non-obvious and
> > doesn't fit with how the rest of U-Boot is configured.  So I would
> > rather not see NO_SSL added.
> 
> FYI, I have a proof-of-concept for the NO_SSL idea using Kconfig [1] instead
> of environment variahles. It's not yet ready for publication.
> 
> [1] https://github.com/mrnuke/u-boot/commit/c054c546a8de54e41d3802fe60ad9389095e673b


FYI,
I have posted a patch[1] for a similar *signing* tool using OpenSSL.
Basically, I'd like to follow the way agreed here about how OpenSSL
be handled in host tools.
So please keep in mind that there can be another use case of this kind
of host Kconfig option.

[1] https://lists.denx.de/pipermail/u-boot/2021-May/449572.html

-Takahiro Akashi

> 
> > Frankly, given everything else that's
> > needed to build today, I don't think just enabling the support for
> > verified boot in mkimage by default and making it a bit odd to turn off
> > is a problem.  But given:
> > https://lists.denx.de/pipermail/u-boot/2017-December/313742.html
> > I would really like to see the switch to gnutls or some other clearly
> > compatibly licensed library first.
> 
> Might be interesting to switch to gnutls, even if only because it doesn't
> burn your eyes looking at function names and variable types. I wouldn't mind
> looking into this, but I just don't have the bandwidth nowadays.
> 
> Alex

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

* [PATCH v2 16/50] image: Add Kconfig options for FIT in the host build
  2021-05-18  1:23                   ` AKASHI Takahiro
@ 2021-05-19 15:49                     ` Alex G
  0 siblings, 0 replies; 91+ messages in thread
From: Alex G @ 2021-05-19 15:49 UTC (permalink / raw)
  To: u-boot



On 5/17/21 8:23 PM, AKASHI Takahiro wrote:
> On Mon, May 17, 2021 at 05:29:44PM -0500, Alex G. wrote:
>> On 5/12/21 12:14 PM, Tom Rini wrote:
>>> On Wed, May 12, 2021 at 11:19:52AM -0500, Alex G. wrote:
>>>>
>>>>
>>>> On 5/12/21 10:52 AM, Simon Glass wrote:
>>
>> [snip]
>>
>>>>> We have a NO_SDL build-time control. Perhaps have a NO_SSL one as well?
>>>>
>>>> It could be a config option instead of an environment variable. I think it
>>>> can be independent of target options, since we don't sign images in the
>>>> buildsystem anyway -- we can enable FIT verification, but mkimage without
>>>> openssl.
>>>
>>> As people point out from time to time, "NO_SDL" is very non-obvious and
>>> doesn't fit with how the rest of U-Boot is configured.  So I would
>>> rather not see NO_SSL added.
>>
>> FYI, I have a proof-of-concept for the NO_SSL idea using Kconfig [1] instead
>> of environment variahles. It's not yet ready for publication.
>>
>> [1] https://github.com/mrnuke/u-boot/commit/c054c546a8de54e41d3802fe60ad9389095e673b
> 
> 
> FYI,
> I have posted a patch[1] for a similar *signing* tool using OpenSSL.
> Basically, I'd like to follow the way agreed here about how OpenSSL
> be handled in host tools.
> So please keep in mind that there can be another use case of this kind
> of host Kconfig option.
> 
> [1] https://lists.denx.de/pipermail/u-boot/2021-May/449572.html

I can't ask you to change your patch based on my ideas, as I my changes 
have not yet been submitted for review. However, should you want to 
anticipate, make sure that there's one and only one variable that 
determines if OpenSSL is linked.

I also suspect Tom would be quite thrilled if your patch started using 
gnutls instead of openssl. I'm not sure how sane things would look 
having both gnutls and openssl dependencies; however, I suspect it might 
be acceptable as long as it's temporary.

These decisions haven't been made yet. I don't want to send you on a 
wild goose refactoring chase, only to have the rug pulled from under you 
later. I think it's okay to continue with your patch as submitted. I'll 
update my patch accordingly when yours gets merged first -- looks easy 
enough.

Alex

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

end of thread, other threads:[~2021-05-19 15:49 UTC | newest]

Thread overview: 91+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
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 ` [PATCH v2 49/50] image: Split up boot_get_fdt() Simon Glass
2021-05-06 14:24 ` [PATCH v2 50/50] image: Remove #ifdefs from select_fdt() Simon Glass

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.