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