diff options
Diffstat (limited to 'include/linux/virtio_config.h')
-rw-r--r-- | include/linux/virtio_config.h | 76 |
1 files changed, 24 insertions, 52 deletions
diff --git a/include/linux/virtio_config.h b/include/linux/virtio_config.h index fc457f452f64..29b9104232b4 100644 --- a/include/linux/virtio_config.h +++ b/include/linux/virtio_config.h | |||
@@ -1,60 +1,10 @@ | |||
1 | #ifndef _LINUX_VIRTIO_CONFIG_H | 1 | #ifndef _LINUX_VIRTIO_CONFIG_H |
2 | #define _LINUX_VIRTIO_CONFIG_H | 2 | #define _LINUX_VIRTIO_CONFIG_H |
3 | /* This header, excluding the #ifdef __KERNEL__ part, is BSD licensed so | ||
4 | * anyone can use the definitions to implement compatible drivers/servers. | ||
5 | * | ||
6 | * Redistribution and use in source and binary forms, with or without | ||
7 | * modification, are permitted provided that the following conditions | ||
8 | * are met: | ||
9 | * 1. Redistributions of source code must retain the above copyright | ||
10 | * notice, this list of conditions and the following disclaimer. | ||
11 | * 2. Redistributions in binary form must reproduce the above copyright | ||
12 | * notice, this list of conditions and the following disclaimer in the | ||
13 | * documentation and/or other materials provided with the distribution. | ||
14 | * 3. Neither the name of IBM nor the names of its contributors | ||
15 | * may be used to endorse or promote products derived from this software | ||
16 | * without specific prior written permission. | ||
17 | * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS IS'' AND | ||
18 | * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE | ||
19 | * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE | ||
20 | * ARE DISCLAIMED. IN NO EVENT SHALL IBM OR CONTRIBUTORS BE LIABLE | ||
21 | * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL | ||
22 | * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS | ||
23 | * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) | ||
24 | * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT | ||
25 | * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY | ||
26 | * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF | ||
27 | * SUCH DAMAGE. */ | ||
28 | |||
29 | /* Virtio devices use a standardized configuration space to define their | ||
30 | * features and pass configuration information, but each implementation can | ||
31 | * store and access that space differently. */ | ||
32 | #include <linux/types.h> | ||
33 | |||
34 | /* Status byte for guest to report progress, and synchronize features. */ | ||
35 | /* We have seen device and processed generic fields (VIRTIO_CONFIG_F_VIRTIO) */ | ||
36 | #define VIRTIO_CONFIG_S_ACKNOWLEDGE 1 | ||
37 | /* We have found a driver for the device. */ | ||
38 | #define VIRTIO_CONFIG_S_DRIVER 2 | ||
39 | /* Driver has used its parts of the config, and is happy */ | ||
40 | #define VIRTIO_CONFIG_S_DRIVER_OK 4 | ||
41 | /* We've given up on this device. */ | ||
42 | #define VIRTIO_CONFIG_S_FAILED 0x80 | ||
43 | |||
44 | /* Some virtio feature bits (currently bits 28 through 31) are reserved for the | ||
45 | * transport being used (eg. virtio_ring), the rest are per-device feature | ||
46 | * bits. */ | ||
47 | #define VIRTIO_TRANSPORT_F_START 28 | ||
48 | #define VIRTIO_TRANSPORT_F_END 32 | ||
49 | 3 | ||
50 | /* Do we get callbacks when the ring is completely used, even if we've | ||
51 | * suppressed them? */ | ||
52 | #define VIRTIO_F_NOTIFY_ON_EMPTY 24 | ||
53 | |||
54 | #ifdef __KERNEL__ | ||
55 | #include <linux/err.h> | 4 | #include <linux/err.h> |
56 | #include <linux/bug.h> | 5 | #include <linux/bug.h> |
57 | #include <linux/virtio.h> | 6 | #include <linux/virtio.h> |
7 | #include <uapi/linux/virtio_config.h> | ||
58 | 8 | ||
59 | /** | 9 | /** |
60 | * virtio_config_ops - operations for configuring a virtio device | 10 | * virtio_config_ops - operations for configuring a virtio device |
@@ -84,7 +34,9 @@ | |||
84 | * nvqs: the number of virtqueues to find | 34 | * nvqs: the number of virtqueues to find |
85 | * vqs: on success, includes new virtqueues | 35 | * vqs: on success, includes new virtqueues |
86 | * callbacks: array of callbacks, for each virtqueue | 36 | * callbacks: array of callbacks, for each virtqueue |
37 | * include a NULL entry for vqs that do not need a callback | ||
87 | * names: array of virtqueue names (mainly for debugging) | 38 | * names: array of virtqueue names (mainly for debugging) |
39 | * include a NULL entry for vqs unused by driver | ||
88 | * Returns 0 on success or error status | 40 | * Returns 0 on success or error status |
89 | * @del_vqs: free virtqueues found by find_vqs(). | 41 | * @del_vqs: free virtqueues found by find_vqs(). |
90 | * @get_features: get the array of feature bits for this device. | 42 | * @get_features: get the array of feature bits for this device. |
@@ -98,6 +50,7 @@ | |||
98 | * vdev: the virtio_device | 50 | * vdev: the virtio_device |
99 | * This returns a pointer to the bus name a la pci_name from which | 51 | * This returns a pointer to the bus name a la pci_name from which |
100 | * the caller can then copy. | 52 | * the caller can then copy. |
53 | * @set_vq_affinity: set the affinity for a virtqueue. | ||
101 | */ | 54 | */ |
102 | typedef void vq_callback_t(struct virtqueue *); | 55 | typedef void vq_callback_t(struct virtqueue *); |
103 | struct virtio_config_ops { | 56 | struct virtio_config_ops { |
@@ -116,6 +69,7 @@ struct virtio_config_ops { | |||
116 | u32 (*get_features)(struct virtio_device *vdev); | 69 | u32 (*get_features)(struct virtio_device *vdev); |
117 | void (*finalize_features)(struct virtio_device *vdev); | 70 | void (*finalize_features)(struct virtio_device *vdev); |
118 | const char *(*bus_name)(struct virtio_device *vdev); | 71 | const char *(*bus_name)(struct virtio_device *vdev); |
72 | int (*set_vq_affinity)(struct virtqueue *vq, int cpu); | ||
119 | }; | 73 | }; |
120 | 74 | ||
121 | /* If driver didn't advertise the feature, it will never appear. */ | 75 | /* If driver didn't advertise the feature, it will never appear. */ |
@@ -190,5 +144,23 @@ const char *virtio_bus_name(struct virtio_device *vdev) | |||
190 | return vdev->config->bus_name(vdev); | 144 | return vdev->config->bus_name(vdev); |
191 | } | 145 | } |
192 | 146 | ||
193 | #endif /* __KERNEL__ */ | 147 | /** |
148 | * virtqueue_set_affinity - setting affinity for a virtqueue | ||
149 | * @vq: the virtqueue | ||
150 | * @cpu: the cpu no. | ||
151 | * | ||
152 | * Pay attention the function are best-effort: the affinity hint may not be set | ||
153 | * due to config support, irq type and sharing. | ||
154 | * | ||
155 | */ | ||
156 | static inline | ||
157 | int virtqueue_set_affinity(struct virtqueue *vq, int cpu) | ||
158 | { | ||
159 | struct virtio_device *vdev = vq->vdev; | ||
160 | if (vdev->config->set_vq_affinity) | ||
161 | return vdev->config->set_vq_affinity(vq, cpu); | ||
162 | return 0; | ||
163 | } | ||
164 | |||
165 | |||
194 | #endif /* _LINUX_VIRTIO_CONFIG_H */ | 166 | #endif /* _LINUX_VIRTIO_CONFIG_H */ |