virtio_config.h 7.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200
  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/virtio.h>
  52. /**
  53. * virtio_config_ops - operations for configuring a virtio device
  54. * @get: read the value of a configuration field
  55. * vdev: the virtio_device
  56. * offset: the offset of the configuration field
  57. * buf: the buffer to write the field value into.
  58. * len: the length of the buffer
  59. * @set: write the value of a configuration field
  60. * vdev: the virtio_device
  61. * offset: the offset of the configuration field
  62. * buf: the buffer to read the field value from.
  63. * len: the length of the buffer
  64. * @get_status: read the status byte
  65. * vdev: the virtio_device
  66. * Returns the status byte
  67. * @set_status: write the status byte
  68. * vdev: the virtio_device
  69. * status: the new status byte
  70. * @request_vqs: request the specified number of virtqueues
  71. * vdev: the virtio_device
  72. * max_vqs: the max number of virtqueues we want
  73. * If supplied, must call before any virtqueues are instantiated.
  74. * To modify the max number of virtqueues after request_vqs has been
  75. * called, call free_vqs and then request_vqs with a new value.
  76. * @free_vqs: cleanup resources allocated by request_vqs
  77. * vdev: the virtio_device
  78. * If supplied, must call after all virtqueues have been deleted.
  79. * @reset: reset the device
  80. * vdev: the virtio device
  81. * After this, status and feature negotiation must be done again
  82. * @find_vqs: find virtqueues and instantiate them.
  83. * vdev: the virtio_device
  84. * nvqs: the number of virtqueues to find
  85. * vqs: on success, includes new virtqueues
  86. * callbacks: array of callbacks, for each virtqueue
  87. * names: array of virtqueue names (mainly for debugging)
  88. * Returns 0 on success or error status
  89. * @del_vqs: free virtqueues found by find_vqs().
  90. * @get_features: get the array of feature bits for this device.
  91. * vdev: the virtio_device
  92. * Returns the first 32 feature bits (all we currently need).
  93. * @finalize_features: confirm what device features we'll be using.
  94. * vdev: the virtio_device
  95. * This gives the final feature bits for the device: it can change
  96. * the dev->feature bits if it wants.
  97. * @bus_name: return the bus name associated with the device
  98. * vdev: the virtio_device
  99. * This returns a pointer to the bus name a la pci_name from which
  100. * the caller can then copy.
  101. */
  102. typedef void vq_callback_t(struct virtqueue *);
  103. struct virtio_config_ops {
  104. void (*get)(struct virtio_device *vdev, unsigned offset,
  105. void *buf, unsigned len);
  106. void (*set)(struct virtio_device *vdev, unsigned offset,
  107. const void *buf, unsigned len);
  108. u8 (*get_status)(struct virtio_device *vdev);
  109. void (*set_status)(struct virtio_device *vdev, u8 status);
  110. void (*reset)(struct virtio_device *vdev);
  111. int (*find_vqs)(struct virtio_device *, unsigned nvqs,
  112. struct virtqueue *vqs[],
  113. vq_callback_t *callbacks[],
  114. const char *names[]);
  115. void (*del_vqs)(struct virtio_device *);
  116. u32 (*get_features)(struct virtio_device *vdev);
  117. void (*finalize_features)(struct virtio_device *vdev);
  118. const char *(*bus_name)(struct virtio_device *vdev);
  119. };
  120. /* If driver didn't advertise the feature, it will never appear. */
  121. void virtio_check_driver_offered_feature(const struct virtio_device *vdev,
  122. unsigned int fbit);
  123. /**
  124. * virtio_has_feature - helper to determine if this device has this feature.
  125. * @vdev: the device
  126. * @fbit: the feature bit
  127. */
  128. static inline bool virtio_has_feature(const struct virtio_device *vdev,
  129. unsigned int fbit)
  130. {
  131. /* Did you forget to fix assumptions on max features? */
  132. if (__builtin_constant_p(fbit))
  133. BUILD_BUG_ON(fbit >= 32);
  134. else
  135. BUG_ON(fbit >= 32);
  136. if (fbit < VIRTIO_TRANSPORT_F_START)
  137. virtio_check_driver_offered_feature(vdev, fbit);
  138. return test_bit(fbit, vdev->features);
  139. }
  140. /**
  141. * virtio_config_val - look for a feature and get a virtio config entry.
  142. * @vdev: the virtio device
  143. * @fbit: the feature bit
  144. * @offset: the type to search for.
  145. * @val: a pointer to the value to fill in.
  146. *
  147. * The return value is -ENOENT if the feature doesn't exist. Otherwise
  148. * the config value is copied into whatever is pointed to by v. */
  149. #define virtio_config_val(vdev, fbit, offset, v) \
  150. virtio_config_buf((vdev), (fbit), (offset), (v), sizeof(*v))
  151. #define virtio_config_val_len(vdev, fbit, offset, v, len) \
  152. virtio_config_buf((vdev), (fbit), (offset), (v), (len))
  153. static inline int virtio_config_buf(struct virtio_device *vdev,
  154. unsigned int fbit,
  155. unsigned int offset,
  156. void *buf, unsigned len)
  157. {
  158. if (!virtio_has_feature(vdev, fbit))
  159. return -ENOENT;
  160. vdev->config->get(vdev, offset, buf, len);
  161. return 0;
  162. }
  163. static inline
  164. struct virtqueue *virtio_find_single_vq(struct virtio_device *vdev,
  165. vq_callback_t *c, const char *n)
  166. {
  167. vq_callback_t *callbacks[] = { c };
  168. const char *names[] = { n };
  169. struct virtqueue *vq;
  170. int err = vdev->config->find_vqs(vdev, 1, &vq, callbacks, names);
  171. if (err < 0)
  172. return ERR_PTR(err);
  173. return vq;
  174. }
  175. static inline
  176. const char *virtio_bus_name(struct virtio_device *vdev)
  177. {
  178. if (!vdev->config->bus_name)
  179. return "virtio";
  180. return vdev->config->bus_name(vdev);
  181. }
  182. #endif /* __KERNEL__ */
  183. #endif /* _LINUX_VIRTIO_CONFIG_H */