blob: 87456ac2b59d82d2f1be4fa1f6e9f18a854189ad [file] [log] [blame]
// Copyright lowRISC contributors.
// Licensed under the Apache License, Version 2.0, see LICENSE for details.
// SPDX-License-Identifier: Apache-2.0
#include "sw/device/lib/testing/rstmgr_testutils.h"
#include <stdbool.h>
#include <stdint.h>
#include "sw/device/lib/base/mmio.h"
#include "sw/device/lib/dif/dif_rstmgr.h"
#include "sw/device/lib/testing/check.h"
bool rstmgr_testutils_is_reset_info(const dif_rstmgr_t *rstmgr,
dif_rstmgr_reset_info_bitfield_t info) {
dif_rstmgr_reset_info_bitfield_t actual_info;
CHECK_DIF_OK(dif_rstmgr_reset_info_get(rstmgr, &actual_info));
return actual_info == info;
}
bool rstmgr_testutils_reset_info_any(const dif_rstmgr_t *rstmgr,
dif_rstmgr_reset_info_bitfield_t info) {
dif_rstmgr_reset_info_bitfield_t actual_info;
CHECK_DIF_OK(dif_rstmgr_reset_info_get(rstmgr, &actual_info));
return (actual_info & info) != 0;
}
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) {
size_t size_read;
dif_rstmgr_alert_info_dump_segment_t
actual_alert_dump[DIF_RSTMGR_ALERT_INFO_MAX_SIZE];
if (expected_alert_dump == 0 || dump_size == 0) {
return;
}
CHECK_DIF_OK(dif_rstmgr_alert_info_dump_read(
rstmgr, actual_alert_dump, DIF_RSTMGR_ALERT_INFO_MAX_SIZE, &size_read));
CHECK(dump_size <= size_read);
CHECK_BUFFER(actual_alert_dump, expected_alert_dump, dump_size);
}
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) {
size_t size_read;
dif_rstmgr_cpu_info_dump_segment_t
actual_cpu_dump[DIF_RSTMGR_CPU_INFO_MAX_SIZE];
if (expected_cpu_dump == 0 || dump_size == 0) {
return;
}
CHECK_DIF_OK(dif_rstmgr_cpu_info_dump_read(
rstmgr, actual_cpu_dump, DIF_RSTMGR_CPU_INFO_MAX_SIZE, &size_read));
CHECK(dump_size <= size_read);
CHECK_BUFFER(actual_cpu_dump, expected_cpu_dump, dump_size);
}
void rstmgr_testutils_pre_reset(const dif_rstmgr_t *rstmgr) {
// Clear reset_info.
CHECK_DIF_OK(dif_rstmgr_reset_info_clear(rstmgr));
// Enable alert and cpu dump capture, even if the test doesn't read it.
CHECK_DIF_OK(dif_rstmgr_alert_info_set_enabled(rstmgr, kDifToggleEnabled));
CHECK_DIF_OK(dif_rstmgr_cpu_info_set_enabled(rstmgr, kDifToggleEnabled));
}
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) {
// Read and compare reset_info.
dif_rstmgr_reset_info_bitfield_t actual_reset_info;
CHECK_DIF_OK(dif_rstmgr_reset_info_get(rstmgr, &actual_reset_info));
CHECK(expected_reset_info == actual_reset_info,
"Unexpected reset_info CSR mismatch, expected 0x%x, got 0x%x",
expected_reset_info, actual_reset_info);
rstmgr_testutils_compare_alert_info(rstmgr, expected_alert_dump,
alert_dump_size);
rstmgr_testutils_compare_cpu_info(rstmgr, expected_cpu_dump, cpu_dump_size);
}