xref: /qemu/tests/qtest/aspeed-hace-utils.c (revision dcdbbd45a86ad47327282aa3301622cbe65e9fdb)
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 
156*dcdbbd45SJamin Lin static void write_regs(QTestState *s, uint32_t base, uint64_t src,
157*dcdbbd45SJamin Lin                        uint32_t length, uint64_t out, uint32_t method)
15870985b0eSJamin Lin {
159*dcdbbd45SJamin Lin         qtest_writel(s, base + HACE_HASH_SRC, extract64(src, 0, 32));
160*dcdbbd45SJamin Lin         qtest_writel(s, base + HACE_HASH_DIGEST, extract64(out, 0, 32));
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,
166*dcdbbd45SJamin Lin                      const uint64_t src_addr)
16770985b0eSJamin Lin 
16870985b0eSJamin Lin {
16970985b0eSJamin Lin     QTestState *s = qtest_init(machine);
17070985b0eSJamin Lin 
171*dcdbbd45SJamin Lin     uint64_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,
201*dcdbbd45SJamin Lin                         const uint64_t src_addr)
20270985b0eSJamin Lin {
20370985b0eSJamin Lin     QTestState *s = qtest_init(machine);
20470985b0eSJamin Lin 
205*dcdbbd45SJamin Lin     const uint64_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 
2343c13be86SJamin Lin void aspeed_test_sha384(const char *machine, const uint32_t base,
235*dcdbbd45SJamin Lin                         const uint64_t src_addr)
2363c13be86SJamin Lin {
2373c13be86SJamin Lin     QTestState *s = qtest_init(machine);
2383c13be86SJamin Lin 
239*dcdbbd45SJamin Lin     const uint64_t digest_addr = src_addr + 0x10000;
2403c13be86SJamin Lin     uint8_t digest[48] = {0};
2413c13be86SJamin Lin 
2423c13be86SJamin Lin     /* Check engine is idle, no busy or irq bits set */
2433c13be86SJamin Lin     g_assert_cmphex(qtest_readl(s, base + HACE_STS), ==, 0);
2443c13be86SJamin Lin 
2453c13be86SJamin Lin     /* Write test vector into memory */
2463c13be86SJamin Lin     qtest_memwrite(s, src_addr, test_vector, sizeof(test_vector));
2473c13be86SJamin Lin 
2483c13be86SJamin Lin     write_regs(s, base, src_addr, sizeof(test_vector), digest_addr,
2493c13be86SJamin Lin                HACE_ALGO_SHA384);
2503c13be86SJamin Lin 
2513c13be86SJamin Lin     /* Check hash IRQ status is asserted */
2523c13be86SJamin Lin     g_assert_cmphex(qtest_readl(s, base + HACE_STS), ==, 0x00000200);
2533c13be86SJamin Lin 
2543c13be86SJamin Lin     /* Clear IRQ status and check status is deasserted */
2553c13be86SJamin Lin     qtest_writel(s, base + HACE_STS, 0x00000200);
2563c13be86SJamin Lin     g_assert_cmphex(qtest_readl(s, base + HACE_STS), ==, 0);
2573c13be86SJamin Lin 
2583c13be86SJamin Lin     /* Read computed digest from memory */
2593c13be86SJamin Lin     qtest_memread(s, digest_addr, digest, sizeof(digest));
2603c13be86SJamin Lin 
2613c13be86SJamin Lin     /* Check result of computation */
2623c13be86SJamin Lin     g_assert_cmpmem(digest, sizeof(digest),
2633c13be86SJamin Lin                     test_result_sha384, sizeof(digest));
2643c13be86SJamin Lin 
2653c13be86SJamin Lin     qtest_quit(s);
2663c13be86SJamin Lin }
2673c13be86SJamin Lin 
26870985b0eSJamin Lin void aspeed_test_sha512(const char *machine, const uint32_t base,
269*dcdbbd45SJamin Lin                         const uint64_t src_addr)
27070985b0eSJamin Lin {
27170985b0eSJamin Lin     QTestState *s = qtest_init(machine);
27270985b0eSJamin Lin 
273*dcdbbd45SJamin Lin     const uint64_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,
303*dcdbbd45SJamin Lin                            const uint64_t src_addr)
30470985b0eSJamin Lin {
30570985b0eSJamin Lin     QTestState *s = qtest_init(machine);
30670985b0eSJamin Lin 
307*dcdbbd45SJamin Lin     const uint64_t src_addr_1 = src_addr + 0x10000;
308*dcdbbd45SJamin Lin     const uint64_t src_addr_2 = src_addr + 0x20000;
309*dcdbbd45SJamin Lin     const uint64_t src_addr_3 = src_addr + 0x30000;
310*dcdbbd45SJamin Lin     const uint64_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 
3533c13be86SJamin Lin void aspeed_test_sha384_sg(const char *machine, const uint32_t base,
354*dcdbbd45SJamin Lin                            const uint64_t src_addr)
3553c13be86SJamin Lin {
3563c13be86SJamin Lin     QTestState *s = qtest_init(machine);
3573c13be86SJamin Lin 
358*dcdbbd45SJamin Lin     const uint64_t src_addr_1 = src_addr + 0x10000;
359*dcdbbd45SJamin Lin     const uint64_t src_addr_2 = src_addr + 0x20000;
360*dcdbbd45SJamin Lin     const uint64_t src_addr_3 = src_addr + 0x30000;
361*dcdbbd45SJamin Lin     const uint64_t digest_addr = src_addr + 0x40000;
3623c13be86SJamin Lin     uint8_t digest[48] = {0};
3633c13be86SJamin Lin     struct AspeedSgList array[] = {
3643c13be86SJamin Lin         {  cpu_to_le32(sizeof(test_vector_sg1)),
3653c13be86SJamin Lin            cpu_to_le32(src_addr_1) },
3663c13be86SJamin Lin         {  cpu_to_le32(sizeof(test_vector_sg2)),
3673c13be86SJamin Lin            cpu_to_le32(src_addr_2) },
3683c13be86SJamin Lin         {  cpu_to_le32(sizeof(test_vector_sg3) | SG_LIST_LEN_LAST),
3693c13be86SJamin Lin            cpu_to_le32(src_addr_3) },
3703c13be86SJamin Lin     };
3713c13be86SJamin Lin 
3723c13be86SJamin Lin     /* Check engine is idle, no busy or irq bits set */
3733c13be86SJamin Lin     g_assert_cmphex(qtest_readl(s, base + HACE_STS), ==, 0);
3743c13be86SJamin Lin 
3753c13be86SJamin Lin     /* Write test vector into memory */
3763c13be86SJamin Lin     qtest_memwrite(s, src_addr_1, test_vector_sg1, sizeof(test_vector_sg1));
3773c13be86SJamin Lin     qtest_memwrite(s, src_addr_2, test_vector_sg2, sizeof(test_vector_sg2));
3783c13be86SJamin Lin     qtest_memwrite(s, src_addr_3, test_vector_sg3, sizeof(test_vector_sg3));
3793c13be86SJamin Lin     qtest_memwrite(s, src_addr, array, sizeof(array));
3803c13be86SJamin Lin 
3813c13be86SJamin Lin     write_regs(s, base, src_addr,
3823c13be86SJamin Lin                (sizeof(test_vector_sg1)
3833c13be86SJamin Lin                 + sizeof(test_vector_sg2)
3843c13be86SJamin Lin                 + sizeof(test_vector_sg3)),
3853c13be86SJamin Lin                digest_addr, HACE_ALGO_SHA384 | HACE_SG_EN);
3863c13be86SJamin Lin 
3873c13be86SJamin Lin     /* Check hash IRQ status is asserted */
3883c13be86SJamin Lin     g_assert_cmphex(qtest_readl(s, base + HACE_STS), ==, 0x00000200);
3893c13be86SJamin Lin 
3903c13be86SJamin Lin     /* Clear IRQ status and check status is deasserted */
3913c13be86SJamin Lin     qtest_writel(s, base + HACE_STS, 0x00000200);
3923c13be86SJamin Lin     g_assert_cmphex(qtest_readl(s, base + HACE_STS), ==, 0);
3933c13be86SJamin Lin 
3943c13be86SJamin Lin     /* Read computed digest from memory */
3953c13be86SJamin Lin     qtest_memread(s, digest_addr, digest, sizeof(digest));
3963c13be86SJamin Lin 
3973c13be86SJamin Lin     /* Check result of computation */
3983c13be86SJamin Lin     g_assert_cmpmem(digest, sizeof(digest),
3993c13be86SJamin Lin                     test_result_sg_sha384, sizeof(digest));
4003c13be86SJamin Lin 
4013c13be86SJamin Lin     qtest_quit(s);
4023c13be86SJamin Lin }
4033c13be86SJamin Lin 
40470985b0eSJamin Lin void aspeed_test_sha512_sg(const char *machine, const uint32_t base,
405*dcdbbd45SJamin Lin                            const uint64_t src_addr)
40670985b0eSJamin Lin {
40770985b0eSJamin Lin     QTestState *s = qtest_init(machine);
40870985b0eSJamin Lin 
409*dcdbbd45SJamin Lin     const uint64_t src_addr_1 = src_addr + 0x10000;
410*dcdbbd45SJamin Lin     const uint64_t src_addr_2 = src_addr + 0x20000;
411*dcdbbd45SJamin Lin     const uint64_t src_addr_3 = src_addr + 0x30000;
412*dcdbbd45SJamin Lin     const uint64_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,
456*dcdbbd45SJamin Lin                               const uint64_t src_addr)
45770985b0eSJamin Lin {
45870985b0eSJamin Lin     QTestState *s = qtest_init(machine);
45970985b0eSJamin Lin 
460*dcdbbd45SJamin Lin     const uint64_t buffer_addr = src_addr + 0x10000;
461*dcdbbd45SJamin Lin     const uint64_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 
4963c13be86SJamin Lin void aspeed_test_sha384_accum(const char *machine, const uint32_t base,
497*dcdbbd45SJamin Lin                               const uint64_t src_addr)
4983c13be86SJamin Lin {
4993c13be86SJamin Lin     QTestState *s = qtest_init(machine);
5003c13be86SJamin Lin 
501*dcdbbd45SJamin Lin     const uint64_t buffer_addr = src_addr + 0x10000;
502*dcdbbd45SJamin Lin     const uint64_t digest_addr = src_addr + 0x40000;
5033c13be86SJamin Lin     uint8_t digest[48] = {0};
5043c13be86SJamin Lin     struct AspeedSgList array[] = {
5053c13be86SJamin Lin         {  cpu_to_le32(sizeof(test_vector_accum_384) | SG_LIST_LEN_LAST),
5063c13be86SJamin Lin            cpu_to_le32(buffer_addr) },
5073c13be86SJamin Lin     };
5083c13be86SJamin Lin 
5093c13be86SJamin Lin     /* Check engine is idle, no busy or irq bits set */
5103c13be86SJamin Lin     g_assert_cmphex(qtest_readl(s, base + HACE_STS), ==, 0);
5113c13be86SJamin Lin 
5123c13be86SJamin Lin     /* Write test vector into memory */
5133c13be86SJamin Lin     qtest_memwrite(s, buffer_addr, test_vector_accum_384,
5143c13be86SJamin Lin                    sizeof(test_vector_accum_384));
5153c13be86SJamin Lin     qtest_memwrite(s, src_addr, array, sizeof(array));
5163c13be86SJamin Lin 
5173c13be86SJamin Lin     write_regs(s, base, src_addr, sizeof(test_vector_accum_384),
5183c13be86SJamin Lin                digest_addr, HACE_ALGO_SHA384 | HACE_SG_EN | HACE_ACCUM_EN);
5193c13be86SJamin Lin 
5203c13be86SJamin Lin     /* Check hash IRQ status is asserted */
5213c13be86SJamin Lin     g_assert_cmphex(qtest_readl(s, base + HACE_STS), ==, 0x00000200);
5223c13be86SJamin Lin 
5233c13be86SJamin Lin     /* Clear IRQ status and check status is deasserted */
5243c13be86SJamin Lin     qtest_writel(s, base + HACE_STS, 0x00000200);
5253c13be86SJamin Lin     g_assert_cmphex(qtest_readl(s, base + HACE_STS), ==, 0);
5263c13be86SJamin Lin 
5273c13be86SJamin Lin     /* Read computed digest from memory */
5283c13be86SJamin Lin     qtest_memread(s, digest_addr, digest, sizeof(digest));
5293c13be86SJamin Lin 
5303c13be86SJamin Lin     /* Check result of computation */
5313c13be86SJamin Lin     g_assert_cmpmem(digest, sizeof(digest),
5323c13be86SJamin Lin                     test_result_accum_sha384, sizeof(digest));
5333c13be86SJamin Lin 
5343c13be86SJamin Lin     qtest_quit(s);
5353c13be86SJamin Lin }
5363c13be86SJamin Lin 
53770985b0eSJamin Lin void aspeed_test_sha512_accum(const char *machine, const uint32_t base,
538*dcdbbd45SJamin Lin                               const uint64_t src_addr)
53970985b0eSJamin Lin {
54070985b0eSJamin Lin     QTestState *s = qtest_init(machine);
54170985b0eSJamin Lin 
542*dcdbbd45SJamin Lin     const uint64_t buffer_addr = src_addr + 0x10000;
543*dcdbbd45SJamin Lin     const uint64_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