Jean-Jacques Hiblot | 49c752c | 2018-08-09 16:17:46 +0200 | [diff] [blame] | 1 | # SPDX-License-Identifier: GPL-2.0 |
| 2 | # Copyright (c) 2016, NVIDIA CORPORATION. All rights reserved. |
| 3 | |
| 4 | import os.path |
| 5 | import pytest |
| 6 | import re |
| 7 | |
| 8 | def in_tree(response, name, uclass, drv, depth, last_child): |
| 9 | lines = [x.strip() for x in response.splitlines()] |
| 10 | leaf = ' ' * 4 * depth; |
| 11 | if not last_child: |
| 12 | leaf = leaf + '\|' |
| 13 | else: |
| 14 | leaf = leaf + '`' |
| 15 | leaf = leaf + '-- ' + name |
Simon Glass | 54d2cfe | 2018-12-05 18:42:52 -0700 | [diff] [blame^] | 16 | line = (' *{:10.10} [0-9]* \[ [ +] \] {:20.20} {}$' |
| 17 | .format(uclass, drv, leaf)) |
Jean-Jacques Hiblot | 49c752c | 2018-08-09 16:17:46 +0200 | [diff] [blame] | 18 | prog = re.compile(line) |
| 19 | for l in lines: |
| 20 | if prog.match(l): |
| 21 | return True |
| 22 | return False |
| 23 | |
| 24 | |
| 25 | @pytest.mark.buildconfigspec('cmd_bind') |
| 26 | def test_bind_unbind_with_node(u_boot_console): |
| 27 | |
| 28 | #bind /bind-test. Device should come up as well as its children |
| 29 | response = u_boot_console.run_command("bind /bind-test generic_simple_bus") |
| 30 | assert response == '' |
| 31 | tree = u_boot_console.run_command("dm tree") |
Liviu Dudau | 5197daf | 2018-10-15 10:03:06 +0100 | [diff] [blame] | 32 | assert in_tree(tree, "bind-test", "simple_bus", "generic_simple_bus", 0, True) |
Jean-Jacques Hiblot | 49c752c | 2018-08-09 16:17:46 +0200 | [diff] [blame] | 33 | assert in_tree(tree, "bind-test-child1", "phy", "phy_sandbox", 1, False) |
Liviu Dudau | 5197daf | 2018-10-15 10:03:06 +0100 | [diff] [blame] | 34 | assert in_tree(tree, "bind-test-child2", "simple_bus", "generic_simple_bus", 1, True) |
Jean-Jacques Hiblot | 49c752c | 2018-08-09 16:17:46 +0200 | [diff] [blame] | 35 | |
| 36 | #Unbind child #1. No error expected and all devices should be there except for bind-test-child1 |
| 37 | response = u_boot_console.run_command("unbind /bind-test/bind-test-child1") |
| 38 | assert response == '' |
| 39 | tree = u_boot_console.run_command("dm tree") |
Liviu Dudau | 5197daf | 2018-10-15 10:03:06 +0100 | [diff] [blame] | 40 | assert in_tree(tree, "bind-test", "simple_bus", "generic_simple_bus", 0, True) |
Jean-Jacques Hiblot | 49c752c | 2018-08-09 16:17:46 +0200 | [diff] [blame] | 41 | assert "bind-test-child1" not in tree |
Liviu Dudau | 5197daf | 2018-10-15 10:03:06 +0100 | [diff] [blame] | 42 | assert in_tree(tree, "bind-test-child2", "simple_bus", "generic_simple_bus", 1, True) |
Jean-Jacques Hiblot | 49c752c | 2018-08-09 16:17:46 +0200 | [diff] [blame] | 43 | |
| 44 | #bind child #1. No error expected and all devices should be there |
| 45 | response = u_boot_console.run_command("bind /bind-test/bind-test-child1 phy_sandbox") |
| 46 | assert response == '' |
| 47 | tree = u_boot_console.run_command("dm tree") |
Liviu Dudau | 5197daf | 2018-10-15 10:03:06 +0100 | [diff] [blame] | 48 | assert in_tree(tree, "bind-test", "simple_bus", "generic_simple_bus", 0, True) |
Jean-Jacques Hiblot | 49c752c | 2018-08-09 16:17:46 +0200 | [diff] [blame] | 49 | assert in_tree(tree, "bind-test-child1", "phy", "phy_sandbox", 1, True) |
Liviu Dudau | 5197daf | 2018-10-15 10:03:06 +0100 | [diff] [blame] | 50 | assert in_tree(tree, "bind-test-child2", "simple_bus", "generic_simple_bus", 1, False) |
Jean-Jacques Hiblot | 49c752c | 2018-08-09 16:17:46 +0200 | [diff] [blame] | 51 | |
| 52 | #Unbind child #2. No error expected and all devices should be there except for bind-test-child2 |
| 53 | response = u_boot_console.run_command("unbind /bind-test/bind-test-child2") |
| 54 | assert response == '' |
| 55 | tree = u_boot_console.run_command("dm tree") |
Liviu Dudau | 5197daf | 2018-10-15 10:03:06 +0100 | [diff] [blame] | 56 | assert in_tree(tree, "bind-test", "simple_bus", "generic_simple_bus", 0, True) |
Jean-Jacques Hiblot | 49c752c | 2018-08-09 16:17:46 +0200 | [diff] [blame] | 57 | assert in_tree(tree, "bind-test-child1", "phy", "phy_sandbox", 1, True) |
| 58 | assert "bind-test-child2" not in tree |
| 59 | |
| 60 | |
| 61 | #Bind child #2. No error expected and all devices should be there |
| 62 | response = u_boot_console.run_command("bind /bind-test/bind-test-child2 generic_simple_bus") |
| 63 | assert response == '' |
| 64 | tree = u_boot_console.run_command("dm tree") |
Liviu Dudau | 5197daf | 2018-10-15 10:03:06 +0100 | [diff] [blame] | 65 | assert in_tree(tree, "bind-test", "simple_bus", "generic_simple_bus", 0, True) |
Jean-Jacques Hiblot | 49c752c | 2018-08-09 16:17:46 +0200 | [diff] [blame] | 66 | assert in_tree(tree, "bind-test-child1", "phy", "phy_sandbox", 1, False) |
Liviu Dudau | 5197daf | 2018-10-15 10:03:06 +0100 | [diff] [blame] | 67 | assert in_tree(tree, "bind-test-child2", "simple_bus", "generic_simple_bus", 1, True) |
Jean-Jacques Hiblot | 49c752c | 2018-08-09 16:17:46 +0200 | [diff] [blame] | 68 | |
| 69 | #Unbind parent. No error expected. All devices should be removed and unbound |
| 70 | response = u_boot_console.run_command("unbind /bind-test") |
| 71 | assert response == '' |
| 72 | 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 |
| 76 | |
| 77 | #try binding invalid node with valid driver |
| 78 | response = u_boot_console.run_command("bind /not-a-valid-node generic_simple_bus") |
| 79 | assert response != '' |
| 80 | tree = u_boot_console.run_command("dm tree") |
| 81 | assert "not-a-valid-node" not in tree |
| 82 | |
| 83 | #try binding valid node with invalid driver |
| 84 | response = u_boot_console.run_command("bind /bind-test not_a_driver") |
| 85 | assert response != '' |
| 86 | tree = u_boot_console.run_command("dm tree") |
| 87 | assert "bind-test" not in tree |
| 88 | |
| 89 | #bind /bind-test. Device should come up as well as its children |
| 90 | response = u_boot_console.run_command("bind /bind-test generic_simple_bus") |
| 91 | assert response == '' |
| 92 | tree = u_boot_console.run_command("dm tree") |
Liviu Dudau | 5197daf | 2018-10-15 10:03:06 +0100 | [diff] [blame] | 93 | assert in_tree(tree, "bind-test", "simple_bus", "generic_simple_bus", 0, True) |
Jean-Jacques Hiblot | 49c752c | 2018-08-09 16:17:46 +0200 | [diff] [blame] | 94 | assert in_tree(tree, "bind-test-child1", "phy", "phy_sandbox", 1, False) |
Liviu Dudau | 5197daf | 2018-10-15 10:03:06 +0100 | [diff] [blame] | 95 | assert in_tree(tree, "bind-test-child2", "simple_bus", "generic_simple_bus", 1, True) |
Jean-Jacques Hiblot | 49c752c | 2018-08-09 16:17:46 +0200 | [diff] [blame] | 96 | |
| 97 | response = u_boot_console.run_command("unbind /bind-test") |
| 98 | assert response == '' |
| 99 | |
| 100 | def get_next_line(tree, name): |
| 101 | treelines = [x.strip() for x in tree.splitlines() if x.strip()] |
| 102 | child_line = "" |
| 103 | for idx, line in enumerate(treelines): |
| 104 | if ("-- " + name) in line: |
| 105 | try: |
| 106 | child_line = treelines[idx+1] |
| 107 | except: |
| 108 | pass |
| 109 | break |
| 110 | return child_line |
| 111 | |
| 112 | @pytest.mark.buildconfigspec('cmd_bind') |
| 113 | def test_bind_unbind_with_uclass(u_boot_console): |
| 114 | #bind /bind-test |
| 115 | response = u_boot_console.run_command("bind /bind-test generic_simple_bus") |
| 116 | assert response == '' |
| 117 | |
| 118 | #make sure bind-test-child2 is there and get its uclass/index pair |
| 119 | tree = u_boot_console.run_command("dm tree") |
| 120 | child2_line = [x.strip() for x in tree.splitlines() if "-- bind-test-child2" in x] |
| 121 | assert len(child2_line) == 1 |
| 122 | |
| 123 | child2_uclass = child2_line[0].split()[0] |
| 124 | child2_index = int(child2_line[0].split()[1]) |
| 125 | |
| 126 | #bind generic_simple_bus as a child of bind-test-child2 |
| 127 | response = u_boot_console.run_command("bind {} {} generic_simple_bus".format(child2_uclass, child2_index, "generic_simple_bus")) |
| 128 | |
| 129 | #check that the child is there and its uclass/index pair is right |
| 130 | tree = u_boot_console.run_command("dm tree") |
| 131 | |
| 132 | child_of_child2_line = get_next_line(tree, "bind-test-child2") |
| 133 | assert child_of_child2_line |
| 134 | child_of_child2_index = int(child_of_child2_line.split()[1]) |
| 135 | assert in_tree(tree, "generic_simple_bus", "simple_bus", "generic_simple_bus", 2, True) |
| 136 | assert child_of_child2_index == child2_index + 1 |
| 137 | |
| 138 | #unbind the child and check it has been removed |
| 139 | response = u_boot_console.run_command("unbind simple_bus {}".format(child_of_child2_index)) |
| 140 | assert response == '' |
| 141 | tree = u_boot_console.run_command("dm tree") |
Liviu Dudau | 5197daf | 2018-10-15 10:03:06 +0100 | [diff] [blame] | 142 | assert in_tree(tree, "bind-test-child2", "simple_bus", "generic_simple_bus", 1, True) |
Jean-Jacques Hiblot | 49c752c | 2018-08-09 16:17:46 +0200 | [diff] [blame] | 143 | assert not in_tree(tree, "generic_simple_bus", "simple_bus", "generic_simple_bus", 2, True) |
| 144 | child_of_child2_line = get_next_line(tree, "bind-test-child2") |
| 145 | assert child_of_child2_line == "" |
| 146 | |
| 147 | #bind generic_simple_bus as a child of bind-test-child2 |
| 148 | response = u_boot_console.run_command("bind {} {} generic_simple_bus".format(child2_uclass, child2_index, "generic_simple_bus")) |
| 149 | |
| 150 | #check that the child is there and its uclass/index pair is right |
| 151 | tree = u_boot_console.run_command("dm tree") |
| 152 | treelines = [x.strip() for x in tree.splitlines() if x.strip()] |
| 153 | |
| 154 | child_of_child2_line = get_next_line(tree, "bind-test-child2") |
| 155 | assert child_of_child2_line |
| 156 | child_of_child2_index = int(child_of_child2_line.split()[1]) |
| 157 | assert in_tree(tree, "generic_simple_bus", "simple_bus", "generic_simple_bus", 2, True) |
| 158 | assert child_of_child2_index == child2_index + 1 |
| 159 | |
| 160 | #unbind the child and check it has been removed |
| 161 | response = u_boot_console.run_command("unbind {} {} generic_simple_bus".format(child2_uclass, child2_index, "generic_simple_bus")) |
| 162 | assert response == '' |
| 163 | |
| 164 | tree = u_boot_console.run_command("dm tree") |
Liviu Dudau | 5197daf | 2018-10-15 10:03:06 +0100 | [diff] [blame] | 165 | assert in_tree(tree, "bind-test-child2", "simple_bus", "generic_simple_bus", 1, True) |
Jean-Jacques Hiblot | 49c752c | 2018-08-09 16:17:46 +0200 | [diff] [blame] | 166 | |
| 167 | child_of_child2_line = get_next_line(tree, "bind-test-child2") |
| 168 | assert child_of_child2_line == "" |
| 169 | |
| 170 | #unbind the child again and check it doesn't change the tree |
| 171 | tree_old = u_boot_console.run_command("dm tree") |
| 172 | response = u_boot_console.run_command("unbind {} {} generic_simple_bus".format(child2_uclass, child2_index, "generic_simple_bus")) |
| 173 | tree_new = u_boot_console.run_command("dm tree") |
| 174 | |
| 175 | assert response == '' |
| 176 | assert tree_old == tree_new |
| 177 | |
| 178 | response = u_boot_console.run_command("unbind /bind-test") |
| 179 | assert response == '' |