// 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}

/**
 * @file
 * @brief Default ISRs for each IP
 */

#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_
