# Kconfig - random generator driver configuration options

#
# Copyright (c) 2014-2015 Wind River Systems, Inc.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#     http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#

menu "Random Generation Configuration"
config RANDOM_GENERATOR
	bool
	prompt "Custom random generator"
	default n
	help
	  This option signifies that the target uses a real random number
	  generator.

config TEST_RANDOM_GENERATOR
	bool
	prompt "Non-random number generator"
	depends on !RANDOM_GENERATOR
	default n
	help
	  This option signifies that the kernel's random number APIs are
	  permitted to return values that are not truly random.
	  This capability is provided for testing purposes, when a truly random
	  number generator is not available. The non-random number generator
	  should not be used in a production environment.

config X86_TSC_RANDOM_GENERATOR
	bool
	prompt "x86 timestamp counter based number generator"
	depends on TEST_RANDOM_GENERATOR && X86
	default y
	help
	  This options enables number generator based on timestamp counter
	  of x86 boards, obtained with rdtsc instruction.

config TIMER_RANDOM_GENERATOR
	bool
	prompt "System timer clock based number generator"
	depends on TEST_RANDOM_GENERATOR && !X86_TSC_RANDOM_GENERATOR
	default y
	help
	  This options enables number generator based on system timer
	  clock. This number generator is not random and used for
	  testing only.

config RANDOM_KSDK
	bool
	prompt "KSDK Random driver"
	depends on RANDOM_GENERATOR && HAS_RNGA
	default n
	help
	  This option enables the random number generator accelerator (RNGA)
	  driver based on the KSDK RNGA driver.

endmenu
