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