# SPDX-License-Identifier: GPL-2.0
config PPC32
	bool
	default y if !PPC64
	select KASAN_VMALLOC if KASAN && MODULES

config PPC64
	bool "64-bit kernel"
	select ZLIB_DEFLATE
	help
	  This option selects whether a 32-bit or a 64-bit kernel
	  will be built.

config PPC_BOOK3S_32
	bool

menu "Processor support"
choice
	prompt "Processor Type"
	depends on PPC32
	help
	  There are five families of 32 bit PowerPC chips supported.
	  The most common ones are the desktop and server CPUs (601, 603,
	  604, 740, 750, 74xx) CPUs from Freescale and IBM, with their
	  embedded 512x/52xx/82xx/83xx/86xx counterparts.
	  The other embedded parts, namely 4xx, 8xx, e200 (55xx) and e500
	  (85xx) each form a family of their own that is not compatible
	  with the others.

	  If unsure, select 52xx/6xx/7xx/74xx/82xx/83xx/86xx.

config PPC_BOOK3S_6xx
	bool "512x/52xx/6xx/7xx/74xx/82xx/83xx/86xx except 601"
	select PPC_BOOK3S_32
	select PPC_FPU
	select PPC_HAVE_PMU_SUPPORT
	select PPC_HAVE_KUEP
	select PPC_HAVE_KUAP
	select HAVE_ARCH_VMAP_STACK

config PPC_BOOK3S_601
	bool "PowerPC 601"
	select PPC_BOOK3S_32
	select PPC_FPU
	select PPC_HAVE_KUAP
	select HAVE_ARCH_VMAP_STACK

config PPC_85xx
	bool "Freescale 85xx"
	select E500

config PPC_8xx
	bool "Freescale 8xx"
	select FSL_SOC
	select SYS_SUPPORTS_HUGETLBFS
	select PPC_HAVE_KUEP
	select PPC_HAVE_KUAP
	select PPC_MM_SLICES if HUGETLB_PAGE
	select HAVE_ARCH_VMAP_STACK

config 40x
	bool "AMCC 40x"
	select PPC_DCR_NATIVE
	select PPC_UDBG_16550
	select 4xx_SOC
	select HAVE_PCI

config 44x
	bool "AMCC 44x, 46x or 47x"
	select PPC_DCR_NATIVE
	select PPC_UDBG_16550
	select 4xx_SOC
	select HAVE_PCI
	select PHYS_64BIT

config E200
	bool "Freescale e200"

endchoice

choice
	prompt "Processor Type"
	depends on PPC64
	help
	  There are two families of 64 bit PowerPC chips supported.
	  The most common ones are the desktop and server CPUs
	  (POWER5, 970, POWER5+, POWER6, POWER7, POWER8, POWER9 ...)

	  The other are the "embedded" processors compliant with the
	  "Book 3E" variant of the architecture

config PPC_BOOK3S_64
	bool "Server processors"
	select PPC_FPU
	select PPC_HAVE_PMU_SUPPORT
	select SYS_SUPPORTS_HUGETLBFS
	select HAVE_ARCH_TRANSPARENT_HUGEPAGE
	select ARCH_ENABLE_THP_MIGRATION if TRANSPARENT_HUGEPAGE
	select ARCH_SUPPORTS_NUMA_BALANCING
	select IRQ_WORK
	select PPC_MM_SLICES

config PPC_BOOK3E_64
	bool "Embedded processors"
	select PPC_FPU # Make it a choice ?
	select PPC_SMP_MUXED_IPI
	select PPC_DOORBELL

endchoice

choice
	prompt "CPU selection"
	default GENERIC_CPU
	help
	  This will create a kernel which is optimised for a particular CPU.
	  The resulting kernel may not run on other CPUs, so use this with care.

	  If unsure, select Generic.

config GENERIC_CPU
	bool "Generic (POWER4 and above)"
	depends on PPC64 && !CPU_LITTLE_ENDIAN

config GENERIC_CPU
	bool "Generic (POWER8 and above)"
	depends on PPC64 && CPU_LITTLE_ENDIAN
	select ARCH_HAS_FAST_MULTIPLIER

config GENERIC_CPU
	bool "Generic 32 bits powerpc"
	depends on PPC32 && !PPC_8xx

config CELL_CPU
	bool "Cell Broadband Engine"
	depends on PPC_BOOK3S_64 && !CPU_LITTLE_ENDIAN

config POWER5_CPU
	bool "POWER5"
	depends on PPC_BOOK3S_64 && !CPU_LITTLE_ENDIAN

config POWER6_CPU
	bool "POWER6"
	depends on PPC_BOOK3S_64 && !CPU_LITTLE_ENDIAN

config POWER7_CPU
	bool "POWER7"
	depends on PPC_BOOK3S_64
	select ARCH_HAS_FAST_MULTIPLIER

config POWER8_CPU
	bool "POWER8"
	depends on PPC_BOOK3S_64
	select ARCH_HAS_FAST_MULTIPLIER

config POWER9_CPU
	bool "POWER9"
	depends on PPC_BOOK3S_64
	select ARCH_HAS_FAST_MULTIPLIER

config E5500_CPU
	bool "Freescale e5500"
	depends on E500

config E6500_CPU
	bool "Freescale e6500"
	depends on E500

config 860_CPU
	bool "8xx family"
	depends on PPC_8xx

config E300C2_CPU
	bool "e300c2 (832x)"
	depends on PPC_BOOK3S_32

config E300C3_CPU
	bool "e300c3 (831x)"
	depends on PPC_BOOK3S_32

config G4_CPU
	bool "G4 (74xx)"
	depends on PPC_BOOK3S_32
	select ALTIVEC

endchoice

config TARGET_CPU_BOOL
	bool
	default !GENERIC_CPU

config TARGET_CPU
	string
	depends on TARGET_CPU_BOOL
	default "cell" if CELL_CPU
	default "power5" if POWER5_CPU
	default "power6" if POWER6_CPU
	default "power7" if POWER7_CPU
	default "power8" if POWER8_CPU
	default "power9" if POWER9_CPU
	default "860" if 860_CPU
	default "e300c2" if E300C2_CPU
	default "e300c3" if E300C3_CPU
	default "G4" if G4_CPU

config PPC_BOOK3S
	def_bool y
	depends on PPC_BOOK3S_32 || PPC_BOOK3S_64

config PPC_BOOK3E
	def_bool y
	depends on PPC_BOOK3E_64

config E500
	select FSL_EMB_PERFMON
	select PPC_FSL_BOOK3E
	bool

config PPC_E500MC
	bool "e500mc Support"
	select PPC_FPU
	select COMMON_CLK
	depends on E500
	help
	  This must be enabled for running on e500mc (and derivatives
	  such as e5500/e6500), and must be disabled for running on
	  e500v1 or e500v2.

config PPC_FPU
	bool
	default y if PPC64

config FSL_EMB_PERFMON
	bool "Freescale Embedded Perfmon"
	depends on E500 || PPC_83xx
	help
	  This is the Performance Monitor support found on the e500 core
	  and some e300 cores (c3 and c4).  Select this only if your
	  core supports the Embedded Performance Monitor APU

config FSL_EMB_PERF_EVENT
	bool
	depends on FSL_EMB_PERFMON && PERF_EVENTS && !PPC_PERF_CTRS
	default y

config FSL_EMB_PERF_EVENT_E500
	bool
	depends on FSL_EMB_PERF_EVENT && E500
	default y

config 4xx
	bool
	depends on 40x || 44x
	default y

config BOOKE
	bool
	depends on E200 || E500 || 44x || PPC_BOOK3E
	default y

config FSL_BOOKE
	bool
	depends on (E200 || E500) && PPC32
	default y

# this is for common code between PPC32 & PPC64 FSL BOOKE
config PPC_FSL_BOOK3E
	bool
	select FSL_EMB_PERFMON
	select PPC_SMP_MUXED_IPI
	select SYS_SUPPORTS_HUGETLBFS if PHYS_64BIT || PPC64
	select PPC_DOORBELL
	default y if FSL_BOOKE

config PTE_64BIT
	bool
	depends on 44x || E500 || PPC_86xx
	default y if PHYS_64BIT

config PHYS_64BIT
	bool 'Large physical address support' if E500 || PPC_86xx
	depends on (44x || E500 || PPC_86xx) && !PPC_83xx && !PPC_82xx
	select PHYS_ADDR_T_64BIT
	---help---
	  This option enables kernel support for larger than 32-bit physical
	  addresses.  This feature may not be available on all cores.

	  If you have more than 3.5GB of RAM or so, you also need to enable
	  SWIOTLB under Kernel Options for this to work.  The actual number
	  is platform-dependent.

	  If in doubt, say N here.

config ALTIVEC
	bool "AltiVec Support"
	depends on PPC_BOOK3S_32 || PPC_BOOK3S_64 || (PPC_E500MC && PPC64)
	---help---
	  This option enables kernel support for the Altivec extensions to the
	  PowerPC processor. The kernel currently supports saving and restoring
	  altivec registers, and turning on the 'altivec enable' bit so user
	  processes can execute altivec instructions.

	  This option is only usefully if you have a processor that supports
	  altivec (G4, otherwise known as 74xx series), but does not have
	  any affect on a non-altivec cpu (it does, however add code to the
	  kernel).

	  If in doubt, say Y here.

config VSX
	bool "VSX Support"
	depends on PPC_BOOK3S_64 && ALTIVEC && PPC_FPU
	---help---

	  This option enables kernel support for the Vector Scaler extensions
	  to the PowerPC processor. The kernel currently supports saving and
	  restoring VSX registers, and turning on the 'VSX enable' bit so user
	  processes can execute VSX instructions.

	  This option is only useful if you have a processor that supports
	  VSX (P7 and above), but does not have any affect on a non-VSX
	  CPUs (it does, however add code to the kernel).

	  If in doubt, say Y here.

config SPE_POSSIBLE
	def_bool y
	depends on E200 || (E500 && !PPC_E500MC)

config SPE
	bool "SPE Support"
	depends on SPE_POSSIBLE
	default y
	---help---
	  This option enables kernel support for the Signal Processing
	  Extensions (SPE) to the PowerPC processor. The kernel currently
	  supports saving and restoring SPE registers, and turning on the
	  'spe enable' bit so user processes can execute SPE instructions.

	  This option is only useful if you have a processor that supports
	  SPE (e500, otherwise known as 85xx series), but does not have any
	  effect on a non-spe cpu (it does, however add code to the kernel).

	  If in doubt, say Y here.

config ARCH_ENABLE_SPLIT_PMD_PTLOCK
	def_bool y
	depends on PPC_BOOK3S_64

config PPC_RADIX_MMU
	bool "Radix MMU Support"
	depends on PPC_BOOK3S_64
	select ARCH_HAS_GIGANTIC_PAGE
	select PPC_HAVE_KUEP
	select PPC_HAVE_KUAP
	default y
	help
	  Enable support for the Power ISA 3.0 Radix style MMU. Currently this
	  is only implemented by IBM Power9 CPUs, if you don't have one of them
	  you can probably disable this.

config PPC_RADIX_MMU_DEFAULT
	bool "Default to using the Radix MMU when possible"
	depends on PPC_RADIX_MMU
	default y
	help
	  When the hardware supports the Radix MMU, default to using it unless
	  "disable_radix[=yes]" is specified on the kernel command line.

	  If this option is disabled, the Hash MMU will be used by default,
	  unless "disable_radix=no" is specified on the kernel command line.

	  If you're unsure, say Y.

config PPC_HAVE_KUEP
	bool

config PPC_KUEP
	bool "Kernel Userspace Execution Prevention"
	depends on PPC_HAVE_KUEP
	default y
	help
	  Enable support for Kernel Userspace Execution Prevention (KUEP)

	  If you're unsure, say Y.

config PPC_HAVE_KUAP
	bool

config PPC_KUAP
	bool "Kernel Userspace Access Protection"
	depends on PPC_HAVE_KUAP
	default y
	help
	  Enable support for Kernel Userspace Access Protection (KUAP)

	  If you're unsure, say Y.

config PPC_KUAP_DEBUG
	bool "Extra debugging for Kernel Userspace Access Protection"
	depends on PPC_HAVE_KUAP && (PPC_RADIX_MMU || PPC_32)
	help
	  Add extra debugging for Kernel Userspace Access Protection (KUAP)
	  If you're unsure, say N.

config ARCH_ENABLE_HUGEPAGE_MIGRATION
	def_bool y
	depends on PPC_BOOK3S_64 && HUGETLB_PAGE && MIGRATION


config PPC_MMU_NOHASH
	def_bool y
	depends on !PPC_BOOK3S

config PPC_MMU_NOHASH_32
	def_bool y
	depends on PPC_MMU_NOHASH && PPC32

config PPC_BOOK3E_MMU
	def_bool y
	depends on FSL_BOOKE || PPC_BOOK3E

config PPC_MM_SLICES
	bool

config PPC_HAVE_PMU_SUPPORT
	bool

config PPC_PERF_CTRS
	def_bool y
	depends on PERF_EVENTS && PPC_HAVE_PMU_SUPPORT
	help
	 This enables the powerpc-specific perf_event back-end.

config FORCE_SMP
	# Allow platforms to force SMP=y by selecting this
	bool
	select SMP

config SMP
	depends on PPC_BOOK3S || PPC_BOOK3E || FSL_BOOKE || PPC_47x
	select GENERIC_IRQ_MIGRATION
	bool "Symmetric multi-processing support" if !FORCE_SMP
	---help---
	  This enables support for systems with more than one CPU. If you have
	  a system with only one CPU, say N. If you have a system with more
	  than one CPU, say Y.  Note that the kernel does not currently
	  support SMP machines with 603/603e/603ev or PPC750 ("G3") processors
	  since they have inadequate hardware support for multiprocessor
	  operation.

	  If you say N here, the kernel will run on single and multiprocessor
	  machines, but will use only one CPU of a multiprocessor machine. If
	  you say Y here, the kernel will run on single-processor machines.
	  On a single-processor machine, the kernel will run faster if you say
	  N here.

	  If you don't know what to do here, say N.

config NR_CPUS
	int "Maximum number of CPUs (2-8192)"
	range 2 8192
	depends on SMP
	default "32" if PPC64
	default "4"

config NOT_COHERENT_CACHE
	bool
	depends on 4xx || PPC_8xx || E200 || PPC_MPC512x || \
		GAMECUBE_COMMON || AMIGAONE
	select ARCH_HAS_DMA_PREP_COHERENT
	select ARCH_HAS_SYNC_DMA_FOR_DEVICE
	select ARCH_HAS_SYNC_DMA_FOR_CPU
	select DMA_DIRECT_REMAP
	default n if PPC_47x
	default y

config CHECK_CACHE_COHERENCY
	bool

config PPC_DOORBELL
	bool

endmenu

config VDSO32
	def_bool y
	depends on PPC32 || CPU_BIG_ENDIAN
	help
	  This symbol controls whether we build the 32-bit VDSO. We obviously
	  want to do that if we're building a 32-bit kernel. If we're building
	  a 64-bit kernel then we only want a 32-bit VDSO if we're building for
	  big endian. That is because the only little endian configuration we
	  support is ppc64le which is 64-bit only.

choice
	prompt "Endianness selection"
	default CPU_BIG_ENDIAN
	help
	  This option selects whether a big endian or little endian kernel will
	  be built.

config CPU_BIG_ENDIAN
	bool "Build big endian kernel"
	help
	  Build a big endian kernel.

	  If unsure, select this option.

config CPU_LITTLE_ENDIAN
	bool "Build little endian kernel"
	depends on PPC_BOOK3S_64
	select PPC64_BOOT_WRAPPER
	help
	  Build a little endian kernel.

	  Note that if cross compiling a little endian kernel,
	  CROSS_COMPILE must point to a toolchain capable of targeting
	  little endian powerpc.

endchoice

config PPC64_BOOT_WRAPPER
	def_bool n
	depends on CPU_LITTLE_ENDIAN
