#
# 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 "Initial ramdisk compressed using gzip" if EMBEDDED
	default y
	depends on BLK_DEV_INITRD
	select DECOMPRESS_GZIP
	help
	  Support loading of a gzip encoded initial ramdisk or cpio buffer.
	  If unsure, say Y.

config RD_BZIP2
	bool "Initial ramdisk compressed using bzip2" if EMBEDDED
	default !EMBEDDED
	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 "Initial ramdisk compressed using lzma" if EMBEDDED
	default !EMBEDDED
	depends on BLK_DEV_INITRD
	select DECOMPRESS_LZMA
	help
	  Support loading of a lzma encoded initial ramdisk or cpio buffer
	  If unsure, say N.

choice
	prompt "Built-in initramfs compression mode"
	help
	  This setting is only meaningful if the INITRAMFS_SOURCE is
	  set. It decides by which algorithm the INITRAMFS_SOURCE 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.

	  If you have any problems with bzip2 or lzma compressed
	  initramfs, mail me (Alain Knaff) <alain@knaff.lu>.

	  High compression options are mostly useful for users who
	  are low on disk space (embedded systems), but for whom ram
	  size matters less.

	  If in doubt, select 'gzip'

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
	  The old and tried gzip compression. Its compression ratio is
	  the poorest among the 3 choices; however its speed (both
	  compression and decompression) is the fastest.

config INITRAMFS_COMPRESSION_BZIP2
	bool "Bzip2"
	depends on RD_BZIP2
	help
	  Its compression ratio and speed is intermediate.
	  Decompression speed is slowest among the three.  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.

config INITRAMFS_COMPRESSION_LZMA
	bool "LZMA"
	depends on RD_LZMA
	help
	  The most recent compression algorithm.
	  Its ratio is best, decompression speed is between the other
	  two. Compression is slowest.	The initramfs size is about 33%
	  smaller with LZMA in comparison to gzip.

endchoice
