Skip to content

Commit

Permalink
kconfig: switch to single .config configuration
Browse files Browse the repository at this point in the history
When Kconfig for U-boot was examined, one of the biggest issues was
how to support multiple images (Normal, SPL, TPL).  There were
actually two options, "single .config" and "multiple .config".
After some discussions and thought experiments, I chose the latter,
i.e. to create ".config", "spl/.config", "tpl/.config" for Normal,
SPL, TPL, respectively.

It is true that the "multiple .config" strategy provided us the
maximum flexibility and helped to avoid duplicating CONFIGs among
Normal, SPL, TPL, but I have noticed some fatal problems:

[1] It is impossible to share CONFIG options across the images.
  If you change the configuration of Main image, you often have to
  adjust some SPL configurations correspondingly.  Currently, we
  cannot handle the dependencies between them.  It means one of the
  biggest advantages of Kconfig is lost.

[2] It is too painful to change both ".config" and "spl/.config".
  Sunxi guys started to work around this problem by creating a new
  configuration target.  Commit cbdd9a9 (sunxi: kconfig: Add
  %_felconfig rule to enable FEL build of sunxi platforms.) added
  "make *_felconfig" to enable CONFIG_SPL_FEL on both images.
  Changing the configuration of multiple images in one command is a
  generic demand.  The current implementation cannot propose any
  good solution about this.

[3] Kconfig files are getting ugly and difficult to understand.
  Commit b724bd7 (dm: Kconfig: Move CONFIG_SYS_MALLOC_F_LEN to
  Kconfig) has sprinkled "if !SPL_BUILD" over the Kconfig files.

[4] The build system got more complicated than it should be.
  To adjust Linux-originated Kconfig to U-Boot, the helper script
  "scripts/multiconfig.sh" was introduced.  Writing a complicated
  text processor is a shell script sometimes caused problems.

Now I believe the "single .config" will serve us better.  With it,
all the problems above would go away.  Instead, we will have to add
some CONFIG_SPL_* (and CONFIG_TPL_*) options such as CONFIG_SPL_DM,
but we will not have much.  Anyway, this is what we do now in
scripts/Makefile.spl.

I admit my mistake with my apology and this commit switches to the
single .config configuration.

It is not so difficult to do that:

 - Remove unnecessary processings from scripts/multiconfig.sh
  This file will remain for a while to support the current defconfig
  format.  It will be removed after more cleanups are done.

 - Adjust some makefiles and Kconfigs

 - Add some entries to include/config_uncmd_spl.h and the new file
   scripts/Makefile.uncmd_spl.  Some CONFIG options that are not
   supported on SPL must be disabled because one .config is shared
   between SPL and U-Boot proper going forward.  I know this is not
   a beautiful solution and I think we can do better, but let's see
   how much we will have to describe them.

 - update doc/README.kconfig

More cleaning up patches will follow this.

Signed-off-by: Masahiro Yamada <[email protected]>
Reviewed-by: Simon Glass <[email protected]>
  • Loading branch information
masahir0y authored and trini committed Feb 24, 2015
1 parent 66afaef commit e02ee25
Show file tree
Hide file tree
Showing 15 changed files with 108 additions and 389 deletions.
14 changes: 0 additions & 14 deletions Kconfig
Original file line number Diff line number Diff line change
Expand Up @@ -8,10 +8,6 @@ config UBOOTVERSION
string
option env="UBOOTVERSION"

config KCONFIG_OBJDIR
string
option env="KCONFIG_OBJDIR"

# Allow defaults in arch-specific code to override any given here
source "arch/Kconfig"

Expand Down Expand Up @@ -90,16 +86,6 @@ endmenu # General setup

menu "Boot images"

config SPL_BUILD
bool
depends on $KCONFIG_OBJDIR="spl" || $KCONFIG_OBJDIR="tpl"
default y

config TPL_BUILD
bool
depends on $KCONFIG_OBJDIR="tpl"
default y

config SUPPORT_SPL
bool

Expand Down
1 change: 0 additions & 1 deletion arch/arm/cpu/armv7/uniphier/Kconfig
Original file line number Diff line number Diff line change
Expand Up @@ -71,7 +71,6 @@ config CMD_DDRPHY_DUMP

choice
prompt "DDR3 Frequency select"
depends on SPL_BUILD

config DDR_FREQ_1600
bool "DDR3 1600"
Expand Down
2 changes: 1 addition & 1 deletion arch/arm/mach-tegra/Kconfig
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@ config SYS_MALLOC_F_LEN
default 0x1800

config USE_PRIVATE_LIBGCC
default y if SPL_BUILD
default y

config DM
default y if !SPL_BUILD
Expand Down
5 changes: 5 additions & 0 deletions config.mk
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,11 @@ VENDOR :=

ARCH := $(CONFIG_SYS_ARCH:"%"=%)
CPU := $(CONFIG_SYS_CPU:"%"=%)
ifdef CONFIG_SPL_BUILD
ifdef CONFIG_TEGRA
CPU := arm720t
endif
endif
BOARD := $(CONFIG_SYS_BOARD:"%"=%)
ifneq ($(CONFIG_SYS_VENDOR),)
VENDOR := $(CONFIG_SYS_VENDOR:"%"=%)
Expand Down
2 changes: 1 addition & 1 deletion configs/ph1_ld4_defconfig
Original file line number Diff line number Diff line change
Expand Up @@ -39,4 +39,4 @@ CONFIG_DM_I2C=y
CONFIG_USB=y
CONFIG_USB_EHCI_HCD=y
CONFIG_USB_STORAGE=y
S:CONFIG_SPL_NAND_DENALI=y
CONFIG_SPL_NAND_DENALI=y
2 changes: 1 addition & 1 deletion configs/ph1_pro4_defconfig
Original file line number Diff line number Diff line change
Expand Up @@ -39,4 +39,4 @@ CONFIG_DM_I2C=y
CONFIG_USB=y
CONFIG_USB_EHCI_HCD=y
CONFIG_USB_STORAGE=y
S:CONFIG_SPL_NAND_DENALI=y
CONFIG_SPL_NAND_DENALI=y
2 changes: 1 addition & 1 deletion configs/ph1_sld8_defconfig
Original file line number Diff line number Diff line change
Expand Up @@ -39,4 +39,4 @@ CONFIG_DM_I2C=y
CONFIG_USB=y
CONFIG_USB_EHCI_HCD=y
CONFIG_USB_STORAGE=y
S:CONFIG_SPL_NAND_DENALI=y
CONFIG_SPL_NAND_DENALI=y
132 changes: 32 additions & 100 deletions doc/README.kconfig
Original file line number Diff line number Diff line change
Expand Up @@ -17,109 +17,45 @@ source directory for a basic specification of Kconfig.
Difference from Linux's Kconfig
-------------------------------

The biggest difference between Linux Kernel and U-Boot in terms of the
configuration is that U-Boot has to configure multiple boot images per board:
Normal, SPL, TPL.
Kconfig functions need to be expanded for U-Boot to handle multiple images.
The files scripts/kconfig/* were imported from Linux Kernel and adjusted
for that purpose.
Here are some worth-mentioning configuration targets.

See below for how each configuration target works in U-Boot:
- silentoldconfig

- config, nconfig, menuconfig, xconfig, gconfig
This target updates .config, include/generated/autoconf.h and
include/configs/* as in Linux. In U-Boot, it also does the followings
for the compatibility with the old configuration system:

These targets are used to configure Normal and create (or modify) the
.config file. For SPL configuration, the configutation targets are prefixed
with "spl/", for example "make spl/config", "make spl/menuconfig", etc.
Those targets create or modify the spl/.config file. Likewise, run
"make tpl/config", "make tpl/menuconfig", etc. for TPL.
* create a symbolic link "arch/${ARCH}/include/asm/arch" pointing to
the SoC/CPU specific header directory
* create include/config.h
* create include/autoconf.mk
* create spl/include/autoconf.mk (SPL and TPL only)
* create tpl/include/autoconf.mk (TPL only)

- silentoldconfig
If we could completely switch to Kconfig in a long run
(i.e. remove all the include/configs/*.h), those additional processings
above would be removed.

This target updates .config, include/generated/autoconf.h and
include/configs/*. In U-Boot, the same thing is done for SPL, TPL,
if supported by the target board. Depending on whether CONFIG_SPL and
CONFIG_TPL are defined, "make silentoldconfig" iterates three times at most
changing the work directory.

To sum up, "make silentoldconfig" possibly updates:
- .config, include/generated/autoconf.h, include/config/*
- spl/.config, spl/include/generated/autoconf.h, spl/include/config/*
(in case CONFIG_SPL=y)
- tpl/.config, tpl/include/generated/autoconf.h, tpl/include/config/*
(in case CONFIG_TPL=y)

- defconfig, <board>_defconfig

The target "<board>_defconfig" is used to create the .config based on the
file configs/<board>_defconfig. The "defconfig" target is the same
except it checks for a file specified with KBUILD_DEFCONFIG environment.

Note:
The defconfig files are placed under the "configs" directory,
not "arch/$(ARCH)/configs". This is because "ARCH" is not necessarily
given from the command line for the U-Boot configuration and build.

The defconfig file format in U-Boot has the special syntax; each line has
"<condition>:" prefix to show which image(s) the line is valid for.
For example,

CONFIG_FOO=100
S:CONFIG_FOO=200
T:CONFIG_FOO=300
ST:CONFIG_BAR=y
+S:CONFIG_BAZ=y
+T:CONFIG_QUX=y
+ST:CONFIG_QUUX=y

Here, the "<condition>:" prefix is one of:
None - the line is valid only for Normal image
S: - the line is valid only for SPL image
T: - the line is valid only for TPL image
ST: - the line is valid for SPL and TPL images
+S: - the line is valid for Normal and SPL images
+T: - the line is valid for Normal and TPL images
+ST: - the line is valid for Normal, SPL and TPL images

So, if neither CONFIG_SPL nor CONFIG_TPL is defined, the defconfig file
has no "<condition>:" part and therefore has the same form as in Linux.
From the example defconfig shown above, three separete configuration sets
are generated and used for creating .config, spl/.config and tpl/.config.

- Input for the default configuration of Normal
CONFIG_FOO=100
CONFIG_BAZ=y
CONFIG_QUX=y
CONFIG_QUUX=y

- Input for the default configuration of SPL
CONFIG_FOO=200
CONFIG_BAR=y
CONFIG_BAZ=y
CONFIG_QUUX=y

- Input for the default configuration of TPL
CONFIG_FOO=300
CONFIG_BAR=y
CONFIG_QUX=y
CONFIG_QUUX=y

- savedefconfig

This is the reverse operation of "make defconfig". If neither CONFIG_SPL
nor CONFIG_TPL is defined in the .config file, it works like "savedefconfig"
in Linux Kernel: creates the minimal set of config based on the .config
and saves it into the "defconfig" file. If CONFIG_SPL (and CONFIG_TPL) is
defined, the common lines among .config, spl/.config (and tpl/.config) are
coalesced together with "<condition:>" prefix for each line as shown above.
This file can be used as an input of "defconfig" target.
- defconfig

In U-Boot, "make defconfig" is a shorthand of "make sandbox_defconfig"

- <board>_defconfig

Now it works as in Linux.
The prefixes such as "+S:" in *_defconfig are deprecated.
You can simply remove the prefixes. Do not add them for new boards.

- <board>_config

This does not exist in Linux's Kconfig.
"make <board>_config" works the same as "make <board>_defconfig".
Prior to Kconfig, in U-Boot, "make <board>_config" was used for the
configuration. It is still supported for backward compatibility and
its behavior is the same as "make <board>_defconfig".
configuration. It is still supported for backward compatibility, so
we do not need to update the distro recipes.


The other configuration targets work as in Linux Kernel.


Migration steps to Kconfig
Expand All @@ -137,14 +73,10 @@ based configuration as follows:

Configuration files for use in C sources
- include/generated/autoconf.h (generated by Kconfig for Normal)
- spl/include/generated/autoconf.h (generated by Kconfig for SPL)
- tpl/include/generated/autoconf.h (generated by Kconfig for TPL)
- include/configs/<board>.h (exists for all boards)

Configuration file for use in makefiles
- include/config/auto.conf (generated by Kconfig for Normal)
- spl/include/config/auto.conf (generated by Kconfig for SPL)
- tpl/include/config/auto.conf (generated by Kconfig for TPL)
- include/config/auto.conf (generated by Kconfig)
- include/autoconf.mk (generated by the old config for Normal)
- spl/include/autoconfig.mk (generated by the old config for SPL)
- tpl/include/autoconfig.mk (generated by the old config for TPL)
Expand Down Expand Up @@ -215,8 +147,8 @@ TODO
CONFIG_SYS_EXTRA_OPTIONS should not be used for new boards.

- In the pre-Kconfig, a single board had multiple entries in the boards.cfg
file with differences in the option fields. The correspoing defconfig files
were auto-generated when switching to Kconfig. Now we have too many
file with differences in the option fields. The corresponding defconfig
files were auto-generated when switching to Kconfig. Now we have too many
defconfig files compared with the number of the supported boards. It is
recommended to have only one defconfig per board and allow users to select
the config options.
Expand Down
2 changes: 1 addition & 1 deletion drivers/mtd/nand/Kconfig
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,7 @@ config NAND_DENALI_SPARE_AREA_SKIP_BYTES

endif

if SPL_BUILD
if SPL

config SPL_NAND_DENALI
bool "Support Denali NAND controller for SPL"
Expand Down
9 changes: 9 additions & 0 deletions include/config_uncmd_spl.h
Original file line number Diff line number Diff line change
Expand Up @@ -20,5 +20,14 @@
#undef CONFIG_CMD_SNTP
#undef CONFIG_CMD_TFTPPUT
#undef CONFIG_CMD_TFTPSRV
#undef CONFIG_OF_CONTROL

#ifndef CONFIG_SPL_DM
#undef CONFIG_DM_SERIAL
#undef CONFIG_DM_GPIO
#undef CONFIG_DM_I2C
#undef CONFIG_DM_SPI
#endif

#endif /* CONFIG_SPL_BUILD */
#endif /* __CONFIG_UNCMD_SPL_H__ */
36 changes: 26 additions & 10 deletions scripts/Makefile.autoconf
Original file line number Diff line number Diff line change
Expand Up @@ -7,9 +7,17 @@
# (= When we move all CONFIGs from header files to Kconfig)
# this makefile can be deleted.

# obj is "include" or "spl/include" or "tpl/include"
# for non-SPL, SPL, TPL, respectively
include $(obj)/config/auto.conf
__all: include/autoconf.mk include/autoconf.mk.dep

ifeq ($(shell grep -q '^CONFIG_SPL=y' include/config/auto.conf 2>/dev/null && echo y),y)
__all: spl/include/autoconf.mk
endif

ifeq ($(shell grep -q '^CONFIG_TPL=y' include/config/auto.conf 2>/dev/null && echo y),y)
__all: tpl/include/autoconf.mk
endif

include include/config/auto.conf

include scripts/Kbuild.include

Expand All @@ -22,7 +30,6 @@ CPP = $(CC) -E
include config.mk

UBOOTINCLUDE := \
-I$(obj) \
-Iinclude \
$(if $(KBUILD_SRC), -I$(srctree)/include) \
-I$(srctree)/arch/$(ARCH)/include \
Expand All @@ -48,10 +55,10 @@ include/autoconf.mk.dep: FORCE
# same CONFIG macros
quiet_cmd_autoconf = GEN $@
cmd_autoconf = \
$(CPP) $(c_flags) -DDO_DEPS_ONLY -dM $(srctree)/include/common.h > [email protected] && { \
$(CPP) $(c_flags) $2 -DDO_DEPS_ONLY -dM $(srctree)/include/common.h > [email protected] && { \
sed -n -f $(srctree)/tools/scripts/define2mk.sed [email protected] | \
while read line; do \
if ! grep -q "$${line%=*}=" $(obj)/config/auto.conf; then \
if ! grep -q "$${line%=*}=" include/config/auto.conf; then \
echo "$$line"; \
fi \
done > $@; \
Expand All @@ -60,10 +67,19 @@ quiet_cmd_autoconf = GEN $@
rm [email protected]; false; \
}

$(obj)/autoconf.mk: FORCE
include/autoconf.mk: FORCE
$(call cmd,autoconf)

include/autoconf.mk include/autoconf.mk.dep: include/config.h
spl/include/autoconf.mk: FORCE
$(Q)mkdir -p $(dir $@)
$(call cmd,autoconf,-DCONFIG_SPL_BUILD)

tpl/include/autoconf.mk: FORCE
$(Q)mkdir -p $(dir $@)
$(call cmd,autoconf,-DCONFIG_SPL_BUILD -DCONFIG_TPL_BUILD)

include/autoconf.mk include/autoconf.mk.dep \
spl/include/autoconf.mk tpl/include/autoconf.mk: include/config.h

# include/config.h
# Prior to Kconfig, it was generated by mkconfig. Now it is created here.
Expand All @@ -75,10 +91,10 @@ define filechk_config_h
done; \
echo \#define CONFIG_BOARDDIR board/$(if $(VENDOR),$(VENDOR)/)$(BOARD);\
echo \#include \<config_defaults.h\>; \
echo \#include \<config_uncmd_spl.h\>; \
echo \#include \<configs/$(CONFIG_SYS_CONFIG_NAME).h\>; \
echo \#include \<asm/config.h\>; \
echo \#include \<config_fallbacks.h\>; \
echo \#include \<config_uncmd_spl.h\>; )
echo \#include \<config_fallbacks.h\>;)
endef

include/config.h: scripts/Makefile.autoconf create_symlink FORCE
Expand Down
3 changes: 2 additions & 1 deletion scripts/Makefile.build
Original file line number Diff line number Diff line change
Expand Up @@ -41,8 +41,9 @@ subdir-ccflags-y :=

# Read auto.conf if it exists, otherwise ignore
# Modified for U-Boot
-include $(prefix)/include/config/auto.conf
-include include/config/auto.conf
-include $(prefix)/include/autoconf.mk
include scripts/Makefile.uncmd_spl

include scripts/Kbuild.include

Expand Down
10 changes: 6 additions & 4 deletions scripts/Makefile.spl
Original file line number Diff line number Diff line change
Expand Up @@ -21,13 +21,15 @@ _dummy := $(shell [ -d $(obj) ] || mkdir -p $(obj))

include $(srctree)/scripts/Kbuild.include

UBOOTINCLUDE := -I$(obj)/include $(UBOOTINCLUDE)

-include $(obj)/include/config/auto.conf
-include include/config/auto.conf
-include $(obj)/include/autoconf.mk

KBUILD_CPPFLAGS += -DCONFIG_SPL_BUILD
ifeq ($(CONFIG_TPL_BUILD),y)
KBUILD_CPPFLAGS += -DCONFIG_TPL_BUILD
endif

ifeq ($(CONFIG_TPL_BUILD),y)
export CONFIG_TPL_BUILD
SPL_BIN := u-boot-tpl
else
SPL_BIN := u-boot-spl
Expand Down
16 changes: 16 additions & 0 deletions scripts/Makefile.uncmd_spl
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
# Makefile version of include/config_uncmd_spl.h
#
# TODO: Invent a better way

ifdef CONFIG_SPL_BUILD
CONFIG_OF_CONTROL=

ifndef CONFIG_SPL_DM
CONFIG_DM_SERIAL=
CONFIG_DM_GPIO=
CONIFG_DM_I2C=
CONFIG_DM_SPI=
CONFIG_DM_SPI_FLASH=
endif

endif
Loading

0 comments on commit e02ee25

Please sign in to comment.