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 
17 status_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 
24 status_t rstmgr_testutils_reset_info_any(
25  const dif_rstmgr_t *rstmgr, dif_rstmgr_reset_info_bitfield_t info) {
27  actual_info = rstmgr_testutils_reason_get();
28  return OK_STATUS((actual_info & info) != 0);
29 }
30 
31 status_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 
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 
49 status_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 
66 status_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.
73  return OK_STATUS();
74 }
75 
76 status_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 
101 dif_rstmgr_reset_info_bitfield_t rstmgr_testutils_reason_get(void) {
102  return retention_sram_get()->creator.reset_reasons;
103 }
104 
105 void rstmgr_testutils_reason_clear(void) {
106  retention_sram_get()->creator.reset_reasons = 0;
107 }