xref: /qemu/tests/qtest/aspeed-hace-utils.c (revision 80db93b2b88f9b3ed8927ae7ac74ca30e643a83e)
170985b0eSJamin Lin /*
270985b0eSJamin Lin  * QTest testcase for the ASPEED Hash and Crypto Engine
370985b0eSJamin Lin  *
470985b0eSJamin Lin  * SPDX-License-Identifier: GPL-2.0-or-later
570985b0eSJamin Lin  * Copyright 2021 IBM Corp.
670985b0eSJamin Lin  */
770985b0eSJamin Lin 
870985b0eSJamin Lin #include "qemu/osdep.h"
970985b0eSJamin Lin #include "libqtest.h"
1070985b0eSJamin Lin #include "qemu/bitops.h"
1170985b0eSJamin Lin #include "aspeed-hace-utils.h"
1270985b0eSJamin Lin 
1370985b0eSJamin Lin /*
1470985b0eSJamin Lin  * Test vector is the ascii "abc"
1570985b0eSJamin Lin  *
1670985b0eSJamin Lin  * Expected results were generated using command line utitiles:
1770985b0eSJamin Lin  *
1870985b0eSJamin Lin  *  echo -n -e 'abc' | dd of=/tmp/test
193c13be86SJamin Lin  *  for hash in sha512sum sha384sum sha256sum md5sum; do $hash /tmp/test; done
2070985b0eSJamin Lin  *
2170985b0eSJamin Lin  */
2233627ab2SJamin Lin static const uint8_t test_vector[3] = {0x61, 0x62, 0x63};
2370985b0eSJamin Lin 
2433627ab2SJamin Lin static const uint8_t test_result_sha512[64] = {
2570985b0eSJamin Lin     0xdd, 0xaf, 0x35, 0xa1, 0x93, 0x61, 0x7a, 0xba, 0xcc, 0x41, 0x73, 0x49,
2670985b0eSJamin Lin     0xae, 0x20, 0x41, 0x31, 0x12, 0xe6, 0xfa, 0x4e, 0x89, 0xa9, 0x7e, 0xa2,
2770985b0eSJamin Lin     0x0a, 0x9e, 0xee, 0xe6, 0x4b, 0x55, 0xd3, 0x9a, 0x21, 0x92, 0x99, 0x2a,
2870985b0eSJamin Lin     0x27, 0x4f, 0xc1, 0xa8, 0x36, 0xba, 0x3c, 0x23, 0xa3, 0xfe, 0xeb, 0xbd,
2970985b0eSJamin Lin     0x45, 0x4d, 0x44, 0x23, 0x64, 0x3c, 0xe8, 0x0e, 0x2a, 0x9a, 0xc9, 0x4f,
3070985b0eSJamin Lin     0xa5, 0x4c, 0xa4, 0x9f};
3170985b0eSJamin Lin 
323c13be86SJamin Lin static const uint8_t test_result_sha384[48] = {
333c13be86SJamin Lin     0xcb, 0x00, 0x75, 0x3f, 0x45, 0xa3, 0x5e, 0x8b, 0xb5, 0xa0, 0x3d, 0x69,
343c13be86SJamin Lin     0x9a, 0xc6, 0x50, 0x07, 0x27, 0x2c, 0x32, 0xab, 0x0e, 0xde, 0xd1, 0x63,
353c13be86SJamin Lin     0x1a, 0x8b, 0x60, 0x5a, 0x43, 0xff, 0x5b, 0xed, 0x80, 0x86, 0x07, 0x2b,
363c13be86SJamin Lin     0xa1, 0xe7, 0xcc, 0x23, 0x58, 0xba, 0xec, 0xa1, 0x34, 0xc8, 0x25, 0xa7};
373c13be86SJamin Lin 
3833627ab2SJamin Lin static const uint8_t test_result_sha256[32] = {
3970985b0eSJamin Lin     0xba, 0x78, 0x16, 0xbf, 0x8f, 0x01, 0xcf, 0xea, 0x41, 0x41, 0x40, 0xde,
4070985b0eSJamin Lin     0x5d, 0xae, 0x22, 0x23, 0xb0, 0x03, 0x61, 0xa3, 0x96, 0x17, 0x7a, 0x9c,
4170985b0eSJamin Lin     0xb4, 0x10, 0xff, 0x61, 0xf2, 0x00, 0x15, 0xad};
4270985b0eSJamin Lin 
4333627ab2SJamin Lin static const uint8_t test_result_md5[16] = {
4470985b0eSJamin Lin     0x90, 0x01, 0x50, 0x98, 0x3c, 0xd2, 0x4f, 0xb0, 0xd6, 0x96, 0x3f, 0x7d,
4570985b0eSJamin Lin     0x28, 0xe1, 0x7f, 0x72};
4670985b0eSJamin Lin 
4770985b0eSJamin Lin /*
4870985b0eSJamin Lin  * The Scatter-Gather Test vector is the ascii "abc" "def" "ghi", broken
4970985b0eSJamin Lin  * into blocks of 3 characters as shown
5070985b0eSJamin Lin  *
5170985b0eSJamin Lin  * Expected results were generated using command line utitiles:
5270985b0eSJamin Lin  *
5370985b0eSJamin Lin  *  echo -n -e 'abcdefghijkl' | dd of=/tmp/test
543c13be86SJamin Lin  *  for hash in sha512sum sha384sum sha256sum; do $hash /tmp/test; done
5570985b0eSJamin Lin  *
5670985b0eSJamin Lin  */
5733627ab2SJamin Lin static const uint8_t test_vector_sg1[6] = {0x61, 0x62, 0x63, 0x64, 0x65, 0x66};
5833627ab2SJamin Lin static const uint8_t test_vector_sg2[3] = {0x67, 0x68, 0x69};
5933627ab2SJamin Lin static const uint8_t test_vector_sg3[3] = {0x6a, 0x6b, 0x6c};
6070985b0eSJamin Lin 
6133627ab2SJamin Lin static const uint8_t test_result_sg_sha512[64] = {
6270985b0eSJamin Lin     0x17, 0x80, 0x7c, 0x72, 0x8e, 0xe3, 0xba, 0x35, 0xe7, 0xcf, 0x7a, 0xf8,
6370985b0eSJamin Lin     0x23, 0x11, 0x6d, 0x26, 0xe4, 0x1e, 0x5d, 0x4d, 0x6c, 0x2f, 0xf1, 0xf3,
6470985b0eSJamin Lin     0x72, 0x0d, 0x3d, 0x96, 0xaa, 0xcb, 0x6f, 0x69, 0xde, 0x64, 0x2e, 0x63,
6570985b0eSJamin Lin     0xd5, 0xb7, 0x3f, 0xc3, 0x96, 0xc1, 0x2b, 0xe3, 0x8b, 0x2b, 0xd5, 0xd8,
6670985b0eSJamin Lin     0x84, 0x25, 0x7c, 0x32, 0xc8, 0xf6, 0xd0, 0x85, 0x4a, 0xe6, 0xb5, 0x40,
6770985b0eSJamin Lin     0xf8, 0x6d, 0xda, 0x2e};
6870985b0eSJamin Lin 
693c13be86SJamin Lin static const uint8_t test_result_sg_sha384[48] = {
703c13be86SJamin Lin     0x10, 0x3c, 0xa9, 0x6c, 0x06, 0xa1, 0xce, 0x79, 0x8f, 0x08, 0xf8, 0xef,
713c13be86SJamin Lin     0xf0, 0xdf, 0xb0, 0xcc, 0xdb, 0x56, 0x7d, 0x48, 0xb2, 0x85, 0xb2, 0x3d,
723c13be86SJamin Lin     0x0c, 0xd7, 0x73, 0x45, 0x46, 0x67, 0xa3, 0xc2, 0xfa, 0x5f, 0x1b, 0x58,
733c13be86SJamin Lin     0xd9, 0xcd, 0xf2, 0x32, 0x9b, 0xd9, 0x97, 0x97, 0x30, 0xbf, 0xaa, 0xff};
743c13be86SJamin Lin 
7533627ab2SJamin Lin static const uint8_t test_result_sg_sha256[32] = {
7670985b0eSJamin Lin     0xd6, 0x82, 0xed, 0x4c, 0xa4, 0xd9, 0x89, 0xc1, 0x34, 0xec, 0x94, 0xf1,
7770985b0eSJamin Lin     0x55, 0x1e, 0x1e, 0xc5, 0x80, 0xdd, 0x6d, 0x5a, 0x6e, 0xcd, 0xe9, 0xf3,
7870985b0eSJamin Lin     0xd3, 0x5e, 0x6e, 0x4a, 0x71, 0x7f, 0xbd, 0xe4};
7970985b0eSJamin Lin 
8070985b0eSJamin Lin /*
8170985b0eSJamin Lin  * The accumulative mode requires firmware to provide internal initial state
8270985b0eSJamin Lin  * and message padding (including length L at the end of padding).
8370985b0eSJamin Lin  *
8470985b0eSJamin Lin  * This test vector is a ascii text "abc" with padding message.
8570985b0eSJamin Lin  *
8670985b0eSJamin Lin  * Expected results were generated using command line utitiles:
8770985b0eSJamin Lin  *
8870985b0eSJamin Lin  *  echo -n -e 'abc' | dd of=/tmp/test
893c13be86SJamin Lin  *  for hash in sha512sum sha384sum sha256sum; do $hash /tmp/test; done
9070985b0eSJamin Lin  */
9133627ab2SJamin Lin static const uint8_t test_vector_accum_512[128] = {
9270985b0eSJamin Lin     0x61, 0x62, 0x63, 0x80, 0x00, 0x00, 0x00, 0x00,
9370985b0eSJamin Lin     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
9470985b0eSJamin Lin     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
9570985b0eSJamin Lin     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
9670985b0eSJamin Lin     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
9770985b0eSJamin Lin     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
9870985b0eSJamin Lin     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
9970985b0eSJamin Lin     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
10070985b0eSJamin Lin     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
10170985b0eSJamin Lin     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
10270985b0eSJamin Lin     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
10370985b0eSJamin Lin     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
10470985b0eSJamin Lin     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
10570985b0eSJamin Lin     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
10670985b0eSJamin Lin     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
10770985b0eSJamin Lin     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18};
10870985b0eSJamin Lin 
1093c13be86SJamin Lin static const uint8_t test_vector_accum_384[128] = {
1103c13be86SJamin Lin     0x61, 0x62, 0x63, 0x80, 0x00, 0x00, 0x00, 0x00,
1113c13be86SJamin Lin     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1123c13be86SJamin Lin     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1133c13be86SJamin Lin     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1143c13be86SJamin Lin     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1153c13be86SJamin Lin     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1163c13be86SJamin Lin     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1173c13be86SJamin Lin     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1183c13be86SJamin Lin     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1193c13be86SJamin Lin     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1203c13be86SJamin Lin     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1213c13be86SJamin Lin     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1223c13be86SJamin Lin     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1233c13be86SJamin Lin     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1243c13be86SJamin Lin     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1253c13be86SJamin Lin     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18};
1263c13be86SJamin Lin 
12733627ab2SJamin Lin static const uint8_t test_vector_accum_256[64] = {
12870985b0eSJamin Lin     0x61, 0x62, 0x63, 0x80, 0x00, 0x00, 0x00, 0x00,
12970985b0eSJamin Lin     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
13070985b0eSJamin Lin     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
13170985b0eSJamin Lin     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
13270985b0eSJamin Lin     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
13370985b0eSJamin Lin     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
13470985b0eSJamin Lin     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
13570985b0eSJamin Lin     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18};
13670985b0eSJamin Lin 
13733627ab2SJamin Lin static const uint8_t test_result_accum_sha512[64] = {
13870985b0eSJamin Lin     0xdd, 0xaf, 0x35, 0xa1, 0x93, 0x61, 0x7a, 0xba, 0xcc, 0x41, 0x73, 0x49,
13970985b0eSJamin Lin     0xae, 0x20, 0x41, 0x31, 0x12, 0xe6, 0xfa, 0x4e, 0x89, 0xa9, 0x7e, 0xa2,
14070985b0eSJamin Lin     0x0a, 0x9e, 0xee, 0xe6, 0x4b, 0x55, 0xd3, 0x9a, 0x21, 0x92, 0x99, 0x2a,
14170985b0eSJamin Lin     0x27, 0x4f, 0xc1, 0xa8, 0x36, 0xba, 0x3c, 0x23, 0xa3, 0xfe, 0xeb, 0xbd,
14270985b0eSJamin Lin     0x45, 0x4d, 0x44, 0x23, 0x64, 0x3c, 0xe8, 0x0e, 0x2a, 0x9a, 0xc9, 0x4f,
14370985b0eSJamin Lin     0xa5, 0x4c, 0xa4, 0x9f};
14470985b0eSJamin Lin 
1453c13be86SJamin Lin static const uint8_t test_result_accum_sha384[48] = {
1463c13be86SJamin Lin     0xcb, 0x00, 0x75, 0x3f, 0x45, 0xa3, 0x5e, 0x8b, 0xb5, 0xa0, 0x3d, 0x69,
1473c13be86SJamin Lin     0x9a, 0xc6, 0x50, 0x07, 0x27, 0x2c, 0x32, 0xab, 0x0e, 0xde, 0xd1, 0x63,
1483c13be86SJamin Lin     0x1a, 0x8b, 0x60, 0x5a, 0x43, 0xff, 0x5b, 0xed, 0x80, 0x86, 0x07, 0x2b,
1493c13be86SJamin Lin     0xa1, 0xe7, 0xcc, 0x23, 0x58, 0xba, 0xec, 0xa1, 0x34, 0xc8, 0x25, 0xa7};
1503c13be86SJamin Lin 
15133627ab2SJamin Lin static const uint8_t test_result_accum_sha256[32] = {
15270985b0eSJamin Lin     0xba, 0x78, 0x16, 0xbf, 0x8f, 0x01, 0xcf, 0xea, 0x41, 0x41, 0x40, 0xde,
15370985b0eSJamin Lin     0x5d, 0xae, 0x22, 0x23, 0xb0, 0x03, 0x61, 0xa3, 0x96, 0x17, 0x7a, 0x9c,
15470985b0eSJamin Lin     0xb4, 0x10, 0xff, 0x61, 0xf2, 0x00, 0x15, 0xad};
15570985b0eSJamin Lin 
write_regs(QTestState * s,uint32_t base,uint64_t src,uint32_t length,uint64_t out,uint32_t method)156dcdbbd45SJamin Lin static void write_regs(QTestState *s, uint32_t base, uint64_t src,
157dcdbbd45SJamin Lin                        uint32_t length, uint64_t out, uint32_t method)
15870985b0eSJamin Lin {
159dcdbbd45SJamin Lin         qtest_writel(s, base + HACE_HASH_SRC, extract64(src, 0, 32));
1605ced818eSJamin Lin         qtest_writel(s, base + HACE_HASH_SRC_HI, extract64(src, 32, 32));
161dcdbbd45SJamin Lin         qtest_writel(s, base + HACE_HASH_DIGEST, extract64(out, 0, 32));
1625ced818eSJamin Lin         qtest_writel(s, base + HACE_HASH_DIGEST_HI, extract64(out, 32, 32));
16370985b0eSJamin Lin         qtest_writel(s, base + HACE_HASH_DATA_LEN, length);
16470985b0eSJamin Lin         qtest_writel(s, base + HACE_HASH_CMD, HACE_SHA_BE_EN | method);
16570985b0eSJamin Lin }
16670985b0eSJamin Lin 
aspeed_test_md5(const char * machine,const uint32_t base,const uint64_t src_addr)16770985b0eSJamin Lin void aspeed_test_md5(const char *machine, const uint32_t base,
168dcdbbd45SJamin Lin                      const uint64_t src_addr)
16970985b0eSJamin Lin 
17070985b0eSJamin Lin {
17170985b0eSJamin Lin     QTestState *s = qtest_init(machine);
17270985b0eSJamin Lin 
173dcdbbd45SJamin Lin     uint64_t digest_addr = src_addr + 0x010000;
17470985b0eSJamin Lin     uint8_t digest[16] = {0};
17570985b0eSJamin Lin 
17670985b0eSJamin Lin     /* Check engine is idle, no busy or irq bits set */
17770985b0eSJamin Lin     g_assert_cmphex(qtest_readl(s, base + HACE_STS), ==, 0);
17870985b0eSJamin Lin 
17970985b0eSJamin Lin     /* Write test vector into memory */
18070985b0eSJamin Lin     qtest_memwrite(s, src_addr, test_vector, sizeof(test_vector));
18170985b0eSJamin Lin 
18270985b0eSJamin Lin     write_regs(s, base, src_addr, sizeof(test_vector),
18370985b0eSJamin Lin                digest_addr, HACE_ALGO_MD5);
18470985b0eSJamin Lin 
18570985b0eSJamin Lin     /* Check hash IRQ status is asserted */
18670985b0eSJamin Lin     g_assert_cmphex(qtest_readl(s, base + HACE_STS), ==, 0x00000200);
18770985b0eSJamin Lin 
18870985b0eSJamin Lin     /* Clear IRQ status and check status is deasserted */
18970985b0eSJamin Lin     qtest_writel(s, base + HACE_STS, 0x00000200);
19070985b0eSJamin Lin     g_assert_cmphex(qtest_readl(s, base + HACE_STS), ==, 0);
19170985b0eSJamin Lin 
19270985b0eSJamin Lin     /* Read computed digest from memory */
19370985b0eSJamin Lin     qtest_memread(s, digest_addr, digest, sizeof(digest));
19470985b0eSJamin Lin 
19570985b0eSJamin Lin     /* Check result of computation */
19670985b0eSJamin Lin     g_assert_cmpmem(digest, sizeof(digest),
19770985b0eSJamin Lin                     test_result_md5, sizeof(digest));
19870985b0eSJamin Lin 
19970985b0eSJamin Lin     qtest_quit(s);
20070985b0eSJamin Lin }
20170985b0eSJamin Lin 
aspeed_test_sha256(const char * machine,const uint32_t base,const uint64_t src_addr)20270985b0eSJamin Lin void aspeed_test_sha256(const char *machine, const uint32_t base,
203dcdbbd45SJamin Lin                         const uint64_t src_addr)
20470985b0eSJamin Lin {
20570985b0eSJamin Lin     QTestState *s = qtest_init(machine);
20670985b0eSJamin Lin 
207dcdbbd45SJamin Lin     const uint64_t digest_addr = src_addr + 0x10000;
20870985b0eSJamin Lin     uint8_t digest[32] = {0};
20970985b0eSJamin Lin 
21070985b0eSJamin Lin     /* Check engine is idle, no busy or irq bits set */
21170985b0eSJamin Lin     g_assert_cmphex(qtest_readl(s, base + HACE_STS), ==, 0);
21270985b0eSJamin Lin 
21370985b0eSJamin Lin     /* Write test vector into memory */
21470985b0eSJamin Lin     qtest_memwrite(s, src_addr, test_vector, sizeof(test_vector));
21570985b0eSJamin Lin 
21670985b0eSJamin Lin     write_regs(s, base, src_addr, sizeof(test_vector), digest_addr,
21770985b0eSJamin Lin                HACE_ALGO_SHA256);
21870985b0eSJamin Lin 
21970985b0eSJamin Lin     /* Check hash IRQ status is asserted */
22070985b0eSJamin Lin     g_assert_cmphex(qtest_readl(s, base + HACE_STS), ==, 0x00000200);
22170985b0eSJamin Lin 
22270985b0eSJamin Lin     /* Clear IRQ status and check status is deasserted */
22370985b0eSJamin Lin     qtest_writel(s, base + HACE_STS, 0x00000200);
22470985b0eSJamin Lin     g_assert_cmphex(qtest_readl(s, base + HACE_STS), ==, 0);
22570985b0eSJamin Lin 
22670985b0eSJamin Lin     /* Read computed digest from memory */
22770985b0eSJamin Lin     qtest_memread(s, digest_addr, digest, sizeof(digest));
22870985b0eSJamin Lin 
22970985b0eSJamin Lin     /* Check result of computation */
23070985b0eSJamin Lin     g_assert_cmpmem(digest, sizeof(digest),
23170985b0eSJamin Lin                     test_result_sha256, sizeof(digest));
23270985b0eSJamin Lin 
23370985b0eSJamin Lin     qtest_quit(s);
23470985b0eSJamin Lin }
23570985b0eSJamin Lin 
aspeed_test_sha384(const char * machine,const uint32_t base,const uint64_t src_addr)2363c13be86SJamin Lin void aspeed_test_sha384(const char *machine, const uint32_t base,
237dcdbbd45SJamin Lin                         const uint64_t src_addr)
2383c13be86SJamin Lin {
2393c13be86SJamin Lin     QTestState *s = qtest_init(machine);
2403c13be86SJamin Lin 
241dcdbbd45SJamin Lin     const uint64_t digest_addr = src_addr + 0x10000;
2423c13be86SJamin Lin     uint8_t digest[48] = {0};
2433c13be86SJamin Lin 
2443c13be86SJamin Lin     /* Check engine is idle, no busy or irq bits set */
2453c13be86SJamin Lin     g_assert_cmphex(qtest_readl(s, base + HACE_STS), ==, 0);
2463c13be86SJamin Lin 
2473c13be86SJamin Lin     /* Write test vector into memory */
2483c13be86SJamin Lin     qtest_memwrite(s, src_addr, test_vector, sizeof(test_vector));
2493c13be86SJamin Lin 
2503c13be86SJamin Lin     write_regs(s, base, src_addr, sizeof(test_vector), digest_addr,
2513c13be86SJamin Lin                HACE_ALGO_SHA384);
2523c13be86SJamin Lin 
2533c13be86SJamin Lin     /* Check hash IRQ status is asserted */
2543c13be86SJamin Lin     g_assert_cmphex(qtest_readl(s, base + HACE_STS), ==, 0x00000200);
2553c13be86SJamin Lin 
2563c13be86SJamin Lin     /* Clear IRQ status and check status is deasserted */
2573c13be86SJamin Lin     qtest_writel(s, base + HACE_STS, 0x00000200);
2583c13be86SJamin Lin     g_assert_cmphex(qtest_readl(s, base + HACE_STS), ==, 0);
2593c13be86SJamin Lin 
2603c13be86SJamin Lin     /* Read computed digest from memory */
2613c13be86SJamin Lin     qtest_memread(s, digest_addr, digest, sizeof(digest));
2623c13be86SJamin Lin 
2633c13be86SJamin Lin     /* Check result of computation */
2643c13be86SJamin Lin     g_assert_cmpmem(digest, sizeof(digest),
2653c13be86SJamin Lin                     test_result_sha384, sizeof(digest));
2663c13be86SJamin Lin 
2673c13be86SJamin Lin     qtest_quit(s);
2683c13be86SJamin Lin }
2693c13be86SJamin Lin 
aspeed_test_sha512(const char * machine,const uint32_t base,const uint64_t src_addr)27070985b0eSJamin Lin void aspeed_test_sha512(const char *machine, const uint32_t base,
271dcdbbd45SJamin Lin                         const uint64_t src_addr)
27270985b0eSJamin Lin {
27370985b0eSJamin Lin     QTestState *s = qtest_init(machine);
27470985b0eSJamin Lin 
275dcdbbd45SJamin Lin     const uint64_t digest_addr = src_addr + 0x10000;
27670985b0eSJamin Lin     uint8_t digest[64] = {0};
27770985b0eSJamin Lin 
27870985b0eSJamin Lin     /* Check engine is idle, no busy or irq bits set */
27970985b0eSJamin Lin     g_assert_cmphex(qtest_readl(s, base + HACE_STS), ==, 0);
28070985b0eSJamin Lin 
28170985b0eSJamin Lin     /* Write test vector into memory */
28270985b0eSJamin Lin     qtest_memwrite(s, src_addr, test_vector, sizeof(test_vector));
28370985b0eSJamin Lin 
28470985b0eSJamin Lin     write_regs(s, base, src_addr, sizeof(test_vector), digest_addr,
28570985b0eSJamin Lin                HACE_ALGO_SHA512);
28670985b0eSJamin Lin 
28770985b0eSJamin Lin     /* Check hash IRQ status is asserted */
28870985b0eSJamin Lin     g_assert_cmphex(qtest_readl(s, base + HACE_STS), ==, 0x00000200);
28970985b0eSJamin Lin 
29070985b0eSJamin Lin     /* Clear IRQ status and check status is deasserted */
29170985b0eSJamin Lin     qtest_writel(s, base + HACE_STS, 0x00000200);
29270985b0eSJamin Lin     g_assert_cmphex(qtest_readl(s, base + HACE_STS), ==, 0);
29370985b0eSJamin Lin 
29470985b0eSJamin Lin     /* Read computed digest from memory */
29570985b0eSJamin Lin     qtest_memread(s, digest_addr, digest, sizeof(digest));
29670985b0eSJamin Lin 
29770985b0eSJamin Lin     /* Check result of computation */
29870985b0eSJamin Lin     g_assert_cmpmem(digest, sizeof(digest),
29970985b0eSJamin Lin                     test_result_sha512, sizeof(digest));
30070985b0eSJamin Lin 
30170985b0eSJamin Lin     qtest_quit(s);
30270985b0eSJamin Lin }
30370985b0eSJamin Lin 
aspeed_test_sha256_sg(const char * machine,const uint32_t base,const uint64_t src_addr)30470985b0eSJamin Lin void aspeed_test_sha256_sg(const char *machine, const uint32_t base,
305dcdbbd45SJamin Lin                            const uint64_t src_addr)
30670985b0eSJamin Lin {
30770985b0eSJamin Lin     QTestState *s = qtest_init(machine);
30870985b0eSJamin Lin 
309dcdbbd45SJamin Lin     const uint64_t src_addr_1 = src_addr + 0x10000;
310dcdbbd45SJamin Lin     const uint64_t src_addr_2 = src_addr + 0x20000;
311dcdbbd45SJamin Lin     const uint64_t src_addr_3 = src_addr + 0x30000;
312dcdbbd45SJamin Lin     const uint64_t digest_addr = src_addr + 0x40000;
31370985b0eSJamin Lin     uint8_t digest[32] = {0};
31470985b0eSJamin Lin     struct AspeedSgList array[] = {
31570985b0eSJamin Lin         {  cpu_to_le32(sizeof(test_vector_sg1)),
31670985b0eSJamin Lin            cpu_to_le32(src_addr_1) },
31770985b0eSJamin Lin         {  cpu_to_le32(sizeof(test_vector_sg2)),
31870985b0eSJamin Lin            cpu_to_le32(src_addr_2) },
31970985b0eSJamin Lin         {  cpu_to_le32(sizeof(test_vector_sg3) | SG_LIST_LEN_LAST),
32070985b0eSJamin Lin            cpu_to_le32(src_addr_3) },
32170985b0eSJamin Lin     };
32270985b0eSJamin Lin 
32370985b0eSJamin Lin     /* Check engine is idle, no busy or irq bits set */
32470985b0eSJamin Lin     g_assert_cmphex(qtest_readl(s, base + HACE_STS), ==, 0);
32570985b0eSJamin Lin 
32670985b0eSJamin Lin     /* Write test vector into memory */
32770985b0eSJamin Lin     qtest_memwrite(s, src_addr_1, test_vector_sg1, sizeof(test_vector_sg1));
32870985b0eSJamin Lin     qtest_memwrite(s, src_addr_2, test_vector_sg2, sizeof(test_vector_sg2));
32970985b0eSJamin Lin     qtest_memwrite(s, src_addr_3, test_vector_sg3, sizeof(test_vector_sg3));
33070985b0eSJamin Lin     qtest_memwrite(s, src_addr, array, sizeof(array));
33170985b0eSJamin Lin 
33270985b0eSJamin Lin     write_regs(s, base, src_addr,
33370985b0eSJamin Lin                (sizeof(test_vector_sg1)
33470985b0eSJamin Lin                 + sizeof(test_vector_sg2)
33570985b0eSJamin Lin                 + sizeof(test_vector_sg3)),
33670985b0eSJamin Lin                digest_addr, HACE_ALGO_SHA256 | HACE_SG_EN);
33770985b0eSJamin Lin 
33870985b0eSJamin Lin     /* Check hash IRQ status is asserted */
33970985b0eSJamin Lin     g_assert_cmphex(qtest_readl(s, base + HACE_STS), ==, 0x00000200);
34070985b0eSJamin Lin 
34170985b0eSJamin Lin     /* Clear IRQ status and check status is deasserted */
34270985b0eSJamin Lin     qtest_writel(s, base + HACE_STS, 0x00000200);
34370985b0eSJamin Lin     g_assert_cmphex(qtest_readl(s, base + HACE_STS), ==, 0);
34470985b0eSJamin Lin 
34570985b0eSJamin Lin     /* Read computed digest from memory */
34670985b0eSJamin Lin     qtest_memread(s, digest_addr, digest, sizeof(digest));
34770985b0eSJamin Lin 
34870985b0eSJamin Lin     /* Check result of computation */
34970985b0eSJamin Lin     g_assert_cmpmem(digest, sizeof(digest),
35070985b0eSJamin Lin                     test_result_sg_sha256, sizeof(digest));
35170985b0eSJamin Lin 
35270985b0eSJamin Lin     qtest_quit(s);
35370985b0eSJamin Lin }
35470985b0eSJamin Lin 
aspeed_test_sha384_sg(const char * machine,const uint32_t base,const uint64_t src_addr)3553c13be86SJamin Lin void aspeed_test_sha384_sg(const char *machine, const uint32_t base,
356dcdbbd45SJamin Lin                            const uint64_t src_addr)
3573c13be86SJamin Lin {
3583c13be86SJamin Lin     QTestState *s = qtest_init(machine);
3593c13be86SJamin Lin 
360dcdbbd45SJamin Lin     const uint64_t src_addr_1 = src_addr + 0x10000;
361dcdbbd45SJamin Lin     const uint64_t src_addr_2 = src_addr + 0x20000;
362dcdbbd45SJamin Lin     const uint64_t src_addr_3 = src_addr + 0x30000;
363dcdbbd45SJamin Lin     const uint64_t digest_addr = src_addr + 0x40000;
3643c13be86SJamin Lin     uint8_t digest[48] = {0};
3653c13be86SJamin Lin     struct AspeedSgList array[] = {
3663c13be86SJamin Lin         {  cpu_to_le32(sizeof(test_vector_sg1)),
3673c13be86SJamin Lin            cpu_to_le32(src_addr_1) },
3683c13be86SJamin Lin         {  cpu_to_le32(sizeof(test_vector_sg2)),
3693c13be86SJamin Lin            cpu_to_le32(src_addr_2) },
3703c13be86SJamin Lin         {  cpu_to_le32(sizeof(test_vector_sg3) | SG_LIST_LEN_LAST),
3713c13be86SJamin Lin            cpu_to_le32(src_addr_3) },
3723c13be86SJamin Lin     };
3733c13be86SJamin Lin 
3743c13be86SJamin Lin     /* Check engine is idle, no busy or irq bits set */
3753c13be86SJamin Lin     g_assert_cmphex(qtest_readl(s, base + HACE_STS), ==, 0);
3763c13be86SJamin Lin 
3773c13be86SJamin Lin     /* Write test vector into memory */
3783c13be86SJamin Lin     qtest_memwrite(s, src_addr_1, test_vector_sg1, sizeof(test_vector_sg1));
3793c13be86SJamin Lin     qtest_memwrite(s, src_addr_2, test_vector_sg2, sizeof(test_vector_sg2));
3803c13be86SJamin Lin     qtest_memwrite(s, src_addr_3, test_vector_sg3, sizeof(test_vector_sg3));
3813c13be86SJamin Lin     qtest_memwrite(s, src_addr, array, sizeof(array));
3823c13be86SJamin Lin 
3833c13be86SJamin Lin     write_regs(s, base, src_addr,
3843c13be86SJamin Lin                (sizeof(test_vector_sg1)
3853c13be86SJamin Lin                 + sizeof(test_vector_sg2)
3863c13be86SJamin Lin                 + sizeof(test_vector_sg3)),
3873c13be86SJamin Lin                digest_addr, HACE_ALGO_SHA384 | HACE_SG_EN);
3883c13be86SJamin Lin 
3893c13be86SJamin Lin     /* Check hash IRQ status is asserted */
3903c13be86SJamin Lin     g_assert_cmphex(qtest_readl(s, base + HACE_STS), ==, 0x00000200);
3913c13be86SJamin Lin 
3923c13be86SJamin Lin     /* Clear IRQ status and check status is deasserted */
3933c13be86SJamin Lin     qtest_writel(s, base + HACE_STS, 0x00000200);
3943c13be86SJamin Lin     g_assert_cmphex(qtest_readl(s, base + HACE_STS), ==, 0);
3953c13be86SJamin Lin 
3963c13be86SJamin Lin     /* Read computed digest from memory */
3973c13be86SJamin Lin     qtest_memread(s, digest_addr, digest, sizeof(digest));
3983c13be86SJamin Lin 
3993c13be86SJamin Lin     /* Check result of computation */
4003c13be86SJamin Lin     g_assert_cmpmem(digest, sizeof(digest),
4013c13be86SJamin Lin                     test_result_sg_sha384, sizeof(digest));
4023c13be86SJamin Lin 
4033c13be86SJamin Lin     qtest_quit(s);
4043c13be86SJamin Lin }
4053c13be86SJamin Lin 
aspeed_test_sha512_sg(const char * machine,const uint32_t base,const uint64_t src_addr)40670985b0eSJamin Lin void aspeed_test_sha512_sg(const char *machine, const uint32_t base,
407dcdbbd45SJamin Lin                            const uint64_t src_addr)
40870985b0eSJamin Lin {
40970985b0eSJamin Lin     QTestState *s = qtest_init(machine);
41070985b0eSJamin Lin 
411dcdbbd45SJamin Lin     const uint64_t src_addr_1 = src_addr + 0x10000;
412dcdbbd45SJamin Lin     const uint64_t src_addr_2 = src_addr + 0x20000;
413dcdbbd45SJamin Lin     const uint64_t src_addr_3 = src_addr + 0x30000;
414dcdbbd45SJamin Lin     const uint64_t digest_addr = src_addr + 0x40000;
41570985b0eSJamin Lin     uint8_t digest[64] = {0};
41670985b0eSJamin Lin     struct AspeedSgList array[] = {
41770985b0eSJamin Lin         {  cpu_to_le32(sizeof(test_vector_sg1)),
41870985b0eSJamin Lin            cpu_to_le32(src_addr_1) },
41970985b0eSJamin Lin         {  cpu_to_le32(sizeof(test_vector_sg2)),
42070985b0eSJamin Lin            cpu_to_le32(src_addr_2) },
42170985b0eSJamin Lin         {  cpu_to_le32(sizeof(test_vector_sg3) | SG_LIST_LEN_LAST),
42270985b0eSJamin Lin            cpu_to_le32(src_addr_3) },
42370985b0eSJamin Lin     };
42470985b0eSJamin Lin 
42570985b0eSJamin Lin     /* Check engine is idle, no busy or irq bits set */
42670985b0eSJamin Lin     g_assert_cmphex(qtest_readl(s, base + HACE_STS), ==, 0);
42770985b0eSJamin Lin 
42870985b0eSJamin Lin     /* Write test vector into memory */
42970985b0eSJamin Lin     qtest_memwrite(s, src_addr_1, test_vector_sg1, sizeof(test_vector_sg1));
43070985b0eSJamin Lin     qtest_memwrite(s, src_addr_2, test_vector_sg2, sizeof(test_vector_sg2));
43170985b0eSJamin Lin     qtest_memwrite(s, src_addr_3, test_vector_sg3, sizeof(test_vector_sg3));
43270985b0eSJamin Lin     qtest_memwrite(s, src_addr, array, sizeof(array));
43370985b0eSJamin Lin 
43470985b0eSJamin Lin     write_regs(s, base, src_addr,
43570985b0eSJamin Lin                (sizeof(test_vector_sg1)
43670985b0eSJamin Lin                 + sizeof(test_vector_sg2)
43770985b0eSJamin Lin                 + sizeof(test_vector_sg3)),
43870985b0eSJamin Lin                digest_addr, HACE_ALGO_SHA512 | HACE_SG_EN);
43970985b0eSJamin Lin 
44070985b0eSJamin Lin     /* Check hash IRQ status is asserted */
44170985b0eSJamin Lin     g_assert_cmphex(qtest_readl(s, base + HACE_STS), ==, 0x00000200);
44270985b0eSJamin Lin 
44370985b0eSJamin Lin     /* Clear IRQ status and check status is deasserted */
44470985b0eSJamin Lin     qtest_writel(s, base + HACE_STS, 0x00000200);
44570985b0eSJamin Lin     g_assert_cmphex(qtest_readl(s, base + HACE_STS), ==, 0);
44670985b0eSJamin Lin 
44770985b0eSJamin Lin     /* Read computed digest from memory */
44870985b0eSJamin Lin     qtest_memread(s, digest_addr, digest, sizeof(digest));
44970985b0eSJamin Lin 
45070985b0eSJamin Lin     /* Check result of computation */
45170985b0eSJamin Lin     g_assert_cmpmem(digest, sizeof(digest),
45270985b0eSJamin Lin                     test_result_sg_sha512, sizeof(digest));
45370985b0eSJamin Lin 
45470985b0eSJamin Lin     qtest_quit(s);
45570985b0eSJamin Lin }
45670985b0eSJamin Lin 
aspeed_test_sha256_accum(const char * machine,const uint32_t base,const uint64_t src_addr)45770985b0eSJamin Lin void aspeed_test_sha256_accum(const char *machine, const uint32_t base,
458dcdbbd45SJamin Lin                               const uint64_t src_addr)
45970985b0eSJamin Lin {
46070985b0eSJamin Lin     QTestState *s = qtest_init(machine);
46170985b0eSJamin Lin 
462dcdbbd45SJamin Lin     const uint64_t buffer_addr = src_addr + 0x10000;
463dcdbbd45SJamin Lin     const uint64_t digest_addr = src_addr + 0x40000;
46470985b0eSJamin Lin     uint8_t digest[32] = {0};
46570985b0eSJamin Lin     struct AspeedSgList array[] = {
46670985b0eSJamin Lin         {  cpu_to_le32(sizeof(test_vector_accum_256) | SG_LIST_LEN_LAST),
46770985b0eSJamin Lin            cpu_to_le32(buffer_addr) },
46870985b0eSJamin Lin     };
46970985b0eSJamin Lin 
47070985b0eSJamin Lin     /* Check engine is idle, no busy or irq bits set */
47170985b0eSJamin Lin     g_assert_cmphex(qtest_readl(s, base + HACE_STS), ==, 0);
47270985b0eSJamin Lin 
47370985b0eSJamin Lin     /* Write test vector into memory */
47470985b0eSJamin Lin     qtest_memwrite(s, buffer_addr, test_vector_accum_256,
47570985b0eSJamin Lin                    sizeof(test_vector_accum_256));
47670985b0eSJamin Lin     qtest_memwrite(s, src_addr, array, sizeof(array));
47770985b0eSJamin Lin 
47870985b0eSJamin Lin     write_regs(s, base, src_addr, sizeof(test_vector_accum_256),
47970985b0eSJamin Lin                digest_addr, HACE_ALGO_SHA256 | HACE_SG_EN | HACE_ACCUM_EN);
48070985b0eSJamin Lin 
48170985b0eSJamin Lin     /* Check hash IRQ status is asserted */
48270985b0eSJamin Lin     g_assert_cmphex(qtest_readl(s, base + HACE_STS), ==, 0x00000200);
48370985b0eSJamin Lin 
48470985b0eSJamin Lin     /* Clear IRQ status and check status is deasserted */
48570985b0eSJamin Lin     qtest_writel(s, base + HACE_STS, 0x00000200);
48670985b0eSJamin Lin     g_assert_cmphex(qtest_readl(s, base + HACE_STS), ==, 0);
48770985b0eSJamin Lin 
48870985b0eSJamin Lin     /* Read computed digest from memory */
48970985b0eSJamin Lin     qtest_memread(s, digest_addr, digest, sizeof(digest));
49070985b0eSJamin Lin 
49170985b0eSJamin Lin     /* Check result of computation */
49270985b0eSJamin Lin     g_assert_cmpmem(digest, sizeof(digest),
49370985b0eSJamin Lin                     test_result_accum_sha256, sizeof(digest));
49470985b0eSJamin Lin 
49570985b0eSJamin Lin     qtest_quit(s);
49670985b0eSJamin Lin }
49770985b0eSJamin Lin 
aspeed_test_sha384_accum(const char * machine,const uint32_t base,const uint64_t src_addr)4983c13be86SJamin Lin void aspeed_test_sha384_accum(const char *machine, const uint32_t base,
499dcdbbd45SJamin Lin                               const uint64_t src_addr)
5003c13be86SJamin Lin {
5013c13be86SJamin Lin     QTestState *s = qtest_init(machine);
5023c13be86SJamin Lin 
503dcdbbd45SJamin Lin     const uint64_t buffer_addr = src_addr + 0x10000;
504dcdbbd45SJamin Lin     const uint64_t digest_addr = src_addr + 0x40000;
5053c13be86SJamin Lin     uint8_t digest[48] = {0};
5063c13be86SJamin Lin     struct AspeedSgList array[] = {
5073c13be86SJamin Lin         {  cpu_to_le32(sizeof(test_vector_accum_384) | SG_LIST_LEN_LAST),
5083c13be86SJamin Lin            cpu_to_le32(buffer_addr) },
5093c13be86SJamin Lin     };
5103c13be86SJamin Lin 
5113c13be86SJamin Lin     /* Check engine is idle, no busy or irq bits set */
5123c13be86SJamin Lin     g_assert_cmphex(qtest_readl(s, base + HACE_STS), ==, 0);
5133c13be86SJamin Lin 
5143c13be86SJamin Lin     /* Write test vector into memory */
5153c13be86SJamin Lin     qtest_memwrite(s, buffer_addr, test_vector_accum_384,
5163c13be86SJamin Lin                    sizeof(test_vector_accum_384));
5173c13be86SJamin Lin     qtest_memwrite(s, src_addr, array, sizeof(array));
5183c13be86SJamin Lin 
5193c13be86SJamin Lin     write_regs(s, base, src_addr, sizeof(test_vector_accum_384),
5203c13be86SJamin Lin                digest_addr, HACE_ALGO_SHA384 | HACE_SG_EN | HACE_ACCUM_EN);
5213c13be86SJamin Lin 
5223c13be86SJamin Lin     /* Check hash IRQ status is asserted */
5233c13be86SJamin Lin     g_assert_cmphex(qtest_readl(s, base + HACE_STS), ==, 0x00000200);
5243c13be86SJamin Lin 
5253c13be86SJamin Lin     /* Clear IRQ status and check status is deasserted */
5263c13be86SJamin Lin     qtest_writel(s, base + HACE_STS, 0x00000200);
5273c13be86SJamin Lin     g_assert_cmphex(qtest_readl(s, base + HACE_STS), ==, 0);
5283c13be86SJamin Lin 
5293c13be86SJamin Lin     /* Read computed digest from memory */
5303c13be86SJamin Lin     qtest_memread(s, digest_addr, digest, sizeof(digest));
5313c13be86SJamin Lin 
5323c13be86SJamin Lin     /* Check result of computation */
5333c13be86SJamin Lin     g_assert_cmpmem(digest, sizeof(digest),
5343c13be86SJamin Lin                     test_result_accum_sha384, sizeof(digest));
5353c13be86SJamin Lin 
5363c13be86SJamin Lin     qtest_quit(s);
5373c13be86SJamin Lin }
5383c13be86SJamin Lin 
aspeed_test_sha512_accum(const char * machine,const uint32_t base,const uint64_t src_addr)53970985b0eSJamin Lin void aspeed_test_sha512_accum(const char *machine, const uint32_t base,
540dcdbbd45SJamin Lin                               const uint64_t src_addr)
54170985b0eSJamin Lin {
54270985b0eSJamin Lin     QTestState *s = qtest_init(machine);
54370985b0eSJamin Lin 
544dcdbbd45SJamin Lin     const uint64_t buffer_addr = src_addr + 0x10000;
545dcdbbd45SJamin Lin     const uint64_t digest_addr = src_addr + 0x40000;
54670985b0eSJamin Lin     uint8_t digest[64] = {0};
54770985b0eSJamin Lin     struct AspeedSgList array[] = {
54870985b0eSJamin Lin         {  cpu_to_le32(sizeof(test_vector_accum_512) | SG_LIST_LEN_LAST),
54970985b0eSJamin Lin            cpu_to_le32(buffer_addr) },
55070985b0eSJamin Lin     };
55170985b0eSJamin Lin 
55270985b0eSJamin Lin     /* Check engine is idle, no busy or irq bits set */
55370985b0eSJamin Lin     g_assert_cmphex(qtest_readl(s, base + HACE_STS), ==, 0);
55470985b0eSJamin Lin 
55570985b0eSJamin Lin     /* Write test vector into memory */
55670985b0eSJamin Lin     qtest_memwrite(s, buffer_addr, test_vector_accum_512,
55770985b0eSJamin Lin                    sizeof(test_vector_accum_512));
55870985b0eSJamin Lin     qtest_memwrite(s, src_addr, array, sizeof(array));
55970985b0eSJamin Lin 
56070985b0eSJamin Lin     write_regs(s, base, src_addr, sizeof(test_vector_accum_512),
56170985b0eSJamin Lin                digest_addr, HACE_ALGO_SHA512 | HACE_SG_EN | HACE_ACCUM_EN);
56270985b0eSJamin Lin 
56370985b0eSJamin Lin     /* Check hash IRQ status is asserted */
56470985b0eSJamin Lin     g_assert_cmphex(qtest_readl(s, base + HACE_STS), ==, 0x00000200);
56570985b0eSJamin Lin 
56670985b0eSJamin Lin     /* Clear IRQ status and check status is deasserted */
56770985b0eSJamin Lin     qtest_writel(s, base + HACE_STS, 0x00000200);
56870985b0eSJamin Lin     g_assert_cmphex(qtest_readl(s, base + HACE_STS), ==, 0);
56970985b0eSJamin Lin 
57070985b0eSJamin Lin     /* Read computed digest from memory */
57170985b0eSJamin Lin     qtest_memread(s, digest_addr, digest, sizeof(digest));
57270985b0eSJamin Lin 
57370985b0eSJamin Lin     /* Check result of computation */
57470985b0eSJamin Lin     g_assert_cmpmem(digest, sizeof(digest),
57570985b0eSJamin Lin                     test_result_accum_sha512, sizeof(digest));
57670985b0eSJamin Lin 
57770985b0eSJamin Lin     qtest_quit(s);
57870985b0eSJamin Lin }
57970985b0eSJamin Lin 
aspeed_test_addresses(const char * machine,const uint32_t base,const struct AspeedMasks * expected)58070985b0eSJamin Lin void aspeed_test_addresses(const char *machine, const uint32_t base,
58170985b0eSJamin Lin                            const struct AspeedMasks *expected)
58270985b0eSJamin Lin {
58370985b0eSJamin Lin     QTestState *s = qtest_init(machine);
58470985b0eSJamin Lin 
58570985b0eSJamin Lin     /*
58670985b0eSJamin Lin      * Check command mode is zero, meaning engine is in direct access mode,
58770985b0eSJamin Lin      * as this affects the masking behavior of the HASH_SRC register.
58870985b0eSJamin Lin      */
58970985b0eSJamin Lin     g_assert_cmphex(qtest_readl(s, base + HACE_CMD), ==, 0);
59070985b0eSJamin Lin     g_assert_cmphex(qtest_readl(s, base + HACE_HASH_SRC), ==, 0);
59188d8515fSJamin Lin     g_assert_cmphex(qtest_readl(s, base + HACE_HASH_SRC_HI), ==, 0);
59270985b0eSJamin Lin     g_assert_cmphex(qtest_readl(s, base + HACE_HASH_DIGEST), ==, 0);
59388d8515fSJamin Lin     g_assert_cmphex(qtest_readl(s, base + HACE_HASH_DIGEST_HI), ==, 0);
594*823288fcSJamin Lin     g_assert_cmphex(qtest_readl(s, base + HACE_HASH_KEY_BUFF), ==, 0);
595*823288fcSJamin Lin     g_assert_cmphex(qtest_readl(s, base + HACE_HASH_KEY_BUFF_HI), ==, 0);
59670985b0eSJamin Lin     g_assert_cmphex(qtest_readl(s, base + HACE_HASH_DATA_LEN), ==, 0);
59770985b0eSJamin Lin 
59870985b0eSJamin Lin     /* Check that the address masking is correct */
59970985b0eSJamin Lin     qtest_writel(s, base + HACE_HASH_SRC, 0xffffffff);
60070985b0eSJamin Lin     g_assert_cmphex(qtest_readl(s, base + HACE_HASH_SRC), ==, expected->src);
60170985b0eSJamin Lin 
60288d8515fSJamin Lin     qtest_writel(s, base + HACE_HASH_SRC_HI, 0xffffffff);
60388d8515fSJamin Lin     g_assert_cmphex(qtest_readl(s, base + HACE_HASH_SRC_HI),
60488d8515fSJamin Lin                     ==, expected->src_hi);
60588d8515fSJamin Lin 
60670985b0eSJamin Lin     qtest_writel(s, base + HACE_HASH_DIGEST, 0xffffffff);
60770985b0eSJamin Lin     g_assert_cmphex(qtest_readl(s, base + HACE_HASH_DIGEST), ==,
60870985b0eSJamin Lin                     expected->dest);
60970985b0eSJamin Lin 
61088d8515fSJamin Lin     qtest_writel(s, base + HACE_HASH_DIGEST_HI, 0xffffffff);
61188d8515fSJamin Lin     g_assert_cmphex(qtest_readl(s, base + HACE_HASH_DIGEST_HI), ==,
61288d8515fSJamin Lin                     expected->dest_hi);
61388d8515fSJamin Lin 
614*823288fcSJamin Lin     qtest_writel(s, base + HACE_HASH_KEY_BUFF, 0xffffffff);
615*823288fcSJamin Lin     g_assert_cmphex(qtest_readl(s, base + HACE_HASH_KEY_BUFF), ==,
616*823288fcSJamin Lin                     expected->key);
617*823288fcSJamin Lin 
618*823288fcSJamin Lin     qtest_writel(s, base + HACE_HASH_KEY_BUFF_HI, 0xffffffff);
619*823288fcSJamin Lin     g_assert_cmphex(qtest_readl(s, base + HACE_HASH_KEY_BUFF_HI), ==,
620*823288fcSJamin Lin                     expected->key_hi);
621*823288fcSJamin Lin 
62270985b0eSJamin Lin     qtest_writel(s, base + HACE_HASH_DATA_LEN, 0xffffffff);
62370985b0eSJamin Lin     g_assert_cmphex(qtest_readl(s, base + HACE_HASH_DATA_LEN), ==,
62470985b0eSJamin Lin                     expected->len);
62570985b0eSJamin Lin 
62670985b0eSJamin Lin     /* Reset to zero */
62770985b0eSJamin Lin     qtest_writel(s, base + HACE_HASH_SRC, 0);
62888d8515fSJamin Lin     qtest_writel(s, base + HACE_HASH_SRC_HI, 0);
62970985b0eSJamin Lin     qtest_writel(s, base + HACE_HASH_DIGEST, 0);
63088d8515fSJamin Lin     qtest_writel(s, base + HACE_HASH_DIGEST_HI, 0);
631*823288fcSJamin Lin     qtest_writel(s, base + HACE_HASH_KEY_BUFF, 0);
632*823288fcSJamin Lin     qtest_writel(s, base + HACE_HASH_KEY_BUFF_HI, 0);
63370985b0eSJamin Lin     qtest_writel(s, base + HACE_HASH_DATA_LEN, 0);
63470985b0eSJamin Lin 
63570985b0eSJamin Lin     /* Check that all bits are now zero */
63670985b0eSJamin Lin     g_assert_cmphex(qtest_readl(s, base + HACE_HASH_SRC), ==, 0);
63788d8515fSJamin Lin     g_assert_cmphex(qtest_readl(s, base + HACE_HASH_SRC_HI), ==, 0);
63870985b0eSJamin Lin     g_assert_cmphex(qtest_readl(s, base + HACE_HASH_DIGEST), ==, 0);
63988d8515fSJamin Lin     g_assert_cmphex(qtest_readl(s, base + HACE_HASH_DIGEST_HI), ==, 0);
640*823288fcSJamin Lin     g_assert_cmphex(qtest_readl(s, base + HACE_HASH_KEY_BUFF), ==, 0);
641*823288fcSJamin Lin     g_assert_cmphex(qtest_readl(s, base + HACE_HASH_KEY_BUFF_HI), ==, 0);
64270985b0eSJamin Lin     g_assert_cmphex(qtest_readl(s, base + HACE_HASH_DATA_LEN), ==, 0);
64370985b0eSJamin Lin 
64470985b0eSJamin Lin     qtest_quit(s);
64570985b0eSJamin Lin }
64670985b0eSJamin Lin 
647