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