# SPDX-License-Identifier: GPL-2.0-only
#
# 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 && HAS_DMA
	select DRM_PANEL_ORIENTATION_QUIRKS
	select HDMI
	select I2C
	select DMA_SHARED_BUFFER
	select SYNC_FILE
# gallium uses SYS_kcmp for os_same_file_description() to de-duplicate
# device and dmabuf fd. Let's make sure that is available for our userspace.
	select KCMP
	select VIDEO
	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.

if DRM

config DRM_MIPI_DBI
	tristate
	depends on DRM
	select DRM_KMS_HELPER

config DRM_MIPI_DSI
	bool
	depends on DRM

config DRM_DEBUG_MM
	bool "Insert extra checks and debug info into the DRM range managers"
	default n
	depends on DRM
	depends on STACKTRACE_SUPPORT
	select STACKDEPOT
	help
	  Enable allocation tracking of memory manager and leak detection on
	  shutdown.

	  Recommended for driver developers only.

	  If in doubt, say "N".

config DRM_USE_DYNAMIC_DEBUG
	bool "use dynamic debug to implement drm.debug"
	default n
	depends on BROKEN
	depends on DRM
	depends on DYNAMIC_DEBUG || DYNAMIC_DEBUG_CORE
	depends on JUMP_LABEL
	help
	  Use dynamic-debug to avoid drm_debug_enabled() runtime overheads.
	  Due to callsite counts in DRM drivers (~4k in amdgpu) and 56
	  bytes per callsite, the .data costs can be substantial, and
	  are therefore configurable.

config DRM_KUNIT_TEST_HELPERS
	tristate
	depends on DRM && KUNIT
	select DRM_KMS_HELPER
	help
	  KUnit Helpers for KMS drivers.

config DRM_KUNIT_TEST
	tristate "KUnit tests for DRM" if !KUNIT_ALL_TESTS
	depends on DRM && KUNIT && MMU
	select DRM_BUDDY
	select DRM_DISPLAY_DP_HELPER
	select DRM_DISPLAY_HDMI_STATE_HELPER
	select DRM_DISPLAY_HELPER
	select DRM_EXEC
	select DRM_EXPORT_FOR_TESTS if m
	select DRM_GEM_SHMEM_HELPER
	select DRM_KUNIT_TEST_HELPERS
	select DRM_LIB_RANDOM
	select PRIME_NUMBERS
	default KUNIT_ALL_TESTS
	help
	  This builds unit tests for DRM. This option is not useful for
	  distributions or general kernels, but only for kernel
	  developers working on DRM and associated drivers.

	  For more information on KUnit and unit tests in general,
	  please refer to the KUnit documentation in
	  Documentation/dev-tools/kunit/.

	  If in doubt, say "N".

config DRM_KMS_HELPER
	tristate
	depends on DRM
	select FB_CORE if DRM_FBDEV_EMULATION
	help
	  CRTC helpers for KMS drivers.

config DRM_DRAW
	bool
	depends on DRM

config DRM_PANIC
	bool "Display a user-friendly message when a kernel panic occurs"
	depends on DRM
	select FONT_SUPPORT
	select DRM_DRAW
	help
	  Enable a drm panic handler, which will display a user-friendly message
	  when a kernel panic occurs. It's useful when using a user-space
	  console instead of fbcon.
	  It will only work if your graphic driver supports this feature.
	  To support Hi-DPI Display, you can enable bigger fonts like
	  FONT_TER16x32

config DRM_PANIC_FOREGROUND_COLOR
	hex "Drm panic screen foreground color, in RGB"
	depends on DRM_PANIC
	default 0xffffff

config DRM_PANIC_BACKGROUND_COLOR
	hex "Drm panic screen background color, in RGB"
	depends on DRM_PANIC
	default 0x000000

config DRM_PANIC_DEBUG
	bool "Add a debug fs entry to trigger drm_panic"
	depends on DRM_PANIC && DEBUG_FS
	help
	  Add dri/[device]/drm_panic_plane_x in the kernel debugfs, to force the
	  panic handler to write the panic message to this plane scanout buffer.
	  This is unsafe and should not be enabled on a production build.
	  If in doubt, say "N".

config DRM_PANIC_SCREEN
	string "Panic screen formatter"
	default "user"
	depends on DRM_PANIC
	help
	  This option enable to choose what will be displayed when a kernel
	  panic occurs. You can choose between "user", a short message telling
	  the user to reboot the system, or "kmsg" which will display the last
	  lines of kmsg.
	  This can also be overridden by drm.panic_screen=xxxx kernel parameter
	  or by writing to /sys/module/drm/parameters/panic_screen sysfs entry
	  Default is "user"

config DRM_PANIC_SCREEN_QR_CODE
	bool "Add a panic screen with a QR code"
	depends on DRM_PANIC && RUST
	select ZLIB_DEFLATE
	help
	  This option adds a QR code generator, and a panic screen with a QR
	  code. The QR code will contain the last lines of kmsg and other debug
	  information. This should be easier for the user to report a kernel
	  panic, with all debug information available.
	  To use this panic screen, also set DRM_PANIC_SCREEN to "qr_code"

config DRM_PANIC_SCREEN_QR_CODE_URL
	string "Base URL of the QR code in the panic screen"
	depends on DRM_PANIC_SCREEN_QR_CODE
	help
	  This option sets the base URL to report the kernel panic. If it's set
	  the QR code will contain the URL and the kmsg compressed with zlib as
	  a URL parameter. If it's empty, the QR code will contain the kmsg as
	  uncompressed text only.
	  There is a demo code in javascript, to decode and uncompress the kmsg
	  data from the URL parameter at https://github.com/kdj0c/panic_report

config DRM_PANIC_SCREEN_QR_VERSION
	int "Maximum version (size) of the QR code."
	depends on DRM_PANIC_SCREEN_QR_CODE
	default 40
	help
	  This option limits the version (or size) of the QR code. QR code
	  version ranges from Version 1 (21x21) to Version 40 (177x177).
	  Smaller QR code are easier to read, but will contain less debugging
	  data. Default is 40.

config DRM_DEBUG_DP_MST_TOPOLOGY_REFS
        bool "Enable refcount backtrace history in the DP MST helpers"
	depends on STACKTRACE_SUPPORT
        select STACKDEPOT
        select DRM_KMS_HELPER
        depends on DEBUG_KERNEL
        depends on EXPERT
        help
          Enables debug tracing for topology refs in DRM's DP MST helpers. A
          history of each topology reference/dereference will be printed to the
          kernel log once a port or branch device's topology refcount reaches 0.

          This has the potential to use a lot of memory and print some very
          large kernel messages. If in doubt, say "N".

config DRM_DEBUG_MODESET_LOCK
	bool "Enable backtrace history for lock contention"
	depends on STACKTRACE_SUPPORT
	depends on DEBUG_KERNEL
	depends on EXPERT
	select STACKDEPOT
	default y if DEBUG_WW_MUTEX_SLOWPATH
	help
	  Enable debug tracing of failures to gracefully handle drm modeset lock
	  contention. A history of each drm modeset lock path hitting -EDEADLK
	  will be saved until gracefully handled, and the backtrace will be
	  printed when attempting to lock a contended lock.

	  If in doubt, say "N".

config DRM_CLIENT
	bool
	depends on DRM
	help
	  Enables support for DRM clients. DRM drivers that need
	  struct drm_client_dev and its interfaces should select this
	  option. Drivers that support the default clients should
	  select DRM_CLIENT_SELECTION instead.

source "drivers/gpu/drm/clients/Kconfig"

config DRM_LOAD_EDID_FIRMWARE
	bool "Allow to specify an EDID data set instead of probing for it"
	depends on DRM
	help
	  Say Y here, if you want to use EDID data to be loaded from the
	  /lib/firmware directory or one of the provided built-in
	  data sets. This may be necessary, if the graphics adapter or
	  monitor are unable to provide appropriate EDID data. Since this
	  feature is provided as a workaround for broken hardware, the
	  default case is N. Details and instructions how to build your own
	  EDID data are given in Documentation/admin-guide/edid.rst.

source "drivers/gpu/drm/display/Kconfig"

config DRM_TTM
	tristate
	depends on DRM && MMU
	help
	  GPU memory management subsystem for devices with multiple
	  GPU memory types. Will be enabled automatically if a device driver
	  uses it.

config DRM_TTM_KUNIT_TEST
        tristate "KUnit tests for TTM" if !KUNIT_ALL_TESTS
        default n
        depends on DRM && KUNIT && MMU && (UML || COMPILE_TEST)
        select DRM_TTM
        select DRM_BUDDY
        select DRM_EXPORT_FOR_TESTS if m
        select DRM_KUNIT_TEST_HELPERS
        default KUNIT_ALL_TESTS
        help
          Enables unit tests for TTM, a GPU memory manager subsystem used
          to manage memory buffers. This option is mostly useful for kernel
          developers. It depends on (UML || COMPILE_TEST) since no other driver
          which uses TTM can be loaded while running the tests.

          If in doubt, say "N".

config DRM_EXEC
	tristate
	depends on DRM
	help
	  Execution context for command submissions

config DRM_GPUVM
	tristate
	depends on DRM
	select DRM_EXEC
	help
	  GPU-VM representation providing helpers to manage a GPUs virtual
	  address space

config DRM_GPUSVM
	tristate
	depends on DRM && DEVICE_PRIVATE
	select HMM_MIRROR
	select MMU_NOTIFIER
	help
	  GPU-SVM representation providing helpers to manage a GPUs shared
	  virtual memory

config DRM_BUDDY
	tristate
	depends on DRM
	help
	  A page based buddy allocator

config DRM_VRAM_HELPER
	tristate
	depends on DRM
	help
	  Helpers for VRAM memory management

config DRM_TTM_HELPER
	tristate
	depends on DRM
	select DRM_TTM
	select DRM_KMS_HELPER if DRM_FBDEV_EMULATION
	select FB_CORE if DRM_FBDEV_EMULATION
	select FB_SYSMEM_HELPERS_DEFERRED if DRM_FBDEV_EMULATION
	help
	  Helpers for ttm-based gem objects

config DRM_GEM_DMA_HELPER
	tristate
	depends on DRM
	select DRM_KMS_HELPER if DRM_FBDEV_EMULATION
	select FB_CORE if DRM_FBDEV_EMULATION
	select FB_DMAMEM_HELPERS_DEFERRED if DRM_FBDEV_EMULATION
	help
	  Choose this if you need the GEM DMA helper functions

config DRM_GEM_SHMEM_HELPER
	tristate
	depends on DRM && MMU
	select DRM_KMS_HELPER if DRM_FBDEV_EMULATION
	select FB_CORE if DRM_FBDEV_EMULATION
	select FB_SYSMEM_HELPERS_DEFERRED if DRM_FBDEV_EMULATION
	help
	  Choose this if you need the GEM shmem helper functions

config DRM_SUBALLOC_HELPER
	tristate
	depends on DRM

config DRM_SCHED
	tristate
	depends on DRM

source "drivers/gpu/drm/arm/Kconfig"

source "drivers/gpu/drm/radeon/Kconfig"

source "drivers/gpu/drm/amd/amdgpu/Kconfig"

source "drivers/gpu/drm/nouveau/Kconfig"

source "drivers/gpu/drm/i915/Kconfig"

source "drivers/gpu/drm/xe/Kconfig"

source "drivers/gpu/drm/kmb/Kconfig"

config DRM_VGEM
	tristate "Virtual GEM provider"
	depends on DRM && MMU
	select DRM_GEM_SHMEM_HELPER
	help
	  Choose this option to get a virtual graphics memory manager,
	  as used by Mesa's software renderer for enhanced performance.
	  If M is selected the module will be called vgem.

source "drivers/gpu/drm/vkms/Kconfig"

source "drivers/gpu/drm/exynos/Kconfig"

source "drivers/gpu/drm/rockchip/Kconfig"

source "drivers/gpu/drm/vmwgfx/Kconfig"

source "drivers/gpu/drm/gma500/Kconfig"

source "drivers/gpu/drm/udl/Kconfig"

source "drivers/gpu/drm/ast/Kconfig"

source "drivers/gpu/drm/mgag200/Kconfig"

source "drivers/gpu/drm/armada/Kconfig"

source "drivers/gpu/drm/atmel-hlcdc/Kconfig"

source "drivers/gpu/drm/renesas/Kconfig"

source "drivers/gpu/drm/sun4i/Kconfig"

source "drivers/gpu/drm/omapdrm/Kconfig"

source "drivers/gpu/drm/tilcdc/Kconfig"

source "drivers/gpu/drm/qxl/Kconfig"

source "drivers/gpu/drm/virtio/Kconfig"

source "drivers/gpu/drm/msm/Kconfig"

source "drivers/gpu/drm/fsl-dcu/Kconfig"

source "drivers/gpu/drm/tegra/Kconfig"

source "drivers/gpu/drm/stm/Kconfig"

source "drivers/gpu/drm/panel/Kconfig"

source "drivers/gpu/drm/bridge/Kconfig"

source "drivers/gpu/drm/sti/Kconfig"

source "drivers/gpu/drm/imx/Kconfig"

source "drivers/gpu/drm/ingenic/Kconfig"

source "drivers/gpu/drm/v3d/Kconfig"

source "drivers/gpu/drm/vc4/Kconfig"

source "drivers/gpu/drm/loongson/Kconfig"

source "drivers/gpu/drm/etnaviv/Kconfig"

source "drivers/gpu/drm/hisilicon/Kconfig"

source "drivers/gpu/drm/logicvc/Kconfig"

source "drivers/gpu/drm/mediatek/Kconfig"

source "drivers/gpu/drm/mxsfb/Kconfig"

source "drivers/gpu/drm/meson/Kconfig"

source "drivers/gpu/drm/tiny/Kconfig"

source "drivers/gpu/drm/pl111/Kconfig"

source "drivers/gpu/drm/tve200/Kconfig"

source "drivers/gpu/drm/xen/Kconfig"

source "drivers/gpu/drm/vboxvideo/Kconfig"

source "drivers/gpu/drm/lima/Kconfig"

source "drivers/gpu/drm/panfrost/Kconfig"

source "drivers/gpu/drm/panthor/Kconfig"

source "drivers/gpu/drm/aspeed/Kconfig"

source "drivers/gpu/drm/mcde/Kconfig"

source "drivers/gpu/drm/tidss/Kconfig"

source "drivers/gpu/drm/adp/Kconfig"

source "drivers/gpu/drm/xlnx/Kconfig"

source "drivers/gpu/drm/gud/Kconfig"

source "drivers/gpu/drm/solomon/Kconfig"

source "drivers/gpu/drm/sprd/Kconfig"

source "drivers/gpu/drm/imagination/Kconfig"

config DRM_HYPERV
	tristate "DRM Support for Hyper-V synthetic video device"
	depends on DRM && PCI && MMU && HYPERV
	select DRM_CLIENT_SELECTION
	select DRM_KMS_HELPER
	select DRM_GEM_SHMEM_HELPER
	help
	 This is a KMS driver for Hyper-V synthetic video device. Choose this
	 option if you would like to enable drm driver for Hyper-V virtual
	 machine. Unselect Hyper-V framebuffer driver (CONFIG_FB_HYPERV) so
	 that DRM driver is used by default.

	 If M is selected the module will be called hyperv_drm.

config DRM_EXPORT_FOR_TESTS
	bool

# Separate option as not all DRM drivers use it
config DRM_PANEL_BACKLIGHT_QUIRKS
	tristate

config DRM_LIB_RANDOM
	bool
	default n

config DRM_PRIVACY_SCREEN
	bool
	default n

config DRM_WERROR
	bool "Compile the drm subsystem with warnings as errors"
	depends on DRM && EXPERT
	depends on !WERROR
	default n
	help
	  A kernel build should not cause any compiler warnings, and this
	  enables the '-Werror' flag to enforce that rule in the drm subsystem.

	  The drm subsystem enables more warnings than the kernel default, so
	  this config option is disabled by default.

	  If in doubt, say N.

config DRM_HEADER_TEST
	bool "Ensure DRM headers are self-contained and pass kernel-doc"
	depends on DRM && EXPERT && BROKEN
	default n
	help
	  Ensure the DRM subsystem headers both under drivers/gpu/drm and
	  include/drm compile, are self-contained, have header guards, and have
	  no kernel-doc warnings.

	  If in doubt, say N.

endif

# Separate option because drm_panel_orientation_quirks.c is shared with fbdev
config DRM_PANEL_ORIENTATION_QUIRKS
	tristate
