GNU Linux-libre 5.10.215-gnu1
[releases.git] / drivers / of / unittest.c
1 // SPDX-License-Identifier: GPL-2.0
2 /*
3  * Self tests for device tree subsystem
4  */
5
6 #define pr_fmt(fmt) "### dt-test ### " fmt
7
8 #include <linux/memblock.h>
9 #include <linux/clk.h>
10 #include <linux/dma-direct.h> /* to test phys_to_dma/dma_to_phys */
11 #include <linux/err.h>
12 #include <linux/errno.h>
13 #include <linux/hashtable.h>
14 #include <linux/libfdt.h>
15 #include <linux/of.h>
16 #include <linux/of_address.h>
17 #include <linux/of_fdt.h>
18 #include <linux/of_irq.h>
19 #include <linux/of_platform.h>
20 #include <linux/list.h>
21 #include <linux/mutex.h>
22 #include <linux/slab.h>
23 #include <linux/device.h>
24 #include <linux/platform_device.h>
25
26 #include <linux/i2c.h>
27 #include <linux/i2c-mux.h>
28 #include <linux/gpio/driver.h>
29
30 #include <linux/bitops.h>
31
32 #include "of_private.h"
33
34 static struct unittest_results {
35         int passed;
36         int failed;
37 } unittest_results;
38
39 #define unittest(result, fmt, ...) ({ \
40         bool failed = !(result); \
41         if (failed) { \
42                 unittest_results.failed++; \
43                 pr_err("FAIL %s():%i " fmt, __func__, __LINE__, ##__VA_ARGS__); \
44         } else { \
45                 unittest_results.passed++; \
46                 pr_debug("pass %s():%i\n", __func__, __LINE__); \
47         } \
48         failed; \
49 })
50
51 #ifdef CONFIG_OF_KOBJ
52 #define OF_KREF_READ(NODE) kref_read(&(NODE)->kobj.kref)
53 #else
54 #define OF_KREF_READ(NODE) 1
55 #endif
56
57 /*
58  * Expected message may have a message level other than KERN_INFO.
59  * Print the expected message only if the current loglevel will allow
60  * the actual message to print.
61  *
62  * Do not use EXPECT_BEGIN() or EXPECT_END() for messages generated by
63  * pr_debug().
64  */
65 #define EXPECT_BEGIN(level, fmt, ...) \
66         printk(level pr_fmt("EXPECT \\ : ") fmt, ##__VA_ARGS__)
67
68 #define EXPECT_END(level, fmt, ...) \
69         printk(level pr_fmt("EXPECT / : ") fmt, ##__VA_ARGS__)
70
71 static void __init of_unittest_find_node_by_name(void)
72 {
73         struct device_node *np;
74         const char *options, *name;
75
76         np = of_find_node_by_path("/testcase-data");
77         name = kasprintf(GFP_KERNEL, "%pOF", np);
78         unittest(np && name && !strcmp("/testcase-data", name),
79                 "find /testcase-data failed\n");
80         of_node_put(np);
81         kfree(name);
82
83         /* Test if trailing '/' works */
84         np = of_find_node_by_path("/testcase-data/");
85         unittest(!np, "trailing '/' on /testcase-data/ should fail\n");
86
87         np = of_find_node_by_path("/testcase-data/phandle-tests/consumer-a");
88         name = kasprintf(GFP_KERNEL, "%pOF", np);
89         unittest(np && name && !strcmp("/testcase-data/phandle-tests/consumer-a", name),
90                 "find /testcase-data/phandle-tests/consumer-a failed\n");
91         of_node_put(np);
92         kfree(name);
93
94         np = of_find_node_by_path("testcase-alias");
95         name = kasprintf(GFP_KERNEL, "%pOF", np);
96         unittest(np && name && !strcmp("/testcase-data", name),
97                 "find testcase-alias failed\n");
98         of_node_put(np);
99         kfree(name);
100
101         /* Test if trailing '/' works on aliases */
102         np = of_find_node_by_path("testcase-alias/");
103         unittest(!np, "trailing '/' on testcase-alias/ should fail\n");
104
105         np = of_find_node_by_path("testcase-alias/phandle-tests/consumer-a");
106         name = kasprintf(GFP_KERNEL, "%pOF", np);
107         unittest(np && name && !strcmp("/testcase-data/phandle-tests/consumer-a", name),
108                 "find testcase-alias/phandle-tests/consumer-a failed\n");
109         of_node_put(np);
110         kfree(name);
111
112         np = of_find_node_by_path("/testcase-data/missing-path");
113         unittest(!np, "non-existent path returned node %pOF\n", np);
114         of_node_put(np);
115
116         np = of_find_node_by_path("missing-alias");
117         unittest(!np, "non-existent alias returned node %pOF\n", np);
118         of_node_put(np);
119
120         np = of_find_node_by_path("testcase-alias/missing-path");
121         unittest(!np, "non-existent alias with relative path returned node %pOF\n", np);
122         of_node_put(np);
123
124         np = of_find_node_opts_by_path("/testcase-data:testoption", &options);
125         unittest(np && !strcmp("testoption", options),
126                  "option path test failed\n");
127         of_node_put(np);
128
129         np = of_find_node_opts_by_path("/testcase-data:test/option", &options);
130         unittest(np && !strcmp("test/option", options),
131                  "option path test, subcase #1 failed\n");
132         of_node_put(np);
133
134         np = of_find_node_opts_by_path("/testcase-data/testcase-device1:test/option", &options);
135         unittest(np && !strcmp("test/option", options),
136                  "option path test, subcase #2 failed\n");
137         of_node_put(np);
138
139         np = of_find_node_opts_by_path("/testcase-data:testoption", NULL);
140         unittest(np, "NULL option path test failed\n");
141         of_node_put(np);
142
143         np = of_find_node_opts_by_path("testcase-alias:testaliasoption",
144                                        &options);
145         unittest(np && !strcmp("testaliasoption", options),
146                  "option alias path test failed\n");
147         of_node_put(np);
148
149         np = of_find_node_opts_by_path("testcase-alias:test/alias/option",
150                                        &options);
151         unittest(np && !strcmp("test/alias/option", options),
152                  "option alias path test, subcase #1 failed\n");
153         of_node_put(np);
154
155         np = of_find_node_opts_by_path("testcase-alias:testaliasoption", NULL);
156         unittest(np, "NULL option alias path test failed\n");
157         of_node_put(np);
158
159         options = "testoption";
160         np = of_find_node_opts_by_path("testcase-alias", &options);
161         unittest(np && !options, "option clearing test failed\n");
162         of_node_put(np);
163
164         options = "testoption";
165         np = of_find_node_opts_by_path("/", &options);
166         unittest(np && !options, "option clearing root node test failed\n");
167         of_node_put(np);
168 }
169
170 static void __init of_unittest_dynamic(void)
171 {
172         struct device_node *np;
173         struct property *prop;
174
175         np = of_find_node_by_path("/testcase-data");
176         if (!np) {
177                 pr_err("missing testcase data\n");
178                 return;
179         }
180
181         /* Array of 4 properties for the purpose of testing */
182         prop = kcalloc(4, sizeof(*prop), GFP_KERNEL);
183         if (!prop) {
184                 unittest(0, "kzalloc() failed\n");
185                 return;
186         }
187
188         /* Add a new property - should pass*/
189         prop->name = "new-property";
190         prop->value = "new-property-data";
191         prop->length = strlen(prop->value) + 1;
192         unittest(of_add_property(np, prop) == 0, "Adding a new property failed\n");
193
194         /* Try to add an existing property - should fail */
195         prop++;
196         prop->name = "new-property";
197         prop->value = "new-property-data-should-fail";
198         prop->length = strlen(prop->value) + 1;
199         unittest(of_add_property(np, prop) != 0,
200                  "Adding an existing property should have failed\n");
201
202         /* Try to modify an existing property - should pass */
203         prop->value = "modify-property-data-should-pass";
204         prop->length = strlen(prop->value) + 1;
205         unittest(of_update_property(np, prop) == 0,
206                  "Updating an existing property should have passed\n");
207
208         /* Try to modify non-existent property - should pass*/
209         prop++;
210         prop->name = "modify-property";
211         prop->value = "modify-missing-property-data-should-pass";
212         prop->length = strlen(prop->value) + 1;
213         unittest(of_update_property(np, prop) == 0,
214                  "Updating a missing property should have passed\n");
215
216         /* Remove property - should pass */
217         unittest(of_remove_property(np, prop) == 0,
218                  "Removing a property should have passed\n");
219
220         /* Adding very large property - should pass */
221         prop++;
222         prop->name = "large-property-PAGE_SIZEx8";
223         prop->length = PAGE_SIZE * 8;
224         prop->value = kzalloc(prop->length, GFP_KERNEL);
225         unittest(prop->value != NULL, "Unable to allocate large buffer\n");
226         if (prop->value)
227                 unittest(of_add_property(np, prop) == 0,
228                          "Adding a large property should have passed\n");
229 }
230
231 static int __init of_unittest_check_node_linkage(struct device_node *np)
232 {
233         struct device_node *child;
234         int count = 0, rc;
235
236         for_each_child_of_node(np, child) {
237                 if (child->parent != np) {
238                         pr_err("Child node %pOFn links to wrong parent %pOFn\n",
239                                  child, np);
240                         rc = -EINVAL;
241                         goto put_child;
242                 }
243
244                 rc = of_unittest_check_node_linkage(child);
245                 if (rc < 0)
246                         goto put_child;
247                 count += rc;
248         }
249
250         return count + 1;
251 put_child:
252         of_node_put(child);
253         return rc;
254 }
255
256 static void __init of_unittest_check_tree_linkage(void)
257 {
258         struct device_node *np;
259         int allnode_count = 0, child_count;
260
261         if (!of_root)
262                 return;
263
264         for_each_of_allnodes(np)
265                 allnode_count++;
266         child_count = of_unittest_check_node_linkage(of_root);
267
268         unittest(child_count > 0, "Device node data structure is corrupted\n");
269         unittest(child_count == allnode_count,
270                  "allnodes list size (%i) doesn't match sibling lists size (%i)\n",
271                  allnode_count, child_count);
272         pr_debug("allnodes list size (%i); sibling lists size (%i)\n", allnode_count, child_count);
273 }
274
275 static void __init of_unittest_printf_one(struct device_node *np, const char *fmt,
276                                           const char *expected)
277 {
278         unsigned char *buf;
279         int buf_size;
280         int size, i;
281
282         buf_size = strlen(expected) + 10;
283         buf = kmalloc(buf_size, GFP_KERNEL);
284         if (!buf)
285                 return;
286
287         /* Baseline; check conversion with a large size limit */
288         memset(buf, 0xff, buf_size);
289         size = snprintf(buf, buf_size - 2, fmt, np);
290
291         /* use strcmp() instead of strncmp() here to be absolutely sure strings match */
292         unittest((strcmp(buf, expected) == 0) && (buf[size+1] == 0xff),
293                 "sprintf failed; fmt='%s' expected='%s' rslt='%s'\n",
294                 fmt, expected, buf);
295
296         /* Make sure length limits work */
297         size++;
298         for (i = 0; i < 2; i++, size--) {
299                 /* Clear the buffer, and make sure it works correctly still */
300                 memset(buf, 0xff, buf_size);
301                 snprintf(buf, size+1, fmt, np);
302                 unittest(strncmp(buf, expected, size) == 0 && (buf[size+1] == 0xff),
303                         "snprintf failed; size=%i fmt='%s' expected='%s' rslt='%s'\n",
304                         size, fmt, expected, buf);
305         }
306         kfree(buf);
307 }
308
309 static void __init of_unittest_printf(void)
310 {
311         struct device_node *np;
312         const char *full_name = "/testcase-data/platform-tests/test-device@1/dev@100";
313         char phandle_str[16] = "";
314
315         np = of_find_node_by_path(full_name);
316         if (!np) {
317                 unittest(np, "testcase data missing\n");
318                 return;
319         }
320
321         num_to_str(phandle_str, sizeof(phandle_str), np->phandle, 0);
322
323         of_unittest_printf_one(np, "%pOF",  full_name);
324         of_unittest_printf_one(np, "%pOFf", full_name);
325         of_unittest_printf_one(np, "%pOFn", "dev");
326         of_unittest_printf_one(np, "%2pOFn", "dev");
327         of_unittest_printf_one(np, "%5pOFn", "  dev");
328         of_unittest_printf_one(np, "%pOFnc", "dev:test-sub-device");
329         of_unittest_printf_one(np, "%pOFp", phandle_str);
330         of_unittest_printf_one(np, "%pOFP", "dev@100");
331         of_unittest_printf_one(np, "ABC %pOFP ABC", "ABC dev@100 ABC");
332         of_unittest_printf_one(np, "%10pOFP", "   dev@100");
333         of_unittest_printf_one(np, "%-10pOFP", "dev@100   ");
334         of_unittest_printf_one(of_root, "%pOFP", "/");
335         of_unittest_printf_one(np, "%pOFF", "----");
336         of_unittest_printf_one(np, "%pOFPF", "dev@100:----");
337         of_unittest_printf_one(np, "%pOFPFPc", "dev@100:----:dev@100:test-sub-device");
338         of_unittest_printf_one(np, "%pOFc", "test-sub-device");
339         of_unittest_printf_one(np, "%pOFC",
340                         "\"test-sub-device\",\"test-compat2\",\"test-compat3\"");
341 }
342
343 struct node_hash {
344         struct hlist_node node;
345         struct device_node *np;
346 };
347
348 static DEFINE_HASHTABLE(phandle_ht, 8);
349 static void __init of_unittest_check_phandles(void)
350 {
351         struct device_node *np;
352         struct node_hash *nh;
353         struct hlist_node *tmp;
354         int i, dup_count = 0, phandle_count = 0;
355
356         for_each_of_allnodes(np) {
357                 if (!np->phandle)
358                         continue;
359
360                 hash_for_each_possible(phandle_ht, nh, node, np->phandle) {
361                         if (nh->np->phandle == np->phandle) {
362                                 pr_info("Duplicate phandle! %i used by %pOF and %pOF\n",
363                                         np->phandle, nh->np, np);
364                                 dup_count++;
365                                 break;
366                         }
367                 }
368
369                 nh = kzalloc(sizeof(*nh), GFP_KERNEL);
370                 if (!nh)
371                         return;
372
373                 nh->np = np;
374                 hash_add(phandle_ht, &nh->node, np->phandle);
375                 phandle_count++;
376         }
377         unittest(dup_count == 0, "Found %i duplicates in %i phandles\n",
378                  dup_count, phandle_count);
379
380         /* Clean up */
381         hash_for_each_safe(phandle_ht, i, tmp, nh, node) {
382                 hash_del(&nh->node);
383                 kfree(nh);
384         }
385 }
386
387 static void __init of_unittest_parse_phandle_with_args(void)
388 {
389         struct device_node *np;
390         struct of_phandle_args args;
391         int i, rc;
392
393         np = of_find_node_by_path("/testcase-data/phandle-tests/consumer-a");
394         if (!np) {
395                 pr_err("missing testcase data\n");
396                 return;
397         }
398
399         rc = of_count_phandle_with_args(np, "phandle-list", "#phandle-cells");
400         unittest(rc == 7, "of_count_phandle_with_args() returned %i, expected 7\n", rc);
401
402         for (i = 0; i < 8; i++) {
403                 bool passed = true;
404
405                 memset(&args, 0, sizeof(args));
406                 rc = of_parse_phandle_with_args(np, "phandle-list",
407                                                 "#phandle-cells", i, &args);
408
409                 /* Test the values from tests-phandle.dtsi */
410                 switch (i) {
411                 case 0:
412                         passed &= !rc;
413                         passed &= (args.args_count == 1);
414                         passed &= (args.args[0] == (i + 1));
415                         break;
416                 case 1:
417                         passed &= !rc;
418                         passed &= (args.args_count == 2);
419                         passed &= (args.args[0] == (i + 1));
420                         passed &= (args.args[1] == 0);
421                         break;
422                 case 2:
423                         passed &= (rc == -ENOENT);
424                         break;
425                 case 3:
426                         passed &= !rc;
427                         passed &= (args.args_count == 3);
428                         passed &= (args.args[0] == (i + 1));
429                         passed &= (args.args[1] == 4);
430                         passed &= (args.args[2] == 3);
431                         break;
432                 case 4:
433                         passed &= !rc;
434                         passed &= (args.args_count == 2);
435                         passed &= (args.args[0] == (i + 1));
436                         passed &= (args.args[1] == 100);
437                         break;
438                 case 5:
439                         passed &= !rc;
440                         passed &= (args.args_count == 0);
441                         break;
442                 case 6:
443                         passed &= !rc;
444                         passed &= (args.args_count == 1);
445                         passed &= (args.args[0] == (i + 1));
446                         break;
447                 case 7:
448                         passed &= (rc == -ENOENT);
449                         break;
450                 default:
451                         passed = false;
452                 }
453
454                 unittest(passed, "index %i - data error on node %pOF rc=%i\n",
455                          i, args.np, rc);
456
457                 if (rc == 0)
458                         of_node_put(args.np);
459         }
460
461         /* Check for missing list property */
462         memset(&args, 0, sizeof(args));
463         rc = of_parse_phandle_with_args(np, "phandle-list-missing",
464                                         "#phandle-cells", 0, &args);
465         unittest(rc == -ENOENT, "expected:%i got:%i\n", -ENOENT, rc);
466         rc = of_count_phandle_with_args(np, "phandle-list-missing",
467                                         "#phandle-cells");
468         unittest(rc == -ENOENT, "expected:%i got:%i\n", -ENOENT, rc);
469
470         /* Check for missing cells property */
471         memset(&args, 0, sizeof(args));
472
473         EXPECT_BEGIN(KERN_INFO,
474                      "OF: /testcase-data/phandle-tests/consumer-a: could not get #phandle-cells-missing for /testcase-data/phandle-tests/provider1");
475
476         rc = of_parse_phandle_with_args(np, "phandle-list",
477                                         "#phandle-cells-missing", 0, &args);
478
479         EXPECT_END(KERN_INFO,
480                    "OF: /testcase-data/phandle-tests/consumer-a: could not get #phandle-cells-missing for /testcase-data/phandle-tests/provider1");
481
482         unittest(rc == -EINVAL, "expected:%i got:%i\n", -EINVAL, rc);
483
484         EXPECT_BEGIN(KERN_INFO,
485                      "OF: /testcase-data/phandle-tests/consumer-a: could not get #phandle-cells-missing for /testcase-data/phandle-tests/provider1");
486
487         rc = of_count_phandle_with_args(np, "phandle-list",
488                                         "#phandle-cells-missing");
489
490         EXPECT_END(KERN_INFO,
491                    "OF: /testcase-data/phandle-tests/consumer-a: could not get #phandle-cells-missing for /testcase-data/phandle-tests/provider1");
492
493         unittest(rc == -EINVAL, "expected:%i got:%i\n", -EINVAL, rc);
494
495         /* Check for bad phandle in list */
496         memset(&args, 0, sizeof(args));
497
498         EXPECT_BEGIN(KERN_INFO,
499                      "OF: /testcase-data/phandle-tests/consumer-a: could not find phandle");
500
501         rc = of_parse_phandle_with_args(np, "phandle-list-bad-phandle",
502                                         "#phandle-cells", 0, &args);
503
504         EXPECT_END(KERN_INFO,
505                    "OF: /testcase-data/phandle-tests/consumer-a: could not find phandle");
506
507         unittest(rc == -EINVAL, "expected:%i got:%i\n", -EINVAL, rc);
508
509         EXPECT_BEGIN(KERN_INFO,
510                      "OF: /testcase-data/phandle-tests/consumer-a: could not find phandle");
511
512         rc = of_count_phandle_with_args(np, "phandle-list-bad-phandle",
513                                         "#phandle-cells");
514
515         EXPECT_END(KERN_INFO,
516                    "OF: /testcase-data/phandle-tests/consumer-a: could not find phandle");
517
518         unittest(rc == -EINVAL, "expected:%i got:%i\n", -EINVAL, rc);
519
520         /* Check for incorrectly formed argument list */
521         memset(&args, 0, sizeof(args));
522
523         EXPECT_BEGIN(KERN_INFO,
524                      "OF: /testcase-data/phandle-tests/consumer-a: #phandle-cells = 3 found -1");
525
526         rc = of_parse_phandle_with_args(np, "phandle-list-bad-args",
527                                         "#phandle-cells", 1, &args);
528
529         EXPECT_END(KERN_INFO,
530                    "OF: /testcase-data/phandle-tests/consumer-a: #phandle-cells = 3 found -1");
531
532         unittest(rc == -EINVAL, "expected:%i got:%i\n", -EINVAL, rc);
533
534         EXPECT_BEGIN(KERN_INFO,
535                      "OF: /testcase-data/phandle-tests/consumer-a: #phandle-cells = 3 found -1");
536
537         rc = of_count_phandle_with_args(np, "phandle-list-bad-args",
538                                         "#phandle-cells");
539
540         EXPECT_END(KERN_INFO,
541                    "OF: /testcase-data/phandle-tests/consumer-a: #phandle-cells = 3 found -1");
542
543         unittest(rc == -EINVAL, "expected:%i got:%i\n", -EINVAL, rc);
544 }
545
546 static void __init of_unittest_parse_phandle_with_args_map(void)
547 {
548         struct device_node *np, *p[6] = {};
549         struct of_phandle_args args;
550         unsigned int prefs[6];
551         int i, rc;
552
553         np = of_find_node_by_path("/testcase-data/phandle-tests/consumer-b");
554         if (!np) {
555                 pr_err("missing testcase data\n");
556                 return;
557         }
558
559         p[0] = of_find_node_by_path("/testcase-data/phandle-tests/provider0");
560         p[1] = of_find_node_by_path("/testcase-data/phandle-tests/provider1");
561         p[2] = of_find_node_by_path("/testcase-data/phandle-tests/provider2");
562         p[3] = of_find_node_by_path("/testcase-data/phandle-tests/provider3");
563         p[4] = of_find_node_by_path("/testcase-data/phandle-tests/provider4");
564         p[5] = of_find_node_by_path("/testcase-data/phandle-tests/provider5");
565         for (i = 0; i < ARRAY_SIZE(p); ++i) {
566                 if (!p[i]) {
567                         pr_err("missing testcase data\n");
568                         return;
569                 }
570                 prefs[i] = OF_KREF_READ(p[i]);
571         }
572
573         rc = of_count_phandle_with_args(np, "phandle-list", "#phandle-cells");
574         unittest(rc == 8, "of_count_phandle_with_args() returned %i, expected 8\n", rc);
575
576         for (i = 0; i < 9; i++) {
577                 bool passed = true;
578
579                 memset(&args, 0, sizeof(args));
580                 rc = of_parse_phandle_with_args_map(np, "phandle-list",
581                                                     "phandle", i, &args);
582
583                 /* Test the values from tests-phandle.dtsi */
584                 switch (i) {
585                 case 0:
586                         passed &= !rc;
587                         passed &= (args.np == p[1]);
588                         passed &= (args.args_count == 1);
589                         passed &= (args.args[0] == 1);
590                         break;
591                 case 1:
592                         passed &= !rc;
593                         passed &= (args.np == p[3]);
594                         passed &= (args.args_count == 3);
595                         passed &= (args.args[0] == 2);
596                         passed &= (args.args[1] == 5);
597                         passed &= (args.args[2] == 3);
598                         break;
599                 case 2:
600                         passed &= (rc == -ENOENT);
601                         break;
602                 case 3:
603                         passed &= !rc;
604                         passed &= (args.np == p[0]);
605                         passed &= (args.args_count == 0);
606                         break;
607                 case 4:
608                         passed &= !rc;
609                         passed &= (args.np == p[1]);
610                         passed &= (args.args_count == 1);
611                         passed &= (args.args[0] == 3);
612                         break;
613                 case 5:
614                         passed &= !rc;
615                         passed &= (args.np == p[0]);
616                         passed &= (args.args_count == 0);
617                         break;
618                 case 6:
619                         passed &= !rc;
620                         passed &= (args.np == p[2]);
621                         passed &= (args.args_count == 2);
622                         passed &= (args.args[0] == 15);
623                         passed &= (args.args[1] == 0x20);
624                         break;
625                 case 7:
626                         passed &= !rc;
627                         passed &= (args.np == p[3]);
628                         passed &= (args.args_count == 3);
629                         passed &= (args.args[0] == 2);
630                         passed &= (args.args[1] == 5);
631                         passed &= (args.args[2] == 3);
632                         break;
633                 case 8:
634                         passed &= (rc == -ENOENT);
635                         break;
636                 default:
637                         passed = false;
638                 }
639
640                 unittest(passed, "index %i - data error on node %s rc=%i\n",
641                          i, args.np->full_name, rc);
642
643                 if (rc == 0)
644                         of_node_put(args.np);
645         }
646
647         /* Check for missing list property */
648         memset(&args, 0, sizeof(args));
649         rc = of_parse_phandle_with_args_map(np, "phandle-list-missing",
650                                             "phandle", 0, &args);
651         unittest(rc == -ENOENT, "expected:%i got:%i\n", -ENOENT, rc);
652
653         /* Check for missing cells,map,mask property */
654         memset(&args, 0, sizeof(args));
655
656         EXPECT_BEGIN(KERN_INFO,
657                      "OF: /testcase-data/phandle-tests/consumer-b: could not get #phandle-missing-cells for /testcase-data/phandle-tests/provider1");
658
659         rc = of_parse_phandle_with_args_map(np, "phandle-list",
660                                             "phandle-missing", 0, &args);
661         EXPECT_END(KERN_INFO,
662                    "OF: /testcase-data/phandle-tests/consumer-b: could not get #phandle-missing-cells for /testcase-data/phandle-tests/provider1");
663
664         unittest(rc == -EINVAL, "expected:%i got:%i\n", -EINVAL, rc);
665
666         /* Check for bad phandle in list */
667         memset(&args, 0, sizeof(args));
668
669         EXPECT_BEGIN(KERN_INFO,
670                      "OF: /testcase-data/phandle-tests/consumer-b: could not find phandle");
671
672         rc = of_parse_phandle_with_args_map(np, "phandle-list-bad-phandle",
673                                             "phandle", 0, &args);
674         EXPECT_END(KERN_INFO,
675                    "OF: /testcase-data/phandle-tests/consumer-b: could not find phandle");
676
677         unittest(rc == -EINVAL, "expected:%i got:%i\n", -EINVAL, rc);
678
679         /* Check for incorrectly formed argument list */
680         memset(&args, 0, sizeof(args));
681
682         EXPECT_BEGIN(KERN_INFO,
683                      "OF: /testcase-data/phandle-tests/consumer-b: #phandle-cells = 2 found -1");
684
685         rc = of_parse_phandle_with_args_map(np, "phandle-list-bad-args",
686                                             "phandle", 1, &args);
687         EXPECT_END(KERN_INFO,
688                    "OF: /testcase-data/phandle-tests/consumer-b: #phandle-cells = 2 found -1");
689
690         unittest(rc == -EINVAL, "expected:%i got:%i\n", -EINVAL, rc);
691
692         for (i = 0; i < ARRAY_SIZE(p); ++i) {
693                 unittest(prefs[i] == OF_KREF_READ(p[i]),
694                          "provider%d: expected:%d got:%d\n",
695                          i, prefs[i], OF_KREF_READ(p[i]));
696                 of_node_put(p[i]);
697         }
698 }
699
700 static void __init of_unittest_property_string(void)
701 {
702         const char *strings[4];
703         struct device_node *np;
704         int rc;
705
706         np = of_find_node_by_path("/testcase-data/phandle-tests/consumer-a");
707         if (!np) {
708                 pr_err("No testcase data in device tree\n");
709                 return;
710         }
711
712         rc = of_property_match_string(np, "phandle-list-names", "first");
713         unittest(rc == 0, "first expected:0 got:%i\n", rc);
714         rc = of_property_match_string(np, "phandle-list-names", "second");
715         unittest(rc == 1, "second expected:1 got:%i\n", rc);
716         rc = of_property_match_string(np, "phandle-list-names", "third");
717         unittest(rc == 2, "third expected:2 got:%i\n", rc);
718         rc = of_property_match_string(np, "phandle-list-names", "fourth");
719         unittest(rc == -ENODATA, "unmatched string; rc=%i\n", rc);
720         rc = of_property_match_string(np, "missing-property", "blah");
721         unittest(rc == -EINVAL, "missing property; rc=%i\n", rc);
722         rc = of_property_match_string(np, "empty-property", "blah");
723         unittest(rc == -ENODATA, "empty property; rc=%i\n", rc);
724         rc = of_property_match_string(np, "unterminated-string", "blah");
725         unittest(rc == -EILSEQ, "unterminated string; rc=%i\n", rc);
726
727         /* of_property_count_strings() tests */
728         rc = of_property_count_strings(np, "string-property");
729         unittest(rc == 1, "Incorrect string count; rc=%i\n", rc);
730         rc = of_property_count_strings(np, "phandle-list-names");
731         unittest(rc == 3, "Incorrect string count; rc=%i\n", rc);
732         rc = of_property_count_strings(np, "unterminated-string");
733         unittest(rc == -EILSEQ, "unterminated string; rc=%i\n", rc);
734         rc = of_property_count_strings(np, "unterminated-string-list");
735         unittest(rc == -EILSEQ, "unterminated string array; rc=%i\n", rc);
736
737         /* of_property_read_string_index() tests */
738         rc = of_property_read_string_index(np, "string-property", 0, strings);
739         unittest(rc == 0 && !strcmp(strings[0], "foobar"), "of_property_read_string_index() failure; rc=%i\n", rc);
740         strings[0] = NULL;
741         rc = of_property_read_string_index(np, "string-property", 1, strings);
742         unittest(rc == -ENODATA && strings[0] == NULL, "of_property_read_string_index() failure; rc=%i\n", rc);
743         rc = of_property_read_string_index(np, "phandle-list-names", 0, strings);
744         unittest(rc == 0 && !strcmp(strings[0], "first"), "of_property_read_string_index() failure; rc=%i\n", rc);
745         rc = of_property_read_string_index(np, "phandle-list-names", 1, strings);
746         unittest(rc == 0 && !strcmp(strings[0], "second"), "of_property_read_string_index() failure; rc=%i\n", rc);
747         rc = of_property_read_string_index(np, "phandle-list-names", 2, strings);
748         unittest(rc == 0 && !strcmp(strings[0], "third"), "of_property_read_string_index() failure; rc=%i\n", rc);
749         strings[0] = NULL;
750         rc = of_property_read_string_index(np, "phandle-list-names", 3, strings);
751         unittest(rc == -ENODATA && strings[0] == NULL, "of_property_read_string_index() failure; rc=%i\n", rc);
752         strings[0] = NULL;
753         rc = of_property_read_string_index(np, "unterminated-string", 0, strings);
754         unittest(rc == -EILSEQ && strings[0] == NULL, "of_property_read_string_index() failure; rc=%i\n", rc);
755         rc = of_property_read_string_index(np, "unterminated-string-list", 0, strings);
756         unittest(rc == 0 && !strcmp(strings[0], "first"), "of_property_read_string_index() failure; rc=%i\n", rc);
757         strings[0] = NULL;
758         rc = of_property_read_string_index(np, "unterminated-string-list", 2, strings); /* should fail */
759         unittest(rc == -EILSEQ && strings[0] == NULL, "of_property_read_string_index() failure; rc=%i\n", rc);
760         strings[1] = NULL;
761
762         /* of_property_read_string_array() tests */
763         rc = of_property_read_string_array(np, "string-property", strings, 4);
764         unittest(rc == 1, "Incorrect string count; rc=%i\n", rc);
765         rc = of_property_read_string_array(np, "phandle-list-names", strings, 4);
766         unittest(rc == 3, "Incorrect string count; rc=%i\n", rc);
767         rc = of_property_read_string_array(np, "unterminated-string", strings, 4);
768         unittest(rc == -EILSEQ, "unterminated string; rc=%i\n", rc);
769         /* -- An incorrectly formed string should cause a failure */
770         rc = of_property_read_string_array(np, "unterminated-string-list", strings, 4);
771         unittest(rc == -EILSEQ, "unterminated string array; rc=%i\n", rc);
772         /* -- parsing the correctly formed strings should still work: */
773         strings[2] = NULL;
774         rc = of_property_read_string_array(np, "unterminated-string-list", strings, 2);
775         unittest(rc == 2 && strings[2] == NULL, "of_property_read_string_array() failure; rc=%i\n", rc);
776         strings[1] = NULL;
777         rc = of_property_read_string_array(np, "phandle-list-names", strings, 1);
778         unittest(rc == 1 && strings[1] == NULL, "Overwrote end of string array; rc=%i, str='%s'\n", rc, strings[1]);
779 }
780
781 #define propcmp(p1, p2) (((p1)->length == (p2)->length) && \
782                         (p1)->value && (p2)->value && \
783                         !memcmp((p1)->value, (p2)->value, (p1)->length) && \
784                         !strcmp((p1)->name, (p2)->name))
785 static void __init of_unittest_property_copy(void)
786 {
787 #ifdef CONFIG_OF_DYNAMIC
788         struct property p1 = { .name = "p1", .length = 0, .value = "" };
789         struct property p2 = { .name = "p2", .length = 5, .value = "abcd" };
790         struct property *new;
791
792         new = __of_prop_dup(&p1, GFP_KERNEL);
793         unittest(new && propcmp(&p1, new), "empty property didn't copy correctly\n");
794         kfree(new->value);
795         kfree(new->name);
796         kfree(new);
797
798         new = __of_prop_dup(&p2, GFP_KERNEL);
799         unittest(new && propcmp(&p2, new), "non-empty property didn't copy correctly\n");
800         kfree(new->value);
801         kfree(new->name);
802         kfree(new);
803 #endif
804 }
805
806 static void __init of_unittest_changeset(void)
807 {
808 #ifdef CONFIG_OF_DYNAMIC
809         struct property *ppadd, padd = { .name = "prop-add", .length = 1, .value = "" };
810         struct property *ppname_n1,  pname_n1  = { .name = "name", .length = 3, .value = "n1"  };
811         struct property *ppname_n2,  pname_n2  = { .name = "name", .length = 3, .value = "n2"  };
812         struct property *ppname_n21, pname_n21 = { .name = "name", .length = 3, .value = "n21" };
813         struct property *ppupdate, pupdate = { .name = "prop-update", .length = 5, .value = "abcd" };
814         struct property *ppremove;
815         struct device_node *n1, *n2, *n21, *nchangeset, *nremove, *parent, *np;
816         struct of_changeset chgset;
817
818         n1 = __of_node_dup(NULL, "n1");
819         unittest(n1, "testcase setup failure\n");
820
821         n2 = __of_node_dup(NULL, "n2");
822         unittest(n2, "testcase setup failure\n");
823
824         n21 = __of_node_dup(NULL, "n21");
825         unittest(n21, "testcase setup failure %p\n", n21);
826
827         nchangeset = of_find_node_by_path("/testcase-data/changeset");
828         nremove = of_get_child_by_name(nchangeset, "node-remove");
829         unittest(nremove, "testcase setup failure\n");
830
831         ppadd = __of_prop_dup(&padd, GFP_KERNEL);
832         unittest(ppadd, "testcase setup failure\n");
833
834         ppname_n1  = __of_prop_dup(&pname_n1, GFP_KERNEL);
835         unittest(ppname_n1, "testcase setup failure\n");
836
837         ppname_n2  = __of_prop_dup(&pname_n2, GFP_KERNEL);
838         unittest(ppname_n2, "testcase setup failure\n");
839
840         ppname_n21 = __of_prop_dup(&pname_n21, GFP_KERNEL);
841         unittest(ppname_n21, "testcase setup failure\n");
842
843         ppupdate = __of_prop_dup(&pupdate, GFP_KERNEL);
844         unittest(ppupdate, "testcase setup failure\n");
845
846         parent = nchangeset;
847         n1->parent = parent;
848         n2->parent = parent;
849         n21->parent = n2;
850
851         ppremove = of_find_property(parent, "prop-remove", NULL);
852         unittest(ppremove, "failed to find removal prop");
853
854         of_changeset_init(&chgset);
855
856         unittest(!of_changeset_attach_node(&chgset, n1), "fail attach n1\n");
857         unittest(!of_changeset_add_property(&chgset, n1, ppname_n1), "fail add prop name\n");
858
859         unittest(!of_changeset_attach_node(&chgset, n2), "fail attach n2\n");
860         unittest(!of_changeset_add_property(&chgset, n2, ppname_n2), "fail add prop name\n");
861
862         unittest(!of_changeset_detach_node(&chgset, nremove), "fail remove node\n");
863         unittest(!of_changeset_add_property(&chgset, n21, ppname_n21), "fail add prop name\n");
864
865         unittest(!of_changeset_attach_node(&chgset, n21), "fail attach n21\n");
866
867         unittest(!of_changeset_add_property(&chgset, parent, ppadd), "fail add prop prop-add\n");
868         unittest(!of_changeset_update_property(&chgset, parent, ppupdate), "fail update prop\n");
869         unittest(!of_changeset_remove_property(&chgset, parent, ppremove), "fail remove prop\n");
870
871         unittest(!of_changeset_apply(&chgset), "apply failed\n");
872
873         of_node_put(nchangeset);
874
875         /* Make sure node names are constructed correctly */
876         unittest((np = of_find_node_by_path("/testcase-data/changeset/n2/n21")),
877                  "'%pOF' not added\n", n21);
878         of_node_put(np);
879
880         unittest(!of_changeset_revert(&chgset), "revert failed\n");
881
882         of_changeset_destroy(&chgset);
883
884         of_node_put(n1);
885         of_node_put(n2);
886         of_node_put(n21);
887 #endif
888 }
889
890 static void __init of_unittest_dma_get_max_cpu_address(void)
891 {
892         struct device_node *np;
893         phys_addr_t cpu_addr;
894
895         if (!IS_ENABLED(CONFIG_OF_ADDRESS))
896                 return;
897
898         np = of_find_node_by_path("/testcase-data/address-tests");
899         if (!np) {
900                 pr_err("missing testcase data\n");
901                 return;
902         }
903
904         cpu_addr = of_dma_get_max_cpu_address(np);
905         unittest(cpu_addr == 0x4fffffff,
906                  "of_dma_get_max_cpu_address: wrong CPU addr %pad (expecting %x)\n",
907                  &cpu_addr, 0x4fffffff);
908 }
909
910 static void __init of_unittest_dma_ranges_one(const char *path,
911                 u64 expect_dma_addr, u64 expect_paddr)
912 {
913 #ifdef CONFIG_HAS_DMA
914         struct device_node *np;
915         const struct bus_dma_region *map = NULL;
916         int rc;
917
918         np = of_find_node_by_path(path);
919         if (!np) {
920                 pr_err("missing testcase data\n");
921                 return;
922         }
923
924         rc = of_dma_get_range(np, &map);
925
926         unittest(!rc, "of_dma_get_range failed on node %pOF rc=%i\n", np, rc);
927
928         if (!rc) {
929                 phys_addr_t     paddr;
930                 dma_addr_t      dma_addr;
931                 struct device   *dev_bogus;
932
933                 dev_bogus = kzalloc(sizeof(struct device), GFP_KERNEL);
934                 if (!dev_bogus) {
935                         unittest(0, "kzalloc() failed\n");
936                         kfree(map);
937                         return;
938                 }
939
940                 dev_bogus->dma_range_map = map;
941                 paddr = dma_to_phys(dev_bogus, expect_dma_addr);
942                 dma_addr = phys_to_dma(dev_bogus, expect_paddr);
943
944                 unittest(paddr == expect_paddr,
945                          "of_dma_get_range: wrong phys addr %pap (expecting %llx) on node %pOF\n",
946                          &paddr, expect_paddr, np);
947                 unittest(dma_addr == expect_dma_addr,
948                          "of_dma_get_range: wrong DMA addr %pad (expecting %llx) on node %pOF\n",
949                          &dma_addr, expect_dma_addr, np);
950
951                 kfree(map);
952                 kfree(dev_bogus);
953         }
954         of_node_put(np);
955 #endif
956 }
957
958 static void __init of_unittest_parse_dma_ranges(void)
959 {
960         of_unittest_dma_ranges_one("/testcase-data/address-tests/device@70000000",
961                 0x0, 0x20000000);
962         if (IS_ENABLED(CONFIG_ARCH_DMA_ADDR_T_64BIT))
963                 of_unittest_dma_ranges_one("/testcase-data/address-tests/bus@80000000/device@1000",
964                         0x100000000, 0x20000000);
965         of_unittest_dma_ranges_one("/testcase-data/address-tests/pci@90000000",
966                 0x80000000, 0x20000000);
967 }
968
969 static void __init of_unittest_pci_dma_ranges(void)
970 {
971         struct device_node *np;
972         struct of_pci_range range;
973         struct of_pci_range_parser parser;
974         int i = 0;
975
976         if (!IS_ENABLED(CONFIG_PCI))
977                 return;
978
979         np = of_find_node_by_path("/testcase-data/address-tests/pci@90000000");
980         if (!np) {
981                 pr_err("missing testcase data\n");
982                 return;
983         }
984
985         if (of_pci_dma_range_parser_init(&parser, np)) {
986                 pr_err("missing dma-ranges property\n");
987                 return;
988         }
989
990         /*
991          * Get the dma-ranges from the device tree
992          */
993         for_each_of_pci_range(&parser, &range) {
994                 if (!i) {
995                         unittest(range.size == 0x10000000,
996                                  "for_each_of_pci_range wrong size on node %pOF size=%llx\n",
997                                  np, range.size);
998                         unittest(range.cpu_addr == 0x20000000,
999                                  "for_each_of_pci_range wrong CPU addr (%llx) on node %pOF",
1000                                  range.cpu_addr, np);
1001                         unittest(range.pci_addr == 0x80000000,
1002                                  "for_each_of_pci_range wrong DMA addr (%llx) on node %pOF",
1003                                  range.pci_addr, np);
1004                 } else {
1005                         unittest(range.size == 0x10000000,
1006                                  "for_each_of_pci_range wrong size on node %pOF size=%llx\n",
1007                                  np, range.size);
1008                         unittest(range.cpu_addr == 0x40000000,
1009                                  "for_each_of_pci_range wrong CPU addr (%llx) on node %pOF",
1010                                  range.cpu_addr, np);
1011                         unittest(range.pci_addr == 0xc0000000,
1012                                  "for_each_of_pci_range wrong DMA addr (%llx) on node %pOF",
1013                                  range.pci_addr, np);
1014                 }
1015                 i++;
1016         }
1017
1018         of_node_put(np);
1019 }
1020
1021 static void __init of_unittest_parse_interrupts(void)
1022 {
1023         struct device_node *np;
1024         struct of_phandle_args args;
1025         int i, rc;
1026
1027         if (of_irq_workarounds & OF_IMAP_OLDWORLD_MAC)
1028                 return;
1029
1030         np = of_find_node_by_path("/testcase-data/interrupts/interrupts0");
1031         if (!np) {
1032                 pr_err("missing testcase data\n");
1033                 return;
1034         }
1035
1036         for (i = 0; i < 4; i++) {
1037                 bool passed = true;
1038
1039                 memset(&args, 0, sizeof(args));
1040                 rc = of_irq_parse_one(np, i, &args);
1041
1042                 passed &= !rc;
1043                 passed &= (args.args_count == 1);
1044                 passed &= (args.args[0] == (i + 1));
1045
1046                 unittest(passed, "index %i - data error on node %pOF rc=%i\n",
1047                          i, args.np, rc);
1048         }
1049         of_node_put(np);
1050
1051         np = of_find_node_by_path("/testcase-data/interrupts/interrupts1");
1052         if (!np) {
1053                 pr_err("missing testcase data\n");
1054                 return;
1055         }
1056
1057         for (i = 0; i < 4; i++) {
1058                 bool passed = true;
1059
1060                 memset(&args, 0, sizeof(args));
1061                 rc = of_irq_parse_one(np, i, &args);
1062
1063                 /* Test the values from tests-phandle.dtsi */
1064                 switch (i) {
1065                 case 0:
1066                         passed &= !rc;
1067                         passed &= (args.args_count == 1);
1068                         passed &= (args.args[0] == 9);
1069                         break;
1070                 case 1:
1071                         passed &= !rc;
1072                         passed &= (args.args_count == 3);
1073                         passed &= (args.args[0] == 10);
1074                         passed &= (args.args[1] == 11);
1075                         passed &= (args.args[2] == 12);
1076                         break;
1077                 case 2:
1078                         passed &= !rc;
1079                         passed &= (args.args_count == 2);
1080                         passed &= (args.args[0] == 13);
1081                         passed &= (args.args[1] == 14);
1082                         break;
1083                 case 3:
1084                         passed &= !rc;
1085                         passed &= (args.args_count == 2);
1086                         passed &= (args.args[0] == 15);
1087                         passed &= (args.args[1] == 16);
1088                         break;
1089                 default:
1090                         passed = false;
1091                 }
1092                 unittest(passed, "index %i - data error on node %pOF rc=%i\n",
1093                          i, args.np, rc);
1094         }
1095         of_node_put(np);
1096 }
1097
1098 static void __init of_unittest_parse_interrupts_extended(void)
1099 {
1100         struct device_node *np;
1101         struct of_phandle_args args;
1102         int i, rc;
1103
1104         if (of_irq_workarounds & OF_IMAP_OLDWORLD_MAC)
1105                 return;
1106
1107         np = of_find_node_by_path("/testcase-data/interrupts/interrupts-extended0");
1108         if (!np) {
1109                 pr_err("missing testcase data\n");
1110                 return;
1111         }
1112
1113         for (i = 0; i < 7; i++) {
1114                 bool passed = true;
1115
1116                 memset(&args, 0, sizeof(args));
1117                 rc = of_irq_parse_one(np, i, &args);
1118
1119                 /* Test the values from tests-phandle.dtsi */
1120                 switch (i) {
1121                 case 0:
1122                         passed &= !rc;
1123                         passed &= (args.args_count == 1);
1124                         passed &= (args.args[0] == 1);
1125                         break;
1126                 case 1:
1127                         passed &= !rc;
1128                         passed &= (args.args_count == 3);
1129                         passed &= (args.args[0] == 2);
1130                         passed &= (args.args[1] == 3);
1131                         passed &= (args.args[2] == 4);
1132                         break;
1133                 case 2:
1134                         passed &= !rc;
1135                         passed &= (args.args_count == 2);
1136                         passed &= (args.args[0] == 5);
1137                         passed &= (args.args[1] == 6);
1138                         break;
1139                 case 3:
1140                         passed &= !rc;
1141                         passed &= (args.args_count == 1);
1142                         passed &= (args.args[0] == 9);
1143                         break;
1144                 case 4:
1145                         passed &= !rc;
1146                         passed &= (args.args_count == 3);
1147                         passed &= (args.args[0] == 10);
1148                         passed &= (args.args[1] == 11);
1149                         passed &= (args.args[2] == 12);
1150                         break;
1151                 case 5:
1152                         passed &= !rc;
1153                         passed &= (args.args_count == 2);
1154                         passed &= (args.args[0] == 13);
1155                         passed &= (args.args[1] == 14);
1156                         break;
1157                 case 6:
1158                         passed &= !rc;
1159                         passed &= (args.args_count == 1);
1160                         passed &= (args.args[0] == 15);
1161                         break;
1162                 default:
1163                         passed = false;
1164                 }
1165
1166                 unittest(passed, "index %i - data error on node %pOF rc=%i\n",
1167                          i, args.np, rc);
1168         }
1169         of_node_put(np);
1170 }
1171
1172 static const struct of_device_id match_node_table[] = {
1173         { .data = "A", .name = "name0", }, /* Name alone is lowest priority */
1174         { .data = "B", .type = "type1", }, /* followed by type alone */
1175
1176         { .data = "Ca", .name = "name2", .type = "type1", }, /* followed by both together */
1177         { .data = "Cb", .name = "name2", }, /* Only match when type doesn't match */
1178         { .data = "Cc", .name = "name2", .type = "type2", },
1179
1180         { .data = "E", .compatible = "compat3" },
1181         { .data = "G", .compatible = "compat2", },
1182         { .data = "H", .compatible = "compat2", .name = "name5", },
1183         { .data = "I", .compatible = "compat2", .type = "type1", },
1184         { .data = "J", .compatible = "compat2", .type = "type1", .name = "name8", },
1185         { .data = "K", .compatible = "compat2", .name = "name9", },
1186         {}
1187 };
1188
1189 static struct {
1190         const char *path;
1191         const char *data;
1192 } match_node_tests[] = {
1193         { .path = "/testcase-data/match-node/name0", .data = "A", },
1194         { .path = "/testcase-data/match-node/name1", .data = "B", },
1195         { .path = "/testcase-data/match-node/a/name2", .data = "Ca", },
1196         { .path = "/testcase-data/match-node/b/name2", .data = "Cb", },
1197         { .path = "/testcase-data/match-node/c/name2", .data = "Cc", },
1198         { .path = "/testcase-data/match-node/name3", .data = "E", },
1199         { .path = "/testcase-data/match-node/name4", .data = "G", },
1200         { .path = "/testcase-data/match-node/name5", .data = "H", },
1201         { .path = "/testcase-data/match-node/name6", .data = "G", },
1202         { .path = "/testcase-data/match-node/name7", .data = "I", },
1203         { .path = "/testcase-data/match-node/name8", .data = "J", },
1204         { .path = "/testcase-data/match-node/name9", .data = "K", },
1205 };
1206
1207 static void __init of_unittest_match_node(void)
1208 {
1209         struct device_node *np;
1210         const struct of_device_id *match;
1211         int i;
1212
1213         for (i = 0; i < ARRAY_SIZE(match_node_tests); i++) {
1214                 np = of_find_node_by_path(match_node_tests[i].path);
1215                 if (!np) {
1216                         unittest(0, "missing testcase node %s\n",
1217                                 match_node_tests[i].path);
1218                         continue;
1219                 }
1220
1221                 match = of_match_node(match_node_table, np);
1222                 if (!match) {
1223                         unittest(0, "%s didn't match anything\n",
1224                                 match_node_tests[i].path);
1225                         continue;
1226                 }
1227
1228                 if (strcmp(match->data, match_node_tests[i].data) != 0) {
1229                         unittest(0, "%s got wrong match. expected %s, got %s\n",
1230                                 match_node_tests[i].path, match_node_tests[i].data,
1231                                 (const char *)match->data);
1232                         continue;
1233                 }
1234                 unittest(1, "passed");
1235         }
1236 }
1237
1238 static struct resource test_bus_res = {
1239         .start = 0xfffffff8,
1240         .end = 0xfffffff9,
1241         .flags = IORESOURCE_MEM,
1242 };
1243 static const struct platform_device_info test_bus_info = {
1244         .name = "unittest-bus",
1245 };
1246 static void __init of_unittest_platform_populate(void)
1247 {
1248         int irq, rc;
1249         struct device_node *np, *child, *grandchild;
1250         struct platform_device *pdev, *test_bus;
1251         const struct of_device_id match[] = {
1252                 { .compatible = "test-device", },
1253                 {}
1254         };
1255
1256         np = of_find_node_by_path("/testcase-data");
1257         of_platform_default_populate(np, NULL, NULL);
1258
1259         /* Test that a missing irq domain returns -EPROBE_DEFER */
1260         np = of_find_node_by_path("/testcase-data/testcase-device1");
1261         pdev = of_find_device_by_node(np);
1262         unittest(pdev, "device 1 creation failed\n");
1263
1264         if (!(of_irq_workarounds & OF_IMAP_OLDWORLD_MAC)) {
1265                 irq = platform_get_irq(pdev, 0);
1266                 unittest(irq == -EPROBE_DEFER,
1267                          "device deferred probe failed - %d\n", irq);
1268
1269                 /* Test that a parsing failure does not return -EPROBE_DEFER */
1270                 np = of_find_node_by_path("/testcase-data/testcase-device2");
1271                 pdev = of_find_device_by_node(np);
1272                 unittest(pdev, "device 2 creation failed\n");
1273
1274                 EXPECT_BEGIN(KERN_INFO,
1275                              "platform testcase-data:testcase-device2: IRQ index 0 not found");
1276
1277                 irq = platform_get_irq(pdev, 0);
1278
1279                 EXPECT_END(KERN_INFO,
1280                            "platform testcase-data:testcase-device2: IRQ index 0 not found");
1281
1282                 unittest(irq < 0 && irq != -EPROBE_DEFER,
1283                          "device parsing error failed - %d\n", irq);
1284         }
1285
1286         np = of_find_node_by_path("/testcase-data/platform-tests");
1287         unittest(np, "No testcase data in device tree\n");
1288         if (!np)
1289                 return;
1290
1291         test_bus = platform_device_register_full(&test_bus_info);
1292         rc = PTR_ERR_OR_ZERO(test_bus);
1293         unittest(!rc, "testbus registration failed; rc=%i\n", rc);
1294         if (rc) {
1295                 of_node_put(np);
1296                 return;
1297         }
1298         test_bus->dev.of_node = np;
1299
1300         /*
1301          * Add a dummy resource to the test bus node after it is
1302          * registered to catch problems with un-inserted resources. The
1303          * DT code doesn't insert the resources, and it has caused the
1304          * kernel to oops in the past. This makes sure the same bug
1305          * doesn't crop up again.
1306          */
1307         platform_device_add_resources(test_bus, &test_bus_res, 1);
1308
1309         of_platform_populate(np, match, NULL, &test_bus->dev);
1310         for_each_child_of_node(np, child) {
1311                 for_each_child_of_node(child, grandchild) {
1312                         pdev = of_find_device_by_node(grandchild);
1313                         unittest(pdev,
1314                                  "Could not create device for node '%pOFn'\n",
1315                                  grandchild);
1316                         of_dev_put(pdev);
1317                 }
1318         }
1319
1320         of_platform_depopulate(&test_bus->dev);
1321         for_each_child_of_node(np, child) {
1322                 for_each_child_of_node(child, grandchild)
1323                         unittest(!of_find_device_by_node(grandchild),
1324                                  "device didn't get destroyed '%pOFn'\n",
1325                                  grandchild);
1326         }
1327
1328         platform_device_unregister(test_bus);
1329         of_node_put(np);
1330 }
1331
1332 /**
1333  *      update_node_properties - adds the properties
1334  *      of np into dup node (present in live tree) and
1335  *      updates parent of children of np to dup.
1336  *
1337  *      @np:    node whose properties are being added to the live tree
1338  *      @dup:   node present in live tree to be updated
1339  */
1340 static void update_node_properties(struct device_node *np,
1341                                         struct device_node *dup)
1342 {
1343         struct property *prop;
1344         struct property *save_next;
1345         struct device_node *child;
1346         int ret;
1347
1348         for_each_child_of_node(np, child)
1349                 child->parent = dup;
1350
1351         /*
1352          * "unittest internal error: unable to add testdata property"
1353          *
1354          *    If this message reports a property in node '/__symbols__' then
1355          *    the respective unittest overlay contains a label that has the
1356          *    same name as a label in the live devicetree.  The label will
1357          *    be in the live devicetree only if the devicetree source was
1358          *    compiled with the '-@' option.  If you encounter this error,
1359          *    please consider renaming __all__ of the labels in the unittest
1360          *    overlay dts files with an odd prefix that is unlikely to be
1361          *    used in a real devicetree.
1362          */
1363
1364         /*
1365          * open code for_each_property_of_node() because of_add_property()
1366          * sets prop->next to NULL
1367          */
1368         for (prop = np->properties; prop != NULL; prop = save_next) {
1369                 save_next = prop->next;
1370                 ret = of_add_property(dup, prop);
1371                 if (ret) {
1372                         if (ret == -EEXIST && !strcmp(prop->name, "name"))
1373                                 continue;
1374                         pr_err("unittest internal error: unable to add testdata property %pOF/%s",
1375                                np, prop->name);
1376                 }
1377         }
1378 }
1379
1380 /**
1381  *      attach_node_and_children - attaches nodes
1382  *      and its children to live tree.
1383  *      CAUTION: misleading function name - if node @np already exists in
1384  *      the live tree then children of @np are *not* attached to the live
1385  *      tree.  This works for the current test devicetree nodes because such
1386  *      nodes do not have child nodes.
1387  *
1388  *      @np:    Node to attach to live tree
1389  */
1390 static void attach_node_and_children(struct device_node *np)
1391 {
1392         struct device_node *next, *dup, *child;
1393         unsigned long flags;
1394         const char *full_name;
1395
1396         full_name = kasprintf(GFP_KERNEL, "%pOF", np);
1397         if (!full_name)
1398                 return;
1399
1400         if (!strcmp(full_name, "/__local_fixups__") ||
1401             !strcmp(full_name, "/__fixups__")) {
1402                 kfree(full_name);
1403                 return;
1404         }
1405
1406         dup = of_find_node_by_path(full_name);
1407         kfree(full_name);
1408         if (dup) {
1409                 update_node_properties(np, dup);
1410                 return;
1411         }
1412
1413         child = np->child;
1414         np->child = NULL;
1415
1416         mutex_lock(&of_mutex);
1417         raw_spin_lock_irqsave(&devtree_lock, flags);
1418         np->sibling = np->parent->child;
1419         np->parent->child = np;
1420         of_node_clear_flag(np, OF_DETACHED);
1421         raw_spin_unlock_irqrestore(&devtree_lock, flags);
1422
1423         __of_attach_node_sysfs(np);
1424         mutex_unlock(&of_mutex);
1425
1426         while (child) {
1427                 next = child->sibling;
1428                 attach_node_and_children(child);
1429                 child = next;
1430         }
1431 }
1432
1433 /**
1434  *      unittest_data_add - Reads, copies data from
1435  *      linked tree and attaches it to the live tree
1436  */
1437 static int __init unittest_data_add(void)
1438 {
1439         void *unittest_data;
1440         struct device_node *unittest_data_node, *np;
1441         /*
1442          * __dtb_testcases_begin[] and __dtb_testcases_end[] are magically
1443          * created by cmd_dt_S_dtb in scripts/Makefile.lib
1444          */
1445         extern uint8_t __dtb_testcases_begin[];
1446         extern uint8_t __dtb_testcases_end[];
1447         const int size = __dtb_testcases_end - __dtb_testcases_begin;
1448         int rc;
1449
1450         if (!size) {
1451                 pr_warn("%s: No testcase data to attach; not running tests\n",
1452                         __func__);
1453                 return -ENODATA;
1454         }
1455
1456         /* creating copy */
1457         unittest_data = kmemdup(__dtb_testcases_begin, size, GFP_KERNEL);
1458         if (!unittest_data)
1459                 return -ENOMEM;
1460
1461         of_fdt_unflatten_tree(unittest_data, NULL, &unittest_data_node);
1462         if (!unittest_data_node) {
1463                 pr_warn("%s: No tree to attach; not running tests\n", __func__);
1464                 kfree(unittest_data);
1465                 return -ENODATA;
1466         }
1467
1468         /*
1469          * This lock normally encloses of_resolve_phandles()
1470          */
1471         of_overlay_mutex_lock();
1472
1473         rc = of_resolve_phandles(unittest_data_node);
1474         if (rc) {
1475                 pr_err("%s: Failed to resolve phandles (rc=%i)\n", __func__, rc);
1476                 of_overlay_mutex_unlock();
1477                 return -EINVAL;
1478         }
1479
1480         if (!of_root) {
1481                 of_root = unittest_data_node;
1482                 for_each_of_allnodes(np)
1483                         __of_attach_node_sysfs(np);
1484                 of_aliases = of_find_node_by_path("/aliases");
1485                 of_chosen = of_find_node_by_path("/chosen");
1486                 of_overlay_mutex_unlock();
1487                 return 0;
1488         }
1489
1490         EXPECT_BEGIN(KERN_INFO,
1491                      "Duplicate name in testcase-data, renamed to \"duplicate-name#1\"");
1492
1493         /* attach the sub-tree to live tree */
1494         np = unittest_data_node->child;
1495         while (np) {
1496                 struct device_node *next = np->sibling;
1497
1498                 np->parent = of_root;
1499                 attach_node_and_children(np);
1500                 np = next;
1501         }
1502
1503         EXPECT_END(KERN_INFO,
1504                    "Duplicate name in testcase-data, renamed to \"duplicate-name#1\"");
1505
1506         of_overlay_mutex_unlock();
1507
1508         return 0;
1509 }
1510
1511 #ifdef CONFIG_OF_OVERLAY
1512 static int __init overlay_data_apply(const char *overlay_name, int *overlay_id);
1513
1514 static int unittest_probe(struct platform_device *pdev)
1515 {
1516         struct device *dev = &pdev->dev;
1517         struct device_node *np = dev->of_node;
1518
1519         if (np == NULL) {
1520                 dev_err(dev, "No OF data for device\n");
1521                 return -EINVAL;
1522
1523         }
1524
1525         dev_dbg(dev, "%s for node @%pOF\n", __func__, np);
1526
1527         of_platform_populate(np, NULL, NULL, &pdev->dev);
1528
1529         return 0;
1530 }
1531
1532 static int unittest_remove(struct platform_device *pdev)
1533 {
1534         struct device *dev = &pdev->dev;
1535         struct device_node *np = dev->of_node;
1536
1537         dev_dbg(dev, "%s for node @%pOF\n", __func__, np);
1538         return 0;
1539 }
1540
1541 static const struct of_device_id unittest_match[] = {
1542         { .compatible = "unittest", },
1543         {},
1544 };
1545
1546 static struct platform_driver unittest_driver = {
1547         .probe                  = unittest_probe,
1548         .remove                 = unittest_remove,
1549         .driver = {
1550                 .name           = "unittest",
1551                 .of_match_table = of_match_ptr(unittest_match),
1552         },
1553 };
1554
1555 /* get the platform device instantiated at the path */
1556 static struct platform_device *of_path_to_platform_device(const char *path)
1557 {
1558         struct device_node *np;
1559         struct platform_device *pdev;
1560
1561         np = of_find_node_by_path(path);
1562         if (np == NULL)
1563                 return NULL;
1564
1565         pdev = of_find_device_by_node(np);
1566         of_node_put(np);
1567
1568         return pdev;
1569 }
1570
1571 /* find out if a platform device exists at that path */
1572 static int of_path_platform_device_exists(const char *path)
1573 {
1574         struct platform_device *pdev;
1575
1576         pdev = of_path_to_platform_device(path);
1577         platform_device_put(pdev);
1578         return pdev != NULL;
1579 }
1580
1581 #ifdef CONFIG_OF_GPIO
1582
1583 struct unittest_gpio_dev {
1584         struct gpio_chip chip;
1585 };
1586
1587 static int unittest_gpio_chip_request_count;
1588 static int unittest_gpio_probe_count;
1589 static int unittest_gpio_probe_pass_count;
1590
1591 static int unittest_gpio_chip_request(struct gpio_chip *chip, unsigned int offset)
1592 {
1593         unittest_gpio_chip_request_count++;
1594
1595         pr_debug("%s(): %s %d %d\n", __func__, chip->label, offset,
1596                  unittest_gpio_chip_request_count);
1597         return 0;
1598 }
1599
1600 static int unittest_gpio_probe(struct platform_device *pdev)
1601 {
1602         struct unittest_gpio_dev *devptr;
1603         int ret;
1604
1605         unittest_gpio_probe_count++;
1606
1607         devptr = kzalloc(sizeof(*devptr), GFP_KERNEL);
1608         if (!devptr)
1609                 return -ENOMEM;
1610
1611         platform_set_drvdata(pdev, devptr);
1612
1613         devptr->chip.of_node = pdev->dev.of_node;
1614         devptr->chip.label = "of-unittest-gpio";
1615         devptr->chip.base = -1; /* dynamic allocation */
1616         devptr->chip.ngpio = 5;
1617         devptr->chip.request = unittest_gpio_chip_request;
1618
1619         ret = gpiochip_add_data(&devptr->chip, NULL);
1620
1621         unittest(!ret,
1622                  "gpiochip_add_data() for node @%pOF failed, ret = %d\n", devptr->chip.of_node, ret);
1623
1624         if (!ret)
1625                 unittest_gpio_probe_pass_count++;
1626         return ret;
1627 }
1628
1629 static int unittest_gpio_remove(struct platform_device *pdev)
1630 {
1631         struct unittest_gpio_dev *gdev = platform_get_drvdata(pdev);
1632         struct device *dev = &pdev->dev;
1633         struct device_node *np = pdev->dev.of_node;
1634
1635         dev_dbg(dev, "%s for node @%pOF\n", __func__, np);
1636
1637         if (!gdev)
1638                 return -EINVAL;
1639
1640         if (gdev->chip.base != -1)
1641                 gpiochip_remove(&gdev->chip);
1642
1643         platform_set_drvdata(pdev, NULL);
1644         kfree(gdev);
1645
1646         return 0;
1647 }
1648
1649 static const struct of_device_id unittest_gpio_id[] = {
1650         { .compatible = "unittest-gpio", },
1651         {}
1652 };
1653
1654 static struct platform_driver unittest_gpio_driver = {
1655         .probe  = unittest_gpio_probe,
1656         .remove = unittest_gpio_remove,
1657         .driver = {
1658                 .name           = "unittest-gpio",
1659                 .of_match_table = of_match_ptr(unittest_gpio_id),
1660         },
1661 };
1662
1663 static void __init of_unittest_overlay_gpio(void)
1664 {
1665         int chip_request_count;
1666         int probe_pass_count;
1667         int ret;
1668
1669         /*
1670          * tests: apply overlays before registering driver
1671          * Similar to installing a driver as a module, the
1672          * driver is registered after applying the overlays.
1673          *
1674          * The overlays are applied by overlay_data_apply()
1675          * instead of of_unittest_apply_overlay() so that they
1676          * will not be tracked.  Thus they will not be removed
1677          * by of_unittest_destroy_tracked_overlays().
1678          *
1679          * - apply overlay_gpio_01
1680          * - apply overlay_gpio_02a
1681          * - apply overlay_gpio_02b
1682          * - register driver
1683          *
1684          * register driver will result in
1685          *   - probe and processing gpio hog for overlay_gpio_01
1686          *   - probe for overlay_gpio_02a
1687          *   - processing gpio for overlay_gpio_02b
1688          */
1689
1690         probe_pass_count = unittest_gpio_probe_pass_count;
1691         chip_request_count = unittest_gpio_chip_request_count;
1692
1693         /*
1694          * overlay_gpio_01 contains gpio node and child gpio hog node
1695          * overlay_gpio_02a contains gpio node
1696          * overlay_gpio_02b contains child gpio hog node
1697          */
1698
1699         unittest(overlay_data_apply("overlay_gpio_01", NULL),
1700                  "Adding overlay 'overlay_gpio_01' failed\n");
1701
1702         unittest(overlay_data_apply("overlay_gpio_02a", NULL),
1703                  "Adding overlay 'overlay_gpio_02a' failed\n");
1704
1705         unittest(overlay_data_apply("overlay_gpio_02b", NULL),
1706                  "Adding overlay 'overlay_gpio_02b' failed\n");
1707
1708         /*
1709          * messages are the result of the probes, after the
1710          * driver is registered
1711          */
1712
1713         EXPECT_BEGIN(KERN_INFO,
1714                      "gpio-<<int>> (line-B-input): hogged as input\n");
1715
1716         EXPECT_BEGIN(KERN_INFO,
1717                      "gpio-<<int>> (line-A-input): hogged as input\n");
1718
1719         ret = platform_driver_register(&unittest_gpio_driver);
1720         if (unittest(ret == 0, "could not register unittest gpio driver\n"))
1721                 return;
1722
1723         EXPECT_END(KERN_INFO,
1724                    "gpio-<<int>> (line-A-input): hogged as input\n");
1725         EXPECT_END(KERN_INFO,
1726                    "gpio-<<int>> (line-B-input): hogged as input\n");
1727
1728         unittest(probe_pass_count + 2 == unittest_gpio_probe_pass_count,
1729                  "unittest_gpio_probe() failed or not called\n");
1730
1731         unittest(chip_request_count + 2 == unittest_gpio_chip_request_count,
1732                  "unittest_gpio_chip_request() called %d times (expected 1 time)\n",
1733                  unittest_gpio_chip_request_count - chip_request_count);
1734
1735         /*
1736          * tests: apply overlays after registering driver
1737          *
1738          * Similar to a driver built-in to the kernel, the
1739          * driver is registered before applying the overlays.
1740          *
1741          * overlay_gpio_03 contains gpio node and child gpio hog node
1742          *
1743          * - apply overlay_gpio_03
1744          *
1745          * apply overlay will result in
1746          *   - probe and processing gpio hog.
1747          */
1748
1749         probe_pass_count = unittest_gpio_probe_pass_count;
1750         chip_request_count = unittest_gpio_chip_request_count;
1751
1752         EXPECT_BEGIN(KERN_INFO,
1753                      "gpio-<<int>> (line-D-input): hogged as input\n");
1754
1755         /* overlay_gpio_03 contains gpio node and child gpio hog node */
1756
1757         unittest(overlay_data_apply("overlay_gpio_03", NULL),
1758                  "Adding overlay 'overlay_gpio_03' failed\n");
1759
1760         EXPECT_END(KERN_INFO,
1761                    "gpio-<<int>> (line-D-input): hogged as input\n");
1762
1763         unittest(probe_pass_count + 1 == unittest_gpio_probe_pass_count,
1764                  "unittest_gpio_probe() failed or not called\n");
1765
1766         unittest(chip_request_count + 1 == unittest_gpio_chip_request_count,
1767                  "unittest_gpio_chip_request() called %d times (expected 1 time)\n",
1768                  unittest_gpio_chip_request_count - chip_request_count);
1769
1770         /*
1771          * overlay_gpio_04a contains gpio node
1772          *
1773          * - apply overlay_gpio_04a
1774          *
1775          * apply the overlay will result in
1776          *   - probe for overlay_gpio_04a
1777          */
1778
1779         probe_pass_count = unittest_gpio_probe_pass_count;
1780         chip_request_count = unittest_gpio_chip_request_count;
1781
1782         /* overlay_gpio_04a contains gpio node */
1783
1784         unittest(overlay_data_apply("overlay_gpio_04a", NULL),
1785                  "Adding overlay 'overlay_gpio_04a' failed\n");
1786
1787         unittest(probe_pass_count + 1 == unittest_gpio_probe_pass_count,
1788                  "unittest_gpio_probe() failed or not called\n");
1789
1790         /*
1791          * overlay_gpio_04b contains child gpio hog node
1792          *
1793          * - apply overlay_gpio_04b
1794          *
1795          * apply the overlay will result in
1796          *   - processing gpio for overlay_gpio_04b
1797          */
1798
1799         EXPECT_BEGIN(KERN_INFO,
1800                      "gpio-<<int>> (line-C-input): hogged as input\n");
1801
1802         /* overlay_gpio_04b contains child gpio hog node */
1803
1804         unittest(overlay_data_apply("overlay_gpio_04b", NULL),
1805                  "Adding overlay 'overlay_gpio_04b' failed\n");
1806
1807         EXPECT_END(KERN_INFO,
1808                    "gpio-<<int>> (line-C-input): hogged as input\n");
1809
1810         unittest(chip_request_count + 1 == unittest_gpio_chip_request_count,
1811                  "unittest_gpio_chip_request() called %d times (expected 1 time)\n",
1812                  unittest_gpio_chip_request_count - chip_request_count);
1813 }
1814
1815 #else
1816
1817 static void __init of_unittest_overlay_gpio(void)
1818 {
1819         /* skip tests */
1820 }
1821
1822 #endif
1823
1824 #if IS_BUILTIN(CONFIG_I2C)
1825
1826 /* get the i2c client device instantiated at the path */
1827 static struct i2c_client *of_path_to_i2c_client(const char *path)
1828 {
1829         struct device_node *np;
1830         struct i2c_client *client;
1831
1832         np = of_find_node_by_path(path);
1833         if (np == NULL)
1834                 return NULL;
1835
1836         client = of_find_i2c_device_by_node(np);
1837         of_node_put(np);
1838
1839         return client;
1840 }
1841
1842 /* find out if a i2c client device exists at that path */
1843 static int of_path_i2c_client_exists(const char *path)
1844 {
1845         struct i2c_client *client;
1846
1847         client = of_path_to_i2c_client(path);
1848         if (client)
1849                 put_device(&client->dev);
1850         return client != NULL;
1851 }
1852 #else
1853 static int of_path_i2c_client_exists(const char *path)
1854 {
1855         return 0;
1856 }
1857 #endif
1858
1859 enum overlay_type {
1860         PDEV_OVERLAY,
1861         I2C_OVERLAY
1862 };
1863
1864 static int of_path_device_type_exists(const char *path,
1865                 enum overlay_type ovtype)
1866 {
1867         switch (ovtype) {
1868         case PDEV_OVERLAY:
1869                 return of_path_platform_device_exists(path);
1870         case I2C_OVERLAY:
1871                 return of_path_i2c_client_exists(path);
1872         }
1873         return 0;
1874 }
1875
1876 static const char *unittest_path(int nr, enum overlay_type ovtype)
1877 {
1878         const char *base;
1879         static char buf[256];
1880
1881         switch (ovtype) {
1882         case PDEV_OVERLAY:
1883                 base = "/testcase-data/overlay-node/test-bus";
1884                 break;
1885         case I2C_OVERLAY:
1886                 base = "/testcase-data/overlay-node/test-bus/i2c-test-bus";
1887                 break;
1888         default:
1889                 buf[0] = '\0';
1890                 return buf;
1891         }
1892         snprintf(buf, sizeof(buf) - 1, "%s/test-unittest%d", base, nr);
1893         buf[sizeof(buf) - 1] = '\0';
1894         return buf;
1895 }
1896
1897 static int of_unittest_device_exists(int unittest_nr, enum overlay_type ovtype)
1898 {
1899         const char *path;
1900
1901         path = unittest_path(unittest_nr, ovtype);
1902
1903         switch (ovtype) {
1904         case PDEV_OVERLAY:
1905                 return of_path_platform_device_exists(path);
1906         case I2C_OVERLAY:
1907                 return of_path_i2c_client_exists(path);
1908         }
1909         return 0;
1910 }
1911
1912 static const char *overlay_name_from_nr(int nr)
1913 {
1914         static char buf[256];
1915
1916         snprintf(buf, sizeof(buf) - 1,
1917                 "overlay_%d", nr);
1918         buf[sizeof(buf) - 1] = '\0';
1919
1920         return buf;
1921 }
1922
1923 static const char *bus_path = "/testcase-data/overlay-node/test-bus";
1924
1925 /* FIXME: it is NOT guaranteed that overlay ids are assigned in sequence */
1926
1927 #define MAX_UNITTEST_OVERLAYS   256
1928 static unsigned long overlay_id_bits[BITS_TO_LONGS(MAX_UNITTEST_OVERLAYS)];
1929 static int overlay_first_id = -1;
1930
1931 static long of_unittest_overlay_tracked(int id)
1932 {
1933         if (WARN_ON(id >= MAX_UNITTEST_OVERLAYS))
1934                 return 0;
1935         return overlay_id_bits[BIT_WORD(id)] & BIT_MASK(id);
1936 }
1937
1938 static void of_unittest_track_overlay(int id)
1939 {
1940         if (overlay_first_id < 0)
1941                 overlay_first_id = id;
1942         id -= overlay_first_id;
1943
1944         if (WARN_ON(id >= MAX_UNITTEST_OVERLAYS))
1945                 return;
1946         overlay_id_bits[BIT_WORD(id)] |= BIT_MASK(id);
1947 }
1948
1949 static void of_unittest_untrack_overlay(int id)
1950 {
1951         if (overlay_first_id < 0)
1952                 return;
1953         id -= overlay_first_id;
1954         if (WARN_ON(id >= MAX_UNITTEST_OVERLAYS))
1955                 return;
1956         overlay_id_bits[BIT_WORD(id)] &= ~BIT_MASK(id);
1957 }
1958
1959 static void of_unittest_destroy_tracked_overlays(void)
1960 {
1961         int id, ret, defers, ovcs_id;
1962
1963         if (overlay_first_id < 0)
1964                 return;
1965
1966         /* try until no defers */
1967         do {
1968                 defers = 0;
1969                 /* remove in reverse order */
1970                 for (id = MAX_UNITTEST_OVERLAYS - 1; id >= 0; id--) {
1971                         if (!of_unittest_overlay_tracked(id))
1972                                 continue;
1973
1974                         ovcs_id = id + overlay_first_id;
1975                         ret = of_overlay_remove(&ovcs_id);
1976                         if (ret == -ENODEV) {
1977                                 pr_warn("%s: no overlay to destroy for #%d\n",
1978                                         __func__, id + overlay_first_id);
1979                                 continue;
1980                         }
1981                         if (ret != 0) {
1982                                 defers++;
1983                                 pr_warn("%s: overlay destroy failed for #%d\n",
1984                                         __func__, id + overlay_first_id);
1985                                 continue;
1986                         }
1987
1988                         of_unittest_untrack_overlay(id);
1989                 }
1990         } while (defers > 0);
1991 }
1992
1993 static int __init of_unittest_apply_overlay(int overlay_nr, int *overlay_id)
1994 {
1995         const char *overlay_name;
1996
1997         overlay_name = overlay_name_from_nr(overlay_nr);
1998
1999         if (!overlay_data_apply(overlay_name, overlay_id)) {
2000                 unittest(0, "could not apply overlay \"%s\"\n",
2001                                 overlay_name);
2002                 return -EFAULT;
2003         }
2004         of_unittest_track_overlay(*overlay_id);
2005
2006         return 0;
2007 }
2008
2009 /* apply an overlay while checking before and after states */
2010 static int __init of_unittest_apply_overlay_check(int overlay_nr,
2011                 int unittest_nr, int before, int after,
2012                 enum overlay_type ovtype)
2013 {
2014         int ret, ovcs_id;
2015
2016         /* unittest device must not be in before state */
2017         if (of_unittest_device_exists(unittest_nr, ovtype) != before) {
2018                 unittest(0, "%s with device @\"%s\" %s\n",
2019                                 overlay_name_from_nr(overlay_nr),
2020                                 unittest_path(unittest_nr, ovtype),
2021                                 !before ? "enabled" : "disabled");
2022                 return -EINVAL;
2023         }
2024
2025         ovcs_id = 0;
2026         ret = of_unittest_apply_overlay(overlay_nr, &ovcs_id);
2027         if (ret != 0) {
2028                 /* of_unittest_apply_overlay already called unittest() */
2029                 return ret;
2030         }
2031
2032         /* unittest device must be to set to after state */
2033         if (of_unittest_device_exists(unittest_nr, ovtype) != after) {
2034                 unittest(0, "%s failed to create @\"%s\" %s\n",
2035                                 overlay_name_from_nr(overlay_nr),
2036                                 unittest_path(unittest_nr, ovtype),
2037                                 !after ? "enabled" : "disabled");
2038                 return -EINVAL;
2039         }
2040
2041         return 0;
2042 }
2043
2044 /* apply an overlay and then revert it while checking before, after states */
2045 static int __init of_unittest_apply_revert_overlay_check(int overlay_nr,
2046                 int unittest_nr, int before, int after,
2047                 enum overlay_type ovtype)
2048 {
2049         int ret, ovcs_id, save_id;
2050
2051         /* unittest device must be in before state */
2052         if (of_unittest_device_exists(unittest_nr, ovtype) != before) {
2053                 unittest(0, "%s with device @\"%s\" %s\n",
2054                                 overlay_name_from_nr(overlay_nr),
2055                                 unittest_path(unittest_nr, ovtype),
2056                                 !before ? "enabled" : "disabled");
2057                 return -EINVAL;
2058         }
2059
2060         /* apply the overlay */
2061         ovcs_id = 0;
2062         ret = of_unittest_apply_overlay(overlay_nr, &ovcs_id);
2063         if (ret != 0) {
2064                 /* of_unittest_apply_overlay already called unittest() */
2065                 return ret;
2066         }
2067
2068         /* unittest device must be in after state */
2069         if (of_unittest_device_exists(unittest_nr, ovtype) != after) {
2070                 unittest(0, "%s failed to create @\"%s\" %s\n",
2071                                 overlay_name_from_nr(overlay_nr),
2072                                 unittest_path(unittest_nr, ovtype),
2073                                 !after ? "enabled" : "disabled");
2074                 return -EINVAL;
2075         }
2076
2077         save_id = ovcs_id;
2078         ret = of_overlay_remove(&ovcs_id);
2079         if (ret != 0) {
2080                 unittest(0, "%s failed to be destroyed @\"%s\"\n",
2081                                 overlay_name_from_nr(overlay_nr),
2082                                 unittest_path(unittest_nr, ovtype));
2083                 return ret;
2084         }
2085         of_unittest_untrack_overlay(save_id);
2086
2087         /* unittest device must be again in before state */
2088         if (of_unittest_device_exists(unittest_nr, ovtype) != before) {
2089                 unittest(0, "%s with device @\"%s\" %s\n",
2090                                 overlay_name_from_nr(overlay_nr),
2091                                 unittest_path(unittest_nr, ovtype),
2092                                 !before ? "enabled" : "disabled");
2093                 return -EINVAL;
2094         }
2095
2096         return 0;
2097 }
2098
2099 /* test activation of device */
2100 static void __init of_unittest_overlay_0(void)
2101 {
2102         int ret;
2103
2104         EXPECT_BEGIN(KERN_INFO,
2105                      "OF: overlay: WARNING: memory leak will occur if overlay removed, property: /testcase-data/overlay-node/test-bus/test-unittest0/status");
2106
2107         /* device should enable */
2108         ret = of_unittest_apply_overlay_check(0, 0, 0, 1, PDEV_OVERLAY);
2109
2110         EXPECT_END(KERN_INFO,
2111                    "OF: overlay: WARNING: memory leak will occur if overlay removed, property: /testcase-data/overlay-node/test-bus/test-unittest0/status");
2112
2113         if (ret)
2114                 return;
2115
2116         unittest(1, "overlay test %d passed\n", 0);
2117 }
2118
2119 /* test deactivation of device */
2120 static void __init of_unittest_overlay_1(void)
2121 {
2122         int ret;
2123
2124         EXPECT_BEGIN(KERN_INFO,
2125                      "OF: overlay: WARNING: memory leak will occur if overlay removed, property: /testcase-data/overlay-node/test-bus/test-unittest1/status");
2126
2127         /* device should disable */
2128         ret = of_unittest_apply_overlay_check(1, 1, 1, 0, PDEV_OVERLAY);
2129
2130         EXPECT_END(KERN_INFO,
2131                    "OF: overlay: WARNING: memory leak will occur if overlay removed, property: /testcase-data/overlay-node/test-bus/test-unittest1/status");
2132
2133         if (ret)
2134                 return;
2135
2136         unittest(1, "overlay test %d passed\n", 1);
2137
2138 }
2139
2140 /* test activation of device */
2141 static void __init of_unittest_overlay_2(void)
2142 {
2143         int ret;
2144
2145         EXPECT_BEGIN(KERN_INFO,
2146                      "OF: overlay: WARNING: memory leak will occur if overlay removed, property: /testcase-data/overlay-node/test-bus/test-unittest2/status");
2147
2148         /* device should enable */
2149         ret = of_unittest_apply_overlay_check(2, 2, 0, 1, PDEV_OVERLAY);
2150
2151         EXPECT_END(KERN_INFO,
2152                    "OF: overlay: WARNING: memory leak will occur if overlay removed, property: /testcase-data/overlay-node/test-bus/test-unittest2/status");
2153
2154         if (ret)
2155                 return;
2156         unittest(1, "overlay test %d passed\n", 2);
2157 }
2158
2159 /* test deactivation of device */
2160 static void __init of_unittest_overlay_3(void)
2161 {
2162         int ret;
2163
2164         EXPECT_BEGIN(KERN_INFO,
2165                      "OF: overlay: WARNING: memory leak will occur if overlay removed, property: /testcase-data/overlay-node/test-bus/test-unittest3/status");
2166
2167         /* device should disable */
2168         ret = of_unittest_apply_overlay_check(3, 3, 1, 0, PDEV_OVERLAY);
2169
2170         EXPECT_END(KERN_INFO,
2171                    "OF: overlay: WARNING: memory leak will occur if overlay removed, property: /testcase-data/overlay-node/test-bus/test-unittest3/status");
2172
2173         if (ret)
2174                 return;
2175
2176         unittest(1, "overlay test %d passed\n", 3);
2177 }
2178
2179 /* test activation of a full device node */
2180 static void __init of_unittest_overlay_4(void)
2181 {
2182         /* device should disable */
2183         if (of_unittest_apply_overlay_check(4, 4, 0, 1, PDEV_OVERLAY))
2184                 return;
2185
2186         unittest(1, "overlay test %d passed\n", 4);
2187 }
2188
2189 /* test overlay apply/revert sequence */
2190 static void __init of_unittest_overlay_5(void)
2191 {
2192         int ret;
2193
2194         EXPECT_BEGIN(KERN_INFO,
2195                      "OF: overlay: WARNING: memory leak will occur if overlay removed, property: /testcase-data/overlay-node/test-bus/test-unittest5/status");
2196
2197         /* device should disable */
2198         ret = of_unittest_apply_revert_overlay_check(5, 5, 0, 1, PDEV_OVERLAY);
2199
2200         EXPECT_END(KERN_INFO,
2201                    "OF: overlay: WARNING: memory leak will occur if overlay removed, property: /testcase-data/overlay-node/test-bus/test-unittest5/status");
2202
2203         if (ret)
2204                 return;
2205
2206         unittest(1, "overlay test %d passed\n", 5);
2207 }
2208
2209 /* test overlay application in sequence */
2210 static void __init of_unittest_overlay_6(void)
2211 {
2212         int i, ov_id[2], ovcs_id;
2213         int overlay_nr = 6, unittest_nr = 6;
2214         int before = 0, after = 1;
2215         const char *overlay_name;
2216
2217         int ret;
2218
2219         /* unittest device must be in before state */
2220         for (i = 0; i < 2; i++) {
2221                 if (of_unittest_device_exists(unittest_nr + i, PDEV_OVERLAY)
2222                                 != before) {
2223                         unittest(0, "%s with device @\"%s\" %s\n",
2224                                         overlay_name_from_nr(overlay_nr + i),
2225                                         unittest_path(unittest_nr + i,
2226                                                 PDEV_OVERLAY),
2227                                         !before ? "enabled" : "disabled");
2228                         return;
2229                 }
2230         }
2231
2232         /* apply the overlays */
2233
2234         EXPECT_BEGIN(KERN_INFO,
2235                      "OF: overlay: WARNING: memory leak will occur if overlay removed, property: /testcase-data/overlay-node/test-bus/test-unittest6/status");
2236
2237         overlay_name = overlay_name_from_nr(overlay_nr + 0);
2238
2239         ret = overlay_data_apply(overlay_name, &ovcs_id);
2240
2241         if (!ret) {
2242                 unittest(0, "could not apply overlay \"%s\"\n", overlay_name);
2243                         return;
2244         }
2245         ov_id[0] = ovcs_id;
2246         of_unittest_track_overlay(ov_id[0]);
2247
2248         EXPECT_END(KERN_INFO,
2249                    "OF: overlay: WARNING: memory leak will occur if overlay removed, property: /testcase-data/overlay-node/test-bus/test-unittest6/status");
2250
2251         EXPECT_BEGIN(KERN_INFO,
2252                      "OF: overlay: WARNING: memory leak will occur if overlay removed, property: /testcase-data/overlay-node/test-bus/test-unittest7/status");
2253
2254         overlay_name = overlay_name_from_nr(overlay_nr + 1);
2255
2256         ret = overlay_data_apply(overlay_name, &ovcs_id);
2257
2258         if (!ret) {
2259                 unittest(0, "could not apply overlay \"%s\"\n", overlay_name);
2260                         return;
2261         }
2262         ov_id[1] = ovcs_id;
2263         of_unittest_track_overlay(ov_id[1]);
2264
2265         EXPECT_END(KERN_INFO,
2266                    "OF: overlay: WARNING: memory leak will occur if overlay removed, property: /testcase-data/overlay-node/test-bus/test-unittest7/status");
2267
2268
2269         for (i = 0; i < 2; i++) {
2270                 /* unittest device must be in after state */
2271                 if (of_unittest_device_exists(unittest_nr + i, PDEV_OVERLAY)
2272                                 != after) {
2273                         unittest(0, "overlay @\"%s\" failed @\"%s\" %s\n",
2274                                         overlay_name_from_nr(overlay_nr + i),
2275                                         unittest_path(unittest_nr + i,
2276                                                 PDEV_OVERLAY),
2277                                         !after ? "enabled" : "disabled");
2278                         return;
2279                 }
2280         }
2281
2282         for (i = 1; i >= 0; i--) {
2283                 ovcs_id = ov_id[i];
2284                 if (of_overlay_remove(&ovcs_id)) {
2285                         unittest(0, "%s failed destroy @\"%s\"\n",
2286                                         overlay_name_from_nr(overlay_nr + i),
2287                                         unittest_path(unittest_nr + i,
2288                                                 PDEV_OVERLAY));
2289                         return;
2290                 }
2291                 of_unittest_untrack_overlay(ov_id[i]);
2292         }
2293
2294         for (i = 0; i < 2; i++) {
2295                 /* unittest device must be again in before state */
2296                 if (of_unittest_device_exists(unittest_nr + i, PDEV_OVERLAY)
2297                                 != before) {
2298                         unittest(0, "%s with device @\"%s\" %s\n",
2299                                         overlay_name_from_nr(overlay_nr + i),
2300                                         unittest_path(unittest_nr + i,
2301                                                 PDEV_OVERLAY),
2302                                         !before ? "enabled" : "disabled");
2303                         return;
2304                 }
2305         }
2306
2307         unittest(1, "overlay test %d passed\n", 6);
2308
2309 }
2310
2311 /* test overlay application in sequence */
2312 static void __init of_unittest_overlay_8(void)
2313 {
2314         int i, ov_id[2], ovcs_id;
2315         int overlay_nr = 8, unittest_nr = 8;
2316         const char *overlay_name;
2317         int ret;
2318
2319         /* we don't care about device state in this test */
2320
2321         EXPECT_BEGIN(KERN_INFO,
2322                      "OF: overlay: WARNING: memory leak will occur if overlay removed, property: /testcase-data/overlay-node/test-bus/test-unittest8/status");
2323
2324         overlay_name = overlay_name_from_nr(overlay_nr + 0);
2325
2326         ret = overlay_data_apply(overlay_name, &ovcs_id);
2327         if (!ret)
2328                 unittest(0, "could not apply overlay \"%s\"\n", overlay_name);
2329
2330         EXPECT_END(KERN_INFO,
2331                    "OF: overlay: WARNING: memory leak will occur if overlay removed, property: /testcase-data/overlay-node/test-bus/test-unittest8/status");
2332
2333         if (!ret)
2334                 return;
2335
2336         ov_id[0] = ovcs_id;
2337         of_unittest_track_overlay(ov_id[0]);
2338
2339         overlay_name = overlay_name_from_nr(overlay_nr + 1);
2340
2341         EXPECT_BEGIN(KERN_INFO,
2342                      "OF: overlay: WARNING: memory leak will occur if overlay removed, property: /testcase-data/overlay-node/test-bus/test-unittest8/property-foo");
2343
2344         /* apply the overlays */
2345         ret = overlay_data_apply(overlay_name, &ovcs_id);
2346
2347         EXPECT_END(KERN_INFO,
2348                    "OF: overlay: WARNING: memory leak will occur if overlay removed, property: /testcase-data/overlay-node/test-bus/test-unittest8/property-foo");
2349
2350         if (!ret) {
2351                 unittest(0, "could not apply overlay \"%s\"\n", overlay_name);
2352                 return;
2353         }
2354
2355         ov_id[1] = ovcs_id;
2356         of_unittest_track_overlay(ov_id[1]);
2357
2358         /* now try to remove first overlay (it should fail) */
2359         ovcs_id = ov_id[0];
2360
2361         EXPECT_BEGIN(KERN_INFO,
2362                      "OF: overlay: node_overlaps_later_cs: #6 overlaps with #7 @/testcase-data/overlay-node/test-bus/test-unittest8");
2363
2364         EXPECT_BEGIN(KERN_INFO,
2365                      "OF: overlay: overlay #6 is not topmost");
2366
2367         ret = of_overlay_remove(&ovcs_id);
2368
2369         EXPECT_END(KERN_INFO,
2370                    "OF: overlay: overlay #6 is not topmost");
2371
2372         EXPECT_END(KERN_INFO,
2373                    "OF: overlay: node_overlaps_later_cs: #6 overlaps with #7 @/testcase-data/overlay-node/test-bus/test-unittest8");
2374
2375         if (!ret) {
2376                 unittest(0, "%s was destroyed @\"%s\"\n",
2377                                 overlay_name_from_nr(overlay_nr + 0),
2378                                 unittest_path(unittest_nr,
2379                                         PDEV_OVERLAY));
2380                 return;
2381         }
2382
2383         /* removing them in order should work */
2384         for (i = 1; i >= 0; i--) {
2385                 ovcs_id = ov_id[i];
2386                 if (of_overlay_remove(&ovcs_id)) {
2387                         unittest(0, "%s not destroyed @\"%s\"\n",
2388                                         overlay_name_from_nr(overlay_nr + i),
2389                                         unittest_path(unittest_nr,
2390                                                 PDEV_OVERLAY));
2391                         return;
2392                 }
2393                 of_unittest_untrack_overlay(ov_id[i]);
2394         }
2395
2396         unittest(1, "overlay test %d passed\n", 8);
2397 }
2398
2399 /* test insertion of a bus with parent devices */
2400 static void __init of_unittest_overlay_10(void)
2401 {
2402         int ret;
2403         char *child_path;
2404
2405         /* device should disable */
2406         ret = of_unittest_apply_overlay_check(10, 10, 0, 1, PDEV_OVERLAY);
2407
2408         if (unittest(ret == 0,
2409                         "overlay test %d failed; overlay application\n", 10))
2410                 return;
2411
2412         child_path = kasprintf(GFP_KERNEL, "%s/test-unittest101",
2413                         unittest_path(10, PDEV_OVERLAY));
2414         if (unittest(child_path, "overlay test %d failed; kasprintf\n", 10))
2415                 return;
2416
2417         ret = of_path_device_type_exists(child_path, PDEV_OVERLAY);
2418         kfree(child_path);
2419
2420         unittest(ret, "overlay test %d failed; no child device\n", 10);
2421 }
2422
2423 /* test insertion of a bus with parent devices (and revert) */
2424 static void __init of_unittest_overlay_11(void)
2425 {
2426         int ret;
2427
2428         /* device should disable */
2429         ret = of_unittest_apply_revert_overlay_check(11, 11, 0, 1,
2430                         PDEV_OVERLAY);
2431
2432         unittest(ret == 0, "overlay test %d failed; overlay apply\n", 11);
2433 }
2434
2435 #if IS_BUILTIN(CONFIG_I2C) && IS_ENABLED(CONFIG_OF_OVERLAY)
2436
2437 struct unittest_i2c_bus_data {
2438         struct platform_device  *pdev;
2439         struct i2c_adapter      adap;
2440 };
2441
2442 static int unittest_i2c_master_xfer(struct i2c_adapter *adap,
2443                 struct i2c_msg *msgs, int num)
2444 {
2445         struct unittest_i2c_bus_data *std = i2c_get_adapdata(adap);
2446
2447         (void)std;
2448
2449         return num;
2450 }
2451
2452 static u32 unittest_i2c_functionality(struct i2c_adapter *adap)
2453 {
2454         return I2C_FUNC_I2C | I2C_FUNC_SMBUS_EMUL;
2455 }
2456
2457 static const struct i2c_algorithm unittest_i2c_algo = {
2458         .master_xfer    = unittest_i2c_master_xfer,
2459         .functionality  = unittest_i2c_functionality,
2460 };
2461
2462 static int unittest_i2c_bus_probe(struct platform_device *pdev)
2463 {
2464         struct device *dev = &pdev->dev;
2465         struct device_node *np = dev->of_node;
2466         struct unittest_i2c_bus_data *std;
2467         struct i2c_adapter *adap;
2468         int ret;
2469
2470         if (np == NULL) {
2471                 dev_err(dev, "No OF data for device\n");
2472                 return -EINVAL;
2473
2474         }
2475
2476         dev_dbg(dev, "%s for node @%pOF\n", __func__, np);
2477
2478         std = devm_kzalloc(dev, sizeof(*std), GFP_KERNEL);
2479         if (!std)
2480                 return -ENOMEM;
2481
2482         /* link them together */
2483         std->pdev = pdev;
2484         platform_set_drvdata(pdev, std);
2485
2486         adap = &std->adap;
2487         i2c_set_adapdata(adap, std);
2488         adap->nr = -1;
2489         strlcpy(adap->name, pdev->name, sizeof(adap->name));
2490         adap->class = I2C_CLASS_DEPRECATED;
2491         adap->algo = &unittest_i2c_algo;
2492         adap->dev.parent = dev;
2493         adap->dev.of_node = dev->of_node;
2494         adap->timeout = 5 * HZ;
2495         adap->retries = 3;
2496
2497         ret = i2c_add_numbered_adapter(adap);
2498         if (ret != 0) {
2499                 dev_err(dev, "Failed to add I2C adapter\n");
2500                 return ret;
2501         }
2502
2503         return 0;
2504 }
2505
2506 static int unittest_i2c_bus_remove(struct platform_device *pdev)
2507 {
2508         struct device *dev = &pdev->dev;
2509         struct device_node *np = dev->of_node;
2510         struct unittest_i2c_bus_data *std = platform_get_drvdata(pdev);
2511
2512         dev_dbg(dev, "%s for node @%pOF\n", __func__, np);
2513         i2c_del_adapter(&std->adap);
2514
2515         return 0;
2516 }
2517
2518 static const struct of_device_id unittest_i2c_bus_match[] = {
2519         { .compatible = "unittest-i2c-bus", },
2520         {},
2521 };
2522
2523 static struct platform_driver unittest_i2c_bus_driver = {
2524         .probe                  = unittest_i2c_bus_probe,
2525         .remove                 = unittest_i2c_bus_remove,
2526         .driver = {
2527                 .name           = "unittest-i2c-bus",
2528                 .of_match_table = of_match_ptr(unittest_i2c_bus_match),
2529         },
2530 };
2531
2532 static int unittest_i2c_dev_probe(struct i2c_client *client,
2533                 const struct i2c_device_id *id)
2534 {
2535         struct device *dev = &client->dev;
2536         struct device_node *np = client->dev.of_node;
2537
2538         if (!np) {
2539                 dev_err(dev, "No OF node\n");
2540                 return -EINVAL;
2541         }
2542
2543         dev_dbg(dev, "%s for node @%pOF\n", __func__, np);
2544
2545         return 0;
2546 };
2547
2548 static int unittest_i2c_dev_remove(struct i2c_client *client)
2549 {
2550         struct device *dev = &client->dev;
2551         struct device_node *np = client->dev.of_node;
2552
2553         dev_dbg(dev, "%s for node @%pOF\n", __func__, np);
2554         return 0;
2555 }
2556
2557 static const struct i2c_device_id unittest_i2c_dev_id[] = {
2558         { .name = "unittest-i2c-dev" },
2559         { }
2560 };
2561
2562 static struct i2c_driver unittest_i2c_dev_driver = {
2563         .driver = {
2564                 .name = "unittest-i2c-dev",
2565         },
2566         .probe = unittest_i2c_dev_probe,
2567         .remove = unittest_i2c_dev_remove,
2568         .id_table = unittest_i2c_dev_id,
2569 };
2570
2571 #if IS_BUILTIN(CONFIG_I2C_MUX)
2572
2573 static int unittest_i2c_mux_select_chan(struct i2c_mux_core *muxc, u32 chan)
2574 {
2575         return 0;
2576 }
2577
2578 static int unittest_i2c_mux_probe(struct i2c_client *client,
2579                 const struct i2c_device_id *id)
2580 {
2581         int i, nchans;
2582         struct device *dev = &client->dev;
2583         struct i2c_adapter *adap = client->adapter;
2584         struct device_node *np = client->dev.of_node, *child;
2585         struct i2c_mux_core *muxc;
2586         u32 reg, max_reg;
2587
2588         dev_dbg(dev, "%s for node @%pOF\n", __func__, np);
2589
2590         if (!np) {
2591                 dev_err(dev, "No OF node\n");
2592                 return -EINVAL;
2593         }
2594
2595         max_reg = (u32)-1;
2596         for_each_child_of_node(np, child) {
2597                 if (of_property_read_u32(child, "reg", &reg))
2598                         continue;
2599                 if (max_reg == (u32)-1 || reg > max_reg)
2600                         max_reg = reg;
2601         }
2602         nchans = max_reg == (u32)-1 ? 0 : max_reg + 1;
2603         if (nchans == 0) {
2604                 dev_err(dev, "No channels\n");
2605                 return -EINVAL;
2606         }
2607
2608         muxc = i2c_mux_alloc(adap, dev, nchans, 0, 0,
2609                              unittest_i2c_mux_select_chan, NULL);
2610         if (!muxc)
2611                 return -ENOMEM;
2612         for (i = 0; i < nchans; i++) {
2613                 if (i2c_mux_add_adapter(muxc, 0, i, 0)) {
2614                         dev_err(dev, "Failed to register mux #%d\n", i);
2615                         i2c_mux_del_adapters(muxc);
2616                         return -ENODEV;
2617                 }
2618         }
2619
2620         i2c_set_clientdata(client, muxc);
2621
2622         return 0;
2623 };
2624
2625 static int unittest_i2c_mux_remove(struct i2c_client *client)
2626 {
2627         struct device *dev = &client->dev;
2628         struct device_node *np = client->dev.of_node;
2629         struct i2c_mux_core *muxc = i2c_get_clientdata(client);
2630
2631         dev_dbg(dev, "%s for node @%pOF\n", __func__, np);
2632         i2c_mux_del_adapters(muxc);
2633         return 0;
2634 }
2635
2636 static const struct i2c_device_id unittest_i2c_mux_id[] = {
2637         { .name = "unittest-i2c-mux" },
2638         { }
2639 };
2640
2641 static struct i2c_driver unittest_i2c_mux_driver = {
2642         .driver = {
2643                 .name = "unittest-i2c-mux",
2644         },
2645         .probe = unittest_i2c_mux_probe,
2646         .remove = unittest_i2c_mux_remove,
2647         .id_table = unittest_i2c_mux_id,
2648 };
2649
2650 #endif
2651
2652 static int of_unittest_overlay_i2c_init(void)
2653 {
2654         int ret;
2655
2656         ret = i2c_add_driver(&unittest_i2c_dev_driver);
2657         if (unittest(ret == 0,
2658                         "could not register unittest i2c device driver\n"))
2659                 return ret;
2660
2661         ret = platform_driver_register(&unittest_i2c_bus_driver);
2662
2663         if (unittest(ret == 0,
2664                         "could not register unittest i2c bus driver\n"))
2665                 return ret;
2666
2667 #if IS_BUILTIN(CONFIG_I2C_MUX)
2668
2669         EXPECT_BEGIN(KERN_INFO,
2670                      "i2c i2c-1: Added multiplexed i2c bus 2");
2671
2672         ret = i2c_add_driver(&unittest_i2c_mux_driver);
2673
2674         EXPECT_END(KERN_INFO,
2675                    "i2c i2c-1: Added multiplexed i2c bus 2");
2676
2677         if (unittest(ret == 0,
2678                         "could not register unittest i2c mux driver\n"))
2679                 return ret;
2680 #endif
2681
2682         return 0;
2683 }
2684
2685 static void of_unittest_overlay_i2c_cleanup(void)
2686 {
2687 #if IS_BUILTIN(CONFIG_I2C_MUX)
2688         i2c_del_driver(&unittest_i2c_mux_driver);
2689 #endif
2690         platform_driver_unregister(&unittest_i2c_bus_driver);
2691         i2c_del_driver(&unittest_i2c_dev_driver);
2692 }
2693
2694 static void __init of_unittest_overlay_i2c_12(void)
2695 {
2696         int ret;
2697
2698         /* device should enable */
2699         EXPECT_BEGIN(KERN_INFO,
2700                      "OF: overlay: WARNING: memory leak will occur if overlay removed, property: /testcase-data/overlay-node/test-bus/i2c-test-bus/test-unittest12/status");
2701
2702         ret = of_unittest_apply_overlay_check(12, 12, 0, 1, I2C_OVERLAY);
2703
2704         EXPECT_END(KERN_INFO,
2705                    "OF: overlay: WARNING: memory leak will occur if overlay removed, property: /testcase-data/overlay-node/test-bus/i2c-test-bus/test-unittest12/status");
2706
2707         if (ret)
2708                 return;
2709
2710         unittest(1, "overlay test %d passed\n", 12);
2711 }
2712
2713 /* test deactivation of device */
2714 static void __init of_unittest_overlay_i2c_13(void)
2715 {
2716         int ret;
2717
2718         EXPECT_BEGIN(KERN_INFO,
2719                      "OF: overlay: WARNING: memory leak will occur if overlay removed, property: /testcase-data/overlay-node/test-bus/i2c-test-bus/test-unittest13/status");
2720
2721         /* device should disable */
2722         ret = of_unittest_apply_overlay_check(13, 13, 1, 0, I2C_OVERLAY);
2723
2724         EXPECT_END(KERN_INFO,
2725                    "OF: overlay: WARNING: memory leak will occur if overlay removed, property: /testcase-data/overlay-node/test-bus/i2c-test-bus/test-unittest13/status");
2726
2727         if (ret)
2728                 return;
2729
2730         unittest(1, "overlay test %d passed\n", 13);
2731 }
2732
2733 /* just check for i2c mux existence */
2734 static void of_unittest_overlay_i2c_14(void)
2735 {
2736 }
2737
2738 static void __init of_unittest_overlay_i2c_15(void)
2739 {
2740         int ret;
2741
2742         /* device should enable */
2743         EXPECT_BEGIN(KERN_INFO,
2744                      "i2c i2c-1: Added multiplexed i2c bus 3");
2745
2746         ret = of_unittest_apply_overlay_check(15, 15, 0, 1, I2C_OVERLAY);
2747
2748         EXPECT_END(KERN_INFO,
2749                    "i2c i2c-1: Added multiplexed i2c bus 3");
2750
2751         if (ret)
2752                 return;
2753
2754         unittest(1, "overlay test %d passed\n", 15);
2755 }
2756
2757 #else
2758
2759 static inline void of_unittest_overlay_i2c_14(void) { }
2760 static inline void of_unittest_overlay_i2c_15(void) { }
2761
2762 #endif
2763
2764 static void __init of_unittest_overlay(void)
2765 {
2766         struct device_node *bus_np = NULL;
2767
2768         if (platform_driver_register(&unittest_driver)) {
2769                 unittest(0, "could not register unittest driver\n");
2770                 goto out;
2771         }
2772
2773         bus_np = of_find_node_by_path(bus_path);
2774         if (bus_np == NULL) {
2775                 unittest(0, "could not find bus_path \"%s\"\n", bus_path);
2776                 goto out;
2777         }
2778
2779         if (of_platform_default_populate(bus_np, NULL, NULL)) {
2780                 unittest(0, "could not populate bus @ \"%s\"\n", bus_path);
2781                 goto out;
2782         }
2783
2784         if (!of_unittest_device_exists(100, PDEV_OVERLAY)) {
2785                 unittest(0, "could not find unittest0 @ \"%s\"\n",
2786                                 unittest_path(100, PDEV_OVERLAY));
2787                 goto out;
2788         }
2789
2790         if (of_unittest_device_exists(101, PDEV_OVERLAY)) {
2791                 unittest(0, "unittest1 @ \"%s\" should not exist\n",
2792                                 unittest_path(101, PDEV_OVERLAY));
2793                 goto out;
2794         }
2795
2796         unittest(1, "basic infrastructure of overlays passed");
2797
2798         /* tests in sequence */
2799         of_unittest_overlay_0();
2800         of_unittest_overlay_1();
2801         of_unittest_overlay_2();
2802         of_unittest_overlay_3();
2803         of_unittest_overlay_4();
2804         of_unittest_overlay_5();
2805         of_unittest_overlay_6();
2806         of_unittest_overlay_8();
2807
2808         of_unittest_overlay_10();
2809         of_unittest_overlay_11();
2810
2811 #if IS_BUILTIN(CONFIG_I2C)
2812         if (unittest(of_unittest_overlay_i2c_init() == 0, "i2c init failed\n"))
2813                 goto out;
2814
2815         of_unittest_overlay_i2c_12();
2816         of_unittest_overlay_i2c_13();
2817         of_unittest_overlay_i2c_14();
2818         of_unittest_overlay_i2c_15();
2819
2820         of_unittest_overlay_i2c_cleanup();
2821 #endif
2822
2823         of_unittest_overlay_gpio();
2824
2825         of_unittest_destroy_tracked_overlays();
2826
2827 out:
2828         of_node_put(bus_np);
2829 }
2830
2831 #else
2832 static inline void __init of_unittest_overlay(void) { }
2833 #endif
2834
2835 #ifdef CONFIG_OF_OVERLAY
2836
2837 /*
2838  * __dtb_ot_begin[] and __dtb_ot_end[] are created by cmd_dt_S_dtb
2839  * in scripts/Makefile.lib
2840  */
2841
2842 #define OVERLAY_INFO_EXTERN(name) \
2843         extern uint8_t __dtb_##name##_begin[]; \
2844         extern uint8_t __dtb_##name##_end[]
2845
2846 #define OVERLAY_INFO(overlay_name, expected)             \
2847 {       .dtb_begin       = __dtb_##overlay_name##_begin, \
2848         .dtb_end         = __dtb_##overlay_name##_end,   \
2849         .expected_result = expected,                     \
2850         .name            = #overlay_name,                \
2851 }
2852
2853 struct overlay_info {
2854         uint8_t         *dtb_begin;
2855         uint8_t         *dtb_end;
2856         int             expected_result;
2857         int             overlay_id;
2858         char            *name;
2859 };
2860
2861 OVERLAY_INFO_EXTERN(overlay_base);
2862 OVERLAY_INFO_EXTERN(overlay);
2863 OVERLAY_INFO_EXTERN(overlay_0);
2864 OVERLAY_INFO_EXTERN(overlay_1);
2865 OVERLAY_INFO_EXTERN(overlay_2);
2866 OVERLAY_INFO_EXTERN(overlay_3);
2867 OVERLAY_INFO_EXTERN(overlay_4);
2868 OVERLAY_INFO_EXTERN(overlay_5);
2869 OVERLAY_INFO_EXTERN(overlay_6);
2870 OVERLAY_INFO_EXTERN(overlay_7);
2871 OVERLAY_INFO_EXTERN(overlay_8);
2872 OVERLAY_INFO_EXTERN(overlay_9);
2873 OVERLAY_INFO_EXTERN(overlay_10);
2874 OVERLAY_INFO_EXTERN(overlay_11);
2875 OVERLAY_INFO_EXTERN(overlay_12);
2876 OVERLAY_INFO_EXTERN(overlay_13);
2877 OVERLAY_INFO_EXTERN(overlay_15);
2878 OVERLAY_INFO_EXTERN(overlay_gpio_01);
2879 OVERLAY_INFO_EXTERN(overlay_gpio_02a);
2880 OVERLAY_INFO_EXTERN(overlay_gpio_02b);
2881 OVERLAY_INFO_EXTERN(overlay_gpio_03);
2882 OVERLAY_INFO_EXTERN(overlay_gpio_04a);
2883 OVERLAY_INFO_EXTERN(overlay_gpio_04b);
2884 OVERLAY_INFO_EXTERN(overlay_bad_add_dup_node);
2885 OVERLAY_INFO_EXTERN(overlay_bad_add_dup_prop);
2886 OVERLAY_INFO_EXTERN(overlay_bad_phandle);
2887 OVERLAY_INFO_EXTERN(overlay_bad_symbol);
2888
2889 /* entries found by name */
2890 static struct overlay_info overlays[] = {
2891         OVERLAY_INFO(overlay_base, -9999),
2892         OVERLAY_INFO(overlay, 0),
2893         OVERLAY_INFO(overlay_0, 0),
2894         OVERLAY_INFO(overlay_1, 0),
2895         OVERLAY_INFO(overlay_2, 0),
2896         OVERLAY_INFO(overlay_3, 0),
2897         OVERLAY_INFO(overlay_4, 0),
2898         OVERLAY_INFO(overlay_5, 0),
2899         OVERLAY_INFO(overlay_6, 0),
2900         OVERLAY_INFO(overlay_7, 0),
2901         OVERLAY_INFO(overlay_8, 0),
2902         OVERLAY_INFO(overlay_9, 0),
2903         OVERLAY_INFO(overlay_10, 0),
2904         OVERLAY_INFO(overlay_11, 0),
2905         OVERLAY_INFO(overlay_12, 0),
2906         OVERLAY_INFO(overlay_13, 0),
2907         OVERLAY_INFO(overlay_15, 0),
2908         OVERLAY_INFO(overlay_gpio_01, 0),
2909         OVERLAY_INFO(overlay_gpio_02a, 0),
2910         OVERLAY_INFO(overlay_gpio_02b, 0),
2911         OVERLAY_INFO(overlay_gpio_03, 0),
2912         OVERLAY_INFO(overlay_gpio_04a, 0),
2913         OVERLAY_INFO(overlay_gpio_04b, 0),
2914         OVERLAY_INFO(overlay_bad_add_dup_node, -EINVAL),
2915         OVERLAY_INFO(overlay_bad_add_dup_prop, -EINVAL),
2916         OVERLAY_INFO(overlay_bad_phandle, -EINVAL),
2917         OVERLAY_INFO(overlay_bad_symbol, -EINVAL),
2918         /* end marker */
2919         {.dtb_begin = NULL, .dtb_end = NULL, .expected_result = 0, .name = NULL}
2920 };
2921
2922 static struct device_node *overlay_base_root;
2923
2924 static void * __init dt_alloc_memory(u64 size, u64 align)
2925 {
2926         void *ptr = memblock_alloc(size, align);
2927
2928         if (!ptr)
2929                 panic("%s: Failed to allocate %llu bytes align=0x%llx\n",
2930                       __func__, size, align);
2931
2932         return ptr;
2933 }
2934
2935 /*
2936  * Create base device tree for the overlay unittest.
2937  *
2938  * This is called from very early boot code.
2939  *
2940  * Do as much as possible the same way as done in __unflatten_device_tree
2941  * and other early boot steps for the normal FDT so that the overlay base
2942  * unflattened tree will have the same characteristics as the real tree
2943  * (such as having memory allocated by the early allocator).  The goal
2944  * is to test "the real thing" as much as possible, and test "test setup
2945  * code" as little as possible.
2946  *
2947  * Have to stop before resolving phandles, because that uses kmalloc.
2948  */
2949 void __init unittest_unflatten_overlay_base(void)
2950 {
2951         struct overlay_info *info;
2952         u32 data_size;
2953         void *new_fdt;
2954         u32 size;
2955         int found = 0;
2956         const char *overlay_name = "overlay_base";
2957
2958         for (info = overlays; info && info->name; info++) {
2959                 if (!strcmp(overlay_name, info->name)) {
2960                         found = 1;
2961                         break;
2962                 }
2963         }
2964         if (!found) {
2965                 pr_err("no overlay data for %s\n", overlay_name);
2966                 return;
2967         }
2968
2969         info = &overlays[0];
2970
2971         if (info->expected_result != -9999) {
2972                 pr_err("No dtb 'overlay_base' to attach\n");
2973                 return;
2974         }
2975
2976         data_size = info->dtb_end - info->dtb_begin;
2977         if (!data_size) {
2978                 pr_err("No dtb 'overlay_base' to attach\n");
2979                 return;
2980         }
2981
2982         size = fdt_totalsize(info->dtb_begin);
2983         if (size != data_size) {
2984                 pr_err("dtb 'overlay_base' header totalsize != actual size");
2985                 return;
2986         }
2987
2988         new_fdt = dt_alloc_memory(size, roundup_pow_of_two(FDT_V17_SIZE));
2989         if (!new_fdt) {
2990                 pr_err("alloc for dtb 'overlay_base' failed");
2991                 return;
2992         }
2993
2994         memcpy(new_fdt, info->dtb_begin, size);
2995
2996         __unflatten_device_tree(new_fdt, NULL, &overlay_base_root,
2997                                 dt_alloc_memory, true);
2998 }
2999
3000 /*
3001  * The purpose of of_unittest_overlay_data_add is to add an
3002  * overlay in the normal fashion.  This is a test of the whole
3003  * picture, instead of testing individual elements.
3004  *
3005  * A secondary purpose is to be able to verify that the contents of
3006  * /proc/device-tree/ contains the updated structure and values from
3007  * the overlay.  That must be verified separately in user space.
3008  *
3009  * Return 0 on unexpected error.
3010  */
3011 static int __init overlay_data_apply(const char *overlay_name, int *overlay_id)
3012 {
3013         struct overlay_info *info;
3014         int found = 0;
3015         int ret;
3016         u32 size;
3017
3018         for (info = overlays; info && info->name; info++) {
3019                 if (!strcmp(overlay_name, info->name)) {
3020                         found = 1;
3021                         break;
3022                 }
3023         }
3024         if (!found) {
3025                 pr_err("no overlay data for %s\n", overlay_name);
3026                 return 0;
3027         }
3028
3029         size = info->dtb_end - info->dtb_begin;
3030         if (!size)
3031                 pr_err("no overlay data for %s\n", overlay_name);
3032
3033         ret = of_overlay_fdt_apply(info->dtb_begin, size, &info->overlay_id);
3034         if (overlay_id)
3035                 *overlay_id = info->overlay_id;
3036         if (ret < 0)
3037                 goto out;
3038
3039         pr_debug("%s applied\n", overlay_name);
3040
3041 out:
3042         if (ret != info->expected_result)
3043                 pr_err("of_overlay_fdt_apply() expected %d, ret=%d, %s\n",
3044                        info->expected_result, ret, overlay_name);
3045
3046         return (ret == info->expected_result);
3047 }
3048
3049 /*
3050  * The purpose of of_unittest_overlay_high_level is to add an overlay
3051  * in the normal fashion.  This is a test of the whole picture,
3052  * instead of individual elements.
3053  *
3054  * The first part of the function is _not_ normal overlay usage; it is
3055  * finishing splicing the base overlay device tree into the live tree.
3056  */
3057 static __init void of_unittest_overlay_high_level(void)
3058 {
3059         struct device_node *last_sibling;
3060         struct device_node *np;
3061         struct device_node *of_symbols;
3062         struct device_node *overlay_base_symbols;
3063         struct device_node **pprev;
3064         struct property *prop;
3065         int ret;
3066
3067         if (!overlay_base_root) {
3068                 unittest(0, "overlay_base_root not initialized\n");
3069                 return;
3070         }
3071
3072         /*
3073          * Could not fixup phandles in unittest_unflatten_overlay_base()
3074          * because kmalloc() was not yet available.
3075          */
3076         of_overlay_mutex_lock();
3077         of_resolve_phandles(overlay_base_root);
3078         of_overlay_mutex_unlock();
3079
3080
3081         /*
3082          * do not allow overlay_base to duplicate any node already in
3083          * tree, this greatly simplifies the code
3084          */
3085
3086         /*
3087          * remove overlay_base_root node "__local_fixups", after
3088          * being used by of_resolve_phandles()
3089          */
3090         pprev = &overlay_base_root->child;
3091         for (np = overlay_base_root->child; np; np = np->sibling) {
3092                 if (of_node_name_eq(np, "__local_fixups__")) {
3093                         *pprev = np->sibling;
3094                         break;
3095                 }
3096                 pprev = &np->sibling;
3097         }
3098
3099         /* remove overlay_base_root node "__symbols__" if in live tree */
3100         of_symbols = of_get_child_by_name(of_root, "__symbols__");
3101         if (of_symbols) {
3102                 /* will have to graft properties from node into live tree */
3103                 pprev = &overlay_base_root->child;
3104                 for (np = overlay_base_root->child; np; np = np->sibling) {
3105                         if (of_node_name_eq(np, "__symbols__")) {
3106                                 overlay_base_symbols = np;
3107                                 *pprev = np->sibling;
3108                                 break;
3109                         }
3110                         pprev = &np->sibling;
3111                 }
3112         }
3113
3114         for_each_child_of_node(overlay_base_root, np) {
3115                 struct device_node *base_child;
3116                 for_each_child_of_node(of_root, base_child) {
3117                         if (!strcmp(np->full_name, base_child->full_name)) {
3118                                 unittest(0, "illegal node name in overlay_base %pOFn",
3119                                          np);
3120                                 return;
3121                         }
3122                 }
3123         }
3124
3125         /*
3126          * overlay 'overlay_base' is not allowed to have root
3127          * properties, so only need to splice nodes into main device tree.
3128          *
3129          * root node of *overlay_base_root will not be freed, it is lost
3130          * memory.
3131          */
3132
3133         for (np = overlay_base_root->child; np; np = np->sibling)
3134                 np->parent = of_root;
3135
3136         mutex_lock(&of_mutex);
3137
3138         for (last_sibling = np = of_root->child; np; np = np->sibling)
3139                 last_sibling = np;
3140
3141         if (last_sibling)
3142                 last_sibling->sibling = overlay_base_root->child;
3143         else
3144                 of_root->child = overlay_base_root->child;
3145
3146         for_each_of_allnodes_from(overlay_base_root, np)
3147                 __of_attach_node_sysfs(np);
3148
3149         if (of_symbols) {
3150                 struct property *new_prop;
3151                 for_each_property_of_node(overlay_base_symbols, prop) {
3152
3153                         new_prop = __of_prop_dup(prop, GFP_KERNEL);
3154                         if (!new_prop) {
3155                                 unittest(0, "__of_prop_dup() of '%s' from overlay_base node __symbols__",
3156                                          prop->name);
3157                                 goto err_unlock;
3158                         }
3159                         if (__of_add_property(of_symbols, new_prop)) {
3160                                 kfree(new_prop->name);
3161                                 kfree(new_prop->value);
3162                                 kfree(new_prop);
3163                                 /* "name" auto-generated by unflatten */
3164                                 if (!strcmp(prop->name, "name"))
3165                                         continue;
3166                                 unittest(0, "duplicate property '%s' in overlay_base node __symbols__",
3167                                          prop->name);
3168                                 goto err_unlock;
3169                         }
3170                         if (__of_add_property_sysfs(of_symbols, new_prop)) {
3171                                 unittest(0, "unable to add property '%s' in overlay_base node __symbols__ to sysfs",
3172                                          prop->name);
3173                                 goto err_unlock;
3174                         }
3175                 }
3176         }
3177
3178         mutex_unlock(&of_mutex);
3179
3180
3181         /* now do the normal overlay usage test */
3182
3183         EXPECT_BEGIN(KERN_ERR,
3184                      "OF: overlay: WARNING: memory leak will occur if overlay removed, property: /testcase-data-2/substation@100/status");
3185         EXPECT_BEGIN(KERN_ERR,
3186                      "OF: overlay: WARNING: memory leak will occur if overlay removed, property: /testcase-data-2/fairway-1/status");
3187         EXPECT_BEGIN(KERN_ERR,
3188                      "OF: overlay: WARNING: memory leak will occur if overlay removed, property: /testcase-data-2/fairway-1/ride@100/track@30/incline-up");
3189         EXPECT_BEGIN(KERN_ERR,
3190                      "OF: overlay: WARNING: memory leak will occur if overlay removed, property: /testcase-data-2/fairway-1/ride@100/track@40/incline-up");
3191         EXPECT_BEGIN(KERN_ERR,
3192                      "OF: overlay: WARNING: memory leak will occur if overlay removed, property: /testcase-data-2/lights@40000/status");
3193         EXPECT_BEGIN(KERN_ERR,
3194                      "OF: overlay: WARNING: memory leak will occur if overlay removed, property: /testcase-data-2/lights@40000/color");
3195         EXPECT_BEGIN(KERN_ERR,
3196                      "OF: overlay: WARNING: memory leak will occur if overlay removed, property: /testcase-data-2/lights@40000/rate");
3197         EXPECT_BEGIN(KERN_ERR,
3198                      "OF: overlay: WARNING: memory leak will occur if overlay removed, property: /__symbols__/hvac_2");
3199         EXPECT_BEGIN(KERN_ERR,
3200                      "OF: overlay: WARNING: memory leak will occur if overlay removed, property: /__symbols__/ride_200");
3201         EXPECT_BEGIN(KERN_ERR,
3202                      "OF: overlay: WARNING: memory leak will occur if overlay removed, property: /__symbols__/ride_200_left");
3203         EXPECT_BEGIN(KERN_ERR,
3204                      "OF: overlay: WARNING: memory leak will occur if overlay removed, property: /__symbols__/ride_200_right");
3205
3206         ret = overlay_data_apply("overlay", NULL);
3207
3208         EXPECT_END(KERN_ERR,
3209                    "OF: overlay: WARNING: memory leak will occur if overlay removed, property: /__symbols__/ride_200_right");
3210         EXPECT_END(KERN_ERR,
3211                    "OF: overlay: WARNING: memory leak will occur if overlay removed, property: /__symbols__/ride_200_left");
3212         EXPECT_END(KERN_ERR,
3213                    "OF: overlay: WARNING: memory leak will occur if overlay removed, property: /__symbols__/ride_200");
3214         EXPECT_END(KERN_ERR,
3215                    "OF: overlay: WARNING: memory leak will occur if overlay removed, property: /__symbols__/hvac_2");
3216         EXPECT_END(KERN_ERR,
3217                    "OF: overlay: WARNING: memory leak will occur if overlay removed, property: /testcase-data-2/lights@40000/rate");
3218         EXPECT_END(KERN_ERR,
3219                    "OF: overlay: WARNING: memory leak will occur if overlay removed, property: /testcase-data-2/lights@40000/color");
3220         EXPECT_END(KERN_ERR,
3221                    "OF: overlay: WARNING: memory leak will occur if overlay removed, property: /testcase-data-2/lights@40000/status");
3222         EXPECT_END(KERN_ERR,
3223                    "OF: overlay: WARNING: memory leak will occur if overlay removed, property: /testcase-data-2/fairway-1/ride@100/track@40/incline-up");
3224         EXPECT_END(KERN_ERR,
3225                    "OF: overlay: WARNING: memory leak will occur if overlay removed, property: /testcase-data-2/fairway-1/ride@100/track@30/incline-up");
3226         EXPECT_END(KERN_ERR,
3227                    "OF: overlay: WARNING: memory leak will occur if overlay removed, property: /testcase-data-2/fairway-1/status");
3228         EXPECT_END(KERN_ERR,
3229                    "OF: overlay: WARNING: memory leak will occur if overlay removed, property: /testcase-data-2/substation@100/status");
3230
3231         unittest(ret, "Adding overlay 'overlay' failed\n");
3232
3233         EXPECT_BEGIN(KERN_ERR,
3234                      "OF: overlay: ERROR: multiple fragments add and/or delete node /testcase-data-2/substation@100/motor-1/controller");
3235         EXPECT_BEGIN(KERN_ERR,
3236                      "OF: overlay: ERROR: multiple fragments add, update, and/or delete property /testcase-data-2/substation@100/motor-1/controller/name");
3237
3238         unittest(overlay_data_apply("overlay_bad_add_dup_node", NULL),
3239                  "Adding overlay 'overlay_bad_add_dup_node' failed\n");
3240
3241         EXPECT_END(KERN_ERR,
3242                    "OF: overlay: ERROR: multiple fragments add, update, and/or delete property /testcase-data-2/substation@100/motor-1/controller/name");
3243         EXPECT_END(KERN_ERR,
3244                    "OF: overlay: ERROR: multiple fragments add and/or delete node /testcase-data-2/substation@100/motor-1/controller");
3245
3246         EXPECT_BEGIN(KERN_ERR,
3247                      "OF: overlay: ERROR: multiple fragments add and/or delete node /testcase-data-2/substation@100/motor-1/electric");
3248         EXPECT_BEGIN(KERN_ERR,
3249                      "OF: overlay: ERROR: multiple fragments add, update, and/or delete property /testcase-data-2/substation@100/motor-1/electric/rpm_avail");
3250         EXPECT_BEGIN(KERN_ERR,
3251                      "OF: overlay: ERROR: multiple fragments add, update, and/or delete property /testcase-data-2/substation@100/motor-1/electric/name");
3252
3253         unittest(overlay_data_apply("overlay_bad_add_dup_prop", NULL),
3254                  "Adding overlay 'overlay_bad_add_dup_prop' failed\n");
3255
3256         EXPECT_END(KERN_ERR,
3257                      "OF: overlay: ERROR: multiple fragments add, update, and/or delete property /testcase-data-2/substation@100/motor-1/electric/name");
3258         EXPECT_END(KERN_ERR,
3259                      "OF: overlay: ERROR: multiple fragments add, update, and/or delete property /testcase-data-2/substation@100/motor-1/electric/rpm_avail");
3260         EXPECT_END(KERN_ERR,
3261                      "OF: overlay: ERROR: multiple fragments add and/or delete node /testcase-data-2/substation@100/motor-1/electric");
3262
3263         unittest(overlay_data_apply("overlay_bad_phandle", NULL),
3264                  "Adding overlay 'overlay_bad_phandle' failed\n");
3265
3266         unittest(overlay_data_apply("overlay_bad_symbol", NULL),
3267                  "Adding overlay 'overlay_bad_symbol' failed\n");
3268
3269         return;
3270
3271 err_unlock:
3272         mutex_unlock(&of_mutex);
3273 }
3274
3275 #else
3276
3277 static inline __init void of_unittest_overlay_high_level(void) {}
3278
3279 #endif
3280
3281 static int __init of_unittest(void)
3282 {
3283         struct device_node *np;
3284         int res;
3285
3286         pr_info("start of unittest - you will see error messages\n");
3287
3288         /* adding data for unittest */
3289
3290         if (IS_ENABLED(CONFIG_UML))
3291                 unittest_unflatten_overlay_base();
3292
3293         res = unittest_data_add();
3294         if (res)
3295                 return res;
3296         if (!of_aliases)
3297                 of_aliases = of_find_node_by_path("/aliases");
3298
3299         np = of_find_node_by_path("/testcase-data/phandle-tests/consumer-a");
3300         if (!np) {
3301                 pr_info("No testcase data in device tree; not running tests\n");
3302                 return 0;
3303         }
3304         of_node_put(np);
3305
3306         of_unittest_check_tree_linkage();
3307         of_unittest_check_phandles();
3308         of_unittest_find_node_by_name();
3309         of_unittest_dynamic();
3310         of_unittest_parse_phandle_with_args();
3311         of_unittest_parse_phandle_with_args_map();
3312         of_unittest_printf();
3313         of_unittest_property_string();
3314         of_unittest_property_copy();
3315         of_unittest_changeset();
3316         of_unittest_parse_interrupts();
3317         of_unittest_parse_interrupts_extended();
3318         of_unittest_dma_get_max_cpu_address();
3319         of_unittest_parse_dma_ranges();
3320         of_unittest_pci_dma_ranges();
3321         of_unittest_match_node();
3322         of_unittest_platform_populate();
3323         of_unittest_overlay();
3324
3325         /* Double check linkage after removing testcase data */
3326         of_unittest_check_tree_linkage();
3327
3328         of_unittest_overlay_high_level();
3329
3330         pr_info("end of unittest - %i passed, %i failed\n",
3331                 unittest_results.passed, unittest_results.failed);
3332
3333         return 0;
3334 }
3335 late_initcall(of_unittest);