# $Id: config.in,v 1.158 2002/01/24 22:14:44 davem Exp $
# For a description of the syntax of this configuration file,
# see the Configure script.
#

mainmenu "Linux/UltraSPARC Kernel Configuration"

config SPARC
	bool
	default y

config SPARC64
	bool
	default y
	help
	  SPARC is a family of RISC microprocessors designed and marketed by
	  Sun Microsystems, incorporated.  This port covers the newer 64-bit
	  UltraSPARC.  The UltraLinux project maintains both the SPARC32 and
	  SPARC64 ports; its web page is available at
	  <http://www.ultralinux.org/>.

config 64BIT
	def_bool y

config MMU
	bool
	default y

config TIME_INTERPOLATION
	bool
	default y

config ARCH_MAY_HAVE_PC_FDC
	bool
	default y

choice
	prompt "Kernel page size"
	default SPARC64_PAGE_SIZE_8KB

config SPARC64_PAGE_SIZE_8KB
	bool "8KB"
	help
	  This lets you select the page size of the kernel.

	  8KB and 64KB work quite well, since Sparc ELF sections
	  provide for up to 64KB alignment.

	  Therefore, 512KB and 4MB are for expert hackers only.

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

config SPARC64_PAGE_SIZE_64KB
	bool "64KB"

config SPARC64_PAGE_SIZE_512KB
	bool "512KB"

config SPARC64_PAGE_SIZE_4MB
	bool "4MB"

endchoice

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.

source kernel/Kconfig.hz

source "init/Kconfig"

config SYSVIPC_COMPAT
	bool
	depends on COMPAT && SYSVIPC
	default y

menu "General machine setup"

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
	  machines, but will use only one CPU of a multiprocessor machine. If
	  you say Y here, the kernel will run on many, but not all,
	  singleprocessor machines. On a singleprocessor machine, the kernel
	  will run faster if you say N here.

	  People using multiprocessor machines who say Y here should also say
	  Y to "Enhanced Real Time Clock Support", below. The "Advanced Power
	  Management" code will be disabled if you say Y here.

	  See also the <file:Documentation/smp.txt>,
	  <file:Documentation/nmi_watchdog.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 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.

config NR_CPUS
	int "Maximum number of CPUs (2-64)"
	range 2 64
	depends on SMP
	default "32"

source "drivers/cpufreq/Kconfig"

config US3_FREQ
	tristate "UltraSPARC-III CPU Frequency driver"
	depends on CPU_FREQ
	select CPU_FREQ_TABLE
	help
	  This adds the CPUFreq driver for UltraSPARC-III processors.

	  For details, take a look at <file:Documentation/cpu-freq>.

	  If in doubt, say N.

config US2E_FREQ
	tristate "UltraSPARC-IIe CPU Frequency driver"
	depends on CPU_FREQ
	select CPU_FREQ_TABLE
	help
	  This adds the CPUFreq driver for UltraSPARC-IIe processors.

	  For details, take a look at <file:Documentation/cpu-freq>.

	  If in doubt, say N.

# Global things across all Sun machines.
config RWSEM_GENERIC_SPINLOCK
	bool

config RWSEM_XCHGADD_ALGORITHM
	bool
	default y

config GENERIC_CALIBRATE_DELAY
	bool
	default y

choice
	prompt "SPARC64 Huge TLB Page Size"
	depends on HUGETLB_PAGE
	default HUGETLB_PAGE_SIZE_4MB

config HUGETLB_PAGE_SIZE_4MB
	bool "4MB"

config HUGETLB_PAGE_SIZE_512K
	depends on !SPARC64_PAGE_SIZE_4MB
	bool "512K"

config HUGETLB_PAGE_SIZE_64K
	depends on !SPARC64_PAGE_SIZE_4MB && !SPARC64_PAGE_SIZE_512K
	bool "64K"

endchoice

endmenu

source "mm/Kconfig"

config GENERIC_ISA_DMA
	bool
	default y

config ISA
	bool
	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.  Other bus systems are PCI, EISA, MicroChannel
	  (MCA) or VESA.  ISA is an older system, now being displaced by PCI;
	  newer boards don't support it.  If you have ISA, say Y, otherwise N.

config ISAPNP
	bool
	help
	  Say Y here if you would like support for ISA Plug and Play devices.
	  Some information is in <file:Documentation/isapnp.txt>.

	  To compile this driver as a module, choose M here: the
	  module will be called isapnp.

	  If unsure, say Y.

config EISA
	bool
	---help---
	  The Extended Industry Standard Architecture (EISA) bus was
	  developed as an open alternative to the IBM MicroChannel bus.

	  The EISA bus provided some of the features of the IBM MicroChannel
	  bus while maintaining backward compatibility with cards made for
	  the older ISA bus.  The EISA bus saw limited use between 1988 and
	  1995 when it was made obsolete by the PCI bus.

	  Say Y here if you are building a kernel for an EISA-based machine.

	  Otherwise, say N.

config MCA
	bool
	help
	  MicroChannel Architecture is found in some IBM PS/2 machines and
	  laptops.  It is a bus system similar to PCI or ISA. See
	  <file:Documentation/mca.txt> (and especially the web page given
	  there) before attempting to build an MCA bus kernel.

config PCMCIA
	tristate
	---help---
	  Say Y here if you want to attach PCMCIA- or PC-cards to your Linux
	  computer.  These are credit-card size devices such as network cards,
	  modems or hard drives often used with laptops computers.  There are
	  actually two varieties of these cards: the older 16 bit PCMCIA cards
	  and the newer 32 bit CardBus cards.  If you want to use CardBus
	  cards, you need to say Y here and also to "CardBus support" below.

	  To use your PC-cards, you will need supporting software from David
	  Hinds' pcmcia-cs package (see the file <file:Documentation/Changes>
	  for location).  Please also read the PCMCIA-HOWTO, available from
	  <http://www.tldp.org/docs.html#howto>.

	  To compile this driver as modules, choose M here: the
	  modules will be called pcmcia_core and ds.

config SBUS
	bool
	default y

config SBUSCHAR
	bool
	default y

config SUN_AUXIO
	bool
	default y

config SUN_IO
	bool
	default y

config PCI
	bool "PCI support"
	help
	  Find out whether you have a PCI motherboard. PCI is the name of a
	  bus system, i.e. the way the CPU talks to the other stuff inside
	  your box. Other bus systems are ISA, EISA, MicroChannel (MCA) or
	  VESA. If you have PCI, say Y, otherwise N.

	  The PCI-HOWTO, available from
	  <http://www.tldp.org/docs.html#howto>, contains valuable
	  information about which PCI hardware does work under Linux and which
	  doesn't.

config PCI_DOMAINS
	bool
	default PCI

source "drivers/pci/Kconfig"

config SUN_OPENPROMFS
	tristate "Openprom tree appears in /proc/openprom"
	help
	  If you say Y, the OpenPROM device tree will be available as a
	  virtual file system, which you can mount to /proc/openprom by "mount
	  -t openpromfs none /proc/openprom".

	  To compile the /proc/openprom support as a module, choose M here: the
	  module will be called openpromfs.  If unsure, choose M.

config SPARC32_COMPAT
	bool "Kernel support for Linux/Sparc 32bit binary compatibility"
	help
	  This allows you to run 32-bit binaries on your Ultra.
	  Everybody wants this; say Y.

config COMPAT
	bool
	depends on SPARC32_COMPAT
	default y

config UID16
	bool
	depends on SPARC32_COMPAT
	default y

config BINFMT_ELF32
	tristate "Kernel support for 32-bit ELF binaries"
	depends on SPARC32_COMPAT
	help
	  This allows you to run 32-bit Linux/ELF binaries on your Ultra.
	  Everybody wants this; say Y.

config BINFMT_AOUT32
	bool "Kernel support for 32-bit (ie. SunOS) a.out binaries"
	depends on SPARC32_COMPAT
	help
	  This allows you to run 32-bit a.out format binaries on your Ultra.
	  If you want to run SunOS binaries (see SunOS binary emulation below)
	  or other a.out binaries, say Y. If unsure, say N.

menu "Executable file formats"

source "fs/Kconfig.binfmt"

config SUNOS_EMUL
	bool "SunOS binary emulation"
	depends on BINFMT_AOUT32
	help
	  This allows you to run most SunOS binaries.  If you want to do this,
	  say Y here and place appropriate files in /usr/gnemul/sunos. See
	  <http://www.ultralinux.org/faq.html> for more information.  If you
	  want to run SunOS binaries on an Ultra you must also say Y to
	  "Kernel support for 32-bit a.out binaries" above.

config SOLARIS_EMUL
	tristate "Solaris binary emulation (EXPERIMENTAL)"
	depends on SPARC32_COMPAT && EXPERIMENTAL
	help
	  This is experimental code which will enable you to run (many)
	  Solaris binaries on your SPARC Linux machine.

	  To compile this code as a module, choose M here: the
	  module will be called solaris.

endmenu

config CMDLINE_BOOL
	bool "Default bootloader kernel arguments"

config CMDLINE
	string "Initial kernel command string"
	depends on CMDLINE_BOOL
	default "console=ttyS0,9600 root=/dev/sda1"
	help
	  Say Y here if you want to be able to pass default arguments to
	  the kernel. This will be overridden by the bootloader, if you
	  use one (such as SILO). This is most useful if you want to boot
	  a kernel from TFTP, and want default options to be available
	  with having them passed on the command line.

	  NOTE: This option WILL override the PROM bootargs setting!

source "net/Kconfig"

source "drivers/Kconfig"

source "drivers/sbus/char/Kconfig"

source "drivers/fc4/Kconfig"

source "fs/Kconfig"

menu "Instrumentation Support"
        depends on EXPERIMENTAL

source "arch/sparc64/oprofile/Kconfig"

config KPROBES
	bool "Kprobes (EXPERIMENTAL)"
	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/sparc64/Kconfig.debug"

source "security/Kconfig"

source "crypto/Kconfig"

source "lib/Kconfig"
