Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

ARM: rework endianess selection

Choosing big-endian vs little-endian kernels in Kconfig has not worked
correctly since the introduction of CONFIG_ARCH_MULTIPLATFORM a long
time ago.

The problems is that CONFIG_BIG_ENDIAN depends on
ARCH_SUPPORTS_BIG_ENDIAN, which can set by any one platform
in the config, but would actually have to be supported by all
of them.

This was mostly ok for ARMv6/ARMv7 builds, since these are BE8 and
tend to just work aside from problems in nonportable device drivers.
For ARMv4/v5 machines, CONFIG_BIG_ENDIAN and CONFIG_ARCH_MULTIPLATFORM
were never set together, so this was disabled on all those machines
except for IXP4xx.

As IXP4xx can now become part of ARCH_MULTIPLATFORM, it seems better to
formalize this logic: all ARMv4/v5 platforms get an explicit dependency
on being either big-endian (ixp4xx) or little-endian (the rest). We may
want to fix ixp4xx in the future to support both, but it does not work
in LE mode at the moment.

For the ARMv6/v7 platforms, there are two ways this could be handled

a) allow both modes only for platforms selecting
'ARCH_SUPPORTS_BIG_ENDIAN' today, but only LE mode for the
others, given that these were added intentionally at some
point.

b) allow both modes everwhere, given that it was already possible
to build that way by e.g. selecting ARCH_VIRT, and that the
list is not an accurate reflection of which platforms may or
may not work.

Out of these, I picked b) because it seemed slighly more logical
to me.

Signed-off-by: Arnd Bergmann <arnd@arndb.de>

+54 -33
+6 -2
arch/arm/Kconfig
··· 349 349 350 350 config ARCH_FOOTBRIDGE 351 351 bool "FootBridge" 352 + depends on CPU_LITTLE_ENDIAN 352 353 select CPU_SA110 353 354 select FOOTBRIDGE 354 355 select NEED_MACH_MEMORY_H ··· 359 358 360 359 config ARCH_IXP4XX 361 360 bool "IXP4xx-based" 362 - select ARCH_SUPPORTS_BIG_ENDIAN 361 + depends on CPU_BIG_ENDIAN 363 362 select ARM_PATCH_PHYS_VIRT 364 363 select CPU_XSCALE 365 364 select GPIO_IXP4XX ··· 375 374 376 375 config ARCH_PXA 377 376 bool "PXA2xx/PXA3xx-based" 377 + depends on CPU_LITTLE_ENDIAN 378 378 select ARCH_MTD_XIP 379 379 select ARM_CPU_SUSPEND if PM 380 380 select AUTO_ZRELADDR ··· 395 393 config ARCH_RPC 396 394 bool "RiscPC" 397 395 depends on !CC_IS_CLANG && GCC_VERSION < 90100 && GCC_VERSION >= 60000 396 + depends on CPU_LITTLE_ENDIAN 398 397 select ARCH_ACORN 399 398 select ARCH_MAY_HAVE_PC_FDC 400 399 select ARCH_SPARSEMEM_ENABLE ··· 414 411 415 412 config ARCH_SA1100 416 413 bool "SA1100-based" 414 + depends on CPU_LITTLE_ENDIAN 417 415 select ARCH_MTD_XIP 418 416 select ARCH_SPARSEMEM_ENABLE 419 417 select CLKSRC_MMIO ··· 433 429 434 430 config ARCH_OMAP1 435 431 bool "TI OMAP1" 432 + depends on CPU_LITTLE_ENDIAN 436 433 select ARCH_OMAP 437 434 select CLKSRC_MMIO 438 435 select GENERIC_IRQ_CHIP ··· 510 505 select ARM_GIC_V3_ITS if PCI 511 506 select ARM_PSCI 512 507 select HAVE_ARM_ARCH_TIMER 513 - select ARCH_SUPPORTS_BIG_ENDIAN 514 508 515 509 config ARCH_AIROHA 516 510 bool "Airoha SoC Support"
+1
arch/arm/mach-asm9260/Kconfig
··· 2 2 config MACH_ASM9260 3 3 bool "Alphascale ASM9260" 4 4 depends on ARCH_MULTI_V5 5 + depends on CPU_LITTLE_ENDIAN 5 6 select CPU_ARM926T 6 7 select ASM9260_TIMER 7 8 help
+1 -1
arch/arm/mach-aspeed/Kconfig
··· 1 1 # SPDX-License-Identifier: GPL-2.0-only 2 2 menuconfig ARCH_ASPEED 3 3 bool "Aspeed BMC architectures" 4 - depends on ARCH_MULTI_V5 || ARCH_MULTI_V6 || ARCH_MULTI_V7 4 + depends on (CPU_LITTLE_ENDIAN && ARCH_MULTI_V5) || ARCH_MULTI_V6 || ARCH_MULTI_V7 5 5 select SRAM 6 6 select WATCHDOG 7 7 select ASPEED_WATCHDOG
+2 -1
arch/arm/mach-at91/Kconfig
··· 1 1 # SPDX-License-Identifier: GPL-2.0-only 2 2 menuconfig ARCH_AT91 3 3 bool "AT91/Microchip SoCs" 4 - depends on ARCH_MULTI_V4T || ARCH_MULTI_V5 || ARCH_MULTI_V7 || ARM_SINGLE_ARMV7M 4 + depends on (CPU_LITTLE_ENDIAN && (ARCH_MULTI_V4T || ARCH_MULTI_V5)) || \ 5 + ARCH_MULTI_V7 || ARM_SINGLE_ARMV7M 5 6 select ARM_CPU_SUSPEND if PM && ARCH_MULTI_V7 6 7 select COMMON_CLK_AT91 7 8 select GPIOLIB
+1
arch/arm/mach-clps711x/Kconfig
··· 2 2 menuconfig ARCH_CLPS711X 3 3 bool "Cirrus Logic EP721x/EP731x-based" 4 4 depends on ARCH_MULTI_V4T 5 + depends on CPU_LITTLE_ENDIAN 5 6 select CLPS711X_TIMER 6 7 select CPU_ARM720T 7 8 select GPIOLIB
+1
arch/arm/mach-davinci/Kconfig
··· 3 3 menuconfig ARCH_DAVINCI 4 4 bool "TI DaVinci" 5 5 depends on ARCH_MULTI_V5 6 + depends on CPU_LITTLE_ENDIAN 6 7 select DAVINCI_TIMER 7 8 select ZONE_DMA 8 9 select PM_GENERIC_DOMAINS if PM
+1
arch/arm/mach-ep93xx/Kconfig
··· 2 2 menuconfig ARCH_EP93XX 3 3 bool "EP93xx-based" 4 4 depends on ARCH_MULTI_V4T 5 + depends on CPU_LITTLE_ENDIAN 5 6 select ARCH_SPARSEMEM_ENABLE 6 7 select ARM_AMBA 7 8 select ARM_VIC
-1
arch/arm/mach-exynos/Kconfig
··· 8 8 menuconfig ARCH_EXYNOS 9 9 bool "Samsung Exynos" 10 10 depends on ARCH_MULTI_V7 11 - select ARCH_SUPPORTS_BIG_ENDIAN 12 11 select ARM_AMBA 13 12 select ARM_GIC 14 13 select EXYNOS_IRQ_COMBINER
+1
arch/arm/mach-gemini/Kconfig
··· 2 2 menuconfig ARCH_GEMINI 3 3 bool "Cortina Systems Gemini" 4 4 depends on ARCH_MULTI_V4 5 + depends on CPU_LITTLE_ENDIAN 5 6 select ARCH_HAS_RESET_CONTROLLER 6 7 select ARM_AMBA 7 8 select ARM_APPENDED_DTB # Old Redboot bootloaders deployed
-1
arch/arm/mach-highbank/Kconfig
··· 2 2 config ARCH_HIGHBANK 3 3 bool "Calxeda ECX-1000/2000 (Highbank/Midway)" 4 4 depends on ARCH_MULTI_V7 5 - select ARCH_SUPPORTS_BIG_ENDIAN 6 5 select ARM_AMBA 7 6 select ARM_ERRATA_764369 if SMP 8 7 select ARM_ERRATA_775420
+1 -1
arch/arm/mach-hisi/Kconfig
··· 1 1 # SPDX-License-Identifier: GPL-2.0-only 2 2 config ARCH_HISI 3 3 bool "Hisilicon SoC Support" 4 - depends on ARCH_MULTI_V7 || ARCH_MULTI_V5 4 + depends on ARCH_MULTI_V7 || (ARCH_MULTI_V5 && CPU_LITTLE_ENDIAN) 5 5 select ARM_AMBA 6 6 select ARM_GIC if ARCH_MULTI_V7 7 7 select ARM_TIMER_SP804
+2 -2
arch/arm/mach-imx/Kconfig
··· 1 1 # SPDX-License-Identifier: GPL-2.0-only 2 2 menuconfig ARCH_MXC 3 3 bool "Freescale i.MX family" 4 - depends on ARCH_MULTI_V4_V5 || ARCH_MULTI_V6_V7 || ARM_SINGLE_ARMV7M 5 - select ARCH_SUPPORTS_BIG_ENDIAN 4 + depends on (ARCH_MULTI_V4_V5 && CPU_LITTLE_ENDIAN) || \ 5 + ARCH_MULTI_V6_V7 || ARM_SINGLE_ARMV7M 6 6 select CLKSRC_IMX_GPT 7 7 select GENERIC_IRQ_CHIP 8 8 select GPIOLIB
+1
arch/arm/mach-iop32x/Kconfig
··· 2 2 menuconfig ARCH_IOP32X 3 3 bool "IOP32x-based platforms" 4 4 depends on ARCH_MULTI_V5 5 + depends on CPU_LITTLE_ENDIAN 5 6 select CPU_XSCALE 6 7 select GPIO_IOP 7 8 select GPIOLIB
-1
arch/arm/mach-keystone/Kconfig
··· 8 8 select ARCH_HAS_RESET_CONTROLLER 9 9 select ARM_ERRATA_798181 if SMP 10 10 select COMMON_CLK_KEYSTONE 11 - select ARCH_SUPPORTS_BIG_ENDIAN 12 11 select ZONE_DMA if ARM_LPAE 13 12 select PINCTRL 14 13 select PM_GENERIC_DOMAINS if PM
+1
arch/arm/mach-lpc32xx/Kconfig
··· 3 3 config ARCH_LPC32XX 4 4 bool "NXP LPC32XX" 5 5 depends on ARCH_MULTI_V5 6 + depends on CPU_LITTLE_ENDIAN 6 7 select ARM_AMBA 7 8 select CLKSRC_LPC32XX 8 9 select CPU_ARM926T
+1 -1
arch/arm/mach-mmp/Kconfig
··· 1 1 # SPDX-License-Identifier: GPL-2.0-only 2 2 menuconfig ARCH_MMP 3 3 bool "Marvell PXA168/910/MMP2/MMP3" 4 - depends on ARCH_MULTI_V5 || ARCH_MULTI_V7 4 + depends on (CPU_LITTLE_ENDIAN && ARCH_MULTI_V5) || ARCH_MULTI_V7 5 5 select GPIO_PXA 6 6 select GPIOLIB 7 7 select PINCTRL
+1
arch/arm/mach-moxart/Kconfig
··· 2 2 menuconfig ARCH_MOXART 3 3 bool "MOXA ART SoC" 4 4 depends on ARCH_MULTI_V4 5 + depends on CPU_LITTLE_ENDIAN 5 6 select CPU_FA526 6 7 select ARM_DMA_MEM_BUFFERABLE 7 8 select FARADAY_FTINTC010
+1
arch/arm/mach-mv78xx0/Kconfig
··· 2 2 menuconfig ARCH_MV78XX0 3 3 bool "Marvell MV78xx0" 4 4 depends on ARCH_MULTI_V5 5 + depends on CPU_LITTLE_ENDIAN 5 6 select CPU_FEROCEON 6 7 select GPIOLIB 7 8 select MVEBU_MBUS
+1 -2
arch/arm/mach-mvebu/Kconfig
··· 1 1 # SPDX-License-Identifier: GPL-2.0-only 2 2 menuconfig ARCH_MVEBU 3 3 bool "Marvell Engineering Business Unit (MVEBU) SoCs" 4 - depends on ARCH_MULTI_V7 || ARCH_MULTI_V5 5 - select ARCH_SUPPORTS_BIG_ENDIAN 4 + depends on ARCH_MULTI_V7 || (ARCH_MULTI_V5 && CPU_LITTLE_ENDIAN) 6 5 select CLKSRC_MMIO 7 6 select PINCTRL 8 7 select PLAT_ORION
+1
arch/arm/mach-mxs/Kconfig
··· 16 16 config ARCH_MXS 17 17 bool "Freescale MXS (i.MX23, i.MX28) support" 18 18 depends on ARCH_MULTI_V5 19 + depends on CPU_LITTLE_ENDIAN 19 20 select GPIOLIB 20 21 select MXS_TIMER 21 22 select PINCTRL
+1
arch/arm/mach-nomadik/Kconfig
··· 2 2 menuconfig ARCH_NOMADIK 3 3 bool "ST-Ericsson Nomadik" 4 4 depends on ARCH_MULTI_V5 5 + depends on CPU_LITTLE_ENDIAN 5 6 select ARM_AMBA 6 7 select ARM_VIC 7 8 select CLKSRC_NOMADIK_MTU
+1 -1
arch/arm/mach-npcm/Kconfig
··· 1 1 # SPDX-License-Identifier: GPL-2.0-only 2 2 menuconfig ARCH_NPCM 3 3 bool "Nuvoton NPCM Architecture" 4 - depends on ARCH_MULTI_V5 || ARCH_MULTI_V7 4 + depends on (ARCH_MULTI_V5 && CPU_LITTLE_ENDIAN) || ARCH_MULTI_V7 5 5 select PINCTRL 6 6 7 7 if ARCH_NPCM
+1
arch/arm/mach-nspire/Kconfig
··· 2 2 config ARCH_NSPIRE 3 3 bool "TI-NSPIRE based" 4 4 depends on ARCH_MULTI_V4_V5 5 + depends on CPU_LITTLE_ENDIAN 5 6 select CPU_ARM926T 6 7 select GENERIC_IRQ_CHIP 7 8 select ARM_AMBA
+1
arch/arm/mach-orion5x/Kconfig
··· 2 2 menuconfig ARCH_ORION5X 3 3 bool "Marvell Orion" 4 4 depends on ARCH_MULTI_V5 5 + depends on CPU_LITTLE_ENDIAN 5 6 select CPU_FEROCEON 6 7 select GPIOLIB 7 8 select MVEBU_MBUS
+1 -1
arch/arm/mach-oxnas/Kconfig
··· 1 1 # SPDX-License-Identifier: GPL-2.0-only 2 2 menuconfig ARCH_OXNAS 3 3 bool "Oxford Semiconductor OXNAS Family SoCs" 4 + depends on (ARCH_MULTI_V5 && CPU_LITTLE_ENDIAN) || ARCH_MULTI_V6 4 5 select ARCH_HAS_RESET_CONTROLLER 5 6 select COMMON_CLK_OXNAS 6 7 select GPIOLIB ··· 12 11 select RESET_OXNAS 13 12 select VERSATILE_FPGA_IRQ 14 13 select PINCTRL 15 - depends on ARCH_MULTI_V5 || ARCH_MULTI_V6 16 14 help 17 15 Support for OxNas SoC family developed by Oxford Semiconductor. 18 16
-1
arch/arm/mach-qcom/Kconfig
··· 2 2 menuconfig ARCH_QCOM 3 3 bool "Qualcomm Support" 4 4 depends on ARCH_MULTI_V7 5 - select ARCH_SUPPORTS_BIG_ENDIAN 6 5 select ARM_GIC 7 6 select ARM_AMBA 8 7 select PINCTRL
+1
arch/arm/mach-s3c/Kconfig.s3c24xx
··· 8 8 menuconfig ARCH_S3C24XX 9 9 bool "Samsung S3C24XX SoCs" 10 10 depends on ARCH_MULTI_V4T || ARCH_MULTI_V5 11 + depends on CPU_LITTLE_ENDIAN 11 12 select ATAGS 12 13 select CLKSRC_SAMSUNG_PWM 13 14 select GPIO_SAMSUNG
-1
arch/arm/mach-socfpga/Kconfig
··· 3 3 bool "Altera SOCFPGA family" 4 4 depends on ARCH_MULTI_V7 5 5 select ARCH_HAS_RESET_CONTROLLER 6 - select ARCH_SUPPORTS_BIG_ENDIAN 7 6 select ARM_AMBA 8 7 select ARM_GIC 9 8 select CACHE_L2X0
+1 -1
arch/arm/mach-spear/Kconfig
··· 5 5 6 6 menuconfig PLAT_SPEAR 7 7 bool "ST SPEAr Family" 8 - depends on ARCH_MULTI_V7 || ARCH_MULTI_V5 8 + depends on ARCH_MULTI_V7 || (ARCH_MULTI_V5 && CPU_LITTLE_ENDIAN) 9 9 select ARM_AMBA 10 10 select CLKSRC_MMIO 11 11 select GPIOLIB
+1 -2
arch/arm/mach-sunxi/Kconfig
··· 1 1 # SPDX-License-Identifier: GPL-2.0-only 2 2 menuconfig ARCH_SUNXI 3 3 bool "Allwinner SoCs" 4 - depends on ARCH_MULTI_V5 || ARCH_MULTI_V7 4 + depends on (CPU_LITTLE_ENDIAN && ARCH_MULTI_V5) || ARCH_MULTI_V7 5 5 select ARCH_HAS_RESET_CONTROLLER 6 6 select CLKSRC_MMIO 7 7 select GENERIC_IRQ_CHIP ··· 40 40 default ARCH_SUNXI 41 41 select ARM_GIC 42 42 select ARM_PSCI 43 - select ARCH_SUPPORTS_BIG_ENDIAN 44 43 select HAVE_ARM_ARCH_TIMER 45 44 select SUN5I_HSTIMER 46 45
+3 -2
arch/arm/mach-versatile/Kconfig
··· 2 2 config ARCH_VERSATILE 3 3 bool "ARM Ltd. Versatile family" 4 4 depends on ARCH_MULTI_V5 5 + depends on CPU_LITTLE_ENDIAN 5 6 select ARM_AMBA 6 7 select ARM_TIMER_SP804 7 8 select ARM_VIC ··· 20 19 menuconfig ARCH_INTEGRATOR 21 20 bool "ARM Ltd. Integrator family" 22 21 depends on ARCH_MULTI_V4T || ARCH_MULTI_V5 || ARCH_MULTI_V6 22 + depends on CPU_LITTLE_ENDIAN || ARCH_MULTI_V6 23 23 select ARM_AMBA 24 24 select CMA 25 25 select DMA_CMA ··· 145 143 146 144 menuconfig ARCH_REALVIEW 147 145 bool "ARM Ltd. RealView family" 148 - depends on ARCH_MULTI_V5 || ARCH_MULTI_V6 || ARCH_MULTI_V7 146 + depends on (CPU_LITTLE_ENDIAN && ARCH_MULTI_V5) || ARCH_MULTI_V6 || ARCH_MULTI_V7 149 147 select ARM_AMBA 150 148 select ARM_GIC 151 149 select ARM_TIMER_SP804 ··· 249 247 menuconfig ARCH_VEXPRESS 250 248 bool "ARM Ltd. Versatile Express family" 251 249 depends on ARCH_MULTI_V7 252 - select ARCH_SUPPORTS_BIG_ENDIAN 253 250 select ARM_AMBA 254 251 select ARM_GIC 255 252 select ARM_GLOBAL_TIMER
+1
arch/arm/mach-vt8500/Kconfig
··· 10 10 config ARCH_WM8505 11 11 bool "VIA/Wondermedia 85xx and WM8650" 12 12 depends on ARCH_MULTI_V5 13 + depends on CPU_LITTLE_ENDIAN 13 14 select ARCH_VT8500 14 15 select CPU_ARM926T 15 16
-1
arch/arm/mach-zynq/Kconfig
··· 3 3 bool "Xilinx Zynq ARM Cortex A9 Platform" 4 4 depends on ARCH_MULTI_V7 5 5 select ARCH_HAS_RESET_CONTROLLER 6 - select ARCH_SUPPORTS_BIG_ENDIAN 7 6 select ARM_AMBA 8 7 select ARM_GIC 9 8 select ARM_GLOBAL_TIMER
+18 -10
arch/arm/mm/Kconfig
··· 738 738 739 739 If unsure, say Y. 740 740 741 + choice 742 + prompt "CPU Endianess" 743 + default CPU_LITTLE_ENDIAN 744 + 745 + config CPU_LITTLE_ENDIAN 746 + bool "Built little-endian kernel" 747 + help 748 + Say Y if you plan on running a kernel in little-endian mode. 749 + This is the default and is used in practically all modern user 750 + space builds. 751 + 741 752 config CPU_BIG_ENDIAN 742 753 bool "Build big-endian kernel" 743 - depends on ARCH_SUPPORTS_BIG_ENDIAN 744 754 depends on !LD_IS_LLD 745 755 help 746 756 Say Y if you plan on running a kernel in big-endian mode. 747 - Note that your board must be properly built and your board 748 - port must properly enable any big-endian related features 749 - of your chipset/board/processor. 757 + This works on many machines using ARMv6 or newer processors 758 + but requires big-endian user space. 759 + 760 + The only ARMv5 platform with big-endian support is 761 + Intel IXP4xx. 762 + 763 + endchoice 750 764 751 765 config CPU_ENDIAN_BE8 752 766 bool ··· 1135 1121 1136 1122 config ARM_HEAVY_MB 1137 1123 bool 1138 - 1139 - config ARCH_SUPPORTS_BIG_ENDIAN 1140 - bool 1141 - help 1142 - This option specifies the architecture can support big endian 1143 - operation. 1144 1124 1145 1125 config DEBUG_ALIGN_RODATA 1146 1126 bool "Make rodata strictly non-executable"