18 if (entropy_src == NULL) {
22 mmio_region_write32(entropy_src->
base_addr,
23 ENTROPY_SRC_MODULE_ENABLE_REG_OFFSET,
24 ENTROPY_SRC_MODULE_ENABLE_REG_RESVAL);
27 if (!mmio_region_read32(entropy_src->
base_addr,
28 ENTROPY_SRC_REGWEN_REG_OFFSET)) {
33 mmio_region_write32(entropy_src->
base_addr,
34 ENTROPY_SRC_ENTROPY_CONTROL_REG_OFFSET,
35 ENTROPY_SRC_ENTROPY_CONTROL_REG_RESVAL);
37 mmio_region_write32(entropy_src->
base_addr, ENTROPY_SRC_CONF_REG_OFFSET,
38 ENTROPY_SRC_CONF_REG_RESVAL);
40 mmio_region_write32(entropy_src->
base_addr,
41 ENTROPY_SRC_HEALTH_TEST_WINDOWS_REG_OFFSET,
42 ENTROPY_SRC_HEALTH_TEST_WINDOWS_REG_RESVAL);
44 mmio_region_write32(entropy_src->
base_addr,
45 ENTROPY_SRC_ALERT_THRESHOLD_REG_OFFSET,
46 ENTROPY_SRC_ALERT_THRESHOLD_REG_RESVAL);
54 if (entropy_src == NULL ||
60 if (!mmio_region_read32(entropy_src->
base_addr,
61 ENTROPY_SRC_REGWEN_REG_OFFSET)) {
66 uint32_t entropy_ctrl_reg = bitfield_field32_write(
67 0, ENTROPY_SRC_ENTROPY_CONTROL_ES_ROUTE_FIELD,
69 entropy_ctrl_reg = bitfield_field32_write(
70 entropy_ctrl_reg, ENTROPY_SRC_ENTROPY_CONTROL_ES_TYPE_FIELD,
72 mmio_region_write32(entropy_src->
base_addr,
73 ENTROPY_SRC_ENTROPY_CONTROL_REG_OFFSET, entropy_ctrl_reg);
79 uint32_t entropy_conf_reg = bitfield_field32_write(
80 0, ENTROPY_SRC_CONF_FIPS_ENABLE_FIELD,
81 config.
fips_enable ? kMultiBitBool4True : kMultiBitBool4False);
84 entropy_conf_reg = bitfield_field32_write(
85 entropy_conf_reg, ENTROPY_SRC_CONF_FIPS_FLAG_FIELD,
86 config.
fips_flag ? kMultiBitBool4True : kMultiBitBool4False);
89 entropy_conf_reg = bitfield_field32_write(
90 entropy_conf_reg, ENTROPY_SRC_CONF_RNG_FIPS_FIELD,
91 config.
rng_fips ? kMultiBitBool4True : kMultiBitBool4False);
94 entropy_conf_reg = bitfield_field32_write(
95 entropy_conf_reg, ENTROPY_SRC_CONF_ENTROPY_DATA_REG_ENABLE_FIELD,
99 entropy_conf_reg = bitfield_field32_write(
100 entropy_conf_reg, ENTROPY_SRC_CONF_THRESHOLD_SCOPE_FIELD,
102 : kMultiBitBool4False);
105 uint32_t rng_bit_en =
107 ? kMultiBitBool4False
108 : kMultiBitBool4True;
109 entropy_conf_reg = bitfield_field32_write(
110 entropy_conf_reg, ENTROPY_SRC_CONF_RNG_BIT_ENABLE_FIELD, rng_bit_en);
111 uint32_t rng_bit_sel =
113 entropy_conf_reg = bitfield_field32_write(
114 entropy_conf_reg, ENTROPY_SRC_CONF_RNG_BIT_SEL_FIELD, rng_bit_sel);
118 entropy_conf_reg = bitfield_field32_write(
119 entropy_conf_reg, ENTROPY_SRC_CONF_ENTROPY_DATA_REG_ENABLE_FIELD,
122 mmio_region_write32(entropy_src->
base_addr, ENTROPY_SRC_CONF_REG_OFFSET,
129 uint32_t health_test_window_sizes =
130 bitfield_field32_write(ENTROPY_SRC_HEALTH_TEST_WINDOWS_REG_RESVAL,
131 ENTROPY_SRC_HEALTH_TEST_WINDOWS_FIPS_WINDOW_FIELD,
133 mmio_region_write32(entropy_src->
base_addr,
134 ENTROPY_SRC_HEALTH_TEST_WINDOWS_REG_OFFSET,
135 health_test_window_sizes);
138 uint32_t alert_threshold = bitfield_field32_write(
139 0, ENTROPY_SRC_ALERT_THRESHOLD_ALERT_THRESHOLD_FIELD,
141 alert_threshold = bitfield_field32_write(
142 alert_threshold, ENTROPY_SRC_ALERT_THRESHOLD_ALERT_THRESHOLD_INV_FIELD,
144 mmio_region_write32(entropy_src->
base_addr,
145 ENTROPY_SRC_ALERT_THRESHOLD_REG_OFFSET, alert_threshold);
148 mmio_region_write32(entropy_src->
base_addr,
149 ENTROPY_SRC_MODULE_ENABLE_REG_OFFSET,
150 dif_toggle_to_multi_bit_bool4(enabled));
158 if (entropy_src == NULL ||
160 ENTROPY_SRC_OBSERVE_FIFO_THRESH_OBSERVE_FIFO_THRESH_MASK ||
165 if (!mmio_region_read32(entropy_src->
base_addr,
166 ENTROPY_SRC_REGWEN_REG_OFFSET)) {
170 mmio_region_write32(entropy_src->
base_addr,
171 ENTROPY_SRC_OBSERVE_FIFO_THRESH_REG_OFFSET,
175 bitfield_field32_write(0, ENTROPY_SRC_FW_OV_CONTROL_FW_OV_MODE_FIELD,
176 dif_toggle_to_multi_bit_bool4(enabled));
177 reg = bitfield_field32_write(
178 reg, ENTROPY_SRC_FW_OV_CONTROL_FW_OV_ENTROPY_INSERT_FIELD,
180 mmio_region_write32(entropy_src->
base_addr,
181 ENTROPY_SRC_FW_OV_CONTROL_REG_OFFSET, reg);
204 if (entropy_src == NULL) {
208 if (!mmio_region_read32(entropy_src->
base_addr,
209 ENTROPY_SRC_REGWEN_REG_OFFSET)) {
213 ptrdiff_t high_thresholds_reg_offset = -1;
214 ptrdiff_t low_thresholds_reg_offset = -1;
217 high_thresholds_reg_offset = ENTROPY_SRC_REPCNT_THRESHOLDS_REG_OFFSET;
224 high_thresholds_reg_offset = ENTROPY_SRC_REPCNTS_THRESHOLDS_REG_OFFSET;
231 high_thresholds_reg_offset = ENTROPY_SRC_ADAPTP_HI_THRESHOLDS_REG_OFFSET;
232 low_thresholds_reg_offset = ENTROPY_SRC_ADAPTP_LO_THRESHOLDS_REG_OFFSET;
235 high_thresholds_reg_offset = ENTROPY_SRC_BUCKET_THRESHOLDS_REG_OFFSET;
242 high_thresholds_reg_offset = ENTROPY_SRC_MARKOV_HI_THRESHOLDS_REG_OFFSET;
243 low_thresholds_reg_offset = ENTROPY_SRC_MARKOV_LO_THRESHOLDS_REG_OFFSET;
246 high_thresholds_reg_offset = ENTROPY_SRC_EXTHT_HI_THRESHOLDS_REG_OFFSET;
247 low_thresholds_reg_offset = ENTROPY_SRC_EXTHT_LO_THRESHOLDS_REG_OFFSET;
253 mmio_region_write32(entropy_src->
base_addr, high_thresholds_reg_offset,
255 if (low_thresholds_reg_offset != -1) {
256 mmio_region_write32(entropy_src->
base_addr, low_thresholds_reg_offset,
346 if (entropy_src == NULL || stats == NULL) {
351 entropy_src->
base_addr, ENTROPY_SRC_HT_WATERMARK_NUM_REG_OFFSET);
352 stats->
watermark = (uint16_t)mmio_region_read32(
353 entropy_src->
base_addr, ENTROPY_SRC_HT_WATERMARK_REG_OFFSET);
355 ptrdiff_t high_fails_reg_offset = -1;
356 ptrdiff_t low_fails_reg_offset = -1;
357 for (uint32_t i = 0; i < kDifEntropySrcTestNumVariants; ++i) {
360 high_fails_reg_offset = ENTROPY_SRC_REPCNT_TOTAL_FAILS_REG_OFFSET;
361 low_fails_reg_offset = -1;
364 high_fails_reg_offset = ENTROPY_SRC_REPCNTS_TOTAL_FAILS_REG_OFFSET;
365 low_fails_reg_offset = -1;
368 high_fails_reg_offset = ENTROPY_SRC_ADAPTP_HI_TOTAL_FAILS_REG_OFFSET;
369 low_fails_reg_offset = ENTROPY_SRC_ADAPTP_LO_TOTAL_FAILS_REG_OFFSET;
372 high_fails_reg_offset = ENTROPY_SRC_BUCKET_TOTAL_FAILS_REG_OFFSET;
373 low_fails_reg_offset = -1;
376 high_fails_reg_offset = ENTROPY_SRC_MARKOV_HI_TOTAL_FAILS_REG_OFFSET;
377 low_fails_reg_offset = ENTROPY_SRC_MARKOV_LO_TOTAL_FAILS_REG_OFFSET;
380 high_fails_reg_offset = ENTROPY_SRC_EXTHT_HI_TOTAL_FAILS_REG_OFFSET;
381 low_fails_reg_offset = ENTROPY_SRC_EXTHT_LO_TOTAL_FAILS_REG_OFFSET;
388 mmio_region_read32(entropy_src->
base_addr, high_fails_reg_offset);
390 low_fails_reg_offset == -1
392 : mmio_region_read32(entropy_src->
base_addr, low_fails_reg_offset);
401 if (entropy_src == NULL || counts == NULL) {
405 counts->
total_fails = (uint16_t)mmio_region_read32(
406 entropy_src->
base_addr, ENTROPY_SRC_ALERT_SUMMARY_FAIL_COUNTS_REG_OFFSET);
408 uint32_t alert_fail_counts = mmio_region_read32(
409 entropy_src->
base_addr, ENTROPY_SRC_ALERT_FAIL_COUNTS_REG_OFFSET);
410 uint32_t extht_alert_fail_counts = mmio_region_read32(
411 entropy_src->
base_addr, ENTROPY_SRC_EXTHT_FAIL_COUNTS_REG_OFFSET);
415 (uint8_t)bitfield_field32_read(
417 ENTROPY_SRC_ALERT_FAIL_COUNTS_REPCNT_FAIL_COUNT_FIELD);
419 (uint8_t)bitfield_field32_read(
421 ENTROPY_SRC_ALERT_FAIL_COUNTS_REPCNTS_FAIL_COUNT_FIELD);
423 (uint8_t)bitfield_field32_read(
425 ENTROPY_SRC_ALERT_FAIL_COUNTS_ADAPTP_HI_FAIL_COUNT_FIELD);
427 alert_fail_counts, ENTROPY_SRC_ALERT_FAIL_COUNTS_BUCKET_FAIL_COUNT_FIELD);
430 ENTROPY_SRC_ALERT_FAIL_COUNTS_MARKOV_HI_FAIL_COUNT_FIELD);
432 (uint8_t)bitfield_field32_read(
433 extht_alert_fail_counts,
434 ENTROPY_SRC_EXTHT_FAIL_COUNTS_EXTHT_HI_FAIL_COUNT_FIELD);
440 (uint8_t)bitfield_field32_read(
442 ENTROPY_SRC_ALERT_FAIL_COUNTS_ADAPTP_LO_FAIL_COUNT_FIELD);
446 ENTROPY_SRC_ALERT_FAIL_COUNTS_MARKOV_LO_FAIL_COUNT_FIELD);
448 extht_alert_fail_counts,
449 ENTROPY_SRC_EXTHT_FAIL_COUNTS_EXTHT_LO_FAIL_COUNT_FIELD);
494 if (entropy_src == NULL) {
500 uint32_t reg = mmio_region_read32(entropy_src->
base_addr,
501 ENTROPY_SRC_OBSERVE_FIFO_THRESH_REG_OFFSET);
508 reg = mmio_region_read32(entropy_src->
base_addr,
509 ENTROPY_SRC_FW_OV_CONTROL_REG_OFFSET);
510 if (bitfield_field32_read(reg, ENTROPY_SRC_FW_OV_CONTROL_FW_OV_MODE_FIELD) !=
511 kMultiBitBool4True) {
517 reg = mmio_region_read32(entropy_src->
base_addr,
518 ENTROPY_SRC_INTR_STATE_REG_OFFSET);
519 }
while (!bitfield_bit32_read(
520 reg, ENTROPY_SRC_INTR_STATE_ES_OBSERVE_FIFO_READY_BIT));
523 for (
size_t i = 0; i < len; ++i) {
524 reg = mmio_region_read32(entropy_src->
base_addr,
525 ENTROPY_SRC_FW_OV_RD_DATA_REG_OFFSET);
532 reg = bitfield_bit32_write(
533 0, ENTROPY_SRC_INTR_STATE_ES_OBSERVE_FIFO_READY_BIT,
true);
534 mmio_region_write32(entropy_src->
base_addr, ENTROPY_SRC_INTR_STATE_REG_OFFSET,
542 if (entropy_src == NULL || len == NULL) {
548 uint32_t reg = mmio_region_read32(entropy_src->
base_addr,
549 ENTROPY_SRC_FW_OV_CONTROL_REG_OFFSET);
550 if (bitfield_field32_read(reg, ENTROPY_SRC_FW_OV_CONTROL_FW_OV_MODE_FIELD) !=
551 kMultiBitBool4True) {
556 size_t read_count = 0;
557 while (read_count < *len &&
558 mmio_region_read32(entropy_src->
base_addr,
559 ENTROPY_SRC_OBSERVE_FIFO_DEPTH_REG_OFFSET) > 0) {
560 uint32_t reg = mmio_region_read32(entropy_src->
base_addr,
561 ENTROPY_SRC_FW_OV_RD_DATA_REG_OFFSET);
563 buf[read_count++] = reg;
575 if (entropy_src == NULL || buf == NULL) {
581 uint32_t reg = mmio_region_read32(entropy_src->
base_addr,
582 ENTROPY_SRC_FW_OV_CONTROL_REG_OFFSET);
583 if (bitfield_field32_read(reg, ENTROPY_SRC_FW_OV_CONTROL_FW_OV_MODE_FIELD) !=
584 kMultiBitBool4True ||
585 bitfield_field32_read(
586 reg, ENTROPY_SRC_FW_OV_CONTROL_FW_OV_ENTROPY_INSERT_FIELD) !=
587 kMultiBitBool4True) {
592 for (
size_t i = 0; i < len; ++i) {
593 if (mmio_region_read32(entropy_src->
base_addr,
594 ENTROPY_SRC_FW_OV_WR_FIFO_FULL_REG_OFFSET)) {
601 mmio_region_write32(entropy_src->
base_addr,
602 ENTROPY_SRC_FW_OV_WR_DATA_REG_OFFSET, buf[i]);
689 if (entropy_src == NULL || debug_state == NULL) {
693 uint32_t debug_state_reg = mmio_region_read32(
694 entropy_src->
base_addr, ENTROPY_SRC_DEBUG_STATUS_REG_OFFSET);
696 debug_state_reg, ENTROPY_SRC_DEBUG_STATUS_ENTROPY_FIFO_DEPTH_FIELD);
698 debug_state_reg, ENTROPY_SRC_DEBUG_STATUS_SHA3_FSM_FIELD);
700 debug_state_reg, ENTROPY_SRC_DEBUG_STATUS_SHA3_BLOCK_PR_BIT);
702 debug_state_reg, ENTROPY_SRC_DEBUG_STATUS_SHA3_SQUEEZING_BIT);
704 debug_state_reg, ENTROPY_SRC_DEBUG_STATUS_SHA3_ABSORBED_BIT);
705 debug_state->
sha3_error = bitfield_bit32_read(
706 debug_state_reg, ENTROPY_SRC_DEBUG_STATUS_SHA3_ERR_BIT);
708 debug_state_reg, ENTROPY_SRC_DEBUG_STATUS_MAIN_SM_IDLE_BIT);
710 debug_state_reg, ENTROPY_SRC_DEBUG_STATUS_MAIN_SM_BOOT_DONE_BIT);
744 if (entropy_src == NULL || errors == NULL) {
748 uint32_t err_code_reg = mmio_region_read32(entropy_src->
base_addr,
749 ENTROPY_SRC_ERR_CODE_REG_OFFSET);
754 if (bitfield_bit32_read(err_code_reg,
755 ENTROPY_SRC_ERR_CODE_SFIFO_ESRNG_ERR_BIT)) {
756 if (bitfield_bit32_read(err_code_reg,
757 ENTROPY_SRC_ERR_CODE_FIFO_WRITE_ERR_BIT)) {
760 if (bitfield_bit32_read(err_code_reg,
761 ENTROPY_SRC_ERR_CODE_FIFO_READ_ERR_BIT)) {
764 if (bitfield_bit32_read(err_code_reg,
765 ENTROPY_SRC_ERR_CODE_FIFO_STATE_ERR_BIT)) {
771 if (bitfield_bit32_read(err_code_reg,
772 ENTROPY_SRC_ERR_CODE_SFIFO_OBSERVE_ERR_BIT)) {
773 if (bitfield_bit32_read(err_code_reg,
774 ENTROPY_SRC_ERR_CODE_FIFO_WRITE_ERR_BIT)) {
777 if (bitfield_bit32_read(err_code_reg,
778 ENTROPY_SRC_ERR_CODE_FIFO_READ_ERR_BIT)) {
781 if (bitfield_bit32_read(err_code_reg,
782 ENTROPY_SRC_ERR_CODE_FIFO_STATE_ERR_BIT)) {
788 if (bitfield_bit32_read(err_code_reg,
789 ENTROPY_SRC_ERR_CODE_SFIFO_ESFINAL_ERR_BIT)) {
790 if (bitfield_bit32_read(err_code_reg,
791 ENTROPY_SRC_ERR_CODE_FIFO_WRITE_ERR_BIT)) {
794 if (bitfield_bit32_read(err_code_reg,
795 ENTROPY_SRC_ERR_CODE_FIFO_READ_ERR_BIT)) {
798 if (bitfield_bit32_read(err_code_reg,
799 ENTROPY_SRC_ERR_CODE_FIFO_STATE_ERR_BIT)) {
805 if (bitfield_bit32_read(err_code_reg,
806 ENTROPY_SRC_ERR_CODE_ES_ACK_SM_ERR_BIT)) {
809 if (bitfield_bit32_read(err_code_reg,
810 ENTROPY_SRC_ERR_CODE_ES_MAIN_SM_ERR_BIT)) {
813 if (bitfield_bit32_read(err_code_reg, ENTROPY_SRC_ERR_CODE_ES_CNTR_ERR_BIT)) {