fit: Use DM hash driver if supported

Calculate hash using DM driver if supported.
For backward compatibility, the call to legacy
hash functions is reserved.

Signed-off-by: Chia-Wei Wang <chiawei_wang@aspeedtech.com>
This commit is contained in:
Chia-Wei Wang 2021-07-30 09:08:05 +08:00 committed by Tom Rini
parent e5d870fa1e
commit ca47955a66

View File

@ -25,6 +25,10 @@
#include <asm/io.h>
#include <malloc.h>
#include <asm/global_data.h>
#ifdef CONFIG_DM_HASH
#include <dm.h>
#include <u-boot/hash.h>
#endif
DECLARE_GLOBAL_DATA_PTR;
#endif /* !USE_HOSTCC*/
@ -1214,6 +1218,31 @@ 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 !defined(USE_HOSTCC) && defined(CONFIG_DM_HASH)
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;
}
hash_algo = hash_algo_lookup_by_name(algo);
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;
}
*value_len = hash_algo_digest_size(hash_algo);
#else
if (IMAGE_ENABLE_CRC32 && strcmp(algo, "crc32") == 0) {
*((uint32_t *)value) = crc32_wd(0, data, data_len,
CHUNKSZ_CRC32);
@ -1242,6 +1271,7 @@ int calculate_hash(const void *data, int data_len, const char *algo,
debug("Unsupported hash alogrithm\n");
return -1;
}
#endif
return 0;
}