[sw/silicon_creator] Don't request a new scrambling key for ret ram

This commit adds retention_sram_init() and uses it instead of
retention_sram_scramble() to reduce boot time.

Signed-off-by: Alphan Ulusoy <alphan@google.com>
diff --git a/sw/device/silicon_creator/lib/drivers/retention_sram.c b/sw/device/silicon_creator/lib/drivers/retention_sram.c
index b5a7555..6f1125e 100644
--- a/sw/device/silicon_creator/lib/drivers/retention_sram.c
+++ b/sw/device/silicon_creator/lib/drivers/retention_sram.c
@@ -18,6 +18,21 @@
   kBase = TOP_EARLGREY_SRAM_CTRL_RET_AON_REGS_BASE_ADDR,
 };
 
+/**
+ * Check that control register writes are enabled.
+ *
+ * @return Result of the operation.
+ */
+static rom_error_t is_locked(void) {
+  if (!bitfield_bit32_read(
+          abs_mmio_read32(kBase + SRAM_CTRL_CTRL_REGWEN_REG_OFFSET),
+          SRAM_CTRL_CTRL_REGWEN_CTRL_REGWEN_BIT)) {
+    return kErrorRetSramLocked;
+  }
+
+  return kErrorOk;
+}
+
 volatile retention_sram_t *retention_sram_get(void) {
   static_assert(sizeof(retention_sram_t) == TOP_EARLGREY_RAM_RET_AON_SIZE_BYTES,
                 "Unexpected retention SRAM size.");
@@ -28,13 +43,17 @@
   *retention_sram_get() = (retention_sram_t){0};
 }
 
+rom_error_t retention_sram_init(void) {
+  RETURN_IF_ERROR(is_locked());
+
+  uint32_t reg = bitfield_bit32_write(0, SRAM_CTRL_CTRL_INIT_BIT, true);
+  abs_mmio_write32(kBase + SRAM_CTRL_CTRL_REG_OFFSET, reg);
+
+  return kErrorOk;
+}
+
 rom_error_t retention_sram_scramble(void) {
-  // Check that control register writes are enabled.
-  if (!bitfield_bit32_read(
-          abs_mmio_read32(kBase + SRAM_CTRL_CTRL_REGWEN_REG_OFFSET),
-          SRAM_CTRL_CTRL_REGWEN_CTRL_REGWEN_BIT)) {
-    return kErrorRetSramLocked;
-  }
+  RETURN_IF_ERROR(is_locked());
 
   // Request the renewal of the scrambling key and initialization to random
   // values.
diff --git a/sw/device/silicon_creator/lib/drivers/retention_sram.h b/sw/device/silicon_creator/lib/drivers/retention_sram.h
index 460bdbb..6d1fc8c 100644
--- a/sw/device/silicon_creator/lib/drivers/retention_sram.h
+++ b/sw/device/silicon_creator/lib/drivers/retention_sram.h
@@ -79,6 +79,16 @@
 void retention_sram_clear(void);
 
 /**
+ * Initialize the retention SRAM with pseudo-random data from the LFSR.
+ *
+ * This function does not request a new scrambling key. See
+ * `retention_sram_scramble()`.
+ *
+ * @return Result of the operation.
+ */
+rom_error_t retention_sram_init(void);
+
+/**
  * Start scrambling the retention SRAM.
  *
  * Requests a new scrambling key for the retention SRAM. This operation
diff --git a/sw/device/silicon_creator/lib/drivers/retention_sram_unittest.cc b/sw/device/silicon_creator/lib/drivers/retention_sram_unittest.cc
index a6da2fd..b4647d1 100644
--- a/sw/device/silicon_creator/lib/drivers/retention_sram_unittest.cc
+++ b/sw/device/silicon_creator/lib/drivers/retention_sram_unittest.cc
@@ -16,38 +16,52 @@
 namespace {
 class RetentionSramTest : public mask_rom_test::MaskRomTest {
  protected:
-  uint32_t base_ = TOP_EARLGREY_PINMUX_AON_BASE_ADDR;
+  uint32_t base_ = TOP_EARLGREY_SRAM_CTRL_RET_AON_REGS_BASE_ADDR;
   mask_rom_test::MockAbsMmio mmio_;
 };
 
 class ScrambleTest : public RetentionSramTest {};
 
 TEST_F(ScrambleTest, Ok) {
-  uint32_t write_enabled =
-      bitfield_bit32_write(0, SRAM_CTRL_CTRL_REGWEN_CTRL_REGWEN_BIT, true);
-  EXPECT_ABS_READ32(TOP_EARLGREY_SRAM_CTRL_RET_AON_REGS_BASE_ADDR +
-                        SRAM_CTRL_CTRL_REGWEN_REG_OFFSET,
-                    write_enabled);
-
-  uint32_t ctrl = 0;
-  ctrl = bitfield_bit32_write(ctrl, SRAM_CTRL_CTRL_RENEW_SCR_KEY_BIT, true);
-  ctrl = bitfield_bit32_write(ctrl, SRAM_CTRL_CTRL_INIT_BIT, true);
-  EXPECT_ABS_WRITE32(
-      TOP_EARLGREY_SRAM_CTRL_RET_AON_REGS_BASE_ADDR + SRAM_CTRL_CTRL_REG_OFFSET,
-      ctrl);
+  EXPECT_ABS_READ32(base_ + SRAM_CTRL_CTRL_REGWEN_REG_OFFSET,
+                    {
+                        {SRAM_CTRL_CTRL_REGWEN_CTRL_REGWEN_BIT, 1},
+                    });
+  EXPECT_ABS_WRITE32(base_ + SRAM_CTRL_CTRL_REG_OFFSET,
+                     {
+                         {SRAM_CTRL_CTRL_RENEW_SCR_KEY_BIT, 1},
+                         {SRAM_CTRL_CTRL_INIT_BIT, 1},
+                     });
 
   EXPECT_EQ(retention_sram_scramble(), kErrorOk);
 }
 
 TEST_F(ScrambleTest, Locked) {
-  uint32_t write_enabled =
-      bitfield_bit32_write(0, SRAM_CTRL_CTRL_REGWEN_CTRL_REGWEN_BIT, false);
-  EXPECT_ABS_READ32(TOP_EARLGREY_SRAM_CTRL_RET_AON_REGS_BASE_ADDR +
-                        SRAM_CTRL_CTRL_REGWEN_REG_OFFSET,
-                    write_enabled);
+  EXPECT_ABS_READ32(base_ + SRAM_CTRL_CTRL_REGWEN_REG_OFFSET, 0);
 
   EXPECT_EQ(retention_sram_scramble(), kErrorRetSramLocked);
 }
 
+class InitTest : public RetentionSramTest {};
+
+TEST_F(InitTest, Ok) {
+  EXPECT_ABS_READ32(base_ + SRAM_CTRL_CTRL_REGWEN_REG_OFFSET,
+                    {
+                        {SRAM_CTRL_CTRL_REGWEN_CTRL_REGWEN_BIT, 1},
+                    });
+  EXPECT_ABS_WRITE32(base_ + SRAM_CTRL_CTRL_REG_OFFSET,
+                     {
+                         {SRAM_CTRL_CTRL_INIT_BIT, 1},
+                     });
+
+  EXPECT_EQ(retention_sram_init(), kErrorOk);
+}
+
+TEST_F(InitTest, Locked) {
+  EXPECT_ABS_READ32(base_ + SRAM_CTRL_CTRL_REGWEN_REG_OFFSET, 0);
+
+  EXPECT_EQ(retention_sram_init(), kErrorRetSramLocked);
+}
+
 }  // namespace
 }  // namespace retention_sram_unittest
diff --git a/sw/device/silicon_creator/mask_rom/mask_rom.c b/sw/device/silicon_creator/mask_rom/mask_rom.c
index 46770b1..61ea3c8 100644
--- a/sw/device/silicon_creator/mask_rom/mask_rom.c
+++ b/sw/device/silicon_creator/mask_rom/mask_rom.c
@@ -122,7 +122,7 @@
   // retention SRAM and the reset reason register cleared.
   uint32_t reset_reasons = rstmgr_reason_get();
   if (bitfield_bit32_read(reset_reasons, kRstmgrReasonPowerOn)) {
-    retention_sram_clear();
+    retention_sram_init();
   }
 
   // If running on an FPGA, print the FPGA version-id.