[dif_sram_ctrl] Introduce API for chip_sram_scrambled_access testing Signed-off-by: Silvestrs Timofejevs <silvestrst@lowrisc.org>
diff --git a/sw/device/lib/dif/dif_sram_ctrl.c b/sw/device/lib/dif/dif_sram_ctrl.c index 1347fac..9ead895 100644 --- a/sw/device/lib/dif/dif_sram_ctrl.c +++ b/sw/device/lib/dif/dif_sram_ctrl.c
@@ -4,4 +4,68 @@ #include "sw/device/lib/dif/dif_sram_ctrl.h" -// TODO: implement! +#include "sram_ctrl_regs.h" // Generated. + +/** + * Obtains the lock state of the "Control" register. + * + * When locked - new scrambling key and SRAM pseudo-random data overwriting + * requests are not available. + */ +static dif_toggle_t sram_ctrl_lock_state(const dif_sram_ctrl_t *sram_ctrl) { + return mmio_region_read32(sram_ctrl->base_addr, + SRAM_CTRL_CTRL_REGWEN_REG_OFFSET) + ? kDifToggleDisabled + : kDifToggleEnabled; +} + +/** + * Obtains the SRAM Controller statues. + * + * `dif_sram_ctrl_status_t` can be used to query individual flags. + */ +static uint32_t sram_ctrl_get_status(const dif_sram_ctrl_t *sram_ctrl) { + return mmio_region_read32(sram_ctrl->base_addr, SRAM_CTRL_STATUS_REG_OFFSET); +} + +dif_result_t dif_sram_ctrl_init(mmio_region_t base_addr, + dif_sram_ctrl_t *sram_ctrl) { + if (sram_ctrl == NULL) { + return kDifBadArg; + } + + sram_ctrl->base_addr = base_addr; + + return kDifOk; +} + +dif_result_t dif_sram_ctrl_request_new_key(const dif_sram_ctrl_t *sram_ctrl) { + if (sram_ctrl == NULL) { + return kDifBadArg; + } + + if (sram_ctrl_lock_state(sram_ctrl) == kDifToggleEnabled) { + return kDifLocked; + } + + uint32_t reg = + bitfield_bit32_write(0, SRAM_CTRL_CTRL_RENEW_SCR_KEY_BIT, true); + mmio_region_write32(sram_ctrl->base_addr, SRAM_CTRL_CTRL_REG_OFFSET, reg); + + return kDifOk; +} + +dif_result_t dif_sram_ctrl_get_status(const dif_sram_ctrl_t *sram_ctrl, + dif_sram_ctrl_status_bitfield_t *status) { + if (sram_ctrl == NULL) { + return kDifBadArg; + } + + if (status == NULL) { + return kDifBadArg; + } + + *status = sram_ctrl_get_status(sram_ctrl); + + return kDifOk; +}
diff --git a/sw/device/lib/dif/meson.build b/sw/device/lib/dif/meson.build index 32089d2..7d6c16e 100644 --- a/sw/device/lib/dif/meson.build +++ b/sw/device/lib/dif/meson.build
@@ -755,6 +755,7 @@ link_with: static_library( 'sw_lib_dif_sram_ctrl', sources: [ + hw_ip_sram_ctrl_reg_h, 'dif_sram_ctrl.c', ], dependencies: [sw_lib_mmio],