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 <linux/i2c.h>
24#include <linux/i2c-mux.h>
25
26#include <linux/bitops.h>
27
28#include "of_private.h"
29
30static struct unittest_results {
31	int passed;
32	int failed;
33} unittest_results;
34
35#define unittest(result, fmt, ...) ({ \
36	bool failed = !(result); \
37	if (failed) { \
38		unittest_results.failed++; \
39		pr_err("FAIL %s():%i " fmt, __func__, __LINE__, ##__VA_ARGS__); \
40	} else { \
41		unittest_results.passed++; \
42		pr_debug("pass %s():%i\n", __func__, __LINE__); \
43	} \
44	failed; \
45})
46
47static void __init of_unittest_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	unittest(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	unittest(!np, "trailing '/' on /testcase-data/ should fail\n");
60
61	np = of_find_node_by_path("/testcase-data/phandle-tests/consumer-a");
62	unittest(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	unittest(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	unittest(!np, "trailing '/' on testcase-alias/ should fail\n");
74
75	np = of_find_node_by_path("testcase-alias/phandle-tests/consumer-a");
76	unittest(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	unittest(!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	unittest(!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	unittest(!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	unittest(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:test/option", &options);
98	unittest(np && !strcmp("test/option", options),
99		 "option path test, subcase #1 failed\n");
100	of_node_put(np);
101
102	np = of_find_node_opts_by_path("/testcase-data/testcase-device1:test/option", &options);
103	unittest(np && !strcmp("test/option", options),
104		 "option path test, subcase #2 failed\n");
105	of_node_put(np);
106
107	np = of_find_node_opts_by_path("/testcase-data:testoption", NULL);
108	unittest(np, "NULL option path test failed\n");
109	of_node_put(np);
110
111	np = of_find_node_opts_by_path("testcase-alias:testaliasoption",
112				       &options);
113	unittest(np && !strcmp("testaliasoption", options),
114		 "option alias path test failed\n");
115	of_node_put(np);
116
117	np = of_find_node_opts_by_path("testcase-alias:test/alias/option",
118				       &options);
119	unittest(np && !strcmp("test/alias/option", options),
120		 "option alias path test, subcase #1 failed\n");
121	of_node_put(np);
122
123	np = of_find_node_opts_by_path("testcase-alias:testaliasoption", NULL);
124	unittest(np, "NULL option alias path test failed\n");
125	of_node_put(np);
126
127	options = "testoption";
128	np = of_find_node_opts_by_path("testcase-alias", &options);
129	unittest(np && !options, "option clearing test failed\n");
130	of_node_put(np);
131
132	options = "testoption";
133	np = of_find_node_opts_by_path("/", &options);
134	unittest(np && !options, "option clearing root node test failed\n");
135	of_node_put(np);
136}
137
138static void __init of_unittest_dynamic(void)
139{
140	struct device_node *np;
141	struct property *prop;
142
143	np = of_find_node_by_path("/testcase-data");
144	if (!np) {
145		pr_err("missing testcase data\n");
146		return;
147	}
148
149	/* Array of 4 properties for the purpose of testing */
150	prop = kzalloc(sizeof(*prop) * 4, GFP_KERNEL);
151	if (!prop) {
152		unittest(0, "kzalloc() failed\n");
153		return;
154	}
155
156	/* Add a new property - should pass*/
157	prop->name = "new-property";
158	prop->value = "new-property-data";
159	prop->length = strlen(prop->value);
160	unittest(of_add_property(np, prop) == 0, "Adding a new property failed\n");
161
162	/* Try to add an existing property - should fail */
163	prop++;
164	prop->name = "new-property";
165	prop->value = "new-property-data-should-fail";
166	prop->length = strlen(prop->value);
167	unittest(of_add_property(np, prop) != 0,
168		 "Adding an existing property should have failed\n");
169
170	/* Try to modify an existing property - should pass */
171	prop->value = "modify-property-data-should-pass";
172	prop->length = strlen(prop->value);
173	unittest(of_update_property(np, prop) == 0,
174		 "Updating an existing property should have passed\n");
175
176	/* Try to modify non-existent property - should pass*/
177	prop++;
178	prop->name = "modify-property";
179	prop->value = "modify-missing-property-data-should-pass";
180	prop->length = strlen(prop->value);
181	unittest(of_update_property(np, prop) == 0,
182		 "Updating a missing property should have passed\n");
183
184	/* Remove property - should pass */
185	unittest(of_remove_property(np, prop) == 0,
186		 "Removing a property should have passed\n");
187
188	/* Adding very large property - should pass */
189	prop++;
190	prop->name = "large-property-PAGE_SIZEx8";
191	prop->length = PAGE_SIZE * 8;
192	prop->value = kzalloc(prop->length, GFP_KERNEL);
193	unittest(prop->value != NULL, "Unable to allocate large buffer\n");
194	if (prop->value)
195		unittest(of_add_property(np, prop) == 0,
196			 "Adding a large property should have passed\n");
197}
198
199static int __init of_unittest_check_node_linkage(struct device_node *np)
200{
201	struct device_node *child;
202	int count = 0, rc;
203
204	for_each_child_of_node(np, child) {
205		if (child->parent != np) {
206			pr_err("Child node %s links to wrong parent %s\n",
207				 child->name, np->name);
208			return -EINVAL;
209		}
210
211		rc = of_unittest_check_node_linkage(child);
212		if (rc < 0)
213			return rc;
214		count += rc;
215	}
216
217	return count + 1;
218}
219
220static void __init of_unittest_check_tree_linkage(void)
221{
222	struct device_node *np;
223	int allnode_count = 0, child_count;
224
225	if (!of_root)
226		return;
227
228	for_each_of_allnodes(np)
229		allnode_count++;
230	child_count = of_unittest_check_node_linkage(of_root);
231
232	unittest(child_count > 0, "Device node data structure is corrupted\n");
233	unittest(child_count == allnode_count,
234		 "allnodes list size (%i) doesn't match sibling lists size (%i)\n",
235		 allnode_count, child_count);
236	pr_debug("allnodes list size (%i); sibling lists size (%i)\n", allnode_count, child_count);
237}
238
239struct node_hash {
240	struct hlist_node node;
241	struct device_node *np;
242};
243
244static DEFINE_HASHTABLE(phandle_ht, 8);
245static void __init of_unittest_check_phandles(void)
246{
247	struct device_node *np;
248	struct node_hash *nh;
249	struct hlist_node *tmp;
250	int i, dup_count = 0, phandle_count = 0;
251
252	for_each_of_allnodes(np) {
253		if (!np->phandle)
254			continue;
255
256		hash_for_each_possible(phandle_ht, nh, node, np->phandle) {
257			if (nh->np->phandle == np->phandle) {
258				pr_info("Duplicate phandle! %i used by %s and %s\n",
259					np->phandle, nh->np->full_name, np->full_name);
260				dup_count++;
261				break;
262			}
263		}
264
265		nh = kzalloc(sizeof(*nh), GFP_KERNEL);
266		if (WARN_ON(!nh))
267			return;
268
269		nh->np = np;
270		hash_add(phandle_ht, &nh->node, np->phandle);
271		phandle_count++;
272	}
273	unittest(dup_count == 0, "Found %i duplicates in %i phandles\n",
274		 dup_count, phandle_count);
275
276	/* Clean up */
277	hash_for_each_safe(phandle_ht, i, tmp, nh, node) {
278		hash_del(&nh->node);
279		kfree(nh);
280	}
281}
282
283static void __init of_unittest_parse_phandle_with_args(void)
284{
285	struct device_node *np;
286	struct of_phandle_args args;
287	int i, rc;
288
289	np = of_find_node_by_path("/testcase-data/phandle-tests/consumer-a");
290	if (!np) {
291		pr_err("missing testcase data\n");
292		return;
293	}
294
295	rc = of_count_phandle_with_args(np, "phandle-list", "#phandle-cells");
296	unittest(rc == 7, "of_count_phandle_with_args() returned %i, expected 7\n", rc);
297
298	for (i = 0; i < 8; i++) {
299		bool passed = true;
300
301		rc = of_parse_phandle_with_args(np, "phandle-list",
302						"#phandle-cells", i, &args);
303
304		/* Test the values from tests-phandle.dtsi */
305		switch (i) {
306		case 0:
307			passed &= !rc;
308			passed &= (args.args_count == 1);
309			passed &= (args.args[0] == (i + 1));
310			break;
311		case 1:
312			passed &= !rc;
313			passed &= (args.args_count == 2);
314			passed &= (args.args[0] == (i + 1));
315			passed &= (args.args[1] == 0);
316			break;
317		case 2:
318			passed &= (rc == -ENOENT);
319			break;
320		case 3:
321			passed &= !rc;
322			passed &= (args.args_count == 3);
323			passed &= (args.args[0] == (i + 1));
324			passed &= (args.args[1] == 4);
325			passed &= (args.args[2] == 3);
326			break;
327		case 4:
328			passed &= !rc;
329			passed &= (args.args_count == 2);
330			passed &= (args.args[0] == (i + 1));
331			passed &= (args.args[1] == 100);
332			break;
333		case 5:
334			passed &= !rc;
335			passed &= (args.args_count == 0);
336			break;
337		case 6:
338			passed &= !rc;
339			passed &= (args.args_count == 1);
340			passed &= (args.args[0] == (i + 1));
341			break;
342		case 7:
343			passed &= (rc == -ENOENT);
344			break;
345		default:
346			passed = false;
347		}
348
349		unittest(passed, "index %i - data error on node %s rc=%i\n",
350			 i, args.np->full_name, rc);
351	}
352
353	/* Check for missing list property */
354	rc = of_parse_phandle_with_args(np, "phandle-list-missing",
355					"#phandle-cells", 0, &args);
356	unittest(rc == -ENOENT, "expected:%i got:%i\n", -ENOENT, rc);
357	rc = of_count_phandle_with_args(np, "phandle-list-missing",
358					"#phandle-cells");
359	unittest(rc == -ENOENT, "expected:%i got:%i\n", -ENOENT, rc);
360
361	/* Check for missing cells property */
362	rc = of_parse_phandle_with_args(np, "phandle-list",
363					"#phandle-cells-missing", 0, &args);
364	unittest(rc == -EINVAL, "expected:%i got:%i\n", -EINVAL, rc);
365	rc = of_count_phandle_with_args(np, "phandle-list",
366					"#phandle-cells-missing");
367	unittest(rc == -EINVAL, "expected:%i got:%i\n", -EINVAL, rc);
368
369	/* Check for bad phandle in list */
370	rc = of_parse_phandle_with_args(np, "phandle-list-bad-phandle",
371					"#phandle-cells", 0, &args);
372	unittest(rc == -EINVAL, "expected:%i got:%i\n", -EINVAL, rc);
373	rc = of_count_phandle_with_args(np, "phandle-list-bad-phandle",
374					"#phandle-cells");
375	unittest(rc == -EINVAL, "expected:%i got:%i\n", -EINVAL, rc);
376
377	/* Check for incorrectly formed argument list */
378	rc = of_parse_phandle_with_args(np, "phandle-list-bad-args",
379					"#phandle-cells", 1, &args);
380	unittest(rc == -EINVAL, "expected:%i got:%i\n", -EINVAL, rc);
381	rc = of_count_phandle_with_args(np, "phandle-list-bad-args",
382					"#phandle-cells");
383	unittest(rc == -EINVAL, "expected:%i got:%i\n", -EINVAL, rc);
384}
385
386static void __init of_unittest_property_string(void)
387{
388	const char *strings[4];
389	struct device_node *np;
390	int rc;
391
392	np = of_find_node_by_path("/testcase-data/phandle-tests/consumer-a");
393	if (!np) {
394		pr_err("No testcase data in device tree\n");
395		return;
396	}
397
398	rc = of_property_match_string(np, "phandle-list-names", "first");
399	unittest(rc == 0, "first expected:0 got:%i\n", rc);
400	rc = of_property_match_string(np, "phandle-list-names", "second");
401	unittest(rc == 1, "second expected:1 got:%i\n", rc);
402	rc = of_property_match_string(np, "phandle-list-names", "third");
403	unittest(rc == 2, "third expected:2 got:%i\n", rc);
404	rc = of_property_match_string(np, "phandle-list-names", "fourth");
405	unittest(rc == -ENODATA, "unmatched string; rc=%i\n", rc);
406	rc = of_property_match_string(np, "missing-property", "blah");
407	unittest(rc == -EINVAL, "missing property; rc=%i\n", rc);
408	rc = of_property_match_string(np, "empty-property", "blah");
409	unittest(rc == -ENODATA, "empty property; rc=%i\n", rc);
410	rc = of_property_match_string(np, "unterminated-string", "blah");
411	unittest(rc == -EILSEQ, "unterminated string; rc=%i\n", rc);
412
413	/* of_property_count_strings() tests */
414	rc = of_property_count_strings(np, "string-property");
415	unittest(rc == 1, "Incorrect string count; rc=%i\n", rc);
416	rc = of_property_count_strings(np, "phandle-list-names");
417	unittest(rc == 3, "Incorrect string count; rc=%i\n", rc);
418	rc = of_property_count_strings(np, "unterminated-string");
419	unittest(rc == -EILSEQ, "unterminated string; rc=%i\n", rc);
420	rc = of_property_count_strings(np, "unterminated-string-list");
421	unittest(rc == -EILSEQ, "unterminated string array; rc=%i\n", rc);
422
423	/* of_property_read_string_index() tests */
424	rc = of_property_read_string_index(np, "string-property", 0, strings);
425	unittest(rc == 0 && !strcmp(strings[0], "foobar"), "of_property_read_string_index() failure; rc=%i\n", rc);
426	strings[0] = NULL;
427	rc = of_property_read_string_index(np, "string-property", 1, strings);
428	unittest(rc == -ENODATA && strings[0] == NULL, "of_property_read_string_index() failure; rc=%i\n", rc);
429	rc = of_property_read_string_index(np, "phandle-list-names", 0, strings);
430	unittest(rc == 0 && !strcmp(strings[0], "first"), "of_property_read_string_index() failure; rc=%i\n", rc);
431	rc = of_property_read_string_index(np, "phandle-list-names", 1, strings);
432	unittest(rc == 0 && !strcmp(strings[0], "second"), "of_property_read_string_index() failure; rc=%i\n", rc);
433	rc = of_property_read_string_index(np, "phandle-list-names", 2, strings);
434	unittest(rc == 0 && !strcmp(strings[0], "third"), "of_property_read_string_index() failure; rc=%i\n", rc);
435	strings[0] = NULL;
436	rc = of_property_read_string_index(np, "phandle-list-names", 3, strings);
437	unittest(rc == -ENODATA && strings[0] == NULL, "of_property_read_string_index() failure; rc=%i\n", rc);
438	strings[0] = NULL;
439	rc = of_property_read_string_index(np, "unterminated-string", 0, strings);
440	unittest(rc == -EILSEQ && strings[0] == NULL, "of_property_read_string_index() failure; rc=%i\n", rc);
441	rc = of_property_read_string_index(np, "unterminated-string-list", 0, strings);
442	unittest(rc == 0 && !strcmp(strings[0], "first"), "of_property_read_string_index() failure; rc=%i\n", rc);
443	strings[0] = NULL;
444	rc = of_property_read_string_index(np, "unterminated-string-list", 2, strings); /* should fail */
445	unittest(rc == -EILSEQ && strings[0] == NULL, "of_property_read_string_index() failure; rc=%i\n", rc);
446	strings[1] = NULL;
447
448	/* of_property_read_string_array() tests */
449	rc = of_property_read_string_array(np, "string-property", strings, 4);
450	unittest(rc == 1, "Incorrect string count; rc=%i\n", rc);
451	rc = of_property_read_string_array(np, "phandle-list-names", strings, 4);
452	unittest(rc == 3, "Incorrect string count; rc=%i\n", rc);
453	rc = of_property_read_string_array(np, "unterminated-string", strings, 4);
454	unittest(rc == -EILSEQ, "unterminated string; rc=%i\n", rc);
455	/* -- An incorrectly formed string should cause a failure */
456	rc = of_property_read_string_array(np, "unterminated-string-list", strings, 4);
457	unittest(rc == -EILSEQ, "unterminated string array; rc=%i\n", rc);
458	/* -- parsing the correctly formed strings should still work: */
459	strings[2] = NULL;
460	rc = of_property_read_string_array(np, "unterminated-string-list", strings, 2);
461	unittest(rc == 2 && strings[2] == NULL, "of_property_read_string_array() failure; rc=%i\n", rc);
462	strings[1] = NULL;
463	rc = of_property_read_string_array(np, "phandle-list-names", strings, 1);
464	unittest(rc == 1 && strings[1] == NULL, "Overwrote end of string array; rc=%i, str='%s'\n", rc, strings[1]);
465}
466
467#define propcmp(p1, p2) (((p1)->length == (p2)->length) && \
468			(p1)->value && (p2)->value && \
469			!memcmp((p1)->value, (p2)->value, (p1)->length) && \
470			!strcmp((p1)->name, (p2)->name))
471static void __init of_unittest_property_copy(void)
472{
473#ifdef CONFIG_OF_DYNAMIC
474	struct property p1 = { .name = "p1", .length = 0, .value = "" };
475	struct property p2 = { .name = "p2", .length = 5, .value = "abcd" };
476	struct property *new;
477
478	new = __of_prop_dup(&p1, GFP_KERNEL);
479	unittest(new && propcmp(&p1, new), "empty property didn't copy correctly\n");
480	kfree(new->value);
481	kfree(new->name);
482	kfree(new);
483
484	new = __of_prop_dup(&p2, GFP_KERNEL);
485	unittest(new && propcmp(&p2, new), "non-empty property didn't copy correctly\n");
486	kfree(new->value);
487	kfree(new->name);
488	kfree(new);
489#endif
490}
491
492static void __init of_unittest_changeset(void)
493{
494#ifdef CONFIG_OF_DYNAMIC
495	struct property *ppadd, padd = { .name = "prop-add", .length = 0, .value = "" };
496	struct property *ppupdate, pupdate = { .name = "prop-update", .length = 5, .value = "abcd" };
497	struct property *ppremove;
498	struct device_node *n1, *n2, *n21, *nremove, *parent, *np;
499	struct of_changeset chgset;
500
501	n1 = __of_node_dup(NULL, "/testcase-data/changeset/n1");
502	unittest(n1, "testcase setup failure\n");
503	n2 = __of_node_dup(NULL, "/testcase-data/changeset/n2");
504	unittest(n2, "testcase setup failure\n");
505	n21 = __of_node_dup(NULL, "%s/%s", "/testcase-data/changeset/n2", "n21");
506	unittest(n21, "testcase setup failure %p\n", n21);
507	nremove = of_find_node_by_path("/testcase-data/changeset/node-remove");
508	unittest(nremove, "testcase setup failure\n");
509	ppadd = __of_prop_dup(&padd, GFP_KERNEL);
510	unittest(ppadd, "testcase setup failure\n");
511	ppupdate = __of_prop_dup(&pupdate, GFP_KERNEL);
512	unittest(ppupdate, "testcase setup failure\n");
513	parent = nremove->parent;
514	n1->parent = parent;
515	n2->parent = parent;
516	n21->parent = n2;
517	n2->child = n21;
518	ppremove = of_find_property(parent, "prop-remove", NULL);
519	unittest(ppremove, "failed to find removal prop");
520
521	of_changeset_init(&chgset);
522	unittest(!of_changeset_attach_node(&chgset, n1), "fail attach n1\n");
523	unittest(!of_changeset_attach_node(&chgset, n2), "fail attach n2\n");
524	unittest(!of_changeset_detach_node(&chgset, nremove), "fail remove node\n");
525	unittest(!of_changeset_attach_node(&chgset, n21), "fail attach n21\n");
526	unittest(!of_changeset_add_property(&chgset, parent, ppadd), "fail add prop\n");
527	unittest(!of_changeset_update_property(&chgset, parent, ppupdate), "fail update prop\n");
528	unittest(!of_changeset_remove_property(&chgset, parent, ppremove), "fail remove prop\n");
529	mutex_lock(&of_mutex);
530	unittest(!of_changeset_apply(&chgset), "apply failed\n");
531	mutex_unlock(&of_mutex);
532
533	/* Make sure node names are constructed correctly */
534	unittest((np = of_find_node_by_path("/testcase-data/changeset/n2/n21")),
535		 "'%s' not added\n", n21->full_name);
536	of_node_put(np);
537
538	mutex_lock(&of_mutex);
539	unittest(!of_changeset_revert(&chgset), "revert failed\n");
540	mutex_unlock(&of_mutex);
541
542	of_changeset_destroy(&chgset);
543#endif
544}
545
546static void __init of_unittest_parse_interrupts(void)
547{
548	struct device_node *np;
549	struct of_phandle_args args;
550	int i, rc;
551
552	np = of_find_node_by_path("/testcase-data/interrupts/interrupts0");
553	if (!np) {
554		pr_err("missing testcase data\n");
555		return;
556	}
557
558	for (i = 0; i < 4; i++) {
559		bool passed = true;
560
561		args.args_count = 0;
562		rc = of_irq_parse_one(np, i, &args);
563
564		passed &= !rc;
565		passed &= (args.args_count == 1);
566		passed &= (args.args[0] == (i + 1));
567
568		unittest(passed, "index %i - data error on node %s rc=%i\n",
569			 i, args.np->full_name, rc);
570	}
571	of_node_put(np);
572
573	np = of_find_node_by_path("/testcase-data/interrupts/interrupts1");
574	if (!np) {
575		pr_err("missing testcase data\n");
576		return;
577	}
578
579	for (i = 0; i < 4; i++) {
580		bool passed = true;
581
582		args.args_count = 0;
583		rc = of_irq_parse_one(np, i, &args);
584
585		/* Test the values from tests-phandle.dtsi */
586		switch (i) {
587		case 0:
588			passed &= !rc;
589			passed &= (args.args_count == 1);
590			passed &= (args.args[0] == 9);
591			break;
592		case 1:
593			passed &= !rc;
594			passed &= (args.args_count == 3);
595			passed &= (args.args[0] == 10);
596			passed &= (args.args[1] == 11);
597			passed &= (args.args[2] == 12);
598			break;
599		case 2:
600			passed &= !rc;
601			passed &= (args.args_count == 2);
602			passed &= (args.args[0] == 13);
603			passed &= (args.args[1] == 14);
604			break;
605		case 3:
606			passed &= !rc;
607			passed &= (args.args_count == 2);
608			passed &= (args.args[0] == 15);
609			passed &= (args.args[1] == 16);
610			break;
611		default:
612			passed = false;
613		}
614		unittest(passed, "index %i - data error on node %s rc=%i\n",
615			 i, args.np->full_name, rc);
616	}
617	of_node_put(np);
618}
619
620static void __init of_unittest_parse_interrupts_extended(void)
621{
622	struct device_node *np;
623	struct of_phandle_args args;
624	int i, rc;
625
626	np = of_find_node_by_path("/testcase-data/interrupts/interrupts-extended0");
627	if (!np) {
628		pr_err("missing testcase data\n");
629		return;
630	}
631
632	for (i = 0; i < 7; i++) {
633		bool passed = true;
634
635		rc = of_irq_parse_one(np, i, &args);
636
637		/* Test the values from tests-phandle.dtsi */
638		switch (i) {
639		case 0:
640			passed &= !rc;
641			passed &= (args.args_count == 1);
642			passed &= (args.args[0] == 1);
643			break;
644		case 1:
645			passed &= !rc;
646			passed &= (args.args_count == 3);
647			passed &= (args.args[0] == 2);
648			passed &= (args.args[1] == 3);
649			passed &= (args.args[2] == 4);
650			break;
651		case 2:
652			passed &= !rc;
653			passed &= (args.args_count == 2);
654			passed &= (args.args[0] == 5);
655			passed &= (args.args[1] == 6);
656			break;
657		case 3:
658			passed &= !rc;
659			passed &= (args.args_count == 1);
660			passed &= (args.args[0] == 9);
661			break;
662		case 4:
663			passed &= !rc;
664			passed &= (args.args_count == 3);
665			passed &= (args.args[0] == 10);
666			passed &= (args.args[1] == 11);
667			passed &= (args.args[2] == 12);
668			break;
669		case 5:
670			passed &= !rc;
671			passed &= (args.args_count == 2);
672			passed &= (args.args[0] == 13);
673			passed &= (args.args[1] == 14);
674			break;
675		case 6:
676			passed &= !rc;
677			passed &= (args.args_count == 1);
678			passed &= (args.args[0] == 15);
679			break;
680		default:
681			passed = false;
682		}
683
684		unittest(passed, "index %i - data error on node %s rc=%i\n",
685			 i, args.np->full_name, rc);
686	}
687	of_node_put(np);
688}
689
690static const struct of_device_id match_node_table[] = {
691	{ .data = "A", .name = "name0", }, /* Name alone is lowest priority */
692	{ .data = "B", .type = "type1", }, /* followed by type alone */
693
694	{ .data = "Ca", .name = "name2", .type = "type1", }, /* followed by both together */
695	{ .data = "Cb", .name = "name2", }, /* Only match when type doesn't match */
696	{ .data = "Cc", .name = "name2", .type = "type2", },
697
698	{ .data = "E", .compatible = "compat3" },
699	{ .data = "G", .compatible = "compat2", },
700	{ .data = "H", .compatible = "compat2", .name = "name5", },
701	{ .data = "I", .compatible = "compat2", .type = "type1", },
702	{ .data = "J", .compatible = "compat2", .type = "type1", .name = "name8", },
703	{ .data = "K", .compatible = "compat2", .name = "name9", },
704	{}
705};
706
707static struct {
708	const char *path;
709	const char *data;
710} match_node_tests[] = {
711	{ .path = "/testcase-data/match-node/name0", .data = "A", },
712	{ .path = "/testcase-data/match-node/name1", .data = "B", },
713	{ .path = "/testcase-data/match-node/a/name2", .data = "Ca", },
714	{ .path = "/testcase-data/match-node/b/name2", .data = "Cb", },
715	{ .path = "/testcase-data/match-node/c/name2", .data = "Cc", },
716	{ .path = "/testcase-data/match-node/name3", .data = "E", },
717	{ .path = "/testcase-data/match-node/name4", .data = "G", },
718	{ .path = "/testcase-data/match-node/name5", .data = "H", },
719	{ .path = "/testcase-data/match-node/name6", .data = "G", },
720	{ .path = "/testcase-data/match-node/name7", .data = "I", },
721	{ .path = "/testcase-data/match-node/name8", .data = "J", },
722	{ .path = "/testcase-data/match-node/name9", .data = "K", },
723};
724
725static void __init of_unittest_match_node(void)
726{
727	struct device_node *np;
728	const struct of_device_id *match;
729	int i;
730
731	for (i = 0; i < ARRAY_SIZE(match_node_tests); i++) {
732		np = of_find_node_by_path(match_node_tests[i].path);
733		if (!np) {
734			unittest(0, "missing testcase node %s\n",
735				match_node_tests[i].path);
736			continue;
737		}
738
739		match = of_match_node(match_node_table, np);
740		if (!match) {
741			unittest(0, "%s didn't match anything\n",
742				match_node_tests[i].path);
743			continue;
744		}
745
746		if (strcmp(match->data, match_node_tests[i].data) != 0) {
747			unittest(0, "%s got wrong match. expected %s, got %s\n",
748				match_node_tests[i].path, match_node_tests[i].data,
749				(const char *)match->data);
750			continue;
751		}
752		unittest(1, "passed");
753	}
754}
755
756static const struct platform_device_info test_bus_info = {
757	.name = "unittest-bus",
758};
759static void __init of_unittest_platform_populate(void)
760{
761	int irq, rc;
762	struct device_node *np, *child, *grandchild;
763	struct platform_device *pdev, *test_bus;
764	const struct of_device_id match[] = {
765		{ .compatible = "test-device", },
766		{}
767	};
768
769	np = of_find_node_by_path("/testcase-data");
770	of_platform_populate(np, of_default_bus_match_table, NULL, NULL);
771
772	/* Test that a missing irq domain returns -EPROBE_DEFER */
773	np = of_find_node_by_path("/testcase-data/testcase-device1");
774	pdev = of_find_device_by_node(np);
775	unittest(pdev, "device 1 creation failed\n");
776
777	irq = platform_get_irq(pdev, 0);
778	unittest(irq == -EPROBE_DEFER, "device deferred probe failed - %d\n", irq);
779
780	/* Test that a parsing failure does not return -EPROBE_DEFER */
781	np = of_find_node_by_path("/testcase-data/testcase-device2");
782	pdev = of_find_device_by_node(np);
783	unittest(pdev, "device 2 creation failed\n");
784	irq = platform_get_irq(pdev, 0);
785	unittest(irq < 0 && irq != -EPROBE_DEFER, "device parsing error failed - %d\n", irq);
786
787	np = of_find_node_by_path("/testcase-data/platform-tests");
788	unittest(np, "No testcase data in device tree\n");
789	if (!np)
790		return;
791
792	test_bus = platform_device_register_full(&test_bus_info);
793	rc = PTR_ERR_OR_ZERO(test_bus);
794	unittest(!rc, "testbus registration failed; rc=%i\n", rc);
795	if (rc)
796		return;
797	test_bus->dev.of_node = np;
798
799	of_platform_populate(np, match, NULL, &test_bus->dev);
800	for_each_child_of_node(np, child) {
801		for_each_child_of_node(child, grandchild)
802			unittest(of_find_device_by_node(grandchild),
803				 "Could not create device for node '%s'\n",
804				 grandchild->name);
805	}
806
807	of_platform_depopulate(&test_bus->dev);
808	for_each_child_of_node(np, child) {
809		for_each_child_of_node(child, grandchild)
810			unittest(!of_find_device_by_node(grandchild),
811				 "device didn't get destroyed '%s'\n",
812				 grandchild->name);
813	}
814
815	platform_device_unregister(test_bus);
816	of_node_put(np);
817}
818
819/**
820 *	update_node_properties - adds the properties
821 *	of np into dup node (present in live tree) and
822 *	updates parent of children of np to dup.
823 *
824 *	@np:	node already present in live tree
825 *	@dup:	node present in live tree to be updated
826 */
827static void update_node_properties(struct device_node *np,
828					struct device_node *dup)
829{
830	struct property *prop;
831	struct device_node *child;
832
833	for_each_property_of_node(np, prop)
834		of_add_property(dup, prop);
835
836	for_each_child_of_node(np, child)
837		child->parent = dup;
838}
839
840/**
841 *	attach_node_and_children - attaches nodes
842 *	and its children to live tree
843 *
844 *	@np:	Node to attach to live tree
845 */
846static int attach_node_and_children(struct device_node *np)
847{
848	struct device_node *next, *dup, *child;
849	unsigned long flags;
850
851	dup = of_find_node_by_path(np->full_name);
852	if (dup) {
853		update_node_properties(np, dup);
854		return 0;
855	}
856
857	child = np->child;
858	np->child = NULL;
859
860	mutex_lock(&of_mutex);
861	raw_spin_lock_irqsave(&devtree_lock, flags);
862	np->sibling = np->parent->child;
863	np->parent->child = np;
864	of_node_clear_flag(np, OF_DETACHED);
865	raw_spin_unlock_irqrestore(&devtree_lock, flags);
866
867	__of_attach_node_sysfs(np);
868	mutex_unlock(&of_mutex);
869
870	while (child) {
871		next = child->sibling;
872		attach_node_and_children(child);
873		child = next;
874	}
875
876	return 0;
877}
878
879/**
880 *	unittest_data_add - Reads, copies data from
881 *	linked tree and attaches it to the live tree
882 */
883static int __init unittest_data_add(void)
884{
885	void *unittest_data;
886	struct device_node *unittest_data_node, *np;
887	/*
888	 * __dtb_testcases_begin[] and __dtb_testcases_end[] are magically
889	 * created by cmd_dt_S_dtb in scripts/Makefile.lib
890	 */
891	extern uint8_t __dtb_testcases_begin[];
892	extern uint8_t __dtb_testcases_end[];
893	const int size = __dtb_testcases_end - __dtb_testcases_begin;
894	int rc;
895
896	if (!size) {
897		pr_warn("%s: No testcase data to attach; not running tests\n",
898			__func__);
899		return -ENODATA;
900	}
901
902	/* creating copy */
903	unittest_data = kmemdup(__dtb_testcases_begin, size, GFP_KERNEL);
904
905	if (!unittest_data) {
906		pr_warn("%s: Failed to allocate memory for unittest_data; "
907			"not running tests\n", __func__);
908		return -ENOMEM;
909	}
910	of_fdt_unflatten_tree(unittest_data, &unittest_data_node);
911	if (!unittest_data_node) {
912		pr_warn("%s: No tree to attach; not running tests\n", __func__);
913		return -ENODATA;
914	}
915	of_node_set_flag(unittest_data_node, OF_DETACHED);
916	rc = of_resolve_phandles(unittest_data_node);
917	if (rc) {
918		pr_err("%s: Failed to resolve phandles (rc=%i)\n", __func__, rc);
919		return -EINVAL;
920	}
921
922	if (!of_root) {
923		of_root = unittest_data_node;
924		for_each_of_allnodes(np)
925			__of_attach_node_sysfs(np);
926		of_aliases = of_find_node_by_path("/aliases");
927		of_chosen = of_find_node_by_path("/chosen");
928		return 0;
929	}
930
931	/* attach the sub-tree to live tree */
932	np = unittest_data_node->child;
933	while (np) {
934		struct device_node *next = np->sibling;
935
936		np->parent = of_root;
937		attach_node_and_children(np);
938		np = next;
939	}
940	return 0;
941}
942
943#ifdef CONFIG_OF_OVERLAY
944
945static int unittest_probe(struct platform_device *pdev)
946{
947	struct device *dev = &pdev->dev;
948	struct device_node *np = dev->of_node;
949
950	if (np == NULL) {
951		dev_err(dev, "No OF data for device\n");
952		return -EINVAL;
953
954	}
955
956	dev_dbg(dev, "%s for node @%s\n", __func__, np->full_name);
957
958	of_platform_populate(np, NULL, NULL, &pdev->dev);
959
960	return 0;
961}
962
963static int unittest_remove(struct platform_device *pdev)
964{
965	struct device *dev = &pdev->dev;
966	struct device_node *np = dev->of_node;
967
968	dev_dbg(dev, "%s for node @%s\n", __func__, np->full_name);
969	return 0;
970}
971
972static const struct of_device_id unittest_match[] = {
973	{ .compatible = "unittest", },
974	{},
975};
976
977static struct platform_driver unittest_driver = {
978	.probe			= unittest_probe,
979	.remove			= unittest_remove,
980	.driver = {
981		.name		= "unittest",
982		.owner		= THIS_MODULE,
983		.of_match_table	= of_match_ptr(unittest_match),
984	},
985};
986
987/* get the platform device instantiated at the path */
988static struct platform_device *of_path_to_platform_device(const char *path)
989{
990	struct device_node *np;
991	struct platform_device *pdev;
992
993	np = of_find_node_by_path(path);
994	if (np == NULL)
995		return NULL;
996
997	pdev = of_find_device_by_node(np);
998	of_node_put(np);
999
1000	return pdev;
1001}
1002
1003/* find out if a platform device exists at that path */
1004static int of_path_platform_device_exists(const char *path)
1005{
1006	struct platform_device *pdev;
1007
1008	pdev = of_path_to_platform_device(path);
1009	platform_device_put(pdev);
1010	return pdev != NULL;
1011}
1012
1013#if IS_BUILTIN(CONFIG_I2C)
1014
1015/* get the i2c client device instantiated at the path */
1016static struct i2c_client *of_path_to_i2c_client(const char *path)
1017{
1018	struct device_node *np;
1019	struct i2c_client *client;
1020
1021	np = of_find_node_by_path(path);
1022	if (np == NULL)
1023		return NULL;
1024
1025	client = of_find_i2c_device_by_node(np);
1026	of_node_put(np);
1027
1028	return client;
1029}
1030
1031/* find out if a i2c client device exists at that path */
1032static int of_path_i2c_client_exists(const char *path)
1033{
1034	struct i2c_client *client;
1035
1036	client = of_path_to_i2c_client(path);
1037	if (client)
1038		put_device(&client->dev);
1039	return client != NULL;
1040}
1041#else
1042static int of_path_i2c_client_exists(const char *path)
1043{
1044	return 0;
1045}
1046#endif
1047
1048enum overlay_type {
1049	PDEV_OVERLAY,
1050	I2C_OVERLAY
1051};
1052
1053static int of_path_device_type_exists(const char *path,
1054		enum overlay_type ovtype)
1055{
1056	switch (ovtype) {
1057	case PDEV_OVERLAY:
1058		return of_path_platform_device_exists(path);
1059	case I2C_OVERLAY:
1060		return of_path_i2c_client_exists(path);
1061	}
1062	return 0;
1063}
1064
1065static const char *unittest_path(int nr, enum overlay_type ovtype)
1066{
1067	const char *base;
1068	static char buf[256];
1069
1070	switch (ovtype) {
1071	case PDEV_OVERLAY:
1072		base = "/testcase-data/overlay-node/test-bus";
1073		break;
1074	case I2C_OVERLAY:
1075		base = "/testcase-data/overlay-node/test-bus/i2c-test-bus";
1076		break;
1077	default:
1078		buf[0] = '\0';
1079		return buf;
1080	}
1081	snprintf(buf, sizeof(buf) - 1, "%s/test-unittest%d", base, nr);
1082	buf[sizeof(buf) - 1] = '\0';
1083	return buf;
1084}
1085
1086static int of_unittest_device_exists(int unittest_nr, enum overlay_type ovtype)
1087{
1088	const char *path;
1089
1090	path = unittest_path(unittest_nr, ovtype);
1091
1092	switch (ovtype) {
1093	case PDEV_OVERLAY:
1094		return of_path_platform_device_exists(path);
1095	case I2C_OVERLAY:
1096		return of_path_i2c_client_exists(path);
1097	}
1098	return 0;
1099}
1100
1101static const char *overlay_path(int nr)
1102{
1103	static char buf[256];
1104
1105	snprintf(buf, sizeof(buf) - 1,
1106		"/testcase-data/overlay%d", nr);
1107	buf[sizeof(buf) - 1] = '\0';
1108
1109	return buf;
1110}
1111
1112static const char *bus_path = "/testcase-data/overlay-node/test-bus";
1113
1114/* it is guaranteed that overlay ids are assigned in sequence */
1115#define MAX_UNITTEST_OVERLAYS	256
1116static unsigned long overlay_id_bits[BITS_TO_LONGS(MAX_UNITTEST_OVERLAYS)];
1117static int overlay_first_id = -1;
1118
1119static void of_unittest_track_overlay(int id)
1120{
1121	if (overlay_first_id < 0)
1122		overlay_first_id = id;
1123	id -= overlay_first_id;
1124
1125	/* we shouldn't need that many */
1126	BUG_ON(id >= MAX_UNITTEST_OVERLAYS);
1127	overlay_id_bits[BIT_WORD(id)] |= BIT_MASK(id);
1128}
1129
1130static void of_unittest_untrack_overlay(int id)
1131{
1132	if (overlay_first_id < 0)
1133		return;
1134	id -= overlay_first_id;
1135	BUG_ON(id >= MAX_UNITTEST_OVERLAYS);
1136	overlay_id_bits[BIT_WORD(id)] &= ~BIT_MASK(id);
1137}
1138
1139static void of_unittest_destroy_tracked_overlays(void)
1140{
1141	int id, ret, defers;
1142
1143	if (overlay_first_id < 0)
1144		return;
1145
1146	/* try until no defers */
1147	do {
1148		defers = 0;
1149		/* remove in reverse order */
1150		for (id = MAX_UNITTEST_OVERLAYS - 1; id >= 0; id--) {
1151			if (!(overlay_id_bits[BIT_WORD(id)] & BIT_MASK(id)))
1152				continue;
1153
1154			ret = of_overlay_destroy(id + overlay_first_id);
1155			if (ret != 0) {
1156				defers++;
1157				pr_warn("%s: overlay destroy failed for #%d\n",
1158					__func__, id + overlay_first_id);
1159				continue;
1160			}
1161
1162			overlay_id_bits[BIT_WORD(id)] &= ~BIT_MASK(id);
1163		}
1164	} while (defers > 0);
1165}
1166
1167static int of_unittest_apply_overlay(int unittest_nr, int overlay_nr,
1168		int *overlay_id)
1169{
1170	struct device_node *np = NULL;
1171	int ret, id = -1;
1172
1173	np = of_find_node_by_path(overlay_path(overlay_nr));
1174	if (np == NULL) {
1175		unittest(0, "could not find overlay node @\"%s\"\n",
1176				overlay_path(overlay_nr));
1177		ret = -EINVAL;
1178		goto out;
1179	}
1180
1181	ret = of_overlay_create(np);
1182	if (ret < 0) {
1183		unittest(0, "could not create overlay from \"%s\"\n",
1184				overlay_path(overlay_nr));
1185		goto out;
1186	}
1187	id = ret;
1188	of_unittest_track_overlay(id);
1189
1190	ret = 0;
1191
1192out:
1193	of_node_put(np);
1194
1195	if (overlay_id)
1196		*overlay_id = id;
1197
1198	return ret;
1199}
1200
1201/* apply an overlay while checking before and after states */
1202static int of_unittest_apply_overlay_check(int overlay_nr, int unittest_nr,
1203		int before, int after, enum overlay_type ovtype)
1204{
1205	int ret;
1206
1207	/* unittest device must not be in before state */
1208	if (of_unittest_device_exists(unittest_nr, ovtype) != before) {
1209		unittest(0, "overlay @\"%s\" with device @\"%s\" %s\n",
1210				overlay_path(overlay_nr),
1211				unittest_path(unittest_nr, ovtype),
1212				!before ? "enabled" : "disabled");
1213		return -EINVAL;
1214	}
1215
1216	ret = of_unittest_apply_overlay(overlay_nr, unittest_nr, NULL);
1217	if (ret != 0) {
1218		/* of_unittest_apply_overlay already called unittest() */
1219		return ret;
1220	}
1221
1222	/* unittest device must be to set to after state */
1223	if (of_unittest_device_exists(unittest_nr, ovtype) != after) {
1224		unittest(0, "overlay @\"%s\" failed to create @\"%s\" %s\n",
1225				overlay_path(overlay_nr),
1226				unittest_path(unittest_nr, ovtype),
1227				!after ? "enabled" : "disabled");
1228		return -EINVAL;
1229	}
1230
1231	return 0;
1232}
1233
1234/* apply an overlay and then revert it while checking before, after states */
1235static int of_unittest_apply_revert_overlay_check(int overlay_nr,
1236		int unittest_nr, int before, int after,
1237		enum overlay_type ovtype)
1238{
1239	int ret, ov_id;
1240
1241	/* unittest device must be in before state */
1242	if (of_unittest_device_exists(unittest_nr, ovtype) != before) {
1243		unittest(0, "overlay @\"%s\" with device @\"%s\" %s\n",
1244				overlay_path(overlay_nr),
1245				unittest_path(unittest_nr, ovtype),
1246				!before ? "enabled" : "disabled");
1247		return -EINVAL;
1248	}
1249
1250	/* apply the overlay */
1251	ret = of_unittest_apply_overlay(overlay_nr, unittest_nr, &ov_id);
1252	if (ret != 0) {
1253		/* of_unittest_apply_overlay already called unittest() */
1254		return ret;
1255	}
1256
1257	/* unittest device must be in after state */
1258	if (of_unittest_device_exists(unittest_nr, ovtype) != after) {
1259		unittest(0, "overlay @\"%s\" failed to create @\"%s\" %s\n",
1260				overlay_path(overlay_nr),
1261				unittest_path(unittest_nr, ovtype),
1262				!after ? "enabled" : "disabled");
1263		return -EINVAL;
1264	}
1265
1266	ret = of_overlay_destroy(ov_id);
1267	if (ret != 0) {
1268		unittest(0, "overlay @\"%s\" failed to be destroyed @\"%s\"\n",
1269				overlay_path(overlay_nr),
1270				unittest_path(unittest_nr, ovtype));
1271		return ret;
1272	}
1273
1274	/* unittest device must be again in before state */
1275	if (of_unittest_device_exists(unittest_nr, PDEV_OVERLAY) != before) {
1276		unittest(0, "overlay @\"%s\" with device @\"%s\" %s\n",
1277				overlay_path(overlay_nr),
1278				unittest_path(unittest_nr, ovtype),
1279				!before ? "enabled" : "disabled");
1280		return -EINVAL;
1281	}
1282
1283	return 0;
1284}
1285
1286/* test activation of device */
1287static void of_unittest_overlay_0(void)
1288{
1289	int ret;
1290
1291	/* device should enable */
1292	ret = of_unittest_apply_overlay_check(0, 0, 0, 1, PDEV_OVERLAY);
1293	if (ret != 0)
1294		return;
1295
1296	unittest(1, "overlay test %d passed\n", 0);
1297}
1298
1299/* test deactivation of device */
1300static void of_unittest_overlay_1(void)
1301{
1302	int ret;
1303
1304	/* device should disable */
1305	ret = of_unittest_apply_overlay_check(1, 1, 1, 0, PDEV_OVERLAY);
1306	if (ret != 0)
1307		return;
1308
1309	unittest(1, "overlay test %d passed\n", 1);
1310}
1311
1312/* test activation of device */
1313static void of_unittest_overlay_2(void)
1314{
1315	int ret;
1316
1317	/* device should enable */
1318	ret = of_unittest_apply_overlay_check(2, 2, 0, 1, PDEV_OVERLAY);
1319	if (ret != 0)
1320		return;
1321
1322	unittest(1, "overlay test %d passed\n", 2);
1323}
1324
1325/* test deactivation of device */
1326static void of_unittest_overlay_3(void)
1327{
1328	int ret;
1329
1330	/* device should disable */
1331	ret = of_unittest_apply_overlay_check(3, 3, 1, 0, PDEV_OVERLAY);
1332	if (ret != 0)
1333		return;
1334
1335	unittest(1, "overlay test %d passed\n", 3);
1336}
1337
1338/* test activation of a full device node */
1339static void of_unittest_overlay_4(void)
1340{
1341	int ret;
1342
1343	/* device should disable */
1344	ret = of_unittest_apply_overlay_check(4, 4, 0, 1, PDEV_OVERLAY);
1345	if (ret != 0)
1346		return;
1347
1348	unittest(1, "overlay test %d passed\n", 4);
1349}
1350
1351/* test overlay apply/revert sequence */
1352static void of_unittest_overlay_5(void)
1353{
1354	int ret;
1355
1356	/* device should disable */
1357	ret = of_unittest_apply_revert_overlay_check(5, 5, 0, 1, PDEV_OVERLAY);
1358	if (ret != 0)
1359		return;
1360
1361	unittest(1, "overlay test %d passed\n", 5);
1362}
1363
1364/* test overlay application in sequence */
1365static void of_unittest_overlay_6(void)
1366{
1367	struct device_node *np;
1368	int ret, i, ov_id[2];
1369	int overlay_nr = 6, unittest_nr = 6;
1370	int before = 0, after = 1;
1371
1372	/* unittest device must be in before state */
1373	for (i = 0; i < 2; i++) {
1374		if (of_unittest_device_exists(unittest_nr + i, PDEV_OVERLAY)
1375				!= before) {
1376			unittest(0, "overlay @\"%s\" with device @\"%s\" %s\n",
1377					overlay_path(overlay_nr + i),
1378					unittest_path(unittest_nr + i,
1379						PDEV_OVERLAY),
1380					!before ? "enabled" : "disabled");
1381			return;
1382		}
1383	}
1384
1385	/* apply the overlays */
1386	for (i = 0; i < 2; i++) {
1387
1388		np = of_find_node_by_path(overlay_path(overlay_nr + i));
1389		if (np == NULL) {
1390			unittest(0, "could not find overlay node @\"%s\"\n",
1391					overlay_path(overlay_nr + i));
1392			return;
1393		}
1394
1395		ret = of_overlay_create(np);
1396		if (ret < 0)  {
1397			unittest(0, "could not create overlay from \"%s\"\n",
1398					overlay_path(overlay_nr + i));
1399			return;
1400		}
1401		ov_id[i] = ret;
1402		of_unittest_track_overlay(ov_id[i]);
1403	}
1404
1405	for (i = 0; i < 2; i++) {
1406		/* unittest device must be in after state */
1407		if (of_unittest_device_exists(unittest_nr + i, PDEV_OVERLAY)
1408				!= after) {
1409			unittest(0, "overlay @\"%s\" failed @\"%s\" %s\n",
1410					overlay_path(overlay_nr + i),
1411					unittest_path(unittest_nr + i,
1412						PDEV_OVERLAY),
1413					!after ? "enabled" : "disabled");
1414			return;
1415		}
1416	}
1417
1418	for (i = 1; i >= 0; i--) {
1419		ret = of_overlay_destroy(ov_id[i]);
1420		if (ret != 0) {
1421			unittest(0, "overlay @\"%s\" failed destroy @\"%s\"\n",
1422					overlay_path(overlay_nr + i),
1423					unittest_path(unittest_nr + i,
1424						PDEV_OVERLAY));
1425			return;
1426		}
1427		of_unittest_untrack_overlay(ov_id[i]);
1428	}
1429
1430	for (i = 0; i < 2; i++) {
1431		/* unittest device must be again in before state */
1432		if (of_unittest_device_exists(unittest_nr + i, PDEV_OVERLAY)
1433				!= before) {
1434			unittest(0, "overlay @\"%s\" with device @\"%s\" %s\n",
1435					overlay_path(overlay_nr + i),
1436					unittest_path(unittest_nr + i,
1437						PDEV_OVERLAY),
1438					!before ? "enabled" : "disabled");
1439			return;
1440		}
1441	}
1442
1443	unittest(1, "overlay test %d passed\n", 6);
1444}
1445
1446/* test overlay application in sequence */
1447static void of_unittest_overlay_8(void)
1448{
1449	struct device_node *np;
1450	int ret, i, ov_id[2];
1451	int overlay_nr = 8, unittest_nr = 8;
1452
1453	/* we don't care about device state in this test */
1454
1455	/* apply the overlays */
1456	for (i = 0; i < 2; i++) {
1457
1458		np = of_find_node_by_path(overlay_path(overlay_nr + i));
1459		if (np == NULL) {
1460			unittest(0, "could not find overlay node @\"%s\"\n",
1461					overlay_path(overlay_nr + i));
1462			return;
1463		}
1464
1465		ret = of_overlay_create(np);
1466		if (ret < 0)  {
1467			unittest(0, "could not create overlay from \"%s\"\n",
1468					overlay_path(overlay_nr + i));
1469			return;
1470		}
1471		ov_id[i] = ret;
1472		of_unittest_track_overlay(ov_id[i]);
1473	}
1474
1475	/* now try to remove first overlay (it should fail) */
1476	ret = of_overlay_destroy(ov_id[0]);
1477	if (ret == 0) {
1478		unittest(0, "overlay @\"%s\" was destroyed @\"%s\"\n",
1479				overlay_path(overlay_nr + 0),
1480				unittest_path(unittest_nr,
1481					PDEV_OVERLAY));
1482		return;
1483	}
1484
1485	/* removing them in order should work */
1486	for (i = 1; i >= 0; i--) {
1487		ret = of_overlay_destroy(ov_id[i]);
1488		if (ret != 0) {
1489			unittest(0, "overlay @\"%s\" not destroyed @\"%s\"\n",
1490					overlay_path(overlay_nr + i),
1491					unittest_path(unittest_nr,
1492						PDEV_OVERLAY));
1493			return;
1494		}
1495		of_unittest_untrack_overlay(ov_id[i]);
1496	}
1497
1498	unittest(1, "overlay test %d passed\n", 8);
1499}
1500
1501/* test insertion of a bus with parent devices */
1502static void of_unittest_overlay_10(void)
1503{
1504	int ret;
1505	char *child_path;
1506
1507	/* device should disable */
1508	ret = of_unittest_apply_overlay_check(10, 10, 0, 1, PDEV_OVERLAY);
1509	if (unittest(ret == 0,
1510			"overlay test %d failed; overlay application\n", 10))
1511		return;
1512
1513	child_path = kasprintf(GFP_KERNEL, "%s/test-unittest101",
1514			unittest_path(10, PDEV_OVERLAY));
1515	if (unittest(child_path, "overlay test %d failed; kasprintf\n", 10))
1516		return;
1517
1518	ret = of_path_device_type_exists(child_path, PDEV_OVERLAY);
1519	kfree(child_path);
1520	if (unittest(ret, "overlay test %d failed; no child device\n", 10))
1521		return;
1522}
1523
1524/* test insertion of a bus with parent devices (and revert) */
1525static void of_unittest_overlay_11(void)
1526{
1527	int ret;
1528
1529	/* device should disable */
1530	ret = of_unittest_apply_revert_overlay_check(11, 11, 0, 1,
1531			PDEV_OVERLAY);
1532	if (unittest(ret == 0,
1533			"overlay test %d failed; overlay application\n", 11))
1534		return;
1535}
1536
1537#if IS_BUILTIN(CONFIG_I2C) && IS_ENABLED(CONFIG_OF_OVERLAY)
1538
1539struct unittest_i2c_bus_data {
1540	struct platform_device	*pdev;
1541	struct i2c_adapter	adap;
1542};
1543
1544static int unittest_i2c_master_xfer(struct i2c_adapter *adap,
1545		struct i2c_msg *msgs, int num)
1546{
1547	struct unittest_i2c_bus_data *std = i2c_get_adapdata(adap);
1548
1549	(void)std;
1550
1551	return num;
1552}
1553
1554static u32 unittest_i2c_functionality(struct i2c_adapter *adap)
1555{
1556	return I2C_FUNC_I2C | I2C_FUNC_SMBUS_EMUL;
1557}
1558
1559static const struct i2c_algorithm unittest_i2c_algo = {
1560	.master_xfer	= unittest_i2c_master_xfer,
1561	.functionality	= unittest_i2c_functionality,
1562};
1563
1564static int unittest_i2c_bus_probe(struct platform_device *pdev)
1565{
1566	struct device *dev = &pdev->dev;
1567	struct device_node *np = dev->of_node;
1568	struct unittest_i2c_bus_data *std;
1569	struct i2c_adapter *adap;
1570	int ret;
1571
1572	if (np == NULL) {
1573		dev_err(dev, "No OF data for device\n");
1574		return -EINVAL;
1575
1576	}
1577
1578	dev_dbg(dev, "%s for node @%s\n", __func__, np->full_name);
1579
1580	std = devm_kzalloc(dev, sizeof(*std), GFP_KERNEL);
1581	if (!std) {
1582		dev_err(dev, "Failed to allocate unittest i2c data\n");
1583		return -ENOMEM;
1584	}
1585
1586	/* link them together */
1587	std->pdev = pdev;
1588	platform_set_drvdata(pdev, std);
1589
1590	adap = &std->adap;
1591	i2c_set_adapdata(adap, std);
1592	adap->nr = -1;
1593	strlcpy(adap->name, pdev->name, sizeof(adap->name));
1594	adap->class = I2C_CLASS_DEPRECATED;
1595	adap->algo = &unittest_i2c_algo;
1596	adap->dev.parent = dev;
1597	adap->dev.of_node = dev->of_node;
1598	adap->timeout = 5 * HZ;
1599	adap->retries = 3;
1600
1601	ret = i2c_add_numbered_adapter(adap);
1602	if (ret != 0) {
1603		dev_err(dev, "Failed to add I2C adapter\n");
1604		return ret;
1605	}
1606
1607	return 0;
1608}
1609
1610static int unittest_i2c_bus_remove(struct platform_device *pdev)
1611{
1612	struct device *dev = &pdev->dev;
1613	struct device_node *np = dev->of_node;
1614	struct unittest_i2c_bus_data *std = platform_get_drvdata(pdev);
1615
1616	dev_dbg(dev, "%s for node @%s\n", __func__, np->full_name);
1617	i2c_del_adapter(&std->adap);
1618
1619	return 0;
1620}
1621
1622static const struct of_device_id unittest_i2c_bus_match[] = {
1623	{ .compatible = "unittest-i2c-bus", },
1624	{},
1625};
1626
1627static struct platform_driver unittest_i2c_bus_driver = {
1628	.probe			= unittest_i2c_bus_probe,
1629	.remove			= unittest_i2c_bus_remove,
1630	.driver = {
1631		.name		= "unittest-i2c-bus",
1632		.of_match_table	= of_match_ptr(unittest_i2c_bus_match),
1633	},
1634};
1635
1636static int unittest_i2c_dev_probe(struct i2c_client *client,
1637		const struct i2c_device_id *id)
1638{
1639	struct device *dev = &client->dev;
1640	struct device_node *np = client->dev.of_node;
1641
1642	if (!np) {
1643		dev_err(dev, "No OF node\n");
1644		return -EINVAL;
1645	}
1646
1647	dev_dbg(dev, "%s for node @%s\n", __func__, np->full_name);
1648
1649	return 0;
1650};
1651
1652static int unittest_i2c_dev_remove(struct i2c_client *client)
1653{
1654	struct device *dev = &client->dev;
1655	struct device_node *np = client->dev.of_node;
1656
1657	dev_dbg(dev, "%s for node @%s\n", __func__, np->full_name);
1658	return 0;
1659}
1660
1661static const struct i2c_device_id unittest_i2c_dev_id[] = {
1662	{ .name = "unittest-i2c-dev" },
1663	{ }
1664};
1665
1666static struct i2c_driver unittest_i2c_dev_driver = {
1667	.driver = {
1668		.name = "unittest-i2c-dev",
1669		.owner = THIS_MODULE,
1670	},
1671	.probe = unittest_i2c_dev_probe,
1672	.remove = unittest_i2c_dev_remove,
1673	.id_table = unittest_i2c_dev_id,
1674};
1675
1676#if IS_BUILTIN(CONFIG_I2C_MUX)
1677
1678struct unittest_i2c_mux_data {
1679	int nchans;
1680	struct i2c_adapter *adap[];
1681};
1682
1683static int unittest_i2c_mux_select_chan(struct i2c_adapter *adap,
1684			       void *client, u32 chan)
1685{
1686	return 0;
1687}
1688
1689static int unittest_i2c_mux_probe(struct i2c_client *client,
1690		const struct i2c_device_id *id)
1691{
1692	int ret, i, nchans, size;
1693	struct device *dev = &client->dev;
1694	struct i2c_adapter *adap = to_i2c_adapter(dev->parent);
1695	struct device_node *np = client->dev.of_node, *child;
1696	struct unittest_i2c_mux_data *stm;
1697	u32 reg, max_reg;
1698
1699	dev_dbg(dev, "%s for node @%s\n", __func__, np->full_name);
1700
1701	if (!np) {
1702		dev_err(dev, "No OF node\n");
1703		return -EINVAL;
1704	}
1705
1706	max_reg = (u32)-1;
1707	for_each_child_of_node(np, child) {
1708		ret = of_property_read_u32(child, "reg", &reg);
1709		if (ret)
1710			continue;
1711		if (max_reg == (u32)-1 || reg > max_reg)
1712			max_reg = reg;
1713	}
1714	nchans = max_reg == (u32)-1 ? 0 : max_reg + 1;
1715	if (nchans == 0) {
1716		dev_err(dev, "No channels\n");
1717		return -EINVAL;
1718	}
1719
1720	size = offsetof(struct unittest_i2c_mux_data, adap[nchans]);
1721	stm = devm_kzalloc(dev, size, GFP_KERNEL);
1722	if (!stm) {
1723		dev_err(dev, "Out of memory\n");
1724		return -ENOMEM;
1725	}
1726	stm->nchans = nchans;
1727	for (i = 0; i < nchans; i++) {
1728		stm->adap[i] = i2c_add_mux_adapter(adap, dev, client,
1729				0, i, 0, unittest_i2c_mux_select_chan, NULL);
1730		if (!stm->adap[i]) {
1731			dev_err(dev, "Failed to register mux #%d\n", i);
1732			for (i--; i >= 0; i--)
1733				i2c_del_mux_adapter(stm->adap[i]);
1734			return -ENODEV;
1735		}
1736	}
1737
1738	i2c_set_clientdata(client, stm);
1739
1740	return 0;
1741};
1742
1743static int unittest_i2c_mux_remove(struct i2c_client *client)
1744{
1745	struct device *dev = &client->dev;
1746	struct device_node *np = client->dev.of_node;
1747	struct unittest_i2c_mux_data *stm = i2c_get_clientdata(client);
1748	int i;
1749
1750	dev_dbg(dev, "%s for node @%s\n", __func__, np->full_name);
1751	for (i = stm->nchans - 1; i >= 0; i--)
1752		i2c_del_mux_adapter(stm->adap[i]);
1753	return 0;
1754}
1755
1756static const struct i2c_device_id unittest_i2c_mux_id[] = {
1757	{ .name = "unittest-i2c-mux" },
1758	{ }
1759};
1760
1761static struct i2c_driver unittest_i2c_mux_driver = {
1762	.driver = {
1763		.name = "unittest-i2c-mux",
1764		.owner = THIS_MODULE,
1765	},
1766	.probe = unittest_i2c_mux_probe,
1767	.remove = unittest_i2c_mux_remove,
1768	.id_table = unittest_i2c_mux_id,
1769};
1770
1771#endif
1772
1773static int of_unittest_overlay_i2c_init(void)
1774{
1775	int ret;
1776
1777	ret = i2c_add_driver(&unittest_i2c_dev_driver);
1778	if (unittest(ret == 0,
1779			"could not register unittest i2c device driver\n"))
1780		return ret;
1781
1782	ret = platform_driver_register(&unittest_i2c_bus_driver);
1783	if (unittest(ret == 0,
1784			"could not register unittest i2c bus driver\n"))
1785		return ret;
1786
1787#if IS_BUILTIN(CONFIG_I2C_MUX)
1788	ret = i2c_add_driver(&unittest_i2c_mux_driver);
1789	if (unittest(ret == 0,
1790			"could not register unittest i2c mux driver\n"))
1791		return ret;
1792#endif
1793
1794	return 0;
1795}
1796
1797static void of_unittest_overlay_i2c_cleanup(void)
1798{
1799#if IS_BUILTIN(CONFIG_I2C_MUX)
1800	i2c_del_driver(&unittest_i2c_mux_driver);
1801#endif
1802	platform_driver_unregister(&unittest_i2c_bus_driver);
1803	i2c_del_driver(&unittest_i2c_dev_driver);
1804}
1805
1806static void of_unittest_overlay_i2c_12(void)
1807{
1808	int ret;
1809
1810	/* device should enable */
1811	ret = of_unittest_apply_overlay_check(12, 12, 0, 1, I2C_OVERLAY);
1812	if (ret != 0)
1813		return;
1814
1815	unittest(1, "overlay test %d passed\n", 12);
1816}
1817
1818/* test deactivation of device */
1819static void of_unittest_overlay_i2c_13(void)
1820{
1821	int ret;
1822
1823	/* device should disable */
1824	ret = of_unittest_apply_overlay_check(13, 13, 1, 0, I2C_OVERLAY);
1825	if (ret != 0)
1826		return;
1827
1828	unittest(1, "overlay test %d passed\n", 13);
1829}
1830
1831/* just check for i2c mux existence */
1832static void of_unittest_overlay_i2c_14(void)
1833{
1834}
1835
1836static void of_unittest_overlay_i2c_15(void)
1837{
1838	int ret;
1839
1840	/* device should enable */
1841	ret = of_unittest_apply_overlay_check(16, 15, 0, 1, I2C_OVERLAY);
1842	if (ret != 0)
1843		return;
1844
1845	unittest(1, "overlay test %d passed\n", 15);
1846}
1847
1848#else
1849
1850static inline void of_unittest_overlay_i2c_14(void) { }
1851static inline void of_unittest_overlay_i2c_15(void) { }
1852
1853#endif
1854
1855static void __init of_unittest_overlay(void)
1856{
1857	struct device_node *bus_np = NULL;
1858	int ret;
1859
1860	ret = platform_driver_register(&unittest_driver);
1861	if (ret != 0) {
1862		unittest(0, "could not register unittest driver\n");
1863		goto out;
1864	}
1865
1866	bus_np = of_find_node_by_path(bus_path);
1867	if (bus_np == NULL) {
1868		unittest(0, "could not find bus_path \"%s\"\n", bus_path);
1869		goto out;
1870	}
1871
1872	ret = of_platform_populate(bus_np, of_default_bus_match_table,
1873			NULL, NULL);
1874	if (ret != 0) {
1875		unittest(0, "could not populate bus @ \"%s\"\n", bus_path);
1876		goto out;
1877	}
1878
1879	if (!of_unittest_device_exists(100, PDEV_OVERLAY)) {
1880		unittest(0, "could not find unittest0 @ \"%s\"\n",
1881				unittest_path(100, PDEV_OVERLAY));
1882		goto out;
1883	}
1884
1885	if (of_unittest_device_exists(101, PDEV_OVERLAY)) {
1886		unittest(0, "unittest1 @ \"%s\" should not exist\n",
1887				unittest_path(101, PDEV_OVERLAY));
1888		goto out;
1889	}
1890
1891	unittest(1, "basic infrastructure of overlays passed");
1892
1893	/* tests in sequence */
1894	of_unittest_overlay_0();
1895	of_unittest_overlay_1();
1896	of_unittest_overlay_2();
1897	of_unittest_overlay_3();
1898	of_unittest_overlay_4();
1899	of_unittest_overlay_5();
1900	of_unittest_overlay_6();
1901	of_unittest_overlay_8();
1902
1903	of_unittest_overlay_10();
1904	of_unittest_overlay_11();
1905
1906#if IS_BUILTIN(CONFIG_I2C)
1907	if (unittest(of_unittest_overlay_i2c_init() == 0, "i2c init failed\n"))
1908		goto out;
1909
1910	of_unittest_overlay_i2c_12();
1911	of_unittest_overlay_i2c_13();
1912	of_unittest_overlay_i2c_14();
1913	of_unittest_overlay_i2c_15();
1914
1915	of_unittest_overlay_i2c_cleanup();
1916#endif
1917
1918	of_unittest_destroy_tracked_overlays();
1919
1920out:
1921	of_node_put(bus_np);
1922}
1923
1924#else
1925static inline void __init of_unittest_overlay(void) { }
1926#endif
1927
1928static int __init of_unittest(void)
1929{
1930	struct device_node *np;
1931	int res;
1932
1933	/* adding data for unittest */
1934	res = unittest_data_add();
1935	if (res)
1936		return res;
1937	if (!of_aliases)
1938		of_aliases = of_find_node_by_path("/aliases");
1939
1940	np = of_find_node_by_path("/testcase-data/phandle-tests/consumer-a");
1941	if (!np) {
1942		pr_info("No testcase data in device tree; not running tests\n");
1943		return 0;
1944	}
1945	of_node_put(np);
1946
1947	pr_info("start of unittest - you will see error messages\n");
1948	of_unittest_check_tree_linkage();
1949	of_unittest_check_phandles();
1950	of_unittest_find_node_by_name();
1951	of_unittest_dynamic();
1952	of_unittest_parse_phandle_with_args();
1953	of_unittest_property_string();
1954	of_unittest_property_copy();
1955	of_unittest_changeset();
1956	of_unittest_parse_interrupts();
1957	of_unittest_parse_interrupts_extended();
1958	of_unittest_match_node();
1959	of_unittest_platform_populate();
1960	of_unittest_overlay();
1961
1962	/* Double check linkage after removing testcase data */
1963	of_unittest_check_tree_linkage();
1964
1965	pr_info("end of unittest - %i passed, %i failed\n",
1966		unittest_results.passed, unittest_results.failed);
1967
1968	return 0;
1969}
1970late_initcall(of_unittest);
1971