Linux Kernel  3.7.1
 All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Macros Groups Pages
virtio_config.h
Go to the documentation of this file.
1 #ifndef _LINUX_VIRTIO_CONFIG_H
2 #define _LINUX_VIRTIO_CONFIG_H
3 
4 #include <linux/err.h>
5 #include <linux/bug.h>
6 #include <linux/virtio.h>
8 
55 typedef void vq_callback_t(struct virtqueue *);
57  void (*get)(struct virtio_device *vdev, unsigned offset,
58  void *buf, unsigned len);
59  void (*set)(struct virtio_device *vdev, unsigned offset,
60  const void *buf, unsigned len);
61  u8 (*get_status)(struct virtio_device *vdev);
62  void (*set_status)(struct virtio_device *vdev, u8 status);
63  void (*reset)(struct virtio_device *vdev);
64  int (*find_vqs)(struct virtio_device *, unsigned nvqs,
65  struct virtqueue *vqs[],
66  vq_callback_t *callbacks[],
67  const char *names[]);
68  void (*del_vqs)(struct virtio_device *);
69  u32 (*get_features)(struct virtio_device *vdev);
71  const char *(*bus_name)(struct virtio_device *vdev);
72  int (*set_vq_affinity)(struct virtqueue *vq, int cpu);
73 };
74 
75 /* If driver didn't advertise the feature, it will never appear. */
77  unsigned int fbit);
78 
84 static inline bool virtio_has_feature(const struct virtio_device *vdev,
85  unsigned int fbit)
86 {
87  /* Did you forget to fix assumptions on max features? */
88  if (__builtin_constant_p(fbit))
89  BUILD_BUG_ON(fbit >= 32);
90  else
91  BUG_ON(fbit >= 32);
92 
93  if (fbit < VIRTIO_TRANSPORT_F_START)
95 
96  return test_bit(fbit, vdev->features);
97 }
98 
108 #define virtio_config_val(vdev, fbit, offset, v) \
109  virtio_config_buf((vdev), (fbit), (offset), (v), sizeof(*v))
110 
111 #define virtio_config_val_len(vdev, fbit, offset, v, len) \
112  virtio_config_buf((vdev), (fbit), (offset), (v), (len))
113 
114 static inline int virtio_config_buf(struct virtio_device *vdev,
115  unsigned int fbit,
116  unsigned int offset,
117  void *buf, unsigned len)
118 {
119  if (!virtio_has_feature(vdev, fbit))
120  return -ENOENT;
121 
122  vdev->config->get(vdev, offset, buf, len);
123  return 0;
124 }
125 
126 static inline
127 struct virtqueue *virtio_find_single_vq(struct virtio_device *vdev,
128  vq_callback_t *c, const char *n)
129 {
130  vq_callback_t *callbacks[] = { c };
131  const char *names[] = { n };
132  struct virtqueue *vq;
133  int err = vdev->config->find_vqs(vdev, 1, &vq, callbacks, names);
134  if (err < 0)
135  return ERR_PTR(err);
136  return vq;
137 }
138 
139 static inline
140 const char *virtio_bus_name(struct virtio_device *vdev)
141 {
142  if (!vdev->config->bus_name)
143  return "virtio";
144  return vdev->config->bus_name(vdev);
145 }
146 
156 static inline
157 int virtqueue_set_affinity(struct virtqueue *vq, int cpu)
158 {
159  struct virtio_device *vdev = vq->vdev;
160  if (vdev->config->set_vq_affinity)
161  return vdev->config->set_vq_affinity(vq, cpu);
162  return 0;
163 }
164 
165 
166 #endif /* _LINUX_VIRTIO_CONFIG_H */