Blame view

include/linux/virtio_config.h 3.99 KB
ec3d41c4d   Rusty Russell   Virtio interface
1
2
3
4
5
6
  #ifndef _LINUX_VIRTIO_CONFIG_H
  #define _LINUX_VIRTIO_CONFIG_H
  /* Virtio devices use a standardized configuration space to define their
   * features and pass configuration information, but each implementation can
   * store and access that space differently. */
  #include <linux/types.h>
a586d4f60   Rusty Russell   virtio: simplify ...
7
  /* Status byte for guest to report progress, and synchronize features. */
ec3d41c4d   Rusty Russell   Virtio interface
8
9
10
11
12
13
14
15
  /* We have seen device and processed generic fields (VIRTIO_CONFIG_F_VIRTIO) */
  #define VIRTIO_CONFIG_S_ACKNOWLEDGE	1
  /* We have found a driver for the device. */
  #define VIRTIO_CONFIG_S_DRIVER		2
  /* Driver has used its parts of the config, and is happy */
  #define VIRTIO_CONFIG_S_DRIVER_OK	4
  /* We've given up on this device. */
  #define VIRTIO_CONFIG_S_FAILED		0x80
ec3d41c4d   Rusty Russell   Virtio interface
16
17
18
19
20
  #ifdef __KERNEL__
  struct virtio_device;
  
  /**
   * virtio_config_ops - operations for configuring a virtio device
a586d4f60   Rusty Russell   virtio: simplify ...
21
   * @feature: search for a feature in this config
ec3d41c4d   Rusty Russell   Virtio interface
22
   *	vdev: the virtio_device
a586d4f60   Rusty Russell   virtio: simplify ...
23
24
25
26
   *	bit: the feature bit
   *	Returns true if the feature is supported.  Acknowledges the feature
   *	so the host can see it.
   * @get: read the value of a configuration field
ec3d41c4d   Rusty Russell   Virtio interface
27
   *	vdev: the virtio_device
a586d4f60   Rusty Russell   virtio: simplify ...
28
   *	offset: the offset of the configuration field
ec3d41c4d   Rusty Russell   Virtio interface
29
   *	buf: the buffer to write the field value into.
a586d4f60   Rusty Russell   virtio: simplify ...
30
   *	len: the length of the buffer
ec3d41c4d   Rusty Russell   Virtio interface
31
   *	Note that contents are conventionally little-endian.
a586d4f60   Rusty Russell   virtio: simplify ...
32
   * @set: write the value of a configuration field
ec3d41c4d   Rusty Russell   Virtio interface
33
   *	vdev: the virtio_device
a586d4f60   Rusty Russell   virtio: simplify ...
34
   *	offset: the offset of the configuration field
ec3d41c4d   Rusty Russell   Virtio interface
35
   *	buf: the buffer to read the field value from.
a586d4f60   Rusty Russell   virtio: simplify ...
36
   *	len: the length of the buffer
ec3d41c4d   Rusty Russell   Virtio interface
37
38
39
40
41
42
43
   *	Note that contents are conventionally little-endian.
   * @get_status: read the status byte
   *	vdev: the virtio_device
   *	Returns the status byte
   * @set_status: write the status byte
   *	vdev: the virtio_device
   *	status: the new status byte
6e5aa7efb   Rusty Russell   virtio: reset fun...
44
45
46
   * @reset: reset the device
   *	vdev: the virtio device
   *	After this, status and feature negotiation must be done again
a586d4f60   Rusty Russell   virtio: simplify ...
47
   * @find_vq: find a virtqueue and instantiate it.
ec3d41c4d   Rusty Russell   Virtio interface
48
   *	vdev: the virtio_device
a586d4f60   Rusty Russell   virtio: simplify ...
49
   *	index: the 0-based virtqueue number in case there's more than one.
ec3d41c4d   Rusty Russell   Virtio interface
50
   *	callback: the virqtueue callback
a586d4f60   Rusty Russell   virtio: simplify ...
51
   *	Returns the new virtqueue or ERR_PTR() (eg. -ENOENT).
ec3d41c4d   Rusty Russell   Virtio interface
52
53
54
55
   * @del_vq: free a virtqueue found by find_vq().
   */
  struct virtio_config_ops
  {
a586d4f60   Rusty Russell   virtio: simplify ...
56
57
  	bool (*feature)(struct virtio_device *vdev, unsigned bit);
  	void (*get)(struct virtio_device *vdev, unsigned offset,
ec3d41c4d   Rusty Russell   Virtio interface
58
  		    void *buf, unsigned len);
a586d4f60   Rusty Russell   virtio: simplify ...
59
  	void (*set)(struct virtio_device *vdev, unsigned offset,
ec3d41c4d   Rusty Russell   Virtio interface
60
61
62
  		    const void *buf, unsigned len);
  	u8 (*get_status)(struct virtio_device *vdev);
  	void (*set_status)(struct virtio_device *vdev, u8 status);
6e5aa7efb   Rusty Russell   virtio: reset fun...
63
  	void (*reset)(struct virtio_device *vdev);
ec3d41c4d   Rusty Russell   Virtio interface
64
  	struct virtqueue *(*find_vq)(struct virtio_device *vdev,
a586d4f60   Rusty Russell   virtio: simplify ...
65
  				     unsigned index,
18445c4d5   Rusty Russell   virtio: explicit ...
66
  				     void (*callback)(struct virtqueue *));
ec3d41c4d   Rusty Russell   Virtio interface
67
68
69
70
  	void (*del_vq)(struct virtqueue *vq);
  };
  
  /**
a586d4f60   Rusty Russell   virtio: simplify ...
71
72
73
74
   * virtio_config_val - look for a feature and get a single virtio config.
   * @vdev: the virtio device
   * @fbit: the feature bit
   * @offset: the type to search for.
ec3d41c4d   Rusty Russell   Virtio interface
75
76
   * @val: a pointer to the value to fill in.
   *
a586d4f60   Rusty Russell   virtio: simplify ...
77
78
79
80
81
82
83
84
85
   * The return value is -ENOENT if the feature doesn't exist.  Otherwise
   * the value is endian-corrected and returned in v. */
  #define virtio_config_val(vdev, fbit, offset, v) ({			\
  	int _err;							\
  	if ((vdev)->config->feature((vdev), (fbit))) {			\
  		__virtio_config_val((vdev), (offset), (v));		\
  		_err = 0;						\
  	} else								\
  		_err = -ENOENT;						\
ec3d41c4d   Rusty Russell   Virtio interface
86
87
  	_err;								\
  })
ec3d41c4d   Rusty Russell   Virtio interface
88
  /**
a586d4f60   Rusty Russell   virtio: simplify ...
89
90
91
92
   * __virtio_config_val - get a single virtio config without feature check.
   * @vdev: the virtio device
   * @offset: the type to search for.
   * @val: a pointer to the value to fill in.
ec3d41c4d   Rusty Russell   Virtio interface
93
   *
a586d4f60   Rusty Russell   virtio: simplify ...
94
95
96
97
98
99
100
101
102
103
104
   * The value is endian-corrected and returned in v. */
  #define __virtio_config_val(vdev, offset, v) do {			\
  	BUILD_BUG_ON(sizeof(*(v)) != 1 && sizeof(*(v)) != 2		\
  		     && sizeof(*(v)) != 4 && sizeof(*(v)) != 8);	\
  	(vdev)->config->get((vdev), (offset), (v), sizeof(*(v)));	\
  	switch (sizeof(*(v))) {						\
  	case 2: le16_to_cpus((__u16 *) v); break;			\
  	case 4: le32_to_cpus((__u32 *) v); break;			\
  	case 8: le64_to_cpus((__u64 *) v); break;			\
  	}								\
  } while(0)
ec3d41c4d   Rusty Russell   Virtio interface
105
106
  #endif /* __KERNEL__ */
  #endif /* _LINUX_VIRTIO_CONFIG_H */