# 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 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"
