Software APIs
ast_clk_rst_inputs.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 
15 #include "sw/device/lib/runtime/irq.h"
17 #include "sw/device/lib/testing/alert_handler_testutils.h"
18 #include "sw/device/lib/testing/aon_timer_testutils.h"
19 #include "sw/device/lib/testing/clkmgr_testutils.h"
20 #include "sw/device/lib/testing/entropy_src_testutils.h"
21 #include "sw/device/lib/testing/entropy_testutils.h"
22 #include "sw/device/lib/testing/pwrmgr_testutils.h"
23 #include "sw/device/lib/testing/rstmgr_testutils.h"
24 #include "sw/device/lib/testing/rv_plic_testutils.h"
25 #include "sw/device/lib/testing/test_framework/check.h"
27 
29 #include "sensor_ctrl_regs.h"
30 #include "sw/device/lib/testing/autogen/isr_testutils.h"
31 
32 #define kAlertSet true
33 #define kAlertClear false
34 #define kAlertVal7 7
35 #define kAlertVal8 8
36 #define kDifNoWakeup 0
37 
38 OTTF_DEFINE_TEST_CONFIG();
39 
40 static volatile const uint8_t kNumLowPowerSamples;
41 static volatile const uint8_t kNumNormalPowerSamples;
42 static volatile const uint8_t kWakeUpTimeInUs;
43 
44 static volatile const uint8_t kChannel0MaxLowByte;
45 static volatile const uint8_t kChannel0MaxHighByte;
46 static volatile const uint8_t kChannel0MinLowByte;
47 static volatile const uint8_t kChannel0MinHighByte;
48 
49 static volatile const uint8_t kChannel1MaxLowByte;
50 static volatile const uint8_t kChannel1MaxHighByte;
51 static volatile const uint8_t kChannel1MinLowByte;
52 static volatile const uint8_t kChannel1MinHighByte;
53 
54 static dif_sensor_ctrl_t sensor_ctrl;
55 static dif_alert_handler_t alert_handler;
56 static dif_aon_timer_t aon_timer;
57 static dif_rv_plic_t rv_plic;
58 static dif_pwrmgr_t pwrmgr;
59 static dif_rstmgr_t rstmgr;
60 static dif_entropy_src_t entropy_src;
61 
62 static dif_clkmgr_t clkmgr;
63 static dif_adc_ctrl_t adc_ctrl;
64 
65 static const dt_adc_ctrl_t kAdcCtrlDt = 0;
66 static_assert(kDtAdcCtrlCount == 1, "this test expects a adc_ctrl");
67 static const dt_clkmgr_t kClkmgrDt = 0;
68 static_assert(kDtClkmgrCount == 1, "this test expects a clkmgr");
69 static const dt_rstmgr_t kRstmgrDt = 0;
70 static_assert(kDtRstmgrCount == 1, "this test expects a rstmgr");
71 static const dt_pwrmgr_t kPwrmgrDt = 0;
72 static_assert(kDtPwrmgrCount == 1, "this test expects a pwrmgr");
73 static_assert(kDtAonTimerCount == 1, "this test expects an aon_timer");
74 static const dt_aon_timer_t kAonTimerDt = 0;
75 static_assert(kDtEntropySrcCount == 1, "this test expects an entropy_src");
76 static const dt_entropy_src_t kEntropySrcDt = 0;
77 static const dt_alert_handler_t kAlertHandlerDt = 0;
78 static_assert(kDtAlertHandlerCount == 1,
79  "this library expects exactly one alert_handler");
80 static const dt_rv_plic_t kRvPlicDt = 0;
81 static_assert(kDtRvPlicCount == 1, "this test expects exactly one rv_plic");
82 static const dt_sensor_ctrl_t kSensorCtrlDt = 0;
83 static_assert(kDtSensorCtrlCount >= 1, "this test expects a sensor_ctrl");
84 
85 static volatile bool interrupt_serviced = false;
86 static bool first_adc_setup = true;
87 
88 enum {
89  /**
90  * The size of the buffer used in firmware to process the entropy bits in
91  * firmware override mode.
92  */
93  kEntropyFifoBufferSize = 16,
94 };
95 
96 enum {
97  kPowerUpTimeInUs = 30,
98 };
99 
100 static uint32_t read_fifo_depth(dif_entropy_src_t *entropy) {
101  uint32_t fifo_depth = 0;
102  CHECK_DIF_OK(dif_entropy_src_get_fifo_depth(entropy, &fifo_depth));
103  return fifo_depth;
104 }
105 
106 static uint32_t get_events(dif_toggle_t fatal) {
107  dif_sensor_ctrl_events_t events = 0;
108  if (dif_toggle_to_bool(fatal)) {
109  CHECK_DIF_OK(dif_sensor_ctrl_get_fatal_events(&sensor_ctrl, &events));
110  } else {
111  CHECK_DIF_OK(dif_sensor_ctrl_get_recov_events(&sensor_ctrl, &events));
112  }
113  return events;
114 }
115 
116 /**
117  * Clear event trigger and recoverable status.
118  */
119 static void clear_event(uint32_t idx, dif_toggle_t fatal) {
120  CHECK_DIF_OK(dif_sensor_ctrl_set_ast_event_trigger(&sensor_ctrl, idx,
122  if (!dif_toggle_to_bool(fatal)) {
123  CHECK_DIF_OK(dif_sensor_ctrl_clear_recov_event(&sensor_ctrl, idx));
124  }
125 }
126 
127 /**
128  * Check alert cause registers are correctly set
129  */
130 static void check_alert_state(dif_toggle_t fatal) {
131  bool fatal_cause = false;
132  bool recov_cause = false;
133 
136  &fatal_cause));
137 
140  &recov_cause));
141 
142  if (dif_toggle_to_bool(fatal)) {
143  CHECK(fatal_cause & !recov_cause,
144  "Fatal alert not correctly observed in alert handler");
145  } else {
146  CHECK(recov_cause & !fatal_cause,
147  "Recov alert not correctly observed in alert handler");
148  }
149 
154 }
155 
156 /**
157  * First configure fatality of the desired event.
158  * Then trigger the event from sensor_ctrl to ast.
159  * Next poll for setting of correct events inside sensor_ctrl status.
160  * When a recoverable event is triggerd, make sure only recoverable
161  * status is seen, likewise for fatal events.
162  * Finally, check for correct capture of cause in alert handler.
163  */
164 static void test_event(uint32_t idx, dif_toggle_t fatal, bool set_event) {
165  if (set_event) {
166  // Enable the alert on the sensor_ctrl side
167  CHECK_DIF_OK(
168  dif_sensor_ctrl_set_alert_en(&sensor_ctrl, idx, kDifToggleEnabled));
169 
170  // Configure event fatality
171  CHECK_DIF_OK(dif_sensor_ctrl_set_alert_fatal(&sensor_ctrl, idx, fatal));
172 
173  // Trigger event
174  CHECK_DIF_OK(dif_sensor_ctrl_set_ast_event_trigger(&sensor_ctrl, idx,
176  // wait for events to set
177  IBEX_SPIN_FOR(get_events(fatal) > 0, 1);
178 
179  // Check for the event in ast sensor_ctrl
180  // if the event is not set, error
181  CHECK(((get_events(fatal) >> idx) & 0x1) == 1,
182  "Event %d not observed in AST", idx);
183 
184  // check the opposite fatality setting, should not be set
185  CHECK(((get_events(!fatal) >> idx) & 0x1) == 0,
186  "Event %d observed in AST when it should not be", idx);
187  } else {
188  // clear event trigger
189  clear_event(idx, fatal);
190 
191  // check whether alert handler captured the event
192  check_alert_state(fatal);
193 
194  // Disable the alert on the sensor_ctrl side
195  CHECK_DIF_OK(
197  }
198 }
199 
200 void init_units(void) {
201  CHECK_DIF_OK(dif_pwrmgr_init_from_dt(kPwrmgrDt, &pwrmgr));
202  CHECK_DIF_OK(dif_rstmgr_init_from_dt(kRstmgrDt, &rstmgr));
203  CHECK_DIF_OK(dif_entropy_src_init_from_dt(kEntropySrcDt, &entropy_src));
204  CHECK_DIF_OK(dif_aon_timer_init_from_dt(kAonTimerDt, &aon_timer));
205  CHECK_DIF_OK(dif_rv_plic_init_from_dt(kRvPlicDt, &rv_plic));
206  CHECK_DIF_OK(dif_sensor_ctrl_init_from_dt(kSensorCtrlDt, &sensor_ctrl));
207  CHECK_DIF_OK(dif_alert_handler_init_from_dt(kAlertHandlerDt, &alert_handler));
208  CHECK_DIF_OK(dif_clkmgr_init_from_dt(kClkmgrDt, &clkmgr));
209  CHECK_DIF_OK(dif_adc_ctrl_init_from_dt(kAdcCtrlDt, &adc_ctrl));
210 }
211 
212 /**
213  * configure adc module
214  */
215 static void configure_adc_ctrl(const dif_adc_ctrl_t *adc_ctrl) {
216  uint32_t wake_up_time_aon_cycles = 0;
217  uint32_t power_up_time_aon_cycles = 0;
218 
219  CHECK_STATUS_OK(aon_timer_testutils_get_aon_cycles_32_from_us(
220  kPowerUpTimeInUs, &power_up_time_aon_cycles));
221  CHECK_STATUS_OK(aon_timer_testutils_get_aon_cycles_32_from_us(
222  kWakeUpTimeInUs, &wake_up_time_aon_cycles));
223  CHECK_DIF_OK(dif_adc_ctrl_set_enabled(adc_ctrl, kDifToggleDisabled));
224  CHECK_DIF_OK(dif_adc_ctrl_reset(adc_ctrl));
225  CHECK_DIF_OK(dif_adc_ctrl_configure(
226  adc_ctrl,
229  .num_low_power_samples = kNumLowPowerSamples,
230  .num_normal_power_samples = kNumNormalPowerSamples,
231  .power_up_time_aon_cycles = (uint8_t)power_up_time_aon_cycles + 1,
232  .wake_up_time_aon_cycles = wake_up_time_aon_cycles}));
233 }
234 
235 static void en_plic_irqs(dif_rv_plic_t *plic) {
236  top_earlgrey_plic_irq_id_t plic_irqs[] = {
238 
239  for (uint32_t i = 0; i < ARRAYSIZE(plic_irqs); ++i) {
240  CHECK_DIF_OK(dif_rv_plic_irq_set_enabled(
241  plic, plic_irqs[i], kTopEarlgreyPlicTargetIbex0, kDifToggleEnabled));
242 
243  // Assign a default priority
244  CHECK_DIF_OK(dif_rv_plic_irq_set_priority(plic, plic_irqs[i], 0x1));
245  }
246 
247  // Enable the external IRQ at Ibex.
248  irq_global_ctrl(true);
249  irq_external_ctrl(true);
250 }
251 
252 void adc_setup(bool first_adc_setup) {
253  // Enable adc interrupts.
254  CHECK_DIF_OK(dif_adc_ctrl_irq_set_enabled(
255  &adc_ctrl, kDifAdcCtrlIrqMatchPending, kDifToggleEnabled));
256 
257  uint16_t channel0_filter0_max =
258  ((uint16_t)(kChannel0MaxHighByte << 8)) | kChannel0MaxLowByte;
259  uint16_t channel0_filter0_min =
260  ((uint16_t)(kChannel0MinHighByte << 8)) | kChannel0MinLowByte;
261  uint16_t channel1_filter0_max =
262  ((uint16_t)(kChannel1MaxHighByte << 8)) | kChannel1MaxLowByte;
263  uint16_t channel1_filter0_min =
264  ((uint16_t)(kChannel1MinHighByte << 8)) | kChannel1MinLowByte;
265 
266  if (first_adc_setup) {
267  // Setup ADC configuration.
268  configure_adc_ctrl(&adc_ctrl);
269  } else {
270  CHECK_DIF_OK(dif_adc_ctrl_reset(&adc_ctrl));
271  }
272 
273  en_plic_irqs(&rv_plic);
274  // Setup ADC filters. There is one filter for each channel.
275  CHECK_DIF_OK(dif_adc_ctrl_configure_filter(
276  &adc_ctrl, kDifAdcCtrlChannel0,
277  (dif_adc_ctrl_filter_config_t){.filter = kDifAdcCtrlFilter0,
278  .generate_irq_on_match = true,
279  .generate_wakeup_on_match = true,
280  .in_range = true,
281  .max_voltage = channel0_filter0_max,
282  .min_voltage = channel0_filter0_min},
284  CHECK_DIF_OK(dif_adc_ctrl_configure_filter(
285  &adc_ctrl, kDifAdcCtrlChannel1,
286  (dif_adc_ctrl_filter_config_t){.filter = kDifAdcCtrlFilter0,
287  .generate_irq_on_match = true,
288  .generate_wakeup_on_match = true,
289  .in_range = true,
290  .max_voltage = channel1_filter0_max,
291  .min_voltage = channel1_filter0_min},
293 
294  // enable filters.
295  CHECK_DIF_OK(dif_adc_ctrl_filter_set_enabled(
296  &adc_ctrl, kDifAdcCtrlChannel0, kDifAdcCtrlFilter0, kDifToggleEnabled));
297  CHECK_DIF_OK(dif_adc_ctrl_filter_set_enabled(
298  &adc_ctrl, kDifAdcCtrlChannel1, kDifAdcCtrlFilter0, kDifToggleEnabled));
299 
300  if (first_adc_setup) {
301  CHECK_DIF_OK(dif_adc_ctrl_set_enabled(&adc_ctrl, kDifToggleEnabled));
302  }
303 }
304 
305 void ast_enter_sleep_states_and_check_functionality(
306  dif_pwrmgr_domain_config_t pwrmgr_config, uint32_t alert_idx) {
307  bool deepsleep;
308  uint32_t read_fifo_depth_val = 0;
309  uint32_t unhealthy_fifos, errors, alerts;
310 
311  const dif_edn_t edn0 = {
313  const dif_edn_t edn1 = {
315 
316  if ((pwrmgr_config & (~kDifPwrmgrDomainOptionUsbClockInActivePower)) == 0) {
317  deepsleep = true;
318  } else {
319  deepsleep = false;
320  }
321 
322  dif_pwrmgr_request_sources_t adc_ctrl_wakeup_sources;
323  CHECK_DIF_OK(dif_pwrmgr_find_request_source(
324  &pwrmgr, kDifPwrmgrReqTypeWakeup, dt_adc_ctrl_instance_id(kAdcCtrlDt),
325  kDtAdcCtrlWakeupWkupReq, &adc_ctrl_wakeup_sources));
326 
327  if (UNWRAP(pwrmgr_testutils_is_wakeup_reason(&pwrmgr, kDifNoWakeup)) ==
328  true) {
329  // Make sure ENTROPY_SRC is enabled and then empty the observe FIFO to
330  // restart the entropy collection. Note that this is more efficient than
331  // restarting the entire block.
332  CHECK_DIF_OK(dif_entropy_src_set_enabled(&entropy_src, kDifToggleEnabled));
333  CHECK_STATUS_OK(entropy_src_testutils_drain_observe_fifo(&entropy_src));
334 
335  // Verify that the FIFO depth is non-zero via SW - indicating the reception
336  // of data over the AST RNG interface.
337  IBEX_SPIN_FOR(read_fifo_depth(&entropy_src) > 0, 1000);
338 
339  // test recoverable event
340  test_event(alert_idx, kDifToggleDisabled, kAlertSet);
341 
342  // Enable all the AON interrupts used in this test.
343  rv_plic_testutils_irq_range_enable(
344  &rv_plic, kTopEarlgreyPlicTargetIbex0,
347  CHECK_DIF_OK(dif_pwrmgr_irq_set_enabled(&pwrmgr, 0, kDifToggleEnabled));
348 
349  // Setup low power.
350  CHECK_STATUS_OK(rstmgr_testutils_pre_reset(&rstmgr));
351 
352  if (!deepsleep) {
353  // read fifo depth before enter sleep mode
354  read_fifo_depth_val = read_fifo_depth(&entropy_src);
355  }
356 
357  // Configure ADC
358  adc_setup(first_adc_setup);
359 
360  // set sleep mode
361  CHECK_STATUS_OK(pwrmgr_testutils_enable_low_power(
362  &pwrmgr, adc_ctrl_wakeup_sources, pwrmgr_config));
363 
364  // Enter low power mode.
365  LOG_INFO("Issued WFI to enter sleep.");
366 
368 
369  // Interrupt should have been serviced.
370  CHECK(interrupt_serviced);
371 
372  interrupt_serviced = false;
373 
374  } else if (UNWRAP(pwrmgr_testutils_is_wakeup_reason(
375  &pwrmgr, adc_ctrl_wakeup_sources))) {
376  if (deepsleep) {
377  first_adc_setup = false;
378  // Configure ADC after deep sleep
379  adc_setup(first_adc_setup);
380  }
381 
382  // Make sure ENTROPY_SRC is enabled and then empty the observe FIFO to
383  // restart the entropy collection. Note that this is more efficient than
384  // restarting the entire block.
385  CHECK_DIF_OK(dif_entropy_src_set_enabled(&entropy_src, kDifToggleEnabled));
386  CHECK_STATUS_OK(entropy_src_testutils_drain_observe_fifo(&entropy_src));
387 
388  IBEX_SPIN_FOR(read_fifo_depth(&entropy_src) > 0, 1000);
389  }
390 
391  if (!deepsleep) {
392  if (read_fifo_depth_val >= read_fifo_depth(&entropy_src))
393  LOG_ERROR(
394  "read_fifo_depth after exit from idle=%0d should be equal/greater "
395  "than previous read value (%0d)",
396  read_fifo_depth(&entropy_src), read_fifo_depth_val);
397  }
398 
399  IBEX_SPIN_FOR(read_fifo_depth(&entropy_src) > 0, 1000);
400 
401  test_event(alert_idx, kDifToggleDisabled, kAlertClear);
402 
403  CHECK_DIF_OK(dif_pwrmgr_wakeup_reason_clear(&pwrmgr));
404 
405  // test event after exit from low power
406  test_event(alert_idx, kDifToggleDisabled, kAlertSet);
407  test_event(alert_idx, kDifToggleDisabled, kAlertClear);
408 
409  // verify there are no any edn alerts/errors
410  CHECK_DIF_OK(dif_edn_get_errors(&edn0, &unhealthy_fifos, &errors));
411  CHECK_DIF_OK(dif_edn_get_recoverable_alerts(&edn0, &alerts));
412  if (unhealthy_fifos != 0 || errors != 0 || alerts != 0)
413  LOG_ERROR("edn0: error=0x%x, unhealthy_fifos=0x%x, alerts=0x%x", errors,
414  unhealthy_fifos, alerts);
415 
416  CHECK_DIF_OK(dif_edn_get_errors(&edn1, &unhealthy_fifos, &errors));
417  CHECK_DIF_OK(dif_edn_get_recoverable_alerts(&edn1, &alerts));
418  if (unhealthy_fifos != 0 || errors != 0 || alerts != 0)
419  LOG_ERROR("edn1: error=0x%x, unhealthy_fifos=0x%x, alerts=0x%x", errors,
420  unhealthy_fifos, alerts);
421 }
422 
423 /**
424  * set edn auto mode
425  */
426 void set_edn_auto_mode(void) {
427  const dif_csrng_t csrng = {
429  const dif_edn_t edn0 = {
431  const dif_edn_t edn1 = {
433 
434  // Disable the entropy complex
435  CHECK_STATUS_OK(entropy_testutils_stop_all());
436 
437  // Configure ENTROPY_SRC in Firmware Override: Observe mode and enable it.
438  // In this mode, the entropy received from the RNG inside AST gets collected
439  // in the Observe FIFO AND continues to flow through the hardware pipeline to
440  // eventually reach the hardware interface.
441  const dif_entropy_src_fw_override_config_t fw_override_config = {
442  .entropy_insert_enable = false,
443  .buffer_threshold = kEntropyFifoBufferSize,
444  };
446  &entropy_src, fw_override_config, kDifToggleEnabled));
447  CHECK_STATUS_OK(entropy_testutils_entropy_src_init());
448 
449  // Enable CSRNG
450  CHECK_DIF_OK(dif_csrng_configure(&csrng));
451 
452  // Enable EDNs in auto request mode
453  // Re-enable EDN0 in auto mode.
454  const dif_edn_auto_params_t edn0_params = {
455  // EDN0 provides lower-quality entropy. Let one generate command return 8
456  // blocks, and reseed every 32 generates.
457  .instantiate_cmd =
458  {
459  .cmd = 0x00000001 | // Reseed from entropy source only.
460  kMultiBitBool4False << 8,
461  .seed_material =
462  {
463  .len = 0,
464  },
465  },
466  .reseed_cmd =
467  {
468  .cmd = 0x00008002 | // One generate returns 8 blocks, reseed
469  // from entropy source only.
470  kMultiBitBool4False << 8,
471  .seed_material =
472  {
473  .len = 0,
474  },
475  },
476  .generate_cmd =
477  {
478  .cmd = 0x00008003, // One generate returns 8 blocks.
479  .seed_material =
480  {
481  .len = 0,
482  },
483  },
484  .reseed_interval = 32, // Reseed every 32 generates.
485  };
486  CHECK_DIF_OK(dif_edn_set_auto_mode(&edn0, edn0_params));
487 
488  // Re-enable EDN1 in auto mode.
489  const dif_edn_auto_params_t edn1_params = {
490  // EDN1 provides highest-quality entropy. Let one generate command
491  // return 1 block, and reseed after every generate.
492  .instantiate_cmd =
493  {
494  .cmd = 0x00000001 | // Reseed from entropy source only.
495  kMultiBitBool4False << 8,
496  .seed_material =
497  {
498  .len = 0,
499  },
500  },
501  .reseed_cmd =
502  {
503  .cmd = 0x00001002 | // One generate returns 1 block, reseed
504  // from entropy source only.
505  kMultiBitBool4False << 8,
506  .seed_material =
507  {
508  .len = 0,
509  },
510  },
511  .generate_cmd =
512  {
513  .cmd = 0x00001003, // One generate returns 1 block.
514  .seed_material =
515  {
516  .len = 0,
517  },
518  },
519  .reseed_interval = 4, // Reseed after every 4 generates.
520  };
521  CHECK_DIF_OK(dif_edn_set_auto_mode(&edn1, edn1_params));
522 
523  // The Observe FIFO has already been filled while producing the seeds for the
524  // EDNs. Empty the FIFO to restart the collection for the actual test.
525  CHECK_STATUS_OK(entropy_src_testutils_drain_observe_fifo(&entropy_src));
526 }
527 
528 void ottf_external_isr(uint32_t *exc_info) {
529  plic_isr_ctx_t plic_ctx = {.rv_plic = &rv_plic,
530  .hart_id = kTopEarlgreyPlicTargetIbex0};
531 
532  adc_ctrl_isr_ctx_t adc_ctrl_ctx = {
533  .adc_ctrl = &adc_ctrl,
534  .plic_adc_ctrl_start_irq_id = kTopEarlgreyPlicIrqIdAdcCtrlAonMatchPending,
535  .expected_irq = 0,
536  .is_only_irq = true};
537 
539  dif_adc_ctrl_irq_t adc_ctrl_irq;
540  isr_testutils_adc_ctrl_isr(plic_ctx, adc_ctrl_ctx, false, &peripheral,
541  &adc_ctrl_irq);
542 
543  CHECK(peripheral == kTopEarlgreyPlicPeripheralAdcCtrlAon);
544  CHECK(adc_ctrl_irq == kDifAdcCtrlIrqMatchPending);
545  interrupt_serviced = true;
546 }
547 
548 bool test_main(void) {
549  dif_pwrmgr_domain_config_t pwrmgr_config;
550 
551  init_units();
552 
553  set_edn_auto_mode();
554  CHECK_DIF_OK(dif_clkmgr_jitter_set_enabled(&clkmgr, kDifToggleEnabled));
555 
556  // Enable both recoverable and fatal alerts
559  kDifAlertHandlerClassA, kDifToggleEnabled, kDifToggleEnabled));
562  kDifAlertHandlerClassA, kDifToggleEnabled, kDifToggleEnabled));
563 
564  LOG_INFO("1 test alert/rng after Deep sleep 1");
565  pwrmgr_config = kDifPwrmgrDomainOptionUsbClockInActivePower;
566  ast_enter_sleep_states_and_check_functionality(pwrmgr_config, kAlertVal7);
567 
568  LOG_INFO("2 test alert/rng after regular sleep (usb clk enabled)");
569  LOG_INFO("force new adc conv set");
570  pwrmgr_config = kDifPwrmgrDomainOptionUsbClockInActivePower |
571  kDifPwrmgrDomainOptionUsbClockInLowPower |
572  kDifPwrmgrDomainOptionMainPowerInLowPower;
573  ast_enter_sleep_states_and_check_functionality(pwrmgr_config, kAlertVal8);
574 
575  LOG_INFO("3 test alert/rng after regular sleep (all clk disabled in lp)");
576  LOG_INFO("force new adc conv set");
577  pwrmgr_config = kDifPwrmgrDomainOptionMainPowerInLowPower |
578  kDifPwrmgrDomainOptionUsbClockInActivePower;
579  ast_enter_sleep_states_and_check_functionality(pwrmgr_config, kAlertVal7);
580 
581  LOG_INFO("c code is finished");
582 
583  return true;
584 }