1b2441318SGreg Kroah-Hartman /* SPDX-License-Identifier: GPL-2.0 */ 22a11c8eaSMichal Marek #ifndef __LINUX_KCONFIG_H 32a11c8eaSMichal Marek #define __LINUX_KCONFIG_H 42a11c8eaSMichal Marek 52a11c8eaSMichal Marek #include <generated/autoconf.h> 62a11c8eaSMichal Marek 7101110f6SArnd Bergmann #ifdef CONFIG_CPU_BIG_ENDIAN 8101110f6SArnd Bergmann #define __BIG_ENDIAN 4321 9101110f6SArnd Bergmann #else 10101110f6SArnd Bergmann #define __LITTLE_ENDIAN 1234 11101110f6SArnd Bergmann #endif 12101110f6SArnd Bergmann 135e8754fdSMasahiro Yamada #define __ARG_PLACEHOLDER_1 0, 145e8754fdSMasahiro Yamada #define __take_second_arg(__ignored, val, ...) val 155e8754fdSMasahiro Yamada 165e8754fdSMasahiro Yamada /* 175e8754fdSMasahiro Yamada * The use of "&&" / "||" is limited in certain expressions. 184091fb95SMasahiro Yamada * The following enable to calculate "and" / "or" with macro expansion only. 195e8754fdSMasahiro Yamada */ 205e8754fdSMasahiro Yamada #define __and(x, y) ___and(x, y) 215e8754fdSMasahiro Yamada #define ___and(x, y) ____and(__ARG_PLACEHOLDER_##x, y) 225e8754fdSMasahiro Yamada #define ____and(arg1_or_junk, y) __take_second_arg(arg1_or_junk y, 0) 235e8754fdSMasahiro Yamada 245e8754fdSMasahiro Yamada #define __or(x, y) ___or(x, y) 255e8754fdSMasahiro Yamada #define ___or(x, y) ____or(__ARG_PLACEHOLDER_##x, y) 265e8754fdSMasahiro Yamada #define ____or(arg1_or_junk, y) __take_second_arg(arg1_or_junk 1, y) 275e8754fdSMasahiro Yamada 282a11c8eaSMichal Marek /* 2969349c2dSPaul Gortmaker * Helper macros to use CONFIG_ options in C/CPP expressions. Note that 302a11c8eaSMichal Marek * these only work with boolean and tristate options. 312a11c8eaSMichal Marek */ 322a11c8eaSMichal Marek 332a11c8eaSMichal Marek /* 3469349c2dSPaul Gortmaker * Getting something that works in C and CPP for an arg that may or may 3569349c2dSPaul Gortmaker * not be defined is tricky. Here, if we have "#define CONFIG_BOOGER 1" 3669349c2dSPaul Gortmaker * we match on the placeholder define, insert the "0," for arg1 and generate 3769349c2dSPaul Gortmaker * the triplet (0, 1, 0). Then the last step cherry picks the 2nd arg (a one). 3869349c2dSPaul Gortmaker * When CONFIG_BOOGER is not defined, we generate a (... 1, 0) pair, and when 3969349c2dSPaul Gortmaker * the last step cherry picks the 2nd arg, we get a zero. 4069349c2dSPaul Gortmaker */ 414f920843SMasahiro Yamada #define __is_defined(x) ___is_defined(x) 424f920843SMasahiro Yamada #define ___is_defined(val) ____is_defined(__ARG_PLACEHOLDER_##val) 434f920843SMasahiro Yamada #define ____is_defined(arg1_or_junk) __take_second_arg(arg1_or_junk 1, 0) 4469349c2dSPaul Gortmaker 4569349c2dSPaul Gortmaker /* 462a11c8eaSMichal Marek * IS_BUILTIN(CONFIG_FOO) evaluates to 1 if CONFIG_FOO is set to 'y', 0 472a11c8eaSMichal Marek * otherwise. For boolean options, this is equivalent to 482a11c8eaSMichal Marek * IS_ENABLED(CONFIG_FOO). 492a11c8eaSMichal Marek */ 50c0a0aba8SMasahiro Yamada #define IS_BUILTIN(option) __is_defined(option) 512a11c8eaSMichal Marek 522a11c8eaSMichal Marek /* 532a11c8eaSMichal Marek * IS_MODULE(CONFIG_FOO) evaluates to 1 if CONFIG_FOO is set to 'm', 0 54*c7c90e12SBjorn Helgaas * otherwise. CONFIG_FOO=m results in "#define CONFIG_FOO_MODULE 1" in 55*c7c90e12SBjorn Helgaas * autoconf.h. 562a11c8eaSMichal Marek */ 57c0a0aba8SMasahiro Yamada #define IS_MODULE(option) __is_defined(option##_MODULE) 582a11c8eaSMichal Marek 599b174527SArnd Bergmann /* 609b174527SArnd Bergmann * IS_REACHABLE(CONFIG_FOO) evaluates to 1 if the currently compiled 619b174527SArnd Bergmann * code can call a function defined in code compiled based on CONFIG_FOO. 629b174527SArnd Bergmann * This is similar to IS_ENABLED(), but returns false when invoked from 639b174527SArnd Bergmann * built-in code when CONFIG_FOO is set to 'm'. 649b174527SArnd Bergmann */ 655e8754fdSMasahiro Yamada #define IS_REACHABLE(option) __or(IS_BUILTIN(option), \ 665e8754fdSMasahiro Yamada __and(IS_MODULE(option), __is_defined(MODULE))) 679b174527SArnd Bergmann 6864131a87SMauro Carvalho Chehab /* 6902d699f1SMichal Simek * IS_ENABLED(CONFIG_FOO) evaluates to 1 if CONFIG_FOO is set to 'y' or 'm', 70*c7c90e12SBjorn Helgaas * 0 otherwise. Note that CONFIG_FOO=y results in "#define CONFIG_FOO 1" in 71*c7c90e12SBjorn Helgaas * autoconf.h, while CONFIG_FOO=m results in "#define CONFIG_FOO_MODULE 1". 7202d699f1SMichal Simek */ 735e8754fdSMasahiro Yamada #define IS_ENABLED(option) __or(IS_BUILTIN(option), IS_MODULE(option)) 7402d699f1SMichal Simek 752a11c8eaSMichal Marek #endif /* __LINUX_KCONFIG_H */ 76