[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],