xref: /openbmc/linux/drivers/of/unittest.c (revision 4949009e)
1 /*
2  * Self tests for device tree subsystem
3  */
4 
5 #define pr_fmt(fmt) "### dt-test ### " fmt
6 
7 #include <linux/clk.h>
8 #include <linux/err.h>
9 #include <linux/errno.h>
10 #include <linux/hashtable.h>
11 #include <linux/module.h>
12 #include <linux/of.h>
13 #include <linux/of_fdt.h>
14 #include <linux/of_irq.h>
15 #include <linux/of_platform.h>
16 #include <linux/list.h>
17 #include <linux/mutex.h>
18 #include <linux/slab.h>
19 #include <linux/device.h>
20 #include <linux/platform_device.h>
21 #include <linux/of_platform.h>
22 
23 #include "of_private.h"
24 
25 static struct selftest_results {
26 	int passed;
27 	int failed;
28 } selftest_results;
29 
30 #define NO_OF_NODES 3
31 static struct device_node *nodes[NO_OF_NODES];
32 static int last_node_index;
33 static bool selftest_live_tree;
34 
35 #define selftest(result, fmt, ...) ({ \
36 	bool failed = !(result); \
37 	if (failed) { \
38 		selftest_results.failed++; \
39 		pr_err("FAIL %s():%i " fmt, __func__, __LINE__, ##__VA_ARGS__); \
40 	} else { \
41 		selftest_results.passed++; \
42 		pr_debug("pass %s():%i\n", __func__, __LINE__); \
43 	} \
44 	failed; \
45 })
46 
47 static void __init of_selftest_find_node_by_name(void)
48 {
49 	struct device_node *np;
50 	const char *options;
51 
52 	np = of_find_node_by_path("/testcase-data");
53 	selftest(np && !strcmp("/testcase-data", np->full_name),
54 		"find /testcase-data failed\n");
55 	of_node_put(np);
56 
57 	/* Test if trailing '/' works */
58 	np = of_find_node_by_path("/testcase-data/");
59 	selftest(!np, "trailing '/' on /testcase-data/ should fail\n");
60 
61 	np = of_find_node_by_path("/testcase-data/phandle-tests/consumer-a");
62 	selftest(np && !strcmp("/testcase-data/phandle-tests/consumer-a", np->full_name),
63 		"find /testcase-data/phandle-tests/consumer-a failed\n");
64 	of_node_put(np);
65 
66 	np = of_find_node_by_path("testcase-alias");
67 	selftest(np && !strcmp("/testcase-data", np->full_name),
68 		"find testcase-alias failed\n");
69 	of_node_put(np);
70 
71 	/* Test if trailing '/' works on aliases */
72 	np = of_find_node_by_path("testcase-alias/");
73 	selftest(!np, "trailing '/' on testcase-alias/ should fail\n");
74 
75 	np = of_find_node_by_path("testcase-alias/phandle-tests/consumer-a");
76 	selftest(np && !strcmp("/testcase-data/phandle-tests/consumer-a", np->full_name),
77 		"find testcase-alias/phandle-tests/consumer-a failed\n");
78 	of_node_put(np);
79 
80 	np = of_find_node_by_path("/testcase-data/missing-path");
81 	selftest(!np, "non-existent path returned node %s\n", np->full_name);
82 	of_node_put(np);
83 
84 	np = of_find_node_by_path("missing-alias");
85 	selftest(!np, "non-existent alias returned node %s\n", np->full_name);
86 	of_node_put(np);
87 
88 	np = of_find_node_by_path("testcase-alias/missing-path");
89 	selftest(!np, "non-existent alias with relative path returned node %s\n", np->full_name);
90 	of_node_put(np);
91 
92 	np = of_find_node_opts_by_path("/testcase-data:testoption", &options);
93 	selftest(np && !strcmp("testoption", options),
94 		 "option path test failed\n");
95 	of_node_put(np);
96 
97 	np = of_find_node_opts_by_path("/testcase-data:testoption", NULL);
98 	selftest(np, "NULL option path test failed\n");
99 	of_node_put(np);
100 
101 	np = of_find_node_opts_by_path("testcase-alias:testaliasoption",
102 				       &options);
103 	selftest(np && !strcmp("testaliasoption", options),
104 		 "option alias path test failed\n");
105 	of_node_put(np);
106 
107 	np = of_find_node_opts_by_path("testcase-alias:testaliasoption", NULL);
108 	selftest(np, "NULL option alias path test failed\n");
109 	of_node_put(np);
110 
111 	options = "testoption";
112 	np = of_find_node_opts_by_path("testcase-alias", &options);
113 	selftest(np && !options, "option clearing test failed\n");
114 	of_node_put(np);
115 
116 	options = "testoption";
117 	np = of_find_node_opts_by_path("/", &options);
118 	selftest(np && !options, "option clearing root node test failed\n");
119 	of_node_put(np);
120 }
121 
122 static void __init of_selftest_dynamic(void)
123 {
124 	struct device_node *np;
125 	struct property *prop;
126 
127 	np = of_find_node_by_path("/testcase-data");
128 	if (!np) {
129 		pr_err("missing testcase data\n");
130 		return;
131 	}
132 
133 	/* Array of 4 properties for the purpose of testing */
134 	prop = kzalloc(sizeof(*prop) * 4, GFP_KERNEL);
135 	if (!prop) {
136 		selftest(0, "kzalloc() failed\n");
137 		return;
138 	}
139 
140 	/* Add a new property - should pass*/
141 	prop->name = "new-property";
142 	prop->value = "new-property-data";
143 	prop->length = strlen(prop->value);
144 	selftest(of_add_property(np, prop) == 0, "Adding a new property failed\n");
145 
146 	/* Try to add an existing property - should fail */
147 	prop++;
148 	prop->name = "new-property";
149 	prop->value = "new-property-data-should-fail";
150 	prop->length = strlen(prop->value);
151 	selftest(of_add_property(np, prop) != 0,
152 		 "Adding an existing property should have failed\n");
153 
154 	/* Try to modify an existing property - should pass */
155 	prop->value = "modify-property-data-should-pass";
156 	prop->length = strlen(prop->value);
157 	selftest(of_update_property(np, prop) == 0,
158 		 "Updating an existing property should have passed\n");
159 
160 	/* Try to modify non-existent property - should pass*/
161 	prop++;
162 	prop->name = "modify-property";
163 	prop->value = "modify-missing-property-data-should-pass";
164 	prop->length = strlen(prop->value);
165 	selftest(of_update_property(np, prop) == 0,
166 		 "Updating a missing property should have passed\n");
167 
168 	/* Remove property - should pass */
169 	selftest(of_remove_property(np, prop) == 0,
170 		 "Removing a property should have passed\n");
171 
172 	/* Adding very large property - should pass */
173 	prop++;
174 	prop->name = "large-property-PAGE_SIZEx8";
175 	prop->length = PAGE_SIZE * 8;
176 	prop->value = kzalloc(prop->length, GFP_KERNEL);
177 	selftest(prop->value != NULL, "Unable to allocate large buffer\n");
178 	if (prop->value)
179 		selftest(of_add_property(np, prop) == 0,
180 			 "Adding a large property should have passed\n");
181 }
182 
183 static int __init of_selftest_check_node_linkage(struct device_node *np)
184 {
185 	struct device_node *child;
186 	int count = 0, rc;
187 
188 	for_each_child_of_node(np, child) {
189 		if (child->parent != np) {
190 			pr_err("Child node %s links to wrong parent %s\n",
191 				 child->name, np->name);
192 			return -EINVAL;
193 		}
194 
195 		rc = of_selftest_check_node_linkage(child);
196 		if (rc < 0)
197 			return rc;
198 		count += rc;
199 	}
200 
201 	return count + 1;
202 }
203 
204 static void __init of_selftest_check_tree_linkage(void)
205 {
206 	struct device_node *np;
207 	int allnode_count = 0, child_count;
208 
209 	if (!of_root)
210 		return;
211 
212 	for_each_of_allnodes(np)
213 		allnode_count++;
214 	child_count = of_selftest_check_node_linkage(of_root);
215 
216 	selftest(child_count > 0, "Device node data structure is corrupted\n");
217 	selftest(child_count == allnode_count, "allnodes list size (%i) doesn't match"
218 		 "sibling lists size (%i)\n", allnode_count, child_count);
219 	pr_debug("allnodes list size (%i); sibling lists size (%i)\n", allnode_count, child_count);
220 }
221 
222 struct node_hash {
223 	struct hlist_node node;
224 	struct device_node *np;
225 };
226 
227 static DEFINE_HASHTABLE(phandle_ht, 8);
228 static void __init of_selftest_check_phandles(void)
229 {
230 	struct device_node *np;
231 	struct node_hash *nh;
232 	struct hlist_node *tmp;
233 	int i, dup_count = 0, phandle_count = 0;
234 
235 	for_each_of_allnodes(np) {
236 		if (!np->phandle)
237 			continue;
238 
239 		hash_for_each_possible(phandle_ht, nh, node, np->phandle) {
240 			if (nh->np->phandle == np->phandle) {
241 				pr_info("Duplicate phandle! %i used by %s and %s\n",
242 					np->phandle, nh->np->full_name, np->full_name);
243 				dup_count++;
244 				break;
245 			}
246 		}
247 
248 		nh = kzalloc(sizeof(*nh), GFP_KERNEL);
249 		if (WARN_ON(!nh))
250 			return;
251 
252 		nh->np = np;
253 		hash_add(phandle_ht, &nh->node, np->phandle);
254 		phandle_count++;
255 	}
256 	selftest(dup_count == 0, "Found %i duplicates in %i phandles\n",
257 		 dup_count, phandle_count);
258 
259 	/* Clean up */
260 	hash_for_each_safe(phandle_ht, i, tmp, nh, node) {
261 		hash_del(&nh->node);
262 		kfree(nh);
263 	}
264 }
265 
266 static void __init of_selftest_parse_phandle_with_args(void)
267 {
268 	struct device_node *np;
269 	struct of_phandle_args args;
270 	int i, rc;
271 
272 	np = of_find_node_by_path("/testcase-data/phandle-tests/consumer-a");
273 	if (!np) {
274 		pr_err("missing testcase data\n");
275 		return;
276 	}
277 
278 	rc = of_count_phandle_with_args(np, "phandle-list", "#phandle-cells");
279 	selftest(rc == 7, "of_count_phandle_with_args() returned %i, expected 7\n", rc);
280 
281 	for (i = 0; i < 8; i++) {
282 		bool passed = true;
283 		rc = of_parse_phandle_with_args(np, "phandle-list",
284 						"#phandle-cells", i, &args);
285 
286 		/* Test the values from tests-phandle.dtsi */
287 		switch (i) {
288 		case 0:
289 			passed &= !rc;
290 			passed &= (args.args_count == 1);
291 			passed &= (args.args[0] == (i + 1));
292 			break;
293 		case 1:
294 			passed &= !rc;
295 			passed &= (args.args_count == 2);
296 			passed &= (args.args[0] == (i + 1));
297 			passed &= (args.args[1] == 0);
298 			break;
299 		case 2:
300 			passed &= (rc == -ENOENT);
301 			break;
302 		case 3:
303 			passed &= !rc;
304 			passed &= (args.args_count == 3);
305 			passed &= (args.args[0] == (i + 1));
306 			passed &= (args.args[1] == 4);
307 			passed &= (args.args[2] == 3);
308 			break;
309 		case 4:
310 			passed &= !rc;
311 			passed &= (args.args_count == 2);
312 			passed &= (args.args[0] == (i + 1));
313 			passed &= (args.args[1] == 100);
314 			break;
315 		case 5:
316 			passed &= !rc;
317 			passed &= (args.args_count == 0);
318 			break;
319 		case 6:
320 			passed &= !rc;
321 			passed &= (args.args_count == 1);
322 			passed &= (args.args[0] == (i + 1));
323 			break;
324 		case 7:
325 			passed &= (rc == -ENOENT);
326 			break;
327 		default:
328 			passed = false;
329 		}
330 
331 		selftest(passed, "index %i - data error on node %s rc=%i\n",
332 			 i, args.np->full_name, rc);
333 	}
334 
335 	/* Check for missing list property */
336 	rc = of_parse_phandle_with_args(np, "phandle-list-missing",
337 					"#phandle-cells", 0, &args);
338 	selftest(rc == -ENOENT, "expected:%i got:%i\n", -ENOENT, rc);
339 	rc = of_count_phandle_with_args(np, "phandle-list-missing",
340 					"#phandle-cells");
341 	selftest(rc == -ENOENT, "expected:%i got:%i\n", -ENOENT, rc);
342 
343 	/* Check for missing cells property */
344 	rc = of_parse_phandle_with_args(np, "phandle-list",
345 					"#phandle-cells-missing", 0, &args);
346 	selftest(rc == -EINVAL, "expected:%i got:%i\n", -EINVAL, rc);
347 	rc = of_count_phandle_with_args(np, "phandle-list",
348 					"#phandle-cells-missing");
349 	selftest(rc == -EINVAL, "expected:%i got:%i\n", -EINVAL, rc);
350 
351 	/* Check for bad phandle in list */
352 	rc = of_parse_phandle_with_args(np, "phandle-list-bad-phandle",
353 					"#phandle-cells", 0, &args);
354 	selftest(rc == -EINVAL, "expected:%i got:%i\n", -EINVAL, rc);
355 	rc = of_count_phandle_with_args(np, "phandle-list-bad-phandle",
356 					"#phandle-cells");
357 	selftest(rc == -EINVAL, "expected:%i got:%i\n", -EINVAL, rc);
358 
359 	/* Check for incorrectly formed argument list */
360 	rc = of_parse_phandle_with_args(np, "phandle-list-bad-args",
361 					"#phandle-cells", 1, &args);
362 	selftest(rc == -EINVAL, "expected:%i got:%i\n", -EINVAL, rc);
363 	rc = of_count_phandle_with_args(np, "phandle-list-bad-args",
364 					"#phandle-cells");
365 	selftest(rc == -EINVAL, "expected:%i got:%i\n", -EINVAL, rc);
366 }
367 
368 static void __init of_selftest_property_string(void)
369 {
370 	const char *strings[4];
371 	struct device_node *np;
372 	int rc;
373 
374 	np = of_find_node_by_path("/testcase-data/phandle-tests/consumer-a");
375 	if (!np) {
376 		pr_err("No testcase data in device tree\n");
377 		return;
378 	}
379 
380 	rc = of_property_match_string(np, "phandle-list-names", "first");
381 	selftest(rc == 0, "first expected:0 got:%i\n", rc);
382 	rc = of_property_match_string(np, "phandle-list-names", "second");
383 	selftest(rc == 1, "second expected:0 got:%i\n", rc);
384 	rc = of_property_match_string(np, "phandle-list-names", "third");
385 	selftest(rc == 2, "third expected:0 got:%i\n", rc);
386 	rc = of_property_match_string(np, "phandle-list-names", "fourth");
387 	selftest(rc == -ENODATA, "unmatched string; rc=%i\n", rc);
388 	rc = of_property_match_string(np, "missing-property", "blah");
389 	selftest(rc == -EINVAL, "missing property; rc=%i\n", rc);
390 	rc = of_property_match_string(np, "empty-property", "blah");
391 	selftest(rc == -ENODATA, "empty property; rc=%i\n", rc);
392 	rc = of_property_match_string(np, "unterminated-string", "blah");
393 	selftest(rc == -EILSEQ, "unterminated string; rc=%i\n", rc);
394 
395 	/* of_property_count_strings() tests */
396 	rc = of_property_count_strings(np, "string-property");
397 	selftest(rc == 1, "Incorrect string count; rc=%i\n", rc);
398 	rc = of_property_count_strings(np, "phandle-list-names");
399 	selftest(rc == 3, "Incorrect string count; rc=%i\n", rc);
400 	rc = of_property_count_strings(np, "unterminated-string");
401 	selftest(rc == -EILSEQ, "unterminated string; rc=%i\n", rc);
402 	rc = of_property_count_strings(np, "unterminated-string-list");
403 	selftest(rc == -EILSEQ, "unterminated string array; rc=%i\n", rc);
404 
405 	/* of_property_read_string_index() tests */
406 	rc = of_property_read_string_index(np, "string-property", 0, strings);
407 	selftest(rc == 0 && !strcmp(strings[0], "foobar"), "of_property_read_string_index() failure; rc=%i\n", rc);
408 	strings[0] = NULL;
409 	rc = of_property_read_string_index(np, "string-property", 1, strings);
410 	selftest(rc == -ENODATA && strings[0] == NULL, "of_property_read_string_index() failure; rc=%i\n", rc);
411 	rc = of_property_read_string_index(np, "phandle-list-names", 0, strings);
412 	selftest(rc == 0 && !strcmp(strings[0], "first"), "of_property_read_string_index() failure; rc=%i\n", rc);
413 	rc = of_property_read_string_index(np, "phandle-list-names", 1, strings);
414 	selftest(rc == 0 && !strcmp(strings[0], "second"), "of_property_read_string_index() failure; rc=%i\n", rc);
415 	rc = of_property_read_string_index(np, "phandle-list-names", 2, strings);
416 	selftest(rc == 0 && !strcmp(strings[0], "third"), "of_property_read_string_index() failure; rc=%i\n", rc);
417 	strings[0] = NULL;
418 	rc = of_property_read_string_index(np, "phandle-list-names", 3, strings);
419 	selftest(rc == -ENODATA && strings[0] == NULL, "of_property_read_string_index() failure; rc=%i\n", rc);
420 	strings[0] = NULL;
421 	rc = of_property_read_string_index(np, "unterminated-string", 0, strings);
422 	selftest(rc == -EILSEQ && strings[0] == NULL, "of_property_read_string_index() failure; rc=%i\n", rc);
423 	rc = of_property_read_string_index(np, "unterminated-string-list", 0, strings);
424 	selftest(rc == 0 && !strcmp(strings[0], "first"), "of_property_read_string_index() failure; rc=%i\n", rc);
425 	strings[0] = NULL;
426 	rc = of_property_read_string_index(np, "unterminated-string-list", 2, strings); /* should fail */
427 	selftest(rc == -EILSEQ && strings[0] == NULL, "of_property_read_string_index() failure; rc=%i\n", rc);
428 	strings[1] = NULL;
429 
430 	/* of_property_read_string_array() tests */
431 	rc = of_property_read_string_array(np, "string-property", strings, 4);
432 	selftest(rc == 1, "Incorrect string count; rc=%i\n", rc);
433 	rc = of_property_read_string_array(np, "phandle-list-names", strings, 4);
434 	selftest(rc == 3, "Incorrect string count; rc=%i\n", rc);
435 	rc = of_property_read_string_array(np, "unterminated-string", strings, 4);
436 	selftest(rc == -EILSEQ, "unterminated string; rc=%i\n", rc);
437 	/* -- An incorrectly formed string should cause a failure */
438 	rc = of_property_read_string_array(np, "unterminated-string-list", strings, 4);
439 	selftest(rc == -EILSEQ, "unterminated string array; rc=%i\n", rc);
440 	/* -- parsing the correctly formed strings should still work: */
441 	strings[2] = NULL;
442 	rc = of_property_read_string_array(np, "unterminated-string-list", strings, 2);
443 	selftest(rc == 2 && strings[2] == NULL, "of_property_read_string_array() failure; rc=%i\n", rc);
444 	strings[1] = NULL;
445 	rc = of_property_read_string_array(np, "phandle-list-names", strings, 1);
446 	selftest(rc == 1 && strings[1] == NULL, "Overwrote end of string array; rc=%i, str='%s'\n", rc, strings[1]);
447 }
448 
449 #define propcmp(p1, p2) (((p1)->length == (p2)->length) && \
450 			(p1)->value && (p2)->value && \
451 			!memcmp((p1)->value, (p2)->value, (p1)->length) && \
452 			!strcmp((p1)->name, (p2)->name))
453 static void __init of_selftest_property_copy(void)
454 {
455 #ifdef CONFIG_OF_DYNAMIC
456 	struct property p1 = { .name = "p1", .length = 0, .value = "" };
457 	struct property p2 = { .name = "p2", .length = 5, .value = "abcd" };
458 	struct property *new;
459 
460 	new = __of_prop_dup(&p1, GFP_KERNEL);
461 	selftest(new && propcmp(&p1, new), "empty property didn't copy correctly\n");
462 	kfree(new->value);
463 	kfree(new->name);
464 	kfree(new);
465 
466 	new = __of_prop_dup(&p2, GFP_KERNEL);
467 	selftest(new && propcmp(&p2, new), "non-empty property didn't copy correctly\n");
468 	kfree(new->value);
469 	kfree(new->name);
470 	kfree(new);
471 #endif
472 }
473 
474 static void __init of_selftest_changeset(void)
475 {
476 #ifdef CONFIG_OF_DYNAMIC
477 	struct property *ppadd, padd = { .name = "prop-add", .length = 0, .value = "" };
478 	struct property *ppupdate, pupdate = { .name = "prop-update", .length = 5, .value = "abcd" };
479 	struct property *ppremove;
480 	struct device_node *n1, *n2, *n21, *nremove, *parent, *np;
481 	struct of_changeset chgset;
482 
483 	of_changeset_init(&chgset);
484 	n1 = __of_node_dup(NULL, "/testcase-data/changeset/n1");
485 	selftest(n1, "testcase setup failure\n");
486 	n2 = __of_node_dup(NULL, "/testcase-data/changeset/n2");
487 	selftest(n2, "testcase setup failure\n");
488 	n21 = __of_node_dup(NULL, "%s/%s", "/testcase-data/changeset/n2", "n21");
489 	selftest(n21, "testcase setup failure %p\n", n21);
490 	nremove = of_find_node_by_path("/testcase-data/changeset/node-remove");
491 	selftest(nremove, "testcase setup failure\n");
492 	ppadd = __of_prop_dup(&padd, GFP_KERNEL);
493 	selftest(ppadd, "testcase setup failure\n");
494 	ppupdate = __of_prop_dup(&pupdate, GFP_KERNEL);
495 	selftest(ppupdate, "testcase setup failure\n");
496 	parent = nremove->parent;
497 	n1->parent = parent;
498 	n2->parent = parent;
499 	n21->parent = n2;
500 	n2->child = n21;
501 	ppremove = of_find_property(parent, "prop-remove", NULL);
502 	selftest(ppremove, "failed to find removal prop");
503 
504 	of_changeset_init(&chgset);
505 	selftest(!of_changeset_attach_node(&chgset, n1), "fail attach n1\n");
506 	selftest(!of_changeset_attach_node(&chgset, n2), "fail attach n2\n");
507 	selftest(!of_changeset_detach_node(&chgset, nremove), "fail remove node\n");
508 	selftest(!of_changeset_attach_node(&chgset, n21), "fail attach n21\n");
509 	selftest(!of_changeset_add_property(&chgset, parent, ppadd), "fail add prop\n");
510 	selftest(!of_changeset_update_property(&chgset, parent, ppupdate), "fail update prop\n");
511 	selftest(!of_changeset_remove_property(&chgset, parent, ppremove), "fail remove prop\n");
512 	mutex_lock(&of_mutex);
513 	selftest(!of_changeset_apply(&chgset), "apply failed\n");
514 	mutex_unlock(&of_mutex);
515 
516 	/* Make sure node names are constructed correctly */
517 	selftest((np = of_find_node_by_path("/testcase-data/changeset/n2/n21")),
518 		 "'%s' not added\n", n21->full_name);
519 	of_node_put(np);
520 
521 	mutex_lock(&of_mutex);
522 	selftest(!of_changeset_revert(&chgset), "revert failed\n");
523 	mutex_unlock(&of_mutex);
524 
525 	of_changeset_destroy(&chgset);
526 #endif
527 }
528 
529 static void __init of_selftest_parse_interrupts(void)
530 {
531 	struct device_node *np;
532 	struct of_phandle_args args;
533 	int i, rc;
534 
535 	np = of_find_node_by_path("/testcase-data/interrupts/interrupts0");
536 	if (!np) {
537 		pr_err("missing testcase data\n");
538 		return;
539 	}
540 
541 	for (i = 0; i < 4; i++) {
542 		bool passed = true;
543 		args.args_count = 0;
544 		rc = of_irq_parse_one(np, i, &args);
545 
546 		passed &= !rc;
547 		passed &= (args.args_count == 1);
548 		passed &= (args.args[0] == (i + 1));
549 
550 		selftest(passed, "index %i - data error on node %s rc=%i\n",
551 			 i, args.np->full_name, rc);
552 	}
553 	of_node_put(np);
554 
555 	np = of_find_node_by_path("/testcase-data/interrupts/interrupts1");
556 	if (!np) {
557 		pr_err("missing testcase data\n");
558 		return;
559 	}
560 
561 	for (i = 0; i < 4; i++) {
562 		bool passed = true;
563 		args.args_count = 0;
564 		rc = of_irq_parse_one(np, i, &args);
565 
566 		/* Test the values from tests-phandle.dtsi */
567 		switch (i) {
568 		case 0:
569 			passed &= !rc;
570 			passed &= (args.args_count == 1);
571 			passed &= (args.args[0] == 9);
572 			break;
573 		case 1:
574 			passed &= !rc;
575 			passed &= (args.args_count == 3);
576 			passed &= (args.args[0] == 10);
577 			passed &= (args.args[1] == 11);
578 			passed &= (args.args[2] == 12);
579 			break;
580 		case 2:
581 			passed &= !rc;
582 			passed &= (args.args_count == 2);
583 			passed &= (args.args[0] == 13);
584 			passed &= (args.args[1] == 14);
585 			break;
586 		case 3:
587 			passed &= !rc;
588 			passed &= (args.args_count == 2);
589 			passed &= (args.args[0] == 15);
590 			passed &= (args.args[1] == 16);
591 			break;
592 		default:
593 			passed = false;
594 		}
595 		selftest(passed, "index %i - data error on node %s rc=%i\n",
596 			 i, args.np->full_name, rc);
597 	}
598 	of_node_put(np);
599 }
600 
601 static void __init of_selftest_parse_interrupts_extended(void)
602 {
603 	struct device_node *np;
604 	struct of_phandle_args args;
605 	int i, rc;
606 
607 	np = of_find_node_by_path("/testcase-data/interrupts/interrupts-extended0");
608 	if (!np) {
609 		pr_err("missing testcase data\n");
610 		return;
611 	}
612 
613 	for (i = 0; i < 7; i++) {
614 		bool passed = true;
615 		rc = of_irq_parse_one(np, i, &args);
616 
617 		/* Test the values from tests-phandle.dtsi */
618 		switch (i) {
619 		case 0:
620 			passed &= !rc;
621 			passed &= (args.args_count == 1);
622 			passed &= (args.args[0] == 1);
623 			break;
624 		case 1:
625 			passed &= !rc;
626 			passed &= (args.args_count == 3);
627 			passed &= (args.args[0] == 2);
628 			passed &= (args.args[1] == 3);
629 			passed &= (args.args[2] == 4);
630 			break;
631 		case 2:
632 			passed &= !rc;
633 			passed &= (args.args_count == 2);
634 			passed &= (args.args[0] == 5);
635 			passed &= (args.args[1] == 6);
636 			break;
637 		case 3:
638 			passed &= !rc;
639 			passed &= (args.args_count == 1);
640 			passed &= (args.args[0] == 9);
641 			break;
642 		case 4:
643 			passed &= !rc;
644 			passed &= (args.args_count == 3);
645 			passed &= (args.args[0] == 10);
646 			passed &= (args.args[1] == 11);
647 			passed &= (args.args[2] == 12);
648 			break;
649 		case 5:
650 			passed &= !rc;
651 			passed &= (args.args_count == 2);
652 			passed &= (args.args[0] == 13);
653 			passed &= (args.args[1] == 14);
654 			break;
655 		case 6:
656 			passed &= !rc;
657 			passed &= (args.args_count == 1);
658 			passed &= (args.args[0] == 15);
659 			break;
660 		default:
661 			passed = false;
662 		}
663 
664 		selftest(passed, "index %i - data error on node %s rc=%i\n",
665 			 i, args.np->full_name, rc);
666 	}
667 	of_node_put(np);
668 }
669 
670 static struct of_device_id match_node_table[] = {
671 	{ .data = "A", .name = "name0", }, /* Name alone is lowest priority */
672 	{ .data = "B", .type = "type1", }, /* followed by type alone */
673 
674 	{ .data = "Ca", .name = "name2", .type = "type1", }, /* followed by both together */
675 	{ .data = "Cb", .name = "name2", }, /* Only match when type doesn't match */
676 	{ .data = "Cc", .name = "name2", .type = "type2", },
677 
678 	{ .data = "E", .compatible = "compat3" },
679 	{ .data = "G", .compatible = "compat2", },
680 	{ .data = "H", .compatible = "compat2", .name = "name5", },
681 	{ .data = "I", .compatible = "compat2", .type = "type1", },
682 	{ .data = "J", .compatible = "compat2", .type = "type1", .name = "name8", },
683 	{ .data = "K", .compatible = "compat2", .name = "name9", },
684 	{}
685 };
686 
687 static struct {
688 	const char *path;
689 	const char *data;
690 } match_node_tests[] = {
691 	{ .path = "/testcase-data/match-node/name0", .data = "A", },
692 	{ .path = "/testcase-data/match-node/name1", .data = "B", },
693 	{ .path = "/testcase-data/match-node/a/name2", .data = "Ca", },
694 	{ .path = "/testcase-data/match-node/b/name2", .data = "Cb", },
695 	{ .path = "/testcase-data/match-node/c/name2", .data = "Cc", },
696 	{ .path = "/testcase-data/match-node/name3", .data = "E", },
697 	{ .path = "/testcase-data/match-node/name4", .data = "G", },
698 	{ .path = "/testcase-data/match-node/name5", .data = "H", },
699 	{ .path = "/testcase-data/match-node/name6", .data = "G", },
700 	{ .path = "/testcase-data/match-node/name7", .data = "I", },
701 	{ .path = "/testcase-data/match-node/name8", .data = "J", },
702 	{ .path = "/testcase-data/match-node/name9", .data = "K", },
703 };
704 
705 static void __init of_selftest_match_node(void)
706 {
707 	struct device_node *np;
708 	const struct of_device_id *match;
709 	int i;
710 
711 	for (i = 0; i < ARRAY_SIZE(match_node_tests); i++) {
712 		np = of_find_node_by_path(match_node_tests[i].path);
713 		if (!np) {
714 			selftest(0, "missing testcase node %s\n",
715 				match_node_tests[i].path);
716 			continue;
717 		}
718 
719 		match = of_match_node(match_node_table, np);
720 		if (!match) {
721 			selftest(0, "%s didn't match anything\n",
722 				match_node_tests[i].path);
723 			continue;
724 		}
725 
726 		if (strcmp(match->data, match_node_tests[i].data) != 0) {
727 			selftest(0, "%s got wrong match. expected %s, got %s\n",
728 				match_node_tests[i].path, match_node_tests[i].data,
729 				(const char *)match->data);
730 			continue;
731 		}
732 		selftest(1, "passed");
733 	}
734 }
735 
736 struct device test_bus = {
737 	.init_name = "unittest-bus",
738 };
739 static void __init of_selftest_platform_populate(void)
740 {
741 	int irq, rc;
742 	struct device_node *np, *child, *grandchild;
743 	struct platform_device *pdev;
744 	struct of_device_id match[] = {
745 		{ .compatible = "test-device", },
746 		{}
747 	};
748 
749 	np = of_find_node_by_path("/testcase-data");
750 	of_platform_populate(np, of_default_bus_match_table, NULL, NULL);
751 
752 	/* Test that a missing irq domain returns -EPROBE_DEFER */
753 	np = of_find_node_by_path("/testcase-data/testcase-device1");
754 	pdev = of_find_device_by_node(np);
755 	selftest(pdev, "device 1 creation failed\n");
756 
757 	irq = platform_get_irq(pdev, 0);
758 	selftest(irq == -EPROBE_DEFER, "device deferred probe failed - %d\n", irq);
759 
760 	/* Test that a parsing failure does not return -EPROBE_DEFER */
761 	np = of_find_node_by_path("/testcase-data/testcase-device2");
762 	pdev = of_find_device_by_node(np);
763 	selftest(pdev, "device 2 creation failed\n");
764 	irq = platform_get_irq(pdev, 0);
765 	selftest(irq < 0 && irq != -EPROBE_DEFER, "device parsing error failed - %d\n", irq);
766 
767 	if (selftest(np = of_find_node_by_path("/testcase-data/platform-tests"),
768 		     "No testcase data in device tree\n"));
769 		return;
770 
771 	if (selftest(!(rc = device_register(&test_bus)),
772 		     "testbus registration failed; rc=%i\n", rc));
773 		return;
774 
775 	for_each_child_of_node(np, child) {
776 		of_platform_populate(child, match, NULL, &test_bus);
777 		for_each_child_of_node(child, grandchild)
778 			selftest(of_find_device_by_node(grandchild),
779 				 "Could not create device for node '%s'\n",
780 				 grandchild->name);
781 	}
782 
783 	of_platform_depopulate(&test_bus);
784 	for_each_child_of_node(np, child) {
785 		for_each_child_of_node(child, grandchild)
786 			selftest(!of_find_device_by_node(grandchild),
787 				 "device didn't get destroyed '%s'\n",
788 				 grandchild->name);
789 	}
790 
791 	device_unregister(&test_bus);
792 	of_node_put(np);
793 }
794 
795 /**
796  *	update_node_properties - adds the properties
797  *	of np into dup node (present in live tree) and
798  *	updates parent of children of np to dup.
799  *
800  *	@np:	node already present in live tree
801  *	@dup:	node present in live tree to be updated
802  */
803 static void update_node_properties(struct device_node *np,
804 					struct device_node *dup)
805 {
806 	struct property *prop;
807 	struct device_node *child;
808 
809 	for_each_property_of_node(np, prop)
810 		of_add_property(dup, prop);
811 
812 	for_each_child_of_node(np, child)
813 		child->parent = dup;
814 }
815 
816 /**
817  *	attach_node_and_children - attaches nodes
818  *	and its children to live tree
819  *
820  *	@np:	Node to attach to live tree
821  */
822 static int attach_node_and_children(struct device_node *np)
823 {
824 	struct device_node *next, *dup, *child;
825 
826 	dup = of_find_node_by_path(np->full_name);
827 	if (dup) {
828 		update_node_properties(np, dup);
829 		return 0;
830 	}
831 
832 	/* Children of the root need to be remembered for removal */
833 	if (np->parent == of_root) {
834 		if (WARN_ON(last_node_index >= NO_OF_NODES))
835 			return -EINVAL;
836 		nodes[last_node_index++] = np;
837 	}
838 
839 	child = np->child;
840 	np->child = NULL;
841 	np->sibling = NULL;
842 	of_attach_node(np);
843 	while (child) {
844 		next = child->sibling;
845 		attach_node_and_children(child);
846 		child = next;
847 	}
848 
849 	return 0;
850 }
851 
852 /**
853  *	selftest_data_add - Reads, copies data from
854  *	linked tree and attaches it to the live tree
855  */
856 static int __init selftest_data_add(void)
857 {
858 	void *selftest_data;
859 	struct device_node *selftest_data_node, *np;
860 	extern uint8_t __dtb_testcases_begin[];
861 	extern uint8_t __dtb_testcases_end[];
862 	const int size = __dtb_testcases_end - __dtb_testcases_begin;
863 	int rc;
864 
865 	if (!size) {
866 		pr_warn("%s: No testcase data to attach; not running tests\n",
867 			__func__);
868 		return -ENODATA;
869 	}
870 
871 	/* creating copy */
872 	selftest_data = kmemdup(__dtb_testcases_begin, size, GFP_KERNEL);
873 
874 	if (!selftest_data) {
875 		pr_warn("%s: Failed to allocate memory for selftest_data; "
876 			"not running tests\n", __func__);
877 		return -ENOMEM;
878 	}
879 	of_fdt_unflatten_tree(selftest_data, &selftest_data_node);
880 	if (!selftest_data_node) {
881 		pr_warn("%s: No tree to attach; not running tests\n", __func__);
882 		return -ENODATA;
883 	}
884 	of_node_set_flag(selftest_data_node, OF_DETACHED);
885 	rc = of_resolve_phandles(selftest_data_node);
886 	if (rc) {
887 		pr_err("%s: Failed to resolve phandles (rc=%i)\n", __func__, rc);
888 		return -EINVAL;
889 	}
890 
891 	if (!of_root) {
892 		/* enabling flag for removing nodes */
893 		selftest_live_tree = true;
894 		of_root = selftest_data_node;
895 
896 		for_each_of_allnodes(np)
897 			__of_attach_node_sysfs(np);
898 		of_aliases = of_find_node_by_path("/aliases");
899 		of_chosen = of_find_node_by_path("/chosen");
900 		return 0;
901 	}
902 
903 	/* attach the sub-tree to live tree */
904 	np = selftest_data_node->child;
905 	while (np) {
906 		struct device_node *next = np->sibling;
907 		np->parent = of_root;
908 		attach_node_and_children(np);
909 		np = next;
910 	}
911 	return 0;
912 }
913 
914 /**
915  *	detach_node_and_children - detaches node
916  *	and its children from live tree
917  *
918  *	@np:	Node to detach from live tree
919  */
920 static void detach_node_and_children(struct device_node *np)
921 {
922 	while (np->child)
923 		detach_node_and_children(np->child);
924 	of_detach_node(np);
925 }
926 
927 /**
928  *	selftest_data_remove - removes the selftest data
929  *	nodes from the live tree
930  */
931 static void selftest_data_remove(void)
932 {
933 	struct device_node *np;
934 	struct property *prop;
935 
936 	if (selftest_live_tree) {
937 		of_node_put(of_aliases);
938 		of_node_put(of_chosen);
939 		of_aliases = NULL;
940 		of_chosen = NULL;
941 		for_each_child_of_node(of_root, np)
942 			detach_node_and_children(np);
943 		__of_detach_node_sysfs(of_root);
944 		of_root = NULL;
945 		return;
946 	}
947 
948 	while (last_node_index-- > 0) {
949 		if (nodes[last_node_index]) {
950 			np = of_find_node_by_path(nodes[last_node_index]->full_name);
951 			if (np == nodes[last_node_index]) {
952 				if (of_aliases == np) {
953 					of_node_put(of_aliases);
954 					of_aliases = NULL;
955 				}
956 				detach_node_and_children(np);
957 			} else {
958 				for_each_property_of_node(np, prop) {
959 					if (strcmp(prop->name, "testcase-alias") == 0)
960 						of_remove_property(np, prop);
961 				}
962 			}
963 		}
964 	}
965 }
966 
967 #ifdef CONFIG_OF_OVERLAY
968 
969 static int selftest_probe(struct platform_device *pdev)
970 {
971 	struct device *dev = &pdev->dev;
972 	struct device_node *np = dev->of_node;
973 
974 	if (np == NULL) {
975 		dev_err(dev, "No OF data for device\n");
976 		return -EINVAL;
977 
978 	}
979 
980 	dev_dbg(dev, "%s for node @%s\n", __func__, np->full_name);
981 
982 	of_platform_populate(np, NULL, NULL, &pdev->dev);
983 
984 	return 0;
985 }
986 
987 static int selftest_remove(struct platform_device *pdev)
988 {
989 	struct device *dev = &pdev->dev;
990 	struct device_node *np = dev->of_node;
991 
992 	dev_dbg(dev, "%s for node @%s\n", __func__, np->full_name);
993 	return 0;
994 }
995 
996 static struct of_device_id selftest_match[] = {
997 	{ .compatible = "selftest", },
998 	{},
999 };
1000 
1001 static struct platform_driver selftest_driver = {
1002 	.probe			= selftest_probe,
1003 	.remove			= selftest_remove,
1004 	.driver = {
1005 		.name		= "selftest",
1006 		.owner		= THIS_MODULE,
1007 		.of_match_table	= of_match_ptr(selftest_match),
1008 	},
1009 };
1010 
1011 /* get the platform device instantiated at the path */
1012 static struct platform_device *of_path_to_platform_device(const char *path)
1013 {
1014 	struct device_node *np;
1015 	struct platform_device *pdev;
1016 
1017 	np = of_find_node_by_path(path);
1018 	if (np == NULL)
1019 		return NULL;
1020 
1021 	pdev = of_find_device_by_node(np);
1022 	of_node_put(np);
1023 
1024 	return pdev;
1025 }
1026 
1027 /* find out if a platform device exists at that path */
1028 static int of_path_platform_device_exists(const char *path)
1029 {
1030 	struct platform_device *pdev;
1031 
1032 	pdev = of_path_to_platform_device(path);
1033 	platform_device_put(pdev);
1034 	return pdev != NULL;
1035 }
1036 
1037 static const char *selftest_path(int nr)
1038 {
1039 	static char buf[256];
1040 
1041 	snprintf(buf, sizeof(buf) - 1,
1042 		"/testcase-data/overlay-node/test-bus/test-selftest%d", nr);
1043 	buf[sizeof(buf) - 1] = '\0';
1044 
1045 	return buf;
1046 }
1047 
1048 static const char *overlay_path(int nr)
1049 {
1050 	static char buf[256];
1051 
1052 	snprintf(buf, sizeof(buf) - 1,
1053 		"/testcase-data/overlay%d", nr);
1054 	buf[sizeof(buf) - 1] = '\0';
1055 
1056 	return buf;
1057 }
1058 
1059 static const char *bus_path = "/testcase-data/overlay-node/test-bus";
1060 
1061 static int of_selftest_apply_overlay(int selftest_nr, int overlay_nr,
1062 		int *overlay_id)
1063 {
1064 	struct device_node *np = NULL;
1065 	int ret, id = -1;
1066 
1067 	np = of_find_node_by_path(overlay_path(overlay_nr));
1068 	if (np == NULL) {
1069 		selftest(0, "could not find overlay node @\"%s\"\n",
1070 				overlay_path(overlay_nr));
1071 		ret = -EINVAL;
1072 		goto out;
1073 	}
1074 
1075 	ret = of_overlay_create(np);
1076 	if (ret < 0) {
1077 		selftest(0, "could not create overlay from \"%s\"\n",
1078 				overlay_path(overlay_nr));
1079 		goto out;
1080 	}
1081 	id = ret;
1082 
1083 	ret = 0;
1084 
1085 out:
1086 	of_node_put(np);
1087 
1088 	if (overlay_id)
1089 		*overlay_id = id;
1090 
1091 	return ret;
1092 }
1093 
1094 /* apply an overlay while checking before and after states */
1095 static int of_selftest_apply_overlay_check(int overlay_nr, int selftest_nr,
1096 		int before, int after)
1097 {
1098 	int ret;
1099 
1100 	/* selftest device must not be in before state */
1101 	if (of_path_platform_device_exists(selftest_path(selftest_nr))
1102 			!= before) {
1103 		selftest(0, "overlay @\"%s\" with device @\"%s\" %s\n",
1104 				overlay_path(overlay_nr),
1105 				selftest_path(selftest_nr),
1106 				!before ? "enabled" : "disabled");
1107 		return -EINVAL;
1108 	}
1109 
1110 	ret = of_selftest_apply_overlay(overlay_nr, selftest_nr, NULL);
1111 	if (ret != 0) {
1112 		/* of_selftest_apply_overlay already called selftest() */
1113 		return ret;
1114 	}
1115 
1116 	/* selftest device must be to set to after state */
1117 	if (of_path_platform_device_exists(selftest_path(selftest_nr))
1118 			!= after) {
1119 		selftest(0, "overlay @\"%s\" failed to create @\"%s\" %s\n",
1120 				overlay_path(overlay_nr),
1121 				selftest_path(selftest_nr),
1122 				!after ? "enabled" : "disabled");
1123 		return -EINVAL;
1124 	}
1125 
1126 	return 0;
1127 }
1128 
1129 /* apply an overlay and then revert it while checking before, after states */
1130 static int of_selftest_apply_revert_overlay_check(int overlay_nr,
1131 		int selftest_nr, int before, int after)
1132 {
1133 	int ret, ov_id;
1134 
1135 	/* selftest device must be in before state */
1136 	if (of_path_platform_device_exists(selftest_path(selftest_nr))
1137 			!= before) {
1138 		selftest(0, "overlay @\"%s\" with device @\"%s\" %s\n",
1139 				overlay_path(overlay_nr),
1140 				selftest_path(selftest_nr),
1141 				!before ? "enabled" : "disabled");
1142 		return -EINVAL;
1143 	}
1144 
1145 	/* apply the overlay */
1146 	ret = of_selftest_apply_overlay(overlay_nr, selftest_nr, &ov_id);
1147 	if (ret != 0) {
1148 		/* of_selftest_apply_overlay already called selftest() */
1149 		return ret;
1150 	}
1151 
1152 	/* selftest device must be in after state */
1153 	if (of_path_platform_device_exists(selftest_path(selftest_nr))
1154 			!= after) {
1155 		selftest(0, "overlay @\"%s\" failed to create @\"%s\" %s\n",
1156 				overlay_path(overlay_nr),
1157 				selftest_path(selftest_nr),
1158 				!after ? "enabled" : "disabled");
1159 		return -EINVAL;
1160 	}
1161 
1162 	ret = of_overlay_destroy(ov_id);
1163 	if (ret != 0) {
1164 		selftest(0, "overlay @\"%s\" failed to be destroyed @\"%s\"\n",
1165 				overlay_path(overlay_nr),
1166 				selftest_path(selftest_nr));
1167 		return ret;
1168 	}
1169 
1170 	/* selftest device must be again in before state */
1171 	if (of_path_platform_device_exists(selftest_path(selftest_nr))
1172 			!= before) {
1173 		selftest(0, "overlay @\"%s\" with device @\"%s\" %s\n",
1174 				overlay_path(overlay_nr),
1175 				selftest_path(selftest_nr),
1176 				!before ? "enabled" : "disabled");
1177 		return -EINVAL;
1178 	}
1179 
1180 	return 0;
1181 }
1182 
1183 /* test activation of device */
1184 static void of_selftest_overlay_0(void)
1185 {
1186 	int ret;
1187 
1188 	/* device should enable */
1189 	ret = of_selftest_apply_overlay_check(0, 0, 0, 1);
1190 	if (ret != 0)
1191 		return;
1192 
1193 	selftest(1, "overlay test %d passed\n", 0);
1194 }
1195 
1196 /* test deactivation of device */
1197 static void of_selftest_overlay_1(void)
1198 {
1199 	int ret;
1200 
1201 	/* device should disable */
1202 	ret = of_selftest_apply_overlay_check(1, 1, 1, 0);
1203 	if (ret != 0)
1204 		return;
1205 
1206 	selftest(1, "overlay test %d passed\n", 1);
1207 }
1208 
1209 /* test activation of device */
1210 static void of_selftest_overlay_2(void)
1211 {
1212 	int ret;
1213 
1214 	/* device should enable */
1215 	ret = of_selftest_apply_overlay_check(2, 2, 0, 1);
1216 	if (ret != 0)
1217 		return;
1218 
1219 	selftest(1, "overlay test %d passed\n", 2);
1220 }
1221 
1222 /* test deactivation of device */
1223 static void of_selftest_overlay_3(void)
1224 {
1225 	int ret;
1226 
1227 	/* device should disable */
1228 	ret = of_selftest_apply_overlay_check(3, 3, 1, 0);
1229 	if (ret != 0)
1230 		return;
1231 
1232 	selftest(1, "overlay test %d passed\n", 3);
1233 }
1234 
1235 /* test activation of a full device node */
1236 static void of_selftest_overlay_4(void)
1237 {
1238 	int ret;
1239 
1240 	/* device should disable */
1241 	ret = of_selftest_apply_overlay_check(4, 4, 0, 1);
1242 	if (ret != 0)
1243 		return;
1244 
1245 	selftest(1, "overlay test %d passed\n", 4);
1246 }
1247 
1248 /* test overlay apply/revert sequence */
1249 static void of_selftest_overlay_5(void)
1250 {
1251 	int ret;
1252 
1253 	/* device should disable */
1254 	ret = of_selftest_apply_revert_overlay_check(5, 5, 0, 1);
1255 	if (ret != 0)
1256 		return;
1257 
1258 	selftest(1, "overlay test %d passed\n", 5);
1259 }
1260 
1261 /* test overlay application in sequence */
1262 static void of_selftest_overlay_6(void)
1263 {
1264 	struct device_node *np;
1265 	int ret, i, ov_id[2];
1266 	int overlay_nr = 6, selftest_nr = 6;
1267 	int before = 0, after = 1;
1268 
1269 	/* selftest device must be in before state */
1270 	for (i = 0; i < 2; i++) {
1271 		if (of_path_platform_device_exists(
1272 					selftest_path(selftest_nr + i))
1273 				!= before) {
1274 			selftest(0, "overlay @\"%s\" with device @\"%s\" %s\n",
1275 					overlay_path(overlay_nr + i),
1276 					selftest_path(selftest_nr + i),
1277 					!before ? "enabled" : "disabled");
1278 			return;
1279 		}
1280 	}
1281 
1282 	/* apply the overlays */
1283 	for (i = 0; i < 2; i++) {
1284 
1285 		np = of_find_node_by_path(overlay_path(overlay_nr + i));
1286 		if (np == NULL) {
1287 			selftest(0, "could not find overlay node @\"%s\"\n",
1288 					overlay_path(overlay_nr + i));
1289 			return;
1290 		}
1291 
1292 		ret = of_overlay_create(np);
1293 		if (ret < 0)  {
1294 			selftest(0, "could not create overlay from \"%s\"\n",
1295 					overlay_path(overlay_nr + i));
1296 			return;
1297 		}
1298 		ov_id[i] = ret;
1299 	}
1300 
1301 	for (i = 0; i < 2; i++) {
1302 		/* selftest device must be in after state */
1303 		if (of_path_platform_device_exists(
1304 					selftest_path(selftest_nr + i))
1305 				!= after) {
1306 			selftest(0, "overlay @\"%s\" failed @\"%s\" %s\n",
1307 					overlay_path(overlay_nr + i),
1308 					selftest_path(selftest_nr + i),
1309 					!after ? "enabled" : "disabled");
1310 			return;
1311 		}
1312 	}
1313 
1314 	for (i = 1; i >= 0; i--) {
1315 		ret = of_overlay_destroy(ov_id[i]);
1316 		if (ret != 0) {
1317 			selftest(0, "overlay @\"%s\" failed destroy @\"%s\"\n",
1318 					overlay_path(overlay_nr + i),
1319 					selftest_path(selftest_nr + i));
1320 			return;
1321 		}
1322 	}
1323 
1324 	for (i = 0; i < 2; i++) {
1325 		/* selftest device must be again in before state */
1326 		if (of_path_platform_device_exists(
1327 					selftest_path(selftest_nr + i))
1328 				!= before) {
1329 			selftest(0, "overlay @\"%s\" with device @\"%s\" %s\n",
1330 					overlay_path(overlay_nr + i),
1331 					selftest_path(selftest_nr + i),
1332 					!before ? "enabled" : "disabled");
1333 			return;
1334 		}
1335 	}
1336 
1337 	selftest(1, "overlay test %d passed\n", 6);
1338 }
1339 
1340 /* test overlay application in sequence */
1341 static void of_selftest_overlay_8(void)
1342 {
1343 	struct device_node *np;
1344 	int ret, i, ov_id[2];
1345 	int overlay_nr = 8, selftest_nr = 8;
1346 
1347 	/* we don't care about device state in this test */
1348 
1349 	/* apply the overlays */
1350 	for (i = 0; i < 2; i++) {
1351 
1352 		np = of_find_node_by_path(overlay_path(overlay_nr + i));
1353 		if (np == NULL) {
1354 			selftest(0, "could not find overlay node @\"%s\"\n",
1355 					overlay_path(overlay_nr + i));
1356 			return;
1357 		}
1358 
1359 		ret = of_overlay_create(np);
1360 		if (ret < 0)  {
1361 			selftest(0, "could not create overlay from \"%s\"\n",
1362 					overlay_path(overlay_nr + i));
1363 			return;
1364 		}
1365 		ov_id[i] = ret;
1366 	}
1367 
1368 	/* now try to remove first overlay (it should fail) */
1369 	ret = of_overlay_destroy(ov_id[0]);
1370 	if (ret == 0) {
1371 		selftest(0, "overlay @\"%s\" was destroyed @\"%s\"\n",
1372 				overlay_path(overlay_nr + 0),
1373 				selftest_path(selftest_nr));
1374 		return;
1375 	}
1376 
1377 	/* removing them in order should work */
1378 	for (i = 1; i >= 0; i--) {
1379 		ret = of_overlay_destroy(ov_id[i]);
1380 		if (ret != 0) {
1381 			selftest(0, "overlay @\"%s\" not destroyed @\"%s\"\n",
1382 					overlay_path(overlay_nr + i),
1383 					selftest_path(selftest_nr));
1384 			return;
1385 		}
1386 	}
1387 
1388 	selftest(1, "overlay test %d passed\n", 8);
1389 }
1390 
1391 /* test insertion of a bus with parent devices */
1392 static void of_selftest_overlay_10(void)
1393 {
1394 	int ret;
1395 	char *child_path;
1396 
1397 	/* device should disable */
1398 	ret = of_selftest_apply_overlay_check(10, 10, 0, 1);
1399 	if (selftest(ret == 0, "overlay test %d failed; overlay application\n", 10))
1400 		return;
1401 
1402 	child_path = kasprintf(GFP_KERNEL, "%s/test-selftest101",
1403 			selftest_path(10));
1404 	if (selftest(child_path, "overlay test %d failed; kasprintf\n", 10))
1405 		return;
1406 
1407 	ret = of_path_platform_device_exists(child_path);
1408 	kfree(child_path);
1409 	if (selftest(ret, "overlay test %d failed; no child device\n", 10))
1410 		return;
1411 }
1412 
1413 /* test insertion of a bus with parent devices (and revert) */
1414 static void of_selftest_overlay_11(void)
1415 {
1416 	int ret;
1417 
1418 	/* device should disable */
1419 	ret = of_selftest_apply_revert_overlay_check(11, 11, 0, 1);
1420 	if (selftest(ret == 0, "overlay test %d failed; overlay application\n", 11))
1421 		return;
1422 }
1423 
1424 static void __init of_selftest_overlay(void)
1425 {
1426 	struct device_node *bus_np = NULL;
1427 	int ret;
1428 
1429 	ret = platform_driver_register(&selftest_driver);
1430 	if (ret != 0) {
1431 		selftest(0, "could not register selftest driver\n");
1432 		goto out;
1433 	}
1434 
1435 	bus_np = of_find_node_by_path(bus_path);
1436 	if (bus_np == NULL) {
1437 		selftest(0, "could not find bus_path \"%s\"\n", bus_path);
1438 		goto out;
1439 	}
1440 
1441 	ret = of_platform_populate(bus_np, of_default_bus_match_table,
1442 			NULL, NULL);
1443 	if (ret != 0) {
1444 		selftest(0, "could not populate bus @ \"%s\"\n", bus_path);
1445 		goto out;
1446 	}
1447 
1448 	if (!of_path_platform_device_exists(selftest_path(100))) {
1449 		selftest(0, "could not find selftest0 @ \"%s\"\n",
1450 				selftest_path(100));
1451 		goto out;
1452 	}
1453 
1454 	if (of_path_platform_device_exists(selftest_path(101))) {
1455 		selftest(0, "selftest1 @ \"%s\" should not exist\n",
1456 				selftest_path(101));
1457 		goto out;
1458 	}
1459 
1460 	selftest(1, "basic infrastructure of overlays passed");
1461 
1462 	/* tests in sequence */
1463 	of_selftest_overlay_0();
1464 	of_selftest_overlay_1();
1465 	of_selftest_overlay_2();
1466 	of_selftest_overlay_3();
1467 	of_selftest_overlay_4();
1468 	of_selftest_overlay_5();
1469 	of_selftest_overlay_6();
1470 	of_selftest_overlay_8();
1471 
1472 	of_selftest_overlay_10();
1473 	of_selftest_overlay_11();
1474 
1475 out:
1476 	of_node_put(bus_np);
1477 }
1478 
1479 #else
1480 static inline void __init of_selftest_overlay(void) { }
1481 #endif
1482 
1483 static int __init of_selftest(void)
1484 {
1485 	struct device_node *np;
1486 	int res;
1487 
1488 	/* adding data for selftest */
1489 	res = selftest_data_add();
1490 	if (res)
1491 		return res;
1492 	if (!of_aliases)
1493 		of_aliases = of_find_node_by_path("/aliases");
1494 
1495 	np = of_find_node_by_path("/testcase-data/phandle-tests/consumer-a");
1496 	if (!np) {
1497 		pr_info("No testcase data in device tree; not running tests\n");
1498 		return 0;
1499 	}
1500 	of_node_put(np);
1501 
1502 	pr_info("start of selftest - you will see error messages\n");
1503 	of_selftest_check_tree_linkage();
1504 	of_selftest_check_phandles();
1505 	of_selftest_find_node_by_name();
1506 	of_selftest_dynamic();
1507 	of_selftest_parse_phandle_with_args();
1508 	of_selftest_property_string();
1509 	of_selftest_property_copy();
1510 	of_selftest_changeset();
1511 	of_selftest_parse_interrupts();
1512 	of_selftest_parse_interrupts_extended();
1513 	of_selftest_match_node();
1514 	of_selftest_platform_populate();
1515 	of_selftest_overlay();
1516 
1517 	/* removing selftest data from live tree */
1518 	selftest_data_remove();
1519 
1520 	/* Double check linkage after removing testcase data */
1521 	of_selftest_check_tree_linkage();
1522 
1523 	pr_info("end of selftest - %i passed, %i failed\n",
1524 		selftest_results.passed, selftest_results.failed);
1525 
1526 	return 0;
1527 }
1528 late_initcall(of_selftest);
1529