~ [ source navigation ] ~ [ diff markup ] ~ [ identifier search ] ~

TOMOYO Linux Cross Reference
Linux/include/linux/virtio_config.h

Version: ~ [ linux-5.14-rc3 ] ~ [ linux-5.13.5 ] ~ [ linux-5.12.19 ] ~ [ linux-5.11.22 ] ~ [ linux-5.10.53 ] ~ [ linux-5.9.16 ] ~ [ linux-5.8.18 ] ~ [ linux-5.7.19 ] ~ [ linux-5.6.19 ] ~ [ linux-5.5.19 ] ~ [ linux-5.4.135 ] ~ [ linux-5.3.18 ] ~ [ linux-5.2.21 ] ~ [ linux-5.1.21 ] ~ [ linux-5.0.21 ] ~ [ linux-4.20.17 ] ~ [ linux-4.19.198 ] ~ [ linux-4.18.20 ] ~ [ linux-4.17.19 ] ~ [ linux-4.16.18 ] ~ [ linux-4.15.18 ] ~ [ linux-4.14.240 ] ~ [ linux-4.13.16 ] ~ [ linux-4.12.14 ] ~ [ linux-4.11.12 ] ~ [ linux-4.10.17 ] ~ [ linux-4.9.276 ] ~ [ linux-4.8.17 ] ~ [ linux-4.7.10 ] ~ [ linux-4.6.7 ] ~ [ linux-4.5.7 ] ~ [ linux-4.4.276 ] ~ [ linux-4.3.6 ] ~ [ linux-4.2.8 ] ~ [ linux-4.1.52 ] ~ [ linux-4.0.9 ] ~ [ linux-3.18.140 ] ~ [ linux-3.16.85 ] ~ [ linux-3.14.79 ] ~ [ linux-3.12.74 ] ~ [ linux-3.10.108 ] ~ [ linux-2.6.32.71 ] ~ [ linux-2.6.0 ] ~ [ linux-2.4.37.11 ] ~ [ unix-v6-master ] ~ [ ccs-tools-1.8.5 ] ~ [ policy-sample ] ~
Architecture: ~ [ i386 ] ~ [ alpha ] ~ [ m68k ] ~ [ mips ] ~ [ ppc ] ~ [ sparc ] ~ [ sparc64 ] ~

  1 #ifndef _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 /* Virtio devices use a standardized configuration space to define their
  7  * features and pass configuration information, but each implementation can
  8  * store and access that space differently. */
  9 #include <linux/types.h>
 10 
 11 /* Status byte for guest to report progress, and synchronize features. */
 12 /* We have seen device and processed generic fields (VIRTIO_CONFIG_F_VIRTIO) */
 13 #define VIRTIO_CONFIG_S_ACKNOWLEDGE     1
 14 /* We have found a driver for the device. */
 15 #define VIRTIO_CONFIG_S_DRIVER          2
 16 /* Driver has used its parts of the config, and is happy */
 17 #define VIRTIO_CONFIG_S_DRIVER_OK       4
 18 /* We've given up on this device. */
 19 #define VIRTIO_CONFIG_S_FAILED          0x80
 20 
 21 /* Some virtio feature bits (currently bits 28 through 31) are reserved for the
 22  * transport being used (eg. virtio_ring), the rest are per-device feature
 23  * bits. */
 24 #define VIRTIO_TRANSPORT_F_START        28
 25 #define VIRTIO_TRANSPORT_F_END          32
 26 
 27 /* Do we get callbacks when the ring is completely used, even if we've
 28  * suppressed them? */
 29 #define VIRTIO_F_NOTIFY_ON_EMPTY        24
 30 
 31 #ifdef __KERNEL__
 32 #include <linux/err.h>
 33 #include <linux/virtio.h>
 34 
 35 /**
 36  * virtio_config_ops - operations for configuring a virtio device
 37  * @get: read the value of a configuration field
 38  *      vdev: the virtio_device
 39  *      offset: the offset of the configuration field
 40  *      buf: the buffer to write the field value into.
 41  *      len: the length of the buffer
 42  * @set: write the value of a configuration field
 43  *      vdev: the virtio_device
 44  *      offset: the offset of the configuration field
 45  *      buf: the buffer to read the field value from.
 46  *      len: the length of the buffer
 47  * @get_status: read the status byte
 48  *      vdev: the virtio_device
 49  *      Returns the status byte
 50  * @set_status: write the status byte
 51  *      vdev: the virtio_device
 52  *      status: the new status byte
 53  * @request_vqs: request the specified number of virtqueues
 54  *      vdev: the virtio_device
 55  *      max_vqs: the max number of virtqueues we want
 56  *      If supplied, must call before any virtqueues are instantiated.
 57  *      To modify the max number of virtqueues after request_vqs has been
 58  *      called, call free_vqs and then request_vqs with a new value.
 59  * @free_vqs: cleanup resources allocated by request_vqs
 60  *      vdev: the virtio_device
 61  *      If supplied, must call after all virtqueues have been deleted.
 62  * @reset: reset the device
 63  *      vdev: the virtio device
 64  *      After this, status and feature negotiation must be done again
 65  * @find_vqs: find virtqueues and instantiate them.
 66  *      vdev: the virtio_device
 67  *      nvqs: the number of virtqueues to find
 68  *      vqs: on success, includes new virtqueues
 69  *      callbacks: array of callbacks, for each virtqueue
 70  *      names: array of virtqueue names (mainly for debugging)
 71  *      Returns 0 on success or error status
 72  * @del_vqs: free virtqueues found by find_vqs().
 73  * @get_features: get the array of feature bits for this device.
 74  *      vdev: the virtio_device
 75  *      Returns the first 32 feature bits (all we currently need).
 76  * @finalize_features: confirm what device features we'll be using.
 77  *      vdev: the virtio_device
 78  *      This gives the final feature bits for the device: it can change
 79  *      the dev->feature bits if it wants.
 80  */
 81 typedef void vq_callback_t(struct virtqueue *);
 82 struct virtio_config_ops {
 83         void (*get)(struct virtio_device *vdev, unsigned offset,
 84                     void *buf, unsigned len);
 85         void (*set)(struct virtio_device *vdev, unsigned offset,
 86                     const void *buf, unsigned len);
 87         u8 (*get_status)(struct virtio_device *vdev);
 88         void (*set_status)(struct virtio_device *vdev, u8 status);
 89         void (*reset)(struct virtio_device *vdev);
 90         int (*find_vqs)(struct virtio_device *, unsigned nvqs,
 91                         struct virtqueue *vqs[],
 92                         vq_callback_t *callbacks[],
 93                         const char *names[]);
 94         void (*del_vqs)(struct virtio_device *);
 95         u32 (*get_features)(struct virtio_device *vdev);
 96         void (*finalize_features)(struct virtio_device *vdev);
 97 };
 98 
 99 /* If driver didn't advertise the feature, it will never appear. */
100 void virtio_check_driver_offered_feature(const struct virtio_device *vdev,
101                                          unsigned int fbit);
102 
103 /**
104  * virtio_has_feature - helper to determine if this device has this feature.
105  * @vdev: the device
106  * @fbit: the feature bit
107  */
108 static inline bool virtio_has_feature(const struct virtio_device *vdev,
109                                       unsigned int fbit)
110 {
111         /* Did you forget to fix assumptions on max features? */
112         MAYBE_BUILD_BUG_ON(fbit >= 32);
113 
114         if (fbit < VIRTIO_TRANSPORT_F_START)
115                 virtio_check_driver_offered_feature(vdev, fbit);
116 
117         return test_bit(fbit, vdev->features);
118 }
119 
120 /**
121  * virtio_config_val - look for a feature and get a virtio config entry.
122  * @vdev: the virtio device
123  * @fbit: the feature bit
124  * @offset: the type to search for.
125  * @val: a pointer to the value to fill in.
126  *
127  * The return value is -ENOENT if the feature doesn't exist.  Otherwise
128  * the config value is copied into whatever is pointed to by v. */
129 #define virtio_config_val(vdev, fbit, offset, v) \
130         virtio_config_buf((vdev), (fbit), (offset), (v), sizeof(*v))
131 
132 static inline int virtio_config_buf(struct virtio_device *vdev,
133                                     unsigned int fbit,
134                                     unsigned int offset,
135                                     void *buf, unsigned len)
136 {
137         if (!virtio_has_feature(vdev, fbit))
138                 return -ENOENT;
139 
140         vdev->config->get(vdev, offset, buf, len);
141         return 0;
142 }
143 
144 static inline
145 struct virtqueue *virtio_find_single_vq(struct virtio_device *vdev,
146                                         vq_callback_t *c, const char *n)
147 {
148         vq_callback_t *callbacks[] = { c };
149         const char *names[] = { n };
150         struct virtqueue *vq;
151         int err = vdev->config->find_vqs(vdev, 1, &vq, callbacks, names);
152         if (err < 0)
153                 return ERR_PTR(err);
154         return vq;
155 }
156 #endif /* __KERNEL__ */
157 #endif /* _LINUX_VIRTIO_CONFIG_H */
158 

~ [ source navigation ] ~ [ diff markup ] ~ [ identifier search ] ~

kernel.org | git.kernel.org | LWN.net | Project Home | Wiki (Japanese) | Wiki (English) | SVN repository | Mail admin

Linux® is a registered trademark of Linus Torvalds in the United States and other countries.
TOMOYO® is a registered trademark of NTT DATA CORPORATION.

osdn.jp