]> git.karo-electronics.de Git - karo-tx-linux.git/blobdiff - drivers/virtio/virtio_pci_common.h
Merge branch 'for-linus' into for-4.12/block
[karo-tx-linux.git] / drivers / virtio / virtio_pci_common.h
index b2f666250ae0bf8497e78954ed738b7c5c29afe3..ac8c9d7889646ab3cc28bb51accd0d3840d5a34f 100644 (file)
 #include <linux/highmem.h>
 #include <linux/spinlock.h>
 
-struct virtio_pci_vq_info {
-       /* the actual virtqueue */
-       struct virtqueue *vq;
-
-       /* the list node for the virtqueues list */
-       struct list_head node;
-
-       /* MSI-X vector (or none) */
-       unsigned msix_vector;
-};
-
 /* Our device structure */
 struct virtio_pci_device {
        struct virtio_device vdev;
@@ -75,47 +64,25 @@ struct virtio_pci_device {
        /* the IO mapping for the PCI config space */
        void __iomem *ioaddr;
 
-       /* a list of queues so we can dispatch IRQs */
-       spinlock_t lock;
-       struct list_head virtqueues;
-
-       /* array of all queues for house-keeping */
-       struct virtio_pci_vq_info **vqs;
-
-       /* MSI-X support */
-       int msix_enabled;
-       int intx_enabled;
        cpumask_var_t *msix_affinity_masks;
        /* Name strings for interrupts. This size should be enough,
         * and I'm too lazy to allocate each name separately. */
        char (*msix_names)[256];
-       /* Number of available vectors */
-       unsigned msix_vectors;
-       /* Vectors allocated, excluding per-vq vectors if any */
-       unsigned msix_used_vectors;
-
-       /* Whether we have vector per vq */
-       bool per_vq_vectors;
+       /* Total Number of MSI-X vectors (including per-VQ ones). */
+       int msix_vectors;
+       /* Map of per-VQ MSI-X vectors, may be NULL */
+       unsigned *msix_vector_map;
 
        struct virtqueue *(*setup_vq)(struct virtio_pci_device *vp_dev,
-                                     struct virtio_pci_vq_info *info,
                                      unsigned idx,
                                      void (*callback)(struct virtqueue *vq),
                                      const char *name,
                                      u16 msix_vec);
-       void (*del_vq)(struct virtio_pci_vq_info *info);
+       void (*del_vq)(struct virtqueue *vq);
 
        u16 (*config_vector)(struct virtio_pci_device *vp_dev, u16 vector);
 };
 
-/* Constants for MSI-X */
-/* Use first vector for configuration changes, second and the rest for
- * virtqueues Thus, we need at least 2 vectors for MSI. */
-enum {
-       VP_MSIX_CONFIG_VECTOR = 0,
-       VP_MSIX_VQ_VECTOR = 1,
-};
-
 /* Convert a generic virtio device to our structure */
 static struct virtio_pci_device *to_vp_device(struct virtio_device *vdev)
 {
@@ -130,9 +97,8 @@ bool vp_notify(struct virtqueue *vq);
 void vp_del_vqs(struct virtio_device *vdev);
 /* the config->find_vqs() implementation */
 int vp_find_vqs(struct virtio_device *vdev, unsigned nvqs,
-                      struct virtqueue *vqs[],
-                      vq_callback_t *callbacks[],
-                      const char * const names[]);
+               struct virtqueue *vqs[], vq_callback_t *callbacks[],
+               const char * const names[], struct irq_affinity *desc);
 const char *vp_bus_name(struct virtio_device *vdev);
 
 /* Setup the affinity for a virtqueue:
@@ -142,6 +108,8 @@ const char *vp_bus_name(struct virtio_device *vdev);
  */
 int vp_set_vq_affinity(struct virtqueue *vq, int cpu);
 
+const struct cpumask *vp_get_vq_affinity(struct virtio_device *vdev, int index);
+
 #if IS_ENABLED(CONFIG_VIRTIO_PCI_LEGACY)
 int virtio_pci_legacy_probe(struct virtio_pci_device *);
 void virtio_pci_legacy_remove(struct virtio_pci_device *);