xref: /qemu/tests/qtest/aspeed-hace-utils.c (revision 3c13be86ba181faea21a1b4f66f54df5328574f7)
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
19*3c13be86SJamin 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 
32*3c13be86SJamin Lin static const uint8_t test_result_sha384[48] = {
33*3c13be86SJamin Lin     0xcb, 0x00, 0x75, 0x3f, 0x45, 0xa3, 0x5e, 0x8b, 0xb5, 0xa0, 0x3d, 0x69,
34*3c13be86SJamin Lin     0x9a, 0xc6, 0x50, 0x07, 0x27, 0x2c, 0x32, 0xab, 0x0e, 0xde, 0xd1, 0x63,
35*3c13be86SJamin Lin     0x1a, 0x8b, 0x60, 0x5a, 0x43, 0xff, 0x5b, 0xed, 0x80, 0x86, 0x07, 0x2b,
36*3c13be86SJamin Lin     0xa1, 0xe7, 0xcc, 0x23, 0x58, 0xba, 0xec, 0xa1, 0x34, 0xc8, 0x25, 0xa7};
37*3c13be86SJamin 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
54*3c13be86SJamin 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 
69*3c13be86SJamin Lin static const uint8_t test_result_sg_sha384[48] = {
70*3c13be86SJamin Lin     0x10, 0x3c, 0xa9, 0x6c, 0x06, 0xa1, 0xce, 0x79, 0x8f, 0x08, 0xf8, 0xef,
71*3c13be86SJamin Lin     0xf0, 0xdf, 0xb0, 0xcc, 0xdb, 0x56, 0x7d, 0x48, 0xb2, 0x85, 0xb2, 0x3d,
72*3c13be86SJamin Lin     0x0c, 0xd7, 0x73, 0x45, 0x46, 0x67, 0xa3, 0xc2, 0xfa, 0x5f, 0x1b, 0x58,
73*3c13be86SJamin Lin     0xd9, 0xcd, 0xf2, 0x32, 0x9b, 0xd9, 0x97, 0x97, 0x30, 0xbf, 0xaa, 0xff};
74*3c13be86SJamin 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
89*3c13be86SJamin 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 
109*3c13be86SJamin Lin static const uint8_t test_vector_accum_384[128] = {
110*3c13be86SJamin Lin     0x61, 0x62, 0x63, 0x80, 0x00, 0x00, 0x00, 0x00,
111*3c13be86SJamin Lin     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
112*3c13be86SJamin Lin     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
113*3c13be86SJamin Lin     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
114*3c13be86SJamin Lin     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
115*3c13be86SJamin Lin     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
116*3c13be86SJamin Lin     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
117*3c13be86SJamin Lin     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
118*3c13be86SJamin Lin     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
119*3c13be86SJamin Lin     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
120*3c13be86SJamin Lin     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
121*3c13be86SJamin Lin     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
122*3c13be86SJamin Lin     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
123*3c13be86SJamin Lin     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
124*3c13be86SJamin Lin     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
125*3c13be86SJamin Lin     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18};
126*3c13be86SJamin 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 
145*3c13be86SJamin Lin static const uint8_t test_result_accum_sha384[48] = {
146*3c13be86SJamin Lin     0xcb, 0x00, 0x75, 0x3f, 0x45, 0xa3, 0x5e, 0x8b, 0xb5, 0xa0, 0x3d, 0x69,
147*3c13be86SJamin Lin     0x9a, 0xc6, 0x50, 0x07, 0x27, 0x2c, 0x32, 0xab, 0x0e, 0xde, 0xd1, 0x63,
148*3c13be86SJamin Lin     0x1a, 0x8b, 0x60, 0x5a, 0x43, 0xff, 0x5b, 0xed, 0x80, 0x86, 0x07, 0x2b,
149*3c13be86SJamin Lin     0xa1, 0xe7, 0xcc, 0x23, 0x58, 0xba, 0xec, 0xa1, 0x34, 0xc8, 0x25, 0xa7};
150*3c13be86SJamin 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 
15670985b0eSJamin Lin static void write_regs(QTestState *s, uint32_t base, uint32_t src,
15770985b0eSJamin Lin                        uint32_t length, uint32_t out, uint32_t method)
15870985b0eSJamin Lin {
15970985b0eSJamin Lin         qtest_writel(s, base + HACE_HASH_SRC, src);
16070985b0eSJamin Lin         qtest_writel(s, base + HACE_HASH_DIGEST, out);
16170985b0eSJamin Lin         qtest_writel(s, base + HACE_HASH_DATA_LEN, length);
16270985b0eSJamin Lin         qtest_writel(s, base + HACE_HASH_CMD, HACE_SHA_BE_EN | method);
16370985b0eSJamin Lin }
16470985b0eSJamin Lin 
16570985b0eSJamin Lin void aspeed_test_md5(const char *machine, const uint32_t base,
16670985b0eSJamin Lin                      const uint32_t src_addr)
16770985b0eSJamin Lin 
16870985b0eSJamin Lin {
16970985b0eSJamin Lin     QTestState *s = qtest_init(machine);
17070985b0eSJamin Lin 
171a3e7f6d0SJamin Lin     uint32_t digest_addr = src_addr + 0x010000;
17270985b0eSJamin Lin     uint8_t digest[16] = {0};
17370985b0eSJamin Lin 
17470985b0eSJamin Lin     /* Check engine is idle, no busy or irq bits set */
17570985b0eSJamin Lin     g_assert_cmphex(qtest_readl(s, base + HACE_STS), ==, 0);
17670985b0eSJamin Lin 
17770985b0eSJamin Lin     /* Write test vector into memory */
17870985b0eSJamin Lin     qtest_memwrite(s, src_addr, test_vector, sizeof(test_vector));
17970985b0eSJamin Lin 
18070985b0eSJamin Lin     write_regs(s, base, src_addr, sizeof(test_vector),
18170985b0eSJamin Lin                digest_addr, HACE_ALGO_MD5);
18270985b0eSJamin Lin 
18370985b0eSJamin Lin     /* Check hash IRQ status is asserted */
18470985b0eSJamin Lin     g_assert_cmphex(qtest_readl(s, base + HACE_STS), ==, 0x00000200);
18570985b0eSJamin Lin 
18670985b0eSJamin Lin     /* Clear IRQ status and check status is deasserted */
18770985b0eSJamin Lin     qtest_writel(s, base + HACE_STS, 0x00000200);
18870985b0eSJamin Lin     g_assert_cmphex(qtest_readl(s, base + HACE_STS), ==, 0);
18970985b0eSJamin Lin 
19070985b0eSJamin Lin     /* Read computed digest from memory */
19170985b0eSJamin Lin     qtest_memread(s, digest_addr, digest, sizeof(digest));
19270985b0eSJamin Lin 
19370985b0eSJamin Lin     /* Check result of computation */
19470985b0eSJamin Lin     g_assert_cmpmem(digest, sizeof(digest),
19570985b0eSJamin Lin                     test_result_md5, sizeof(digest));
19670985b0eSJamin Lin 
19770985b0eSJamin Lin     qtest_quit(s);
19870985b0eSJamin Lin }
19970985b0eSJamin Lin 
20070985b0eSJamin Lin void aspeed_test_sha256(const char *machine, const uint32_t base,
20170985b0eSJamin Lin                         const uint32_t src_addr)
20270985b0eSJamin Lin {
20370985b0eSJamin Lin     QTestState *s = qtest_init(machine);
20470985b0eSJamin Lin 
205a3e7f6d0SJamin Lin     const uint32_t digest_addr = src_addr + 0x10000;
20670985b0eSJamin Lin     uint8_t digest[32] = {0};
20770985b0eSJamin Lin 
20870985b0eSJamin Lin     /* Check engine is idle, no busy or irq bits set */
20970985b0eSJamin Lin     g_assert_cmphex(qtest_readl(s, base + HACE_STS), ==, 0);
21070985b0eSJamin Lin 
21170985b0eSJamin Lin     /* Write test vector into memory */
21270985b0eSJamin Lin     qtest_memwrite(s, src_addr, test_vector, sizeof(test_vector));
21370985b0eSJamin Lin 
21470985b0eSJamin Lin     write_regs(s, base, src_addr, sizeof(test_vector), digest_addr,
21570985b0eSJamin Lin                HACE_ALGO_SHA256);
21670985b0eSJamin Lin 
21770985b0eSJamin Lin     /* Check hash IRQ status is asserted */
21870985b0eSJamin Lin     g_assert_cmphex(qtest_readl(s, base + HACE_STS), ==, 0x00000200);
21970985b0eSJamin Lin 
22070985b0eSJamin Lin     /* Clear IRQ status and check status is deasserted */
22170985b0eSJamin Lin     qtest_writel(s, base + HACE_STS, 0x00000200);
22270985b0eSJamin Lin     g_assert_cmphex(qtest_readl(s, base + HACE_STS), ==, 0);
22370985b0eSJamin Lin 
22470985b0eSJamin Lin     /* Read computed digest from memory */
22570985b0eSJamin Lin     qtest_memread(s, digest_addr, digest, sizeof(digest));
22670985b0eSJamin Lin 
22770985b0eSJamin Lin     /* Check result of computation */
22870985b0eSJamin Lin     g_assert_cmpmem(digest, sizeof(digest),
22970985b0eSJamin Lin                     test_result_sha256, sizeof(digest));
23070985b0eSJamin Lin 
23170985b0eSJamin Lin     qtest_quit(s);
23270985b0eSJamin Lin }
23370985b0eSJamin Lin 
234*3c13be86SJamin Lin void aspeed_test_sha384(const char *machine, const uint32_t base,
235*3c13be86SJamin Lin                         const uint32_t src_addr)
236*3c13be86SJamin Lin {
237*3c13be86SJamin Lin     QTestState *s = qtest_init(machine);
238*3c13be86SJamin Lin 
239*3c13be86SJamin Lin     const uint32_t digest_addr = src_addr + 0x10000;
240*3c13be86SJamin Lin     uint8_t digest[48] = {0};
241*3c13be86SJamin Lin 
242*3c13be86SJamin Lin     /* Check engine is idle, no busy or irq bits set */
243*3c13be86SJamin Lin     g_assert_cmphex(qtest_readl(s, base + HACE_STS), ==, 0);
244*3c13be86SJamin Lin 
245*3c13be86SJamin Lin     /* Write test vector into memory */
246*3c13be86SJamin Lin     qtest_memwrite(s, src_addr, test_vector, sizeof(test_vector));
247*3c13be86SJamin Lin 
248*3c13be86SJamin Lin     write_regs(s, base, src_addr, sizeof(test_vector), digest_addr,
249*3c13be86SJamin Lin                HACE_ALGO_SHA384);
250*3c13be86SJamin Lin 
251*3c13be86SJamin Lin     /* Check hash IRQ status is asserted */
252*3c13be86SJamin Lin     g_assert_cmphex(qtest_readl(s, base + HACE_STS), ==, 0x00000200);
253*3c13be86SJamin Lin 
254*3c13be86SJamin Lin     /* Clear IRQ status and check status is deasserted */
255*3c13be86SJamin Lin     qtest_writel(s, base + HACE_STS, 0x00000200);
256*3c13be86SJamin Lin     g_assert_cmphex(qtest_readl(s, base + HACE_STS), ==, 0);
257*3c13be86SJamin Lin 
258*3c13be86SJamin Lin     /* Read computed digest from memory */
259*3c13be86SJamin Lin     qtest_memread(s, digest_addr, digest, sizeof(digest));
260*3c13be86SJamin Lin 
261*3c13be86SJamin Lin     /* Check result of computation */
262*3c13be86SJamin Lin     g_assert_cmpmem(digest, sizeof(digest),
263*3c13be86SJamin Lin                     test_result_sha384, sizeof(digest));
264*3c13be86SJamin Lin 
265*3c13be86SJamin Lin     qtest_quit(s);
266*3c13be86SJamin Lin }
267*3c13be86SJamin Lin 
26870985b0eSJamin Lin void aspeed_test_sha512(const char *machine, const uint32_t base,
26970985b0eSJamin Lin                         const uint32_t src_addr)
27070985b0eSJamin Lin {
27170985b0eSJamin Lin     QTestState *s = qtest_init(machine);
27270985b0eSJamin Lin 
273a3e7f6d0SJamin Lin     const uint32_t digest_addr = src_addr + 0x10000;
27470985b0eSJamin Lin     uint8_t digest[64] = {0};
27570985b0eSJamin Lin 
27670985b0eSJamin Lin     /* Check engine is idle, no busy or irq bits set */
27770985b0eSJamin Lin     g_assert_cmphex(qtest_readl(s, base + HACE_STS), ==, 0);
27870985b0eSJamin Lin 
27970985b0eSJamin Lin     /* Write test vector into memory */
28070985b0eSJamin Lin     qtest_memwrite(s, src_addr, test_vector, sizeof(test_vector));
28170985b0eSJamin Lin 
28270985b0eSJamin Lin     write_regs(s, base, src_addr, sizeof(test_vector), digest_addr,
28370985b0eSJamin Lin                HACE_ALGO_SHA512);
28470985b0eSJamin Lin 
28570985b0eSJamin Lin     /* Check hash IRQ status is asserted */
28670985b0eSJamin Lin     g_assert_cmphex(qtest_readl(s, base + HACE_STS), ==, 0x00000200);
28770985b0eSJamin Lin 
28870985b0eSJamin Lin     /* Clear IRQ status and check status is deasserted */
28970985b0eSJamin Lin     qtest_writel(s, base + HACE_STS, 0x00000200);
29070985b0eSJamin Lin     g_assert_cmphex(qtest_readl(s, base + HACE_STS), ==, 0);
29170985b0eSJamin Lin 
29270985b0eSJamin Lin     /* Read computed digest from memory */
29370985b0eSJamin Lin     qtest_memread(s, digest_addr, digest, sizeof(digest));
29470985b0eSJamin Lin 
29570985b0eSJamin Lin     /* Check result of computation */
29670985b0eSJamin Lin     g_assert_cmpmem(digest, sizeof(digest),
29770985b0eSJamin Lin                     test_result_sha512, sizeof(digest));
29870985b0eSJamin Lin 
29970985b0eSJamin Lin     qtest_quit(s);
30070985b0eSJamin Lin }
30170985b0eSJamin Lin 
30270985b0eSJamin Lin void aspeed_test_sha256_sg(const char *machine, const uint32_t base,
30370985b0eSJamin Lin                            const uint32_t src_addr)
30470985b0eSJamin Lin {
30570985b0eSJamin Lin     QTestState *s = qtest_init(machine);
30670985b0eSJamin Lin 
307a3e7f6d0SJamin Lin     const uint32_t src_addr_1 = src_addr + 0x10000;
308a3e7f6d0SJamin Lin     const uint32_t src_addr_2 = src_addr + 0x20000;
309a3e7f6d0SJamin Lin     const uint32_t src_addr_3 = src_addr + 0x30000;
310a3e7f6d0SJamin Lin     const uint32_t digest_addr = src_addr + 0x40000;
31170985b0eSJamin Lin     uint8_t digest[32] = {0};
31270985b0eSJamin Lin     struct AspeedSgList array[] = {
31370985b0eSJamin Lin         {  cpu_to_le32(sizeof(test_vector_sg1)),
31470985b0eSJamin Lin            cpu_to_le32(src_addr_1) },
31570985b0eSJamin Lin         {  cpu_to_le32(sizeof(test_vector_sg2)),
31670985b0eSJamin Lin            cpu_to_le32(src_addr_2) },
31770985b0eSJamin Lin         {  cpu_to_le32(sizeof(test_vector_sg3) | SG_LIST_LEN_LAST),
31870985b0eSJamin Lin            cpu_to_le32(src_addr_3) },
31970985b0eSJamin Lin     };
32070985b0eSJamin Lin 
32170985b0eSJamin Lin     /* Check engine is idle, no busy or irq bits set */
32270985b0eSJamin Lin     g_assert_cmphex(qtest_readl(s, base + HACE_STS), ==, 0);
32370985b0eSJamin Lin 
32470985b0eSJamin Lin     /* Write test vector into memory */
32570985b0eSJamin Lin     qtest_memwrite(s, src_addr_1, test_vector_sg1, sizeof(test_vector_sg1));
32670985b0eSJamin Lin     qtest_memwrite(s, src_addr_2, test_vector_sg2, sizeof(test_vector_sg2));
32770985b0eSJamin Lin     qtest_memwrite(s, src_addr_3, test_vector_sg3, sizeof(test_vector_sg3));
32870985b0eSJamin Lin     qtest_memwrite(s, src_addr, array, sizeof(array));
32970985b0eSJamin Lin 
33070985b0eSJamin Lin     write_regs(s, base, src_addr,
33170985b0eSJamin Lin                (sizeof(test_vector_sg1)
33270985b0eSJamin Lin                 + sizeof(test_vector_sg2)
33370985b0eSJamin Lin                 + sizeof(test_vector_sg3)),
33470985b0eSJamin Lin                digest_addr, HACE_ALGO_SHA256 | HACE_SG_EN);
33570985b0eSJamin Lin 
33670985b0eSJamin Lin     /* Check hash IRQ status is asserted */
33770985b0eSJamin Lin     g_assert_cmphex(qtest_readl(s, base + HACE_STS), ==, 0x00000200);
33870985b0eSJamin Lin 
33970985b0eSJamin Lin     /* Clear IRQ status and check status is deasserted */
34070985b0eSJamin Lin     qtest_writel(s, base + HACE_STS, 0x00000200);
34170985b0eSJamin Lin     g_assert_cmphex(qtest_readl(s, base + HACE_STS), ==, 0);
34270985b0eSJamin Lin 
34370985b0eSJamin Lin     /* Read computed digest from memory */
34470985b0eSJamin Lin     qtest_memread(s, digest_addr, digest, sizeof(digest));
34570985b0eSJamin Lin 
34670985b0eSJamin Lin     /* Check result of computation */
34770985b0eSJamin Lin     g_assert_cmpmem(digest, sizeof(digest),
34870985b0eSJamin Lin                     test_result_sg_sha256, sizeof(digest));
34970985b0eSJamin Lin 
35070985b0eSJamin Lin     qtest_quit(s);
35170985b0eSJamin Lin }
35270985b0eSJamin Lin 
353*3c13be86SJamin Lin void aspeed_test_sha384_sg(const char *machine, const uint32_t base,
354*3c13be86SJamin Lin                            const uint32_t src_addr)
355*3c13be86SJamin Lin {
356*3c13be86SJamin Lin     QTestState *s = qtest_init(machine);
357*3c13be86SJamin Lin 
358*3c13be86SJamin Lin     const uint32_t src_addr_1 = src_addr + 0x10000;
359*3c13be86SJamin Lin     const uint32_t src_addr_2 = src_addr + 0x20000;
360*3c13be86SJamin Lin     const uint32_t src_addr_3 = src_addr + 0x30000;
361*3c13be86SJamin Lin     const uint32_t digest_addr = src_addr + 0x40000;
362*3c13be86SJamin Lin     uint8_t digest[48] = {0};
363*3c13be86SJamin Lin     struct AspeedSgList array[] = {
364*3c13be86SJamin Lin         {  cpu_to_le32(sizeof(test_vector_sg1)),
365*3c13be86SJamin Lin            cpu_to_le32(src_addr_1) },
366*3c13be86SJamin Lin         {  cpu_to_le32(sizeof(test_vector_sg2)),
367*3c13be86SJamin Lin            cpu_to_le32(src_addr_2) },
368*3c13be86SJamin Lin         {  cpu_to_le32(sizeof(test_vector_sg3) | SG_LIST_LEN_LAST),
369*3c13be86SJamin Lin            cpu_to_le32(src_addr_3) },
370*3c13be86SJamin Lin     };
371*3c13be86SJamin Lin 
372*3c13be86SJamin Lin     /* Check engine is idle, no busy or irq bits set */
373*3c13be86SJamin Lin     g_assert_cmphex(qtest_readl(s, base + HACE_STS), ==, 0);
374*3c13be86SJamin Lin 
375*3c13be86SJamin Lin     /* Write test vector into memory */
376*3c13be86SJamin Lin     qtest_memwrite(s, src_addr_1, test_vector_sg1, sizeof(test_vector_sg1));
377*3c13be86SJamin Lin     qtest_memwrite(s, src_addr_2, test_vector_sg2, sizeof(test_vector_sg2));
378*3c13be86SJamin Lin     qtest_memwrite(s, src_addr_3, test_vector_sg3, sizeof(test_vector_sg3));
379*3c13be86SJamin Lin     qtest_memwrite(s, src_addr, array, sizeof(array));
380*3c13be86SJamin Lin 
381*3c13be86SJamin Lin     write_regs(s, base, src_addr,
382*3c13be86SJamin Lin                (sizeof(test_vector_sg1)
383*3c13be86SJamin Lin                 + sizeof(test_vector_sg2)
384*3c13be86SJamin Lin                 + sizeof(test_vector_sg3)),
385*3c13be86SJamin Lin                digest_addr, HACE_ALGO_SHA384 | HACE_SG_EN);
386*3c13be86SJamin Lin 
387*3c13be86SJamin Lin     /* Check hash IRQ status is asserted */
388*3c13be86SJamin Lin     g_assert_cmphex(qtest_readl(s, base + HACE_STS), ==, 0x00000200);
389*3c13be86SJamin Lin 
390*3c13be86SJamin Lin     /* Clear IRQ status and check status is deasserted */
391*3c13be86SJamin Lin     qtest_writel(s, base + HACE_STS, 0x00000200);
392*3c13be86SJamin Lin     g_assert_cmphex(qtest_readl(s, base + HACE_STS), ==, 0);
393*3c13be86SJamin Lin 
394*3c13be86SJamin Lin     /* Read computed digest from memory */
395*3c13be86SJamin Lin     qtest_memread(s, digest_addr, digest, sizeof(digest));
396*3c13be86SJamin Lin 
397*3c13be86SJamin Lin     /* Check result of computation */
398*3c13be86SJamin Lin     g_assert_cmpmem(digest, sizeof(digest),
399*3c13be86SJamin Lin                     test_result_sg_sha384, sizeof(digest));
400*3c13be86SJamin Lin 
401*3c13be86SJamin Lin     qtest_quit(s);
402*3c13be86SJamin Lin }
403*3c13be86SJamin Lin 
40470985b0eSJamin Lin void aspeed_test_sha512_sg(const char *machine, const uint32_t base,
40570985b0eSJamin Lin                            const uint32_t src_addr)
40670985b0eSJamin Lin {
40770985b0eSJamin Lin     QTestState *s = qtest_init(machine);
40870985b0eSJamin Lin 
409a3e7f6d0SJamin Lin     const uint32_t src_addr_1 = src_addr + 0x10000;
410a3e7f6d0SJamin Lin     const uint32_t src_addr_2 = src_addr + 0x20000;
411a3e7f6d0SJamin Lin     const uint32_t src_addr_3 = src_addr + 0x30000;
412a3e7f6d0SJamin Lin     const uint32_t digest_addr = src_addr + 0x40000;
41370985b0eSJamin Lin     uint8_t digest[64] = {0};
41470985b0eSJamin Lin     struct AspeedSgList array[] = {
41570985b0eSJamin Lin         {  cpu_to_le32(sizeof(test_vector_sg1)),
41670985b0eSJamin Lin            cpu_to_le32(src_addr_1) },
41770985b0eSJamin Lin         {  cpu_to_le32(sizeof(test_vector_sg2)),
41870985b0eSJamin Lin            cpu_to_le32(src_addr_2) },
41970985b0eSJamin Lin         {  cpu_to_le32(sizeof(test_vector_sg3) | SG_LIST_LEN_LAST),
42070985b0eSJamin Lin            cpu_to_le32(src_addr_3) },
42170985b0eSJamin Lin     };
42270985b0eSJamin Lin 
42370985b0eSJamin Lin     /* Check engine is idle, no busy or irq bits set */
42470985b0eSJamin Lin     g_assert_cmphex(qtest_readl(s, base + HACE_STS), ==, 0);
42570985b0eSJamin Lin 
42670985b0eSJamin Lin     /* Write test vector into memory */
42770985b0eSJamin Lin     qtest_memwrite(s, src_addr_1, test_vector_sg1, sizeof(test_vector_sg1));
42870985b0eSJamin Lin     qtest_memwrite(s, src_addr_2, test_vector_sg2, sizeof(test_vector_sg2));
42970985b0eSJamin Lin     qtest_memwrite(s, src_addr_3, test_vector_sg3, sizeof(test_vector_sg3));
43070985b0eSJamin Lin     qtest_memwrite(s, src_addr, array, sizeof(array));
43170985b0eSJamin Lin 
43270985b0eSJamin Lin     write_regs(s, base, src_addr,
43370985b0eSJamin Lin                (sizeof(test_vector_sg1)
43470985b0eSJamin Lin                 + sizeof(test_vector_sg2)
43570985b0eSJamin Lin                 + sizeof(test_vector_sg3)),
43670985b0eSJamin Lin                digest_addr, HACE_ALGO_SHA512 | HACE_SG_EN);
43770985b0eSJamin Lin 
43870985b0eSJamin Lin     /* Check hash IRQ status is asserted */
43970985b0eSJamin Lin     g_assert_cmphex(qtest_readl(s, base + HACE_STS), ==, 0x00000200);
44070985b0eSJamin Lin 
44170985b0eSJamin Lin     /* Clear IRQ status and check status is deasserted */
44270985b0eSJamin Lin     qtest_writel(s, base + HACE_STS, 0x00000200);
44370985b0eSJamin Lin     g_assert_cmphex(qtest_readl(s, base + HACE_STS), ==, 0);
44470985b0eSJamin Lin 
44570985b0eSJamin Lin     /* Read computed digest from memory */
44670985b0eSJamin Lin     qtest_memread(s, digest_addr, digest, sizeof(digest));
44770985b0eSJamin Lin 
44870985b0eSJamin Lin     /* Check result of computation */
44970985b0eSJamin Lin     g_assert_cmpmem(digest, sizeof(digest),
45070985b0eSJamin Lin                     test_result_sg_sha512, sizeof(digest));
45170985b0eSJamin Lin 
45270985b0eSJamin Lin     qtest_quit(s);
45370985b0eSJamin Lin }
45470985b0eSJamin Lin 
45570985b0eSJamin Lin void aspeed_test_sha256_accum(const char *machine, const uint32_t base,
45670985b0eSJamin Lin                               const uint32_t src_addr)
45770985b0eSJamin Lin {
45870985b0eSJamin Lin     QTestState *s = qtest_init(machine);
45970985b0eSJamin Lin 
460a3e7f6d0SJamin Lin     const uint32_t buffer_addr = src_addr + 0x10000;
461a3e7f6d0SJamin Lin     const uint32_t digest_addr = src_addr + 0x40000;
46270985b0eSJamin Lin     uint8_t digest[32] = {0};
46370985b0eSJamin Lin     struct AspeedSgList array[] = {
46470985b0eSJamin Lin         {  cpu_to_le32(sizeof(test_vector_accum_256) | SG_LIST_LEN_LAST),
46570985b0eSJamin Lin            cpu_to_le32(buffer_addr) },
46670985b0eSJamin Lin     };
46770985b0eSJamin Lin 
46870985b0eSJamin Lin     /* Check engine is idle, no busy or irq bits set */
46970985b0eSJamin Lin     g_assert_cmphex(qtest_readl(s, base + HACE_STS), ==, 0);
47070985b0eSJamin Lin 
47170985b0eSJamin Lin     /* Write test vector into memory */
47270985b0eSJamin Lin     qtest_memwrite(s, buffer_addr, test_vector_accum_256,
47370985b0eSJamin Lin                    sizeof(test_vector_accum_256));
47470985b0eSJamin Lin     qtest_memwrite(s, src_addr, array, sizeof(array));
47570985b0eSJamin Lin 
47670985b0eSJamin Lin     write_regs(s, base, src_addr, sizeof(test_vector_accum_256),
47770985b0eSJamin Lin                digest_addr, HACE_ALGO_SHA256 | HACE_SG_EN | HACE_ACCUM_EN);
47870985b0eSJamin Lin 
47970985b0eSJamin Lin     /* Check hash IRQ status is asserted */
48070985b0eSJamin Lin     g_assert_cmphex(qtest_readl(s, base + HACE_STS), ==, 0x00000200);
48170985b0eSJamin Lin 
48270985b0eSJamin Lin     /* Clear IRQ status and check status is deasserted */
48370985b0eSJamin Lin     qtest_writel(s, base + HACE_STS, 0x00000200);
48470985b0eSJamin Lin     g_assert_cmphex(qtest_readl(s, base + HACE_STS), ==, 0);
48570985b0eSJamin Lin 
48670985b0eSJamin Lin     /* Read computed digest from memory */
48770985b0eSJamin Lin     qtest_memread(s, digest_addr, digest, sizeof(digest));
48870985b0eSJamin Lin 
48970985b0eSJamin Lin     /* Check result of computation */
49070985b0eSJamin Lin     g_assert_cmpmem(digest, sizeof(digest),
49170985b0eSJamin Lin                     test_result_accum_sha256, sizeof(digest));
49270985b0eSJamin Lin 
49370985b0eSJamin Lin     qtest_quit(s);
49470985b0eSJamin Lin }
49570985b0eSJamin Lin 
496*3c13be86SJamin Lin void aspeed_test_sha384_accum(const char *machine, const uint32_t base,
497*3c13be86SJamin Lin                               const uint32_t src_addr)
498*3c13be86SJamin Lin {
499*3c13be86SJamin Lin     QTestState *s = qtest_init(machine);
500*3c13be86SJamin Lin 
501*3c13be86SJamin Lin     const uint32_t buffer_addr = src_addr + 0x10000;
502*3c13be86SJamin Lin     const uint32_t digest_addr = src_addr + 0x40000;
503*3c13be86SJamin Lin     uint8_t digest[48] = {0};
504*3c13be86SJamin Lin     struct AspeedSgList array[] = {
505*3c13be86SJamin Lin         {  cpu_to_le32(sizeof(test_vector_accum_384) | SG_LIST_LEN_LAST),
506*3c13be86SJamin Lin            cpu_to_le32(buffer_addr) },
507*3c13be86SJamin Lin     };
508*3c13be86SJamin Lin 
509*3c13be86SJamin Lin     /* Check engine is idle, no busy or irq bits set */
510*3c13be86SJamin Lin     g_assert_cmphex(qtest_readl(s, base + HACE_STS), ==, 0);
511*3c13be86SJamin Lin 
512*3c13be86SJamin Lin     /* Write test vector into memory */
513*3c13be86SJamin Lin     qtest_memwrite(s, buffer_addr, test_vector_accum_384,
514*3c13be86SJamin Lin                    sizeof(test_vector_accum_384));
515*3c13be86SJamin Lin     qtest_memwrite(s, src_addr, array, sizeof(array));
516*3c13be86SJamin Lin 
517*3c13be86SJamin Lin     write_regs(s, base, src_addr, sizeof(test_vector_accum_384),
518*3c13be86SJamin Lin                digest_addr, HACE_ALGO_SHA384 | HACE_SG_EN | HACE_ACCUM_EN);
519*3c13be86SJamin Lin 
520*3c13be86SJamin Lin     /* Check hash IRQ status is asserted */
521*3c13be86SJamin Lin     g_assert_cmphex(qtest_readl(s, base + HACE_STS), ==, 0x00000200);
522*3c13be86SJamin Lin 
523*3c13be86SJamin Lin     /* Clear IRQ status and check status is deasserted */
524*3c13be86SJamin Lin     qtest_writel(s, base + HACE_STS, 0x00000200);
525*3c13be86SJamin Lin     g_assert_cmphex(qtest_readl(s, base + HACE_STS), ==, 0);
526*3c13be86SJamin Lin 
527*3c13be86SJamin Lin     /* Read computed digest from memory */
528*3c13be86SJamin Lin     qtest_memread(s, digest_addr, digest, sizeof(digest));
529*3c13be86SJamin Lin 
530*3c13be86SJamin Lin     /* Check result of computation */
531*3c13be86SJamin Lin     g_assert_cmpmem(digest, sizeof(digest),
532*3c13be86SJamin Lin                     test_result_accum_sha384, sizeof(digest));
533*3c13be86SJamin Lin 
534*3c13be86SJamin Lin     qtest_quit(s);
535*3c13be86SJamin Lin }
536*3c13be86SJamin Lin 
53770985b0eSJamin Lin void aspeed_test_sha512_accum(const char *machine, const uint32_t base,
53870985b0eSJamin Lin                               const uint32_t src_addr)
53970985b0eSJamin Lin {
54070985b0eSJamin Lin     QTestState *s = qtest_init(machine);
54170985b0eSJamin Lin 
542a3e7f6d0SJamin Lin     const uint32_t buffer_addr = src_addr + 0x10000;
543a3e7f6d0SJamin Lin     const uint32_t digest_addr = src_addr + 0x40000;
54470985b0eSJamin Lin     uint8_t digest[64] = {0};
54570985b0eSJamin Lin     struct AspeedSgList array[] = {
54670985b0eSJamin Lin         {  cpu_to_le32(sizeof(test_vector_accum_512) | SG_LIST_LEN_LAST),
54770985b0eSJamin Lin            cpu_to_le32(buffer_addr) },
54870985b0eSJamin Lin     };
54970985b0eSJamin Lin 
55070985b0eSJamin Lin     /* Check engine is idle, no busy or irq bits set */
55170985b0eSJamin Lin     g_assert_cmphex(qtest_readl(s, base + HACE_STS), ==, 0);
55270985b0eSJamin Lin 
55370985b0eSJamin Lin     /* Write test vector into memory */
55470985b0eSJamin Lin     qtest_memwrite(s, buffer_addr, test_vector_accum_512,
55570985b0eSJamin Lin                    sizeof(test_vector_accum_512));
55670985b0eSJamin Lin     qtest_memwrite(s, src_addr, array, sizeof(array));
55770985b0eSJamin Lin 
55870985b0eSJamin Lin     write_regs(s, base, src_addr, sizeof(test_vector_accum_512),
55970985b0eSJamin Lin                digest_addr, HACE_ALGO_SHA512 | HACE_SG_EN | HACE_ACCUM_EN);
56070985b0eSJamin Lin 
56170985b0eSJamin Lin     /* Check hash IRQ status is asserted */
56270985b0eSJamin Lin     g_assert_cmphex(qtest_readl(s, base + HACE_STS), ==, 0x00000200);
56370985b0eSJamin Lin 
56470985b0eSJamin Lin     /* Clear IRQ status and check status is deasserted */
56570985b0eSJamin Lin     qtest_writel(s, base + HACE_STS, 0x00000200);
56670985b0eSJamin Lin     g_assert_cmphex(qtest_readl(s, base + HACE_STS), ==, 0);
56770985b0eSJamin Lin 
56870985b0eSJamin Lin     /* Read computed digest from memory */
56970985b0eSJamin Lin     qtest_memread(s, digest_addr, digest, sizeof(digest));
57070985b0eSJamin Lin 
57170985b0eSJamin Lin     /* Check result of computation */
57270985b0eSJamin Lin     g_assert_cmpmem(digest, sizeof(digest),
57370985b0eSJamin Lin                     test_result_accum_sha512, sizeof(digest));
57470985b0eSJamin Lin 
57570985b0eSJamin Lin     qtest_quit(s);
57670985b0eSJamin Lin }
57770985b0eSJamin Lin 
57870985b0eSJamin Lin void aspeed_test_addresses(const char *machine, const uint32_t base,
57970985b0eSJamin Lin                            const struct AspeedMasks *expected)
58070985b0eSJamin Lin {
58170985b0eSJamin Lin     QTestState *s = qtest_init(machine);
58270985b0eSJamin Lin 
58370985b0eSJamin Lin     /*
58470985b0eSJamin Lin      * Check command mode is zero, meaning engine is in direct access mode,
58570985b0eSJamin Lin      * as this affects the masking behavior of the HASH_SRC register.
58670985b0eSJamin Lin      */
58770985b0eSJamin Lin     g_assert_cmphex(qtest_readl(s, base + HACE_CMD), ==, 0);
58870985b0eSJamin Lin     g_assert_cmphex(qtest_readl(s, base + HACE_HASH_SRC), ==, 0);
58970985b0eSJamin Lin     g_assert_cmphex(qtest_readl(s, base + HACE_HASH_DIGEST), ==, 0);
59070985b0eSJamin Lin     g_assert_cmphex(qtest_readl(s, base + HACE_HASH_DATA_LEN), ==, 0);
59170985b0eSJamin Lin 
59270985b0eSJamin Lin 
59370985b0eSJamin Lin     /* Check that the address masking is correct */
59470985b0eSJamin Lin     qtest_writel(s, base + HACE_HASH_SRC, 0xffffffff);
59570985b0eSJamin Lin     g_assert_cmphex(qtest_readl(s, base + HACE_HASH_SRC), ==, expected->src);
59670985b0eSJamin Lin 
59770985b0eSJamin Lin     qtest_writel(s, base + HACE_HASH_DIGEST, 0xffffffff);
59870985b0eSJamin Lin     g_assert_cmphex(qtest_readl(s, base + HACE_HASH_DIGEST), ==,
59970985b0eSJamin Lin                     expected->dest);
60070985b0eSJamin Lin 
60170985b0eSJamin Lin     qtest_writel(s, base + HACE_HASH_DATA_LEN, 0xffffffff);
60270985b0eSJamin Lin     g_assert_cmphex(qtest_readl(s, base + HACE_HASH_DATA_LEN), ==,
60370985b0eSJamin Lin                     expected->len);
60470985b0eSJamin Lin 
60570985b0eSJamin Lin     /* Reset to zero */
60670985b0eSJamin Lin     qtest_writel(s, base + HACE_HASH_SRC, 0);
60770985b0eSJamin Lin     qtest_writel(s, base + HACE_HASH_DIGEST, 0);
60870985b0eSJamin Lin     qtest_writel(s, base + HACE_HASH_DATA_LEN, 0);
60970985b0eSJamin Lin 
61070985b0eSJamin Lin     /* Check that all bits are now zero */
61170985b0eSJamin Lin     g_assert_cmphex(qtest_readl(s, base + HACE_HASH_SRC), ==, 0);
61270985b0eSJamin Lin     g_assert_cmphex(qtest_readl(s, base + HACE_HASH_DIGEST), ==, 0);
61370985b0eSJamin Lin     g_assert_cmphex(qtest_readl(s, base + HACE_HASH_DATA_LEN), ==, 0);
61470985b0eSJamin Lin 
61570985b0eSJamin Lin     qtest_quit(s);
61670985b0eSJamin Lin }
61770985b0eSJamin Lin 
618