# SPDX-License-Identifier: GPL-2.0
#
# Configuration for initramfs
#

config INITRAMFS_SOURCE
	string "Initramfs source file(s)"
	default ""
	help
	  This can be either a single cpio archive with a .cpio suffix or a
	  space-separated list of directories and files for building the
	  initramfs image.  A cpio archive should contain a filesystem archive
	  to be used as an initramfs image.  Directories should contain a
	  filesystem layout to be included in the initramfs image.  Files
	  should contain entries according to the format described by the
	  "usr/gen_init_cpio" program in the kernel tree.

	  When multiple directories and files are specified then the
	  initramfs image will be the aggregate of all of them.

	  See <file:Documentation/early-userspace/README> for more details.

	  If you are not sure, leave it blank.

config INITRAMFS_FORCE
	bool "Ignore the initramfs passed by the bootloader"
	depends on CMDLINE_EXTEND || CMDLINE_FORCE
	help
	  This option causes the kernel to ignore the initramfs image
	  (or initrd image) passed to it by the bootloader. This is
	  analogous to CMDLINE_FORCE, which is found on some architectures,
	  and is useful if you cannot or don't want to change the image
	  your bootloader passes to the kernel.

config INITRAMFS_ROOT_UID
	int "User ID to map to 0 (user root)"
	depends on INITRAMFS_SOURCE!=""
	default "0"
	help
	  If INITRAMFS_SOURCE points to a directory, files owned by this UID
	  (-1 = current user) will be owned by root in the resulting image.

	  If you are not sure, leave it set to "0".

config INITRAMFS_ROOT_GID
	int "Group ID to map to 0 (group root)"
	depends on INITRAMFS_SOURCE!=""
	default "0"
	help
	  If INITRAMFS_SOURCE points to a directory, files owned by this GID
	  (-1 = current group) will be owned by root in the resulting image.

	  If you are not sure, leave it set to "0".

config RD_GZIP
	bool "Support initial ramdisk/ramfs compressed using gzip"
	depends on BLK_DEV_INITRD
	default y
	select DECOMPRESS_GZIP
	help
	  Support loading of a gzip encoded initial ramdisk or cpio buffer.
	  If unsure, say Y.

config RD_BZIP2
	bool "Support initial ramdisk/ramfs compressed using bzip2"
	default y
	depends on BLK_DEV_INITRD
	select DECOMPRESS_BZIP2
	help
	  Support loading of a bzip2 encoded initial ramdisk or cpio buffer
	  If unsure, say N.

config RD_LZMA
	bool "Support initial ramdisk/ramfs compressed using LZMA"
	default y
	depends on BLK_DEV_INITRD
	select DECOMPRESS_LZMA
	help
	  Support loading of a LZMA encoded initial ramdisk or cpio buffer
	  If unsure, say N.

config RD_XZ
	bool "Support initial ramdisk/ramfs compressed using XZ"
	depends on BLK_DEV_INITRD
	default y
	select DECOMPRESS_XZ
	help
	  Support loading of a XZ encoded initial ramdisk or cpio buffer.
	  If unsure, say N.

config RD_LZO
	bool "Support initial ramdisk/ramfs compressed using LZO"
	default y
	depends on BLK_DEV_INITRD
	select DECOMPRESS_LZO
	help
	  Support loading of a LZO encoded initial ramdisk or cpio buffer
	  If unsure, say N.

config RD_LZ4
	bool "Support initial ramdisk/ramfs compressed using LZ4"
	default y
	depends on BLK_DEV_INITRD
	select DECOMPRESS_LZ4
	help
	  Support loading of a LZ4 encoded initial ramdisk or cpio buffer
	  If unsure, say N.

choice
	prompt "Built-in initramfs compression mode"
	depends on INITRAMFS_SOURCE!=""
	optional
	help
	  This option allows you to decide by which algorithm the builtin
	  initramfs will be compressed.  Several compression algorithms are
	  available, which differ in efficiency, compression and
	  decompression speed.  Compression speed is only relevant
	  when building a kernel.  Decompression speed is relevant at
	  each boot. Also the memory usage during decompression may become
	  relevant on memory constrained systems. This is usually based on the
	  dictionary size of the algorithm with algorithms like XZ and LZMA
	  featuring large dictionary sizes.

	  High compression options are mostly useful for users who are
	  low on RAM, since it reduces the memory consumption during
	  boot.

	  Keep in mind that your build system needs to provide the appropriate
	  compression tool to compress the generated initram cpio file for
	  embedding.

	  If in doubt, select 'None'

config INITRAMFS_COMPRESSION_NONE
	bool "None"
	help
	  Do not compress the built-in initramfs at all. This may sound wasteful
	  in space, but, you should be aware that the built-in initramfs will be
	  compressed at a later stage anyways along with the rest of the kernel,
	  on those architectures that support this. However, not compressing the
	  initramfs may lead to slightly higher memory consumption during a
	  short time at boot, while both the cpio image and the unpacked
	  filesystem image will be present in memory simultaneously

config INITRAMFS_COMPRESSION_GZIP
	bool "Gzip"
	depends on RD_GZIP
	help
	  Use the old and well tested gzip compression algorithm. Gzip provides
	  a good balance between compression ratio and decompression speed and
	  has a reasonable compression speed. It is also more likely to be
	  supported by your build system as the gzip tool is present by default
	  on most distros.

config INITRAMFS_COMPRESSION_BZIP2
	bool "Bzip2"
	depends on RD_BZIP2
	help
	  It's compression ratio and speed is intermediate. Decompression speed
	  is slowest among the choices. The initramfs size is about 10% smaller
	  with bzip2, in comparison to gzip. Bzip2 uses a large amount of
	  memory. For modern kernels you will need at least 8MB RAM or more for
	  booting.

	  If you choose this, keep in mind that you need to have the bzip2 tool
	  available to be able to compress the initram.

config INITRAMFS_COMPRESSION_LZMA
	bool "LZMA"
	depends on RD_LZMA
	help
	  This algorithm's compression ratio is best but has a large dictionary
	  size which might cause issues in memory constrained systems.
	  Decompression speed is between the other choices. Compression is
	  slowest. The initramfs size is about 33% smaller with LZMA in
	  comparison to gzip.

	  If you choose this, keep in mind that you may need to install the xz
	  or lzma tools to be able to compress the initram.

config INITRAMFS_COMPRESSION_XZ
	bool "XZ"
	depends on RD_XZ
	help
	  XZ uses the LZMA2 algorithm and has a large dictionary which may cause
	  problems on memory constrained systems. The initramfs size is about
	  30% smaller with XZ in comparison to gzip. Decompression speed is
	  better than that of bzip2 but worse than gzip and LZO. Compression is
	  slow.

	  If you choose this, keep in mind that you may need to install the xz
	  tool to be able to compress the initram.

config INITRAMFS_COMPRESSION_LZO
	bool "LZO"
	depends on RD_LZO
	help
	  It's compression ratio is the second poorest amongst the choices. The
	  kernel size is about 10% bigger than gzip. Despite that, it's
	  decompression speed is the second fastest and it's compression speed
	  is quite fast too.

	  If you choose this, keep in mind that you may need to install the lzop
	  tool to be able to compress the initram.

config INITRAMFS_COMPRESSION_LZ4
	bool "LZ4"
	depends on RD_LZ4
	help
	  It's compression ratio is the poorest amongst the choices. The kernel
	  size is about 15% bigger than gzip; however its decompression speed
	  is the fastest.

	  If you choose this, keep in mind that most distros don't provide lz4
	  by default which could cause a build failure.

endchoice

config INITRAMFS_COMPRESSION
	depends on INITRAMFS_SOURCE!=""
	string
	default ""      if INITRAMFS_COMPRESSION_NONE
	default ".gz"   if INITRAMFS_COMPRESSION_GZIP
	default ".bz2"  if INITRAMFS_COMPRESSION_BZIP2
	default ".lzma" if INITRAMFS_COMPRESSION_LZMA
	default ".xz"   if INITRAMFS_COMPRESSION_XZ
	default ".lzo"  if INITRAMFS_COMPRESSION_LZO
	default ".lz4"  if INITRAMFS_COMPRESSION_LZ4
	default ".gz"   if RD_GZIP
	default ".lz4"  if RD_LZ4
	default ".lzo"  if RD_LZO
	default ".xz"   if RD_XZ
	default ".lzma" if RD_LZMA
	default ".bz2"  if RD_BZIP2
	default ""
