[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [PATCH v3 1/3] hw: Model ASPEED's Hash and Crypto Engine
From: |
Cédric Le Goater |
Subject: |
Re: [PATCH v3 1/3] hw: Model ASPEED's Hash and Crypto Engine |
Date: |
Wed, 17 Mar 2021 08:24:38 +0100 |
User-agent: |
Mozilla/5.0 (X11; Linux x86_64; rv:78.0) Gecko/20100101 Thunderbird/78.6.0 |
On 3/17/21 1:02 AM, Andrew Jeffery wrote:
>
>
> On Fri, 12 Mar 2021, at 21:27, Joel Stanley wrote:
>> The HACE (Hash and Crypto Engine) is a device that offloads MD5, SHA1,
>> SHA2, RSA and other cryptographic algorithms.
>>
>> This initial model implements a subset of the device's functionality;
>> currently only direct access (non-scatter gather) hashing.
>>
>> Signed-off-by: Joel Stanley <joel@jms.id.au>
>> Signed-off-by: Cédric Le Goater <clg@kaod.org>
>> ---
>> v3:
>> - rebase on upstream to fix meson.build conflict
>> v2:
>> - reorder register defines
>> - mask src/dest/len registers according to hardware
>> ---
>> include/hw/misc/aspeed_hace.h | 33 ++++
>> hw/misc/aspeed_hace.c | 312 ++++++++++++++++++++++++++++++++++
>> hw/misc/meson.build | 1 +
>> 3 files changed, 346 insertions(+)
>> create mode 100644 include/hw/misc/aspeed_hace.h
>> create mode 100644 hw/misc/aspeed_hace.c
>>
>> diff --git a/include/hw/misc/aspeed_hace.h
>> b/include/hw/misc/aspeed_hace.h
>> new file mode 100644
>> index 000000000000..e1fce670ef9e
>> --- /dev/null
>> +++ b/include/hw/misc/aspeed_hace.h
>> @@ -0,0 +1,33 @@
>> +/*
>> + * ASPEED Hash and Crypto Engine
>> + *
>> + * Copyright (C) 2021 IBM Corp.
>> + *
>> + * SPDX-License-Identifier: GPL-2.0-or-later
>> + */
>> +
>> +#ifndef ASPEED_HACE_H
>> +#define ASPEED_HACE_H
>> +
>> +#include "hw/sysbus.h"
>> +
>> +#define TYPE_ASPEED_HACE "aspeed.hace"
>> +#define ASPEED_HACE(obj) OBJECT_CHECK(AspeedHACEState, (obj),
>> TYPE_ASPEED_HACE)
>> +
>> +#define ASPEED_HACE_NR_REGS (0x64 >> 2)
>> +
>> +typedef struct AspeedHACEState {
>> + /* <private> */
>> + SysBusDevice parent;
>> +
>> + /*< public >*/
>> + MemoryRegion iomem;
>> + qemu_irq irq;
>> +
>> + uint32_t regs[ASPEED_HACE_NR_REGS];
>> +
>> + MemoryRegion *dram_mr;
>> + AddressSpace dram_as;
>> +} AspeedHACEState;
>> +
>> +#endif /* _ASPEED_HACE_H_ */
>> diff --git a/hw/misc/aspeed_hace.c b/hw/misc/aspeed_hace.c
>> new file mode 100644
>> index 000000000000..3d02fae2dd62
>> --- /dev/null
>> +++ b/hw/misc/aspeed_hace.c
>> @@ -0,0 +1,312 @@
>> +/*
>> + * ASPEED Hash and Crypto Engine
>> + *
>> + * Copyright (C) 2021 IBM Corp.
>> + *
>> + * Joel Stanley <joel@jms.id.au>
>> + *
>> + * SPDX-License-Identifier: GPL-2.0-or-later
>> + */
>> +
>> +#include "qemu/osdep.h"
>> +#include "qemu/log.h"
>> +#include "qemu/error-report.h"
>> +#include "hw/misc/aspeed_hace.h"
>> +#include "qapi/error.h"
>> +#include "migration/vmstate.h"
>> +#include "crypto/hash.h"
>> +#include "hw/qdev-properties.h"
>> +#include "hw/irq.h"
>> +
>> +#define R_CRYPT_CMD (0x10 / 4)
>> +
>> +#define R_STATUS (0x1c / 4)
>> +#define HASH_IRQ BIT(9)
>> +#define CRYPT_IRQ BIT(12)
>> +#define TAG_IRQ BIT(15)
>> +
>> +#define R_HASH_SRC (0x20 / 4)
>> +#define R_HASH_DEST (0x24 / 4)
>> +#define R_HASH_SRC_LEN (0x2c / 4)
>> +
>> +#define R_HASH_CMD (0x30 / 4)
>> +/* Hash algorithim selection */
>> +#define HASH_ALGO_MASK (BIT(4) | BIT(5) | BIT(6))
>> +#define HASH_ALGO_MD5 0
>> +#define HASH_ALGO_SHA1 BIT(5)
>> +#define HASH_ALGO_SHA224 BIT(6)
>> +#define HASH_ALGO_SHA256 (BIT(4) | BIT(6))
>> +#define HASH_ALGO_SHA512_SERIES (BIT(5) | BIT(6))
>> +/* SHA512 algorithim selection */
>> +#define SHA512_HASH_ALGO_MASK (BIT(10) | BIT(11) | BIT(12))
>> +#define HASH_ALGO_SHA512_SHA512 0
>> +#define HASH_ALGO_SHA512_SHA384 BIT(10)
>> +#define HASH_ALGO_SHA512_SHA256 BIT(11)
>> +#define HASH_ALGO_SHA512_SHA224 (BIT(10) | BIT(11))
>> +/* HMAC modes */
>> +#define HASH_HMAC_MASK (BIT(7) | BIT(8))
>> +#define HASH_DIGEST 0
>> +#define HASH_DIGEST_HMAC BIT(7)
>> +#define HASH_DIGEST_ACCUM BIT(8)
>> +#define HASH_HMAC_KEY (BIT(7) | BIT(8))
>> +/* Cascscaed operation modes */
>> +#define HASH_ONLY 0
>> +#define HASH_ONLY2 BIT(0)
>> +#define HASH_CRYPT_THEN_HASH BIT(1)
>> +#define HASH_HASH_THEN_CRYPT (BIT(0) | BIT(1))
>> +/* Other cmd bits */
>> +#define HASH_IRQ_EN BIT(9)
>> +#define HASH_SG_EN BIT(18)
>> +
>> +
>> +static int do_hash_operation(AspeedHACEState *s, int algo)
>> +{
>> + hwaddr src, len, dest;
>> + uint8_t *digest_buf = NULL;
>> + size_t digest_len = 0;
>> + char *src_buf;
>> + int rc;
>> +
>> + src = 0x80000000 | s->regs[R_HASH_SRC];
>
> Tricky. Also doesn't work on the AST2400 where SDRAM is based at
> 0x40000000?
We need a "sdram-base" property. See the Aspeed SMC model for DMAs,
it's very similar.
Thanks,
C.
>
> Other than that it looks good to me.
>
> Andrew
>
[PATCH v3 2/3] aspeed: Integrate HACE, Joel Stanley, 2021/03/12
[PATCH v3 3/3] tests/qtest: Add test for Aspeed HACE, Joel Stanley, 2021/03/12