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

${autogen_banner}

#include "sw/device/lib/testing/autogen/isr_testutils.h"

#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 "sw/device/lib/testing/check.h"

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

% for ip in ips_with_difs:
  % if ip.irqs:
    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) {

      // Claim the IRQ at the PLIC.
      dif_rv_plic_irq_id_t plic_irq_id;
      CHECK_DIF_OK(dif_rv_plic_irq_claim(
        plic_ctx.rv_plic,
        plic_ctx.hart_id,
        &plic_irq_id));

      // Get the peripheral the IRQ belongs to.
      *peripheral_serviced = (top_earlgrey_plic_peripheral_t)
        top_earlgrey_plic_interrupt_for_peripheral[plic_irq_id];

      // Get the IRQ that was fired from the PLIC IRQ ID.
      dif_${ip.name_snake}_irq_t irq = (dif_${ip.name_snake}_irq_t)(plic_irq_id -
        ${ip.name_snake}_ctx.plic_${ip.name_snake}_start_irq_id);
      *irq_serviced = irq;

      // Check if it is supposed to be the only IRQ fired.
      if (${ip.name_snake}_ctx.is_only_irq) {
        dif_${ip.name_snake}_irq_state_snapshot_t snapshot;
        CHECK_DIF_OK(dif_${ip.name_snake}_irq_get_state(
          ${ip.name_snake}_ctx.${ip.name_snake},
        % if ip.name_snake == "rv_timer":
          plic_ctx.hart_id,
        % endif
          &snapshot));
        CHECK(snapshot == (dif_${ip.name_snake}_irq_state_snapshot_t)(1 << irq),
          "Only ${ip.name_snake} IRQ %d expected to fire. Actual IRQ state = %x",
          irq, snapshot);
      }

      // Acknowledge the IRQ at the peripheral.
      CHECK_DIF_OK(dif_${ip.name_snake}_irq_acknowledge(
          ${ip.name_snake}_ctx.${ip.name_snake},
          irq));

      // Complete the IRQ at the PLIC.
      CHECK_DIF_OK(dif_rv_plic_irq_complete(
          plic_ctx.rv_plic,
          plic_ctx.hart_id,
          plic_irq_id));
    }

  % endif
% endfor

