11 #include "sw/device/lib/dif/dif_csrng_shared.h"
13 #include "csrng_regs.h"
18 static void get_output_status(
const dif_csrng_t *csrng,
21 mmio_region_read32(csrng->
base_addr, CSRNG_GENBITS_VLD_REG_OFFSET);
31 static void spin_until_ready(
const dif_csrng_t *csrng) {
34 get_output_status(csrng, &
status);
35 }
while (!
status.valid_data);
39 if (mmio_region_read32(csrng->
base_addr, CSRNG_REGWEN_REG_OFFSET) == 0) {
57 mmio_region_write32(csrng->
base_addr, CSRNG_CTRL_REG_OFFSET, reg);
64 if (csrng == NULL || seed_material == NULL) {
67 return csrng_send_app_cmd(csrng->
base_addr, kCsrngAppCmdTypeCsrng,
69 .id = kCsrngAppCmdInstantiate,
70 .entropy_src_enable = entropy_src_enable,
71 .seed_material = seed_material,
77 if (csrng == NULL || seed_material == NULL) {
80 return csrng_send_app_cmd(csrng->
base_addr, kCsrngAppCmdTypeCsrng,
82 .id = kCsrngAppCmdReseed,
83 .seed_material = seed_material,
89 if (csrng == NULL || seed_material == NULL) {
92 return csrng_send_app_cmd(csrng->
base_addr, kCsrngAppCmdTypeCsrng,
94 .id = kCsrngAppCmdUpdate,
95 .seed_material = seed_material,
100 if (csrng == NULL || len == 0) {
106 const uint32_t num_128bit_blocks = (len + 3) / 4;
107 return csrng_send_app_cmd(csrng->
base_addr, kCsrngAppCmdTypeCsrng,
109 .id = kCsrngAppCmdGenerate,
110 .generate_len = num_128bit_blocks,
116 if (csrng == NULL || buf == NULL) {
120 for (
size_t i = 0; i < len; ++i) {
122 if (i % kCsrngGenBitsBufferSize == 0) {
123 spin_until_ready(csrng);
125 buf[i] = mmio_region_read32(csrng->
base_addr, CSRNG_GENBITS_REG_OFFSET);
134 return csrng_send_app_cmd(csrng->
base_addr, kCsrngAppCmdTypeCsrng,
136 .id = kCsrngAppCmdUninstantiate,
142 if (csrng == NULL ||
status == NULL) {
148 mmio_region_read32(csrng->
base_addr, CSRNG_SW_CMD_STS_REG_OFFSET);
152 status->cmd_sts = cmd_sts;
176 case kDifCsrngFifoCmd:
177 fifo_bit = CSRNG_ERR_CODE_SFIFO_CMD_ERR_BIT;
179 case kDifCsrngFifoGenBits:
180 fifo_bit = CSRNG_ERR_CODE_SFIFO_GENBITS_ERR_BIT;
182 case kDifCsrngFifoCmdReq:
183 fifo_bit = CSRNG_ERR_CODE_SFIFO_CMDREQ_ERR_BIT;
185 case kDifCsrngFifoRcStage:
186 fifo_bit = CSRNG_ERR_CODE_SFIFO_RCSTAGE_ERR_BIT;
188 case kDifCsrngFifoKeyVrc:
189 fifo_bit = CSRNG_ERR_CODE_SFIFO_KEYVRC_ERR_BIT;
191 case kDifCsrngFifoUpdateReq:
192 fifo_bit = CSRNG_ERR_CODE_SFIFO_UPDREQ_ERR_BIT;
194 case kDifCsrngFifoBencRec:
195 fifo_bit = CSRNG_ERR_CODE_SFIFO_BENCREQ_ERR_BIT;
197 case kDifCsrngFifoBencAck:
198 fifo_bit = CSRNG_ERR_CODE_SFIFO_BENCACK_ERR_BIT;
200 case kDifCsrngFifoPData:
201 fifo_bit = CSRNG_ERR_CODE_SFIFO_PDATA_ERR_BIT;
203 case kDifCsrngFifoFinal:
204 fifo_bit = CSRNG_ERR_CODE_SFIFO_FINAL_ERR_BIT;
206 case kDifCsrngFifoGBencAck:
207 fifo_bit = CSRNG_ERR_CODE_SFIFO_GBENCACK_ERR_BIT;
209 case kDifCsrngFifoGrcStage:
210 fifo_bit = CSRNG_ERR_CODE_SFIFO_GRCSTAGE_ERR_BIT;
212 case kDifCsrngFifoGGenReq:
213 fifo_bit = CSRNG_ERR_CODE_SFIFO_GGENREQ_ERR_BIT;
215 case kDifCsrngFifoGadStage:
216 fifo_bit = CSRNG_ERR_CODE_SFIFO_GADSTAGE_ERR_BIT;
218 case kDifCsrngFifoBlockEnc:
219 fifo_bit = CSRNG_ERR_CODE_SFIFO_BLKENC_ERR_BIT;
226 mmio_region_write32(csrng->
base_addr, CSRNG_ERR_CODE_TEST_REG_OFFSET,
240 error_bit = CSRNG_ERR_CODE_CMD_STAGE_SM_ERR_BIT;
243 error_bit = CSRNG_ERR_CODE_MAIN_SM_ERR_BIT;
246 error_bit = CSRNG_ERR_CODE_DRBG_GEN_SM_ERR_BIT;
249 error_bit = CSRNG_ERR_CODE_DRBG_UPDBE_SM_ERR_BIT;
252 error_bit = CSRNG_ERR_CODE_DRBG_UPDOB_SM_ERR_BIT;
255 error_bit = CSRNG_ERR_CODE_AES_CIPHER_SM_ERR_BIT;
258 error_bit = CSRNG_ERR_CODE_CMD_GEN_CNT_ERR_BIT;
261 error_bit = CSRNG_ERR_CODE_FIFO_WRITE_ERR_BIT;
264 error_bit = CSRNG_ERR_CODE_FIFO_READ_ERR_BIT;
267 error_bit = CSRNG_ERR_CODE_FIFO_STATE_ERR_BIT;
274 mmio_region_write32(csrng->
base_addr, CSRNG_ERR_CODE_TEST_REG_OFFSET,
281 if (csrng == NULL || state == NULL) {
285 *state = mmio_region_read32(csrng->
base_addr, CSRNG_MAIN_SM_STATE_REG_OFFSET);
290 uint32_t *exceptions) {
291 if (csrng == NULL || exceptions == NULL) {
296 mmio_region_read32(csrng->
base_addr, CSRNG_HW_EXC_STS_REG_OFFSET);
305 mmio_region_write32(csrng->
base_addr, CSRNG_HW_EXC_STS_REG_OFFSET, 0);
311 if (csrng == NULL ||
status == NULL) {
314 get_output_status(csrng,
status);
321 if (csrng == NULL || state == NULL) {
328 0, CSRNG_INT_STATE_NUM_INT_STATE_NUM_FIELD, instance_id);
329 mmio_region_write32(csrng->
base_addr, CSRNG_INT_STATE_NUM_REG_OFFSET, reg);
330 uint32_t actual_reg =
331 mmio_region_read32(csrng->
base_addr, CSRNG_INT_STATE_NUM_REG_OFFSET);
332 if (reg != actual_reg) {
338 mmio_region_read32(csrng->
base_addr, CSRNG_INT_STATE_VAL_REG_OFFSET);
340 for (
size_t i = 0; i <
ARRAYSIZE(state->
v); ++i) {
342 mmio_region_read32(csrng->
base_addr, CSRNG_INT_STATE_VAL_REG_OFFSET);
347 mmio_region_read32(csrng->
base_addr, CSRNG_INT_STATE_VAL_REG_OFFSET);
351 mmio_region_read32(csrng->
base_addr, CSRNG_INT_STATE_VAL_REG_OFFSET);
365 mmio_region_write32(csrng->
base_addr, CSRNG_REGWEN_REG_OFFSET, 0);
370 if (csrng == NULL || is_locked == NULL) {
373 *is_locked = check_locked(csrng) !=
kDifOk;
382 mmio_region_write32(csrng->
base_addr, CSRNG_CTRL_REG_OFFSET,
383 CSRNG_CTRL_REG_RESVAL);
389 if (csrng == NULL || alerts == NULL) {
394 mmio_region_read32(csrng->
base_addr, CSRNG_RECOV_ALERT_STS_REG_OFFSET);
403 mmio_region_write32(csrng->
base_addr, CSRNG_RECOV_ALERT_STS_REG_OFFSET, 0);