of_unittest.rst 8.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226
  1. .. SPDX-License-Identifier: GPL-2.0
  2. =================================
  3. Open Firmware Devicetree Unittest
  4. =================================
  5. Author: Gaurav Minocha <[email protected]>
  6. 1. Introduction
  7. ===============
  8. This document explains how the test data required for executing OF unittest
  9. is attached to the live tree dynamically, independent of the machine's
  10. architecture.
  11. It is recommended to read the following documents before moving ahead.
  12. (1) Documentation/devicetree/usage-model.rst
  13. (2) http://www.devicetree.org/Device_Tree_Usage
  14. OF Selftest has been designed to test the interface (include/linux/of.h)
  15. provided to device driver developers to fetch the device information..etc.
  16. from the unflattened device tree data structure. This interface is used by
  17. most of the device drivers in various use cases.
  18. 2. Verbose Output (EXPECT)
  19. ==========================
  20. If unittest detects a problem it will print a warning or error message to
  21. the console. Unittest also triggers warning and error messages from other
  22. kernel code as a result of intentionally bad unittest data. This has led
  23. to confusion as to whether the triggered messages are an expected result
  24. of a test or whether there is a real problem that is independent of unittest.
  25. 'EXPECT \ : text' (begin) and 'EXPECT / : text' (end) messages have been
  26. added to unittest to report that a warning or error is expected. The
  27. begin is printed before triggering the warning or error, and the end is
  28. printed after triggering the warning or error.
  29. The EXPECT messages result in very noisy console messages that are difficult
  30. to read. The script scripts/dtc/of_unittest_expect was created to filter
  31. this verbosity and highlight mismatches between triggered warnings and
  32. errors vs expected warnings and errors. More information is available
  33. from 'scripts/dtc/of_unittest_expect --help'.
  34. 3. Test-data
  35. ============
  36. The Device Tree Source file (drivers/of/unittest-data/testcases.dts) contains
  37. the test data required for executing the unit tests automated in
  38. drivers/of/unittest.c. Currently, following Device Tree Source Include files
  39. (.dtsi) are included in testcases.dts::
  40. drivers/of/unittest-data/tests-interrupts.dtsi
  41. drivers/of/unittest-data/tests-platform.dtsi
  42. drivers/of/unittest-data/tests-phandle.dtsi
  43. drivers/of/unittest-data/tests-match.dtsi
  44. When the kernel is build with OF_SELFTEST enabled, then the following make
  45. rule::
  46. $(obj)/%.dtb: $(src)/%.dts FORCE
  47. $(call if_changed_dep, dtc)
  48. is used to compile the DT source file (testcases.dts) into a binary blob
  49. (testcases.dtb), also referred as flattened DT.
  50. After that, using the following rule the binary blob above is wrapped as an
  51. assembly file (testcases.dtb.S)::
  52. $(obj)/%.dtb.S: $(obj)/%.dtb
  53. $(call cmd, dt_S_dtb)
  54. The assembly file is compiled into an object file (testcases.dtb.o), and is
  55. linked into the kernel image.
  56. 3.1. Adding the test data
  57. -------------------------
  58. Un-flattened device tree structure:
  59. Un-flattened device tree consists of connected device_node(s) in form of a tree
  60. structure described below::
  61. // following struct members are used to construct the tree
  62. struct device_node {
  63. ...
  64. struct device_node *parent;
  65. struct device_node *child;
  66. struct device_node *sibling;
  67. ...
  68. };
  69. Figure 1, describes a generic structure of machine's un-flattened device tree
  70. considering only child and sibling pointers. There exists another pointer,
  71. ``*parent``, that is used to traverse the tree in the reverse direction. So, at
  72. a particular level the child node and all the sibling nodes will have a parent
  73. pointer pointing to a common node (e.g. child1, sibling2, sibling3, sibling4's
  74. parent points to root node)::
  75. root ('/')
  76. |
  77. child1 -> sibling2 -> sibling3 -> sibling4 -> null
  78. | | | |
  79. | | | null
  80. | | |
  81. | | child31 -> sibling32 -> null
  82. | | | |
  83. | | null null
  84. | |
  85. | child21 -> sibling22 -> sibling23 -> null
  86. | | | |
  87. | null null null
  88. |
  89. child11 -> sibling12 -> sibling13 -> sibling14 -> null
  90. | | | |
  91. | | | null
  92. | | |
  93. null null child131 -> null
  94. |
  95. null
  96. Figure 1: Generic structure of un-flattened device tree
  97. Before executing OF unittest, it is required to attach the test data to
  98. machine's device tree (if present). So, when selftest_data_add() is called,
  99. at first it reads the flattened device tree data linked into the kernel image
  100. via the following kernel symbols::
  101. __dtb_testcases_begin - address marking the start of test data blob
  102. __dtb_testcases_end - address marking the end of test data blob
  103. Secondly, it calls of_fdt_unflatten_tree() to unflatten the flattened
  104. blob. And finally, if the machine's device tree (i.e live tree) is present,
  105. then it attaches the unflattened test data tree to the live tree, else it
  106. attaches itself as a live device tree.
  107. attach_node_and_children() uses of_attach_node() to attach the nodes into the
  108. live tree as explained below. To explain the same, the test data tree described
  109. in Figure 2 is attached to the live tree described in Figure 1::
  110. root ('/')
  111. |
  112. testcase-data
  113. |
  114. test-child0 -> test-sibling1 -> test-sibling2 -> test-sibling3 -> null
  115. | | | |
  116. test-child01 null null null
  117. Figure 2: Example test data tree to be attached to live tree.
  118. According to the scenario above, the live tree is already present so it isn't
  119. required to attach the root('/') node. All other nodes are attached by calling
  120. of_attach_node() on each node.
  121. In the function of_attach_node(), the new node is attached as the child of the
  122. given parent in live tree. But, if parent already has a child then the new node
  123. replaces the current child and turns it into its sibling. So, when the testcase
  124. data node is attached to the live tree above (Figure 1), the final structure is
  125. as shown in Figure 3::
  126. root ('/')
  127. |
  128. testcase-data -> child1 -> sibling2 -> sibling3 -> sibling4 -> null
  129. | | | | |
  130. (...) | | | null
  131. | | child31 -> sibling32 -> null
  132. | | | |
  133. | | null null
  134. | |
  135. | child21 -> sibling22 -> sibling23 -> null
  136. | | | |
  137. | null null null
  138. |
  139. child11 -> sibling12 -> sibling13 -> sibling14 -> null
  140. | | | |
  141. null null | null
  142. |
  143. child131 -> null
  144. |
  145. null
  146. -----------------------------------------------------------------------
  147. root ('/')
  148. |
  149. testcase-data -> child1 -> sibling2 -> sibling3 -> sibling4 -> null
  150. | | | | |
  151. | (...) (...) (...) null
  152. |
  153. test-sibling3 -> test-sibling2 -> test-sibling1 -> test-child0 -> null
  154. | | | |
  155. null null null test-child01
  156. Figure 3: Live device tree structure after attaching the testcase-data.
  157. Astute readers would have noticed that test-child0 node becomes the last
  158. sibling compared to the earlier structure (Figure 2). After attaching first
  159. test-child0 the test-sibling1 is attached that pushes the child node
  160. (i.e. test-child0) to become a sibling and makes itself a child node,
  161. as mentioned above.
  162. If a duplicate node is found (i.e. if a node with same full_name property is
  163. already present in the live tree), then the node isn't attached rather its
  164. properties are updated to the live tree's node by calling the function
  165. update_node_properties().
  166. 3.2. Removing the test data
  167. ---------------------------
  168. Once the test case execution is complete, selftest_data_remove is called in
  169. order to remove the device nodes attached initially (first the leaf nodes are
  170. detached and then moving up the parent nodes are removed, and eventually the
  171. whole tree). selftest_data_remove() calls detach_node_and_children() that uses
  172. of_detach_node() to detach the nodes from the live device tree.
  173. To detach a node, of_detach_node() either updates the child pointer of given
  174. node's parent to its sibling or attaches the previous sibling to the given
  175. node's sibling, as appropriate. That is it :)