1#ifndef _DRIVERS_VIRTIO_VIRTIO_PCI_COMMON_H
2#define _DRIVERS_VIRTIO_VIRTIO_PCI_COMMON_H
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22#include <linux/module.h>
23#include <linux/list.h>
24#include <linux/pci.h>
25#include <linux/slab.h>
26#include <linux/interrupt.h>
27#include <linux/virtio.h>
28#include <linux/virtio_config.h>
29#include <linux/virtio_ring.h>
30#include <linux/virtio_pci.h>
31#include <linux/highmem.h>
32#include <linux/spinlock.h>
33
34struct virtio_pci_vq_info {
35
36 struct virtqueue *vq;
37
38
39 struct list_head node;
40
41
42 unsigned msix_vector;
43};
44
45
46struct virtio_pci_device {
47 struct virtio_device vdev;
48 struct pci_dev *pci_dev;
49
50
51
52 u8 __iomem *isr;
53
54
55
56 struct virtio_pci_common_cfg __iomem *common;
57
58 void __iomem *device;
59
60 void __iomem *notify_base;
61
62
63 size_t notify_len;
64 size_t device_len;
65
66
67 int notify_map_cap;
68
69
70 u32 notify_offset_multiplier;
71
72 int modern_bars;
73
74
75
76 void __iomem *ioaddr;
77
78
79 spinlock_t lock;
80 struct list_head virtqueues;
81
82
83 struct virtio_pci_vq_info **vqs;
84
85
86 int msix_enabled;
87 int intx_enabled;
88 struct msix_entry *msix_entries;
89 cpumask_var_t *msix_affinity_masks;
90
91
92 char (*msix_names)[256];
93
94 unsigned msix_vectors;
95
96 unsigned msix_used_vectors;
97
98
99 bool per_vq_vectors;
100
101 struct virtqueue *(*setup_vq)(struct virtio_pci_device *vp_dev,
102 struct virtio_pci_vq_info *info,
103 unsigned idx,
104 void (*callback)(struct virtqueue *vq),
105 const char *name,
106 u16 msix_vec);
107 void (*del_vq)(struct virtio_pci_vq_info *info);
108
109 u16 (*config_vector)(struct virtio_pci_device *vp_dev, u16 vector);
110};
111
112
113
114
115enum {
116 VP_MSIX_CONFIG_VECTOR = 0,
117 VP_MSIX_VQ_VECTOR = 1,
118};
119
120
121static struct virtio_pci_device *to_vp_device(struct virtio_device *vdev)
122{
123 return container_of(vdev, struct virtio_pci_device, vdev);
124}
125
126
127void vp_synchronize_vectors(struct virtio_device *vdev);
128
129bool vp_notify(struct virtqueue *vq);
130
131void vp_del_vqs(struct virtio_device *vdev);
132
133int vp_find_vqs(struct virtio_device *vdev, unsigned nvqs,
134 struct virtqueue *vqs[],
135 vq_callback_t *callbacks[],
136 const char * const names[]);
137const char *vp_bus_name(struct virtio_device *vdev);
138
139
140
141
142
143
144int vp_set_vq_affinity(struct virtqueue *vq, int cpu);
145
146#if IS_ENABLED(CONFIG_VIRTIO_PCI_LEGACY)
147int virtio_pci_legacy_probe(struct virtio_pci_device *);
148void virtio_pci_legacy_remove(struct virtio_pci_device *);
149#else
150static inline int virtio_pci_legacy_probe(struct virtio_pci_device *vp_dev)
151{
152 return -ENODEV;
153}
154static inline void virtio_pci_legacy_remove(struct virtio_pci_device *vp_dev)
155{
156}
157#endif
158int virtio_pci_modern_probe(struct virtio_pci_device *);
159void virtio_pci_modern_remove(struct virtio_pci_device *);
160
161#endif
162