# 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_LEGACY_ACCELERATION
	bool "Enable legacy fbcon hardware acceleration code"
	depends on FRAMEBUFFER_CONSOLE
	default y if PARISC
	default n
	help
	  This option enables the fbcon (framebuffer text-based) hardware
	  acceleration for graphics drivers which were written for the fbdev
	  graphics interface.

	  On modern machines, on mainstream machines (like x86-64) or when
	  using a modern Linux distribution those fbdev drivers usually aren't used.
	  So enabling this option wouldn't have any effect, which is why you want
	  to disable this option on such newer machines.

	  If you compile this kernel for older machines which still require the
	  fbdev drivers, you may want to say Y.

	  If unsure, select n.

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
	select CRC32
	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

