1*d16c0cd2SRicardo Cañuelo.. SPDX-License-Identifier: GPL-2.0 2*d16c0cd2SRicardo Cañuelo 3*d16c0cd2SRicardo Cañuelo.. _writing_virtio_drivers: 4*d16c0cd2SRicardo Cañuelo 5*d16c0cd2SRicardo Cañuelo====================== 6*d16c0cd2SRicardo CañueloWriting Virtio Drivers 7*d16c0cd2SRicardo Cañuelo====================== 8*d16c0cd2SRicardo Cañuelo 9*d16c0cd2SRicardo CañueloIntroduction 10*d16c0cd2SRicardo Cañuelo============ 11*d16c0cd2SRicardo Cañuelo 12*d16c0cd2SRicardo CañueloThis document serves as a basic guideline for driver programmers that 13*d16c0cd2SRicardo Cañueloneed to hack a new virtio driver or understand the essentials of the 14*d16c0cd2SRicardo Cañueloexisting ones. See :ref:`Virtio on Linux <virtio>` for a general 15*d16c0cd2SRicardo Cañuelooverview of virtio. 16*d16c0cd2SRicardo Cañuelo 17*d16c0cd2SRicardo Cañuelo 18*d16c0cd2SRicardo CañueloDriver boilerplate 19*d16c0cd2SRicardo Cañuelo================== 20*d16c0cd2SRicardo Cañuelo 21*d16c0cd2SRicardo CañueloAs a bare minimum, a virtio driver needs to register in the virtio bus 22*d16c0cd2SRicardo Cañueloand configure the virtqueues for the device according to its spec, the 23*d16c0cd2SRicardo Cañueloconfiguration of the virtqueues in the driver side must match the 24*d16c0cd2SRicardo Cañuelovirtqueue definitions in the device. A basic driver skeleton could look 25*d16c0cd2SRicardo Cañuelolike this:: 26*d16c0cd2SRicardo Cañuelo 27*d16c0cd2SRicardo Cañuelo #include <linux/virtio.h> 28*d16c0cd2SRicardo Cañuelo #include <linux/virtio_ids.h> 29*d16c0cd2SRicardo Cañuelo #include <linux/virtio_config.h> 30*d16c0cd2SRicardo Cañuelo #include <linux/module.h> 31*d16c0cd2SRicardo Cañuelo 32*d16c0cd2SRicardo Cañuelo /* device private data (one per device) */ 33*d16c0cd2SRicardo Cañuelo struct virtio_dummy_dev { 34*d16c0cd2SRicardo Cañuelo struct virtqueue *vq; 35*d16c0cd2SRicardo Cañuelo }; 36*d16c0cd2SRicardo Cañuelo 37*d16c0cd2SRicardo Cañuelo static void virtio_dummy_recv_cb(struct virtqueue *vq) 38*d16c0cd2SRicardo Cañuelo { 39*d16c0cd2SRicardo Cañuelo struct virtio_dummy_dev *dev = vq->vdev->priv; 40*d16c0cd2SRicardo Cañuelo char *buf; 41*d16c0cd2SRicardo Cañuelo unsigned int len; 42*d16c0cd2SRicardo Cañuelo 43*d16c0cd2SRicardo Cañuelo while ((buf = virtqueue_get_buf(dev->vq, &len)) != NULL) { 44*d16c0cd2SRicardo Cañuelo /* process the received data */ 45*d16c0cd2SRicardo Cañuelo } 46*d16c0cd2SRicardo Cañuelo } 47*d16c0cd2SRicardo Cañuelo 48*d16c0cd2SRicardo Cañuelo static int virtio_dummy_probe(struct virtio_device *vdev) 49*d16c0cd2SRicardo Cañuelo { 50*d16c0cd2SRicardo Cañuelo struct virtio_dummy_dev *dev = NULL; 51*d16c0cd2SRicardo Cañuelo 52*d16c0cd2SRicardo Cañuelo /* initialize device data */ 53*d16c0cd2SRicardo Cañuelo dev = kzalloc(sizeof(struct virtio_dummy_dev), GFP_KERNEL); 54*d16c0cd2SRicardo Cañuelo if (!dev) 55*d16c0cd2SRicardo Cañuelo return -ENOMEM; 56*d16c0cd2SRicardo Cañuelo 57*d16c0cd2SRicardo Cañuelo /* the device has a single virtqueue */ 58*d16c0cd2SRicardo Cañuelo dev->vq = virtio_find_single_vq(vdev, virtio_dummy_recv_cb, "input"); 59*d16c0cd2SRicardo Cañuelo if (IS_ERR(dev->vq)) { 60*d16c0cd2SRicardo Cañuelo kfree(dev); 61*d16c0cd2SRicardo Cañuelo return PTR_ERR(dev->vq); 62*d16c0cd2SRicardo Cañuelo 63*d16c0cd2SRicardo Cañuelo } 64*d16c0cd2SRicardo Cañuelo vdev->priv = dev; 65*d16c0cd2SRicardo Cañuelo 66*d16c0cd2SRicardo Cañuelo /* from this point on, the device can notify and get callbacks */ 67*d16c0cd2SRicardo Cañuelo virtio_device_ready(vdev); 68*d16c0cd2SRicardo Cañuelo 69*d16c0cd2SRicardo Cañuelo return 0; 70*d16c0cd2SRicardo Cañuelo } 71*d16c0cd2SRicardo Cañuelo 72*d16c0cd2SRicardo Cañuelo static void virtio_dummy_remove(struct virtio_device *vdev) 73*d16c0cd2SRicardo Cañuelo { 74*d16c0cd2SRicardo Cañuelo struct virtio_dummy_dev *dev = vdev->priv; 75*d16c0cd2SRicardo Cañuelo 76*d16c0cd2SRicardo Cañuelo /* 77*d16c0cd2SRicardo Cañuelo * disable vq interrupts: equivalent to 78*d16c0cd2SRicardo Cañuelo * vdev->config->reset(vdev) 79*d16c0cd2SRicardo Cañuelo */ 80*d16c0cd2SRicardo Cañuelo virtio_reset_device(vdev); 81*d16c0cd2SRicardo Cañuelo 82*d16c0cd2SRicardo Cañuelo /* detach unused buffers */ 83*d16c0cd2SRicardo Cañuelo while ((buf = virtqueue_detach_unused_buf(dev->vq)) != NULL) { 84*d16c0cd2SRicardo Cañuelo kfree(buf); 85*d16c0cd2SRicardo Cañuelo } 86*d16c0cd2SRicardo Cañuelo 87*d16c0cd2SRicardo Cañuelo /* remove virtqueues */ 88*d16c0cd2SRicardo Cañuelo vdev->config->del_vqs(vdev); 89*d16c0cd2SRicardo Cañuelo 90*d16c0cd2SRicardo Cañuelo kfree(dev); 91*d16c0cd2SRicardo Cañuelo } 92*d16c0cd2SRicardo Cañuelo 93*d16c0cd2SRicardo Cañuelo static const struct virtio_device_id id_table[] = { 94*d16c0cd2SRicardo Cañuelo { VIRTIO_ID_DUMMY, VIRTIO_DEV_ANY_ID }, 95*d16c0cd2SRicardo Cañuelo { 0 }, 96*d16c0cd2SRicardo Cañuelo }; 97*d16c0cd2SRicardo Cañuelo 98*d16c0cd2SRicardo Cañuelo static struct virtio_driver virtio_dummy_driver = { 99*d16c0cd2SRicardo Cañuelo .driver.name = KBUILD_MODNAME, 100*d16c0cd2SRicardo Cañuelo .driver.owner = THIS_MODULE, 101*d16c0cd2SRicardo Cañuelo .id_table = id_table, 102*d16c0cd2SRicardo Cañuelo .probe = virtio_dummy_probe, 103*d16c0cd2SRicardo Cañuelo .remove = virtio_dummy_remove, 104*d16c0cd2SRicardo Cañuelo }; 105*d16c0cd2SRicardo Cañuelo 106*d16c0cd2SRicardo Cañuelo module_virtio_driver(virtio_dummy_driver); 107*d16c0cd2SRicardo Cañuelo MODULE_DEVICE_TABLE(virtio, id_table); 108*d16c0cd2SRicardo Cañuelo MODULE_DESCRIPTION("Dummy virtio driver"); 109*d16c0cd2SRicardo Cañuelo MODULE_LICENSE("GPL"); 110*d16c0cd2SRicardo Cañuelo 111*d16c0cd2SRicardo CañueloThe device id ``VIRTIO_ID_DUMMY`` here is a placeholder, virtio drivers 112*d16c0cd2SRicardo Cañueloshould be added only for devices that are defined in the spec, see 113*d16c0cd2SRicardo Cañueloinclude/uapi/linux/virtio_ids.h. Device ids need to be at least reserved 114*d16c0cd2SRicardo Cañueloin the virtio spec before being added to that file. 115*d16c0cd2SRicardo Cañuelo 116*d16c0cd2SRicardo CañueloIf your driver doesn't have to do anything special in its ``init`` and 117*d16c0cd2SRicardo Cañuelo``exit`` methods, you can use the module_virtio_driver() helper to 118*d16c0cd2SRicardo Cañueloreduce the amount of boilerplate code. 119*d16c0cd2SRicardo Cañuelo 120*d16c0cd2SRicardo CañueloThe ``probe`` method does the minimum driver setup in this case 121*d16c0cd2SRicardo Cañuelo(memory allocation for the device data) and initializes the 122*d16c0cd2SRicardo Cañuelovirtqueue. virtio_device_ready() is used to enable the virtqueue and to 123*d16c0cd2SRicardo Cañuelonotify the device that the driver is ready to manage the device 124*d16c0cd2SRicardo Cañuelo("DRIVER_OK"). The virtqueues are anyway enabled automatically by the 125*d16c0cd2SRicardo Cañuelocore after ``probe`` returns. 126*d16c0cd2SRicardo Cañuelo 127*d16c0cd2SRicardo Cañuelo.. kernel-doc:: include/linux/virtio_config.h 128*d16c0cd2SRicardo Cañuelo :identifiers: virtio_device_ready 129*d16c0cd2SRicardo Cañuelo 130*d16c0cd2SRicardo CañueloIn any case, the virtqueues need to be enabled before adding buffers to 131*d16c0cd2SRicardo Cañuelothem. 132*d16c0cd2SRicardo Cañuelo 133*d16c0cd2SRicardo CañueloSending and receiving data 134*d16c0cd2SRicardo Cañuelo========================== 135*d16c0cd2SRicardo Cañuelo 136*d16c0cd2SRicardo CañueloThe virtio_dummy_recv_cb() callback in the code above will be triggered 137*d16c0cd2SRicardo Cañuelowhen the device notifies the driver after it finishes processing a 138*d16c0cd2SRicardo Cañuelodescriptor or descriptor chain, either for reading or writing. However, 139*d16c0cd2SRicardo Cañuelothat's only the second half of the virtio device-driver communication 140*d16c0cd2SRicardo Cañueloprocess, as the communication is always started by the driver regardless 141*d16c0cd2SRicardo Cañueloof the direction of the data transfer. 142*d16c0cd2SRicardo Cañuelo 143*d16c0cd2SRicardo CañueloTo configure a buffer transfer from the driver to the device, first you 144*d16c0cd2SRicardo Cañuelohave to add the buffers -- packed as `scatterlists` -- to the 145*d16c0cd2SRicardo Cañueloappropriate virtqueue using any of the virtqueue_add_inbuf(), 146*d16c0cd2SRicardo Cañuelovirtqueue_add_outbuf() or virtqueue_add_sgs(), depending on whether you 147*d16c0cd2SRicardo Cañueloneed to add one input `scatterlist` (for the device to fill in), one 148*d16c0cd2SRicardo Cañuelooutput `scatterlist` (for the device to consume) or multiple 149*d16c0cd2SRicardo Cañuelo`scatterlists`, respectively. Then, once the virtqueue is set up, a call 150*d16c0cd2SRicardo Cañueloto virtqueue_kick() sends a notification that will be serviced by the 151*d16c0cd2SRicardo Cañuelohypervisor that implements the device:: 152*d16c0cd2SRicardo Cañuelo 153*d16c0cd2SRicardo Cañuelo struct scatterlist sg[1]; 154*d16c0cd2SRicardo Cañuelo sg_init_one(sg, buffer, BUFLEN); 155*d16c0cd2SRicardo Cañuelo virtqueue_add_inbuf(dev->vq, sg, 1, buffer, GFP_ATOMIC); 156*d16c0cd2SRicardo Cañuelo virtqueue_kick(dev->vq); 157*d16c0cd2SRicardo Cañuelo 158*d16c0cd2SRicardo Cañuelo.. kernel-doc:: drivers/virtio/virtio_ring.c 159*d16c0cd2SRicardo Cañuelo :identifiers: virtqueue_add_inbuf 160*d16c0cd2SRicardo Cañuelo 161*d16c0cd2SRicardo Cañuelo.. kernel-doc:: drivers/virtio/virtio_ring.c 162*d16c0cd2SRicardo Cañuelo :identifiers: virtqueue_add_outbuf 163*d16c0cd2SRicardo Cañuelo 164*d16c0cd2SRicardo Cañuelo.. kernel-doc:: drivers/virtio/virtio_ring.c 165*d16c0cd2SRicardo Cañuelo :identifiers: virtqueue_add_sgs 166*d16c0cd2SRicardo Cañuelo 167*d16c0cd2SRicardo CañueloThen, after the device has read or written the buffers prepared by the 168*d16c0cd2SRicardo Cañuelodriver and notifies it back, the driver can call virtqueue_get_buf() to 169*d16c0cd2SRicardo Cañueloread the data produced by the device (if the virtqueue was set up with 170*d16c0cd2SRicardo Cañueloinput buffers) or simply to reclaim the buffers if they were already 171*d16c0cd2SRicardo Cañueloconsumed by the device: 172*d16c0cd2SRicardo Cañuelo 173*d16c0cd2SRicardo Cañuelo.. kernel-doc:: drivers/virtio/virtio_ring.c 174*d16c0cd2SRicardo Cañuelo :identifiers: virtqueue_get_buf_ctx 175*d16c0cd2SRicardo Cañuelo 176*d16c0cd2SRicardo CañueloThe virtqueue callbacks can be disabled and re-enabled using the 177*d16c0cd2SRicardo Cañuelovirtqueue_disable_cb() and the family of virtqueue_enable_cb() functions 178*d16c0cd2SRicardo Cañuelorespectively. See drivers/virtio/virtio_ring.c for more details: 179*d16c0cd2SRicardo Cañuelo 180*d16c0cd2SRicardo Cañuelo.. kernel-doc:: drivers/virtio/virtio_ring.c 181*d16c0cd2SRicardo Cañuelo :identifiers: virtqueue_disable_cb 182*d16c0cd2SRicardo Cañuelo 183*d16c0cd2SRicardo Cañuelo.. kernel-doc:: drivers/virtio/virtio_ring.c 184*d16c0cd2SRicardo Cañuelo :identifiers: virtqueue_enable_cb 185*d16c0cd2SRicardo Cañuelo 186*d16c0cd2SRicardo CañueloBut note that some spurious callbacks can still be triggered under 187*d16c0cd2SRicardo Cañuelocertain scenarios. The way to disable callbacks reliably is to reset the 188*d16c0cd2SRicardo Cañuelodevice or the virtqueue (virtio_reset_device()). 189*d16c0cd2SRicardo Cañuelo 190*d16c0cd2SRicardo Cañuelo 191*d16c0cd2SRicardo CañueloReferences 192*d16c0cd2SRicardo Cañuelo========== 193*d16c0cd2SRicardo Cañuelo 194*d16c0cd2SRicardo Cañuelo_`[1]` Virtio Spec v1.2: 195*d16c0cd2SRicardo Cañuelohttps://docs.oasis-open.org/virtio/virtio/v1.2/virtio-v1.2.html 196*d16c0cd2SRicardo Cañuelo 197*d16c0cd2SRicardo CañueloCheck for later versions of the spec as well. 198