Bugfixes Xeon Phi Driver startup - removed check for boot info - added initialization...
[barrelfish] / include / virtio / virtio_device.h
1 /*
2  * Copyright (c) 2014 ETH Zurich.
3  * All rights reserved.
4  *
5  * This file is distributed under the terms in the attached LICENSE file.
6  * If you do not find this file, copies can be found by writing to:
7  * ETH Zurich D-INFK, Universitaetsstrasse 6, CH-8092 Zurich. Attn: Systems Group.
8  */
9
10 #ifndef VIRTIO_VIRTIO_DEVICE_H
11 #define VIRTIO_VIRTIO_DEVICE_H
12
13
14 struct virtio_device;
15
16 /*
17  * 2.1 Device Status Field
18  */
19
20 /// The device is in the reset state (not discovered by the guest)
21 #define VIRTIO_DEVICE_STATUS_RESET       0x00
22
23 /// Guest OS has found the device and recognized it as a valid virtio device.
24 #define VIRTIO_DEVICE_STATUS_ACKNOWLEDGE 0x01
25
26 /// Guest OS knows how to drive the device i.e. recognized as valid virtio device.
27 #define VIRTIO_DEVICE_STATUS_DRIVER      0x02
28
29 /// Driver is set up and ready to drive the device.
30 #define VIRTIO_DEVICE_STATUS_DRIVER_OK   0x04
31
32 /// Driver has acknowledged all the features it understands
33 #define VIRTIO_DEVICE_STATUS_FEATURES_OK 0x08
34
35 /// Something went wrong in the guest, and it has given up on the device.
36 #define VIRTIO_DEVICE_STATUS_FAILED      0x80
37
38 /*
39  * 5.0 Device Types
40  * The following device IDs are used to identify different types of virtio
41  * devices. Some device IDs are reserved for devices which are not currently
42  * defined in this standard.
43  */
44
45 /// Invalid device identifier
46 #define VIRTIO_DEVICE_TYPE_INVALID   0x00
47
48 /// Device type for network interface cards
49 #define VIRTIO_DEVICE_TYPE_NET       0x01
50
51 /// Device type for block devices
52 #define VIRTIO_DEVICE_TYPE_BLOCK     0x02
53
54 /// Device type for console devices
55 #define VIRTIO_DEVICE_TYPE_CONSOLE   0x03
56
57 /// Device type for entorpy devices
58 #define VIRTIO_DEVICE_TYPE_ENTORPY   0x04
59
60 //#define VIRTIO_DEVICE_TYPE_LEGACY_BALLOON 5
61
62 /// Device type for IO memory devices
63 #define VIRTIO_DEVICE_TYPE_IOMEM     0x06
64
65 /// Device type for rpmgs devices
66 #define VIRTIO_DEVICE_TYPE_RPMSG     0x07
67
68 /// Device type for SCSI host devices
69 #define VIRTIO_DEVICE_TYPE_SCSIHOST  0x08
70
71 /// Device type for 9P transport devices
72 #define VIRTIO_DEVICE_TYPE_9PTRANSP  0x09
73
74 /// Device type for MAC 802.11 WLAn devices
75 #define VIRTIO_DEVICE_TYPE_WLAN      0x0A
76
77 /// Device type for RPROC serial devices
78 #define VIRTIO_DEVICE_TYPE_SERIAL    0x0B
79
80 /// Device type for virtio CAIF devices
81 #define VIRTIO_DEVICE_TYPE_CAIF      0x0C
82
83 /// Device type for memory ballooning devices
84 #define VIRTIO_DEVICE_TYPE_BALLOON   0x0D
85
86 /// Device type for GPU devices
87 #define VIRTIO_DEVICE_TYPE_GPU       0x0E
88
89 /// Device type for timer / clock devices
90 #define VIRTIO_DEVICE_TYPE_TIMER     0x0F
91
92 /**
93  * specifies the possible virtio backends to be used
94  */
95 enum virtio_device_backend {
96     VIRTIO_DEVICE_BACKEND_INVALID,
97     VIRTIO_DEVICE_BACKEND_PCI,
98     VIRTIO_DEVICE_BACKEND_MMIO,
99     VIRTIO_DEVICE_BACKEND_IO,
100 };
101
102 /*
103  * 4.1.2 PCI Device Discovery
104  *
105  * Any PCI device with Vendor ID 0x1AF4, and Device ID 0x1000 through 0x103F
106  * inclusive is a virtio device. The Subsystem Device ID indicates which virtio
107  * device is supported by the device.
108  */
109
110 #define VIRTIO_PCI_VENDOR_ID 0x1AF4
111 #define VIRTIO_PCI_DEVICE_ID 0x1000
112 #define VIRTIO_PCI_DEVICE_ID2 0x103F
113
114 #define VIRTIO_DEVICE_NAME_MAX 32
115
116 /**
117  * contains necessary values for the device initialization process
118  */
119 struct virtio_device_setup
120 {
121     uint8_t type;                           ///< expected type of the device
122     char name[VIRTIO_DEVICE_NAME_MAX];
123     enum virtio_device_backend  backend;    ///< which backend to use
124     void *dev_reg;
125     size_t dev_reg_size;
126     errval_t (*feature_negotiate)(struct virtio_device *dev);
127     errval_t (*device_setup)(struct virtio_device *dev);
128 };
129
130
131
132 /**
133  * \brief initializes a new VirtIO device based on the values passed with the
134  *        device init struct. The device registers have already to be mapped. *
135  *
136  * \param dev       device structure to initialize
137  * \param init      additional information passed for the init process
138  * \param dev_regs  memory location of the device registers
139  */
140 errval_t virtio_device_open(struct virtio_device **dev,
141                             struct virtio_device_setup *init);
142
143 /**
144  * \brief initializes a new VirtIO device based on the values passed with the
145  *        device init struct. The supplied cap contains the memory range of the
146  *        device registers.
147  *
148  * \param dev       device structure to initialize
149  * \param init      additional information passed for the init process
150  * \param dev_cap   capability representing the device registers
151  */
152 errval_t virtio_device_open_with_cap(struct virtio_device **dev,
153                                      struct virtio_device_setup *init,
154                                      struct capref dev_cap);
155
156 /**
157  * \brief   closes a virtio device.
158  *
159  * \param dev the device to be closed
160  *
161  * \returns SYS_ERR_OK on success
162  */
163 errval_t virtio_device_close(struct virtio_device *dev);
164
165 /**
166  * \brief resets the virtio device
167  *
168  * \param dev   the device to reset
169  *
170  * \returns SYS_ERR_OK on success
171  */
172 errval_t virtio_device_reset(struct virtio_device *dev);
173
174 /**
175  * \brief returns the status of a virtio device
176  *
177  * \param the device to query for status
178  * \param returned status
179  *
180  * \returns SYS_ERR_OK on success
181  */
182 errval_t virtio_device_get_status(struct virtio_device *dev,
183                                   uint8_t *ret_status);
184
185 /**
186  * \brief
187  *
188  * \param
189  */
190 errval_t virtio_device_set_status(struct virtio_device *dev,
191                                   uint8_t status);
192
193
194 errval_t virtio_device_feature_negotiate(struct virtio_device *dev);
195
196 errval_t virtio_device_specific_setup(struct virtio_device *dev);
197
198 bool     virtio_device_has_feature(struct virtio_device *dev,
199                                    uint8_t feature);
200
201 #endif // VIRTIO_VIRTIO_DEVICE_H