# SPDX-License-Identifier: GPL-2.0-only
config VIRTIO_ANCHOR
	bool

config VIRTIO
	tristate
	select VIRTIO_ANCHOR
	help
	  This option is selected by any driver which implements the virtio
	  bus, such as CONFIG_VIRTIO_PCI, CONFIG_VIRTIO_MMIO, CONFIG_RPMSG
	  or CONFIG_S390_GUEST.

config VIRTIO_PCI_LIB
	tristate
	help
	  Modern PCI device implementation. This module implements the
	  basic probe and control for devices which are based on modern
	  PCI device with possible vendor specific extensions. Any
	  module that selects this module must depend on PCI.

config VIRTIO_PCI_LIB_LEGACY
	tristate
	help
	  Legacy PCI device (Virtio PCI Card 0.9.x Draft and older device)
	  implementation.
	  This module implements the basic probe and control for devices
	  which are based on legacy PCI device. Any module that selects this
	  module must depend on PCI.

menuconfig VIRTIO_MENU
	bool "Virtio drivers"
	default y

if VIRTIO_MENU

config VIRTIO_HARDEN_NOTIFICATION
        bool "Harden virtio notification"
        depends on BROKEN
        help
          Enable this to harden the device notifications and suppress
          those that happen at a time where notifications are illegal.

          Experimental: Note that several drivers still have issues that
          may cause crashes or hangs when correct handling of
          notifications is enforced; depending on the subset of
          drivers and devices you use, this may or may not work.

          If unsure, say N.

config VIRTIO_PCI
	tristate "PCI driver for virtio devices"
	depends on PCI
	select VIRTIO_PCI_LIB
	select VIRTIO
	help
	  This driver provides support for virtio based paravirtual device
	  drivers over PCI.  This requires that your VMM has appropriate PCI
	  virtio backends.  Most QEMU based VMMs should support these devices
	  (like KVM or Xen).

	  If unsure, say M.

config VIRTIO_PCI_ADMIN_LEGACY
	bool
	depends on VIRTIO_PCI && (X86 || COMPILE_TEST)
	default y

config VIRTIO_PCI_LEGACY
	bool "Support for legacy virtio draft 0.9.X and older devices"
	default y
	depends on VIRTIO_PCI
	select VIRTIO_PCI_LIB_LEGACY
	help
          Virtio PCI Card 0.9.X Draft (circa 2014) and older device support.

	  This option enables building a transitional driver, supporting
	  both devices conforming to Virtio 1 specification, and legacy devices.
	  If disabled, you get a slightly smaller, non-transitional driver,
	  with no legacy compatibility.

          So look out into your driveway.  Do you have a flying car?  If
          so, you can happily disable this option and virtio will not
          break.  Otherwise, leave it set.  Unless you're testing what
          life will be like in The Future.

	  If unsure, say Y.

config VIRTIO_VDPA
	tristate "vDPA driver for virtio devices"
	depends on VDPA
	select VIRTIO
	help
	  This driver provides support for virtio based paravirtual
	  device driver over vDPA bus. For this to be useful, you need
	  an appropriate vDPA device implementation that operates on a
	  physical device to allow the datapath of virtio to be
	  offloaded to hardware.

	  If unsure, say M.

config VIRTIO_PMEM
	tristate "Support for virtio pmem driver"
	depends on VIRTIO
	depends on LIBNVDIMM
	help
	  This driver provides access to virtio-pmem devices, storage devices
	  that are mapped into the physical address space - similar to NVDIMMs
	   - with a virtio-based flushing interface.

	  If unsure, say Y.

config VIRTIO_BALLOON
	tristate "Virtio balloon driver"
	depends on VIRTIO
	select BALLOON
	select PAGE_REPORTING
	help
	 This driver supports increasing and decreasing the amount
	 of memory within a KVM guest.

	 If unsure, say M.

config VIRTIO_MEM
	tristate "Virtio mem driver"
	depends on X86_64 || ARM64 || RISCV || S390
	depends on VIRTIO
	depends on MEMORY_HOTPLUG
	depends on MEMORY_HOTREMOVE
	depends on CONTIG_ALLOC
	depends on EXCLUSIVE_SYSTEM_RAM
	help
	 This driver provides access to virtio-mem paravirtualized memory
	 devices, allowing to hotplug and hotunplug memory.

	 This driver currently supports x86-64, arm64, riscv and s390.
	 Although it should compile on other architectures that implement
	 memory hot(un)plug, architecture-specific and/or common
	 code changes may be required for virtio-mem, kdump and kexec to
	 work as expected.

	 If unsure, say M.

config VIRTIO_INPUT
	tristate "Virtio input driver"
	depends on VIRTIO
	depends on INPUT
	help
	 This driver supports virtio input devices such as
	 keyboards, mice and tablets.

	 If unsure, say M.

config VIRTIO_MMIO
	tristate "Platform bus driver for memory mapped virtio devices"
	depends on HAS_IOMEM && HAS_DMA
	select VIRTIO
	help
	 This drivers provides support for memory mapped virtio
	 platform device driver.

 	 If unsure, say N.

config VIRTIO_MMIO_CMDLINE_DEVICES
	bool "Memory mapped virtio devices parameter parsing"
	depends on VIRTIO_MMIO
	help
	 Allow virtio-mmio devices instantiation via the kernel command line
	 or module parameters. Be aware that using incorrect parameters (base
	 address in particular) can crash your system - you have been warned.
	 See Documentation/admin-guide/kernel-parameters.rst for details.

	 If unsure, say 'N'.

config VIRTIO_DMA_SHARED_BUFFER
	tristate
	depends on DMA_SHARED_BUFFER
	help
	 This option adds a flavor of dma buffers that are backed by
	 virtio resources.

config VIRTIO_DEBUG
	bool "Debug facilities"
	depends on VIRTIO
	help
	  Enable this to expose debug facilities over debugfs.
	  This allows to debug features, to see what features the device
	  advertises and to set filter for features used by driver.

	  If unsure, say N.

config VIRTIO_RTC
	tristate "Virtio RTC driver"
	depends on VIRTIO
	depends on PTP_1588_CLOCK_OPTIONAL
	help
	 This driver provides current time from a Virtio RTC device. The driver
	 provides the time through one or more clocks. The Virtio RTC PTP
	 clocks and/or the Real Time Clock driver for Virtio RTC must be
	 enabled to expose the clocks to userspace.

	 To compile this code as a module, choose M here: the module will be
	 called virtio_rtc.

	 If unsure, say M.

if VIRTIO_RTC

comment "WARNING: Consider enabling VIRTIO_RTC_PTP and/or VIRTIO_RTC_CLASS."
	depends on !VIRTIO_RTC_PTP && !VIRTIO_RTC_CLASS

comment "Enable PTP_1588_CLOCK in order to enable VIRTIO_RTC_PTP."
	depends on PTP_1588_CLOCK=n

config VIRTIO_RTC_PTP
	bool "Virtio RTC PTP clocks"
	default y
	depends on PTP_1588_CLOCK
	help
	 This exposes any Virtio RTC clocks as PTP Hardware Clocks (PHCs) to
	 userspace. The PHC sysfs attribute "clock_name" describes the clock
	 type.

	 If unsure, say Y.

config VIRTIO_RTC_ARM
	bool "Virtio RTC cross-timestamping using Arm Generic Timer"
	default y
	depends on VIRTIO_RTC_PTP && ARM_ARCH_TIMER
	help
	 This enables Virtio RTC cross-timestamping using the Arm Generic Timer.
	 It only has an effect if the Virtio RTC device also supports this. The
	 cross-timestamp is available through the PTP clock driver precise
	 cross-timestamp ioctl (PTP_SYS_OFFSET_PRECISE2 aka
	 PTP_SYS_OFFSET_PRECISE).

	 If unsure, say Y.

comment "Enable RTC_CLASS in order to enable VIRTIO_RTC_CLASS."
	depends on RTC_CLASS=n

config VIRTIO_RTC_CLASS
	bool "Real Time Clock driver for Virtio RTC"
	default y
	depends on RTC_CLASS
	help
	 This exposes the Virtio RTC UTC-like clock as a Linux Real Time Clock.
	 It only has an effect if the Virtio RTC device has a UTC-like clock
	 which smears leap seconds to avoid steps. The Real Time Clock is
	 read-only, and may support setting an alarm.

	 If unsure, say Y.

endif # VIRTIO_RTC

endif # VIRTIO_MENU
