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 entropy_ctrl_reg = bitfield_field32_write(
74 ENTROPY_SRC_ENTROPY_CONTROL_ESFINAL_FIFO_CLEAR_WHILE_DISABLED_FIELD,
76 : kMultiBitBool4False);
77 mmio_region_write32(entropy_src->
base_addr,
78 ENTROPY_SRC_ENTROPY_CONTROL_REG_OFFSET, entropy_ctrl_reg);
84 uint32_t entropy_conf_reg = bitfield_field32_write(
85 0, ENTROPY_SRC_CONF_FIPS_ENABLE_FIELD,
86 config.
fips_enable ? kMultiBitBool4True : kMultiBitBool4False);
89 entropy_conf_reg = bitfield_field32_write(
90 entropy_conf_reg, ENTROPY_SRC_CONF_FIPS_FLAG_FIELD,
91 config.
fips_flag ? kMultiBitBool4True : kMultiBitBool4False);
94 entropy_conf_reg = bitfield_field32_write(
95 entropy_conf_reg, ENTROPY_SRC_CONF_RNG_FIPS_FIELD,
96 config.
rng_fips ? kMultiBitBool4True : kMultiBitBool4False);
99 entropy_conf_reg = bitfield_field32_write(
100 entropy_conf_reg, ENTROPY_SRC_CONF_ENTROPY_DATA_REG_ENABLE_FIELD,
104 entropy_conf_reg = bitfield_field32_write(
105 entropy_conf_reg, ENTROPY_SRC_CONF_THRESHOLD_SCOPE_FIELD,
107 : kMultiBitBool4False);
110 uint32_t rng_bit_en =
112 ? kMultiBitBool4False
113 : kMultiBitBool4True;
114 entropy_conf_reg = bitfield_field32_write(
115 entropy_conf_reg, ENTROPY_SRC_CONF_RNG_BIT_ENABLE_FIELD, rng_bit_en);
116 uint32_t rng_bit_sel =
118 entropy_conf_reg = bitfield_field32_write(
119 entropy_conf_reg, ENTROPY_SRC_CONF_RNG_BIT_SEL_FIELD, rng_bit_sel);
123 entropy_conf_reg = bitfield_field32_write(
124 entropy_conf_reg, ENTROPY_SRC_CONF_ENTROPY_DATA_REG_ENABLE_FIELD,
127 mmio_region_write32(entropy_src->
base_addr, ENTROPY_SRC_CONF_REG_OFFSET,
134 uint32_t health_test_window_sizes =
135 bitfield_field32_write(ENTROPY_SRC_HEALTH_TEST_WINDOWS_REG_RESVAL,
136 ENTROPY_SRC_HEALTH_TEST_WINDOWS_FIPS_WINDOW_FIELD,
138 mmio_region_write32(entropy_src->
base_addr,
139 ENTROPY_SRC_HEALTH_TEST_WINDOWS_REG_OFFSET,
140 health_test_window_sizes);
143 uint32_t alert_threshold = bitfield_field32_write(
144 0, ENTROPY_SRC_ALERT_THRESHOLD_ALERT_THRESHOLD_FIELD,
146 alert_threshold = bitfield_field32_write(
147 alert_threshold, ENTROPY_SRC_ALERT_THRESHOLD_ALERT_THRESHOLD_INV_FIELD,
149 mmio_region_write32(entropy_src->
base_addr,
150 ENTROPY_SRC_ALERT_THRESHOLD_REG_OFFSET, alert_threshold);
153 mmio_region_write32(entropy_src->
base_addr,
154 ENTROPY_SRC_MODULE_ENABLE_REG_OFFSET,
155 dif_toggle_to_multi_bit_bool4(enabled));
163 if (entropy_src == NULL ||
165 ENTROPY_SRC_OBSERVE_FIFO_THRESH_OBSERVE_FIFO_THRESH_MASK ||
170 if (!mmio_region_read32(entropy_src->
base_addr,
171 ENTROPY_SRC_REGWEN_REG_OFFSET)) {
175 mmio_region_write32(entropy_src->
base_addr,
176 ENTROPY_SRC_OBSERVE_FIFO_THRESH_REG_OFFSET,
180 bitfield_field32_write(0, ENTROPY_SRC_FW_OV_CONTROL_FW_OV_MODE_FIELD,
181 dif_toggle_to_multi_bit_bool4(enabled));
182 reg = bitfield_field32_write(
183 reg, ENTROPY_SRC_FW_OV_CONTROL_FW_OV_ENTROPY_INSERT_FIELD,
185 mmio_region_write32(entropy_src->
base_addr,
186 ENTROPY_SRC_FW_OV_CONTROL_REG_OFFSET, reg);
209 if (entropy_src == NULL) {
213 if (!mmio_region_read32(entropy_src->
base_addr,
214 ENTROPY_SRC_REGWEN_REG_OFFSET)) {
218 ptrdiff_t high_threshold_reg_offset = -1;
219 ptrdiff_t low_threshold_reg_offset = -1;
222 high_threshold_reg_offset = ENTROPY_SRC_REPCNT_THRESHOLD_REG_OFFSET;
229 high_threshold_reg_offset = ENTROPY_SRC_REPCNTS_THRESHOLD_REG_OFFSET;
236 high_threshold_reg_offset = ENTROPY_SRC_ADAPTP_HI_THRESHOLD_REG_OFFSET;
237 low_threshold_reg_offset = ENTROPY_SRC_ADAPTP_LO_THRESHOLD_REG_OFFSET;
240 high_threshold_reg_offset = ENTROPY_SRC_ADAPTPS_THRESHOLD_REG_OFFSET;
247 high_threshold_reg_offset = ENTROPY_SRC_BUCKET_THRESHOLD_REG_OFFSET;
254 high_threshold_reg_offset = ENTROPY_SRC_MARKOV_HI_THRESHOLD_REG_OFFSET;
255 low_threshold_reg_offset = ENTROPY_SRC_MARKOV_LO_THRESHOLD_REG_OFFSET;
258 high_threshold_reg_offset = ENTROPY_SRC_EXTHT_HI_THRESHOLD_REG_OFFSET;
259 low_threshold_reg_offset = ENTROPY_SRC_EXTHT_LO_THRESHOLD_REG_OFFSET;
265 mmio_region_write32(entropy_src->
base_addr, high_threshold_reg_offset,
267 if (low_threshold_reg_offset != -1) {
268 mmio_region_write32(entropy_src->
base_addr, low_threshold_reg_offset,
355 if (entropy_src == NULL || stats == NULL) {
360 entropy_src->
base_addr, ENTROPY_SRC_HT_WATERMARK_NUM_REG_OFFSET);
361 stats->
watermark = (uint16_t)mmio_region_read32(
362 entropy_src->
base_addr, ENTROPY_SRC_HT_WATERMARK_REG_OFFSET);
364 ptrdiff_t high_fails_reg_offset = -1;
365 ptrdiff_t low_fails_reg_offset = -1;
366 for (uint32_t i = 0; i < kDifEntropySrcTestNumVariants; ++i) {
369 high_fails_reg_offset = ENTROPY_SRC_REPCNT_TOTAL_FAILS_REG_OFFSET;
370 low_fails_reg_offset = -1;
373 high_fails_reg_offset = ENTROPY_SRC_REPCNTS_TOTAL_FAILS_REG_OFFSET;
374 low_fails_reg_offset = -1;
377 high_fails_reg_offset = ENTROPY_SRC_ADAPTP_HI_TOTAL_FAILS_REG_OFFSET;
378 low_fails_reg_offset = ENTROPY_SRC_ADAPTP_LO_TOTAL_FAILS_REG_OFFSET;
381 high_fails_reg_offset = ENTROPY_SRC_ADAPTPS_TOTAL_FAILS_REG_OFFSET;
382 low_fails_reg_offset = -1;
385 high_fails_reg_offset = ENTROPY_SRC_BUCKET_TOTAL_FAILS_REG_OFFSET;
386 low_fails_reg_offset = -1;
389 high_fails_reg_offset = ENTROPY_SRC_MARKOV_HI_TOTAL_FAILS_REG_OFFSET;
390 low_fails_reg_offset = ENTROPY_SRC_MARKOV_LO_TOTAL_FAILS_REG_OFFSET;
393 high_fails_reg_offset = ENTROPY_SRC_EXTHT_HI_TOTAL_FAILS_REG_OFFSET;
394 low_fails_reg_offset = ENTROPY_SRC_EXTHT_LO_TOTAL_FAILS_REG_OFFSET;
401 mmio_region_read32(entropy_src->
base_addr, high_fails_reg_offset);
403 low_fails_reg_offset == -1
405 : mmio_region_read32(entropy_src->
base_addr, low_fails_reg_offset);
414 if (entropy_src == NULL || counts == NULL) {
418 counts->
total_fails = (uint16_t)mmio_region_read32(
419 entropy_src->
base_addr, ENTROPY_SRC_ALERT_SUMMARY_FAIL_COUNTS_REG_OFFSET);
421 uint32_t alert_fail_counts = mmio_region_read32(
422 entropy_src->
base_addr, ENTROPY_SRC_ALERT_FAIL_COUNTS_REG_OFFSET);
423 uint32_t extht_alert_fail_counts = mmio_region_read32(
424 entropy_src->
base_addr, ENTROPY_SRC_EXTHT_FAIL_COUNTS_REG_OFFSET);
428 (uint8_t)bitfield_field32_read(
430 ENTROPY_SRC_ALERT_FAIL_COUNTS_REPCNT_FAIL_COUNT_FIELD);
432 (uint8_t)bitfield_field32_read(
434 ENTROPY_SRC_ALERT_FAIL_COUNTS_REPCNTS_FAIL_COUNT_FIELD);
436 (uint8_t)bitfield_field32_read(
438 ENTROPY_SRC_ALERT_FAIL_COUNTS_ADAPTP_HI_FAIL_COUNT_FIELD);
440 (uint8_t)bitfield_field32_read(
442 ENTROPY_SRC_ALERT_FAIL_COUNTS_ADAPTPS_FAIL_COUNT_FIELD);
444 alert_fail_counts, ENTROPY_SRC_ALERT_FAIL_COUNTS_BUCKET_FAIL_COUNT_FIELD);
447 ENTROPY_SRC_ALERT_FAIL_COUNTS_MARKOV_HI_FAIL_COUNT_FIELD);
449 (uint8_t)bitfield_field32_read(
450 extht_alert_fail_counts,
451 ENTROPY_SRC_EXTHT_FAIL_COUNTS_EXTHT_HI_FAIL_COUNT_FIELD);
457 (uint8_t)bitfield_field32_read(
459 ENTROPY_SRC_ALERT_FAIL_COUNTS_ADAPTP_LO_FAIL_COUNT_FIELD);
464 ENTROPY_SRC_ALERT_FAIL_COUNTS_MARKOV_LO_FAIL_COUNT_FIELD);
466 extht_alert_fail_counts,
467 ENTROPY_SRC_EXTHT_FAIL_COUNTS_EXTHT_LO_FAIL_COUNT_FIELD);
512 if (entropy_src == NULL) {
518 uint32_t reg = mmio_region_read32(entropy_src->
base_addr,
519 ENTROPY_SRC_OBSERVE_FIFO_THRESH_REG_OFFSET);
526 reg = mmio_region_read32(entropy_src->
base_addr,
527 ENTROPY_SRC_FW_OV_CONTROL_REG_OFFSET);
528 if (bitfield_field32_read(reg, ENTROPY_SRC_FW_OV_CONTROL_FW_OV_MODE_FIELD) !=
529 kMultiBitBool4True) {
535 reg = mmio_region_read32(entropy_src->
base_addr,
536 ENTROPY_SRC_INTR_STATE_REG_OFFSET);
537 }
while (!bitfield_bit32_read(
538 reg, ENTROPY_SRC_INTR_STATE_ES_OBSERVE_FIFO_READY_BIT));
541 for (
size_t i = 0; i < len; ++i) {
542 reg = mmio_region_read32(entropy_src->
base_addr,
543 ENTROPY_SRC_FW_OV_RD_DATA_REG_OFFSET);
550 reg = bitfield_bit32_write(
551 0, ENTROPY_SRC_INTR_STATE_ES_OBSERVE_FIFO_READY_BIT,
true);
552 mmio_region_write32(entropy_src->
base_addr, ENTROPY_SRC_INTR_STATE_REG_OFFSET,
560 if (entropy_src == NULL || len == NULL) {
566 uint32_t reg = mmio_region_read32(entropy_src->
base_addr,
567 ENTROPY_SRC_FW_OV_CONTROL_REG_OFFSET);
568 if (bitfield_field32_read(reg, ENTROPY_SRC_FW_OV_CONTROL_FW_OV_MODE_FIELD) !=
569 kMultiBitBool4True) {
574 size_t read_count = 0;
575 while (read_count < *len &&
576 mmio_region_read32(entropy_src->
base_addr,
577 ENTROPY_SRC_OBSERVE_FIFO_DEPTH_REG_OFFSET) > 0) {
578 uint32_t reg = mmio_region_read32(entropy_src->
base_addr,
579 ENTROPY_SRC_FW_OV_RD_DATA_REG_OFFSET);
581 buf[read_count++] = reg;
593 if (entropy_src == NULL || buf == NULL) {
599 uint32_t reg = mmio_region_read32(entropy_src->
base_addr,
600 ENTROPY_SRC_FW_OV_CONTROL_REG_OFFSET);
601 if (bitfield_field32_read(reg, ENTROPY_SRC_FW_OV_CONTROL_FW_OV_MODE_FIELD) !=
602 kMultiBitBool4True ||
603 bitfield_field32_read(
604 reg, ENTROPY_SRC_FW_OV_CONTROL_FW_OV_ENTROPY_INSERT_FIELD) !=
605 kMultiBitBool4True) {
610 for (
size_t i = 0; i < len; ++i) {
611 if (mmio_region_read32(entropy_src->
base_addr,
612 ENTROPY_SRC_FW_OV_WR_FIFO_FULL_REG_OFFSET)) {
619 mmio_region_write32(entropy_src->
base_addr,
620 ENTROPY_SRC_FW_OV_WR_DATA_REG_OFFSET, buf[i]);
707 if (entropy_src == NULL || debug_state == NULL) {
711 uint32_t debug_state_reg = mmio_region_read32(
712 entropy_src->
base_addr, ENTROPY_SRC_DEBUG_STATUS_REG_OFFSET);
714 debug_state_reg, ENTROPY_SRC_DEBUG_STATUS_ENTROPY_FIFO_DEPTH_FIELD);
716 debug_state_reg, ENTROPY_SRC_DEBUG_STATUS_SHA3_FSM_FIELD);
718 debug_state_reg, ENTROPY_SRC_DEBUG_STATUS_SHA3_BLOCK_PR_BIT);
720 debug_state_reg, ENTROPY_SRC_DEBUG_STATUS_SHA3_SQUEEZING_BIT);
722 debug_state_reg, ENTROPY_SRC_DEBUG_STATUS_SHA3_ABSORBED_BIT);
723 debug_state->
sha3_error = bitfield_bit32_read(
724 debug_state_reg, ENTROPY_SRC_DEBUG_STATUS_SHA3_ERR_BIT);
726 debug_state_reg, ENTROPY_SRC_DEBUG_STATUS_MAIN_SM_IDLE_BIT);
728 debug_state_reg, ENTROPY_SRC_DEBUG_STATUS_MAIN_SM_BOOT_DONE_BIT);
762 if (entropy_src == NULL || errors == NULL) {
766 uint32_t err_code_reg = mmio_region_read32(entropy_src->
base_addr,
767 ENTROPY_SRC_ERR_CODE_REG_OFFSET);
772 if (bitfield_bit32_read(err_code_reg,
773 ENTROPY_SRC_ERR_CODE_SFIFO_ESRNG_ERR_BIT)) {
774 if (bitfield_bit32_read(err_code_reg,
775 ENTROPY_SRC_ERR_CODE_FIFO_WRITE_ERR_BIT)) {
778 if (bitfield_bit32_read(err_code_reg,
779 ENTROPY_SRC_ERR_CODE_FIFO_READ_ERR_BIT)) {
782 if (bitfield_bit32_read(err_code_reg,
783 ENTROPY_SRC_ERR_CODE_FIFO_STATE_ERR_BIT)) {
789 if (bitfield_bit32_read(err_code_reg,
790 ENTROPY_SRC_ERR_CODE_SFIFO_OBSERVE_ERR_BIT)) {
791 if (bitfield_bit32_read(err_code_reg,
792 ENTROPY_SRC_ERR_CODE_FIFO_WRITE_ERR_BIT)) {
795 if (bitfield_bit32_read(err_code_reg,
796 ENTROPY_SRC_ERR_CODE_FIFO_READ_ERR_BIT)) {
799 if (bitfield_bit32_read(err_code_reg,
800 ENTROPY_SRC_ERR_CODE_FIFO_STATE_ERR_BIT)) {
806 if (bitfield_bit32_read(err_code_reg,
807 ENTROPY_SRC_ERR_CODE_SFIFO_ESFINAL_ERR_BIT)) {
808 if (bitfield_bit32_read(err_code_reg,
809 ENTROPY_SRC_ERR_CODE_FIFO_WRITE_ERR_BIT)) {
812 if (bitfield_bit32_read(err_code_reg,
813 ENTROPY_SRC_ERR_CODE_FIFO_READ_ERR_BIT)) {
816 if (bitfield_bit32_read(err_code_reg,
817 ENTROPY_SRC_ERR_CODE_FIFO_STATE_ERR_BIT)) {
823 if (bitfield_bit32_read(err_code_reg,
824 ENTROPY_SRC_ERR_CODE_ES_ACK_SM_ERR_BIT)) {
827 if (bitfield_bit32_read(err_code_reg,
828 ENTROPY_SRC_ERR_CODE_ES_MAIN_SM_ERR_BIT)) {
831 if (bitfield_bit32_read(err_code_reg, ENTROPY_SRC_ERR_CODE_ES_CNTR_ERR_BIT)) {