[dif/rv_timer] Integrate autogen'd DIF artifacts into src tree.

This commit partially addresses #8142. Specifically it:
1. deprecates existing (manually implemented) **RV Timer**
   specific DIF return codes, toggle types, and params,
2. integrates the auto-generated **RV Timer** DIFs into meson build
   targets,
3. refactors all existing source code to make use of the new shared DIF
   types and error codes, and

Signed-off-by: Timothy Trippel <ttrippel@google.com>
diff --git a/hw/top_englishbreakfast/util/sw_sources.patch b/hw/top_englishbreakfast/util/sw_sources.patch
index 6a43b38..0ce987b 100644
--- a/hw/top_englishbreakfast/util/sw_sources.patch
+++ b/hw/top_englishbreakfast/util/sw_sources.patch
@@ -75,7 +75,7 @@
      simple_serial_process_packet();
    }
 diff --git a/sw/device/sca/lib/sca.c b/sw/device/sca/lib/sca.c
-index 592e09547..37a172411 100644
+index 770b830eb..ec3e3be22 100644
 --- a/sw/device/sca/lib/sca.c
 +++ b/sw/device/sca/lib/sca.c
 @@ -56,7 +56,6 @@ enum {
@@ -102,7 +102,7 @@
  }
 
  /**
-@@ -148,25 +143,6 @@ void handler_irq_timer(void) {
+@@ -147,25 +142,6 @@ void handler_irq_timer(void) {
   * @param disable Set of peripherals to disable.
   */
  void sca_disable_peripherals(sca_peripherals_t disable) {
@@ -128,7 +128,7 @@
    // Disable HMAC, KMAC, OTBN and USB clocks through CLKMGR DIF.
    dif_clkmgr_t clkmgr;
    IGNORE_RESULT(dif_clkmgr_init(
-@@ -180,17 +156,6 @@ void sca_disable_peripherals(sca_peripherals_t disable) {
+@@ -179,17 +155,6 @@ void sca_disable_peripherals(sca_peripherals_t disable) {
      IGNORE_RESULT(dif_clkmgr_hintable_clock_set_hint(
          &clkmgr, CLKMGR_CLK_HINTS_CLK_MAIN_HMAC_HINT_BIT, kDifToggleDisabled));
    }
@@ -169,10 +169,10 @@
    CHECK_DIF_OK(
        dif_aes_init(mmio_region_from_addr(TOP_EARLGREY_AES_BASE_ADDR), &aes));
 diff --git a/sw/device/tests/meson.build b/sw/device/tests/meson.build
-index 230bbb613..5e5676718 100644
+index 770328dd9..8aaa642db 100644
 --- a/sw/device/tests/meson.build
 +++ b/sw/device/tests/meson.build
-@@ -207,7 +207,6 @@ aes_smoketest_lib = declare_dependency(
+@@ -224,7 +224,6 @@ aes_smoketest_lib = declare_dependency(
        sw_lib_dif_aes,
        sw_lib_mmio,
        sw_lib_runtime_log,
diff --git a/sw/device/lib/dif/autogen/meson.build b/sw/device/lib/dif/autogen/meson.build
index bc6544c..0766c9f 100644
--- a/sw/device/lib/dif/autogen/meson.build
+++ b/sw/device/lib/dif/autogen/meson.build
@@ -268,6 +268,20 @@
   )
 )
 
+# Autogen RV Timer DIF library
+sw_lib_dif_autogen_rv_timer = declare_dependency(
+  link_with: static_library(
+    'sw_lib_dif_autogen_rv_timer',
+    sources: [
+      hw_ip_rv_timer_reg_h,
+      'dif_rv_timer_autogen.c',
+    ],
+    dependencies: [
+      sw_lib_mmio,
+    ],
+  )
+)
+
 # Autogen SPI Device DIF library
 sw_lib_dif_autogen_spi_device = declare_dependency(
   link_with: static_library(
diff --git a/sw/device/lib/dif/dif_rv_timer.c b/sw/device/lib/dif/dif_rv_timer.c
index 2b6051e..a11315f 100644
--- a/sw/device/lib/dif/dif_rv_timer.c
+++ b/sw/device/lib/dif/dif_rv_timer.c
@@ -4,12 +4,18 @@
 
 #include "sw/device/lib/dif/dif_rv_timer.h"
 
+#include <assert.h>
 #include <stddef.h>
 
 #include "sw/device/lib/base/bitfield.h"
 
 #include "rv_timer_regs.h"  // Generated.
 
+static_assert(RV_TIMER_PARAM_N_HARTS > 0,
+              "RV Timer must support at least one hart.");
+static_assert(RV_TIMER_PARAM_N_TIMERS > 0,
+              "RV Timer must support at least one timer per hart.");
+
 /**
  * The factor to multiply by to find the registers for the Nth hart.
  *
@@ -30,16 +36,13 @@
   return kHartRegisterSpacing * hart + reg_offset;
 }
 
-dif_rv_timer_result_t dif_rv_timer_init(mmio_region_t base_addr,
-                                        dif_rv_timer_config_t config,
-                                        dif_rv_timer_t *timer_out) {
-  if (timer_out == NULL || config.hart_count < 1 ||
-      config.comparator_count < 1) {
-    return kDifRvTimerBadArg;
+dif_result_t dif_rv_timer_init(mmio_region_t base_addr,
+                               dif_rv_timer_t *timer_out) {
+  if (timer_out == NULL) {
+    return kDifBadArg;
   }
 
   timer_out->base_addr = base_addr;
-  timer_out->config = config;
 
   return dif_rv_timer_reset(timer_out);
 }
@@ -59,11 +62,11 @@
   return a;
 }
 
-dif_rv_timer_approximate_tick_params_result_t
-dif_rv_timer_approximate_tick_params(uint64_t clock_freq, uint64_t counter_freq,
-                                     dif_rv_timer_tick_params_t *out) {
+dif_result_t dif_rv_timer_approximate_tick_params(
+    uint64_t clock_freq, uint64_t counter_freq,
+    dif_rv_timer_tick_params_t *out) {
   if (out == NULL) {
-    return kDifRvTimerApproximateTickParamsBadArg;
+    return kDifBadArg;
   }
 
   // We have the following relation:
@@ -78,20 +81,20 @@
 
   if (prescale > RV_TIMER_CFG0_PRESCALE_MASK ||
       step > RV_TIMER_CFG0_STEP_MASK) {
-    return kDifRvTimerApproximateTickParamsUnrepresentable;
+    return kDifBadArg;
   }
 
   out->prescale = (uint16_t)prescale;
   out->tick_step = (uint8_t)step;
 
-  return kDifRvTimerApproximateTickParamsOk;
+  return kDifOk;
 }
 
-dif_rv_timer_result_t dif_rv_timer_set_tick_params(
-    const dif_rv_timer_t *timer, uint32_t hart_id,
-    dif_rv_timer_tick_params_t params) {
-  if (timer == NULL || hart_id >= timer->config.hart_count) {
-    return kDifRvTimerBadArg;
+dif_result_t dif_rv_timer_set_tick_params(const dif_rv_timer_t *timer,
+                                          uint32_t hart_id,
+                                          dif_rv_timer_tick_params_t params) {
+  if (timer == NULL || hart_id >= RV_TIMER_PARAM_N_HARTS) {
+    return kDifBadArg;
   }
 
   uint32_t config_value = 0;
@@ -103,37 +106,36 @@
                       reg_for_hart(hart_id, RV_TIMER_CFG0_REG_OFFSET),
                       config_value);
 
-  return kDifRvTimerOk;
+  return kDifOk;
 }
 
-dif_rv_timer_result_t dif_rv_timer_counter_set_enabled(
-    const dif_rv_timer_t *timer, uint32_t hart_id,
-    dif_rv_timer_enabled_t state) {
-  if (timer == NULL || hart_id >= timer->config.hart_count) {
-    return kDifRvTimerBadArg;
+dif_result_t dif_rv_timer_counter_set_enabled(const dif_rv_timer_t *timer,
+                                              uint32_t hart_id,
+                                              dif_toggle_t state) {
+  if (timer == NULL || hart_id >= RV_TIMER_PARAM_N_HARTS) {
+    return kDifBadArg;
   }
 
   switch (state) {
-    case kDifRvTimerEnabled:
+    case kDifToggleEnabled:
       mmio_region_nonatomic_set_bit32(timer->base_addr,
                                       RV_TIMER_CTRL_REG_OFFSET, hart_id);
       break;
-    case kDifRvTimerDisabled:
+    case kDifToggleDisabled:
       mmio_region_nonatomic_clear_bit32(timer->base_addr,
                                         RV_TIMER_CTRL_REG_OFFSET, hart_id);
       break;
     default:
-      return kDifRvTimerBadArg;
+      return kDifBadArg;
   }
 
-  return kDifRvTimerOk;
+  return kDifOk;
 }
 
-dif_rv_timer_result_t dif_rv_timer_counter_read(const dif_rv_timer_t *timer,
-                                                uint32_t hart_id,
-                                                uint64_t *out) {
-  if (timer == NULL || out == NULL || hart_id >= timer->config.hart_count) {
-    return kDifRvTimerBadArg;
+dif_result_t dif_rv_timer_counter_read(const dif_rv_timer_t *timer,
+                                       uint32_t hart_id, uint64_t *out) {
+  if (timer == NULL || out == NULL || hart_id >= RV_TIMER_PARAM_N_HARTS) {
+    return kDifBadArg;
   }
 
   // We need to read a monotonically increasing, volatile uint64. To do so,
@@ -154,16 +156,15 @@
 
     if (upper == overflow_check) {
       *out = (((uint64_t)upper) << 32) | lower;
-      return kDifRvTimerOk;
+      return kDifOk;
     }
   }
 }
 
-dif_rv_timer_result_t dif_rv_timer_counter_write(const dif_rv_timer_t *timer,
-                                                 uint32_t hart_id,
-                                                 uint64_t count) {
-  if (timer == NULL || hart_id >= timer->config.hart_count) {
-    return kDifRvTimerBadArg;
+dif_result_t dif_rv_timer_counter_write(const dif_rv_timer_t *timer,
+                                        uint32_t hart_id, uint64_t count) {
+  if (timer == NULL || hart_id >= RV_TIMER_PARAM_N_HARTS) {
+    return kDifBadArg;
   }
 
   // Disable the counter.
@@ -186,15 +187,14 @@
   // Re-enable the counter (if it was previously enabled).
   mmio_region_write32(timer->base_addr, RV_TIMER_CTRL_REG_OFFSET, ctrl_reg);
 
-  return kDifRvTimerOk;
+  return kDifOk;
 }
 
-dif_rv_timer_result_t dif_rv_timer_arm(const dif_rv_timer_t *timer,
-                                       uint32_t hart_id, uint32_t comp_id,
-                                       uint64_t threshold) {
-  if (timer == NULL || hart_id >= timer->config.hart_count ||
-      comp_id >= timer->config.comparator_count) {
-    return kDifRvTimerBadArg;
+dif_result_t dif_rv_timer_arm(const dif_rv_timer_t *timer, uint32_t hart_id,
+                              uint32_t comp_id, uint64_t threshold) {
+  if (timer == NULL || hart_id >= RV_TIMER_PARAM_N_HARTS ||
+      comp_id >= RV_TIMER_PARAM_N_TIMERS) {
+    return kDifBadArg;
   }
 
   uint32_t lower = threshold;
@@ -217,7 +217,7 @@
   // Finish writing the new value; this may set off an alarm immediately.
   mmio_region_write32(timer->base_addr, upper_reg, upper);
 
-  return kDifRvTimerOk;
+  return kDifOk;
 }
 
 /**
@@ -252,140 +252,28 @@
   return reg_for_hart(hart_id, reg_offset) + extra_comparator_offset;
 }
 
-dif_rv_timer_result_t dif_rv_timer_irq_enable(const dif_rv_timer_t *timer,
-                                              uint32_t hart_id,
-                                              uint32_t comp_id,
-                                              dif_rv_timer_enabled_t state) {
-  if (timer == NULL || hart_id >= timer->config.hart_count ||
-      comp_id >= timer->config.comparator_count) {
-    return kDifRvTimerBadArg;
-  }
-
-  ptrdiff_t reg = irq_reg_for_hart(hart_id, timer->config.comparator_count,
-                                   RV_TIMER_INTR_ENABLE0_REG_OFFSET);
-
-  switch (state) {
-    case kDifRvTimerEnabled:
-      mmio_region_nonatomic_set_bit32(timer->base_addr, reg, comp_id);
-      break;
-    case kDifRvTimerDisabled:
-      mmio_region_nonatomic_clear_bit32(timer->base_addr, reg, comp_id);
-      break;
-    default:
-      return kDifRvTimerBadArg;
-  }
-
-  return kDifRvTimerOk;
-}
-
-dif_rv_timer_result_t dif_rv_timer_irq_get(const dif_rv_timer_t *timer,
-                                           uint32_t hart_id, uint32_t comp_id,
-                                           bool *flag_out) {
-  if (timer == NULL || flag_out == NULL ||
-      hart_id >= timer->config.hart_count ||
-      comp_id >= timer->config.comparator_count) {
-    return kDifRvTimerBadArg;
-  }
-
-  ptrdiff_t reg = irq_reg_for_hart(hart_id, timer->config.comparator_count,
-                                   RV_TIMER_INTR_STATE0_REG_OFFSET);
-
-  *flag_out = mmio_region_get_bit32(timer->base_addr, reg, comp_id);
-
-  return kDifRvTimerOk;
-}
-
-dif_rv_timer_result_t dif_rv_timer_irq_clear(const dif_rv_timer_t *timer,
-                                             uint32_t hart_id,
-                                             uint32_t comp_id) {
-  if (timer == NULL || hart_id >= timer->config.hart_count ||
-      comp_id >= timer->config.comparator_count) {
-    return kDifRvTimerBadArg;
-  }
-
-  ptrdiff_t reg = irq_reg_for_hart(hart_id, timer->config.comparator_count,
-                                   RV_TIMER_INTR_STATE0_REG_OFFSET);
-
-  mmio_region_write32(timer->base_addr, reg, 1 << comp_id);
-
-  return kDifRvTimerOk;
-}
-
-dif_rv_timer_result_t dif_rv_timer_irq_disable(const dif_rv_timer_t *timer,
-                                               uint32_t hart_id,
-                                               uint32_t *state) {
-  if (timer == NULL || hart_id >= timer->config.hart_count) {
-    return kDifRvTimerBadArg;
-  }
-
-  ptrdiff_t reg = irq_reg_for_hart(hart_id, timer->config.comparator_count,
-                                   RV_TIMER_INTR_ENABLE0_REG_OFFSET);
-
-  if (state != NULL) {
-    *state = mmio_region_read32(timer->base_addr, reg);
-  }
-
-  mmio_region_write32(timer->base_addr, reg, 0);
-
-  return kDifRvTimerOk;
-}
-
-dif_rv_timer_result_t dif_rv_timer_irq_restore(const dif_rv_timer_t *timer,
-                                               uint32_t hart_id,
-                                               uint32_t state) {
-  if (timer == NULL || hart_id >= timer->config.hart_count) {
-    return kDifRvTimerBadArg;
-  }
-
-  ptrdiff_t reg = irq_reg_for_hart(hart_id, timer->config.comparator_count,
-                                   RV_TIMER_INTR_ENABLE0_REG_OFFSET);
-
-  mmio_region_write32(timer->base_addr, reg, state);
-
-  return kDifRvTimerOk;
-}
-
-dif_rv_timer_result_t dif_rv_timer_irq_force(const dif_rv_timer_t *timer,
-                                             uint32_t hart_id,
-                                             uint32_t comp_id) {
-  if (timer == NULL || hart_id >= timer->config.hart_count ||
-      comp_id >= timer->config.comparator_count) {
-    return kDifRvTimerBadArg;
-  }
-
-  ptrdiff_t reg = irq_reg_for_hart(hart_id, timer->config.comparator_count,
-                                   RV_TIMER_INTR_TEST0_REG_OFFSET);
-
-  mmio_region_write32(timer->base_addr, reg, 1 << comp_id);
-
-  return kDifRvTimerOk;
-}
-
-dif_rv_timer_result_t dif_rv_timer_reset(const dif_rv_timer_t *timer) {
+dif_result_t dif_rv_timer_reset(const dif_rv_timer_t *timer) {
   if (timer == NULL) {
-    return kDifRvTimerBadArg;
+    return kDifBadArg;
   }
 
   // Disable all counters.
   mmio_region_write32(timer->base_addr, RV_TIMER_CTRL_REG_OFFSET, 0x0);
 
-  for (uint32_t hart_id = 0; hart_id < timer->config.hart_count; ++hart_id) {
+  for (uint32_t hart_id = 0; hart_id < RV_TIMER_PARAM_N_HARTS; ++hart_id) {
     // Clear and disable all interrupts.
-    ptrdiff_t irq_status =
-        irq_reg_for_hart(hart_id, timer->config.comparator_count,
-                         RV_TIMER_INTR_STATE0_REG_OFFSET);
-    ptrdiff_t irq_enable =
-        irq_reg_for_hart(hart_id, timer->config.comparator_count,
-                         RV_TIMER_INTR_ENABLE0_REG_OFFSET);
+    ptrdiff_t irq_status = irq_reg_for_hart(hart_id, RV_TIMER_PARAM_N_TIMERS,
+                                            RV_TIMER_INTR_STATE0_REG_OFFSET);
+    ptrdiff_t irq_enable = irq_reg_for_hart(hart_id, RV_TIMER_PARAM_N_TIMERS,
+                                            RV_TIMER_INTR_ENABLE0_REG_OFFSET);
     mmio_region_write32(timer->base_addr, irq_enable, 0x0);
     mmio_region_write32(timer->base_addr, irq_status, UINT32_MAX);
 
     // Reset all comparators to their default all-ones state.
-    for (uint32_t comp_id = 0; comp_id < timer->config.comparator_count;
-         ++comp_id) {
-      dif_rv_timer_result_t error =
+    for (uint32_t comp_id = 0; comp_id < RV_TIMER_PARAM_N_TIMERS; ++comp_id) {
+      dif_result_t error =
           dif_rv_timer_arm(timer, hart_id, comp_id, UINT64_MAX);
-      if (error != kDifRvTimerOk) {
+      if (error != kDifOk) {
         return error;
       }
     }
@@ -399,5 +287,5 @@
         reg_for_hart(hart_id, RV_TIMER_TIMER_V_UPPER0_REG_OFFSET), 0x0);
   }
 
-  return kDifRvTimerOk;
+  return kDifOk;
 }
diff --git a/sw/device/lib/dif/dif_rv_timer.h b/sw/device/lib/dif/dif_rv_timer.h
index f73b5a9..0b2d3c1 100644
--- a/sw/device/lib/dif/dif_rv_timer.h
+++ b/sw/device/lib/dif/dif_rv_timer.h
@@ -13,20 +13,15 @@
 #include <stdint.h>
 
 #include "sw/device/lib/base/mmio.h"
+#include "sw/device/lib/dif/dif_base.h"
+
+#include "sw/device/lib/dif/autogen/dif_rv_timer_autogen.h"
 
 #ifdef __cplusplus
 extern "C" {
 #endif  // __cplusplus
 
 /**
- * Represents an "enabled" state for a timer.
- */
-typedef enum dif_rv_timer_enabled {
-  kDifRvTimerDisabled = 0,
-  kDifRvTimerEnabled,
-} dif_rv_timer_enabled_t;
-
-/**
  * Represents timekeeping parameters for a particular timer.
  */
 typedef struct dif_rv_timer_tick_params {
@@ -63,29 +58,6 @@
 } dif_rv_timer_tick_params_t;
 
 /**
- * Represents the result of an RV timer operation..
- */
-typedef enum dif_rv_timer_result {
-  kDifRvTimerOk = 0,
-  kDifRvTimerBadArg = 1,
-  kDifRvTimerError = 2,
-} dif_rv_timer_result_t;
-
-/**
- * Errors returned by `dif_rv_timer_approximate_tick_params()`.
- */
-typedef enum dif_rv_timer_approximate_tick_params_result {
-  kDifRvTimerApproximateTickParamsOk = kDifRvTimerOk,
-  kDifRvTimerApproximateTickParamsBadArg = kDifRvTimerBadArg,
-  kDifRvTimerApproximateTickParamsError = kDifRvTimerError,
-  /**
-   * Indicates that the requested counter frequency cannot be represented
-   * without loss in precission.
-   */
-  kDifRvTimerApproximateTickParamsUnrepresentable,
-} dif_rv_timer_approximate_tick_params_result_t;
-
-/**
  * Generates an aproximate `dif_rv_timer_tick_params_t` given the device
  * clock frequency and desired counter frequency (both given in Hertz).
  *
@@ -108,40 +80,9 @@
  *         counter frequency.
  * @return The result of the operation.
  */
-dif_rv_timer_approximate_tick_params_result_t
-dif_rv_timer_approximate_tick_params(uint64_t clock_freq, uint64_t counter_freq,
-                                     dif_rv_timer_tick_params_t *out);
-/**
- * Configuration for initializing the RISC-V timer device.
- */
-typedef struct dif_rv_timer_config {
-  /**
-   * The number of harts that this device supports time counters for.
-   * Must be at least one.
-   *
-   * This value is determined entirely by the hardware configuration.
-   */
-  uint32_t hart_count;
-
-  /**
-   * The number of comparators (i.e, timers that can be set) associated
-   * with each hart. Must be at least one.
-   *
-   * This value is determined entirely by the hardware configuration.
-   */
-  uint32_t comparator_count;
-} dif_rv_timer_config_t;
-
-/**
- * State for a RISC-V timer, associated with a particular hardware thread.
- *
- * Its member variables should be considered private, and are only provided so
- * that callers can allocate it.
- */
-typedef struct dif_rv_timer {
-  mmio_region_t base_addr;
-  dif_rv_timer_config_t config;
-} dif_rv_timer_t;
+dif_result_t dif_rv_timer_approximate_tick_params(
+    uint64_t clock_freq, uint64_t counter_freq,
+    dif_rv_timer_tick_params_t *out);
 
 /**
  * Initialize a RISC-V timer device with the given configuration.
@@ -150,13 +91,11 @@
  * each be configured and turned on manually after this function returns.
  *
  * @param base_addr MMIO region for the device hardware registers.
- * @param config Configuration for initializing a particular timer.
  * @param[out] timer_out The timer device.
  * @return The result of the operation.
  */
-dif_rv_timer_result_t dif_rv_timer_init(mmio_region_t base_addr,
-                                        dif_rv_timer_config_t config,
-                                        dif_rv_timer_t *timer_out);
+dif_result_t dif_rv_timer_init(mmio_region_t base_addr,
+                               dif_rv_timer_t *timer_out);
 
 /**
  * Completely resets a timer device, disabling all IRQs, counters, and
@@ -165,7 +104,7 @@
  * @param timer A timer device.
  * @return The result of the operation.
  */
-dif_rv_timer_result_t dif_rv_timer_reset(const dif_rv_timer_t *timer);
+dif_result_t dif_rv_timer_reset(const dif_rv_timer_t *timer);
 
 /**
  * Configures the tick params for a particular hart's counter.
@@ -180,9 +119,9 @@
  * @param params The timing parameters.
  * @return The result of the operation.
  */
-dif_rv_timer_result_t dif_rv_timer_set_tick_params(
-    const dif_rv_timer_t *timer, uint32_t hart_id,
-    dif_rv_timer_tick_params_t params);
+dif_result_t dif_rv_timer_set_tick_params(const dif_rv_timer_t *timer,
+                                          uint32_t hart_id,
+                                          dif_rv_timer_tick_params_t params);
 
 /**
  * Starts or stops a particular hart's counter.
@@ -195,9 +134,9 @@
  * @param state The new enablement state.
  * @return The result of the operation.
  */
-dif_rv_timer_result_t dif_rv_timer_counter_set_enabled(
-    const dif_rv_timer_t *timer, uint32_t hart_id,
-    dif_rv_timer_enabled_t state);
+dif_result_t dif_rv_timer_counter_set_enabled(const dif_rv_timer_t *timer,
+                                              uint32_t hart_id,
+                                              dif_toggle_t state);
 
 /**
  * Reads the current value on a particular hart's timer.
@@ -207,9 +146,8 @@
  * @param[out] out The counter value.
  * @return The result of the operation.
  */
-dif_rv_timer_result_t dif_rv_timer_counter_read(const dif_rv_timer_t *timer,
-                                                uint32_t hart_id,
-                                                uint64_t *out);
+dif_result_t dif_rv_timer_counter_read(const dif_rv_timer_t *timer,
+                                       uint32_t hart_id, uint64_t *out);
 
 /**
  * Writes the given value to a particular hart's timer.
@@ -219,9 +157,8 @@
  * @param count The counter value to write.
  * @return The result of the operation.
  */
-dif_rv_timer_result_t dif_rv_timer_counter_write(const dif_rv_timer_t *timer,
-                                                 uint32_t hart_id,
-                                                 uint64_t count);
+dif_result_t dif_rv_timer_counter_write(const dif_rv_timer_t *timer,
+                                        uint32_t hart_id, uint64_t count);
 
 /**
  * Arms the timer to go off once the counter value is greater than
@@ -251,88 +188,8 @@
  * @param threshold The value to go off at.
  * @return The result of the operation.
  */
-dif_rv_timer_result_t dif_rv_timer_arm(const dif_rv_timer_t *timer,
-                                       uint32_t hart_id, uint32_t comp_id,
-                                       uint64_t threshold);
-
-/**
- * Enables or disables a particular timer's IRQ. That is, this function controls
- * whether or not an IRQ is fired when the timer reaches its configured
- * threshold.
- *
- * @param timer A timer device.
- * @param hart_id The hart counter associated with the timer.
- * @param comp_id The comparator associated with the timer.
- * @param state The desired status.
- * @return the result of the operation.
- */
-dif_rv_timer_result_t dif_rv_timer_irq_enable(const dif_rv_timer_t *timer,
-                                              uint32_t hart_id,
-                                              uint32_t comp_id,
-                                              dif_rv_timer_enabled_t state);
-
-/**
- * Returns whether the IRQ for a particular timer is currently being serviced.
- *
- * @param timer A timer device.
- * @param hart_id The hart counter associated with the timer.
- * @param comp_id The comparator associated with the timer.
- * @param[out] flag_out The interrupt status.
- * @return the result of the operation.
- */
-dif_rv_timer_result_t dif_rv_timer_irq_get(const dif_rv_timer_t *timer,
-                                           uint32_t hart_id, uint32_t comp_id,
-                                           bool *flag_out);
-
-/**
- * Clears the IRQ for a particular timer.
- *
- * @param timer A timer device.
- * @param hart_id The hart counter associated with the timer.
- * @param comp_id The comparator associated with the timer.
- * @return the result of the operation.
- */
-dif_rv_timer_result_t dif_rv_timer_irq_clear(const dif_rv_timer_t *timer,
-                                             uint32_t hart_id,
-                                             uint32_t comp_id);
-
-/**
- * Forces the IRQ for a particular timer to fire.
- *
- * @param timer A timer device.
- * @param hart_id The hart counter associated with the timer.
- * @param comp_id The comparator associated with the timer.
- * @return the result of the operation.
- */
-dif_rv_timer_result_t dif_rv_timer_irq_force(const dif_rv_timer_t *timer,
-                                             uint32_t hart_id,
-                                             uint32_t comp_id);
-
-/**
- * Disables all IRQs for a particular hart.
- *
- * Optionally returns a `state` value containing the previous itnerrupt state.
- * `state` may be NULL. See `dif_rv_timer_irq_restore()`.
- *
- * @param timer a timer device.
- * @param[out] state IRQ state information for use with
- *                   `dif_rv_timer_irq_restore`.
- * @return the result of the operation.
- */
-dif_rv_timer_result_t dif_rv_timer_irq_disable(const dif_rv_timer_t *timer,
-                                               uint32_t hart_id,
-                                               uint32_t *state);
-
-/**
- * Restores IRQ state for a particular hart.
- *
- * @param timer a timer device.
- * @param state IRQ state information to restore.
- * @return the result of the operation.
- */
-dif_rv_timer_result_t dif_rv_timer_irq_restore(const dif_rv_timer_t *timer,
-                                               uint32_t hart_id,
-                                               uint32_t state);
+dif_result_t dif_rv_timer_arm(const dif_rv_timer_t *timer, uint32_t hart_id,
+                              uint32_t comp_id, uint64_t threshold);
 
 #ifdef __cplusplus
 }  // extern "C"
diff --git a/sw/device/lib/dif/dif_rv_timer_unittest.cc b/sw/device/lib/dif/dif_rv_timer_unittest.cc
index 6b81809..5c71591 100644
--- a/sw/device/lib/dif/dif_rv_timer_unittest.cc
+++ b/sw/device/lib/dif/dif_rv_timer_unittest.cc
@@ -43,7 +43,7 @@
 constexpr uint32_t kFastTimer = 120'000'000;  // 120 MHz
 constexpr uint32_t kSluggishTimer = 3;        // 3 Hz
 
-TEST(ApproximateParamsTest, Baseline) {
+TEST(ApproximateParamsTest, Success) {
   // The timer frequency devices the clock speed, so their quotient minus 1 is
   // the prescale.
   dif_rv_timer_tick_params_t params, expected = {
@@ -52,7 +52,7 @@
                                      };
   EXPECT_EQ(
       dif_rv_timer_approximate_tick_params(kClockSpeed, kSlowTimer, &params),
-      kDifRvTimerOk);
+      kDifOk);
   EXPECT_EQ(params, expected);
 }
 
@@ -64,7 +64,7 @@
                                      };
   EXPECT_EQ(
       dif_rv_timer_approximate_tick_params(kClockSpeed, kFastTimer, &params),
-      kDifRvTimerOk);
+      kDifOk);
   EXPECT_EQ(params, expected);
 }
 
@@ -75,7 +75,7 @@
   dif_rv_timer_tick_params_t params;
   EXPECT_EQ(dif_rv_timer_approximate_tick_params(kFastClockSpeed,
                                                  kSluggishTimer, &params),
-            kDifRvTimerApproximateTickParamsUnrepresentable);
+            kDifBadArg);
 }
 
 TEST(ApproximateParamsTest, UnrepresenableTooFast) {
@@ -84,23 +84,18 @@
   dif_rv_timer_tick_params_t params;
   EXPECT_EQ(dif_rv_timer_approximate_tick_params(kSlowClockSpeed, kFastTimer,
                                                  &params),
-            kDifRvTimerApproximateTickParamsUnrepresentable);
+            kDifBadArg);
 }
 
 TEST(ApproximateParamsTest, NullArgs) {
   EXPECT_EQ(dif_rv_timer_approximate_tick_params(kSlowClockSpeed, kFastTimer,
                                                  nullptr),
-            kDifRvTimerBadArg);
+            kDifBadArg);
 }
 
 class TimerTest : public testing::Test, public MmioTest {
  protected:
-  dif_rv_timer_t MakeTimer(dif_rv_timer_config_t config) {
-    return {
-        .base_addr = dev().region(),
-        .config = config,
-    };
-  }
+  dif_rv_timer_t rv_timer_ = {.base_addr = dev().region()};
 };
 
 // Copy of `reg_for_hart()` in the C translation unit under test.
@@ -120,7 +115,7 @@
 
 class InitTest : public TimerTest {};
 
-TEST_F(InitTest, OneEach) {
+TEST_F(InitTest, Success) {
   EXPECT_WRITE32(RV_TIMER_CTRL_REG_OFFSET, 0x0);
 
   EXPECT_WRITE32(IrqRegForHart(0, 1, RV_TIMER_INTR_ENABLE0_REG_OFFSET), 0x0);
@@ -134,292 +129,128 @@
   EXPECT_WRITE32(RegForHart(0, RV_TIMER_TIMER_V_LOWER0_REG_OFFSET), 0x0);
   EXPECT_WRITE32(RegForHart(0, RV_TIMER_TIMER_V_UPPER0_REG_OFFSET), 0x0);
 
-  dif_rv_timer timer;
-  EXPECT_EQ(dif_rv_timer_init(dev().region(),
-                              {
-                                  .hart_count = 1,
-                                  .comparator_count = 1,
-                              },
-                              &timer),
-            kDifRvTimerOk);
-}
-
-TEST_F(InitTest, FourCmps) {
-  EXPECT_WRITE32(RV_TIMER_CTRL_REG_OFFSET, 0x0);
-
-  EXPECT_WRITE32(IrqRegForHart(0, 4, RV_TIMER_INTR_ENABLE0_REG_OFFSET), 0x0);
-  EXPECT_WRITE32(IrqRegForHart(0, 4, RV_TIMER_INTR_STATE0_REG_OFFSET),
-                 kAllOnes);
-
-  for (ptrdiff_t cmp_offset = 0; cmp_offset < 32; cmp_offset += 8) {
-    EXPECT_WRITE32(
-        RegForHart(0, RV_TIMER_COMPARE_UPPER0_0_REG_OFFSET) + cmp_offset,
-        kAllOnes);
-    EXPECT_WRITE32(
-        RegForHart(0, RV_TIMER_COMPARE_LOWER0_0_REG_OFFSET) + cmp_offset,
-        kAllOnes);
-    EXPECT_WRITE32(
-        RegForHart(0, RV_TIMER_COMPARE_UPPER0_0_REG_OFFSET) + cmp_offset,
-        kAllOnes);
-  }
-
-  EXPECT_WRITE32(RegForHart(0, RV_TIMER_TIMER_V_LOWER0_REG_OFFSET), 0x0);
-  EXPECT_WRITE32(RegForHart(0, RV_TIMER_TIMER_V_UPPER0_REG_OFFSET), 0x0);
-
-  dif_rv_timer timer;
-  EXPECT_EQ(dif_rv_timer_init(dev().region(),
-                              {
-                                  .hart_count = 1,
-                                  .comparator_count = 4,
-                              },
-                              &timer),
-            kDifRvTimerOk);
-}
-
-TEST_F(InitTest, FourEach) {
-  EXPECT_WRITE32(RV_TIMER_CTRL_REG_OFFSET, 0x0);
-
-  for (uint32_t hart = 0; hart < 4; ++hart) {
-    EXPECT_WRITE32(IrqRegForHart(hart, 4, RV_TIMER_INTR_ENABLE0_REG_OFFSET),
-                   0x0);
-    EXPECT_WRITE32(IrqRegForHart(hart, 4, RV_TIMER_INTR_STATE0_REG_OFFSET),
-                   kAllOnes);
-
-    for (ptrdiff_t cmp_offset = 0; cmp_offset < 32; cmp_offset += 8) {
-      EXPECT_WRITE32(
-          RegForHart(hart, RV_TIMER_COMPARE_UPPER0_0_REG_OFFSET) + cmp_offset,
-          kAllOnes);
-      EXPECT_WRITE32(
-          RegForHart(hart, RV_TIMER_COMPARE_LOWER0_0_REG_OFFSET) + cmp_offset,
-          kAllOnes);
-      EXPECT_WRITE32(
-          RegForHart(hart, RV_TIMER_COMPARE_UPPER0_0_REG_OFFSET) + cmp_offset,
-          kAllOnes);
-    }
-
-    EXPECT_WRITE32(RegForHart(hart, RV_TIMER_TIMER_V_LOWER0_REG_OFFSET), 0x0);
-    EXPECT_WRITE32(RegForHart(hart, RV_TIMER_TIMER_V_UPPER0_REG_OFFSET), 0x0);
-  }
-
-  dif_rv_timer timer;
-  EXPECT_EQ(dif_rv_timer_init(dev().region(),
-                              {
-                                  .hart_count = 4,
-                                  .comparator_count = 4,
-                              },
-                              &timer),
-            kDifRvTimerOk);
+  EXPECT_EQ(dif_rv_timer_init(dev().region(), &rv_timer_), kDifOk);
 }
 
 TEST_F(InitTest, NullArgs) {
-  EXPECT_EQ(dif_rv_timer_init(dev().region(),
-                              {
-                                  .hart_count = 1,
-                                  .comparator_count = 1,
-                              },
-                              nullptr),
-            kDifRvTimerBadArg);
-}
-
-TEST_F(InitTest, NoHartNoTimers) {
-  dif_rv_timer_t timer;
-  EXPECT_EQ(dif_rv_timer_init(dev().region(),
-                              {
-                                  .hart_count = 0,
-                                  .comparator_count = 1,
-                              },
-                              &timer),
-            kDifRvTimerBadArg);
-  EXPECT_EQ(dif_rv_timer_init(dev().region(),
-                              {
-                                  .hart_count = 1,
-                                  .comparator_count = 0,
-                              },
-                              &timer),
-            kDifRvTimerBadArg);
+  EXPECT_EQ(dif_rv_timer_init(dev().region(), nullptr), kDifBadArg);
 }
 
 class ResetTest : public TimerTest {};
 
-TEST_F(ResetTest, OneEach) {
+TEST_F(ResetTest, Success) {
   EXPECT_WRITE32(RV_TIMER_CTRL_REG_OFFSET, 0x0);
 
-  EXPECT_WRITE32(IrqRegForHart(0, 1, RV_TIMER_INTR_ENABLE0_REG_OFFSET), 0x0);
-  EXPECT_WRITE32(IrqRegForHart(0, 1, RV_TIMER_INTR_STATE0_REG_OFFSET),
-                 kAllOnes);
-
-  EXPECT_WRITE32(RegForHart(0, RV_TIMER_COMPARE_UPPER0_0_REG_OFFSET), kAllOnes);
-  EXPECT_WRITE32(RegForHart(0, RV_TIMER_COMPARE_LOWER0_0_REG_OFFSET), kAllOnes);
-  EXPECT_WRITE32(RegForHart(0, RV_TIMER_COMPARE_UPPER0_0_REG_OFFSET), kAllOnes);
-
-  EXPECT_WRITE32(RegForHart(0, RV_TIMER_TIMER_V_LOWER0_REG_OFFSET), 0x0);
-  EXPECT_WRITE32(RegForHart(0, RV_TIMER_TIMER_V_UPPER0_REG_OFFSET), 0x0);
-
-  auto timer = MakeTimer({1, 1});
-  EXPECT_EQ(dif_rv_timer_reset(&timer), kDifRvTimerOk);
-}
-
-TEST_F(ResetTest, FourCmps) {
-  EXPECT_WRITE32(RV_TIMER_CTRL_REG_OFFSET, 0x0);
-
-  EXPECT_WRITE32(IrqRegForHart(0, 4, RV_TIMER_INTR_ENABLE0_REG_OFFSET), 0x0);
-  EXPECT_WRITE32(IrqRegForHart(0, 4, RV_TIMER_INTR_STATE0_REG_OFFSET),
-                 kAllOnes);
-
-  for (ptrdiff_t cmp_offset = 0; cmp_offset < 32; cmp_offset += 8) {
-    EXPECT_WRITE32(
-        RegForHart(0, RV_TIMER_COMPARE_UPPER0_0_REG_OFFSET) + cmp_offset,
-        kAllOnes);
-    EXPECT_WRITE32(
-        RegForHart(0, RV_TIMER_COMPARE_LOWER0_0_REG_OFFSET) + cmp_offset,
-        kAllOnes);
-    EXPECT_WRITE32(
-        RegForHart(0, RV_TIMER_COMPARE_UPPER0_0_REG_OFFSET) + cmp_offset,
-        kAllOnes);
-  }
-
-  EXPECT_WRITE32(RegForHart(0, RV_TIMER_TIMER_V_LOWER0_REG_OFFSET), 0x0);
-  EXPECT_WRITE32(RegForHart(0, RV_TIMER_TIMER_V_UPPER0_REG_OFFSET), 0x0);
-
-  auto timer = MakeTimer({1, 4});
-  EXPECT_EQ(dif_rv_timer_reset(&timer), kDifRvTimerOk);
-}
-
-TEST_F(ResetTest, FourSix) {
-  EXPECT_WRITE32(RV_TIMER_CTRL_REG_OFFSET, 0x0);
-
-  for (uint32_t hart = 0; hart < 4; ++hart) {
-    EXPECT_WRITE32(IrqRegForHart(hart, 6, RV_TIMER_INTR_ENABLE0_REG_OFFSET),
-                   0x0);
-    EXPECT_WRITE32(IrqRegForHart(hart, 6, RV_TIMER_INTR_STATE0_REG_OFFSET),
+  for (uint32_t hart_id = 0; hart_id < RV_TIMER_PARAM_N_HARTS; ++hart_id) {
+    EXPECT_WRITE32(IrqRegForHart(0, 1, RV_TIMER_INTR_ENABLE0_REG_OFFSET), 0x0);
+    EXPECT_WRITE32(IrqRegForHart(0, 1, RV_TIMER_INTR_STATE0_REG_OFFSET),
                    kAllOnes);
 
-    for (ptrdiff_t cmp_offset = 0; cmp_offset < 48; cmp_offset += 8) {
-      EXPECT_WRITE32(
-          RegForHart(hart, RV_TIMER_COMPARE_UPPER0_0_REG_OFFSET) + cmp_offset,
-          kAllOnes);
-      EXPECT_WRITE32(
-          RegForHart(hart, RV_TIMER_COMPARE_LOWER0_0_REG_OFFSET) + cmp_offset,
-          kAllOnes);
-      EXPECT_WRITE32(
-          RegForHart(hart, RV_TIMER_COMPARE_UPPER0_0_REG_OFFSET) + cmp_offset,
-          kAllOnes);
+    for (uint32_t comp_id = 0; comp_id < RV_TIMER_PARAM_N_TIMERS; ++comp_id) {
+      EXPECT_WRITE32(RegForHart(0, RV_TIMER_COMPARE_UPPER0_0_REG_OFFSET),
+                     kAllOnes);
+      EXPECT_WRITE32(RegForHart(0, RV_TIMER_COMPARE_LOWER0_0_REG_OFFSET),
+                     kAllOnes);
+      EXPECT_WRITE32(RegForHart(0, RV_TIMER_COMPARE_UPPER0_0_REG_OFFSET),
+                     kAllOnes);
     }
-
-    EXPECT_WRITE32(RegForHart(hart, RV_TIMER_TIMER_V_LOWER0_REG_OFFSET), 0x0);
-    EXPECT_WRITE32(RegForHart(hart, RV_TIMER_TIMER_V_UPPER0_REG_OFFSET), 0x0);
   }
+  EXPECT_WRITE32(RegForHart(0, RV_TIMER_TIMER_V_LOWER0_REG_OFFSET), 0x0);
+  EXPECT_WRITE32(RegForHart(0, RV_TIMER_TIMER_V_UPPER0_REG_OFFSET), 0x0);
 
-  auto timer = MakeTimer({4, 6});
-  EXPECT_EQ(dif_rv_timer_reset(&timer), kDifRvTimerOk);
+  EXPECT_EQ(dif_rv_timer_reset(&rv_timer_), kDifOk);
 }
 
 TEST_F(ResetTest, NullArgs) {
-  EXPECT_EQ(dif_rv_timer_reset(nullptr), kDifRvTimerBadArg);
+  EXPECT_EQ(dif_rv_timer_reset(nullptr), kDifBadArg);
 }
 
-class SetParamsTest : public TimerTest {};
+class SetTickParamsTest : public TimerTest {};
 
-TEST_F(SetParamsTest, Baseline) {
+TEST_F(SetTickParamsTest, Success) {
   EXPECT_WRITE32(
-      RegForHart(2, RV_TIMER_CFG0_REG_OFFSET),
+      RegForHart(0, RV_TIMER_CFG0_REG_OFFSET),
       {{RV_TIMER_CFG0_PRESCALE_OFFSET, 400}, {RV_TIMER_CFG0_STEP_OFFSET, 25}});
 
-  auto timer = MakeTimer({4, 6});
-  EXPECT_EQ(dif_rv_timer_set_tick_params(&timer, 2,
+  EXPECT_EQ(dif_rv_timer_set_tick_params(&rv_timer_, 0,
                                          {.prescale = 400, .tick_step = 25}),
-            kDifRvTimerOk);
+            kDifOk);
 }
 
-TEST_F(SetParamsTest, NullArgs) {
-  EXPECT_EQ(dif_rv_timer_set_tick_params(nullptr, 2,
+TEST_F(SetTickParamsTest, NullArgs) {
+  EXPECT_EQ(dif_rv_timer_set_tick_params(nullptr, 0,
                                          {.prescale = 400, .tick_step = 25}),
-            kDifRvTimerBadArg);
+            kDifBadArg);
 }
 
-TEST_F(SetParamsTest, BadHart) {
-  auto timer = MakeTimer({4, 6});
-  EXPECT_EQ(dif_rv_timer_set_tick_params(&timer, 4,
+TEST_F(SetTickParamsTest, BadHartId) {
+  EXPECT_EQ(dif_rv_timer_set_tick_params(&rv_timer_, RV_TIMER_PARAM_N_HARTS,
                                          {.prescale = 400, .tick_step = 25}),
-            kDifRvTimerBadArg);
-  EXPECT_EQ(dif_rv_timer_set_tick_params(&timer, 500,
-                                         {.prescale = 400, .tick_step = 25}),
-            kDifRvTimerBadArg);
+            kDifBadArg);
 }
 
-class TimerEnableTest : public TimerTest {};
+class CounterSetEnabledTest : public TimerTest {};
 
-TEST_F(TimerEnableTest, Baseline) {
+TEST_F(CounterSetEnabledTest, Success) {
   EXPECT_MASK32(RV_TIMER_CTRL_REG_OFFSET,
-                {{/*offset=*/1, /*mask=*/1, /*value=*/1}});
-  EXPECT_MASK32(RV_TIMER_CTRL_REG_OFFSET,
-                {{/*offset=*/3, /*mask=*/1, /*value=*/0}});
-
-  auto timer = MakeTimer({4, 6});
-  EXPECT_EQ(dif_rv_timer_counter_set_enabled(&timer, 1, kDifRvTimerEnabled),
-            kDifRvTimerOk);
-  EXPECT_EQ(dif_rv_timer_counter_set_enabled(&timer, 3, kDifRvTimerDisabled),
-            kDifRvTimerOk);
+                {{/*offset=*/0, /*mask=*/1, /*value=*/1}});
+  EXPECT_EQ(dif_rv_timer_counter_set_enabled(&rv_timer_, 0, kDifToggleEnabled),
+            kDifOk);
 }
 
-TEST_F(TimerEnableTest, NullArgs) {
-  EXPECT_EQ(dif_rv_timer_counter_set_enabled(nullptr, 1, kDifRvTimerEnabled),
-            kDifRvTimerBadArg);
+TEST_F(CounterSetEnabledTest, NullArgs) {
+  EXPECT_EQ(dif_rv_timer_counter_set_enabled(nullptr, 0, kDifToggleEnabled),
+            kDifBadArg);
 }
 
-TEST_F(TimerEnableTest, BadHart) {
-  auto timer = MakeTimer({4, 6});
-  EXPECT_EQ(dif_rv_timer_counter_set_enabled(&timer, 4, kDifRvTimerEnabled),
-            kDifRvTimerBadArg);
-  EXPECT_EQ(dif_rv_timer_counter_set_enabled(&timer, 5, kDifRvTimerDisabled),
-            kDifRvTimerBadArg);
+TEST_F(CounterSetEnabledTest, BadHartId) {
+  EXPECT_EQ(dif_rv_timer_counter_set_enabled(&rv_timer_, RV_TIMER_PARAM_N_HARTS,
+                                             kDifToggleEnabled),
+            kDifBadArg);
 }
 
 class CounterReadTest : public TimerTest {};
 
-TEST_F(CounterReadTest, Baseline) {
+TEST_F(CounterReadTest, Success) {
   EXPECT_READ32(RegForHart(0, RV_TIMER_TIMER_V_UPPER0_REG_OFFSET), 0x0222'0222);
   EXPECT_READ32(RegForHart(0, RV_TIMER_TIMER_V_LOWER0_REG_OFFSET), 0x0333'0333);
   EXPECT_READ32(RegForHart(0, RV_TIMER_TIMER_V_UPPER0_REG_OFFSET), 0x0222'0222);
 
-  auto timer = MakeTimer({4, 6});
   uint64_t value;
-  EXPECT_EQ(dif_rv_timer_counter_read(&timer, 0, &value), kDifRvTimerOk);
+  EXPECT_EQ(dif_rv_timer_counter_read(&rv_timer_, 0, &value), kDifOk);
   EXPECT_EQ(value, 0x0222'0222'0333'0333);
 }
 
 TEST_F(CounterReadTest, Overflow) {
-  EXPECT_READ32(RegForHart(1, RV_TIMER_TIMER_V_UPPER0_REG_OFFSET), 0x0222'0222);
-  EXPECT_READ32(RegForHart(1, RV_TIMER_TIMER_V_LOWER0_REG_OFFSET), 0x0333'0333);
-  EXPECT_READ32(RegForHart(1, RV_TIMER_TIMER_V_UPPER0_REG_OFFSET), 0x0222'0223);
+  EXPECT_READ32(RegForHart(0, RV_TIMER_TIMER_V_UPPER0_REG_OFFSET), 0x0222'0222);
+  EXPECT_READ32(RegForHart(0, RV_TIMER_TIMER_V_LOWER0_REG_OFFSET), 0x0333'0333);
+  EXPECT_READ32(RegForHart(0, RV_TIMER_TIMER_V_UPPER0_REG_OFFSET), 0x0222'0223);
 
-  EXPECT_READ32(RegForHart(1, RV_TIMER_TIMER_V_UPPER0_REG_OFFSET), 0x0222'0223);
-  EXPECT_READ32(RegForHart(1, RV_TIMER_TIMER_V_LOWER0_REG_OFFSET), 0x0333'0444);
-  EXPECT_READ32(RegForHart(1, RV_TIMER_TIMER_V_UPPER0_REG_OFFSET), 0x0222'0223);
+  EXPECT_READ32(RegForHart(0, RV_TIMER_TIMER_V_UPPER0_REG_OFFSET), 0x0222'0223);
+  EXPECT_READ32(RegForHart(0, RV_TIMER_TIMER_V_LOWER0_REG_OFFSET), 0x0333'0444);
+  EXPECT_READ32(RegForHart(0, RV_TIMER_TIMER_V_UPPER0_REG_OFFSET), 0x0222'0223);
 
-  auto timer = MakeTimer({4, 6});
   uint64_t value;
-  EXPECT_EQ(dif_rv_timer_counter_read(&timer, 1, &value), kDifRvTimerOk);
+  EXPECT_EQ(dif_rv_timer_counter_read(&rv_timer_, 0, &value), kDifOk);
   EXPECT_EQ(value, 0x0222'0223'0333'0444);
 }
 
 TEST_F(CounterReadTest, NullArgs) {
-  auto timer = MakeTimer({4, 6});
   uint64_t value;
-  EXPECT_EQ(dif_rv_timer_counter_read(nullptr, 2, &value), kDifRvTimerBadArg);
-  EXPECT_EQ(dif_rv_timer_counter_read(&timer, 2, nullptr), kDifRvTimerBadArg);
+  EXPECT_EQ(dif_rv_timer_counter_read(nullptr, 0, &value), kDifBadArg);
+  EXPECT_EQ(dif_rv_timer_counter_read(&rv_timer_, 0, nullptr), kDifBadArg);
 }
 
-TEST_F(CounterReadTest, BadHart) {
-  auto timer = MakeTimer({4, 6});
+TEST_F(CounterReadTest, BadHartId) {
   uint64_t value;
-  EXPECT_EQ(dif_rv_timer_counter_read(&timer, 4, &value), kDifRvTimerBadArg);
-  EXPECT_EQ(dif_rv_timer_counter_read(&timer, 5, &value), kDifRvTimerBadArg);
+  EXPECT_EQ(
+      dif_rv_timer_counter_read(&rv_timer_, RV_TIMER_PARAM_N_HARTS, &value),
+      kDifBadArg);
 }
 
 class CounterWriteTest : public TimerTest {};
 
-TEST_F(CounterWriteTest, Baseline) {
+TEST_F(CounterWriteTest, Success) {
   EXPECT_READ32(RV_TIMER_CTRL_REG_OFFSET, 0x0000'0001);
   EXPECT_WRITE32(RV_TIMER_CTRL_REG_OFFSET, 0x0000'0000);
   EXPECT_WRITE32(RegForHart(0, RV_TIMER_TIMER_V_LOWER0_REG_OFFSET),
@@ -428,236 +259,50 @@
                  0xCAFE'FEED);
   EXPECT_WRITE32(RV_TIMER_CTRL_REG_OFFSET, 0x0000'0001);
 
-  auto timer = MakeTimer({1, 1});
   uint64_t count = 0xCAFE'FEED'DEAD'BEEF;
-  EXPECT_EQ(dif_rv_timer_counter_write(&timer, 0, count), kDifRvTimerOk);
+  EXPECT_EQ(dif_rv_timer_counter_write(&rv_timer_, 0, count), kDifOk);
 }
 
 TEST_F(CounterWriteTest, NullArgs) {
   uint64_t count = 0xCAFE'FEED'DEAD'BEEF;
-  EXPECT_EQ(dif_rv_timer_counter_write(nullptr, 0, count), kDifRvTimerBadArg);
+  EXPECT_EQ(dif_rv_timer_counter_write(nullptr, 0, count), kDifBadArg);
 }
 
-TEST_F(CounterWriteTest, BadHart) {
-  auto timer = MakeTimer({1, 1});
+TEST_F(CounterWriteTest, BadHartId) {
   uint64_t count = 0xCAFE'FEED'DEAD'BEEF;
-  EXPECT_EQ(dif_rv_timer_counter_write(&timer, 1, count), kDifRvTimerBadArg);
-  EXPECT_EQ(dif_rv_timer_counter_write(&timer, 2, count), kDifRvTimerBadArg);
+  EXPECT_EQ(
+      dif_rv_timer_counter_write(&rv_timer_, RV_TIMER_PARAM_N_HARTS, count),
+      kDifBadArg);
 }
 
 class ArmTest : public TimerTest {};
 
-TEST_F(ArmTest, Baseline) {
-  // Note: 16 = 2 * sizeof(uint64_t), since these need to be the registers
-  // for the third (index 2) comparator.
-  auto lower_reg = RegForHart(1, RV_TIMER_COMPARE_LOWER0_0_REG_OFFSET) + 16;
-  auto upper_reg = RegForHart(1, RV_TIMER_COMPARE_UPPER0_0_REG_OFFSET) + 16;
+TEST_F(ArmTest, Success) {
+  auto lower_reg = RegForHart(0, RV_TIMER_COMPARE_LOWER0_0_REG_OFFSET);
+  auto upper_reg = RegForHart(0, RV_TIMER_COMPARE_UPPER0_0_REG_OFFSET);
 
   EXPECT_WRITE32(upper_reg, kAllOnes);
   EXPECT_WRITE32(lower_reg, 0x0444'0555);
   EXPECT_WRITE32(upper_reg, 0x0222'0333);
 
-  auto timer = MakeTimer({4, 6});
-  EXPECT_EQ(dif_rv_timer_arm(&timer, 1, 2, 0x0222'0333'0444'0555),
-            kDifRvTimerOk);
+  EXPECT_EQ(dif_rv_timer_arm(&rv_timer_, 0, 0, 0x0222'0333'0444'0555), kDifOk);
 }
 
 TEST_F(ArmTest, NullArgs) {
-  EXPECT_EQ(dif_rv_timer_arm(nullptr, 1, 2, 0x0222'0333'0444'0555),
-            kDifRvTimerBadArg);
+  EXPECT_EQ(dif_rv_timer_arm(nullptr, 0, 0, 0x0222'0333'0444'0555), kDifBadArg);
 }
 
-TEST_F(ArmTest, BadHartBadComp) {
-  auto timer = MakeTimer({4, 6});
-  EXPECT_EQ(dif_rv_timer_arm(&timer, 4, 2, 0x0222'0333'0444'0555),
-            kDifRvTimerBadArg);
-  EXPECT_EQ(dif_rv_timer_arm(&timer, 5, 2, 0x0222'0333'0444'0555),
-            kDifRvTimerBadArg);
-  EXPECT_EQ(dif_rv_timer_arm(&timer, 1, 6, 0x0222'0333'0444'0555),
-            kDifRvTimerBadArg);
-  EXPECT_EQ(dif_rv_timer_arm(&timer, 1, 7, 0x0222'0333'0444'0555),
-            kDifRvTimerBadArg);
+TEST_F(ArmTest, BadHartIdBadCompId) {
+  EXPECT_EQ(dif_rv_timer_arm(&rv_timer_, RV_TIMER_PARAM_N_HARTS, 0,
+                             0x0222'0333'0444'0555),
+            kDifBadArg);
+  EXPECT_EQ(dif_rv_timer_arm(&rv_timer_, 0, RV_TIMER_PARAM_N_TIMERS,
+                             0x0222'0333'0444'0555),
+            kDifBadArg);
+  EXPECT_EQ(dif_rv_timer_arm(&rv_timer_, RV_TIMER_PARAM_N_HARTS,
+                             RV_TIMER_PARAM_N_TIMERS, 0x0222'0333'0444'0555),
+            kDifBadArg);
 }
 
-class IrqEnableTest : public TimerTest {};
-
-TEST_F(IrqEnableTest, Baseline) {
-  EXPECT_MASK32(IrqRegForHart(1, 6, RV_TIMER_INTR_ENABLE0_REG_OFFSET),
-                {{/*offset=*/2, /*mask=*/1, /*value=*/1}});
-  EXPECT_MASK32(IrqRegForHart(3, 6, RV_TIMER_INTR_ENABLE0_REG_OFFSET),
-                {{/*offset=*/4, /*mask=*/1, /*value=*/0}});
-
-  auto timer = MakeTimer({4, 6});
-  EXPECT_EQ(dif_rv_timer_irq_enable(&timer, 1, 2, kDifRvTimerEnabled),
-            kDifRvTimerOk);
-  EXPECT_EQ(dif_rv_timer_irq_enable(&timer, 3, 4, kDifRvTimerDisabled),
-            kDifRvTimerOk);
-}
-
-TEST_F(IrqEnableTest, NullArgs) {
-  EXPECT_EQ(dif_rv_timer_irq_enable(nullptr, 1, 2, kDifRvTimerEnabled),
-            kDifRvTimerBadArg);
-}
-
-TEST_F(IrqEnableTest, BadHartBadComp) {
-  auto timer = MakeTimer({4, 6});
-  EXPECT_EQ(dif_rv_timer_irq_enable(&timer, 4, 2, kDifRvTimerEnabled),
-            kDifRvTimerBadArg);
-  EXPECT_EQ(dif_rv_timer_irq_enable(&timer, 5, 4, kDifRvTimerDisabled),
-            kDifRvTimerBadArg);
-  EXPECT_EQ(dif_rv_timer_irq_enable(&timer, 1, 6, kDifRvTimerEnabled),
-            kDifRvTimerBadArg);
-  EXPECT_EQ(dif_rv_timer_irq_enable(&timer, 3, 7, kDifRvTimerDisabled),
-            kDifRvTimerBadArg);
-}
-
-class IrqGetTest : public TimerTest {};
-
-TEST_F(IrqGetTest, Baseline) {
-  EXPECT_READ32(IrqRegForHart(1, 6, RV_TIMER_INTR_STATE0_REG_OFFSET),
-                {
-                    {/*offset=*/0, /*value=*/1},
-                    {/*offset=*/2, /*value=*/1},
-                    {/*offset=*/5, /*value=*/1},
-                });
-  EXPECT_READ32(IrqRegForHart(3, 6, RV_TIMER_INTR_STATE0_REG_OFFSET),
-                {
-                    {/*offset=*/0, /*value=*/1},
-                    {/*offset=*/2, /*value=*/1},
-                    {/*offset=*/5, /*value=*/1},
-                });
-
-  auto timer = MakeTimer({4, 6});
-  bool flag;
-  EXPECT_EQ(dif_rv_timer_irq_get(&timer, 1, 2, &flag), kDifRvTimerOk);
-  EXPECT_TRUE(flag);
-  EXPECT_EQ(dif_rv_timer_irq_get(&timer, 3, 4, &flag), kDifRvTimerOk);
-  EXPECT_FALSE(flag);
-}
-
-TEST_F(IrqGetTest, NullArgs) {
-  auto timer = MakeTimer({4, 6});
-  bool flag;
-  EXPECT_EQ(dif_rv_timer_irq_get(nullptr, 1, 2, &flag), kDifRvTimerBadArg);
-  EXPECT_EQ(dif_rv_timer_irq_get(&timer, 3, 4, nullptr), kDifRvTimerBadArg);
-}
-
-TEST_F(IrqGetTest, BadHartBadComp) {
-  auto timer = MakeTimer({4, 6});
-  bool flag;
-  EXPECT_EQ(dif_rv_timer_irq_get(&timer, 4, 2, &flag), kDifRvTimerBadArg);
-  EXPECT_EQ(dif_rv_timer_irq_get(&timer, 5, 4, &flag), kDifRvTimerBadArg);
-  EXPECT_EQ(dif_rv_timer_irq_get(&timer, 1, 6, &flag), kDifRvTimerBadArg);
-  EXPECT_EQ(dif_rv_timer_irq_get(&timer, 3, 7, &flag), kDifRvTimerBadArg);
-}
-
-class IrqClearTest : public TimerTest {};
-
-TEST_F(IrqClearTest, Baseline) {
-  EXPECT_WRITE32(IrqRegForHart(1, 6, RV_TIMER_INTR_STATE0_REG_OFFSET),
-                 {
-                     {/*offset=*/2, /*value=*/1},
-                 });
-  EXPECT_WRITE32(IrqRegForHart(3, 6, RV_TIMER_INTR_STATE0_REG_OFFSET),
-                 {
-                     {/*offset=*/4, /*value=*/1},
-                 });
-
-  auto timer = MakeTimer({4, 6});
-  EXPECT_EQ(dif_rv_timer_irq_clear(&timer, 1, 2), kDifRvTimerOk);
-  EXPECT_EQ(dif_rv_timer_irq_clear(&timer, 3, 4), kDifRvTimerOk);
-}
-
-TEST_F(IrqClearTest, NullArgs) {
-  EXPECT_EQ(dif_rv_timer_irq_clear(nullptr, 1, 2), kDifRvTimerBadArg);
-}
-
-TEST_F(IrqClearTest, BadHartBadComp) {
-  auto timer = MakeTimer({4, 6});
-  EXPECT_EQ(dif_rv_timer_irq_clear(&timer, 4, 2), kDifRvTimerBadArg);
-  EXPECT_EQ(dif_rv_timer_irq_clear(&timer, 5, 4), kDifRvTimerBadArg);
-  EXPECT_EQ(dif_rv_timer_irq_clear(&timer, 1, 6), kDifRvTimerBadArg);
-  EXPECT_EQ(dif_rv_timer_irq_clear(&timer, 3, 7), kDifRvTimerBadArg);
-}
-
-class IrqDisableTest : public TimerTest {};
-
-TEST_F(IrqDisableTest, Baseline) {
-  EXPECT_READ32(IrqRegForHart(1, 6, RV_TIMER_INTR_ENABLE0_REG_OFFSET),
-                0b101010);
-  EXPECT_WRITE32(IrqRegForHart(1, 6, RV_TIMER_INTR_ENABLE0_REG_OFFSET), 0);
-
-  EXPECT_WRITE32(IrqRegForHart(3, 6, RV_TIMER_INTR_ENABLE0_REG_OFFSET), 0);
-
-  auto timer = MakeTimer({4, 6});
-  uint32_t state;
-  EXPECT_EQ(dif_rv_timer_irq_disable(&timer, 1, &state), kDifRvTimerOk);
-  EXPECT_EQ(state, 0b101010);
-  EXPECT_EQ(dif_rv_timer_irq_disable(&timer, 3, nullptr), kDifRvTimerOk);
-}
-
-TEST_F(IrqDisableTest, NullArgs) {
-  uint32_t state;
-  EXPECT_EQ(dif_rv_timer_irq_disable(nullptr, 1, &state), kDifRvTimerBadArg);
-}
-
-TEST_F(IrqDisableTest, BadHart) {
-  auto timer = MakeTimer({4, 6});
-  uint32_t state;
-  EXPECT_EQ(dif_rv_timer_irq_disable(&timer, 4, &state), kDifRvTimerBadArg);
-  EXPECT_EQ(dif_rv_timer_irq_disable(&timer, 5, &state), kDifRvTimerBadArg);
-}
-
-class IrqRestoreTest : public TimerTest {};
-
-TEST_F(IrqRestoreTest, Baseline) {
-  EXPECT_WRITE32(IrqRegForHart(1, 6, RV_TIMER_INTR_ENABLE0_REG_OFFSET),
-                 0b101010);
-  EXPECT_WRITE32(IrqRegForHart(3, 6, RV_TIMER_INTR_ENABLE0_REG_OFFSET),
-                 0b011011);
-
-  auto timer = MakeTimer({4, 6});
-  EXPECT_EQ(dif_rv_timer_irq_restore(&timer, 1, 0b101010), kDifRvTimerOk);
-  EXPECT_EQ(dif_rv_timer_irq_restore(&timer, 3, 0b011011), kDifRvTimerOk);
-}
-
-TEST_F(IrqRestoreTest, NullArgs) {
-  EXPECT_EQ(dif_rv_timer_irq_restore(nullptr, 1, 0), kDifRvTimerBadArg);
-}
-
-TEST_F(IrqRestoreTest, BadHart) {
-  auto timer = MakeTimer({4, 6});
-  EXPECT_EQ(dif_rv_timer_irq_restore(&timer, 4, 0), kDifRvTimerBadArg);
-  EXPECT_EQ(dif_rv_timer_irq_restore(&timer, 5, 0), kDifRvTimerBadArg);
-}
-
-class IrqForceTest : public TimerTest {};
-
-TEST_F(IrqForceTest, Baseline) {
-  EXPECT_WRITE32(IrqRegForHart(1, 6, RV_TIMER_INTR_TEST0_REG_OFFSET),
-                 {
-                     {/*offset=*/2, /*value=*/1},
-                 });
-  EXPECT_WRITE32(IrqRegForHart(3, 6, RV_TIMER_INTR_TEST0_REG_OFFSET),
-                 {
-                     {/*offset=*/4, /*value=*/1},
-                 });
-
-  auto timer = MakeTimer({4, 6});
-  EXPECT_EQ(dif_rv_timer_irq_force(&timer, 1, 2), kDifRvTimerOk);
-  EXPECT_EQ(dif_rv_timer_irq_force(&timer, 3, 4), kDifRvTimerOk);
-}
-
-TEST_F(IrqForceTest, NullArgs) {
-  EXPECT_EQ(dif_rv_timer_irq_force(nullptr, 1, 2), kDifRvTimerBadArg);
-}
-
-TEST_F(IrqForceTest, BadHartBadComp) {
-  auto timer = MakeTimer({4, 6});
-  EXPECT_EQ(dif_rv_timer_irq_force(&timer, 4, 2), kDifRvTimerBadArg);
-  EXPECT_EQ(dif_rv_timer_irq_force(&timer, 5, 4), kDifRvTimerBadArg);
-  EXPECT_EQ(dif_rv_timer_irq_force(&timer, 1, 6), kDifRvTimerBadArg);
-  EXPECT_EQ(dif_rv_timer_irq_force(&timer, 3, 7), kDifRvTimerBadArg);
-}
 }  // namespace
 }  // namespace dif_rv_timer_unittest
diff --git a/sw/device/lib/dif/meson.build b/sw/device/lib/dif/meson.build
index 610bc57..0f87c07 100644
--- a/sw/device/lib/dif/meson.build
+++ b/sw/device/lib/dif/meson.build
@@ -257,7 +257,8 @@
       'dif_rv_timer.c',
     ],
     dependencies: [
-      sw_lib_mmio
+      sw_lib_mmio,
+      sw_lib_dif_autogen_rv_timer,
     ],
   )
 )
@@ -265,9 +266,11 @@
 test('dif_rv_timer_unittest', executable(
     'dif_rv_timer_unittest',
     sources: [
-      hw_ip_rv_timer_reg_h,
-      meson.source_root() / 'sw/device/lib/dif/dif_rv_timer.c',
       'dif_rv_timer_unittest.cc',
+      'autogen/dif_rv_timer_autogen_unittest.cc',
+      meson.source_root() / 'sw/device/lib/dif/dif_rv_timer.c',
+      meson.source_root() / 'sw/device/lib/dif/autogen/dif_rv_timer_autogen.c',
+      hw_ip_rv_timer_reg_h,
     ],
     dependencies: [
       sw_vendor_gtest,
diff --git a/sw/device/lib/testing/test_framework/example_earlgrey_test.c b/sw/device/lib/testing/test_framework/example_earlgrey_test.c
index ff9d978..4328aa5 100644
--- a/sw/device/lib/testing/test_framework/example_earlgrey_test.c
+++ b/sw/device/lib/testing/test_framework/example_earlgrey_test.c
@@ -17,22 +17,19 @@
     .test_name = "ExampleTest",
 };
 
+static dif_rv_timer_t timer;
+
 // This example test just queries the RV Timer count and logs it over UART.
 // Currently, this test runs forever, but once test teardown logic has been
 // implemented this example will be updated.
 void test_main(void *result) {
-  mmio_region_t timer_reg =
-      mmio_region_from_addr(TOP_EARLGREY_RV_TIMER_BASE_ADDR);
-  dif_rv_timer_t timer = {
-      .base_addr = timer_reg,
-      {.hart_count = 1, .comparator_count = 1},
-  };
+  CHECK_DIF_OK(dif_rv_timer_init(
+      mmio_region_from_addr(TOP_EARLGREY_RV_TIMER_BASE_ADDR), &timer));
   uint64_t current_time;
   const uint32_t kHart = (uint32_t)kTopEarlgreyPlicTargetIbex0;
 
   while (true) {
-    CHECK(dif_rv_timer_counter_read(&timer, kHart, &current_time) ==
-          kDifRvTimerOk);
+    CHECK_DIF_OK(dif_rv_timer_counter_read(&timer, kHart, &current_time));
     LOG_INFO("(FreeRTOS Task) Current Time: %u", (uint32_t)current_time);
   }
 
diff --git a/sw/device/lib/testing/test_framework/freertos_port.c b/sw/device/lib/testing/test_framework/freertos_port.c
index c30d346..e6270be 100644
--- a/sw/device/lib/testing/test_framework/freertos_port.c
+++ b/sw/device/lib/testing/test_framework/freertos_port.c
@@ -33,13 +33,15 @@
 // Override the timer ISR to support preemptive context switching.
 void ottf_timer_isr(void) {
   LOG_INFO("Handling timer IQR ...");
-  CHECK(dif_rv_timer_irq_disable(&timer, kTimerHartId, NULL) == kDifRvTimerOk);
-  CHECK(dif_rv_timer_counter_write(&timer, kTimerHartId, 0) == kDifRvTimerOk);
-  CHECK(dif_rv_timer_irq_clear(&timer, kTimerHartId, kTimerComparatorId) ==
-        kDifRvTimerOk);
+  dif_rv_timer_irq_enable_snapshot_t irq_enable_snapshot;
+  CHECK_DIF_OK(
+      dif_rv_timer_irq_disable_all(&timer, kTimerHartId, &irq_enable_snapshot));
+  CHECK_DIF_OK(dif_rv_timer_counter_write(&timer, kTimerHartId, 0));
+  CHECK_DIF_OK(dif_rv_timer_irq_acknowledge(
+      &timer, kDifRvTimerIrqTimerExpiredHart0Timer0));
   // TODO: increment scheduler tick and switch context if necessary
-  CHECK(dif_rv_timer_irq_enable(&timer, kTimerHartId, kTimerComparatorId,
-                                kDifRvTimerEnabled) == kDifRvTimerOk);
+  CHECK_DIF_OK(
+      dif_rv_timer_irq_restore_all(&timer, kTimerHartId, &irq_enable_snapshot));
   LOG_INFO("Done.");
 }
 
@@ -47,32 +49,27 @@
   LOG_INFO("Configuring timer interrupt ...");
 
   // Initialize and reset the timer.
-  mmio_region_t timer_reg =
-      mmio_region_from_addr(TOP_EARLGREY_RV_TIMER_BASE_ADDR);
-  CHECK(dif_rv_timer_init(
-            timer_reg,
-            (dif_rv_timer_config_t){.hart_count = 1, .comparator_count = 1},
-            &timer) == kDifRvTimerOk);
+  CHECK_DIF_OK(dif_rv_timer_init(
+      mmio_region_from_addr(TOP_EARLGREY_RV_TIMER_BASE_ADDR), &timer));
 
   // Compute and set tick parameters (i.e., step, prescale, etc.).
   dif_rv_timer_tick_params_t tick_params;
-  CHECK(dif_rv_timer_approximate_tick_params(
-            kClockFreqPeripheralHz, configTICK_RATE_HZ * kTimerDeadline,
-            &tick_params) == kDifRvTimerApproximateTickParamsOk);
+  CHECK_DIF_OK(dif_rv_timer_approximate_tick_params(
+      kClockFreqPeripheralHz, configTICK_RATE_HZ * kTimerDeadline,
+      &tick_params));
   LOG_INFO("Tick Freq. (Hz): %u, Prescale: %u; Tick Step: %u",
            (uint32_t)kClockFreqPeripheralHz, (uint32_t)tick_params.prescale,
            (uint32_t)tick_params.tick_step);
-  CHECK(dif_rv_timer_set_tick_params(&timer, kTimerHartId, tick_params) ==
-        kDifRvTimerOk);
+  CHECK_DIF_OK(dif_rv_timer_set_tick_params(&timer, kTimerHartId, tick_params));
 
   // Enable RV Timer interrupts and arm/enable the timer.
-  CHECK(dif_rv_timer_irq_enable(&timer, kTimerHartId, kTimerComparatorId,
-                                kDifRvTimerEnabled) == kDifRvTimerOk);
-  CHECK(dif_rv_timer_arm(&timer, kTimerHartId, kTimerComparatorId,
-                         kTimerDeadline) == kDifRvTimerOk);
+  CHECK_DIF_OK(dif_rv_timer_irq_set_enabled(
+      &timer, kDifRvTimerIrqTimerExpiredHart0Timer0, kDifToggleEnabled));
+  CHECK_DIF_OK(dif_rv_timer_arm(&timer, kTimerHartId, kTimerComparatorId,
+                                kTimerDeadline));
 
-  CHECK(dif_rv_timer_counter_set_enabled(&timer, kTimerHartId,
-                                         kDifRvTimerEnabled) == kDifRvTimerOk);
+  CHECK_DIF_OK(dif_rv_timer_counter_set_enabled(&timer, kTimerHartId,
+                                                kDifToggleEnabled));
 }
 
 #endif  // configUSE_PREEMPTION
diff --git a/sw/device/sca/lib/sca.c b/sw/device/sca/lib/sca.c
index 592e095..770b830 100644
--- a/sw/device/sca/lib/sca.c
+++ b/sw/device/sca/lib/sca.c
@@ -109,15 +109,14 @@
  */
 static void sca_init_timer(void) {
   IGNORE_RESULT(dif_rv_timer_init(
-      mmio_region_from_addr(TOP_EARLGREY_RV_TIMER_BASE_ADDR),
-      (dif_rv_timer_config_t){.hart_count = 1, .comparator_count = 1}, &timer));
+      mmio_region_from_addr(TOP_EARLGREY_RV_TIMER_BASE_ADDR), &timer));
   dif_rv_timer_tick_params_t tick_params;
   IGNORE_RESULT(dif_rv_timer_approximate_tick_params(
       kClockFreqPeripheralHz, kClockFreqCpuHz, &tick_params));
   IGNORE_RESULT(
       dif_rv_timer_set_tick_params(&timer, kRvTimerHart, tick_params));
-  IGNORE_RESULT(dif_rv_timer_irq_enable(
-      &timer, kRvTimerHart, kRvTimerComparator, kDifRvTimerEnabled));
+  IGNORE_RESULT(dif_rv_timer_irq_set_enabled(
+      &timer, kDifRvTimerIrqTimerExpiredHart0Timer0, kDifToggleEnabled));
   irq_timer_ctrl(true);
   irq_global_ctrl(true);
 }
@@ -131,9 +130,9 @@
   // Return values of below functions are ignored to improve capture
   // performance.
   IGNORE_RESULT(dif_rv_timer_counter_set_enabled(&timer, kRvTimerHart,
-                                                 kDifRvTimerDisabled));
-  IGNORE_RESULT(
-      dif_rv_timer_irq_clear(&timer, kRvTimerHart, kRvTimerComparator));
+                                                 kDifToggleDisabled));
+  IGNORE_RESULT(dif_rv_timer_irq_acknowledge(
+      &timer, kDifRvTimerIrqTimerExpiredHart0Timer0));
 }
 
 /**
@@ -224,7 +223,7 @@
   IGNORE_RESULT(dif_rv_timer_arm(&timer, kRvTimerHart, kRvTimerComparator,
                                  current_time + sleep_cycles));
   IGNORE_RESULT(dif_rv_timer_counter_set_enabled(&timer, kRvTimerHart,
-                                                 kDifRvTimerEnabled));
+                                                 kDifToggleEnabled));
 
   callee();
 
diff --git a/sw/device/tests/rv_timer_smoketest.c b/sw/device/tests/rv_timer_smoketest.c
index b79fe34..9957004 100644
--- a/sw/device/tests/rv_timer_smoketest.c
+++ b/sw/device/tests/rv_timer_smoketest.c
@@ -33,13 +33,14 @@
   CHECK(!irq_fired, "Entered IRQ handler, but `irq_fired` was not false!");
 
   bool irq_flag;
-  CHECK(dif_rv_timer_irq_get(&timer, kHart, kComparator, &irq_flag) ==
-        kDifRvTimerOk);
+  CHECK_DIF_OK(dif_rv_timer_irq_is_pending(
+      &timer, kDifRvTimerIrqTimerExpiredHart0Timer0, &irq_flag));
   CHECK(irq_flag, "Entered IRQ handler but the expected IRQ flag wasn't set!");
 
-  CHECK(dif_rv_timer_counter_set_enabled(&timer, kHart, kDifRvTimerDisabled) ==
-        kDifRvTimerOk);
-  CHECK(dif_rv_timer_irq_clear(&timer, kHart, kComparator) == kDifRvTimerOk);
+  CHECK_DIF_OK(
+      dif_rv_timer_counter_set_enabled(&timer, kHart, kDifToggleDisabled));
+  CHECK_DIF_OK(dif_rv_timer_irq_acknowledge(
+      &timer, kDifRvTimerIrqTimerExpiredHart0Timer0));
 
   irq_fired = true;
 }
@@ -57,21 +58,15 @@
   irq_global_ctrl(true);
   irq_timer_ctrl(true);
 
-  mmio_region_t timer_reg =
-      mmio_region_from_addr(TOP_EARLGREY_RV_TIMER_BASE_ADDR);
-  CHECK(dif_rv_timer_init(
-            timer_reg,
-            (dif_rv_timer_config_t){.hart_count = 1, .comparator_count = 1},
-            &timer) == kDifRvTimerOk);
+  CHECK_DIF_OK(dif_rv_timer_init(
+      mmio_region_from_addr(TOP_EARLGREY_RV_TIMER_BASE_ADDR), &timer));
 
   dif_rv_timer_tick_params_t tick_params;
-  CHECK(dif_rv_timer_approximate_tick_params(kClockFreqPeripheralHz,
-                                             kTickFreqHz, &tick_params) ==
-        kDifRvTimerApproximateTickParamsOk);
-  CHECK(dif_rv_timer_set_tick_params(&timer, kHart, tick_params) ==
-        kDifRvTimerOk);
-  CHECK(dif_rv_timer_irq_enable(&timer, kHart, kComparator,
-                                kDifRvTimerEnabled) == kDifRvTimerOk);
+  CHECK_DIF_OK(dif_rv_timer_approximate_tick_params(kClockFreqPeripheralHz,
+                                                    kTickFreqHz, &tick_params));
+  CHECK_DIF_OK(dif_rv_timer_set_tick_params(&timer, kHart, tick_params));
+  CHECK_DIF_OK(dif_rv_timer_irq_set_enabled(
+      &timer, kDifRvTimerIrqTimerExpiredHart0Timer0, kDifToggleEnabled));
 
   uint64_t current_time;
   // Logs over UART incur a large runtime overhead. To accommodate that, the
@@ -80,16 +75,15 @@
   // deadline (30 ms vs 100 us).
   uint64_t kDeadline =
       (kDeviceType == kDeviceSimDV) ? 100 /* 100 us */ : 30000 /* 30 ms */;
-  CHECK(dif_rv_timer_counter_read(&timer, kHart, &current_time) ==
-        kDifRvTimerOk);
+  CHECK_DIF_OK(dif_rv_timer_counter_read(&timer, kHart, &current_time));
   LOG_INFO("Current time: %d; timer theshold: %d", (uint32_t)current_time,
            (uint32_t)(current_time + kDeadline));
-  CHECK(dif_rv_timer_arm(&timer, kHart, kComparator,
-                         current_time + kDeadline) == kDifRvTimerOk);
+  CHECK_DIF_OK(
+      dif_rv_timer_arm(&timer, kHart, kComparator, current_time + kDeadline));
 
   irq_fired = false;
-  CHECK(dif_rv_timer_counter_set_enabled(&timer, kHart, kDifRvTimerEnabled) ==
-        kDifRvTimerOk);
+  CHECK_DIF_OK(
+      dif_rv_timer_counter_set_enabled(&timer, kHart, kDifToggleEnabled));
 
   LOG_INFO("Waiting...");
   while (!irq_fired) {