15 if (lc == NULL || state == NULL) {
19 uint32_t reg = mmio_region_read32(lc->
base_addr, LC_CTRL_LC_STATE_REG_OFFSET);
20 switch (bitfield_field32_read(reg, LC_CTRL_LC_STATE_STATE_FIELD)) {
21 case LC_CTRL_LC_STATE_STATE_VALUE_RAW:
24 case LC_CTRL_LC_STATE_STATE_VALUE_TEST_UNLOCKED0:
27 case LC_CTRL_LC_STATE_STATE_VALUE_TEST_LOCKED0:
30 case LC_CTRL_LC_STATE_STATE_VALUE_TEST_UNLOCKED1:
33 case LC_CTRL_LC_STATE_STATE_VALUE_TEST_LOCKED1:
36 case LC_CTRL_LC_STATE_STATE_VALUE_TEST_UNLOCKED2:
39 case LC_CTRL_LC_STATE_STATE_VALUE_TEST_LOCKED2:
42 case LC_CTRL_LC_STATE_STATE_VALUE_TEST_UNLOCKED3:
45 case LC_CTRL_LC_STATE_STATE_VALUE_TEST_LOCKED3:
48 case LC_CTRL_LC_STATE_STATE_VALUE_TEST_UNLOCKED4:
51 case LC_CTRL_LC_STATE_STATE_VALUE_TEST_LOCKED4:
54 case LC_CTRL_LC_STATE_STATE_VALUE_TEST_UNLOCKED5:
57 case LC_CTRL_LC_STATE_STATE_VALUE_TEST_LOCKED5:
60 case LC_CTRL_LC_STATE_STATE_VALUE_TEST_UNLOCKED6:
63 case LC_CTRL_LC_STATE_STATE_VALUE_TEST_LOCKED6:
66 case LC_CTRL_LC_STATE_STATE_VALUE_TEST_UNLOCKED7:
69 case LC_CTRL_LC_STATE_STATE_VALUE_DEV:
72 case LC_CTRL_LC_STATE_STATE_VALUE_PROD:
75 case LC_CTRL_LC_STATE_STATE_VALUE_PROD_END:
78 case LC_CTRL_LC_STATE_STATE_VALUE_RMA:
81 case LC_CTRL_LC_STATE_STATE_VALUE_SCRAP:
85 case LC_CTRL_LC_STATE_STATE_VALUE_POST_TRANSITION:
88 case LC_CTRL_LC_STATE_STATE_VALUE_ESCALATE:
91 case LC_CTRL_LC_STATE_STATE_VALUE_INVALID:
103 if (lc == NULL || count == NULL) {
108 mmio_region_read32(lc->
base_addr, LC_CTRL_LC_TRANSITION_CNT_REG_OFFSET);
110 (uint8_t)bitfield_field32_read(reg, LC_CTRL_LC_TRANSITION_CNT_CNT_FIELD);
111 if (value == LC_CTRL_LC_TRANSITION_CNT_CNT_MASK) {
121 if (lc == NULL ||
status == NULL) {
125 uint32_t reg = mmio_region_read32(lc->
base_addr, LC_CTRL_STATUS_REG_OFFSET);
129 if (bitfield_bit32_read(reg, LC_CTRL_STATUS_INITIALIZED_BIT)) {
130 status_word = bitfield_bit32_write(status_word,
134 if (bitfield_bit32_read(reg, LC_CTRL_STATUS_READY_BIT)) {
139 if (bitfield_bit32_read(reg, LC_CTRL_STATUS_EXT_CLOCK_SWITCHED_BIT)) {
140 status_word = bitfield_bit32_write(status_word,
144 if (bitfield_bit32_read(reg, LC_CTRL_STATUS_TRANSITION_SUCCESSFUL_BIT)) {
149 if (bitfield_bit32_read(reg, LC_CTRL_STATUS_TRANSITION_COUNT_ERROR_BIT)) {
150 status_word = bitfield_bit32_write(
154 if (bitfield_bit32_read(reg, LC_CTRL_STATUS_TRANSITION_ERROR_BIT)) {
155 status_word = bitfield_bit32_write(
159 if (bitfield_bit32_read(reg, LC_CTRL_STATUS_TOKEN_ERROR_BIT)) {
164 if (bitfield_bit32_read(reg, LC_CTRL_STATUS_FLASH_RMA_ERROR_BIT)) {
165 status_word = bitfield_bit32_write(status_word,
169 if (bitfield_bit32_read(reg, LC_CTRL_STATUS_OTP_ERROR_BIT)) {
174 if (bitfield_bit32_read(reg, LC_CTRL_STATUS_STATE_ERROR_BIT)) {
179 if (bitfield_bit32_read(reg, LC_CTRL_STATUS_BUS_INTEG_ERROR_BIT)) {
180 status_word = bitfield_bit32_write(status_word,
184 if (bitfield_bit32_read(reg, LC_CTRL_STATUS_OTP_PARTITION_ERROR_BIT)) {
185 status_word = bitfield_bit32_write(status_word,
220 if (lc == NULL || hw_rev == NULL) {
225 mmio_region_read32(lc->
base_addr, LC_CTRL_HW_REVISION0_REG_OFFSET);
226 hw_rev->silicon_creator_id = (uint16_t)bitfield_field32_read(
227 reg, LC_CTRL_HW_REVISION0_SILICON_CREATOR_ID_FIELD);
228 hw_rev->product_id = (uint16_t)bitfield_field32_read(
229 reg, LC_CTRL_HW_REVISION0_PRODUCT_ID_FIELD);
230 hw_rev->revision_id = (uint8_t)bitfield_field32_read(
231 reg, LC_CTRL_HW_REVISION1_REVISION_ID_FIELD);
254 LC_CTRL_CLAIM_TRANSITION_IF_REGWEN_REG_OFFSET) == 0) {
258 mmio_region_write32(lc->
base_addr, LC_CTRL_CLAIM_TRANSITION_IF_REG_OFFSET,
261 mmio_region_read32(lc->
base_addr, LC_CTRL_CLAIM_TRANSITION_IF_REG_OFFSET);
264 if (reg != kMultiBitBool8True) {
299 target = LC_CTRL_TRANSITION_TARGET_STATE_VALUE_RAW;
302 target = LC_CTRL_TRANSITION_TARGET_STATE_VALUE_TEST_UNLOCKED0;
305 target = LC_CTRL_TRANSITION_TARGET_STATE_VALUE_TEST_LOCKED0;
308 target = LC_CTRL_TRANSITION_TARGET_STATE_VALUE_TEST_UNLOCKED1;
311 target = LC_CTRL_TRANSITION_TARGET_STATE_VALUE_TEST_LOCKED1;
314 target = LC_CTRL_TRANSITION_TARGET_STATE_VALUE_TEST_UNLOCKED2;
317 target = LC_CTRL_TRANSITION_TARGET_STATE_VALUE_TEST_LOCKED2;
320 target = LC_CTRL_TRANSITION_TARGET_STATE_VALUE_TEST_UNLOCKED3;
323 target = LC_CTRL_TRANSITION_TARGET_STATE_VALUE_TEST_LOCKED3;
326 target = LC_CTRL_TRANSITION_TARGET_STATE_VALUE_TEST_UNLOCKED4;
329 target = LC_CTRL_TRANSITION_TARGET_STATE_VALUE_TEST_LOCKED4;
332 target = LC_CTRL_TRANSITION_TARGET_STATE_VALUE_TEST_UNLOCKED5;
335 target = LC_CTRL_TRANSITION_TARGET_STATE_VALUE_TEST_LOCKED5;
338 target = LC_CTRL_TRANSITION_TARGET_STATE_VALUE_TEST_UNLOCKED6;
341 target = LC_CTRL_TRANSITION_TARGET_STATE_VALUE_TEST_LOCKED6;
344 target = LC_CTRL_TRANSITION_TARGET_STATE_VALUE_TEST_UNLOCKED7;
347 target = LC_CTRL_TRANSITION_TARGET_STATE_VALUE_DEV;
350 target = LC_CTRL_TRANSITION_TARGET_STATE_VALUE_PROD;
353 target = LC_CTRL_TRANSITION_TARGET_STATE_VALUE_PROD_END;
356 target = LC_CTRL_TRANSITION_TARGET_STATE_VALUE_RMA;
359 target = LC_CTRL_TRANSITION_TARGET_STATE_VALUE_SCRAP;
368 LC_CTRL_TRANSITION_REGWEN_REG_OFFSET)) {
373 mmio_region_write32(lc->
base_addr, LC_CTRL_TRANSITION_TARGET_REG_OFFSET,
377 uint32_t ctrl_reg = 0;
379 ctrl_reg = bitfield_bit32_write(
380 ctrl_reg, LC_CTRL_TRANSITION_CTRL_EXT_CLOCK_EN_BIT,
true);
383 ctrl_reg = bitfield_bit32_write(
384 ctrl_reg, LC_CTRL_TRANSITION_CTRL_EXT_CLOCK_EN_BIT,
false);
386 mmio_region_write32(lc->
base_addr, LC_CTRL_TRANSITION_CTRL_REG_OFFSET,
391 for (
int i = 0; i <
sizeof(token->data); i +=
sizeof(uint32_t)) {
393 memcpy(&word, &token->data[i],
sizeof(uint32_t));
395 LC_CTRL_TRANSITION_TOKEN_0_REG_OFFSET + i, word);