# SPDX-License-Identifier: GPL-2.0-only
#
# Video configuration
#

menu "Console display driver support"

config VGA_CONSOLE
	bool "VGA text console" if EXPERT || !X86
	depends on !4xx && !PPC_8xx && !SPARC && !M68K && !PARISC &&  !SUPERH && \
		(!ARM || ARCH_FOOTBRIDGE || ARCH_INTEGRATOR || ARCH_NETWINDER) && \
		!ARM64 && !ARC && !MICROBLAZE && !OPENRISC && !NDS32 && !S390
	default y
	help
	  Saying Y here will allow you to use Linux in text mode through a
	  display that complies with the generic VGA standard. Virtually
	  everyone wants that.

	  The program SVGATextMode can be used to utilize SVGA video cards to
	  their full potential in text mode. Download it from
	  <ftp://ibiblio.org/pub/Linux/utils/console/>.

	  Say Y.

config MDA_CONSOLE
	depends on !M68K && !PARISC && ISA
	tristate "MDA text console (dual-headed)"
	help
	  Say Y here if you have an old MDA or monochrome Hercules graphics
	  adapter in your system acting as a second head ( = video card). You
	  will then be able to use two monitors with your Linux system. Do not
	  say Y here if your MDA card is the primary card in your system; the
	  normal VGA driver will handle it.

	  To compile this driver as a module, choose M here: the
	  module will be called mdacon.

	  If unsure, say N.

config SGI_NEWPORT_CONSOLE
	tristate "SGI Newport Console support"
	depends on SGI_IP22 && HAS_IOMEM
	select FONT_SUPPORT
	help
	  Say Y here if you want the console on the Newport aka XL graphics
	  card of your Indy.  Most people say Y here.

config DUMMY_CONSOLE
	bool
	default y

config DUMMY_CONSOLE_COLUMNS
	int "Initial number of console screen columns"
	depends on DUMMY_CONSOLE && !ARM
	default 160 if PARISC
	default 80
	help
	  On PA-RISC, the default value is 160, which should fit a 1280x1024
	  monitor.
	  Select 80 if you use a 640x480 resolution by default.

config DUMMY_CONSOLE_ROWS
	int "Initial number of console screen rows"
	depends on DUMMY_CONSOLE && !ARM
	default 64 if PARISC
	default 25
	help
	  On PA-RISC, the default value is 64, which should fit a 1280x1024
	  monitor.
	  Select 25 if you use a 640x480 resolution by default.

config FRAMEBUFFER_CONSOLE
	bool "Framebuffer Console support"
	depends on FB && !UML
	select VT_HW_CONSOLE_BINDING
	select CRC32
	select FONT_SUPPORT
	help
	  Low-level framebuffer-based console driver.

config FRAMEBUFFER_CONSOLE_DETECT_PRIMARY
       bool "Map the console to the primary display device"
       depends on FRAMEBUFFER_CONSOLE
       default n
	help
	 If this option is selected, the framebuffer console will
	 automatically select the primary display device (if the architecture
	 supports this feature).  Otherwise, the framebuffer console will
	 always select the first framebuffer driver that is loaded. The latter
	 is the default behavior.

	 You can always override the automatic selection of the primary device
	 by using the fbcon=map: boot option.

	 If unsure, select n.

config FRAMEBUFFER_CONSOLE_ROTATION
       bool "Framebuffer Console Rotation"
       depends on FRAMEBUFFER_CONSOLE
       help
	 Enable display rotation for the framebuffer console.  This is done
	 in software and may be significantly slower than a normally oriented
	 display.  Note that the rotation is done at the console level only
	 such that other users of the framebuffer will remain normally
	 oriented.

config FRAMEBUFFER_CONSOLE_DEFERRED_TAKEOVER
	bool "Framebuffer Console Deferred Takeover"
	depends on FB=y && FRAMEBUFFER_CONSOLE && DUMMY_CONSOLE
	help
	  If enabled this defers the framebuffer console taking over the
	  console from the dummy console until the first text is displayed on
	  the console. This is useful in combination with the "quiet" kernel
	  commandline option to keep the framebuffer contents initially put up
	  by the firmware in place, rather then replacing the contents with a
	  black screen as soon as fbcon loads.

config STI_CONSOLE
	bool "STI text console"
	depends on PARISC && HAS_IOMEM
	select FONT_SUPPORT
	default y
	help
	  The STI console is the builtin display/keyboard on HP-PARISC
	  machines.  Say Y here to build support for it into your kernel.
	  The alternative is to use your primary serial port as a console.

endmenu

