52 bitfield_field32_write(0, CSRNG_CTRL_ENABLE_FIELD, kMultiBitBool4True);
53 reg = bitfield_field32_write(reg, CSRNG_CTRL_SW_APP_ENABLE_FIELD,
55 reg = bitfield_field32_write(reg, CSRNG_CTRL_READ_INT_STATE_FIELD,
57 reg = bitfield_field32_write(reg, CSRNG_CTRL_FIPS_FORCE_ENABLE_FIELD,
59 mmio_region_write32(csrng->
base_addr, CSRNG_CTRL_REG_OFFSET, reg);
104 if (csrng == NULL || len == 0) {
110 const uint32_t num_128bit_blocks = (len + 3) / 4;
113 .id = kCsrngAppCmdGenerate,
114 .seed_material = additional_data,
115 .generate_len = num_128bit_blocks,
181 case kDifCsrngFifoCmd:
182 fifo_bit = CSRNG_ERR_CODE_SFIFO_CMD_ERR_BIT;
184 case kDifCsrngFifoGenBits:
185 fifo_bit = CSRNG_ERR_CODE_SFIFO_GENBITS_ERR_BIT;
187 case kDifCsrngFifoFinal:
188 fifo_bit = CSRNG_ERR_CODE_SFIFO_FINAL_ERR_BIT;
190 case kDifCsrngFifoGBencAck:
191 fifo_bit = CSRNG_ERR_CODE_SFIFO_GBENCACK_ERR_BIT;
193 case kDifCsrngFifoGrcStage:
194 fifo_bit = CSRNG_ERR_CODE_SFIFO_GRCSTAGE_ERR_BIT;
196 case kDifCsrngFifoGGenReq:
197 fifo_bit = CSRNG_ERR_CODE_SFIFO_GGENREQ_ERR_BIT;
199 case kDifCsrngFifoGadStage:
200 fifo_bit = CSRNG_ERR_CODE_SFIFO_GADSTAGE_ERR_BIT;
202 case kDifCsrngFifoCmdId:
203 fifo_bit = CSRNG_ERR_CODE_SFIFO_CMDID_ERR_BIT;
210 mmio_region_write32(csrng->
base_addr, CSRNG_ERR_CODE_TEST_REG_OFFSET,
224 error_bit = CSRNG_ERR_CODE_CMD_STAGE_SM_ERR_BIT;
227 error_bit = CSRNG_ERR_CODE_MAIN_SM_ERR_BIT;
230 error_bit = CSRNG_ERR_CODE_DRBG_CMD_SM_ERR_BIT;
233 error_bit = CSRNG_ERR_CODE_DRBG_GEN_SM_ERR_BIT;
236 error_bit = CSRNG_ERR_CODE_DRBG_UPDBE_SM_ERR_BIT;
239 error_bit = CSRNG_ERR_CODE_DRBG_UPDOB_SM_ERR_BIT;
242 error_bit = CSRNG_ERR_CODE_AES_CIPHER_SM_ERR_BIT;
245 error_bit = CSRNG_ERR_CODE_CMD_GEN_CNT_ERR_BIT;
248 error_bit = CSRNG_ERR_CODE_FIFO_WRITE_ERR_BIT;
251 error_bit = CSRNG_ERR_CODE_FIFO_READ_ERR_BIT;
254 error_bit = CSRNG_ERR_CODE_FIFO_STATE_ERR_BIT;
261 mmio_region_write32(csrng->
base_addr, CSRNG_ERR_CODE_TEST_REG_OFFSET,
308 if (csrng == NULL || state == NULL) {
314 uint32_t reg = bitfield_field32_write(
315 0, CSRNG_INT_STATE_NUM_INT_STATE_NUM_FIELD, instance_id);
316 mmio_region_write32(csrng->
base_addr, CSRNG_INT_STATE_NUM_REG_OFFSET, reg);
317 uint32_t actual_reg =
318 mmio_region_read32(csrng->
base_addr, CSRNG_INT_STATE_NUM_REG_OFFSET);
319 if (reg != actual_reg) {
325 mmio_region_read32(csrng->
base_addr, CSRNG_INT_STATE_VAL_REG_OFFSET);
327 for (
size_t i = 0; i <
ARRAYSIZE(state->
v); ++i) {
329 mmio_region_read32(csrng->
base_addr, CSRNG_INT_STATE_VAL_REG_OFFSET);
334 mmio_region_read32(csrng->
base_addr, CSRNG_INT_STATE_VAL_REG_OFFSET);
338 mmio_region_read32(csrng->
base_addr, CSRNG_INT_STATE_VAL_REG_OFFSET);
350 uint32_t *reseed_counter) {
351 if (csrng == NULL || reseed_counter == NULL) {
356 switch (instance_id) {
358 reg_offset = CSRNG_RESEED_COUNTER_0_REG_OFFSET;
361 reg_offset = CSRNG_RESEED_COUNTER_1_REG_OFFSET;
364 reg_offset = CSRNG_RESEED_COUNTER_2_REG_OFFSET;
371 *reseed_counter = mmio_region_read32(csrng->
base_addr, (ptrdiff_t)reg_offset);