Software APIs
lc_ctrl_testutils.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 "sw/device/lib/testing/lc_ctrl_testutils.h"
6 
7 #include <stdbool.h>
8 
11 #include "sw/device/lib/testing/test_framework/check.h"
12 
13 status_t lc_ctrl_testutils_lc_state_log(const dif_lc_ctrl_state_t *state) {
14  switch (*state) {
16  LOG_INFO("Life cycle state: TEST_UNLOCKED0");
17  break;
19  LOG_INFO("Life cycle state: TEST_UNLOCKED1");
20  break;
22  LOG_INFO("Life cycle state: TEST_UNLOCKED2");
23  break;
25  LOG_INFO("Life cycle state: TEST_UNLOCKED3");
26  break;
28  LOG_INFO("Life cycle state: TEST_UNLOCKED4");
29  break;
31  LOG_INFO("Life cycle state: TEST_UNLOCKED5");
32  break;
34  LOG_INFO("Life cycle state: TEST_UNLOCKED6");
35  break;
37  LOG_INFO("Life cycle state: TEST_UNLOCKED7");
38  break;
39  case kDifLcCtrlStateDev:
40  LOG_INFO("Life cycle state: DEV");
41  break;
43  LOG_INFO("Life cycle state: PROD");
44  break;
46  LOG_INFO("Life cycle state: PROD_END");
47  break;
48  case kDifLcCtrlStateRma:
49  LOG_INFO("Life cycle state: RMA");
50  break;
51  default:
52  LOG_ERROR("CPU is executing in locked/invalid life cycle state: %d",
53  (uint32_t)state);
54  return FAILED_PRECONDITION();
55  }
56  return OK_STATUS();
57 }
58 
59 status_t lc_ctrl_testutils_debug_func_enabled(const dif_lc_ctrl_t *lc_ctrl,
60  bool *debug_enabled) {
61  dif_lc_ctrl_state_t state;
62  TRY(dif_lc_ctrl_get_state(lc_ctrl, &state));
63 
64  switch (state) {
73  case kDifLcCtrlStateDev:
74  case kDifLcCtrlStateRma:
75  *debug_enabled = true;
76  break;
77  default:
78  *debug_enabled = false;
79  break;
80  }
81  return OK_STATUS();
82 }
83 
84 status_t lc_ctrl_testutils_check_transition_count(const dif_lc_ctrl_t *lc_ctrl,
85  uint8_t exp_lc_count) {
86  LOG_INFO("Read LC count and check with expect_val=%d", exp_lc_count);
87  uint8_t lc_count;
88  TRY(dif_lc_ctrl_get_attempts(lc_ctrl, &lc_count));
89  TRY_CHECK(lc_count == exp_lc_count,
90  "LC_count error, expected %d but actual count is %d", exp_lc_count,
91  lc_count);
92  return OK_STATUS();
93 }
94 
95 status_t lc_ctrl_testutils_check_lc_state(const dif_lc_ctrl_t *lc_ctrl,
96  dif_lc_ctrl_state_t exp_lc_state) {
97  LOG_INFO("Read LC state and check with expect_state=%d", exp_lc_state);
98  dif_lc_ctrl_state_t lc_state;
99  TRY(dif_lc_ctrl_get_state(lc_ctrl, &lc_state));
100  TRY_CHECK(lc_state == exp_lc_state,
101  "LC_state error, expected %d but actual state is %d", exp_lc_state,
102  lc_state);
103  return OK_STATUS();
104 }
105 
106 status_t lc_ctrl_testutils_operational_state_check(
107  const dif_lc_ctrl_t *lc_ctrl) {
108  dif_lc_ctrl_state_t state;
109  TRY(dif_lc_ctrl_get_state(lc_ctrl, &state));
110  if (state == kDifLcCtrlStateProd || state == kDifLcCtrlStateProdEnd ||
111  state == kDifLcCtrlStateDev) {
112  return OK_STATUS();
113  }
114  return FAILED_PRECONDITION();
115 }