5#include "sw/device/silicon_creator/lib/drivers/lifecycle.h"
10#include "dt/dt_lc_ctrl.h"
16#include "lc_ctrl_regs.h"
18static inline uint32_t lc_ctrl_base(
void) {
19 return dt_lc_ctrl_primary_reg_block(
kDtLcCtrl);
22lifecycle_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);
86uint32_t lifecycle_raw_state_get(
void) {
87 uint32_t value = bitfield_field32_read(
89 LC_CTRL_LC_STATE_STATE_FIELD);
93void lifecycle_device_id_get(lifecycle_device_id_t *device_id) {
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));
109void lifecycle_hw_rev_get(lifecycle_hw_rev_t *hw_rev) {
114 *hw_rev = (lifecycle_hw_rev_t){
115 .silicon_creator_id = (uint16_t)bitfield_field32_read(
116 reg0, LC_CTRL_HW_REVISION0_SILICON_CREATOR_ID_FIELD),
117 .product_id = (uint16_t)bitfield_field32_read(
118 reg0, LC_CTRL_HW_REVISION0_PRODUCT_ID_FIELD),
119 .revision_id = (uint8_t)bitfield_field32_read(
120 reg1, LC_CTRL_HW_REVISION1_REVISION_ID_FIELD),
124hardened_bool_t lifecycle_din_eq(lifecycle_device_id_t *
id, uint32_t *din) {
125 if (id->device_id[1] == din[0] && id->device_id[2] == din[1])