90dif_rram_ctrl_device_info_t dif_rram_ctrl_get_device_info(
void) {
91 const dif_rram_ctrl_device_info_t info = {
92 .bytes_per_word = kBytesPerWord,
93 .bytes_per_page = kBytesPerPage,
94 .data_pages = kNumDataPages,
95 .info_pages = kNumInfoPages,
102 multi_bit_bool_t disable_rram;
103 if (handle == NULL) {
108 disable_rram = kMultiBitBool4False;
111 disable_rram = kMultiBitBool4True;
117 reg = mmio_region_read32(handle->
dev.
base_addr, RRAM_CTRL_DIS_REG_OFFSET);
118 reg = bitfield_field32_write(reg, RRAM_CTRL_DIS_SW_DIS_FIELD, disable_rram);
119 mmio_region_write32(handle->
dev.
base_addr, RRAM_CTRL_DIS_REG_OFFSET, reg);
125 if (handle == NULL || enabled_out == NULL) {
129 mmio_region_read32(handle->
dev.
base_addr, RRAM_CTRL_DIS_REG_OFFSET);
130 multi_bit_bool_t rram_disabled =
131 bitfield_field32_read(reg, RRAM_CTRL_DIS_SW_DIS_FIELD);
132 if (rram_disabled == kMultiBitBool4False) {
177 if (handle == NULL) {
181 mmio_region_read32(handle->
dev.
base_addr, RRAM_CTRL_INIT_REG_OFFSET);
182 if (bitfield_bit32_read(reg, RRAM_CTRL_INIT_VAL_BIT)) {
186 uint32_t value = bitfield_bit32_write(0, RRAM_CTRL_INIT_VAL_BIT,
true);
187 mmio_region_write32(handle->
dev.
base_addr, RRAM_CTRL_INIT_REG_OFFSET, value);
193 if (handle == NULL || status_out == NULL) {
197 mmio_region_read32(handle->
dev.
base_addr, RRAM_CTRL_STATUS_REG_OFFSET);
199 .read_fifo_full = bitfield_bit32_read(reg, RRAM_CTRL_STATUS_RD_FULL_BIT),
201 bitfield_bit32_read(reg, RRAM_CTRL_STATUS_RD_EMPTY_BIT),
202 .write_fifo_full = bitfield_bit32_read(reg, RRAM_CTRL_STATUS_WR_FULL_BIT),
204 bitfield_bit32_read(reg, RRAM_CTRL_STATUS_WR_EMPTY_BIT),
205 .controller_init_done =
206 bitfield_bit32_read(reg, RRAM_CTRL_STATUS_INIT_DONE_BIT),
207 .controller_keys_valid =
208 bitfield_bit32_read(reg, RRAM_CTRL_STATUS_KEYS_VALID_BIT),
216 if (handle == NULL) {
219 uint32_t ctrl_regwen = mmio_region_read32(handle->
dev.
base_addr,
220 RRAM_CTRL_CTRL_REGWEN_REG_OFFSET);
221 if (!bitfield_bit32_read(ctrl_regwen, RRAM_CTRL_CTRL_REGWEN_EN_BIT)) {
228 uint32_t control_reg = bitfield_field32_write(0, RRAM_CTRL_CONTROL_NUM_FIELD,
230 switch (transaction.op) {
233 bitfield_field32_write(control_reg, RRAM_CTRL_CONTROL_OP_FIELD,
234 RRAM_CTRL_CONTROL_OP_VALUE_READ);
238 bitfield_field32_write(control_reg, RRAM_CTRL_CONTROL_OP_FIELD,
239 RRAM_CTRL_CONTROL_OP_VALUE_WRITE);
243 bitfield_field32_write(control_reg, RRAM_CTRL_CONTROL_OP_FIELD,
244 RRAM_CTRL_CONTROL_OP_VALUE_REWRITE);
251 case kDifRramCtrlPartitionTypeData:
252 control_reg = bitfield_bit32_write(
253 control_reg, RRAM_CTRL_CONTROL_PARTITION_BIT,
false);
255 case kDifRramCtrlPartitionTypeInfo:
256 control_reg = bitfield_bit32_write(control_reg,
257 RRAM_CTRL_CONTROL_PARTITION_BIT,
true);
263 mmio_region_write32(handle->
dev.
base_addr, RRAM_CTRL_CONTROL_REG_OFFSET,
265 mmio_region_write32(handle->
dev.
base_addr, RRAM_CTRL_ADDR_REG_OFFSET,
267 mmio_region_write32(handle->
dev.
base_addr, RRAM_CTRL_CONTROL_REG_OFFSET,
268 control_reg | (1u << RRAM_CTRL_CONTROL_START_BIT));
337 const uint32_t *data) {
338 if (handle == NULL || data == NULL) {
347 const uint32_t control_reg =
348 mmio_region_read32(handle->
dev.
base_addr, RRAM_CTRL_CONTROL_REG_OFFSET);
350 bitfield_field32_read(control_reg, RRAM_CTRL_CONTROL_OP_FIELD);
351 if (op != RRAM_CTRL_CONTROL_OP_VALUE_WRITE) {
354 return dif_rram_ctrl_wr_fifo_push_unsafe(handle, word_count, data);
373 uint32_t word_count, uint32_t *data) {
374 if (handle == NULL || data == NULL) {
383 const uint32_t control_reg =
384 mmio_region_read32(handle->
dev.
base_addr, RRAM_CTRL_CONTROL_REG_OFFSET);
386 bitfield_field32_read(control_reg, RRAM_CTRL_CONTROL_OP_FIELD);
387 if (op != RRAM_CTRL_CONTROL_OP_VALUE_READ) {
390 return dif_rram_ctrl_read_fifo_pop_unsafe(handle, word_count, data);
396 if (handle == NULL || error_code_out == NULL) {
399 const uint32_t code_reg =
400 mmio_region_read32(handle->
dev.
base_addr, RRAM_CTRL_ERR_CODE_REG_OFFSET);
401 dif_rram_ctrl_error_codes_t codes = {
403 bitfield_bit32_read(code_reg, RRAM_CTRL_ERR_CODE_OP_ERR_BIT),
404 .memory_protection_error =
405 bitfield_bit32_read(code_reg, RRAM_CTRL_ERR_CODE_MP_ERR_BIT),
407 bitfield_bit32_read(code_reg, RRAM_CTRL_ERR_CODE_RD_ERR_BIT),
409 bitfield_bit32_read(code_reg, RRAM_CTRL_ERR_CODE_WR_ERR_BIT),
412 const uint32_t address_reg =
413 mmio_region_read32(handle->
dev.
base_addr, RRAM_CTRL_ERR_ADDR_REG_OFFSET);
415 .address = address_reg,
418 *error_code_out = error_code;
424 if (handle == NULL) {
427 uint32_t code_reg = 0;
428 code_reg = bitfield_bit32_write(code_reg, RRAM_CTRL_ERR_CODE_OP_ERR_BIT,
430 code_reg = bitfield_bit32_write(code_reg, RRAM_CTRL_ERR_CODE_MP_ERR_BIT,
432 code_reg = bitfield_bit32_write(code_reg, RRAM_CTRL_ERR_CODE_RD_ERR_BIT,
434 code_reg = bitfield_bit32_write(code_reg, RRAM_CTRL_ERR_CODE_WR_ERR_BIT,
436 mmio_region_write32(handle->
dev.
base_addr, RRAM_CTRL_ERR_CODE_REG_OFFSET,
442 dif_rram_ctrl_output_t *out) {
443 if (handle == NULL || out == NULL) {
449 uint32_t status_reg =
450 mmio_region_read32(handle->
dev.
base_addr, RRAM_CTRL_OP_STATUS_REG_OFFSET);
451 if (!bitfield_bit32_read(status_reg, RRAM_CTRL_OP_STATUS_DONE_BIT)) {
459 dif_rram_ctrl_output_t output = {
461 bitfield_bit32_read(status_reg, RRAM_CTRL_OP_STATUS_DONE_BIT),
463 bitfield_bit32_read(status_reg, RRAM_CTRL_OP_STATUS_ERR_BIT),
464 .error_code = error_code_tmp};
466 mmio_region_write32(handle->
dev.
base_addr, RRAM_CTRL_OP_STATUS_REG_OFFSET, 0);
474 if (handle == NULL || region >= kNumRegions) {
480 dif_rram_ctrl_data_region_is_locked(handle, region, &locked));
485 ptrdiff_t mp_reg_offset = get_data_region_mp_reg_offset(region);
486 uint32_t mp_reg = mmio_region_read32(handle->
dev.
base_addr, mp_reg_offset);
489 mp_reg = bitfield_field32_write(
490 mp_reg, RRAM_CTRL_MP_REGION_CFG_0_EN_0_FIELD, kMultiBitBool4True);
493 mp_reg = bitfield_field32_write(
494 mp_reg, RRAM_CTRL_MP_REGION_CFG_0_EN_0_FIELD, kMultiBitBool4False);
499 mmio_region_write32(handle->
dev.
base_addr, mp_reg_offset, mp_reg);
506 if (handle == NULL || enabled_out == NULL || region >= kNumRegions) {
509 ptrdiff_t mp_reg_offset = get_data_region_mp_reg_offset(region);
510 uint32_t mp_reg = mmio_region_read32(handle->
dev.
base_addr, mp_reg_offset);
511 if (bitfield_field32_read(mp_reg, RRAM_CTRL_MP_REGION_CFG_0_EN_0_FIELD) ==
512 kMultiBitBool4True) {
523 if (handle == NULL || region.
page >= kNumInfoPages) {
528 dif_rram_ctrl_info_region_is_locked(handle, region, &locked));
533 ptrdiff_t mp_reg_offset = get_info_region_mp_reg_offset(region);
534 uint32_t mp_reg = mmio_region_read32(handle->
dev.
base_addr, mp_reg_offset);
537 mp_reg = bitfield_field32_write(
538 mp_reg, RRAM_CTRL_INFO_PAGE_CFG_0_EN_0_FIELD, kMultiBitBool4True);
541 mp_reg = bitfield_field32_write(
542 mp_reg, RRAM_CTRL_INFO_PAGE_CFG_0_EN_0_FIELD, kMultiBitBool4False);
547 mmio_region_write32(handle->
dev.
base_addr, mp_reg_offset, mp_reg);
571 if (handle == NULL) {
575 reg = bitfield_field32_write(reg, RRAM_CTRL_DEFAULT_REGION_RD_EN_FIELD,
577 reg = bitfield_field32_write(reg, RRAM_CTRL_DEFAULT_REGION_WR_EN_FIELD,
579 reg = bitfield_field32_write(reg, RRAM_CTRL_DEFAULT_REGION_SCRAMBLE_EN_FIELD,
581 reg = bitfield_field32_write(reg, RRAM_CTRL_DEFAULT_REGION_ECC_EN_FIELD,
584 RRAM_CTRL_DEFAULT_REGION_REG_OFFSET, reg);
591 if (handle == NULL || properties_out == NULL) {
594 const uint32_t reg = mmio_region_read32(handle->
dev.
base_addr,
595 RRAM_CTRL_DEFAULT_REGION_REG_OFFSET);
597 .rd_en = bitfield_field32_read(reg, RRAM_CTRL_DEFAULT_REGION_RD_EN_FIELD),
598 .wr_en = bitfield_field32_read(reg, RRAM_CTRL_DEFAULT_REGION_WR_EN_FIELD),
599 .scramble_en = bitfield_field32_read(
600 reg, RRAM_CTRL_DEFAULT_REGION_SCRAMBLE_EN_FIELD),
602 bitfield_field32_read(reg, RRAM_CTRL_DEFAULT_REGION_ECC_EN_FIELD),
604 *properties_out = properties;
611 const uint32_t page_limit = kNumUsableDataPages;
612 if (handle == NULL || region >= kNumRegions ||
613 config.
base + config.
size > page_limit) {
619 dif_rram_ctrl_data_region_is_locked(handle, region, &locked));
624 ptrdiff_t mp_reg_offset = get_data_region_mp_reg_offset(region);
625 uint32_t reg = mmio_region_read32(handle->
dev.
base_addr, mp_reg_offset);
626 reg = bitfield_field32_write(reg, RRAM_CTRL_MP_REGION_CFG_0_RD_EN_0_FIELD,
628 reg = bitfield_field32_write(reg, RRAM_CTRL_MP_REGION_CFG_0_WR_EN_0_FIELD,
631 bitfield_field32_write(reg, RRAM_CTRL_MP_REGION_CFG_0_SCRAMBLE_EN_0_FIELD,
633 reg = bitfield_field32_write(reg, RRAM_CTRL_MP_REGION_CFG_0_ECC_EN_0_FIELD,
636 mmio_region_write32(handle->
dev.
base_addr, mp_reg_offset, reg);
639 mp_reg_offset = get_data_region_reg_offset(region);
641 reg = bitfield_field32_write(0, RRAM_CTRL_MP_REGION_0_BASE_0_FIELD,
643 reg = bitfield_field32_write(reg, RRAM_CTRL_MP_REGION_0_SIZE_0_FIELD,
645 mmio_region_write32(handle->
dev.
base_addr, mp_reg_offset, reg);
652 if (handle == NULL || config_out == NULL || region >= kNumRegions) {
656 ptrdiff_t mp_reg_offset = get_data_region_mp_reg_offset(region);
657 uint32_t reg = mmio_region_read32(handle->
dev.
base_addr, mp_reg_offset);
660 bitfield_field32_read(reg, RRAM_CTRL_MP_REGION_CFG_0_RD_EN_0_FIELD);
662 bitfield_field32_read(reg, RRAM_CTRL_MP_REGION_CFG_0_WR_EN_0_FIELD);
664 bitfield_field32_read(reg, RRAM_CTRL_MP_REGION_CFG_0_SCRAMBLE_EN_0_FIELD);
666 bitfield_field32_read(reg, RRAM_CTRL_MP_REGION_CFG_0_ECC_EN_0_FIELD);
668 mp_reg_offset = get_data_region_reg_offset(region);
669 reg = mmio_region_read32(handle->
dev.
base_addr, mp_reg_offset);
670 config.
base = bitfield_field32_read(reg, RRAM_CTRL_MP_REGION_0_BASE_0_FIELD);
671 config.
size = bitfield_field32_read(reg, RRAM_CTRL_MP_REGION_0_SIZE_0_FIELD);
672 *config_out = config;
679 if (handle == NULL || region.
page >= kNumInfoPages) {
685 dif_rram_ctrl_info_region_is_locked(handle, region, &locked));
690 ptrdiff_t mp_reg_offset = get_info_region_mp_reg_offset(region);
691 uint32_t reg = mmio_region_read32(handle->
dev.
base_addr, mp_reg_offset);
692 reg = bitfield_field32_write(reg, RRAM_CTRL_INFO_PAGE_CFG_0_RD_EN_0_FIELD,
694 reg = bitfield_field32_write(reg, RRAM_CTRL_INFO_PAGE_CFG_0_WR_EN_0_FIELD,
697 bitfield_field32_write(reg, RRAM_CTRL_INFO_PAGE_CFG_0_SCRAMBLE_EN_0_FIELD,
699 reg = bitfield_field32_write(reg, RRAM_CTRL_INFO_PAGE_CFG_0_ECC_EN_0_FIELD,
701 mmio_region_write32(handle->
dev.
base_addr, mp_reg_offset, reg);
708 if (handle == NULL || properties_out == NULL ||
709 region.
page >= kNumInfoPages) {
713 ptrdiff_t mp_reg_offset = get_info_region_mp_reg_offset(region);
714 const uint32_t reg = mmio_region_read32(handle->
dev.
base_addr, mp_reg_offset);
717 bitfield_field32_read(reg, RRAM_CTRL_INFO_PAGE_CFG_0_RD_EN_0_FIELD);
719 bitfield_field32_read(reg, RRAM_CTRL_INFO_PAGE_CFG_0_WR_EN_0_FIELD);
721 bitfield_field32_read(reg, RRAM_CTRL_INFO_PAGE_CFG_0_SCRAMBLE_EN_0_FIELD);
723 bitfield_field32_read(reg, RRAM_CTRL_INFO_PAGE_CFG_0_ECC_EN_0_FIELD);
724 *properties_out = properties;
730 if (handle == NULL || region >= kNumRegions) {
736 dif_rram_ctrl_data_region_is_locked(handle, region, &locked));
741 ptrdiff_t lock_reg_offset = get_data_region_lock_reg_offset(region);
743 mmio_region_write32(handle->
dev.
base_addr, lock_reg_offset, 0);
768 if (handle == NULL || locked_out == NULL || region >= kNumRegions) {
771 ptrdiff_t lock_reg_offset = get_data_region_lock_reg_offset(region);
772 uint32_t reg = mmio_region_read32(handle->
dev.
base_addr, lock_reg_offset);
774 !bitfield_bit32_read(reg, RRAM_CTRL_REGION_CFG_REGWEN_0_REGION_0_BIT);
793 if (handle == NULL || level > RRAM_CTRL_FIFO_LVL_WR_MASK) {
797 mmio_region_read32(handle->
dev.
base_addr, RRAM_CTRL_FIFO_LVL_REG_OFFSET);
798 reg = bitfield_field32_write(reg, RRAM_CTRL_FIFO_LVL_WR_FIELD, level);
799 mmio_region_write32(handle->
dev.
base_addr, RRAM_CTRL_FIFO_LVL_REG_OFFSET,
806 if (handle == NULL || level > RRAM_CTRL_FIFO_LVL_RD_MASK) {
810 mmio_region_read32(handle->
dev.
base_addr, RRAM_CTRL_FIFO_LVL_REG_OFFSET);
811 reg = bitfield_field32_write(reg, RRAM_CTRL_FIFO_LVL_RD_FIELD, level);
812 mmio_region_write32(handle->
dev.
base_addr, RRAM_CTRL_FIFO_LVL_REG_OFFSET,
819 uint32_t *read_out) {
820 if (handle == NULL) {
824 mmio_region_read32(handle->
dev.
base_addr, RRAM_CTRL_FIFO_LVL_REG_OFFSET);
825 if (write_out != NULL) {
826 *write_out = bitfield_field32_read(reg, RRAM_CTRL_FIFO_LVL_WR_FIELD);
828 if (read_out != NULL) {
829 *read_out = bitfield_field32_read(reg, RRAM_CTRL_FIFO_LVL_RD_FIELD);
855 dif_rram_ctrl_faults_t *faults_out) {
856 if (handle == NULL || faults_out == NULL) {
859 uint32_t reg = mmio_region_read32(handle->
dev.
base_addr,
860 RRAM_CTRL_FAULT_STATUS_REG_OFFSET);
861 dif_rram_ctrl_faults_t faults;
863 bitfield_bit32_read(reg, RRAM_CTRL_FAULT_STATUS_LCMGR_OP_ERR_BIT);
865 bitfield_bit32_read(reg, RRAM_CTRL_FAULT_STATUS_LCMGR_MP_ERR_BIT);
867 bitfield_bit32_read(reg, RRAM_CTRL_FAULT_STATUS_LCMGR_RD_ERR_BIT);
869 bitfield_bit32_read(reg, RRAM_CTRL_FAULT_STATUS_LCMGR_WR_ERR_BIT);
871 bitfield_bit32_read(reg, RRAM_CTRL_FAULT_STATUS_OTP_OP_ERR_BIT);
873 bitfield_bit32_read(reg, RRAM_CTRL_FAULT_STATUS_OTP_MP_ERR_BIT);
875 bitfield_bit32_read(reg, RRAM_CTRL_FAULT_STATUS_OTP_RD_ERR_BIT);
877 bitfield_bit32_read(reg, RRAM_CTRL_FAULT_STATUS_OTP_WR_ERR_BIT);
879 *faults_out = faults;
885 dif_rram_ctrl_ecc_errors_t *errors_out) {
886 if (handle == NULL || errors_out == NULL) {
890 uint32_t reg = mmio_region_read32(handle->
dev.
base_addr,
891 RRAM_CTRL_CORR_ERR_CNT_REG_OFFSET);
893 bitfield_field32_read(reg, RRAM_CTRL_CORR_ERR_CNT_VAL_FIELD);
896 RRAM_CTRL_CORR_ERR_LOC_REG_OFFSET);
899 bitfield_field32_read(reg, RRAM_CTRL_CORR_ERR_LOC_ADDR_FIELD);
901 bitfield_bit32_read(reg, RRAM_CTRL_CORR_ERR_LOC_PART_BIT);
907 dif_rram_ctrl_phy_status_t *status_out) {
908 if (handle == NULL || status_out == NULL) {
911 const uint32_t reg = mmio_region_read32(handle->
dev.
base_addr,
912 RRAM_CTRL_PHY_STATUS_REG_OFFSET);
913 dif_rram_ctrl_phy_status_t
status = {
915 bitfield_bit32_read(reg, RRAM_CTRL_PHY_STATUS_INIT_DONE_BIT),
916 .phy_wr_busy = bitfield_bit32_read(reg, RRAM_CTRL_PHY_STATUS_WR_BUSY_BIT),