86dif_rram_ctrl_device_info_t dif_rram_ctrl_get_device_info(
void) {
87 const dif_rram_ctrl_device_info_t info = {
88 .bytes_per_word = kBytesPerWord,
89 .bytes_per_page = kBytesPerPage,
90 .data_pages = kNumDataPages,
91 .info_pages = kNumInfoPages,
98 multi_bit_bool_t disable_rram;
104 disable_rram = kMultiBitBool4False;
107 disable_rram = kMultiBitBool4True;
113 reg = mmio_region_read32(handle->
dev.
base_addr, RRAM_CTRL_DIS_REG_OFFSET);
114 reg = bitfield_field32_write(reg, RRAM_CTRL_DIS_SW_DIS_FIELD, disable_rram);
115 mmio_region_write32(handle->
dev.
base_addr, RRAM_CTRL_DIS_REG_OFFSET, reg);
121 if (handle == NULL || enabled_out == NULL) {
125 mmio_region_read32(handle->
dev.
base_addr, RRAM_CTRL_DIS_REG_OFFSET);
126 multi_bit_bool_t rram_disabled =
127 bitfield_field32_read(reg, RRAM_CTRL_DIS_SW_DIS_FIELD);
128 if (rram_disabled == kMultiBitBool4False) {
173 if (handle == NULL) {
177 mmio_region_read32(handle->
dev.
base_addr, RRAM_CTRL_INIT_REG_OFFSET);
178 if (bitfield_bit32_read(reg, RRAM_CTRL_INIT_VAL_BIT)) {
182 uint32_t value = bitfield_bit32_write(0, RRAM_CTRL_INIT_VAL_BIT,
true);
183 mmio_region_write32(handle->
dev.
base_addr, RRAM_CTRL_INIT_REG_OFFSET, value);
189 if (handle == NULL || status_out == NULL) {
193 mmio_region_read32(handle->
dev.
base_addr, RRAM_CTRL_STATUS_REG_OFFSET);
195 .read_fifo_full = bitfield_bit32_read(reg, RRAM_CTRL_STATUS_RD_FULL_BIT),
197 bitfield_bit32_read(reg, RRAM_CTRL_STATUS_RD_EMPTY_BIT),
198 .write_fifo_full = bitfield_bit32_read(reg, RRAM_CTRL_STATUS_WR_FULL_BIT),
200 bitfield_bit32_read(reg, RRAM_CTRL_STATUS_WR_EMPTY_BIT),
201 .controller_init_done =
202 bitfield_bit32_read(reg, RRAM_CTRL_STATUS_INIT_DONE_BIT),
203 .controller_keys_valid =
204 bitfield_bit32_read(reg, RRAM_CTRL_STATUS_KEYS_VALID_BIT),
212 if (handle == NULL) {
215 uint32_t ctrl_regwen = mmio_region_read32(handle->
dev.
base_addr,
216 RRAM_CTRL_CTRL_REGWEN_REG_OFFSET);
217 if (!bitfield_bit32_read(ctrl_regwen, RRAM_CTRL_CTRL_REGWEN_EN_BIT)) {
224 uint32_t control_reg = bitfield_field32_write(0, RRAM_CTRL_CONTROL_NUM_FIELD,
226 switch (transaction.op) {
229 bitfield_field32_write(control_reg, RRAM_CTRL_CONTROL_OP_FIELD,
230 RRAM_CTRL_CONTROL_OP_VALUE_READ);
234 bitfield_field32_write(control_reg, RRAM_CTRL_CONTROL_OP_FIELD,
235 RRAM_CTRL_CONTROL_OP_VALUE_WRITE);
239 bitfield_field32_write(control_reg, RRAM_CTRL_CONTROL_OP_FIELD,
240 RRAM_CTRL_CONTROL_OP_VALUE_REWRITE);
247 case kDifRramCtrlPartitionTypeData:
248 control_reg = bitfield_bit32_write(
249 control_reg, RRAM_CTRL_CONTROL_PARTITION_BIT,
false);
251 case kDifRramCtrlPartitionTypeInfo:
252 control_reg = bitfield_bit32_write(control_reg,
253 RRAM_CTRL_CONTROL_PARTITION_BIT,
true);
259 mmio_region_write32(handle->
dev.
base_addr, RRAM_CTRL_CONTROL_REG_OFFSET,
261 mmio_region_write32(handle->
dev.
base_addr, RRAM_CTRL_ADDR_REG_OFFSET,
263 mmio_region_write32(handle->
dev.
base_addr, RRAM_CTRL_CONTROL_REG_OFFSET,
264 control_reg | (1u << RRAM_CTRL_CONTROL_START_BIT));
333 const uint32_t *data) {
334 if (handle == NULL || data == NULL) {
343 const uint32_t control_reg =
344 mmio_region_read32(handle->
dev.
base_addr, RRAM_CTRL_CONTROL_REG_OFFSET);
346 bitfield_field32_read(control_reg, RRAM_CTRL_CONTROL_OP_FIELD);
347 if (op != RRAM_CTRL_CONTROL_OP_VALUE_WRITE) {
350 return dif_rram_ctrl_wr_fifo_push_unsafe(handle, word_count, data);
369 uint32_t word_count, uint32_t *data) {
370 if (handle == NULL || data == NULL) {
379 const uint32_t control_reg =
380 mmio_region_read32(handle->
dev.
base_addr, RRAM_CTRL_CONTROL_REG_OFFSET);
382 bitfield_field32_read(control_reg, RRAM_CTRL_CONTROL_OP_FIELD);
383 if (op != RRAM_CTRL_CONTROL_OP_VALUE_READ) {
386 return dif_rram_ctrl_read_fifo_pop_unsafe(handle, word_count, data);
392 if (handle == NULL || error_code_out == NULL) {
395 const uint32_t code_reg =
396 mmio_region_read32(handle->
dev.
base_addr, RRAM_CTRL_ERR_CODE_REG_OFFSET);
397 dif_rram_ctrl_error_codes_t codes = {
399 bitfield_bit32_read(code_reg, RRAM_CTRL_ERR_CODE_OP_ERR_BIT),
400 .memory_protection_error =
401 bitfield_bit32_read(code_reg, RRAM_CTRL_ERR_CODE_MP_ERR_BIT),
403 bitfield_bit32_read(code_reg, RRAM_CTRL_ERR_CODE_RD_ERR_BIT),
405 bitfield_bit32_read(code_reg, RRAM_CTRL_ERR_CODE_WR_ERR_BIT),
408 const uint32_t address_reg =
409 mmio_region_read32(handle->
dev.
base_addr, RRAM_CTRL_ERR_ADDR_REG_OFFSET);
411 .address = address_reg,
414 *error_code_out = error_code;
420 if (handle == NULL) {
423 uint32_t code_reg = 0;
424 code_reg = bitfield_bit32_write(code_reg, RRAM_CTRL_ERR_CODE_OP_ERR_BIT,
426 code_reg = bitfield_bit32_write(code_reg, RRAM_CTRL_ERR_CODE_MP_ERR_BIT,
428 code_reg = bitfield_bit32_write(code_reg, RRAM_CTRL_ERR_CODE_RD_ERR_BIT,
430 code_reg = bitfield_bit32_write(code_reg, RRAM_CTRL_ERR_CODE_WR_ERR_BIT,
432 mmio_region_write32(handle->
dev.
base_addr, RRAM_CTRL_ERR_CODE_REG_OFFSET,
438 dif_rram_ctrl_output_t *out) {
439 if (handle == NULL || out == NULL) {
445 uint32_t status_reg =
446 mmio_region_read32(handle->
dev.
base_addr, RRAM_CTRL_OP_STATUS_REG_OFFSET);
447 if (!bitfield_bit32_read(status_reg, RRAM_CTRL_OP_STATUS_DONE_BIT)) {
455 dif_rram_ctrl_output_t output = {
457 bitfield_bit32_read(status_reg, RRAM_CTRL_OP_STATUS_DONE_BIT),
459 bitfield_bit32_read(status_reg, RRAM_CTRL_OP_STATUS_ERR_BIT),
460 .error_code = error_code_tmp};
462 mmio_region_write32(handle->
dev.
base_addr, RRAM_CTRL_OP_STATUS_REG_OFFSET, 0);
470 if (handle == NULL || region >= kNumRegions) {
476 dif_rram_ctrl_data_region_is_locked(handle, region, &locked));
481 ptrdiff_t mp_reg_offset = get_data_region_mp_reg_offset(region);
482 uint32_t mp_reg = mmio_region_read32(handle->
dev.
base_addr, mp_reg_offset);
485 mp_reg = bitfield_field32_write(
486 mp_reg, RRAM_CTRL_MP_REGION_CFG_0_EN_0_FIELD, kMultiBitBool4True);
489 mp_reg = bitfield_field32_write(
490 mp_reg, RRAM_CTRL_MP_REGION_CFG_0_EN_0_FIELD, kMultiBitBool4False);
495 mmio_region_write32(handle->
dev.
base_addr, mp_reg_offset, mp_reg);
502 if (handle == NULL || enabled_out == NULL || region >= kNumRegions) {
505 ptrdiff_t mp_reg_offset = get_data_region_mp_reg_offset(region);
506 uint32_t mp_reg = mmio_region_read32(handle->
dev.
base_addr, mp_reg_offset);
507 if (bitfield_field32_read(mp_reg, RRAM_CTRL_MP_REGION_CFG_0_EN_0_FIELD) ==
508 kMultiBitBool4True) {
519 if (handle == NULL || region.
page >= kNumInfoPages) {
524 dif_rram_ctrl_info_region_is_locked(handle, region, &locked));
529 ptrdiff_t mp_reg_offset = get_info_region_mp_reg_offset(region);
530 uint32_t mp_reg = mmio_region_read32(handle->
dev.
base_addr, mp_reg_offset);
533 mp_reg = bitfield_field32_write(
534 mp_reg, RRAM_CTRL_INFO_PAGE_CFG_0_EN_0_FIELD, kMultiBitBool4True);
537 mp_reg = bitfield_field32_write(
538 mp_reg, RRAM_CTRL_INFO_PAGE_CFG_0_EN_0_FIELD, kMultiBitBool4False);
543 mmio_region_write32(handle->
dev.
base_addr, mp_reg_offset, mp_reg);
567 if (handle == NULL) {
571 reg = bitfield_field32_write(reg, RRAM_CTRL_DEFAULT_REGION_RD_EN_FIELD,
573 reg = bitfield_field32_write(reg, RRAM_CTRL_DEFAULT_REGION_WR_EN_FIELD,
575 reg = bitfield_field32_write(reg, RRAM_CTRL_DEFAULT_REGION_SCRAMBLE_EN_FIELD,
577 reg = bitfield_field32_write(reg, RRAM_CTRL_DEFAULT_REGION_ECC_EN_FIELD,
580 RRAM_CTRL_DEFAULT_REGION_REG_OFFSET, reg);
587 if (handle == NULL || properties_out == NULL) {
590 const uint32_t reg = mmio_region_read32(handle->
dev.
base_addr,
591 RRAM_CTRL_DEFAULT_REGION_REG_OFFSET);
593 .rd_en = bitfield_field32_read(reg, RRAM_CTRL_DEFAULT_REGION_RD_EN_FIELD),
594 .wr_en = bitfield_field32_read(reg, RRAM_CTRL_DEFAULT_REGION_WR_EN_FIELD),
595 .scramble_en = bitfield_field32_read(
596 reg, RRAM_CTRL_DEFAULT_REGION_SCRAMBLE_EN_FIELD),
598 bitfield_field32_read(reg, RRAM_CTRL_DEFAULT_REGION_ECC_EN_FIELD),
600 *properties_out = properties;
607 const uint32_t page_limit = kNumDataPages;
608 if (handle == NULL || region >= kNumRegions ||
609 config.
base + config.
size > page_limit) {
615 dif_rram_ctrl_data_region_is_locked(handle, region, &locked));
620 ptrdiff_t mp_reg_offset = get_data_region_mp_reg_offset(region);
621 uint32_t reg = mmio_region_read32(handle->
dev.
base_addr, mp_reg_offset);
622 reg = bitfield_field32_write(reg, RRAM_CTRL_MP_REGION_CFG_0_RD_EN_0_FIELD,
624 reg = bitfield_field32_write(reg, RRAM_CTRL_MP_REGION_CFG_0_WR_EN_0_FIELD,
627 bitfield_field32_write(reg, RRAM_CTRL_MP_REGION_CFG_0_SCRAMBLE_EN_0_FIELD,
629 reg = bitfield_field32_write(reg, RRAM_CTRL_MP_REGION_CFG_0_ECC_EN_0_FIELD,
632 mmio_region_write32(handle->
dev.
base_addr, mp_reg_offset, reg);
635 mp_reg_offset = get_data_region_reg_offset(region);
637 reg = bitfield_field32_write(0, RRAM_CTRL_MP_REGION_0_BASE_0_FIELD,
639 reg = bitfield_field32_write(reg, RRAM_CTRL_MP_REGION_0_SIZE_0_FIELD,
641 mmio_region_write32(handle->
dev.
base_addr, mp_reg_offset, reg);
648 if (handle == NULL || config_out == NULL || region >= kNumRegions) {
652 ptrdiff_t mp_reg_offset = get_data_region_mp_reg_offset(region);
653 uint32_t reg = mmio_region_read32(handle->
dev.
base_addr, mp_reg_offset);
656 bitfield_field32_read(reg, RRAM_CTRL_MP_REGION_CFG_0_RD_EN_0_FIELD);
658 bitfield_field32_read(reg, RRAM_CTRL_MP_REGION_CFG_0_WR_EN_0_FIELD);
660 bitfield_field32_read(reg, RRAM_CTRL_MP_REGION_CFG_0_SCRAMBLE_EN_0_FIELD);
662 bitfield_field32_read(reg, RRAM_CTRL_MP_REGION_CFG_0_ECC_EN_0_FIELD);
664 mp_reg_offset = get_data_region_reg_offset(region);
665 reg = mmio_region_read32(handle->
dev.
base_addr, mp_reg_offset);
666 config.
base = bitfield_field32_read(reg, RRAM_CTRL_MP_REGION_0_BASE_0_FIELD);
667 config.
size = bitfield_field32_read(reg, RRAM_CTRL_MP_REGION_0_SIZE_0_FIELD);
668 *config_out = config;
675 if (handle == NULL || region.
page >= kNumInfoPages) {
681 dif_rram_ctrl_info_region_is_locked(handle, region, &locked));
686 ptrdiff_t mp_reg_offset = get_info_region_mp_reg_offset(region);
687 uint32_t reg = mmio_region_read32(handle->
dev.
base_addr, mp_reg_offset);
688 reg = bitfield_field32_write(reg, RRAM_CTRL_INFO_PAGE_CFG_0_RD_EN_0_FIELD,
690 reg = bitfield_field32_write(reg, RRAM_CTRL_INFO_PAGE_CFG_0_WR_EN_0_FIELD,
693 bitfield_field32_write(reg, RRAM_CTRL_INFO_PAGE_CFG_0_SCRAMBLE_EN_0_FIELD,
695 reg = bitfield_field32_write(reg, RRAM_CTRL_INFO_PAGE_CFG_0_ECC_EN_0_FIELD,
697 mmio_region_write32(handle->
dev.
base_addr, mp_reg_offset, reg);
704 if (handle == NULL || properties_out == NULL ||
705 region.
page >= kNumInfoPages) {
709 ptrdiff_t mp_reg_offset = get_info_region_mp_reg_offset(region);
710 const uint32_t reg = mmio_region_read32(handle->
dev.
base_addr, mp_reg_offset);
713 bitfield_field32_read(reg, RRAM_CTRL_INFO_PAGE_CFG_0_RD_EN_0_FIELD);
715 bitfield_field32_read(reg, RRAM_CTRL_INFO_PAGE_CFG_0_WR_EN_0_FIELD);
717 bitfield_field32_read(reg, RRAM_CTRL_INFO_PAGE_CFG_0_SCRAMBLE_EN_0_FIELD);
719 bitfield_field32_read(reg, RRAM_CTRL_INFO_PAGE_CFG_0_ECC_EN_0_FIELD);
720 *properties_out = properties;
726 if (handle == NULL || region >= kNumRegions) {
732 dif_rram_ctrl_data_region_is_locked(handle, region, &locked));
737 ptrdiff_t lock_reg_offset = get_data_region_lock_reg_offset(region);
739 mmio_region_write32(handle->
dev.
base_addr, lock_reg_offset, 0);
764 if (handle == NULL || locked_out == NULL || region >= kNumRegions) {
767 ptrdiff_t lock_reg_offset = get_data_region_lock_reg_offset(region);
768 uint32_t reg = mmio_region_read32(handle->
dev.
base_addr, lock_reg_offset);
770 !bitfield_bit32_read(reg, RRAM_CTRL_REGION_CFG_REGWEN_0_REGION_0_BIT);
789 if (handle == NULL || level > RRAM_CTRL_FIFO_LVL_WR_MASK) {
793 mmio_region_read32(handle->
dev.
base_addr, RRAM_CTRL_FIFO_LVL_REG_OFFSET);
794 reg = bitfield_field32_write(reg, RRAM_CTRL_FIFO_LVL_WR_FIELD, level);
795 mmio_region_write32(handle->
dev.
base_addr, RRAM_CTRL_FIFO_LVL_REG_OFFSET,
802 if (handle == NULL || level > RRAM_CTRL_FIFO_LVL_RD_MASK) {
806 mmio_region_read32(handle->
dev.
base_addr, RRAM_CTRL_FIFO_LVL_REG_OFFSET);
807 reg = bitfield_field32_write(reg, RRAM_CTRL_FIFO_LVL_RD_FIELD, level);
808 mmio_region_write32(handle->
dev.
base_addr, RRAM_CTRL_FIFO_LVL_REG_OFFSET,
815 uint32_t *read_out) {
816 if (handle == NULL) {
820 mmio_region_read32(handle->
dev.
base_addr, RRAM_CTRL_FIFO_LVL_REG_OFFSET);
821 if (write_out != NULL) {
822 *write_out = bitfield_field32_read(reg, RRAM_CTRL_FIFO_LVL_WR_FIELD);
824 if (read_out != NULL) {
825 *read_out = bitfield_field32_read(reg, RRAM_CTRL_FIFO_LVL_RD_FIELD);
851 dif_rram_ctrl_faults_t *faults_out) {
852 if (handle == NULL || faults_out == NULL) {
855 uint32_t reg = mmio_region_read32(handle->
dev.
base_addr,
856 RRAM_CTRL_FAULT_STATUS_REG_OFFSET);
857 dif_rram_ctrl_faults_t faults;
859 bitfield_bit32_read(reg, RRAM_CTRL_FAULT_STATUS_LCMGR_OP_ERR_BIT);
861 bitfield_bit32_read(reg, RRAM_CTRL_FAULT_STATUS_LCMGR_MP_ERR_BIT);
863 bitfield_bit32_read(reg, RRAM_CTRL_FAULT_STATUS_LCMGR_RD_ERR_BIT);
865 bitfield_bit32_read(reg, RRAM_CTRL_FAULT_STATUS_LCMGR_WR_ERR_BIT);
867 bitfield_bit32_read(reg, RRAM_CTRL_FAULT_STATUS_OTP_OP_ERR_BIT);
869 bitfield_bit32_read(reg, RRAM_CTRL_FAULT_STATUS_OTP_MP_ERR_BIT);
871 bitfield_bit32_read(reg, RRAM_CTRL_FAULT_STATUS_OTP_RD_ERR_BIT);
873 bitfield_bit32_read(reg, RRAM_CTRL_FAULT_STATUS_OTP_WR_ERR_BIT);
875 *faults_out = faults;
881 dif_rram_ctrl_ecc_errors_t *errors_out) {
882 if (handle == NULL || errors_out == NULL) {
886 uint32_t reg = mmio_region_read32(handle->
dev.
base_addr,
887 RRAM_CTRL_CORR_ERR_CNT_REG_OFFSET);
889 bitfield_field32_read(reg, RRAM_CTRL_CORR_ERR_CNT_VAL_FIELD);
892 RRAM_CTRL_CORR_ERR_LOC_REG_OFFSET);
895 bitfield_field32_read(reg, RRAM_CTRL_CORR_ERR_LOC_ADDR_FIELD);
897 bitfield_bit32_read(reg, RRAM_CTRL_CORR_ERR_LOC_PART_BIT);
903 dif_rram_ctrl_phy_status_t *status_out) {
904 if (handle == NULL || status_out == NULL) {
907 const uint32_t reg = mmio_region_read32(handle->
dev.
base_addr,
908 RRAM_CTRL_PHY_STATUS_REG_OFFSET);
909 dif_rram_ctrl_phy_status_t
status = {
911 bitfield_bit32_read(reg, RRAM_CTRL_PHY_STATUS_INIT_DONE_BIT),
912 .phy_wr_busy = bitfield_bit32_read(reg, RRAM_CTRL_PHY_STATUS_WR_BUSY_BIT),