Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 2a26ed8e authored by Mauro Carvalho Chehab's avatar Mauro Carvalho Chehab Committed by Jonathan Corbet
Browse files

vfio-mediated-device.txt: standardize document format



Each text file under Documentation follows a different
format. Some doesn't even have titles!

In this specific document, the title, copyright and authorship
are added as if it were a C file!

Change its representation to follow the adopted standard,
using ReST markups for it to be parseable by Sphinx:
- convert document preambule to the proper format;
- mark literal blocks;
- adjust identation;
- use numbered lists for references.

Reviewed by: Kirti Wankhede <kwankhede@nvidia.com>
Signed-off-by: default avatarMauro Carvalho Chehab <mchehab@s-opensource.com>
Signed-off-by: default avatarJonathan Corbet <corbet@lwn.net>
parent c6ebaf6b
Loading
Loading
Loading
Loading
+137 −129
Original line number Original line Diff line number Diff line
/*
.. include:: <isonum.txt>
 * VFIO Mediated devices

 *
=====================
 * Copyright (c) 2016, NVIDIA CORPORATION. All rights reserved.
VFIO Mediated devices
 *     Author: Neo Jia <cjia@nvidia.com>
=====================
 *             Kirti Wankhede <kwankhede@nvidia.com>

 *
:Copyright: |copy| 2016, NVIDIA CORPORATION. All rights reserved.
 * This program is free software; you can redistribute it and/or modify
:Author: Neo Jia <cjia@nvidia.com>
 * it under the terms of the GNU General Public License version 2 as
:Author: Kirti Wankhede <kwankhede@nvidia.com>
 * published by the Free Software Foundation.

 */
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License version 2 as
published by the Free Software Foundation.



Virtual Function I/O (VFIO) Mediated devices[1]
Virtual Function I/O (VFIO) Mediated devices[1]
===============================================
===============================================
@@ -42,7 +45,7 @@ removes it from a VFIO group.


The following high-level block diagram shows the main components and interfaces
The following high-level block diagram shows the main components and interfaces
in the VFIO mediated driver framework. The diagram shows NVIDIA, Intel, and IBM
in the VFIO mediated driver framework. The diagram shows NVIDIA, Intel, and IBM
devices as examples, as these devices are the first devices to use this module.
devices as examples, as these devices are the first devices to use this module::


     +---------------+
     +---------------+
     |               |
     |               |
@@ -91,7 +94,7 @@ Registration Interface for a Mediated Bus Driver
------------------------------------------------
------------------------------------------------


The registration interface for a mediated bus driver provides the following
The registration interface for a mediated bus driver provides the following
structure to represent a mediated device's driver:
structure to represent a mediated device's driver::


     /*
     /*
      * struct mdev_driver [2] - Mediated device's driver
      * struct mdev_driver [2] - Mediated device's driver
@@ -110,12 +113,12 @@ structure to represent a mediated device's driver:
A mediated bus driver for mdev should use this structure in the function calls
A mediated bus driver for mdev should use this structure in the function calls
to register and unregister itself with the core driver:
to register and unregister itself with the core driver:


* Register:
* Register::


    extern int  mdev_register_driver(struct mdev_driver *drv,
    extern int  mdev_register_driver(struct mdev_driver *drv,
				   struct module *owner);
				   struct module *owner);


* Unregister:
* Unregister::


    extern void mdev_unregister_driver(struct mdev_driver *drv);
    extern void mdev_unregister_driver(struct mdev_driver *drv);


@@ -152,13 +155,13 @@ The callbacks in the mdev_parent_ops structure are as follows:
* mmap: mmap emulation callback
* mmap: mmap emulation callback


A driver should use the mdev_parent_ops structure in the function call to
A driver should use the mdev_parent_ops structure in the function call to
register itself with the mdev core driver:
register itself with the mdev core driver::


	extern int  mdev_register_device(struct device *dev,
	extern int  mdev_register_device(struct device *dev,
	                                 const struct mdev_parent_ops *ops);
	                                 const struct mdev_parent_ops *ops);


However, the mdev_parent_ops structure is not required in the function call
However, the mdev_parent_ops structure is not required in the function call
that a driver should use to unregister itself with the mdev core driver:
that a driver should use to unregister itself with the mdev core driver::


	extern void mdev_unregister_device(struct device *dev);
	extern void mdev_unregister_device(struct device *dev);


@@ -183,6 +186,8 @@ with the mdev core driver.
Directories and files under the sysfs for Each Physical Device
Directories and files under the sysfs for Each Physical Device
--------------------------------------------------------------
--------------------------------------------------------------


::

  |- [parent physical device]
  |- [parent physical device]
  |--- Vendor-specific-attributes [optional]
  |--- Vendor-specific-attributes [optional]
  |--- [mdev_supported_types]
  |--- [mdev_supported_types]
@@ -219,7 +224,7 @@ Directories and files under the sysfs for Each Physical Device


  The [<type-id>] name is created by adding the device driver string as a prefix
  The [<type-id>] name is created by adding the device driver string as a prefix
  to the string provided by the vendor driver. This format of this name is as
  to the string provided by the vendor driver. This format of this name is as
  follows:
  follows::


	sprintf(buf, "%s-%s", dev_driver_string(parent->dev), group->name);
	sprintf(buf, "%s-%s", dev_driver_string(parent->dev), group->name);


@@ -253,6 +258,8 @@ created.
Directories and Files Under the sysfs for Each mdev Device
Directories and Files Under the sysfs for Each mdev Device
----------------------------------------------------------
----------------------------------------------------------


::

  |- [parent phy device]
  |- [parent phy device]
  |--- [$MDEV_UUID]
  |--- [$MDEV_UUID]
         |--- remove
         |--- remove
@@ -260,14 +267,16 @@ Directories and Files Under the sysfs for Each mdev Device
         |--- vendor-specific-attributes [optional]
         |--- vendor-specific-attributes [optional]


* remove (write only)
* remove (write only)

Writing '1' to the 'remove' file destroys the mdev device. The vendor driver can
Writing '1' to the 'remove' file destroys the mdev device. The vendor driver can
fail the remove() callback if that device is active and the vendor driver
fail the remove() callback if that device is active and the vendor driver
doesn't support hot unplug.
doesn't support hot unplug.


Example:
Example::

	# echo 1 > /sys/bus/mdev/devices/$mdev_UUID/remove
	# echo 1 > /sys/bus/mdev/devices/$mdev_UUID/remove


Mediated device Hot plug:
Mediated device Hot plug
------------------------
------------------------


Mediated devices can be created and assigned at runtime. The procedure to hot
Mediated devices can be created and assigned at runtime. The procedure to hot
@@ -277,7 +286,7 @@ Translation APIs for Mediated Devices
=====================================
=====================================


The following APIs are provided for translating user pfn to host pfn in a VFIO
The following APIs are provided for translating user pfn to host pfn in a VFIO
driver:
driver::


	extern int vfio_pin_pages(struct device *dev, unsigned long *user_pfn,
	extern int vfio_pin_pages(struct device *dev, unsigned long *user_pfn,
				  int npage, int prot, unsigned long *phys_pfn);
				  int npage, int prot, unsigned long *phys_pfn);
@@ -304,7 +313,7 @@ card.


   This step creates a dummy device, /sys/devices/virtual/mtty/mtty/
   This step creates a dummy device, /sys/devices/virtual/mtty/mtty/


   Files in this device directory in sysfs are similar to the following:
   Files in this device directory in sysfs are similar to the following::


     # tree /sys/devices/virtual/mtty/mtty/
     # tree /sys/devices/virtual/mtty/mtty/
        /sys/devices/virtual/mtty/mtty/
        /sys/devices/virtual/mtty/mtty/
@@ -333,12 +342,12 @@ card.
        `-- uevent
        `-- uevent


2. Create a mediated device by using the dummy device that you created in the
2. Create a mediated device by using the dummy device that you created in the
   previous step.
   previous step::


     # echo "83b8f4f2-509f-382f-3c1e-e6bfe0fa1001" >	\
     # echo "83b8f4f2-509f-382f-3c1e-e6bfe0fa1001" >	\
              /sys/devices/virtual/mtty/mtty/mdev_supported_types/mtty-2/create
              /sys/devices/virtual/mtty/mtty/mdev_supported_types/mtty-2/create


3. Add parameters to qemu-kvm.
3. Add parameters to qemu-kvm::


     -device vfio-pci,\
     -device vfio-pci,\
      sysfsdev=/sys/bus/mdev/devices/83b8f4f2-509f-382f-3c1e-e6bfe0fa1001
      sysfsdev=/sys/bus/mdev/devices/83b8f4f2-509f-382f-3c1e-e6bfe0fa1001
@@ -346,7 +355,7 @@ card.
4. Boot the VM.
4. Boot the VM.


   In the Linux guest VM, with no hardware on the host, the device appears
   In the Linux guest VM, with no hardware on the host, the device appears
   as  follows:
   as  follows::


     # lspci -s 00:05.0 -xxvv
     # lspci -s 00:05.0 -xxvv
     00:05.0 Serial controller: Device 4348:3253 (rev 10) (prog-if 02 [16550])
     00:05.0 Serial controller: Device 4348:3253 (rev 10) (prog-if 02 [16550])
@@ -367,13 +376,12 @@ card.


     In the Linux guest VM, dmesg output for the device is as follows:
     In the Linux guest VM, dmesg output for the device is as follows:


   serial 0000:00:05.0: PCI INT A -> Link[LNKA] -> GSI 10 (level, high) -> IRQ
     serial 0000:00:05.0: PCI INT A -> Link[LNKA] -> GSI 10 (level, high) -> IRQ 10
10
     0000:00:05.0: ttyS1 at I/O 0xc150 (irq = 10) is a 16550A
     0000:00:05.0: ttyS1 at I/O 0xc150 (irq = 10) is a 16550A
     0000:00:05.0: ttyS2 at I/O 0xc158 (irq = 10) is a 16550A
     0000:00:05.0: ttyS2 at I/O 0xc158 (irq = 10) is a 16550A




5. In the Linux guest VM, check the serial ports.
5. In the Linux guest VM, check the serial ports::


     # setserial -g /dev/ttyS*
     # setserial -g /dev/ttyS*
     /dev/ttyS0, UART: 16550A, Port: 0x03f8, IRQ: 4
     /dev/ttyS0, UART: 16550A, Port: 0x03f8, IRQ: 4
@@ -388,14 +396,14 @@ card.


   Data is loop backed from hosts mtty driver.
   Data is loop backed from hosts mtty driver.


8. Destroy the mediated device that you created.
8. Destroy the mediated device that you created::


     # echo 1 > /sys/bus/mdev/devices/83b8f4f2-509f-382f-3c1e-e6bfe0fa1001/remove
     # echo 1 > /sys/bus/mdev/devices/83b8f4f2-509f-382f-3c1e-e6bfe0fa1001/remove


References
References
==========
==========


[1] See Documentation/vfio.txt for more information on VFIO.
1. See Documentation/vfio.txt for more information on VFIO.
[2] struct mdev_driver in include/linux/mdev.h
2. struct mdev_driver in include/linux/mdev.h
[3] struct mdev_parent_ops in include/linux/mdev.h
3. struct mdev_parent_ops in include/linux/mdev.h
[4] struct vfio_iommu_driver_ops in include/linux/vfio.h
4. struct vfio_iommu_driver_ops in include/linux/vfio.h