#
# Library configuration
#

config BINARY_PRINTF
	def_bool n

menu "Library routines"

config RAID6_PQ
	tristate

config BITREVERSE
	tristate

config HAVE_ARCH_BITREVERSE
	bool
	default n
	depends on BITREVERSE
	help
	  This option enables the use of hardware bit-reversal instructions on
	  architectures which support such operations.

config RATIONAL
	bool

config GENERIC_STRNCPY_FROM_USER
	bool

config GENERIC_STRNLEN_USER
	bool

config GENERIC_NET_UTILS
	bool

config GENERIC_FIND_FIRST_BIT
	bool

config NO_GENERIC_PCI_IOPORT_MAP
	bool

config GENERIC_PCI_IOMAP
	bool

config GENERIC_IOMAP
	bool
	select GENERIC_PCI_IOMAP

config STMP_DEVICE
	bool

config ARCH_USE_CMPXCHG_LOCKREF
	bool

config ARCH_HAS_FAST_MULTIPLIER
	bool

config INDIRECT_PIO
	bool "Access I/O in non-MMIO mode"
	depends on ARM64
	help
	  On some platforms where no separate I/O space exists, there are I/O
	  hosts which can not be accessed in MMIO mode. Using the logical PIO
	  mechanism, the host-local I/O resource can be mapped into system
	  logic PIO space shared with MMIO hosts, such as PCI/PCIe, then the
	  system can access the I/O devices with the mapped-logic PIO through
	  I/O accessors.

	  This way has relatively little I/O performance cost. Please make
	  sure your devices really need this configure item enabled.

	  When in doubt, say N.

config CRC_CCITT
	tristate "CRC-CCITT functions"
	help
	  This option is provided for the case where no in-kernel-tree
	  modules require CRC-CCITT functions, but a module built outside
	  the kernel tree does. Such modules that use library CRC-CCITT
	  functions require M here.

config CRC16
	tristate "CRC16 functions"
	help
	  This option is provided for the case where no in-kernel-tree
	  modules require CRC16 functions, but a module built outside
	  the kernel tree does. Such modules that use library CRC16
	  functions require M here.

config CRC_T10DIF
	tristate "CRC calculation for the T10 Data Integrity Field"
	select CRYPTO
	select CRYPTO_CRCT10DIF
	help
	  This option is only needed if a module that's not in the
	  kernel tree needs to calculate CRC checks for use with the
	  SCSI data integrity subsystem.

config CRC_ITU_T
	tristate "CRC ITU-T V.41 functions"
	help
	  This option is provided for the case where no in-kernel-tree
	  modules require CRC ITU-T V.41 functions, but a module built outside
	  the kernel tree does. Such modules that use library CRC ITU-T V.41
	  functions require M here.

config CRC32
	tristate "CRC32/CRC32c functions"
	default y
	select BITREVERSE
	help
	  This option is provided for the case where no in-kernel-tree
	  modules require CRC32/CRC32c functions, but a module built outside
	  the kernel tree does. Such modules that use library CRC32/CRC32c
	  functions require M here.

config CRC32_SELFTEST
	tristate "CRC32 perform self test on init"
	depends on CRC32
	help
	  This option enables the CRC32 library functions to perform a
	  self test on initialization. The self test computes crc32_le
	  and crc32_be over byte strings with random alignment and length
	  and computes the total elapsed time and number of bytes processed.

choice
	prompt "CRC32 implementation"
	depends on CRC32
	default CRC32_SLICEBY8
	help
	  This option allows a kernel builder to override the default choice
	  of CRC32 algorithm.  Choose the default ("slice by 8") unless you
	  know that you need one of the others.

config CRC32_SLICEBY8
	bool "Slice by 8 bytes"
	help
	  Calculate checksum 8 bytes at a time with a clever slicing algorithm.
	  This is the fastest algorithm, but comes with a 8KiB lookup table.
	  Most modern processors have enough cache to hold this table without
	  thrashing the cache.

	  This is the default implementation choice.  Choose this one unless
	  you have a good reason not to.

config CRC32_SLICEBY4
	bool "Slice by 4 bytes"
	help
	  Calculate checksum 4 bytes at a time with a clever slicing algorithm.
	  This is a bit slower than slice by 8, but has a smaller 4KiB lookup
	  table.

	  Only choose this option if you know what you are doing.

config CRC32_SARWATE
	bool "Sarwate's Algorithm (one byte at a time)"
	help
	  Calculate checksum a byte at a time using Sarwate's algorithm.  This
	  is not particularly fast, but has a small 256 byte lookup table.

	  Only choose this option if you know what you are doing.

config CRC32_BIT
	bool "Classic Algorithm (one bit at a time)"
	help
	  Calculate checksum one bit at a time.  This is VERY slow, but has
	  no lookup table.  This is provided as a debugging option.

	  Only choose this option if you are debugging crc32.

endchoice

config CRC64
	tristate "CRC64 functions"
	help
	  This option is provided for the case where no in-kernel-tree
	  modules require CRC64 functions, but a module built outside
	  the kernel tree does. Such modules that use library CRC64
	  functions require M here.

config CRC4
	tristate "CRC4 functions"
	help
	  This option is provided for the case where no in-kernel-tree
	  modules require CRC4 functions, but a module built outside
	  the kernel tree does. Such modules that use library CRC4
	  functions require M here.

config CRC7
	tristate "CRC7 functions"
	help
	  This option is provided for the case where no in-kernel-tree
	  modules require CRC7 functions, but a module built outside
	  the kernel tree does. Such modules that use library CRC7
	  functions require M here.

config LIBCRC32C
	tristate "CRC32c (Castagnoli, et al) Cyclic Redundancy-Check"
	select CRYPTO
	select CRYPTO_CRC32C
	help
	  This option is provided for the case where no in-kernel-tree
	  modules require CRC32c functions, but a module built outside the
	  kernel tree does. Such modules that use library CRC32c functions
	  require M here.  See Castagnoli93.
	  Module will be libcrc32c.

config CRC8
	tristate "CRC8 function"
	help
	  This option provides CRC8 function. Drivers may select this
	  when they need to do cyclic redundancy check according CRC8
	  algorithm. Module will be called crc8.

config XXHASH
	tristate

config AUDIT_GENERIC
	bool
	depends on AUDIT && !AUDIT_ARCH
	default y

config AUDIT_ARCH_COMPAT_GENERIC
	bool
	default n

config AUDIT_COMPAT_GENERIC
	bool
	depends on AUDIT_GENERIC && AUDIT_ARCH_COMPAT_GENERIC && COMPAT
	default y

config RANDOM32_SELFTEST
	bool "PRNG perform self test on init"
	default n
	help
	  This option enables the 32 bit PRNG library functions to perform a
	  self test on initialization.

#
# compression support is select'ed if needed
#
config 842_COMPRESS
	select CRC32
	tristate

config 842_DECOMPRESS
	select CRC32
	tristate

config ZLIB_INFLATE
	tristate

config ZLIB_DEFLATE
	tristate
	select BITREVERSE

config LZO_COMPRESS
	tristate

config LZO_DECOMPRESS
	tristate

config LZ4_COMPRESS
	tristate

config LZ4HC_COMPRESS
	tristate

config LZ4_DECOMPRESS
	tristate

config ZSTD_COMPRESS
	select XXHASH
	tristate

config ZSTD_DECOMPRESS
	select XXHASH
	tristate

source "lib/xz/Kconfig"

#
# These all provide a common interface (hence the apparent duplication with
# ZLIB_INFLATE; DECOMPRESS_GZIP is just a wrapper.)
#
config DECOMPRESS_GZIP
	select ZLIB_INFLATE
	tristate

config DECOMPRESS_BZIP2
	tristate

config DECOMPRESS_LZMA
	tristate

config DECOMPRESS_XZ
	select XZ_DEC
	tristate

config DECOMPRESS_LZO
	select LZO_DECOMPRESS
	tristate

config DECOMPRESS_LZ4
	select LZ4_DECOMPRESS
	tristate

#
# Generic allocator support is selected if needed
#
config GENERIC_ALLOCATOR
	bool

#
# reed solomon support is select'ed if needed
#
config REED_SOLOMON
	tristate
	
config REED_SOLOMON_ENC8
	bool

config REED_SOLOMON_DEC8
	bool

config REED_SOLOMON_ENC16
	bool

config REED_SOLOMON_DEC16
	bool

#
# BCH support is selected if needed
#
config BCH
	tristate

config BCH_CONST_PARAMS
	bool
	help
	  Drivers may select this option to force specific constant
	  values for parameters 'm' (Galois field order) and 't'
	  (error correction capability). Those specific values must
	  be set by declaring default values for symbols BCH_CONST_M
	  and BCH_CONST_T.
	  Doing so will enable extra compiler optimizations,
	  improving encoding and decoding performance up to 2x for
	  usual (m,t) values (typically such that m*t < 200).
	  When this option is selected, the BCH library supports
	  only a single (m,t) configuration. This is mainly useful
	  for NAND flash board drivers requiring known, fixed BCH
	  parameters.

config BCH_CONST_M
	int
	range 5 15
	help
	  Constant value for Galois field order 'm'. If 'k' is the
	  number of data bits to protect, 'm' should be chosen such
	  that (k + m*t) <= 2**m - 1.
	  Drivers should declare a default value for this symbol if
	  they select option BCH_CONST_PARAMS.

config BCH_CONST_T
	int
	help
	  Constant value for error correction capability in bits 't'.
	  Drivers should declare a default value for this symbol if
	  they select option BCH_CONST_PARAMS.

#
# Textsearch support is select'ed if needed
#
config TEXTSEARCH
	bool

config TEXTSEARCH_KMP
	tristate

config TEXTSEARCH_BM
	tristate

config TEXTSEARCH_FSM
	tristate

config BTREE
	bool

config INTERVAL_TREE
	bool
	help
	  Simple, embeddable, interval-tree. Can find the start of an
	  overlapping range in log(n) time and then iterate over all
	  overlapping nodes. The algorithm is implemented as an
	  augmented rbtree.

	  See:

		Documentation/rbtree.txt

	  for more information.

config RADIX_TREE_MULTIORDER
	bool

config ASSOCIATIVE_ARRAY
	bool
	help
	  Generic associative array.  Can be searched and iterated over whilst
	  it is being modified.  It is also reasonably quick to search and
	  modify.  The algorithms are non-recursive, and the trees are highly
	  capacious.

	  See:

		Documentation/core-api/assoc_array.rst

	  for more information.

config HAS_IOMEM
	bool
	depends on !NO_IOMEM
	select GENERIC_IO
	default y

config HAS_IOPORT_MAP
	bool
	depends on HAS_IOMEM && !NO_IOPORT_MAP
	default y

source "kernel/dma/Kconfig"

config SGL_ALLOC
	bool
	default n

config IOMMU_HELPER
	bool

config CHECK_SIGNATURE
	bool

config CPUMASK_OFFSTACK
	bool "Force CPU masks off stack" if DEBUG_PER_CPU_MAPS
	help
	  Use dynamic allocation for cpumask_var_t, instead of putting
	  them on the stack.  This is a bit more expensive, but avoids
	  stack overflow.

config CPU_RMAP
	bool
	depends on SMP

config DQL
	bool

config GLOB
	bool
#	This actually supports modular compilation, but the module overhead
#	is ridiculous for the amount of code involved.	Until an out-of-tree
#	driver asks for it, we'll just link it directly it into the kernel
#	when required.  Since we're ignoring out-of-tree users,	there's also
#	no need bother prompting for a manual decision:
#	prompt "glob_match() function"
	help
	  This option provides a glob_match function for performing
	  simple text pattern matching.  It originated in the ATA code
	  to blacklist particular drive models, but other device drivers
	  may need similar functionality.

	  All drivers in the Linux kernel tree that require this function
	  should automatically select this option.  Say N unless you
	  are compiling an out-of tree driver which tells you that it
	  depends on this.

config GLOB_SELFTEST
	tristate "glob self-test on init"
	depends on GLOB
	help
	  This option enables a simple self-test of the glob_match
	  function on startup.	It is primarily useful for people
	  working on the code to ensure they haven't introduced any
	  regressions.

	  It only adds a little bit of code and slows kernel boot (or
	  module load) by a small amount, so you're welcome to play with
	  it, but you probably don't need it.

#
# Netlink attribute parsing support is select'ed if needed
#
config NLATTR
	bool

#
# Generic 64-bit atomic support is selected if needed
#
config GENERIC_ATOMIC64
       bool

config LRU_CACHE
	tristate

config CLZ_TAB
	bool

config CORDIC
	tristate "CORDIC algorithm"
	help
	  This option provides an implementation of the CORDIC algorithm;
	  calculations are in fixed point. Module will be called cordic.

config DDR
	bool "JEDEC DDR data"
	help
	  Data from JEDEC specs for DDR SDRAM memories,
	  particularly the AC timing parameters and addressing
	  information. This data is useful for drivers handling
	  DDR SDRAM controllers.

config IRQ_POLL
	bool "IRQ polling library"
	help
	  Helper library to poll interrupt mitigation using polling.

config MPILIB
	tristate
	select CLZ_TAB
	help
	  Multiprecision maths library from GnuPG.
	  It is used to implement RSA digital signature verification,
	  which is used by IMA/EVM digital signature extension.

config SIGNATURE
	tristate
	depends on KEYS
	select CRYPTO
	select CRYPTO_SHA1
	select MPILIB
	help
	  Digital signature verification. Currently only RSA is supported.
	  Implementation is done using GnuPG MPI library

#
# libfdt files, only selected if needed.
#
config LIBFDT
	bool

config OID_REGISTRY
	tristate
	help
	  Enable fast lookup object identifier registry.

config UCS2_STRING
        tristate

source "lib/fonts/Kconfig"

config SG_SPLIT
	def_bool n
	help
	 Provides a helper to split scatterlists into chunks, each chunk being
	 a scatterlist. This should be selected by a driver or an API which
	 whishes to split a scatterlist amongst multiple DMA channels.

config SG_POOL
	def_bool n
	help
	 Provides a helper to allocate chained scatterlists. This should be
	 selected by a driver or an API which whishes to allocate chained
	 scatterlist.

#
# sg chaining option
#

config ARCH_HAS_SG_CHAIN
	def_bool n

config ARCH_HAS_PMEM_API
	bool

config ARCH_HAS_UACCESS_FLUSHCACHE
	bool

config ARCH_HAS_UACCESS_MCSAFE
	bool

config STACKDEPOT
	bool
	select STACKTRACE

config SBITMAP
	bool

config PARMAN
	tristate "parman" if COMPILE_TEST

config PRIME_NUMBERS
	tristate

config STRING_SELFTEST
	tristate "Test string functions"

endmenu

config GENERIC_LIB_ASHLDI3
	bool

config GENERIC_LIB_ASHRDI3
	bool

config GENERIC_LIB_LSHRDI3
	bool

config GENERIC_LIB_MULDI3
	bool

config GENERIC_LIB_CMPDI2
	bool

config GENERIC_LIB_UCMPDI2
	bool
