# SPDX-License-Identifier: GPL-2.0
#
# PCI configuration
#

# select this to offer the PCI prompt
config HAVE_PCI
	bool

# select this to unconditionally force on PCI support
config FORCE_PCI
	bool
	select HAVE_PCI
	select PCI

menuconfig PCI
	bool "PCI support"
	depends on HAVE_PCI
	help
	  This option enables support for the PCI local bus, including
	  support for PCI-X and the foundations for PCI Express support.
	  Say 'Y' here unless you know what you are doing.

config PCI_DOMAINS
	bool
	depends on PCI

config PCI_DOMAINS_GENERIC
	bool
	depends on PCI
	select PCI_DOMAINS

config PCI_SYSCALL
	bool

source "drivers/pci/pcie/Kconfig"

config PCI_MSI
	bool "Message Signaled Interrupts (MSI and MSI-X)"
	depends on PCI
	select GENERIC_MSI_IRQ
	help
	   This allows device drivers to enable MSI (Message Signaled
	   Interrupts).  Message Signaled Interrupts enable a device to
	   generate an interrupt using an inbound Memory Write on its
	   PCI bus instead of asserting a device IRQ pin.

	   Use of PCI MSI interrupts can be disabled at kernel boot time
	   by using the 'pci=nomsi' option.  This disables MSI for the
	   entire system.

	   If you don't know what to do here, say Y.

config PCI_MSI_IRQ_DOMAIN
	def_bool ARC || ARM || ARM64 || X86
	depends on PCI_MSI
	select GENERIC_MSI_IRQ_DOMAIN

config PCI_QUIRKS
	default y
	bool "Enable PCI quirk workarounds" if EXPERT
	depends on PCI
	help
	  This enables workarounds for various PCI chipset bugs/quirks.
	  Disable this only if your target machine is unaffected by PCI
	  quirks.

config PCI_DEBUG
	bool "PCI Debugging"
	depends on PCI && DEBUG_KERNEL
	help
	  Say Y here if you want the PCI core to produce a bunch of debug
	  messages to the system log.  Select this if you are having a
	  problem with PCI support and want to see more of what is going on.

	  When in doubt, say N.

config PCI_REALLOC_ENABLE_AUTO
	bool "Enable PCI resource re-allocation detection"
	depends on PCI
	depends on PCI_IOV
	help
	  Say Y here if you want the PCI core to detect if PCI resource
	  re-allocation needs to be enabled. You can always use pci=realloc=on
	  or pci=realloc=off to override it.  It will automatically
	  re-allocate PCI resources if SR-IOV BARs have not been allocated by
	  the BIOS.

	  When in doubt, say N.

config PCI_STUB
	tristate "PCI Stub driver"
	depends on PCI
	help
	  Say Y or M here if you want be able to reserve a PCI device
	  when it is going to be assigned to a guest operating system.

	  When in doubt, say N.

config PCI_PF_STUB
	tristate "PCI PF Stub driver"
	depends on PCI
	depends on PCI_IOV
	help
	  Say Y or M here if you want to enable support for devices that
	  require SR-IOV support, while at the same time the PF (Physical
	  Function) itself is not providing any actual services on the
	  host itself such as storage or networking.

	  When in doubt, say N.

config XEN_PCIDEV_FRONTEND
        tristate "Xen PCI Frontend"
        depends on PCI && X86 && XEN
        select PCI_XEN
	select XEN_XENBUS_FRONTEND
        default y
        help
          The PCI device frontend driver allows the kernel to import arbitrary
          PCI devices from a PCI backend to support PCI driver domains.

config PCI_ATS
	bool

config PCI_ECAM
	bool

config PCI_LOCKLESS_CONFIG
	bool

config PCI_BRIDGE_EMUL
	bool

config PCI_IOV
	bool "PCI IOV support"
	depends on PCI
	select PCI_ATS
	help
	  I/O Virtualization is a PCI feature supported by some devices
	  which allows them to create virtual devices which share their
	  physical resources.

	  If unsure, say N.

config PCI_PRI
	bool "PCI PRI support"
	depends on PCI
	select PCI_ATS
	help
	  PRI is the PCI Page Request Interface. It allows PCI devices that are
	  behind an IOMMU to recover from page faults.

	  If unsure, say N.

config PCI_PASID
	bool "PCI PASID support"
	depends on PCI
	select PCI_ATS
	help
	  Process Address Space Identifiers (PASIDs) can be used by PCI devices
	  to access more than one IO address space at the same time. To make
	  use of this feature an IOMMU is required which also supports PASIDs.
	  Select this option if you have such an IOMMU and want to compile the
	  driver for it into your kernel.

	  If unsure, say N.

config PCI_P2PDMA
	bool "PCI peer-to-peer transfer support"
	depends on PCI && ZONE_DEVICE
	select GENERIC_ALLOCATOR
	help
	  Enableѕ drivers to do PCI peer-to-peer transactions to and from
	  BARs that are exposed in other devices that are the part of
	  the hierarchy where peer-to-peer DMA is guaranteed by the PCI
	  specification to work (ie. anything below a single PCI bridge).

	  Many PCIe root complexes do not support P2P transactions and
	  it's hard to tell which support it at all, so at this time,
	  P2P DMA transations must be between devices behind the same root
	  port.

	  If unsure, say N.

config PCI_LABEL
	def_bool y if (DMI || ACPI)
	depends on PCI
	select NLS

config PCI_HYPERV
        tristate "Hyper-V PCI Frontend"
        depends on PCI && X86 && HYPERV && PCI_MSI && PCI_MSI_IRQ_DOMAIN && X86_64
        help
          The PCI device frontend driver allows the kernel to import arbitrary
          PCI devices from a PCI backend to support PCI driver domains.

source "drivers/pci/hotplug/Kconfig"
source "drivers/pci/controller/Kconfig"
source "drivers/pci/endpoint/Kconfig"
source "drivers/pci/switch/Kconfig"
