xref: /freebsd/sys/dev/virtio/virtio.h (revision edf7c8ddcecae93ced005144b6eeac14e08ade8e)
1 /*-
2  * SPDX-License-Identifier: BSD-2-Clause
3  *
4  * Copyright (c) 2014, Bryan Venteicher <bryanv@FreeBSD.org>
5  * All rights reserved.
6  *
7  * Redistribution and use in source and binary forms, with or without
8  * modification, are permitted provided that the following conditions
9  * are met:
10  * 1. Redistributions of source code must retain the above copyright
11  *    notice unmodified, this list of conditions, and the following
12  *    disclaimer.
13  * 2. Redistributions in binary form must reproduce the above copyright
14  *    notice, this list of conditions and the following disclaimer in the
15  *    documentation and/or other materials provided with the distribution.
16  *
17  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
18  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
19  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
20  * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
21  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
22  * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
23  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
24  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
25  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
26  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27  *
28  * $FreeBSD$
29  */
30 
31 #ifndef _VIRTIO_H_
32 #define _VIRTIO_H_
33 
34 #include <dev/virtio/virtio_endian.h>
35 #include <dev/virtio/virtio_ids.h>
36 #include <dev/virtio/virtio_config.h>
37 
38 struct sbuf;
39 struct vq_alloc_info;
40 
41 /*
42  * Each virtqueue indirect descriptor list must be physically contiguous.
43  * To allow us to malloc(9) each list individually, limit the number
44  * supported to what will fit in one page. With 4KB pages, this is a limit
45  * of 256 descriptors. If there is ever a need for more, we can switch to
46  * contigmalloc(9) for the larger allocations, similar to what
47  * bus_dmamem_alloc(9) does.
48  *
49  * Note the sizeof(struct vring_desc) is 16 bytes.
50  */
51 #define VIRTIO_MAX_INDIRECT ((int) (PAGE_SIZE / 16))
52 
53 /*
54  * VirtIO instance variables indices.
55  */
56 #define VIRTIO_IVAR_DEVTYPE		1
57 #define VIRTIO_IVAR_FEATURE_DESC	2
58 #define VIRTIO_IVAR_VENDOR		3
59 #define VIRTIO_IVAR_DEVICE		4
60 #define VIRTIO_IVAR_SUBVENDOR		5
61 #define VIRTIO_IVAR_SUBDEVICE		6
62 #define VIRTIO_IVAR_MODERN		7
63 
64 struct virtio_feature_desc {
65 	uint64_t	 vfd_val;
66 	const char	*vfd_str;
67 };
68 
69 struct virtio_pnp_match {
70 	uint32_t	 device_type;
71 	const char	*description;
72 };
73 #define VIRTIO_SIMPLE_PNPTABLE(driver, devtype, desc)			\
74 	static const struct virtio_pnp_match driver ## _match = {	\
75 		.device_type = devtype,					\
76 		.description = desc,					\
77 	}
78 #define VIRTIO_SIMPLE_PNPINFO(bus, driver)				\
79 	MODULE_PNP_INFO("U32:device_type;D:#", bus, driver,		\
80 	    &driver ## _match, 1)
81 #define VIRTIO_SIMPLE_PROBE(dev, driver)				\
82 	(virtio_simple_probe(dev, &driver ## _match))
83 
84 const char *virtio_device_name(uint16_t devid);
85 void	 virtio_describe(device_t dev, const char *msg,
86 	     uint64_t features, struct virtio_feature_desc *desc);
87 int	 virtio_describe_sbuf(struct sbuf *sb, uint64_t features,
88 	     struct virtio_feature_desc *desc);
89 uint64_t virtio_filter_transport_features(uint64_t features);
90 int	 virtio_bus_is_modern(device_t dev);
91 void	 virtio_read_device_config_array(device_t dev, bus_size_t offset,
92 	     void *dst, int size, int count);
93 
94 /*
95  * VirtIO Bus Methods.
96  */
97 void	 virtio_read_ivar(device_t dev, int ivar, uintptr_t *val);
98 void	 virtio_write_ivar(device_t dev, int ivar, uintptr_t val);
99 uint64_t virtio_negotiate_features(device_t dev, uint64_t child_features);
100 int	 virtio_finalize_features(device_t dev);
101 int	 virtio_alloc_virtqueues(device_t dev, int flags, int nvqs,
102 	     struct vq_alloc_info *info);
103 int	 virtio_setup_intr(device_t dev, enum intr_type type);
104 int	 virtio_with_feature(device_t dev, uint64_t feature);
105 void	 virtio_stop(device_t dev);
106 int	 virtio_config_generation(device_t dev);
107 int	 virtio_reinit(device_t dev, uint64_t features);
108 void	 virtio_reinit_complete(device_t dev);
109 int	 virtio_child_pnpinfo_str(device_t busdev, device_t child, char *buf,
110 	     size_t buflen);
111 
112 /*
113  * Read/write a variable amount from the device specific (ie, network)
114  * configuration region. This region is encoded in the same endian as
115  * the guest.
116  */
117 void	 virtio_read_device_config(device_t dev, bus_size_t offset,
118 	     void *dst, int length);
119 void	 virtio_write_device_config(device_t dev, bus_size_t offset,
120 	     void *src, int length);
121 
122 /* Inlined device specific read/write functions for common lengths. */
123 #define VIRTIO_RDWR_DEVICE_CONFIG(size, type)				\
124 static inline type							\
125 __CONCAT(virtio_read_dev_config_,size)(device_t dev,			\
126     bus_size_t offset)							\
127 {									\
128 	type val;							\
129 	virtio_read_device_config(dev, offset, &val, sizeof(type));	\
130 	return (val);							\
131 }									\
132 									\
133 static inline void							\
134 __CONCAT(virtio_write_dev_config_,size)(device_t dev,			\
135     bus_size_t offset, type val)					\
136 {									\
137 	virtio_write_device_config(dev, offset, &val, sizeof(type));	\
138 }
139 
140 VIRTIO_RDWR_DEVICE_CONFIG(1, uint8_t);
141 VIRTIO_RDWR_DEVICE_CONFIG(2, uint16_t);
142 VIRTIO_RDWR_DEVICE_CONFIG(4, uint32_t);
143 
144 #undef VIRTIO_RDWR_DEVICE_CONFIG
145 
146 #define VIRTIO_READ_IVAR(name, ivar)					\
147 static inline int							\
148 __CONCAT(virtio_get_,name)(device_t dev)				\
149 {									\
150 	uintptr_t val;							\
151 	virtio_read_ivar(dev, ivar, &val);				\
152 	return ((int) val);						\
153 }
154 
155 VIRTIO_READ_IVAR(device_type,	VIRTIO_IVAR_DEVTYPE);
156 VIRTIO_READ_IVAR(vendor,	VIRTIO_IVAR_VENDOR);
157 VIRTIO_READ_IVAR(device,	VIRTIO_IVAR_DEVICE);
158 VIRTIO_READ_IVAR(subvendor,	VIRTIO_IVAR_SUBVENDOR);
159 VIRTIO_READ_IVAR(subdevice,	VIRTIO_IVAR_SUBDEVICE);
160 VIRTIO_READ_IVAR(modern,	VIRTIO_IVAR_MODERN);
161 
162 #undef VIRTIO_READ_IVAR
163 
164 #define VIRTIO_WRITE_IVAR(name, ivar)					\
165 static inline void							\
166 __CONCAT(virtio_set_,name)(device_t dev, void *val)			\
167 {									\
168 	virtio_write_ivar(dev, ivar, (uintptr_t) val);			\
169 }
170 
171 VIRTIO_WRITE_IVAR(feature_desc,	VIRTIO_IVAR_FEATURE_DESC);
172 
173 #undef VIRTIO_WRITE_IVAR
174 
175 static inline int
176 virtio_simple_probe(device_t dev, const struct virtio_pnp_match *match)
177 {
178 
179 	if (virtio_get_device_type(dev) != match->device_type)
180 		return (ENXIO);
181 	device_set_desc(dev, match->description);
182 	return (BUS_PROBE_DEFAULT);
183 }
184 
185 #endif /* _VIRTIO_H_ */
186