5 #include "sw/device/silicon_creator/lib/drivers/lifecycle.h"
10 #include "dt/dt_lc_ctrl.h"
16 #include "lc_ctrl_regs.h"
18 static inline uint32_t lc_ctrl_base(
void) {
19 return dt_lc_ctrl_primary_reg_block(kDtLcCtrl);
22 lifecycle_state_t lifecycle_state_get(
void) {
23 uint32_t raw_state = lifecycle_raw_state_get();
25 switch (launder32(raw_state)) {
26 case LC_CTRL_LC_STATE_STATE_VALUE_TEST_UNLOCKED0:
29 case LC_CTRL_LC_STATE_STATE_VALUE_TEST_UNLOCKED1:
32 case LC_CTRL_LC_STATE_STATE_VALUE_TEST_UNLOCKED2:
35 case LC_CTRL_LC_STATE_STATE_VALUE_TEST_UNLOCKED3:
38 case LC_CTRL_LC_STATE_STATE_VALUE_TEST_UNLOCKED4:
41 case LC_CTRL_LC_STATE_STATE_VALUE_TEST_UNLOCKED5:
44 case LC_CTRL_LC_STATE_STATE_VALUE_TEST_UNLOCKED6:
47 case LC_CTRL_LC_STATE_STATE_VALUE_TEST_UNLOCKED7:
50 case LC_CTRL_LC_STATE_STATE_VALUE_DEV:
53 case LC_CTRL_LC_STATE_STATE_VALUE_PROD:
56 case LC_CTRL_LC_STATE_STATE_VALUE_PROD_END:
58 return kLcStateProdEnd;
59 case LC_CTRL_LC_STATE_STATE_VALUE_RMA:
69 uint32_t raw_state = lifecycle_raw_state_get();
71 if (launder32(raw_state) == LC_CTRL_LC_STATE_STATE_VALUE_PROD) {
75 HARDENED_CHECK_NE(raw_state, LC_CTRL_LC_STATE_STATE_VALUE_PROD);
77 if (launder32(raw_state) == LC_CTRL_LC_STATE_STATE_VALUE_PROD_END) {
81 HARDENED_CHECK_NE(raw_state, LC_CTRL_LC_STATE_STATE_VALUE_PROD_END);
86 uint32_t lifecycle_raw_state_get(
void) {
89 LC_CTRL_LC_STATE_STATE_FIELD);
95 kLifecycleDeviceIdNumWords == LC_CTRL_PARAM_NUM_DEVICE_ID_WORDS,
96 "length of the device_id array does not match the length in hardware");
98 size_t i = 0, r = kLifecycleDeviceIdNumWords - 1;
99 for (; launder32(i) < kLifecycleDeviceIdNumWords &&
100 launder32(r) < kLifecycleDeviceIdNumWords;
103 lc_ctrl_base() + LC_CTRL_DEVICE_ID_0_REG_OFFSET + i *
sizeof(uint32_t));
116 reg0, LC_CTRL_HW_REVISION0_SILICON_CREATOR_ID_FIELD),
118 reg0, LC_CTRL_HW_REVISION0_PRODUCT_ID_FIELD),
120 reg1, LC_CTRL_HW_REVISION1_REVISION_ID_FIELD),
125 if (id->device_id[1] == din[0] && id->device_id[2] == din[1])