# Testing VFIO display with mdev mdpy

The kernel provides a sample mediated device driver, `mdpy` (`samples/vfio-mdev/mdpy.c`), that exposes a fake framebuffer through the VFIO display region interface. It can be used to test VFIO display support, including hotplug, without any real GPU hardware.

## The kernel modules

The `mdpy` driver depends on the `mdev` subsystem. Enable, build and load the modules.

The minimal set is:

    CONFIG_SAMPLE_VFIO_MDEV_MDPY=m
    CONFIG_SAMPLE_VFIO_MDEV_MDPY_FB=m   # guest framebuffer driver

CONFIG_VFIO_MDEV is selected automatically.

Verify that the driver registered successfully:

    ls /sys/devices/virtual/mdpy/mdpy/mdev_supported_types/

## Creating an mdev instance

Available types correspond to different resolutions (e.g. `mdpy-vga` for 640x480, `mdpy-xga` for 1024x768, `mdpy-hd` for 1920x1080).

Each mdev instance is identified by a UUID:

    uuid=$(uuidgen)
    echo "$uuid" > /sys/devices/virtual/mdpy/mdpy/mdev_supported_types/mdpy-xga/create

To remove the instance later:

    echo 1 > /sys/bus/mdev/devices/$uuid/remove

Make sure your user has the necessary permissions to access the vfio group. (ex: chmod 666 /dev/vfio/16)

## Starting QEMU

### Boot-time attachment

    qemu-system-x86_64 -machine q35 -m 1G \
        -device vfio-pci,sysfsdev=/sys/bus/mdev/devices/$uuid,display=on \
        -display gtk,gl=on

### Hotplug via HMP

Start QEMU with a PCIe root port (required for PCIe hotplug) and a monitor:

    qemu-system-x86_64 -machine q35 -m 1G \
        -device pcie-root-port,id=rp0,slot=1 \
        -display gtk,gl=on \
        -monitor stdio

Then at the `(qemu)` prompt:

    device_add vfio-pci,sysfsdev=/sys/bus/mdev/devices/<uuid>,display=on,bus=rp0,id=mdpy0

To hot-unplug:

    device_del mdpy0