| // 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_DIF_DIF_RSTMGR_H_ |
| #define OPENTITAN_SW_DEVICE_LIB_DIF_DIF_RSTMGR_H_ |
| |
| /** |
| * @file |
| * @brief <a href="/hw/ip/rstmgr/doc/">Reset Manager</a> Device Interface |
| * Functions |
| */ |
| |
| #include <stdbool.h> |
| #include <stdint.h> |
| |
| #include "sw/device/lib/base/macros.h" |
| #include "sw/device/lib/base/mmio.h" |
| #include "sw/device/lib/dif/dif_base.h" |
| |
| #include "sw/device/lib/dif/autogen/dif_rstmgr_autogen.h" |
| |
| #ifdef __cplusplus |
| extern "C" { |
| #endif // __cplusplus |
| |
| /** |
| * The maximal size of the alert crash info dump. |
| * |
| * Note: must match the autogenerated register definition. |
| */ |
| #define DIF_RSTMGR_ALERT_INFO_MAX_SIZE 0xf |
| |
| /** |
| * The maximal size of the CPU crash info dump. |
| * |
| * Note: must match the autogenerated register definition. |
| */ |
| #define DIF_RSTMGR_CPU_INFO_MAX_SIZE 0xf |
| |
| /** |
| * Reset Manager peripheral software reset control. |
| */ |
| typedef enum dif_rstmgr_software_reset { |
| /** |
| * Simple reset (release straight away). |
| */ |
| kDifRstmgrSoftwareReset = 0, |
| kDifRstmgrSoftwareResetHold, /**< Hold peripheral in reset. */ |
| kDifRstmgrSoftwareResetRelease, /**< Release peripheral from reset. */ |
| } dif_rstmgr_software_reset_t; |
| |
| /** |
| * Reset Manager reset information bitfield. |
| */ |
| typedef uint32_t dif_rstmgr_reset_info_bitfield_t; |
| |
| /** |
| * Reset Manager possible reset information enumeration. |
| * |
| * Invariants are used to extract information encoded in |
| * `dif_rstmgr_reset_info_bitfield_t`, which means that the values must |
| * correspond |
| * to the individual bits (0x1, 0x2, 0x4, ..., 0x80000000). |
| * |
| * Note: these must match the autogenerated register definitions. |
| */ |
| typedef enum dif_rstmgr_reset_info { |
| /** |
| * Device has reset due to power up. |
| */ |
| kDifRstmgrResetInfoPor = 0x1, |
| /** |
| * Device has reset due to low power exit. |
| */ |
| kDifRstmgrResetInfoLowPowerExit = (0x1 << 1), |
| /** |
| * Device has reset due to software request. |
| */ |
| kDifRstmgrResetInfoSw = (0x1 << 2), |
| /** |
| * Device has reset due to a peripheral request. This can be an alert |
| * escalation, watchdog or anything else. |
| */ |
| kDifRstmgrResetInfoHwReq = (0x1f << 3), |
| /** |
| * Device has reset due to the peripheral system reset control request. |
| */ |
| kDifRstmgrResetInfoSysRstCtrl = (1 << 3), |
| /** |
| * Device has reset due to watchdog bite. |
| */ |
| kDifRstmgrResetInfoWatchdog = (1 << 4), |
| /** |
| * Device has reset due to power unstable. |
| */ |
| kDifRstmgrResetInfoPowerUnstable = (1 << 5), |
| /** |
| * Device has reset due to alert escalation. |
| */ |
| kDifRstmgrResetInfoEscalation = (1 << 6), |
| /** |
| * Device has reset due to non-debug-module request. |
| */ |
| kDifRstmgrResetInfoNdm = (1 << 7), |
| } dif_rstmgr_reset_info_t; |
| |
| /** |
| * Reset Manager software reset available peripherals. |
| */ |
| typedef uint32_t dif_rstmgr_peripheral_t; |
| |
| typedef enum dif_rstmgr_fatal_err_type { |
| /** |
| * A fatal error for regfile integrity. |
| */ |
| kDifRstmgrFatalErrTypeRegfileIntegrity = 1u << 0, |
| /** |
| * A fatal error for reset consistency. |
| */ |
| kDifRstmgrFatalErrTypeResetConsistency = 1u << 1, |
| } dif_rstmgr_fatal_err_type_t; |
| |
| /** |
| * A set of fatal errors. |
| * |
| * This type is used to read the fatal error codes. |
| */ |
| typedef uint32_t dif_rstmgr_fatal_err_codes_t; |
| |
| /** |
| * Resets the Reset Manager registers to sane defaults. |
| * |
| * Note that software reset enable registers cannot be cleared once have been |
| * locked. |
| * |
| * @param handle A Reset Manager handle. |
| * @return The result of the operation. |
| */ |
| OT_WARN_UNUSED_RESULT |
| dif_result_t dif_rstmgr_reset(const dif_rstmgr_t *handle); |
| |
| /** |
| * Locks out requested peripheral reset functionality. |
| * |
| * Calling this function when software reset is locked will have no effect |
| * and return `kDifOk`. |
| * |
| * @param handle A Reset Manager handle. |
| * @param peripheral Peripheral to lock the reset functionality for. |
| * @return The result of the operation. |
| */ |
| OT_WARN_UNUSED_RESULT |
| dif_result_t dif_rstmgr_reset_lock(const dif_rstmgr_t *handle, |
| dif_rstmgr_peripheral_t peripheral); |
| |
| /** |
| * Checks whether requested peripheral reset functionality is locked. |
| * |
| * @param handle A Reset Manager handle. |
| * @param peripheral Peripheral to check the reset lock for. |
| * @param is_locked Out-param for the locked state. |
| * @return The result of the operation. |
| */ |
| OT_WARN_UNUSED_RESULT |
| dif_result_t dif_rstmgr_reset_is_locked(const dif_rstmgr_t *handle, |
| dif_rstmgr_peripheral_t peripheral, |
| bool *is_locked); |
| |
| /** |
| * Obtains the complete Reset Manager reset information. |
| * |
| * The reset info are parsed and presented to the caller as an |
| * array of flags in 'info'. |
| * |
| * @param handle A Reset Manager handle. |
| * @param info Reset information. |
| * @return The result of the operation. |
| */ |
| OT_WARN_UNUSED_RESULT |
| dif_result_t dif_rstmgr_reset_info_get(const dif_rstmgr_t *handle, |
| dif_rstmgr_reset_info_bitfield_t *info); |
| |
| /** |
| * Clears the reset information in Reset Manager. |
| * |
| * @param handle A Reset Manager handle. |
| * @return `dif_result_t`. |
| * @return The result of the operation. |
| */ |
| OT_WARN_UNUSED_RESULT |
| dif_result_t dif_rstmgr_reset_info_clear(const dif_rstmgr_t *handle); |
| |
| /** |
| * Enables or disables the alert crash dump capture. |
| * |
| * When enabled, will capture the alert crash dump prior to a triggered reset. |
| * |
| * The alert info crash dump capture is automatically disabled upon system reset |
| * (even if the Reset Manager is not reset). |
| * |
| * @param handle A Reset Manager handle. |
| * @param state The new toggle state for the crash dump capture. |
| * @return The result of the operation. |
| */ |
| OT_WARN_UNUSED_RESULT |
| dif_result_t dif_rstmgr_alert_info_set_enabled(const dif_rstmgr_t *handle, |
| dif_toggle_t state); |
| |
| /** |
| * Retrieves the alert info crash dump capture state. |
| * |
| * The alert info crash dump capture is automatically disabled upon system reset |
| * (even if the Reset Manager is not reset). |
| * |
| * @param handle A Reset Manager handle. |
| * @param[out] state The state of the crash dump capture. |
| * @return The result of the operation. |
| */ |
| OT_WARN_UNUSED_RESULT |
| dif_result_t dif_rstmgr_alert_info_get_enabled(const dif_rstmgr_t *handle, |
| dif_toggle_t *state); |
| |
| /** |
| * Get alert info dump size. |
| * |
| * |
| * @param handle A Reset Manager handle. |
| * @param[out] size The size of the alert info dump in 32 bit words. |
| * @return The result of the operation. |
| */ |
| OT_WARN_UNUSED_RESULT |
| dif_result_t dif_rstmgr_alert_info_get_size(const dif_rstmgr_t *handle, |
| size_t *size); |
| |
| /** |
| * Alert info crash dump segment. |
| * |
| * The alert info crash dump consists of 32-bit data segments |
| */ |
| typedef uint32_t dif_rstmgr_alert_info_dump_segment_t; |
| |
| /** |
| * Reads the entire alert info crash dump. |
| * |
| * The crash dump is always retained after any kind of reset, except on |
| * Power-On-Reset (POR). |
| * |
| * @param handle A Reset Manager handle. |
| * @param dump Address of buffer where the alert dump will be written. |
| * @param dump_size Size of the alert dump buffer. The entire crash dump will be |
| * read, and the actual size can be determined through the |
| * `segments_read` parameter. It is an error if dump_size is |
| * not large enough. |
| * @param[out] segments_read Number of segments read. |
| * |
| * @return The result of the operation. |
| */ |
| OT_WARN_UNUSED_RESULT |
| dif_result_t dif_rstmgr_alert_info_dump_read( |
| const dif_rstmgr_t *handle, dif_rstmgr_alert_info_dump_segment_t *dump, |
| size_t dump_size, size_t *segments_read); |
| |
| /** |
| * Enables or disables the CPU crash dump capture. |
| * |
| * When enabled, will capture the CPU crash dump prior to a triggered reset. |
| * |
| * The CPU info crash dump capture is automatically disabled upon system reset |
| * (even if the Reset Manager is not reset). |
| * |
| * @param handle A Reset Manager handle. |
| * @param state The new toggle state for the CPU crash dump capture. |
| * @return The result of the operation. |
| */ |
| OT_WARN_UNUSED_RESULT |
| dif_result_t dif_rstmgr_cpu_info_set_enabled(const dif_rstmgr_t *handle, |
| dif_toggle_t state); |
| |
| /** |
| * Retrieves the CPU info crash dump capture state. |
| * |
| * The CPU info crash dump capture is automatically disabled upon system reset |
| * (even if the Reset Manager is not reset). |
| * |
| * @param handle A Reset Manager handle. |
| * @param[out] state The state of the crash dump capture. |
| * @return The result of the operation. |
| */ |
| OT_WARN_UNUSED_RESULT |
| dif_result_t dif_rstmgr_cpu_info_get_enabled(const dif_rstmgr_t *handle, |
| dif_toggle_t *state); |
| |
| /** |
| * Get cpu info dump size. |
| * |
| * |
| * @param handle A Reset Manager handle. |
| * @param[out] size The size of the cpu info dump in 32 bit words. |
| * @return The result of the operation. |
| */ |
| OT_WARN_UNUSED_RESULT |
| dif_result_t dif_rstmgr_cpu_info_get_size(const dif_rstmgr_t *handle, |
| size_t *size); |
| |
| /** |
| * CPU info crash dump segment. |
| * |
| * The CPU info crash dump consists of 32-bit data segments |
| */ |
| typedef uint32_t dif_rstmgr_cpu_info_dump_segment_t; |
| |
| /** |
| * Reads the entire CPU info crash dump. |
| * |
| * The crash dump is always retained after any kind of reset, except on |
| * Power-On-Reset (POR). |
| * |
| * @param handle A Reset Manager handle. |
| * @param dump Address of buffer where the crash dump will be written. |
| * @param dump_size Size of the crash dump buffer. The entire crash dump will |
| * be read, and the actual size can be determined through the |
| * `segments_read` parameter. It is an error if dump_size is |
| * not large enough. |
| * @param[out] segments_read Number of segments read. |
| * |
| * @return The result of the operation. |
| */ |
| OT_WARN_UNUSED_RESULT |
| dif_result_t dif_rstmgr_cpu_info_dump_read( |
| const dif_rstmgr_t *handle, dif_rstmgr_cpu_info_dump_segment_t *dump, |
| size_t dump_size, size_t *segments_read); |
| |
| /** |
| * Asserts or de-asserts software reset for the requested peripheral. |
| * |
| * @param handle A Reset Manager handle. |
| * @param peripheral Peripheral to assert/de-assert reset for. |
| * @param reset Reset control. |
| * @return The result of the operation. |
| */ |
| OT_WARN_UNUSED_RESULT |
| dif_result_t dif_rstmgr_software_reset(const dif_rstmgr_t *handle, |
| dif_rstmgr_peripheral_t peripheral, |
| dif_rstmgr_software_reset_t reset); |
| |
| /** |
| * Queries whether the requested peripheral is held in reset. |
| * |
| * @param handle A Reset Manager handle. |
| * @param peripheral Peripheral to query. |
| * @param asserted 'true' when held in reset, `false` otherwise. |
| * @return The result of the operation. |
| */ |
| OT_WARN_UNUSED_RESULT |
| dif_result_t dif_rstmgr_software_reset_is_held( |
| const dif_rstmgr_t *handle, dif_rstmgr_peripheral_t peripheral, |
| bool *asserted); |
| |
| /** |
| * Software request for system reset |
| * |
| * @param handle A Reset Manager handle. |
| * @return The result of the operation. |
| */ |
| OT_WARN_UNUSED_RESULT |
| dif_result_t dif_rstmgr_software_device_reset(const dif_rstmgr_t *handle); |
| |
| /** |
| * Read the fatal error codes. |
| * |
| * @param rstmgr Reset Manager Handle. |
| * @param[out] codes The fatal error codes. |
| * @returns The result of the operation. |
| */ |
| OT_WARN_UNUSED_RESULT |
| dif_result_t dif_rstmgr_fatal_err_code_get_codes( |
| const dif_rstmgr_t *rstmgr, dif_rstmgr_fatal_err_codes_t *codes); |
| |
| #ifdef __cplusplus |
| } // extern "C" |
| #endif // __cplusplus |
| |
| #endif // OPENTITAN_SW_DEVICE_LIB_DIF_DIF_RSTMGR_H_ |