#
# 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 ""
