virtio_pci_common.h 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126
  1. #ifndef _DRIVERS_VIRTIO_VIRTIO_PCI_COMMON_H
  2. #define _DRIVERS_VIRTIO_VIRTIO_PCI_COMMON_H
  3. /*
  4. * Virtio PCI driver - APIs for common functionality for all device versions
  5. *
  6. * This module allows virtio devices to be used over a virtual PCI device.
  7. * This can be used with QEMU based VMMs like KVM or Xen.
  8. *
  9. * Copyright IBM Corp. 2007
  10. * Copyright Red Hat, Inc. 2014
  11. *
  12. * Authors:
  13. * Anthony Liguori <aliguori@us.ibm.com>
  14. * Rusty Russell <rusty@rustcorp.com.au>
  15. * Michael S. Tsirkin <mst@redhat.com>
  16. *
  17. * This work is licensed under the terms of the GNU GPL, version 2 or later.
  18. * See the COPYING file in the top-level directory.
  19. *
  20. */
  21. #include <linux/module.h>
  22. #include <linux/list.h>
  23. #include <linux/pci.h>
  24. #include <linux/slab.h>
  25. #include <linux/interrupt.h>
  26. #include <linux/virtio.h>
  27. #include <linux/virtio_config.h>
  28. #include <linux/virtio_ring.h>
  29. #include <linux/virtio_pci.h>
  30. #include <linux/highmem.h>
  31. #include <linux/spinlock.h>
  32. /* Our device structure */
  33. struct virtio_pci_device {
  34. struct virtio_device vdev;
  35. struct pci_dev *pci_dev;
  36. /* In legacy mode, these two point to within ->legacy. */
  37. /* Where to read and clear interrupt */
  38. u8 __iomem *isr;
  39. /* Modern only fields */
  40. /* The IO mapping for the PCI config space (non-legacy mode) */
  41. struct virtio_pci_common_cfg __iomem *common;
  42. /* Device-specific data (non-legacy mode) */
  43. void __iomem *device;
  44. /* Base of vq notifications (non-legacy mode). */
  45. void __iomem *notify_base;
  46. /* So we can sanity-check accesses. */
  47. size_t notify_len;
  48. size_t device_len;
  49. /* Capability for when we need to map notifications per-vq. */
  50. int notify_map_cap;
  51. /* Multiply queue_notify_off by this value. (non-legacy mode). */
  52. u32 notify_offset_multiplier;
  53. int modern_bars;
  54. /* Legacy only field */
  55. /* the IO mapping for the PCI config space */
  56. void __iomem *ioaddr;
  57. cpumask_var_t *msix_affinity_masks;
  58. /* Name strings for interrupts. This size should be enough,
  59. * and I'm too lazy to allocate each name separately. */
  60. char (*msix_names)[256];
  61. /* Total Number of MSI-X vectors (including per-VQ ones). */
  62. int msix_vectors;
  63. /* Map of per-VQ MSI-X vectors, may be NULL */
  64. unsigned *msix_vector_map;
  65. struct virtqueue *(*setup_vq)(struct virtio_pci_device *vp_dev,
  66. unsigned idx,
  67. void (*callback)(struct virtqueue *vq),
  68. const char *name,
  69. u16 msix_vec);
  70. void (*del_vq)(struct virtqueue *vq);
  71. u16 (*config_vector)(struct virtio_pci_device *vp_dev, u16 vector);
  72. };
  73. /* Convert a generic virtio device to our structure */
  74. static struct virtio_pci_device *to_vp_device(struct virtio_device *vdev)
  75. {
  76. return container_of(vdev, struct virtio_pci_device, vdev);
  77. }
  78. /* wait for pending irq handlers */
  79. void vp_synchronize_vectors(struct virtio_device *vdev);
  80. /* the notify function used when creating a virt queue */
  81. bool vp_notify(struct virtqueue *vq);
  82. /* the config->del_vqs() implementation */
  83. void vp_del_vqs(struct virtio_device *vdev);
  84. /* the config->find_vqs() implementation */
  85. int vp_find_vqs(struct virtio_device *vdev, unsigned nvqs,
  86. struct virtqueue *vqs[], vq_callback_t *callbacks[],
  87. const char * const names[], struct irq_affinity *desc);
  88. const char *vp_bus_name(struct virtio_device *vdev);
  89. /* Setup the affinity for a virtqueue:
  90. * - force the affinity for per vq vector
  91. * - OR over all affinities for shared MSI
  92. * - ignore the affinity request if we're using INTX
  93. */
  94. int vp_set_vq_affinity(struct virtqueue *vq, int cpu);
  95. #if IS_ENABLED(CONFIG_VIRTIO_PCI_LEGACY)
  96. int virtio_pci_legacy_probe(struct virtio_pci_device *);
  97. void virtio_pci_legacy_remove(struct virtio_pci_device *);
  98. #else
  99. static inline int virtio_pci_legacy_probe(struct virtio_pci_device *vp_dev)
  100. {
  101. return -ENODEV;
  102. }
  103. static inline void virtio_pci_legacy_remove(struct virtio_pci_device *vp_dev)
  104. {
  105. }
  106. #endif
  107. int virtio_pci_modern_probe(struct virtio_pci_device *);
  108. void virtio_pci_modern_remove(struct virtio_pci_device *);
  109. #endif