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_threshold_reg_offset = -1;
214 ptrdiff_t low_threshold_reg_offset = -1;
217 high_threshold_reg_offset = ENTROPY_SRC_REPCNT_THRESHOLD_REG_OFFSET;
224 high_threshold_reg_offset = ENTROPY_SRC_REPCNTS_THRESHOLD_REG_OFFSET;
231 high_threshold_reg_offset = ENTROPY_SRC_ADAPTP_HI_THRESHOLD_REG_OFFSET;
232 low_threshold_reg_offset = ENTROPY_SRC_ADAPTP_LO_THRESHOLD_REG_OFFSET;
235 high_threshold_reg_offset = ENTROPY_SRC_ADAPTPS_THRESHOLD_REG_OFFSET;
242 high_threshold_reg_offset = ENTROPY_SRC_BUCKET_THRESHOLD_REG_OFFSET;
249 high_threshold_reg_offset = ENTROPY_SRC_MARKOV_HI_THRESHOLD_REG_OFFSET;
250 low_threshold_reg_offset = ENTROPY_SRC_MARKOV_LO_THRESHOLD_REG_OFFSET;
253 high_threshold_reg_offset = ENTROPY_SRC_EXTHT_HI_THRESHOLD_REG_OFFSET;
254 low_threshold_reg_offset = ENTROPY_SRC_EXTHT_LO_THRESHOLD_REG_OFFSET;
260 mmio_region_write32(entropy_src->
base_addr, high_threshold_reg_offset,
262 if (low_threshold_reg_offset != -1) {
263 mmio_region_write32(entropy_src->
base_addr, low_threshold_reg_offset,
366 if (entropy_src == NULL || stats == NULL) {
371 entropy_src->
base_addr, ENTROPY_SRC_HT_WATERMARK_NUM_REG_OFFSET);
372 stats->
watermark = (uint16_t)mmio_region_read32(
373 entropy_src->
base_addr, ENTROPY_SRC_HT_WATERMARK_REG_OFFSET);
375 ptrdiff_t high_fails_reg_offset = -1;
376 ptrdiff_t low_fails_reg_offset = -1;
377 for (uint32_t i = 0; i < kDifEntropySrcTestNumVariants; ++i) {
380 high_fails_reg_offset = ENTROPY_SRC_REPCNT_TOTAL_FAILS_REG_OFFSET;
381 low_fails_reg_offset = -1;
384 high_fails_reg_offset = ENTROPY_SRC_REPCNTS_TOTAL_FAILS_REG_OFFSET;
385 low_fails_reg_offset = -1;
388 high_fails_reg_offset = ENTROPY_SRC_ADAPTP_HI_TOTAL_FAILS_REG_OFFSET;
389 low_fails_reg_offset = ENTROPY_SRC_ADAPTP_LO_TOTAL_FAILS_REG_OFFSET;
392 high_fails_reg_offset = ENTROPY_SRC_ADAPTPS_TOTAL_FAILS_REG_OFFSET;
393 low_fails_reg_offset = -1;
396 high_fails_reg_offset = ENTROPY_SRC_BUCKET_TOTAL_FAILS_REG_OFFSET;
397 low_fails_reg_offset = -1;
400 high_fails_reg_offset = ENTROPY_SRC_MARKOV_HI_TOTAL_FAILS_REG_OFFSET;
401 low_fails_reg_offset = ENTROPY_SRC_MARKOV_LO_TOTAL_FAILS_REG_OFFSET;
404 high_fails_reg_offset = ENTROPY_SRC_EXTHT_HI_TOTAL_FAILS_REG_OFFSET;
405 low_fails_reg_offset = ENTROPY_SRC_EXTHT_LO_TOTAL_FAILS_REG_OFFSET;
412 mmio_region_read32(entropy_src->
base_addr, high_fails_reg_offset);
414 low_fails_reg_offset == -1
416 : mmio_region_read32(entropy_src->
base_addr, low_fails_reg_offset);
425 if (entropy_src == NULL || counts == NULL) {
429 counts->
total_fails = (uint16_t)mmio_region_read32(
430 entropy_src->
base_addr, ENTROPY_SRC_ALERT_SUMMARY_FAIL_COUNTS_REG_OFFSET);
432 uint32_t alert_fail_counts = mmio_region_read32(
433 entropy_src->
base_addr, ENTROPY_SRC_ALERT_FAIL_COUNTS_REG_OFFSET);
434 uint32_t extht_alert_fail_counts = mmio_region_read32(
435 entropy_src->
base_addr, ENTROPY_SRC_EXTHT_FAIL_COUNTS_REG_OFFSET);
439 (uint8_t)bitfield_field32_read(
441 ENTROPY_SRC_ALERT_FAIL_COUNTS_REPCNT_FAIL_COUNT_FIELD);
443 (uint8_t)bitfield_field32_read(
445 ENTROPY_SRC_ALERT_FAIL_COUNTS_REPCNTS_FAIL_COUNT_FIELD);
447 (uint8_t)bitfield_field32_read(
449 ENTROPY_SRC_ALERT_FAIL_COUNTS_ADAPTP_HI_FAIL_COUNT_FIELD);
451 (uint8_t)bitfield_field32_read(
453 ENTROPY_SRC_ALERT_FAIL_COUNTS_ADAPTPS_FAIL_COUNT_FIELD);
455 alert_fail_counts, ENTROPY_SRC_ALERT_FAIL_COUNTS_BUCKET_FAIL_COUNT_FIELD);
458 ENTROPY_SRC_ALERT_FAIL_COUNTS_MARKOV_HI_FAIL_COUNT_FIELD);
460 (uint8_t)bitfield_field32_read(
461 extht_alert_fail_counts,
462 ENTROPY_SRC_EXTHT_FAIL_COUNTS_EXTHT_HI_FAIL_COUNT_FIELD);
468 (uint8_t)bitfield_field32_read(
470 ENTROPY_SRC_ALERT_FAIL_COUNTS_ADAPTP_LO_FAIL_COUNT_FIELD);
475 ENTROPY_SRC_ALERT_FAIL_COUNTS_MARKOV_LO_FAIL_COUNT_FIELD);
477 extht_alert_fail_counts,
478 ENTROPY_SRC_EXTHT_FAIL_COUNTS_EXTHT_LO_FAIL_COUNT_FIELD);
523 if (entropy_src == NULL) {
529 uint32_t reg = mmio_region_read32(entropy_src->
base_addr,
530 ENTROPY_SRC_OBSERVE_FIFO_THRESH_REG_OFFSET);
537 reg = mmio_region_read32(entropy_src->
base_addr,
538 ENTROPY_SRC_FW_OV_CONTROL_REG_OFFSET);
539 if (bitfield_field32_read(reg, ENTROPY_SRC_FW_OV_CONTROL_FW_OV_MODE_FIELD) !=
540 kMultiBitBool4True) {
546 reg = mmio_region_read32(entropy_src->
base_addr,
547 ENTROPY_SRC_INTR_STATE_REG_OFFSET);
548 }
while (!bitfield_bit32_read(
549 reg, ENTROPY_SRC_INTR_STATE_ES_OBSERVE_FIFO_READY_BIT));
552 for (
size_t i = 0; i < len; ++i) {
553 reg = mmio_region_read32(entropy_src->
base_addr,
554 ENTROPY_SRC_FW_OV_RD_DATA_REG_OFFSET);
561 reg = bitfield_bit32_write(
562 0, ENTROPY_SRC_INTR_STATE_ES_OBSERVE_FIFO_READY_BIT,
true);
563 mmio_region_write32(entropy_src->
base_addr, ENTROPY_SRC_INTR_STATE_REG_OFFSET,
571 if (entropy_src == NULL || len == NULL) {
577 uint32_t reg = mmio_region_read32(entropy_src->
base_addr,
578 ENTROPY_SRC_FW_OV_CONTROL_REG_OFFSET);
579 if (bitfield_field32_read(reg, ENTROPY_SRC_FW_OV_CONTROL_FW_OV_MODE_FIELD) !=
580 kMultiBitBool4True) {
585 size_t read_count = 0;
586 while (read_count < *len &&
587 mmio_region_read32(entropy_src->
base_addr,
588 ENTROPY_SRC_OBSERVE_FIFO_DEPTH_REG_OFFSET) > 0) {
589 uint32_t reg = mmio_region_read32(entropy_src->
base_addr,
590 ENTROPY_SRC_FW_OV_RD_DATA_REG_OFFSET);
592 buf[read_count++] = reg;
604 if (entropy_src == NULL || buf == NULL) {
610 uint32_t reg = mmio_region_read32(entropy_src->
base_addr,
611 ENTROPY_SRC_FW_OV_CONTROL_REG_OFFSET);
612 if (bitfield_field32_read(reg, ENTROPY_SRC_FW_OV_CONTROL_FW_OV_MODE_FIELD) !=
613 kMultiBitBool4True ||
614 bitfield_field32_read(
615 reg, ENTROPY_SRC_FW_OV_CONTROL_FW_OV_ENTROPY_INSERT_FIELD) !=
616 kMultiBitBool4True) {
621 for (
size_t i = 0; i < len; ++i) {
622 if (mmio_region_read32(entropy_src->
base_addr,
623 ENTROPY_SRC_FW_OV_WR_FIFO_FULL_REG_OFFSET)) {
630 mmio_region_write32(entropy_src->
base_addr,
631 ENTROPY_SRC_FW_OV_WR_DATA_REG_OFFSET, buf[i]);
718 if (entropy_src == NULL || debug_state == NULL) {
722 uint32_t debug_state_reg = mmio_region_read32(
723 entropy_src->
base_addr, ENTROPY_SRC_DEBUG_STATUS_REG_OFFSET);
725 debug_state_reg, ENTROPY_SRC_DEBUG_STATUS_ENTROPY_FIFO_DEPTH_FIELD);
727 debug_state_reg, ENTROPY_SRC_DEBUG_STATUS_SHA3_FSM_FIELD);
729 debug_state_reg, ENTROPY_SRC_DEBUG_STATUS_SHA3_BLOCK_PR_BIT);
731 debug_state_reg, ENTROPY_SRC_DEBUG_STATUS_SHA3_SQUEEZING_BIT);
733 debug_state_reg, ENTROPY_SRC_DEBUG_STATUS_SHA3_ABSORBED_BIT);
734 debug_state->
sha3_error = bitfield_bit32_read(
735 debug_state_reg, ENTROPY_SRC_DEBUG_STATUS_SHA3_ERR_BIT);
737 debug_state_reg, ENTROPY_SRC_DEBUG_STATUS_MAIN_SM_IDLE_BIT);
739 debug_state_reg, ENTROPY_SRC_DEBUG_STATUS_MAIN_SM_BOOT_DONE_BIT);
773 if (entropy_src == NULL || errors == NULL) {
777 uint32_t err_code_reg = mmio_region_read32(entropy_src->
base_addr,
778 ENTROPY_SRC_ERR_CODE_REG_OFFSET);
783 if (bitfield_bit32_read(err_code_reg,
784 ENTROPY_SRC_ERR_CODE_SFIFO_ESRNG_ERR_BIT)) {
785 if (bitfield_bit32_read(err_code_reg,
786 ENTROPY_SRC_ERR_CODE_FIFO_WRITE_ERR_BIT)) {
789 if (bitfield_bit32_read(err_code_reg,
790 ENTROPY_SRC_ERR_CODE_FIFO_READ_ERR_BIT)) {
793 if (bitfield_bit32_read(err_code_reg,
794 ENTROPY_SRC_ERR_CODE_FIFO_STATE_ERR_BIT)) {
800 if (bitfield_bit32_read(err_code_reg,
801 ENTROPY_SRC_ERR_CODE_SFIFO_OBSERVE_ERR_BIT)) {
802 if (bitfield_bit32_read(err_code_reg,
803 ENTROPY_SRC_ERR_CODE_FIFO_WRITE_ERR_BIT)) {
806 if (bitfield_bit32_read(err_code_reg,
807 ENTROPY_SRC_ERR_CODE_FIFO_READ_ERR_BIT)) {
810 if (bitfield_bit32_read(err_code_reg,
811 ENTROPY_SRC_ERR_CODE_FIFO_STATE_ERR_BIT)) {
817 if (bitfield_bit32_read(err_code_reg,
818 ENTROPY_SRC_ERR_CODE_SFIFO_ESFINAL_ERR_BIT)) {
819 if (bitfield_bit32_read(err_code_reg,
820 ENTROPY_SRC_ERR_CODE_FIFO_WRITE_ERR_BIT)) {
823 if (bitfield_bit32_read(err_code_reg,
824 ENTROPY_SRC_ERR_CODE_FIFO_READ_ERR_BIT)) {
827 if (bitfield_bit32_read(err_code_reg,
828 ENTROPY_SRC_ERR_CODE_FIFO_STATE_ERR_BIT)) {
834 if (bitfield_bit32_read(err_code_reg,
835 ENTROPY_SRC_ERR_CODE_ES_ACK_SM_ERR_BIT)) {
838 if (bitfield_bit32_read(err_code_reg,
839 ENTROPY_SRC_ERR_CODE_ES_MAIN_SM_ERR_BIT)) {
842 if (bitfield_bit32_read(err_code_reg, ENTROPY_SRC_ERR_CODE_ES_CNTR_ERR_BIT)) {