Merge https://gitlab.denx.de/u-boot/custodians/u-boot-sh
[platform/kernel/u-boot.git] / test / dm / core.c
1 // SPDX-License-Identifier: GPL-2.0+
2 /*
3  * Tests for the core driver model code
4  *
5  * Copyright (c) 2013 Google, Inc
6  */
7
8 #include <common.h>
9 #include <errno.h>
10 #include <dm.h>
11 #include <fdtdec.h>
12 #include <log.h>
13 #include <malloc.h>
14 #include <dm/device-internal.h>
15 #include <dm/root.h>
16 #include <dm/util.h>
17 #include <dm/test.h>
18 #include <dm/uclass-internal.h>
19 #include <test/test.h>
20 #include <test/ut.h>
21
22 DECLARE_GLOBAL_DATA_PTR;
23
24 enum {
25         TEST_INTVAL1            = 0,
26         TEST_INTVAL2            = 3,
27         TEST_INTVAL3            = 6,
28         TEST_INTVAL_MANUAL      = 101112,
29         TEST_INTVAL_PRE_RELOC   = 7,
30 };
31
32 static const struct dm_test_pdata test_pdata[] = {
33         { .ping_add             = TEST_INTVAL1, },
34         { .ping_add             = TEST_INTVAL2, },
35         { .ping_add             = TEST_INTVAL3, },
36 };
37
38 static const struct dm_test_pdata test_pdata_manual = {
39         .ping_add               = TEST_INTVAL_MANUAL,
40 };
41
42 static const struct dm_test_pdata test_pdata_pre_reloc = {
43         .ping_add               = TEST_INTVAL_PRE_RELOC,
44 };
45
46 U_BOOT_DEVICE(dm_test_info1) = {
47         .name = "test_drv",
48         .platdata = &test_pdata[0],
49 };
50
51 U_BOOT_DEVICE(dm_test_info2) = {
52         .name = "test_drv",
53         .platdata = &test_pdata[1],
54 };
55
56 U_BOOT_DEVICE(dm_test_info3) = {
57         .name = "test_drv",
58         .platdata = &test_pdata[2],
59 };
60
61 static struct driver_info driver_info_manual = {
62         .name = "test_manual_drv",
63         .platdata = &test_pdata_manual,
64 };
65
66 static struct driver_info driver_info_pre_reloc = {
67         .name = "test_pre_reloc_drv",
68         .platdata = &test_pdata_pre_reloc,
69 };
70
71 static struct driver_info driver_info_act_dma = {
72         .name = "test_act_dma_drv",
73 };
74
75 void dm_leak_check_start(struct unit_test_state *uts)
76 {
77         uts->start = mallinfo();
78         if (!uts->start.uordblks)
79                 puts("Warning: Please add '#define DEBUG' to the top of common/dlmalloc.c\n");
80 }
81
82 int dm_leak_check_end(struct unit_test_state *uts)
83 {
84         struct mallinfo end;
85         int id, diff;
86
87         /* Don't delete the root class, since we started with that */
88         for (id = UCLASS_ROOT + 1; id < UCLASS_COUNT; id++) {
89                 struct uclass *uc;
90
91                 uc = uclass_find(id);
92                 if (!uc)
93                         continue;
94                 ut_assertok(uclass_destroy(uc));
95         }
96
97         end = mallinfo();
98         diff = end.uordblks - uts->start.uordblks;
99         if (diff > 0)
100                 printf("Leak: lost %#xd bytes\n", diff);
101         else if (diff < 0)
102                 printf("Leak: gained %#xd bytes\n", -diff);
103         ut_asserteq(uts->start.uordblks, end.uordblks);
104
105         return 0;
106 }
107
108 /* Test that binding with platdata occurs correctly */
109 static int dm_test_autobind(struct unit_test_state *uts)
110 {
111         struct dm_test_state *dms = uts->priv;
112         struct udevice *dev;
113
114         /*
115          * We should have a single class (UCLASS_ROOT) and a single root
116          * device with no children.
117          */
118         ut_assert(dms->root);
119         ut_asserteq(1, list_count_items(&gd->uclass_root));
120         ut_asserteq(0, list_count_items(&gd->dm_root->child_head));
121         ut_asserteq(0, dm_testdrv_op_count[DM_TEST_OP_POST_BIND]);
122
123         ut_assertok(dm_scan_platdata(false));
124
125         /* We should have our test class now at least, plus more children */
126         ut_assert(1 < list_count_items(&gd->uclass_root));
127         ut_assert(0 < list_count_items(&gd->dm_root->child_head));
128
129         /* Our 3 dm_test_infox children should be bound to the test uclass */
130         ut_asserteq(3, dm_testdrv_op_count[DM_TEST_OP_POST_BIND]);
131
132         /* No devices should be probed */
133         list_for_each_entry(dev, &gd->dm_root->child_head, sibling_node)
134                 ut_assert(!(dev->flags & DM_FLAG_ACTIVATED));
135
136         /* Our test driver should have been bound 3 times */
137         ut_assert(dm_testdrv_op_count[DM_TEST_OP_BIND] == 3);
138
139         return 0;
140 }
141 DM_TEST(dm_test_autobind, 0);
142
143 /* Test that binding with uclass platdata allocation occurs correctly */
144 static int dm_test_autobind_uclass_pdata_alloc(struct unit_test_state *uts)
145 {
146         struct dm_test_perdev_uc_pdata *uc_pdata;
147         struct udevice *dev;
148         struct uclass *uc;
149
150         ut_assertok(uclass_get(UCLASS_TEST, &uc));
151         ut_assert(uc);
152
153         /**
154          * Test if test uclass driver requires allocation for the uclass
155          * platform data and then check the dev->uclass_platdata pointer.
156          */
157         ut_assert(uc->uc_drv->per_device_platdata_auto_alloc_size);
158
159         for (uclass_find_first_device(UCLASS_TEST, &dev);
160              dev;
161              uclass_find_next_device(&dev)) {
162                 ut_assertnonnull(dev);
163
164                 uc_pdata = dev_get_uclass_platdata(dev);
165                 ut_assert(uc_pdata);
166         }
167
168         return 0;
169 }
170 DM_TEST(dm_test_autobind_uclass_pdata_alloc, DM_TESTF_SCAN_PDATA);
171
172 /* Test that binding with uclass platdata setting occurs correctly */
173 static int dm_test_autobind_uclass_pdata_valid(struct unit_test_state *uts)
174 {
175         struct dm_test_perdev_uc_pdata *uc_pdata;
176         struct udevice *dev;
177
178         /**
179          * In the test_postbind() method of test uclass driver, the uclass
180          * platform data should be set to three test int values - test it.
181          */
182         for (uclass_find_first_device(UCLASS_TEST, &dev);
183              dev;
184              uclass_find_next_device(&dev)) {
185                 ut_assertnonnull(dev);
186
187                 uc_pdata = dev_get_uclass_platdata(dev);
188                 ut_assert(uc_pdata);
189                 ut_assert(uc_pdata->intval1 == TEST_UC_PDATA_INTVAL1);
190                 ut_assert(uc_pdata->intval2 == TEST_UC_PDATA_INTVAL2);
191                 ut_assert(uc_pdata->intval3 == TEST_UC_PDATA_INTVAL3);
192         }
193
194         return 0;
195 }
196 DM_TEST(dm_test_autobind_uclass_pdata_valid, DM_TESTF_SCAN_PDATA);
197
198 /* Test that autoprobe finds all the expected devices */
199 static int dm_test_autoprobe(struct unit_test_state *uts)
200 {
201         struct dm_test_state *dms = uts->priv;
202         int expected_base_add;
203         struct udevice *dev;
204         struct uclass *uc;
205         int i;
206
207         ut_assertok(uclass_get(UCLASS_TEST, &uc));
208         ut_assert(uc);
209
210         ut_asserteq(1, dm_testdrv_op_count[DM_TEST_OP_INIT]);
211         ut_asserteq(0, dm_testdrv_op_count[DM_TEST_OP_PRE_PROBE]);
212         ut_asserteq(0, dm_testdrv_op_count[DM_TEST_OP_POST_PROBE]);
213
214         /* The root device should not be activated until needed */
215         ut_assert(dms->root->flags & DM_FLAG_ACTIVATED);
216
217         /*
218          * We should be able to find the three test devices, and they should
219          * all be activated as they are used (lazy activation, required by
220          * U-Boot)
221          */
222         for (i = 0; i < 3; i++) {
223                 ut_assertok(uclass_find_device(UCLASS_TEST, i, &dev));
224                 ut_assert(dev);
225                 ut_assertf(!(dev->flags & DM_FLAG_ACTIVATED),
226                            "Driver %d/%s already activated", i, dev->name);
227
228                 /* This should activate it */
229                 ut_assertok(uclass_get_device(UCLASS_TEST, i, &dev));
230                 ut_assert(dev);
231                 ut_assert(dev->flags & DM_FLAG_ACTIVATED);
232
233                 /* Activating a device should activate the root device */
234                 if (!i)
235                         ut_assert(dms->root->flags & DM_FLAG_ACTIVATED);
236         }
237
238         /*
239          * Our 3 dm_test_info children should be passed to pre_probe and
240          * post_probe
241          */
242         ut_asserteq(3, dm_testdrv_op_count[DM_TEST_OP_POST_PROBE]);
243         ut_asserteq(3, dm_testdrv_op_count[DM_TEST_OP_PRE_PROBE]);
244
245         /* Also we can check the per-device data */
246         expected_base_add = 0;
247         for (i = 0; i < 3; i++) {
248                 struct dm_test_uclass_perdev_priv *priv;
249                 struct dm_test_pdata *pdata;
250
251                 ut_assertok(uclass_find_device(UCLASS_TEST, i, &dev));
252                 ut_assert(dev);
253
254                 priv = dev_get_uclass_priv(dev);
255                 ut_assert(priv);
256                 ut_asserteq(expected_base_add, priv->base_add);
257
258                 pdata = dev->platdata;
259                 expected_base_add += pdata->ping_add;
260         }
261
262         return 0;
263 }
264 DM_TEST(dm_test_autoprobe, DM_TESTF_SCAN_PDATA);
265
266 /* Check that we see the correct platdata in each device */
267 static int dm_test_platdata(struct unit_test_state *uts)
268 {
269         const struct dm_test_pdata *pdata;
270         struct udevice *dev;
271         int i;
272
273         for (i = 0; i < 3; i++) {
274                 ut_assertok(uclass_find_device(UCLASS_TEST, i, &dev));
275                 ut_assert(dev);
276                 pdata = dev->platdata;
277                 ut_assert(pdata->ping_add == test_pdata[i].ping_add);
278         }
279
280         return 0;
281 }
282 DM_TEST(dm_test_platdata, DM_TESTF_SCAN_PDATA);
283
284 /* Test that we can bind, probe, remove, unbind a driver */
285 static int dm_test_lifecycle(struct unit_test_state *uts)
286 {
287         struct dm_test_state *dms = uts->priv;
288         int op_count[DM_TEST_OP_COUNT];
289         struct udevice *dev, *test_dev;
290         int pingret;
291         int ret;
292
293         memcpy(op_count, dm_testdrv_op_count, sizeof(op_count));
294
295         ut_assertok(device_bind_by_name(dms->root, false, &driver_info_manual,
296                                         &dev));
297         ut_assert(dev);
298         ut_assert(dm_testdrv_op_count[DM_TEST_OP_BIND]
299                         == op_count[DM_TEST_OP_BIND] + 1);
300         ut_assert(!dev->priv);
301
302         /* Probe the device - it should fail allocating private data */
303         dms->force_fail_alloc = 1;
304         ret = device_probe(dev);
305         ut_assert(ret == -ENOMEM);
306         ut_assert(dm_testdrv_op_count[DM_TEST_OP_PROBE]
307                         == op_count[DM_TEST_OP_PROBE] + 1);
308         ut_assert(!dev->priv);
309
310         /* Try again without the alloc failure */
311         dms->force_fail_alloc = 0;
312         ut_assertok(device_probe(dev));
313         ut_assert(dm_testdrv_op_count[DM_TEST_OP_PROBE]
314                         == op_count[DM_TEST_OP_PROBE] + 2);
315         ut_assert(dev->priv);
316
317         /* This should be device 3 in the uclass */
318         ut_assertok(uclass_find_device(UCLASS_TEST, 3, &test_dev));
319         ut_assert(dev == test_dev);
320
321         /* Try ping */
322         ut_assertok(test_ping(dev, 100, &pingret));
323         ut_assert(pingret == 102);
324
325         /* Now remove device 3 */
326         ut_asserteq(0, dm_testdrv_op_count[DM_TEST_OP_PRE_REMOVE]);
327         ut_assertok(device_remove(dev, DM_REMOVE_NORMAL));
328         ut_asserteq(1, dm_testdrv_op_count[DM_TEST_OP_PRE_REMOVE]);
329
330         ut_asserteq(0, dm_testdrv_op_count[DM_TEST_OP_UNBIND]);
331         ut_asserteq(0, dm_testdrv_op_count[DM_TEST_OP_PRE_UNBIND]);
332         ut_assertok(device_unbind(dev));
333         ut_asserteq(1, dm_testdrv_op_count[DM_TEST_OP_UNBIND]);
334         ut_asserteq(1, dm_testdrv_op_count[DM_TEST_OP_PRE_UNBIND]);
335
336         return 0;
337 }
338 DM_TEST(dm_test_lifecycle, DM_TESTF_SCAN_PDATA | DM_TESTF_PROBE_TEST);
339
340 /* Test that we can bind/unbind and the lists update correctly */
341 static int dm_test_ordering(struct unit_test_state *uts)
342 {
343         struct dm_test_state *dms = uts->priv;
344         struct udevice *dev, *dev_penultimate, *dev_last, *test_dev;
345         int pingret;
346
347         ut_assertok(device_bind_by_name(dms->root, false, &driver_info_manual,
348                                         &dev));
349         ut_assert(dev);
350
351         /* Bind two new devices (numbers 4 and 5) */
352         ut_assertok(device_bind_by_name(dms->root, false, &driver_info_manual,
353                                         &dev_penultimate));
354         ut_assert(dev_penultimate);
355         ut_assertok(device_bind_by_name(dms->root, false, &driver_info_manual,
356                                         &dev_last));
357         ut_assert(dev_last);
358
359         /* Now remove device 3 */
360         ut_assertok(device_remove(dev, DM_REMOVE_NORMAL));
361         ut_assertok(device_unbind(dev));
362
363         /* The device numbering should have shifted down one */
364         ut_assertok(uclass_find_device(UCLASS_TEST, 3, &test_dev));
365         ut_assert(dev_penultimate == test_dev);
366         ut_assertok(uclass_find_device(UCLASS_TEST, 4, &test_dev));
367         ut_assert(dev_last == test_dev);
368
369         /* Add back the original device 3, now in position 5 */
370         ut_assertok(device_bind_by_name(dms->root, false, &driver_info_manual,
371                                         &dev));
372         ut_assert(dev);
373
374         /* Try ping */
375         ut_assertok(test_ping(dev, 100, &pingret));
376         ut_assert(pingret == 102);
377
378         /* Remove 3 and 4 */
379         ut_assertok(device_remove(dev_penultimate, DM_REMOVE_NORMAL));
380         ut_assertok(device_unbind(dev_penultimate));
381         ut_assertok(device_remove(dev_last, DM_REMOVE_NORMAL));
382         ut_assertok(device_unbind(dev_last));
383
384         /* Our device should now be in position 3 */
385         ut_assertok(uclass_find_device(UCLASS_TEST, 3, &test_dev));
386         ut_assert(dev == test_dev);
387
388         /* Now remove device 3 */
389         ut_assertok(device_remove(dev, DM_REMOVE_NORMAL));
390         ut_assertok(device_unbind(dev));
391
392         return 0;
393 }
394 DM_TEST(dm_test_ordering, DM_TESTF_SCAN_PDATA);
395
396 /* Check that we can perform operations on a device (do a ping) */
397 int dm_check_operations(struct unit_test_state *uts, struct udevice *dev,
398                         uint32_t base, struct dm_test_priv *priv)
399 {
400         int expected;
401         int pingret;
402
403         /* Getting the child device should allocate platdata / priv */
404         ut_assertok(testfdt_ping(dev, 10, &pingret));
405         ut_assert(dev->priv);
406         ut_assert(dev->platdata);
407
408         expected = 10 + base;
409         ut_asserteq(expected, pingret);
410
411         /* Do another ping */
412         ut_assertok(testfdt_ping(dev, 20, &pingret));
413         expected = 20 + base;
414         ut_asserteq(expected, pingret);
415
416         /* Now check the ping_total */
417         priv = dev->priv;
418         ut_asserteq(DM_TEST_START_TOTAL + 10 + 20 + base * 2,
419                     priv->ping_total);
420
421         return 0;
422 }
423
424 /* Check that we can perform operations on devices */
425 static int dm_test_operations(struct unit_test_state *uts)
426 {
427         struct udevice *dev;
428         int i;
429
430         /*
431          * Now check that the ping adds are what we expect. This is using the
432          * ping-add property in each node.
433          */
434         for (i = 0; i < ARRAY_SIZE(test_pdata); i++) {
435                 uint32_t base;
436
437                 ut_assertok(uclass_get_device(UCLASS_TEST, i, &dev));
438
439                 /*
440                  * Get the 'reg' property, which tells us what the ping add
441                  * should be. We don't use the platdata because we want
442                  * to test the code that sets that up (testfdt_drv_probe()).
443                  */
444                 base = test_pdata[i].ping_add;
445                 debug("dev=%d, base=%d\n", i, base);
446
447                 ut_assert(!dm_check_operations(uts, dev, base, dev->priv));
448         }
449
450         return 0;
451 }
452 DM_TEST(dm_test_operations, DM_TESTF_SCAN_PDATA);
453
454 /* Remove all drivers and check that things work */
455 static int dm_test_remove(struct unit_test_state *uts)
456 {
457         struct udevice *dev;
458         int i;
459
460         for (i = 0; i < 3; i++) {
461                 ut_assertok(uclass_find_device(UCLASS_TEST, i, &dev));
462                 ut_assert(dev);
463                 ut_assertf(dev->flags & DM_FLAG_ACTIVATED,
464                            "Driver %d/%s not activated", i, dev->name);
465                 ut_assertok(device_remove(dev, DM_REMOVE_NORMAL));
466                 ut_assertf(!(dev->flags & DM_FLAG_ACTIVATED),
467                            "Driver %d/%s should have deactivated", i,
468                            dev->name);
469                 ut_assert(!dev->priv);
470         }
471
472         return 0;
473 }
474 DM_TEST(dm_test_remove, DM_TESTF_SCAN_PDATA | DM_TESTF_PROBE_TEST);
475
476 /* Remove and recreate everything, check for memory leaks */
477 static int dm_test_leak(struct unit_test_state *uts)
478 {
479         int i;
480
481         for (i = 0; i < 2; i++) {
482                 struct udevice *dev;
483                 int ret;
484                 int id;
485
486                 dm_leak_check_start(uts);
487
488                 ut_assertok(dm_scan_platdata(false));
489                 ut_assertok(dm_scan_fdt(gd->fdt_blob, false));
490
491                 /* Scanning the uclass is enough to probe all the devices */
492                 for (id = UCLASS_ROOT; id < UCLASS_COUNT; id++) {
493                         for (ret = uclass_first_device(UCLASS_TEST, &dev);
494                              dev;
495                              ret = uclass_next_device(&dev))
496                                 ;
497                         ut_assertok(ret);
498                 }
499
500                 ut_assertok(dm_leak_check_end(uts));
501         }
502
503         return 0;
504 }
505 DM_TEST(dm_test_leak, 0);
506
507 /* Test uclass init/destroy methods */
508 static int dm_test_uclass(struct unit_test_state *uts)
509 {
510         struct uclass *uc;
511
512         ut_assertok(uclass_get(UCLASS_TEST, &uc));
513         ut_asserteq(1, dm_testdrv_op_count[DM_TEST_OP_INIT]);
514         ut_asserteq(0, dm_testdrv_op_count[DM_TEST_OP_DESTROY]);
515         ut_assert(uc->priv);
516
517         ut_assertok(uclass_destroy(uc));
518         ut_asserteq(1, dm_testdrv_op_count[DM_TEST_OP_INIT]);
519         ut_asserteq(1, dm_testdrv_op_count[DM_TEST_OP_DESTROY]);
520
521         return 0;
522 }
523 DM_TEST(dm_test_uclass, 0);
524
525 /**
526  * create_children() - Create children of a parent node
527  *
528  * @dms:        Test system state
529  * @parent:     Parent device
530  * @count:      Number of children to create
531  * @key:        Key value to put in first child. Subsequence children
532  *              receive an incrementing value
533  * @child:      If not NULL, then the child device pointers are written into
534  *              this array.
535  * @return 0 if OK, -ve on error
536  */
537 static int create_children(struct unit_test_state *uts, struct udevice *parent,
538                            int count, int key, struct udevice *child[])
539 {
540         struct udevice *dev;
541         int i;
542
543         for (i = 0; i < count; i++) {
544                 struct dm_test_pdata *pdata;
545
546                 ut_assertok(device_bind_by_name(parent, false,
547                                                 &driver_info_manual, &dev));
548                 pdata = calloc(1, sizeof(*pdata));
549                 pdata->ping_add = key + i;
550                 dev->platdata = pdata;
551                 if (child)
552                         child[i] = dev;
553         }
554
555         return 0;
556 }
557
558 #define NODE_COUNT      10
559
560 static int dm_test_children(struct unit_test_state *uts)
561 {
562         struct dm_test_state *dms = uts->priv;
563         struct udevice *top[NODE_COUNT];
564         struct udevice *child[NODE_COUNT];
565         struct udevice *grandchild[NODE_COUNT];
566         struct udevice *dev;
567         int total;
568         int ret;
569         int i;
570
571         /* We don't care about the numbering for this test */
572         dms->skip_post_probe = 1;
573
574         ut_assert(NODE_COUNT > 5);
575
576         /* First create 10 top-level children */
577         ut_assertok(create_children(uts, dms->root, NODE_COUNT, 0, top));
578
579         /* Now a few have their own children */
580         ut_assertok(create_children(uts, top[2], NODE_COUNT, 2, NULL));
581         ut_assertok(create_children(uts, top[5], NODE_COUNT, 5, child));
582
583         /* And grandchildren */
584         for (i = 0; i < NODE_COUNT; i++)
585                 ut_assertok(create_children(uts, child[i], NODE_COUNT, 50 * i,
586                                             i == 2 ? grandchild : NULL));
587
588         /* Check total number of devices */
589         total = NODE_COUNT * (3 + NODE_COUNT);
590         ut_asserteq(total, dm_testdrv_op_count[DM_TEST_OP_BIND]);
591
592         /* Try probing one of the grandchildren */
593         ut_assertok(uclass_get_device(UCLASS_TEST,
594                                       NODE_COUNT * 3 + 2 * NODE_COUNT, &dev));
595         ut_asserteq_ptr(grandchild[0], dev);
596
597         /*
598          * This should have probed the child and top node also, for a total
599          * of 3 nodes.
600          */
601         ut_asserteq(3, dm_testdrv_op_count[DM_TEST_OP_PROBE]);
602
603         /* Probe the other grandchildren */
604         for (i = 1; i < NODE_COUNT; i++)
605                 ut_assertok(device_probe(grandchild[i]));
606
607         ut_asserteq(2 + NODE_COUNT, dm_testdrv_op_count[DM_TEST_OP_PROBE]);
608
609         /* Probe everything */
610         for (ret = uclass_first_device(UCLASS_TEST, &dev);
611              dev;
612              ret = uclass_next_device(&dev))
613                 ;
614         ut_assertok(ret);
615
616         ut_asserteq(total, dm_testdrv_op_count[DM_TEST_OP_PROBE]);
617
618         /* Remove a top-level child and check that the children are removed */
619         ut_assertok(device_remove(top[2], DM_REMOVE_NORMAL));
620         ut_asserteq(NODE_COUNT + 1, dm_testdrv_op_count[DM_TEST_OP_REMOVE]);
621         dm_testdrv_op_count[DM_TEST_OP_REMOVE] = 0;
622
623         /* Try one with grandchildren */
624         ut_assertok(uclass_get_device(UCLASS_TEST, 5, &dev));
625         ut_asserteq_ptr(dev, top[5]);
626         ut_assertok(device_remove(dev, DM_REMOVE_NORMAL));
627         ut_asserteq(1 + NODE_COUNT * (1 + NODE_COUNT),
628                     dm_testdrv_op_count[DM_TEST_OP_REMOVE]);
629
630         /* Try the same with unbind */
631         ut_assertok(device_unbind(top[2]));
632         ut_asserteq(NODE_COUNT + 1, dm_testdrv_op_count[DM_TEST_OP_UNBIND]);
633         dm_testdrv_op_count[DM_TEST_OP_UNBIND] = 0;
634
635         /* Try one with grandchildren */
636         ut_assertok(uclass_get_device(UCLASS_TEST, 5, &dev));
637         ut_asserteq_ptr(dev, top[6]);
638         ut_assertok(device_unbind(top[5]));
639         ut_asserteq(1 + NODE_COUNT * (1 + NODE_COUNT),
640                     dm_testdrv_op_count[DM_TEST_OP_UNBIND]);
641
642         return 0;
643 }
644 DM_TEST(dm_test_children, 0);
645
646 /* Test that pre-relocation devices work as expected */
647 static int dm_test_pre_reloc(struct unit_test_state *uts)
648 {
649         struct dm_test_state *dms = uts->priv;
650         struct udevice *dev;
651
652         /* The normal driver should refuse to bind before relocation */
653         ut_asserteq(-EPERM, device_bind_by_name(dms->root, true,
654                                                 &driver_info_manual, &dev));
655
656         /* But this one is marked pre-reloc */
657         ut_assertok(device_bind_by_name(dms->root, true,
658                                         &driver_info_pre_reloc, &dev));
659
660         return 0;
661 }
662 DM_TEST(dm_test_pre_reloc, 0);
663
664 /*
665  * Test that removal of devices, either via the "normal" device_remove()
666  * API or via the device driver selective flag works as expected
667  */
668 static int dm_test_remove_active_dma(struct unit_test_state *uts)
669 {
670         struct dm_test_state *dms = uts->priv;
671         struct udevice *dev;
672
673         ut_assertok(device_bind_by_name(dms->root, false, &driver_info_act_dma,
674                                         &dev));
675         ut_assert(dev);
676
677         /* Probe the device */
678         ut_assertok(device_probe(dev));
679
680         /* Test if device is active right now */
681         ut_asserteq(true, device_active(dev));
682
683         /* Remove the device via selective remove flag */
684         dm_remove_devices_flags(DM_REMOVE_ACTIVE_ALL);
685
686         /* Test if device is inactive right now */
687         ut_asserteq(false, device_active(dev));
688
689         /* Probe the device again */
690         ut_assertok(device_probe(dev));
691
692         /* Test if device is active right now */
693         ut_asserteq(true, device_active(dev));
694
695         /* Remove the device via "normal" remove API */
696         ut_assertok(device_remove(dev, DM_REMOVE_NORMAL));
697
698         /* Test if device is inactive right now */
699         ut_asserteq(false, device_active(dev));
700
701         /*
702          * Test if a device without the active DMA flags is not removed upon
703          * the active DMA remove call
704          */
705         ut_assertok(device_unbind(dev));
706         ut_assertok(device_bind_by_name(dms->root, false, &driver_info_manual,
707                                         &dev));
708         ut_assert(dev);
709
710         /* Probe the device */
711         ut_assertok(device_probe(dev));
712
713         /* Test if device is active right now */
714         ut_asserteq(true, device_active(dev));
715
716         /* Remove the device via selective remove flag */
717         dm_remove_devices_flags(DM_REMOVE_ACTIVE_ALL);
718
719         /* Test if device is still active right now */
720         ut_asserteq(true, device_active(dev));
721
722         return 0;
723 }
724 DM_TEST(dm_test_remove_active_dma, 0);
725
726 static int dm_test_uclass_before_ready(struct unit_test_state *uts)
727 {
728         struct uclass *uc;
729
730         ut_assertok(uclass_get(UCLASS_TEST, &uc));
731
732         gd->dm_root = NULL;
733         gd->dm_root_f = NULL;
734         memset(&gd->uclass_root, '\0', sizeof(gd->uclass_root));
735
736         ut_asserteq_ptr(NULL, uclass_find(UCLASS_TEST));
737
738         return 0;
739 }
740 DM_TEST(dm_test_uclass_before_ready, 0);
741
742 static int dm_test_uclass_devices_find(struct unit_test_state *uts)
743 {
744         struct udevice *dev;
745         int ret;
746
747         for (ret = uclass_find_first_device(UCLASS_TEST, &dev);
748              dev;
749              ret = uclass_find_next_device(&dev)) {
750                 ut_assert(!ret);
751                 ut_assertnonnull(dev);
752         }
753
754         ut_assertok(uclass_find_first_device(UCLASS_TEST_DUMMY, &dev));
755         ut_assertnull(dev);
756
757         return 0;
758 }
759 DM_TEST(dm_test_uclass_devices_find, DM_TESTF_SCAN_PDATA);
760
761 static int dm_test_uclass_devices_find_by_name(struct unit_test_state *uts)
762 {
763         struct udevice *finddev;
764         struct udevice *testdev;
765         int findret, ret;
766
767         /*
768          * For each test device found in fdt like: "a-test", "b-test", etc.,
769          * use its name and try to find it by uclass_find_device_by_name().
770          * Then, on success check if:
771          * - current 'testdev' name is equal to the returned 'finddev' name
772          * - current 'testdev' pointer is equal to the returned 'finddev'
773          *
774          * We assume that, each uclass's device name is unique, so if not, then
775          * this will fail on checking condition: testdev == finddev, since the
776          * uclass_find_device_by_name(), returns the first device by given name.
777         */
778         for (ret = uclass_find_first_device(UCLASS_TEST_FDT, &testdev);
779              testdev;
780              ret = uclass_find_next_device(&testdev)) {
781                 ut_assertok(ret);
782                 ut_assertnonnull(testdev);
783
784                 findret = uclass_find_device_by_name(UCLASS_TEST_FDT,
785                                                      testdev->name,
786                                                      &finddev);
787
788                 ut_assertok(findret);
789                 ut_assert(testdev);
790                 ut_asserteq_str(testdev->name, finddev->name);
791                 ut_asserteq_ptr(testdev, finddev);
792         }
793
794         return 0;
795 }
796 DM_TEST(dm_test_uclass_devices_find_by_name, DM_TESTF_SCAN_FDT);
797
798 static int dm_test_uclass_devices_get(struct unit_test_state *uts)
799 {
800         struct udevice *dev;
801         int ret;
802
803         for (ret = uclass_first_device(UCLASS_TEST, &dev);
804              dev;
805              ret = uclass_next_device(&dev)) {
806                 ut_assert(!ret);
807                 ut_assert(dev);
808                 ut_assert(device_active(dev));
809         }
810
811         return 0;
812 }
813 DM_TEST(dm_test_uclass_devices_get, DM_TESTF_SCAN_PDATA);
814
815 static int dm_test_uclass_devices_get_by_name(struct unit_test_state *uts)
816 {
817         struct udevice *finddev;
818         struct udevice *testdev;
819         int ret, findret;
820
821         /*
822          * For each test device found in fdt like: "a-test", "b-test", etc.,
823          * use its name and try to get it by uclass_get_device_by_name().
824          * On success check if:
825          * - returned finddev' is active
826          * - current 'testdev' name is equal to the returned 'finddev' name
827          * - current 'testdev' pointer is equal to the returned 'finddev'
828          *
829          * We asserts that the 'testdev' is active on each loop entry, so we
830          * could be sure that the 'finddev' is activated too, but for sure
831          * we check it again.
832          *
833          * We assume that, each uclass's device name is unique, so if not, then
834          * this will fail on checking condition: testdev == finddev, since the
835          * uclass_get_device_by_name(), returns the first device by given name.
836         */
837         for (ret = uclass_first_device(UCLASS_TEST_FDT, &testdev);
838              testdev;
839              ret = uclass_next_device(&testdev)) {
840                 ut_assertok(ret);
841                 ut_assert(testdev);
842                 ut_assert(device_active(testdev));
843
844                 findret = uclass_get_device_by_name(UCLASS_TEST_FDT,
845                                                     testdev->name,
846                                                     &finddev);
847
848                 ut_assertok(findret);
849                 ut_assert(finddev);
850                 ut_assert(device_active(finddev));
851                 ut_asserteq_str(testdev->name, finddev->name);
852                 ut_asserteq_ptr(testdev, finddev);
853         }
854
855         return 0;
856 }
857 DM_TEST(dm_test_uclass_devices_get_by_name, DM_TESTF_SCAN_FDT);
858
859 static int dm_test_device_get_uclass_id(struct unit_test_state *uts)
860 {
861         struct udevice *dev;
862
863         ut_assertok(uclass_get_device(UCLASS_TEST, 0, &dev));
864         ut_asserteq(UCLASS_TEST, device_get_uclass_id(dev));
865
866         return 0;
867 }
868 DM_TEST(dm_test_device_get_uclass_id, DM_TESTF_SCAN_PDATA);
869
870 static int dm_test_uclass_names(struct unit_test_state *uts)
871 {
872         ut_asserteq_str("test", uclass_get_name(UCLASS_TEST));
873         ut_asserteq(UCLASS_TEST, uclass_get_by_name("test"));
874
875         return 0;
876 }
877 DM_TEST(dm_test_uclass_names, DM_TESTF_SCAN_PDATA);
878
879 static int dm_test_inactive_child(struct unit_test_state *uts)
880 {
881         struct dm_test_state *dms = uts->priv;
882         struct udevice *parent, *dev1, *dev2;
883
884         /* Skip the behaviour in test_post_probe() */
885         dms->skip_post_probe = 1;
886
887         ut_assertok(uclass_first_device_err(UCLASS_TEST, &parent));
888
889         /*
890          * Create a child but do not activate it. Calling the function again
891          * should return the same child.
892          */
893         ut_asserteq(-ENODEV, device_find_first_inactive_child(parent,
894                                                         UCLASS_TEST, &dev1));
895         ut_assertok(device_bind_ofnode(parent, DM_GET_DRIVER(test_drv),
896                                        "test_child", 0, ofnode_null(), &dev1));
897
898         ut_assertok(device_find_first_inactive_child(parent, UCLASS_TEST,
899                                                      &dev2));
900         ut_asserteq_ptr(dev1, dev2);
901
902         ut_assertok(device_probe(dev1));
903         ut_asserteq(-ENODEV, device_find_first_inactive_child(parent,
904                                                         UCLASS_TEST, &dev2));
905
906         return 0;
907 }
908 DM_TEST(dm_test_inactive_child, DM_TESTF_SCAN_PDATA);