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