#
# 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_ROOT_UID
	int "User ID to map to 0 (user root)"
	depends on INITRAMFS_SOURCE!=""
	default "0"
	help
	  This setting is only meaningful if the INITRAMFS_SOURCE is
	  contains a directory.  Setting this user ID (UID) to something
	  other than "0" will cause all files owned by that UID to be
	  owned by user root in the initial ramdisk 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
	  This setting is only meaningful if the INITRAMFS_SOURCE is
	  contains a directory.  Setting this group ID (GID) to something
	  other than "0" will cause all files owned by that GID to be
	  owned by group root in the initial ramdisk image.

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

config RD_GZIP
	bool "Support initial ramdisks 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 ramdisks 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 ramdisks 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 ramdisks 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 ramdisks 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 ramdisks 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
	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 ""
