| // 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_ |