xref: /openbmc/linux/Documentation/driver-api/virtio/writing_virtio_drivers.rst (revision 9a87ffc99ec8eb8d35eed7c4f816d75f5cc9662e)
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