# SPDX-License-Identifier: GPL-2.0-only
config DRM_XE_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) xe.ko.
	  Do not enable this unless you are writing code for the xe.ko module.

	  Recommended for driver developers only.

	  If in doubt, say "N".

config DRM_XE_DEBUG
	bool "Enable additional driver debugging"
	depends on DRM_XE
	depends on EXPERT
	depends on !COMPILE_TEST
	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_XE_DEBUG_VM
	bool "Enable extra VM debugging info"
	default n
	help
	  Enable extra VM debugging info

	  Recommended for driver developers only.

	  If in doubt, say "N".

config DRM_XE_DEBUG_MEMIRQ
	bool "Enable extra memirq debugging"
	default n
	help
	  Choose this option to enable additional debugging info for
	  memory based interrupts.

	  Recommended for driver developers only.

	  If in doubt, say "N".

config DRM_XE_DEBUG_SRIOV
	bool "Enable extra SR-IOV debugging"
	default n
	select DRM_XE_DEBUG_MEMIRQ
	help
	  Enable extra SR-IOV debugging info.

	  Recommended for driver developers only.

	  If in doubt, say "N".

config DRM_XE_DEBUG_MEM
	bool "Enable passing SYS/VRAM addresses to user space"
	default n
	help
	  Pass object location through uapi. Intended for extended
	  testing and development only.

	  Recommended for driver developers only.

	  If in doubt, say "N".

config DRM_XE_KUNIT_TEST
        tristate "KUnit tests for the drm xe driver" if !KUNIT_ALL_TESTS
	depends on DRM_XE && KUNIT && DEBUG_FS
	default KUNIT_ALL_TESTS
	select DRM_EXPORT_FOR_TESTS if m
	help
	  Choose this option to allow the driver to perform selftests under
	  the kunit framework

	  Recommended for driver developers only.

	  If in doubt, say "N".

config DRM_XE_DEBUG_GUC
        bool "Enable extra GuC related debug options"
        depends on DRM_XE_DEBUG
        default n
        select STACKDEPOT
        help
          Choose this option when debugging guc issues.
          The GuC log buffer is increased to the maximum allowed, which should
          be large enough for complex issues. The tracking of FAST_REQ messages
          is extended to include a record of the calling stack, which is then
          dumped on a FAST_REQ error notification.

          Recommended for driver developers only.

          If in doubt, say "N".

config DRM_XE_USERPTR_INVAL_INJECT
       bool "Inject userptr invalidation -EINVAL errors"
       default n
       help
         Choose this option when debugging error paths that
	 are hit during checks for userptr invalidations.

	 Recommended for driver developers only.
	 If in doubt, say "N".
