1 Using the mtty vfio-mdev sample code 2 ==================================== 3 4 mtty is a sample vfio-mdev driver that demonstrates how to use the mediated 5 device framework. 6 7 The sample driver creates an mdev device that simulates a serial port over a PCI 8 card. 9 10 1. Build and load the mtty.ko module. 11 12 This step creates a dummy device, /sys/devices/virtual/mtty/mtty/ 13 14 Files in this device directory in sysfs are similar to the following:: 15 16 # tree /sys/devices/virtual/mtty/mtty/ 17 /sys/devices/virtual/mtty/mtty/ 18 |-- mdev_supported_types 19 | |-- mtty-1 20 | | |-- available_instances 21 | | |-- create 22 | | |-- device_api 23 | | |-- devices 24 | | `-- name 25 | `-- mtty-2 26 | |-- available_instances 27 | |-- create 28 | |-- device_api 29 | |-- devices 30 | `-- name 31 |-- mtty_dev 32 | `-- sample_mtty_dev 33 |-- power 34 | |-- autosuspend_delay_ms 35 | |-- control 36 | |-- runtime_active_time 37 | |-- runtime_status 38 | `-- runtime_suspended_time 39 |-- subsystem -> ../../../../class/mtty 40 `-- uevent 41 42 2. Create a mediated device by using the dummy device that you created in the 43 previous step:: 44 45 # echo "83b8f4f2-509f-382f-3c1e-e6bfe0fa1001" > \ 46 /sys/devices/virtual/mtty/mtty/mdev_supported_types/mtty-2/create 47 48 3. Add parameters to qemu-kvm:: 49 50 -device vfio-pci,\ 51 sysfsdev=/sys/bus/mdev/devices/83b8f4f2-509f-382f-3c1e-e6bfe0fa1001 52 53 4. Boot the VM. 54 55 In the Linux guest VM, with no hardware on the host, the device appears 56 as follows:: 57 58 # lspci -s 00:05.0 -xxvv 59 00:05.0 Serial controller: Device 4348:3253 (rev 10) (prog-if 02 [16550]) 60 Subsystem: Device 4348:3253 61 Physical Slot: 5 62 Control: I/O+ Mem- BusMaster- SpecCycle- MemWINV- VGASnoop- ParErr- 63 Stepping- SERR- FastB2B- DisINTx- 64 Status: Cap- 66MHz- UDF- FastB2B- ParErr- DEVSEL=medium >TAbort- 65 <TAbort- <MAbort- >SERR- <PERR- INTx- 66 Interrupt: pin A routed to IRQ 10 67 Region 0: I/O ports at c150 [size=8] 68 Region 1: I/O ports at c158 [size=8] 69 Kernel driver in use: serial 70 00: 48 43 53 32 01 00 00 02 10 02 00 07 00 00 00 00 71 10: 51 c1 00 00 59 c1 00 00 00 00 00 00 00 00 00 00 72 20: 00 00 00 00 00 00 00 00 00 00 00 00 48 43 53 32 73 30: 00 00 00 00 00 00 00 00 00 00 00 00 0a 01 00 00 74 75 In the Linux guest VM, dmesg output for the device is as follows: 76 77 serial 0000:00:05.0: PCI INT A -> Link[LNKA] -> GSI 10 (level, high) -> IRQ 10 78 0000:00:05.0: ttyS1 at I/O 0xc150 (irq = 10) is a 16550A 79 0000:00:05.0: ttyS2 at I/O 0xc158 (irq = 10) is a 16550A 80 81 82 5. In the Linux guest VM, check the serial ports:: 83 84 # setserial -g /dev/ttyS* 85 /dev/ttyS0, UART: 16550A, Port: 0x03f8, IRQ: 4 86 /dev/ttyS1, UART: 16550A, Port: 0xc150, IRQ: 10 87 /dev/ttyS2, UART: 16550A, Port: 0xc158, IRQ: 10 88 89 6. Using minicom or any terminal emulation program, open port /dev/ttyS1 or 90 /dev/ttyS2 with hardware flow control disabled. 91 92 7. Type data on the minicom terminal or send data to the terminal emulation 93 program and read the data. 94 95 Data is loop backed from hosts mtty driver. 96 97 8. Destroy the mediated device that you created:: 98 99 # echo 1 > /sys/bus/mdev/devices/83b8f4f2-509f-382f-3c1e-e6bfe0fa1001/remove 100
Linux® is a registered trademark of Linus Torvalds in the United States and other countries.
TOMOYO® is a registered trademark of NTT DATA CORPORATION.