GPIO Pulse Before Benchmark Run

Edit kelvin benchmark to set GPIO high for duration of benchmark
This can be used to synchronize/ trim kibble power  measurements to the
approximate duration of a benchmark test.

Change-Id: I04480f49cf700cc39405080ff491fab81b269ef4
diff --git a/benchmarks/benchmark_sec.c b/benchmarks/benchmark_sec.c
index 251bd08..be05531 100644
--- a/benchmarks/benchmark_sec.c
+++ b/benchmarks/benchmark_sec.c
@@ -20,6 +20,7 @@
 #include "sw/device/lib/dif/dif_pinmux.h"
 #include "sw/device/lib/dif/dif_rv_plic.h"
 #include "sw/device/lib/dif/dif_smc_ctrl.h"
+#include "sw/device/lib/dif/dif_tlul_mailbox.h"
 #include "sw/device/lib/dif/dif_uart.h"
 #include "sw/device/lib/runtime/hart.h"
 #include "sw/device/lib/runtime/irq.h"
@@ -31,6 +32,8 @@
 #define STRINGIZE(x) #x
 #define STR(x) STRINGIZE(x)
 
+#define TRIGGER_GPIO 16
+
 // In order to include the model data generate from Bazel, include the header
 // using the name passed as a macro. For some reason this binary (vs Kelvin)
 // adds space when concatinating so use the model format -smc_bin.h.
@@ -39,12 +42,41 @@
 #define SMC_BINARY STR(SMC_BINARY_DIRECTORY/BENCHMARK_NAME-SMC_BINARY_TYPE)
 #include SMC_BINARY
 
+static dif_gpio_t gpio;
+static dif_rv_plic_t plic_sec;
+static dif_tlul_mailbox_t tlul_mailbox;
 static dif_pinmux_t pinmux;
 static dif_smc_ctrl_t smc_ctrl;
 static dif_uart_t uart;
 
 OTTF_DEFINE_TEST_CONFIG();
 
+void ottf_external_isr(void) {
+  uint32_t rx;
+  dif_rv_plic_irq_id_t plic_irq_id;
+
+  CHECK_DIF_OK(dif_rv_plic_irq_claim(&plic_sec, kTopMatchaPlicTargetIbex0,
+                                     &plic_irq_id));
+  top_matcha_plic_peripheral_t peripheral_id =
+      top_matcha_plic_interrupt_for_peripheral[plic_irq_id];
+
+  switch (peripheral_id) {
+    case kTopMatchaPlicPeripheralTlulMailboxSec: {
+      CHECK_DIF_OK(dif_tlul_mailbox_irq_acknowledge(&tlul_mailbox,
+                                                    kDifTlulMailboxIrqRtirq));
+      CHECK_DIF_OK(dif_tlul_mailbox_read_message(&tlul_mailbox, &rx));
+      CHECK_DIF_OK(dif_gpio_write(&gpio, TRIGGER_GPIO, rx));
+      break;
+    }
+    default:
+      LOG_FATAL("Unhandled interrupt");
+      break;
+  }
+
+  CHECK_DIF_OK(dif_rv_plic_irq_complete(&plic_sec, kTopMatchaPlicTargetIbex0,
+                                        plic_irq_id));
+}
+
 void _ottf_main(void) {
   // Initialize the UART to enable logging for non-DV simulation platforms.
   if (kDeviceType != kDeviceSimDV) {
@@ -56,6 +88,19 @@
   CHECK_DIF_OK(dif_smc_ctrl_init(
       mmio_region_from_addr(TOP_MATCHA_SMC_CTRL_BASE_ADDR), &smc_ctrl));
 
+// PinMux: J52.5 for Sparrow (IOR7) :: PMOD3.7 on Nexus (IOD4)
+#if defined(MATCHA_SPARROW)
+  CHECK_DIF_OK(dif_pinmux_output_select(&pinmux, kTopMatchaPinmuxMioOutIor7,
+                                        kTopMatchaPinmuxOutselGpioGpio16));
+#else
+  CHECK_DIF_OK(dif_pinmux_output_select(&pinmux, kTopMatchaPinmuxMioOutIod4,
+                                        kTopMatchaPinmuxOutselGpioGpio16));
+#endif
+  CHECK_DIF_OK(
+      dif_gpio_init(mmio_region_from_addr(TOP_MATCHA_GPIO_BASE_ADDR), &gpio));
+  CHECK_DIF_OK(
+      dif_gpio_output_set_enabled(&gpio, TRIGGER_GPIO, kDifToggleEnabled));
+
   LOG_INFO("Loading Kelvin binary");
   spi_flash_init();
   CHECK_DIF_OK(load_file_from_tar(
@@ -66,6 +111,24 @@
     LOG_INFO("Loading SMC binary");
     memcpy((void*)TOP_MATCHA_RAM_SMC_BASE_ADDR, smc_bin, smc_bin_len);
   }
+
+  // Enable Mailbox Interrupt
+  CHECK_DIF_OK(dif_tlul_mailbox_init(
+      mmio_region_from_addr(TOP_MATCHA_TLUL_MAILBOX_SEC_BASE_ADDR),
+      &tlul_mailbox));
+  CHECK_DIF_OK(dif_tlul_mailbox_irq_set_enabled(
+      &tlul_mailbox, kDifTlulMailboxIrqRtirq, kDifToggleEnabled));
+
+  CHECK_DIF_OK(dif_rv_plic_init(
+      mmio_region_from_addr(TOP_MATCHA_RV_PLIC_BASE_ADDR), &plic_sec));
+  CHECK_DIF_OK(dif_rv_plic_irq_set_enabled(
+      &plic_sec, kTopMatchaPlicIrqIdTlulMailboxSecRtirq,
+      kTopMatchaPlicTargetIbex0, kDifToggleEnabled));
+  CHECK_DIF_OK(dif_rv_plic_irq_set_priority(
+      &plic_sec, kTopMatchaPlicIrqIdTlulMailboxSecRtirq, 1));
+  irq_global_ctrl(true);
+  irq_external_ctrl(true);
+
   CHECK_DIF_OK(dif_smc_ctrl_set_en(&smc_ctrl));
   irq_global_ctrl(true);
   irq_external_ctrl(true);
diff --git a/benchmarks/benchmark_smc.c b/benchmarks/benchmark_smc.c
index ca0c1f6..887f00c 100644
--- a/benchmarks/benchmark_smc.c
+++ b/benchmarks/benchmark_smc.c
@@ -23,6 +23,7 @@
 #include "sw/device/lib/dif/dif_ml_top.h"
 #include "sw/device/lib/dif/dif_rv_plic.h"
 #include "sw/device/lib/dif/dif_rv_timer.h"
+#include "sw/device/lib/dif/dif_tlul_mailbox.h"
 #include "sw/device/lib/runtime/hart.h"
 #include "sw/device/lib/runtime/irq.h"
 #include "sw/device/lib/runtime/log.h"
@@ -41,6 +42,7 @@
 static dif_rv_timer_t rv_timer;
 static dif_uart_t smc_uart;
 static dif_ml_top_t ml_top;
+static dif_tlul_mailbox_t tlul_mailbox;
 
 volatile bool ml_top_finish_done = false;
 
@@ -113,9 +115,18 @@
   irq_global_ctrl(true);
   irq_external_ctrl(true);
 
+  // Configure Mailbox.
+  CHECK_DIF_OK(dif_tlul_mailbox_init(
+      mmio_region_from_addr(TOP_MATCHA_TLUL_MAILBOX_SMC_BASE_ADDR),
+      &tlul_mailbox));
+  {
+    uint32_t msg = 1;
+    CHECK_DIF_OK(dif_tlul_mailbox_send_message(&tlul_mailbox, &msg));
+  }
+
   LOG_INFO("========== Begin Benchmark (%s) ==========", STR(BENCHMARK_NAME));
 
-  // start kelvin
+  // start kelvin and pulse GPIO for data logger (Kibble)
   ml_top_finish_done = false;
   uint64_t timer_start;
   CHECK_DIF_OK(dif_rv_timer_counter_read(&rv_timer, 0, &timer_start));
@@ -142,6 +153,13 @@
   uint64_t average_cycles = udiv64_slow(cycles, iterations, NULL);
   uint64_t wall_time_us = timer_finish - timer_start;
   uint64_t average_wall_time_us = udiv64_slow(wall_time_us, iterations, NULL);
+
+  // End Test Pulse
+  {
+    uint32_t msg = 0;
+    CHECK_DIF_OK(dif_tlul_mailbox_send_message(&tlul_mailbox, &msg));
+  }
+
   LOG_INFO("Iterations: %d", iterations);
   _print64("Total Cycles", cycles);
   _print64("Average Cycles per Iteration", average_cycles);