Software APIs
rv_dm_ndm_reset_req.c
1 // Copyright lowRISC contributors (OpenTitan project).
2 // Licensed under the Apache License, Version 2.0, see LICENSE for details.
3 // SPDX-License-Identifier: Apache-2.0
4 
5 #include "dt/dt_otp_ctrl.h" // Generated
6 #include "dt/dt_pinmux.h" // Generated
9 #include "sw/device/lib/testing/rstmgr_testutils.h"
10 #include "sw/device/lib/testing/test_framework/check.h"
12 
13 #include "otp_ctrl_regs.h"
14 #include "pinmux_regs.h"
15 
16 #if defined(OPENTITAN_IS_EARLGREY)
17 #include "dt/dt_adc_ctrl.h" // Generated
18 #include "dt/dt_flash_ctrl.h" // Generated
19 #include "dt/dt_keymgr.h" // Generated
20 #include "dt/dt_sysrst_ctrl.h" // Generated
21 
22 #include "adc_ctrl_regs.h"
23 #include "flash_ctrl_regs.h"
24 #include "keymgr_regs.h"
25 #include "sysrst_ctrl_regs.h"
26 #elif defined(OPENTITAN_IS_DARJEELING)
27 #include "dt/dt_keymgr_dpe.h" // Generated
28 
29 #include "keymgr_dpe_regs.h"
30 #else
31 #error Unsupported top
32 #endif
33 
34 /*
35  RV_DM NDM RESET REQUEST TEST
36 
37  In top_earlgrey and top_darjeeling, the CSRs can be divided into 3 groups as
38  below.
39  1. Group1 : Device under por_reset
40  - pwrmgr, rstmgr
41  2. Group2 : Device under lc_reset
42  - otp_ctrl, pinmux, rv_dm and aontimer
43 
44  * clkmgr stay between category 1 and 2.
45  3. Group3 : None of the above
46 
47  Upon power up, test programs following registers from Group 2 and 3.
48  Group2:
49  RESET PRGM (ARBITRARY VALUE)
50  OTP_CTRL.DIRECT_ACCESS_WDATA0 0x0 0x0609_2022
51  PINMUX.WKUP_DETECTOR_CNT_TH_1 0X0 0X44 --> move to LC
52  SRAM RET ADDRESS(8) ? 0xDDAA_55BB
53  Group3 (earlgrey):
54  RESET PRGM (ARBITRARY VALUE)
55  ADC_CTRL.ADC_SAMPLE_CTL 0x9B 0x37
56  SYSRST_CTRL.EC_RST_CTL 0x7D0 0x567
57  KEYMGR.MAX_OWNER_KEY_VER_SHADOWED 0x0 0x1600_ABBA
58  FLASH_CTRL.SCRATCH 0x0 0x3927
59  Group3 (darjeeling):
60  RESET PRGM (ARBITRARY VALUE)
61  KEYMGR_DPE.MAX_KEY_VER_SHADOWED 0x0 0x1600_ABBA
62 
63  After programming csrs, the test assert NDM reset from RV_DM and de-assert.
64  Read programmed csr to check all Group2 keep programmed value while group 3
65  csrs have reset values.
66 
67  */
68 OTTF_DEFINE_TEST_CONFIG();
69 /**
70  * Test csr struct
71  */
72 typedef struct test_register {
73  /**
74  * Name of the device.
75  */
76  const char *name;
77  /**
78  * Base address of the test block
79  */
80  uintptr_t base;
81  /**
82  * Offset of CSR / MEM of the test block
83  */
84  ptrdiff_t offset;
85  /**
86  * Arbitrary write value to check register reset.
87  * If the register got reset, then this value will get wiped out.
88  */
89  uint32_t write_val;
90  /**
91  * Expected read value.
92  * For Group 2 registers, it is programmed value - arbitrary, hard coded.
93  * For Group 3 registers, it is reset value.
94  * in the beginning of the test.
95  */
96  uint32_t exp_read_val;
97 
99 
100 static dif_rstmgr_t rstmgr;
101 
102 static void write_test_reg(test_register_t *regs, size_t reg_count) {
103  for (size_t i = 0; i < reg_count; ++i) {
104  mmio_region_write32(mmio_region_from_addr(regs[i].base), regs[i].offset,
105  regs[i].write_val);
106  }
107 }
108 
109 static void check_test_reg(test_register_t *regs, size_t reg_count) {
110  for (size_t i = 0; i < reg_count; ++i) {
111  uint32_t val =
112  mmio_region_read32(mmio_region_from_addr(regs[i].base), regs[i].offset);
113  CHECK(val == regs[i].exp_read_val, "reg[%d]: obs:0x%x exp:0x%x", i, val,
114  regs[i].exp_read_val);
115  }
116 }
117 
118 bool test_main(void) {
119  test_register_t regs[] = {
120  {
121  .name = "OTP_CTRL",
122  .base = dt_otp_ctrl_primary_reg_block(kDtOtpCtrl),
123  .offset = OTP_CTRL_DIRECT_ACCESS_WDATA_0_REG_OFFSET,
124  .write_val = 0x06092022,
125  .exp_read_val = OTP_CTRL_DIRECT_ACCESS_WDATA_0_REG_RESVAL,
126  },
127  {
128  .name = "PINMUX",
129  .base = dt_pinmux_primary_reg_block(kDtPinmuxAon),
130  .offset = PINMUX_WKUP_DETECTOR_CNT_TH_1_REG_OFFSET,
131  .write_val = 0x44,
132  .exp_read_val = PINMUX_WKUP_DETECTOR_CNT_TH_1_REG_RESVAL,
133 
134  },
135 #if defined(OPENTITAN_IS_EARLGREY)
136  {
137  .name = "ADC_CTRL",
138  .base = dt_adc_ctrl_primary_reg_block(kDtAdcCtrlAon),
139  .offset = ADC_CTRL_ADC_SAMPLE_CTL_REG_OFFSET,
140  .write_val = 0x37,
141  .exp_read_val = ADC_CTRL_ADC_SAMPLE_CTL_REG_RESVAL,
142 
143  },
144  {
145  .name = "SYSRST_CTRL",
146  .base = dt_sysrst_ctrl_primary_reg_block(kDtSysrstCtrlAon),
147  .offset = SYSRST_CTRL_EC_RST_CTL_REG_OFFSET,
148  .write_val = 0x567,
149  .exp_read_val = SYSRST_CTRL_EC_RST_CTL_REG_RESVAL,
150 
151  },
152  {
153  .name = "KEYMGR",
154  .base = dt_keymgr_primary_reg_block(kDtKeymgr),
155  .offset = KEYMGR_MAX_OWNER_KEY_VER_SHADOWED_REG_OFFSET,
156  .write_val = 0x1600ABBA,
157  .exp_read_val = KEYMGR_MAX_OWNER_KEY_VER_SHADOWED_REG_RESVAL,
158 
159  },
160  {
161  .name = "FLASH_CTRL",
162  .base = dt_flash_ctrl_primary_reg_block(kDtFlashCtrl),
163  .offset = FLASH_CTRL_SCRATCH_REG_OFFSET,
164  .write_val = 0x3927,
165  .exp_read_val = FLASH_CTRL_SCRATCH_REG_RESVAL,
166  },
167 #elif defined(OPENTITAN_IS_DARJEELING)
168  {
169  .name = "KEYMGR_DPE",
170  .base = dt_keymgr_dpe_primary_reg_block(kDtKeymgrDpe),
171  .offset = KEYMGR_DPE_MAX_KEY_VER_SHADOWED_REG_OFFSET,
172  .write_val = 0x1600ABBA,
173  .exp_read_val = KEYMGR_DPE_MAX_KEY_VER_SHADOWED_REG_RESVAL,
174  },
175 #else
176 #error Unsupported top
177 #endif
178  };
179 
180  CHECK_DIF_OK(dif_rstmgr_init_from_dt(kDtRstmgrAon, &rstmgr));
181 
182  if (UNWRAP(rstmgr_testutils_is_reset_info(&rstmgr, kDifRstmgrResetInfoPor))) {
183  rstmgr_testutils_reason_clear();
184 
185  // Write arbitrary value to each test register.
186  write_test_reg(regs, ARRAYSIZE(regs));
187 
188  LOG_INFO("wait for ndm reset");
190  } else {
191  // NDM reset is de-asserted.
192  // Check reset info to be kDifRstmgrResetInfoNdm.
193  LOG_INFO("check reset info");
194  CHECK(UNWRAP(
195  rstmgr_testutils_is_reset_info(&rstmgr, kDifRstmgrResetInfoNdm)));
196 
197  // Register value check after reset.
198  LOG_INFO("Check registers");
199  check_test_reg(regs, ARRAYSIZE(regs));
200  return true;
201  }
202  return false;
203 }