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) {
35 kDtSocProxyResetReqExternal, &reset_sources));
38 LOG_INFO(
"External resets enabled.");
44 CHECK(
false,
"Did not get reset in time!");
50 void after_ext_rst_req(
const dif_rv_plic_t *rv_plic,
51 const dif_soc_proxy_t *soc_proxy) {
52 LOG_INFO(
"Reset on external request.");
57 irq_external_ctrl(
true);
59 for (
unsigned i = 0; i < SOC_PROXY_PARAM_NUM_EXTERNAL_IRQS; i++) {
63 const dif_soc_proxy_irq_t soc_proxy_irq = (dif_soc_proxy_irq_t)i;
66 CHECK_DIF_OK(dif_soc_proxy_irq_set_enabled(soc_proxy, soc_proxy_irq,
73 for (
unsigned num_try = 0; num_try < 10; num_try++) {
77 bool soc_proxy_irq_pending;
78 CHECK_DIF_OK(dif_soc_proxy_irq_is_pending(soc_proxy, soc_proxy_irq,
79 &soc_proxy_irq_pending));
80 if (soc_proxy_irq_pending) {
81 LOG_INFO(
"IRQ %0d pending in soc_proxy.", i);
86 bool rv_plic_irq_pending;
88 &rv_plic_irq_pending));
89 if (rv_plic_irq_pending) {
91 LOG_INFO(
"IRQ %0d pending in rv_plic.", i);
95 CHECK(
false,
"Expected IRQ to be pending in soc_proxy AND rv_plic!");
100 CHECK_DIF_OK(dif_soc_proxy_irq_acknowledge(soc_proxy, soc_proxy_irq));
107 CHECK_DIF_OK(dif_soc_proxy_irq_set_enabled(soc_proxy, soc_proxy_irq,
112 irq_external_ctrl(
false);
118 dif_rv_plic_t rv_plic;
119 dif_soc_proxy_t soc_proxy;
121 CHECK_DIF_OK(dif_pwrmgr_init_from_dt(kDtPwrmgrAon, &pwrmgr));
122 CHECK_DIF_OK(dif_rstmgr_init_from_dt(kDtRstmgrAon, &rstmgr));
123 CHECK_DIF_OK(dif_rv_plic_init_from_dt(kDtRvPlic, &rv_plic));
124 CHECK_DIF_OK(dif_soc_proxy_init_from_dt(kDtSocProxy, &soc_proxy));
130 }
else if (UNWRAP(rstmgr_testutils_reset_info_any(
131 &rstmgr, kDifRstmgrResetInfoExternalRst))) {
132 after_ext_rst_req(&rv_plic, &soc_proxy);