Commit | Line | Data |
---|---|---|
0030d7d6 CH |
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 |