#
# 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" 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 "Support initial ramdisks 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 "Support initial ramdisks 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.

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

choice
	prompt "Built-in initramfs compression mode" if INITRAMFS_SOURCE!=""
	help
	  This option decides 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.

	  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 RAM, since it reduces the memory consumption during
	  boot.

	  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. It provides a good balance
	  between compression ratio and decompression speed.

config INITRAMFS_COMPRESSION_BZIP2
	bool "Bzip2"
	depends on RD_BZIP2
	help
	  Its compression ratio and speed is intermediate.
	  Decompression speed is slowest among the four.  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
	  three. Compression is slowest. The initramfs size is about 33%
	  smaller with LZMA in comparison to gzip.

config INITRAMFS_COMPRESSION_LZO
	bool "LZO"
	depends on RD_LZO
	help
	  Its compression ratio is the poorest among the four. The kernel
	  size is about about 10% bigger than gzip; however its speed
	  (both compression and decompression) is the fastest.

endchoice
