xref: /openbmc/linux/drivers/of/unittest.c (revision 8684014d)
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 	return 0;
982 }
983 
984 static int selftest_remove(struct platform_device *pdev)
985 {
986 	struct device *dev = &pdev->dev;
987 	struct device_node *np = dev->of_node;
988 
989 	dev_dbg(dev, "%s for node @%s\n", __func__, np->full_name);
990 	return 0;
991 }
992 
993 static struct of_device_id selftest_match[] = {
994 	{ .compatible = "selftest", },
995 	{},
996 };
997 
998 static struct platform_driver selftest_driver = {
999 	.probe			= selftest_probe,
1000 	.remove			= selftest_remove,
1001 	.driver = {
1002 		.name		= "selftest",
1003 		.owner		= THIS_MODULE,
1004 		.of_match_table	= of_match_ptr(selftest_match),
1005 	},
1006 };
1007 
1008 /* get the platform device instantiated at the path */
1009 static struct platform_device *of_path_to_platform_device(const char *path)
1010 {
1011 	struct device_node *np;
1012 	struct platform_device *pdev;
1013 
1014 	np = of_find_node_by_path(path);
1015 	if (np == NULL)
1016 		return NULL;
1017 
1018 	pdev = of_find_device_by_node(np);
1019 	of_node_put(np);
1020 
1021 	return pdev;
1022 }
1023 
1024 /* find out if a platform device exists at that path */
1025 static int of_path_platform_device_exists(const char *path)
1026 {
1027 	struct platform_device *pdev;
1028 
1029 	pdev = of_path_to_platform_device(path);
1030 	platform_device_put(pdev);
1031 	return pdev != NULL;
1032 }
1033 
1034 static const char *selftest_path(int nr)
1035 {
1036 	static char buf[256];
1037 
1038 	snprintf(buf, sizeof(buf) - 1,
1039 		"/testcase-data/overlay-node/test-bus/test-selftest%d", nr);
1040 	buf[sizeof(buf) - 1] = '\0';
1041 
1042 	return buf;
1043 }
1044 
1045 static const char *overlay_path(int nr)
1046 {
1047 	static char buf[256];
1048 
1049 	snprintf(buf, sizeof(buf) - 1,
1050 		"/testcase-data/overlay%d", nr);
1051 	buf[sizeof(buf) - 1] = '\0';
1052 
1053 	return buf;
1054 }
1055 
1056 static const char *bus_path = "/testcase-data/overlay-node/test-bus";
1057 
1058 static int of_selftest_apply_overlay(int selftest_nr, int overlay_nr,
1059 		int *overlay_id)
1060 {
1061 	struct device_node *np = NULL;
1062 	int ret, id = -1;
1063 
1064 	np = of_find_node_by_path(overlay_path(overlay_nr));
1065 	if (np == NULL) {
1066 		selftest(0, "could not find overlay node @\"%s\"\n",
1067 				overlay_path(overlay_nr));
1068 		ret = -EINVAL;
1069 		goto out;
1070 	}
1071 
1072 	ret = of_overlay_create(np);
1073 	if (ret < 0) {
1074 		selftest(0, "could not create overlay from \"%s\"\n",
1075 				overlay_path(overlay_nr));
1076 		goto out;
1077 	}
1078 	id = ret;
1079 
1080 	ret = 0;
1081 
1082 out:
1083 	of_node_put(np);
1084 
1085 	if (overlay_id)
1086 		*overlay_id = id;
1087 
1088 	return ret;
1089 }
1090 
1091 /* apply an overlay while checking before and after states */
1092 static int of_selftest_apply_overlay_check(int overlay_nr, int selftest_nr,
1093 		int before, int after)
1094 {
1095 	int ret;
1096 
1097 	/* selftest device must not be in before state */
1098 	if (of_path_platform_device_exists(selftest_path(selftest_nr))
1099 			!= before) {
1100 		selftest(0, "overlay @\"%s\" with device @\"%s\" %s\n",
1101 				overlay_path(overlay_nr),
1102 				selftest_path(selftest_nr),
1103 				!before ? "enabled" : "disabled");
1104 		return -EINVAL;
1105 	}
1106 
1107 	ret = of_selftest_apply_overlay(overlay_nr, selftest_nr, NULL);
1108 	if (ret != 0) {
1109 		/* of_selftest_apply_overlay already called selftest() */
1110 		return ret;
1111 	}
1112 
1113 	/* selftest device must be to set to after state */
1114 	if (of_path_platform_device_exists(selftest_path(selftest_nr))
1115 			!= after) {
1116 		selftest(0, "overlay @\"%s\" failed to create @\"%s\" %s\n",
1117 				overlay_path(overlay_nr),
1118 				selftest_path(selftest_nr),
1119 				!after ? "enabled" : "disabled");
1120 		return -EINVAL;
1121 	}
1122 
1123 	return 0;
1124 }
1125 
1126 /* apply an overlay and then revert it while checking before, after states */
1127 static int of_selftest_apply_revert_overlay_check(int overlay_nr,
1128 		int selftest_nr, int before, int after)
1129 {
1130 	int ret, ov_id;
1131 
1132 	/* selftest device must be in before state */
1133 	if (of_path_platform_device_exists(selftest_path(selftest_nr))
1134 			!= before) {
1135 		selftest(0, "overlay @\"%s\" with device @\"%s\" %s\n",
1136 				overlay_path(overlay_nr),
1137 				selftest_path(selftest_nr),
1138 				!before ? "enabled" : "disabled");
1139 		return -EINVAL;
1140 	}
1141 
1142 	/* apply the overlay */
1143 	ret = of_selftest_apply_overlay(overlay_nr, selftest_nr, &ov_id);
1144 	if (ret != 0) {
1145 		/* of_selftest_apply_overlay already called selftest() */
1146 		return ret;
1147 	}
1148 
1149 	/* selftest device must be in after state */
1150 	if (of_path_platform_device_exists(selftest_path(selftest_nr))
1151 			!= after) {
1152 		selftest(0, "overlay @\"%s\" failed to create @\"%s\" %s\n",
1153 				overlay_path(overlay_nr),
1154 				selftest_path(selftest_nr),
1155 				!after ? "enabled" : "disabled");
1156 		return -EINVAL;
1157 	}
1158 
1159 	ret = of_overlay_destroy(ov_id);
1160 	if (ret != 0) {
1161 		selftest(0, "overlay @\"%s\" failed to be destroyed @\"%s\"\n",
1162 				overlay_path(overlay_nr),
1163 				selftest_path(selftest_nr));
1164 		return ret;
1165 	}
1166 
1167 	/* selftest device must be again in before state */
1168 	if (of_path_platform_device_exists(selftest_path(selftest_nr))
1169 			!= before) {
1170 		selftest(0, "overlay @\"%s\" with device @\"%s\" %s\n",
1171 				overlay_path(overlay_nr),
1172 				selftest_path(selftest_nr),
1173 				!before ? "enabled" : "disabled");
1174 		return -EINVAL;
1175 	}
1176 
1177 	return 0;
1178 }
1179 
1180 /* test activation of device */
1181 static void of_selftest_overlay_0(void)
1182 {
1183 	int ret;
1184 
1185 	/* device should enable */
1186 	ret = of_selftest_apply_overlay_check(0, 0, 0, 1);
1187 	if (ret != 0)
1188 		return;
1189 
1190 	selftest(1, "overlay test %d passed\n", 0);
1191 }
1192 
1193 /* test deactivation of device */
1194 static void of_selftest_overlay_1(void)
1195 {
1196 	int ret;
1197 
1198 	/* device should disable */
1199 	ret = of_selftest_apply_overlay_check(1, 1, 1, 0);
1200 	if (ret != 0)
1201 		return;
1202 
1203 	selftest(1, "overlay test %d passed\n", 1);
1204 }
1205 
1206 /* test activation of device */
1207 static void of_selftest_overlay_2(void)
1208 {
1209 	int ret;
1210 
1211 	/* device should enable */
1212 	ret = of_selftest_apply_overlay_check(2, 2, 0, 1);
1213 	if (ret != 0)
1214 		return;
1215 
1216 	selftest(1, "overlay test %d passed\n", 2);
1217 }
1218 
1219 /* test deactivation of device */
1220 static void of_selftest_overlay_3(void)
1221 {
1222 	int ret;
1223 
1224 	/* device should disable */
1225 	ret = of_selftest_apply_overlay_check(3, 3, 1, 0);
1226 	if (ret != 0)
1227 		return;
1228 
1229 	selftest(1, "overlay test %d passed\n", 3);
1230 }
1231 
1232 /* test activation of a full device node */
1233 static void of_selftest_overlay_4(void)
1234 {
1235 	int ret;
1236 
1237 	/* device should disable */
1238 	ret = of_selftest_apply_overlay_check(4, 4, 0, 1);
1239 	if (ret != 0)
1240 		return;
1241 
1242 	selftest(1, "overlay test %d passed\n", 4);
1243 }
1244 
1245 /* test overlay apply/revert sequence */
1246 static void of_selftest_overlay_5(void)
1247 {
1248 	int ret;
1249 
1250 	/* device should disable */
1251 	ret = of_selftest_apply_revert_overlay_check(5, 5, 0, 1);
1252 	if (ret != 0)
1253 		return;
1254 
1255 	selftest(1, "overlay test %d passed\n", 5);
1256 }
1257 
1258 /* test overlay application in sequence */
1259 static void of_selftest_overlay_6(void)
1260 {
1261 	struct device_node *np;
1262 	int ret, i, ov_id[2];
1263 	int overlay_nr = 6, selftest_nr = 6;
1264 	int before = 0, after = 1;
1265 
1266 	/* selftest device must be in before state */
1267 	for (i = 0; i < 2; i++) {
1268 		if (of_path_platform_device_exists(
1269 					selftest_path(selftest_nr + i))
1270 				!= before) {
1271 			selftest(0, "overlay @\"%s\" with device @\"%s\" %s\n",
1272 					overlay_path(overlay_nr + i),
1273 					selftest_path(selftest_nr + i),
1274 					!before ? "enabled" : "disabled");
1275 			return;
1276 		}
1277 	}
1278 
1279 	/* apply the overlays */
1280 	for (i = 0; i < 2; i++) {
1281 
1282 		np = of_find_node_by_path(overlay_path(overlay_nr + i));
1283 		if (np == NULL) {
1284 			selftest(0, "could not find overlay node @\"%s\"\n",
1285 					overlay_path(overlay_nr + i));
1286 			return;
1287 		}
1288 
1289 		ret = of_overlay_create(np);
1290 		if (ret < 0)  {
1291 			selftest(0, "could not create overlay from \"%s\"\n",
1292 					overlay_path(overlay_nr + i));
1293 			return;
1294 		}
1295 		ov_id[i] = ret;
1296 	}
1297 
1298 	for (i = 0; i < 2; i++) {
1299 		/* selftest device must be in after state */
1300 		if (of_path_platform_device_exists(
1301 					selftest_path(selftest_nr + i))
1302 				!= after) {
1303 			selftest(0, "overlay @\"%s\" failed @\"%s\" %s\n",
1304 					overlay_path(overlay_nr + i),
1305 					selftest_path(selftest_nr + i),
1306 					!after ? "enabled" : "disabled");
1307 			return;
1308 		}
1309 	}
1310 
1311 	for (i = 1; i >= 0; i--) {
1312 		ret = of_overlay_destroy(ov_id[i]);
1313 		if (ret != 0) {
1314 			selftest(0, "overlay @\"%s\" failed destroy @\"%s\"\n",
1315 					overlay_path(overlay_nr + i),
1316 					selftest_path(selftest_nr + i));
1317 			return;
1318 		}
1319 	}
1320 
1321 	for (i = 0; i < 2; i++) {
1322 		/* selftest device must be again in before state */
1323 		if (of_path_platform_device_exists(
1324 					selftest_path(selftest_nr + i))
1325 				!= before) {
1326 			selftest(0, "overlay @\"%s\" with device @\"%s\" %s\n",
1327 					overlay_path(overlay_nr + i),
1328 					selftest_path(selftest_nr + i),
1329 					!before ? "enabled" : "disabled");
1330 			return;
1331 		}
1332 	}
1333 
1334 	selftest(1, "overlay test %d passed\n", 6);
1335 }
1336 
1337 /* test overlay application in sequence */
1338 static void of_selftest_overlay_8(void)
1339 {
1340 	struct device_node *np;
1341 	int ret, i, ov_id[2];
1342 	int overlay_nr = 8, selftest_nr = 8;
1343 
1344 	/* we don't care about device state in this test */
1345 
1346 	/* apply the overlays */
1347 	for (i = 0; i < 2; i++) {
1348 
1349 		np = of_find_node_by_path(overlay_path(overlay_nr + i));
1350 		if (np == NULL) {
1351 			selftest(0, "could not find overlay node @\"%s\"\n",
1352 					overlay_path(overlay_nr + i));
1353 			return;
1354 		}
1355 
1356 		ret = of_overlay_create(np);
1357 		if (ret < 0)  {
1358 			selftest(0, "could not create overlay from \"%s\"\n",
1359 					overlay_path(overlay_nr + i));
1360 			return;
1361 		}
1362 		ov_id[i] = ret;
1363 	}
1364 
1365 	/* now try to remove first overlay (it should fail) */
1366 	ret = of_overlay_destroy(ov_id[0]);
1367 	if (ret == 0) {
1368 		selftest(0, "overlay @\"%s\" was destroyed @\"%s\"\n",
1369 				overlay_path(overlay_nr + 0),
1370 				selftest_path(selftest_nr));
1371 		return;
1372 	}
1373 
1374 	/* removing them in order should work */
1375 	for (i = 1; i >= 0; i--) {
1376 		ret = of_overlay_destroy(ov_id[i]);
1377 		if (ret != 0) {
1378 			selftest(0, "overlay @\"%s\" not destroyed @\"%s\"\n",
1379 					overlay_path(overlay_nr + i),
1380 					selftest_path(selftest_nr));
1381 			return;
1382 		}
1383 	}
1384 
1385 	selftest(1, "overlay test %d passed\n", 8);
1386 }
1387 
1388 static void __init of_selftest_overlay(void)
1389 {
1390 	struct device_node *bus_np = NULL;
1391 	int ret;
1392 
1393 	ret = platform_driver_register(&selftest_driver);
1394 	if (ret != 0) {
1395 		selftest(0, "could not register selftest driver\n");
1396 		goto out;
1397 	}
1398 
1399 	bus_np = of_find_node_by_path(bus_path);
1400 	if (bus_np == NULL) {
1401 		selftest(0, "could not find bus_path \"%s\"\n", bus_path);
1402 		goto out;
1403 	}
1404 
1405 	ret = of_platform_populate(bus_np, of_default_bus_match_table,
1406 			NULL, NULL);
1407 	if (ret != 0) {
1408 		selftest(0, "could not populate bus @ \"%s\"\n", bus_path);
1409 		goto out;
1410 	}
1411 
1412 	if (!of_path_platform_device_exists(selftest_path(100))) {
1413 		selftest(0, "could not find selftest0 @ \"%s\"\n",
1414 				selftest_path(100));
1415 		goto out;
1416 	}
1417 
1418 	if (of_path_platform_device_exists(selftest_path(101))) {
1419 		selftest(0, "selftest1 @ \"%s\" should not exist\n",
1420 				selftest_path(101));
1421 		goto out;
1422 	}
1423 
1424 	selftest(1, "basic infrastructure of overlays passed");
1425 
1426 	/* tests in sequence */
1427 	of_selftest_overlay_0();
1428 	of_selftest_overlay_1();
1429 	of_selftest_overlay_2();
1430 	of_selftest_overlay_3();
1431 	of_selftest_overlay_4();
1432 	of_selftest_overlay_5();
1433 	of_selftest_overlay_6();
1434 	of_selftest_overlay_8();
1435 
1436 out:
1437 	of_node_put(bus_np);
1438 }
1439 
1440 #else
1441 static inline void __init of_selftest_overlay(void) { }
1442 #endif
1443 
1444 static int __init of_selftest(void)
1445 {
1446 	struct device_node *np;
1447 	int res;
1448 
1449 	/* adding data for selftest */
1450 	res = selftest_data_add();
1451 	if (res)
1452 		return res;
1453 	if (!of_aliases)
1454 		of_aliases = of_find_node_by_path("/aliases");
1455 
1456 	np = of_find_node_by_path("/testcase-data/phandle-tests/consumer-a");
1457 	if (!np) {
1458 		pr_info("No testcase data in device tree; not running tests\n");
1459 		return 0;
1460 	}
1461 	of_node_put(np);
1462 
1463 	pr_info("start of selftest - you will see error messages\n");
1464 	of_selftest_check_tree_linkage();
1465 	of_selftest_check_phandles();
1466 	of_selftest_find_node_by_name();
1467 	of_selftest_dynamic();
1468 	of_selftest_parse_phandle_with_args();
1469 	of_selftest_property_string();
1470 	of_selftest_property_copy();
1471 	of_selftest_changeset();
1472 	of_selftest_parse_interrupts();
1473 	of_selftest_parse_interrupts_extended();
1474 	of_selftest_match_node();
1475 	of_selftest_platform_populate();
1476 	of_selftest_overlay();
1477 
1478 	/* removing selftest data from live tree */
1479 	selftest_data_remove();
1480 
1481 	/* Double check linkage after removing testcase data */
1482 	of_selftest_check_tree_linkage();
1483 
1484 	pr_info("end of selftest - %i passed, %i failed\n",
1485 		selftest_results.passed, selftest_results.failed);
1486 
1487 	return 0;
1488 }
1489 late_initcall(of_selftest);
1490