2.6.10.1 Driver Requirements: Available Buffer Notification Suppression . . . . . . . 25
2.6.10.2 Device Requirements: Available Buffer Notification Suppression . . . . . . . 26
2.6.11 Helpers for Operating Virtqueues . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 26
2.6.12 Virtqueue Operation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 26
2.6.13 Supplying Buffers to The Device . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 26
2.6.13.1 Placing Buffers Into The Descriptor Table . . . . . . . . . . . . . . . . . . . . 27
2.6.13.2 Updating The Available Ring . . . . . . . . . . . . . . . . . . . . . . . . . . . 27
2.6.13.3 Updating idx . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27
2.6.13.3.1 Driver Requirements: Updating idx . . . . . . . . . . . . . . . . . . 28
2.6.13.4 Notifying The Device . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28
2.6.13.4.1 Driver Requirements: Notifying The Device . . . . . . . . . . . . . . 28
2.6.14 Receiving Used Buffers From The Device . . . . . . . . . . . . . . . . . . . . . . . . . 28
2.7 Packed Virtqueues . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28
2.7.1 Driver and Device Ring Wrap Counters . . . . . . . . . . . . . . . . . . . . . . . . . . 29
2.7.2 Polling of available and used descriptors . . . . . . . . . . . . . . . . . . . . . . . . . 30
2.7.3 Write Flag . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 30
2.7.4 Element Address and Length . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 30
2.7.5 Scatter-Gather Support . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 30
2.7.6 Next Flag: Descriptor Chaining . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31
2.7.7 Indirect Flag: Scatter-Gather Support . . . . . . . . . . . . . . . . . . . . . . . . . . . 31
2.7.8 In-order use of descriptors . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 32
2.7.9 Multi-buffer requests . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 32
2.7.10 Driver and Device Event Suppression . . . . . . . . . . . . . . . . . . . . . . . . . . . 32
2.7.10.1 Structure Size and Alignment . . . . . . . . . . . . . . . . . . . . . . . . . . . 33
2.7.11 Driver Requirements: Virtqueues . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 33
2.7.12 Device Requirements: Virtqueues . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 33
2.7.13 The Virtqueue Descriptor Format . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 33
2.7.14 Event Suppression Structure Format . . . . . . . . . . . . . . . . . . . . . . . . . . . . 33
2.7.15 Device Requirements: The Virtqueue Descriptor Table . . . . . . . . . . . . . . . . . . 34
2.7.16 Driver Requirements: The Virtqueue Descriptor Table . . . . . . . . . . . . . . . . . . 34
2.7.17 Driver Requirements: Scatter-Gather Support . . . . . . . . . . . . . . . . . . . . . . . 34
2.7.18 Device Requirements: Scatter-Gather Support . . . . . . . . . . . . . . . . . . . . . . 34
2.7.19 Driver Requirements: Indirect Descriptors . . . . . . . . . . . . . . . . . . . . . . . . . 34
2.7.20 Virtqueue Operation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 35
2.7.21 Supplying Buffers to The Device . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 35
2.7.21.1 Placing Available Buffers Into The Descriptor Ring . . . . . . . . . . . . . . . 35
2.7.21.1.1 Driver Requirements: Updating flags . . . . . . . . . . . . . . . . . 36
2.7.21.2 Sending Available Buffer Notifications . . . . . . . . . . . . . . . . . . . . . . 36
2.7.21.3 Implementation Example . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 36
2.7.21.3.1 Driver Requirements: Sending Available Buffer Notifications . . . . 37
2.7.22 Receiving Used Buffers From The Device . . . . . . . . . . . . . . . . . . . . . . . . . 37
2.7.23 Driver notifications . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 38
3 General Initialization And Device Operation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 39
3.1 Device Initialization . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 39
3.1.1 Driver Requirements: Device Initialization . . . . . . . . . . . . . . . . . . . . . . . . . 39
3.1.2 Legacy Interface: Device Initialization . . . . . . . . . . . . . . . . . . . . . . . . . . . 39
3.2 Device Operation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 40
3.2.1 Notification of Device Configuration Changes . . . . . . . . . . . . . . . . . . . . . . . 40
3.3 Device Cleanup . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 40
3.3.1 Driver Requirements: Device Cleanup . . . . . . . . . . . . . . . . . . . . . . . . . . . 40
4 Virtio Transport Options . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 41
4.1 Virtio Over PCI Bus . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 41
4.1.1 Device Requirements: Virtio Over PCI Bus . . . . . . . . . . . . . . . . . . . . . . . . 41
4.1.2 PCI Device Discovery . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 41
4.1.2.1 Device Requirements: PCI Device Discovery . . . . . . . . . . . . . . . . . . 41
virtio-v1.1-csprd01
Standards Track Work Product Copyright © OASIS Open 2018. All Rights Reserved.
20 December 2018
Page 5 of 158