// 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_RSTMGR_TESTUTILS_H_
#define OPENTITAN_SW_DEVICE_LIB_TESTING_RSTMGR_TESTUTILS_H_

#include <stdint.h>

#include "sw/device/lib/dif/dif_rstmgr.h"

/**
 * Determines if the reset_info matches info.
 *
 * @param rstmgr A reset manager handle.
 * @param info A bit mask of reset reasons.
 *
 * @return True if the reset_info CSR matches info.
 */
bool rstmgr_testutils_is_reset_info(const dif_rstmgr_t *rstmgr,
                                    dif_rstmgr_reset_info_bitfield_t info);

/**
 * Compares the given alert dump against the device's.
 *
 * If the dump array is null or its size is zero this check succeeds. It is
 * possible to compare less words than the device captures, but it is an error
 * to try to compare more.
 *
 * @param rstmgr A reset manager handle.
 * @param expected_alert_dump An array holding the expected alert dump.
 * @param dump_size The size of the expected_alert_dump array.
 */
void rstmgr_testutils_compare_alert_info(
    const dif_rstmgr_t *rstmgr,
    dif_rstmgr_alert_info_dump_segment_t *expected_alert_dump,
    size_t dump_size);

/**
 * Compares the given cpu dump against the device's.
 *
 * If the dump array is null or its size is zero this check succeeds. It is
 * possible to compare less words than the device captures, but it is an error
 * to try to compare more.
 *
 * @param rstmgr A reset manager handle.
 * @param expected_cpu_dump An array holding the expected cpu dump.
 * @param dump_size The size of the expected_cpu_dump array.
 */
void rstmgr_testutils_compare_cpu_info(
    const dif_rstmgr_t *rstmgr,
    dif_rstmgr_cpu_info_dump_segment_t *expected_cpu_dump, size_t dump_size);

/**
 * Prepares the rstmgr for a reset scenario.
 *
 * @param rstmgr A reset manager handle.
 */
void rstmgr_testutils_pre_reset(const dif_rstmgr_t *rstmgr);

/**
 * Checks state after a reset.
 *
 * This will cause a failure if any of the checks fail. If either of the dump
 * arrays is null or its size is zero the corresponding comparison will be
 * skipped.
 *
 * @param rstmgr A reset manager handle.
 * @param expected_reset_info The expected contents of the reset_info CSR.
 * @param expected_alert_dump An array with the expected contents of the
 *                            alert_info CSR.
 * @param alert_dump_size The size of the expected_alert_dump array.
 * @param expected_cpu_dump An array with the expected contents of the cpu_info
 *                          CSR.
 * @param cpu_dump_size The size of the expected_cpu_dump array.
 */
void rstmgr_testutils_post_reset(
    const dif_rstmgr_t *rstmgr,
    dif_rstmgr_reset_info_bitfield_t expected_reset_info,
    dif_rstmgr_alert_info_dump_segment_t *expected_alert_dump,
    size_t alert_dump_size,
    dif_rstmgr_cpu_info_dump_segment_t *expected_cpu_dump,
    size_t cpu_dump_size);

#endif  // OPENTITAN_SW_DEVICE_LIB_TESTING_RSTMGR_TESTUTILS_H_
