GNU Linux-libre 6.8.7-gnu
[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 #include <linux/pci.h>
26 #include <linux/kernel.h>
27
28 #include <linux/i2c.h>
29 #include <linux/i2c-mux.h>
30 #include <linux/gpio/driver.h>
31
32 #include <linux/bitops.h>
33
34 #include "of_private.h"
35
36 static struct unittest_results {
37         int passed;
38         int failed;
39 } unittest_results;
40
41 #define unittest(result, fmt, ...) ({ \
42         bool failed = !(result); \
43         if (failed) { \
44                 unittest_results.failed++; \
45                 pr_err("FAIL %s():%i " fmt, __func__, __LINE__, ##__VA_ARGS__); \
46         } else { \
47                 unittest_results.passed++; \
48                 pr_info("pass %s():%i\n", __func__, __LINE__); \
49         } \
50         failed; \
51 })
52
53 #ifdef CONFIG_OF_KOBJ
54 #define OF_KREF_READ(NODE) kref_read(&(NODE)->kobj.kref)
55 #else
56 #define OF_KREF_READ(NODE) 1
57 #endif
58
59 /*
60  * Expected message may have a message level other than KERN_INFO.
61  * Print the expected message only if the current loglevel will allow
62  * the actual message to print.
63  *
64  * Do not use EXPECT_BEGIN(), EXPECT_END(), EXPECT_NOT_BEGIN(), or
65  * EXPECT_NOT_END() to report messages expected to be reported or not
66  * reported by pr_debug().
67  */
68 #define EXPECT_BEGIN(level, fmt, ...) \
69         printk(level pr_fmt("EXPECT \\ : ") fmt, ##__VA_ARGS__)
70
71 #define EXPECT_END(level, fmt, ...) \
72         printk(level pr_fmt("EXPECT / : ") fmt, ##__VA_ARGS__)
73
74 #define EXPECT_NOT_BEGIN(level, fmt, ...) \
75         printk(level pr_fmt("EXPECT_NOT \\ : ") fmt, ##__VA_ARGS__)
76
77 #define EXPECT_NOT_END(level, fmt, ...) \
78         printk(level pr_fmt("EXPECT_NOT / : ") fmt, ##__VA_ARGS__)
79
80 static void __init of_unittest_find_node_by_name(void)
81 {
82         struct device_node *np;
83         const char *options, *name;
84
85         np = of_find_node_by_path("/testcase-data");
86         name = kasprintf(GFP_KERNEL, "%pOF", np);
87         unittest(np && name && !strcmp("/testcase-data", name),
88                 "find /testcase-data failed\n");
89         of_node_put(np);
90         kfree(name);
91
92         /* Test if trailing '/' works */
93         np = of_find_node_by_path("/testcase-data/");
94         unittest(!np, "trailing '/' on /testcase-data/ should fail\n");
95
96         np = of_find_node_by_path("/testcase-data/phandle-tests/consumer-a");
97         name = kasprintf(GFP_KERNEL, "%pOF", np);
98         unittest(np && name && !strcmp("/testcase-data/phandle-tests/consumer-a", name),
99                 "find /testcase-data/phandle-tests/consumer-a failed\n");
100         of_node_put(np);
101         kfree(name);
102
103         np = of_find_node_by_path("testcase-alias");
104         name = kasprintf(GFP_KERNEL, "%pOF", np);
105         unittest(np && name && !strcmp("/testcase-data", name),
106                 "find testcase-alias failed\n");
107         of_node_put(np);
108         kfree(name);
109
110         /* Test if trailing '/' works on aliases */
111         np = of_find_node_by_path("testcase-alias/");
112         unittest(!np, "trailing '/' on testcase-alias/ should fail\n");
113
114         np = of_find_node_by_path("testcase-alias/phandle-tests/consumer-a");
115         name = kasprintf(GFP_KERNEL, "%pOF", np);
116         unittest(np && name && !strcmp("/testcase-data/phandle-tests/consumer-a", name),
117                 "find testcase-alias/phandle-tests/consumer-a failed\n");
118         of_node_put(np);
119         kfree(name);
120
121         np = of_find_node_by_path("/testcase-data/missing-path");
122         unittest(!np, "non-existent path returned node %pOF\n", np);
123         of_node_put(np);
124
125         np = of_find_node_by_path("missing-alias");
126         unittest(!np, "non-existent alias returned node %pOF\n", np);
127         of_node_put(np);
128
129         np = of_find_node_by_path("testcase-alias/missing-path");
130         unittest(!np, "non-existent alias with relative path returned node %pOF\n", np);
131         of_node_put(np);
132
133         np = of_find_node_opts_by_path("/testcase-data:testoption", &options);
134         unittest(np && !strcmp("testoption", options),
135                  "option path test failed\n");
136         of_node_put(np);
137
138         np = of_find_node_opts_by_path("/testcase-data:test/option", &options);
139         unittest(np && !strcmp("test/option", options),
140                  "option path test, subcase #1 failed\n");
141         of_node_put(np);
142
143         np = of_find_node_opts_by_path("/testcase-data/testcase-device1:test/option", &options);
144         unittest(np && !strcmp("test/option", options),
145                  "option path test, subcase #2 failed\n");
146         of_node_put(np);
147
148         np = of_find_node_opts_by_path("/testcase-data:testoption", NULL);
149         unittest(np, "NULL option path test failed\n");
150         of_node_put(np);
151
152         np = of_find_node_opts_by_path("testcase-alias:testaliasoption",
153                                        &options);
154         unittest(np && !strcmp("testaliasoption", options),
155                  "option alias path test failed\n");
156         of_node_put(np);
157
158         np = of_find_node_opts_by_path("testcase-alias:test/alias/option",
159                                        &options);
160         unittest(np && !strcmp("test/alias/option", options),
161                  "option alias path test, subcase #1 failed\n");
162         of_node_put(np);
163
164         np = of_find_node_opts_by_path("testcase-alias:testaliasoption", NULL);
165         unittest(np, "NULL option alias path test failed\n");
166         of_node_put(np);
167
168         options = "testoption";
169         np = of_find_node_opts_by_path("testcase-alias", &options);
170         unittest(np && !options, "option clearing test failed\n");
171         of_node_put(np);
172
173         options = "testoption";
174         np = of_find_node_opts_by_path("/", &options);
175         unittest(np && !options, "option clearing root node test failed\n");
176         of_node_put(np);
177 }
178
179 static void __init of_unittest_dynamic(void)
180 {
181         struct device_node *np;
182         struct property *prop;
183
184         np = of_find_node_by_path("/testcase-data");
185         if (!np) {
186                 pr_err("missing testcase data\n");
187                 return;
188         }
189
190         /* Array of 4 properties for the purpose of testing */
191         prop = kcalloc(4, sizeof(*prop), GFP_KERNEL);
192         if (!prop) {
193                 unittest(0, "kzalloc() failed\n");
194                 return;
195         }
196
197         /* Add a new property - should pass*/
198         prop->name = "new-property";
199         prop->value = "new-property-data";
200         prop->length = strlen(prop->value) + 1;
201         unittest(of_add_property(np, prop) == 0, "Adding a new property failed\n");
202
203         /* Try to add an existing property - should fail */
204         prop++;
205         prop->name = "new-property";
206         prop->value = "new-property-data-should-fail";
207         prop->length = strlen(prop->value) + 1;
208         unittest(of_add_property(np, prop) != 0,
209                  "Adding an existing property should have failed\n");
210
211         /* Try to modify an existing property - should pass */
212         prop->value = "modify-property-data-should-pass";
213         prop->length = strlen(prop->value) + 1;
214         unittest(of_update_property(np, prop) == 0,
215                  "Updating an existing property should have passed\n");
216
217         /* Try to modify non-existent property - should pass*/
218         prop++;
219         prop->name = "modify-property";
220         prop->value = "modify-missing-property-data-should-pass";
221         prop->length = strlen(prop->value) + 1;
222         unittest(of_update_property(np, prop) == 0,
223                  "Updating a missing property should have passed\n");
224
225         /* Remove property - should pass */
226         unittest(of_remove_property(np, prop) == 0,
227                  "Removing a property should have passed\n");
228
229         /* Adding very large property - should pass */
230         prop++;
231         prop->name = "large-property-PAGE_SIZEx8";
232         prop->length = PAGE_SIZE * 8;
233         prop->value = kzalloc(prop->length, GFP_KERNEL);
234         unittest(prop->value != NULL, "Unable to allocate large buffer\n");
235         if (prop->value)
236                 unittest(of_add_property(np, prop) == 0,
237                          "Adding a large property should have passed\n");
238 }
239
240 static int __init of_unittest_check_node_linkage(struct device_node *np)
241 {
242         struct device_node *child;
243         int count = 0, rc;
244
245         for_each_child_of_node(np, child) {
246                 if (child->parent != np) {
247                         pr_err("Child node %pOFn links to wrong parent %pOFn\n",
248                                  child, np);
249                         rc = -EINVAL;
250                         goto put_child;
251                 }
252
253                 rc = of_unittest_check_node_linkage(child);
254                 if (rc < 0)
255                         goto put_child;
256                 count += rc;
257         }
258
259         return count + 1;
260 put_child:
261         of_node_put(child);
262         return rc;
263 }
264
265 static void __init of_unittest_check_tree_linkage(void)
266 {
267         struct device_node *np;
268         int allnode_count = 0, child_count;
269
270         if (!of_root)
271                 return;
272
273         for_each_of_allnodes(np)
274                 allnode_count++;
275         child_count = of_unittest_check_node_linkage(of_root);
276
277         unittest(child_count > 0, "Device node data structure is corrupted\n");
278         unittest(child_count == allnode_count,
279                  "allnodes list size (%i) doesn't match sibling lists size (%i)\n",
280                  allnode_count, child_count);
281         pr_debug("allnodes list size (%i); sibling lists size (%i)\n", allnode_count, child_count);
282 }
283
284 static void __init of_unittest_printf_one(struct device_node *np, const char *fmt,
285                                           const char *expected)
286 {
287         unsigned char *buf;
288         int buf_size;
289         int size, i;
290
291         buf_size = strlen(expected) + 10;
292         buf = kmalloc(buf_size, GFP_KERNEL);
293         if (!buf)
294                 return;
295
296         /* Baseline; check conversion with a large size limit */
297         memset(buf, 0xff, buf_size);
298         size = snprintf(buf, buf_size - 2, fmt, np);
299
300         /* use strcmp() instead of strncmp() here to be absolutely sure strings match */
301         unittest((strcmp(buf, expected) == 0) && (buf[size+1] == 0xff),
302                 "sprintf failed; fmt='%s' expected='%s' rslt='%s'\n",
303                 fmt, expected, buf);
304
305         /* Make sure length limits work */
306         size++;
307         for (i = 0; i < 2; i++, size--) {
308                 /* Clear the buffer, and make sure it works correctly still */
309                 memset(buf, 0xff, buf_size);
310                 snprintf(buf, size+1, fmt, np);
311                 unittest(strncmp(buf, expected, size) == 0 && (buf[size+1] == 0xff),
312                         "snprintf failed; size=%i fmt='%s' expected='%s' rslt='%s'\n",
313                         size, fmt, expected, buf);
314         }
315         kfree(buf);
316 }
317
318 static void __init of_unittest_printf(void)
319 {
320         struct device_node *np;
321         const char *full_name = "/testcase-data/platform-tests/test-device@1/dev@100";
322         char phandle_str[16] = "";
323
324         np = of_find_node_by_path(full_name);
325         if (!np) {
326                 unittest(np, "testcase data missing\n");
327                 return;
328         }
329
330         num_to_str(phandle_str, sizeof(phandle_str), np->phandle, 0);
331
332         of_unittest_printf_one(np, "%pOF",  full_name);
333         of_unittest_printf_one(np, "%pOFf", full_name);
334         of_unittest_printf_one(np, "%pOFn", "dev");
335         of_unittest_printf_one(np, "%2pOFn", "dev");
336         of_unittest_printf_one(np, "%5pOFn", "  dev");
337         of_unittest_printf_one(np, "%pOFnc", "dev:test-sub-device");
338         of_unittest_printf_one(np, "%pOFp", phandle_str);
339         of_unittest_printf_one(np, "%pOFP", "dev@100");
340         of_unittest_printf_one(np, "ABC %pOFP ABC", "ABC dev@100 ABC");
341         of_unittest_printf_one(np, "%10pOFP", "   dev@100");
342         of_unittest_printf_one(np, "%-10pOFP", "dev@100   ");
343         of_unittest_printf_one(of_root, "%pOFP", "/");
344         of_unittest_printf_one(np, "%pOFF", "----");
345         of_unittest_printf_one(np, "%pOFPF", "dev@100:----");
346         of_unittest_printf_one(np, "%pOFPFPc", "dev@100:----:dev@100:test-sub-device");
347         of_unittest_printf_one(np, "%pOFc", "test-sub-device");
348         of_unittest_printf_one(np, "%pOFC",
349                         "\"test-sub-device\",\"test-compat2\",\"test-compat3\"");
350 }
351
352 struct node_hash {
353         struct hlist_node node;
354         struct device_node *np;
355 };
356
357 static DEFINE_HASHTABLE(phandle_ht, 8);
358 static void __init of_unittest_check_phandles(void)
359 {
360         struct device_node *np;
361         struct node_hash *nh;
362         struct hlist_node *tmp;
363         int i, dup_count = 0, phandle_count = 0;
364
365         for_each_of_allnodes(np) {
366                 if (!np->phandle)
367                         continue;
368
369                 hash_for_each_possible(phandle_ht, nh, node, np->phandle) {
370                         if (nh->np->phandle == np->phandle) {
371                                 pr_info("Duplicate phandle! %i used by %pOF and %pOF\n",
372                                         np->phandle, nh->np, np);
373                                 dup_count++;
374                                 break;
375                         }
376                 }
377
378                 nh = kzalloc(sizeof(*nh), GFP_KERNEL);
379                 if (!nh)
380                         return;
381
382                 nh->np = np;
383                 hash_add(phandle_ht, &nh->node, np->phandle);
384                 phandle_count++;
385         }
386         unittest(dup_count == 0, "Found %i duplicates in %i phandles\n",
387                  dup_count, phandle_count);
388
389         /* Clean up */
390         hash_for_each_safe(phandle_ht, i, tmp, nh, node) {
391                 hash_del(&nh->node);
392                 kfree(nh);
393         }
394 }
395
396 static void __init of_unittest_parse_phandle_with_args(void)
397 {
398         struct device_node *np;
399         struct of_phandle_args args;
400         int i, rc;
401
402         np = of_find_node_by_path("/testcase-data/phandle-tests/consumer-a");
403         if (!np) {
404                 pr_err("missing testcase data\n");
405                 return;
406         }
407
408         rc = of_count_phandle_with_args(np, "phandle-list", "#phandle-cells");
409         unittest(rc == 7, "of_count_phandle_with_args() returned %i, expected 7\n", rc);
410
411         for (i = 0; i < 8; i++) {
412                 bool passed = true;
413
414                 memset(&args, 0, sizeof(args));
415                 rc = of_parse_phandle_with_args(np, "phandle-list",
416                                                 "#phandle-cells", i, &args);
417
418                 /* Test the values from tests-phandle.dtsi */
419                 switch (i) {
420                 case 0:
421                         passed &= !rc;
422                         passed &= (args.args_count == 1);
423                         passed &= (args.args[0] == (i + 1));
424                         break;
425                 case 1:
426                         passed &= !rc;
427                         passed &= (args.args_count == 2);
428                         passed &= (args.args[0] == (i + 1));
429                         passed &= (args.args[1] == 0);
430                         break;
431                 case 2:
432                         passed &= (rc == -ENOENT);
433                         break;
434                 case 3:
435                         passed &= !rc;
436                         passed &= (args.args_count == 3);
437                         passed &= (args.args[0] == (i + 1));
438                         passed &= (args.args[1] == 4);
439                         passed &= (args.args[2] == 3);
440                         break;
441                 case 4:
442                         passed &= !rc;
443                         passed &= (args.args_count == 2);
444                         passed &= (args.args[0] == (i + 1));
445                         passed &= (args.args[1] == 100);
446                         break;
447                 case 5:
448                         passed &= !rc;
449                         passed &= (args.args_count == 0);
450                         break;
451                 case 6:
452                         passed &= !rc;
453                         passed &= (args.args_count == 1);
454                         passed &= (args.args[0] == (i + 1));
455                         break;
456                 case 7:
457                         passed &= (rc == -ENOENT);
458                         break;
459                 default:
460                         passed = false;
461                 }
462
463                 unittest(passed, "index %i - data error on node %pOF rc=%i\n",
464                          i, args.np, rc);
465
466                 if (rc == 0)
467                         of_node_put(args.np);
468         }
469
470         /* Check for missing list property */
471         memset(&args, 0, sizeof(args));
472         rc = of_parse_phandle_with_args(np, "phandle-list-missing",
473                                         "#phandle-cells", 0, &args);
474         unittest(rc == -ENOENT, "expected:%i got:%i\n", -ENOENT, rc);
475         rc = of_count_phandle_with_args(np, "phandle-list-missing",
476                                         "#phandle-cells");
477         unittest(rc == -ENOENT, "expected:%i got:%i\n", -ENOENT, rc);
478
479         /* Check for missing cells property */
480         memset(&args, 0, sizeof(args));
481
482         EXPECT_BEGIN(KERN_INFO,
483                      "OF: /testcase-data/phandle-tests/consumer-a: could not get #phandle-cells-missing for /testcase-data/phandle-tests/provider1");
484
485         rc = of_parse_phandle_with_args(np, "phandle-list",
486                                         "#phandle-cells-missing", 0, &args);
487
488         EXPECT_END(KERN_INFO,
489                    "OF: /testcase-data/phandle-tests/consumer-a: could not get #phandle-cells-missing for /testcase-data/phandle-tests/provider1");
490
491         unittest(rc == -EINVAL, "expected:%i got:%i\n", -EINVAL, rc);
492
493         EXPECT_BEGIN(KERN_INFO,
494                      "OF: /testcase-data/phandle-tests/consumer-a: could not get #phandle-cells-missing for /testcase-data/phandle-tests/provider1");
495
496         rc = of_count_phandle_with_args(np, "phandle-list",
497                                         "#phandle-cells-missing");
498
499         EXPECT_END(KERN_INFO,
500                    "OF: /testcase-data/phandle-tests/consumer-a: could not get #phandle-cells-missing for /testcase-data/phandle-tests/provider1");
501
502         unittest(rc == -EINVAL, "expected:%i got:%i\n", -EINVAL, rc);
503
504         /* Check for bad phandle in list */
505         memset(&args, 0, sizeof(args));
506
507         EXPECT_BEGIN(KERN_INFO,
508                      "OF: /testcase-data/phandle-tests/consumer-a: could not find phandle");
509
510         rc = of_parse_phandle_with_args(np, "phandle-list-bad-phandle",
511                                         "#phandle-cells", 0, &args);
512
513         EXPECT_END(KERN_INFO,
514                    "OF: /testcase-data/phandle-tests/consumer-a: could not find phandle");
515
516         unittest(rc == -EINVAL, "expected:%i got:%i\n", -EINVAL, rc);
517
518         EXPECT_BEGIN(KERN_INFO,
519                      "OF: /testcase-data/phandle-tests/consumer-a: could not find phandle");
520
521         rc = of_count_phandle_with_args(np, "phandle-list-bad-phandle",
522                                         "#phandle-cells");
523
524         EXPECT_END(KERN_INFO,
525                    "OF: /testcase-data/phandle-tests/consumer-a: could not find phandle");
526
527         unittest(rc == -EINVAL, "expected:%i got:%i\n", -EINVAL, rc);
528
529         /* Check for incorrectly formed argument list */
530         memset(&args, 0, sizeof(args));
531
532         EXPECT_BEGIN(KERN_INFO,
533                      "OF: /testcase-data/phandle-tests/consumer-a: #phandle-cells = 3 found 1");
534
535         rc = of_parse_phandle_with_args(np, "phandle-list-bad-args",
536                                         "#phandle-cells", 1, &args);
537
538         EXPECT_END(KERN_INFO,
539                    "OF: /testcase-data/phandle-tests/consumer-a: #phandle-cells = 3 found 1");
540
541         unittest(rc == -EINVAL, "expected:%i got:%i\n", -EINVAL, rc);
542
543         EXPECT_BEGIN(KERN_INFO,
544                      "OF: /testcase-data/phandle-tests/consumer-a: #phandle-cells = 3 found 1");
545
546         rc = of_count_phandle_with_args(np, "phandle-list-bad-args",
547                                         "#phandle-cells");
548
549         EXPECT_END(KERN_INFO,
550                    "OF: /testcase-data/phandle-tests/consumer-a: #phandle-cells = 3 found 1");
551
552         unittest(rc == -EINVAL, "expected:%i got:%i\n", -EINVAL, rc);
553 }
554
555 static void __init of_unittest_parse_phandle_with_args_map(void)
556 {
557         struct device_node *np, *p[6] = {};
558         struct of_phandle_args args;
559         unsigned int prefs[6];
560         int i, rc;
561
562         np = of_find_node_by_path("/testcase-data/phandle-tests/consumer-b");
563         if (!np) {
564                 pr_err("missing testcase data\n");
565                 return;
566         }
567
568         p[0] = of_find_node_by_path("/testcase-data/phandle-tests/provider0");
569         p[1] = of_find_node_by_path("/testcase-data/phandle-tests/provider1");
570         p[2] = of_find_node_by_path("/testcase-data/phandle-tests/provider2");
571         p[3] = of_find_node_by_path("/testcase-data/phandle-tests/provider3");
572         p[4] = of_find_node_by_path("/testcase-data/phandle-tests/provider4");
573         p[5] = of_find_node_by_path("/testcase-data/phandle-tests/provider5");
574         for (i = 0; i < ARRAY_SIZE(p); ++i) {
575                 if (!p[i]) {
576                         pr_err("missing testcase data\n");
577                         return;
578                 }
579                 prefs[i] = OF_KREF_READ(p[i]);
580         }
581
582         rc = of_count_phandle_with_args(np, "phandle-list", "#phandle-cells");
583         unittest(rc == 8, "of_count_phandle_with_args() returned %i, expected 8\n", rc);
584
585         for (i = 0; i < 9; i++) {
586                 bool passed = true;
587
588                 memset(&args, 0, sizeof(args));
589                 rc = of_parse_phandle_with_args_map(np, "phandle-list",
590                                                     "phandle", i, &args);
591
592                 /* Test the values from tests-phandle.dtsi */
593                 switch (i) {
594                 case 0:
595                         passed &= !rc;
596                         passed &= (args.np == p[1]);
597                         passed &= (args.args_count == 1);
598                         passed &= (args.args[0] == 1);
599                         break;
600                 case 1:
601                         passed &= !rc;
602                         passed &= (args.np == p[3]);
603                         passed &= (args.args_count == 3);
604                         passed &= (args.args[0] == 2);
605                         passed &= (args.args[1] == 5);
606                         passed &= (args.args[2] == 3);
607                         break;
608                 case 2:
609                         passed &= (rc == -ENOENT);
610                         break;
611                 case 3:
612                         passed &= !rc;
613                         passed &= (args.np == p[0]);
614                         passed &= (args.args_count == 0);
615                         break;
616                 case 4:
617                         passed &= !rc;
618                         passed &= (args.np == p[1]);
619                         passed &= (args.args_count == 1);
620                         passed &= (args.args[0] == 3);
621                         break;
622                 case 5:
623                         passed &= !rc;
624                         passed &= (args.np == p[0]);
625                         passed &= (args.args_count == 0);
626                         break;
627                 case 6:
628                         passed &= !rc;
629                         passed &= (args.np == p[2]);
630                         passed &= (args.args_count == 2);
631                         passed &= (args.args[0] == 15);
632                         passed &= (args.args[1] == 0x20);
633                         break;
634                 case 7:
635                         passed &= !rc;
636                         passed &= (args.np == p[3]);
637                         passed &= (args.args_count == 3);
638                         passed &= (args.args[0] == 2);
639                         passed &= (args.args[1] == 5);
640                         passed &= (args.args[2] == 3);
641                         break;
642                 case 8:
643                         passed &= (rc == -ENOENT);
644                         break;
645                 default:
646                         passed = false;
647                 }
648
649                 unittest(passed, "index %i - data error on node %s rc=%i\n",
650                          i, args.np->full_name, rc);
651
652                 if (rc == 0)
653                         of_node_put(args.np);
654         }
655
656         /* Check for missing list property */
657         memset(&args, 0, sizeof(args));
658         rc = of_parse_phandle_with_args_map(np, "phandle-list-missing",
659                                             "phandle", 0, &args);
660         unittest(rc == -ENOENT, "expected:%i got:%i\n", -ENOENT, rc);
661
662         /* Check for missing cells,map,mask property */
663         memset(&args, 0, sizeof(args));
664
665         EXPECT_BEGIN(KERN_INFO,
666                      "OF: /testcase-data/phandle-tests/consumer-b: could not get #phandle-missing-cells for /testcase-data/phandle-tests/provider1");
667
668         rc = of_parse_phandle_with_args_map(np, "phandle-list",
669                                             "phandle-missing", 0, &args);
670         EXPECT_END(KERN_INFO,
671                    "OF: /testcase-data/phandle-tests/consumer-b: could not get #phandle-missing-cells for /testcase-data/phandle-tests/provider1");
672
673         unittest(rc == -EINVAL, "expected:%i got:%i\n", -EINVAL, rc);
674
675         /* Check for bad phandle in list */
676         memset(&args, 0, sizeof(args));
677
678         EXPECT_BEGIN(KERN_INFO,
679                      "OF: /testcase-data/phandle-tests/consumer-b: could not find phandle 12345678");
680
681         rc = of_parse_phandle_with_args_map(np, "phandle-list-bad-phandle",
682                                             "phandle", 0, &args);
683         EXPECT_END(KERN_INFO,
684                    "OF: /testcase-data/phandle-tests/consumer-b: could not find phandle 12345678");
685
686         unittest(rc == -EINVAL, "expected:%i got:%i\n", -EINVAL, rc);
687
688         /* Check for incorrectly formed argument list */
689         memset(&args, 0, sizeof(args));
690
691         EXPECT_BEGIN(KERN_INFO,
692                      "OF: /testcase-data/phandle-tests/consumer-b: #phandle-cells = 2 found 1");
693
694         rc = of_parse_phandle_with_args_map(np, "phandle-list-bad-args",
695                                             "phandle", 1, &args);
696         EXPECT_END(KERN_INFO,
697                    "OF: /testcase-data/phandle-tests/consumer-b: #phandle-cells = 2 found 1");
698
699         unittest(rc == -EINVAL, "expected:%i got:%i\n", -EINVAL, rc);
700
701         for (i = 0; i < ARRAY_SIZE(p); ++i) {
702                 unittest(prefs[i] == OF_KREF_READ(p[i]),
703                          "provider%d: expected:%d got:%d\n",
704                          i, prefs[i], OF_KREF_READ(p[i]));
705                 of_node_put(p[i]);
706         }
707 }
708
709 static void __init of_unittest_property_string(void)
710 {
711         const char *strings[4];
712         struct device_node *np;
713         int rc;
714
715         np = of_find_node_by_path("/testcase-data/phandle-tests/consumer-a");
716         if (!np) {
717                 pr_err("No testcase data in device tree\n");
718                 return;
719         }
720
721         rc = of_property_match_string(np, "phandle-list-names", "first");
722         unittest(rc == 0, "first expected:0 got:%i\n", rc);
723         rc = of_property_match_string(np, "phandle-list-names", "second");
724         unittest(rc == 1, "second expected:1 got:%i\n", rc);
725         rc = of_property_match_string(np, "phandle-list-names", "third");
726         unittest(rc == 2, "third expected:2 got:%i\n", rc);
727         rc = of_property_match_string(np, "phandle-list-names", "fourth");
728         unittest(rc == -ENODATA, "unmatched string; rc=%i\n", rc);
729         rc = of_property_match_string(np, "missing-property", "blah");
730         unittest(rc == -EINVAL, "missing property; rc=%i\n", rc);
731         rc = of_property_match_string(np, "empty-property", "blah");
732         unittest(rc == -ENODATA, "empty property; rc=%i\n", rc);
733         rc = of_property_match_string(np, "unterminated-string", "blah");
734         unittest(rc == -EILSEQ, "unterminated string; rc=%i\n", rc);
735
736         /* of_property_count_strings() tests */
737         rc = of_property_count_strings(np, "string-property");
738         unittest(rc == 1, "Incorrect string count; rc=%i\n", rc);
739         rc = of_property_count_strings(np, "phandle-list-names");
740         unittest(rc == 3, "Incorrect string count; rc=%i\n", rc);
741         rc = of_property_count_strings(np, "unterminated-string");
742         unittest(rc == -EILSEQ, "unterminated string; rc=%i\n", rc);
743         rc = of_property_count_strings(np, "unterminated-string-list");
744         unittest(rc == -EILSEQ, "unterminated string array; rc=%i\n", rc);
745
746         /* of_property_read_string_index() tests */
747         rc = of_property_read_string_index(np, "string-property", 0, strings);
748         unittest(rc == 0 && !strcmp(strings[0], "foobar"), "of_property_read_string_index() failure; rc=%i\n", rc);
749         strings[0] = NULL;
750         rc = of_property_read_string_index(np, "string-property", 1, strings);
751         unittest(rc == -ENODATA && strings[0] == NULL, "of_property_read_string_index() failure; rc=%i\n", rc);
752         rc = of_property_read_string_index(np, "phandle-list-names", 0, strings);
753         unittest(rc == 0 && !strcmp(strings[0], "first"), "of_property_read_string_index() failure; rc=%i\n", rc);
754         rc = of_property_read_string_index(np, "phandle-list-names", 1, strings);
755         unittest(rc == 0 && !strcmp(strings[0], "second"), "of_property_read_string_index() failure; rc=%i\n", rc);
756         rc = of_property_read_string_index(np, "phandle-list-names", 2, strings);
757         unittest(rc == 0 && !strcmp(strings[0], "third"), "of_property_read_string_index() failure; rc=%i\n", rc);
758         strings[0] = NULL;
759         rc = of_property_read_string_index(np, "phandle-list-names", 3, strings);
760         unittest(rc == -ENODATA && strings[0] == NULL, "of_property_read_string_index() failure; rc=%i\n", rc);
761         strings[0] = NULL;
762         rc = of_property_read_string_index(np, "unterminated-string", 0, strings);
763         unittest(rc == -EILSEQ && strings[0] == NULL, "of_property_read_string_index() failure; rc=%i\n", rc);
764         rc = of_property_read_string_index(np, "unterminated-string-list", 0, strings);
765         unittest(rc == 0 && !strcmp(strings[0], "first"), "of_property_read_string_index() failure; rc=%i\n", rc);
766         strings[0] = NULL;
767         rc = of_property_read_string_index(np, "unterminated-string-list", 2, strings); /* should fail */
768         unittest(rc == -EILSEQ && strings[0] == NULL, "of_property_read_string_index() failure; rc=%i\n", rc);
769         strings[1] = NULL;
770
771         /* of_property_read_string_array() tests */
772         rc = of_property_read_string_array(np, "string-property", strings, 4);
773         unittest(rc == 1, "Incorrect string count; rc=%i\n", rc);
774         rc = of_property_read_string_array(np, "phandle-list-names", strings, 4);
775         unittest(rc == 3, "Incorrect string count; rc=%i\n", rc);
776         rc = of_property_read_string_array(np, "unterminated-string", strings, 4);
777         unittest(rc == -EILSEQ, "unterminated string; rc=%i\n", rc);
778         /* -- An incorrectly formed string should cause a failure */
779         rc = of_property_read_string_array(np, "unterminated-string-list", strings, 4);
780         unittest(rc == -EILSEQ, "unterminated string array; rc=%i\n", rc);
781         /* -- parsing the correctly formed strings should still work: */
782         strings[2] = NULL;
783         rc = of_property_read_string_array(np, "unterminated-string-list", strings, 2);
784         unittest(rc == 2 && strings[2] == NULL, "of_property_read_string_array() failure; rc=%i\n", rc);
785         strings[1] = NULL;
786         rc = of_property_read_string_array(np, "phandle-list-names", strings, 1);
787         unittest(rc == 1 && strings[1] == NULL, "Overwrote end of string array; rc=%i, str='%s'\n", rc, strings[1]);
788 }
789
790 #define propcmp(p1, p2) (((p1)->length == (p2)->length) && \
791                         (p1)->value && (p2)->value && \
792                         !memcmp((p1)->value, (p2)->value, (p1)->length) && \
793                         !strcmp((p1)->name, (p2)->name))
794 static void __init of_unittest_property_copy(void)
795 {
796 #ifdef CONFIG_OF_DYNAMIC
797         struct property p1 = { .name = "p1", .length = 0, .value = "" };
798         struct property p2 = { .name = "p2", .length = 5, .value = "abcd" };
799         struct property *new;
800
801         new = __of_prop_dup(&p1, GFP_KERNEL);
802         unittest(new && propcmp(&p1, new), "empty property didn't copy correctly\n");
803         kfree(new->value);
804         kfree(new->name);
805         kfree(new);
806
807         new = __of_prop_dup(&p2, GFP_KERNEL);
808         unittest(new && propcmp(&p2, new), "non-empty property didn't copy correctly\n");
809         kfree(new->value);
810         kfree(new->name);
811         kfree(new);
812 #endif
813 }
814
815 static void __init of_unittest_changeset(void)
816 {
817 #ifdef CONFIG_OF_DYNAMIC
818         int ret;
819         struct property *ppadd, padd = { .name = "prop-add", .length = 1, .value = "" };
820         struct property *ppname_n1,  pname_n1  = { .name = "name", .length = 3, .value = "n1"  };
821         struct property *ppname_n2,  pname_n2  = { .name = "name", .length = 3, .value = "n2"  };
822         struct property *ppname_n21, pname_n21 = { .name = "name", .length = 3, .value = "n21" };
823         struct property *ppupdate, pupdate = { .name = "prop-update", .length = 5, .value = "abcd" };
824         struct property *ppremove;
825         struct device_node *n1, *n2, *n21, *n22, *nchangeset, *nremove, *parent, *np;
826         static const char * const str_array[] = { "str1", "str2", "str3" };
827         const u32 u32_array[] = { 1, 2, 3 };
828         struct of_changeset chgset;
829         const char *propstr = NULL;
830
831         n1 = __of_node_dup(NULL, "n1");
832         unittest(n1, "testcase setup failure\n");
833
834         n2 = __of_node_dup(NULL, "n2");
835         unittest(n2, "testcase setup failure\n");
836
837         n21 = __of_node_dup(NULL, "n21");
838         unittest(n21, "testcase setup failure %p\n", n21);
839
840         nchangeset = of_find_node_by_path("/testcase-data/changeset");
841         nremove = of_get_child_by_name(nchangeset, "node-remove");
842         unittest(nremove, "testcase setup failure\n");
843
844         ppadd = __of_prop_dup(&padd, GFP_KERNEL);
845         unittest(ppadd, "testcase setup failure\n");
846
847         ppname_n1  = __of_prop_dup(&pname_n1, GFP_KERNEL);
848         unittest(ppname_n1, "testcase setup failure\n");
849
850         ppname_n2  = __of_prop_dup(&pname_n2, GFP_KERNEL);
851         unittest(ppname_n2, "testcase setup failure\n");
852
853         ppname_n21 = __of_prop_dup(&pname_n21, GFP_KERNEL);
854         unittest(ppname_n21, "testcase setup failure\n");
855
856         ppupdate = __of_prop_dup(&pupdate, GFP_KERNEL);
857         unittest(ppupdate, "testcase setup failure\n");
858
859         parent = nchangeset;
860         n1->parent = parent;
861         n2->parent = parent;
862         n21->parent = n2;
863
864         ppremove = of_find_property(parent, "prop-remove", NULL);
865         unittest(ppremove, "failed to find removal prop");
866
867         of_changeset_init(&chgset);
868
869         unittest(!of_changeset_attach_node(&chgset, n1), "fail attach n1\n");
870         unittest(!of_changeset_add_property(&chgset, n1, ppname_n1), "fail add prop name\n");
871
872         unittest(!of_changeset_attach_node(&chgset, n2), "fail attach n2\n");
873         unittest(!of_changeset_add_property(&chgset, n2, ppname_n2), "fail add prop name\n");
874
875         unittest(!of_changeset_detach_node(&chgset, nremove), "fail remove node\n");
876         unittest(!of_changeset_add_property(&chgset, n21, ppname_n21), "fail add prop name\n");
877
878         unittest(!of_changeset_attach_node(&chgset, n21), "fail attach n21\n");
879
880         unittest(!of_changeset_add_property(&chgset, parent, ppadd), "fail add prop prop-add\n");
881         unittest(!of_changeset_update_property(&chgset, parent, ppupdate), "fail update prop\n");
882         unittest(!of_changeset_remove_property(&chgset, parent, ppremove), "fail remove prop\n");
883         n22 = of_changeset_create_node(&chgset, n2, "n22");
884         unittest(n22, "fail create n22\n");
885         unittest(!of_changeset_add_prop_string(&chgset, n22, "prop-str", "abcd"),
886                  "fail add prop prop-str");
887         unittest(!of_changeset_add_prop_string_array(&chgset, n22, "prop-str-array",
888                                                      (const char **)str_array,
889                                                      ARRAY_SIZE(str_array)),
890                  "fail add prop prop-str-array");
891         unittest(!of_changeset_add_prop_u32_array(&chgset, n22, "prop-u32-array",
892                                                   u32_array, ARRAY_SIZE(u32_array)),
893                  "fail add prop prop-u32-array");
894
895         unittest(!of_changeset_apply(&chgset), "apply failed\n");
896
897         of_node_put(nchangeset);
898
899         /* Make sure node names are constructed correctly */
900         unittest((np = of_find_node_by_path("/testcase-data/changeset/n2/n21")),
901                  "'%pOF' not added\n", n21);
902         of_node_put(np);
903         unittest((np = of_find_node_by_path("/testcase-data/changeset/n2/n22")),
904                  "'%pOF' not added\n", n22);
905         of_node_put(np);
906
907         unittest(!of_changeset_revert(&chgset), "revert failed\n");
908
909         unittest(!of_find_node_by_path("/testcase-data/changeset/n2/n21"),
910                  "'%pOF' still present after revert\n", n21);
911
912         ppremove = of_find_property(parent, "prop-remove", NULL);
913         unittest(ppremove, "failed to find removed prop after revert\n");
914
915         ret = of_property_read_string(parent, "prop-update", &propstr);
916         unittest(!ret, "failed to find updated prop after revert\n");
917         if (!ret)
918                 unittest(strcmp(propstr, "hello") == 0, "original value not in updated property after revert");
919
920         of_changeset_destroy(&chgset);
921
922         of_node_put(n1);
923         of_node_put(n2);
924         of_node_put(n21);
925         of_node_put(n22);
926 #endif
927 }
928
929 static void __init of_unittest_dma_get_max_cpu_address(void)
930 {
931         struct device_node *np;
932         phys_addr_t cpu_addr;
933
934         if (!IS_ENABLED(CONFIG_OF_ADDRESS))
935                 return;
936
937         np = of_find_node_by_path("/testcase-data/address-tests");
938         if (!np) {
939                 pr_err("missing testcase data\n");
940                 return;
941         }
942
943         cpu_addr = of_dma_get_max_cpu_address(np);
944         unittest(cpu_addr == 0x4fffffff,
945                  "of_dma_get_max_cpu_address: wrong CPU addr %pad (expecting %x)\n",
946                  &cpu_addr, 0x4fffffff);
947 }
948
949 static void __init of_unittest_dma_ranges_one(const char *path,
950                 u64 expect_dma_addr, u64 expect_paddr)
951 {
952 #ifdef CONFIG_HAS_DMA
953         struct device_node *np;
954         const struct bus_dma_region *map = NULL;
955         int rc;
956
957         np = of_find_node_by_path(path);
958         if (!np) {
959                 pr_err("missing testcase data\n");
960                 return;
961         }
962
963         rc = of_dma_get_range(np, &map);
964
965         unittest(!rc, "of_dma_get_range failed on node %pOF rc=%i\n", np, rc);
966
967         if (!rc) {
968                 phys_addr_t     paddr;
969                 dma_addr_t      dma_addr;
970                 struct device   *dev_bogus;
971
972                 dev_bogus = kzalloc(sizeof(struct device), GFP_KERNEL);
973                 if (!dev_bogus) {
974                         unittest(0, "kzalloc() failed\n");
975                         kfree(map);
976                         return;
977                 }
978
979                 dev_bogus->dma_range_map = map;
980                 paddr = dma_to_phys(dev_bogus, expect_dma_addr);
981                 dma_addr = phys_to_dma(dev_bogus, expect_paddr);
982
983                 unittest(paddr == expect_paddr,
984                          "of_dma_get_range: wrong phys addr %pap (expecting %llx) on node %pOF\n",
985                          &paddr, expect_paddr, np);
986                 unittest(dma_addr == expect_dma_addr,
987                          "of_dma_get_range: wrong DMA addr %pad (expecting %llx) on node %pOF\n",
988                          &dma_addr, expect_dma_addr, np);
989
990                 kfree(map);
991                 kfree(dev_bogus);
992         }
993         of_node_put(np);
994 #endif
995 }
996
997 static void __init of_unittest_parse_dma_ranges(void)
998 {
999         of_unittest_dma_ranges_one("/testcase-data/address-tests/device@70000000",
1000                 0x0, 0x20000000);
1001         if (IS_ENABLED(CONFIG_ARCH_DMA_ADDR_T_64BIT))
1002                 of_unittest_dma_ranges_one("/testcase-data/address-tests/bus@80000000/device@1000",
1003                         0x100000000, 0x20000000);
1004         of_unittest_dma_ranges_one("/testcase-data/address-tests/pci@90000000",
1005                 0x80000000, 0x20000000);
1006 }
1007
1008 static void __init of_unittest_pci_dma_ranges(void)
1009 {
1010         struct device_node *np;
1011         struct of_pci_range range;
1012         struct of_pci_range_parser parser;
1013         int i = 0;
1014
1015         if (!IS_ENABLED(CONFIG_PCI))
1016                 return;
1017
1018         np = of_find_node_by_path("/testcase-data/address-tests/pci@90000000");
1019         if (!np) {
1020                 pr_err("missing testcase data\n");
1021                 return;
1022         }
1023
1024         if (of_pci_dma_range_parser_init(&parser, np)) {
1025                 pr_err("missing dma-ranges property\n");
1026                 return;
1027         }
1028
1029         /*
1030          * Get the dma-ranges from the device tree
1031          */
1032         for_each_of_pci_range(&parser, &range) {
1033                 if (!i) {
1034                         unittest(range.size == 0x10000000,
1035                                  "for_each_of_pci_range wrong size on node %pOF size=%llx\n",
1036                                  np, range.size);
1037                         unittest(range.cpu_addr == 0x20000000,
1038                                  "for_each_of_pci_range wrong CPU addr (%llx) on node %pOF",
1039                                  range.cpu_addr, np);
1040                         unittest(range.pci_addr == 0x80000000,
1041                                  "for_each_of_pci_range wrong DMA addr (%llx) on node %pOF",
1042                                  range.pci_addr, np);
1043                 } else {
1044                         unittest(range.size == 0x10000000,
1045                                  "for_each_of_pci_range wrong size on node %pOF size=%llx\n",
1046                                  np, range.size);
1047                         unittest(range.cpu_addr == 0x40000000,
1048                                  "for_each_of_pci_range wrong CPU addr (%llx) on node %pOF",
1049                                  range.cpu_addr, np);
1050                         unittest(range.pci_addr == 0xc0000000,
1051                                  "for_each_of_pci_range wrong DMA addr (%llx) on node %pOF",
1052                                  range.pci_addr, np);
1053                 }
1054                 i++;
1055         }
1056
1057         of_node_put(np);
1058 }
1059
1060 static void __init of_unittest_bus_ranges(void)
1061 {
1062         struct device_node *np;
1063         struct of_range range;
1064         struct of_range_parser parser;
1065         struct resource res;
1066         int ret, count, i = 0;
1067
1068         np = of_find_node_by_path("/testcase-data/address-tests");
1069         if (!np) {
1070                 pr_err("missing testcase data\n");
1071                 return;
1072         }
1073
1074         if (of_range_parser_init(&parser, np)) {
1075                 pr_err("missing ranges property\n");
1076                 return;
1077         }
1078
1079         ret = of_range_to_resource(np, 1, &res);
1080         unittest(!ret, "of_range_to_resource returned error (%d) node %pOF\n",
1081                 ret, np);
1082         unittest(resource_type(&res) == IORESOURCE_MEM,
1083                 "of_range_to_resource wrong resource type on node %pOF res=%pR\n",
1084                 np, &res);
1085         unittest(res.start == 0xd0000000,
1086                 "of_range_to_resource wrong resource start address on node %pOF res=%pR\n",
1087                 np, &res);
1088         unittest(resource_size(&res) == 0x20000000,
1089                 "of_range_to_resource wrong resource start address on node %pOF res=%pR\n",
1090                 np, &res);
1091
1092         count = of_range_count(&parser);
1093         unittest(count == 2,
1094                 "of_range_count wrong size on node %pOF count=%d\n",
1095                 np, count);
1096
1097         /*
1098          * Get the "ranges" from the device tree
1099          */
1100         for_each_of_range(&parser, &range) {
1101                 unittest(range.flags == IORESOURCE_MEM,
1102                         "for_each_of_range wrong flags on node %pOF flags=%x (expected %x)\n",
1103                         np, range.flags, IORESOURCE_MEM);
1104                 if (!i) {
1105                         unittest(range.size == 0x50000000,
1106                                  "for_each_of_range wrong size on node %pOF size=%llx\n",
1107                                  np, range.size);
1108                         unittest(range.cpu_addr == 0x70000000,
1109                                  "for_each_of_range wrong CPU addr (%llx) on node %pOF",
1110                                  range.cpu_addr, np);
1111                         unittest(range.bus_addr == 0x70000000,
1112                                  "for_each_of_range wrong bus addr (%llx) on node %pOF",
1113                                  range.pci_addr, np);
1114                 } else {
1115                         unittest(range.size == 0x20000000,
1116                                  "for_each_of_range wrong size on node %pOF size=%llx\n",
1117                                  np, range.size);
1118                         unittest(range.cpu_addr == 0xd0000000,
1119                                  "for_each_of_range wrong CPU addr (%llx) on node %pOF",
1120                                  range.cpu_addr, np);
1121                         unittest(range.bus_addr == 0x00000000,
1122                                  "for_each_of_range wrong bus addr (%llx) on node %pOF",
1123                                  range.pci_addr, np);
1124                 }
1125                 i++;
1126         }
1127
1128         of_node_put(np);
1129 }
1130
1131 static void __init of_unittest_bus_3cell_ranges(void)
1132 {
1133         struct device_node *np;
1134         struct of_range range;
1135         struct of_range_parser parser;
1136         int i = 0;
1137
1138         np = of_find_node_by_path("/testcase-data/address-tests/bus@a0000000");
1139         if (!np) {
1140                 pr_err("missing testcase data\n");
1141                 return;
1142         }
1143
1144         if (of_range_parser_init(&parser, np)) {
1145                 pr_err("missing ranges property\n");
1146                 return;
1147         }
1148
1149         /*
1150          * Get the "ranges" from the device tree
1151          */
1152         for_each_of_range(&parser, &range) {
1153                 if (!i) {
1154                         unittest(range.flags == 0xf00baa,
1155                                  "for_each_of_range wrong flags on node %pOF flags=%x\n",
1156                                  np, range.flags);
1157                         unittest(range.size == 0x100000,
1158                                  "for_each_of_range wrong size on node %pOF size=%llx\n",
1159                                  np, range.size);
1160                         unittest(range.cpu_addr == 0xa0000000,
1161                                  "for_each_of_range wrong CPU addr (%llx) on node %pOF",
1162                                  range.cpu_addr, np);
1163                         unittest(range.bus_addr == 0x0,
1164                                  "for_each_of_range wrong bus addr (%llx) on node %pOF",
1165                                  range.pci_addr, np);
1166                 } else {
1167                         unittest(range.flags == 0xf00bee,
1168                                  "for_each_of_range wrong flags on node %pOF flags=%x\n",
1169                                  np, range.flags);
1170                         unittest(range.size == 0x200000,
1171                                  "for_each_of_range wrong size on node %pOF size=%llx\n",
1172                                  np, range.size);
1173                         unittest(range.cpu_addr == 0xb0000000,
1174                                  "for_each_of_range wrong CPU addr (%llx) on node %pOF",
1175                                  range.cpu_addr, np);
1176                         unittest(range.bus_addr == 0x100000000,
1177                                  "for_each_of_range wrong bus addr (%llx) on node %pOF",
1178                                  range.pci_addr, np);
1179                 }
1180                 i++;
1181         }
1182
1183         of_node_put(np);
1184 }
1185
1186 static void __init of_unittest_reg(void)
1187 {
1188         struct device_node *np;
1189         int ret;
1190         u64 addr, size;
1191
1192         np = of_find_node_by_path("/testcase-data/address-tests/bus@80000000/device@1000");
1193         if (!np) {
1194                 pr_err("missing testcase data\n");
1195                 return;
1196         }
1197
1198         ret = of_property_read_reg(np, 0, &addr, &size);
1199         unittest(!ret, "of_property_read_reg(%pOF) returned error %d\n",
1200                 np, ret);
1201         unittest(addr == 0x1000, "of_property_read_reg(%pOF) untranslated address (%llx) incorrect\n",
1202                 np, addr);
1203
1204         of_node_put(np);
1205 }
1206
1207 struct of_unittest_expected_res {
1208         int index;
1209         struct resource res;
1210 };
1211
1212 static void __init of_unittest_check_addr(const char *node_path,
1213                                           const struct of_unittest_expected_res *tab_exp,
1214                                           unsigned int tab_exp_count)
1215 {
1216         const struct of_unittest_expected_res *expected;
1217         struct device_node *np;
1218         struct resource res;
1219         unsigned int count;
1220         int ret;
1221
1222         if (!IS_ENABLED(CONFIG_OF_ADDRESS))
1223                 return;
1224
1225         np = of_find_node_by_path(node_path);
1226         if (!np) {
1227                 pr_err("missing testcase data (%s)\n", node_path);
1228                 return;
1229         }
1230
1231         expected = tab_exp;
1232         count = tab_exp_count;
1233         while (count--) {
1234                 ret = of_address_to_resource(np, expected->index, &res);
1235                 unittest(!ret, "of_address_to_resource(%pOF, %d) returned error %d\n",
1236                          np, expected->index, ret);
1237                 unittest(resource_type(&res) == resource_type(&expected->res) &&
1238                          res.start == expected->res.start &&
1239                          resource_size(&res) == resource_size(&expected->res),
1240                         "of_address_to_resource(%pOF, %d) wrong resource %pR, expected %pR\n",
1241                         np, expected->index, &res, &expected->res);
1242                 expected++;
1243         }
1244
1245         of_node_put(np);
1246 }
1247
1248 static const struct of_unittest_expected_res of_unittest_reg_2cell_expected_res[] = {
1249         {.index = 0, .res = DEFINE_RES_MEM(0xa0a01000, 0x100) },
1250         {.index = 1, .res = DEFINE_RES_MEM(0xa0a02000, 0x100) },
1251         {.index = 2, .res = DEFINE_RES_MEM(0xc0c01000, 0x100) },
1252         {.index = 3, .res = DEFINE_RES_MEM(0xd0d01000, 0x100) },
1253 };
1254
1255 static const struct of_unittest_expected_res of_unittest_reg_3cell_expected_res[] = {
1256         {.index = 0, .res = DEFINE_RES_MEM(0xa0a01000, 0x100) },
1257         {.index = 1, .res = DEFINE_RES_MEM(0xa0b02000, 0x100) },
1258         {.index = 2, .res = DEFINE_RES_MEM(0xc0c01000, 0x100) },
1259         {.index = 3, .res = DEFINE_RES_MEM(0xc0c09000, 0x100) },
1260         {.index = 4, .res = DEFINE_RES_MEM(0xd0d01000, 0x100) },
1261 };
1262
1263 static const struct of_unittest_expected_res of_unittest_reg_pci_expected_res[] = {
1264         {.index = 0, .res = DEFINE_RES_MEM(0xe8001000, 0x1000) },
1265         {.index = 1, .res = DEFINE_RES_MEM(0xea002000, 0x2000) },
1266 };
1267
1268 static void __init of_unittest_translate_addr(void)
1269 {
1270         of_unittest_check_addr("/testcase-data/address-tests2/bus-2cell@10000000/device@100000",
1271                                of_unittest_reg_2cell_expected_res,
1272                                ARRAY_SIZE(of_unittest_reg_2cell_expected_res));
1273
1274         of_unittest_check_addr("/testcase-data/address-tests2/bus-3cell@20000000/local-bus@100000/device@f1001000",
1275                                of_unittest_reg_3cell_expected_res,
1276                                ARRAY_SIZE(of_unittest_reg_3cell_expected_res));
1277
1278         of_unittest_check_addr("/testcase-data/address-tests2/pcie@d1070000/pci@0,0/dev@0,0/local-bus@0/dev@e0000000",
1279                                of_unittest_reg_pci_expected_res,
1280                                ARRAY_SIZE(of_unittest_reg_pci_expected_res));
1281 }
1282
1283 static void __init of_unittest_parse_interrupts(void)
1284 {
1285         struct device_node *np;
1286         struct of_phandle_args args;
1287         int i, rc;
1288
1289         if (of_irq_workarounds & OF_IMAP_OLDWORLD_MAC)
1290                 return;
1291
1292         np = of_find_node_by_path("/testcase-data/interrupts/interrupts0");
1293         if (!np) {
1294                 pr_err("missing testcase data\n");
1295                 return;
1296         }
1297
1298         for (i = 0; i < 4; i++) {
1299                 bool passed = true;
1300
1301                 memset(&args, 0, sizeof(args));
1302                 rc = of_irq_parse_one(np, i, &args);
1303
1304                 passed &= !rc;
1305                 passed &= (args.args_count == 1);
1306                 passed &= (args.args[0] == (i + 1));
1307
1308                 unittest(passed, "index %i - data error on node %pOF rc=%i\n",
1309                          i, args.np, rc);
1310         }
1311         of_node_put(np);
1312
1313         np = of_find_node_by_path("/testcase-data/interrupts/interrupts1");
1314         if (!np) {
1315                 pr_err("missing testcase data\n");
1316                 return;
1317         }
1318
1319         for (i = 0; i < 4; i++) {
1320                 bool passed = true;
1321
1322                 memset(&args, 0, sizeof(args));
1323                 rc = of_irq_parse_one(np, i, &args);
1324
1325                 /* Test the values from tests-phandle.dtsi */
1326                 switch (i) {
1327                 case 0:
1328                         passed &= !rc;
1329                         passed &= (args.args_count == 1);
1330                         passed &= (args.args[0] == 9);
1331                         break;
1332                 case 1:
1333                         passed &= !rc;
1334                         passed &= (args.args_count == 3);
1335                         passed &= (args.args[0] == 10);
1336                         passed &= (args.args[1] == 11);
1337                         passed &= (args.args[2] == 12);
1338                         break;
1339                 case 2:
1340                         passed &= !rc;
1341                         passed &= (args.args_count == 2);
1342                         passed &= (args.args[0] == 13);
1343                         passed &= (args.args[1] == 14);
1344                         break;
1345                 case 3:
1346                         passed &= !rc;
1347                         passed &= (args.args_count == 2);
1348                         passed &= (args.args[0] == 15);
1349                         passed &= (args.args[1] == 16);
1350                         break;
1351                 default:
1352                         passed = false;
1353                 }
1354                 unittest(passed, "index %i - data error on node %pOF rc=%i\n",
1355                          i, args.np, rc);
1356         }
1357         of_node_put(np);
1358 }
1359
1360 static void __init of_unittest_parse_interrupts_extended(void)
1361 {
1362         struct device_node *np;
1363         struct of_phandle_args args;
1364         int i, rc;
1365
1366         if (of_irq_workarounds & OF_IMAP_OLDWORLD_MAC)
1367                 return;
1368
1369         np = of_find_node_by_path("/testcase-data/interrupts/interrupts-extended0");
1370         if (!np) {
1371                 pr_err("missing testcase data\n");
1372                 return;
1373         }
1374
1375         for (i = 0; i < 7; i++) {
1376                 bool passed = true;
1377
1378                 memset(&args, 0, sizeof(args));
1379                 rc = of_irq_parse_one(np, i, &args);
1380
1381                 /* Test the values from tests-phandle.dtsi */
1382                 switch (i) {
1383                 case 0:
1384                         passed &= !rc;
1385                         passed &= (args.args_count == 1);
1386                         passed &= (args.args[0] == 1);
1387                         break;
1388                 case 1:
1389                         passed &= !rc;
1390                         passed &= (args.args_count == 3);
1391                         passed &= (args.args[0] == 2);
1392                         passed &= (args.args[1] == 3);
1393                         passed &= (args.args[2] == 4);
1394                         break;
1395                 case 2:
1396                         passed &= !rc;
1397                         passed &= (args.args_count == 2);
1398                         passed &= (args.args[0] == 5);
1399                         passed &= (args.args[1] == 6);
1400                         break;
1401                 case 3:
1402                         passed &= !rc;
1403                         passed &= (args.args_count == 1);
1404                         passed &= (args.args[0] == 9);
1405                         break;
1406                 case 4:
1407                         passed &= !rc;
1408                         passed &= (args.args_count == 3);
1409                         passed &= (args.args[0] == 10);
1410                         passed &= (args.args[1] == 11);
1411                         passed &= (args.args[2] == 12);
1412                         break;
1413                 case 5:
1414                         passed &= !rc;
1415                         passed &= (args.args_count == 2);
1416                         passed &= (args.args[0] == 13);
1417                         passed &= (args.args[1] == 14);
1418                         break;
1419                 case 6:
1420                         /*
1421                          * Tests child node that is missing property
1422                          * #address-cells.  See the comments in
1423                          * drivers/of/unittest-data/tests-interrupts.dtsi
1424                          * nodes intmap1 and interrupts-extended0
1425                          */
1426                         passed &= !rc;
1427                         passed &= (args.args_count == 1);
1428                         passed &= (args.args[0] == 15);
1429                         break;
1430                 default:
1431                         passed = false;
1432                 }
1433
1434                 unittest(passed, "index %i - data error on node %pOF rc=%i\n",
1435                          i, args.np, rc);
1436         }
1437         of_node_put(np);
1438 }
1439
1440 static const struct of_device_id match_node_table[] = {
1441         { .data = "A", .name = "name0", }, /* Name alone is lowest priority */
1442         { .data = "B", .type = "type1", }, /* followed by type alone */
1443
1444         { .data = "Ca", .name = "name2", .type = "type1", }, /* followed by both together */
1445         { .data = "Cb", .name = "name2", }, /* Only match when type doesn't match */
1446         { .data = "Cc", .name = "name2", .type = "type2", },
1447
1448         { .data = "E", .compatible = "compat3" },
1449         { .data = "G", .compatible = "compat2", },
1450         { .data = "H", .compatible = "compat2", .name = "name5", },
1451         { .data = "I", .compatible = "compat2", .type = "type1", },
1452         { .data = "J", .compatible = "compat2", .type = "type1", .name = "name8", },
1453         { .data = "K", .compatible = "compat2", .name = "name9", },
1454         {}
1455 };
1456
1457 static struct {
1458         const char *path;
1459         const char *data;
1460 } match_node_tests[] = {
1461         { .path = "/testcase-data/match-node/name0", .data = "A", },
1462         { .path = "/testcase-data/match-node/name1", .data = "B", },
1463         { .path = "/testcase-data/match-node/a/name2", .data = "Ca", },
1464         { .path = "/testcase-data/match-node/b/name2", .data = "Cb", },
1465         { .path = "/testcase-data/match-node/c/name2", .data = "Cc", },
1466         { .path = "/testcase-data/match-node/name3", .data = "E", },
1467         { .path = "/testcase-data/match-node/name4", .data = "G", },
1468         { .path = "/testcase-data/match-node/name5", .data = "H", },
1469         { .path = "/testcase-data/match-node/name6", .data = "G", },
1470         { .path = "/testcase-data/match-node/name7", .data = "I", },
1471         { .path = "/testcase-data/match-node/name8", .data = "J", },
1472         { .path = "/testcase-data/match-node/name9", .data = "K", },
1473 };
1474
1475 static void __init of_unittest_match_node(void)
1476 {
1477         struct device_node *np;
1478         const struct of_device_id *match;
1479         int i;
1480
1481         for (i = 0; i < ARRAY_SIZE(match_node_tests); i++) {
1482                 np = of_find_node_by_path(match_node_tests[i].path);
1483                 if (!np) {
1484                         unittest(0, "missing testcase node %s\n",
1485                                 match_node_tests[i].path);
1486                         continue;
1487                 }
1488
1489                 match = of_match_node(match_node_table, np);
1490                 if (!match) {
1491                         unittest(0, "%s didn't match anything\n",
1492                                 match_node_tests[i].path);
1493                         continue;
1494                 }
1495
1496                 if (strcmp(match->data, match_node_tests[i].data) != 0) {
1497                         unittest(0, "%s got wrong match. expected %s, got %s\n",
1498                                 match_node_tests[i].path, match_node_tests[i].data,
1499                                 (const char *)match->data);
1500                         continue;
1501                 }
1502                 unittest(1, "passed");
1503         }
1504 }
1505
1506 static struct resource test_bus_res = DEFINE_RES_MEM(0xfffffff8, 2);
1507 static const struct platform_device_info test_bus_info = {
1508         .name = "unittest-bus",
1509 };
1510 static void __init of_unittest_platform_populate(void)
1511 {
1512         int irq, rc;
1513         struct device_node *np, *child, *grandchild;
1514         struct platform_device *pdev, *test_bus;
1515         const struct of_device_id match[] = {
1516                 { .compatible = "test-device", },
1517                 {}
1518         };
1519
1520         np = of_find_node_by_path("/testcase-data");
1521         of_platform_default_populate(np, NULL, NULL);
1522
1523         /* Test that a missing irq domain returns -EPROBE_DEFER */
1524         np = of_find_node_by_path("/testcase-data/testcase-device1");
1525         pdev = of_find_device_by_node(np);
1526         unittest(pdev, "device 1 creation failed\n");
1527
1528         if (!(of_irq_workarounds & OF_IMAP_OLDWORLD_MAC)) {
1529                 irq = platform_get_irq(pdev, 0);
1530                 unittest(irq == -EPROBE_DEFER,
1531                          "device deferred probe failed - %d\n", irq);
1532
1533                 /* Test that a parsing failure does not return -EPROBE_DEFER */
1534                 np = of_find_node_by_path("/testcase-data/testcase-device2");
1535                 pdev = of_find_device_by_node(np);
1536                 unittest(pdev, "device 2 creation failed\n");
1537
1538                 EXPECT_BEGIN(KERN_INFO,
1539                              "platform testcase-data:testcase-device2: error -ENXIO: IRQ index 0 not found");
1540
1541                 irq = platform_get_irq(pdev, 0);
1542
1543                 EXPECT_END(KERN_INFO,
1544                            "platform testcase-data:testcase-device2: error -ENXIO: IRQ index 0 not found");
1545
1546                 unittest(irq < 0 && irq != -EPROBE_DEFER,
1547                          "device parsing error failed - %d\n", irq);
1548         }
1549
1550         np = of_find_node_by_path("/testcase-data/platform-tests");
1551         unittest(np, "No testcase data in device tree\n");
1552         if (!np)
1553                 return;
1554
1555         test_bus = platform_device_register_full(&test_bus_info);
1556         rc = PTR_ERR_OR_ZERO(test_bus);
1557         unittest(!rc, "testbus registration failed; rc=%i\n", rc);
1558         if (rc) {
1559                 of_node_put(np);
1560                 return;
1561         }
1562         test_bus->dev.of_node = np;
1563
1564         /*
1565          * Add a dummy resource to the test bus node after it is
1566          * registered to catch problems with un-inserted resources. The
1567          * DT code doesn't insert the resources, and it has caused the
1568          * kernel to oops in the past. This makes sure the same bug
1569          * doesn't crop up again.
1570          */
1571         platform_device_add_resources(test_bus, &test_bus_res, 1);
1572
1573         of_platform_populate(np, match, NULL, &test_bus->dev);
1574         for_each_child_of_node(np, child) {
1575                 for_each_child_of_node(child, grandchild) {
1576                         pdev = of_find_device_by_node(grandchild);
1577                         unittest(pdev,
1578                                  "Could not create device for node '%pOFn'\n",
1579                                  grandchild);
1580                         platform_device_put(pdev);
1581                 }
1582         }
1583
1584         of_platform_depopulate(&test_bus->dev);
1585         for_each_child_of_node(np, child) {
1586                 for_each_child_of_node(child, grandchild)
1587                         unittest(!of_find_device_by_node(grandchild),
1588                                  "device didn't get destroyed '%pOFn'\n",
1589                                  grandchild);
1590         }
1591
1592         platform_device_unregister(test_bus);
1593         of_node_put(np);
1594 }
1595
1596 /**
1597  *      update_node_properties - adds the properties
1598  *      of np into dup node (present in live tree) and
1599  *      updates parent of children of np to dup.
1600  *
1601  *      @np:    node whose properties are being added to the live tree
1602  *      @dup:   node present in live tree to be updated
1603  */
1604 static void update_node_properties(struct device_node *np,
1605                                         struct device_node *dup)
1606 {
1607         struct property *prop;
1608         struct property *save_next;
1609         struct device_node *child;
1610         int ret;
1611
1612         for_each_child_of_node(np, child)
1613                 child->parent = dup;
1614
1615         /*
1616          * "unittest internal error: unable to add testdata property"
1617          *
1618          *    If this message reports a property in node '/__symbols__' then
1619          *    the respective unittest overlay contains a label that has the
1620          *    same name as a label in the live devicetree.  The label will
1621          *    be in the live devicetree only if the devicetree source was
1622          *    compiled with the '-@' option.  If you encounter this error,
1623          *    please consider renaming __all__ of the labels in the unittest
1624          *    overlay dts files with an odd prefix that is unlikely to be
1625          *    used in a real devicetree.
1626          */
1627
1628         /*
1629          * open code for_each_property_of_node() because of_add_property()
1630          * sets prop->next to NULL
1631          */
1632         for (prop = np->properties; prop != NULL; prop = save_next) {
1633                 save_next = prop->next;
1634                 ret = of_add_property(dup, prop);
1635                 if (ret) {
1636                         if (ret == -EEXIST && !strcmp(prop->name, "name"))
1637                                 continue;
1638                         pr_err("unittest internal error: unable to add testdata property %pOF/%s",
1639                                np, prop->name);
1640                 }
1641         }
1642 }
1643
1644 /**
1645  *      attach_node_and_children - attaches nodes
1646  *      and its children to live tree.
1647  *      CAUTION: misleading function name - if node @np already exists in
1648  *      the live tree then children of @np are *not* attached to the live
1649  *      tree.  This works for the current test devicetree nodes because such
1650  *      nodes do not have child nodes.
1651  *
1652  *      @np:    Node to attach to live tree
1653  */
1654 static void attach_node_and_children(struct device_node *np)
1655 {
1656         struct device_node *next, *dup, *child;
1657         unsigned long flags;
1658         const char *full_name;
1659
1660         full_name = kasprintf(GFP_KERNEL, "%pOF", np);
1661         if (!full_name)
1662                 return;
1663
1664         if (!strcmp(full_name, "/__local_fixups__") ||
1665             !strcmp(full_name, "/__fixups__")) {
1666                 kfree(full_name);
1667                 return;
1668         }
1669
1670         dup = of_find_node_by_path(full_name);
1671         kfree(full_name);
1672         if (dup) {
1673                 update_node_properties(np, dup);
1674                 return;
1675         }
1676
1677         child = np->child;
1678         np->child = NULL;
1679
1680         mutex_lock(&of_mutex);
1681         raw_spin_lock_irqsave(&devtree_lock, flags);
1682         np->sibling = np->parent->child;
1683         np->parent->child = np;
1684         of_node_clear_flag(np, OF_DETACHED);
1685         raw_spin_unlock_irqrestore(&devtree_lock, flags);
1686
1687         __of_attach_node_sysfs(np);
1688         mutex_unlock(&of_mutex);
1689
1690         while (child) {
1691                 next = child->sibling;
1692                 attach_node_and_children(child);
1693                 child = next;
1694         }
1695 }
1696
1697 /**
1698  *      unittest_data_add - Reads, copies data from
1699  *      linked tree and attaches it to the live tree
1700  */
1701 static int __init unittest_data_add(void)
1702 {
1703         void *unittest_data;
1704         void *unittest_data_align;
1705         struct device_node *unittest_data_node = NULL, *np;
1706         /*
1707          * __dtbo_testcases_begin[] and __dtbo_testcases_end[] are magically
1708          * created by cmd_dt_S_dtbo in scripts/Makefile.lib
1709          */
1710         extern uint8_t __dtbo_testcases_begin[];
1711         extern uint8_t __dtbo_testcases_end[];
1712         const int size = __dtbo_testcases_end - __dtbo_testcases_begin;
1713         int rc;
1714         void *ret;
1715
1716         if (!size) {
1717                 pr_warn("%s: testcases is empty\n", __func__);
1718                 return -ENODATA;
1719         }
1720
1721         /* creating copy */
1722         unittest_data = kmalloc(size + FDT_ALIGN_SIZE, GFP_KERNEL);
1723         if (!unittest_data)
1724                 return -ENOMEM;
1725
1726         unittest_data_align = PTR_ALIGN(unittest_data, FDT_ALIGN_SIZE);
1727         memcpy(unittest_data_align, __dtbo_testcases_begin, size);
1728
1729         ret = of_fdt_unflatten_tree(unittest_data_align, NULL, &unittest_data_node);
1730         if (!ret) {
1731                 pr_warn("%s: unflatten testcases tree failed\n", __func__);
1732                 kfree(unittest_data);
1733                 return -ENODATA;
1734         }
1735         if (!unittest_data_node) {
1736                 pr_warn("%s: testcases tree is empty\n", __func__);
1737                 kfree(unittest_data);
1738                 return -ENODATA;
1739         }
1740
1741         /*
1742          * This lock normally encloses of_resolve_phandles()
1743          */
1744         of_overlay_mutex_lock();
1745
1746         rc = of_resolve_phandles(unittest_data_node);
1747         if (rc) {
1748                 pr_err("%s: Failed to resolve phandles (rc=%i)\n", __func__, rc);
1749                 of_overlay_mutex_unlock();
1750                 return -EINVAL;
1751         }
1752
1753         if (!of_root) {
1754                 of_root = unittest_data_node;
1755                 for_each_of_allnodes(np)
1756                         __of_attach_node_sysfs(np);
1757                 of_aliases = of_find_node_by_path("/aliases");
1758                 of_chosen = of_find_node_by_path("/chosen");
1759                 of_overlay_mutex_unlock();
1760                 return 0;
1761         }
1762
1763         EXPECT_BEGIN(KERN_INFO,
1764                      "Duplicate name in testcase-data, renamed to \"duplicate-name#1\"");
1765
1766         /* attach the sub-tree to live tree */
1767         np = unittest_data_node->child;
1768         while (np) {
1769                 struct device_node *next = np->sibling;
1770
1771                 np->parent = of_root;
1772                 /* this will clear OF_DETACHED in np and children */
1773                 attach_node_and_children(np);
1774                 np = next;
1775         }
1776
1777         EXPECT_END(KERN_INFO,
1778                    "Duplicate name in testcase-data, renamed to \"duplicate-name#1\"");
1779
1780         of_overlay_mutex_unlock();
1781
1782         return 0;
1783 }
1784
1785 #ifdef CONFIG_OF_OVERLAY
1786 static int __init overlay_data_apply(const char *overlay_name, int *ovcs_id);
1787
1788 static int unittest_probe(struct platform_device *pdev)
1789 {
1790         struct device *dev = &pdev->dev;
1791         struct device_node *np = dev->of_node;
1792
1793         if (np == NULL) {
1794                 dev_err(dev, "No OF data for device\n");
1795                 return -EINVAL;
1796
1797         }
1798
1799         dev_dbg(dev, "%s for node @%pOF\n", __func__, np);
1800
1801         of_platform_populate(np, NULL, NULL, &pdev->dev);
1802
1803         return 0;
1804 }
1805
1806 static void unittest_remove(struct platform_device *pdev)
1807 {
1808         struct device *dev = &pdev->dev;
1809         struct device_node *np = dev->of_node;
1810
1811         dev_dbg(dev, "%s for node @%pOF\n", __func__, np);
1812 }
1813
1814 static const struct of_device_id unittest_match[] = {
1815         { .compatible = "unittest", },
1816         {},
1817 };
1818
1819 static struct platform_driver unittest_driver = {
1820         .probe                  = unittest_probe,
1821         .remove_new             = unittest_remove,
1822         .driver = {
1823                 .name           = "unittest",
1824                 .of_match_table = unittest_match,
1825         },
1826 };
1827
1828 /* get the platform device instantiated at the path */
1829 static struct platform_device *of_path_to_platform_device(const char *path)
1830 {
1831         struct device_node *np;
1832         struct platform_device *pdev;
1833
1834         np = of_find_node_by_path(path);
1835         if (np == NULL)
1836                 return NULL;
1837
1838         pdev = of_find_device_by_node(np);
1839         of_node_put(np);
1840
1841         return pdev;
1842 }
1843
1844 /* find out if a platform device exists at that path */
1845 static int of_path_platform_device_exists(const char *path)
1846 {
1847         struct platform_device *pdev;
1848
1849         pdev = of_path_to_platform_device(path);
1850         platform_device_put(pdev);
1851         return pdev != NULL;
1852 }
1853
1854 #ifdef CONFIG_OF_GPIO
1855
1856 struct unittest_gpio_dev {
1857         struct gpio_chip chip;
1858 };
1859
1860 static int unittest_gpio_chip_request_count;
1861 static int unittest_gpio_probe_count;
1862 static int unittest_gpio_probe_pass_count;
1863
1864 static int unittest_gpio_chip_request(struct gpio_chip *chip, unsigned int offset)
1865 {
1866         unittest_gpio_chip_request_count++;
1867
1868         pr_debug("%s(): %s %d %d\n", __func__, chip->label, offset,
1869                  unittest_gpio_chip_request_count);
1870         return 0;
1871 }
1872
1873 static int unittest_gpio_probe(struct platform_device *pdev)
1874 {
1875         struct unittest_gpio_dev *devptr;
1876         int ret;
1877
1878         unittest_gpio_probe_count++;
1879
1880         devptr = kzalloc(sizeof(*devptr), GFP_KERNEL);
1881         if (!devptr)
1882                 return -ENOMEM;
1883
1884         platform_set_drvdata(pdev, devptr);
1885
1886         devptr->chip.fwnode = dev_fwnode(&pdev->dev);
1887         devptr->chip.label = "of-unittest-gpio";
1888         devptr->chip.base = -1; /* dynamic allocation */
1889         devptr->chip.ngpio = 5;
1890         devptr->chip.request = unittest_gpio_chip_request;
1891
1892         ret = gpiochip_add_data(&devptr->chip, NULL);
1893
1894         unittest(!ret,
1895                  "gpiochip_add_data() for node @%pfw failed, ret = %d\n", devptr->chip.fwnode, ret);
1896
1897         if (!ret)
1898                 unittest_gpio_probe_pass_count++;
1899         return ret;
1900 }
1901
1902 static void unittest_gpio_remove(struct platform_device *pdev)
1903 {
1904         struct unittest_gpio_dev *devptr = platform_get_drvdata(pdev);
1905         struct device *dev = &pdev->dev;
1906
1907         dev_dbg(dev, "%s for node @%pfw\n", __func__, devptr->chip.fwnode);
1908
1909         if (devptr->chip.base != -1)
1910                 gpiochip_remove(&devptr->chip);
1911
1912         kfree(devptr);
1913 }
1914
1915 static const struct of_device_id unittest_gpio_id[] = {
1916         { .compatible = "unittest-gpio", },
1917         {}
1918 };
1919
1920 static struct platform_driver unittest_gpio_driver = {
1921         .probe  = unittest_gpio_probe,
1922         .remove_new = unittest_gpio_remove,
1923         .driver = {
1924                 .name           = "unittest-gpio",
1925                 .of_match_table = unittest_gpio_id,
1926         },
1927 };
1928
1929 static void __init of_unittest_overlay_gpio(void)
1930 {
1931         int chip_request_count;
1932         int probe_pass_count;
1933         int ret;
1934
1935         /*
1936          * tests: apply overlays before registering driver
1937          * Similar to installing a driver as a module, the
1938          * driver is registered after applying the overlays.
1939          *
1940          * The overlays are applied by overlay_data_apply()
1941          * instead of of_unittest_apply_overlay() so that they
1942          * will not be tracked.  Thus they will not be removed
1943          * by of_unittest_remove_tracked_overlays().
1944          *
1945          * - apply overlay_gpio_01
1946          * - apply overlay_gpio_02a
1947          * - apply overlay_gpio_02b
1948          * - register driver
1949          *
1950          * register driver will result in
1951          *   - probe and processing gpio hog for overlay_gpio_01
1952          *   - probe for overlay_gpio_02a
1953          *   - processing gpio for overlay_gpio_02b
1954          */
1955
1956         probe_pass_count = unittest_gpio_probe_pass_count;
1957         chip_request_count = unittest_gpio_chip_request_count;
1958
1959         /*
1960          * overlay_gpio_01 contains gpio node and child gpio hog node
1961          * overlay_gpio_02a contains gpio node
1962          * overlay_gpio_02b contains child gpio hog node
1963          */
1964
1965         unittest(overlay_data_apply("overlay_gpio_01", NULL),
1966                  "Adding overlay 'overlay_gpio_01' failed\n");
1967
1968         unittest(overlay_data_apply("overlay_gpio_02a", NULL),
1969                  "Adding overlay 'overlay_gpio_02a' failed\n");
1970
1971         unittest(overlay_data_apply("overlay_gpio_02b", NULL),
1972                  "Adding overlay 'overlay_gpio_02b' failed\n");
1973
1974         ret = platform_driver_register(&unittest_gpio_driver);
1975         if (unittest(ret == 0, "could not register unittest gpio driver\n"))
1976                 return;
1977
1978         unittest(probe_pass_count + 2 == unittest_gpio_probe_pass_count,
1979                  "unittest_gpio_probe() failed or not called\n");
1980
1981         unittest(chip_request_count + 2 == unittest_gpio_chip_request_count,
1982                  "unittest_gpio_chip_request() called %d times (expected 1 time)\n",
1983                  unittest_gpio_chip_request_count - chip_request_count);
1984
1985         /*
1986          * tests: apply overlays after registering driver
1987          *
1988          * Similar to a driver built-in to the kernel, the
1989          * driver is registered before applying the overlays.
1990          *
1991          * overlay_gpio_03 contains gpio node and child gpio hog node
1992          *
1993          * - apply overlay_gpio_03
1994          *
1995          * apply overlay will result in
1996          *   - probe and processing gpio hog.
1997          */
1998
1999         probe_pass_count = unittest_gpio_probe_pass_count;
2000         chip_request_count = unittest_gpio_chip_request_count;
2001
2002         /* overlay_gpio_03 contains gpio node and child gpio hog node */
2003
2004         unittest(overlay_data_apply("overlay_gpio_03", NULL),
2005                  "Adding overlay 'overlay_gpio_03' failed\n");
2006
2007         unittest(probe_pass_count + 1 == unittest_gpio_probe_pass_count,
2008                  "unittest_gpio_probe() failed or not called\n");
2009
2010         unittest(chip_request_count + 1 == unittest_gpio_chip_request_count,
2011                  "unittest_gpio_chip_request() called %d times (expected 1 time)\n",
2012                  unittest_gpio_chip_request_count - chip_request_count);
2013
2014         /*
2015          * overlay_gpio_04a contains gpio node
2016          *
2017          * - apply overlay_gpio_04a
2018          *
2019          * apply the overlay will result in
2020          *   - probe for overlay_gpio_04a
2021          */
2022
2023         probe_pass_count = unittest_gpio_probe_pass_count;
2024         chip_request_count = unittest_gpio_chip_request_count;
2025
2026         /* overlay_gpio_04a contains gpio node */
2027
2028         unittest(overlay_data_apply("overlay_gpio_04a", NULL),
2029                  "Adding overlay 'overlay_gpio_04a' failed\n");
2030
2031         unittest(probe_pass_count + 1 == unittest_gpio_probe_pass_count,
2032                  "unittest_gpio_probe() failed or not called\n");
2033
2034         /*
2035          * overlay_gpio_04b contains child gpio hog node
2036          *
2037          * - apply overlay_gpio_04b
2038          *
2039          * apply the overlay will result in
2040          *   - processing gpio for overlay_gpio_04b
2041          */
2042
2043         /* overlay_gpio_04b contains child gpio hog node */
2044
2045         unittest(overlay_data_apply("overlay_gpio_04b", NULL),
2046                  "Adding overlay 'overlay_gpio_04b' failed\n");
2047
2048         unittest(chip_request_count + 1 == unittest_gpio_chip_request_count,
2049                  "unittest_gpio_chip_request() called %d times (expected 1 time)\n",
2050                  unittest_gpio_chip_request_count - chip_request_count);
2051 }
2052
2053 #else
2054
2055 static void __init of_unittest_overlay_gpio(void)
2056 {
2057         /* skip tests */
2058 }
2059
2060 #endif
2061
2062 #if IS_BUILTIN(CONFIG_I2C)
2063
2064 /* get the i2c client device instantiated at the path */
2065 static struct i2c_client *of_path_to_i2c_client(const char *path)
2066 {
2067         struct device_node *np;
2068         struct i2c_client *client;
2069
2070         np = of_find_node_by_path(path);
2071         if (np == NULL)
2072                 return NULL;
2073
2074         client = of_find_i2c_device_by_node(np);
2075         of_node_put(np);
2076
2077         return client;
2078 }
2079
2080 /* find out if a i2c client device exists at that path */
2081 static int of_path_i2c_client_exists(const char *path)
2082 {
2083         struct i2c_client *client;
2084
2085         client = of_path_to_i2c_client(path);
2086         if (client)
2087                 put_device(&client->dev);
2088         return client != NULL;
2089 }
2090 #else
2091 static int of_path_i2c_client_exists(const char *path)
2092 {
2093         return 0;
2094 }
2095 #endif
2096
2097 enum overlay_type {
2098         PDEV_OVERLAY,
2099         I2C_OVERLAY
2100 };
2101
2102 static int of_path_device_type_exists(const char *path,
2103                 enum overlay_type ovtype)
2104 {
2105         switch (ovtype) {
2106         case PDEV_OVERLAY:
2107                 return of_path_platform_device_exists(path);
2108         case I2C_OVERLAY:
2109                 return of_path_i2c_client_exists(path);
2110         }
2111         return 0;
2112 }
2113
2114 static const char *unittest_path(int nr, enum overlay_type ovtype)
2115 {
2116         const char *base;
2117         static char buf[256];
2118
2119         switch (ovtype) {
2120         case PDEV_OVERLAY:
2121                 base = "/testcase-data/overlay-node/test-bus";
2122                 break;
2123         case I2C_OVERLAY:
2124                 base = "/testcase-data/overlay-node/test-bus/i2c-test-bus";
2125                 break;
2126         default:
2127                 buf[0] = '\0';
2128                 return buf;
2129         }
2130         snprintf(buf, sizeof(buf) - 1, "%s/test-unittest%d", base, nr);
2131         buf[sizeof(buf) - 1] = '\0';
2132         return buf;
2133 }
2134
2135 static int of_unittest_device_exists(int unittest_nr, enum overlay_type ovtype)
2136 {
2137         const char *path;
2138
2139         path = unittest_path(unittest_nr, ovtype);
2140
2141         switch (ovtype) {
2142         case PDEV_OVERLAY:
2143                 return of_path_platform_device_exists(path);
2144         case I2C_OVERLAY:
2145                 return of_path_i2c_client_exists(path);
2146         }
2147         return 0;
2148 }
2149
2150 static const char *overlay_name_from_nr(int nr)
2151 {
2152         static char buf[256];
2153
2154         snprintf(buf, sizeof(buf) - 1,
2155                 "overlay_%d", nr);
2156         buf[sizeof(buf) - 1] = '\0';
2157
2158         return buf;
2159 }
2160
2161 static const char *bus_path = "/testcase-data/overlay-node/test-bus";
2162
2163 #define MAX_TRACK_OVCS_IDS 256
2164
2165 static int track_ovcs_id[MAX_TRACK_OVCS_IDS];
2166 static int track_ovcs_id_overlay_nr[MAX_TRACK_OVCS_IDS];
2167 static int track_ovcs_id_cnt;
2168
2169 static void of_unittest_track_overlay(int ovcs_id, int overlay_nr)
2170 {
2171         if (WARN_ON(track_ovcs_id_cnt >= MAX_TRACK_OVCS_IDS))
2172                 return;
2173
2174         track_ovcs_id[track_ovcs_id_cnt] = ovcs_id;
2175         track_ovcs_id_overlay_nr[track_ovcs_id_cnt] = overlay_nr;
2176         track_ovcs_id_cnt++;
2177 }
2178
2179 static void of_unittest_untrack_overlay(int ovcs_id)
2180 {
2181         if (WARN_ON(track_ovcs_id_cnt < 1))
2182                 return;
2183
2184         track_ovcs_id_cnt--;
2185
2186         /* If out of synch then test is broken.  Do not try to recover. */
2187         WARN_ON(track_ovcs_id[track_ovcs_id_cnt] != ovcs_id);
2188 }
2189
2190 static void of_unittest_remove_tracked_overlays(void)
2191 {
2192         int ret, ovcs_id, overlay_nr, save_ovcs_id;
2193         const char *overlay_name;
2194
2195         while (track_ovcs_id_cnt > 0) {
2196
2197                 ovcs_id = track_ovcs_id[track_ovcs_id_cnt - 1];
2198                 overlay_nr = track_ovcs_id_overlay_nr[track_ovcs_id_cnt - 1];
2199                 save_ovcs_id = ovcs_id;
2200                 ret = of_overlay_remove(&ovcs_id);
2201                 if (ret == -ENODEV) {
2202                         overlay_name = overlay_name_from_nr(overlay_nr);
2203                         pr_warn("%s: of_overlay_remove() for overlay \"%s\" failed, ret = %d\n",
2204                                 __func__, overlay_name, ret);
2205                 }
2206                 of_unittest_untrack_overlay(save_ovcs_id);
2207         }
2208
2209 }
2210
2211 static int __init of_unittest_apply_overlay(int overlay_nr, int *ovcs_id)
2212 {
2213         /*
2214          * The overlay will be tracked, thus it will be removed
2215          * by of_unittest_remove_tracked_overlays().
2216          */
2217
2218         const char *overlay_name;
2219
2220         overlay_name = overlay_name_from_nr(overlay_nr);
2221
2222         if (!overlay_data_apply(overlay_name, ovcs_id)) {
2223                 unittest(0, "could not apply overlay \"%s\"\n", overlay_name);
2224                 return -EFAULT;
2225         }
2226         of_unittest_track_overlay(*ovcs_id, overlay_nr);
2227
2228         return 0;
2229 }
2230
2231 static int __init __of_unittest_apply_overlay_check(int overlay_nr,
2232                 int unittest_nr, int before, int after,
2233                 enum overlay_type ovtype)
2234 {
2235         int ret, ovcs_id;
2236
2237         /* unittest device must be in before state */
2238         if (of_unittest_device_exists(unittest_nr, ovtype) != before) {
2239                 unittest(0, "%s with device @\"%s\" %s\n",
2240                                 overlay_name_from_nr(overlay_nr),
2241                                 unittest_path(unittest_nr, ovtype),
2242                                 !before ? "enabled" : "disabled");
2243                 return -EINVAL;
2244         }
2245
2246         /* apply the overlay */
2247         ovcs_id = 0;
2248         ret = of_unittest_apply_overlay(overlay_nr, &ovcs_id);
2249         if (ret != 0) {
2250                 /* of_unittest_apply_overlay already called unittest() */
2251                 return ret;
2252         }
2253
2254         /* unittest device must be in after state */
2255         if (of_unittest_device_exists(unittest_nr, ovtype) != after) {
2256                 unittest(0, "%s with device @\"%s\" %s\n",
2257                                 overlay_name_from_nr(overlay_nr),
2258                                 unittest_path(unittest_nr, ovtype),
2259                                 !after ? "enabled" : "disabled");
2260                 return -EINVAL;
2261         }
2262
2263         return ovcs_id;
2264 }
2265
2266 /* apply an overlay while checking before and after states */
2267 static int __init of_unittest_apply_overlay_check(int overlay_nr,
2268                 int unittest_nr, int before, int after,
2269                 enum overlay_type ovtype)
2270 {
2271         int ovcs_id = __of_unittest_apply_overlay_check(overlay_nr,
2272                                 unittest_nr, before, after, ovtype);
2273         if (ovcs_id < 0)
2274                 return ovcs_id;
2275
2276         return 0;
2277 }
2278
2279 /* apply an overlay and then revert it while checking before, after states */
2280 static int __init of_unittest_apply_revert_overlay_check(int overlay_nr,
2281                 int unittest_nr, int before, int after,
2282                 enum overlay_type ovtype)
2283 {
2284         int ret, ovcs_id, save_ovcs_id;
2285
2286         ovcs_id = __of_unittest_apply_overlay_check(overlay_nr, unittest_nr,
2287                                                     before, after, ovtype);
2288         if (ovcs_id < 0)
2289                 return ovcs_id;
2290
2291         /* remove the overlay */
2292         save_ovcs_id = ovcs_id;
2293         ret = of_overlay_remove(&ovcs_id);
2294         if (ret != 0) {
2295                 unittest(0, "%s failed to be destroyed @\"%s\"\n",
2296                                 overlay_name_from_nr(overlay_nr),
2297                                 unittest_path(unittest_nr, ovtype));
2298                 return ret;
2299         }
2300         of_unittest_untrack_overlay(save_ovcs_id);
2301
2302         /* unittest device must be again in before state */
2303         if (of_unittest_device_exists(unittest_nr, ovtype) != before) {
2304                 unittest(0, "%s with device @\"%s\" %s\n",
2305                                 overlay_name_from_nr(overlay_nr),
2306                                 unittest_path(unittest_nr, ovtype),
2307                                 !before ? "enabled" : "disabled");
2308                 return -EINVAL;
2309         }
2310
2311         return 0;
2312 }
2313
2314 /* test activation of device */
2315 static void __init of_unittest_overlay_0(void)
2316 {
2317         int ret;
2318
2319         EXPECT_BEGIN(KERN_INFO,
2320                      "OF: overlay: WARNING: memory leak will occur if overlay removed, property: /testcase-data/overlay-node/test-bus/test-unittest0/status");
2321
2322         /* device should enable */
2323         ret = of_unittest_apply_overlay_check(0, 0, 0, 1, PDEV_OVERLAY);
2324
2325         EXPECT_END(KERN_INFO,
2326                    "OF: overlay: WARNING: memory leak will occur if overlay removed, property: /testcase-data/overlay-node/test-bus/test-unittest0/status");
2327
2328         if (ret)
2329                 return;
2330
2331         unittest(1, "overlay test %d passed\n", 0);
2332 }
2333
2334 /* test deactivation of device */
2335 static void __init of_unittest_overlay_1(void)
2336 {
2337         int ret;
2338
2339         EXPECT_BEGIN(KERN_INFO,
2340                      "OF: overlay: WARNING: memory leak will occur if overlay removed, property: /testcase-data/overlay-node/test-bus/test-unittest1/status");
2341
2342         /* device should disable */
2343         ret = of_unittest_apply_overlay_check(1, 1, 1, 0, PDEV_OVERLAY);
2344
2345         EXPECT_END(KERN_INFO,
2346                    "OF: overlay: WARNING: memory leak will occur if overlay removed, property: /testcase-data/overlay-node/test-bus/test-unittest1/status");
2347
2348         if (ret)
2349                 return;
2350
2351         unittest(1, "overlay test %d passed\n", 1);
2352
2353 }
2354
2355 /* test activation of device */
2356 static void __init of_unittest_overlay_2(void)
2357 {
2358         int ret;
2359
2360         EXPECT_BEGIN(KERN_INFO,
2361                      "OF: overlay: WARNING: memory leak will occur if overlay removed, property: /testcase-data/overlay-node/test-bus/test-unittest2/status");
2362
2363         /* device should enable */
2364         ret = of_unittest_apply_overlay_check(2, 2, 0, 1, PDEV_OVERLAY);
2365
2366         EXPECT_END(KERN_INFO,
2367                    "OF: overlay: WARNING: memory leak will occur if overlay removed, property: /testcase-data/overlay-node/test-bus/test-unittest2/status");
2368
2369         if (ret)
2370                 return;
2371         unittest(1, "overlay test %d passed\n", 2);
2372 }
2373
2374 /* test deactivation of device */
2375 static void __init of_unittest_overlay_3(void)
2376 {
2377         int ret;
2378
2379         EXPECT_BEGIN(KERN_INFO,
2380                      "OF: overlay: WARNING: memory leak will occur if overlay removed, property: /testcase-data/overlay-node/test-bus/test-unittest3/status");
2381
2382         /* device should disable */
2383         ret = of_unittest_apply_overlay_check(3, 3, 1, 0, PDEV_OVERLAY);
2384
2385         EXPECT_END(KERN_INFO,
2386                    "OF: overlay: WARNING: memory leak will occur if overlay removed, property: /testcase-data/overlay-node/test-bus/test-unittest3/status");
2387
2388         if (ret)
2389                 return;
2390
2391         unittest(1, "overlay test %d passed\n", 3);
2392 }
2393
2394 /* test activation of a full device node */
2395 static void __init of_unittest_overlay_4(void)
2396 {
2397         /* device should disable */
2398         if (of_unittest_apply_overlay_check(4, 4, 0, 1, PDEV_OVERLAY))
2399                 return;
2400
2401         unittest(1, "overlay test %d passed\n", 4);
2402 }
2403
2404 /* test overlay apply/revert sequence */
2405 static void __init of_unittest_overlay_5(void)
2406 {
2407         int ret;
2408
2409         EXPECT_BEGIN(KERN_INFO,
2410                      "OF: overlay: WARNING: memory leak will occur if overlay removed, property: /testcase-data/overlay-node/test-bus/test-unittest5/status");
2411
2412         /* device should disable */
2413         ret = of_unittest_apply_revert_overlay_check(5, 5, 0, 1, PDEV_OVERLAY);
2414
2415         EXPECT_END(KERN_INFO,
2416                    "OF: overlay: WARNING: memory leak will occur if overlay removed, property: /testcase-data/overlay-node/test-bus/test-unittest5/status");
2417
2418         if (ret)
2419                 return;
2420
2421         unittest(1, "overlay test %d passed\n", 5);
2422 }
2423
2424 /* test overlay application in sequence */
2425 static void __init of_unittest_overlay_6(void)
2426 {
2427         int i, save_ovcs_id[2], ovcs_id;
2428         int overlay_nr = 6, unittest_nr = 6;
2429         int before = 0, after = 1;
2430         const char *overlay_name;
2431
2432         int ret;
2433
2434         /* unittest device must be in before state */
2435         for (i = 0; i < 2; i++) {
2436                 if (of_unittest_device_exists(unittest_nr + i, PDEV_OVERLAY)
2437                                 != before) {
2438                         unittest(0, "%s with device @\"%s\" %s\n",
2439                                         overlay_name_from_nr(overlay_nr + i),
2440                                         unittest_path(unittest_nr + i,
2441                                                 PDEV_OVERLAY),
2442                                         !before ? "enabled" : "disabled");
2443                         return;
2444                 }
2445         }
2446
2447         /* apply the overlays */
2448
2449         EXPECT_BEGIN(KERN_INFO,
2450                      "OF: overlay: WARNING: memory leak will occur if overlay removed, property: /testcase-data/overlay-node/test-bus/test-unittest6/status");
2451
2452         overlay_name = overlay_name_from_nr(overlay_nr + 0);
2453
2454         ret = overlay_data_apply(overlay_name, &ovcs_id);
2455
2456         if (!ret) {
2457                 unittest(0, "could not apply overlay \"%s\"\n", overlay_name);
2458                         return;
2459         }
2460         save_ovcs_id[0] = ovcs_id;
2461         of_unittest_track_overlay(ovcs_id, overlay_nr + 0);
2462
2463         EXPECT_END(KERN_INFO,
2464                    "OF: overlay: WARNING: memory leak will occur if overlay removed, property: /testcase-data/overlay-node/test-bus/test-unittest6/status");
2465
2466         EXPECT_BEGIN(KERN_INFO,
2467                      "OF: overlay: WARNING: memory leak will occur if overlay removed, property: /testcase-data/overlay-node/test-bus/test-unittest7/status");
2468
2469         overlay_name = overlay_name_from_nr(overlay_nr + 1);
2470
2471         ret = overlay_data_apply(overlay_name, &ovcs_id);
2472
2473         if (!ret) {
2474                 unittest(0, "could not apply overlay \"%s\"\n", overlay_name);
2475                         return;
2476         }
2477         save_ovcs_id[1] = ovcs_id;
2478         of_unittest_track_overlay(ovcs_id, overlay_nr + 1);
2479
2480         EXPECT_END(KERN_INFO,
2481                    "OF: overlay: WARNING: memory leak will occur if overlay removed, property: /testcase-data/overlay-node/test-bus/test-unittest7/status");
2482
2483
2484         for (i = 0; i < 2; i++) {
2485                 /* unittest device must be in after state */
2486                 if (of_unittest_device_exists(unittest_nr + i, PDEV_OVERLAY)
2487                                 != after) {
2488                         unittest(0, "overlay @\"%s\" failed @\"%s\" %s\n",
2489                                         overlay_name_from_nr(overlay_nr + i),
2490                                         unittest_path(unittest_nr + i,
2491                                                 PDEV_OVERLAY),
2492                                         !after ? "enabled" : "disabled");
2493                         return;
2494                 }
2495         }
2496
2497         for (i = 1; i >= 0; i--) {
2498                 ovcs_id = save_ovcs_id[i];
2499                 if (of_overlay_remove(&ovcs_id)) {
2500                         unittest(0, "%s failed destroy @\"%s\"\n",
2501                                         overlay_name_from_nr(overlay_nr + i),
2502                                         unittest_path(unittest_nr + i,
2503                                                 PDEV_OVERLAY));
2504                         return;
2505                 }
2506                 of_unittest_untrack_overlay(save_ovcs_id[i]);
2507         }
2508
2509         for (i = 0; i < 2; i++) {
2510                 /* unittest device must be again in before state */
2511                 if (of_unittest_device_exists(unittest_nr + i, PDEV_OVERLAY)
2512                                 != before) {
2513                         unittest(0, "%s with device @\"%s\" %s\n",
2514                                         overlay_name_from_nr(overlay_nr + i),
2515                                         unittest_path(unittest_nr + i,
2516                                                 PDEV_OVERLAY),
2517                                         !before ? "enabled" : "disabled");
2518                         return;
2519                 }
2520         }
2521
2522         unittest(1, "overlay test %d passed\n", 6);
2523
2524 }
2525
2526 /* test overlay application in sequence */
2527 static void __init of_unittest_overlay_8(void)
2528 {
2529         int i, save_ovcs_id[2], ovcs_id;
2530         int overlay_nr = 8, unittest_nr = 8;
2531         const char *overlay_name;
2532         int ret;
2533
2534         /* we don't care about device state in this test */
2535
2536         EXPECT_BEGIN(KERN_INFO,
2537                      "OF: overlay: WARNING: memory leak will occur if overlay removed, property: /testcase-data/overlay-node/test-bus/test-unittest8/status");
2538
2539         overlay_name = overlay_name_from_nr(overlay_nr + 0);
2540
2541         ret = overlay_data_apply(overlay_name, &ovcs_id);
2542         if (!ret)
2543                 unittest(0, "could not apply overlay \"%s\"\n", overlay_name);
2544
2545         EXPECT_END(KERN_INFO,
2546                    "OF: overlay: WARNING: memory leak will occur if overlay removed, property: /testcase-data/overlay-node/test-bus/test-unittest8/status");
2547
2548         if (!ret)
2549                 return;
2550
2551         save_ovcs_id[0] = ovcs_id;
2552         of_unittest_track_overlay(ovcs_id, overlay_nr + 0);
2553
2554         overlay_name = overlay_name_from_nr(overlay_nr + 1);
2555
2556         EXPECT_BEGIN(KERN_INFO,
2557                      "OF: overlay: WARNING: memory leak will occur if overlay removed, property: /testcase-data/overlay-node/test-bus/test-unittest8/property-foo");
2558
2559         /* apply the overlays */
2560         ret = overlay_data_apply(overlay_name, &ovcs_id);
2561
2562         EXPECT_END(KERN_INFO,
2563                    "OF: overlay: WARNING: memory leak will occur if overlay removed, property: /testcase-data/overlay-node/test-bus/test-unittest8/property-foo");
2564
2565         if (!ret) {
2566                 unittest(0, "could not apply overlay \"%s\"\n", overlay_name);
2567                 return;
2568         }
2569
2570         save_ovcs_id[1] = ovcs_id;
2571         of_unittest_track_overlay(ovcs_id, overlay_nr + 1);
2572
2573         /* now try to remove first overlay (it should fail) */
2574         ovcs_id = save_ovcs_id[0];
2575
2576         EXPECT_BEGIN(KERN_INFO,
2577                      "OF: overlay: node_overlaps_later_cs: #6 overlaps with #7 @/testcase-data/overlay-node/test-bus/test-unittest8");
2578
2579         EXPECT_BEGIN(KERN_INFO,
2580                      "OF: overlay: overlay #6 is not topmost");
2581
2582         ret = of_overlay_remove(&ovcs_id);
2583
2584         EXPECT_END(KERN_INFO,
2585                    "OF: overlay: overlay #6 is not topmost");
2586
2587         EXPECT_END(KERN_INFO,
2588                    "OF: overlay: node_overlaps_later_cs: #6 overlaps with #7 @/testcase-data/overlay-node/test-bus/test-unittest8");
2589
2590         if (!ret) {
2591                 /*
2592                  * Should never get here.  If we do, expect a lot of
2593                  * subsequent tracking and overlay removal related errors.
2594                  */
2595                 unittest(0, "%s was destroyed @\"%s\"\n",
2596                                 overlay_name_from_nr(overlay_nr + 0),
2597                                 unittest_path(unittest_nr,
2598                                         PDEV_OVERLAY));
2599                 return;
2600         }
2601
2602         /* removing them in order should work */
2603         for (i = 1; i >= 0; i--) {
2604                 ovcs_id = save_ovcs_id[i];
2605                 if (of_overlay_remove(&ovcs_id)) {
2606                         unittest(0, "%s not destroyed @\"%s\"\n",
2607                                         overlay_name_from_nr(overlay_nr + i),
2608                                         unittest_path(unittest_nr,
2609                                                 PDEV_OVERLAY));
2610                         return;
2611                 }
2612                 of_unittest_untrack_overlay(save_ovcs_id[i]);
2613         }
2614
2615         unittest(1, "overlay test %d passed\n", 8);
2616 }
2617
2618 /* test insertion of a bus with parent devices */
2619 static void __init of_unittest_overlay_10(void)
2620 {
2621         int ret;
2622         char *child_path;
2623
2624         /* device should disable */
2625         ret = of_unittest_apply_overlay_check(10, 10, 0, 1, PDEV_OVERLAY);
2626
2627         if (unittest(ret == 0,
2628                         "overlay test %d failed; overlay application\n", 10))
2629                 return;
2630
2631         child_path = kasprintf(GFP_KERNEL, "%s/test-unittest101",
2632                         unittest_path(10, PDEV_OVERLAY));
2633         if (unittest(child_path, "overlay test %d failed; kasprintf\n", 10))
2634                 return;
2635
2636         ret = of_path_device_type_exists(child_path, PDEV_OVERLAY);
2637         kfree(child_path);
2638
2639         unittest(ret, "overlay test %d failed; no child device\n", 10);
2640 }
2641
2642 /* test insertion of a bus with parent devices (and revert) */
2643 static void __init of_unittest_overlay_11(void)
2644 {
2645         int ret;
2646
2647         /* device should disable */
2648         ret = of_unittest_apply_revert_overlay_check(11, 11, 0, 1,
2649                         PDEV_OVERLAY);
2650
2651         unittest(ret == 0, "overlay test %d failed; overlay apply\n", 11);
2652 }
2653
2654 #if IS_BUILTIN(CONFIG_I2C) && IS_ENABLED(CONFIG_OF_OVERLAY)
2655
2656 struct unittest_i2c_bus_data {
2657         struct platform_device  *pdev;
2658         struct i2c_adapter      adap;
2659 };
2660
2661 static int unittest_i2c_master_xfer(struct i2c_adapter *adap,
2662                 struct i2c_msg *msgs, int num)
2663 {
2664         struct unittest_i2c_bus_data *std = i2c_get_adapdata(adap);
2665
2666         (void)std;
2667
2668         return num;
2669 }
2670
2671 static u32 unittest_i2c_functionality(struct i2c_adapter *adap)
2672 {
2673         return I2C_FUNC_I2C | I2C_FUNC_SMBUS_EMUL;
2674 }
2675
2676 static const struct i2c_algorithm unittest_i2c_algo = {
2677         .master_xfer    = unittest_i2c_master_xfer,
2678         .functionality  = unittest_i2c_functionality,
2679 };
2680
2681 static int unittest_i2c_bus_probe(struct platform_device *pdev)
2682 {
2683         struct device *dev = &pdev->dev;
2684         struct device_node *np = dev->of_node;
2685         struct unittest_i2c_bus_data *std;
2686         struct i2c_adapter *adap;
2687         int ret;
2688
2689         if (np == NULL) {
2690                 dev_err(dev, "No OF data for device\n");
2691                 return -EINVAL;
2692
2693         }
2694
2695         dev_dbg(dev, "%s for node @%pOF\n", __func__, np);
2696
2697         std = devm_kzalloc(dev, sizeof(*std), GFP_KERNEL);
2698         if (!std)
2699                 return -ENOMEM;
2700
2701         /* link them together */
2702         std->pdev = pdev;
2703         platform_set_drvdata(pdev, std);
2704
2705         adap = &std->adap;
2706         i2c_set_adapdata(adap, std);
2707         adap->nr = -1;
2708         strscpy(adap->name, pdev->name, sizeof(adap->name));
2709         adap->class = I2C_CLASS_DEPRECATED;
2710         adap->algo = &unittest_i2c_algo;
2711         adap->dev.parent = dev;
2712         adap->dev.of_node = dev->of_node;
2713         adap->timeout = 5 * HZ;
2714         adap->retries = 3;
2715
2716         ret = i2c_add_numbered_adapter(adap);
2717         if (ret != 0) {
2718                 dev_err(dev, "Failed to add I2C adapter\n");
2719                 return ret;
2720         }
2721
2722         return 0;
2723 }
2724
2725 static void unittest_i2c_bus_remove(struct platform_device *pdev)
2726 {
2727         struct device *dev = &pdev->dev;
2728         struct device_node *np = dev->of_node;
2729         struct unittest_i2c_bus_data *std = platform_get_drvdata(pdev);
2730
2731         dev_dbg(dev, "%s for node @%pOF\n", __func__, np);
2732         i2c_del_adapter(&std->adap);
2733 }
2734
2735 static const struct of_device_id unittest_i2c_bus_match[] = {
2736         { .compatible = "unittest-i2c-bus", },
2737         {},
2738 };
2739
2740 static struct platform_driver unittest_i2c_bus_driver = {
2741         .probe                  = unittest_i2c_bus_probe,
2742         .remove_new             = unittest_i2c_bus_remove,
2743         .driver = {
2744                 .name           = "unittest-i2c-bus",
2745                 .of_match_table = unittest_i2c_bus_match,
2746         },
2747 };
2748
2749 static int unittest_i2c_dev_probe(struct i2c_client *client)
2750 {
2751         struct device *dev = &client->dev;
2752         struct device_node *np = client->dev.of_node;
2753
2754         if (!np) {
2755                 dev_err(dev, "No OF node\n");
2756                 return -EINVAL;
2757         }
2758
2759         dev_dbg(dev, "%s for node @%pOF\n", __func__, np);
2760
2761         return 0;
2762 };
2763
2764 static void unittest_i2c_dev_remove(struct i2c_client *client)
2765 {
2766         struct device *dev = &client->dev;
2767         struct device_node *np = client->dev.of_node;
2768
2769         dev_dbg(dev, "%s for node @%pOF\n", __func__, np);
2770 }
2771
2772 static const struct i2c_device_id unittest_i2c_dev_id[] = {
2773         { .name = "unittest-i2c-dev" },
2774         { }
2775 };
2776
2777 static struct i2c_driver unittest_i2c_dev_driver = {
2778         .driver = {
2779                 .name = "unittest-i2c-dev",
2780         },
2781         .probe = unittest_i2c_dev_probe,
2782         .remove = unittest_i2c_dev_remove,
2783         .id_table = unittest_i2c_dev_id,
2784 };
2785
2786 #if IS_BUILTIN(CONFIG_I2C_MUX)
2787
2788 static int unittest_i2c_mux_select_chan(struct i2c_mux_core *muxc, u32 chan)
2789 {
2790         return 0;
2791 }
2792
2793 static int unittest_i2c_mux_probe(struct i2c_client *client)
2794 {
2795         int i, nchans;
2796         struct device *dev = &client->dev;
2797         struct i2c_adapter *adap = client->adapter;
2798         struct device_node *np = client->dev.of_node, *child;
2799         struct i2c_mux_core *muxc;
2800         u32 reg, max_reg;
2801
2802         dev_dbg(dev, "%s for node @%pOF\n", __func__, np);
2803
2804         if (!np) {
2805                 dev_err(dev, "No OF node\n");
2806                 return -EINVAL;
2807         }
2808
2809         max_reg = (u32)-1;
2810         for_each_child_of_node(np, child) {
2811                 if (of_property_read_u32(child, "reg", &reg))
2812                         continue;
2813                 if (max_reg == (u32)-1 || reg > max_reg)
2814                         max_reg = reg;
2815         }
2816         nchans = max_reg == (u32)-1 ? 0 : max_reg + 1;
2817         if (nchans == 0) {
2818                 dev_err(dev, "No channels\n");
2819                 return -EINVAL;
2820         }
2821
2822         muxc = i2c_mux_alloc(adap, dev, nchans, 0, 0,
2823                              unittest_i2c_mux_select_chan, NULL);
2824         if (!muxc)
2825                 return -ENOMEM;
2826         for (i = 0; i < nchans; i++) {
2827                 if (i2c_mux_add_adapter(muxc, 0, i, 0)) {
2828                         dev_err(dev, "Failed to register mux #%d\n", i);
2829                         i2c_mux_del_adapters(muxc);
2830                         return -ENODEV;
2831                 }
2832         }
2833
2834         i2c_set_clientdata(client, muxc);
2835
2836         return 0;
2837 };
2838
2839 static void unittest_i2c_mux_remove(struct i2c_client *client)
2840 {
2841         struct device *dev = &client->dev;
2842         struct device_node *np = client->dev.of_node;
2843         struct i2c_mux_core *muxc = i2c_get_clientdata(client);
2844
2845         dev_dbg(dev, "%s for node @%pOF\n", __func__, np);
2846         i2c_mux_del_adapters(muxc);
2847 }
2848
2849 static const struct i2c_device_id unittest_i2c_mux_id[] = {
2850         { .name = "unittest-i2c-mux" },
2851         { }
2852 };
2853
2854 static struct i2c_driver unittest_i2c_mux_driver = {
2855         .driver = {
2856                 .name = "unittest-i2c-mux",
2857         },
2858         .probe = unittest_i2c_mux_probe,
2859         .remove = unittest_i2c_mux_remove,
2860         .id_table = unittest_i2c_mux_id,
2861 };
2862
2863 #endif
2864
2865 static int of_unittest_overlay_i2c_init(void)
2866 {
2867         int ret;
2868
2869         ret = i2c_add_driver(&unittest_i2c_dev_driver);
2870         if (unittest(ret == 0,
2871                         "could not register unittest i2c device driver\n"))
2872                 return ret;
2873
2874         ret = platform_driver_register(&unittest_i2c_bus_driver);
2875
2876         if (unittest(ret == 0,
2877                         "could not register unittest i2c bus driver\n"))
2878                 return ret;
2879
2880 #if IS_BUILTIN(CONFIG_I2C_MUX)
2881
2882         EXPECT_BEGIN(KERN_INFO,
2883                      "i2c i2c-1: Added multiplexed i2c bus 2");
2884
2885         ret = i2c_add_driver(&unittest_i2c_mux_driver);
2886
2887         EXPECT_END(KERN_INFO,
2888                    "i2c i2c-1: Added multiplexed i2c bus 2");
2889
2890         if (unittest(ret == 0,
2891                         "could not register unittest i2c mux driver\n"))
2892                 return ret;
2893 #endif
2894
2895         return 0;
2896 }
2897
2898 static void of_unittest_overlay_i2c_cleanup(void)
2899 {
2900 #if IS_BUILTIN(CONFIG_I2C_MUX)
2901         i2c_del_driver(&unittest_i2c_mux_driver);
2902 #endif
2903         platform_driver_unregister(&unittest_i2c_bus_driver);
2904         i2c_del_driver(&unittest_i2c_dev_driver);
2905 }
2906
2907 static void __init of_unittest_overlay_i2c_12(void)
2908 {
2909         int ret;
2910
2911         /* device should enable */
2912         EXPECT_BEGIN(KERN_INFO,
2913                      "OF: overlay: WARNING: memory leak will occur if overlay removed, property: /testcase-data/overlay-node/test-bus/i2c-test-bus/test-unittest12/status");
2914
2915         ret = of_unittest_apply_overlay_check(12, 12, 0, 1, I2C_OVERLAY);
2916
2917         EXPECT_END(KERN_INFO,
2918                    "OF: overlay: WARNING: memory leak will occur if overlay removed, property: /testcase-data/overlay-node/test-bus/i2c-test-bus/test-unittest12/status");
2919
2920         if (ret)
2921                 return;
2922
2923         unittest(1, "overlay test %d passed\n", 12);
2924 }
2925
2926 /* test deactivation of device */
2927 static void __init of_unittest_overlay_i2c_13(void)
2928 {
2929         int ret;
2930
2931         EXPECT_BEGIN(KERN_INFO,
2932                      "OF: overlay: WARNING: memory leak will occur if overlay removed, property: /testcase-data/overlay-node/test-bus/i2c-test-bus/test-unittest13/status");
2933
2934         /* device should disable */
2935         ret = of_unittest_apply_overlay_check(13, 13, 1, 0, I2C_OVERLAY);
2936
2937         EXPECT_END(KERN_INFO,
2938                    "OF: overlay: WARNING: memory leak will occur if overlay removed, property: /testcase-data/overlay-node/test-bus/i2c-test-bus/test-unittest13/status");
2939
2940         if (ret)
2941                 return;
2942
2943         unittest(1, "overlay test %d passed\n", 13);
2944 }
2945
2946 /* just check for i2c mux existence */
2947 static void of_unittest_overlay_i2c_14(void)
2948 {
2949 }
2950
2951 static void __init of_unittest_overlay_i2c_15(void)
2952 {
2953         int ret;
2954
2955         /* device should enable */
2956         EXPECT_BEGIN(KERN_INFO,
2957                      "i2c i2c-1: Added multiplexed i2c bus 3");
2958
2959         ret = of_unittest_apply_overlay_check(15, 15, 0, 1, I2C_OVERLAY);
2960
2961         EXPECT_END(KERN_INFO,
2962                    "i2c i2c-1: Added multiplexed i2c bus 3");
2963
2964         if (ret)
2965                 return;
2966
2967         unittest(1, "overlay test %d passed\n", 15);
2968 }
2969
2970 #else
2971
2972 static inline void of_unittest_overlay_i2c_14(void) { }
2973 static inline void of_unittest_overlay_i2c_15(void) { }
2974
2975 #endif
2976
2977 static int of_notify(struct notifier_block *nb, unsigned long action,
2978                      void *arg)
2979 {
2980         struct of_overlay_notify_data *nd = arg;
2981         struct device_node *found;
2982         int ret;
2983
2984         /*
2985          * For overlay_16 .. overlay_19, check that returning an error
2986          * works for each of the actions by setting an arbitrary return
2987          * error number that matches the test number.  e.g. for unittest16,
2988          * ret = -EBUSY which is -16.
2989          *
2990          * OVERLAY_INFO() for the overlays is declared to expect the same
2991          * error number, so overlay_data_apply() will return no error.
2992          *
2993          * overlay_20 will return NOTIFY_DONE
2994          */
2995
2996         ret = 0;
2997         of_node_get(nd->overlay);
2998
2999         switch (action) {
3000
3001         case OF_OVERLAY_PRE_APPLY:
3002                 found = of_find_node_by_name(nd->overlay, "test-unittest16");
3003                 if (found) {
3004                         of_node_put(found);
3005                         ret = -EBUSY;
3006                 }
3007                 break;
3008
3009         case OF_OVERLAY_POST_APPLY:
3010                 found = of_find_node_by_name(nd->overlay, "test-unittest17");
3011                 if (found) {
3012                         of_node_put(found);
3013                         ret = -EEXIST;
3014                 }
3015                 break;
3016
3017         case OF_OVERLAY_PRE_REMOVE:
3018                 found = of_find_node_by_name(nd->overlay, "test-unittest18");
3019                 if (found) {
3020                         of_node_put(found);
3021                         ret = -EXDEV;
3022                 }
3023                 break;
3024
3025         case OF_OVERLAY_POST_REMOVE:
3026                 found = of_find_node_by_name(nd->overlay, "test-unittest19");
3027                 if (found) {
3028                         of_node_put(found);
3029                         ret = -ENODEV;
3030                 }
3031                 break;
3032
3033         default:                        /* should not happen */
3034                 of_node_put(nd->overlay);
3035                 ret = -EINVAL;
3036                 break;
3037         }
3038
3039         if (ret)
3040                 return notifier_from_errno(ret);
3041
3042         return NOTIFY_DONE;
3043 }
3044
3045 static struct notifier_block of_nb = {
3046         .notifier_call = of_notify,
3047 };
3048
3049 static void __init of_unittest_overlay_notify(void)
3050 {
3051         int ovcs_id;
3052         int ret;
3053
3054         ret = of_overlay_notifier_register(&of_nb);
3055         unittest(!ret,
3056                  "of_overlay_notifier_register() failed, ret = %d\n", ret);
3057         if (ret)
3058                 return;
3059
3060         /*
3061          * The overlays are applied by overlay_data_apply()
3062          * instead of of_unittest_apply_overlay() so that they
3063          * will not be tracked.  Thus they will not be removed
3064          * by of_unittest_remove_tracked_overlays().
3065          *
3066          * Applying overlays 16 - 19 will each trigger an error for a
3067          * different action in of_notify().
3068          *
3069          * Applying overlay 20 will not trigger any error in of_notify().
3070          */
3071
3072         /* ---  overlay 16  --- */
3073
3074         EXPECT_BEGIN(KERN_INFO, "OF: overlay: overlay changeset pre-apply notifier error -16, target: /testcase-data/overlay-node/test-bus");
3075
3076         unittest(overlay_data_apply("overlay_16", &ovcs_id),
3077                  "test OF_OVERLAY_PRE_APPLY notify injected error\n");
3078
3079         EXPECT_END(KERN_INFO, "OF: overlay: overlay changeset pre-apply notifier error -16, target: /testcase-data/overlay-node/test-bus");
3080
3081         unittest(ovcs_id, "ovcs_id not created for overlay_16\n");
3082
3083         /* ---  overlay 17  --- */
3084
3085         EXPECT_BEGIN(KERN_INFO, "OF: overlay: overlay changeset post-apply notifier error -17, target: /testcase-data/overlay-node/test-bus");
3086
3087         unittest(overlay_data_apply("overlay_17", &ovcs_id),
3088                  "test OF_OVERLAY_POST_APPLY notify injected error\n");
3089
3090         EXPECT_END(KERN_INFO, "OF: overlay: overlay changeset post-apply notifier error -17, target: /testcase-data/overlay-node/test-bus");
3091
3092         unittest(ovcs_id, "ovcs_id not created for overlay_17\n");
3093
3094         /* ---  overlay 18  --- */
3095
3096         unittest(overlay_data_apply("overlay_18", &ovcs_id),
3097                  "OF_OVERLAY_PRE_REMOVE notify injected error\n");
3098
3099         unittest(ovcs_id, "ovcs_id not created for overlay_18\n");
3100
3101         if (ovcs_id) {
3102                 EXPECT_BEGIN(KERN_INFO, "OF: overlay: overlay changeset pre-remove notifier error -18, target: /testcase-data/overlay-node/test-bus");
3103
3104                 ret = of_overlay_remove(&ovcs_id);
3105                 EXPECT_END(KERN_INFO, "OF: overlay: overlay changeset pre-remove notifier error -18, target: /testcase-data/overlay-node/test-bus");
3106                 if (ret == -EXDEV) {
3107                         /*
3108                          * change set ovcs_id should still exist
3109                          */
3110                         unittest(1, "overlay_18 of_overlay_remove() injected error for OF_OVERLAY_PRE_REMOVE\n");
3111                 } else {
3112                         unittest(0, "overlay_18 of_overlay_remove() injected error for OF_OVERLAY_PRE_REMOVE not returned\n");
3113                 }
3114         } else {
3115                 unittest(1, "ovcs_id not created for overlay_18\n");
3116         }
3117
3118         unittest(ovcs_id, "ovcs_id removed for overlay_18\n");
3119
3120         /* ---  overlay 19  --- */
3121
3122         unittest(overlay_data_apply("overlay_19", &ovcs_id),
3123                  "OF_OVERLAY_POST_REMOVE notify injected error\n");
3124
3125         unittest(ovcs_id, "ovcs_id not created for overlay_19\n");
3126
3127         if (ovcs_id) {
3128                 EXPECT_BEGIN(KERN_INFO, "OF: overlay: overlay changeset post-remove notifier error -19, target: /testcase-data/overlay-node/test-bus");
3129                 ret = of_overlay_remove(&ovcs_id);
3130                 EXPECT_END(KERN_INFO, "OF: overlay: overlay changeset post-remove notifier error -19, target: /testcase-data/overlay-node/test-bus");
3131                 if (ret == -ENODEV)
3132                         unittest(1, "overlay_19 of_overlay_remove() injected error for OF_OVERLAY_POST_REMOVE\n");
3133                 else
3134                         unittest(0, "overlay_19 of_overlay_remove() injected error for OF_OVERLAY_POST_REMOVE not returned\n");
3135         } else {
3136                 unittest(1, "ovcs_id removed for overlay_19\n");
3137         }
3138
3139         unittest(!ovcs_id, "changeset ovcs_id = %d not removed for overlay_19\n",
3140                  ovcs_id);
3141
3142         /* ---  overlay 20  --- */
3143
3144         unittest(overlay_data_apply("overlay_20", &ovcs_id),
3145                  "overlay notify no injected error\n");
3146
3147         if (ovcs_id) {
3148                 ret = of_overlay_remove(&ovcs_id);
3149                 if (ret)
3150                         unittest(1, "overlay_20 failed to be destroyed, ret = %d\n",
3151                                  ret);
3152         } else {
3153                 unittest(1, "ovcs_id not created for overlay_20\n");
3154         }
3155
3156         unittest(!of_overlay_notifier_unregister(&of_nb),
3157                  "of_overlay_notifier_unregister() failed, ret = %d\n", ret);
3158 }
3159
3160 static void __init of_unittest_overlay(void)
3161 {
3162         struct device_node *bus_np = NULL;
3163         unsigned int i;
3164
3165         if (platform_driver_register(&unittest_driver)) {
3166                 unittest(0, "could not register unittest driver\n");
3167                 goto out;
3168         }
3169
3170         bus_np = of_find_node_by_path(bus_path);
3171         if (bus_np == NULL) {
3172                 unittest(0, "could not find bus_path \"%s\"\n", bus_path);
3173                 goto out;
3174         }
3175
3176         if (of_platform_default_populate(bus_np, NULL, NULL)) {
3177                 unittest(0, "could not populate bus @ \"%s\"\n", bus_path);
3178                 goto out;
3179         }
3180
3181         if (!of_unittest_device_exists(100, PDEV_OVERLAY)) {
3182                 unittest(0, "could not find unittest0 @ \"%s\"\n",
3183                                 unittest_path(100, PDEV_OVERLAY));
3184                 goto out;
3185         }
3186
3187         if (of_unittest_device_exists(101, PDEV_OVERLAY)) {
3188                 unittest(0, "unittest1 @ \"%s\" should not exist\n",
3189                                 unittest_path(101, PDEV_OVERLAY));
3190                 goto out;
3191         }
3192
3193         unittest(1, "basic infrastructure of overlays passed");
3194
3195         /* tests in sequence */
3196         of_unittest_overlay_0();
3197         of_unittest_overlay_1();
3198         of_unittest_overlay_2();
3199         of_unittest_overlay_3();
3200         of_unittest_overlay_4();
3201         for (i = 0; i < 3; i++)
3202                 of_unittest_overlay_5();
3203         of_unittest_overlay_6();
3204         of_unittest_overlay_8();
3205
3206         of_unittest_overlay_10();
3207         of_unittest_overlay_11();
3208
3209 #if IS_BUILTIN(CONFIG_I2C)
3210         if (unittest(of_unittest_overlay_i2c_init() == 0, "i2c init failed\n"))
3211                 goto out;
3212
3213         of_unittest_overlay_i2c_12();
3214         of_unittest_overlay_i2c_13();
3215         of_unittest_overlay_i2c_14();
3216         of_unittest_overlay_i2c_15();
3217
3218         of_unittest_overlay_i2c_cleanup();
3219 #endif
3220
3221         of_unittest_overlay_gpio();
3222
3223         of_unittest_remove_tracked_overlays();
3224
3225         of_unittest_overlay_notify();
3226
3227 out:
3228         of_node_put(bus_np);
3229 }
3230
3231 #else
3232 static inline void __init of_unittest_overlay(void) { }
3233 #endif
3234
3235 static void __init of_unittest_lifecycle(void)
3236 {
3237 #ifdef CONFIG_OF_DYNAMIC
3238         unsigned int refcount;
3239         int found_refcount_one = 0;
3240         int put_count = 0;
3241         struct device_node *np;
3242         struct device_node *prev_sibling, *next_sibling;
3243         const char *refcount_path = "/testcase-data/refcount-node";
3244         const char *refcount_parent_path = "/testcase-data";
3245
3246         /*
3247          * Node lifecycle tests, non-dynamic node:
3248          *
3249          * - Decrementing refcount to zero via of_node_put() should cause the
3250          *   attempt to free the node memory by of_node_release() to fail
3251          *   because the node is not a dynamic node.
3252          *
3253          * - Decrementing refcount past zero should result in additional
3254          *   errors reported.
3255          */
3256
3257         np = of_find_node_by_path(refcount_path);
3258         unittest(np, "find refcount_path \"%s\"\n", refcount_path);
3259         if (np == NULL)
3260                 goto out_skip_tests;
3261
3262         while (!found_refcount_one) {
3263
3264                 if (put_count++ > 10) {
3265                         unittest(0, "guardrail to avoid infinite loop\n");
3266                         goto out_skip_tests;
3267                 }
3268
3269                 refcount = kref_read(&np->kobj.kref);
3270                 if (refcount == 1)
3271                         found_refcount_one = 1;
3272                 else
3273                         of_node_put(np);
3274         }
3275
3276         EXPECT_BEGIN(KERN_INFO, "OF: ERROR: of_node_release() detected bad of_node_put() on /testcase-data/refcount-node");
3277
3278         /*
3279          * refcount is now one, decrementing to zero will result in a call to
3280          * of_node_release() to free the node's memory, which should result
3281          * in an error
3282          */
3283         unittest(1, "/testcase-data/refcount-node is one");
3284         of_node_put(np);
3285
3286         EXPECT_END(KERN_INFO, "OF: ERROR: of_node_release() detected bad of_node_put() on /testcase-data/refcount-node");
3287
3288
3289         /*
3290          * expect stack trace for subsequent of_node_put():
3291          *   __refcount_sub_and_test() calls:
3292          *   refcount_warn_saturate(r, REFCOUNT_SUB_UAF)
3293          *
3294          * Not capturing entire WARN_ONCE() trace with EXPECT_*(), just
3295          * the first three lines, and the last line.
3296          */
3297         EXPECT_BEGIN(KERN_INFO, "------------[ cut here ]------------");
3298         EXPECT_BEGIN(KERN_INFO, "WARNING: <<all>>");
3299         EXPECT_BEGIN(KERN_INFO, "refcount_t: underflow; use-after-free.");
3300         EXPECT_BEGIN(KERN_INFO, "---[ end trace <<int>> ]---");
3301
3302         /* refcount is now zero, this should fail */
3303         unittest(1, "/testcase-data/refcount-node is zero");
3304         of_node_put(np);
3305
3306         EXPECT_END(KERN_INFO, "---[ end trace <<int>> ]---");
3307         EXPECT_END(KERN_INFO, "refcount_t: underflow; use-after-free.");
3308         EXPECT_END(KERN_INFO, "WARNING: <<all>>");
3309         EXPECT_END(KERN_INFO, "------------[ cut here ]------------");
3310
3311         /*
3312          * Q. do we expect to get yet another warning?
3313          * A. no, the WARNING is from WARN_ONCE()
3314          */
3315         EXPECT_NOT_BEGIN(KERN_INFO, "------------[ cut here ]------------");
3316         EXPECT_NOT_BEGIN(KERN_INFO, "WARNING: <<all>>");
3317         EXPECT_NOT_BEGIN(KERN_INFO, "refcount_t: underflow; use-after-free.");
3318         EXPECT_NOT_BEGIN(KERN_INFO, "---[ end trace <<int>> ]---");
3319
3320         unittest(1, "/testcase-data/refcount-node is zero, second time");
3321         of_node_put(np);
3322
3323         EXPECT_NOT_END(KERN_INFO, "---[ end trace <<int>> ]---");
3324         EXPECT_NOT_END(KERN_INFO, "refcount_t: underflow; use-after-free.");
3325         EXPECT_NOT_END(KERN_INFO, "WARNING: <<all>>");
3326         EXPECT_NOT_END(KERN_INFO, "------------[ cut here ]------------");
3327
3328         /*
3329          * refcount of zero will trigger stack traces from any further
3330          * attempt to of_node_get() node "refcount-node". One example of
3331          * this is where of_unittest_check_node_linkage() will recursively
3332          * scan the tree, with 'for_each_child_of_node()' doing an
3333          * of_node_get() of the children of a node.
3334          *
3335          * Prevent the stack trace by removing node "refcount-node" from
3336          * its parent's child list.
3337          *
3338          * WARNING:  EVIL, EVIL, EVIL:
3339          *
3340          *   Directly manipulate the child list of node /testcase-data to
3341          *   remove child refcount-node.  This is ignoring all proper methods
3342          *   of removing a child and will leak a small amount of memory.
3343          */
3344
3345         np = of_find_node_by_path(refcount_parent_path);
3346         unittest(np, "find refcount_parent_path \"%s\"\n", refcount_parent_path);
3347         unittest(np, "ERROR: devicetree live tree left in a 'bad state' if test fail\n");
3348         if (np == NULL)
3349                 return;
3350
3351         prev_sibling = np->child;
3352         next_sibling = prev_sibling->sibling;
3353         if (!strcmp(prev_sibling->full_name, "refcount-node")) {
3354                 np->child = next_sibling;
3355                 next_sibling = next_sibling->sibling;
3356         }
3357         while (next_sibling) {
3358                 if (!strcmp(next_sibling->full_name, "refcount-node"))
3359                         prev_sibling->sibling = next_sibling->sibling;
3360                 prev_sibling = next_sibling;
3361                 next_sibling = next_sibling->sibling;
3362         }
3363         of_node_put(np);
3364
3365         return;
3366
3367 out_skip_tests:
3368 #endif
3369         unittest(0, "One or more lifecycle tests skipped\n");
3370 }
3371
3372 #ifdef CONFIG_OF_OVERLAY
3373
3374 /*
3375  * __dtbo_##overlay_name##_begin[] and __dtbo_##overlay_name##_end[] are
3376  * created by cmd_dt_S_dtbo in scripts/Makefile.lib
3377  */
3378
3379 #define OVERLAY_INFO_EXTERN(overlay_name) \
3380         extern uint8_t __dtbo_##overlay_name##_begin[]; \
3381         extern uint8_t __dtbo_##overlay_name##_end[]
3382
3383 #define OVERLAY_INFO(overlay_name, expected, expected_remove) \
3384 {       .dtbo_begin             = __dtbo_##overlay_name##_begin, \
3385         .dtbo_end               = __dtbo_##overlay_name##_end, \
3386         .expected_result        = expected, \
3387         .expected_result_remove = expected_remove, \
3388         .name                   = #overlay_name, \
3389 }
3390
3391 struct overlay_info {
3392         uint8_t         *dtbo_begin;
3393         uint8_t         *dtbo_end;
3394         int             expected_result;
3395         int             expected_result_remove; /* if apply failed */
3396         int             ovcs_id;
3397         char            *name;
3398 };
3399
3400 OVERLAY_INFO_EXTERN(overlay_base);
3401 OVERLAY_INFO_EXTERN(overlay);
3402 OVERLAY_INFO_EXTERN(overlay_0);
3403 OVERLAY_INFO_EXTERN(overlay_1);
3404 OVERLAY_INFO_EXTERN(overlay_2);
3405 OVERLAY_INFO_EXTERN(overlay_3);
3406 OVERLAY_INFO_EXTERN(overlay_4);
3407 OVERLAY_INFO_EXTERN(overlay_5);
3408 OVERLAY_INFO_EXTERN(overlay_6);
3409 OVERLAY_INFO_EXTERN(overlay_7);
3410 OVERLAY_INFO_EXTERN(overlay_8);
3411 OVERLAY_INFO_EXTERN(overlay_9);
3412 OVERLAY_INFO_EXTERN(overlay_10);
3413 OVERLAY_INFO_EXTERN(overlay_11);
3414 OVERLAY_INFO_EXTERN(overlay_12);
3415 OVERLAY_INFO_EXTERN(overlay_13);
3416 OVERLAY_INFO_EXTERN(overlay_15);
3417 OVERLAY_INFO_EXTERN(overlay_16);
3418 OVERLAY_INFO_EXTERN(overlay_17);
3419 OVERLAY_INFO_EXTERN(overlay_18);
3420 OVERLAY_INFO_EXTERN(overlay_19);
3421 OVERLAY_INFO_EXTERN(overlay_20);
3422 OVERLAY_INFO_EXTERN(overlay_gpio_01);
3423 OVERLAY_INFO_EXTERN(overlay_gpio_02a);
3424 OVERLAY_INFO_EXTERN(overlay_gpio_02b);
3425 OVERLAY_INFO_EXTERN(overlay_gpio_03);
3426 OVERLAY_INFO_EXTERN(overlay_gpio_04a);
3427 OVERLAY_INFO_EXTERN(overlay_gpio_04b);
3428 OVERLAY_INFO_EXTERN(overlay_pci_node);
3429 OVERLAY_INFO_EXTERN(overlay_bad_add_dup_node);
3430 OVERLAY_INFO_EXTERN(overlay_bad_add_dup_prop);
3431 OVERLAY_INFO_EXTERN(overlay_bad_phandle);
3432 OVERLAY_INFO_EXTERN(overlay_bad_symbol);
3433 OVERLAY_INFO_EXTERN(overlay_bad_unresolved);
3434
3435 /* entries found by name */
3436 static struct overlay_info overlays[] = {
3437         OVERLAY_INFO(overlay_base, -9999, 0),
3438         OVERLAY_INFO(overlay, 0, 0),
3439         OVERLAY_INFO(overlay_0, 0, 0),
3440         OVERLAY_INFO(overlay_1, 0, 0),
3441         OVERLAY_INFO(overlay_2, 0, 0),
3442         OVERLAY_INFO(overlay_3, 0, 0),
3443         OVERLAY_INFO(overlay_4, 0, 0),
3444         OVERLAY_INFO(overlay_5, 0, 0),
3445         OVERLAY_INFO(overlay_6, 0, 0),
3446         OVERLAY_INFO(overlay_7, 0, 0),
3447         OVERLAY_INFO(overlay_8, 0, 0),
3448         OVERLAY_INFO(overlay_9, 0, 0),
3449         OVERLAY_INFO(overlay_10, 0, 0),
3450         OVERLAY_INFO(overlay_11, 0, 0),
3451         OVERLAY_INFO(overlay_12, 0, 0),
3452         OVERLAY_INFO(overlay_13, 0, 0),
3453         OVERLAY_INFO(overlay_15, 0, 0),
3454         OVERLAY_INFO(overlay_16, -EBUSY, 0),
3455         OVERLAY_INFO(overlay_17, -EEXIST, 0),
3456         OVERLAY_INFO(overlay_18, 0, 0),
3457         OVERLAY_INFO(overlay_19, 0, 0),
3458         OVERLAY_INFO(overlay_20, 0, 0),
3459         OVERLAY_INFO(overlay_gpio_01, 0, 0),
3460         OVERLAY_INFO(overlay_gpio_02a, 0, 0),
3461         OVERLAY_INFO(overlay_gpio_02b, 0, 0),
3462         OVERLAY_INFO(overlay_gpio_03, 0, 0),
3463         OVERLAY_INFO(overlay_gpio_04a, 0, 0),
3464         OVERLAY_INFO(overlay_gpio_04b, 0, 0),
3465         OVERLAY_INFO(overlay_pci_node, 0, 0),
3466         OVERLAY_INFO(overlay_bad_add_dup_node, -EINVAL, -ENODEV),
3467         OVERLAY_INFO(overlay_bad_add_dup_prop, -EINVAL, -ENODEV),
3468         OVERLAY_INFO(overlay_bad_phandle, -EINVAL, 0),
3469         OVERLAY_INFO(overlay_bad_symbol, -EINVAL, -ENODEV),
3470         OVERLAY_INFO(overlay_bad_unresolved, -EINVAL, 0),
3471         /* end marker */
3472         { }
3473 };
3474
3475 static struct device_node *overlay_base_root;
3476
3477 static void * __init dt_alloc_memory(u64 size, u64 align)
3478 {
3479         void *ptr = memblock_alloc(size, align);
3480
3481         if (!ptr)
3482                 panic("%s: Failed to allocate %llu bytes align=0x%llx\n",
3483                       __func__, size, align);
3484
3485         return ptr;
3486 }
3487
3488 /*
3489  * Create base device tree for the overlay unittest.
3490  *
3491  * This is called from very early boot code.
3492  *
3493  * Do as much as possible the same way as done in __unflatten_device_tree
3494  * and other early boot steps for the normal FDT so that the overlay base
3495  * unflattened tree will have the same characteristics as the real tree
3496  * (such as having memory allocated by the early allocator).  The goal
3497  * is to test "the real thing" as much as possible, and test "test setup
3498  * code" as little as possible.
3499  *
3500  * Have to stop before resolving phandles, because that uses kmalloc.
3501  */
3502 void __init unittest_unflatten_overlay_base(void)
3503 {
3504         struct overlay_info *info;
3505         u32 data_size;
3506         void *new_fdt;
3507         u32 size;
3508         int found = 0;
3509         const char *overlay_name = "overlay_base";
3510
3511         for (info = overlays; info && info->name; info++) {
3512                 if (!strcmp(overlay_name, info->name)) {
3513                         found = 1;
3514                         break;
3515                 }
3516         }
3517         if (!found) {
3518                 pr_err("no overlay data for %s\n", overlay_name);
3519                 return;
3520         }
3521
3522         info = &overlays[0];
3523
3524         if (info->expected_result != -9999) {
3525                 pr_err("No dtb 'overlay_base' to attach\n");
3526                 return;
3527         }
3528
3529         data_size = info->dtbo_end - info->dtbo_begin;
3530         if (!data_size) {
3531                 pr_err("No dtb 'overlay_base' to attach\n");
3532                 return;
3533         }
3534
3535         size = fdt_totalsize(info->dtbo_begin);
3536         if (size != data_size) {
3537                 pr_err("dtb 'overlay_base' header totalsize != actual size");
3538                 return;
3539         }
3540
3541         new_fdt = dt_alloc_memory(size, roundup_pow_of_two(FDT_V17_SIZE));
3542         if (!new_fdt) {
3543                 pr_err("alloc for dtb 'overlay_base' failed");
3544                 return;
3545         }
3546
3547         memcpy(new_fdt, info->dtbo_begin, size);
3548
3549         __unflatten_device_tree(new_fdt, NULL, &overlay_base_root,
3550                                 dt_alloc_memory, true);
3551 }
3552
3553 /*
3554  * The purpose of of_unittest_overlay_data_add is to add an
3555  * overlay in the normal fashion.  This is a test of the whole
3556  * picture, instead of testing individual elements.
3557  *
3558  * A secondary purpose is to be able to verify that the contents of
3559  * /proc/device-tree/ contains the updated structure and values from
3560  * the overlay.  That must be verified separately in user space.
3561  *
3562  * Return 0 on unexpected error.
3563  */
3564 static int __init overlay_data_apply(const char *overlay_name, int *ovcs_id)
3565 {
3566         struct overlay_info *info;
3567         int passed = 1;
3568         int found = 0;
3569         int ret, ret2;
3570         u32 size;
3571
3572         for (info = overlays; info && info->name; info++) {
3573                 if (!strcmp(overlay_name, info->name)) {
3574                         found = 1;
3575                         break;
3576                 }
3577         }
3578         if (!found) {
3579                 pr_err("no overlay data for %s\n", overlay_name);
3580                 return 0;
3581         }
3582
3583         size = info->dtbo_end - info->dtbo_begin;
3584         if (!size)
3585                 pr_err("no overlay data for %s\n", overlay_name);
3586
3587         ret = of_overlay_fdt_apply(info->dtbo_begin, size, &info->ovcs_id,
3588                                    NULL);
3589         if (ovcs_id)
3590                 *ovcs_id = info->ovcs_id;
3591         if (ret < 0)
3592                 goto out;
3593
3594         pr_debug("%s applied\n", overlay_name);
3595
3596 out:
3597         if (ret != info->expected_result) {
3598                 pr_err("of_overlay_fdt_apply() expected %d, ret=%d, %s\n",
3599                        info->expected_result, ret, overlay_name);
3600                 passed = 0;
3601         }
3602
3603         if (ret < 0) {
3604                 /* changeset may be partially applied */
3605                 ret2 = of_overlay_remove(&info->ovcs_id);
3606                 if (ret2 != info->expected_result_remove) {
3607                         pr_err("of_overlay_remove() expected %d, ret=%d, %s\n",
3608                                info->expected_result_remove, ret2,
3609                                overlay_name);
3610                         passed = 0;
3611                 }
3612         }
3613
3614         return passed;
3615 }
3616
3617 /*
3618  * The purpose of of_unittest_overlay_high_level is to add an overlay
3619  * in the normal fashion.  This is a test of the whole picture,
3620  * instead of individual elements.
3621  *
3622  * The first part of the function is _not_ normal overlay usage; it is
3623  * finishing splicing the base overlay device tree into the live tree.
3624  */
3625 static __init void of_unittest_overlay_high_level(void)
3626 {
3627         struct device_node *last_sibling;
3628         struct device_node *np;
3629         struct device_node *of_symbols;
3630         struct device_node *overlay_base_symbols;
3631         struct device_node **pprev;
3632         struct property *prop;
3633         int ret;
3634
3635         if (!overlay_base_root) {
3636                 unittest(0, "overlay_base_root not initialized\n");
3637                 return;
3638         }
3639
3640         /*
3641          * Could not fixup phandles in unittest_unflatten_overlay_base()
3642          * because kmalloc() was not yet available.
3643          */
3644         of_overlay_mutex_lock();
3645         of_resolve_phandles(overlay_base_root);
3646         of_overlay_mutex_unlock();
3647
3648
3649         /*
3650          * do not allow overlay_base to duplicate any node already in
3651          * tree, this greatly simplifies the code
3652          */
3653
3654         /*
3655          * remove overlay_base_root node "__local_fixups", after
3656          * being used by of_resolve_phandles()
3657          */
3658         pprev = &overlay_base_root->child;
3659         for (np = overlay_base_root->child; np; np = np->sibling) {
3660                 if (of_node_name_eq(np, "__local_fixups__")) {
3661                         *pprev = np->sibling;
3662                         break;
3663                 }
3664                 pprev = &np->sibling;
3665         }
3666
3667         /* remove overlay_base_root node "__symbols__" if in live tree */
3668         of_symbols = of_get_child_by_name(of_root, "__symbols__");
3669         if (of_symbols) {
3670                 /* will have to graft properties from node into live tree */
3671                 pprev = &overlay_base_root->child;
3672                 for (np = overlay_base_root->child; np; np = np->sibling) {
3673                         if (of_node_name_eq(np, "__symbols__")) {
3674                                 overlay_base_symbols = np;
3675                                 *pprev = np->sibling;
3676                                 break;
3677                         }
3678                         pprev = &np->sibling;
3679                 }
3680         }
3681
3682         for_each_child_of_node(overlay_base_root, np) {
3683                 struct device_node *base_child;
3684                 for_each_child_of_node(of_root, base_child) {
3685                         if (!strcmp(np->full_name, base_child->full_name)) {
3686                                 unittest(0, "illegal node name in overlay_base %pOFn",
3687                                          np);
3688                                 of_node_put(np);
3689                                 of_node_put(base_child);
3690                                 return;
3691                         }
3692                 }
3693         }
3694
3695         /*
3696          * overlay 'overlay_base' is not allowed to have root
3697          * properties, so only need to splice nodes into main device tree.
3698          *
3699          * root node of *overlay_base_root will not be freed, it is lost
3700          * memory.
3701          */
3702
3703         for (np = overlay_base_root->child; np; np = np->sibling)
3704                 np->parent = of_root;
3705
3706         mutex_lock(&of_mutex);
3707
3708         for (last_sibling = np = of_root->child; np; np = np->sibling)
3709                 last_sibling = np;
3710
3711         if (last_sibling)
3712                 last_sibling->sibling = overlay_base_root->child;
3713         else
3714                 of_root->child = overlay_base_root->child;
3715
3716         for_each_of_allnodes_from(overlay_base_root, np)
3717                 __of_attach_node_sysfs(np);
3718
3719         if (of_symbols) {
3720                 struct property *new_prop;
3721                 for_each_property_of_node(overlay_base_symbols, prop) {
3722
3723                         new_prop = __of_prop_dup(prop, GFP_KERNEL);
3724                         if (!new_prop) {
3725                                 unittest(0, "__of_prop_dup() of '%s' from overlay_base node __symbols__",
3726                                          prop->name);
3727                                 goto err_unlock;
3728                         }
3729                         if (__of_add_property(of_symbols, new_prop)) {
3730                                 kfree(new_prop->name);
3731                                 kfree(new_prop->value);
3732                                 kfree(new_prop);
3733                                 /* "name" auto-generated by unflatten */
3734                                 if (!strcmp(prop->name, "name"))
3735                                         continue;
3736                                 unittest(0, "duplicate property '%s' in overlay_base node __symbols__",
3737                                          prop->name);
3738                                 goto err_unlock;
3739                         }
3740                         if (__of_add_property_sysfs(of_symbols, new_prop)) {
3741                                 unittest(0, "unable to add property '%s' in overlay_base node __symbols__ to sysfs",
3742                                          prop->name);
3743                                 goto err_unlock;
3744                         }
3745                 }
3746         }
3747
3748         mutex_unlock(&of_mutex);
3749
3750
3751         /* now do the normal overlay usage test */
3752
3753         /* ---  overlay  --- */
3754
3755         EXPECT_BEGIN(KERN_ERR,
3756                      "OF: overlay: WARNING: memory leak will occur if overlay removed, property: /testcase-data-2/substation@100/status");
3757         EXPECT_BEGIN(KERN_ERR,
3758                      "OF: overlay: WARNING: memory leak will occur if overlay removed, property: /testcase-data-2/fairway-1/status");
3759         EXPECT_BEGIN(KERN_ERR,
3760                      "OF: overlay: WARNING: memory leak will occur if overlay removed, property: /testcase-data-2/fairway-1/ride@100/track@30/incline-up");
3761         EXPECT_BEGIN(KERN_ERR,
3762                      "OF: overlay: WARNING: memory leak will occur if overlay removed, property: /testcase-data-2/fairway-1/ride@100/track@40/incline-up");
3763         EXPECT_BEGIN(KERN_ERR,
3764                      "OF: overlay: WARNING: memory leak will occur if overlay removed, property: /testcase-data-2/lights@40000/status");
3765         EXPECT_BEGIN(KERN_ERR,
3766                      "OF: overlay: WARNING: memory leak will occur if overlay removed, property: /testcase-data-2/lights@40000/color");
3767         EXPECT_BEGIN(KERN_ERR,
3768                      "OF: overlay: WARNING: memory leak will occur if overlay removed, property: /testcase-data-2/lights@40000/rate");
3769         EXPECT_BEGIN(KERN_ERR,
3770                      "OF: overlay: WARNING: memory leak will occur if overlay removed, property: /__symbols__/hvac_2");
3771         EXPECT_BEGIN(KERN_ERR,
3772                      "OF: overlay: WARNING: memory leak will occur if overlay removed, property: /__symbols__/ride_200");
3773         EXPECT_BEGIN(KERN_ERR,
3774                      "OF: overlay: WARNING: memory leak will occur if overlay removed, property: /__symbols__/ride_200_left");
3775         EXPECT_BEGIN(KERN_ERR,
3776                      "OF: overlay: WARNING: memory leak will occur if overlay removed, property: /__symbols__/ride_200_right");
3777
3778         ret = overlay_data_apply("overlay", NULL);
3779
3780         EXPECT_END(KERN_ERR,
3781                    "OF: overlay: WARNING: memory leak will occur if overlay removed, property: /__symbols__/ride_200_right");
3782         EXPECT_END(KERN_ERR,
3783                    "OF: overlay: WARNING: memory leak will occur if overlay removed, property: /__symbols__/ride_200_left");
3784         EXPECT_END(KERN_ERR,
3785                    "OF: overlay: WARNING: memory leak will occur if overlay removed, property: /__symbols__/ride_200");
3786         EXPECT_END(KERN_ERR,
3787                    "OF: overlay: WARNING: memory leak will occur if overlay removed, property: /__symbols__/hvac_2");
3788         EXPECT_END(KERN_ERR,
3789                    "OF: overlay: WARNING: memory leak will occur if overlay removed, property: /testcase-data-2/lights@40000/rate");
3790         EXPECT_END(KERN_ERR,
3791                    "OF: overlay: WARNING: memory leak will occur if overlay removed, property: /testcase-data-2/lights@40000/color");
3792         EXPECT_END(KERN_ERR,
3793                    "OF: overlay: WARNING: memory leak will occur if overlay removed, property: /testcase-data-2/lights@40000/status");
3794         EXPECT_END(KERN_ERR,
3795                    "OF: overlay: WARNING: memory leak will occur if overlay removed, property: /testcase-data-2/fairway-1/ride@100/track@40/incline-up");
3796         EXPECT_END(KERN_ERR,
3797                    "OF: overlay: WARNING: memory leak will occur if overlay removed, property: /testcase-data-2/fairway-1/ride@100/track@30/incline-up");
3798         EXPECT_END(KERN_ERR,
3799                    "OF: overlay: WARNING: memory leak will occur if overlay removed, property: /testcase-data-2/fairway-1/status");
3800         EXPECT_END(KERN_ERR,
3801                    "OF: overlay: WARNING: memory leak will occur if overlay removed, property: /testcase-data-2/substation@100/status");
3802
3803         unittest(ret, "Adding overlay 'overlay' failed\n");
3804
3805         /* ---  overlay_bad_add_dup_node  --- */
3806
3807         EXPECT_BEGIN(KERN_ERR,
3808                      "OF: overlay: ERROR: multiple fragments add and/or delete node /testcase-data-2/substation@100/motor-1/controller");
3809         EXPECT_BEGIN(KERN_ERR,
3810                      "OF: overlay: ERROR: multiple fragments add, update, and/or delete property /testcase-data-2/substation@100/motor-1/controller/name");
3811         EXPECT_BEGIN(KERN_ERR,
3812                      "OF: changeset: apply failed: REMOVE_PROPERTY /testcase-data-2/substation@100/motor-1/controller:name");
3813         EXPECT_BEGIN(KERN_ERR,
3814                      "OF: Error reverting changeset (-19)");
3815
3816         unittest(overlay_data_apply("overlay_bad_add_dup_node", NULL),
3817                  "Adding overlay 'overlay_bad_add_dup_node' failed\n");
3818
3819         EXPECT_END(KERN_ERR,
3820                    "OF: Error reverting changeset (-19)");
3821         EXPECT_END(KERN_ERR,
3822                    "OF: changeset: apply failed: REMOVE_PROPERTY /testcase-data-2/substation@100/motor-1/controller:name");
3823         EXPECT_END(KERN_ERR,
3824                    "OF: overlay: ERROR: multiple fragments add, update, and/or delete property /testcase-data-2/substation@100/motor-1/controller/name");
3825         EXPECT_END(KERN_ERR,
3826                    "OF: overlay: ERROR: multiple fragments add and/or delete node /testcase-data-2/substation@100/motor-1/controller");
3827
3828         /* ---  overlay_bad_add_dup_prop  --- */
3829
3830         EXPECT_BEGIN(KERN_ERR,
3831                      "OF: overlay: ERROR: multiple fragments add and/or delete node /testcase-data-2/substation@100/motor-1/electric");
3832         EXPECT_BEGIN(KERN_ERR,
3833                      "OF: overlay: ERROR: multiple fragments add, update, and/or delete property /testcase-data-2/substation@100/motor-1/electric/rpm_avail");
3834         EXPECT_BEGIN(KERN_ERR,
3835                      "OF: overlay: ERROR: multiple fragments add, update, and/or delete property /testcase-data-2/substation@100/motor-1/electric/name");
3836         EXPECT_BEGIN(KERN_ERR,
3837                      "OF: changeset: apply failed: REMOVE_PROPERTY /testcase-data-2/substation@100/motor-1/electric:name");
3838         EXPECT_BEGIN(KERN_ERR,
3839                      "OF: Error reverting changeset (-19)");
3840
3841         unittest(overlay_data_apply("overlay_bad_add_dup_prop", NULL),
3842                  "Adding overlay 'overlay_bad_add_dup_prop' failed\n");
3843
3844         EXPECT_END(KERN_ERR,
3845                    "OF: Error reverting changeset (-19)");
3846         EXPECT_END(KERN_ERR,
3847                    "OF: changeset: apply failed: REMOVE_PROPERTY /testcase-data-2/substation@100/motor-1/electric:name");
3848         EXPECT_END(KERN_ERR,
3849                    "OF: overlay: ERROR: multiple fragments add, update, and/or delete property /testcase-data-2/substation@100/motor-1/electric/name");
3850         EXPECT_END(KERN_ERR,
3851                    "OF: overlay: ERROR: multiple fragments add, update, and/or delete property /testcase-data-2/substation@100/motor-1/electric/rpm_avail");
3852         EXPECT_END(KERN_ERR,
3853                    "OF: overlay: ERROR: multiple fragments add and/or delete node /testcase-data-2/substation@100/motor-1/electric");
3854
3855         /* ---  overlay_bad_phandle  --- */
3856
3857         unittest(overlay_data_apply("overlay_bad_phandle", NULL),
3858                  "Adding overlay 'overlay_bad_phandle' failed\n");
3859
3860         /* ---  overlay_bad_symbol  --- */
3861
3862         EXPECT_BEGIN(KERN_ERR,
3863                      "OF: changeset: apply failed: REMOVE_PROPERTY /testcase-data-2/substation@100/hvac-medium-2:name");
3864         EXPECT_BEGIN(KERN_ERR,
3865                      "OF: Error reverting changeset (-19)");
3866
3867         unittest(overlay_data_apply("overlay_bad_symbol", NULL),
3868                  "Adding overlay 'overlay_bad_symbol' failed\n");
3869
3870         EXPECT_END(KERN_ERR,
3871                    "OF: Error reverting changeset (-19)");
3872         EXPECT_END(KERN_ERR,
3873                    "OF: changeset: apply failed: REMOVE_PROPERTY /testcase-data-2/substation@100/hvac-medium-2:name");
3874
3875         /* ---  overlay_bad_unresolved  --- */
3876
3877         EXPECT_BEGIN(KERN_ERR,
3878                      "OF: resolver: node label 'this_label_does_not_exist' not found in live devicetree symbols table");
3879         EXPECT_BEGIN(KERN_ERR,
3880                      "OF: resolver: overlay phandle fixup failed: -22");
3881
3882         unittest(overlay_data_apply("overlay_bad_unresolved", NULL),
3883                  "Adding overlay 'overlay_bad_unresolved' failed\n");
3884
3885         EXPECT_END(KERN_ERR,
3886                    "OF: resolver: overlay phandle fixup failed: -22");
3887         EXPECT_END(KERN_ERR,
3888                    "OF: resolver: node label 'this_label_does_not_exist' not found in live devicetree symbols table");
3889
3890         return;
3891
3892 err_unlock:
3893         mutex_unlock(&of_mutex);
3894 }
3895
3896 static int of_unittest_pci_dev_num;
3897 static int of_unittest_pci_child_num;
3898
3899 /*
3900  * PCI device tree node test driver
3901  */
3902 static const struct pci_device_id testdrv_pci_ids[] = {
3903         { PCI_DEVICE(PCI_VENDOR_ID_REDHAT, 0x5), }, /* PCI_VENDOR_ID_REDHAT */
3904         { 0, }
3905 };
3906
3907 static int testdrv_probe(struct pci_dev *pdev, const struct pci_device_id *id)
3908 {
3909         struct overlay_info *info;
3910         struct device_node *dn;
3911         int ret, ovcs_id;
3912         u32 size;
3913
3914         dn = pdev->dev.of_node;
3915         if (!dn) {
3916                 dev_err(&pdev->dev, "does not find bus endpoint");
3917                 return -EINVAL;
3918         }
3919
3920         for (info = overlays; info && info->name; info++) {
3921                 if (!strcmp(info->name, "overlay_pci_node"))
3922                         break;
3923         }
3924         if (!info || !info->name) {
3925                 dev_err(&pdev->dev, "no overlay data for overlay_pci_node");
3926                 return -ENODEV;
3927         }
3928
3929         size = info->dtbo_end - info->dtbo_begin;
3930         ret = of_overlay_fdt_apply(info->dtbo_begin, size, &ovcs_id, dn);
3931         of_node_put(dn);
3932         if (ret)
3933                 return ret;
3934
3935         of_platform_default_populate(dn, NULL, &pdev->dev);
3936         pci_set_drvdata(pdev, (void *)(uintptr_t)ovcs_id);
3937
3938         return 0;
3939 }
3940
3941 static void testdrv_remove(struct pci_dev *pdev)
3942 {
3943         int ovcs_id = (int)(uintptr_t)pci_get_drvdata(pdev);
3944
3945         of_platform_depopulate(&pdev->dev);
3946         of_overlay_remove(&ovcs_id);
3947 }
3948
3949 static struct pci_driver testdrv_driver = {
3950         .name = "pci_dt_testdrv",
3951         .id_table = testdrv_pci_ids,
3952         .probe = testdrv_probe,
3953         .remove = testdrv_remove,
3954 };
3955
3956 static int unittest_pci_probe(struct platform_device *pdev)
3957 {
3958         struct resource *res;
3959         struct device *dev;
3960         u64 exp_addr;
3961
3962         res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
3963         if (!res)
3964                 return -ENODEV;
3965
3966         dev = &pdev->dev;
3967         while (dev && !dev_is_pci(dev))
3968                 dev = dev->parent;
3969         if (!dev) {
3970                 pr_err("unable to find parent device\n");
3971                 return -ENODEV;
3972         }
3973
3974         exp_addr = pci_resource_start(to_pci_dev(dev), 0) + 0x100;
3975         unittest(res->start == exp_addr, "Incorrect translated address %llx, expected %llx\n",
3976                  (u64)res->start, exp_addr);
3977
3978         of_unittest_pci_child_num++;
3979
3980         return 0;
3981 }
3982
3983 static const struct of_device_id unittest_pci_of_match[] = {
3984         { .compatible = "unittest-pci" },
3985         { }
3986 };
3987
3988 static struct platform_driver unittest_pci_driver = {
3989         .probe = unittest_pci_probe,
3990         .driver = {
3991                 .name = "unittest-pci",
3992                 .of_match_table = unittest_pci_of_match,
3993         },
3994 };
3995
3996 static int of_unittest_pci_node_verify(struct pci_dev *pdev, bool add)
3997 {
3998         struct device_node *pnp, *np = NULL;
3999         struct device *child_dev;
4000         char *path = NULL;
4001         const __be32 *reg;
4002         int rc = 0;
4003
4004         pnp = pdev->dev.of_node;
4005         unittest(pnp, "Failed creating PCI dt node\n");
4006         if (!pnp)
4007                 return -ENODEV;
4008
4009         if (add) {
4010                 path = kasprintf(GFP_KERNEL, "%pOF/pci-ep-bus@0/unittest-pci@100", pnp);
4011                 np = of_find_node_by_path(path);
4012                 unittest(np, "Failed to get unittest-pci node under PCI node\n");
4013                 if (!np) {
4014                         rc = -ENODEV;
4015                         goto failed;
4016                 }
4017
4018                 reg = of_get_property(np, "reg", NULL);
4019                 unittest(reg, "Failed to get reg property\n");
4020                 if (!reg)
4021                         rc = -ENODEV;
4022         } else {
4023                 path = kasprintf(GFP_KERNEL, "%pOF/pci-ep-bus@0", pnp);
4024                 np = of_find_node_by_path(path);
4025                 unittest(!np, "Child device tree node is not removed\n");
4026                 child_dev = device_find_any_child(&pdev->dev);
4027                 unittest(!child_dev, "Child device is not removed\n");
4028         }
4029
4030 failed:
4031         kfree(path);
4032         if (np)
4033                 of_node_put(np);
4034
4035         return rc;
4036 }
4037
4038 static void __init of_unittest_pci_node(void)
4039 {
4040         struct pci_dev *pdev = NULL;
4041         int rc;
4042
4043         if (!IS_ENABLED(CONFIG_PCI_DYNAMIC_OF_NODES))
4044                 return;
4045
4046         rc = pci_register_driver(&testdrv_driver);
4047         unittest(!rc, "Failed to register pci test driver; rc = %d\n", rc);
4048         if (rc)
4049                 return;
4050
4051         rc = platform_driver_register(&unittest_pci_driver);
4052         if (unittest(!rc, "Failed to register unittest pci driver\n")) {
4053                 pci_unregister_driver(&testdrv_driver);
4054                 return;
4055         }
4056
4057         while ((pdev = pci_get_device(PCI_VENDOR_ID_REDHAT, 0x5, pdev)) != NULL) {
4058                 of_unittest_pci_node_verify(pdev, true);
4059                 of_unittest_pci_dev_num++;
4060         }
4061         if (pdev)
4062                 pci_dev_put(pdev);
4063
4064         unittest(of_unittest_pci_dev_num,
4065                  "No test PCI device been found. Please run QEMU with '-device pci-testdev'\n");
4066         unittest(of_unittest_pci_dev_num == of_unittest_pci_child_num,
4067                  "Child device number %d is not expected %d", of_unittest_pci_child_num,
4068                  of_unittest_pci_dev_num);
4069
4070         platform_driver_unregister(&unittest_pci_driver);
4071         pci_unregister_driver(&testdrv_driver);
4072
4073         while ((pdev = pci_get_device(PCI_VENDOR_ID_REDHAT, 0x5, pdev)) != NULL)
4074                 of_unittest_pci_node_verify(pdev, false);
4075         if (pdev)
4076                 pci_dev_put(pdev);
4077 }
4078 #else
4079
4080 static inline __init void of_unittest_overlay_high_level(void) {}
4081 static inline __init void of_unittest_pci_node(void) { }
4082
4083 #endif
4084
4085 static int __init of_unittest(void)
4086 {
4087         struct device_node *np;
4088         int res;
4089
4090         pr_info("start of unittest - you will see error messages\n");
4091
4092         /* Taint the kernel so we know we've run tests. */
4093         add_taint(TAINT_TEST, LOCKDEP_STILL_OK);
4094
4095         /* adding data for unittest */
4096
4097         if (IS_ENABLED(CONFIG_UML))
4098                 unittest_unflatten_overlay_base();
4099
4100         res = unittest_data_add();
4101         if (res)
4102                 return res;
4103         if (!of_aliases)
4104                 of_aliases = of_find_node_by_path("/aliases");
4105
4106         np = of_find_node_by_path("/testcase-data/phandle-tests/consumer-a");
4107         if (!np) {
4108                 pr_info("No testcase data in device tree; not running tests\n");
4109                 return 0;
4110         }
4111         of_node_put(np);
4112
4113         of_unittest_check_tree_linkage();
4114         of_unittest_check_phandles();
4115         of_unittest_find_node_by_name();
4116         of_unittest_dynamic();
4117         of_unittest_parse_phandle_with_args();
4118         of_unittest_parse_phandle_with_args_map();
4119         of_unittest_printf();
4120         of_unittest_property_string();
4121         of_unittest_property_copy();
4122         of_unittest_changeset();
4123         of_unittest_parse_interrupts();
4124         of_unittest_parse_interrupts_extended();
4125         of_unittest_dma_get_max_cpu_address();
4126         of_unittest_parse_dma_ranges();
4127         of_unittest_pci_dma_ranges();
4128         of_unittest_bus_ranges();
4129         of_unittest_bus_3cell_ranges();
4130         of_unittest_reg();
4131         of_unittest_translate_addr();
4132         of_unittest_match_node();
4133         of_unittest_platform_populate();
4134         of_unittest_overlay();
4135         of_unittest_lifecycle();
4136         of_unittest_pci_node();
4137
4138         /* Double check linkage after removing testcase data */
4139         of_unittest_check_tree_linkage();
4140
4141         of_unittest_overlay_high_level();
4142
4143         pr_info("end of unittest - %i passed, %i failed\n",
4144                 unittest_results.passed, unittest_results.failed);
4145
4146         return 0;
4147 }
4148 late_initcall(of_unittest);