8 #include "sw/device/lib/dif/dif_soc_proxy.h"
10 #include "sw/device/lib/runtime/irq.h"
12 #include "sw/device/lib/testing/rstmgr_testutils.h"
15 #include "hw/top_darjeeling/sw/autogen/top_darjeeling.h"
16 #include "soc_proxy_regs.h"
18 OTTF_DEFINE_TEST_CONFIG();
28 void after_por(dif_pwrmgr_t *pwrmgr) {
33 kDifPwrmgrResetRequestSourceTwo,
35 LOG_INFO(
"External resets enabled.");
41 CHECK(
false,
"Did not get reset in time!");
47 void after_ext_rst_req(
const dif_rv_plic_t *rv_plic,
48 const dif_soc_proxy_t *soc_proxy) {
49 LOG_INFO(
"Reset on external request.");
54 irq_external_ctrl(
true);
56 for (
unsigned i = 0; i < SOC_PROXY_PARAM_NUM_EXTERNAL_IRQS; i++) {
60 const dif_soc_proxy_irq_t soc_proxy_irq = (dif_soc_proxy_irq_t)i;
63 CHECK_DIF_OK(dif_soc_proxy_irq_set_enabled(soc_proxy, soc_proxy_irq,
70 for (
unsigned num_try = 0; num_try < 10; num_try++) {
74 bool soc_proxy_irq_pending;
75 CHECK_DIF_OK(dif_soc_proxy_irq_is_pending(soc_proxy, soc_proxy_irq,
76 &soc_proxy_irq_pending));
77 if (soc_proxy_irq_pending) {
78 LOG_INFO(
"IRQ %0d pending in soc_proxy.", i);
83 bool rv_plic_irq_pending;
85 &rv_plic_irq_pending));
86 if (rv_plic_irq_pending) {
88 LOG_INFO(
"IRQ %0d pending in rv_plic.", i);
92 CHECK(
false,
"Expected IRQ to be pending in soc_proxy AND rv_plic!");
97 CHECK_DIF_OK(dif_soc_proxy_irq_acknowledge(soc_proxy, soc_proxy_irq));
104 CHECK_DIF_OK(dif_soc_proxy_irq_set_enabled(soc_proxy, soc_proxy_irq,
109 irq_external_ctrl(
false);
115 dif_rv_plic_t rv_plic;
116 dif_soc_proxy_t soc_proxy;
118 CHECK_DIF_OK(dif_pwrmgr_init(
120 CHECK_DIF_OK(dif_rstmgr_init(
122 CHECK_DIF_OK(dif_rv_plic_init(
124 CHECK_DIF_OK(dif_soc_proxy_init(
132 }
else if (UNWRAP(rstmgr_testutils_reset_info_any(
133 &rstmgr, kDifRstmgrResetInfoExternalRst))) {
134 after_ext_rst_req(&rv_plic, &soc_proxy);