system_configuration.rst 7.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132
  1. .. SPDX-License-Identifier: GPL-2.0+
  2. System configuration
  3. ====================
  4. There are a number of different aspects to configuring U-Boot to build and then
  5. run on a given platform or set of platforms. Broadly speaking, some aspects of
  6. the world can be configured at run time and others must be done at build time.
  7. In general run time configuration is preferred over build time configuration.
  8. But when making these decisions, we also need to consider if we're talking about
  9. a feature that could be useful to virtually every platform or something specific
  10. to a single hardware platform. The resulting image size is also another
  11. important consideration. Finally, run time configuration has additional overhead
  12. both in terms of resource requirements and wall clock time. All of this means
  13. that care must be taken when writing new code to select the most appropriate
  14. configuration mechanism.
  15. When adding new features to U-Boot, be they a new subsystem or SoC support or
  16. new platform for an existing supported SoC, the preferred configuration order
  17. is:
  18. #. Hardware based run time configuration. Examples of this include reading
  19. processor specific registers, or a set of board specific GPIOs or an EEPROM
  20. with a known format to it. These are the cases where we either cannot or
  21. should not be relying on device tree checks. We use this for cases such as
  22. optimized boot time or starting with a generic device tree and then enabling
  23. or disabling features as we boot.
  24. #. Making use of our Kconfig infrastructure and C preprocessor macros that have
  25. the prefix ``CONFIG``. This is the primary method of build time
  26. configuration. This is generally the best fit for when we want to enable or
  27. disable some sort of feature, such as the SoC or network support. The
  28. ``CONFIG`` prefix for C preprocessor macros is strictly reserved for Kconfig
  29. usage only.
  30. #. Making use of the :doc:`device tree <devicetree/control>` to determine at
  31. run time how to configure a feature that we have enabled via Kconfig. For
  32. example, we would use Kconfig to enable an I2C chip driver, but use the device
  33. tree to know where the I2C chip resides in memory and other details we need
  34. in order to configure the bus.
  35. #. Making use of C header files directly and defining C preprocessor macros that
  36. have the ``CFG`` prefix. While the ``CFG`` prefix is reserved for this build
  37. time configuration mechanism, the usage is ad hoc. This is to be used when the
  38. previously mentioned mechanisms are not possible, or for legacy code that has
  39. not been converted.
  40. Dynamic run time configuration methods.
  41. ---------------------------------------
  42. Details of hardware specific run time configuration methods are found within the
  43. documentation for a given processor family or board.
  44. Details of how to use run time configuration based on :doc:`driver model
  45. <driver-model/index>` are covered in that documentation section.
  46. Static build time configuration methods
  47. ---------------------------------------
  48. There are two mechanisms used to control the build time configuration of U-Boot.
  49. One is utilizing Kconfig and ``CONFIG`` prefixed macros and the other is ad hoc
  50. usage of ``CFG`` prefixed macros. Both of these are used when it is either not
  51. possible or not practical to make a run time determination about some
  52. functionality of the hardware or a required software feature or similar. Each of
  53. these has their own places where they are better suited than the other for use.
  54. The `Kconfig language
  55. <https://www.kernel.org/doc/html/latest/kbuild/kconfig-language.html>`_ is well
  56. documented and used in a number of projects, including the Linux kernel. We
  57. implement this with the Kconfig files found throughout our sources. This
  58. mechanism is the preferred way of exposing new configuration options as there
  59. are a number of ways for both users and system integrators to manage and change
  60. these options. Some common examples here are to enable a specific command within
  61. U-Boot or even a whole subsystem such as NAND flash or network connectivity.
  62. The ``CFG`` mechanism is implemented directly as C preprocessor values or
  63. macros, depending on what they are in turn describing. While we have some
  64. functionality that is very reasonable to expose to the end user to enable or
  65. disable we have other places where we need to describe things such as register
  66. locations or values, memory map ranges and so on. When practical, we should be
  67. getting these values from the device tree. However, there are cases where this
  68. is either not practical due to when we need the information and may not have a
  69. device tree yet or due to legacy reasons code has not been rewritten.
  70. When to use each mechanism
  71. ^^^^^^^^^^^^^^^^^^^^^^^^^^
  72. While there are some cases where it should be fairly obvious where to use each
  73. mechanism, as for example a command would be done via Kconfig, a new I2C driver
  74. should use Kconfig and be configured via driver model and a header of values
  75. generated by an external tool should be ``CFG``, there will be cases where it's
  76. less clear and one needs to take care when implementing it. In general,
  77. configuration *options* should be done in Kconfig and configuration *settings*
  78. should be done in driver model or ``CFG``. Let us discuss things to keep in mind
  79. when picking the appropriate mechanism.
  80. A thing to keep in mind is that we have a strong preference for using Kconfig as
  81. the primary build time configuration mechanism. Options expressed this way let
  82. us easily express dependencies and abstractions. In addition, given that many
  83. projects use this mechanism means it has a broad set of tooling and existing
  84. knowledge base.
  85. Consider the example of a SHA256 hardware acceleration engine. This would be a
  86. feature of the SoC and so something to not ask the user if it exists, but we
  87. would want to have our generic framework for such engines be optionally
  88. available and depend on knowing we have this engine on a given hardware
  89. platform. Expressing this should be done as a hidden Kconfig symbol that is
  90. ``select``'ed by the SoC symbol which would in turn be ``select``'ed by the
  91. board option, which is user visible. Hardware features that are either present
  92. or not present should be expressed in Kconfig and in a similar manner, features
  93. which will always have a constant value such as "this SoC always has 4 cores and
  94. 4 threads per core" should be as well.
  95. This brings us to differentiating between a configuration *setting* versus a
  96. hardware feature. To build on the previous example, while we may know the number
  97. of cores and threads, it's possible that within a given family of SoCs the base
  98. addresses of peripherals has changed, but the register offsets within have not.
  99. The preference in this case is to get our information from the device tree and
  100. perform run time configuration. However, this is not always practical and in
  101. those cases we instead rely on the ``CFG`` mechanism. While it would be possible
  102. to use Kconfig in this case, it would result in using calculated rather than
  103. constructed values, resulting in less clear code. Consider the example of a set
  104. of register values for a memory controller. Defining this as a series of logical
  105. ORs and shifts based on other defines is more clear than the Kconfig entry that
  106. sets the calculated value alone.
  107. When it has been determined that the practical solution is to utilize the
  108. ``CFG`` mechanism, the next decision is where to place these settings. It is
  109. strongly encouraged to place these in the architecture header files, if they are
  110. generic to a given SoC, or under the board directory if board specific. Placing
  111. them under the board.h file in the *include/configs/* directory should be seen
  112. as a last resort.