101 lines
		
	
	
		
			3.4 KiB
		
	
	
	
		
			ReStructuredText
		
	
	
	
	
	
			
		
		
	
	
			101 lines
		
	
	
		
			3.4 KiB
		
	
	
	
		
			ReStructuredText
		
	
	
	
	
	
Using the mtty vfio-mdev sample code
 | 
						|
====================================
 | 
						|
 | 
						|
mtty is a sample vfio-mdev driver that demonstrates how to use the mediated
 | 
						|
device framework.
 | 
						|
 | 
						|
The sample driver creates an mdev device that simulates a serial port over a PCI
 | 
						|
card.
 | 
						|
 | 
						|
1. Build and load the mtty.ko module.
 | 
						|
 | 
						|
   This step creates a dummy device, /sys/devices/virtual/mtty/mtty/
 | 
						|
 | 
						|
   Files in this device directory in sysfs are similar to the following::
 | 
						|
 | 
						|
     # tree /sys/devices/virtual/mtty/mtty/
 | 
						|
        /sys/devices/virtual/mtty/mtty/
 | 
						|
        |-- mdev_supported_types
 | 
						|
        |   |-- mtty-1
 | 
						|
        |   |   |-- available_instances
 | 
						|
        |   |   |-- create
 | 
						|
        |   |   |-- device_api
 | 
						|
        |   |   |-- devices
 | 
						|
        |   |   `-- name
 | 
						|
        |   `-- mtty-2
 | 
						|
        |       |-- available_instances
 | 
						|
        |       |-- create
 | 
						|
        |       |-- device_api
 | 
						|
        |       |-- devices
 | 
						|
        |       `-- name
 | 
						|
        |-- mtty_dev
 | 
						|
        |   `-- sample_mtty_dev
 | 
						|
        |-- power
 | 
						|
        |   |-- autosuspend_delay_ms
 | 
						|
        |   |-- control
 | 
						|
        |   |-- runtime_active_time
 | 
						|
        |   |-- runtime_status
 | 
						|
        |   `-- runtime_suspended_time
 | 
						|
        |-- subsystem -> ../../../../class/mtty
 | 
						|
        `-- uevent
 | 
						|
 | 
						|
2. Create a mediated device by using the dummy device that you created in the
 | 
						|
   previous step::
 | 
						|
 | 
						|
     # echo "83b8f4f2-509f-382f-3c1e-e6bfe0fa1001" >	\
 | 
						|
              /sys/devices/virtual/mtty/mtty/mdev_supported_types/mtty-2/create
 | 
						|
 | 
						|
3. Add parameters to qemu-kvm::
 | 
						|
 | 
						|
     -device vfio-pci,\
 | 
						|
      sysfsdev=/sys/bus/mdev/devices/83b8f4f2-509f-382f-3c1e-e6bfe0fa1001
 | 
						|
 | 
						|
4. Boot the VM.
 | 
						|
 | 
						|
   In the Linux guest VM, with no hardware on the host, the device appears
 | 
						|
   as  follows::
 | 
						|
 | 
						|
     # lspci -s 00:05.0 -xxvv
 | 
						|
     00:05.0 Serial controller: Device 4348:3253 (rev 10) (prog-if 02 [16550])
 | 
						|
             Subsystem: Device 4348:3253
 | 
						|
             Physical Slot: 5
 | 
						|
             Control: I/O+ Mem- BusMaster- SpecCycle- MemWINV- VGASnoop- ParErr-
 | 
						|
     Stepping- SERR- FastB2B- DisINTx-
 | 
						|
             Status: Cap- 66MHz- UDF- FastB2B- ParErr- DEVSEL=medium >TAbort-
 | 
						|
     <TAbort- <MAbort- >SERR- <PERR- INTx-
 | 
						|
             Interrupt: pin A routed to IRQ 10
 | 
						|
             Region 0: I/O ports at c150 [size=8]
 | 
						|
             Region 1: I/O ports at c158 [size=8]
 | 
						|
             Kernel driver in use: serial
 | 
						|
     00: 48 43 53 32 01 00 00 02 10 02 00 07 00 00 00 00
 | 
						|
     10: 51 c1 00 00 59 c1 00 00 00 00 00 00 00 00 00 00
 | 
						|
     20: 00 00 00 00 00 00 00 00 00 00 00 00 48 43 53 32
 | 
						|
     30: 00 00 00 00 00 00 00 00 00 00 00 00 0a 01 00 00
 | 
						|
 | 
						|
     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 10
 | 
						|
     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
 | 
						|
 | 
						|
 | 
						|
5. In the Linux guest VM, check the serial ports::
 | 
						|
 | 
						|
     # setserial -g /dev/ttyS*
 | 
						|
     /dev/ttyS0, UART: 16550A, Port: 0x03f8, IRQ: 4
 | 
						|
     /dev/ttyS1, UART: 16550A, Port: 0xc150, IRQ: 10
 | 
						|
     /dev/ttyS2, UART: 16550A, Port: 0xc158, IRQ: 10
 | 
						|
 | 
						|
6. Using minicom or any terminal emulation program, open port /dev/ttyS1 or
 | 
						|
   /dev/ttyS2 with hardware flow control disabled.
 | 
						|
 | 
						|
7. Type data on the minicom terminal or send data to the terminal emulation
 | 
						|
   program and read the data.
 | 
						|
 | 
						|
   Data is loop backed from hosts mtty driver.
 | 
						|
 | 
						|
8. Destroy the mediated device that you created::
 | 
						|
 | 
						|
     # echo 1 > /sys/bus/mdev/devices/83b8f4f2-509f-382f-3c1e-e6bfe0fa1001/remove
 | 
						|
 |