On Fri, Mar 08, 2013 at 07:02:44PM +0100, Paul Bolle wrote: > On Fri, 2013-03-08 at 09:55 -0800, Tony Lindgren wrote: > > * Paul Bolle <pebo...@tiscali.nl> [130308 09:24]: > > > Should I draft a patch? > > > > Sure that would be nice. > > One thing I couldn't determine is how the generated mach-types.h header > handles multiple CONFIG_MACH_* macros. > > If both CONFIG_MACH_FOO and CONFIG_MACH_BAR are defined, and these both > have a line in */mach-types, will the machine_is_foo() and > machine_is_bar() macros both behave as one would expect?
It's actually quite clever. There's two levels to it. The first is that CONFIG_MACH_xxx result in their machine_is_xxx() macros being defined to constant zero if the CONFIG option is not enabled. That allows the compiler to throw away code for disabled platforms because the expression is always false. Otherwise, they end up as (machine_arch_type == MACH_TYPE_xxx). The second is the magic which happens when two CONFIG_MACH_xxx are selected. If only one is selected, then machine_arch_type is defined to the appropriate MACH_TYPE_xxx. This means that the above expression becomes constant-true, and the conditional is eliminated. If more than one is selected, then machine_arch_type is defined to a variable which is appropriately set to one of the MACH_TYPE_xxx values. So, the result is that: - de-selected platforms have their if (machine_is_xxx()) { } optimised out of the kernel. - for a kernel built targetting one platform, all the if (machine_is_xxx()) tests are optimised away, leaving only the relevant code behind. - otherwise, we get the _appropriate_ conditional code for the configuration generated. However, going back to that MACH_NOKIA_RM696. If there exists only a select of this symbol and no "config MACH_NOKIA_RM696" entry, then the symbol will never be generated in the output .config file. I too can find no trace of any use of machine_is_nokia_rm696 in the mainline kernel. So, if there's nothing using the machine_is_() symbol, and nothing using the CONFIG_MACH_NOKIA_RM696 symbol, then any select of that is entirely superfluous. Well, I did this: $ git grep -i nokia_rm696 arch/arm/mach-omap2/Kconfig: select MACH_NOKIA_RM696 arch/arm/mach-omap2/board-rm680.c:MACHINE_START(NOKIA_RM696, "Nokia RM-696 board") arch/arm/tools/mach-types:nokia_rm696 MACH_NOKIA_RM696 NOKIA_RM696 3522 So, there exists platform support for this device, provided by the RM680 support, but there's no use of the machine_is_xxx() symbol - and if there was, it would always be false. My conclusion is... it's a mess. -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/