[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [PATCH] [RFC] x86/cpu: rework instruction set selection
From: Arnd Bergmann <arnd@xxxxxxxx> With cx8 and tsc being mandatory features, the only important architectural features are now cmov and pae. Change the large list of target CPUs to no longer pick the instruction set itself but only the mtune= optimization level and in-kernel optimizations that remain compatible with all cores. The CONFIG_X86_CMOV instead becomes user-selectable and is now how Kconfig picks between 586-class (Pentium, Pentium MMX, K6, C3, GeodeGX) and 686-class (everything else) targets. In order to allow running on late 32-bit cores (Athlon, Pentium-M, Pentium 4, ...), the X86_L1_CACHE_SHIFT can no longer be set to anything lower than 6 (i.e. 64 byte cache lines). The optimization options now depend on X86_CMOV and X86_PAE instead of the other way round, while other compile-time conditionals that checked for MATOM/MGEODEGX1 instead now check for CPU_SUP_* options that enable support for a particular CPU family. Link: https://lore.kernel.org/lkml/dd29df0c-0b4f-44e6-b71b-2a358ea76fb4@xxxxxxxxxxxxxxxx/ Signed-off-by: Arnd Bergmann <arnd@xxxxxxxx> --- This is what I had in mind as mentioned in the earlier thread on cx8/tsc removal. I based this on top of the Ingo's [RFC 15/15] patch. --- arch/x86/Kconfig | 2 +- arch/x86/Kconfig.cpu | 100 ++++++++++++++------------------ arch/x86/Makefile_32.cpu | 48 +++++++-------- arch/x86/include/asm/vermagic.h | 36 +----------- arch/x86/kernel/tsc.c | 2 +- arch/x86/xen/Kconfig | 1 - drivers/misc/mei/Kconfig | 2 +- 7 files changed, 74 insertions(+), 117 deletions(-) diff --git a/arch/x86/Kconfig b/arch/x86/Kconfig index a9d717558972..1e33f88c9b97 100644 --- a/arch/x86/Kconfig +++ b/arch/x86/Kconfig @@ -1438,7 +1438,7 @@ config HIGHMEM config X86_PAE bool "PAE (Physical Address Extension) Support" - depends on X86_32 && X86_HAVE_PAE + depends on X86_32 && X86_CMOV select PHYS_ADDR_T_64BIT help PAE is required for NX support, and furthermore enables diff --git a/arch/x86/Kconfig.cpu b/arch/x86/Kconfig.cpu index 6f1e8cc8fe58..0619566de93f 100644 --- a/arch/x86/Kconfig.cpu +++ b/arch/x86/Kconfig.cpu @@ -1,23 +1,32 @@ # SPDX-License-Identifier: GPL-2.0 # Put here option for CPU selection and depending optimization -choice - prompt "x86-32 Processor family" - depends on X86_32 - default M686 + +config X86_CMOV + bool "Require 686-class CMOV instructions" if X86_32 + default y help - This is the processor type of your CPU. This information is - used for optimizing purposes. In order to compile a kernel - that can run on all supported x86 CPU types (albeit not - optimally fast), you can specify "586" here. + Most x86-32 processor implementations are compatible with + the the CMOV instruction originally added in the Pentium Pro, + and they perform much better when using it. + + Disable this option to build for 586-class CPUs without this + instruction. This is only required for the original Intel + Pentium (P5, P54, P55), AMD K6/K6-II/K6-3D, Geode GX1 and Via + CyrixIII/C3 CPUs. Note that the 386 and 486 is no longer supported, this includes AMD/Cyrix/Intel 386DX/DXL/SL/SLC/SX, Cyrix/TI 486DLC/DLC2, UMC 486SX-S and the NexGen Nx586, AMD ELAN and all 486 based CPUs. - The kernel will not necessarily run on earlier architectures than - the one you have chosen, e.g. a Pentium optimized kernel will run on - a PPro, but not necessarily on a i486. +choice + prompt "x86-32 Processor optimization" + depends on X86_32 + default X86_GENERIC + help + This is the processor type of your CPU. This information is + used for optimizing purposes, but does not change compatibility + with other CPU types. Here are the settings recommended for greatest speed: - "586" for generic Pentium CPUs lacking the TSC @@ -45,14 +54,13 @@ choice config M586TSC bool "Pentium-Classic" - depends on X86_32 + depends on X86_32 && !X86_CMOV help - Select this for a Pentium Classic processor with the RDTSC (Read - Time Stamp Counter) instruction for benchmarking. + Select this for a Pentium Classic processor. config M586MMX bool "Pentium-MMX" - depends on X86_32 + depends on X86_32 && !X86_CMOV help Select this for a Pentium with the MMX graphics/multimedia extended instructions. @@ -117,7 +125,7 @@ config MPENTIUM4 config MK6 bool "K6/K6-II/K6-III" - depends on X86_32 + depends on X86_32 && !X86_CMOV help Select this for an AMD K6-family processor. Enables use of some extended instructions, and passes appropriate optimization @@ -125,7 +133,7 @@ config MK6 config MK7 bool "Athlon/Duron/K7" - depends on X86_32 + depends on X86_32 && !X86_PAE help Select this for an AMD Athlon K7-family processor. Enables use of some extended instructions, and passes appropriate optimization @@ -147,42 +155,37 @@ config MEFFICEON config MGEODEGX1 bool "GeodeGX1" - depends on X86_32 + depends on X86_32 && !X86_CMOV help Select this for a Geode GX1 (Cyrix MediaGX) chip. config MGEODE_LX bool "Geode GX/LX" - depends on X86_32 + depends on X86_32 && !X86_PAE help Select this for AMD Geode GX and LX processors. config MCYRIXIII bool "CyrixIII/VIA-C3" - depends on X86_32 + depends on X86_32 && !X86_CMOV help Select this for a Cyrix III or C3 chip. Presently Linux and GCC treat this chip as a generic 586. Whilst the CPU is 686 class, it lacks the cmov extension which gcc assumes is present when generating 686 code. - Note that Nehemiah (Model 9) and above will not boot with this - kernel due to them lacking the 3DNow! instructions used in earlier - incarnations of the CPU. config MVIAC3_2 bool "VIA C3-2 (Nehemiah)" - depends on X86_32 + depends on X86_32 && !X86_PAE help Select this for a VIA C3 "Nehemiah". Selecting this enables usage of SSE and tells gcc to treat the CPU as a 686. - Note, this kernel will not boot on older (pre model 9) C3s. config MVIAC7 bool "VIA C7" - depends on X86_32 + depends on X86_32 && !X86_PAE help - Select this for a VIA C7. Selecting this uses the correct cache - shift and tells gcc to treat the CPU as a 686. + Select this for a VIA C7. config MATOM bool "Intel Atom" @@ -192,20 +195,19 @@ config MATOM accordingly optimized code. Use a recent GCC with specific Atom support in order to fully benefit from selecting this option. -endchoice - config X86_GENERIC - bool "Generic x86 support" - depends on X86_32 + bool "Generic x86" help - Instead of just including optimizations for the selected + Instead of just including optimizations for a particular x86 variant (e.g. PII, Crusoe or Athlon), include some more generic optimizations as well. This will make the kernel - perform better on x86 CPUs other than that selected. + perform better on a variety of CPUs. This is really intended for distributors who need more generic optimizations. +endchoice + # # Define implied options from the CPU selection here config X86_INTERNODE_CACHE_SHIFT @@ -216,17 +218,14 @@ config X86_INTERNODE_CACHE_SHIFT config X86_L1_CACHE_SHIFT int default "7" if MPENTIUM4 - default "6" if MK7 || MPENTIUMM || MATOM || MVIAC7 || X86_GENERIC || X86_64 - default "4" if MGEODEGX1 - default "5" if MCRUSOE || MEFFICEON || MCYRIXIII || MK6 || MPENTIUMIII || MPENTIUMII || M686 || M586MMX || M586TSC || MVIAC3_2 || MGEODE_LX + default "6" config X86_F00F_BUG - def_bool y - depends on M586MMX || M586TSC || M586 + def_bool !X86_CMOV config X86_ALIGNMENT_16 def_bool y - depends on MCYRIXIII || MK6 || M586MMX || M586TSC || M586 || MVIAC3_2 || MGEODEGX1 + depends on MCYRIXIII || MK6 || M586MMX || M586TSC || M586 || MVIAC3_2 || MGEODEGX1 || (!X86_CMOV && X86_GENERIC) config X86_INTEL_USERCOPY def_bool y @@ -234,34 +233,23 @@ config X86_INTEL_USERCOPY config X86_USE_PPRO_CHECKSUM def_bool y - depends on MCYRIXIII || MK7 || MK6 || MPENTIUM4 || MPENTIUMM || MPENTIUMIII || MPENTIUMII || M686 || MVIAC3_2 || MVIAC7 || MEFFICEON || MGEODE_LX || MATOM + depends on MCYRIXIII || MK7 || MK6 || MPENTIUM4 || MPENTIUMM || MPENTIUMIII || MPENTIUMII || M686 || MVIAC3_2 || MVIAC7 || MEFFICEON || MGEODE_LX || MATOM || (X86_CMOV && X86_GENERIC) config X86_TSC def_bool y -config X86_HAVE_PAE - def_bool y - depends on MCRUSOE || MEFFICEON || MCYRIXIII || MPENTIUM4 || MPENTIUMM || MPENTIUMIII || MPENTIUMII || M686 || MVIAC7 || MATOM || X86_64 - config X86_CX8 def_bool y -# this should be set for all -march=.. options where the compiler -# generates cmov. -config X86_CMOV - def_bool y - depends on (MK7 || MPENTIUM4 || MPENTIUMM || MPENTIUMIII || MPENTIUMII || M686 || MVIAC3_2 || MVIAC7 || MCRUSOE || MEFFICEON || MATOM || MGEODE_LX || X86_64) - config X86_MINIMUM_CPU_FAMILY int default "64" if X86_64 - default "6" if X86_32 && (MPENTIUM4 || MPENTIUMM || MPENTIUMIII || MPENTIUMII || M686 || MVIAC3_2 || MVIAC7 || MEFFICEON || MATOM || MK7) - default "5" if X86_32 - default "4" + default "6" if X86_32 && X86_CMOV + default "5" config X86_DEBUGCTLMSR def_bool y - depends on !(MK6 || MCYRIXIII || M586MMX || M586TSC || M586) && !UML + depends on X86_CMOV && !UML config IA32_FEAT_CTL def_bool y @@ -297,7 +285,7 @@ config CPU_SUP_INTEL config CPU_SUP_CYRIX_32 default y bool "Support Cyrix processors" if PROCESSOR_SELECT - depends on M586 || M586TSC || M586MMX || (EXPERT && !64BIT) + depends on !64BIT help This enables detection, tunings and quirks for Cyrix processors diff --git a/arch/x86/Makefile_32.cpu b/arch/x86/Makefile_32.cpu index f5e933077bf4..ebd7ec6eaf34 100644 --- a/arch/x86/Makefile_32.cpu +++ b/arch/x86/Makefile_32.cpu @@ -10,30 +10,32 @@ else align := -falign-functions=0 -falign-jumps=0 -falign-loops=0 endif -cflags-$(CONFIG_M586TSC) += -march=i586 -cflags-$(CONFIG_M586MMX) += -march=pentium-mmx -cflags-$(CONFIG_M686) += -march=i686 -cflags-$(CONFIG_MPENTIUMII) += -march=i686 $(call tune,pentium2) -cflags-$(CONFIG_MPENTIUMIII) += -march=i686 $(call tune,pentium3) -cflags-$(CONFIG_MPENTIUMM) += -march=i686 $(call tune,pentium3) -cflags-$(CONFIG_MPENTIUM4) += -march=i686 $(call tune,pentium4) -cflags-$(CONFIG_MK6) += -march=k6 -# Please note, that patches that add -march=athlon-xp and friends are pointless. -# They make zero difference whatsosever to performance at this time. -cflags-$(CONFIG_MK7) += -march=athlon -cflags-$(CONFIG_MCRUSOE) += -march=i686 $(align) -cflags-$(CONFIG_MEFFICEON) += -march=i686 $(call tune,pentium3) $(align) -cflags-$(CONFIG_MCYRIXIII) += $(call cc-option,-march=c3,-march=i486) $(align) -cflags-$(CONFIG_MVIAC3_2) += $(call cc-option,-march=c3-2,-march=i686) -cflags-$(CONFIG_MVIAC7) += -march=i686 -cflags-$(CONFIG_MATOM) += -march=atom +ifdef CONFIG_X86_CMOV +cflags-y += -march=i686 +else +cflags-y += -march=i586 +endif -# Geode GX1 support -cflags-$(CONFIG_MGEODEGX1) += -march=pentium-mmx -cflags-$(CONFIG_MGEODE_LX) += $(call cc-option,-march=geode,-march=pentium-mmx) -# add at the end to overwrite eventual tuning options from earlier -# cpu entries -cflags-$(CONFIG_X86_GENERIC) += $(call tune,generic,$(call tune,i686)) +cflags-$(CONFIG_M586TSC) += -mtune=i586 +cflags-$(CONFIG_M586MMX) += -mtune=pentium-mmx +cflags-$(CONFIG_M686) += -mtune=i686 +cflags-$(CONFIG_MPENTIUMII) += -mtune=pentium2 +cflags-$(CONFIG_MPENTIUMIII) += -mtune=pentium3 +cflags-$(CONFIG_MPENTIUMM) += -mtune=pentium3 +cflags-$(CONFIG_MPENTIUM4) += -mtune=pentium4 +cflags-$(CONFIG_MK6) += -mtune=k6 +# Please note, that patches that add -mtune=athlon-xp and friends are pointless. +# They make zero difference whatsosever to performance at this time. +cflags-$(CONFIG_MK7) += -mtune=athlon +cflags-$(CONFIG_MCRUSOE) += -mtune=i686 $(align) +cflags-$(CONFIG_MEFFICEON) += -mtune=pentium3 $(align) +cflags-$(CONFIG_MCYRIXIII) += -mtune=c3 $(align) +cflags-$(CONFIG_MVIAC3_2) += -mtune=c3-2 +cflags-$(CONFIG_MVIAC7) += -mtune=i686 +cflags-$(CONFIG_MATOM) += -mtune=atom +cflags-$(CONFIG_MGEODEGX1) += -mtune=pentium-mmx +cflags-$(CONFIG_MGEODE_LX) += -mtune=geode +cflags-$(CONFIG_X86_GENERIC) += -mtune=generic # Bug fix for binutils: this option is required in order to keep # binutils from generating NOPL instructions against our will. diff --git a/arch/x86/include/asm/vermagic.h b/arch/x86/include/asm/vermagic.h index e26061df0c9b..6554dbdfd719 100644 --- a/arch/x86/include/asm/vermagic.h +++ b/arch/x86/include/asm/vermagic.h @@ -5,42 +5,10 @@ #ifdef CONFIG_X86_64 /* X86_64 does not define MODULE_PROC_FAMILY */ -#elif defined CONFIG_M586TSC -#define MODULE_PROC_FAMILY "586TSC " -#elif defined CONFIG_M586MMX -#define MODULE_PROC_FAMILY "586MMX " -#elif defined CONFIG_MATOM -#define MODULE_PROC_FAMILY "ATOM " -#elif defined CONFIG_M686 +#elif defined CONFIG_X86_CMOV #define MODULE_PROC_FAMILY "686 " -#elif defined CONFIG_MPENTIUMII -#define MODULE_PROC_FAMILY "PENTIUMII " -#elif defined CONFIG_MPENTIUMIII -#define MODULE_PROC_FAMILY "PENTIUMIII " -#elif defined CONFIG_MPENTIUMM -#define MODULE_PROC_FAMILY "PENTIUMM " -#elif defined CONFIG_MPENTIUM4 -#define MODULE_PROC_FAMILY "PENTIUM4 " -#elif defined CONFIG_MK6 -#define MODULE_PROC_FAMILY "K6 " -#elif defined CONFIG_MK7 -#define MODULE_PROC_FAMILY "K7 " -#elif defined CONFIG_MCRUSOE -#define MODULE_PROC_FAMILY "CRUSOE " -#elif defined CONFIG_MEFFICEON -#define MODULE_PROC_FAMILY "EFFICEON " -#elif defined CONFIG_MCYRIXIII -#define MODULE_PROC_FAMILY "CYRIXIII " -#elif defined CONFIG_MVIAC3_2 -#define MODULE_PROC_FAMILY "VIAC3-2 " -#elif defined CONFIG_MVIAC7 -#define MODULE_PROC_FAMILY "VIAC7 " -#elif defined CONFIG_MGEODEGX1 -#define MODULE_PROC_FAMILY "GEODEGX1 " -#elif defined CONFIG_MGEODE_LX -#define MODULE_PROC_FAMILY "GEODE " #else -#error unknown processor family +#define MODULE_PROC_FAMILY "586 " #endif #ifdef CONFIG_X86_32 diff --git a/arch/x86/kernel/tsc.c b/arch/x86/kernel/tsc.c index 489c779ef3ef..76b15ef8c85f 100644 --- a/arch/x86/kernel/tsc.c +++ b/arch/x86/kernel/tsc.c @@ -1221,7 +1221,7 @@ bool tsc_clocksource_watchdog_disabled(void) static void __init check_system_tsc_reliable(void) { -#if defined(CONFIG_MGEODEGX1) || defined(CONFIG_MGEODE_LX) || defined(CONFIG_X86_GENERIC) +#if defined(CONFIG_CPU_SUP_CYRIX) if (is_geode_lx()) { /* RTSC counts during suspend */ #define RTSC_SUSP 0x100 diff --git a/arch/x86/xen/Kconfig b/arch/x86/xen/Kconfig index 222b6fdad313..2648459b8e8f 100644 --- a/arch/x86/xen/Kconfig +++ b/arch/x86/xen/Kconfig @@ -9,7 +9,6 @@ config XEN select PARAVIRT_CLOCK select X86_HV_CALLBACK_VECTOR depends on X86_64 || (X86_32 && X86_PAE) - depends on X86_64 || (X86_GENERIC || MPENTIUM4 || MATOM) depends on X86_LOCAL_APIC help This is the Linux Xen port. Enabling this will allow the diff --git a/drivers/misc/mei/Kconfig b/drivers/misc/mei/Kconfig index 7575fee96cc6..4deb17ed0a62 100644 --- a/drivers/misc/mei/Kconfig +++ b/drivers/misc/mei/Kconfig @@ -3,7 +3,7 @@ config INTEL_MEI tristate "Intel Management Engine Interface" depends on X86 && PCI - default X86_64 || MATOM + default X86_64 || CPU_SUP_INTEL help The Intel Management Engine (Intel ME) provides Manageability, Security and Media services for system containing Intel chipsets. -- 2.39.5
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |