# SPDX-License-Identifier: GPL-2.0-only
#
# Hardware Random Number Generator (RNG) configuration
#

menuconfig HW_RANDOM
	tristate "Hardware Random Number Generator Core support"
	default m
	---help---
	  Hardware Random Number Generator Core infrastructure.

	  To compile this driver as a module, choose M here: the
	  module will be called rng-core.  This provides a device
	  that's usually called /dev/hwrng, and which exposes one
	  of possibly several hardware random number generators.

	  These hardware random number generators do feed into the
	  kernel's random number generator entropy pool.

	  If unsure, say Y.

if HW_RANDOM

config HW_RANDOM_TIMERIOMEM
	tristate "Timer IOMEM HW Random Number Generator support"
	depends on HAS_IOMEM
	---help---
	  This driver provides kernel-side support for a generic Random
	  Number Generator used by reading a 'dumb' iomem address that
	  is to be read no faster than, for example, once a second;
	  the default FPGA bitstream on the TS-7800 has such functionality.

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

	  If unsure, say Y.

config HW_RANDOM_INTEL
	tristate "Intel HW Random Number Generator support"
	depends on (X86 || IA64) && PCI
	default HW_RANDOM
	---help---
	  This driver provides kernel-side support for the Random Number
	  Generator hardware found on Intel i8xx-based motherboards.

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

	  If unsure, say Y.

config HW_RANDOM_AMD
	tristate "AMD HW Random Number Generator support"
	depends on (X86 || PPC_MAPLE) && PCI
	default HW_RANDOM
	---help---
	  This driver provides kernel-side support for the Random Number
	  Generator hardware found on AMD 76x-based motherboards.

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

	  If unsure, say Y.

config HW_RANDOM_ATMEL
	tristate "Atmel Random Number Generator support"
	depends on ARCH_AT91 && HAVE_CLK && OF
	default HW_RANDOM
	---help---
	  This driver provides kernel-side support for the Random Number
	  Generator hardware found on Atmel AT91 devices.

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

	  If unsure, say Y.

config HW_RANDOM_BCM2835
	tristate "Broadcom BCM2835/BCM63xx Random Number Generator support"
	depends on ARCH_BCM2835 || ARCH_BCM_NSP || ARCH_BCM_5301X || \
		   ARCH_BCM_63XX || BCM63XX || BMIPS_GENERIC
	default HW_RANDOM
	---help---
	  This driver provides kernel-side support for the Random Number
	  Generator hardware found on the Broadcom BCM2835 and BCM63xx SoCs.

	  To compile this driver as a module, choose M here: the
	  module will be called bcm2835-rng

	  If unsure, say Y.

config HW_RANDOM_IPROC_RNG200
	tristate "Broadcom iProc/STB RNG200 support"
	depends on ARCH_BCM_IPROC || ARCH_BRCMSTB
	default HW_RANDOM
	---help---
	  This driver provides kernel-side support for the RNG200
	  hardware found on the Broadcom iProc and STB SoCs.

	  To compile this driver as a module, choose M here: the
	  module will be called iproc-rng200

	  If unsure, say Y.

config HW_RANDOM_GEODE
	tristate "AMD Geode HW Random Number Generator support"
	depends on X86_32 && PCI
	default HW_RANDOM
	---help---
	  This driver provides kernel-side support for the Random Number
	  Generator hardware found on the AMD Geode LX.

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

	  If unsure, say Y.

config HW_RANDOM_N2RNG
	tristate "Niagara2 Random Number Generator support"
	depends on SPARC64
	default HW_RANDOM
	---help---
	  This driver provides kernel-side support for the Random Number
	  Generator hardware found on Niagara2 cpus.

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

	  If unsure, say Y.

config HW_RANDOM_VIA
	tristate "VIA HW Random Number Generator support"
	depends on X86
	default HW_RANDOM
	---help---
	  This driver provides kernel-side support for the Random Number
	  Generator hardware found on VIA based motherboards.

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

	  If unsure, say Y.

config HW_RANDOM_IXP4XX
	tristate "Intel IXP4xx NPU HW Pseudo-Random Number Generator support"
	depends on ARCH_IXP4XX
	default HW_RANDOM
	---help---
	  This driver provides kernel-side support for the Pseudo-Random
	  Number Generator hardware found on the Intel IXP45x/46x NPU.

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

	  If unsure, say Y.

config HW_RANDOM_OMAP
	tristate "OMAP Random Number Generator support"
	depends on ARCH_OMAP16XX || ARCH_OMAP2PLUS || ARCH_MVEBU
	default HW_RANDOM
 	---help---
 	  This driver provides kernel-side support for the Random Number
	  Generator hardware found on OMAP16xx, OMAP2/3/4/5, AM33xx/AM43xx
	  multimedia processors, and Marvell Armada 7k/8k SoCs.

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

 	  If unsure, say Y.

config HW_RANDOM_OMAP3_ROM
	tristate "OMAP3 ROM Random Number Generator support"
	depends on ARCH_OMAP3
	default HW_RANDOM
	---help---
	  This driver provides kernel-side support for the Random Number
	  Generator hardware found on OMAP34xx processors.

	  To compile this driver as a module, choose M here: the
	  module will be called omap3-rom-rng.

	  If unsure, say Y.

config HW_RANDOM_OCTEON
	tristate "Octeon Random Number Generator support"
	depends on CAVIUM_OCTEON_SOC
	default HW_RANDOM
	---help---
	  This driver provides kernel-side support for the Random Number
	  Generator hardware found on Octeon processors.

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

	  If unsure, say Y.

config HW_RANDOM_PASEMI
	tristate "PA Semi HW Random Number Generator support"
	depends on PPC_PASEMI
	default HW_RANDOM
	---help---
	  This driver provides kernel-side support for the Random Number
	  Generator hardware found on PA Semi PWRficient SoCs.

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

	  If unsure, say Y.

config HW_RANDOM_VIRTIO
	tristate "VirtIO Random Number Generator support"
	depends on VIRTIO
	---help---
	  This driver provides kernel-side support for the virtual Random Number
	  Generator hardware.

	  To compile this driver as a module, choose M here: the
	  module will be called virtio-rng.  If unsure, say N.

config HW_RANDOM_TX4939
	tristate "TX4939 Random Number Generator support"
	depends on SOC_TX4939
	default HW_RANDOM
	---help---
	  This driver provides kernel-side support for the Random Number
	  Generator hardware found on TX4939 SoC.

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

	  If unsure, say Y.

config HW_RANDOM_MXC_RNGA
	tristate "Freescale i.MX RNGA Random Number Generator"
	depends on SOC_IMX31
	default HW_RANDOM
	---help---
	  This driver provides kernel-side support for the Random Number
	  Generator hardware found on Freescale i.MX processors.

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

	  If unsure, say Y.

config HW_RANDOM_IMX_RNGC
	tristate "Freescale i.MX RNGC Random Number Generator"
	depends on ARCH_MXC
	default HW_RANDOM
	---help---
	  This driver provides kernel-side support for the Random Number
	  Generator Version C hardware found on some Freescale i.MX
	  processors. Version B is also supported by this driver.

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

	  If unsure, say Y.

config HW_RANDOM_NOMADIK
	tristate "ST-Ericsson Nomadik Random Number Generator support"
	depends on ARCH_NOMADIK
	default HW_RANDOM
	---help---
	  This driver provides kernel-side support for the Random Number
	  Generator hardware found on ST-Ericsson SoCs (8815 and 8500).

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

	  If unsure, say Y.

config HW_RANDOM_PSERIES
	tristate "pSeries HW Random Number Generator support"
	depends on PPC64 && IBMVIO
	default HW_RANDOM
	---help---
	  This driver provides kernel-side support for the Random Number
	  Generator hardware found on POWER7+ machines and above

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

	  If unsure, say Y.

config HW_RANDOM_POWERNV
	tristate "PowerNV Random Number Generator support"
	depends on PPC_POWERNV
	default HW_RANDOM
	---help---
	  This is the driver for Random Number Generator hardware found
	  in POWER7+ and above machines for PowerNV platform.

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

	  If unsure, say Y.

config HW_RANDOM_HISI
	tristate "Hisilicon Random Number Generator support"
	depends on HW_RANDOM && ARCH_HISI
	default HW_RANDOM
	---help---
	  This driver provides kernel-side support for the Random Number
	  Generator hardware found on Hisilicon Hip04 and Hip05 SoC.

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

	  If unsure, say Y.

config HW_RANDOM_ST
	tristate "ST Microelectronics HW Random Number Generator support"
	depends on HW_RANDOM && ARCH_STI
	---help---
	  This driver provides kernel-side support for the Random Number
	  Generator hardware found on STi series of SoCs.

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

config HW_RANDOM_XGENE
	tristate "APM X-Gene True Random Number Generator (TRNG) support"
	depends on HW_RANDOM && ARCH_XGENE
	default HW_RANDOM
	---help---
	  This driver provides kernel-side support for the Random Number
	  Generator hardware found on APM X-Gene SoC.

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

	  If unsure, say Y.

config HW_RANDOM_STM32
	tristate "STMicroelectronics STM32 random number generator"
	depends on HW_RANDOM && (ARCH_STM32 || COMPILE_TEST)
	depends on HAS_IOMEM
	default HW_RANDOM
	help
	  This driver provides kernel-side support for the Random Number
	  Generator hardware found on STM32 microcontrollers.

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

	  If unsure, say N.

config HW_RANDOM_PIC32
	tristate "Microchip PIC32 Random Number Generator support"
	depends on HW_RANDOM && MACH_PIC32
	default y
	---help---
	  This driver provides kernel-side support for the Random Number
	  Generator hardware found on a PIC32.

	  To compile this driver as a module, choose M here. the
	  module will be called pic32-rng.

	  If unsure, say Y.

config HW_RANDOM_MESON
	tristate "Amlogic Meson Random Number Generator support"
	depends on HW_RANDOM
	depends on ARCH_MESON || COMPILE_TEST
	default y
	---help---
	  This driver provides kernel-side support for the Random Number
	  Generator hardware found on Amlogic Meson SoCs.

	  To compile this driver as a module, choose M here. the
	  module will be called meson-rng.

	  If unsure, say Y.

config HW_RANDOM_CAVIUM
       tristate "Cavium ThunderX Random Number Generator support"
       depends on HW_RANDOM && PCI && (ARM64 || (COMPILE_TEST && 64BIT))
       default HW_RANDOM
       ---help---
         This driver provides kernel-side support for the Random Number
         Generator hardware found on Cavium SoCs.

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

         If unsure, say Y.

config HW_RANDOM_MTK
	tristate "Mediatek Random Number Generator support"
	depends on HW_RANDOM
	depends on ARCH_MEDIATEK || COMPILE_TEST
	default y
	---help---
	  This driver provides kernel-side support for the Random Number
	  Generator hardware found on Mediatek SoCs.

	  To compile this driver as a module, choose M here. the
	  module will be called mtk-rng.

	  If unsure, say Y.

config HW_RANDOM_S390
	tristate "S390 True Random Number Generator support"
	depends on S390
	default HW_RANDOM
	---help---
	  This driver provides kernel-side support for the True
	  Random Number Generator available as CPACF extension
	  on modern s390 hardware platforms.

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

	  If unsure, say Y.

config HW_RANDOM_EXYNOS
	tristate "Samsung Exynos True Random Number Generator support"
	depends on ARCH_EXYNOS || COMPILE_TEST
	default HW_RANDOM
	---help---
	  This driver provides support for the True Random Number
	  Generator available in Exynos SoCs.

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

	  If unsure, say Y.

config HW_RANDOM_OPTEE
	tristate "OP-TEE based Random Number Generator support"
	depends on OPTEE
	default HW_RANDOM
	help
	  This  driver provides support for OP-TEE based Random Number
	  Generator on ARM SoCs where hardware entropy sources are not
	  accessible to normal world (Linux).

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

	  If unsure, say Y.

endif # HW_RANDOM

config UML_RANDOM
	depends on UML
	tristate "Hardware random number generator"
	help
	  This option enables UML's "hardware" random number generator.  It
	  attaches itself to the host's /dev/random, supplying as much entropy
	  as the host has, rather than the small amount the UML gets from its
	  own drivers.  It registers itself as a standard hardware random number
	  generator, major 10, minor 183, and the canonical device name is
	  /dev/hwrng.
	  The way to make use of this is to install the rng-tools package
	  (check your distro, or download from
	  http://sourceforge.net/projects/gkernel/).  rngd periodically reads
	  /dev/hwrng and injects the entropy into /dev/random.

config HW_RANDOM_KEYSTONE
	depends on ARCH_KEYSTONE
	default HW_RANDOM
	tristate "TI Keystone NETCP SA Hardware random number generator"
	help
	  This option enables Keystone's hardware random generator.
