Skip to content

Commit a9f10ca

Browse files
committed
of: Add testcases for interrupt parsing
This patch extends the DT selftest code with some test cases for the interrupt parsing functions. Signed-off-by: Grant Likely <[email protected]>
1 parent 624cfca commit a9f10ca

File tree

3 files changed

+127
-6
lines changed

3 files changed

+127
-6
lines changed
Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
2+
/ {
3+
testcase-data {
4+
interrupts {
5+
#address-cells = <0>;
6+
test_intc0: intc0 {
7+
interrupt-controller;
8+
#interrupt-cells = <1>;
9+
};
10+
11+
test_intc1: intc1 {
12+
interrupt-controller;
13+
#interrupt-cells = <3>;
14+
};
15+
16+
test_intc2: intc2 {
17+
interrupt-controller;
18+
#interrupt-cells = <2>;
19+
};
20+
21+
test_intmap0: intmap0 {
22+
#interrupt-cells = <1>;
23+
#address-cells = <0>;
24+
interrupt-map = <1 &test_intc0 9>,
25+
<2 &test_intc1 10 11 12>,
26+
<3 &test_intc2 13 14>,
27+
<4 &test_intc2 15 16>;
28+
};
29+
30+
interrupts0 {
31+
interrupt-parent = <&test_intc0>;
32+
interrupts = <1>, <2>, <3>, <4>;
33+
};
34+
35+
interrupts1 {
36+
interrupt-parent = <&test_intmap0>;
37+
interrupts = <1>, <2>, <3>, <4>;
38+
};
39+
};
40+
};
41+
};
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1 +1,2 @@
11
/include/ "tests-phandle.dtsi"
2+
/include/ "tests-interrupts.dtsi"

drivers/of/selftest.c

Lines changed: 85 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -9,18 +9,24 @@
99
#include <linux/errno.h>
1010
#include <linux/module.h>
1111
#include <linux/of.h>
12+
#include <linux/of_irq.h>
1213
#include <linux/list.h>
1314
#include <linux/mutex.h>
1415
#include <linux/slab.h>
1516
#include <linux/device.h>
1617

17-
static bool selftest_passed = true;
18+
static struct selftest_results {
19+
int passed;
20+
int failed;
21+
} selftest_results;
22+
1823
#define selftest(result, fmt, ...) { \
1924
if (!(result)) { \
20-
pr_err("FAIL %s:%i " fmt, __FILE__, __LINE__, ##__VA_ARGS__); \
21-
selftest_passed = false; \
25+
selftest_results.failed++; \
26+
pr_err("FAIL %s():%i " fmt, __func__, __LINE__, ##__VA_ARGS__); \
2227
} else { \
23-
pr_info("pass %s:%i\n", __FILE__, __LINE__); \
28+
selftest_results.passed++; \
29+
pr_debug("pass %s():%i\n", __func__, __LINE__); \
2430
} \
2531
}
2632

@@ -131,7 +137,6 @@ static void __init of_selftest_property_match_string(void)
131137
struct device_node *np;
132138
int rc;
133139

134-
pr_info("start\n");
135140
np = of_find_node_by_path("/testcase-data/phandle-tests/consumer-a");
136141
if (!np) {
137142
pr_err("No testcase data in device tree\n");
@@ -154,6 +159,78 @@ static void __init of_selftest_property_match_string(void)
154159
selftest(rc == -EILSEQ, "unterminated string; rc=%i", rc);
155160
}
156161

162+
static void __init of_selftest_parse_interrupts(void)
163+
{
164+
struct device_node *np;
165+
struct of_phandle_args args;
166+
int i, rc;
167+
168+
np = of_find_node_by_path("/testcase-data/interrupts/interrupts0");
169+
if (!np) {
170+
pr_err("missing testcase data\n");
171+
return;
172+
}
173+
174+
for (i = 0; i < 4; i++) {
175+
bool passed = true;
176+
args.args_count = 0;
177+
rc = of_irq_parse_one(np, i, &args);
178+
179+
passed &= !rc;
180+
passed &= (args.args_count == 1);
181+
passed &= (args.args[0] == (i + 1));
182+
183+
selftest(passed, "index %i - data error on node %s rc=%i\n",
184+
i, args.np->full_name, rc);
185+
}
186+
of_node_put(np);
187+
188+
np = of_find_node_by_path("/testcase-data/interrupts/interrupts1");
189+
if (!np) {
190+
pr_err("missing testcase data\n");
191+
return;
192+
}
193+
194+
for (i = 0; i < 4; i++) {
195+
bool passed = true;
196+
args.args_count = 0;
197+
rc = of_irq_parse_one(np, i, &args);
198+
199+
/* Test the values from tests-phandle.dtsi */
200+
switch (i) {
201+
case 0:
202+
passed &= !rc;
203+
passed &= (args.args_count == 1);
204+
passed &= (args.args[0] == 9);
205+
break;
206+
case 1:
207+
passed &= !rc;
208+
passed &= (args.args_count == 3);
209+
passed &= (args.args[0] == 10);
210+
passed &= (args.args[1] == 11);
211+
passed &= (args.args[2] == 12);
212+
break;
213+
case 2:
214+
passed &= !rc;
215+
passed &= (args.args_count == 2);
216+
passed &= (args.args[0] == 13);
217+
passed &= (args.args[1] == 14);
218+
break;
219+
case 3:
220+
passed &= !rc;
221+
passed &= (args.args_count == 2);
222+
passed &= (args.args[0] == 15);
223+
passed &= (args.args[1] == 16);
224+
break;
225+
default:
226+
passed = false;
227+
}
228+
selftest(passed, "index %i - data error on node %s rc=%i\n",
229+
i, args.np->full_name, rc);
230+
}
231+
of_node_put(np);
232+
}
233+
157234
static int __init of_selftest(void)
158235
{
159236
struct device_node *np;
@@ -168,7 +245,9 @@ static int __init of_selftest(void)
168245
pr_info("start of selftest - you will see error messages\n");
169246
of_selftest_parse_phandle_with_args();
170247
of_selftest_property_match_string();
171-
pr_info("end of selftest - %s\n", selftest_passed ? "PASS" : "FAIL");
248+
of_selftest_parse_interrupts();
249+
pr_info("end of selftest - %i passed, %i failed\n",
250+
selftest_results.passed, selftest_results.failed);
172251
return 0;
173252
}
174253
late_initcall(of_selftest);

0 commit comments

Comments
 (0)