# SPDX-License-Identifier: GPL-2.0-only
config DRM_I915
	tristate "Intel 8xx/9xx/G3x/G4x/HD Graphics"
	depends on DRM
	depends on X86 && PCI
	depends on !PREEMPT_RT
	select INTEL_GTT if X86
	select INTERVAL_TREE
	# we need shmfs for the swappable backing store, and in particular
	# the shmem_readpage() which depends upon tmpfs
	select SHMEM
	select TMPFS
	select DRM_DISPLAY_DP_HELPER
	select DRM_DISPLAY_HDCP_HELPER
	select DRM_DISPLAY_HDMI_HELPER
	select DRM_DISPLAY_HELPER
	select DRM_KMS_HELPER
	select DRM_PANEL
	select DRM_MIPI_DSI
	select FB_IOMEM_HELPERS if DRM_FBDEV_EMULATION
	select RELAY
	select I2C
	select I2C_ALGOBIT
	select IRQ_WORK
	# 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 X86_PLATFORM_DEVICES if ACPI
	select ACPI_WMI if ACPI
	select ACPI_VIDEO if ACPI
	select ACPI_BUTTON if ACPI
	select SYNC_FILE
	select IOSF_MBI if X86
	select CRC32
	select SND_HDA_I915 if SND_HDA_CORE
	select CEC_CORE if CEC_NOTIFIER
	select VMAP_PFN
	select DRM_TTM
	select DRM_BUDDY
	select AUXILIARY_BUS
	help
	  Choose this option if you have a system that has "Intel Graphics
	  Media Accelerator" or "HD Graphics" integrated graphics,
	  including 830M, 845G, 852GM, 855GM, 865G, 915G, 945G, 965G,
	  G35, G41, G43, G45 chipsets and Celeron, Pentium, Core i3,
	  Core i5, Core i7 as well as Atom CPUs with integrated graphics.

	  This driver is used by the Intel driver in X.org 6.8 and
	  XFree86 4.4 and above. It replaces the older i830 module that
	  supported a subset of the hardware in older X.org releases.

	  Note that the older i810/i815 chipsets require the use of the
	  i810 driver instead, and the Atom z5xx series has an entirely
	  different implementation.

	  If "M" is selected, the module will be called i915.

config DRM_I915_FORCE_PROBE
	string "Force probe i915 for selected Intel hardware IDs"
	depends on DRM_I915
	help
	  This is the default value for the i915.force_probe module
	  parameter. Using the module parameter overrides this option.

	  Force probe the i915 driver for Intel graphics devices that are
	  recognized but not properly supported by this kernel version. Force
	  probing an unsupported device taints the kernel. It is recommended to
	  upgrade to a kernel version with proper support as soon as it is
	  available.

	  It can also be used to block the probe of recognized and fully
	  supported devices.

	  Use "" to disable force probe. If in doubt, use this.

	  Use "<pci-id>[,<pci-id>,...]" to force probe the i915 for listed
	  devices. For example, "4500" or "4500,4571".

	  Use "*" to force probe the driver for all known devices. Not
	  recommended.

	  Use "!" right before the ID to block the probe of the device. For
	  example, "4500,!4571" forces the probe of 4500 and blocks the probe of
	  4571.

	  Use "!*" to block the probe of the driver for all known devices.

config DRM_I915_CAPTURE_ERROR
	bool "Enable capturing GPU state following a hang"
	depends on DRM_I915
	default y
	help
	  This option enables capturing the GPU state when a hang is detected.
	  This information is vital for triaging hangs and assists in debugging.
	  Please report any hang for triaging according to:
	    https://drm.pages.freedesktop.org/intel-docs/how-to-file-i915-bugs.html

	  If in doubt, say "Y".

config DRM_I915_COMPRESS_ERROR
	bool "Compress GPU error state"
	depends on DRM_I915_CAPTURE_ERROR
	select ZLIB_DEFLATE
	default y
	help
	  This option selects ZLIB_DEFLATE if it isn't already
	  selected and causes any error state captured upon a GPU hang
	  to be compressed using zlib.

	  If in doubt, say "Y".

config DRM_I915_USERPTR
	bool "Always enable userptr support"
	depends on DRM_I915
	select MMU_NOTIFIER
	default y
	help
	  This option selects CONFIG_MMU_NOTIFIER if it isn't already
	  selected to enabled full userptr support.

	  If in doubt, say "Y".

config DRM_I915_GVT_KVMGT
	tristate "Enable KVM host support Intel GVT-g graphics virtualization"
	depends on DRM_I915
	depends on X86
	depends on 64BIT
	depends on KVM
	depends on VFIO
	select DRM_I915_GVT
	select KVM_EXTERNAL_WRITE_TRACKING
	select VFIO_MDEV

	help
	  Choose this option if you want to enable Intel GVT-g graphics
	  virtualization technology host support with integrated graphics.
	  With GVT-g, it's possible to have one integrated graphics
	  device shared by multiple VMs under KVM.

	  Note that this driver only supports newer device from Broadwell on.
	  For further information and setup guide, you can visit:
	  https://github.com/intel/gvt-linux/wiki.

	  If in doubt, say "N".

config DRM_I915_PXP
	bool "Enable Intel PXP support"
	depends on DRM_I915
	depends on INTEL_MEI && INTEL_MEI_PXP
	default n
	help
	  PXP (Protected Xe Path) is an i915 component, available on graphics
	  version 12 and newer GPUs, that helps to establish the hardware
	  protected session and manage the status of the alive software session,
	  as well as its life cycle.

config DRM_I915_DP_TUNNEL
	bool "Enable DP tunnel support"
	depends on DRM_I915
	depends on USB4
	select DRM_DISPLAY_DP_TUNNEL
	default y
	help
	  Choose this option to detect DP tunnels and enable the Bandwidth
	  Allocation mode for such tunnels. This allows using the maximum
	  resolution allowed by the link BW on all displays sharing the
	  link BW, for instance on a Thunderbolt link.

	  If in doubt, say "Y".

menu "drm/i915 Debugging"
depends on DRM_I915
depends on EXPERT
source "drivers/gpu/drm/i915/Kconfig.debug"
endmenu

menu "drm/i915 Profile Guided Optimisation"
	visible if EXPERT
	depends on DRM_I915
	source "drivers/gpu/drm/i915/Kconfig.profile"
endmenu

config DRM_I915_GVT
	bool
