Project

General

Profile

Statistics
| Revision:

root / lab4 / .minix-src / include / minix / virtio.h @ 13

History | View | Annotate | Download (4.31 KB)

1
/*
2
 * Generic virtio library for MINIX 3
3
 *
4
 * Copyright (c) 2013, A. Welzel, <arne.welzel@gmail.com>
5
 *
6
 * This software is released under the BSD license. See the LICENSE file
7
 * included in the main directory of this source distribution for the
8
 * license terms and conditions.
9
 */
10

    
11
#ifndef _MINIX_VIRTIO_H
12
#define _MINIX_VIRTIO_H 1
13

    
14
#include <sys/types.h>
15

    
16
#define VIRTIO_VENDOR_ID                        0x1AF4
17

    
18
#define VIRTIO_HOST_F_OFF                        0x0000
19
#define VIRTIO_GUEST_F_OFF                        0x0004
20
#define VIRTIO_QADDR_OFF                        0x0008
21

    
22
#define VIRTIO_QSIZE_OFF                        0x000C
23
#define VIRTIO_QSEL_OFF                                0x000E
24
#define VIRTIO_QNOTFIY_OFF                        0x0010
25

    
26
#define VIRTIO_DEV_STATUS_OFF                        0x0012
27
#define VIRTIO_ISR_STATUS_OFF                        0x0013
28
#define VIRTIO_DEV_SPECIFIC_OFF                        0x0014
29
/* if msi is enabled, device specific headers shift by 4 */
30
#define VIRTIO_MSI_ADD_OFF                        0x0004
31
#define VIRTIO_STATUS_ACK                        0x01
32
#define VIRTIO_STATUS_DRV                        0x02
33
#define VIRTIO_STATUS_DRV_OK                        0x04
34
#define VIRTIO_STATUS_FAIL                        0x80
35

    
36

    
37
/* Feature description */
38
struct virtio_feature {
39
        const char *name;
40
        u8_t bit;
41
        u8_t host_support;
42
        u8_t guest_support;
43
};
44

    
45
/* Forward declaration of struct virtio_device.
46
 *
47
 * This structure is opaque to the caller.
48
 */
49
struct virtio_device;
50

    
51
/* Find a virtio device with subdevice id subdevid. Returns a pointer
52
 * to an opaque virtio_device instance.
53
 */
54
struct virtio_device *virtio_setup_device(u16_t subdevid,
55
                const char *name,
56
                struct virtio_feature *features,
57
                int feature_count,
58
                int threads, int skip);
59

    
60
/* Attempt to allocate queue_cnt memory for queues */
61
int virtio_alloc_queues(struct virtio_device *dev, int num_queues);
62

    
63
/* Register the IRQ policy and indicate to the host we are ready to go */
64
void virtio_device_ready(struct virtio_device *dev);
65

    
66
/* Unregister the IRQ and reset the device */
67
void virtio_reset_device(struct virtio_device *dev);
68

    
69
/* Free the memory used by all queues */
70
void virtio_free_queues(struct virtio_device *dev);
71

    
72
/* Free all memory allocated for the device (except the queue memory,
73
 * which has to be freed before with virtio_free_queues()).
74
 *
75
 * Don't touch the device afterwards! This is like free(dev).
76
 */
77
void virtio_free_device(struct virtio_device *dev);
78

    
79

    
80
/* Feature helpers */
81
int virtio_guest_supports(struct virtio_device *dev, int bit);
82
int virtio_host_supports(struct virtio_device *dev, int bit);
83

    
84
/*
85
 * Use num vumap_phys elements and chain these as vring_desc elements
86
 * into the vring.
87
 *
88
 * Kick the queue if needed.
89
 *
90
 * data is opaque and returned by virtio_from_queue() when the host
91
 * processed the descriptor chain.
92
 *
93
 * Note: The last bit of vp_addr is used to flag whether an iovec is
94
 *         writable. This implies that only word aligned buffers can be
95
 *         used.
96
 */
97
int virtio_to_queue(struct virtio_device *dev, int qidx,
98
                        struct vumap_phys *bufs, size_t num, void *data);
99

    
100
/*
101
 * If the host used a chain of descriptors, return 0, set data as was given to
102
 * virtio_to_queue(), and if len is not NULL, set it to the resulting length.
103
 * If the host has not processed any element, return -1.
104
 */
105
int virtio_from_queue(struct virtio_device *dev, int qidx, void **data,
106
        size_t *len);
107

    
108
/* IRQ related functions */
109
void virtio_irq_enable(struct virtio_device *dev);
110
void virtio_irq_disable(struct virtio_device *dev);
111

    
112
/* Checks the ISR field of the device and returns true if
113
 * the interrupt was for this device.
114
 */
115
int virtio_had_irq(struct virtio_device *dev);
116

    
117

    
118
u32_t virtio_read32(struct virtio_device *dev, i32_t offset);
119
u16_t virtio_read16(struct virtio_device *dev, i32_t offset);
120
u8_t virtio_read8(struct virtio_device *dev, i32_t offset);
121
void virtio_write32(struct virtio_device *dev, i32_t offset, u32_t val);
122
void virtio_write16(struct virtio_device *dev, i32_t offset, u16_t val);
123
void virtio_write8(struct virtio_device *dev, i32_t offset, u8_t val);
124

    
125

    
126
/*
127
 * Device specific reads take MSI offset into account and all reads
128
 * are at offset 20.
129
 *
130
 * Something like:
131
 * read(off) --> readX(20 + (msi ? 4 : 0) + off)
132
 */
133
u32_t virtio_sread32(struct virtio_device *dev, i32_t offset);
134
u16_t virtio_sread16(struct virtio_device *dev, i32_t offset);
135
u8_t virtio_sread8(struct virtio_device *dev, i32_t offset);
136
void virtio_swrite32(struct virtio_device *dev, i32_t offset, u32_t val);
137
void virtio_swrite16(struct virtio_device *dev, i32_t offset, u16_t val);
138
void virtio_swrite8(struct virtio_device *dev, i32_t offset, u8_t val);
139

    
140
#endif /* _MINIX_VIRTIO_H */