xref: /openbmc/qemu/tests/qtest/aspeed-hace-utils.c (revision 0ddc4dc336a0f315ac8994c0413288d65c460848)
162db9a7bSJamin Lin /*
262db9a7bSJamin Lin  * QTest testcase for the ASPEED Hash and Crypto Engine
362db9a7bSJamin Lin  *
462db9a7bSJamin Lin  * SPDX-License-Identifier: GPL-2.0-or-later
562db9a7bSJamin Lin  * Copyright 2021 IBM Corp.
662db9a7bSJamin Lin  */
762db9a7bSJamin Lin 
862db9a7bSJamin Lin #include "qemu/osdep.h"
962db9a7bSJamin Lin #include "libqtest.h"
1062db9a7bSJamin Lin #include "qemu/bitops.h"
1162db9a7bSJamin Lin #include "aspeed-hace-utils.h"
1262db9a7bSJamin Lin 
1362db9a7bSJamin Lin /*
1462db9a7bSJamin Lin  * Test vector is the ascii "abc"
1562db9a7bSJamin Lin  *
1662db9a7bSJamin Lin  * Expected results were generated using command line utitiles:
1762db9a7bSJamin Lin  *
1862db9a7bSJamin Lin  *  echo -n -e 'abc' | dd of=/tmp/test
19d21eb132SJamin Lin  *  for hash in sha512sum sha384sum sha256sum md5sum; do $hash /tmp/test; done
2062db9a7bSJamin Lin  *
2162db9a7bSJamin Lin  */
2262db9a7bSJamin Lin static const uint8_t test_vector[] = {0x61, 0x62, 0x63};
2362db9a7bSJamin Lin 
2462db9a7bSJamin Lin static const uint8_t test_result_sha512[] = {
2562db9a7bSJamin Lin     0xdd, 0xaf, 0x35, 0xa1, 0x93, 0x61, 0x7a, 0xba, 0xcc, 0x41, 0x73, 0x49,
2662db9a7bSJamin Lin     0xae, 0x20, 0x41, 0x31, 0x12, 0xe6, 0xfa, 0x4e, 0x89, 0xa9, 0x7e, 0xa2,
2762db9a7bSJamin Lin     0x0a, 0x9e, 0xee, 0xe6, 0x4b, 0x55, 0xd3, 0x9a, 0x21, 0x92, 0x99, 0x2a,
2862db9a7bSJamin Lin     0x27, 0x4f, 0xc1, 0xa8, 0x36, 0xba, 0x3c, 0x23, 0xa3, 0xfe, 0xeb, 0xbd,
2962db9a7bSJamin Lin     0x45, 0x4d, 0x44, 0x23, 0x64, 0x3c, 0xe8, 0x0e, 0x2a, 0x9a, 0xc9, 0x4f,
3062db9a7bSJamin Lin     0xa5, 0x4c, 0xa4, 0x9f};
3162db9a7bSJamin Lin 
32d21eb132SJamin Lin static const uint8_t test_result_sha384[] = {
33d21eb132SJamin Lin     0xcb, 0x00, 0x75, 0x3f, 0x45, 0xa3, 0x5e, 0x8b, 0xb5, 0xa0, 0x3d, 0x69,
34d21eb132SJamin Lin     0x9a, 0xc6, 0x50, 0x07, 0x27, 0x2c, 0x32, 0xab, 0x0e, 0xde, 0xd1, 0x63,
35d21eb132SJamin Lin     0x1a, 0x8b, 0x60, 0x5a, 0x43, 0xff, 0x5b, 0xed, 0x80, 0x86, 0x07, 0x2b,
36d21eb132SJamin Lin     0xa1, 0xe7, 0xcc, 0x23, 0x58, 0xba, 0xec, 0xa1, 0x34, 0xc8, 0x25, 0xa7};
37d21eb132SJamin Lin 
3862db9a7bSJamin Lin static const uint8_t test_result_sha256[] = {
3962db9a7bSJamin Lin     0xba, 0x78, 0x16, 0xbf, 0x8f, 0x01, 0xcf, 0xea, 0x41, 0x41, 0x40, 0xde,
4062db9a7bSJamin Lin     0x5d, 0xae, 0x22, 0x23, 0xb0, 0x03, 0x61, 0xa3, 0x96, 0x17, 0x7a, 0x9c,
4162db9a7bSJamin Lin     0xb4, 0x10, 0xff, 0x61, 0xf2, 0x00, 0x15, 0xad};
4262db9a7bSJamin Lin 
4362db9a7bSJamin Lin static const uint8_t test_result_md5[] = {
4462db9a7bSJamin Lin     0x90, 0x01, 0x50, 0x98, 0x3c, 0xd2, 0x4f, 0xb0, 0xd6, 0x96, 0x3f, 0x7d,
4562db9a7bSJamin Lin     0x28, 0xe1, 0x7f, 0x72};
4662db9a7bSJamin Lin 
4762db9a7bSJamin Lin /*
4862db9a7bSJamin Lin  * The Scatter-Gather Test vector is the ascii "abc" "def" "ghi", broken
4962db9a7bSJamin Lin  * into blocks of 3 characters as shown
5062db9a7bSJamin Lin  *
5162db9a7bSJamin Lin  * Expected results were generated using command line utitiles:
5262db9a7bSJamin Lin  *
5362db9a7bSJamin Lin  *  echo -n -e 'abcdefghijkl' | dd of=/tmp/test
54d21eb132SJamin Lin  *  for hash in sha512sum sha384sum sha256sum; do $hash /tmp/test; done
5562db9a7bSJamin Lin  *
5662db9a7bSJamin Lin  */
5762db9a7bSJamin Lin static const uint8_t test_vector_sg1[] = {0x61, 0x62, 0x63, 0x64, 0x65, 0x66};
5862db9a7bSJamin Lin static const uint8_t test_vector_sg2[] = {0x67, 0x68, 0x69};
5962db9a7bSJamin Lin static const uint8_t test_vector_sg3[] = {0x6a, 0x6b, 0x6c};
6062db9a7bSJamin Lin 
6162db9a7bSJamin Lin static const uint8_t test_result_sg_sha512[] = {
6262db9a7bSJamin Lin     0x17, 0x80, 0x7c, 0x72, 0x8e, 0xe3, 0xba, 0x35, 0xe7, 0xcf, 0x7a, 0xf8,
6362db9a7bSJamin Lin     0x23, 0x11, 0x6d, 0x26, 0xe4, 0x1e, 0x5d, 0x4d, 0x6c, 0x2f, 0xf1, 0xf3,
6462db9a7bSJamin Lin     0x72, 0x0d, 0x3d, 0x96, 0xaa, 0xcb, 0x6f, 0x69, 0xde, 0x64, 0x2e, 0x63,
6562db9a7bSJamin Lin     0xd5, 0xb7, 0x3f, 0xc3, 0x96, 0xc1, 0x2b, 0xe3, 0x8b, 0x2b, 0xd5, 0xd8,
6662db9a7bSJamin Lin     0x84, 0x25, 0x7c, 0x32, 0xc8, 0xf6, 0xd0, 0x85, 0x4a, 0xe6, 0xb5, 0x40,
6762db9a7bSJamin Lin     0xf8, 0x6d, 0xda, 0x2e};
6862db9a7bSJamin Lin 
69d21eb132SJamin Lin static const uint8_t test_result_sg_sha384[] = {
70d21eb132SJamin Lin     0x10, 0x3c, 0xa9, 0x6c, 0x06, 0xa1, 0xce, 0x79, 0x8f, 0x08, 0xf8, 0xef,
71d21eb132SJamin Lin     0xf0, 0xdf, 0xb0, 0xcc, 0xdb, 0x56, 0x7d, 0x48, 0xb2, 0x85, 0xb2, 0x3d,
72d21eb132SJamin Lin     0x0c, 0xd7, 0x73, 0x45, 0x46, 0x67, 0xa3, 0xc2, 0xfa, 0x5f, 0x1b, 0x58,
73d21eb132SJamin Lin     0xd9, 0xcd, 0xf2, 0x32, 0x9b, 0xd9, 0x97, 0x97, 0x30, 0xbf, 0xaa, 0xff};
74d21eb132SJamin Lin 
7562db9a7bSJamin Lin static const uint8_t test_result_sg_sha256[] = {
7662db9a7bSJamin Lin     0xd6, 0x82, 0xed, 0x4c, 0xa4, 0xd9, 0x89, 0xc1, 0x34, 0xec, 0x94, 0xf1,
7762db9a7bSJamin Lin     0x55, 0x1e, 0x1e, 0xc5, 0x80, 0xdd, 0x6d, 0x5a, 0x6e, 0xcd, 0xe9, 0xf3,
7862db9a7bSJamin Lin     0xd3, 0x5e, 0x6e, 0x4a, 0x71, 0x7f, 0xbd, 0xe4};
7962db9a7bSJamin Lin 
8062db9a7bSJamin Lin /*
8162db9a7bSJamin Lin  * The accumulative mode requires firmware to provide internal initial state
8262db9a7bSJamin Lin  * and message padding (including length L at the end of padding).
8362db9a7bSJamin Lin  *
8462db9a7bSJamin Lin  * This test vector is a ascii text "abc" with padding message.
8562db9a7bSJamin Lin  *
8662db9a7bSJamin Lin  * Expected results were generated using command line utitiles:
8762db9a7bSJamin Lin  *
8862db9a7bSJamin Lin  *  echo -n -e 'abc' | dd of=/tmp/test
89d21eb132SJamin Lin  *  for hash in sha512sum sha384sum sha256sum; do $hash /tmp/test; done
9062db9a7bSJamin Lin  */
9162db9a7bSJamin Lin static const uint8_t test_vector_accum_512[] = {
9262db9a7bSJamin Lin     0x61, 0x62, 0x63, 0x80, 0x00, 0x00, 0x00, 0x00,
9362db9a7bSJamin Lin     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
9462db9a7bSJamin Lin     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
9562db9a7bSJamin Lin     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
9662db9a7bSJamin Lin     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
9762db9a7bSJamin Lin     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
9862db9a7bSJamin Lin     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
9962db9a7bSJamin Lin     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
10062db9a7bSJamin Lin     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
10162db9a7bSJamin Lin     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
10262db9a7bSJamin Lin     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
10362db9a7bSJamin Lin     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
10462db9a7bSJamin Lin     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
10562db9a7bSJamin Lin     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
10662db9a7bSJamin Lin     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
10762db9a7bSJamin Lin     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18};
10862db9a7bSJamin Lin 
109d21eb132SJamin Lin static const uint8_t test_vector_accum_384[] = {
110d21eb132SJamin Lin     0x61, 0x62, 0x63, 0x80, 0x00, 0x00, 0x00, 0x00,
111d21eb132SJamin Lin     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
112d21eb132SJamin Lin     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
113d21eb132SJamin Lin     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
114d21eb132SJamin Lin     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
115d21eb132SJamin Lin     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
116d21eb132SJamin Lin     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
117d21eb132SJamin Lin     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
118d21eb132SJamin Lin     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
119d21eb132SJamin Lin     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
120d21eb132SJamin Lin     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
121d21eb132SJamin Lin     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
122d21eb132SJamin Lin     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
123d21eb132SJamin Lin     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
124d21eb132SJamin Lin     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
125d21eb132SJamin Lin     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18};
126d21eb132SJamin Lin 
12762db9a7bSJamin Lin static const uint8_t test_vector_accum_256[] = {
12862db9a7bSJamin Lin     0x61, 0x62, 0x63, 0x80, 0x00, 0x00, 0x00, 0x00,
12962db9a7bSJamin Lin     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
13062db9a7bSJamin Lin     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
13162db9a7bSJamin Lin     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
13262db9a7bSJamin Lin     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
13362db9a7bSJamin Lin     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
13462db9a7bSJamin Lin     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
13562db9a7bSJamin Lin     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18};
13662db9a7bSJamin Lin 
13762db9a7bSJamin Lin static const uint8_t test_result_accum_sha512[] = {
13862db9a7bSJamin Lin     0xdd, 0xaf, 0x35, 0xa1, 0x93, 0x61, 0x7a, 0xba, 0xcc, 0x41, 0x73, 0x49,
13962db9a7bSJamin Lin     0xae, 0x20, 0x41, 0x31, 0x12, 0xe6, 0xfa, 0x4e, 0x89, 0xa9, 0x7e, 0xa2,
14062db9a7bSJamin Lin     0x0a, 0x9e, 0xee, 0xe6, 0x4b, 0x55, 0xd3, 0x9a, 0x21, 0x92, 0x99, 0x2a,
14162db9a7bSJamin Lin     0x27, 0x4f, 0xc1, 0xa8, 0x36, 0xba, 0x3c, 0x23, 0xa3, 0xfe, 0xeb, 0xbd,
14262db9a7bSJamin Lin     0x45, 0x4d, 0x44, 0x23, 0x64, 0x3c, 0xe8, 0x0e, 0x2a, 0x9a, 0xc9, 0x4f,
14362db9a7bSJamin Lin     0xa5, 0x4c, 0xa4, 0x9f};
14462db9a7bSJamin Lin 
145d21eb132SJamin Lin static const uint8_t test_result_accum_sha384[] = {
146d21eb132SJamin Lin     0xcb, 0x00, 0x75, 0x3f, 0x45, 0xa3, 0x5e, 0x8b, 0xb5, 0xa0, 0x3d, 0x69,
147d21eb132SJamin Lin     0x9a, 0xc6, 0x50, 0x07, 0x27, 0x2c, 0x32, 0xab, 0x0e, 0xde, 0xd1, 0x63,
148d21eb132SJamin Lin     0x1a, 0x8b, 0x60, 0x5a, 0x43, 0xff, 0x5b, 0xed, 0x80, 0x86, 0x07, 0x2b,
149d21eb132SJamin Lin     0xa1, 0xe7, 0xcc, 0x23, 0x58, 0xba, 0xec, 0xa1, 0x34, 0xc8, 0x25, 0xa7};
150d21eb132SJamin Lin 
15162db9a7bSJamin Lin static const uint8_t test_result_accum_sha256[] = {
15262db9a7bSJamin Lin     0xba, 0x78, 0x16, 0xbf, 0x8f, 0x01, 0xcf, 0xea, 0x41, 0x41, 0x40, 0xde,
15362db9a7bSJamin Lin     0x5d, 0xae, 0x22, 0x23, 0xb0, 0x03, 0x61, 0xa3, 0x96, 0x17, 0x7a, 0x9c,
15462db9a7bSJamin Lin     0xb4, 0x10, 0xff, 0x61, 0xf2, 0x00, 0x15, 0xad};
15562db9a7bSJamin Lin 
write_regs(QTestState * s,uint32_t base,uint64_t src,uint32_t length,uint64_t out,uint32_t method)156080a8325SJamin Lin static void write_regs(QTestState *s, uint32_t base, uint64_t src,
157080a8325SJamin Lin                        uint32_t length, uint64_t out, uint32_t method)
15862db9a7bSJamin Lin {
159080a8325SJamin Lin         qtest_writel(s, base + HACE_HASH_SRC, extract64(src, 0, 32));
16082658cd4SJamin Lin         qtest_writel(s, base + HACE_HASH_SRC_HI, extract64(src, 32, 32));
161080a8325SJamin Lin         qtest_writel(s, base + HACE_HASH_DIGEST, extract64(out, 0, 32));
16282658cd4SJamin Lin         qtest_writel(s, base + HACE_HASH_DIGEST_HI, extract64(out, 32, 32));
16362db9a7bSJamin Lin         qtest_writel(s, base + HACE_HASH_DATA_LEN, length);
16462db9a7bSJamin Lin         qtest_writel(s, base + HACE_HASH_CMD, HACE_SHA_BE_EN | method);
16562db9a7bSJamin Lin }
16662db9a7bSJamin Lin 
aspeed_test_md5(const char * machine,const uint32_t base,const uint64_t src_addr)16762db9a7bSJamin Lin void aspeed_test_md5(const char *machine, const uint32_t base,
168080a8325SJamin Lin                      const uint64_t src_addr)
16962db9a7bSJamin Lin 
17062db9a7bSJamin Lin {
17162db9a7bSJamin Lin     QTestState *s = qtest_init(machine);
17262db9a7bSJamin Lin 
173080a8325SJamin Lin     uint64_t digest_addr = src_addr + 0x010000;
17462db9a7bSJamin Lin     uint8_t digest[16] = {0};
17562db9a7bSJamin Lin 
17662db9a7bSJamin Lin     /* Check engine is idle, no busy or irq bits set */
17762db9a7bSJamin Lin     g_assert_cmphex(qtest_readl(s, base + HACE_STS), ==, 0);
17862db9a7bSJamin Lin 
17962db9a7bSJamin Lin     /* Write test vector into memory */
18062db9a7bSJamin Lin     qtest_memwrite(s, src_addr, test_vector, sizeof(test_vector));
18162db9a7bSJamin Lin 
18262db9a7bSJamin Lin     write_regs(s, base, src_addr, sizeof(test_vector),
18362db9a7bSJamin Lin                digest_addr, HACE_ALGO_MD5);
18462db9a7bSJamin Lin 
18562db9a7bSJamin Lin     /* Check hash IRQ status is asserted */
18662db9a7bSJamin Lin     g_assert_cmphex(qtest_readl(s, base + HACE_STS), ==, 0x00000200);
18762db9a7bSJamin Lin 
18862db9a7bSJamin Lin     /* Clear IRQ status and check status is deasserted */
18962db9a7bSJamin Lin     qtest_writel(s, base + HACE_STS, 0x00000200);
19062db9a7bSJamin Lin     g_assert_cmphex(qtest_readl(s, base + HACE_STS), ==, 0);
19162db9a7bSJamin Lin 
19262db9a7bSJamin Lin     /* Read computed digest from memory */
19362db9a7bSJamin Lin     qtest_memread(s, digest_addr, digest, sizeof(digest));
19462db9a7bSJamin Lin 
19562db9a7bSJamin Lin     /* Check result of computation */
19662db9a7bSJamin Lin     g_assert_cmpmem(digest, sizeof(digest),
19762db9a7bSJamin Lin                     test_result_md5, sizeof(digest));
19862db9a7bSJamin Lin 
19962db9a7bSJamin Lin     qtest_quit(s);
20062db9a7bSJamin Lin }
20162db9a7bSJamin Lin 
aspeed_test_sha256(const char * machine,const uint32_t base,const uint64_t src_addr)20262db9a7bSJamin Lin void aspeed_test_sha256(const char *machine, const uint32_t base,
203080a8325SJamin Lin                         const uint64_t src_addr)
20462db9a7bSJamin Lin {
20562db9a7bSJamin Lin     QTestState *s = qtest_init(machine);
20662db9a7bSJamin Lin 
207080a8325SJamin Lin     const uint64_t digest_addr = src_addr + 0x10000;
20862db9a7bSJamin Lin     uint8_t digest[32] = {0};
20962db9a7bSJamin Lin 
21062db9a7bSJamin Lin     /* Check engine is idle, no busy or irq bits set */
21162db9a7bSJamin Lin     g_assert_cmphex(qtest_readl(s, base + HACE_STS), ==, 0);
21262db9a7bSJamin Lin 
21362db9a7bSJamin Lin     /* Write test vector into memory */
21462db9a7bSJamin Lin     qtest_memwrite(s, src_addr, test_vector, sizeof(test_vector));
21562db9a7bSJamin Lin 
21662db9a7bSJamin Lin     write_regs(s, base, src_addr, sizeof(test_vector), digest_addr,
21762db9a7bSJamin Lin                HACE_ALGO_SHA256);
21862db9a7bSJamin Lin 
21962db9a7bSJamin Lin     /* Check hash IRQ status is asserted */
22062db9a7bSJamin Lin     g_assert_cmphex(qtest_readl(s, base + HACE_STS), ==, 0x00000200);
22162db9a7bSJamin Lin 
22262db9a7bSJamin Lin     /* Clear IRQ status and check status is deasserted */
22362db9a7bSJamin Lin     qtest_writel(s, base + HACE_STS, 0x00000200);
22462db9a7bSJamin Lin     g_assert_cmphex(qtest_readl(s, base + HACE_STS), ==, 0);
22562db9a7bSJamin Lin 
22662db9a7bSJamin Lin     /* Read computed digest from memory */
22762db9a7bSJamin Lin     qtest_memread(s, digest_addr, digest, sizeof(digest));
22862db9a7bSJamin Lin 
22962db9a7bSJamin Lin     /* Check result of computation */
23062db9a7bSJamin Lin     g_assert_cmpmem(digest, sizeof(digest),
23162db9a7bSJamin Lin                     test_result_sha256, sizeof(digest));
23262db9a7bSJamin Lin 
23362db9a7bSJamin Lin     qtest_quit(s);
23462db9a7bSJamin Lin }
23562db9a7bSJamin Lin 
aspeed_test_sha384(const char * machine,const uint32_t base,const uint64_t src_addr)236d21eb132SJamin Lin void aspeed_test_sha384(const char *machine, const uint32_t base,
237080a8325SJamin Lin                         const uint64_t src_addr)
238d21eb132SJamin Lin {
239d21eb132SJamin Lin     QTestState *s = qtest_init(machine);
240d21eb132SJamin Lin 
241080a8325SJamin Lin     const uint64_t digest_addr = src_addr + 0x10000;
242d21eb132SJamin Lin     uint8_t digest[32] = {0};
243d21eb132SJamin Lin 
244d21eb132SJamin Lin     /* Check engine is idle, no busy or irq bits set */
245d21eb132SJamin Lin     g_assert_cmphex(qtest_readl(s, base + HACE_STS), ==, 0);
246d21eb132SJamin Lin 
247d21eb132SJamin Lin     /* Write test vector into memory */
248d21eb132SJamin Lin     qtest_memwrite(s, src_addr, test_vector, sizeof(test_vector));
249d21eb132SJamin Lin 
250d21eb132SJamin Lin     write_regs(s, base, src_addr, sizeof(test_vector), digest_addr,
251d21eb132SJamin Lin                HACE_ALGO_SHA384);
252d21eb132SJamin Lin 
253d21eb132SJamin Lin     /* Check hash IRQ status is asserted */
254d21eb132SJamin Lin     g_assert_cmphex(qtest_readl(s, base + HACE_STS), ==, 0x00000200);
255d21eb132SJamin Lin 
256d21eb132SJamin Lin     /* Clear IRQ status and check status is deasserted */
257d21eb132SJamin Lin     qtest_writel(s, base + HACE_STS, 0x00000200);
258d21eb132SJamin Lin     g_assert_cmphex(qtest_readl(s, base + HACE_STS), ==, 0);
259d21eb132SJamin Lin 
260d21eb132SJamin Lin     /* Read computed digest from memory */
261d21eb132SJamin Lin     qtest_memread(s, digest_addr, digest, sizeof(digest));
262d21eb132SJamin Lin 
263d21eb132SJamin Lin     /* Check result of computation */
264d21eb132SJamin Lin     g_assert_cmpmem(digest, sizeof(digest),
265d21eb132SJamin Lin                     test_result_sha384, sizeof(digest));
266d21eb132SJamin Lin 
267d21eb132SJamin Lin     qtest_quit(s);
268d21eb132SJamin Lin }
269d21eb132SJamin Lin 
aspeed_test_sha512(const char * machine,const uint32_t base,const uint64_t src_addr)27062db9a7bSJamin Lin void aspeed_test_sha512(const char *machine, const uint32_t base,
271080a8325SJamin Lin                         const uint64_t src_addr)
27262db9a7bSJamin Lin {
27362db9a7bSJamin Lin     QTestState *s = qtest_init(machine);
27462db9a7bSJamin Lin 
275080a8325SJamin Lin     const uint64_t digest_addr = src_addr + 0x10000;
27662db9a7bSJamin Lin     uint8_t digest[64] = {0};
27762db9a7bSJamin Lin 
27862db9a7bSJamin Lin     /* Check engine is idle, no busy or irq bits set */
27962db9a7bSJamin Lin     g_assert_cmphex(qtest_readl(s, base + HACE_STS), ==, 0);
28062db9a7bSJamin Lin 
28162db9a7bSJamin Lin     /* Write test vector into memory */
28262db9a7bSJamin Lin     qtest_memwrite(s, src_addr, test_vector, sizeof(test_vector));
28362db9a7bSJamin Lin 
28462db9a7bSJamin Lin     write_regs(s, base, src_addr, sizeof(test_vector), digest_addr,
28562db9a7bSJamin Lin                HACE_ALGO_SHA512);
28662db9a7bSJamin Lin 
28762db9a7bSJamin Lin     /* Check hash IRQ status is asserted */
28862db9a7bSJamin Lin     g_assert_cmphex(qtest_readl(s, base + HACE_STS), ==, 0x00000200);
28962db9a7bSJamin Lin 
29062db9a7bSJamin Lin     /* Clear IRQ status and check status is deasserted */
29162db9a7bSJamin Lin     qtest_writel(s, base + HACE_STS, 0x00000200);
29262db9a7bSJamin Lin     g_assert_cmphex(qtest_readl(s, base + HACE_STS), ==, 0);
29362db9a7bSJamin Lin 
29462db9a7bSJamin Lin     /* Read computed digest from memory */
29562db9a7bSJamin Lin     qtest_memread(s, digest_addr, digest, sizeof(digest));
29662db9a7bSJamin Lin 
29762db9a7bSJamin Lin     /* Check result of computation */
29862db9a7bSJamin Lin     g_assert_cmpmem(digest, sizeof(digest),
29962db9a7bSJamin Lin                     test_result_sha512, sizeof(digest));
30062db9a7bSJamin Lin 
30162db9a7bSJamin Lin     qtest_quit(s);
30262db9a7bSJamin Lin }
30362db9a7bSJamin Lin 
aspeed_test_sha256_sg(const char * machine,const uint32_t base,const uint64_t src_addr)30462db9a7bSJamin Lin void aspeed_test_sha256_sg(const char *machine, const uint32_t base,
305080a8325SJamin Lin                            const uint64_t src_addr)
30662db9a7bSJamin Lin {
30762db9a7bSJamin Lin     QTestState *s = qtest_init(machine);
30862db9a7bSJamin Lin 
309080a8325SJamin Lin     const uint64_t src_addr_1 = src_addr + 0x10000;
310080a8325SJamin Lin     const uint64_t src_addr_2 = src_addr + 0x20000;
311080a8325SJamin Lin     const uint64_t src_addr_3 = src_addr + 0x30000;
312080a8325SJamin Lin     const uint64_t digest_addr = src_addr + 0x40000;
31362db9a7bSJamin Lin     uint8_t digest[32] = {0};
31462db9a7bSJamin Lin     struct AspeedSgList array[] = {
31562db9a7bSJamin Lin         {  cpu_to_le32(sizeof(test_vector_sg1)),
316080a8325SJamin Lin            cpu_to_le64(src_addr_1) },
31762db9a7bSJamin Lin         {  cpu_to_le32(sizeof(test_vector_sg2)),
318080a8325SJamin Lin            cpu_to_le64(src_addr_2) },
31962db9a7bSJamin Lin         {  cpu_to_le32(sizeof(test_vector_sg3) | SG_LIST_LEN_LAST),
320080a8325SJamin Lin            cpu_to_le64(src_addr_3) },
32162db9a7bSJamin Lin     };
32262db9a7bSJamin Lin 
32362db9a7bSJamin Lin     /* Check engine is idle, no busy or irq bits set */
32462db9a7bSJamin Lin     g_assert_cmphex(qtest_readl(s, base + HACE_STS), ==, 0);
32562db9a7bSJamin Lin 
32662db9a7bSJamin Lin     /* Write test vector into memory */
32762db9a7bSJamin Lin     qtest_memwrite(s, src_addr_1, test_vector_sg1, sizeof(test_vector_sg1));
32862db9a7bSJamin Lin     qtest_memwrite(s, src_addr_2, test_vector_sg2, sizeof(test_vector_sg2));
32962db9a7bSJamin Lin     qtest_memwrite(s, src_addr_3, test_vector_sg3, sizeof(test_vector_sg3));
33062db9a7bSJamin Lin     qtest_memwrite(s, src_addr, array, sizeof(array));
33162db9a7bSJamin Lin 
33262db9a7bSJamin Lin     write_regs(s, base, src_addr,
33362db9a7bSJamin Lin                (sizeof(test_vector_sg1)
33462db9a7bSJamin Lin                 + sizeof(test_vector_sg2)
33562db9a7bSJamin Lin                 + sizeof(test_vector_sg3)),
33662db9a7bSJamin Lin                digest_addr, HACE_ALGO_SHA256 | HACE_SG_EN);
33762db9a7bSJamin Lin 
33862db9a7bSJamin Lin     /* Check hash IRQ status is asserted */
33962db9a7bSJamin Lin     g_assert_cmphex(qtest_readl(s, base + HACE_STS), ==, 0x00000200);
34062db9a7bSJamin Lin 
34162db9a7bSJamin Lin     /* Clear IRQ status and check status is deasserted */
34262db9a7bSJamin Lin     qtest_writel(s, base + HACE_STS, 0x00000200);
34362db9a7bSJamin Lin     g_assert_cmphex(qtest_readl(s, base + HACE_STS), ==, 0);
34462db9a7bSJamin Lin 
34562db9a7bSJamin Lin     /* Read computed digest from memory */
34662db9a7bSJamin Lin     qtest_memread(s, digest_addr, digest, sizeof(digest));
34762db9a7bSJamin Lin 
34862db9a7bSJamin Lin     /* Check result of computation */
34962db9a7bSJamin Lin     g_assert_cmpmem(digest, sizeof(digest),
35062db9a7bSJamin Lin                     test_result_sg_sha256, sizeof(digest));
35162db9a7bSJamin Lin 
35262db9a7bSJamin Lin     qtest_quit(s);
35362db9a7bSJamin Lin }
35462db9a7bSJamin Lin 
aspeed_test_sha384_sg(const char * machine,const uint32_t base,const uint64_t src_addr)355d21eb132SJamin Lin void aspeed_test_sha384_sg(const char *machine, const uint32_t base,
356080a8325SJamin Lin                            const uint64_t src_addr)
357d21eb132SJamin Lin {
358d21eb132SJamin Lin     QTestState *s = qtest_init(machine);
359d21eb132SJamin Lin 
360080a8325SJamin Lin     const uint64_t src_addr_1 = src_addr + 0x10000;
361080a8325SJamin Lin     const uint64_t src_addr_2 = src_addr + 0x20000;
362080a8325SJamin Lin     const uint64_t src_addr_3 = src_addr + 0x30000;
363080a8325SJamin Lin     const uint64_t digest_addr = src_addr + 0x40000;
364d21eb132SJamin Lin     uint8_t digest[sizeof(test_result_sg_sha384)] = {0};
365d21eb132SJamin Lin     struct AspeedSgList array[] = {
366d21eb132SJamin Lin         {  cpu_to_le32(sizeof(test_vector_sg1)),
367080a8325SJamin Lin            cpu_to_le64(src_addr_1) },
368d21eb132SJamin Lin         {  cpu_to_le32(sizeof(test_vector_sg2)),
369080a8325SJamin Lin            cpu_to_le64(src_addr_2) },
370d21eb132SJamin Lin         {  cpu_to_le32(sizeof(test_vector_sg3) | SG_LIST_LEN_LAST),
371080a8325SJamin Lin            cpu_to_le64(src_addr_3) },
372d21eb132SJamin Lin     };
373d21eb132SJamin Lin 
374d21eb132SJamin Lin     /* Check engine is idle, no busy or irq bits set */
375d21eb132SJamin Lin     g_assert_cmphex(qtest_readl(s, base + HACE_STS), ==, 0);
376d21eb132SJamin Lin 
377d21eb132SJamin Lin     /* Write test vector into memory */
378d21eb132SJamin Lin     qtest_memwrite(s, src_addr_1, test_vector_sg1, sizeof(test_vector_sg1));
379d21eb132SJamin Lin     qtest_memwrite(s, src_addr_2, test_vector_sg2, sizeof(test_vector_sg2));
380d21eb132SJamin Lin     qtest_memwrite(s, src_addr_3, test_vector_sg3, sizeof(test_vector_sg3));
381d21eb132SJamin Lin     qtest_memwrite(s, src_addr, array, sizeof(array));
382d21eb132SJamin Lin 
383d21eb132SJamin Lin     write_regs(s, base, src_addr,
384d21eb132SJamin Lin                (sizeof(test_vector_sg1)
385d21eb132SJamin Lin                 + sizeof(test_vector_sg2)
386d21eb132SJamin Lin                 + sizeof(test_vector_sg3)),
387d21eb132SJamin Lin                digest_addr, HACE_ALGO_SHA384 | HACE_SG_EN);
388d21eb132SJamin Lin 
389d21eb132SJamin Lin     /* Check hash IRQ status is asserted */
390d21eb132SJamin Lin     g_assert_cmphex(qtest_readl(s, base + HACE_STS), ==, 0x00000200);
391d21eb132SJamin Lin 
392d21eb132SJamin Lin     /* Clear IRQ status and check status is deasserted */
393d21eb132SJamin Lin     qtest_writel(s, base + HACE_STS, 0x00000200);
394d21eb132SJamin Lin     g_assert_cmphex(qtest_readl(s, base + HACE_STS), ==, 0);
395d21eb132SJamin Lin 
396d21eb132SJamin Lin     /* Read computed digest from memory */
397d21eb132SJamin Lin     qtest_memread(s, digest_addr, digest, sizeof(digest));
398d21eb132SJamin Lin 
399d21eb132SJamin Lin     /* Check result of computation */
400d21eb132SJamin Lin     g_assert_cmpmem(digest, sizeof(digest),
401d21eb132SJamin Lin                     test_result_sg_sha384, sizeof(digest));
402d21eb132SJamin Lin 
403d21eb132SJamin Lin     qtest_quit(s);
404d21eb132SJamin Lin }
405d21eb132SJamin Lin 
aspeed_test_sha512_sg(const char * machine,const uint32_t base,const uint64_t src_addr)40662db9a7bSJamin Lin void aspeed_test_sha512_sg(const char *machine, const uint32_t base,
407080a8325SJamin Lin                            const uint64_t src_addr)
40862db9a7bSJamin Lin {
40962db9a7bSJamin Lin     QTestState *s = qtest_init(machine);
41062db9a7bSJamin Lin 
411080a8325SJamin Lin     const uint64_t src_addr_1 = src_addr + 0x10000;
412080a8325SJamin Lin     const uint64_t src_addr_2 = src_addr + 0x20000;
413080a8325SJamin Lin     const uint64_t src_addr_3 = src_addr + 0x30000;
414080a8325SJamin Lin     const uint64_t digest_addr = src_addr + 0x40000;
41562db9a7bSJamin Lin     uint8_t digest[64] = {0};
41662db9a7bSJamin Lin     struct AspeedSgList array[] = {
41762db9a7bSJamin Lin         {  cpu_to_le32(sizeof(test_vector_sg1)),
418080a8325SJamin Lin            cpu_to_le64(src_addr_1) },
41962db9a7bSJamin Lin         {  cpu_to_le32(sizeof(test_vector_sg2)),
420080a8325SJamin Lin            cpu_to_le64(src_addr_2) },
42162db9a7bSJamin Lin         {  cpu_to_le32(sizeof(test_vector_sg3) | SG_LIST_LEN_LAST),
422080a8325SJamin Lin            cpu_to_le64(src_addr_3) },
42362db9a7bSJamin Lin     };
42462db9a7bSJamin Lin 
42562db9a7bSJamin Lin     /* Check engine is idle, no busy or irq bits set */
42662db9a7bSJamin Lin     g_assert_cmphex(qtest_readl(s, base + HACE_STS), ==, 0);
42762db9a7bSJamin Lin 
42862db9a7bSJamin Lin     /* Write test vector into memory */
42962db9a7bSJamin Lin     qtest_memwrite(s, src_addr_1, test_vector_sg1, sizeof(test_vector_sg1));
43062db9a7bSJamin Lin     qtest_memwrite(s, src_addr_2, test_vector_sg2, sizeof(test_vector_sg2));
43162db9a7bSJamin Lin     qtest_memwrite(s, src_addr_3, test_vector_sg3, sizeof(test_vector_sg3));
43262db9a7bSJamin Lin     qtest_memwrite(s, src_addr, array, sizeof(array));
43362db9a7bSJamin Lin 
43462db9a7bSJamin Lin     write_regs(s, base, src_addr,
43562db9a7bSJamin Lin                (sizeof(test_vector_sg1)
43662db9a7bSJamin Lin                 + sizeof(test_vector_sg2)
43762db9a7bSJamin Lin                 + sizeof(test_vector_sg3)),
43862db9a7bSJamin Lin                digest_addr, HACE_ALGO_SHA512 | HACE_SG_EN);
43962db9a7bSJamin Lin 
44062db9a7bSJamin Lin     /* Check hash IRQ status is asserted */
44162db9a7bSJamin Lin     g_assert_cmphex(qtest_readl(s, base + HACE_STS), ==, 0x00000200);
44262db9a7bSJamin Lin 
44362db9a7bSJamin Lin     /* Clear IRQ status and check status is deasserted */
44462db9a7bSJamin Lin     qtest_writel(s, base + HACE_STS, 0x00000200);
44562db9a7bSJamin Lin     g_assert_cmphex(qtest_readl(s, base + HACE_STS), ==, 0);
44662db9a7bSJamin Lin 
44762db9a7bSJamin Lin     /* Read computed digest from memory */
44862db9a7bSJamin Lin     qtest_memread(s, digest_addr, digest, sizeof(digest));
44962db9a7bSJamin Lin 
45062db9a7bSJamin Lin     /* Check result of computation */
45162db9a7bSJamin Lin     g_assert_cmpmem(digest, sizeof(digest),
45262db9a7bSJamin Lin                     test_result_sg_sha512, sizeof(digest));
45362db9a7bSJamin Lin 
45462db9a7bSJamin Lin     qtest_quit(s);
45562db9a7bSJamin Lin }
45662db9a7bSJamin Lin 
aspeed_test_sha256_accum(const char * machine,const uint32_t base,const uint64_t src_addr)45762db9a7bSJamin Lin void aspeed_test_sha256_accum(const char *machine, const uint32_t base,
458080a8325SJamin Lin                               const uint64_t src_addr)
45962db9a7bSJamin Lin {
46062db9a7bSJamin Lin     QTestState *s = qtest_init(machine);
46162db9a7bSJamin Lin 
462080a8325SJamin Lin     const uint64_t buffer_addr = src_addr + 0x10000;
463080a8325SJamin Lin     const uint64_t digest_addr = src_addr + 0x40000;
46462db9a7bSJamin Lin     uint8_t digest[32] = {0};
46562db9a7bSJamin Lin     struct AspeedSgList array[] = {
46662db9a7bSJamin Lin         {  cpu_to_le32(sizeof(test_vector_accum_256) | SG_LIST_LEN_LAST),
467080a8325SJamin Lin            cpu_to_le64(buffer_addr) },
46862db9a7bSJamin Lin     };
46962db9a7bSJamin Lin 
47062db9a7bSJamin Lin     /* Check engine is idle, no busy or irq bits set */
47162db9a7bSJamin Lin     g_assert_cmphex(qtest_readl(s, base + HACE_STS), ==, 0);
47262db9a7bSJamin Lin 
47362db9a7bSJamin Lin     /* Write test vector into memory */
47462db9a7bSJamin Lin     qtest_memwrite(s, buffer_addr, test_vector_accum_256,
47562db9a7bSJamin Lin                    sizeof(test_vector_accum_256));
47662db9a7bSJamin Lin     qtest_memwrite(s, src_addr, array, sizeof(array));
47762db9a7bSJamin Lin 
47862db9a7bSJamin Lin     write_regs(s, base, src_addr, sizeof(test_vector_accum_256),
47962db9a7bSJamin Lin                digest_addr, HACE_ALGO_SHA256 | HACE_SG_EN | HACE_ACCUM_EN);
48062db9a7bSJamin Lin 
48162db9a7bSJamin Lin     /* Check hash IRQ status is asserted */
48262db9a7bSJamin Lin     g_assert_cmphex(qtest_readl(s, base + HACE_STS), ==, 0x00000200);
48362db9a7bSJamin Lin 
48462db9a7bSJamin Lin     /* Clear IRQ status and check status is deasserted */
48562db9a7bSJamin Lin     qtest_writel(s, base + HACE_STS, 0x00000200);
48662db9a7bSJamin Lin     g_assert_cmphex(qtest_readl(s, base + HACE_STS), ==, 0);
48762db9a7bSJamin Lin 
48862db9a7bSJamin Lin     /* Read computed digest from memory */
48962db9a7bSJamin Lin     qtest_memread(s, digest_addr, digest, sizeof(digest));
49062db9a7bSJamin Lin 
49162db9a7bSJamin Lin     /* Check result of computation */
49262db9a7bSJamin Lin     g_assert_cmpmem(digest, sizeof(digest),
49362db9a7bSJamin Lin                     test_result_accum_sha256, sizeof(digest));
49462db9a7bSJamin Lin 
49562db9a7bSJamin Lin     qtest_quit(s);
49662db9a7bSJamin Lin }
49762db9a7bSJamin Lin 
aspeed_test_sha384_accum(const char * machine,const uint32_t base,const uint64_t src_addr)498d21eb132SJamin Lin void aspeed_test_sha384_accum(const char *machine, const uint32_t base,
499080a8325SJamin Lin                               const uint64_t src_addr)
500d21eb132SJamin Lin {
501d21eb132SJamin Lin     QTestState *s = qtest_init(machine);
502d21eb132SJamin Lin 
503080a8325SJamin Lin     const uint64_t buffer_addr = src_addr + 0x10000;
504080a8325SJamin Lin     const uint64_t digest_addr = src_addr + 0x40000;
505d21eb132SJamin Lin     uint8_t digest[sizeof(test_result_accum_sha384)] = {0};
506d21eb132SJamin Lin     struct AspeedSgList array[] = {
507d21eb132SJamin Lin         {  cpu_to_le32(sizeof(test_vector_accum_384) | SG_LIST_LEN_LAST),
508080a8325SJamin Lin            cpu_to_le64(buffer_addr) },
509d21eb132SJamin Lin     };
510d21eb132SJamin Lin 
511d21eb132SJamin Lin     /* Check engine is idle, no busy or irq bits set */
512d21eb132SJamin Lin     g_assert_cmphex(qtest_readl(s, base + HACE_STS), ==, 0);
513d21eb132SJamin Lin 
514d21eb132SJamin Lin     /* Write test vector into memory */
515d21eb132SJamin Lin     qtest_memwrite(s, buffer_addr, test_vector_accum_384,
516d21eb132SJamin Lin                    sizeof(test_vector_accum_384));
517d21eb132SJamin Lin     qtest_memwrite(s, src_addr, array, sizeof(array));
518d21eb132SJamin Lin 
519d21eb132SJamin Lin     write_regs(s, base, src_addr, sizeof(test_vector_accum_384),
520d21eb132SJamin Lin                digest_addr, HACE_ALGO_SHA384 | HACE_SG_EN | HACE_ACCUM_EN);
521d21eb132SJamin Lin 
522d21eb132SJamin Lin     /* Check hash IRQ status is asserted */
523d21eb132SJamin Lin     g_assert_cmphex(qtest_readl(s, base + HACE_STS), ==, 0x00000200);
524d21eb132SJamin Lin 
525d21eb132SJamin Lin     /* Clear IRQ status and check status is deasserted */
526d21eb132SJamin Lin     qtest_writel(s, base + HACE_STS, 0x00000200);
527d21eb132SJamin Lin     g_assert_cmphex(qtest_readl(s, base + HACE_STS), ==, 0);
528d21eb132SJamin Lin 
529d21eb132SJamin Lin     /* Read computed digest from memory */
530d21eb132SJamin Lin     qtest_memread(s, digest_addr, digest, sizeof(digest));
531d21eb132SJamin Lin 
532d21eb132SJamin Lin     /* Check result of computation */
533d21eb132SJamin Lin     g_assert_cmpmem(digest, sizeof(digest),
534d21eb132SJamin Lin                     test_result_accum_sha384, sizeof(digest));
535d21eb132SJamin Lin 
536d21eb132SJamin Lin     qtest_quit(s);
537d21eb132SJamin Lin }
538d21eb132SJamin Lin 
aspeed_test_sha512_accum(const char * machine,const uint32_t base,const uint64_t src_addr)53962db9a7bSJamin Lin void aspeed_test_sha512_accum(const char *machine, const uint32_t base,
540080a8325SJamin Lin                               const uint64_t src_addr)
54162db9a7bSJamin Lin {
54262db9a7bSJamin Lin     QTestState *s = qtest_init(machine);
54362db9a7bSJamin Lin 
544080a8325SJamin Lin     const uint64_t buffer_addr = src_addr + 0x10000;
545080a8325SJamin Lin     const uint64_t digest_addr = src_addr + 0x40000;
54662db9a7bSJamin Lin     uint8_t digest[64] = {0};
54762db9a7bSJamin Lin     struct AspeedSgList array[] = {
54862db9a7bSJamin Lin         {  cpu_to_le32(sizeof(test_vector_accum_512) | SG_LIST_LEN_LAST),
549080a8325SJamin Lin            cpu_to_le64(buffer_addr) },
55062db9a7bSJamin Lin     };
55162db9a7bSJamin Lin 
55262db9a7bSJamin Lin     /* Check engine is idle, no busy or irq bits set */
55362db9a7bSJamin Lin     g_assert_cmphex(qtest_readl(s, base + HACE_STS), ==, 0);
55462db9a7bSJamin Lin 
55562db9a7bSJamin Lin     /* Write test vector into memory */
55662db9a7bSJamin Lin     qtest_memwrite(s, buffer_addr, test_vector_accum_512,
55762db9a7bSJamin Lin                    sizeof(test_vector_accum_512));
55862db9a7bSJamin Lin     qtest_memwrite(s, src_addr, array, sizeof(array));
55962db9a7bSJamin Lin 
56062db9a7bSJamin Lin     write_regs(s, base, src_addr, sizeof(test_vector_accum_512),
56162db9a7bSJamin Lin                digest_addr, HACE_ALGO_SHA512 | HACE_SG_EN | HACE_ACCUM_EN);
56262db9a7bSJamin Lin 
56362db9a7bSJamin Lin     /* Check hash IRQ status is asserted */
56462db9a7bSJamin Lin     g_assert_cmphex(qtest_readl(s, base + HACE_STS), ==, 0x00000200);
56562db9a7bSJamin Lin 
56662db9a7bSJamin Lin     /* Clear IRQ status and check status is deasserted */
56762db9a7bSJamin Lin     qtest_writel(s, base + HACE_STS, 0x00000200);
56862db9a7bSJamin Lin     g_assert_cmphex(qtest_readl(s, base + HACE_STS), ==, 0);
56962db9a7bSJamin Lin 
57062db9a7bSJamin Lin     /* Read computed digest from memory */
57162db9a7bSJamin Lin     qtest_memread(s, digest_addr, digest, sizeof(digest));
57262db9a7bSJamin Lin 
57362db9a7bSJamin Lin     /* Check result of computation */
57462db9a7bSJamin Lin     g_assert_cmpmem(digest, sizeof(digest),
57562db9a7bSJamin Lin                     test_result_accum_sha512, sizeof(digest));
57662db9a7bSJamin Lin 
57762db9a7bSJamin Lin     qtest_quit(s);
57862db9a7bSJamin Lin }
57962db9a7bSJamin Lin 
aspeed_test_addresses(const char * machine,const uint32_t base,const struct AspeedMasks * expected)58062db9a7bSJamin Lin void aspeed_test_addresses(const char *machine, const uint32_t base,
58162db9a7bSJamin Lin                            const struct AspeedMasks *expected)
58262db9a7bSJamin Lin {
58362db9a7bSJamin Lin     QTestState *s = qtest_init(machine);
58462db9a7bSJamin Lin 
58562db9a7bSJamin Lin     /*
58662db9a7bSJamin Lin      * Check command mode is zero, meaning engine is in direct access mode,
58762db9a7bSJamin Lin      * as this affects the masking behavior of the HASH_SRC register.
58862db9a7bSJamin Lin      */
58962db9a7bSJamin Lin     g_assert_cmphex(qtest_readl(s, base + HACE_CMD), ==, 0);
59062db9a7bSJamin Lin     g_assert_cmphex(qtest_readl(s, base + HACE_HASH_SRC), ==, 0);
591cd9104e7SJamin Lin     g_assert_cmphex(qtest_readl(s, base + HACE_HASH_SRC_HI), ==, 0);
59262db9a7bSJamin Lin     g_assert_cmphex(qtest_readl(s, base + HACE_HASH_DIGEST), ==, 0);
593cd9104e7SJamin Lin     g_assert_cmphex(qtest_readl(s, base + HACE_HASH_DIGEST_HI), ==, 0);
594*0ddc4dc3SJamin Lin     g_assert_cmphex(qtest_readl(s, base + HACE_HASH_KEY_BUFF), ==, 0);
595*0ddc4dc3SJamin Lin     g_assert_cmphex(qtest_readl(s, base + HACE_HASH_KEY_BUFF_HI), ==, 0);
59662db9a7bSJamin Lin     g_assert_cmphex(qtest_readl(s, base + HACE_HASH_DATA_LEN), ==, 0);
59762db9a7bSJamin Lin 
59862db9a7bSJamin Lin     /* Check that the address masking is correct */
59962db9a7bSJamin Lin     qtest_writel(s, base + HACE_HASH_SRC, 0xffffffff);
60062db9a7bSJamin Lin     g_assert_cmphex(qtest_readl(s, base + HACE_HASH_SRC), ==, expected->src);
60162db9a7bSJamin Lin 
602cd9104e7SJamin Lin     qtest_writel(s, base + HACE_HASH_SRC_HI, 0xffffffff);
603cd9104e7SJamin Lin     g_assert_cmphex(qtest_readl(s, base + HACE_HASH_SRC_HI),
604cd9104e7SJamin Lin                     ==, expected->src_hi);
605cd9104e7SJamin Lin 
60662db9a7bSJamin Lin     qtest_writel(s, base + HACE_HASH_DIGEST, 0xffffffff);
60762db9a7bSJamin Lin     g_assert_cmphex(qtest_readl(s, base + HACE_HASH_DIGEST), ==,
60862db9a7bSJamin Lin                     expected->dest);
60962db9a7bSJamin Lin 
610cd9104e7SJamin Lin     qtest_writel(s, base + HACE_HASH_DIGEST_HI, 0xffffffff);
611cd9104e7SJamin Lin     g_assert_cmphex(qtest_readl(s, base + HACE_HASH_DIGEST_HI), ==,
612cd9104e7SJamin Lin                     expected->dest_hi);
613cd9104e7SJamin Lin 
614*0ddc4dc3SJamin Lin     qtest_writel(s, base + HACE_HASH_KEY_BUFF, 0xffffffff);
615*0ddc4dc3SJamin Lin     g_assert_cmphex(qtest_readl(s, base + HACE_HASH_KEY_BUFF), ==,
616*0ddc4dc3SJamin Lin                     expected->key);
617*0ddc4dc3SJamin Lin 
618*0ddc4dc3SJamin Lin     qtest_writel(s, base + HACE_HASH_KEY_BUFF_HI, 0xffffffff);
619*0ddc4dc3SJamin Lin     g_assert_cmphex(qtest_readl(s, base + HACE_HASH_KEY_BUFF_HI), ==,
620*0ddc4dc3SJamin Lin                     expected->key_hi);
621*0ddc4dc3SJamin Lin 
62262db9a7bSJamin Lin     qtest_writel(s, base + HACE_HASH_DATA_LEN, 0xffffffff);
62362db9a7bSJamin Lin     g_assert_cmphex(qtest_readl(s, base + HACE_HASH_DATA_LEN), ==,
62462db9a7bSJamin Lin                     expected->len);
62562db9a7bSJamin Lin 
62662db9a7bSJamin Lin     /* Reset to zero */
62762db9a7bSJamin Lin     qtest_writel(s, base + HACE_HASH_SRC, 0);
628cd9104e7SJamin Lin     qtest_writel(s, base + HACE_HASH_SRC_HI, 0);
62962db9a7bSJamin Lin     qtest_writel(s, base + HACE_HASH_DIGEST, 0);
630cd9104e7SJamin Lin     qtest_writel(s, base + HACE_HASH_DIGEST_HI, 0);
631*0ddc4dc3SJamin Lin     qtest_writel(s, base + HACE_HASH_KEY_BUFF, 0);
632*0ddc4dc3SJamin Lin     qtest_writel(s, base + HACE_HASH_KEY_BUFF_HI, 0);
63362db9a7bSJamin Lin     qtest_writel(s, base + HACE_HASH_DATA_LEN, 0);
63462db9a7bSJamin Lin 
63562db9a7bSJamin Lin     /* Check that all bits are now zero */
63662db9a7bSJamin Lin     g_assert_cmphex(qtest_readl(s, base + HACE_HASH_SRC), ==, 0);
637cd9104e7SJamin Lin     g_assert_cmphex(qtest_readl(s, base + HACE_HASH_SRC_HI), ==, 0);
63862db9a7bSJamin Lin     g_assert_cmphex(qtest_readl(s, base + HACE_HASH_DIGEST), ==, 0);
639cd9104e7SJamin Lin     g_assert_cmphex(qtest_readl(s, base + HACE_HASH_DIGEST_HI), ==, 0);
640*0ddc4dc3SJamin Lin     g_assert_cmphex(qtest_readl(s, base + HACE_HASH_KEY_BUFF), ==, 0);
641*0ddc4dc3SJamin Lin     g_assert_cmphex(qtest_readl(s, base + HACE_HASH_KEY_BUFF_HI), ==, 0);
64262db9a7bSJamin Lin     g_assert_cmphex(qtest_readl(s, base + HACE_HASH_DATA_LEN), ==, 0);
64362db9a7bSJamin Lin 
64462db9a7bSJamin Lin     qtest_quit(s);
64562db9a7bSJamin Lin }
64662db9a7bSJamin Lin 
647