xv6-simplified 0.1
简化版xv6
Loading...
Searching...
No Matches
virtio.h
Go to the documentation of this file.
1
11// virtio mmio控制寄存器,从0x10001000开始映射
12// 参考qemu的virtio_mmio.h
13#define VIRTIO_MMIO_MAGIC_VALUE 0x000 // Magic value ("virt" string) : 0x74726976
14#define VIRTIO_MMIO_VERSION 0x004 // version; should be 2
15#define VIRTIO_MMIO_DEVICE_ID 0x008 // device type; 1 is net, 2 is disk
16#define VIRTIO_MMIO_VENDOR_ID 0x00c // 0x554d4551
17#define VIRTIO_MMIO_DEVICE_FEATURES 0x010
18#define VIRTIO_MMIO_DRIVER_FEATURES 0x020
19// 写入该寄存器选择虚拟队列:QueueNumMax, QueueNum, QueueReady, QueueDescLow,
20// QueueDescHigh, QueueAvailLow, QueueAvailHigh, QueueUsedLow和
21// QueueUsedHigh, 第一个队列的索引为0x0,write-only
22#define VIRTIO_MMIO_QUEUE_SEL 0x030
23// 返回就绪设备队列的最大数目或0x0(队列不可用),适用于QUEUE_SEL选择的队列,read-only
24#define VIRTIO_MMIO_QUEUE_NUM_MAX 0x034
25// 返回队列中元素个数
26// 写入该寄存器用于通知驱动要用的队列长度,适用于QUEUE_SEL选择的队列,write-only
27#define VIRTIO_MMIO_QUEUE_NUM 0x038
28// 向该寄存器写入1以通知设备可以执行来自虚拟队列的请求。读取该寄存器将返回最后写入该寄存器的值
29// 适用于QUEUE_SEL选择的队列
30#define VIRTIO_MMIO_QUEUE_READY 0x044
31// 向该寄存器写入值通知队列有新缓冲区待处理
32// 未确认VIRTIO_F_NOTIFICATION_DATA时,写入的值为队列索引
33// 否则Notification数据格式如下:
34// le32 {
35// vqn : 16;
36// next_off : 15;
37// next_wrap : 1;
38// };
39// write-only
40#define VIRTIO_MMIO_QUEUE_NOTIFY 0x050
41// 中断状态
42// 返回导致设备中断被断言的事件的位掩码
43// 可能的中断被断言的情况:
44// 使用缓冲区通知-bit0-因为设备在至少一个活动虚拟队列中使用缓冲区
45// 配置更改通知-bit1-因为设备配置改变
46// read-only
47#define VIRTIO_MMIO_INTERRUPT_STATUS 0x060
48// 中断确认
49// 写入在INTERRUPT_STATUS中定义的位值到该寄存器
50// 以通知设备导致中断的事件已被处理
51// write-only
52#define VIRTIO_MMIO_INTERRUPT_ACK 0x064
53// 返回当前设备状态标志
54// 写入则设置设备状态标志
55// non-zero--指示驱动进度
56// 0--触发设备复位
57// read/write
58#define VIRTIO_MMIO_STATUS 0x070
59// 描述符表的物理地址
60// write-only
61#define VIRTIO_MMIO_QUEUE_DESC_LOW 0x080
62#define VIRTIO_MMIO_QUEUE_DESC_HIGH 0x084
63// 可用环的物理地址
64// write-only
65#define VIRTIO_MMIO_DRIVER_DESC_LOW 0x090
66#define VIRTIO_MMIO_DRIVER_DESC_HIGH 0x094
67// 已使用环的物理地址
68// write-only
69#define VIRTIO_MMIO_DEVICE_DESC_LOW 0x0a0
70#define VIRTIO_MMIO_DEVICE_DESC_HIGH 0x0a4
71
72// 状态寄存器的位
73// 参考qemu的virtio_config.h
74#define VIRTIO_CONFIG_S_ACKNOWLEDGE 1
75#define VIRTIO_CONFIG_S_DRIVER 2
76#define VIRTIO_CONFIG_S_DRIVER_OK 4
77#define VIRTIO_CONFIG_S_FEATURES_OK 8
78
79// 设备特性位
80#define VIRTIO_BLK_F_RO 5 /* Disk is read-only */
81#define VIRTIO_BLK_F_SCSI 7 /* Supports scsi command passthru */
82#define VIRTIO_BLK_F_CONFIG_WCE 11 /* Writeback mode available in config */
83#define VIRTIO_BLK_F_MQ 12 /* support more than one vq */
84#define VIRTIO_F_ANY_LAYOUT 27
85#define VIRTIO_RING_F_INDIRECT_DESC 28
86#define VIRTIO_RING_F_EVENT_IDX 29
87
88// virtio描述符的数量必须为双数
89#define NUM 8
90
91// 单个虚拟队列描述符,参考规范
92// 驱动程序为设备使用的缓冲区
93struct virtq_desc {
94 uint64 addr; // 物理地址
95 uint32 len; // 缓冲区长度
96 uint16 flags; // 缓冲区的标志
97 uint16 next; // 缓冲区间连接符,当flags & NEXT非零时有效
98};
99#define VRING_DESC_F_NEXT 1 // 是否与另一个缓冲区连接
100#define VRING_DESC_F_WRITE 2 // 设备只写(若flags在该位不置位则设备只读)
101
102// 完整的空闲/可使用环,参考规范
103// 驱动程序使用available ring为设备提供缓冲区
104// 每个ring项都指向描述符链的头部
105// 只由驱动程序写入,由设备读取
107 uint16 flags; // always zero
108 uint16 idx; // 下一个ring项的索引。驱动程序将把下一个描述符项放在环中的位置(对队列大小取模)。从0开始
109 uint16 ring[NUM]; // 数组的每一项都是某一个描述符链的头部数字
111};
112
113// one entry in the "used" ring, with which the
114// device tells the driver about completed requests.
115// used ring中的一项
117 uint32 id; // 描述符链的头部索引数字
118 uint32 len; // 缓冲区长度
119};
120
121// 设备在使用完缓冲区后返回缓冲区的地方
122// 它只被设备写入,由驱动程序读取。
124 uint16 flags; // always zero
125 uint16 idx; // 下一个ring项的索引
127};
128
129// these are specific to virtio block devices, e.g. disks,
130// described in Section 5.2 of the spec.
131
132#define VIRTIO_BLK_T_IN 0 // read the disk
133#define VIRTIO_BLK_T_OUT 1 // write the disk
134
135// 驱动程序将请求排队到virtqueue,由设备处理
136// 请求格式:
138 uint32 type; // 有两种类型:VIRTIO_BLK_T_IN or ..._OUT
140 uint64 sector; // 起始偏移量(以512字节为单位)
141};
Definition virtio.h:137
uint64 sector
Definition virtio.h:140
uint32 reserved
Definition virtio.h:139
uint32 type
Definition virtio.h:138
Definition virtio.h:106
uint16 unused
Definition virtio.h:110
uint16 ring[NUM]
Definition virtio.h:109
uint16 idx
Definition virtio.h:108
uint16 flags
Definition virtio.h:107
Definition virtio.h:93
uint32 len
Definition virtio.h:95
uint64 addr
Definition virtio.h:94
uint16 flags
Definition virtio.h:96
uint16 next
Definition virtio.h:97
Definition virtio.h:116
uint32 id
Definition virtio.h:117
uint32 len
Definition virtio.h:118
Definition virtio.h:123
uint16 idx
Definition virtio.h:125
struct virtq_used_elem ring[NUM]
Definition virtio.h:126
uint16 flags
Definition virtio.h:124
unsigned short uint16
Definition types.h:20
unsigned int uint32
Definition types.h:22
unsigned long uint64
Definition types.h:24
#define NUM
Definition virtio.h:89