Commit 68f5d3f3 authored by Johannes Berg's avatar Johannes Berg Committed by Richard Weinberger
Browse files

um: add PCI over virtio emulation driver



To support testing of PCI/PCIe drivers in UML, add a PCI bus
support driver. This driver uses virtio, which in UML is really
just vhost-user, to talk to devices, and adds the devices to
the virtual PCI bus in the system.

Since virtio already allows DMA/bus mastering this really isn't
all that hard, of course we need the logic_iomem infrastructure
that was added by a previous patch.

The protocol to talk to the device is has a few fairly simple
messages for reading to/writing from config and IO spaces, and
messages for the device to send the various interrupts (INT#,
MSI/MSI-X and while suspended PME#).

Note that currently no offical virtio device ID is assigned for
this protocol, as a consequence this patch requires defining it
in the Kconfig, with a default that makes the driver refuse to
work at all.

Finally, in order to add support for MSI/MSI-X interrupts, some
small changes are needed in the UML IRQ code, it needs to have
more interrupts, changing NR_IRQS from 64 to 128 if this driver
is enabled, but not actually use them for anything so that the
generic IRQ domain/MSI infrastructure can allocate IRQ numbers.

Signed-off-by: default avatarJohannes Berg <johannes.berg@intel.com>
Signed-off-by: default avatarRichard Weinberger <richard@nod.at>
parent a5ab7c84
Loading
Loading
Loading
Loading
+12 −1
Original line number Diff line number Diff line
@@ -15,7 +15,7 @@ config UML
	select HAVE_FUTEX_CMPXCHG if FUTEX
	select HAVE_DEBUG_KMEMLEAK
	select HAVE_DEBUG_BUGVERBOSE
	select NO_DMA
	select NO_DMA if !UML_DMA_EMULATION
	select GENERIC_IRQ_SHOW
	select GENERIC_CPU_DEVICES
	select HAVE_GCC_PLUGINS
@@ -26,10 +26,21 @@ config MMU
	bool
	default y

config UML_DMA_EMULATION
	bool

config NO_IOMEM
	bool "disable IOMEM" if EXPERT
	depends on !INDIRECT_IOMEM
	default y

config UML_IOMEM_EMULATION
	bool
	select INDIRECT_IOMEM
	select GENERIC_PCI_IOMAP
	select GENERIC_IOMAP
	select NO_GENERIC_PCI_IOPORT_MAP

config NO_IOPORT_MAP
	def_bool y

+20 −0
Original line number Diff line number Diff line
@@ -357,3 +357,23 @@ config UML_RTC
	  rtcwake, especially in time-travel mode. This driver enables that
	  by providing a fake RTC clock that causes a wakeup at the right
	  time.

config UML_PCI_OVER_VIRTIO
	bool "Enable PCI over VIRTIO device simulation"
	# in theory, just VIRTIO is enough, but that causes recursion
	depends on VIRTIO_UML
	select FORCE_PCI
	select UML_IOMEM_EMULATION
	select UML_DMA_EMULATION
	select PCI_MSI
	select PCI_MSI_IRQ_DOMAIN
	select PCI_LOCKLESS_CONFIG

config UML_PCI_OVER_VIRTIO_DEVICE_ID
	int "set the virtio device ID for PCI emulation"
	default -1
	depends on UML_PCI_OVER_VIRTIO
	help
	  There's no official device ID assigned (yet), set the one you
	  wish to use for experimentation here. The default of -1 is
	  not valid and will cause the driver to fail at probe.
+1 −0
Original line number Diff line number Diff line
@@ -64,6 +64,7 @@ obj-$(CONFIG_BLK_DEV_COW_COMMON) += cow_user.o
obj-$(CONFIG_UML_RANDOM) += random.o
obj-$(CONFIG_VIRTIO_UML) += virtio_uml.o
obj-$(CONFIG_UML_RTC) += rtc.o
obj-$(CONFIG_UML_PCI_OVER_VIRTIO) += virt-pci.o

# pcap_user.o must be added explicitly.
USER_OBJS := fd.o null.o pty.o tty.o xterm.o slip_common.o pcap_user.o vde_user.o vector_user.o
+885 −0

File added.

Preview size limit exceeded, changes collapsed.

+0 −1
Original line number Diff line number Diff line
@@ -18,7 +18,6 @@ generic-y += mcs_spinlock.h
generic-y += mmiowb.h
generic-y += module.lds.h
generic-y += param.h
generic-y += pci.h
generic-y += percpu.h
generic-y += preempt.h
generic-y += softirq_stack.h
Loading