5 #include "dt/dt_hmac.h"
6 #include "dt/dt_rv_plic.h"
10 #include "sw/device/lib/runtime/irq.h"
12 #include "sw/device/lib/testing/hmac_testutils.h"
13 #include "sw/device/lib/testing/rv_plic_testutils.h"
14 #include "sw/device/lib/testing/test_framework/check.h"
17 static const uint32_t kPlicTarget = 0;
18 static dif_rv_plic_t rv_plic;
19 static dt_rv_plic_t kRvPlicDt = kDtRvPlic;
20 static dif_hmac_t hmac;
21 static dt_hmac_t kHmacDt = (dt_hmac_t)0;
22 static_assert(kDtHmacCount >= 1,
23 "This test requires at least one HMAC instance");
25 static volatile dt_hmac_irq_t irq_serviced;
27 OTTF_DEFINE_TEST_CONFIG();
37 bool ottf_handle_irq(uint32_t *exc_info, dt_instance_id_t devid,
39 if (devid == dt_hmac_instance_id(kHmacDt)) {
40 irq_serviced = dt_hmac_irq_from_plic_id(kHmacDt, irq_id);
44 CHECK_DIF_OK(dif_hmac_irq_get_type(&hmac, irq_serviced, &type));
46 CHECK_DIF_OK(dif_hmac_irq_acknowledge(&hmac, irq_serviced));
57 static void irqs_init(
void) {
58 CHECK_DIF_OK(dif_rv_plic_init_from_dt(kRvPlicDt, &rv_plic));
67 rv_plic_testutils_irq_range_enable(
68 &rv_plic, kPlicTarget,
69 dt_hmac_irq_to_plic_id(kHmacDt, kDtHmacIrqHmacDone),
70 dt_hmac_irq_to_plic_id(kHmacDt, kDtHmacIrqFifoEmpty));
72 irq_external_ctrl(
true);
73 irq_global_ctrl(
true);
77 CHECK_DIF_OK(dif_hmac_init_from_dt(kHmacDt, &hmac));
83 CHECK_STATUS_OK(hmac_testutils_push_message(&hmac, (
char *)kHmacRefLongKey,
84 sizeof(kHmacRefLongKey)));
86 hmac_testutils_check_message_length(&hmac,
sizeof(kHmacRefLongKey) * 8));
89 dt_hmac_irq_t expected_irq = kDtHmacIrqHmacDone;
90 irq_serviced = UINT32_MAX;
94 CHECK_STATUS_OK(hmac_testutils_finish_polled(&hmac, &key_digest));
95 CHECK_ARRAYS_EQ(key_digest.digest, kHmacRefExpectedLongKeyDigest.digest,
98 CHECK(irq_serviced == expected_irq);
103 kHmacTransactionConfig));
105 hmac_testutils_push_message(&hmac, kHmacRefData,
sizeof(kHmacRefData)));
107 hmac_testutils_check_message_length(&hmac,
sizeof(kHmacRefData) * 8));
109 LOG_INFO(
"Waiting for HMAC pooling to finish");
111 hmac_testutils_finish_and_check_polled(&hmac, &kHmacRefExpectedDigest));