]> git.karo-electronics.de Git - karo-tx-linux.git/blob - drivers/virtio/virtio_pci_common.c
4608fd9aaa6c3491967c690c44e7fa8ad0a365cb
[karo-tx-linux.git] / drivers / virtio / virtio_pci_common.c
1 /*
2  * Virtio PCI driver - common functionality for all device versions
3  *
4  * This module allows virtio devices to be used over a virtual PCI device.
5  * This can be used with QEMU based VMMs like KVM or Xen.
6  *
7  * Copyright IBM Corp. 2007
8  * Copyright Red Hat, Inc. 2014
9  *
10  * Authors:
11  *  Anthony Liguori  <aliguori@us.ibm.com>
12  *  Rusty Russell <rusty@rustcorp.com.au>
13  *  Michael S. Tsirkin <mst@redhat.com>
14  *
15  * This work is licensed under the terms of the GNU GPL, version 2 or later.
16  * See the COPYING file in the top-level directory.
17  *
18  */
19
20 #include "virtio_pci_common.h"
21
22 static bool force_legacy = false;
23
24 #if IS_ENABLED(CONFIG_VIRTIO_PCI_LEGACY)
25 module_param(force_legacy, bool, 0444);
26 MODULE_PARM_DESC(force_legacy,
27                  "Force legacy mode for transitional virtio 1 devices");
28 #endif
29
30 /* wait for pending irq handlers */
31 void vp_synchronize_vectors(struct virtio_device *vdev)
32 {
33         struct virtio_pci_device *vp_dev = to_vp_device(vdev);
34         int i;
35
36         synchronize_irq(pci_irq_vector(vp_dev->pci_dev, 0));
37         for (i = 1; i < vp_dev->msix_vectors; i++)
38                 synchronize_irq(pci_irq_vector(vp_dev->pci_dev, i));
39 }
40
41 /* the notify function used when creating a virt queue */
42 bool vp_notify(struct virtqueue *vq)
43 {
44         /* we write the queue's selector into the notification register to
45          * signal the other end */
46         iowrite16(vq->index, (void __iomem *)vq->priv);
47         return true;
48 }
49
50 /* Handle a configuration change: Tell driver if it wants to know. */
51 static irqreturn_t vp_config_changed(int irq, void *opaque)
52 {
53         struct virtio_pci_device *vp_dev = opaque;
54
55         virtio_config_changed(&vp_dev->vdev);
56         return IRQ_HANDLED;
57 }
58
59 /* Notify all virtqueues on an interrupt. */
60 static irqreturn_t vp_vring_interrupt(int irq, void *opaque)
61 {
62         struct virtio_pci_device *vp_dev = opaque;
63         irqreturn_t ret = IRQ_NONE;
64         struct virtqueue *vq;
65
66         list_for_each_entry(vq, &vp_dev->vdev.vqs, list) {
67                 if (vq->callback && vring_interrupt(irq, vq) == IRQ_HANDLED)
68                         ret = IRQ_HANDLED;
69         }
70
71         return ret;
72 }
73
74 /* A small wrapper to also acknowledge the interrupt when it's handled.
75  * I really need an EIO hook for the vring so I can ack the interrupt once we
76  * know that we'll be handling the IRQ but before we invoke the callback since
77  * the callback may notify the host which results in the host attempting to
78  * raise an interrupt that we would then mask once we acknowledged the
79  * interrupt. */
80 static irqreturn_t vp_interrupt(int irq, void *opaque)
81 {
82         struct virtio_pci_device *vp_dev = opaque;
83         u8 isr;
84
85         /* reading the ISR has the effect of also clearing it so it's very
86          * important to save off the value. */
87         isr = ioread8(vp_dev->isr);
88
89         /* It's definitely not us if the ISR was not high */
90         if (!isr)
91                 return IRQ_NONE;
92
93         /* Configuration change?  Tell driver if it wants to know. */
94         if (isr & VIRTIO_PCI_ISR_CONFIG)
95                 vp_config_changed(irq, opaque);
96
97         return vp_vring_interrupt(irq, opaque);
98 }
99
100 static void vp_remove_vqs(struct virtio_device *vdev)
101 {
102         struct virtio_pci_device *vp_dev = to_vp_device(vdev);
103         struct virtqueue *vq, *n;
104
105         list_for_each_entry_safe(vq, n, &vdev->vqs, list) {
106                 if (vp_dev->msix_vector_map) {
107                         int v = vp_dev->msix_vector_map[vq->index];
108
109                         if (v != VIRTIO_MSI_NO_VECTOR)
110                                 free_irq(pci_irq_vector(vp_dev->pci_dev, v),
111                                         vq);
112                 }
113                 vp_dev->del_vq(vq);
114         }
115 }
116
117 /* the config->del_vqs() implementation */
118 void vp_del_vqs(struct virtio_device *vdev)
119 {
120         struct virtio_pci_device *vp_dev = to_vp_device(vdev);
121         int i;
122
123         if (WARN_ON_ONCE(list_empty_careful(&vdev->vqs)))
124                 return;
125
126         vp_remove_vqs(vdev);
127
128         if (vp_dev->pci_dev->msix_enabled) {
129                 for (i = 0; i < vp_dev->msix_vectors; i++)
130                         free_cpumask_var(vp_dev->msix_affinity_masks[i]);
131
132                 /* Disable the vector used for configuration */
133                 vp_dev->config_vector(vp_dev, VIRTIO_MSI_NO_VECTOR);
134
135                 kfree(vp_dev->msix_affinity_masks);
136                 kfree(vp_dev->msix_names);
137                 kfree(vp_dev->msix_vector_map);
138         }
139
140         free_irq(pci_irq_vector(vp_dev->pci_dev, 0), vp_dev);
141         pci_free_irq_vectors(vp_dev->pci_dev);
142 }
143
144 static int vp_find_vqs_msix(struct virtio_device *vdev, unsigned nvqs,
145                 struct virtqueue *vqs[], vq_callback_t *callbacks[],
146                 const char * const names[], bool per_vq_vectors,
147                 struct irq_affinity *desc)
148 {
149         struct virtio_pci_device *vp_dev = to_vp_device(vdev);
150         const char *name = dev_name(&vp_dev->vdev.dev);
151         int i, err = -ENOMEM, allocated_vectors, nvectors;
152         unsigned flags = PCI_IRQ_MSIX;
153         u16 msix_vec;
154
155         if (desc) {
156                 flags |= PCI_IRQ_AFFINITY;
157                 desc->pre_vectors++; /* virtio config vector */
158         }
159
160         nvectors = 1;
161         for (i = 0; i < nvqs; i++)
162                 if (callbacks[i])
163                         nvectors++;
164
165         if (per_vq_vectors) {
166                 err = pci_alloc_irq_vectors_affinity(vp_dev->pci_dev, nvectors,
167                                 nvectors, flags, desc);
168         } else {
169                 err = pci_alloc_irq_vectors(vp_dev->pci_dev, 2, 2,
170                                 PCI_IRQ_MSIX);
171         }
172         if (err < 0)
173                 return err;
174
175         vp_dev->msix_vectors = nvectors;
176         vp_dev->msix_names = kmalloc_array(nvectors,
177                         sizeof(*vp_dev->msix_names), GFP_KERNEL);
178         if (!vp_dev->msix_names)
179                 goto out_free_irq_vectors;
180
181         vp_dev->msix_affinity_masks = kcalloc(nvectors,
182                         sizeof(*vp_dev->msix_affinity_masks), GFP_KERNEL);
183         if (!vp_dev->msix_affinity_masks)
184                 goto out_free_msix_names;
185
186         for (i = 0; i < nvectors; ++i) {
187                 if (!alloc_cpumask_var(&vp_dev->msix_affinity_masks[i],
188                                 GFP_KERNEL))
189                         goto out_free_msix_affinity_masks;
190         }
191
192         /* Set the vector used for configuration */
193         snprintf(vp_dev->msix_names[0], sizeof(*vp_dev->msix_names),
194                  "%s-config", name);
195         err = request_irq(pci_irq_vector(vp_dev->pci_dev, 0), vp_config_changed,
196                         0, vp_dev->msix_names[0], vp_dev);
197         if (err)
198                 goto out_free_irq_vectors;
199
200         /* Verify we had enough resources to assign the vector */
201         if (vp_dev->config_vector(vp_dev, 0) == VIRTIO_MSI_NO_VECTOR) {
202                 err = -EBUSY;
203                 goto out_free_config_irq;
204         }
205
206         vp_dev->msix_vector_map = kmalloc_array(nvqs,
207                         sizeof(*vp_dev->msix_vector_map), GFP_KERNEL);
208         if (!vp_dev->msix_vector_map)
209                 goto out_disable_config_irq;
210
211         allocated_vectors = 1; /* vector 0 is the config interrupt */
212         for (i = 0; i < nvqs; ++i) {
213                 if (!names[i]) {
214                         vqs[i] = NULL;
215                         continue;
216                 }
217
218                 if (callbacks[i])
219                         msix_vec = allocated_vectors;
220                 else
221                         msix_vec = VIRTIO_MSI_NO_VECTOR;
222
223                 vqs[i] = vp_dev->setup_vq(vp_dev, i, callbacks[i], names[i],
224                                 msix_vec);
225                 if (IS_ERR(vqs[i])) {
226                         err = PTR_ERR(vqs[i]);
227                         goto out_remove_vqs;
228                 }
229
230                 if (msix_vec == VIRTIO_MSI_NO_VECTOR) {
231                         vp_dev->msix_vector_map[i] = VIRTIO_MSI_NO_VECTOR;
232                         continue;
233                 }
234
235                 snprintf(vp_dev->msix_names[i + 1],
236                          sizeof(*vp_dev->msix_names), "%s-%s",
237                          dev_name(&vp_dev->vdev.dev), names[i]);
238                 err = request_irq(pci_irq_vector(vp_dev->pci_dev, msix_vec),
239                                   vring_interrupt, IRQF_SHARED,
240                                   vp_dev->msix_names[i + 1], vqs[i]);
241                 if (err) {
242                         /* don't free this irq on error */
243                         vp_dev->msix_vector_map[i] = VIRTIO_MSI_NO_VECTOR;
244                         goto out_remove_vqs;
245                 }
246                 vp_dev->msix_vector_map[i] = msix_vec;
247
248                 if (per_vq_vectors)
249                         allocated_vectors++;
250         }
251
252         return 0;
253
254 out_remove_vqs:
255         vp_remove_vqs(vdev);
256         kfree(vp_dev->msix_vector_map);
257 out_disable_config_irq:
258         vp_dev->config_vector(vp_dev, VIRTIO_MSI_NO_VECTOR);
259 out_free_config_irq:
260         free_irq(pci_irq_vector(vp_dev->pci_dev, 0), vp_dev);
261 out_free_msix_affinity_masks:
262         for (i = 0; i < nvectors; i++) {
263                 if (vp_dev->msix_affinity_masks[i])
264                         free_cpumask_var(vp_dev->msix_affinity_masks[i]);
265         }
266         kfree(vp_dev->msix_affinity_masks);
267 out_free_msix_names:
268         kfree(vp_dev->msix_names);
269 out_free_irq_vectors:
270         pci_free_irq_vectors(vp_dev->pci_dev);
271         return err;
272 }
273
274 static int vp_find_vqs_intx(struct virtio_device *vdev, unsigned nvqs,
275                 struct virtqueue *vqs[], vq_callback_t *callbacks[],
276                 const char * const names[])
277 {
278         struct virtio_pci_device *vp_dev = to_vp_device(vdev);
279         int i, err;
280
281         err = request_irq(vp_dev->pci_dev->irq, vp_interrupt, IRQF_SHARED,
282                         dev_name(&vdev->dev), vp_dev);
283         if (err)
284                 return err;
285
286         for (i = 0; i < nvqs; ++i) {
287                 if (!names[i]) {
288                         vqs[i] = NULL;
289                         continue;
290                 }
291                 vqs[i] = vp_dev->setup_vq(vp_dev, i, callbacks[i], names[i],
292                                 VIRTIO_MSI_NO_VECTOR);
293                 if (IS_ERR(vqs[i])) {
294                         err = PTR_ERR(vqs[i]);
295                         goto out_remove_vqs;
296                 }
297         }
298
299         return 0;
300
301 out_remove_vqs:
302         vp_remove_vqs(vdev);
303         free_irq(pci_irq_vector(vp_dev->pci_dev, 0), vp_dev);
304         return err;
305 }
306
307 /* the config->find_vqs() implementation */
308 int vp_find_vqs(struct virtio_device *vdev, unsigned nvqs,
309                 struct virtqueue *vqs[], vq_callback_t *callbacks[],
310                 const char * const names[], struct irq_affinity *desc)
311 {
312         int err;
313
314         /* Try MSI-X with one vector per queue. */
315         err = vp_find_vqs_msix(vdev, nvqs, vqs, callbacks, names, true, desc);
316         if (!err)
317                 return 0;
318         /* Fallback: MSI-X with one vector for config, one shared for queues. */
319         err = vp_find_vqs_msix(vdev, nvqs, vqs, callbacks, names, false, desc);
320         if (!err)
321                 return 0;
322         /* Finally fall back to regular interrupts. */
323         return vp_find_vqs_intx(vdev, nvqs, vqs, callbacks, names);
324 }
325
326 const char *vp_bus_name(struct virtio_device *vdev)
327 {
328         struct virtio_pci_device *vp_dev = to_vp_device(vdev);
329
330         return pci_name(vp_dev->pci_dev);
331 }
332
333 /* Setup the affinity for a virtqueue:
334  * - force the affinity for per vq vector
335  * - OR over all affinities for shared MSI
336  * - ignore the affinity request if we're using INTX
337  */
338 int vp_set_vq_affinity(struct virtqueue *vq, int cpu)
339 {
340         struct virtio_device *vdev = vq->vdev;
341         struct virtio_pci_device *vp_dev = to_vp_device(vdev);
342
343         if (!vq->callback)
344                 return -EINVAL;
345
346         if (vp_dev->pci_dev->msix_enabled) {
347                 int vec = vp_dev->msix_vector_map[vq->index];
348                 struct cpumask *mask = vp_dev->msix_affinity_masks[vec];
349                 unsigned int irq = pci_irq_vector(vp_dev->pci_dev, vec);
350
351                 if (cpu == -1)
352                         irq_set_affinity_hint(irq, NULL);
353                 else {
354                         cpumask_clear(mask);
355                         cpumask_set_cpu(cpu, mask);
356                         irq_set_affinity_hint(irq, mask);
357                 }
358         }
359         return 0;
360 }
361
362 const struct cpumask *vp_get_vq_affinity(struct virtio_device *vdev, int index)
363 {
364         struct virtio_pci_device *vp_dev = to_vp_device(vdev);
365         unsigned int *map = vp_dev->msix_vector_map;
366
367         if (!map || map[index] == VIRTIO_MSI_NO_VECTOR)
368                 return NULL;
369
370         return pci_irq_get_affinity(vp_dev->pci_dev, map[index]);
371 }
372
373 #ifdef CONFIG_PM_SLEEP
374 static int virtio_pci_freeze(struct device *dev)
375 {
376         struct pci_dev *pci_dev = to_pci_dev(dev);
377         struct virtio_pci_device *vp_dev = pci_get_drvdata(pci_dev);
378         int ret;
379
380         ret = virtio_device_freeze(&vp_dev->vdev);
381
382         if (!ret)
383                 pci_disable_device(pci_dev);
384         return ret;
385 }
386
387 static int virtio_pci_restore(struct device *dev)
388 {
389         struct pci_dev *pci_dev = to_pci_dev(dev);
390         struct virtio_pci_device *vp_dev = pci_get_drvdata(pci_dev);
391         int ret;
392
393         ret = pci_enable_device(pci_dev);
394         if (ret)
395                 return ret;
396
397         pci_set_master(pci_dev);
398         return virtio_device_restore(&vp_dev->vdev);
399 }
400
401 static const struct dev_pm_ops virtio_pci_pm_ops = {
402         SET_SYSTEM_SLEEP_PM_OPS(virtio_pci_freeze, virtio_pci_restore)
403 };
404 #endif
405
406
407 /* Qumranet donated their vendor ID for devices 0x1000 thru 0x10FF. */
408 static const struct pci_device_id virtio_pci_id_table[] = {
409         { PCI_DEVICE(PCI_VENDOR_ID_REDHAT_QUMRANET, PCI_ANY_ID) },
410         { 0 }
411 };
412
413 MODULE_DEVICE_TABLE(pci, virtio_pci_id_table);
414
415 static void virtio_pci_release_dev(struct device *_d)
416 {
417         struct virtio_device *vdev = dev_to_virtio(_d);
418         struct virtio_pci_device *vp_dev = to_vp_device(vdev);
419
420         /* As struct device is a kobject, it's not safe to
421          * free the memory (including the reference counter itself)
422          * until it's release callback. */
423         kfree(vp_dev);
424 }
425
426 static int virtio_pci_probe(struct pci_dev *pci_dev,
427                             const struct pci_device_id *id)
428 {
429         struct virtio_pci_device *vp_dev;
430         int rc;
431
432         /* allocate our structure and fill it out */
433         vp_dev = kzalloc(sizeof(struct virtio_pci_device), GFP_KERNEL);
434         if (!vp_dev)
435                 return -ENOMEM;
436
437         pci_set_drvdata(pci_dev, vp_dev);
438         vp_dev->vdev.dev.parent = &pci_dev->dev;
439         vp_dev->vdev.dev.release = virtio_pci_release_dev;
440         vp_dev->pci_dev = pci_dev;
441
442         /* enable the device */
443         rc = pci_enable_device(pci_dev);
444         if (rc)
445                 goto err_enable_device;
446
447         if (force_legacy) {
448                 rc = virtio_pci_legacy_probe(vp_dev);
449                 /* Also try modern mode if we can't map BAR0 (no IO space). */
450                 if (rc == -ENODEV || rc == -ENOMEM)
451                         rc = virtio_pci_modern_probe(vp_dev);
452                 if (rc)
453                         goto err_probe;
454         } else {
455                 rc = virtio_pci_modern_probe(vp_dev);
456                 if (rc == -ENODEV)
457                         rc = virtio_pci_legacy_probe(vp_dev);
458                 if (rc)
459                         goto err_probe;
460         }
461
462         pci_set_master(pci_dev);
463
464         rc = register_virtio_device(&vp_dev->vdev);
465         if (rc)
466                 goto err_register;
467
468         return 0;
469
470 err_register:
471         if (vp_dev->ioaddr)
472              virtio_pci_legacy_remove(vp_dev);
473         else
474              virtio_pci_modern_remove(vp_dev);
475 err_probe:
476         pci_disable_device(pci_dev);
477 err_enable_device:
478         kfree(vp_dev);
479         return rc;
480 }
481
482 static void virtio_pci_remove(struct pci_dev *pci_dev)
483 {
484         struct virtio_pci_device *vp_dev = pci_get_drvdata(pci_dev);
485         struct device *dev = get_device(&vp_dev->vdev.dev);
486
487         unregister_virtio_device(&vp_dev->vdev);
488
489         if (vp_dev->ioaddr)
490                 virtio_pci_legacy_remove(vp_dev);
491         else
492                 virtio_pci_modern_remove(vp_dev);
493
494         pci_disable_device(pci_dev);
495         put_device(dev);
496 }
497
498 static struct pci_driver virtio_pci_driver = {
499         .name           = "virtio-pci",
500         .id_table       = virtio_pci_id_table,
501         .probe          = virtio_pci_probe,
502         .remove         = virtio_pci_remove,
503 #ifdef CONFIG_PM_SLEEP
504         .driver.pm      = &virtio_pci_pm_ops,
505 #endif
506 };
507
508 module_pci_driver(virtio_pci_driver);
509
510 MODULE_AUTHOR("Anthony Liguori <aliguori@us.ibm.com>");
511 MODULE_DESCRIPTION("virtio-pci");
512 MODULE_LICENSE("GPL");
513 MODULE_VERSION("1");