Blame view

include/linux/virtio_config.h 7.16 KB
ec3d41c4d   Rusty Russell   Virtio interface
1
2
  #ifndef _LINUX_VIRTIO_CONFIG_H
  #define _LINUX_VIRTIO_CONFIG_H
674bfc23c   Rusty Russell   virtio: clarify t...
3
  /* This header, excluding the #ifdef __KERNEL__ part, is BSD licensed so
a1b383870   Rusty Russell   virtio: add full ...
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
   * anyone can use the definitions to implement compatible drivers/servers.
   *
   * Redistribution and use in source and binary forms, with or without
   * modification, are permitted provided that the following conditions
   * are met:
   * 1. Redistributions of source code must retain the above copyright
   *    notice, this list of conditions and the following disclaimer.
   * 2. Redistributions in binary form must reproduce the above copyright
   *    notice, this list of conditions and the following disclaimer in the
   *    documentation and/or other materials provided with the distribution.
   * 3. Neither the name of IBM nor the names of its contributors
   *    may be used to endorse or promote products derived from this software
   *    without specific prior written permission.
   * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS IS'' AND
   * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
   * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
   * ARE DISCLAIMED.  IN NO EVENT SHALL IBM OR CONTRIBUTORS BE LIABLE
   * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
   * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
   * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
   * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
   * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
   * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
   * SUCH DAMAGE. */
674bfc23c   Rusty Russell   virtio: clarify t...
28

ec3d41c4d   Rusty Russell   Virtio interface
29
30
31
32
  /* Virtio devices use a standardized configuration space to define their
   * features and pass configuration information, but each implementation can
   * store and access that space differently. */
  #include <linux/types.h>
a586d4f60   Rusty Russell   virtio: simplify ...
33
  /* Status byte for guest to report progress, and synchronize features. */
ec3d41c4d   Rusty Russell   Virtio interface
34
35
36
37
38
39
40
41
  /* We have seen device and processed generic fields (VIRTIO_CONFIG_F_VIRTIO) */
  #define VIRTIO_CONFIG_S_ACKNOWLEDGE	1
  /* We have found a driver for the device. */
  #define VIRTIO_CONFIG_S_DRIVER		2
  /* Driver has used its parts of the config, and is happy */
  #define VIRTIO_CONFIG_S_DRIVER_OK	4
  /* We've given up on this device. */
  #define VIRTIO_CONFIG_S_FAILED		0x80
dd7c7bc46   Rusty Russell   virtio: Formally ...
42
43
44
45
46
  /* Some virtio feature bits (currently bits 28 through 31) are reserved for the
   * transport being used (eg. virtio_ring), the rest are per-device feature
   * bits. */
  #define VIRTIO_TRANSPORT_F_START	28
  #define VIRTIO_TRANSPORT_F_END		32
b4f68be6c   Rusty Russell   virtio: force cal...
47
48
49
  /* Do we get callbacks when the ring is completely used, even if we've
   * suppressed them? */
  #define VIRTIO_F_NOTIFY_ON_EMPTY	24
ec3d41c4d   Rusty Russell   Virtio interface
50
  #ifdef __KERNEL__
d2a7ddda9   Michael S. Tsirkin   virtio: find_vqs/...
51
  #include <linux/err.h>
72e61eb40   Rusty Russell   virtio: change co...
52
  #include <linux/virtio.h>
ec3d41c4d   Rusty Russell   Virtio interface
53
54
55
  
  /**
   * virtio_config_ops - operations for configuring a virtio device
a586d4f60   Rusty Russell   virtio: simplify ...
56
   * @get: read the value of a configuration field
ec3d41c4d   Rusty Russell   Virtio interface
57
   *	vdev: the virtio_device
a586d4f60   Rusty Russell   virtio: simplify ...
58
   *	offset: the offset of the configuration field
ec3d41c4d   Rusty Russell   Virtio interface
59
   *	buf: the buffer to write the field value into.
a586d4f60   Rusty Russell   virtio: simplify ...
60
   *	len: the length of the buffer
a586d4f60   Rusty Russell   virtio: simplify ...
61
   * @set: write the value of a configuration field
ec3d41c4d   Rusty Russell   Virtio interface
62
   *	vdev: the virtio_device
a586d4f60   Rusty Russell   virtio: simplify ...
63
   *	offset: the offset of the configuration field
ec3d41c4d   Rusty Russell   Virtio interface
64
   *	buf: the buffer to read the field value from.
a586d4f60   Rusty Russell   virtio: simplify ...
65
   *	len: the length of the buffer
ec3d41c4d   Rusty Russell   Virtio interface
66
67
68
69
70
71
   * @get_status: read the status byte
   *	vdev: the virtio_device
   *	Returns the status byte
   * @set_status: write the status byte
   *	vdev: the virtio_device
   *	status: the new status byte
d2a7ddda9   Michael S. Tsirkin   virtio: find_vqs/...
72
73
74
75
76
77
78
79
80
   * @request_vqs: request the specified number of virtqueues
   *	vdev: the virtio_device
   *	max_vqs: the max number of virtqueues we want
   *      If supplied, must call before any virtqueues are instantiated.
   *      To modify the max number of virtqueues after request_vqs has been
   *      called, call free_vqs and then request_vqs with a new value.
   * @free_vqs: cleanup resources allocated by request_vqs
   *	vdev: the virtio_device
   *      If supplied, must call after all virtqueues have been deleted.
6e5aa7efb   Rusty Russell   virtio: reset fun...
81
82
83
   * @reset: reset the device
   *	vdev: the virtio device
   *	After this, status and feature negotiation must be done again
d2a7ddda9   Michael S. Tsirkin   virtio: find_vqs/...
84
   * @find_vqs: find virtqueues and instantiate them.
ec3d41c4d   Rusty Russell   Virtio interface
85
   *	vdev: the virtio_device
d2a7ddda9   Michael S. Tsirkin   virtio: find_vqs/...
86
87
88
89
90
91
   *	nvqs: the number of virtqueues to find
   *	vqs: on success, includes new virtqueues
   *	callbacks: array of callbacks, for each virtqueue
   *	names: array of virtqueue names (mainly for debugging)
   *	Returns 0 on success or error status
   * @del_vqs: free virtqueues found by find_vqs().
c45a6816c   Rusty Russell   virtio: explicit ...
92
93
94
   * @get_features: get the array of feature bits for this device.
   *	vdev: the virtio_device
   *	Returns the first 32 feature bits (all we currently need).
c624896e4   Rusty Russell   virtio: Rename se...
95
   * @finalize_features: confirm what device features we'll be using.
c45a6816c   Rusty Russell   virtio: explicit ...
96
   *	vdev: the virtio_device
c624896e4   Rusty Russell   virtio: Rename se...
97
98
   *	This gives the final feature bits for the device: it can change
   *	the dev->feature bits if it wants.
ec3d41c4d   Rusty Russell   Virtio interface
99
   */
d2a7ddda9   Michael S. Tsirkin   virtio: find_vqs/...
100
  typedef void vq_callback_t(struct virtqueue *);
1842f23c0   Rusty Russell   lguest and virtio...
101
  struct virtio_config_ops {
a586d4f60   Rusty Russell   virtio: simplify ...
102
  	void (*get)(struct virtio_device *vdev, unsigned offset,
ec3d41c4d   Rusty Russell   Virtio interface
103
  		    void *buf, unsigned len);
a586d4f60   Rusty Russell   virtio: simplify ...
104
  	void (*set)(struct virtio_device *vdev, unsigned offset,
ec3d41c4d   Rusty Russell   Virtio interface
105
106
107
  		    const void *buf, unsigned len);
  	u8 (*get_status)(struct virtio_device *vdev);
  	void (*set_status)(struct virtio_device *vdev, u8 status);
6e5aa7efb   Rusty Russell   virtio: reset fun...
108
  	void (*reset)(struct virtio_device *vdev);
d2a7ddda9   Michael S. Tsirkin   virtio: find_vqs/...
109
110
111
112
113
  	int (*find_vqs)(struct virtio_device *, unsigned nvqs,
  			struct virtqueue *vqs[],
  			vq_callback_t *callbacks[],
  			const char *names[]);
  	void (*del_vqs)(struct virtio_device *);
c45a6816c   Rusty Russell   virtio: explicit ...
114
  	u32 (*get_features)(struct virtio_device *vdev);
c624896e4   Rusty Russell   virtio: Rename se...
115
  	void (*finalize_features)(struct virtio_device *vdev);
ec3d41c4d   Rusty Russell   Virtio interface
116
  };
c45a6816c   Rusty Russell   virtio: explicit ...
117
118
119
120
121
122
123
124
125
126
127
128
129
  /* If driver didn't advertise the feature, it will never appear. */
  void virtio_check_driver_offered_feature(const struct virtio_device *vdev,
  					 unsigned int fbit);
  
  /**
   * virtio_has_feature - helper to determine if this device has this feature.
   * @vdev: the device
   * @fbit: the feature bit
   */
  static inline bool virtio_has_feature(const struct virtio_device *vdev,
  				      unsigned int fbit)
  {
  	/* Did you forget to fix assumptions on max features? */
1765e3a49   Rusty Russell   Remove MAYBE_BUIL...
130
131
132
133
  	if (__builtin_constant_p(fbit))
  		BUILD_BUG_ON(fbit >= 32);
  	else
  		BUG_ON(fbit >= 32);
c45a6816c   Rusty Russell   virtio: explicit ...
134

ee006b353   Mark McLoughlin   virtio: teach vir...
135
136
  	if (fbit < VIRTIO_TRANSPORT_F_START)
  		virtio_check_driver_offered_feature(vdev, fbit);
c45a6816c   Rusty Russell   virtio: explicit ...
137
138
  	return test_bit(fbit, vdev->features);
  }
ec3d41c4d   Rusty Russell   Virtio interface
139
  /**
72e61eb40   Rusty Russell   virtio: change co...
140
   * virtio_config_val - look for a feature and get a virtio config entry.
a586d4f60   Rusty Russell   virtio: simplify ...
141
142
143
   * @vdev: the virtio device
   * @fbit: the feature bit
   * @offset: the type to search for.
ec3d41c4d   Rusty Russell   Virtio interface
144
145
   * @val: a pointer to the value to fill in.
   *
a586d4f60   Rusty Russell   virtio: simplify ...
146
   * The return value is -ENOENT if the feature doesn't exist.  Otherwise
72e61eb40   Rusty Russell   virtio: change co...
147
148
   * the config value is copied into whatever is pointed to by v. */
  #define virtio_config_val(vdev, fbit, offset, v) \
7f31fe050   Christian Borntraeger   virtio_config: fi...
149
  	virtio_config_buf((vdev), (fbit), (offset), (v), sizeof(*v))
ec3d41c4d   Rusty Russell   Virtio interface
150

72e61eb40   Rusty Russell   virtio: change co...
151
152
153
154
155
  static inline int virtio_config_buf(struct virtio_device *vdev,
  				    unsigned int fbit,
  				    unsigned int offset,
  				    void *buf, unsigned len)
  {
c45a6816c   Rusty Russell   virtio: explicit ...
156
  	if (!virtio_has_feature(vdev, fbit))
72e61eb40   Rusty Russell   virtio: change co...
157
158
159
160
161
  		return -ENOENT;
  
  	vdev->config->get(vdev, offset, buf, len);
  	return 0;
  }
d2a7ddda9   Michael S. Tsirkin   virtio: find_vqs/...
162
163
164
165
166
167
168
169
170
171
172
173
174
  
  static inline
  struct virtqueue *virtio_find_single_vq(struct virtio_device *vdev,
  					vq_callback_t *c, const char *n)
  {
  	vq_callback_t *callbacks[] = { c };
  	const char *names[] = { n };
  	struct virtqueue *vq;
  	int err = vdev->config->find_vqs(vdev, 1, &vq, callbacks, names);
  	if (err < 0)
  		return ERR_PTR(err);
  	return vq;
  }
ec3d41c4d   Rusty Russell   Virtio interface
175
176
  #endif /* __KERNEL__ */
  #endif /* _LINUX_VIRTIO_CONFIG_H */