[sw/rom] Add SEC_MMIO_INCREMENT macro.

This commit adds a macro to be able to increment the expected register
write count without requiring an additional funciton call. It relies on
an extern reference to the sec_mmio_ctx to avoid requiring functional
tests to explicitly define the context.

Signed-off-by: Miguel Osorio <miguelosorio@google.com>
diff --git a/sw/device/silicon_creator/lib/base/mock_sec_mmio.h b/sw/device/silicon_creator/lib/base/mock_sec_mmio.h
index 8f4682a..4bf862c 100644
--- a/sw/device/silicon_creator/lib/base/mock_sec_mmio.h
+++ b/sw/device/silicon_creator/lib/base/mock_sec_mmio.h
@@ -9,6 +9,11 @@
 #include "sw/device/silicon_creator/lib/base/sec_mmio.h"
 #include "sw/device/silicon_creator/testing/mask_rom_test.h"
 
+extern "C" {
+// Required by `SEC_MMIO_WRITE_INCREMENT()`.
+volatile sec_mmio_ctx_t sec_mmio_ctx;
+}
+
 namespace mask_rom_test {
 namespace internal {
 /**
diff --git a/sw/device/silicon_creator/lib/base/sec_mmio.c b/sw/device/silicon_creator/lib/base/sec_mmio.c
index 3dabac6..4cf6ef3 100644
--- a/sw/device/silicon_creator/lib/base/sec_mmio.c
+++ b/sw/device/silicon_creator/lib/base/sec_mmio.c
@@ -107,7 +107,7 @@
 }
 
 void sec_mmio_write_increment(uint32_t value) {
-  sec_mmio_ctx.expected_write_count += value;
+  SEC_MMIO_WRITE_INCREMENT(value);
 }
 
 void sec_mmio_check_values(uint32_t rnd_offset) {
diff --git a/sw/device/silicon_creator/lib/base/sec_mmio.h b/sw/device/silicon_creator/lib/base/sec_mmio.h
index dd15049..328d0cb 100644
--- a/sw/device/silicon_creator/lib/base/sec_mmio.h
+++ b/sw/device/silicon_creator/lib/base/sec_mmio.h
@@ -109,6 +109,31 @@
 OT_ASSERT_MEMBER_OFFSET(sec_mmio_ctx_t, check_count, 1612);
 OT_ASSERT_SIZE(sec_mmio_ctx_t, 1616);  // Checked by linker script.
 
+// The sec_mmio_ctx is referenced here to be able to use it inside the
+// `SEC_MMIO_WRITE_INCREMENT()` macro.
+extern volatile sec_mmio_ctx_t sec_mmio_ctx;
+
+/**
+ * Increment the expected count of register writes by `value`.
+ *
+ * This macro is preferred over `sec_mmio_write_increment()` as it doesn't
+ * require a function call to update the expected number of writes stored in
+ * `sec_mmio_ctx`.
+ *
+ * @param value The expected write count increment.
+ */
+#define SEC_MMIO_WRITE_INCREMENT(value)           \
+  do {                                            \
+    sec_mmio_ctx.expected_write_count += (value); \
+  } while (0);
+
+/**
+ * Assert macro used to cross-reference exported sec_mmio expected write counts
+ * to their respective functions.
+ */
+#define SEC_MMIO_ASSERT_WRITE_INCREMENT(enum_val, expected) \
+  static_assert(enum_val == expected, "Unexpected value for " #enum_val);
+
 /**
  * Initializes the module.
  *
diff --git a/sw/device/silicon_creator/lib/base/sec_mmio_unittest.cc b/sw/device/silicon_creator/lib/base/sec_mmio_unittest.cc
index 2f905d0..619fe07 100644
--- a/sw/device/silicon_creator/lib/base/sec_mmio_unittest.cc
+++ b/sw/device/silicon_creator/lib/base/sec_mmio_unittest.cc
@@ -12,11 +12,6 @@
 #include "sw/device/silicon_creator/lib/base/mock_abs_mmio.h"
 #include "sw/device/silicon_creator/lib/error.h"
 
-extern "C" {
-// Declared in the sec_mmio module.
-extern sec_mmio_ctx_t sec_mmio_ctx;
-}
-
 namespace sec_mmio_unittest {
 namespace {
 using ::testing::Each;
@@ -26,7 +21,7 @@
 class SecMmioTest : public mask_rom_test::MaskRomTest {
  protected:
   void SetUp() override { sec_mmio_init(); }
-  sec_mmio_ctx_t *ctx_ = &::sec_mmio_ctx;
+  volatile sec_mmio_ctx_t *ctx_ = &::sec_mmio_ctx;
   mask_rom_test::MockAbsMmio mmio_;
 };