zephyr/tests/kernel/interrupt/src/multilevel_irq.c
Yong Cong Sin b2b2963e6a irq: multilevel: compile 3rd level IRQ APIs only when enabled
This revert the idea of 3fa7d78 from #78845.

The 3rd level IRQ APIs won't compile when
CONFIG_3RD_LEVEL_INTERRUPT_BITS=0.

Updated testcases accordingly.

Signed-off-by: Yong Cong Sin <ycsin@meta.com>
Signed-off-by: Yong Cong Sin <yongcong.sin@gmail.com>
2025-02-19 14:49:27 +00:00

123 lines
3.1 KiB
C

/*
* Copyright (c) 2024 Meta Platforms
*
* SPDX-License-Identifier: Apache-2.0
*/
#include <zephyr/devicetree.h>
#include <zephyr/irq.h>
#include <zephyr/irq_multilevel.h>
#include <zephyr/ztest.h>
ZTEST(interrupt_feature, test_multi_level_api)
{
/* Zephyr multilevel-encoded IRQ */
const uint32_t irqn_l2 = DT_IRQN(DT_NODELABEL(test_l2_irq));
const uint32_t irqn_l1 = DT_IRQN(DT_NODELABEL(test_l1_irq));
/* Raw IRQ specified in the devicetree */
const uint32_t raw_l2 = DT_IRQ(DT_NODELABEL(test_l2_irq), irq);
const uint32_t raw_l1 = DT_IRQ(DT_NODELABEL(test_l1_irq), irq);
/**
* - irq_get_level()
*/
zassert_equal(2, irq_get_level(irqn_l2));
zassert_equal(1, irq_get_level(irqn_l1));
/**
* - irq_from_level_2()
* - irq_to_level_2()
* - irq_parent_level_2()
*/
zassert_equal(irq_from_level_2(irqn_l2), raw_l2);
zassert_equal(irq_to_level_2(raw_l2) & irqn_l2, irq_to_level_2(raw_l2));
zassert_equal(irq_parent_level_2(irqn_l2), raw_l1);
/**
* - irq_from_level()
* - irq_to_level()
* - irq_parent_level()
*/
zassert_equal(irq_from_level(irqn_l2, 2), raw_l2);
zassert_equal(irq_to_level(raw_l2, 2) & irqn_l2, irq_to_level(raw_l2, 2));
zassert_equal(irq_parent_level(irqn_l2, 2), raw_l1);
/**
* - irq_get_intc_irq()
*/
zassert_equal(irq_get_intc_irq(irqn_l2), irqn_l1);
zassert_equal(irq_get_intc_irq(irqn_l1), irqn_l1);
const uint32_t irqn_l2_inc = DT_IRQN(DT_NODELABEL(test_l2_irq_inc));
const uint32_t irqn_l1_inc = DT_IRQN(DT_NODELABEL(test_l1_irq_inc));
/**
* - irq_increment()
*/
zassert_equal(irq_increment(irqn_l1, 1), irqn_l1_inc);
zassert_equal(irq_increment(irqn_l2, 2), irqn_l2_inc);
}
#ifdef CONFIG_3RD_LEVEL_INTERRUPTS
ZTEST(interrupt_feature, test_multi_level_api_l3)
{
/* Zephyr multilevel-encoded IRQ */
const uint32_t irqn_l2 = DT_IRQN(DT_NODELABEL(test_l2_irq));
const uint32_t irqn_l3 = DT_IRQN(DT_NODELABEL(test_l3_irq));
/* Raw IRQ specified in the devicetree */
const uint32_t raw_l2 = DT_IRQ(DT_NODELABEL(test_l2_irq), irq);
const uint32_t raw_l3 = DT_IRQ(DT_NODELABEL(test_l3_irq), irq);
/**
* - irq_get_level()
*/
zassert_equal(3, irq_get_level(irqn_l3));
/**
* - irq_from_level_2()
*/
zassert_equal(irq_from_level_2(irqn_l3), raw_l2);
/**
* - irq_from_level_3()
* - irq_to_level_3()
* - irq_parent_level_3()
*/
zassert_equal(irq_from_level_3(irqn_l3), raw_l3);
zassert_equal(irq_to_level_3(raw_l3) & irqn_l3, irq_to_level_3(raw_l3));
zassert_equal(irq_parent_level_3(irqn_l3), raw_l2);
/**
* - irq_from_level()
* - irq_to_level()
* - irq_parent_level()
*/
zassert_equal(irq_from_level(irqn_l3, 2), raw_l2);
zassert_equal(irq_from_level(irqn_l3, 3), raw_l3);
zassert_equal(irq_to_level(raw_l3, 3) & irqn_l3, irq_to_level(raw_l3, 3));
zassert_equal(irq_parent_level(irqn_l3, 3), raw_l2);
/**
* - irq_get_intc_irq()
*/
zassert_equal(irq_get_intc_irq(irqn_l3), irqn_l2);
const uint32_t irqn_l3_inc = DT_IRQN(DT_NODELABEL(test_l3_irq_inc));
/**
* - irq_increment()
*/
zassert_equal(irq_increment(irqn_l3, 3), irqn_l3_inc);
}
#endif /* CONFIG_3RD_LEVEL_INTERRUPTS */
ZTEST_SUITE(gen_isr_table_multilevel, NULL, NULL, NULL, NULL, NULL);