# SPDX-License-Identifier: GPL-2.0-only
config DRM_I915_WERROR
	bool "Force GCC to throw an error instead of a warning when compiling"
	# As this may inadvertently break the build, only allow the user
	# to shoot oneself in the foot iff they aim really hard
	depends on EXPERT
	# We use the dependency on !COMPILE_TEST to not be enabled in
	# allmodconfig or allyesconfig configurations
	depends on !COMPILE_TEST
	default n
	help
	  Add -Werror to the build flags for (and only for) i915.ko.
	  Do not enable this unless you are writing code for the i915.ko module.

	  Recommended for driver developers only.

	  If in doubt, say "N".

config DRM_I915_DEBUG
	bool "Enable additional driver debugging"
	depends on DRM_I915
	depends on EXPERT # only for developers
	depends on !COMPILE_TEST # never built by robots
	select DEBUG_FS
	select PREEMPT_COUNT
	select I2C_CHARDEV
	select REF_TRACKER
	select STACKDEPOT
	select STACKTRACE
	select DRM_DP_AUX_CHARDEV
	select DRM_DISPLAY_DEBUG_DP_TUNNEL_STATE if DRM_I915_DP_TUNNEL
	select X86_MSR # used by igt/pm_rpm
	select DRM_VGEM # used by igt/prime_vgem (dmabuf interop checks)
	select DRM_DEBUG_MM if DRM=y
	select DRM_EXPORT_FOR_TESTS if m
	select DRM_DEBUG_SELFTEST
	select DMABUF_SELFTESTS
	select SW_SYNC # signaling validation framework (igt/syncobj*)
	select DRM_I915_WERROR
	select DRM_I915_DEBUG_GEM
	select DRM_I915_DEBUG_GEM_ONCE
	select DRM_I915_DEBUG_MMIO
	select DRM_I915_DEBUG_RUNTIME_PM
	select DRM_I915_DEBUG_WAKEREF
	select DRM_I915_SW_FENCE_DEBUG_OBJECTS
	select DRM_I915_SELFTEST
	default n
	help
	  Choose this option to turn on extra driver debugging that may affect
	  performance but will catch some internal issues.

	  Recommended for driver developers only.

	  If in doubt, say "N".

config DRM_I915_DEBUG_MMIO
	bool "Always insert extra checks around mmio access by default"
	default n
	help
	  By default, always enables the extra sanity checks (extra register
	  reads) around every mmio (register) access that will slow the system
	  down. This sets the default value of i915.mmio_debug to -1 and can
	  be overridden at module load.

	  Recommended for driver developers only.

	  If in doubt, say "N".

config DRM_I915_DEBUG_GEM
	bool "Insert extra checks into the GEM internals"
	default n
	depends on DRM_I915_WERROR
	help
	  Enable extra sanity checks (including BUGs) along the GEM driver
	  paths that may slow the system down and if hit hang the machine.

	  Recommended for driver developers only.

	  If in doubt, say "N".

config DRM_I915_DEBUG_GEM_ONCE
	bool "Make a GEM debug failure fatal"
	default n
	depends on DRM_I915_DEBUG_GEM
	help
	  During development, we often only want the very first failure
	  as that would otherwise be lost in the deluge of subsequent
	  failures. However, more casual testers may not want to trigger
	  a hard BUG_ON and hope that the system remains sufficiently usable
	  to capture a bug report in situ.

	  Recommended for driver developers only.

	  If in doubt, say "N".

config DRM_I915_ERRLOG_GEM
	bool "Insert extra logging (very verbose) for common GEM errors"
	default n
	depends on DRM_I915_DEBUG_GEM
	help
	  Enable additional logging that may help track down the cause of
	  principally userspace errors.

	  Recommended for driver developers only.

	  If in doubt, say "N".

config DRM_I915_TRACE_GEM
	bool "Insert extra ftrace output from the GEM internals"
	depends on DRM_I915_DEBUG_GEM
	select TRACING
	default n
	help
	  Enable additional and verbose debugging output that will spam
	  ordinary tests, but may be vital for post-mortem debugging when
	  used with /proc/sys/kernel/ftrace_dump_on_oops

	  Recommended for driver developers only.

	  If in doubt, say "N".

config DRM_I915_TRACE_GTT
	bool "Insert extra ftrace output from the GTT internals"
	depends on DRM_I915_DEBUG_GEM
	select TRACING
	default n
	help
	  Enable additional and verbose debugging output that will spam
	  ordinary tests, but may be vital for post-mortem debugging when
	  used with /proc/sys/kernel/ftrace_dump_on_oops

	  Recommended for driver developers only.

	  If in doubt, say "N".

config DRM_I915_SW_FENCE_DEBUG_OBJECTS
	bool "Enable additional driver debugging for fence objects"
	depends on DRM_I915
	select DEBUG_OBJECTS
	default n
	help
	  Choose this option to turn on extra driver debugging that may affect
	  performance but will catch some internal issues.

	  Recommended for driver developers only.

	  If in doubt, say "N".

config DRM_I915_SW_FENCE_CHECK_DAG
	bool "Enable additional driver debugging for detecting dependency cycles"
	depends on DRM_I915
	default n
	help
	  Choose this option to turn on extra driver debugging that may affect
	  performance but will catch some internal issues.

	  Recommended for driver developers only.

	  If in doubt, say "N".

config DRM_I915_DEBUG_GUC
	bool "Enable additional driver debugging for GuC"
	depends on DRM_I915
	select STACKDEPOT
	default n
	help
	  Choose this option to turn on extra driver debugging that may affect
	  performance but will help resolve GuC related issues.

	  Recommended for driver developers only.

	  If in doubt, say "N".

config DRM_I915_SELFTEST
	bool "Enable selftests upon driver load"
	depends on DRM_I915
	default n
	select DRM_EXPORT_FOR_TESTS if m
	select FAULT_INJECTION
	select PRIME_NUMBERS
	select CRC32
	help
	  Choose this option to allow the driver to perform selftests upon
	  loading; also requires the i915.selftest=1 module parameter. To
	  exit the module after running the selftests (i.e. to prevent normal
	  module initialisation afterwards) use i915.selftest=-1.

	  Recommended for driver developers only.

	  If in doubt, say "N".

config DRM_I915_SELFTEST_BROKEN
	bool "Enable broken and dangerous selftests"
	depends on DRM_I915_SELFTEST
	depends on BROKEN
	default n
	help
	  This option enables the execution of selftests that are "dangerous"
	  and may trigger unintended HW side-effects as they break strict
	  rules given in the HW specification. For science.

	  Recommended for masochistic driver developers only.

	  If in doubt, say "N".

config DRM_I915_LOW_LEVEL_TRACEPOINTS
	bool "Enable low level request tracing events"
	depends on DRM_I915
	default n
	help
	  Choose this option to turn on low level request tracing events.
	  This provides the ability to precisely monitor engine utilisation
	  and also analyze the request dependency resolving timeline.

	  Recommended for driver developers only.

	  If in doubt, say "N".

config DRM_I915_DEBUG_VBLANK_EVADE
	bool "Enable extra debug warnings for vblank evasion"
	depends on DRM_I915
	default n
	help
	  Choose this option to turn on extra debug warnings for the
	  vblank evade mechanism. This gives a warning every time the
	  the deadline allotted for the vblank evade critical section
	  is exceeded, even if there isn't an actual risk of missing
	  the vblank.

	  Recommended for driver developers only.

	  If in doubt, say "N".

config DRM_I915_DEBUG_RUNTIME_PM
	bool "Enable extra state checking for runtime PM"
	depends on DRM_I915
	default n
	select REF_TRACKER
	select STACKDEPOT
	select STACKTRACE
	help
	  Choose this option to turn on extra state checking for the
	  runtime PM functionality. This may introduce overhead during
	  driver loading, suspend and resume operations.

	  Recommended for driver developers only.

	  If in doubt, say "N"

config DRM_I915_DEBUG_WAKEREF
	bool "Enable extra tracking for wakerefs"
	depends on DRM_I915
	select REF_TRACKER
	select STACKDEPOT
	select STACKTRACE
	help
	  Choose this option to turn on extra state checking and usage
	  tracking for the wakerefPM functionality. This may introduce
	  overhead during driver runtime.

	  If in doubt, say "N"
