# SPDX-License-Identifier: GPL-2.0
#
# Partition configuration
#
config PARTITION_ADVANCED
	bool "Advanced partition selection"
	help
	  Say Y here if you would like to use hard disks under Linux which
	  were partitioned under an operating system running on a different
	  architecture than your Linux system.

	  Note that the answer to this question won't directly affect the
	  kernel: saying N will just cause the configurator to skip all
	  the questions about foreign partitioning schemes.

	  If unsure, say N.

config ACORN_PARTITION
	bool "Acorn partition support" if PARTITION_ADVANCED
	default y if ARCH_ACORN
	help
	  Support hard disks partitioned under Acorn operating systems.

config ACORN_PARTITION_CUMANA
	bool "Cumana partition support" if PARTITION_ADVANCED
	default y if ARCH_ACORN
	depends on ACORN_PARTITION
	help
	  Say Y here if you would like to use hard disks under Linux which
	  were partitioned using the Cumana interface on Acorn machines.

config ACORN_PARTITION_EESOX
	bool "EESOX partition support" if PARTITION_ADVANCED
	default y if ARCH_ACORN
	depends on ACORN_PARTITION

config ACORN_PARTITION_ICS
	bool "ICS partition support" if PARTITION_ADVANCED
	default y if ARCH_ACORN
	depends on ACORN_PARTITION
	help
	  Say Y here if you would like to use hard disks under Linux which
	  were partitioned using the ICS interface on Acorn machines.

config ACORN_PARTITION_ADFS
	bool "Native filecore partition support" if PARTITION_ADVANCED
	default y if ARCH_ACORN
	depends on ACORN_PARTITION
	help
	  The Acorn Disc Filing System is the standard file system of the
	  RiscOS operating system which runs on Acorn's ARM-based Risc PC
	  systems and the Acorn Archimedes range of machines.  If you say
	  `Y' here, Linux will support disk partitions created under ADFS.

config ACORN_PARTITION_POWERTEC
	bool "PowerTec partition support" if PARTITION_ADVANCED
	default y if ARCH_ACORN
	depends on ACORN_PARTITION
	help
	  Support reading partition tables created on Acorn machines using
	  the PowerTec SCSI drive.

config ACORN_PARTITION_RISCIX
	bool "RISCiX partition support" if PARTITION_ADVANCED
	default y if ARCH_ACORN
	depends on ACORN_PARTITION
	help
	  Once upon a time, there was a native Unix port for the Acorn series
	  of machines called RISCiX.  If you say 'Y' here, Linux will be able
	  to read disks partitioned under RISCiX.

config AIX_PARTITION
	bool "AIX basic partition table support" if PARTITION_ADVANCED
	help
	  Say Y here if you would like to be able to read the hard disk
	  partition table format used by IBM or Motorola PowerPC machines
	  running AIX.  AIX actually uses a Logical Volume Manager, where
	  "logical volumes" can be spread across one or multiple disks,
	  but this driver works only for the simple case of partitions which
	  are contiguous.
	  Otherwise, say N.

config OSF_PARTITION
	bool "Alpha OSF partition support" if PARTITION_ADVANCED
	default y if ALPHA
	help
	  Say Y here if you would like to use hard disks under Linux which
	  were partitioned on an Alpha machine.

config AMIGA_PARTITION
	bool "Amiga partition table support" if PARTITION_ADVANCED
	default y if (AMIGA || AFFS_FS=y)
	help
	  Say Y here if you would like to use hard disks under Linux which
	  were partitioned under AmigaOS.

config ATARI_PARTITION
	bool "Atari partition table support" if PARTITION_ADVANCED
	default y if ATARI
	help
	  Say Y here if you would like to use hard disks under Linux which
	  were partitioned under the Atari OS.

config IBM_PARTITION
	bool "IBM disk label and partition support"
	depends on PARTITION_ADVANCED && S390
	help
	  Say Y here if you would like to be able to read the hard disk
	  partition table format used by IBM DASD disks operating under CMS.
	  Otherwise, say N.

config MAC_PARTITION
	bool "Macintosh partition map support" if PARTITION_ADVANCED
	default y if (MAC || PPC_PMAC)
	help
	  Say Y here if you would like to use hard disks under Linux which
	  were partitioned on a Macintosh.

config MSDOS_PARTITION
	bool "PC BIOS (MSDOS partition tables) support" if PARTITION_ADVANCED
	default y
	help
	  Say Y here.

config BSD_DISKLABEL
	bool "BSD disklabel (FreeBSD partition tables) support"
	depends on PARTITION_ADVANCED && MSDOS_PARTITION
	help
	  FreeBSD uses its own hard disk partition scheme on your PC. It
	  requires only one entry in the primary partition table of your disk
	  and manages it similarly to DOS extended partitions, putting in its
	  first sector a new partition table in BSD disklabel format. Saying Y
	  here allows you to read these disklabels and further mount FreeBSD
	  partitions from within Linux if you have also said Y to "UFS
	  file system support", above. If you don't know what all this is
	  about, say N.

config MINIX_SUBPARTITION
	bool "Minix subpartition support"
	depends on PARTITION_ADVANCED && MSDOS_PARTITION
	help
	  Minix 2.0.0/2.0.2 subpartition table support for Linux.
	  Say Y here if you want to mount and use Minix 2.0.0/2.0.2
	  subpartitions.

config SOLARIS_X86_PARTITION
	bool "Solaris (x86) partition table support"
	depends on PARTITION_ADVANCED && MSDOS_PARTITION
	help
	  Like most systems, Solaris x86 uses its own hard disk partition
	  table format, incompatible with all others. Saying Y here allows you
	  to read these partition tables and further mount Solaris x86
	  partitions from within Linux if you have also said Y to "UFS
	  file system support", above.

config UNIXWARE_DISKLABEL
	bool "Unixware slices support"
	depends on PARTITION_ADVANCED && MSDOS_PARTITION
	---help---
	  Like some systems, UnixWare uses its own slice table inside a
	  partition (VTOC - Virtual Table of Contents). Its format is
	  incompatible with all other OSes. Saying Y here allows you to read
	  VTOC and further mount UnixWare partitions read-only from within
	  Linux if you have also said Y to "UFS file system support" or
	  "System V and Coherent file system support", above.

	  This is mainly used to carry data from a UnixWare box to your
	  Linux box via a removable medium like magneto-optical, ZIP or
	  removable IDE drives. Note, however, that a good portable way to
	  transport files and directories between unixes (and even other
	  operating systems) is given by the tar program ("man tar" or
	  preferably "info tar").

	  If you don't know what all this is about, say N.

config LDM_PARTITION
	bool "Windows Logical Disk Manager (Dynamic Disk) support"
	depends on PARTITION_ADVANCED
	---help---
	  Say Y here if you would like to use hard disks under Linux which
	  were partitioned using Windows 2000's/XP's or Vista's Logical Disk
	  Manager.  They are also known as "Dynamic Disks".

	  Note this driver only supports Dynamic Disks with a protective MBR
	  label, i.e. DOS partition table.  It does not support GPT labelled
	  Dynamic Disks yet as can be created with Vista.

	  Windows 2000 introduced the concept of Dynamic Disks to get around
	  the limitations of the PC's partitioning scheme.  The Logical Disk
	  Manager allows the user to repartition a disk and create spanned,
	  mirrored, striped or RAID volumes, all without the need for
	  rebooting.

	  Normal partitions are now called Basic Disks under Windows 2000, XP,
	  and Vista.

	  For a fuller description read <file:Documentation/ldm.txt>.

	  If unsure, say N.

config LDM_DEBUG
	bool "Windows LDM extra logging"
	depends on LDM_PARTITION
	help
	  Say Y here if you would like LDM to log verbosely.  This could be
	  helpful if the driver doesn't work as expected and you'd like to
	  report a bug.

	  If unsure, say N.

config SGI_PARTITION
	bool "SGI partition support" if PARTITION_ADVANCED
	default y if DEFAULT_SGI_PARTITION
	help
	  Say Y here if you would like to be able to read the hard disk
	  partition table format used by SGI machines.

config ULTRIX_PARTITION
	bool "Ultrix partition table support" if PARTITION_ADVANCED
	default y if MACH_DECSTATION
	help
	  Say Y here if you would like to be able to read the hard disk
	  partition table format used by DEC (now Compaq) Ultrix machines.
	  Otherwise, say N.

config SUN_PARTITION
	bool "Sun partition tables support" if PARTITION_ADVANCED
	default y if (SPARC || SUN3 || SUN3X)
	---help---
	  Like most systems, SunOS uses its own hard disk partition table
	  format, incompatible with all others. Saying Y here allows you to
	  read these partition tables and further mount SunOS partitions from
	  within Linux if you have also said Y to "UFS file system support",
	  above. This is mainly used to carry data from a SPARC under SunOS to
	  your Linux box via a removable medium like magneto-optical or ZIP
	  drives; note however that a good portable way to transport files and
	  directories between unixes (and even other operating systems) is
	  given by the tar program ("man tar" or preferably "info tar"). If
	  you don't know what all this is about, say N.

config KARMA_PARTITION
	bool "Karma Partition support"
	depends on PARTITION_ADVANCED
	help
	  Say Y here if you would like to mount the Rio Karma MP3 player, as it
	  uses a proprietary partition table.

config EFI_PARTITION
	bool "EFI GUID Partition support" if PARTITION_ADVANCED
	default y
	select CRC32
	help
	  Say Y here if you would like to use hard disks under Linux which
	  were partitioned using EFI GPT.

config SYSV68_PARTITION
	bool "SYSV68 partition table support" if PARTITION_ADVANCED
	default y if VME
	help
	  Say Y here if you would like to be able to read the hard disk
	  partition table format used by Motorola Delta machines (using
	  sysv68).
	  Otherwise, say N.

config CMDLINE_PARTITION
	bool "Command line partition support" if PARTITION_ADVANCED
	select BLK_CMDLINE_PARSER
	help
	  Say Y here if you want to read the partition table from bootargs.
	  The format for the command line is just like mtdparts.
