# 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 && !UML
	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

