# SPDX-License-Identifier: GPL-2.0-only
config VHOST_IOTLB
	tristate
	help
	  Generic IOTLB implementation for vhost and vringh.
	  This option is selected by any driver which needs to support
	  an IOMMU in software.

config VHOST_RING
	tristate
	select VHOST_IOTLB
	help
	  This option is selected by any driver which needs to access
	  the host side of a virtio ring.

config VHOST_TASK
	bool
	default n

config VHOST
	tristate
	select VHOST_IOTLB
	select VHOST_TASK
	help
	  This option is selected by any driver which needs to access
	  the core of vhost.

menuconfig VHOST_MENU
	bool "VHOST drivers"
	default y

if VHOST_MENU

config VHOST_NET
	tristate "Host kernel accelerator for virtio net"
	depends on NET && EVENTFD && (TUN || !TUN) && (TAP || !TAP)
	select VHOST
	help
	  This kernel module can be loaded in host kernel to accelerate
	  guest networking with virtio_net. Not to be confused with virtio_net
	  module itself which needs to be loaded in guest kernel.

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

config VHOST_SCSI
	tristate "VHOST_SCSI TCM fabric driver"
	depends on TARGET_CORE && EVENTFD
	select VHOST
	select SG_POOL
	default n
	help
	Say M here to enable the vhost_scsi TCM fabric module
	for use with virtio-scsi guests

config VHOST_VSOCK
	tristate "vhost virtio-vsock driver"
	depends on VSOCKETS && EVENTFD
	select VHOST
	select VIRTIO_VSOCKETS_COMMON
	default n
	help
	This kernel module can be loaded in the host kernel to provide AF_VSOCK
	sockets for communicating with guests.  The guests must have the
	virtio_transport.ko driver loaded to use the virtio-vsock device.

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

config VHOST_VDPA
	tristate "Vhost driver for vDPA-based backend"
	depends on EVENTFD
	select VHOST
	select IRQ_BYPASS_MANAGER
	depends on VDPA
	help
	  This kernel module can be loaded in host kernel to accelerate
	  guest virtio devices with the vDPA-based backends.

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

config VHOST_CROSS_ENDIAN_LEGACY
	bool "Cross-endian support for vhost"
	default n
	help
	  This option allows vhost to support guests with a different byte
	  ordering from host while using legacy virtio.

	  Userspace programs can control the feature using the
	  VHOST_SET_VRING_ENDIAN and VHOST_GET_VRING_ENDIAN ioctls.

	  This is only useful on a few platforms (ppc64 and arm64). Since it
	  adds some overhead, it is disabled by default.

	  If unsure, say "N".

config VHOST_ENABLE_FORK_OWNER_CONTROL
	bool "Enable VHOST_ENABLE_FORK_OWNER_CONTROL"
	default y
	help
	  This option enables two IOCTLs: VHOST_SET_FORK_FROM_OWNER and
	  VHOST_GET_FORK_FROM_OWNER. These allow userspace applications
	  to modify the vhost worker mode for vhost devices.

	  Also expose module parameter 'fork_from_owner_default' to allow users
	  to configure the default mode for vhost workers.

	  By default, `VHOST_ENABLE_FORK_OWNER_CONTROL` is set to `y`,
	  users can change the worker thread mode as needed.
	  If this config is disabled (n),the related IOCTLs and parameters will
	  be unavailable.

	  If unsure, say "Y".

endif
