# SPDX-License-Identifier: GPL-2.0
config PGTABLE_LEVELS
	int "Page Table Levels" if !IA64_PAGE_SIZE_64KB
	range 3 4 if !IA64_PAGE_SIZE_64KB
	default 3

menu "Processor type and features"

config IA64
	bool
	select ARCH_MIGHT_HAVE_PC_PARPORT
	select ARCH_MIGHT_HAVE_PC_SERIO
	select ACPI
	select ACPI_NUMA if NUMA
	select ARCH_SUPPORTS_ACPI
	select ACPI_SYSTEM_POWER_STATES_SUPPORT if ACPI
	select ARCH_MIGHT_HAVE_ACPI_PDC if ACPI
	select FORCE_PCI
	select PCI_DOMAINS if PCI
	select PCI_MSI
	select PCI_SYSCALL if PCI
	select HAVE_ASM_MODVERSIONS
	select HAVE_UNSTABLE_SCHED_CLOCK
	select HAVE_EXIT_THREAD
	select HAVE_IDE
	select HAVE_OPROFILE
	select HAVE_KPROBES
	select HAVE_KRETPROBES
	select HAVE_FTRACE_MCOUNT_RECORD
	select HAVE_DYNAMIC_FTRACE if (!ITANIUM)
	select HAVE_FUNCTION_TRACER
	select TTY
	select HAVE_ARCH_TRACEHOOK
	select HAVE_MEMBLOCK_NODE_MAP
	select HAVE_VIRT_CPU_ACCOUNTING
	select ARCH_HAS_DMA_COHERENT_TO_PFN
	select ARCH_HAS_SYNC_DMA_FOR_CPU
	select VIRT_TO_BUS
	select GENERIC_IRQ_PROBE
	select GENERIC_PENDING_IRQ if SMP
	select GENERIC_IRQ_SHOW
	select GENERIC_IRQ_LEGACY
	select ARCH_HAVE_NMI_SAFE_CMPXCHG
	select GENERIC_IOMAP
	select GENERIC_SMP_IDLE_THREAD
	select ARCH_TASK_STRUCT_ON_STACK
	select ARCH_TASK_STRUCT_ALLOCATOR
	select ARCH_THREAD_STACK_ALLOCATOR
	select ARCH_CLOCKSOURCE_DATA
	select GENERIC_TIME_VSYSCALL
	select SWIOTLB
	select SYSCTL_ARCH_UNALIGN_NO_WARN
	select HAVE_MOD_ARCH_SPECIFIC
	select MODULES_USE_ELF_RELA
	select ARCH_USE_CMPXCHG_LOCKREF
	select HAVE_ARCH_AUDITSYSCALL
	select NEED_DMA_MAP_STATE
	select NEED_SG_DMA_LENGTH
	select NUMA if !FLATMEM
	default y
	help
	  The Itanium Processor Family is Intel's 64-bit successor to
	  the 32-bit X86 line.  The IA-64 Linux project has a home
	  page at <http://www.linuxia64.org/> and a mailing list at
	  <linux-ia64@vger.kernel.org>.

config 64BIT
	bool
	select ATA_NONSTANDARD if ATA
	default y

config ZONE_DMA32
	def_bool y

config QUICKLIST
	bool
	default y

config MMU
	bool
	default y

config STACKTRACE_SUPPORT
	def_bool y

config GENERIC_LOCKBREAK
	def_bool n

config HUGETLB_PAGE_SIZE_VARIABLE
	bool
	depends on HUGETLB_PAGE
	default y

config GENERIC_CALIBRATE_DELAY
	bool
	default y

config HAVE_SETUP_PER_CPU_AREA
	def_bool y

config DMI
	bool
	default y
	select DMI_SCAN_MACHINE_NON_EFI_FALLBACK

config EFI
	bool
	select UCS2_STRING
	default y

config SCHED_OMIT_FRAME_POINTER
	bool
	default y

config IA64_UNCACHED_ALLOCATOR
	bool
	select GENERIC_ALLOCATOR

config ARCH_USES_PG_UNCACHED
	def_bool y
	depends on IA64_UNCACHED_ALLOCATOR

config AUDIT_ARCH
	bool
	default y

choice
	prompt "Processor type"
	default ITANIUM

config ITANIUM
	bool "Itanium"
	help
	  Select your IA-64 processor type.  The default is Itanium.
	  This choice is safe for all IA-64 systems, but may not perform
	  optimally on systems with, say, Itanium 2 or newer processors.

config MCKINLEY
	bool "Itanium 2"
	help
	  Select this to configure for an Itanium 2 (McKinley) processor.

endchoice

choice
	prompt "Kernel page size"
	default IA64_PAGE_SIZE_16KB

config IA64_PAGE_SIZE_4KB
	bool "4KB"
	help
	  This lets you select the page size of the kernel.  For best IA-64
	  performance, a page size of 8KB or 16KB is recommended.  For best
	  IA-32 compatibility, a page size of 4KB should be selected (the vast
	  majority of IA-32 binaries work perfectly fine with a larger page
	  size).  For Itanium 2 or newer systems, a page size of 64KB can also
	  be selected.

	  4KB                For best IA-32 compatibility
	  8KB                For best IA-64 performance
	  16KB               For best IA-64 performance
	  64KB               Requires Itanium 2 or newer processor.

	  If you don't know what to do, choose 16KB.

config IA64_PAGE_SIZE_8KB
	bool "8KB"

config IA64_PAGE_SIZE_16KB
	bool "16KB"

config IA64_PAGE_SIZE_64KB
	depends on !ITANIUM
	bool "64KB"

endchoice

source "kernel/Kconfig.hz"

config IA64_BRL_EMU
	bool
	depends on ITANIUM
	default y

# align cache-sensitive data to 128 bytes
config IA64_L1_CACHE_SHIFT
	int
	default "7" if MCKINLEY
	default "6" if ITANIUM

config IA64_SGI_UV
	bool "SGI-UV support"
	help
	  Selecting this option will add specific support for running on SGI
	  UV based systems.  If you have an SGI UV system or are building a
	  distro kernel, select this option.

config IA64_HP_SBA_IOMMU
	bool "HP SBA IOMMU support"
	default y
	help
	  Say Y here to add support for the SBA IOMMU found on HP zx1 and
	  sx1000 systems.  If you're unsure, answer Y.

config IA64_CYCLONE
	bool "Cyclone (EXA) Time Source support"
	help
	  Say Y here to enable support for IBM EXA Cyclone time source.
	  If you're unsure, answer N.

config FORCE_MAX_ZONEORDER
	int "MAX_ORDER (11 - 17)"  if !HUGETLB_PAGE
	range 11 17  if !HUGETLB_PAGE
	default "17" if HUGETLB_PAGE
	default "11"

config SMP
	bool "Symmetric multi-processing support"
	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.

	  If you say N here, the kernel will run on single and multiprocessor
	  systems, but will use only one CPU of a multiprocessor system.  If
	  you say Y here, the kernel will run on many, but not all,
	  single processor systems.  On a single processor system, the kernel
	  will run faster if you say N here.

	  See also the SMP-HOWTO available at
	  <http://www.tldp.org/docs.html#howto>.

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

config NR_CPUS
	int "Maximum number of CPUs (2-4096)"
	range 2 4096
	depends on SMP
	default "4096"
	help
	  You should set this to the number of CPUs in your system, but
	  keep in mind that a kernel compiled for, e.g., 2 CPUs will boot but
	  only use 2 CPUs on a >2 CPU system.  Setting this to a value larger
	  than 64 will cause the use of a CPU mask array, causing a small
	  performance hit.

config HOTPLUG_CPU
	bool "Support for hot-pluggable CPUs"
	depends on SMP
	default n
	---help---
	  Say Y here to experiment with turning CPUs off and on.  CPUs
	  can be controlled through /sys/devices/system/cpu/cpu#.
	  Say N if you want to disable CPU hotplug.

config ARCH_ENABLE_MEMORY_HOTPLUG
	def_bool y

config ARCH_ENABLE_MEMORY_HOTREMOVE
	def_bool y

config SCHED_SMT
	bool "SMT scheduler support"
	depends on SMP
	help
	  Improves the CPU scheduler's decision making when dealing with
	  Intel IA64 chips with MultiThreading at a cost of slightly increased
	  overhead in some places. If unsure say N here.

config PERMIT_BSP_REMOVE
	bool "Support removal of Bootstrap Processor"
	depends on HOTPLUG_CPU
	default n
	---help---
	Say Y here if your platform SAL will support removal of BSP with HOTPLUG_CPU
	support. 

config FORCE_CPEI_RETARGET
	bool "Force assumption that CPEI can be re-targeted"
	depends on PERMIT_BSP_REMOVE
	default n
	---help---
	Say Y if you need to force the assumption that CPEI can be re-targeted to
	any cpu in the system. This hint is available via ACPI 3.0 specifications.
	Tiger4 systems are capable of re-directing CPEI to any CPU other than BSP.
	This option it useful to enable this feature on older BIOS's as well.
	You can also enable this by using boot command line option force_cpei=1.

config ARCH_SELECT_MEMORY_MODEL
	def_bool y

config ARCH_DISCONTIGMEM_ENABLE
	def_bool y
	help
	  Say Y to support efficient handling of discontiguous physical memory,
	  for architectures which are either NUMA (Non-Uniform Memory Access)
	  or have huge holes in the physical address space for other reasons.
	  See <file:Documentation/vm/numa.rst> for more.

config ARCH_FLATMEM_ENABLE
	def_bool y

config ARCH_SPARSEMEM_ENABLE
	def_bool y
	depends on ARCH_DISCONTIGMEM_ENABLE
	select SPARSEMEM_VMEMMAP_ENABLE

config ARCH_DISCONTIGMEM_DEFAULT
	def_bool y
	depends on ARCH_DISCONTIGMEM_ENABLE

config NUMA
	bool "NUMA support"
	depends on !FLATMEM
	select SMP
	help
	  Say Y to compile the kernel to support NUMA (Non-Uniform Memory
	  Access).  This option is for configuring high-end multiprocessor
	  server systems.  If in doubt, say N.

config NODES_SHIFT
	int "Max num nodes shift(3-10)"
	range 3 10
	default "10"
	depends on NEED_MULTIPLE_NODES
	help
	  This option specifies the maximum number of nodes in your SSI system.
	  MAX_NUMNODES will be 2^(This value).
	  If in doubt, use the default.

# VIRTUAL_MEM_MAP and FLAT_NODE_MEM_MAP are functionally equivalent.
# VIRTUAL_MEM_MAP has been retained for historical reasons.
config VIRTUAL_MEM_MAP
	bool "Virtual mem map"
	depends on !SPARSEMEM
	default y
	help
	  Say Y to compile the kernel with support for a virtual mem map.
	  This code also only takes effect if a memory hole of greater than
	  1 Gb is found during boot.  You must turn this option on if you
	  require the DISCONTIGMEM option for your machine. If you are
	  unsure, say Y.

config HOLES_IN_ZONE
	bool
	default y if VIRTUAL_MEM_MAP

config HAVE_ARCH_EARLY_PFN_TO_NID
	def_bool NUMA && SPARSEMEM

config HAVE_ARCH_NODEDATA_EXTENSION
	def_bool y
	depends on NUMA

config USE_PERCPU_NUMA_NODE_ID
	def_bool y
	depends on NUMA

config HAVE_MEMORYLESS_NODES
	def_bool NUMA

config ARCH_PROC_KCORE_TEXT
	def_bool y
	depends on PROC_KCORE

config IA64_MCA_RECOVERY
	tristate "MCA recovery from errors other than TLB."

config PERFMON
	bool "Performance monitor support"
	depends on BROKEN
	help
	  Selects whether support for the IA-64 performance monitor hardware
	  is included in the kernel.  This makes some kernel data-structures a
	  little bigger and slows down execution a bit, but it is generally
	  a good idea to turn this on.  If you're unsure, say Y.

config IA64_PALINFO
	tristate "/proc/pal support"
	help
	  If you say Y here, you are able to get PAL (Processor Abstraction
	  Layer) information in /proc/pal.  This contains useful information
	  about the processors in your systems, such as cache and TLB sizes
	  and the PAL firmware version in use.

	  To use this option, you have to ensure that the "/proc file system
	  support" (CONFIG_PROC_FS) is enabled, too.

config IA64_MC_ERR_INJECT
	tristate "MC error injection support"
	help
	  Adds support for MC error injection. If enabled, the kernel 
	  will provide a sysfs interface for user applications to
	  call MC error injection PAL procedures to inject various errors.
	  This is a useful tool for MCA testing.

	  If you're unsure, do not select this option.

config IA64_ESI
	bool "ESI (Extensible SAL Interface) support"
	help
	  If you say Y here, support is built into the kernel to
	  make ESI calls.  ESI calls are used to support vendor-specific
	  firmware extensions, such as the ability to inject memory-errors
	  for test-purposes.  If you're unsure, say N.

config IA64_HP_AML_NFW
	bool "Support ACPI AML calls to native firmware"
	help
	  This driver installs a global ACPI Operation Region handler for
	  region 0xA1.  AML methods can use this OpRegion to call arbitrary
	  native firmware functions.  The driver installs the OpRegion
	  handler if there is an HPQ5001 device or if the user supplies
	  the "force" module parameter, e.g., with the "aml_nfw.force"
	  kernel command line option.

config KEXEC
	bool "kexec system call"
	depends on !SMP || HOTPLUG_CPU
	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 CRASH_DUMP
	  bool "kernel crash dumps"
	  depends on IA64_MCA_RECOVERY && (!SMP || HOTPLUG_CPU)
	  help
	    Generate crash dump after being started by kexec.

source "drivers/firmware/Kconfig"

endmenu

menu "Power management and ACPI options"

source "kernel/power/Kconfig"

source "drivers/acpi/Kconfig"

if PM
menu "CPU Frequency scaling"
source "drivers/cpufreq/Kconfig"
endmenu
endif

endmenu

config MSPEC
	tristate "Memory special operations driver"
	depends on IA64
	select IA64_UNCACHED_ALLOCATOR
	help
	  If you have an ia64 and you want to enable memory special
	  operations support (formerly known as fetchop), say Y here,
	  otherwise say N.
