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