-
Notifications
You must be signed in to change notification settings - Fork 71
Description
I tried to test connecting simulated GPIO peripherals to QEMU using vhost-device-gpio.
I have successfully built the vhost-device-gpio (with cargo build --features "mock_gpio"
) and tried to connect it to the Linux running on a qemu-aarch64-virt machine, built with Buildroot version 2023.11.1.
Of course, I had to add CONFIG_GPIO_VIRTIO=m
in the Linux kernel configuration.
In the virtual machine, I have loaded the driver with modprobe gpio-virtio
. Then, I could access the simulated GPIO controlling the direction and values.
However, when I tried to test interrupt functionality with gpiomon 0 0
, I got an error:
# gpiomon 0 0
gpiomon: error waiting for events: No such device
After some investigations, I have found the cause. The feature VIRTIO_GPIO_F_IRQ was not set for the created virtio gpio device.
Further investigation required compiling QEMU with debugging symbols and running it under gdb.
With that, I could find that the problem is caused by the fact that this flag is not set in the host_features
in virtio-pci.c
source in QEMU.
As a quick workaround, I have modified the function virtio_pci_pre_plugged, adding the lacking feature here:
static void virtio_pci_pre_plugged(DeviceState *d, Error **errp)
{
VirtIOPCIProxy *proxy = VIRTIO_PCI(d);
VirtIODevice *vdev = virtio_bus_get_device(&proxy->bus);
if (virtio_pci_modern(proxy)) {
virtio_add_feature(&vdev->host_features, 0); /* VIRTIO_GPIO_F_IRQ - added by WZab as a quick&dirty workaround */
virtio_add_feature(&vdev->host_features, VIRTIO_F_VERSION_1);
}
virtio_add_feature(&vdev->host_features, VIRTIO_F_BAD_FEATURE);
}
With such a modified QEMU, I was able to activate emulation of IRQs with vhost-device-gpio.
That is a QEMU problem, but it is highly specific to vhost-device-gpio. Therefore, I've described it here.