| // 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/mmio.h" |
| #include "sw/device/lib/dif/dif_warn_unused_result.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 |
| |
| /** |
| * Enumeration for enabling/disabling various functionality. |
| */ |
| typedef enum dif_rstmgr_toggle { |
| /** |
| * Enabled state. |
| */ |
| kDifRstmgrToggleEnabled, |
| /** |
| * Disabled state. |
| */ |
| kDifRstmgrToggleDisabled, |
| } dif_rstmgr_toggle_t; |
| |
| /** |
| * 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 lowe power exit. |
| */ |
| kDifRstmgrResetInfoLowPowerExit = (0x1 << 1), |
| /** |
| * Device has reset due to non-debug-module request. |
| */ |
| kDifRstmgrResetInfoNdm = (0x1 << 2), |
| /** |
| * Device has reset due to a peripheral request. This can be an alert |
| * escalation, watchdog or anything else. |
| */ |
| kDifRstmgrResetInfoHwReq = (0x7 << 3), |
| } dif_rstmgr_reset_info_t; |
| |
| /** |
| * Reset Manager software reset available peripherals. |
| */ |
| typedef uint32_t dif_rstmgr_peripheral_t; |
| |
| /** |
| * The result of a Reset Manager operation. |
| */ |
| typedef enum dif_rstmgr_result { |
| /** |
| * Indicates that the operation succeeded. |
| */ |
| kDifRstmgrOk = 0, |
| /** |
| * Indicates some unspecified failure. |
| */ |
| kDifRstmgrError = 1, |
| /** |
| * Indicates that some parameter passed into a function failed a |
| * precondition. |
| * |
| * When this value is returned, no hardware operations occurred. |
| */ |
| kDifRstmgrBadArg = 2, |
| } dif_rstmgr_result_t; |
| |
| /** |
| * Hardware instantiation parameters for Reset Manager. |
| * |
| * This struct describes information about the underlying hardware that is |
| * not determined until the hardware design is used as part of a top-level |
| * design. |
| */ |
| typedef struct dif_rstmgr_params { |
| /** |
| * The base address for the rstmgr hardware registers. |
| */ |
| mmio_region_t base_addr; |
| } dif_rstmgr_params_t; |
| |
| /** |
| * A handle to rstmgr. |
| * |
| * This type should be treated as opaque by users. |
| */ |
| typedef struct dif_rstmgr { |
| dif_rstmgr_params_t params; |
| } dif_rstmgr_t; |
| |
| /** |
| * Creates a new handle for Reset Manager. |
| * |
| * This function does not actuate the hardware. |
| * |
| * @param params Hardware instantiation parameters. |
| * @param handle Out param for the initialized handle. |
| * @return The result of the operation. |
| */ |
| DIF_WARN_UNUSED_RESULT |
| dif_rstmgr_result_t dif_rstmgr_init(dif_rstmgr_params_t params, |
| dif_rstmgr_t *handle); |
| |
| /** |
| * 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. |
| */ |
| DIF_WARN_UNUSED_RESULT |
| dif_rstmgr_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 `kDifRstmgrOk`. |
| * |
| * @param handle A Reset Manager handle. |
| * @param peripheral Peripheral to lock the reset functionality for. |
| * @return The result of the operation. |
| */ |
| DIF_WARN_UNUSED_RESULT |
| dif_rstmgr_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. |
| */ |
| DIF_WARN_UNUSED_RESULT |
| dif_rstmgr_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. |
| */ |
| DIF_WARN_UNUSED_RESULT |
| dif_rstmgr_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_rstmgr_result_t`. |
| * @return The result of the operation. |
| */ |
| DIF_WARN_UNUSED_RESULT |
| dif_rstmgr_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. |
| */ |
| DIF_WARN_UNUSED_RESULT |
| dif_rstmgr_result_t dif_rstmgr_alert_info_set_enabled( |
| const dif_rstmgr_t *handle, dif_rstmgr_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 state The state of the crash dump capture. |
| * @return The result of the operation. |
| */ |
| dif_rstmgr_result_t dif_rstmgr_alert_info_get_enabled( |
| const dif_rstmgr_t *handle, dif_rstmgr_toggle_t *state); |
| |
| /** |
| * 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 Alert info crash dump. |
| * @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. |
| * @param segments_read Number of read segments. |
| * |
| * @return The result of the operation. |
| */ |
| DIF_WARN_UNUSED_RESULT |
| dif_rstmgr_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); |
| |
| /** |
| * The result of a Reset Manager software reset operation. |
| */ |
| typedef enum dif_rstmgr_software_reset_result { |
| /** |
| * Indicates that the operation succeeded. |
| */ |
| kDifRstmgrSoftwareResetOk = kDifRstmgrOk, |
| /** |
| * Indicates some unspecified failure. |
| */ |
| kDifRstmgrSoftwareResetError = kDifRstmgrError, |
| /** |
| * Indicates that some parameter passed into a function failed a |
| * precondition. |
| * |
| * When this value is returned, no hardware operations occurred. |
| */ |
| kDifRstmgrSoftwareResetBadArg = kDifRstmgrBadArg, |
| /** |
| * Indicates that this operation has been locked out, and can never |
| * succeed until hardware reset. |
| */ |
| kDifRstmgrSoftwareResetLocked, |
| } dif_rstmgr_software_reset_result_t; |
| |
| /** |
| * 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. |
| */ |
| DIF_WARN_UNUSED_RESULT |
| dif_rstmgr_software_reset_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. |
| */ |
| DIF_WARN_UNUSED_RESULT |
| dif_rstmgr_result_t dif_rstmgr_software_reset_is_held( |
| const dif_rstmgr_t *handle, dif_rstmgr_peripheral_t peripheral, |
| bool *asserted); |
| |
| #ifdef __cplusplus |
| } // extern "C" |
| #endif // __cplusplus |
| |
| #endif // OPENTITAN_SW_DEVICE_LIB_DIF_DIF_RSTMGR_H_ |