1 /* SPDX-License-Identifier: GPL-2.0 */
2 #ifndef _LINUX_VIRTIO_CONFIG_H
3 #define _LINUX_VIRTIO_CONFIG_H
7 #include <linux/virtio.h>
8 #include <linux/virtio_byteorder.h>
9 #include <linux/compiler_types.h>
10 #include <uapi/linux/virtio_config.h>
14 struct virtio_shm_region
{
19 typedef void vq_callback_t(struct virtqueue
*);
22 * struct virtqueue_info - Info for a virtqueue passed to find_vqs().
23 * @name: virtqueue description. Used mainly for debugging, NULL for
24 * a virtqueue unused by the driver.
25 * @callback: A callback to invoke on a used buffer notification.
26 * NULL for a virtqueue that does not need a callback.
27 * @ctx: A flag to indicate to maintain an extra context per virtqueue.
29 struct virtqueue_info
{
31 vq_callback_t
*callback
;
36 * struct virtio_config_ops - operations for configuring a virtio device
37 * Note: Do not assume that a transport implements all of the operations
38 * getting/setting a value as a simple read/write! Generally speaking,
39 * any of @get/@set, @get_status/@set_status, or @get_features/
40 * @finalize_features are NOT safe to be called from an atomic
42 * @get: read the value of a configuration field
43 * vdev: the virtio_device
44 * offset: the offset of the configuration field
45 * buf: the buffer to write the field value into.
46 * len: the length of the buffer
47 * @set: write the value of a configuration field
48 * vdev: the virtio_device
49 * offset: the offset of the configuration field
50 * buf: the buffer to read the field value from.
51 * len: the length of the buffer
52 * @generation: config generation counter (optional)
53 * vdev: the virtio_device
54 * Returns the config generation counter
55 * @get_status: read the status byte
56 * vdev: the virtio_device
57 * Returns the status byte
58 * @set_status: write the status byte
59 * vdev: the virtio_device
60 * status: the new status byte
61 * @reset: reset the device
62 * vdev: the virtio device
63 * After this, status and feature negotiation must be done again
64 * Device must not be reset from its vq/config callbacks, or in
65 * parallel with being added/removed.
66 * @find_vqs: find virtqueues and instantiate them.
67 * vdev: the virtio_device
68 * nvqs: the number of virtqueues to find
69 * vqs: on success, includes new virtqueues
70 * vqs_info: array of virtqueue info structures
71 * Returns 0 on success or error status
72 * @del_vqs: free virtqueues found by find_vqs().
73 * @synchronize_cbs: synchronize with the virtqueue callbacks (optional)
74 * The function guarantees that all memory operations on the
75 * queue before it are visible to the vring_interrupt() that is
77 * vdev: the virtio_device
78 * @get_features: get the array of feature bits for this device.
79 * vdev: the virtio_device
80 * Returns the first 64 feature bits (all we currently need).
81 * @finalize_features: confirm what device features we'll be using.
82 * vdev: the virtio_device
83 * This sends the driver feature bits to the device: it can change
84 * the dev->feature bits if it wants.
85 * Note that despite the name this can be called any number of
87 * Returns 0 on success or error status
88 * @bus_name: return the bus name associated with the device (optional)
89 * vdev: the virtio_device
90 * This returns a pointer to the bus name a la pci_name from which
91 * the caller can then copy.
92 * @set_vq_affinity: set the affinity for a virtqueue (optional).
93 * @get_vq_affinity: get the affinity for a virtqueue (optional).
94 * @get_shm_region: get a shared memory region based on the index.
95 * @disable_vq_and_reset: reset a queue individually (optional).
97 * Returns 0 on success or error status
98 * disable_vq_and_reset will guarantee that the callbacks are disabled and
100 * Except for the callback, the caller should guarantee that the vring is
101 * not accessed by any functions of virtqueue.
102 * @enable_vq_after_reset: enable a reset queue
104 * Returns 0 on success or error status
105 * If disable_vq_and_reset is set, then enable_vq_after_reset must also be
108 struct virtio_config_ops
{
109 void (*get
)(struct virtio_device
*vdev
, unsigned offset
,
110 void *buf
, unsigned len
);
111 void (*set
)(struct virtio_device
*vdev
, unsigned offset
,
112 const void *buf
, unsigned len
);
113 u32 (*generation
)(struct virtio_device
*vdev
);
114 u8 (*get_status
)(struct virtio_device
*vdev
);
115 void (*set_status
)(struct virtio_device
*vdev
, u8 status
);
116 void (*reset
)(struct virtio_device
*vdev
);
117 int (*find_vqs
)(struct virtio_device
*vdev
, unsigned int nvqs
,
118 struct virtqueue
*vqs
[],
119 struct virtqueue_info vqs_info
[],
120 struct irq_affinity
*desc
);
121 void (*del_vqs
)(struct virtio_device
*);
122 void (*synchronize_cbs
)(struct virtio_device
*);
123 u64 (*get_features
)(struct virtio_device
*vdev
);
124 int (*finalize_features
)(struct virtio_device
*vdev
);
125 const char *(*bus_name
)(struct virtio_device
*vdev
);
126 int (*set_vq_affinity
)(struct virtqueue
*vq
,
127 const struct cpumask
*cpu_mask
);
128 const struct cpumask
*(*get_vq_affinity
)(struct virtio_device
*vdev
,
130 bool (*get_shm_region
)(struct virtio_device
*vdev
,
131 struct virtio_shm_region
*region
, u8 id
);
132 int (*disable_vq_and_reset
)(struct virtqueue
*vq
);
133 int (*enable_vq_after_reset
)(struct virtqueue
*vq
);
136 /* If driver didn't advertise the feature, it will never appear. */
137 void virtio_check_driver_offered_feature(const struct virtio_device
*vdev
,
141 * __virtio_test_bit - helper to test feature bits. For use by transports.
142 * Devices should normally use virtio_has_feature,
143 * which includes more checks.
145 * @fbit: the feature bit
147 static inline bool __virtio_test_bit(const struct virtio_device
*vdev
,
150 /* Did you forget to fix assumptions on max features? */
151 if (__builtin_constant_p(fbit
))
152 BUILD_BUG_ON(fbit
>= 64);
156 return vdev
->features
& BIT_ULL(fbit
);
160 * __virtio_set_bit - helper to set feature bits. For use by transports.
162 * @fbit: the feature bit
164 static inline void __virtio_set_bit(struct virtio_device
*vdev
,
167 /* Did you forget to fix assumptions on max features? */
168 if (__builtin_constant_p(fbit
))
169 BUILD_BUG_ON(fbit
>= 64);
173 vdev
->features
|= BIT_ULL(fbit
);
177 * __virtio_clear_bit - helper to clear feature bits. For use by transports.
179 * @fbit: the feature bit
181 static inline void __virtio_clear_bit(struct virtio_device
*vdev
,
184 /* Did you forget to fix assumptions on max features? */
185 if (__builtin_constant_p(fbit
))
186 BUILD_BUG_ON(fbit
>= 64);
190 vdev
->features
&= ~BIT_ULL(fbit
);
194 * virtio_has_feature - helper to determine if this device has this feature.
196 * @fbit: the feature bit
198 static inline bool virtio_has_feature(const struct virtio_device
*vdev
,
201 if (fbit
< VIRTIO_TRANSPORT_F_START
)
202 virtio_check_driver_offered_feature(vdev
, fbit
);
204 return __virtio_test_bit(vdev
, fbit
);
208 * virtio_has_dma_quirk - determine whether this device has the DMA quirk
211 static inline bool virtio_has_dma_quirk(const struct virtio_device
*vdev
)
214 * Note the reverse polarity of the quirk feature (compared to most
215 * other features), this is for compatibility with legacy systems.
217 return !virtio_has_feature(vdev
, VIRTIO_F_ACCESS_PLATFORM
);
221 int virtio_find_vqs(struct virtio_device
*vdev
, unsigned int nvqs
,
222 struct virtqueue
*vqs
[],
223 struct virtqueue_info vqs_info
[],
224 struct irq_affinity
*desc
)
226 return vdev
->config
->find_vqs(vdev
, nvqs
, vqs
, vqs_info
, desc
);
230 struct virtqueue
*virtio_find_single_vq(struct virtio_device
*vdev
,
231 vq_callback_t
*c
, const char *n
)
233 struct virtqueue_info vqs_info
[] = {
236 struct virtqueue
*vq
;
237 int err
= virtio_find_vqs(vdev
, 1, &vq
, vqs_info
, NULL
);
245 * virtio_synchronize_cbs - synchronize with virtqueue callbacks
246 * @dev: the virtio device
249 void virtio_synchronize_cbs(struct virtio_device
*dev
)
251 if (dev
->config
->synchronize_cbs
) {
252 dev
->config
->synchronize_cbs(dev
);
255 * A best effort fallback to synchronize with
256 * interrupts, preemption and softirq disabled
257 * regions. See comment above synchronize_rcu().
264 * virtio_device_ready - enable vq use in probe function
265 * @dev: the virtio device
267 * Driver must call this to use vqs in the probe function.
269 * Note: vqs are enabled automatically after probe returns.
272 void virtio_device_ready(struct virtio_device
*dev
)
274 unsigned status
= dev
->config
->get_status(dev
);
276 WARN_ON(status
& VIRTIO_CONFIG_S_DRIVER_OK
);
278 #ifdef CONFIG_VIRTIO_HARDEN_NOTIFICATION
280 * The virtio_synchronize_cbs() makes sure vring_interrupt()
281 * will see the driver specific setup if it sees vq->broken
282 * as false (even if the notifications come before DRIVER_OK).
284 virtio_synchronize_cbs(dev
);
285 __virtio_unbreak_device(dev
);
288 * The transport should ensure the visibility of vq->broken
289 * before setting DRIVER_OK. See the comments for the transport
290 * specific set_status() method.
292 * A well behaved device will only notify a virtqueue after
293 * DRIVER_OK, this means the device should "see" the coherenct
294 * memory write that set vq->broken as false which is done by
295 * the driver when it sees DRIVER_OK, then the following
296 * driver's vring_interrupt() will see vq->broken as false so
297 * we won't lose any notification.
299 dev
->config
->set_status(dev
, status
| VIRTIO_CONFIG_S_DRIVER_OK
);
303 const char *virtio_bus_name(struct virtio_device
*vdev
)
305 if (!vdev
->config
->bus_name
)
307 return vdev
->config
->bus_name(vdev
);
311 * virtqueue_set_affinity - setting affinity for a virtqueue
313 * @cpu_mask: the cpu mask
315 * Pay attention the function are best-effort: the affinity hint may not be set
316 * due to config support, irq type and sharing.
320 int virtqueue_set_affinity(struct virtqueue
*vq
, const struct cpumask
*cpu_mask
)
322 struct virtio_device
*vdev
= vq
->vdev
;
323 if (vdev
->config
->set_vq_affinity
)
324 return vdev
->config
->set_vq_affinity(vq
, cpu_mask
);
329 bool virtio_get_shm_region(struct virtio_device
*vdev
,
330 struct virtio_shm_region
*region
, u8 id
)
332 if (!vdev
->config
->get_shm_region
)
334 return vdev
->config
->get_shm_region(vdev
, region
, id
);
337 static inline bool virtio_is_little_endian(struct virtio_device
*vdev
)
339 return virtio_has_feature(vdev
, VIRTIO_F_VERSION_1
) ||
340 virtio_legacy_is_little_endian();
343 /* Memory accessors */
344 static inline u16
virtio16_to_cpu(struct virtio_device
*vdev
, __virtio16 val
)
346 return __virtio16_to_cpu(virtio_is_little_endian(vdev
), val
);
349 static inline __virtio16
cpu_to_virtio16(struct virtio_device
*vdev
, u16 val
)
351 return __cpu_to_virtio16(virtio_is_little_endian(vdev
), val
);
354 static inline u32
virtio32_to_cpu(struct virtio_device
*vdev
, __virtio32 val
)
356 return __virtio32_to_cpu(virtio_is_little_endian(vdev
), val
);
359 static inline __virtio32
cpu_to_virtio32(struct virtio_device
*vdev
, u32 val
)
361 return __cpu_to_virtio32(virtio_is_little_endian(vdev
), val
);
364 static inline u64
virtio64_to_cpu(struct virtio_device
*vdev
, __virtio64 val
)
366 return __virtio64_to_cpu(virtio_is_little_endian(vdev
), val
);
369 static inline __virtio64
cpu_to_virtio64(struct virtio_device
*vdev
, u64 val
)
371 return __cpu_to_virtio64(virtio_is_little_endian(vdev
), val
);
374 #define virtio_to_cpu(vdev, x) \
377 __virtio16: virtio16_to_cpu((vdev), (x)), \
378 __virtio32: virtio32_to_cpu((vdev), (x)), \
379 __virtio64: virtio64_to_cpu((vdev), (x)) \
382 #define cpu_to_virtio(vdev, x, m) \
385 __virtio16: cpu_to_virtio16((vdev), (x)), \
386 __virtio32: cpu_to_virtio32((vdev), (x)), \
387 __virtio64: cpu_to_virtio64((vdev), (x)) \
390 #define __virtio_native_type(structname, member) \
391 typeof(virtio_to_cpu(NULL, ((structname*)0)->member))
393 /* Config space accessors. */
394 #define virtio_cread(vdev, structname, member, ptr) \
396 typeof(((structname*)0)->member) virtio_cread_v; \
399 /* Sanity check: must match the member's type */ \
400 typecheck(typeof(virtio_to_cpu((vdev), virtio_cread_v)), *(ptr)); \
402 switch (sizeof(virtio_cread_v)) { \
406 vdev->config->get((vdev), \
407 offsetof(structname, member), \
409 sizeof(virtio_cread_v)); \
412 __virtio_cread_many((vdev), \
413 offsetof(structname, member), \
416 sizeof(virtio_cread_v)); \
419 *(ptr) = virtio_to_cpu(vdev, virtio_cread_v); \
422 /* Config space accessors. */
423 #define virtio_cwrite(vdev, structname, member, ptr) \
425 typeof(((structname*)0)->member) virtio_cwrite_v = \
426 cpu_to_virtio(vdev, *(ptr), ((structname*)0)->member); \
429 /* Sanity check: must match the member's type */ \
430 typecheck(typeof(virtio_to_cpu((vdev), virtio_cwrite_v)), *(ptr)); \
432 vdev->config->set((vdev), offsetof(structname, member), \
434 sizeof(virtio_cwrite_v)); \
438 * Nothing virtio-specific about these, but let's worry about generalizing
441 #define virtio_le_to_cpu(x) \
444 __le16: (u16)le16_to_cpu(x), \
445 __le32: (u32)le32_to_cpu(x), \
446 __le64: (u64)le64_to_cpu(x) \
449 #define virtio_cpu_to_le(x, m) \
452 __le16: cpu_to_le16(x), \
453 __le32: cpu_to_le32(x), \
454 __le64: cpu_to_le64(x) \
457 /* LE (e.g. modern) Config space accessors. */
458 #define virtio_cread_le(vdev, structname, member, ptr) \
460 typeof(((structname*)0)->member) virtio_cread_v; \
463 /* Sanity check: must match the member's type */ \
464 typecheck(typeof(virtio_le_to_cpu(virtio_cread_v)), *(ptr)); \
466 switch (sizeof(virtio_cread_v)) { \
470 vdev->config->get((vdev), \
471 offsetof(structname, member), \
473 sizeof(virtio_cread_v)); \
476 __virtio_cread_many((vdev), \
477 offsetof(structname, member), \
480 sizeof(virtio_cread_v)); \
483 *(ptr) = virtio_le_to_cpu(virtio_cread_v); \
486 #define virtio_cwrite_le(vdev, structname, member, ptr) \
488 typeof(((structname*)0)->member) virtio_cwrite_v = \
489 virtio_cpu_to_le(*(ptr), ((structname*)0)->member); \
492 /* Sanity check: must match the member's type */ \
493 typecheck(typeof(virtio_le_to_cpu(virtio_cwrite_v)), *(ptr)); \
495 vdev->config->set((vdev), offsetof(structname, member), \
497 sizeof(virtio_cwrite_v)); \
501 /* Read @count fields, @bytes each. */
502 static inline void __virtio_cread_many(struct virtio_device
*vdev
,
504 void *buf
, size_t count
, size_t bytes
)
506 u32 old
, gen
= vdev
->config
->generation
?
507 vdev
->config
->generation(vdev
) : 0;
514 for (i
= 0; i
< count
; i
++)
515 vdev
->config
->get(vdev
, offset
+ bytes
* i
,
516 buf
+ i
* bytes
, bytes
);
518 gen
= vdev
->config
->generation
?
519 vdev
->config
->generation(vdev
) : 0;
520 } while (gen
!= old
);
523 static inline void virtio_cread_bytes(struct virtio_device
*vdev
,
525 void *buf
, size_t len
)
527 __virtio_cread_many(vdev
, offset
, buf
, len
, 1);
530 static inline u8
virtio_cread8(struct virtio_device
*vdev
, unsigned int offset
)
535 vdev
->config
->get(vdev
, offset
, &ret
, sizeof(ret
));
539 static inline void virtio_cwrite8(struct virtio_device
*vdev
,
540 unsigned int offset
, u8 val
)
543 vdev
->config
->set(vdev
, offset
, &val
, sizeof(val
));
546 static inline u16
virtio_cread16(struct virtio_device
*vdev
,
552 vdev
->config
->get(vdev
, offset
, &ret
, sizeof(ret
));
553 return virtio16_to_cpu(vdev
, ret
);
556 static inline void virtio_cwrite16(struct virtio_device
*vdev
,
557 unsigned int offset
, u16 val
)
562 v
= cpu_to_virtio16(vdev
, val
);
563 vdev
->config
->set(vdev
, offset
, &v
, sizeof(v
));
566 static inline u32
virtio_cread32(struct virtio_device
*vdev
,
572 vdev
->config
->get(vdev
, offset
, &ret
, sizeof(ret
));
573 return virtio32_to_cpu(vdev
, ret
);
576 static inline void virtio_cwrite32(struct virtio_device
*vdev
,
577 unsigned int offset
, u32 val
)
582 v
= cpu_to_virtio32(vdev
, val
);
583 vdev
->config
->set(vdev
, offset
, &v
, sizeof(v
));
586 static inline u64
virtio_cread64(struct virtio_device
*vdev
,
591 __virtio_cread_many(vdev
, offset
, &ret
, 1, sizeof(ret
));
592 return virtio64_to_cpu(vdev
, ret
);
595 static inline void virtio_cwrite64(struct virtio_device
*vdev
,
596 unsigned int offset
, u64 val
)
601 v
= cpu_to_virtio64(vdev
, val
);
602 vdev
->config
->set(vdev
, offset
, &v
, sizeof(v
));
605 /* Conditional config space accessors. */
606 #define virtio_cread_feature(vdev, fbit, structname, member, ptr) \
609 if (!virtio_has_feature(vdev, fbit)) \
612 virtio_cread((vdev), structname, member, ptr); \
616 /* Conditional config space accessors. */
617 #define virtio_cread_le_feature(vdev, fbit, structname, member, ptr) \
620 if (!virtio_has_feature(vdev, fbit)) \
623 virtio_cread_le((vdev), structname, member, ptr); \
627 #endif /* _LINUX_VIRTIO_CONFIG_H */