# 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 platform, 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.
endmenu
