[PATCH 16/17] kconfig: Update CONFIG_IS_ENABLED() for split files

Simon Glass sjg at chromium.org
Fri Sep 17 18:17:39 CEST 2021


Update this file to include the correct autoconf.h or autoconf_spl.h file
for each phase. This allows the macros to be simplified.

With this, CONFIG_IS_ENABLED() is the same as IS_ENABLED() apart from a
migration detail.

Signed-off-by: Simon Glass <sjg at chromium.org>
---

 include/linux/kconfig.h | 87 ++++++++++++-----------------------------
 1 file changed, 24 insertions(+), 63 deletions(-)

diff --git a/include/linux/kconfig.h b/include/linux/kconfig.h
index d109ed3119e..e6b0f238ec4 100644
--- a/include/linux/kconfig.h
+++ b/include/linux/kconfig.h
@@ -1,7 +1,13 @@
 #ifndef __LINUX_KCONFIG_H
 #define __LINUX_KCONFIG_H
 
+#ifdef CONFIG_TPL_BUILD
+#include <generated/autoconf_tpl.h>
+#elif defined(CONFIG_SPL_BUILD)
+#include <generated/autoconf_spl.h>
+#else
 #include <generated/autoconf.h>
+#endif
 
 /*
  * Helper macros to use CONFIG_ options in C/CPP expressions. Note that
@@ -31,29 +37,29 @@
 	(config_enabled(option))
 
 /*
- * U-Boot add-on: Helper macros to reference to different macros
- * (CONFIG_ or CONFIG_SPL_ prefixed), depending on the build context.
+ * The _nospl version of a CONFIG is emitted by kconfig when an option has no
+ * SPL equivalent. So in that case there is a CONFIG_xxx for example, but not a
+ * CONFIG_SPL_xxx
+ *
+ * This is needed as a transition measure while CONFIG_IS_ENABLED() is used on
+ * options without SPL equivalent, since in that case it should always return
+ * zero. Once we add SPL equivalents, this clause can be dropped.
  */
 
-#if defined(CONFIG_TPL_BUILD)
-#define _CONFIG_PREFIX TPL_
-#elif defined(CONFIG_SPL_BUILD)
-#define _CONFIG_PREFIX SPL_
-#else
-#define _CONFIG_PREFIX
-#endif
-
-#define   config_val(cfg)       _config_val(_CONFIG_PREFIX, cfg)
-#define  _config_val(pfx, cfg) __config_val(pfx, cfg)
-#define __config_val(pfx, cfg) CONFIG_ ## pfx ## cfg
+#define __config_is_enabled(cfg) (IS_ENABLED(CONFIG_ ## cfg ## _nospl) ? \
+	!IS_ENABLED(CONFIG_SPL_BUILD) : \
+	config_enabled(CONFIG_ ## cfg))
 
 /*
- * CONFIG_VAL(FOO) evaluates to the value of
- *  CONFIG_FOO if CONFIG_SPL_BUILD is undefined,
- *  CONFIG_SPL_FOO if CONFIG_SPL_BUILD is defined.
- *  CONFIG_TPL_FOO if CONFIG_TPL_BUILD is defined.
+ * CONFIG_IS_ENABLED(FOO) returns 1 if CONFIG_FOO is enabled for the phase being
+ * built, else 0. Note that CONFIG_FOO corresponds to CONFIG_SPL_FOO (in
+ * Kconfig) for the SPL phase, CONFIG_TPL_FOO for the TPL phase, etc.
  */
-#define CONFIG_VAL(option)  config_val(option)
+#define CONFIG_IS_ENABLED(option) __config_is_enabled(option)
+
+#define __config_val(cfg) CONFIG_ ## cfg
+
+#define CONFIG_VAL(option)  __config_val(option)
 
 /*
  * Count number of arguments to a variadic macro. Currently only need
@@ -62,49 +68,4 @@
 #define __arg6(a1, a2, a3, a4, a5, a6, ...) a6
 #define __count_args(...) __arg6(dummy, ##__VA_ARGS__, 4, 3, 2, 1, 0)
 
-#define __concat(a, b)   ___concat(a, b)
-#define ___concat(a, b)  a ## b
-
-#define __unwrap(...) __VA_ARGS__
-#define __unwrap1(case1, case0) __unwrap case1
-#define __unwrap0(case1, case0) __unwrap case0
-
-#define __CONFIG_IS_ENABLED_1(option)        __CONFIG_IS_ENABLED_3(option, (1), (0))
-#define __CONFIG_IS_ENABLED_2(option, case1) __CONFIG_IS_ENABLED_3(option, case1, ())
-#define __CONFIG_IS_ENABLED_3(option, case1, case0) \
-	__concat(__unwrap, config_enabled(CONFIG_VAL(option))) (case1, case0)
-
-/*
- * CONFIG_IS_ENABLED(FOO) expands to
- *  1 if CONFIG_SPL_BUILD is undefined and CONFIG_FOO is set to 'y',
- *  1 if CONFIG_SPL_BUILD is defined and CONFIG_SPL_FOO is set to 'y',
- *  1 if CONFIG_TPL_BUILD is defined and CONFIG_TPL_FOO is set to 'y',
- *  0 otherwise.
- *
- * CONFIG_IS_ENABLED(FOO, (abc)) expands to
- *  abc if CONFIG_SPL_BUILD is undefined and CONFIG_FOO is set to 'y',
- *  abc if CONFIG_SPL_BUILD is defined and CONFIG_SPL_FOO is set to 'y',
- *  abc if CONFIG_TPL_BUILD is defined and CONFIG_TPL_FOO is set to 'y',
- *  nothing otherwise.
- *
- * CONFIG_IS_ENABLED(FOO, (abc), (def)) expands to
- *  abc if CONFIG_SPL_BUILD is undefined and CONFIG_FOO is set to 'y',
- *  abc if CONFIG_SPL_BUILD is defined and CONFIG_SPL_FOO is set to 'y',
- *  abc if CONFIG_TPL_BUILD is defined and CONFIG_TPL_FOO is set to 'y',
- *  def otherwise.
- *
- * The optional second and third arguments must be parenthesized; that
- * allows one to include a trailing comma, e.g. for use in
- *
- * CONFIG_IS_ENABLED(ACME, ({.compatible = "acme,frobnozzle"},))
- *
- * which adds an entry to the array being defined if CONFIG_ACME (or
- * CONFIG_SPL_ACME/CONFIG_TPL_ACME, depending on build context) is
- * set, and nothing otherwise.
- */
-
-#define CONFIG_IS_ENABLED(option, ...)					\
-	__concat(__CONFIG_IS_ENABLED_, __count_args(option, ##__VA_ARGS__)) (option, ##__VA_ARGS__)
-
-
 #endif /* __LINUX_KCONFIG_H */
-- 
2.33.0.309.g3052b89438-goog



More information about the U-Boot mailing list