blob: e0a08d053c3836520948492e936d21c6ed4a0b52 [file] [log] [blame]
// 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_