virtio: replace _RESET status with _NEEDS_RESET
[processor-sdk/open-amp.git] / lib / include / openamp / virtio.h
1 /*-
2  * This header is BSD licensed so anyone can use the definitions to implement
3  * compatible drivers/servers.
4  *
5  * Redistribution and use in source and binary forms, with or without
6  * modification, are permitted provided that the following conditions
7  * are met:
8  * 1. Redistributions of source code must retain the above copyright
9  *    notice, this list of conditions and the following disclaimer.
10  * 2. Redistributions in binary form must reproduce the above copyright
11  *    notice, this list of conditions and the following disclaimer in the
12  *    documentation and/or other materials provided with the distribution.
13  * 3. Neither the name of IBM nor the names of its contributors
14  *    may be used to endorse or promote products derived from this software
15  *    without specific prior written permission.
16  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
17  * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
18  * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
19  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL IBM OR CONTRIBUTORS BE LIABLE
20  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
21  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
22  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
23  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
24  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
25  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
26  * SUCH DAMAGE.
27  *
28  * $FreeBSD$
29  */
31 #ifndef _VIRTIO_H_
32 #define _VIRTIO_H_
34 #include "openamp/virtqueue.h"
36 /* VirtIO device IDs. */
37 #define VIRTIO_ID_NETWORK    0x01
38 #define VIRTIO_ID_BLOCK      0x02
39 #define VIRTIO_ID_CONSOLE    0x03
40 #define VIRTIO_ID_ENTROPY    0x04
41 #define VIRTIO_ID_BALLOON    0x05
42 #define VIRTIO_ID_IOMEMORY   0x06
43 #define VIRTIO_ID_RPMSG          0x07   /* virtio remote remote_proc messaging */
44 #define VIRTIO_ID_SCSI       0x08
45 #define VIRTIO_ID_9P         0x09
47 /* Status byte for guest to report progress. */
48 #define VIRTIO_CONFIG_STATUS_ACK       0x01
49 #define VIRTIO_CONFIG_STATUS_DRIVER    0x02
50 #define VIRTIO_CONFIG_STATUS_DRIVER_OK 0x04
51 #define VIRTIO_CONFIG_STATUS_NEEDS_RESET 0x40
52 #define VIRTIO_CONFIG_STATUS_FAILED    0x80
54 /*
55  * Generate interrupt when the virtqueue ring is
56  * completely used, even if we've suppressed them.
57  */
58 #define VIRTIO_F_NOTIFY_ON_EMPTY (1 << 24)
60 /*
61  * The guest should never negotiate this feature; it
62  * is used to detect faulty drivers.
63  */
64 #define VIRTIO_F_BAD_FEATURE (1 << 30)
66 /*
67  * Some VirtIO feature bits (currently bits 28 through 31) are
68  * reserved for the transport being used (eg. virtio_ring), the
69  * rest are per-device feature bits.
70  */
71 #define VIRTIO_TRANSPORT_F_START      28
72 #define VIRTIO_TRANSPORT_F_END        32
74 typedef struct _virtio_dispatch_ virtio_dispatch;
76 struct virtio_feature_desc {
77         uint32_t vfd_val;
78         const char *vfd_str;
79 };
81 /*
82  * Structure definition for virtio devices for use by the
83  * applications/drivers
84  *
85  */
87 struct virtio_device {
88         /*
89          * Since there is no generic device structure so
90          * keep its type as void. The driver layer will take
91          * care of it.
92          */
93         void *device;
95         /* Device name */
96         char *name;
98         /* List of virtqueues encapsulated by virtio device. */
99         //TODO : Need to implement a list service for ipc stack.
100         void *vq_list;
102         /* Virtio device specific features */
103         uint32_t features;
105         /* Virtio dispatch table */
106         virtio_dispatch *func;
108         /*
109          * Pointer to hold some private data, useful
110          * in callbacks.
111          */
112         void *data;
113 };
115 /* 
116  * Helper functions.
117  */
118 const char *virtio_dev_name(uint16_t devid);
119 void virtio_describe(struct virtio_device *dev, const char *msg,
120                      uint32_t features,
121                      struct virtio_feature_desc *feature_desc);
123 /*
124  * Functions for virtio device configuration as defined in Rusty Russell's paper.
125  * Drivers are expected to implement these functions in their respective codes.
126  * 
127  */
129 struct _virtio_dispatch_ {
130         int (*create_virtqueues) (struct virtio_device * dev, int flags,
131                                   int nvqs, const char *names[],
132                                   vq_callback * callbacks[],
133                                   struct virtqueue * vqs[]);
134          uint8_t(*get_status) (struct virtio_device * dev);
135         void (*set_status) (struct virtio_device * dev, uint8_t status);
136          uint32_t(*get_features) (struct virtio_device * dev);
137         void (*set_features) (struct virtio_device * dev, uint32_t feature);
138          uint32_t(*negotiate_features) (struct virtio_device * dev,
139                                         uint32_t features);
141         /*
142          * Read/write a variable amount from the device specific (ie, network)
143          * configuration region. This region is encoded in the same endian as
144          * the guest.
145          */
146         void (*read_config) (struct virtio_device * dev, uint32_t offset,
147                              void *dst, int length);
148         void (*write_config) (struct virtio_device * dev, uint32_t offset,
149                               void *src, int length);
150         void (*reset_device) (struct virtio_device * dev);
152 };
154 #endif                          /* _VIRTIO_H_ */