1 /*
2  * Copyright (c) 2024 Meta Platforms
3  *
4  * SPDX-License-Identifier: Apache-2.0
5  */
6 
7 #include <zephyr/devicetree.h>
8 #include <zephyr/irq.h>
9 #include <zephyr/irq_multilevel.h>
10 #include <zephyr/ztest.h>
11 
ZTEST(interrupt_feature,test_multi_level_api)12 ZTEST(interrupt_feature, test_multi_level_api)
13 {
14 	/* Zephyr multilevel-encoded IRQ */
15 	const uint32_t irqn_l2 = DT_IRQN(DT_NODELABEL(test_l2_irq));
16 	const uint32_t irqn_l1 = DT_IRQN(DT_NODELABEL(test_l1_irq));
17 	/* Raw IRQ specified in the devicetree */
18 	const uint32_t raw_l2 = DT_IRQ(DT_NODELABEL(test_l2_irq), irq);
19 	const uint32_t raw_l1 = DT_IRQ(DT_NODELABEL(test_l1_irq), irq);
20 
21 	/**
22 	 *  - irq_get_level()
23 	 */
24 	zassert_equal(2, irq_get_level(irqn_l2));
25 	zassert_equal(1, irq_get_level(irqn_l1));
26 
27 	/**
28 	 *  - irq_from_level_2()
29 	 *  - irq_to_level_2()
30 	 *  - irq_parent_level_2()
31 	 */
32 	zassert_equal(irq_from_level_2(irqn_l2), raw_l2);
33 
34 	zassert_equal(irq_to_level_2(raw_l2) & irqn_l2, irq_to_level_2(raw_l2));
35 
36 	zassert_equal(irq_parent_level_2(irqn_l2), raw_l1);
37 
38 	/**
39 	 *  - irq_from_level()
40 	 *  - irq_to_level()
41 	 *  - irq_parent_level()
42 	 */
43 	zassert_equal(irq_from_level(irqn_l2, 2), raw_l2);
44 
45 	zassert_equal(irq_to_level(raw_l2, 2) & irqn_l2, irq_to_level(raw_l2, 2));
46 
47 	zassert_equal(irq_parent_level(irqn_l2, 2), raw_l1);
48 
49 	/**
50 	 *  - irq_get_intc_irq()
51 	 */
52 	zassert_equal(irq_get_intc_irq(irqn_l2), irqn_l1);
53 	zassert_equal(irq_get_intc_irq(irqn_l1), irqn_l1);
54 
55 	const uint32_t irqn_l2_inc = DT_IRQN(DT_NODELABEL(test_l2_irq_inc));
56 	const uint32_t irqn_l1_inc = DT_IRQN(DT_NODELABEL(test_l1_irq_inc));
57 
58 	/**
59 	 * - irq_increment()
60 	 */
61 	zassert_equal(irq_increment(irqn_l1, 1), irqn_l1_inc);
62 	zassert_equal(irq_increment(irqn_l2, 2), irqn_l2_inc);
63 }
64 
65 #ifdef CONFIG_3RD_LEVEL_INTERRUPTS
ZTEST(interrupt_feature,test_multi_level_api_l3)66 ZTEST(interrupt_feature, test_multi_level_api_l3)
67 {
68 	/* Zephyr multilevel-encoded IRQ */
69 	const uint32_t irqn_l2 = DT_IRQN(DT_NODELABEL(test_l2_irq));
70 	const uint32_t irqn_l3 = DT_IRQN(DT_NODELABEL(test_l3_irq));
71 	/* Raw IRQ specified in the devicetree */
72 	const uint32_t raw_l2 = DT_IRQ(DT_NODELABEL(test_l2_irq), irq);
73 	const uint32_t raw_l3 = DT_IRQ(DT_NODELABEL(test_l3_irq), irq);
74 
75 	/**
76 	 *  - irq_get_level()
77 	 */
78 	zassert_equal(3, irq_get_level(irqn_l3));
79 
80 	/**
81 	 *  - irq_from_level_2()
82 	 */
83 	zassert_equal(irq_from_level_2(irqn_l3), raw_l2);
84 
85 	/**
86 	 *  - irq_from_level_3()
87 	 *  - irq_to_level_3()
88 	 *  - irq_parent_level_3()
89 	 */
90 	zassert_equal(irq_from_level_3(irqn_l3), raw_l3);
91 
92 	zassert_equal(irq_to_level_3(raw_l3) & irqn_l3, irq_to_level_3(raw_l3));
93 
94 	zassert_equal(irq_parent_level_3(irqn_l3), raw_l2);
95 
96 	/**
97 	 *  - irq_from_level()
98 	 *  - irq_to_level()
99 	 *  - irq_parent_level()
100 	 */
101 	zassert_equal(irq_from_level(irqn_l3, 2), raw_l2);
102 	zassert_equal(irq_from_level(irqn_l3, 3), raw_l3);
103 
104 	zassert_equal(irq_to_level(raw_l3, 3) & irqn_l3, irq_to_level(raw_l3, 3));
105 
106 	zassert_equal(irq_parent_level(irqn_l3, 3), raw_l2);
107 
108 	/**
109 	 *  - irq_get_intc_irq()
110 	 */
111 	zassert_equal(irq_get_intc_irq(irqn_l3), irqn_l2);
112 
113 	const uint32_t irqn_l3_inc = DT_IRQN(DT_NODELABEL(test_l3_irq_inc));
114 
115 	/**
116 	 * - irq_increment()
117 	 */
118 	zassert_equal(irq_increment(irqn_l3, 3), irqn_l3_inc);
119 }
120 #endif /* CONFIG_3RD_LEVEL_INTERRUPTS */
121 
122 ZTEST_SUITE(gen_isr_table_multilevel, NULL, NULL, NULL, NULL, NULL);
123