# 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_VIRT_CPU_ACCOUNTING
	select DMA_NONCOHERENT_MMAP
	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 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"
	select DMA_OPS
	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.
