mirror of
https://gitee.com/openharmony/kernel_linux
synced 2025-05-15 03:06:35 +00:00
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: Mauro Carvalho Chehab <mchehab@s-opensource.com> Signed-off-by: Jonathan Corbet <corbet@lwn.net>
This commit is contained in:
parent
c6ebaf6bdb
commit
2a26ed8e4a
@ -1,14 +1,17 @@
|
|||||||
/*
|
.. 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
|
||||||
|
Loading…
x
Reference in New Issue
Block a user