5#include "sw/device/lib/testing/alert_handler_testutils.h"
7#include "dt/dt_alert_handler.h"
14#include "sw/device/lib/testing/test_framework/check.h"
16#include "alert_handler_regs.h"
18#define MODULE_ID MAKE_MODULE_ID('a', 'h', 't')
20const char kAlertClassName[] = {
'A',
'B',
'C',
'D'};
21static_assert(
ARRAYSIZE(kAlertClassName) == ALERT_HANDLER_PARAM_N_CLASSES,
22 "Expected four alert classes!");
29static uint32_t get_next_n_bits(
31 int *word_index,
int *bit_index) {
32 CHECK(num_bits <= 32);
33 CHECK(*bit_index < 32);
34 uint32_t word = dump[*word_index] >> *bit_index;
35 if (*bit_index + num_bits >= 32) {
37 *bit_index = *bit_index + num_bits - 32;
39 *bit_index += num_bits;
41 word &= (1 << num_bits) - 1;
45status_t alert_handler_testutils_info_parse(
47 alert_handler_testutils_info_t *info) {
50 for (
int i = 0; i < ALERT_HANDLER_PARAM_N_CLASSES; ++i) {
51 info->class_esc_state[i] =
52 get_next_n_bits(3, dump, &word_index, &bit_index);
54 for (
int i = 0; i < ALERT_HANDLER_PARAM_N_CLASSES; ++i) {
55 info->class_esc_cnt[i] = get_next_n_bits(32, dump, &word_index, &bit_index);
57 for (
int i = 0; i < ALERT_HANDLER_PARAM_N_CLASSES; ++i) {
58 info->class_accum_cnt[i] =
59 (uint16_t)get_next_n_bits(16, dump, &word_index, &bit_index);
61 info->loc_alert_cause =
62 (uint8_t)get_next_n_bits(7, dump, &word_index, &bit_index);
63 TRY_CHECK(word_index < dump_size);
64 for (
int i = 0; i < ALERT_HANDLER_PARAM_N_ALERTS; ++i) {
65 info->alert_cause[i] = get_next_n_bits(1, dump, &word_index, &bit_index);
67 TRY_CHECK(word_index < dump_size);
71void alert_handler_testutils_info_dump(
72 const alert_handler_testutils_info_t *info) {
74 LOG_INFO(
"esc_state [0]=%x, [1]=%x, [2]=%x, [3]=%x", info->class_esc_state[0],
75 info->class_esc_state[1], info->class_esc_state[2],
76 info->class_esc_state[3]);
77 LOG_INFO(
"esc_cnt [0]=0x%x, [1]=0x%x, [2]=0x%x, [3]=0x%x",
78 info->class_esc_cnt[0], info->class_esc_cnt[1],
79 info->class_esc_cnt[2], info->class_esc_cnt[3]);
80 LOG_INFO(
"accum_cnt [0]=0x%x, [1]=0x%x, [2]=0x%x, [3]=0x%x",
81 info->class_accum_cnt[0], info->class_accum_cnt[1],
82 info->class_accum_cnt[2], info->class_accum_cnt[3]);
83 LOG_INFO(
"loc_alert_cause=0x%x", info->loc_alert_cause);
88 for (
int i = 0; i < ALERT_HANDLER_PARAM_N_ALERTS; ++i) {
89 if (info->alert_cause[i]) {
99status_t alert_handler_testutils_configure_all(
102 TRY_CHECK(alert_handler != NULL);
103 TRY_CHECK(dif_is_valid_toggle(locked));
123 ALERT_HANDLER_PING_TIMEOUT_CYC_SHADOWED_PING_TIMEOUT_CYC_SHADOWED_MASK);
127 TRY(dif_alert_handler_configure_alert(alert_handler, config.
alerts[i],
134 TRY(dif_alert_handler_configure_local_alert(
141 TRY(dif_alert_handler_configure_class(alert_handler, config.
classes[i],
147 TRY(dif_alert_handler_configure_ping_timer(alert_handler, config.
ping_timeout,
153status_t alert_handler_testutils_get_cycles_from_us(uint64_t microseconds,
155 uint64_t cycles_ = udiv64_slow(
160 TRY_CHECK(cycles_ < UINT32_MAX,
161 "The value 0x%08x%08x can't fit into the 32 bits timer counter.",
162 (uint32_t)(cycles_ >> 32), (uint32_t)cycles_);
163 *cycles = (uint32_t)cycles_;
167uint32_t alert_handler_testutils_cycle_rescaling_factor(
void) {
171static status_t alert_handler_class_info_log(
175 TRY(dif_alert_handler_get_class_state(alert_handler, alert_class, &state));
178 TRY(dif_alert_handler_get_accumulator(alert_handler, alert_class,
181 if (num_alerts > 0) {
182 LOG_INFO(
"Alert class %c state: %d, acc_cnt: %d",
183 kAlertClassName[alert_class], state, num_alerts);
186 alert < ALERT_HANDLER_PARAM_N_ALERTS; ++alert) {
188 TRY(dif_alert_handler_alert_is_cause(alert_handler, alert, &is_cause));
195 TRY(dif_alert_handler_escalation_can_clear(alert_handler, alert_class,
198 TRY(dif_alert_handler_escalation_clear(alert_handler, alert_class));
200 LOG_INFO(
"Alert class %c can't be cleared", kAlertClassName[alert_class]);
207static status_t alert_handler_class_log(
211 TRY(dif_alert_handler_get_class_state(alert_handler, alert_class, &state));
214 TRY(dif_alert_handler_get_accumulator(alert_handler, alert_class,
217 if (num_alerts > 0) {
218 LOG_INFO(
"Alert class %c state: %d, acc_cnt: %d",
219 kAlertClassName[alert_class], state, num_alerts);
221 alert < ALERT_HANDLER_PARAM_N_ALERTS; ++alert) {
223 TRY(dif_alert_handler_alert_is_cause(alert_handler, alert, &is_cause));
233status_t alert_handler_testutils_status_log(
235 TRY_CHECK(alert_handler != NULL);
238 alert_class < ALERT_HANDLER_PARAM_N_CLASSES; ++alert_class) {
239 TRY(alert_handler_class_log(alert_handler, alert_class));
245status_t alert_handler_testutils_dump_log(
const dif_rstmgr_t *rstmgr) {
246 TRY_CHECK(rstmgr != NULL);
250 alert_handler_testutils_info_t actual_info;
252 uint32_t log_count = 0;
254 CHECK_DIF_OK(dif_rstmgr_alert_info_dump_read(
256 CHECK(seg_size <= INT_MAX,
"seg_size must fit in int");
258 alert_handler_testutils_info_parse(dump, (
int)seg_size, &actual_info));
261 alert_class < ALERT_HANDLER_PARAM_N_CLASSES; ++alert_class) {
262 if (actual_info.class_esc_state[alert_class] != kCstateIdle) {
263 LOG_INFO(
"crashdump - Alert class %c state: %d, acc_cnt: %d, esc_cnt: %d",
264 kAlertClassName[alert_class],
265 actual_info.class_esc_state[alert_class],
266 actual_info.class_accum_cnt[alert_class],
267 actual_info.class_esc_cnt[alert_class]);
272 alert < ALERT_HANDLER_PARAM_N_ALERTS; ++alert) {
273 if (actual_info.alert_cause[alert]) {
274 LOG_INFO(
"crashdump - Alert %d is set", alert);
279 if (log_count == 0) {
280 LOG_INFO(
"crashdump - No alerts reported");
286status_t alert_handler_testutils_dump_enable(
288 TRY_CHECK(alert_handler != NULL);
289 TRY_CHECK(rstmgr != NULL);
291 uint32_t enable_count = 0;
293 alert_class < ALERT_HANDLER_PARAM_N_CLASSES; ++alert_class) {
295 TRY(dif_alert_handler_is_class_enabled(alert_handler, alert_class,
298 TRY(dif_alert_handler_crash_dump_trigger_set(