[PATCH u-boot v2019.04-aspeed-openbmc 10/11] crypto: Add driver for Aspeed HACE
Klaus Heinrich Kiwi
klaus at linux.vnet.ibm.com
Fri Apr 16 07:37:59 AEST 2021
On 4/14/2021 11:32 PM, Joel Stanley wrote:
>> Another interesting thing is that the SPL tries to boot from UART, but neither
>> my fitImages, Legacy images or even RAW images are working.. Not sure if we need
>> some special handling of those images before feeding them to the spl ymodem loader?
> I wasn't able to get the SPL to load any images - raw binaries or FIT
> - from eMMC either. Something is going wrong, but I am unsure what it
> is. I will continue to debug.
I was able to make it work on real hardware (rainier100) with the following changes
(in addition to the other fixups already mentioned in this thread):
From a2a2819455ec5de689fd0702cce20bfb18ec11b1 Mon Sep 17 00:00:00 2001
From: Klaus Heinrich Kiwi <klaus at linux.vnet.ibm.com>
Date: Thu, 15 Apr 2021 15:16:37 -0300
Subject: [PATCH] HACE fixups:
* The AST2600 workbook mentions that the list structure passed to
ASPEED_HACE_HASH_SRC needs to be 8-byte aligned. Normally, glibc's
malloc() would always align memory to (at least) 8-bytes, but that's
the case with u-boot's pre-sdram malloc() implementation. So we need
to explicitly align the context to 8-bytes with malign().
* The __atribute__ ((align 8)) doesn't have an effect in struct
elements. Remove it.
* Since the struct aspeed_hash_ctx->list element is what we need to
make sure is aligned to 9-bytes, move that to the first element of
the array, and call-out the fact that this needs to be aligned in
the declaration.
* Clear HACE_HASH_ISR before issuing new command
Signed-off-by: Klaus Heinrich Kiwi <klaus at linux.vnet.ibm.com>
---
drivers/crypto/aspeed_hace.c | 15 +++++++++++++--
1 file changed, 13 insertions(+), 2 deletions(-)
diff --git a/drivers/crypto/aspeed_hace.c b/drivers/crypto/aspeed_hace.c
index 473d4d7391..0551fe6c83 100644
--- a/drivers/crypto/aspeed_hace.c
+++ b/drivers/crypto/aspeed_hace.c
@@ -51,12 +51,19 @@ struct aspeed_sg {
u32 addr;
};
+
+/*
+ * Note: element 'list' below needs to be 8-byte aligned,
+ * keep it as the first element so that we can always
+ * guarantee that when allocating the struct (that should
+ * also be 8-byte aligned)
+ */
struct aspeed_hash_ctx {
+ struct aspeed_sg list[ASPEED_MAX_SG];
u32 method;
u32 digest_size;
u32 len;
u32 count;
- struct aspeed_sg list[ASPEED_MAX_SG] __attribute__((aligned(8)));
};
struct aspeed_hace {
@@ -85,6 +92,9 @@ static int digest_object(const void *src, unsigned int length, void *digest,
return -EINVAL;
}
+ /* clear any pending interrupt */
+ writel(HACE_HASH_ISR, base + ASPEED_HACE_STS);
+
writel((u32)src, base + ASPEED_HACE_HASH_SRC);
writel((u32)digest, base + ASPEED_HACE_HASH_DIGEST_BUFF);
writel(length, base + ASPEED_HACE_HASH_DATA_LEN);
@@ -145,12 +155,13 @@ int hw_sha_init(struct hash_algo *algo, void **ctxp)
return -ENOTSUPP;
}
- ctx = calloc(1, sizeof(*ctx));
+ ctx = memalign(8, sizeof(struct aspeed_hash_ctx));
if (ctx == NULL) {
debug("Cannot allocate memory for context\n");
return -ENOMEM;
}
+ ctx->len = ctx->count = 0;
ctx->method = method | HACE_SG_EN;
ctx->digest_size = algo->digest_size;
*ctxp = ctx;
--
2.25.1
--
Klaus Heinrich Kiwi <klaus at linux.vnet.ibm.com>
More information about the openbmc
mailing list