| // Copyright lowRISC contributors. | |
| // Licensed under the Apache License, Version 2.0, see LICENSE for details. | |
| // SPDX-License-Identifier: Apache-2.0 | |
| #ifndef OPENTITAN_SW_DEVICE_LIB_TESTING_ALERT_HANDLER_TESTUTILS_H_ | |
| #define OPENTITAN_SW_DEVICE_LIB_TESTING_ALERT_HANDLER_TESTUTILS_H_ | |
| #include <stdbool.h> | |
| #include "sw/device/lib/dif/dif_alert_handler.h" | |
| #include "sw/device/lib/dif/dif_base.h" | |
| #include "sw/device/lib/dif/dif_rstmgr.h" | |
| #include "alert_handler_regs.h" | |
| typedef enum alert_handler_class_state { | |
| kCstateIdle = 0, | |
| kCstateTimeout = 1, | |
| kCstateTerminal = 3, | |
| kCstatePhase0 = 4, | |
| kCstatePhase1 = 5, | |
| kCstatePhase2 = 6, | |
| kCstatePhase3 = 7, | |
| kCstateFsmError = 2 | |
| } alert_handler_class_state_t; | |
| /** | |
| * Represents the hardware alert crash dump in a more software-friendly manner. | |
| */ | |
| typedef struct alert_info { | |
| bool alert_cause[ALERT_HANDLER_PARAM_N_ALERTS]; | |
| uint8_t loc_alert_cause; // 7bit | |
| uint16_t class_accum_cnt[ALERT_HANDLER_PARAM_N_CLASSES]; // 4x16bit | |
| uint32_t class_esc_cnt[ALERT_HANDLER_PARAM_N_CLASSES]; // 4x32bit | |
| alert_handler_class_state_t | |
| class_esc_state[ALERT_HANDLER_PARAM_N_CLASSES]; // 4x3bit | |
| } alert_info_t; | |
| /** | |
| * Converts the hardware alert crash dump into an alert_info_t. | |
| * | |
| * This makes it easier to compare and display the different fields. | |
| */ | |
| alert_info_t alert_info_dump_to_struct( | |
| const dif_rstmgr_alert_info_dump_segment_t *dump, int dump_size); | |
| /** | |
| * Displays an alert_info_t as strings. | |
| */ | |
| void alert_info_to_string(const alert_info_t *info); | |
| /** | |
| * Configures alert handler with all required runtime information. | |
| * | |
| * This operation is lock-protected, meaning once the configuration is locked, | |
| * it cannot be reconfigured until after a system reset. If `locked` is set to | |
| * `kDifToggleEnabled`, then every lockable configuration will be locked. | |
| * Otherwise, configurations may only be locked by performing subsequent calls | |
| * to each component-specific locking DIF: `dif_alert_handler_lock_*(...)`. | |
| * | |
| * @param alert_handler An alert handler handle. | |
| * @param config Runtime configuration parameters. | |
| * @param locked The locked state to set for each configuration. | |
| */ | |
| void alert_handler_testutils_configure_all( | |
| const dif_alert_handler_t *alert_handler, dif_alert_handler_config_t config, | |
| dif_toggle_t locked); | |
| /** | |
| * Returns the number of cycles corresponding to the given microseconds. | |
| */ | |
| uint32_t alert_handler_testutils_get_cycles_from_us(uint64_t microseconds); | |
| /** | |
| * Returns a scaling factor for conversion of time to cycles. | |
| * | |
| * Setting escalation cycle counts must be such that the ISRs have time to | |
| * complete before the next escalation stage starts. We tend to generate cycle | |
| * counts from time durations, and given that the relevant clock frequencies | |
| * are much lower in non-sim_dv devices we may end up having to set quite high | |
| * time durations to avoid incomplete ISRs for fpga or verilator. | |
| * | |
| * This function allows the time durations to be set for the sim_dv clock | |
| * frequencies, and other platforms get the cycle count rescaled by a factor | |
| * of 10. It should be used in the conversion of time duration to cycle counts, | |
| * as in | |
| * cycles = udiv64_slow(micros * clockFreqHz, 1000000, NULL) * | |
| * cycle_rescaling_factor(); | |
| */ | |
| uint32_t alert_handler_testutils_cycle_rescaling_factor(); | |
| /** | |
| * Returns whether an alert is active. | |
| * | |
| * @param alert_handler An alert handler handle. | |
| * @param alert The given alert. | |
| * @return The status of the given alert as boolean. | |
| */ | |
| bool alert_handler_testutils_is_alert_active( | |
| const dif_alert_handler_t *alert_handler, dif_alert_handler_alert_t alert); | |
| #endif // OPENTITAN_SW_DEVICE_LIB_TESTING_ALERT_HANDLER_TESTUTILS_H_ |