Skip to content

Commit

Permalink
Port pwrmgr_normal_sleep_all_wake_ups to multitop
Browse files Browse the repository at this point in the history
Signed-off-by: Amaury Pouly <[email protected]>
  • Loading branch information
pamaury committed Feb 21, 2025
1 parent 7670b2f commit 384a777
Show file tree
Hide file tree
Showing 9 changed files with 329 additions and 283 deletions.
73 changes: 8 additions & 65 deletions sw/device/lib/dif/dif_pwrmgr.c
Original file line number Diff line number Diff line change
Expand Up @@ -62,60 +62,6 @@ static const bitfield_field32_t kDomainConfigBitfield = {
.index = PWRMGR_CONTROL_CORE_CLK_EN_BIT,
};

/**
* Relevant bits of the WAKEUP_EN and WAKE_INFO registers must start at `0` and
* be in the same order as `dif_pwrmgr_wakeup_request_source_t` constants.
*/
#if defined(OPENTITAN_IS_EARLGREY)
static_assert(kDifPwrmgrWakeupRequestSourceOne ==
(1u << PWRMGR_WAKEUP_EN_EN_0_BIT),
"Layout of WAKEUP_EN register changed.");
static_assert(kDifPwrmgrWakeupRequestSourceOne ==
(1u << PWRMGR_PARAM_SYSRST_CTRL_AON_WKUP_REQ_IDX),
"Layout of WAKE_INFO register changed.");
static_assert(kDifPwrmgrWakeupRequestSourceTwo ==
(1u << PWRMGR_PARAM_ADC_CTRL_AON_WKUP_REQ_IDX),
"Layout of WAKE_INFO register changed.");
static_assert(kDifPwrmgrWakeupRequestSourceThree ==
(1u << PWRMGR_PARAM_PINMUX_AON_PIN_WKUP_REQ_IDX),
"Layout of WAKE_INFO register changed.");
static_assert(kDifPwrmgrWakeupRequestSourceFour ==
(1u << PWRMGR_PARAM_PINMUX_AON_USB_WKUP_REQ_IDX),
"Layout of WAKE_INFO register changed.");
static_assert(kDifPwrmgrWakeupRequestSourceFive ==
(1u << PWRMGR_PARAM_AON_TIMER_AON_WKUP_REQ_IDX),
"Layout of WAKE_INFO register changed.");
static_assert(kDifPwrmgrWakeupRequestSourceSix ==
(1u << PWRMGR_PARAM_SENSOR_CTRL_AON_WKUP_REQ_IDX),
"Layout of WAKE_INFO register changed.");
#elif defined(OPENTITAN_IS_DARJEELING)
static_assert(kDifPwrmgrWakeupRequestSourceOne ==
(1u << PWRMGR_PARAM_PINMUX_AON_PIN_WKUP_REQ_IDX),
"Layout of WAKE_INFO register changed.");
static_assert(kDifPwrmgrWakeupRequestSourceTwo ==
(1u << PWRMGR_PARAM_AON_TIMER_AON_WKUP_REQ_IDX),
"Layout of WAKE_INFO register changed.");
static_assert(kDifPwrmgrWakeupRequestSourceThree ==
(1u << PWRMGR_PARAM_SOC_PROXY_WKUP_INTERNAL_REQ_IDX),
"Layout of WAKE_INFO register changed.");
static_assert(kDifPwrmgrWakeupRequestSourceFour ==
(1u << PWRMGR_PARAM_SOC_PROXY_WKUP_EXTERNAL_REQ_IDX),
"Layout of WAKE_INFO register changed.");
#else
#error "dif_pwrmgr does not support this top"
#endif

/**
* Relevant bits of the RESET_EN register must start at `0` and be in the same
* order as `dif_pwrmgr_reset_request_source_t` constants.
*/
static_assert(kDifPwrmgrResetRequestSourceOne ==
(1u << PWRMGR_RESET_EN_EN_0_BIT),
"Layout of RESET_EN register changed.");
static_assert(kDifPwrmgrResetRequestSourceTwo ==
(1u << PWRMGR_RESET_EN_EN_1_BIT),
"Layout of RESET_EN register changed.");

/**
* `dif_pwrmgr_irq_t` constants must match the corresponding generated values.
*/
Expand Down Expand Up @@ -156,10 +102,9 @@ static const request_reg_info_t request_reg_infos[2] = {
},
};

static dif_result_t request_reg_bitfield(
const dif_pwrmgr_t *pwrmgr,
dif_pwrmgr_req_type_t val,
bitfield_field32_t *bitfield) {
static dif_result_t request_reg_bitfield(const dif_pwrmgr_t *pwrmgr,
dif_pwrmgr_req_type_t val,
bitfield_field32_t *bitfield) {
dt_pwrmgr_t dt;
dif_result_t res = dif_pwrmgr_get_dt(pwrmgr, &dt);
if (res != kDifOk) {
Expand All @@ -169,11 +114,9 @@ static dif_result_t request_reg_bitfield(
size_t count = 0;
if (val == kDifPwrmgrReqTypeWakeup) {
count = dt_pwrmgr_wakeup_src_count(dt);
}
else if (val == kDifPwrmgrReqTypeReset) {
} else if (val == kDifPwrmgrReqTypeReset) {
count = dt_pwrmgr_reset_request_src_count(dt);
}
else {
} else {
return kDifBadArg;
}
bitfield->index = 0;
Expand Down Expand Up @@ -469,12 +412,12 @@ dif_result_t dif_pwrmgr_wakeup_reason_get(const dif_pwrmgr_t *pwrmgr,
}

bitfield_field32_t bitfield;
dif_result_t res = request_reg_bitfield(pwrmgr, kDifPwrmgrReqTypeWakeup, &bitfield);
dif_result_t res =
request_reg_bitfield(pwrmgr, kDifPwrmgrReqTypeWakeup, &bitfield);
if (res != kDifOk) {
return res;
}
uint32_t request_sources = bitfield_field32_read(
reg_val, bitfield);
uint32_t request_sources = bitfield_field32_read(reg_val, bitfield);
if (request_sources != 0) {
types |= kDifPwrmgrWakeupTypeRequest;
}
Expand Down
3 changes: 1 addition & 2 deletions sw/device/tests/BUILD
Original file line number Diff line number Diff line change
Expand Up @@ -3074,7 +3074,7 @@ cc_library(
target_compatible_with = [OPENTITAN_CPU],
visibility = ["//sw/device/tests:__pkg__"],
deps = [
"//hw/top_earlgrey/sw/autogen:top_earlgrey",
"//hw/top:dt",
"//sw/device/lib/base:abs_mmio",
"//sw/device/lib/base:mmio",
"//sw/device/lib/dif:alert_handler",
Expand Down Expand Up @@ -3357,7 +3357,6 @@ opentitan_test(
verilator = verilator_params(tags = ["manual"]),
deps = [
"//hw/top:pwrmgr_c_regs",
"//hw/top_earlgrey/sw/autogen:top_earlgrey",
"//sw/device/lib/dif:pwrmgr",
"//sw/device/lib/dif:rv_plic",
"//sw/device/lib/runtime:irq",
Expand Down
27 changes: 11 additions & 16 deletions sw/device/tests/pwrmgr_normal_sleep_all_wake_ups.c
Original file line number Diff line number Diff line change
Expand Up @@ -12,10 +12,8 @@
#include "sw/device/lib/testing/test_framework/ottf_main.h"
#include "sw/device/tests/sim_dv/pwrmgr_sleep_all_wake_ups_impl.h"

#include "hw/top_earlgrey/sw/autogen/top_earlgrey.h"
#include "pwrmgr_regs.h"
#include "sensor_ctrl_regs.h"
#include "sw/device/lib/testing/autogen/isr_testutils.h"

/*
PWRMGR NORMAL SLEEP ALL WAKE UPS test
Expand All @@ -42,37 +40,34 @@ bool test_main(void) {

init_units();
// Enable all AST alerts in sensor_ctrl

// FIXME why is this needed in this test but not the random one?
dif_sensor_ctrl_t sensor_ctrl;
CHECK_DIF_OK(dif_sensor_ctrl_init_from_dt(kDtSensorCtrlAon, &sensor_ctrl));
for (uint32_t k = 0; k < SENSOR_CTRL_PARAM_NUM_ALERT_EVENTS; k++) {
CHECK_DIF_OK(
dif_sensor_ctrl_set_alert_en(&sensor_ctrl, k, kDifToggleEnabled));
}

// Enable all the AON interrupts used in this test.
rv_plic_testutils_irq_range_enable(&rv_plic, kTopEarlgreyPlicTargetIbex0,
kTopEarlgreyPlicIrqIdPwrmgrAonWakeup,
kTopEarlgreyPlicIrqIdPwrmgrAonWakeup);

// Enable pwrmgr interrupt
CHECK_DIF_OK(dif_pwrmgr_irq_set_enabled(&pwrmgr, 0, kDifToggleEnabled));

if (UNWRAP(pwrmgr_testutils_is_wakeup_reason(&pwrmgr, 0)) == true) {
if (UNWRAP(pwrmgr_testutils_is_wakeup_reason(&pwrmgr, 0))) {
LOG_INFO("POR reset");

for (size_t wakeup_unit = 0; wakeup_unit < PWRMGR_PARAM_NUM_WKUPS;
for (size_t wakeup_unit = 0; wakeup_unit < get_wakeup_count();
++wakeup_unit) {
if (kDeviceType != kDeviceSimDV &&
wakeup_unit == PWRMGR_PARAM_ADC_CTRL_AON_WKUP_REQ_IDX) {
continue;
}
LOG_INFO("Test %d begin", wakeup_unit);
const test_wakeup_sources_t *src = get_wakeup_source(wakeup_unit, NULL);
LOG_INFO("Test %d begin (%s)", wakeup_unit, src->name);
execute_test(wakeup_unit, /*deep_sleep=*/false);
check_wakeup_reason(wakeup_unit);
LOG_INFO("Woke up by source %d", wakeup_unit);
clear_wakeup(wakeup_unit);
LOG_INFO("clean up done source %d", wakeup_unit);
}
return true;
} else {
LOG_ERROR("Unexpected wake up reason");
return false;
}

return false;
}
8 changes: 3 additions & 5 deletions sw/device/tests/pwrmgr_random_sleep_all_wake_ups.c
Original file line number Diff line number Diff line change
Expand Up @@ -62,11 +62,6 @@ bool test_main(void) {

init_units();

// Enable all the AON interrupts used in this test.
rv_plic_testutils_irq_range_enable(&rv_plic, kTopEarlgreyPlicTargetIbex0,
kTopEarlgreyPlicIrqIdPwrmgrAonWakeup,
kTopEarlgreyPlicIrqIdPwrmgrAonWakeup);

// Enable pwrmgr interrupt.
CHECK_DIF_OK(dif_pwrmgr_irq_set_enabled(&pwrmgr, 0, kDifToggleEnabled));
uint32_t wakeup_count = 0;
Expand Down Expand Up @@ -109,6 +104,8 @@ bool test_main(void) {
deep_sleep = get_deep_sleep(wakeup_count);
delay_n_clear(4);
CHECK(!deep_sleep, "Should be normal sleep");
const test_wakeup_sources_t *src = get_wakeup_source(wakeup_unit, NULL);
LOG_INFO("Test %d begin (%s)", wakeup_unit, src->name);
execute_test(wakeup_unit, deep_sleep);
check_wakeup_reason(wakeup_unit);
LOG_INFO("Woke up by source %d", wakeup_unit);
Expand All @@ -120,6 +117,7 @@ bool test_main(void) {
deep_sleep = get_deep_sleep(wakeup_count);
delay_n_clear(4);
CHECK(deep_sleep, "Should be deep sleep");
LOG_INFO("Test %d begin (%s)", wakeup_unit, src->name);
execute_test(wakeup_unit, deep_sleep);

// This is not reachable.
Expand Down
22 changes: 11 additions & 11 deletions sw/device/tests/pwrmgr_sleep_resets_lib.c
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@
#include <stdbool.h>
#include <stdint.h>

#include "dt/dt_pwrmgr.h"
#include "sw/device/lib/base/abs_mmio.h"
#include "sw/device/lib/base/math.h"
#include "sw/device/lib/base/mmio.h"
Expand All @@ -32,6 +33,9 @@

#include "hw/top_earlgrey/sw/autogen/top_earlgrey.h"

static const dt_pwrmgr_t kPwrmgrDt = 0;
static_assert(kDtPwrmgrCount == 1, "this library expects exactly one pwrmgr");

static const uint32_t kPlicTarget = kTopEarlgreyPlicTargetIbex0;

static_assert(
Expand All @@ -45,24 +49,20 @@ dif_flash_ctrl_state_t *flash_ctrl;
dif_rv_plic_t *plic;
dif_alert_handler_t *alert_handler;
dif_aon_timer_t *aon_timer;
dif_pwrmgr_t *pwrmgr;
dif_sysrst_ctrl_t *sysrst_ctrl_aon;
dif_rstmgr_t *rstmgr;

dif_flash_ctrl_state_t flash_ctrl_actual;
dif_rv_plic_t plic_actual;
dif_alert_handler_t alert_handler_actual;
dif_aon_timer_t aon_timer_actual;
dif_pwrmgr_t pwrmgr_actual;
dif_pwrmgr_t pwrmgr;
dif_sysrst_ctrl_t sysrst_ctrl_aon_actual;
dif_rstmgr_t rstmgr_actual;

void init_peripherals(void) {
// Initialize pwrmgr.
CHECK_DIF_OK(
dif_pwrmgr_init(mmio_region_from_addr(TOP_EARLGREY_PWRMGR_AON_BASE_ADDR),
&pwrmgr_actual));
pwrmgr = &pwrmgr_actual;
CHECK_DIF_OK(dif_pwrmgr_init_from_dt(kPwrmgrDt, &pwrmgr));

// Initialize sysrst_ctrl.
CHECK_DIF_OK(dif_sysrst_ctrl_init(
Expand Down Expand Up @@ -163,7 +163,7 @@ void config_sysrst(dif_pinmux_index_t pad_pin) {
LOG_INFO("sysrst enabled");

// Set sysrst as a reset source.
CHECK_DIF_OK(dif_pwrmgr_set_request_sources(pwrmgr, kDifPwrmgrReqTypeReset,
CHECK_DIF_OK(dif_pwrmgr_set_request_sources(&pwrmgr, kDifPwrmgrReqTypeReset,
kDifPwrmgrResetRequestSourceOne,
kDifToggleEnabled));
LOG_INFO("Reset Request SourceOne is set");
Expand Down Expand Up @@ -214,7 +214,7 @@ void config_wdog(uint64_t bark_micros, uint64_t bite_micros) {
CHECK_STATUS_OK(aon_timer_testutils_watchdog_config(aon_timer, bark_cycles,
bite_cycles, false));
// Set wdog as a reset source.
CHECK_DIF_OK(dif_pwrmgr_set_request_sources(pwrmgr, kDifPwrmgrReqTypeReset,
CHECK_DIF_OK(dif_pwrmgr_set_request_sources(&pwrmgr, kDifPwrmgrReqTypeReset,
kDifPwrmgrResetRequestSourceTwo,
kDifToggleEnabled));
}
Expand All @@ -227,7 +227,7 @@ void trigger_escalation(void) {
kWdogBiteMicros * alert_handler_testutils_cycle_rescaling_factor());
// Trigger the alert handler to escalate.
dif_pwrmgr_alert_t alert = kDifPwrmgrAlertFatalFault;
CHECK_DIF_OK(dif_pwrmgr_alert_force(pwrmgr, alert));
CHECK_DIF_OK(dif_pwrmgr_alert_force(&pwrmgr, alert));

// If this busy spin expires the escalation didn't occur as expected.
busy_spin_micros(kWdogBiteMicros);
Expand All @@ -251,7 +251,7 @@ void prepare_for_wdog(pwrmgr_sleep_resets_lib_modes_t mode) {
// Program the pwrmgr to go to deep sleep state (clocks off).
// Enter in low power mode.
CHECK_STATUS_OK(pwrmgr_testutils_enable_low_power(
pwrmgr, kDifPwrmgrWakeupRequestSourceTwo, config));
&pwrmgr, kDifPwrmgrWakeupRequestSourceTwo, config));
wait_for_interrupt();
}
// If we arrive here the test must fail.
Expand All @@ -273,7 +273,7 @@ void prepare_for_sysrst(pwrmgr_sleep_resets_lib_modes_t mode) {
kDifPwrmgrDomainOptionIoClockInLowPower |
kDifPwrmgrDomainOptionMainPowerInLowPower;
CHECK_STATUS_OK(pwrmgr_testutils_enable_low_power(
pwrmgr, kDifPwrmgrWakeupRequestSourceOne, config));
&pwrmgr, kDifPwrmgrWakeupRequestSourceOne, config));
// Log message to synchronize with host side: emit it as close as
// possible before WFI so the host has no chance of sending the reset
// before it is enabled.
Expand Down
2 changes: 1 addition & 1 deletion sw/device/tests/sim_dv/BUILD
Original file line number Diff line number Diff line change
Expand Up @@ -565,8 +565,8 @@ cc_library(
target_compatible_with = [OPENTITAN_CPU],
visibility = ["//sw/device/tests:__pkg__"],
deps = [
"//hw/top:dt",
"//hw/top:pwrmgr_c_regs",
"//hw/top_earlgrey/sw/autogen:top_earlgrey",
"//sw/device/lib/arch:device",
"//sw/device/lib/base:mmio",
"//sw/device/lib/dif:adc_ctrl",
Expand Down
Loading

0 comments on commit 384a777

Please sign in to comment.