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 156dcdbbd45SJamin Lin static void write_regs(QTestState *s, uint32_t base, uint64_t src, 157dcdbbd45SJamin Lin uint32_t length, uint64_t out, uint32_t method) 15870985b0eSJamin Lin { 159dcdbbd45SJamin Lin qtest_writel(s, base + HACE_HASH_SRC, extract64(src, 0, 32)); 1605ced818eSJamin Lin qtest_writel(s, base + HACE_HASH_SRC_HI, extract64(src, 32, 32)); 161dcdbbd45SJamin Lin qtest_writel(s, base + HACE_HASH_DIGEST, extract64(out, 0, 32)); 1625ced818eSJamin Lin qtest_writel(s, base + HACE_HASH_DIGEST_HI, extract64(out, 32, 32)); 16370985b0eSJamin Lin qtest_writel(s, base + HACE_HASH_DATA_LEN, length); 16470985b0eSJamin Lin qtest_writel(s, base + HACE_HASH_CMD, HACE_SHA_BE_EN | method); 16570985b0eSJamin Lin } 16670985b0eSJamin Lin 16770985b0eSJamin Lin void aspeed_test_md5(const char *machine, const uint32_t base, 168dcdbbd45SJamin Lin const uint64_t src_addr) 16970985b0eSJamin Lin 17070985b0eSJamin Lin { 17170985b0eSJamin Lin QTestState *s = qtest_init(machine); 17270985b0eSJamin Lin 173dcdbbd45SJamin Lin uint64_t digest_addr = src_addr + 0x010000; 17470985b0eSJamin Lin uint8_t digest[16] = {0}; 17570985b0eSJamin Lin 17670985b0eSJamin Lin /* Check engine is idle, no busy or irq bits set */ 17770985b0eSJamin Lin g_assert_cmphex(qtest_readl(s, base + HACE_STS), ==, 0); 17870985b0eSJamin Lin 17970985b0eSJamin Lin /* Write test vector into memory */ 18070985b0eSJamin Lin qtest_memwrite(s, src_addr, test_vector, sizeof(test_vector)); 18170985b0eSJamin Lin 18270985b0eSJamin Lin write_regs(s, base, src_addr, sizeof(test_vector), 18370985b0eSJamin Lin digest_addr, HACE_ALGO_MD5); 18470985b0eSJamin Lin 18570985b0eSJamin Lin /* Check hash IRQ status is asserted */ 18670985b0eSJamin Lin g_assert_cmphex(qtest_readl(s, base + HACE_STS), ==, 0x00000200); 18770985b0eSJamin Lin 18870985b0eSJamin Lin /* Clear IRQ status and check status is deasserted */ 18970985b0eSJamin Lin qtest_writel(s, base + HACE_STS, 0x00000200); 19070985b0eSJamin Lin g_assert_cmphex(qtest_readl(s, base + HACE_STS), ==, 0); 19170985b0eSJamin Lin 19270985b0eSJamin Lin /* Read computed digest from memory */ 19370985b0eSJamin Lin qtest_memread(s, digest_addr, digest, sizeof(digest)); 19470985b0eSJamin Lin 19570985b0eSJamin Lin /* Check result of computation */ 19670985b0eSJamin Lin g_assert_cmpmem(digest, sizeof(digest), 19770985b0eSJamin Lin test_result_md5, sizeof(digest)); 19870985b0eSJamin Lin 19970985b0eSJamin Lin qtest_quit(s); 20070985b0eSJamin Lin } 20170985b0eSJamin Lin 20270985b0eSJamin Lin void aspeed_test_sha256(const char *machine, const uint32_t base, 203dcdbbd45SJamin Lin const uint64_t src_addr) 20470985b0eSJamin Lin { 20570985b0eSJamin Lin QTestState *s = qtest_init(machine); 20670985b0eSJamin Lin 207dcdbbd45SJamin Lin const uint64_t digest_addr = src_addr + 0x10000; 20870985b0eSJamin Lin uint8_t digest[32] = {0}; 20970985b0eSJamin Lin 21070985b0eSJamin Lin /* Check engine is idle, no busy or irq bits set */ 21170985b0eSJamin Lin g_assert_cmphex(qtest_readl(s, base + HACE_STS), ==, 0); 21270985b0eSJamin Lin 21370985b0eSJamin Lin /* Write test vector into memory */ 21470985b0eSJamin Lin qtest_memwrite(s, src_addr, test_vector, sizeof(test_vector)); 21570985b0eSJamin Lin 21670985b0eSJamin Lin write_regs(s, base, src_addr, sizeof(test_vector), digest_addr, 21770985b0eSJamin Lin HACE_ALGO_SHA256); 21870985b0eSJamin Lin 21970985b0eSJamin Lin /* Check hash IRQ status is asserted */ 22070985b0eSJamin Lin g_assert_cmphex(qtest_readl(s, base + HACE_STS), ==, 0x00000200); 22170985b0eSJamin Lin 22270985b0eSJamin Lin /* Clear IRQ status and check status is deasserted */ 22370985b0eSJamin Lin qtest_writel(s, base + HACE_STS, 0x00000200); 22470985b0eSJamin Lin g_assert_cmphex(qtest_readl(s, base + HACE_STS), ==, 0); 22570985b0eSJamin Lin 22670985b0eSJamin Lin /* Read computed digest from memory */ 22770985b0eSJamin Lin qtest_memread(s, digest_addr, digest, sizeof(digest)); 22870985b0eSJamin Lin 22970985b0eSJamin Lin /* Check result of computation */ 23070985b0eSJamin Lin g_assert_cmpmem(digest, sizeof(digest), 23170985b0eSJamin Lin test_result_sha256, sizeof(digest)); 23270985b0eSJamin Lin 23370985b0eSJamin Lin qtest_quit(s); 23470985b0eSJamin Lin } 23570985b0eSJamin Lin 2363c13be86SJamin Lin void aspeed_test_sha384(const char *machine, const uint32_t base, 237dcdbbd45SJamin Lin const uint64_t src_addr) 2383c13be86SJamin Lin { 2393c13be86SJamin Lin QTestState *s = qtest_init(machine); 2403c13be86SJamin Lin 241dcdbbd45SJamin Lin const uint64_t digest_addr = src_addr + 0x10000; 2423c13be86SJamin Lin uint8_t digest[48] = {0}; 2433c13be86SJamin Lin 2443c13be86SJamin Lin /* Check engine is idle, no busy or irq bits set */ 2453c13be86SJamin Lin g_assert_cmphex(qtest_readl(s, base + HACE_STS), ==, 0); 2463c13be86SJamin Lin 2473c13be86SJamin Lin /* Write test vector into memory */ 2483c13be86SJamin Lin qtest_memwrite(s, src_addr, test_vector, sizeof(test_vector)); 2493c13be86SJamin Lin 2503c13be86SJamin Lin write_regs(s, base, src_addr, sizeof(test_vector), digest_addr, 2513c13be86SJamin Lin HACE_ALGO_SHA384); 2523c13be86SJamin Lin 2533c13be86SJamin Lin /* Check hash IRQ status is asserted */ 2543c13be86SJamin Lin g_assert_cmphex(qtest_readl(s, base + HACE_STS), ==, 0x00000200); 2553c13be86SJamin Lin 2563c13be86SJamin Lin /* Clear IRQ status and check status is deasserted */ 2573c13be86SJamin Lin qtest_writel(s, base + HACE_STS, 0x00000200); 2583c13be86SJamin Lin g_assert_cmphex(qtest_readl(s, base + HACE_STS), ==, 0); 2593c13be86SJamin Lin 2603c13be86SJamin Lin /* Read computed digest from memory */ 2613c13be86SJamin Lin qtest_memread(s, digest_addr, digest, sizeof(digest)); 2623c13be86SJamin Lin 2633c13be86SJamin Lin /* Check result of computation */ 2643c13be86SJamin Lin g_assert_cmpmem(digest, sizeof(digest), 2653c13be86SJamin Lin test_result_sha384, sizeof(digest)); 2663c13be86SJamin Lin 2673c13be86SJamin Lin qtest_quit(s); 2683c13be86SJamin Lin } 2693c13be86SJamin Lin 27070985b0eSJamin Lin void aspeed_test_sha512(const char *machine, const uint32_t base, 271dcdbbd45SJamin Lin const uint64_t src_addr) 27270985b0eSJamin Lin { 27370985b0eSJamin Lin QTestState *s = qtest_init(machine); 27470985b0eSJamin Lin 275dcdbbd45SJamin Lin const uint64_t digest_addr = src_addr + 0x10000; 27670985b0eSJamin Lin uint8_t digest[64] = {0}; 27770985b0eSJamin Lin 27870985b0eSJamin Lin /* Check engine is idle, no busy or irq bits set */ 27970985b0eSJamin Lin g_assert_cmphex(qtest_readl(s, base + HACE_STS), ==, 0); 28070985b0eSJamin Lin 28170985b0eSJamin Lin /* Write test vector into memory */ 28270985b0eSJamin Lin qtest_memwrite(s, src_addr, test_vector, sizeof(test_vector)); 28370985b0eSJamin Lin 28470985b0eSJamin Lin write_regs(s, base, src_addr, sizeof(test_vector), digest_addr, 28570985b0eSJamin Lin HACE_ALGO_SHA512); 28670985b0eSJamin Lin 28770985b0eSJamin Lin /* Check hash IRQ status is asserted */ 28870985b0eSJamin Lin g_assert_cmphex(qtest_readl(s, base + HACE_STS), ==, 0x00000200); 28970985b0eSJamin Lin 29070985b0eSJamin Lin /* Clear IRQ status and check status is deasserted */ 29170985b0eSJamin Lin qtest_writel(s, base + HACE_STS, 0x00000200); 29270985b0eSJamin Lin g_assert_cmphex(qtest_readl(s, base + HACE_STS), ==, 0); 29370985b0eSJamin Lin 29470985b0eSJamin Lin /* Read computed digest from memory */ 29570985b0eSJamin Lin qtest_memread(s, digest_addr, digest, sizeof(digest)); 29670985b0eSJamin Lin 29770985b0eSJamin Lin /* Check result of computation */ 29870985b0eSJamin Lin g_assert_cmpmem(digest, sizeof(digest), 29970985b0eSJamin Lin test_result_sha512, sizeof(digest)); 30070985b0eSJamin Lin 30170985b0eSJamin Lin qtest_quit(s); 30270985b0eSJamin Lin } 30370985b0eSJamin Lin 30470985b0eSJamin Lin void aspeed_test_sha256_sg(const char *machine, const uint32_t base, 305dcdbbd45SJamin Lin const uint64_t src_addr) 30670985b0eSJamin Lin { 30770985b0eSJamin Lin QTestState *s = qtest_init(machine); 30870985b0eSJamin Lin 309dcdbbd45SJamin Lin const uint64_t src_addr_1 = src_addr + 0x10000; 310dcdbbd45SJamin Lin const uint64_t src_addr_2 = src_addr + 0x20000; 311dcdbbd45SJamin Lin const uint64_t src_addr_3 = src_addr + 0x30000; 312dcdbbd45SJamin Lin const uint64_t digest_addr = src_addr + 0x40000; 31370985b0eSJamin Lin uint8_t digest[32] = {0}; 31470985b0eSJamin Lin struct AspeedSgList array[] = { 31570985b0eSJamin Lin { cpu_to_le32(sizeof(test_vector_sg1)), 31670985b0eSJamin Lin cpu_to_le32(src_addr_1) }, 31770985b0eSJamin Lin { cpu_to_le32(sizeof(test_vector_sg2)), 31870985b0eSJamin Lin cpu_to_le32(src_addr_2) }, 31970985b0eSJamin Lin { cpu_to_le32(sizeof(test_vector_sg3) | SG_LIST_LEN_LAST), 32070985b0eSJamin Lin cpu_to_le32(src_addr_3) }, 32170985b0eSJamin Lin }; 32270985b0eSJamin Lin 32370985b0eSJamin Lin /* Check engine is idle, no busy or irq bits set */ 32470985b0eSJamin Lin g_assert_cmphex(qtest_readl(s, base + HACE_STS), ==, 0); 32570985b0eSJamin Lin 32670985b0eSJamin Lin /* Write test vector into memory */ 32770985b0eSJamin Lin qtest_memwrite(s, src_addr_1, test_vector_sg1, sizeof(test_vector_sg1)); 32870985b0eSJamin Lin qtest_memwrite(s, src_addr_2, test_vector_sg2, sizeof(test_vector_sg2)); 32970985b0eSJamin Lin qtest_memwrite(s, src_addr_3, test_vector_sg3, sizeof(test_vector_sg3)); 33070985b0eSJamin Lin qtest_memwrite(s, src_addr, array, sizeof(array)); 33170985b0eSJamin Lin 33270985b0eSJamin Lin write_regs(s, base, src_addr, 33370985b0eSJamin Lin (sizeof(test_vector_sg1) 33470985b0eSJamin Lin + sizeof(test_vector_sg2) 33570985b0eSJamin Lin + sizeof(test_vector_sg3)), 33670985b0eSJamin Lin digest_addr, HACE_ALGO_SHA256 | HACE_SG_EN); 33770985b0eSJamin Lin 33870985b0eSJamin Lin /* Check hash IRQ status is asserted */ 33970985b0eSJamin Lin g_assert_cmphex(qtest_readl(s, base + HACE_STS), ==, 0x00000200); 34070985b0eSJamin Lin 34170985b0eSJamin Lin /* Clear IRQ status and check status is deasserted */ 34270985b0eSJamin Lin qtest_writel(s, base + HACE_STS, 0x00000200); 34370985b0eSJamin Lin g_assert_cmphex(qtest_readl(s, base + HACE_STS), ==, 0); 34470985b0eSJamin Lin 34570985b0eSJamin Lin /* Read computed digest from memory */ 34670985b0eSJamin Lin qtest_memread(s, digest_addr, digest, sizeof(digest)); 34770985b0eSJamin Lin 34870985b0eSJamin Lin /* Check result of computation */ 34970985b0eSJamin Lin g_assert_cmpmem(digest, sizeof(digest), 35070985b0eSJamin Lin test_result_sg_sha256, sizeof(digest)); 35170985b0eSJamin Lin 35270985b0eSJamin Lin qtest_quit(s); 35370985b0eSJamin Lin } 35470985b0eSJamin Lin 3553c13be86SJamin Lin void aspeed_test_sha384_sg(const char *machine, const uint32_t base, 356dcdbbd45SJamin Lin const uint64_t src_addr) 3573c13be86SJamin Lin { 3583c13be86SJamin Lin QTestState *s = qtest_init(machine); 3593c13be86SJamin Lin 360dcdbbd45SJamin Lin const uint64_t src_addr_1 = src_addr + 0x10000; 361dcdbbd45SJamin Lin const uint64_t src_addr_2 = src_addr + 0x20000; 362dcdbbd45SJamin Lin const uint64_t src_addr_3 = src_addr + 0x30000; 363dcdbbd45SJamin Lin const uint64_t digest_addr = src_addr + 0x40000; 3643c13be86SJamin Lin uint8_t digest[48] = {0}; 3653c13be86SJamin Lin struct AspeedSgList array[] = { 3663c13be86SJamin Lin { cpu_to_le32(sizeof(test_vector_sg1)), 3673c13be86SJamin Lin cpu_to_le32(src_addr_1) }, 3683c13be86SJamin Lin { cpu_to_le32(sizeof(test_vector_sg2)), 3693c13be86SJamin Lin cpu_to_le32(src_addr_2) }, 3703c13be86SJamin Lin { cpu_to_le32(sizeof(test_vector_sg3) | SG_LIST_LEN_LAST), 3713c13be86SJamin Lin cpu_to_le32(src_addr_3) }, 3723c13be86SJamin Lin }; 3733c13be86SJamin Lin 3743c13be86SJamin Lin /* Check engine is idle, no busy or irq bits set */ 3753c13be86SJamin Lin g_assert_cmphex(qtest_readl(s, base + HACE_STS), ==, 0); 3763c13be86SJamin Lin 3773c13be86SJamin Lin /* Write test vector into memory */ 3783c13be86SJamin Lin qtest_memwrite(s, src_addr_1, test_vector_sg1, sizeof(test_vector_sg1)); 3793c13be86SJamin Lin qtest_memwrite(s, src_addr_2, test_vector_sg2, sizeof(test_vector_sg2)); 3803c13be86SJamin Lin qtest_memwrite(s, src_addr_3, test_vector_sg3, sizeof(test_vector_sg3)); 3813c13be86SJamin Lin qtest_memwrite(s, src_addr, array, sizeof(array)); 3823c13be86SJamin Lin 3833c13be86SJamin Lin write_regs(s, base, src_addr, 3843c13be86SJamin Lin (sizeof(test_vector_sg1) 3853c13be86SJamin Lin + sizeof(test_vector_sg2) 3863c13be86SJamin Lin + sizeof(test_vector_sg3)), 3873c13be86SJamin Lin digest_addr, HACE_ALGO_SHA384 | HACE_SG_EN); 3883c13be86SJamin Lin 3893c13be86SJamin Lin /* Check hash IRQ status is asserted */ 3903c13be86SJamin Lin g_assert_cmphex(qtest_readl(s, base + HACE_STS), ==, 0x00000200); 3913c13be86SJamin Lin 3923c13be86SJamin Lin /* Clear IRQ status and check status is deasserted */ 3933c13be86SJamin Lin qtest_writel(s, base + HACE_STS, 0x00000200); 3943c13be86SJamin Lin g_assert_cmphex(qtest_readl(s, base + HACE_STS), ==, 0); 3953c13be86SJamin Lin 3963c13be86SJamin Lin /* Read computed digest from memory */ 3973c13be86SJamin Lin qtest_memread(s, digest_addr, digest, sizeof(digest)); 3983c13be86SJamin Lin 3993c13be86SJamin Lin /* Check result of computation */ 4003c13be86SJamin Lin g_assert_cmpmem(digest, sizeof(digest), 4013c13be86SJamin Lin test_result_sg_sha384, sizeof(digest)); 4023c13be86SJamin Lin 4033c13be86SJamin Lin qtest_quit(s); 4043c13be86SJamin Lin } 4053c13be86SJamin Lin 40670985b0eSJamin Lin void aspeed_test_sha512_sg(const char *machine, const uint32_t base, 407dcdbbd45SJamin Lin const uint64_t src_addr) 40870985b0eSJamin Lin { 40970985b0eSJamin Lin QTestState *s = qtest_init(machine); 41070985b0eSJamin Lin 411dcdbbd45SJamin Lin const uint64_t src_addr_1 = src_addr + 0x10000; 412dcdbbd45SJamin Lin const uint64_t src_addr_2 = src_addr + 0x20000; 413dcdbbd45SJamin Lin const uint64_t src_addr_3 = src_addr + 0x30000; 414dcdbbd45SJamin Lin const uint64_t digest_addr = src_addr + 0x40000; 41570985b0eSJamin Lin uint8_t digest[64] = {0}; 41670985b0eSJamin Lin struct AspeedSgList array[] = { 41770985b0eSJamin Lin { cpu_to_le32(sizeof(test_vector_sg1)), 41870985b0eSJamin Lin cpu_to_le32(src_addr_1) }, 41970985b0eSJamin Lin { cpu_to_le32(sizeof(test_vector_sg2)), 42070985b0eSJamin Lin cpu_to_le32(src_addr_2) }, 42170985b0eSJamin Lin { cpu_to_le32(sizeof(test_vector_sg3) | SG_LIST_LEN_LAST), 42270985b0eSJamin Lin cpu_to_le32(src_addr_3) }, 42370985b0eSJamin Lin }; 42470985b0eSJamin Lin 42570985b0eSJamin Lin /* Check engine is idle, no busy or irq bits set */ 42670985b0eSJamin Lin g_assert_cmphex(qtest_readl(s, base + HACE_STS), ==, 0); 42770985b0eSJamin Lin 42870985b0eSJamin Lin /* Write test vector into memory */ 42970985b0eSJamin Lin qtest_memwrite(s, src_addr_1, test_vector_sg1, sizeof(test_vector_sg1)); 43070985b0eSJamin Lin qtest_memwrite(s, src_addr_2, test_vector_sg2, sizeof(test_vector_sg2)); 43170985b0eSJamin Lin qtest_memwrite(s, src_addr_3, test_vector_sg3, sizeof(test_vector_sg3)); 43270985b0eSJamin Lin qtest_memwrite(s, src_addr, array, sizeof(array)); 43370985b0eSJamin Lin 43470985b0eSJamin Lin write_regs(s, base, src_addr, 43570985b0eSJamin Lin (sizeof(test_vector_sg1) 43670985b0eSJamin Lin + sizeof(test_vector_sg2) 43770985b0eSJamin Lin + sizeof(test_vector_sg3)), 43870985b0eSJamin Lin digest_addr, HACE_ALGO_SHA512 | HACE_SG_EN); 43970985b0eSJamin Lin 44070985b0eSJamin Lin /* Check hash IRQ status is asserted */ 44170985b0eSJamin Lin g_assert_cmphex(qtest_readl(s, base + HACE_STS), ==, 0x00000200); 44270985b0eSJamin Lin 44370985b0eSJamin Lin /* Clear IRQ status and check status is deasserted */ 44470985b0eSJamin Lin qtest_writel(s, base + HACE_STS, 0x00000200); 44570985b0eSJamin Lin g_assert_cmphex(qtest_readl(s, base + HACE_STS), ==, 0); 44670985b0eSJamin Lin 44770985b0eSJamin Lin /* Read computed digest from memory */ 44870985b0eSJamin Lin qtest_memread(s, digest_addr, digest, sizeof(digest)); 44970985b0eSJamin Lin 45070985b0eSJamin Lin /* Check result of computation */ 45170985b0eSJamin Lin g_assert_cmpmem(digest, sizeof(digest), 45270985b0eSJamin Lin test_result_sg_sha512, sizeof(digest)); 45370985b0eSJamin Lin 45470985b0eSJamin Lin qtest_quit(s); 45570985b0eSJamin Lin } 45670985b0eSJamin Lin 45770985b0eSJamin Lin void aspeed_test_sha256_accum(const char *machine, const uint32_t base, 458dcdbbd45SJamin Lin const uint64_t src_addr) 45970985b0eSJamin Lin { 46070985b0eSJamin Lin QTestState *s = qtest_init(machine); 46170985b0eSJamin Lin 462dcdbbd45SJamin Lin const uint64_t buffer_addr = src_addr + 0x10000; 463dcdbbd45SJamin Lin const uint64_t digest_addr = src_addr + 0x40000; 46470985b0eSJamin Lin uint8_t digest[32] = {0}; 46570985b0eSJamin Lin struct AspeedSgList array[] = { 46670985b0eSJamin Lin { cpu_to_le32(sizeof(test_vector_accum_256) | SG_LIST_LEN_LAST), 46770985b0eSJamin Lin cpu_to_le32(buffer_addr) }, 46870985b0eSJamin Lin }; 46970985b0eSJamin Lin 47070985b0eSJamin Lin /* Check engine is idle, no busy or irq bits set */ 47170985b0eSJamin Lin g_assert_cmphex(qtest_readl(s, base + HACE_STS), ==, 0); 47270985b0eSJamin Lin 47370985b0eSJamin Lin /* Write test vector into memory */ 47470985b0eSJamin Lin qtest_memwrite(s, buffer_addr, test_vector_accum_256, 47570985b0eSJamin Lin sizeof(test_vector_accum_256)); 47670985b0eSJamin Lin qtest_memwrite(s, src_addr, array, sizeof(array)); 47770985b0eSJamin Lin 47870985b0eSJamin Lin write_regs(s, base, src_addr, sizeof(test_vector_accum_256), 47970985b0eSJamin Lin digest_addr, HACE_ALGO_SHA256 | HACE_SG_EN | HACE_ACCUM_EN); 48070985b0eSJamin Lin 48170985b0eSJamin Lin /* Check hash IRQ status is asserted */ 48270985b0eSJamin Lin g_assert_cmphex(qtest_readl(s, base + HACE_STS), ==, 0x00000200); 48370985b0eSJamin Lin 48470985b0eSJamin Lin /* Clear IRQ status and check status is deasserted */ 48570985b0eSJamin Lin qtest_writel(s, base + HACE_STS, 0x00000200); 48670985b0eSJamin Lin g_assert_cmphex(qtest_readl(s, base + HACE_STS), ==, 0); 48770985b0eSJamin Lin 48870985b0eSJamin Lin /* Read computed digest from memory */ 48970985b0eSJamin Lin qtest_memread(s, digest_addr, digest, sizeof(digest)); 49070985b0eSJamin Lin 49170985b0eSJamin Lin /* Check result of computation */ 49270985b0eSJamin Lin g_assert_cmpmem(digest, sizeof(digest), 49370985b0eSJamin Lin test_result_accum_sha256, sizeof(digest)); 49470985b0eSJamin Lin 49570985b0eSJamin Lin qtest_quit(s); 49670985b0eSJamin Lin } 49770985b0eSJamin Lin 4983c13be86SJamin Lin void aspeed_test_sha384_accum(const char *machine, const uint32_t base, 499dcdbbd45SJamin Lin const uint64_t src_addr) 5003c13be86SJamin Lin { 5013c13be86SJamin Lin QTestState *s = qtest_init(machine); 5023c13be86SJamin Lin 503dcdbbd45SJamin Lin const uint64_t buffer_addr = src_addr + 0x10000; 504dcdbbd45SJamin Lin const uint64_t digest_addr = src_addr + 0x40000; 5053c13be86SJamin Lin uint8_t digest[48] = {0}; 5063c13be86SJamin Lin struct AspeedSgList array[] = { 5073c13be86SJamin Lin { cpu_to_le32(sizeof(test_vector_accum_384) | SG_LIST_LEN_LAST), 5083c13be86SJamin Lin cpu_to_le32(buffer_addr) }, 5093c13be86SJamin Lin }; 5103c13be86SJamin Lin 5113c13be86SJamin Lin /* Check engine is idle, no busy or irq bits set */ 5123c13be86SJamin Lin g_assert_cmphex(qtest_readl(s, base + HACE_STS), ==, 0); 5133c13be86SJamin Lin 5143c13be86SJamin Lin /* Write test vector into memory */ 5153c13be86SJamin Lin qtest_memwrite(s, buffer_addr, test_vector_accum_384, 5163c13be86SJamin Lin sizeof(test_vector_accum_384)); 5173c13be86SJamin Lin qtest_memwrite(s, src_addr, array, sizeof(array)); 5183c13be86SJamin Lin 5193c13be86SJamin Lin write_regs(s, base, src_addr, sizeof(test_vector_accum_384), 5203c13be86SJamin Lin digest_addr, HACE_ALGO_SHA384 | HACE_SG_EN | HACE_ACCUM_EN); 5213c13be86SJamin Lin 5223c13be86SJamin Lin /* Check hash IRQ status is asserted */ 5233c13be86SJamin Lin g_assert_cmphex(qtest_readl(s, base + HACE_STS), ==, 0x00000200); 5243c13be86SJamin Lin 5253c13be86SJamin Lin /* Clear IRQ status and check status is deasserted */ 5263c13be86SJamin Lin qtest_writel(s, base + HACE_STS, 0x00000200); 5273c13be86SJamin Lin g_assert_cmphex(qtest_readl(s, base + HACE_STS), ==, 0); 5283c13be86SJamin Lin 5293c13be86SJamin Lin /* Read computed digest from memory */ 5303c13be86SJamin Lin qtest_memread(s, digest_addr, digest, sizeof(digest)); 5313c13be86SJamin Lin 5323c13be86SJamin Lin /* Check result of computation */ 5333c13be86SJamin Lin g_assert_cmpmem(digest, sizeof(digest), 5343c13be86SJamin Lin test_result_accum_sha384, sizeof(digest)); 5353c13be86SJamin Lin 5363c13be86SJamin Lin qtest_quit(s); 5373c13be86SJamin Lin } 5383c13be86SJamin Lin 53970985b0eSJamin Lin void aspeed_test_sha512_accum(const char *machine, const uint32_t base, 540dcdbbd45SJamin Lin const uint64_t src_addr) 54170985b0eSJamin Lin { 54270985b0eSJamin Lin QTestState *s = qtest_init(machine); 54370985b0eSJamin Lin 544dcdbbd45SJamin Lin const uint64_t buffer_addr = src_addr + 0x10000; 545dcdbbd45SJamin Lin const uint64_t digest_addr = src_addr + 0x40000; 54670985b0eSJamin Lin uint8_t digest[64] = {0}; 54770985b0eSJamin Lin struct AspeedSgList array[] = { 54870985b0eSJamin Lin { cpu_to_le32(sizeof(test_vector_accum_512) | SG_LIST_LEN_LAST), 54970985b0eSJamin Lin cpu_to_le32(buffer_addr) }, 55070985b0eSJamin Lin }; 55170985b0eSJamin Lin 55270985b0eSJamin Lin /* Check engine is idle, no busy or irq bits set */ 55370985b0eSJamin Lin g_assert_cmphex(qtest_readl(s, base + HACE_STS), ==, 0); 55470985b0eSJamin Lin 55570985b0eSJamin Lin /* Write test vector into memory */ 55670985b0eSJamin Lin qtest_memwrite(s, buffer_addr, test_vector_accum_512, 55770985b0eSJamin Lin sizeof(test_vector_accum_512)); 55870985b0eSJamin Lin qtest_memwrite(s, src_addr, array, sizeof(array)); 55970985b0eSJamin Lin 56070985b0eSJamin Lin write_regs(s, base, src_addr, sizeof(test_vector_accum_512), 56170985b0eSJamin Lin digest_addr, HACE_ALGO_SHA512 | HACE_SG_EN | HACE_ACCUM_EN); 56270985b0eSJamin Lin 56370985b0eSJamin Lin /* Check hash IRQ status is asserted */ 56470985b0eSJamin Lin g_assert_cmphex(qtest_readl(s, base + HACE_STS), ==, 0x00000200); 56570985b0eSJamin Lin 56670985b0eSJamin Lin /* Clear IRQ status and check status is deasserted */ 56770985b0eSJamin Lin qtest_writel(s, base + HACE_STS, 0x00000200); 56870985b0eSJamin Lin g_assert_cmphex(qtest_readl(s, base + HACE_STS), ==, 0); 56970985b0eSJamin Lin 57070985b0eSJamin Lin /* Read computed digest from memory */ 57170985b0eSJamin Lin qtest_memread(s, digest_addr, digest, sizeof(digest)); 57270985b0eSJamin Lin 57370985b0eSJamin Lin /* Check result of computation */ 57470985b0eSJamin Lin g_assert_cmpmem(digest, sizeof(digest), 57570985b0eSJamin Lin test_result_accum_sha512, sizeof(digest)); 57670985b0eSJamin Lin 57770985b0eSJamin Lin qtest_quit(s); 57870985b0eSJamin Lin } 57970985b0eSJamin Lin 58070985b0eSJamin Lin void aspeed_test_addresses(const char *machine, const uint32_t base, 58170985b0eSJamin Lin const struct AspeedMasks *expected) 58270985b0eSJamin Lin { 58370985b0eSJamin Lin QTestState *s = qtest_init(machine); 58470985b0eSJamin Lin 58570985b0eSJamin Lin /* 58670985b0eSJamin Lin * Check command mode is zero, meaning engine is in direct access mode, 58770985b0eSJamin Lin * as this affects the masking behavior of the HASH_SRC register. 58870985b0eSJamin Lin */ 58970985b0eSJamin Lin g_assert_cmphex(qtest_readl(s, base + HACE_CMD), ==, 0); 59070985b0eSJamin Lin g_assert_cmphex(qtest_readl(s, base + HACE_HASH_SRC), ==, 0); 59188d8515fSJamin Lin g_assert_cmphex(qtest_readl(s, base + HACE_HASH_SRC_HI), ==, 0); 59270985b0eSJamin Lin g_assert_cmphex(qtest_readl(s, base + HACE_HASH_DIGEST), ==, 0); 59388d8515fSJamin Lin g_assert_cmphex(qtest_readl(s, base + HACE_HASH_DIGEST_HI), ==, 0); 594*823288fcSJamin Lin g_assert_cmphex(qtest_readl(s, base + HACE_HASH_KEY_BUFF), ==, 0); 595*823288fcSJamin Lin g_assert_cmphex(qtest_readl(s, base + HACE_HASH_KEY_BUFF_HI), ==, 0); 59670985b0eSJamin Lin g_assert_cmphex(qtest_readl(s, base + HACE_HASH_DATA_LEN), ==, 0); 59770985b0eSJamin Lin 59870985b0eSJamin Lin /* Check that the address masking is correct */ 59970985b0eSJamin Lin qtest_writel(s, base + HACE_HASH_SRC, 0xffffffff); 60070985b0eSJamin Lin g_assert_cmphex(qtest_readl(s, base + HACE_HASH_SRC), ==, expected->src); 60170985b0eSJamin Lin 60288d8515fSJamin Lin qtest_writel(s, base + HACE_HASH_SRC_HI, 0xffffffff); 60388d8515fSJamin Lin g_assert_cmphex(qtest_readl(s, base + HACE_HASH_SRC_HI), 60488d8515fSJamin Lin ==, expected->src_hi); 60588d8515fSJamin Lin 60670985b0eSJamin Lin qtest_writel(s, base + HACE_HASH_DIGEST, 0xffffffff); 60770985b0eSJamin Lin g_assert_cmphex(qtest_readl(s, base + HACE_HASH_DIGEST), ==, 60870985b0eSJamin Lin expected->dest); 60970985b0eSJamin Lin 61088d8515fSJamin Lin qtest_writel(s, base + HACE_HASH_DIGEST_HI, 0xffffffff); 61188d8515fSJamin Lin g_assert_cmphex(qtest_readl(s, base + HACE_HASH_DIGEST_HI), ==, 61288d8515fSJamin Lin expected->dest_hi); 61388d8515fSJamin Lin 614*823288fcSJamin Lin qtest_writel(s, base + HACE_HASH_KEY_BUFF, 0xffffffff); 615*823288fcSJamin Lin g_assert_cmphex(qtest_readl(s, base + HACE_HASH_KEY_BUFF), ==, 616*823288fcSJamin Lin expected->key); 617*823288fcSJamin Lin 618*823288fcSJamin Lin qtest_writel(s, base + HACE_HASH_KEY_BUFF_HI, 0xffffffff); 619*823288fcSJamin Lin g_assert_cmphex(qtest_readl(s, base + HACE_HASH_KEY_BUFF_HI), ==, 620*823288fcSJamin Lin expected->key_hi); 621*823288fcSJamin Lin 62270985b0eSJamin Lin qtest_writel(s, base + HACE_HASH_DATA_LEN, 0xffffffff); 62370985b0eSJamin Lin g_assert_cmphex(qtest_readl(s, base + HACE_HASH_DATA_LEN), ==, 62470985b0eSJamin Lin expected->len); 62570985b0eSJamin Lin 62670985b0eSJamin Lin /* Reset to zero */ 62770985b0eSJamin Lin qtest_writel(s, base + HACE_HASH_SRC, 0); 62888d8515fSJamin Lin qtest_writel(s, base + HACE_HASH_SRC_HI, 0); 62970985b0eSJamin Lin qtest_writel(s, base + HACE_HASH_DIGEST, 0); 63088d8515fSJamin Lin qtest_writel(s, base + HACE_HASH_DIGEST_HI, 0); 631*823288fcSJamin Lin qtest_writel(s, base + HACE_HASH_KEY_BUFF, 0); 632*823288fcSJamin Lin qtest_writel(s, base + HACE_HASH_KEY_BUFF_HI, 0); 63370985b0eSJamin Lin qtest_writel(s, base + HACE_HASH_DATA_LEN, 0); 63470985b0eSJamin Lin 63570985b0eSJamin Lin /* Check that all bits are now zero */ 63670985b0eSJamin Lin g_assert_cmphex(qtest_readl(s, base + HACE_HASH_SRC), ==, 0); 63788d8515fSJamin Lin g_assert_cmphex(qtest_readl(s, base + HACE_HASH_SRC_HI), ==, 0); 63870985b0eSJamin Lin g_assert_cmphex(qtest_readl(s, base + HACE_HASH_DIGEST), ==, 0); 63988d8515fSJamin Lin g_assert_cmphex(qtest_readl(s, base + HACE_HASH_DIGEST_HI), ==, 0); 640*823288fcSJamin Lin g_assert_cmphex(qtest_readl(s, base + HACE_HASH_KEY_BUFF), ==, 0); 641*823288fcSJamin Lin g_assert_cmphex(qtest_readl(s, base + HACE_HASH_KEY_BUFF_HI), ==, 0); 64270985b0eSJamin Lin g_assert_cmphex(qtest_readl(s, base + HACE_HASH_DATA_LEN), ==, 0); 64370985b0eSJamin Lin 64470985b0eSJamin Lin qtest_quit(s); 64570985b0eSJamin Lin } 64670985b0eSJamin Lin 647