@ -25,6 +25,7 @@ enum {
TEST_INTVAL2 = 3 ,
TEST_INTVAL2 = 3 ,
TEST_INTVAL3 = 6 ,
TEST_INTVAL3 = 6 ,
TEST_INTVAL_MANUAL = 101112 ,
TEST_INTVAL_MANUAL = 101112 ,
TEST_INTVAL_PRE_RELOC = 7 ,
} ;
} ;
static const struct dm_test_pdata test_pdata [ ] = {
static const struct dm_test_pdata test_pdata [ ] = {
@ -37,6 +38,10 @@ static const struct dm_test_pdata test_pdata_manual = {
. ping_add = TEST_INTVAL_MANUAL ,
. ping_add = TEST_INTVAL_MANUAL ,
} ;
} ;
static const struct dm_test_pdata test_pdata_pre_reloc = {
. ping_add = TEST_INTVAL_PRE_RELOC ,
} ;
U_BOOT_DEVICE ( dm_test_info1 ) = {
U_BOOT_DEVICE ( dm_test_info1 ) = {
. name = " test_drv " ,
. name = " test_drv " ,
. platdata = & test_pdata [ 0 ] ,
. platdata = & test_pdata [ 0 ] ,
@ -57,6 +62,11 @@ static struct driver_info driver_info_manual = {
. platdata = & test_pdata_manual ,
. platdata = & test_pdata_manual ,
} ;
} ;
static struct driver_info driver_info_pre_reloc = {
. name = " test_pre_reloc_drv " ,
. platdata = & test_pdata_manual ,
} ;
/* Test that binding with platdata occurs correctly */
/* Test that binding with platdata occurs correctly */
static int dm_test_autobind ( struct dm_test_state * dms )
static int dm_test_autobind ( struct dm_test_state * dms )
{
{
@ -71,7 +81,7 @@ static int dm_test_autobind(struct dm_test_state *dms)
ut_asserteq ( 0 , list_count_items ( & gd - > dm_root - > child_head ) ) ;
ut_asserteq ( 0 , list_count_items ( & gd - > dm_root - > child_head ) ) ;
ut_asserteq ( 0 , dm_testdrv_op_count [ DM_TEST_OP_POST_BIND ] ) ;
ut_asserteq ( 0 , dm_testdrv_op_count [ DM_TEST_OP_POST_BIND ] ) ;
ut_assertok ( dm_scan_platdata ( ) ) ;
ut_assertok ( dm_scan_platdata ( false ) ) ;
/* We should have our test class now at least, plus more children */
/* We should have our test class now at least, plus more children */
ut_assert ( 1 < list_count_items ( & gd - > uclass_root ) ) ;
ut_assert ( 1 < list_count_items ( & gd - > uclass_root ) ) ;
@ -181,7 +191,7 @@ static int dm_test_lifecycle(struct dm_test_state *dms)
memcpy ( op_count , dm_testdrv_op_count , sizeof ( op_count ) ) ;
memcpy ( op_count , dm_testdrv_op_count , sizeof ( op_count ) ) ;
ut_assertok ( device_bind_by_name ( dms - > root , & driver_info_manual ,
ut_assertok ( device_bind_by_name ( dms - > root , false , & driver_info_manual ,
& dev ) ) ;
& dev ) ) ;
ut_assert ( dev ) ;
ut_assert ( dev ) ;
ut_assert ( dm_testdrv_op_count [ DM_TEST_OP_BIND ]
ut_assert ( dm_testdrv_op_count [ DM_TEST_OP_BIND ]
@ -232,15 +242,15 @@ static int dm_test_ordering(struct dm_test_state *dms)
struct udevice * dev , * dev_penultimate , * dev_last , * test_dev ;
struct udevice * dev , * dev_penultimate , * dev_last , * test_dev ;
int pingret ;
int pingret ;
ut_assertok ( device_bind_by_name ( dms - > root , & driver_info_manual ,
ut_assertok ( device_bind_by_name ( dms - > root , false , & driver_info_manual ,
& dev ) ) ;
& dev ) ) ;
ut_assert ( dev ) ;
ut_assert ( dev ) ;
/* Bind two new devices (numbers 4 and 5) */
/* Bind two new devices (numbers 4 and 5) */
ut_assertok ( device_bind_by_name ( dms - > root , & driver_info_manual ,
ut_assertok ( device_bind_by_name ( dms - > root , false , & driver_info_manual ,
& dev_penultimate ) ) ;
& dev_penultimate ) ) ;
ut_assert ( dev_penultimate ) ;
ut_assert ( dev_penultimate ) ;
ut_assertok ( device_bind_by_name ( dms - > root , & driver_info_manual ,
ut_assertok ( device_bind_by_name ( dms - > root , false , & driver_info_manual ,
& dev_last ) ) ;
& dev_last ) ) ;
ut_assert ( dev_last ) ;
ut_assert ( dev_last ) ;
@ -255,7 +265,8 @@ static int dm_test_ordering(struct dm_test_state *dms)
ut_assert ( dev_last = = test_dev ) ;
ut_assert ( dev_last = = test_dev ) ;
/* Add back the original device 3, now in position 5 */
/* Add back the original device 3, now in position 5 */
ut_assertok ( device_bind_by_name ( dms - > root , & driver_info_manual , & dev ) ) ;
ut_assertok ( device_bind_by_name ( dms - > root , false , & driver_info_manual ,
& dev ) ) ;
ut_assert ( dev ) ;
ut_assert ( dev ) ;
/* Try ping */
/* Try ping */
@ -375,8 +386,8 @@ static int dm_test_leak(struct dm_test_state *dms)
if ( ! start . uordblks )
if ( ! start . uordblks )
puts ( " Warning: Please add '#define DEBUG' to the top of common/dlmalloc.c \n " ) ;
puts ( " Warning: Please add '#define DEBUG' to the top of common/dlmalloc.c \n " ) ;
ut_assertok ( dm_scan_platdata ( ) ) ;
ut_assertok ( dm_scan_platdata ( false ) ) ;
ut_assertok ( dm_scan_fdt ( gd - > fdt_blob ) ) ;
ut_assertok ( dm_scan_fdt ( gd - > fdt_blob , false ) ) ;
/* Scanning the uclass is enough to probe all the devices */
/* Scanning the uclass is enough to probe all the devices */
for ( id = UCLASS_ROOT ; id < UCLASS_COUNT ; id + + ) {
for ( id = UCLASS_ROOT ; id < UCLASS_COUNT ; id + + ) {
@ -444,8 +455,8 @@ static int create_children(struct dm_test_state *dms, struct udevice *parent,
for ( i = 0 ; i < count ; i + + ) {
for ( i = 0 ; i < count ; i + + ) {
struct dm_test_pdata * pdata ;
struct dm_test_pdata * pdata ;
ut_assertok ( device_bind_by_name ( parent , & driver_info_manual ,
ut_assertok ( device_bind_by_name ( parent , false ,
& dev ) ) ;
& driver_info_manual , & d ev ) ) ;
pdata = calloc ( 1 , sizeof ( * pdata ) ) ;
pdata = calloc ( 1 , sizeof ( * pdata ) ) ;
pdata - > ping_add = key + i ;
pdata - > ping_add = key + i ;
dev - > platdata = pdata ;
dev - > platdata = pdata ;
@ -542,3 +553,20 @@ static int dm_test_children(struct dm_test_state *dms)
return 0 ;
return 0 ;
}
}
DM_TEST ( dm_test_children , 0 ) ;
DM_TEST ( dm_test_children , 0 ) ;
/* Test that pre-relocation devices work as expected */
static int dm_test_pre_reloc ( struct dm_test_state * dms )
{
struct udevice * dev ;
/* The normal driver should refuse to bind before relocation */
ut_asserteq ( - EPERM , device_bind_by_name ( dms - > root , true ,
& driver_info_manual , & dev ) ) ;
/* But this one is marked pre-reloc */
ut_assertok ( device_bind_by_name ( dms - > root , true ,
& driver_info_pre_reloc , & dev ) ) ;
return 0 ;
}
DM_TEST ( dm_test_pre_reloc , 0 ) ;