Skip to content

Commit

Permalink
xen/pciback: xen pci backend driver.
Browse files Browse the repository at this point in the history
This is the host side counterpart to the frontend driver in
drivers/pci/xen-pcifront.c. The PV protocol is also implemented by
frontend drivers in other OSes too, such as the BSDs.

The PV protocol is rather simple. There is page shared with the guest,
which has the 'struct xen_pci_sharedinfo' embossed in it. The backend
has a thread that is kicked every-time the structure is changed and
based on the operation field it performs specific tasks:

 XEN_PCI_OP_conf_[read|write]:
   Read/Write 0xCF8/0xCFC filtered data. (conf_space*.c)
   Based on which field is probed, we either enable/disable the PCI
   device, change power state, read VPD, etc. The major goal of this
   call is to provide a Physical IRQ (PIRQ) to the guest.

   The PIRQ is Xen hypervisor global IRQ value irrespective of the IRQ
   is tied in to the IO-APIC, or is a vector. For GSI type
   interrupts, the PIRQ==GSI holds. For MSI/MSI-X the
   PIRQ value != Linux IRQ number (thought PIRQ==vector).

   Please note, that with Xen, all interrupts (except those level shared ones)
   are injected directly to the guest - there is no host interaction.

 XEN_PCI_OP_[enable|disable]_msi[|x] (pciback_ops.c)
   Enables/disables the MSI/MSI-X capability of the device. These operations
   setup the MSI/MSI-X vectors for the guest and pass them to the frontend.

   When the device is activated, the interrupts are directly injected in the
   guest without involving the host.

 XEN_PCI_OP_aer_[detected|resume|mmio|slotreset]: In case of failure,
  perform the appropriate AER commands on the guest. Right now that is
  a cop-out - we just kill the guest.

Besides implementing those commands, it can also

 - hide a PCI device from the host. When booting up, the user can specify
   xen-pciback.hide=(1:0:0)(BDF..) so that host does not try to use the
   device.

The driver was lifted from linux-2.6.18.hg tree and fixed up
so that it could compile under v3.0. Per suggestion from Jesse Barnes
moved the driver to drivers/xen/xen-pciback.

Signed-off-by: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
Signed-off-by: Jeremy Fitzhardinge <jeremy.fitzhardinge@citrix.com>
  • Loading branch information
Konrad Rzeszutek Wilk committed Jul 20, 2011
1 parent 5629937 commit 30edc14
Show file tree
Hide file tree
Showing 21 changed files with 4,767 additions and 0 deletions.
43 changes: 43 additions & 0 deletions drivers/xen/Kconfig
Original file line number Diff line number Diff line change
Expand Up @@ -105,4 +105,47 @@ config SWIOTLB_XEN
depends on PCI
select SWIOTLB

config XEN_PCIDEV_BACKEND
tristate "Xen PCI-device backend driver"
depends on PCI && X86 && XEN
depends on XEN_BACKEND
help
The PCI device backend driver allows the kernel to export arbitrary
PCI devices to other guests. If you select this to be a module, you
will need to make sure no other driver has bound to the device(s)
you want to make visible to other guests.

choice
prompt "PCI Backend Mode"
depends on XEN_PCIDEV_BACKEND

config XEN_PCIDEV_BACKEND_VPCI
bool "Virtual PCI"
help
This PCI Backend hides the true PCI topology and makes the frontend
think there is a single PCI bus with only the exported devices on it.
For example, a device at 03:05.0 will be re-assigned to 00:00.0. A
second device at 02:1a.1 will be re-assigned to 00:01.1.

config XEN_PCIDEV_BACKEND_PASS
bool "Passthrough"
help
This PCI Backend provides a real view of the PCI topology to the
frontend (for example, a device at 06:01.b will still appear at
06:01.b to the frontend). This is similar to how Xen 2.0.x exposed
PCI devices to its driver domains. This may be required for drivers
which depend on finding their hardward in certain bus/slot
locations.

endchoice

config XEN_PCIDEV_BE_DEBUG
bool "Xen PCI Backend Debugging"
depends on XEN_PCIDEV_BACKEND
default n
help
Allows to observe all of the traffic from the frontend/backend
when reading and writting to the configuration registers.
If in doubt, say no.

endmenu
1 change: 1 addition & 0 deletions drivers/xen/Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@ obj-$(CONFIG_XEN_SYS_HYPERVISOR) += sys-hypervisor.o
obj-$(CONFIG_XEN_PLATFORM_PCI) += xen-platform-pci.o
obj-$(CONFIG_SWIOTLB_XEN) += swiotlb-xen.o
obj-$(CONFIG_XEN_DOM0) += pci.o
obj-$(CONFIG_XEN_PCIDEV_BACKEND) += xen-pciback/

xen-evtchn-y := evtchn.o
xen-gntdev-y := gntdev.o
Expand Down
17 changes: 17 additions & 0 deletions drivers/xen/xen-pciback/Makefile
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
obj-$(CONFIG_XEN_PCIDEV_BACKEND) += pciback.o

pciback-y := pci_stub.o pciback_ops.o xenbus.o
pciback-y += conf_space.o conf_space_header.o \
conf_space_capability.o \
conf_space_capability_vpd.o \
conf_space_capability_pm.o \
conf_space_quirks.o
pciback-$(CONFIG_PCI_MSI) += conf_space_capability_msi.o
pciback-$(CONFIG_XEN_PCIDEV_BACKEND_VPCI) += vpci.o
pciback-$(CONFIG_XEN_PCIDEV_BACKEND_SLOT) += slot.o
pciback-$(CONFIG_XEN_PCIDEV_BACKEND_PASS) += passthrough.o
pciback-$(CONFIG_XEN_PCIDEV_BACKEND_CONTROLLER) += controller.o

ifeq ($(CONFIG_XEN_PCIDEV_BE_DEBUG),y)
EXTRA_CFLAGS += -DDEBUG
endif
Loading

0 comments on commit 30edc14

Please sign in to comment.