/*
 * Copyright 2023 NXP
 *
 * SPDX-License-Identifier: Apache-2.0
 */

#include "test_shared_irq.h"

#define GIC_IRQ1 10
#define GIC_IRQ2 11

/**
 * @brief Test writing to a vector using static shared interrupts.
 *
 * @ingroup kernel_interrupt_tests
 *
 * @details This tests if interrupts are statically shared successfully
 * (i.e: multiple ISR/arg pairs are called whenever the interrupt they
 * were registered for is triggered).
 */
ZTEST(interrupt_feature, test_static_shared_irq_write)
{
	/* note: this test is very brittle since it requires that
	 * the chosen interrupt lines be unused for all of the
	 * testing platforms. Failing to meet this requirement
	 * leads to build failures due to the number of clients
	 * exceeding the limit. Still, it's important to test that
	 * the static shared interrupts work properly. As such,
	 * this test shall be restricted to a single platform, thus
	 * decreasing the risk of build errors appearing due to the
	 * chosen interrupts being used.
	 */
#ifndef CONFIG_BOARD_QEMU_CORTEX_A53
	ztest_test_skip();
#else
	int i;

	IRQ_CONNECT(GIC_IRQ1, IRQ_PRIORITY, test_isr_0, 0, 0);
	IRQ_CONNECT(GIC_IRQ1, IRQ_PRIORITY, test_isr_1, (void *)1, 0);
	IRQ_CONNECT(GIC_IRQ2, IRQ_PRIORITY, test_isr_2, (void *)2, 0);

	zassert_true(_sw_isr_table[GIC_IRQ1].isr == z_shared_isr,
		     "wrong _sw_isr_table ISR at GIC_IRQ1");
	zassert_true(_sw_isr_table[GIC_IRQ2].isr == test_isr_2,
		     "wrong _sw_isr_table ISR at GIC_IRQ1");

	zassert_true(_sw_isr_table[GIC_IRQ1].arg ==
		     &z_shared_sw_isr_table[GIC_IRQ1],
		     "wrong _sw_isr_table arg at GIC_IRQ1");
	zassert_true(_sw_isr_table[GIC_IRQ2].arg == (void *)2,
		     "wrong _sw_isr_table arg at GIC_IRQ2");

	zassert_true(z_shared_sw_isr_table[GIC_IRQ1].client_num == 2,
		     "wrong client number for GIC_IRQ1");
	zassert_true(!z_shared_sw_isr_table[GIC_IRQ2].client_num,
		     "wrong client number for GIC_IRQ2");

	zassert_true(client_exists_at_index(test_isr_0, 0, GIC_IRQ1,
					    TEST_INVALID_IDX),
		     "test_isr_0 not a client for GIC_IRQ1");
	zassert_true(client_exists_at_index(test_isr_1, (void *)1, GIC_IRQ1,
					    TEST_INVALID_IDX),
		     "test_isr_1 not a client for GIC_IRQ1");

	irq_enable(GIC_IRQ1);
	irq_enable(GIC_IRQ2);

	trigger_irq(GIC_IRQ1);
	trigger_irq(GIC_IRQ2);

	/* wait 5ms before checking the results */
	k_busy_wait(5000);

	for (i = 0; i < TEST_VECTOR_SIZE; i++) {
		zassert_true(test_vector[i] == result_vector[i],
			     "wrong test_vector value at %d: 0x%x vs 0x%x",
			     i, test_vector[i], result_vector[i]);
	}

	irq_disable(GIC_IRQ1);
	irq_disable(GIC_IRQ2);

#ifdef CONFIG_DYNAMIC_INTERRUPTS
	/* if dynamic interrupts are enabled this will restore the _sw_isr_table
	 * entries for GIC_IRQ1 and GIC_IRQ2 to their default values (NULL,
	 * z_irq_spurious). In turn, this will increase the probability of
	 * dynamic_shared_irq.c's get_irq_slot() being able to find an available
	 * slot.
	 */
	arch_irq_disconnect_dynamic(GIC_IRQ1, IRQ_PRIORITY, test_isr_0, 0, 0);
	arch_irq_disconnect_dynamic(GIC_IRQ1, IRQ_PRIORITY, test_isr_1, (void *)1, 0);
	arch_irq_disconnect_dynamic(GIC_IRQ2, IRQ_PRIORITY, test_isr_2, (void *)2, 0);
#endif /* CONFIG_DYNAMIC_INTERRUPTS */

#endif /* CONFIG_BOARD_QEMU_CORTEX_A53 */
}
