# SPDX-License-Identifier: GPL-2.0
source "arch/powerpc/platforms/Kconfig.cputype"

config PPC32
	bool
	default y if !PPC64

config 32BIT
	bool
	default y if PPC32

config 64BIT
	bool
	default y if PPC64

config ARCH_PHYS_ADDR_T_64BIT
       def_bool PPC64 || PHYS_64BIT

config ARCH_DMA_ADDR_T_64BIT
	def_bool ARCH_PHYS_ADDR_T_64BIT

config MMU
	bool
	default y

config ARCH_MMAP_RND_BITS_MAX
	# On Book3S 64, the default virtual address space for 64-bit processes
	# is 2^47 (128TB). As a maximum, allow randomisation to consume up to
	# 32T of address space (2^45), which should ensure a reasonable gap
	# between bottom-up and top-down allocations for applications that
	# consume "normal" amounts of address space. Book3S 64 only supports 64K
	# and 4K page sizes.
	default 29 if PPC_BOOK3S_64 && PPC_64K_PAGES # 29 = 45 (32T) - 16 (64K)
	default 33 if PPC_BOOK3S_64		     # 33 = 45 (32T) - 12 (4K)
	#
	# On all other 64-bit platforms (currently only Book3E), the virtual
	# address space is 2^46 (64TB). Allow randomisation to consume up to 16T
	# of address space (2^44). Only 4K page sizes are supported.
	default 32 if 64BIT	# 32 = 44 (16T) - 12 (4K)
	#
	# For 32-bit, use the compat values, as they're the same.
	default ARCH_MMAP_RND_COMPAT_BITS_MAX

config ARCH_MMAP_RND_BITS_MIN
	# Allow randomisation to consume up to 1GB of address space (2^30).
	default 14 if 64BIT && PPC_64K_PAGES	# 14 = 30 (1GB) - 16 (64K)
	default 18 if 64BIT			# 18 = 30 (1GB) - 12 (4K)
	#
	# For 32-bit, use the compat values, as they're the same.
	default ARCH_MMAP_RND_COMPAT_BITS_MIN

config ARCH_MMAP_RND_COMPAT_BITS_MAX
	# Total virtual address space for 32-bit processes is 2^31 (2GB).
	# Allow randomisation to consume up to 512MB of address space (2^29).
	default 11 if PPC_256K_PAGES	# 11 = 29 (512MB) - 18 (256K)
	default 13 if PPC_64K_PAGES	# 13 = 29 (512MB) - 16 (64K)
	default 15 if PPC_16K_PAGES 	# 15 = 29 (512MB) - 14 (16K)
	default 17			# 17 = 29 (512MB) - 12 (4K)

config ARCH_MMAP_RND_COMPAT_BITS_MIN
	# Total virtual address space for 32-bit processes is 2^31 (2GB).
	# Allow randomisation to consume up to 8MB of address space (2^23).
	default 5 if PPC_256K_PAGES	#  5 = 23 (8MB) - 18 (256K)
	default 7 if PPC_64K_PAGES	#  7 = 23 (8MB) - 16 (64K)
	default 9 if PPC_16K_PAGES	#  9 = 23 (8MB) - 14 (16K)
	default 11			# 11 = 23 (8MB) - 12 (4K)

config HAVE_SETUP_PER_CPU_AREA
	def_bool PPC64

config NEED_PER_CPU_EMBED_FIRST_CHUNK
	def_bool PPC64

config NR_IRQS
	int "Number of virtual interrupt numbers"
	range 32 32768
	default "512"
	help
	  This defines the number of virtual interrupt numbers the kernel
	  can manage. Virtual interrupt numbers are what you see in
	  /proc/interrupts. If you configure your system to have too few,
	  drivers will fail to load or worse - handle with care.

config NMI_IPI
	bool
	depends on SMP && (DEBUGGER || KEXEC_CORE || HARDLOCKUP_DETECTOR)
	default y

config PPC_WATCHDOG
	bool
	depends on HARDLOCKUP_DETECTOR
	depends on HAVE_HARDLOCKUP_DETECTOR_ARCH
	default y
	help
	  This is a placeholder when the powerpc hardlockup detector
	  watchdog is selected (arch/powerpc/kernel/watchdog.c). It is
	  seleted via the generic lockup detector menu which is why we
	  have no standalone config option for it here.

config STACKTRACE_SUPPORT
	bool
	default y

config TRACE_IRQFLAGS_SUPPORT
	bool
	default y

config LOCKDEP_SUPPORT
	bool
	default y

config RWSEM_GENERIC_SPINLOCK
	bool

config RWSEM_XCHGADD_ALGORITHM
	bool
	default y

config GENERIC_LOCKBREAK
	bool
	default y
	depends on SMP && PREEMPT

config GENERIC_HWEIGHT
	bool
	default y

config ARCH_HAS_DMA_SET_COHERENT_MASK
        bool

config PPC
	bool
	default y
	#
	# Please keep this list sorted alphabetically.
	#
	select ARCH_HAS_DEVMEM_IS_ALLOWED
	select ARCH_HAS_DMA_SET_COHERENT_MASK
	select ARCH_HAS_ELF_RANDOMIZE
	select ARCH_HAS_FORTIFY_SOURCE
	select ARCH_HAS_GCOV_PROFILE_ALL
	select ARCH_HAS_SCALED_CPUTIME		if VIRT_CPU_ACCOUNTING_NATIVE
	select ARCH_HAS_SG_CHAIN
	select ARCH_HAS_STRICT_KERNEL_RWX	if (PPC32 && !HIBERNATION)
	select ARCH_HAS_TICK_BROADCAST		if GENERIC_CLOCKEVENTS_BROADCAST
	select ARCH_HAS_UBSAN_SANITIZE_ALL
	select ARCH_HAS_ZONE_DEVICE		if PPC_BOOK3S_64
	select ARCH_HAVE_NMI_SAFE_CMPXCHG
	select ARCH_MIGHT_HAVE_PC_PARPORT
	select ARCH_MIGHT_HAVE_PC_SERIO
	select ARCH_OPTIONAL_KERNEL_RWX		if ARCH_HAS_STRICT_KERNEL_RWX
	select ARCH_SUPPORTS_ATOMIC_RMW
	select ARCH_SUPPORTS_DEFERRED_STRUCT_PAGE_INIT
	select ARCH_USE_BUILTIN_BSWAP
	select ARCH_USE_CMPXCHG_LOCKREF		if PPC64
	select ARCH_WANT_IPC_PARSE_VERSION
	select ARCH_WANT_IRQS_OFF_ACTIVATE_MM
	select ARCH_WEAK_RELEASE_ACQUIRE
	select BINFMT_ELF
	select BUILDTIME_EXTABLE_SORT
	select CLONE_BACKWARDS
	select DCACHE_WORD_ACCESS		if PPC64 && CPU_LITTLE_ENDIAN
	select EDAC_ATOMIC_SCRUB
	select EDAC_SUPPORT
	select GENERIC_ATOMIC64			if PPC32
	select GENERIC_CLOCKEVENTS
	select GENERIC_CLOCKEVENTS_BROADCAST	if SMP
	select GENERIC_CMOS_UPDATE
	select GENERIC_CPU_AUTOPROBE
	select GENERIC_CPU_VULNERABILITIES	if PPC_BARRIER_NOSPEC
	select GENERIC_IRQ_SHOW
	select GENERIC_IRQ_SHOW_LEVEL
	select GENERIC_SMP_IDLE_THREAD
	select GENERIC_STRNCPY_FROM_USER
	select GENERIC_STRNLEN_USER
	select GENERIC_TIME_VSYSCALL
	select HAVE_ARCH_AUDITSYSCALL
	select HAVE_ARCH_JUMP_LABEL
	select HAVE_ARCH_KGDB
	select HAVE_ARCH_MMAP_RND_BITS
	select HAVE_ARCH_MMAP_RND_COMPAT_BITS	if COMPAT
	select HAVE_ARCH_SECCOMP_FILTER
	select HAVE_ARCH_TRACEHOOK
	select HAVE_CBPF_JIT			if !PPC64
	select HAVE_CONTEXT_TRACKING		if PPC64
	select HAVE_DEBUG_KMEMLEAK
	select HAVE_DEBUG_STACKOVERFLOW
	select HAVE_DMA_API_DEBUG
	select HAVE_DYNAMIC_FTRACE
	select HAVE_DYNAMIC_FTRACE_WITH_REGS	if MPROFILE_KERNEL
	select HAVE_EBPF_JIT			if PPC64
	select HAVE_EFFICIENT_UNALIGNED_ACCESS	if !(CPU_LITTLE_ENDIAN && POWER7_CPU)
	select HAVE_FTRACE_MCOUNT_RECORD
	select HAVE_FUNCTION_GRAPH_TRACER
	select HAVE_FUNCTION_TRACER
	select HAVE_GCC_PLUGINS
	select HAVE_GENERIC_GUP
	select HAVE_HW_BREAKPOINT		if PERF_EVENTS && (PPC_BOOK3S || PPC_8xx)
	select HAVE_IDE
	select HAVE_IOREMAP_PROT
	select HAVE_IRQ_EXIT_ON_IRQ_STACK
	select HAVE_KERNEL_GZIP
	select HAVE_KPROBES
	select HAVE_KPROBES_ON_FTRACE
	select HAVE_KRETPROBES
	select HAVE_LIVEPATCH			if HAVE_DYNAMIC_FTRACE_WITH_REGS
	select HAVE_MEMBLOCK
	select HAVE_MEMBLOCK_NODE_MAP
	select HAVE_MOD_ARCH_SPECIFIC
	select HAVE_NMI				if PERF_EVENTS || (PPC64 && PPC_BOOK3S)
	select HAVE_HARDLOCKUP_DETECTOR_ARCH	if PPC64 && PPC_BOOK3S && SMP
	select HAVE_OPROFILE
	select HAVE_OPTPROBES			if PPC64
	select HAVE_PERF_EVENTS
	select HAVE_PERF_EVENTS_NMI		if PPC64
	select HAVE_HARDLOCKUP_DETECTOR_PERF	if PERF_EVENTS && HAVE_PERF_EVENTS_NMI && !HAVE_HARDLOCKUP_DETECTOR_ARCH
	select HAVE_PERF_REGS
	select HAVE_PERF_USER_STACK_DUMP
	select HAVE_RCU_TABLE_FREE		if SMP
	select HAVE_REGS_AND_STACK_ACCESS_API
	select HAVE_SYSCALL_TRACEPOINTS
	select HAVE_VIRT_CPU_ACCOUNTING
	select HAVE_IRQ_TIME_ACCOUNTING
	select IRQ_DOMAIN
	select IRQ_FORCED_THREADING
	select MODULES_USE_ELF_RELA
	select NO_BOOTMEM
	select OF
	select OF_DMA_DEFAULT_COHERENT		if !NOT_COHERENT_CACHE
	select OF_EARLY_FLATTREE
	select OF_RESERVED_MEM
	select OLD_SIGACTION			if PPC32
	select OLD_SIGSUSPEND
	select SPARSE_IRQ
	select SYSCTL_EXCEPTION_TRACE
	select VIRT_TO_BUS			if !PPC64
	#
	# Please keep this list sorted alphabetically.
	#

config PPC_BARRIER_NOSPEC
    bool
    default y
    depends on PPC_BOOK3S_64 || PPC_FSL_BOOK3E

config GENERIC_CSUM
	def_bool n

config EARLY_PRINTK
	bool
	default y

config PANIC_TIMEOUT
	int
	default 180

config COMPAT
	bool
	default y if PPC64
	select COMPAT_BINFMT_ELF
	select ARCH_WANT_OLD_COMPAT_IPC
	select COMPAT_OLD_SIGACTION

config SYSVIPC_COMPAT
	bool
	depends on COMPAT && SYSVIPC
	default y

# All PPC32s use generic nvram driver through ppc_md
config GENERIC_NVRAM
	bool
	default y if PPC32

config SCHED_OMIT_FRAME_POINTER
	bool
	default y

config ARCH_MAY_HAVE_PC_FDC
	bool
	default PCI

config PPC_UDBG_16550
	bool
	default n

config GENERIC_TBSYNC
	bool
	default y if PPC32 && SMP
	default n

config AUDIT_ARCH
	bool
	default y

config GENERIC_BUG
	bool
	default y
	depends on BUG

config SYS_SUPPORTS_APM_EMULATION
	default y if PMAC_APM_EMU
	bool

config EPAPR_BOOT
	bool
	help
	  Used to allow a board to specify it wants an ePAPR compliant wrapper.
	default n

config DEFAULT_UIMAGE
	bool
	help
	  Used to allow a board to specify it wants a uImage built by default
	default n

config ARCH_HIBERNATION_POSSIBLE
	bool
	default y

config ARCH_SUSPEND_POSSIBLE
	def_bool y
	depends on ADB_PMU || PPC_EFIKA || PPC_LITE5200 || PPC_83xx || \
		   (PPC_85xx && !PPC_E500MC) || PPC_86xx || PPC_PSERIES \
		   || 44x || 40x

config PPC_DCR_NATIVE
	bool
	default n

config PPC_DCR_MMIO
	bool
	default n

config PPC_DCR
	bool
	depends on PPC_DCR_NATIVE || PPC_DCR_MMIO
	default y

config PPC_OF_PLATFORM_PCI
	bool
	depends on PCI
	depends on PPC64 # not supported on 32 bits yet
	default n

config ARCH_SUPPORTS_DEBUG_PAGEALLOC
	depends on PPC32 || PPC_STD_MMU_64
	def_bool y

config ARCH_SUPPORTS_UPROBES
	def_bool y

config PPC_ADV_DEBUG_REGS
	bool
	depends on 40x || BOOKE
	default y

config PPC_ADV_DEBUG_IACS
	int
	depends on PPC_ADV_DEBUG_REGS
	default 4 if 44x
	default 2

config PPC_ADV_DEBUG_DACS
	int
	depends on PPC_ADV_DEBUG_REGS
	default 2

config PPC_ADV_DEBUG_DVCS
	int
	depends on PPC_ADV_DEBUG_REGS
	default 2 if 44x
	default 0

config PPC_ADV_DEBUG_DAC_RANGE
	bool
	depends on PPC_ADV_DEBUG_REGS && 44x
	default y

config ZONE_DMA32
	bool
	default y if PPC64

config PGTABLE_LEVELS
	int
	default 2 if !PPC64
	default 3 if PPC_64K_PAGES && !PPC_BOOK3S_64
	default 4

source "init/Kconfig"

source "kernel/Kconfig.freezer"

source "arch/powerpc/sysdev/Kconfig"
source "arch/powerpc/platforms/Kconfig"

menu "Kernel options"

config HIGHMEM
	bool "High memory support"
	depends on PPC32

source kernel/Kconfig.hz
source kernel/Kconfig.preempt
source "fs/Kconfig.binfmt"

config HUGETLB_PAGE_SIZE_VARIABLE
	bool
	depends on HUGETLB_PAGE
	default y

config MATH_EMULATION
	bool "Math emulation"
	depends on 4xx || PPC_8xx || PPC_MPC832x || BOOKE
	---help---
	  Some PowerPC chips designed for embedded applications do not have
	  a floating-point unit and therefore do not implement the
	  floating-point instructions in the PowerPC instruction set.  If you
	  say Y here, the kernel will include code to emulate a floating-point
	  unit, which will allow programs that use floating-point
	  instructions to run.

	  This is also useful to emulate missing (optional) instructions
	  such as fsqrt on cores that do have an FPU but do not implement
	  them (such as Freescale BookE).

choice
	prompt "Math emulation options"
	default MATH_EMULATION_FULL
	depends on MATH_EMULATION

config	MATH_EMULATION_FULL
	bool "Emulate all the floating point instructions"
	---help---
	  Select this option will enable the kernel to support to emulate
	  all the floating point instructions. If your SoC doesn't have
	  a FPU, you should select this.

config MATH_EMULATION_HW_UNIMPLEMENTED
	bool "Just emulate the FPU unimplemented instructions"
	---help---
	  Select this if you know there does have a hardware FPU on your
	  SoC, but some floating point instructions are not implemented by that.

endchoice

config PPC_TRANSACTIONAL_MEM
       bool "Transactional Memory support for POWERPC"
       depends on PPC_BOOK3S_64
       depends on SMP
       select ALTIVEC
       select VSX
       default n
       ---help---
         Support user-mode Transactional Memory on POWERPC.

config LD_HEAD_STUB_CATCH
	bool "Reserve 256 bytes to cope with linker stubs in HEAD text" if EXPERT
	depends on PPC64
	default n
	help
	  Very large kernels can cause linker branch stubs to be generated by
	  code in head_64.S, which moves the head text sections out of their
	  specified location. This option can work around the problem.

	  If unsure, say "N".

config DISABLE_MPROFILE_KERNEL
	bool "Disable use of mprofile-kernel for kernel tracing"
	depends on PPC64 && CPU_LITTLE_ENDIAN
	default y
	help
	  Selecting this options disables use of the mprofile-kernel ABI for
	  kernel tracing. That will cause options such as live patching
	  (CONFIG_LIVEPATCH) which depend on CONFIG_DYNAMIC_FTRACE_WITH_REGS to
	  be disabled also.

	  If you have a toolchain which supports mprofile-kernel, then you can
	  disable this. Otherwise leave it enabled. If you're not sure, say
	  "Y".

config MPROFILE_KERNEL
	depends on PPC64 && CPU_LITTLE_ENDIAN
	def_bool !DISABLE_MPROFILE_KERNEL

config IOMMU_HELPER
	def_bool PPC64

config SWIOTLB
	bool "SWIOTLB support"
	default n
	select IOMMU_HELPER
	---help---
	  Support for IO bounce buffering for systems without an IOMMU.
	  This allows us to DMA to the full physical address space on
	  platforms where the size of a physical address is larger
	  than the bus address.  Not all platforms support this.

config HOTPLUG_CPU
	bool "Support for enabling/disabling CPUs"
	depends on SMP && (PPC_PSERIES || \
	PPC_PMAC || PPC_POWERNV || FSL_SOC_BOOKE)
	---help---
	  Say Y here to be able to disable and re-enable individual
	  CPUs at runtime on SMP machines.

	  Say N if you are unsure.

config ARCH_CPU_PROBE_RELEASE
	def_bool y
	depends on HOTPLUG_CPU

config ARCH_ENABLE_MEMORY_HOTPLUG
	def_bool y

config ARCH_HAS_WALK_MEMORY
	def_bool y

config ARCH_ENABLE_MEMORY_HOTREMOVE
	def_bool y

config PPC64_SUPPORTS_MEMORY_FAILURE
	bool "Add support for memory hwpoison"
	depends on PPC_BOOK3S_64
	default "y" if PPC_POWERNV
	select ARCH_SUPPORTS_MEMORY_FAILURE

config KEXEC
	bool "kexec system call"
	depends on (PPC_BOOK3S || FSL_BOOKE || (44x && !SMP)) || PPC_BOOK3E
	select KEXEC_CORE
	help
	  kexec is a system call that implements the ability to shutdown your
	  current kernel, and to start another kernel.  It is like a reboot
	  but it is independent of the system firmware.   And like a reboot
	  you can start any kernel with it, not just Linux.

	  The name comes from the similarity to the exec system call.

	  It is an ongoing process to be certain the hardware in a machine
	  is properly shutdown, so do not be surprised if this code does not
	  initially work for you.  As of this writing the exact hardware
	  interface is strongly in flux, so no good recommendation can be
	  made.

config KEXEC_FILE
	bool "kexec file based system call"
	select KEXEC_CORE
	select HAVE_IMA_KEXEC
	select BUILD_BIN2C
	depends on PPC64
	depends on CRYPTO=y
	depends on CRYPTO_SHA256=y
	help
	  This is a new version of the kexec system call. This call is
	  file based and takes in file descriptors as system call arguments
	  for kernel and initramfs as opposed to a list of segments as is the
	  case for the older kexec call.

config RELOCATABLE
	bool "Build a relocatable kernel"
	depends on PPC64 || (FLATMEM && (44x || FSL_BOOKE))
	select NONSTATIC_KERNEL
	select MODULE_REL_CRCS if MODVERSIONS
	help
	  This builds a kernel image that is capable of running at the
	  location the kernel is loaded at. For ppc32, there is no any
	  alignment restrictions, and this feature is a superset of
	  DYNAMIC_MEMSTART and hence overrides it. For ppc64, we should use
	  16k-aligned base address. The kernel is linked as a
	  position-independent executable (PIE) and contains dynamic relocations
	  which are processed early in the bootup process.

	  One use is for the kexec on panic case where the recovery kernel
	  must live at a different physical address than the primary
	  kernel.

	  Note: If CONFIG_RELOCATABLE=y, then the kernel runs from the address
	  it has been loaded at and the compile time physical addresses
	  CONFIG_PHYSICAL_START is ignored.  However CONFIG_PHYSICAL_START
	  setting can still be useful to bootwrappers that need to know the
	  load address of the kernel (eg. u-boot/mkimage).

config RELOCATABLE_TEST
	bool "Test relocatable kernel"
	depends on (PPC64 && RELOCATABLE)
	default n
	help
	  This runs the relocatable kernel at the address it was initially
	  loaded at, which tends to be non-zero and therefore test the
	  relocation code.

config CRASH_DUMP
	bool "Build a dump capture kernel"
	depends on PPC64 || 6xx || FSL_BOOKE || (44x && !SMP)
	select RELOCATABLE if PPC64 || 44x || FSL_BOOKE
	help
	  Build a kernel suitable for use as a dump capture kernel.
	  The same kernel binary can be used as production kernel and dump
	  capture kernel.

config FA_DUMP
	bool "Firmware-assisted dump"
	depends on PPC64 && PPC_RTAS
	select CRASH_CORE
	select CRASH_DUMP
	help
	  A robust mechanism to get reliable kernel crash dump with
	  assistance from firmware. This approach does not use kexec,
	  instead firmware assists in booting the capture kernel
	  while preserving memory contents. Firmware-assisted dump
	  is meant to be a kdump replacement offering robustness and
	  speed not possible without system firmware assistance.

	  If unsure, say "N"

config IRQ_ALL_CPUS
	bool "Distribute interrupts on all CPUs by default"
	depends on SMP
	help
	  This option gives the kernel permission to distribute IRQs across
	  multiple CPUs.  Saying N here will route all IRQs to the first
	  CPU.  Generally saying Y is safe, although some problems have been
	  reported with SMP Power Macintoshes with this option enabled.

config NUMA
	bool "NUMA support"
	depends on PPC64
	default y if SMP && PPC_PSERIES

config NODES_SHIFT
	int
	default "8" if PPC64
	default "4"
	depends on NEED_MULTIPLE_NODES

config USE_PERCPU_NUMA_NODE_ID
	def_bool y
	depends on NUMA

config HAVE_MEMORYLESS_NODES
	def_bool y
	depends on NUMA

config ARCH_SELECT_MEMORY_MODEL
	def_bool y
	depends on PPC64

config ARCH_FLATMEM_ENABLE
	def_bool y
	depends on (PPC64 && !NUMA) || PPC32

config ARCH_SPARSEMEM_ENABLE
	def_bool y
	depends on PPC64
	select SPARSEMEM_VMEMMAP_ENABLE

config ARCH_SPARSEMEM_DEFAULT
	def_bool y
	depends on PPC_BOOK3S_64

config SYS_SUPPORTS_HUGETLBFS
	bool

config ILLEGAL_POINTER_VALUE
	hex
	# This is roughly half way between the top of user space and the bottom
	# of kernel space, which seems about as good as we can get.
	default 0x5deadbeef0000000 if PPC64
	default 0

source "mm/Kconfig"

config ARCH_MEMORY_PROBE
	def_bool y
	depends on MEMORY_HOTPLUG

# Some NUMA nodes have memory ranges that span
# other nodes.  Even though a pfn is valid and
# between a node's start and end pfns, it may not
# reside on that node.  See memmap_init_zone()
# for details.
config NODES_SPAN_OTHER_NODES
	def_bool y
	depends on NEED_MULTIPLE_NODES

config STDBINUTILS
	bool "Using standard binutils settings"
	depends on 44x
	default y
	help
	  Turning this option off allows you to select 256KB PAGE_SIZE on 44x.
	  Note, that kernel will be able to run only those applications,
	  which had been compiled using binutils later than 2.17.50.0.3 with
	  '-zmax-page-size' set to 256K (the default is 64K). Or, if using
	  the older binutils, you can patch them with a trivial patch, which
	  changes the ELF_MAXPAGESIZE definition from 0x10000 to 0x40000.

choice
	prompt "Page size"
	default PPC_4K_PAGES
	help
	  Select the kernel logical page size. Increasing the page size
	  will reduce software overhead at each page boundary, allow
	  hardware prefetch mechanisms to be more effective, and allow
	  larger dma transfers increasing IO efficiency and reducing
	  overhead. However the utilization of memory will increase.
	  For example, each cached file will using a multiple of the
	  page size to hold its contents and the difference between the
	  end of file and the end of page is wasted.

	  Some dedicated systems, such as software raid serving with
	  accelerated calculations, have shown significant increases.

	  If you configure a 64 bit kernel for 64k pages but the
	  processor does not support them, then the kernel will simulate
	  them with 4k pages, loading them on demand, but with the
	  reduced software overhead and larger internal fragmentation.
	  For the 32 bit kernel, a large page option will not be offered
	  unless it is supported by the configured processor.

	  If unsure, choose 4K_PAGES.

config PPC_4K_PAGES
	bool "4k page size"
	select HAVE_ARCH_SOFT_DIRTY if PPC_BOOK3S_64

config PPC_16K_PAGES
	bool "16k page size"
	depends on 44x || PPC_8xx

config PPC_64K_PAGES
	bool "64k page size"
	depends on !PPC_FSL_BOOK3E && (44x || PPC_STD_MMU_64 || PPC_BOOK3E_64)
	select HAVE_ARCH_SOFT_DIRTY if PPC_BOOK3S_64

config PPC_256K_PAGES
	bool "256k page size"
	depends on 44x && !STDBINUTILS && !PPC_47x
	help
	  Make the page size 256k.

	  As the ELF standard only requires alignment to support page
	  sizes up to 64k, you will need to compile all of your user
	  space applications with a non-standard binutils settings
	  (see the STDBINUTILS description for details).

	  Say N unless you know what you are doing.

endchoice

config THREAD_SHIFT
	int "Thread shift" if EXPERT
	range 13 15
	default "15" if PPC_256K_PAGES
	default "14" if PPC64
	default "13"
	help
	  Used to define the stack size. The default is almost always what you
	  want. Only change this if you know what you are doing.

config FORCE_MAX_ZONEORDER
	int "Maximum zone order"
	range 8 9 if PPC64 && PPC_64K_PAGES
	default "9" if PPC64 && PPC_64K_PAGES
	range 13 13 if PPC64 && !PPC_64K_PAGES
	default "13" if PPC64 && !PPC_64K_PAGES
	range 9 64 if PPC32 && PPC_16K_PAGES
	default "9" if PPC32 && PPC_16K_PAGES
	range 7 64 if PPC32 && PPC_64K_PAGES
	default "7" if PPC32 && PPC_64K_PAGES
	range 5 64 if PPC32 && PPC_256K_PAGES
	default "5" if PPC32 && PPC_256K_PAGES
	range 11 64
	default "11"
	help
	  The kernel memory allocator divides physically contiguous memory
	  blocks into "zones", where each zone is a power of two number of
	  pages.  This option selects the largest power of two that the kernel
	  keeps in the memory allocator.  If you need to allocate very large
	  blocks of physically contiguous memory, then you may need to
	  increase this value.

	  This config option is actually maximum order plus one. For example,
	  a value of 11 means that the largest free memory block is 2^10 pages.

	  The page size is not necessarily 4KB.  For example, on 64-bit
	  systems, 64KB pages can be enabled via CONFIG_PPC_64K_PAGES.  Keep
	  this in mind when choosing a value for this option.

config PPC_SUBPAGE_PROT
	bool "Support setting protections for 4k subpages"
	depends on PPC_STD_MMU_64 && PPC_64K_PAGES
	help
	  This option adds support for a system call to allow user programs
	  to set access permissions (read/write, readonly, or no access)
	  on the 4k subpages of each 64k page.

config PPC_COPRO_BASE
	bool
	default n

config SCHED_SMT
	bool "SMT (Hyperthreading) scheduler support"
	depends on PPC64 && SMP
	help
	  SMT scheduler support improves the CPU scheduler's decision making
	  when dealing with POWER5 cpus at a cost of slightly increased
	  overhead in some places. If unsure say N here.

config PPC_DENORMALISATION
	bool "PowerPC denormalisation exception handling"
	depends on PPC_BOOK3S_64
	default "y" if PPC_POWERNV
	---help---
	  Add support for handling denormalisation of single precision
	  values.  Useful for bare metal only.  If unsure say Y here.

config CMDLINE_BOOL
	bool "Default bootloader kernel arguments"

config CMDLINE
	string "Initial kernel command string"
	depends on CMDLINE_BOOL
	default "console=ttyS0,9600 console=tty0 root=/dev/sda2"
	help
	  On some platforms, there is currently no way for the boot loader to
	  pass arguments to the kernel. For these platforms, you can supply
	  some command-line options at build time by entering them here.  In
	  most cases you will need to specify the root device here.

config CMDLINE_FORCE
	bool "Always use the default kernel command string"
	depends on CMDLINE_BOOL
	help
	  Always use the default kernel command string, even if the boot
	  loader passes other arguments to the kernel.
	  This is useful if you cannot or don't want to change the
	  command-line options your boot loader passes to the kernel.

config EXTRA_TARGETS
	string "Additional default image types"
	help
	  List additional targets to be built by the bootwrapper here (separated
	  by spaces).  This is useful for targets that depend of device tree
	  files in the .dts directory.

	  Targets in this list will be build as part of the default build
	  target, or when the user does a 'make zImage' or a
	  'make zImage.initrd'.

	  If unsure, leave blank

config ARCH_WANTS_FREEZER_CONTROL
	def_bool y
	depends on ADB_PMU

source kernel/power/Kconfig

config SECCOMP
	bool "Enable seccomp to safely compute untrusted bytecode"
	depends on PROC_FS
	default y
	help
	  This kernel feature is useful for number crunching applications
	  that may need to compute untrusted bytecode during their
	  execution. By using pipes or other transports made available to
	  the process as file descriptors supporting the read/write
	  syscalls, it's possible to isolate those applications in
	  their own address space using seccomp. Once seccomp is
	  enabled via /proc/<pid>/seccomp, it cannot be disabled
	  and the task is only allowed to execute a few safe syscalls
	  defined by each seccomp mode.

	  If unsure, say Y. Only embedded should say N here.

endmenu

config ISA_DMA_API
	bool
	default PCI

menu "Bus options"

config ISA
	bool "Support for ISA-bus hardware"
	depends on PPC_CHRP
	select PPC_I8259
	help
	  Find out whether you have ISA slots on your motherboard.  ISA is the
	  name of a bus system, i.e. the way the CPU talks to the other stuff
	  inside your box.  If you have an Apple machine, say N here; if you
	  have an IBM RS/6000 or pSeries machine, say Y.  If you have an
	  embedded board, consult your board documentation.

config ZONE_DMA
	bool
	default y

config NEED_DMA_MAP_STATE
	def_bool (PPC64 || NOT_COHERENT_CACHE)

config NEED_SG_DMA_LENGTH
	def_bool y

config GENERIC_ISA_DMA
	bool
	depends on ISA_DMA_API
	default y

config PPC_INDIRECT_PCI
	bool
	depends on PCI
	default y if 40x || 44x
	default n

config EISA
	bool

config SBUS
	bool

config FSL_SOC
	bool

config FSL_PCI
 	bool
	select PPC_INDIRECT_PCI
	select PCI_QUIRKS

config FSL_PMC
	bool
	default y
	depends on SUSPEND && (PPC_85xx || PPC_86xx)
	help
	  Freescale MPC85xx/MPC86xx power management controller support
	  (suspend/resume). For MPC83xx see platforms/83xx/suspend.c

config PPC4xx_CPM
	bool
	default y
	depends on SUSPEND && (44x || 40x)
	help
	  PPC4xx Clock Power Management (CPM) support (suspend/resume).
	  It also enables support for two different idle states (idle-wait
	  and idle-doze).

config 4xx_SOC
	bool

config FSL_LBC
	bool "Freescale Local Bus support"
	help
	  Enables reporting of errors from the Freescale local bus
	  controller.  Also contains some common code used by
	  drivers for specific local bus peripherals.

config FSL_GTM
	bool
	depends on PPC_83xx || QUICC_ENGINE || CPM2
	help
	  Freescale General-purpose Timers support

# Yes MCA RS/6000s exist but Linux-PPC does not currently support any
config MCA
	bool

# Platforms that what PCI turned unconditionally just do select PCI
# in their config node.  Platforms that want to choose at config
# time should select PPC_PCI_CHOICE
config PPC_PCI_CHOICE
	bool

config PCI
	bool "PCI support" if PPC_PCI_CHOICE
	default y if !40x && !CPM2 && !PPC_8xx && !PPC_83xx \
		&& !PPC_85xx && !PPC_86xx && !GAMECUBE_COMMON
	default PCI_QSPAN if PPC_8xx
	select GENERIC_PCI_IOMAP
	help
	  Find out whether your system includes a PCI bus. PCI is the name of
	  a bus system, i.e. the way the CPU talks to the other stuff inside
	  your box.  If you say Y here, the kernel will include drivers and
	  infrastructure code to support PCI bus devices.

config PCI_DOMAINS
	def_bool PCI

config PCI_SYSCALL
	def_bool PCI

config PCI_QSPAN
	bool "QSpan PCI"
	depends on PPC_8xx
	select PPC_I8259
	help
	  Say Y here if you have a system based on a Motorola 8xx-series
	  embedded processor with a QSPAN PCI interface, otherwise say N.

config PCI_8260
	bool
	depends on PCI && 8260
	select PPC_INDIRECT_PCI
	default y

source "drivers/pci/Kconfig"

source "drivers/pcmcia/Kconfig"

config HAS_RAPIDIO
	bool
	default n

config RAPIDIO
	tristate "RapidIO support"
	depends on HAS_RAPIDIO || PCI
	help
	  If you say Y here, the kernel will include drivers and
	  infrastructure code to support RapidIO interconnect devices.

config FSL_RIO
	bool "Freescale Embedded SRIO Controller support"
	depends on RAPIDIO = y && HAS_RAPIDIO
	default "n"
	---help---
	  Include support for RapidIO controller on Freescale embedded
	  processors (MPC8548, MPC8641, etc).

source "drivers/rapidio/Kconfig"

config PPC_RTAS_FILTER
	bool "Enable filtering of RTAS syscalls"
	default y
	depends on PPC_RTAS
	help
	  The RTAS syscall API has security issues that could be used to
	  compromise system integrity. This option enforces restrictions on the
	  RTAS calls and arguments passed by userspace programs to mitigate
	  these issues.

	  Say Y unless you know what you are doing and the filter is causing
	  problems for you.

endmenu

config NONSTATIC_KERNEL
	bool
	default n

menu "Advanced setup"
	depends on PPC32

config ADVANCED_OPTIONS
	bool "Prompt for advanced kernel configuration options"
	help
	  This option will enable prompting for a variety of advanced kernel
	  configuration options.  These options can cause the kernel to not
	  work if they are set incorrectly, but can be used to optimize certain
	  aspects of kernel memory management.

	  Unless you know what you are doing, say N here.

comment "Default settings for advanced configuration options are used"
	depends on !ADVANCED_OPTIONS

config LOWMEM_SIZE_BOOL
	bool "Set maximum low memory"
	depends on ADVANCED_OPTIONS
	help
	  This option allows you to set the maximum amount of memory which
	  will be used as "low memory", that is, memory which the kernel can
	  access directly, without having to set up a kernel virtual mapping.
	  This can be useful in optimizing the layout of kernel virtual
	  memory.

	  Say N here unless you know what you are doing.

config LOWMEM_SIZE
	hex "Maximum low memory size (in bytes)" if LOWMEM_SIZE_BOOL
	default "0x30000000"

config LOWMEM_CAM_NUM_BOOL
	bool "Set number of CAMs to use to map low memory"
	depends on ADVANCED_OPTIONS && FSL_BOOKE
	help
	  This option allows you to set the maximum number of CAM slots that
	  will be used to map low memory.  There are a limited number of slots
	  available and even more limited number that will fit in the L1 MMU.
	  However, using more entries will allow mapping more low memory.  This
	  can be useful in optimizing the layout of kernel virtual memory.

	  Say N here unless you know what you are doing.

config LOWMEM_CAM_NUM
	depends on FSL_BOOKE
	int "Number of CAMs to use to map low memory" if LOWMEM_CAM_NUM_BOOL
	default 3

config DYNAMIC_MEMSTART
	bool "Enable page aligned dynamic load address for kernel"
	depends on ADVANCED_OPTIONS && FLATMEM && (FSL_BOOKE || 44x)
	select NONSTATIC_KERNEL
	help
	  This option enables the kernel to be loaded at any page aligned
	  physical address. The kernel creates a mapping from KERNELBASE to 
	  the address where the kernel is loaded. The page size here implies
	  the TLB page size of the mapping for kernel on the particular platform.
	  Please refer to the init code for finding the TLB page size.

	  DYNAMIC_MEMSTART is an easy way of implementing pseudo-RELOCATABLE
	  kernel image, where the only restriction is the page aligned kernel
	  load address. When this option is enabled, the compile time physical 
	  address CONFIG_PHYSICAL_START is ignored.

	  This option is overridden by CONFIG_RELOCATABLE

config PAGE_OFFSET_BOOL
	bool "Set custom page offset address"
	depends on ADVANCED_OPTIONS
	help
	  This option allows you to set the kernel virtual address at which
	  the kernel will map low memory.  This can be useful in optimizing
	  the virtual memory layout of the system.

	  Say N here unless you know what you are doing.

config PAGE_OFFSET
	hex "Virtual address of memory base" if PAGE_OFFSET_BOOL
	default "0xc0000000"

config KERNEL_START_BOOL
	bool "Set custom kernel base address"
	depends on ADVANCED_OPTIONS
	help
	  This option allows you to set the kernel virtual address at which
	  the kernel will be loaded.  Normally this should match PAGE_OFFSET
	  however there are times (like kdump) that one might not want them
	  to be the same.

	  Say N here unless you know what you are doing.

config KERNEL_START
	hex "Virtual address of kernel base" if KERNEL_START_BOOL
	default PAGE_OFFSET if PAGE_OFFSET_BOOL
	default "0xc2000000" if CRASH_DUMP && !NONSTATIC_KERNEL
	default "0xc0000000"

config PHYSICAL_START_BOOL
	bool "Set physical address where the kernel is loaded"
	depends on ADVANCED_OPTIONS && FLATMEM && FSL_BOOKE
	help
	  This gives the physical address where the kernel is loaded.

	  Say N here unless you know what you are doing.

config PHYSICAL_START
	hex "Physical address where the kernel is loaded" if PHYSICAL_START_BOOL
	default "0x02000000" if PPC_STD_MMU && CRASH_DUMP && !NONSTATIC_KERNEL
	default "0x00000000"

config PHYSICAL_ALIGN
	hex
	default "0x04000000" if FSL_BOOKE
	help
	  This value puts the alignment restrictions on physical address
	  where kernel is loaded and run from. Kernel is compiled for an
	  address which meets above alignment restriction.

config TASK_SIZE_BOOL
	bool "Set custom user task size"
	depends on ADVANCED_OPTIONS
	help
	  This option allows you to set the amount of virtual address space
	  allocated to user tasks.  This can be useful in optimizing the
	  virtual memory layout of the system.

	  Say N here unless you know what you are doing.

config TASK_SIZE
	hex "Size of user task space" if TASK_SIZE_BOOL
	default "0x80000000" if PPC_8xx
	default "0xc0000000"

config CONSISTENT_SIZE_BOOL
	bool "Set custom consistent memory pool size"
	depends on ADVANCED_OPTIONS && NOT_COHERENT_CACHE
	help
	  This option allows you to set the size of the
	  consistent memory pool.  This pool of virtual memory
	  is used to make consistent memory allocations.

config CONSISTENT_SIZE
	hex "Size of consistent memory pool" if CONSISTENT_SIZE_BOOL
	default "0x00200000" if NOT_COHERENT_CACHE

config PIN_TLB
	bool "Pinned Kernel TLBs (860 ONLY)"
	depends on ADVANCED_OPTIONS && PPC_8xx && \
		   !DEBUG_PAGEALLOC && !STRICT_KERNEL_RWX

config PIN_TLB_DATA
	bool "Pinned TLB for DATA"
	depends on PIN_TLB
	default y

config PIN_TLB_IMMR
	bool "Pinned TLB for IMMR"
	depends on PIN_TLB
	default y

config PIN_TLB_TEXT
	bool "Pinned TLB for TEXT"
	depends on PIN_TLB
	default y
endmenu

if PPC64
# This value must have zeroes in the bottom 60 bits otherwise lots will break
config PAGE_OFFSET
	hex
	default "0xc000000000000000"
config KERNEL_START
	hex
	default "0xc000000000000000"
config PHYSICAL_START
	hex
	default "0x00000000"
endif

config	ARCH_RANDOM
	def_bool n

source "net/Kconfig"

source "drivers/Kconfig"

source "fs/Kconfig"

source "lib/Kconfig"

source "arch/powerpc/Kconfig.debug"

source "security/Kconfig"

source "crypto/Kconfig"

config PPC_LIB_RHEAP
	bool

source "arch/powerpc/kvm/Kconfig"

source "kernel/livepatch/Kconfig"
