blob: 6703325c0b7684df168bf13f8d7611d76b74d472 [file] [log] [blame]
Jean-Jacques Hiblot49c752c2018-08-09 16:17:46 +02001# SPDX-License-Identifier: GPL-2.0
2# Copyright (c) 2016, NVIDIA CORPORATION. All rights reserved.
3
4import os.path
5import pytest
6import re
7
8def in_tree(response, name, uclass, drv, depth, last_child):
9 lines = [x.strip() for x in response.splitlines()]
Patrice Chotarde37d4c42020-07-28 09:13:34 +020010 leaf = ''
11 if depth != 0:
12 leaf = ' ' + ' ' * (depth - 1) ;
13 if not last_child:
14 leaf = leaf + r'\|'
15 else:
16 leaf = leaf + '`'
17
Jean-Jacques Hiblot49c752c2018-08-09 16:17:46 +020018 leaf = leaf + '-- ' + name
Pratyush Yadav8a34d3d2020-09-24 10:04:17 +053019 line = (r' *{:10.10} *[0-9]* \[ [ +] \] {:20.20} [` |]{}$'
Simon Glass54d2cfe2018-12-05 18:42:52 -070020 .format(uclass, drv, leaf))
Jean-Jacques Hiblot49c752c2018-08-09 16:17:46 +020021 prog = re.compile(line)
22 for l in lines:
23 if prog.match(l):
24 return True
25 return False
26
27
28@pytest.mark.buildconfigspec('cmd_bind')
29def test_bind_unbind_with_node(u_boot_console):
30
Simon Glass871bf7d2018-12-27 08:11:13 -070031 tree = u_boot_console.run_command('dm tree')
Walter Lozanoe3e24702020-06-25 01:10:04 -030032 assert in_tree(tree, 'bind-test', 'simple_bus', 'simple_bus', 0, True)
Simon Glass871bf7d2018-12-27 08:11:13 -070033 assert in_tree(tree, 'bind-test-child1', 'phy', 'phy_sandbox', 1, False)
Walter Lozanoe3e24702020-06-25 01:10:04 -030034 assert in_tree(tree, 'bind-test-child2', 'simple_bus', 'simple_bus', 1, True)
Jean-Jacques Hiblot49c752c2018-08-09 16:17:46 +020035
36 #Unbind child #1. No error expected and all devices should be there except for bind-test-child1
Simon Glass871bf7d2018-12-27 08:11:13 -070037 response = u_boot_console.run_command('unbind /bind-test/bind-test-child1')
Jean-Jacques Hiblot49c752c2018-08-09 16:17:46 +020038 assert response == ''
Simon Glass871bf7d2018-12-27 08:11:13 -070039 tree = u_boot_console.run_command('dm tree')
Walter Lozanoe3e24702020-06-25 01:10:04 -030040 assert in_tree(tree, 'bind-test', 'simple_bus', 'simple_bus', 0, True)
Simon Glass871bf7d2018-12-27 08:11:13 -070041 assert 'bind-test-child1' not in tree
Walter Lozanoe3e24702020-06-25 01:10:04 -030042 assert in_tree(tree, 'bind-test-child2', 'simple_bus', 'simple_bus', 1, True)
Jean-Jacques Hiblot49c752c2018-08-09 16:17:46 +020043
44 #bind child #1. No error expected and all devices should be there
Simon Glass871bf7d2018-12-27 08:11:13 -070045 response = u_boot_console.run_command('bind /bind-test/bind-test-child1 phy_sandbox')
Jean-Jacques Hiblot49c752c2018-08-09 16:17:46 +020046 assert response == ''
Simon Glass871bf7d2018-12-27 08:11:13 -070047 tree = u_boot_console.run_command('dm tree')
Walter Lozanoe3e24702020-06-25 01:10:04 -030048 assert in_tree(tree, 'bind-test', 'simple_bus', 'simple_bus', 0, True)
Simon Glass871bf7d2018-12-27 08:11:13 -070049 assert in_tree(tree, 'bind-test-child1', 'phy', 'phy_sandbox', 1, True)
Walter Lozanoe3e24702020-06-25 01:10:04 -030050 assert in_tree(tree, 'bind-test-child2', 'simple_bus', 'simple_bus', 1, False)
Jean-Jacques Hiblot49c752c2018-08-09 16:17:46 +020051
52 #Unbind child #2. No error expected and all devices should be there except for bind-test-child2
Simon Glass871bf7d2018-12-27 08:11:13 -070053 response = u_boot_console.run_command('unbind /bind-test/bind-test-child2')
Jean-Jacques Hiblot49c752c2018-08-09 16:17:46 +020054 assert response == ''
Simon Glass871bf7d2018-12-27 08:11:13 -070055 tree = u_boot_console.run_command('dm tree')
Walter Lozanoe3e24702020-06-25 01:10:04 -030056 assert in_tree(tree, 'bind-test', 'simple_bus', 'simple_bus', 0, True)
Simon Glass871bf7d2018-12-27 08:11:13 -070057 assert in_tree(tree, 'bind-test-child1', 'phy', 'phy_sandbox', 1, True)
58 assert 'bind-test-child2' not in tree
Jean-Jacques Hiblot49c752c2018-08-09 16:17:46 +020059
60
61 #Bind child #2. No error expected and all devices should be there
Walter Lozanoe3e24702020-06-25 01:10:04 -030062 response = u_boot_console.run_command('bind /bind-test/bind-test-child2 simple_bus')
Jean-Jacques Hiblot49c752c2018-08-09 16:17:46 +020063 assert response == ''
Simon Glass871bf7d2018-12-27 08:11:13 -070064 tree = u_boot_console.run_command('dm tree')
Walter Lozanoe3e24702020-06-25 01:10:04 -030065 assert in_tree(tree, 'bind-test', 'simple_bus', 'simple_bus', 0, True)
Simon Glass871bf7d2018-12-27 08:11:13 -070066 assert in_tree(tree, 'bind-test-child1', 'phy', 'phy_sandbox', 1, False)
Walter Lozanoe3e24702020-06-25 01:10:04 -030067 assert in_tree(tree, 'bind-test-child2', 'simple_bus', 'simple_bus', 1, True)
Jean-Jacques Hiblot49c752c2018-08-09 16:17:46 +020068
69 #Unbind parent. No error expected. All devices should be removed and unbound
Simon Glass871bf7d2018-12-27 08:11:13 -070070 response = u_boot_console.run_command('unbind /bind-test')
Jean-Jacques Hiblot49c752c2018-08-09 16:17:46 +020071 assert response == ''
Simon Glass871bf7d2018-12-27 08:11:13 -070072 tree = u_boot_console.run_command('dm tree')
73 assert 'bind-test' not in tree
74 assert 'bind-test-child1' not in tree
75 assert 'bind-test-child2' not in tree
Jean-Jacques Hiblot49c752c2018-08-09 16:17:46 +020076
77 #try binding invalid node with valid driver
Walter Lozanoe3e24702020-06-25 01:10:04 -030078 response = u_boot_console.run_command('bind /not-a-valid-node simple_bus')
Jean-Jacques Hiblot49c752c2018-08-09 16:17:46 +020079 assert response != ''
Simon Glass871bf7d2018-12-27 08:11:13 -070080 tree = u_boot_console.run_command('dm tree')
81 assert 'not-a-valid-node' not in tree
Jean-Jacques Hiblot49c752c2018-08-09 16:17:46 +020082
83 #try binding valid node with invalid driver
Simon Glass871bf7d2018-12-27 08:11:13 -070084 response = u_boot_console.run_command('bind /bind-test not_a_driver')
Jean-Jacques Hiblot49c752c2018-08-09 16:17:46 +020085 assert response != ''
Simon Glass871bf7d2018-12-27 08:11:13 -070086 tree = u_boot_console.run_command('dm tree')
87 assert 'bind-test' not in tree
Jean-Jacques Hiblot49c752c2018-08-09 16:17:46 +020088
89 #bind /bind-test. Device should come up as well as its children
Walter Lozanoe3e24702020-06-25 01:10:04 -030090 response = u_boot_console.run_command('bind /bind-test simple_bus')
Jean-Jacques Hiblot49c752c2018-08-09 16:17:46 +020091 assert response == ''
Simon Glass871bf7d2018-12-27 08:11:13 -070092 tree = u_boot_console.run_command('dm tree')
Walter Lozanoe3e24702020-06-25 01:10:04 -030093 assert in_tree(tree, 'bind-test', 'simple_bus', 'simple_bus', 0, True)
Simon Glass871bf7d2018-12-27 08:11:13 -070094 assert in_tree(tree, 'bind-test-child1', 'phy', 'phy_sandbox', 1, False)
Walter Lozanoe3e24702020-06-25 01:10:04 -030095 assert in_tree(tree, 'bind-test-child2', 'simple_bus', 'simple_bus', 1, True)
Jean-Jacques Hiblot49c752c2018-08-09 16:17:46 +020096
Simon Glass871bf7d2018-12-27 08:11:13 -070097 response = u_boot_console.run_command('unbind /bind-test')
Jean-Jacques Hiblot49c752c2018-08-09 16:17:46 +020098 assert response == ''
99
100def get_next_line(tree, name):
101 treelines = [x.strip() for x in tree.splitlines() if x.strip()]
Simon Glass871bf7d2018-12-27 08:11:13 -0700102 child_line = ''
Jean-Jacques Hiblot49c752c2018-08-09 16:17:46 +0200103 for idx, line in enumerate(treelines):
Simon Glass871bf7d2018-12-27 08:11:13 -0700104 if ('-- ' + name) in line:
Jean-Jacques Hiblot49c752c2018-08-09 16:17:46 +0200105 try:
106 child_line = treelines[idx+1]
107 except:
108 pass
109 break
110 return child_line
111
112@pytest.mark.buildconfigspec('cmd_bind')
113def test_bind_unbind_with_uclass(u_boot_console):
114 #bind /bind-test
Walter Lozanoe3e24702020-06-25 01:10:04 -0300115 response = u_boot_console.run_command('bind /bind-test simple_bus')
Jean-Jacques Hiblot49c752c2018-08-09 16:17:46 +0200116 assert response == ''
117
118 #make sure bind-test-child2 is there and get its uclass/index pair
Simon Glass871bf7d2018-12-27 08:11:13 -0700119 tree = u_boot_console.run_command('dm tree')
120 child2_line = [x.strip() for x in tree.splitlines() if '-- bind-test-child2' in x]
Jean-Jacques Hiblot49c752c2018-08-09 16:17:46 +0200121 assert len(child2_line) == 1
122
123 child2_uclass = child2_line[0].split()[0]
124 child2_index = int(child2_line[0].split()[1])
125
Walter Lozanoe3e24702020-06-25 01:10:04 -0300126 #bind simple_bus as a child of bind-test-child2
127 response = u_boot_console.run_command('bind {} {} simple_bus'.format(child2_uclass, child2_index, 'simple_bus'))
Jean-Jacques Hiblot49c752c2018-08-09 16:17:46 +0200128
129 #check that the child is there and its uclass/index pair is right
Simon Glass871bf7d2018-12-27 08:11:13 -0700130 tree = u_boot_console.run_command('dm tree')
Jean-Jacques Hiblot49c752c2018-08-09 16:17:46 +0200131
Simon Glass871bf7d2018-12-27 08:11:13 -0700132 child_of_child2_line = get_next_line(tree, 'bind-test-child2')
Jean-Jacques Hiblot49c752c2018-08-09 16:17:46 +0200133 assert child_of_child2_line
134 child_of_child2_index = int(child_of_child2_line.split()[1])
Walter Lozanoe3e24702020-06-25 01:10:04 -0300135 assert in_tree(tree, 'simple_bus', 'simple_bus', 'simple_bus', 2, True)
Jean-Jacques Hiblot49c752c2018-08-09 16:17:46 +0200136 assert child_of_child2_index == child2_index + 1
137
138 #unbind the child and check it has been removed
Simon Glass871bf7d2018-12-27 08:11:13 -0700139 response = u_boot_console.run_command('unbind simple_bus {}'.format(child_of_child2_index))
Jean-Jacques Hiblot49c752c2018-08-09 16:17:46 +0200140 assert response == ''
Simon Glass871bf7d2018-12-27 08:11:13 -0700141 tree = u_boot_console.run_command('dm tree')
Walter Lozanoe3e24702020-06-25 01:10:04 -0300142 assert in_tree(tree, 'bind-test-child2', 'simple_bus', 'simple_bus', 1, True)
143 assert not in_tree(tree, 'simple_bus', 'simple_bus', 'simple_bus', 2, True)
Simon Glass871bf7d2018-12-27 08:11:13 -0700144 child_of_child2_line = get_next_line(tree, 'bind-test-child2')
145 assert child_of_child2_line == ''
Jean-Jacques Hiblot49c752c2018-08-09 16:17:46 +0200146
Walter Lozanoe3e24702020-06-25 01:10:04 -0300147 #bind simple_bus as a child of bind-test-child2
148 response = u_boot_console.run_command('bind {} {} simple_bus'.format(child2_uclass, child2_index, 'simple_bus'))
Jean-Jacques Hiblot49c752c2018-08-09 16:17:46 +0200149
150 #check that the child is there and its uclass/index pair is right
Simon Glass871bf7d2018-12-27 08:11:13 -0700151 tree = u_boot_console.run_command('dm tree')
Jean-Jacques Hiblot49c752c2018-08-09 16:17:46 +0200152 treelines = [x.strip() for x in tree.splitlines() if x.strip()]
153
Simon Glass871bf7d2018-12-27 08:11:13 -0700154 child_of_child2_line = get_next_line(tree, 'bind-test-child2')
Jean-Jacques Hiblot49c752c2018-08-09 16:17:46 +0200155 assert child_of_child2_line
156 child_of_child2_index = int(child_of_child2_line.split()[1])
Walter Lozanoe3e24702020-06-25 01:10:04 -0300157 assert in_tree(tree, 'simple_bus', 'simple_bus', 'simple_bus', 2, True)
Jean-Jacques Hiblot49c752c2018-08-09 16:17:46 +0200158 assert child_of_child2_index == child2_index + 1
159
160 #unbind the child and check it has been removed
Walter Lozanoe3e24702020-06-25 01:10:04 -0300161 response = u_boot_console.run_command('unbind {} {} simple_bus'.format(child2_uclass, child2_index, 'simple_bus'))
Jean-Jacques Hiblot49c752c2018-08-09 16:17:46 +0200162 assert response == ''
163
Simon Glass871bf7d2018-12-27 08:11:13 -0700164 tree = u_boot_console.run_command('dm tree')
Walter Lozanoe3e24702020-06-25 01:10:04 -0300165 assert in_tree(tree, 'bind-test-child2', 'simple_bus', 'simple_bus', 1, True)
Jean-Jacques Hiblot49c752c2018-08-09 16:17:46 +0200166
Simon Glass871bf7d2018-12-27 08:11:13 -0700167 child_of_child2_line = get_next_line(tree, 'bind-test-child2')
168 assert child_of_child2_line == ''
Jean-Jacques Hiblot49c752c2018-08-09 16:17:46 +0200169
170 #unbind the child again and check it doesn't change the tree
Simon Glass871bf7d2018-12-27 08:11:13 -0700171 tree_old = u_boot_console.run_command('dm tree')
Walter Lozanoe3e24702020-06-25 01:10:04 -0300172 response = u_boot_console.run_command('unbind {} {} simple_bus'.format(child2_uclass, child2_index, 'simple_bus'))
Simon Glass871bf7d2018-12-27 08:11:13 -0700173 tree_new = u_boot_console.run_command('dm tree')
Jean-Jacques Hiblot49c752c2018-08-09 16:17:46 +0200174
175 assert response == ''
176 assert tree_old == tree_new
177
Simon Glass871bf7d2018-12-27 08:11:13 -0700178 response = u_boot_console.run_command('unbind /bind-test')
Jean-Jacques Hiblot49c752c2018-08-09 16:17:46 +0200179 assert response == ''