The hash uclass is currently keyed only by CONFIG_DM_HASH, so SPL cannot enable UCLASS_HASH independently. Any SPL code using hash_digest*() has to rely on U-Boot proper also enabling DM_HASH, and the FIT hash path selects the driver-model implementation with a non-phase-aware preprocessor check.
Add SPL_DM_HASH, build the hash uclass from CONFIG_$(PHASE_)DM_HASH and use CONFIG_IS_ENABLED(DM_HASH) when selecting the FIT hash implementation. This lets SPL FIT verification use a UCLASS_HASH provider without requiring the U-Boot proper hash uclass. Reviewed-by: Simon Glass <[email protected]> Signed-off-by: James Hilliard <[email protected]> --- Changes v2 -> v3: - Remove the bare software-hash fallback scope (suggested by Simon Glass) - Document that SPL_DM_HASH needs a hardware provider unless a phase-aware software hash provider is added (suggested by Simon Glass) --- boot/image-fit.c | 50 +++++++++++++++++++++++--------------------- drivers/crypto/hash/Kconfig | 13 ++++++++++++ drivers/crypto/hash/Makefile | 2 +- 3 files changed, 40 insertions(+), 25 deletions(-) diff --git a/boot/image-fit.c b/boot/image-fit.c index 044a40e1910..555cbf81348 100644 --- a/boot/image-fit.c +++ b/boot/image-fit.c @@ -32,10 +32,8 @@ extern void *aligned_alloc(size_t alignment, size_t size); #include <malloc.h> #include <memalign.h> #include <asm/global_data.h> -#ifdef CONFIG_DM_HASH #include <dm.h> #include <u-boot/hash.h> -#endif #define aligned_alloc(a, s) memalign((a), (s)) DECLARE_GLOBAL_DATA_PTR; @@ -1318,43 +1316,47 @@ int fit_set_timestamp(void *fit, int noffset, time_t timestamp) int calculate_hash(const void *data, int data_len, const char *name, uint8_t *value, int *value_len) { -#if !defined(USE_HOSTCC) && defined(CONFIG_DM_HASH) + struct hash_algo *algo; + int ret; + +#ifndef USE_HOSTCC int rc; enum HASH_ALGO hash_algo; struct udevice *dev; - rc = uclass_get_device(UCLASS_HASH, 0, &dev); - if (rc) { - debug("failed to get hash device, rc=%d\n", rc); - return -1; - } + if (CONFIG_IS_ENABLED(DM_HASH)) { + rc = uclass_get_device(UCLASS_HASH, 0, &dev); + if (rc) { + debug("failed to get hash device, rc=%d\n", rc); + return -1; + } - hash_algo = hash_algo_lookup_by_name(name); - if (hash_algo == HASH_ALGO_INVALID) { - debug("Unsupported hash algorithm\n"); - return -1; - }; + hash_algo = hash_algo_lookup_by_name(name); + if (hash_algo == HASH_ALGO_INVALID) { + debug("Unsupported hash algorithm\n"); + return -1; + } - rc = hash_digest_wd(dev, hash_algo, data, data_len, value, CHUNKSZ); - if (rc) { - debug("failed to get hash value, rc=%d\n", rc); - return -1; - } + rc = hash_digest_wd(dev, hash_algo, data, data_len, value, + CHUNKSZ); + if (rc) { + debug("failed to get hash value, rc=%d\n", rc); + return -1; + } - *value_len = hash_algo_digest_size(hash_algo); -#else - struct hash_algo *algo; - int ret; + *value_len = hash_algo_digest_size(hash_algo); + return 0; + } +#endif ret = hash_lookup_algo(name, &algo); if (ret < 0) { - debug("Unsupported hash alogrithm\n"); + debug("Unsupported hash algorithm\n"); return -1; } algo->hash_func_ws(data, data_len, value, algo->chunk_size); *value_len = algo->digest_size; -#endif return 0; } diff --git a/drivers/crypto/hash/Kconfig b/drivers/crypto/hash/Kconfig index 72b955ac791..272af7bce18 100644 --- a/drivers/crypto/hash/Kconfig +++ b/drivers/crypto/hash/Kconfig @@ -4,6 +4,19 @@ config DM_HASH help If you want to use driver model for Hash, say Y. +config SPL_DM_HASH + bool "Enable Driver Model for Hash in SPL" + depends on SPL_DM + select SPL_CRYPTO + help + Enable the hash uclass in SPL so SPL code can bind and use + UCLASS_HASH providers through the driver model. This is useful for + FIT verification paths that want to calculate image hashes through a + hardware hash accelerator before U-Boot proper is loaded. + HASH_SOFTWARE depends on DM_HASH, so SPL_DM_HASH alone does not + provide a software hash device. Enable a hardware hash provider for + SPL when selecting this option. + config HASH_SOFTWARE bool "Enable driver for Hash in software" depends on DM_HASH diff --git a/drivers/crypto/hash/Makefile b/drivers/crypto/hash/Makefile index 33d88161ed4..9f0d30f9be3 100644 --- a/drivers/crypto/hash/Makefile +++ b/drivers/crypto/hash/Makefile @@ -2,5 +2,5 @@ # # Copyright (c) 2021 ASPEED Technology Inc. -obj-$(CONFIG_DM_HASH) += hash-uclass.o +obj-$(CONFIG_$(PHASE_)DM_HASH) += hash-uclass.o obj-$(CONFIG_HASH_SOFTWARE) += hash_sw.o -- 2.53.0

