# 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 && !S390 && !UML
	select APERTURE_HELPERS if (DRM || FB || VFIO_PCI_CORE)
	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_CORE && !UML
	default DRM_FBDEV_EMULATION
	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
	select STI_CORE
	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

