Software APIs
rstmgr_testutils.c
1// Copyright lowRISC contributors (OpenTitan project).
2// Licensed under the Apache License, Version 2.0, see LICENSE for details.
3// SPDX-License-Identifier: Apache-2.0
4
5#include "sw/device/lib/testing/rstmgr_testutils.h"
6
7#include <stdbool.h>
8#include <stdint.h>
9
12#include "sw/device/lib/testing/test_framework/check.h"
13#include "sw/device/silicon_creator/lib/drivers/retention_sram.h"
14
15#define MODULE_ID MAKE_MODULE_ID('r', 'm', 'g')
16
17status_t rstmgr_testutils_is_reset_info(const dif_rstmgr_t *rstmgr,
20 actual_info = rstmgr_testutils_reason_get();
21 return OK_STATUS(actual_info == info);
22}
23
24status_t rstmgr_testutils_reset_info_any(
27 actual_info = rstmgr_testutils_reason_get();
28 return OK_STATUS((actual_info & info) != 0);
29}
30
31status_t rstmgr_testutils_compare_alert_info(
32 const dif_rstmgr_t *rstmgr,
33 dif_rstmgr_alert_info_dump_segment_t *expected_alert_dump,
34 size_t dump_size) {
35 size_t size_read;
37 actual_alert_dump[DIF_RSTMGR_ALERT_INFO_MAX_SIZE];
38
39 TRY(dif_rstmgr_alert_info_dump_read(
40 rstmgr, actual_alert_dump, DIF_RSTMGR_ALERT_INFO_MAX_SIZE, &size_read));
41 TRY_CHECK(dump_size == size_read,
42 "The expected alert info dump size (%d) is not equal to "
43 "the observed dump size (%d).",
44 dump_size, size_read);
45 TRY_CHECK_ARRAYS_EQ(actual_alert_dump, expected_alert_dump, dump_size);
46 return OK_STATUS();
47}
48
49status_t rstmgr_testutils_compare_cpu_info(
50 const dif_rstmgr_t *rstmgr,
51 dif_rstmgr_cpu_info_dump_segment_t *expected_cpu_dump, size_t dump_size) {
52 size_t size_read;
54 actual_cpu_dump[DIF_RSTMGR_CPU_INFO_MAX_SIZE];
55
56 TRY(dif_rstmgr_cpu_info_dump_read(rstmgr, actual_cpu_dump,
57 DIF_RSTMGR_CPU_INFO_MAX_SIZE, &size_read));
58 TRY_CHECK(dump_size == size_read,
59 "The expected cpu info dump size (%d) is not equal to "
60 "the observed dump size (%d).",
61 dump_size, size_read);
62 TRY_CHECK_ARRAYS_EQ(actual_cpu_dump, expected_cpu_dump, dump_size);
63 return OK_STATUS();
64}
65
66status_t rstmgr_testutils_pre_reset(const dif_rstmgr_t *rstmgr) {
67 // Clear reset_info.
68 rstmgr_testutils_reason_clear();
69
70 // Enable alert and cpu dump capture, even if the test doesn't read it.
71 TRY(dif_rstmgr_alert_info_set_enabled(rstmgr, kDifToggleEnabled));
72 TRY(dif_rstmgr_cpu_info_set_enabled(rstmgr, kDifToggleEnabled));
73 return OK_STATUS();
74}
75
76status_t rstmgr_testutils_post_reset(
77 const dif_rstmgr_t *rstmgr,
78 dif_rstmgr_reset_info_bitfield_t expected_reset_info,
79 dif_rstmgr_alert_info_dump_segment_t *expected_alert_dump,
80 size_t alert_dump_size,
81 dif_rstmgr_cpu_info_dump_segment_t *expected_cpu_dump,
82 size_t cpu_dump_size) {
83 // Read and compare reset_info.
84 dif_rstmgr_reset_info_bitfield_t actual_reset_info;
85 actual_reset_info = rstmgr_testutils_reason_get();
86 TRY_CHECK(expected_reset_info == actual_reset_info,
87 "Unexpected reset_info CSR mismatch, expected 0x%x, got 0x%x",
88 expected_reset_info, actual_reset_info);
89
90 if (expected_alert_dump != NULL && alert_dump_size != 0) {
91 TRY(rstmgr_testutils_compare_alert_info(rstmgr, expected_alert_dump,
92 alert_dump_size));
93 }
94 if (expected_cpu_dump != NULL && cpu_dump_size != 0) {
95 TRY(rstmgr_testutils_compare_cpu_info(rstmgr, expected_cpu_dump,
96 cpu_dump_size));
97 }
98 return OK_STATUS();
99}
100
101dif_rstmgr_reset_info_bitfield_t rstmgr_testutils_reason_get(void) {
102 return retention_sram_get()->creator.reset_reasons;
103}
104
105void rstmgr_testutils_reason_clear(void) {
106 retention_sram_get()->creator.reset_reasons = 0;
107}