virtio_config.h 7.8 KB

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