// Copyright lowRISC contributors.
// Licensed under the Apache License, Version 2.0, see LICENSE for details.
// SPDX-License-Identifier: Apache-2.0

#ifndef OPENTITAN_SW_DEVICE_LIB_TESTING_AUTOGEN_ISR_TESTUTILS_H_
#define OPENTITAN_SW_DEVICE_LIB_TESTING_AUTOGEN_ISR_TESTUTILS_H_

${autogen_banner}

#include "sw/device/lib/dif/dif_rv_plic.h"
% for ip in ips_with_difs:
  % if ip.irqs:
    #include "sw/device/lib/dif/dif_${ip.name_snake}.h"
  % endif
% endfor

#include "hw/top_earlgrey/sw/autogen/top_earlgrey.h" // Generated.

/**
 * A handle to a PLIC ISR context struct.
 */
typedef struct plic_isr_ctx {
  /**
   * A handle to a rv_plic.
   */
  dif_rv_plic_t *rv_plic;
  /**
   * The HART ID associated with the PLIC (correspond to a PLIC "target").
   */
  uint32_t hart_id;
} plic_isr_ctx_t;

% for ip in ips_with_difs:
  % if ip.irqs:
    /**
     * A handle to a ${ip.name_snake} ISR context struct.
     */
    typedef struct ${ip.name_snake}_isr_ctx {
      /**
       * A handle to a ${ip.name_snake}.
       */
      dif_${ip.name_snake}_t *${ip.name_snake};
      /**
       * The PLIC IRQ ID where this ${ip.name_snake} instance's IRQs start.
       */
      dif_rv_plic_irq_id_t plic_${ip.name_snake}_start_irq_id;
      /**
       * The ${ip.name_snake} IRQ that is expected to be encountered in the ISR.
       */
      dif_${ip.name_snake}_irq_t expected_irq;
      /**
       * Whether or not a single IRQ is expected to be encountered in the ISR.
       */
      bool is_only_irq;
    } ${ip.name_snake}_isr_ctx_t;

  % endif
% endfor

% for ip in ips_with_difs:
  % if ip.irqs:
    /**
     * Services an ${ip.name_snake} IRQ.
     *
     * @param plic_ctx A PLIC ISR context handle.
     * @param ${ip.name_snake}_ctx A(n) ${ip.name_snake} ISR context handle.
     * @param[out] peripheral_serviced Out param for the peripheral that was serviced.
     * @param[out] irq_serviced Out param for the IRQ that was serviced.
     */
    void isr_testutils_${ip.name_snake}_isr(
      plic_isr_ctx_t plic_ctx,
      ${ip.name_snake}_isr_ctx_t ${ip.name_snake}_ctx,
      top_earlgrey_plic_peripheral_t *peripheral_serviced,
      dif_${ip.name_snake}_irq_t *irq_serviced);

  % endif
% endfor

#endif  // OPENTITAN_SW_DEVICE_LIB_TESTING_AUTOGEN_ISR_TESTUTILS_H_
