1/*	$NetBSD: virtioreg.h,v 1.13 2023/11/19 19:47:03 thorpej Exp $	*/
2
3/*
4 * Copyright (c) 2010 Minoura Makoto.
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, this list of conditions and the following disclaimer.
12 * 2. Redistributions in binary form must reproduce the above copyright
13 *    notice, this list of conditions and the following disclaimer in the
14 *    documentation and/or other materials provided with the distribution.
15 *
16 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
17 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
18 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
19 * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
20 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
21 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
22 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
23 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
24 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
25 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26 */
27
28/*
29 * Part of the file derived from `Virtio PCI Card Specification v0.8.6 DRAFT'
30 * Appendix A.
31 */
32/* An interface for efficient virtio implementation.
33 *
34 * This header is BSD licensed so anyone can use the definitions
35 * to implement compatible drivers/servers.
36 *
37 * Copyright 2007, 2009, IBM Corporation
38 * All rights reserved.
39 *
40 * Redistribution and use in source and binary forms, with or without
41 * modification, are permitted provided that the following conditions
42 * are met:
43 * 1. Redistributions of source code must retain the above copyright
44 *    notice, this list of conditions and the following disclaimer.
45 * 2. Redistributions in binary form must reproduce the above copyright
46 *    notice, this list of conditions and the following disclaimer in the
47 *    documentation and/or other materials provided with the distribution.
48 * 3. Neither the name of IBM nor the names of its contributors
49 *    may be used to endorse or promote products derived from this software
50 *    without specific prior written permission.
51 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS IS'' AND
52 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
53 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
54 * ARE DISCLAIMED.  IN NO EVENT SHALL IBM OR CONTRIBUTORS BE LIABLE
55 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
56 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
57 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
58 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
59 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
60 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
61 * SUCH DAMAGE.
62 */
63
64
65#ifndef _DEV_PCI_VIRTIOREG_H_
66#define	_DEV_PCI_VIRTIOREG_H_
67
68#include <sys/types.h>
69
70/* Virtio product id (all subsystems) */
71#define VIRTIO_DEVICE_ID_NETWORK	 1
72#define VIRTIO_DEVICE_ID_BLOCK		 2
73#define VIRTIO_DEVICE_ID_CONSOLE	 3
74#define VIRTIO_DEVICE_ID_ENTROPY	 4
75#define VIRTIO_DEVICE_ID_BALLOON	 5
76#define VIRTIO_DEVICE_ID_IOMEM		 6
77#define VIRTIO_DEVICE_ID_RPMSG		 7
78#define VIRTIO_DEVICE_ID_SCSI		 8
79#define VIRTIO_DEVICE_ID_9P		 9
80
81/* common device/guest features */
82#define  VIRTIO_F_NOTIFY_ON_EMPTY		__BIT(24)
83#define  VIRTIO_F_RING_INDIRECT_DESC		__BIT(28)
84#define  VIRTIO_F_RING_EVENT_IDX		__BIT(29)
85#define  VIRTIO_F_BAD_FEATURE			__BIT(30)
86#define  VIRTIO_F_VERSION_1			__BIT(32)
87#define  VIRTIO_F_ACCESS_PLATFORM		__BIT(33)
88#define  VIRTIO_F_RING_PACKED			__BIT(34)
89#define  VIRTIO_F_ORDER_PLATFORM		__BIT(36)
90#define  VIRTIO_F_SR_IOV			__BIT(37)
91
92/* common device status flags */
93#define  VIRTIO_CONFIG_DEVICE_STATUS_RESET		  0
94#define  VIRTIO_CONFIG_DEVICE_STATUS_ACK		  1
95#define  VIRTIO_CONFIG_DEVICE_STATUS_DRIVER		  2
96#define  VIRTIO_CONFIG_DEVICE_STATUS_DRIVER_OK		  4
97#define  VIRTIO_CONFIG_DEVICE_STATUS_FEATURES_OK	  8
98#define  VIRTIO_CONFIG_DEVICE_STATUS_DEVICE_NEEDS_RESET	 64
99#define  VIRTIO_CONFIG_DEVICE_STATUS_FAILED		128
100
101/* common ISR status flags */
102#define  VIRTIO_CONFIG_ISR_QUEUE_INTERRUPT	1
103#define  VIRTIO_CONFIG_ISR_CONFIG_CHANGE	2
104
105/* common device/guest features */
106#define VIRTIO_COMMON_FLAG_BITS			\
107        "\177\020"				\
108	"b\x24" "SR_IOV\0"			\
109	"b\x23" "ORDER_PLATFORM\0"		\
110	"b\x22" "RING_PACKED\0"			\
111	"b\x21" "ACCESS_PLATFORM\0"		\
112	"b\x20" "V1\0"				\
113	"b\x1e" "BAD_FEATURE\0"			\
114	"b\x1d" "EVENT_IDX\0"			\
115	"b\x1c" "INDIRECT_DESC\0"		\
116	"b\x18" "NOTIFY_ON_EMPTY\0"
117
118
119/*
120 * Virtqueue
121 */
122
123/* marks a buffer as continuing via the next field. */
124#define VRING_DESC_F_NEXT       1
125
126/* marks a buffer as write-only (otherwise read-only). */
127#define VRING_DESC_F_WRITE      2
128
129/* the buffer contains a list of buffer descriptors. */
130#define VRING_DESC_F_INDIRECT	4
131
132
133/*
134 * The Host uses this in used->flags to advise the Guest: don't kick me when
135 * you add a buffer.  It's unreliable, so it's simply an optimization.  Guest
136 * will still kick if it's out of buffers.
137 */
138#define VRING_USED_F_NO_NOTIFY  1
139
140/*
141 * The Guest uses this in avail->flags to advise the Host: don't interrupt me
142 * when you consume a buffer.  It's unreliable, so it's simply an
143 * optimization.
144 */
145#define VRING_AVAIL_F_NO_INTERRUPT      1
146
147
148/* Virtio ring descriptors: 16 bytes.
149 * These can chain together via "next". */
150struct vring_desc {
151        /* Address (guest-physical). */
152        uint64_t addr;
153        /* Length. */
154        uint32_t len;
155        /* The flags as indicated above. */
156        uint16_t flags;
157        /* We chain unused descriptors via this, too */
158        uint16_t next;
159} __packed;
160
161struct vring_avail {
162        uint16_t flags;
163        uint16_t idx;
164        uint16_t ring[];
165	/* trailed by uint16_t used_event when VIRTIO_F_RING_EVENT_IDX */
166} __packed;
167
168/* u32 is used here for ids for padding reasons. */
169struct vring_used_elem {
170        /* Index of start of used descriptor chain. */
171        uint32_t id;
172        /* Total length of the descriptor chain which was written to. */
173        uint32_t len;
174} __packed;
175
176struct vring_used {
177        uint16_t flags;
178        uint16_t idx;
179        struct vring_used_elem ring[];
180	/* trailed by uint16_t avail_event when VIRTIO_F_RING_EVENT_IDX */
181} __packed;
182
183/* The standard layout for the ring is a continuous chunk of memory which
184 * looks like this.  We assume num is a power of 2.
185 *
186 * struct vring {
187 *      // The actual descriptors (16 bytes each)
188 *      struct vring_desc desc[num];
189 *
190 *      // A ring of available descriptor heads with free-running index.
191 *      __u16 avail_flags;
192 *      __u16 avail_idx;
193 *      __u16 available[num];
194 *
195 *      // Padding to the next align boundary.
196 *      char pad[];
197 *
198 *      // A ring of used descriptor heads with free-running index.
199 *      __u16 used_flags;
200 *      __u16 used_idx;
201 *      struct vring_used_elem used[num];
202 * };
203 * Note: for virtio PCI, align is 4096.
204 */
205
206#define VIRTIO_PAGE_SIZE	(4096)
207
208#endif /* _DEV_PCI_VIRTIOREG_H_ */
209