#
# 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
	select I2C
	select I2C_ALGOBIT
	select SLOW_WORK
	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_KMS_HELPER
	tristate
	depends on DRM
	select FB
	select FRAMEBUFFER_CONSOLE if !EXPERT
	help
	  FB and CRTC helpers for KMS drivers.

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_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.

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_TTM
	select POWER_SUPPLY
	select HWMON
	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_I810
	tristate "Intel I810"
	# BKL usage in order to avoid AB-BA deadlocks, may become BROKEN_ON_SMP
	depends on DRM && AGP && AGP_INTEL && BKL
	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.

choice
	prompt "Intel 830M, 845G, 852GM, 855GM, 865G"
	depends on DRM && AGP && AGP_INTEL
	optional

config DRM_I830
	tristate "i830 driver"
	# BKL usage in order to avoid AB-BA deadlocks, i830 may get removed
	depends on BKL
	help
	  Choose this option if you have a system that has Intel 830M, 845G,
	  852GM, 855GM or 865G integrated graphics.  If M is selected, the
	  module will be called i830.  AGP support is required for this driver
	  to work. This driver is used by the older X releases X.org 6.7 and
	  XFree86 4.3. If unsure, build this and i915 as modules and the X server
	  will load the correct one.

config DRM_I915
	tristate "i915 driver"
	depends on AGP_INTEL
	select SHMEM
	select DRM_KMS_HELPER
	select FB_CFB_FILLRECT
	select FB_CFB_COPYAREA
	select FB_CFB_IMAGEBLIT
	# i915 depends on ACPI_VIDEO when ACPI is enabled
	# but for select to work, need to select ACPI_VIDEO's dependencies, ick
	select BACKLIGHT_CLASS_DEVICE if ACPI
	select INPUT if ACPI
	select ACPI_VIDEO if ACPI
	select ACPI_BUTTON if ACPI
	help
	  Choose this option if you have a system that has Intel 830M, 845G,
	  852GM, 855GM 865G or 915G integrated graphics.  If M is selected, the
	  module will be called i915.  AGP support is required for this driver
	  to work. This driver is used by the Intel driver in X.org 6.8 and
	  XFree86 4.4 and above. If unsure, build this and i830 as modules and
	  the X server will load the correct one.

config DRM_I915_KMS
	bool "Enable modesetting on intel by default"
	depends on DRM_I915
	help
	  Choose this option if you want kernel modesetting enabled by default,
	  and you have a new enough userspace to support this. Running old
	  userspaces with this enabled will cause pain.  Note that this causes
	  the driver to bind to PCI devices, which precludes loading things
	  like intelfb.

endchoice

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.
