0001
0002 #ifndef _DRIVERS_VIRTIO_VIRTIO_PCI_COMMON_H
0003 #define _DRIVERS_VIRTIO_VIRTIO_PCI_COMMON_H
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015
0016
0017
0018
0019 #include <linux/module.h>
0020 #include <linux/list.h>
0021 #include <linux/pci.h>
0022 #include <linux/slab.h>
0023 #include <linux/interrupt.h>
0024 #include <linux/virtio.h>
0025 #include <linux/virtio_config.h>
0026 #include <linux/virtio_ring.h>
0027 #include <linux/virtio_pci.h>
0028 #include <linux/virtio_pci_legacy.h>
0029 #include <linux/virtio_pci_modern.h>
0030 #include <linux/highmem.h>
0031 #include <linux/spinlock.h>
0032
0033 struct virtio_pci_vq_info {
0034
0035 struct virtqueue *vq;
0036
0037
0038 struct list_head node;
0039
0040
0041 unsigned int msix_vector;
0042 };
0043
0044
0045 struct virtio_pci_device {
0046 struct virtio_device vdev;
0047 struct pci_dev *pci_dev;
0048 struct virtio_pci_legacy_device ldev;
0049 struct virtio_pci_modern_device mdev;
0050
0051 bool is_legacy;
0052
0053
0054 u8 __iomem *isr;
0055
0056
0057 spinlock_t lock;
0058 struct list_head virtqueues;
0059
0060
0061 struct virtio_pci_vq_info **vqs;
0062
0063
0064 int msix_enabled;
0065 int intx_enabled;
0066 cpumask_var_t *msix_affinity_masks;
0067
0068
0069 char (*msix_names)[256];
0070
0071 unsigned int msix_vectors;
0072
0073 unsigned int msix_used_vectors;
0074
0075
0076 bool per_vq_vectors;
0077
0078 struct virtqueue *(*setup_vq)(struct virtio_pci_device *vp_dev,
0079 struct virtio_pci_vq_info *info,
0080 unsigned int idx,
0081 void (*callback)(struct virtqueue *vq),
0082 const char *name,
0083 bool ctx,
0084 u16 msix_vec);
0085 void (*del_vq)(struct virtio_pci_vq_info *info);
0086
0087 u16 (*config_vector)(struct virtio_pci_device *vp_dev, u16 vector);
0088 };
0089
0090
0091
0092
0093 enum {
0094 VP_MSIX_CONFIG_VECTOR = 0,
0095 VP_MSIX_VQ_VECTOR = 1,
0096 };
0097
0098
0099 static struct virtio_pci_device *to_vp_device(struct virtio_device *vdev)
0100 {
0101 return container_of(vdev, struct virtio_pci_device, vdev);
0102 }
0103
0104
0105 void vp_synchronize_vectors(struct virtio_device *vdev);
0106
0107 bool vp_notify(struct virtqueue *vq);
0108
0109 void vp_del_vqs(struct virtio_device *vdev);
0110
0111 int vp_find_vqs(struct virtio_device *vdev, unsigned int nvqs,
0112 struct virtqueue *vqs[], vq_callback_t *callbacks[],
0113 const char * const names[], const bool *ctx,
0114 struct irq_affinity *desc);
0115 const char *vp_bus_name(struct virtio_device *vdev);
0116
0117
0118
0119
0120
0121
0122 int vp_set_vq_affinity(struct virtqueue *vq, const struct cpumask *cpu_mask);
0123
0124 const struct cpumask *vp_get_vq_affinity(struct virtio_device *vdev, int index);
0125
0126 #if IS_ENABLED(CONFIG_VIRTIO_PCI_LEGACY)
0127 int virtio_pci_legacy_probe(struct virtio_pci_device *);
0128 void virtio_pci_legacy_remove(struct virtio_pci_device *);
0129 #else
0130 static inline int virtio_pci_legacy_probe(struct virtio_pci_device *vp_dev)
0131 {
0132 return -ENODEV;
0133 }
0134 static inline void virtio_pci_legacy_remove(struct virtio_pci_device *vp_dev)
0135 {
0136 }
0137 #endif
0138 int virtio_pci_modern_probe(struct virtio_pci_device *);
0139 void virtio_pci_modern_remove(struct virtio_pci_device *);
0140
0141 #endif