virtio_config.h 8.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217
  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. * @reset: reset the device
  72. * vdev: the virtio device
  73. * After this, status and feature negotiation must be done again
  74. * Device must not be reset from its vq/config callbacks, or in
  75. * parallel with being added/removed.
  76. * @find_vqs: find virtqueues and instantiate them.
  77. * vdev: the virtio_device
  78. * nvqs: the number of virtqueues to find
  79. * vqs: on success, includes new virtqueues
  80. * callbacks: array of callbacks, for each virtqueue
  81. * include a NULL entry for vqs that do not need a callback
  82. * names: array of virtqueue names (mainly for debugging)
  83. * include a NULL entry for vqs unused by driver
  84. * Returns 0 on success or error status
  85. * @del_vqs: free virtqueues found by find_vqs().
  86. * @get_features: get the array of feature bits for this device.
  87. * vdev: the virtio_device
  88. * Returns the first 32 feature bits (all we currently need).
  89. * @finalize_features: confirm what device features we'll be using.
  90. * vdev: the virtio_device
  91. * This gives the final feature bits for the device: it can change
  92. * the dev->feature bits if it wants.
  93. * @bus_name: return the bus name associated with the device
  94. * vdev: the virtio_device
  95. * This returns a pointer to the bus name a la pci_name from which
  96. * the caller can then copy.
  97. * @set_vq_affinity: set the affinity for a virtqueue.
  98. */
  99. typedef void vq_callback_t(struct virtqueue *);
  100. struct virtio_config_ops {
  101. void (*get)(struct virtio_device *vdev, unsigned offset,
  102. void *buf, unsigned len);
  103. void (*set)(struct virtio_device *vdev, unsigned offset,
  104. const void *buf, unsigned len);
  105. u8 (*get_status)(struct virtio_device *vdev);
  106. void (*set_status)(struct virtio_device *vdev, u8 status);
  107. void (*reset)(struct virtio_device *vdev);
  108. int (*find_vqs)(struct virtio_device *, unsigned nvqs,
  109. struct virtqueue *vqs[],
  110. vq_callback_t *callbacks[],
  111. const char *names[]);
  112. void (*del_vqs)(struct virtio_device *);
  113. u32 (*get_features)(struct virtio_device *vdev);
  114. void (*finalize_features)(struct virtio_device *vdev);
  115. const char *(*bus_name)(struct virtio_device *vdev);
  116. int (*set_vq_affinity)(struct virtqueue *vq, int cpu);
  117. };
  118. /* If driver didn't advertise the feature, it will never appear. */
  119. void virtio_check_driver_offered_feature(const struct virtio_device *vdev,
  120. unsigned int fbit);
  121. /**
  122. * virtio_has_feature - helper to determine if this device has this feature.
  123. * @vdev: the device
  124. * @fbit: the feature bit
  125. */
  126. static inline bool virtio_has_feature(const struct virtio_device *vdev,
  127. unsigned int fbit)
  128. {
  129. /* Did you forget to fix assumptions on max features? */
  130. if (__builtin_constant_p(fbit))
  131. BUILD_BUG_ON(fbit >= 32);
  132. else
  133. BUG_ON(fbit >= 32);
  134. if (fbit < VIRTIO_TRANSPORT_F_START)
  135. virtio_check_driver_offered_feature(vdev, fbit);
  136. return test_bit(fbit, vdev->features);
  137. }
  138. /**
  139. * virtio_config_val - look for a feature and get a virtio config entry.
  140. * @vdev: the virtio device
  141. * @fbit: the feature bit
  142. * @offset: the type to search for.
  143. * @v: a pointer to the value to fill in.
  144. *
  145. * The return value is -ENOENT if the feature doesn't exist. Otherwise
  146. * the config value is copied into whatever is pointed to by v. */
  147. #define virtio_config_val(vdev, fbit, offset, v) \
  148. virtio_config_buf((vdev), (fbit), (offset), (v), sizeof(*v))
  149. #define virtio_config_val_len(vdev, fbit, offset, v, len) \
  150. virtio_config_buf((vdev), (fbit), (offset), (v), (len))
  151. static inline int virtio_config_buf(struct virtio_device *vdev,
  152. unsigned int fbit,
  153. unsigned int offset,
  154. void *buf, unsigned len)
  155. {
  156. if (!virtio_has_feature(vdev, fbit))
  157. return -ENOENT;
  158. vdev->config->get(vdev, offset, buf, len);
  159. return 0;
  160. }
  161. static inline
  162. struct virtqueue *virtio_find_single_vq(struct virtio_device *vdev,
  163. vq_callback_t *c, const char *n)
  164. {
  165. vq_callback_t *callbacks[] = { c };
  166. const char *names[] = { n };
  167. struct virtqueue *vq;
  168. int err = vdev->config->find_vqs(vdev, 1, &vq, callbacks, names);
  169. if (err < 0)
  170. return ERR_PTR(err);
  171. return vq;
  172. }
  173. static inline
  174. const char *virtio_bus_name(struct virtio_device *vdev)
  175. {
  176. if (!vdev->config->bus_name)
  177. return "virtio";
  178. return vdev->config->bus_name(vdev);
  179. }
  180. /**
  181. * virtqueue_set_affinity - setting affinity for a virtqueue
  182. * @vq: the virtqueue
  183. * @cpu: the cpu no.
  184. *
  185. * Pay attention the function are best-effort: the affinity hint may not be set
  186. * due to config support, irq type and sharing.
  187. *
  188. */
  189. static inline
  190. int virtqueue_set_affinity(struct virtqueue *vq, int cpu)
  191. {
  192. struct virtio_device *vdev = vq->vdev;
  193. if (vdev->config->set_vq_affinity)
  194. return vdev->config->set_vq_affinity(vq, cpu);
  195. return 0;
  196. }
  197. #endif /* __KERNEL__ */
  198. #endif /* _LINUX_VIRTIO_CONFIG_H */