#
# Drm device configuration
#
# This driver provides support for the
# Direct Rendering Infrastructure (DRI) in XFree86 4.1.0 and higher.
#
menuconfig DRM
	tristate "Direct Rendering Manager (XFree86 4.1.0 and higher DRI support)"
	depends on (AGP || AGP=n) && !EMULATED_CMPXCHG && MMU && HAS_DMA
	select HDMI
	select FB_CMDLINE
	select I2C
	select I2C_ALGOBIT
	select DMA_SHARED_BUFFER
	help
	  Kernel-level support for the Direct Rendering Infrastructure (DRI)
	  introduced in XFree86 4.0. If you say Y here, you need to select
	  the module that's right for your graphics card from the list below.
	  These modules provide support for synchronization, security, and
	  DMA transfers. Please see <http://dri.sourceforge.net/> for more
	  details.  You should also select and configure AGP
	  (/dev/agpgart) support if it is available for your platform.

config DRM_MIPI_DSI
	bool
	depends on DRM

config DRM_DP_AUX_CHARDEV
	bool "DRM DP AUX Interface"
	depends on DRM
	help
	  Choose this option to enable a /dev/drm_dp_auxN node that allows to
	  read and write values to arbitrary DPCD registers on the DP aux
	  channel.

config DRM_KMS_HELPER
	tristate
	depends on DRM
	help
	  CRTC helpers for KMS drivers.

config DRM_KMS_FB_HELPER
	bool
	depends on DRM_KMS_HELPER
	select FB
	select FRAMEBUFFER_CONSOLE if !EXPERT
	select FRAMEBUFFER_CONSOLE_DETECT_PRIMARY if FRAMEBUFFER_CONSOLE
	select FB_SYS_FOPS
	select FB_SYS_FILLRECT
	select FB_SYS_COPYAREA
	select FB_SYS_IMAGEBLIT
	select FB_CFB_FILLRECT
	select FB_CFB_COPYAREA
	select FB_CFB_IMAGEBLIT
	select FB_DEFERRED_IO
	help
	  FBDEV helpers for KMS drivers.

config DRM_FBDEV_EMULATION
	bool "Enable legacy fbdev support for your modesetting driver"
	depends on DRM
	select DRM_KMS_HELPER
	select DRM_KMS_FB_HELPER
	default y
	help
	  Choose this option if you have a need for the legacy fbdev
	  support. Note that this support also provides the linux console
	  support on top of your modesetting driver.

	  If in doubt, say "Y".

config DRM_LOAD_EDID_FIRMWARE
	bool "Allow to specify an EDID data set instead of probing for it"
	depends on DRM_KMS_HELPER
	help
	  Say Y here, if you want to use EDID data to be loaded from the
	  /lib/firmware directory or one of the provided built-in
	  data sets. This may be necessary, if the graphics adapter or
	  monitor are unable to provide appropriate EDID data. Since this
	  feature is provided as a workaround for broken hardware, the
	  default case is N. Details and instructions how to build your own
	  EDID data are given in Documentation/EDID/HOWTO.txt.

config DRM_TTM
	tristate
	depends on DRM
	help
	  GPU memory management subsystem for devices with multiple
	  GPU memory types. Will be enabled automatically if a device driver
	  uses it.

config DRM_GEM_CMA_HELPER
	bool
	depends on DRM
	help
	  Choose this if you need the GEM CMA helper functions

config DRM_KMS_CMA_HELPER
	bool
	depends on DRM
	select DRM_GEM_CMA_HELPER
	select DRM_KMS_FB_HELPER
	select FB_SYS_FILLRECT
	select FB_SYS_COPYAREA
	select FB_SYS_IMAGEBLIT
	help
	  Choose this if you need the KMS CMA helper functions

source "drivers/gpu/drm/i2c/Kconfig"

config DRM_TDFX
	tristate "3dfx Banshee/Voodoo3+"
	depends on DRM && PCI
	help
	  Choose this option if you have a 3dfx Banshee or Voodoo3 (or later),
	  graphics card.  If M is selected, the module will be called tdfx.

source "drivers/gpu/drm/arm/Kconfig"

config DRM_R128
	tristate "ATI Rage 128"
	depends on DRM && PCI
	select FW_LOADER
	help
	  Choose this option if you have an ATI Rage 128 graphics card.  If M
	  is selected, the module will be called r128.  AGP support for
	  this card is strongly suggested (unless you have a PCI version).

config DRM_RADEON
	tristate "ATI Radeon"
	depends on DRM && PCI
	select FB_CFB_FILLRECT
	select FB_CFB_COPYAREA
	select FB_CFB_IMAGEBLIT
	select FW_LOADER
        select DRM_KMS_HELPER
	select DRM_KMS_FB_HELPER
        select DRM_TTM
	select POWER_SUPPLY
	select HWMON
	select BACKLIGHT_CLASS_DEVICE
	select BACKLIGHT_LCD_SUPPORT
	select INTERVAL_TREE
	help
	  Choose this option if you have an ATI Radeon graphics card.  There
	  are both PCI and AGP versions.  You don't need to choose this to
	  run the Radeon in plain VGA mode.

	  If M is selected, the module will be called radeon.

source "drivers/gpu/drm/radeon/Kconfig"

config DRM_AMDGPU
	tristate "AMD GPU"
	depends on DRM && PCI
	select FB_CFB_FILLRECT
	select FB_CFB_COPYAREA
	select FB_CFB_IMAGEBLIT
	select FW_LOADER
        select DRM_KMS_HELPER
	select DRM_KMS_FB_HELPER
        select DRM_TTM
	select POWER_SUPPLY
	select HWMON
	select BACKLIGHT_CLASS_DEVICE
	select BACKLIGHT_LCD_SUPPORT
	select INTERVAL_TREE
	help
	  Choose this option if you have a recent AMD Radeon graphics card.

	  If M is selected, the module will be called amdgpu.

source "drivers/gpu/drm/amd/amdgpu/Kconfig"
source "drivers/gpu/drm/amd/powerplay/Kconfig"

source "drivers/gpu/drm/amd/acp/Kconfig"

source "drivers/gpu/drm/nouveau/Kconfig"

config DRM_I810
	tristate "Intel I810"
	# !PREEMPT because of missing ioctl locking
	depends on DRM && AGP && AGP_INTEL && (!PREEMPT || BROKEN)
	help
	  Choose this option if you have an Intel I810 graphics card.  If M is
	  selected, the module will be called i810.  AGP support is required
	  for this driver to work.

source "drivers/gpu/drm/i915/Kconfig"

config DRM_MGA
	tristate "Matrox g200/g400"
	depends on DRM && PCI
	select FW_LOADER
	help
	  Choose this option if you have a Matrox G200, G400 or G450 graphics
	  card.  If M is selected, the module will be called mga.  AGP
	  support is required for this driver to work.

config DRM_SIS
	tristate "SiS video cards"
	depends on DRM && AGP
	depends on FB_SIS || FB_SIS=n
	help
	  Choose this option if you have a SiS 630 or compatible video
          chipset. If M is selected the module will be called sis. AGP
          support is required for this driver to work.

config DRM_VIA
	tristate "Via unichrome video cards"
	depends on DRM && PCI
	help
	  Choose this option if you have a Via unichrome or compatible video
	  chipset. If M is selected the module will be called via.

config DRM_SAVAGE
	tristate "Savage video cards"
	depends on DRM && PCI
	help
	  Choose this option if you have a Savage3D/4/SuperSavage/Pro/Twister
	  chipset. If M is selected the module will be called savage.

config DRM_VGEM
	tristate "Virtual GEM provider"
	depends on DRM
	help
	  Choose this option to get a virtual graphics memory manager,
	  as used by Mesa's software renderer for enhanced performance.
	  If M is selected the module will be called vgem.


source "drivers/gpu/drm/exynos/Kconfig"

source "drivers/gpu/drm/rockchip/Kconfig"

source "drivers/gpu/drm/vmwgfx/Kconfig"

source "drivers/gpu/drm/gma500/Kconfig"

source "drivers/gpu/drm/udl/Kconfig"

source "drivers/gpu/drm/ast/Kconfig"

source "drivers/gpu/drm/mgag200/Kconfig"

source "drivers/gpu/drm/cirrus/Kconfig"

source "drivers/gpu/drm/armada/Kconfig"

source "drivers/gpu/drm/atmel-hlcdc/Kconfig"

source "drivers/gpu/drm/rcar-du/Kconfig"

source "drivers/gpu/drm/shmobile/Kconfig"

source "drivers/gpu/drm/sun4i/Kconfig"

source "drivers/gpu/drm/omapdrm/Kconfig"

source "drivers/gpu/drm/tilcdc/Kconfig"

source "drivers/gpu/drm/qxl/Kconfig"

source "drivers/gpu/drm/bochs/Kconfig"

source "drivers/gpu/drm/virtio/Kconfig"

source "drivers/gpu/drm/msm/Kconfig"

source "drivers/gpu/drm/fsl-dcu/Kconfig"

source "drivers/gpu/drm/tegra/Kconfig"

source "drivers/gpu/drm/panel/Kconfig"

source "drivers/gpu/drm/bridge/Kconfig"

source "drivers/gpu/drm/sti/Kconfig"

source "drivers/gpu/drm/amd/amdkfd/Kconfig"

source "drivers/gpu/drm/imx/Kconfig"

source "drivers/gpu/drm/vc4/Kconfig"

source "drivers/gpu/drm/etnaviv/Kconfig"

source "drivers/gpu/drm/arc/Kconfig"

source "drivers/gpu/drm/hisilicon/Kconfig"

source "drivers/gpu/drm/mediatek/Kconfig"
