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

menu "Linux Module Utilities"

INSERT

config MODPROBE_SMALL
	bool "Simplified modutils"
	default y
	select PLATFORM_LINUX
	help
	  Simplified modutils.

	  With this option modprobe does not require modules.dep file
	  and does not use /etc/modules.conf file.
	  It scans module files in /lib/modules/`uname -r` and
	  determines dependencies and module alias names on the fly.
	  This may make module loading slower, most notably
	  when one needs to load module by alias (this requires
	  scanning through module _bodies_).

	  At the first attempt to load a module by alias modprobe
	  will try to generate modules.dep.bb file in order to speed up
	  future loads by alias. Failure to do so (read-only /lib/modules,
	  etc) is not reported, and future modprobes will be slow too.

	  NB: modules.dep.bb file format is not compatible
	  with modules.dep file as created/used by standard module tools.

	  Additional module parameters can be stored in
	  /etc/modules/$module_name files.

	  Apart from modprobe, other utilities are also provided:
	  - insmod is an alias to modprobe
	  - rmmod is an alias to modprobe -r
	  - depmod generates modules.dep.bb

config FEATURE_MODPROBE_SMALL_OPTIONS_ON_CMDLINE
	bool "Accept module options on modprobe command line"
	default y
	depends on MODPROBE_SMALL
	select PLATFORM_LINUX
	help
	  Allow insmod and modprobe take module options from command line.

config FEATURE_MODPROBE_SMALL_CHECK_ALREADY_LOADED
	bool "Skip loading of already loaded modules"
	default y
	depends on MODPROBE_SMALL
	help
	  Check if the module is already loaded.

config INSMOD
	bool "insmod"
	default n
	depends on !MODPROBE_SMALL
	select PLATFORM_LINUX
	help
	  insmod is used to load specified modules in the running kernel.

config RMMOD
	bool "rmmod"
	default n
	depends on !MODPROBE_SMALL
	select PLATFORM_LINUX
	help
	  rmmod is used to unload specified modules from the kernel.

config LSMOD
	bool "lsmod"
	default n
	depends on !MODPROBE_SMALL
	select PLATFORM_LINUX
	help
	  lsmod is used to display a list of loaded modules.

config FEATURE_LSMOD_PRETTY_2_6_OUTPUT
	bool "Pretty output"
	default n
	depends on LSMOD
	select PLATFORM_LINUX
	help
	  This option makes output format of lsmod adjusted to
	  the format of module-init-tools for Linux kernel 2.6.
	  Increases size somewhat.

config MODPROBE
	bool "modprobe"
	default n
	depends on !MODPROBE_SMALL
	select PLATFORM_LINUX
	help
	  Handle the loading of modules, and their dependencies on a high
	  level.

config FEATURE_MODPROBE_BLACKLIST
	bool "Blacklist support"
	default n
	depends on MODPROBE
	select PLATFORM_LINUX
	help
	  Say 'y' here to enable support for the 'blacklist' command in
	  modprobe.conf. This prevents the alias resolver to resolve
	  blacklisted modules. This is useful if you want to prevent your
	  hardware autodetection scripts to load modules like evdev, frame
	  buffer drivers etc.

config DEPMOD
	bool "depmod"
	default n
	depends on !MODPROBE_SMALL
	select PLATFORM_LINUX
	help
	  depmod generates modules.dep (and potentially modules.alias
	  and modules.symbols) that contain dependency information
	  for modprobe.

comment "Options common to multiple modutils"

config FEATURE_2_4_MODULES
	bool "Support version 2.2/2.4 Linux kernels"
	default n
	depends on INSMOD || RMMOD || LSMOD
	select PLATFORM_LINUX
	help
	  Support module loading for 2.2.x and 2.4.x Linux kernels.
	  This increases size considerably. Say N unless you plan
	  to run ancient kernels.

config FEATURE_INSMOD_TRY_MMAP
	bool "Try to load module from a mmap'ed area"
	default n
	depends on INSMOD || MODPROBE_SMALL
	select PLATFORM_LINUX
	help
	  This option causes module loading code to try to mmap
	  module first. If it does not work (for example,
	  it does not work for compressed modules), module will be read
	  (and unpacked if needed) into a memory block allocated by malloc.

	  The only case when mmap works but malloc does not is when
	  you are trying to load a big module on a very memory-constrained
	  machine. Malloc will momentarily need 2x as much memory as mmap.

	  Choosing N saves about 250 bytes of code (on 32-bit x86).

config FEATURE_INSMOD_VERSION_CHECKING
	bool "Enable module version checking"
	default n
	depends on FEATURE_2_4_MODULES && (INSMOD || MODPROBE)
	select PLATFORM_LINUX
	help
	  Support checking of versions for modules. This is used to
	  ensure that the kernel and module are made for each other.

config FEATURE_INSMOD_KSYMOOPS_SYMBOLS
	bool "Add module symbols to kernel symbol table"
	default n
	depends on FEATURE_2_4_MODULES && (INSMOD || MODPROBE)
	select PLATFORM_LINUX
	help
	  By adding module symbols to the kernel symbol table, Oops messages
	  occuring within kernel modules can be properly debugged. By enabling
	  this feature, module symbols will always be added to the kernel symbol
	  table for proper debugging support. If you are not interested in
	  Oops messages from kernel modules, say N.

config FEATURE_INSMOD_LOADINKMEM
	bool "In kernel memory optimization (uClinux only)"
	default n
	depends on FEATURE_2_4_MODULES && (INSMOD || MODPROBE)
	select PLATFORM_LINUX
	help
	  This is a special uClinux only memory optimization that lets insmod
	  load the specified kernel module directly into kernel space, reducing
	  memory usage by preventing the need for two copies of the module
	  being loaded into memory.

config FEATURE_INSMOD_LOAD_MAP
	bool "Enable insmod load map (-m) option"
	default n
	depends on FEATURE_2_4_MODULES && INSMOD
	select PLATFORM_LINUX
	help
	  Enabling this, one would be able to get a load map
	  output on stdout. This makes kernel module debugging
	  easier.
	  If you don't plan to debug kernel modules, you
	  don't need this option.

config FEATURE_INSMOD_LOAD_MAP_FULL
	bool "Symbols in load map"
	default y
	depends on FEATURE_INSMOD_LOAD_MAP && !MODPROBE_SMALL
	select PLATFORM_LINUX
	help
	  Without this option, -m will only output section
	  load map. With this option, -m will also output
	  symbols load map.

config FEATURE_CHECK_TAINTED_MODULE
	bool "Support tainted module checking with new kernels"
	default y
	depends on (LSMOD || FEATURE_2_4_MODULES) && !MODPROBE_SMALL
	select PLATFORM_LINUX
	help
	  Support checking for tainted modules. These are usually binary
	  only modules that will make the linux-kernel list ignore your
	  support request.
	  This option is required to support GPLONLY modules.

config FEATURE_MODUTILS_ALIAS
	bool "Support for module.aliases file"
	default y
	depends on DEPMOD || MODPROBE
	select PLATFORM_LINUX
	help
	  Generate and parse modules.alias containing aliases for bus
	  identifiers:
	    alias pcmcia:m*c*f03fn*pfn*pa*pb*pc*pd* parport_cs

	  and aliases for logical modules names e.g.:
	    alias padlock_aes aes
	    alias aes_i586 aes
	    alias aes_generic aes

	  Say Y if unsure.

config FEATURE_MODUTILS_SYMBOLS
	bool "Support for module.symbols file"
	default y
	depends on DEPMOD || MODPROBE
	select PLATFORM_LINUX
	help
	  Generate and parse modules.symbols containing aliases for
	  symbol_request() kernel calls, such as:
	    alias symbol:usb_sg_init usbcore

	  Say Y if unsure.

config DEFAULT_MODULES_DIR
	string "Default directory containing modules"
	default "/lib/modules"
	depends on DEPMOD || MODPROBE || MODPROBE_SMALL || MODINFO
	help
	  Directory that contains kernel modules.
	  Defaults to "/lib/modules"

config DEFAULT_DEPMOD_FILE
	string "Default name of modules.dep"
	default "modules.dep"
	depends on DEPMOD || MODPROBE || MODPROBE_SMALL || MODINFO
	help
	  Filename that contains kernel modules dependencies.
	  Defaults to "modules.dep"

endmenu
