#
# For a description of the syntax of this configuration file,
# see Documentation/kbuild/kconfig-language.txt.
#

mainmenu "IA-64 Linux Kernel Configuration"

source "init/Kconfig"

menu "Processor type and features"

config IA64
	bool
	select PCI if (!IA64_HP_SIM)
	select ACPI if (!IA64_HP_SIM)
	select PM if (!IA64_HP_SIM)
	select ARCH_SUPPORTS_MSI
	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_DMA
	def_bool y
	depends on !IA64_SGI_SN2

config QUICKLIST
	bool
	default y

config MMU
	bool
	default y

config SWIOTLB
       bool

config RWSEM_XCHGADD_ALGORITHM
	bool
	default y

config ARCH_HAS_ILOG2_U32
	bool
	default n

config ARCH_HAS_ILOG2_U64
	bool
	default n

config GENERIC_FIND_NEXT_BIT
	bool
	default y

config GENERIC_CALIBRATE_DELAY
	bool
	default y

config GENERIC_TIME
	bool
	default y

config GENERIC_TIME_VSYSCALL
	bool
	default y

config DMI
	bool
	default y

config EFI
	bool
	default y

config GENERIC_IOMAP
	bool
	default y

config SCHED_NO_NO_OMIT_FRAME_POINTER
	bool
	default y

config IA64_UNCACHED_ALLOCATOR
	bool
	select GENERIC_ALLOCATOR

config AUDIT_ARCH
	bool
	default y

choice
	prompt "System type"
	default IA64_GENERIC

config IA64_GENERIC
	bool "generic"
	select NUMA
	select ACPI_NUMA
	select SWIOTLB
	help
	  This selects the system type of your hardware.  A "generic" kernel
	  will run on any supported IA-64 system.  However, if you configure
	  a kernel for your specific system, it will be faster and smaller.

	  generic		For any supported IA-64 system
	  DIG-compliant		For DIG ("Developer's Interface Guide") compliant systems
	  HP-zx1/sx1000		For HP systems
	  HP-zx1/sx1000+swiotlb	For HP systems with (broken) DMA-constrained devices.
	  SGI-SN2		For SGI Altix systems
	  Ski-simulator		For the HP simulator <http://www.hpl.hp.com/research/linux/ski/>

	  If you don't know what to do, choose "generic".

config IA64_DIG
	bool "DIG-compliant"
	select SWIOTLB

config IA64_HP_ZX1
	bool "HP-zx1/sx1000"
	help
	  Build a kernel that runs on HP zx1 and sx1000 systems.  This adds
	  support for the HP I/O MMU.

config IA64_HP_ZX1_SWIOTLB
	bool "HP-zx1/sx1000 with software I/O TLB"
	select SWIOTLB
	help
	  Build a kernel that runs on HP zx1 and sx1000 systems even when they
	  have broken PCI devices which cannot DMA to full 32 bits.  Apart
	  from support for the HP I/O MMU, this includes support for the software
	  I/O TLB, which allows supporting the broken devices at the expense of
	  wasting some kernel memory (about 2MB by default).

config IA64_SGI_SN2
	bool "SGI-SN2"
	help
	  Selecting this option will optimize the kernel for use on sn2 based
	  systems, but the resulting kernel binary will not run on other
	  types of ia64 systems.  If you have an SGI Altix system, it's safe
	  to select this option.  If in doubt, select ia64 generic support
	  instead.

config IA64_HP_SIM
	bool "Ski-simulator"
	select SWIOTLB

endchoice

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

choice
	prompt "Page Table Levels"
	default PGTABLE_3

config PGTABLE_3
	bool "3 Levels"

config PGTABLE_4
	depends on !IA64_PAGE_SIZE_64KB
	bool "4 Levels"

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_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 IOSAPIC
	bool
	depends on !IA64_HP_SIM
	default y

config IA64_SGI_SN_XP
	tristate "Support communication between SGI SSIs"
	depends on IA64_GENERIC || IA64_SGI_SN2
	select IA64_UNCACHED_ALLOCATOR
	help
	  An SGI machine can be divided into multiple Single System
	  Images which act independently of each other and have
	  hardware based memory protection from the others.  Enabling
	  this feature will allow for direct communication between SSIs
	  based on a network adapter and DMA messaging.

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 <file:Documentation/smp.txt> and 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-1024)"
	range 2 1024
	depends on SMP
	default "1024"
	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 (EXPERIMENTAL)"
	depends on SMP && EXPERIMENTAL
	select HOTPLUG
	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 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-targetted"
	depends on PERMIT_BSP_REMOVE
	default n
	---help---
	Say Y if you need to force the assumption that CPEI can be re-targetted 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 PREEMPT
	bool "Preemptible Kernel"
        help
          This option reduces the latency of the kernel when reacting to
          real-time or interactive events by allowing a low priority process to
          be preempted even if it is in kernel mode executing a system call.
          This allows applications to run more reliably even when the system is
          under load.

          Say Y here if you are building a kernel for a desktop, embedded
          or real-time system.  Say N if you are unsure.

source "mm/Kconfig"

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> for more.

config ARCH_FLATMEM_ENABLE
	def_bool y

config ARCH_SPARSEMEM_ENABLE
	def_bool y
	depends on ARCH_DISCONTIGMEM_ENABLE

config ARCH_DISCONTIGMEM_DEFAULT
	def_bool y if (IA64_SGI_SN2 || IA64_GENERIC || IA64_HP_ZX1 || IA64_HP_ZX1_SWIOTLB)
	depends on ARCH_DISCONTIGMEM_ENABLE

config NUMA
	bool "NUMA support"
	depends on !IA64_HP_SIM && !FLATMEM
	default y if IA64_SGI_SN2
	select ACPI_NUMA if ACPI
	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.

config ARCH_POPULATES_NODE_MAP
	def_bool y

# 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 if !IA64_HP_SIM
	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 y
	depends on NEED_MULTIPLE_NODES

config HAVE_ARCH_NODEDATA_EXTENSION
	def_bool y
	depends on NUMA

config IA32_SUPPORT
	bool "Support for Linux/x86 binaries"
	help
	  IA-64 processors can execute IA-32 (X86) instructions.  By
	  saying Y here, the kernel will include IA-32 system call
	  emulation support which makes it possible to transparently
	  run IA-32 Linux binaries on an IA-64 Linux system.
	  If in doubt, say Y.

config COMPAT
	bool
	depends on IA32_SUPPORT
	default y

config COMPAT_FOR_U64_ALIGNMENT
	def_bool COMPAT

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

config PERFMON
	bool "Performance monitor support"
	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
	  Selets whether support for MC error injection. By enabling the
	  support, kernel provide sysfs interface for user application to
	  call MC error injection PAL procedure to inject various errors.
	  This is a useful tool for MCA testing.

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

config SGI_SN
	def_bool y if (IA64_SGI_SN2 || IA64_GENERIC)

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.

source "drivers/sn/Kconfig"

config KEXEC
	bool "kexec system call (EXPERIMENTAL)"
	depends on EXPERIMENTAL && !IA64_HP_SIM && (!SMP || HOTPLUG_CPU)
	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 similiarity 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.  It may help to enable device hotplugging
	  support.  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 (EXPERIMENTAL)"
	  depends on EXPERIMENTAL && IA64_MCA_RECOVERY && !IA64_HP_SIM && (!SMP || HOTPLUG_CPU)
	  help
	    Generate crash dump after being started by kexec.

source "drivers/firmware/Kconfig"

source "fs/Kconfig.binfmt"

endmenu

menu "Power management and ACPI"

source "kernel/power/Kconfig"

source "drivers/acpi/Kconfig"

if PM

source "arch/ia64/kernel/cpufreq/Kconfig"

endif

endmenu

if !IA64_HP_SIM

menu "Bus options (PCI, PCMCIA)"

config PCI
	bool "PCI support"
	help
	  Real IA-64 machines all have PCI/PCI-X/PCI Express busses.  Say Y
	  here unless you are using a simulator without PCI support.

config PCI_DOMAINS
	def_bool PCI

config PCI_SYSCALL
	def_bool PCI

source "drivers/pci/pcie/Kconfig"

source "drivers/pci/Kconfig"

source "drivers/pci/hotplug/Kconfig"

source "drivers/pcmcia/Kconfig"

endmenu

endif

source "net/Kconfig"

source "drivers/Kconfig"

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.

source "fs/Kconfig"

source "lib/Kconfig"

#
# Use the generic interrupt handling code in kernel/irq/:
#
config GENERIC_HARDIRQS
	bool
	default y

config GENERIC_IRQ_PROBE
	bool
	default y

config GENERIC_PENDING_IRQ
	bool
	depends on GENERIC_HARDIRQS && SMP
	default y

config IRQ_PER_CPU
	bool
	default y

source "arch/ia64/hp/sim/Kconfig"

menu "Instrumentation Support"
        depends on EXPERIMENTAL

source "arch/ia64/oprofile/Kconfig"

config KPROBES
	bool "Kprobes"
	depends on KALLSYMS && MODULES
	help
	  Kprobes allows you to trap at almost any kernel address and
	  execute a callback function.  register_kprobe() establishes
	  a probepoint and specifies the callback.  Kprobes is useful
	  for kernel debugging, non-intrusive instrumentation and testing.
	  If in doubt, say "N".
endmenu

source "arch/ia64/Kconfig.debug"

source "security/Kconfig"

source "crypto/Kconfig"
