Home | History | Annotate | Download | only in doc
      1 Kconfig in U-Boot
      2 =================
      3 
      4 This document describes the configuration infrastructure of U-Boot.
      5 
      6 The conventional configuration was replaced by Kconfig at v2014.10-rc1 release.
      7 
      8 
      9 Language Specification
     10 ----------------------
     11 
     12 Kconfig originates in Linux Kernel.
     13 See the file "Documentation/kbuild/kconfig*.txt" in your Linux Kernel
     14 source directory for a basic specification of Kconfig.
     15 
     16 
     17 Difference from Linux's Kconfig
     18 -------------------------------
     19 
     20 Here are some worth-mentioning configuration targets.
     21 
     22 - silentoldconfig
     23 
     24   This target updates .config, include/generated/autoconf.h and
     25   include/configs/* as in Linux.  In U-Boot, it also does the following
     26   for the compatibility with the old configuration system:
     27 
     28    * create a symbolic link "arch/${ARCH}/include/asm/arch" pointing to
     29      the SoC/CPU specific header directory
     30    * create include/config.h
     31    * create include/autoconf.mk
     32    * create spl/include/autoconf.mk (SPL and TPL only)
     33    * create tpl/include/autoconf.mk (TPL only)
     34 
     35    If we could completely switch to Kconfig in a long run
     36    (i.e. remove all the include/configs/*.h), those additional processings
     37    above would be removed.
     38 
     39 - defconfig
     40 
     41   In U-Boot, "make defconfig" is a shorthand of "make sandbox_defconfig"
     42 
     43 - <board>_defconfig
     44 
     45   Now it works as in Linux.
     46   The prefixes such as "+S:" in *_defconfig are deprecated.
     47   You can simply remove the prefixes.  Do not add them for new boards.
     48 
     49 - <board>_config
     50 
     51   This does not exist in Linux's Kconfig.
     52   "make <board>_config" works the same as "make <board>_defconfig".
     53   Prior to Kconfig, in U-Boot, "make <board>_config" was used for the
     54   configuration.  It is still supported for backward compatibility, so
     55   we do not need to update the distro recipes.
     56 
     57 
     58 The other configuration targets work as in Linux Kernel.
     59 
     60 
     61 Migration steps to Kconfig
     62 --------------------------
     63 
     64 Prior to Kconfig, the C preprocessor based board configuration had been used
     65 in U-Boot.
     66 
     67 Although Kconfig was introduced and some configs have been moved to Kconfig,
     68 many of configs are still defined in C header files.  It will take a very
     69 long term to move all of them to Kconfig.  In the interim, the two different
     70 configuration infrastructures should coexist.
     71 The configuration files are generated by both Kconfig and the old preprocessor
     72 based configuration as follows:
     73 
     74 Configuration files for use in C sources
     75   - include/generated/autoconf.h     (generated by Kconfig for Normal)
     76   - include/configs/<board>.h        (exists for all boards)
     77 
     78 Configuration file for use in makefiles
     79   - include/config/auto.conf         (generated by Kconfig)
     80   - include/autoconf.mk              (generated by the old config for Normal)
     81   - spl/include/autoconfig.mk        (generated by the old config for SPL)
     82   - tpl/include/autoconfig.mk        (generated by the old config for TPL)
     83 
     84 When adding a new CONFIG macro, it is highly recommended to add it to Kconfig
     85 rather than to a header file.
     86 
     87 
     88 Conversion from boards.cfg to Kconfig
     89 -------------------------------------
     90 
     91 Prior to Kconfig, boards.cfg was a primary database that contained Arch, CPU,
     92 SoC, etc. of all the supported boards.  It was deleted when switching to
     93 Kconfig.  Each field of boards.cfg was converted as follows:
     94 
     95  Status      ->  "S:" entry of MAINTAINERS
     96  Arch        ->  CONFIG_SYS_ARCH defined by Kconfig
     97  CPU         ->  CONFIG_SYS_CPU defined by Kconfig
     98  SoC         ->  CONFIG_SYS_SOC defined by Kconfig
     99  Vendor      ->  CONFIG_SYS_VENDOR defined by Kconfig
    100  Board       ->  CONFIG_SYS_BOARD defined by Kconfig
    101  Target      ->  File name of defconfig (configs/<target>_defconfig)
    102  Options     ->  CONFIG_SYS_EXTRA_OPTIONS defined by Kconfig
    103  Maintainers ->  "M:" entry of MAINTAINERS
    104 
    105 
    106 Tips to add/remove boards
    107 -------------------------
    108 
    109 When adding a new board, the following steps are generally needed:
    110 
    111  [1] Add a header file include/configs/<target>.h
    112  [2] Make sure to define necessary CONFIG_SYS_* in Kconfig:
    113        Define CONFIG_SYS_CPU="cpu" to compile arch/<arch>/cpu/<cpu>
    114        Define CONFIG_SYS_SOC="soc" to compile arch/<arch>/cpu/<cpu>/<soc>
    115        Define CONFIG_SYS_VENDOR="vendor" to compile board/<vendor>/common/*
    116          and board/<vendor>/<board>/*
    117        Define CONFIG_SYS_BOARD="board" to compile board/<board>/*
    118          (or board/<vendor>/<board>/* if CONFIG_SYS_VENDOR is defined)
    119        Define CONFIG_SYS_CONFIG_NAME="target" to include
    120          include/configs/<target>.h
    121  [3] Add a new entry to the board select menu in Kconfig.
    122      The board select menu is located in arch/<arch>/Kconfig or
    123      arch/<arch>/*/Kconfig.
    124  [4] Add a MAINTAINERS file
    125      It is generally placed at board/<board>/MAINTAINERS or
    126      board/<vendor>/<board>/MAINTAINERS
    127  [5] Add configs/<target>_defconfig
    128 
    129 When removing an obsolete board, the following steps are generally needed:
    130 
    131  [1] Remove configs/<target>_defconfig
    132  [2] Remove include/configs/<target>.h if it is not used by any other boards
    133  [3] Remove board/<vendor>/<board>/* or board/<board>/* if it is not used
    134      by any other boards
    135  [4] Update MAINTAINERS if necessary
    136  [5] Remove the unused entry from the board select menu in Kconfig
    137  [6] Add an entry to doc/README.scrapyard
    138 
    139 
    140 TODO
    141 ----
    142 
    143 - The option field of boards.cfg, which was used for the pre-Kconfig
    144   configuration, moved to CONFIG_SYS_EXTRA_OPTIONS verbatim now.
    145   Board maintainers are expected to implement proper Kconfig options
    146   and switch over to them.  Eventually CONFIG_SYS_EXTRA_OPTIONS will go away.
    147   CONFIG_SYS_EXTRA_OPTIONS should not be used for new boards.
    148 
    149 - In the pre-Kconfig, a single board had multiple entries in the boards.cfg
    150   file with differences in the option fields.  The corresponding defconfig
    151   files were auto-generated when switching to Kconfig.  Now we have too many
    152   defconfig files compared with the number of the supported boards.  It is
    153   recommended to have only one defconfig per board and allow users to select
    154   the config options.
    155 
    156 - Move the config macros in header files to Kconfig.  When we move at least
    157   macros used in makefiles, we can drop include/autoconfig.mk, which makes
    158   the build scripts much simpler.
    159