blob: c90c54d266f34ca04aa2bb25b51328df491c335a [file] [log] [blame]
Jean-Jacques Hiblote83a31b2018-08-09 16:17:46 +02001# SPDX-License-Identifier: GPL-2.0
2# Copyright (c) 2016, NVIDIA CORPORATION. All rights reserved.
3
Heinrich Schuchardtdeccc812022-04-30 11:26:23 +02004""" Test for bind command """
5
Jean-Jacques Hiblote83a31b2018-08-09 16:17:46 +02006import re
Heinrich Schuchardtdeccc812022-04-30 11:26:23 +02007import pytest
Jean-Jacques Hiblote83a31b2018-08-09 16:17:46 +02008
9def in_tree(response, name, uclass, drv, depth, last_child):
Heinrich Schuchardtdeccc812022-04-30 11:26:23 +020010 lines = [x.strip() for x in response.splitlines()]
11 leaf = ''
12 if depth != 0:
13 leaf = ' ' + ' ' * (depth - 1)
14 if not last_child:
15 leaf = leaf + r'\|'
16 else:
17 leaf = leaf + '`'
Patrice Chotardf0c9d1a2020-07-28 09:13:34 +020018
Heinrich Schuchardtdeccc812022-04-30 11:26:23 +020019 leaf = leaf + '-- ' + name
20 line = (r' *{:10.10} *[0-9]* \[ [ +] \] {:20.20} [` |]{}$'
21 .format(uclass, drv, leaf))
22 prog = re.compile(line)
23 for l in lines:
24 if prog.match(l):
25 return True
26 return False
Jean-Jacques Hiblote83a31b2018-08-09 16:17:46 +020027
Michal Simek901f5ba2022-07-07 12:52:26 +020028@pytest.mark.boardspec('sandbox')
Jean-Jacques Hiblote83a31b2018-08-09 16:17:46 +020029@pytest.mark.buildconfigspec('cmd_bind')
30def test_bind_unbind_with_node(u_boot_console):
31
Heinrich Schuchardtdeccc812022-04-30 11:26:23 +020032 tree = u_boot_console.run_command('dm tree')
33 assert in_tree(tree, 'bind-test', 'simple_bus', 'simple_bus', 0, True)
34 assert in_tree(tree, 'bind-test-child1', 'phy', 'phy_sandbox', 1, False)
35 assert in_tree(tree, 'bind-test-child2', 'simple_bus', 'simple_bus', 1, True)
Jean-Jacques Hiblote83a31b2018-08-09 16:17:46 +020036
Heinrich Schuchardtdeccc812022-04-30 11:26:23 +020037 #bind usb_ether driver (which has no compatible) to usb@1 node.
38 ##New entry usb_ether should appear in the dm tree
39 response = u_boot_console.run_command('bind /usb@1 usb_ether')
40 assert response == ''
41 tree = u_boot_console.run_command('dm tree')
42 assert in_tree(tree, 'usb@1', 'ethernet', 'usb_ether', 1, True)
Patrice Chotard4ffd03a2021-09-10 16:16:24 +020043
Heinrich Schuchardtdeccc812022-04-30 11:26:23 +020044 #Unbind child #1. No error expected and all devices should be there except for bind-test-child1
45 response = u_boot_console.run_command('unbind /bind-test/bind-test-child1')
46 assert response == ''
47 tree = u_boot_console.run_command('dm tree')
48 assert in_tree(tree, 'bind-test', 'simple_bus', 'simple_bus', 0, True)
49 assert 'bind-test-child1' not in tree
50 assert in_tree(tree, 'bind-test-child2', 'simple_bus', 'simple_bus', 1, True)
Jean-Jacques Hiblote83a31b2018-08-09 16:17:46 +020051
Heinrich Schuchardtdeccc812022-04-30 11:26:23 +020052 #bind child #1. No error expected and all devices should be there
53 response = u_boot_console.run_command('bind /bind-test/bind-test-child1 phy_sandbox')
54 assert response == ''
55 tree = u_boot_console.run_command('dm tree')
56 assert in_tree(tree, 'bind-test', 'simple_bus', 'simple_bus', 0, True)
57 assert in_tree(tree, 'bind-test-child1', 'phy', 'phy_sandbox', 1, True)
58 assert in_tree(tree, 'bind-test-child2', 'simple_bus', 'simple_bus', 1, False)
Jean-Jacques Hiblote83a31b2018-08-09 16:17:46 +020059
Heinrich Schuchardtdeccc812022-04-30 11:26:23 +020060 #Unbind child #2. No error expected and all devices should be there except for bind-test-child2
61 response = u_boot_console.run_command('unbind /bind-test/bind-test-child2')
62 assert response == ''
63 tree = u_boot_console.run_command('dm tree')
64 assert in_tree(tree, 'bind-test', 'simple_bus', 'simple_bus', 0, True)
65 assert in_tree(tree, 'bind-test-child1', 'phy', 'phy_sandbox', 1, True)
66 assert 'bind-test-child2' not in tree
Jean-Jacques Hiblote83a31b2018-08-09 16:17:46 +020067
68
Heinrich Schuchardtdeccc812022-04-30 11:26:23 +020069 #Bind child #2. No error expected and all devices should be there
70 response = u_boot_console.run_command('bind /bind-test/bind-test-child2 simple_bus')
71 assert response == ''
72 tree = u_boot_console.run_command('dm tree')
73 assert in_tree(tree, 'bind-test', 'simple_bus', 'simple_bus', 0, True)
74 assert in_tree(tree, 'bind-test-child1', 'phy', 'phy_sandbox', 1, False)
75 assert in_tree(tree, 'bind-test-child2', 'simple_bus', 'simple_bus', 1, True)
Jean-Jacques Hiblote83a31b2018-08-09 16:17:46 +020076
Heinrich Schuchardtdeccc812022-04-30 11:26:23 +020077 #Unbind parent. No error expected. All devices should be removed and unbound
78 response = u_boot_console.run_command('unbind /bind-test')
79 assert response == ''
80 tree = u_boot_console.run_command('dm tree')
81 assert 'bind-test' not in tree
82 assert 'bind-test-child1' not in tree
83 assert 'bind-test-child2' not in tree
Jean-Jacques Hiblote83a31b2018-08-09 16:17:46 +020084
Heinrich Schuchardtdeccc812022-04-30 11:26:23 +020085 #try binding invalid node with valid driver
86 response = u_boot_console.run_command('bind /not-a-valid-node simple_bus')
87 assert response != ''
88 tree = u_boot_console.run_command('dm tree')
89 assert 'not-a-valid-node' not in tree
Jean-Jacques Hiblote83a31b2018-08-09 16:17:46 +020090
Heinrich Schuchardtdeccc812022-04-30 11:26:23 +020091 #try binding valid node with invalid driver
92 response = u_boot_console.run_command('bind /bind-test not_a_driver')
93 assert response != ''
94 tree = u_boot_console.run_command('dm tree')
95 assert 'bind-test' not in tree
Jean-Jacques Hiblote83a31b2018-08-09 16:17:46 +020096
Heinrich Schuchardtdeccc812022-04-30 11:26:23 +020097 #bind /bind-test. Device should come up as well as its children
98 response = u_boot_console.run_command('bind /bind-test simple_bus')
99 assert response == ''
100 tree = u_boot_console.run_command('dm tree')
101 assert in_tree(tree, 'bind-test', 'simple_bus', 'simple_bus', 0, True)
102 assert in_tree(tree, 'bind-test-child1', 'phy', 'phy_sandbox', 1, False)
103 assert in_tree(tree, 'bind-test-child2', 'simple_bus', 'simple_bus', 1, True)
Jean-Jacques Hiblote83a31b2018-08-09 16:17:46 +0200104
Heinrich Schuchardtdeccc812022-04-30 11:26:23 +0200105 response = u_boot_console.run_command('unbind /bind-test')
106 assert response == ''
Jean-Jacques Hiblote83a31b2018-08-09 16:17:46 +0200107
108def get_next_line(tree, name):
Heinrich Schuchardtdeccc812022-04-30 11:26:23 +0200109 treelines = [x.strip() for x in tree.splitlines() if x.strip()]
110 child_line = ''
111 for idx, line in enumerate(treelines):
112 if '-- ' + name in line:
113 try:
114 child_line = treelines[idx+1]
115 except:
116 pass
117 break
118 return child_line
Jean-Jacques Hiblote83a31b2018-08-09 16:17:46 +0200119
Michal Simek901f5ba2022-07-07 12:52:26 +0200120@pytest.mark.boardspec('sandbox')
Jean-Jacques Hiblote83a31b2018-08-09 16:17:46 +0200121@pytest.mark.buildconfigspec('cmd_bind')
122def test_bind_unbind_with_uclass(u_boot_console):
Heinrich Schuchardtdeccc812022-04-30 11:26:23 +0200123 #bind /bind-test
124 response = u_boot_console.run_command('bind /bind-test simple_bus')
125 assert response == ''
Jean-Jacques Hiblote83a31b2018-08-09 16:17:46 +0200126
Heinrich Schuchardtdeccc812022-04-30 11:26:23 +0200127 #make sure bind-test-child2 is there and get its uclass/index pair
128 tree = u_boot_console.run_command('dm tree')
129 child2_line = [x.strip() for x in tree.splitlines() if '-- bind-test-child2' in x]
130 assert len(child2_line) == 1
Jean-Jacques Hiblote83a31b2018-08-09 16:17:46 +0200131
Heinrich Schuchardtdeccc812022-04-30 11:26:23 +0200132 child2_uclass = child2_line[0].split()[0]
133 child2_index = int(child2_line[0].split()[1])
Jean-Jacques Hiblote83a31b2018-08-09 16:17:46 +0200134
Heinrich Schuchardtdeccc812022-04-30 11:26:23 +0200135 #bind simple_bus as a child of bind-test-child2
136 response = u_boot_console.run_command(
137 'bind {} {} simple_bus'.format(child2_uclass, child2_index))
Jean-Jacques Hiblote83a31b2018-08-09 16:17:46 +0200138
Heinrich Schuchardtdeccc812022-04-30 11:26:23 +0200139 #check that the child is there and its uclass/index pair is right
140 tree = u_boot_console.run_command('dm tree')
Jean-Jacques Hiblote83a31b2018-08-09 16:17:46 +0200141
Heinrich Schuchardtdeccc812022-04-30 11:26:23 +0200142 child_of_child2_line = get_next_line(tree, 'bind-test-child2')
143 assert child_of_child2_line
144 child_of_child2_index = int(child_of_child2_line.split()[1])
145 assert in_tree(tree, 'simple_bus', 'simple_bus', 'simple_bus', 2, True)
146 assert child_of_child2_index == child2_index + 1
Jean-Jacques Hiblote83a31b2018-08-09 16:17:46 +0200147
Heinrich Schuchardtdeccc812022-04-30 11:26:23 +0200148 #unbind the child and check it has been removed
149 response = u_boot_console.run_command('unbind simple_bus {}'.format(child_of_child2_index))
150 assert response == ''
151 tree = u_boot_console.run_command('dm tree')
152 assert in_tree(tree, 'bind-test-child2', 'simple_bus', 'simple_bus', 1, True)
153 assert not in_tree(tree, 'simple_bus', 'simple_bus', 'simple_bus', 2, True)
154 child_of_child2_line = get_next_line(tree, 'bind-test-child2')
155 assert child_of_child2_line == ''
Jean-Jacques Hiblote83a31b2018-08-09 16:17:46 +0200156
Heinrich Schuchardtdeccc812022-04-30 11:26:23 +0200157 #bind simple_bus as a child of bind-test-child2
158 response = u_boot_console.run_command(
159 'bind {} {} simple_bus'.format(child2_uclass, child2_index))
Jean-Jacques Hiblote83a31b2018-08-09 16:17:46 +0200160
Heinrich Schuchardtdeccc812022-04-30 11:26:23 +0200161 #check that the child is there and its uclass/index pair is right
162 tree = u_boot_console.run_command('dm tree')
163 treelines = [x.strip() for x in tree.splitlines() if x.strip()]
Jean-Jacques Hiblote83a31b2018-08-09 16:17:46 +0200164
Heinrich Schuchardtdeccc812022-04-30 11:26:23 +0200165 child_of_child2_line = get_next_line(tree, 'bind-test-child2')
166 assert child_of_child2_line
167 child_of_child2_index = int(child_of_child2_line.split()[1])
168 assert in_tree(tree, 'simple_bus', 'simple_bus', 'simple_bus', 2, True)
169 assert child_of_child2_index == child2_index + 1
Jean-Jacques Hiblote83a31b2018-08-09 16:17:46 +0200170
Heinrich Schuchardtdeccc812022-04-30 11:26:23 +0200171 #unbind the child and check it has been removed
172 response = u_boot_console.run_command(
173 'unbind {} {} simple_bus'.format(child2_uclass, child2_index))
174 assert response == ''
Jean-Jacques Hiblote83a31b2018-08-09 16:17:46 +0200175
Heinrich Schuchardtdeccc812022-04-30 11:26:23 +0200176 tree = u_boot_console.run_command('dm tree')
177 assert in_tree(tree, 'bind-test-child2', 'simple_bus', 'simple_bus', 1, True)
Jean-Jacques Hiblote83a31b2018-08-09 16:17:46 +0200178
Heinrich Schuchardtdeccc812022-04-30 11:26:23 +0200179 child_of_child2_line = get_next_line(tree, 'bind-test-child2')
180 assert child_of_child2_line == ''
Jean-Jacques Hiblote83a31b2018-08-09 16:17:46 +0200181
Heinrich Schuchardtdeccc812022-04-30 11:26:23 +0200182 #unbind the child again and check it doesn't change the tree
183 tree_old = u_boot_console.run_command('dm tree')
184 response = u_boot_console.run_command(
185 'unbind {} {} simple_bus'.format(child2_uclass, child2_index))
186 tree_new = u_boot_console.run_command('dm tree')
Jean-Jacques Hiblote83a31b2018-08-09 16:17:46 +0200187
Heinrich Schuchardtdeccc812022-04-30 11:26:23 +0200188 assert response == ''
189 assert tree_old == tree_new
Jean-Jacques Hiblote83a31b2018-08-09 16:17:46 +0200190
Heinrich Schuchardtdeccc812022-04-30 11:26:23 +0200191 response = u_boot_console.run_command('unbind /bind-test')
192 assert response == ''