5#include "sw/device/silicon_creator/lib/drivers/lifecycle.h"
10#include "hw/top/dt/lc_ctrl.h"
17#include "hw/top/lc_ctrl_regs.h"
19static inline uint32_t lc_ctrl_base(
void) {
20 return dt_lc_ctrl_primary_reg_block(
kDtLcCtrl);
23lifecycle_state_t lifecycle_state_get(
void) {
24 uint32_t raw_state = lifecycle_raw_state_get();
26 switch (launder32(raw_state)) {
27 case LC_CTRL_LC_STATE_STATE_VALUE_TEST_UNLOCKED0:
30 case LC_CTRL_LC_STATE_STATE_VALUE_TEST_UNLOCKED1:
33 case LC_CTRL_LC_STATE_STATE_VALUE_TEST_UNLOCKED2:
36 case LC_CTRL_LC_STATE_STATE_VALUE_TEST_UNLOCKED3:
39 case LC_CTRL_LC_STATE_STATE_VALUE_TEST_UNLOCKED4:
42 case LC_CTRL_LC_STATE_STATE_VALUE_TEST_UNLOCKED5:
45 case LC_CTRL_LC_STATE_STATE_VALUE_TEST_UNLOCKED6:
48 case LC_CTRL_LC_STATE_STATE_VALUE_TEST_UNLOCKED7:
51 case LC_CTRL_LC_STATE_STATE_VALUE_DEV:
54 case LC_CTRL_LC_STATE_STATE_VALUE_PROD:
57 case LC_CTRL_LC_STATE_STATE_VALUE_PROD_END:
59 return kLcStateProdEnd;
60 case LC_CTRL_LC_STATE_STATE_VALUE_RMA:
70 uint32_t raw_state = lifecycle_raw_state_get();
72 if (launder32(raw_state) == LC_CTRL_LC_STATE_STATE_VALUE_PROD) {
76 HARDENED_CHECK_NE(raw_state, LC_CTRL_LC_STATE_STATE_VALUE_PROD);
78 if (launder32(raw_state) == LC_CTRL_LC_STATE_STATE_VALUE_PROD_END) {
82 HARDENED_CHECK_NE(raw_state, LC_CTRL_LC_STATE_STATE_VALUE_PROD_END);
87uint32_t lifecycle_raw_state_get(
void) {
88 uint32_t value = bitfield_field32_read(
90 LC_CTRL_LC_STATE_STATE_FIELD);
94void lifecycle_device_id_get(lifecycle_device_id_t *device_id) {
96 kLifecycleDeviceIdNumWords == LC_CTRL_PARAM_NUM_DEVICE_ID_WORDS,
97 "length of the device_id array does not match the length in hardware");
99 size_t i = 0, r = kLifecycleDeviceIdNumWords - 1;
100 for (; launder32(i) < kLifecycleDeviceIdNumWords &&
101 launder32(r) < kLifecycleDeviceIdNumWords;
104 lc_ctrl_base() + LC_CTRL_DEVICE_ID_0_REG_OFFSET + i *
sizeof(uint32_t));
110void lifecycle_hw_rev_get(lifecycle_hw_rev_t *hw_rev) {
115 *hw_rev = (lifecycle_hw_rev_t){
116 .silicon_creator_id = (uint16_t)bitfield_field32_read(
117 reg0, LC_CTRL_HW_REVISION0_SILICON_CREATOR_ID_FIELD),
118 .product_id = (uint16_t)bitfield_field32_read(
119 reg0, LC_CTRL_HW_REVISION0_PRODUCT_ID_FIELD),
120 .revision_id = (uint8_t)bitfield_field32_read(
121 reg1, LC_CTRL_HW_REVISION1_REVISION_ID_FIELD),
125hardened_bool_t lifecycle_din_eq(lifecycle_device_id_t *
id, uint32_t *din) {
126 if (id->device_id[1] == din[0] && id->device_id[2] == din[1])
131bool lifecycle_claim(uint32_t claim) {
132 abs_mmio_write32(lc_ctrl_base() + LC_CTRL_CLAIM_TRANSITION_IF_REG_OFFSET,
134 return (
bool)abs_mmio_read32(lc_ctrl_base() +
135 LC_CTRL_TRANSITION_REGWEN_REG_OFFSET);
138void lifecycle_set_status(lifecycle_status_word_t word, uint32_t value) {
139 abs_mmio_write32(lc_ctrl_base() + LC_CTRL_TRANSITION_TOKEN_0_REG_OFFSET +
140 word *
sizeof(uint32_t),