virtio: add virtio framework in NuttX

1. virtio devics/drivers match and probe/remote mechanism;
2. virtio mmio transport layer based on OpenAmp (Compatible with both
   virtio mmio version 1 and 2);
3. virtio-serial driver based on new virtio framework;
4. virtio-rng driver based on new virtio framework;
5. virtio-net driver based on new virtio framework
   (IOB Offload implementation);
6. virtio-blk driver based on new virtio framework;
7. Remove the old virtio mmio framework, the old framework only
   support mmio transport layer, and the new framwork support
   more transport layer and this commit has implemented all the
   old virtio drivers;
8. Refresh the the qemu-arm64 and qemu-riscv virtio related
   configs, and update its README.txt;

New virtio-net driver has better performance
Compared with previous virtio-mmio-net:
|                        | master/-c | master/-s | this/-c | this/-s |
| :--------------------: | :-------: | :-------: | :-----: | :-----: |
| qemu-armv8a:netnsh     |  539Mbps  |  524Mbps  | 906Mbps | 715Mbps |
| qemu-armv8a:netnsh_smp |  401Mbps  |  437Mbps  | 583Mbps | 505Mbps |
| rv-virt:netnsh         |  487Mbps  |  512Mbps  | 760Mbps | 634Mbps |
| rv-virt:netnsh_smp     |  387Mbps  |  455Mbps  | 447Mbps | 502Mbps |
| rv-virt:netnsh64       |  602Mbps  |  595Mbps  | 881Mbps | 769Mbps |
| rv-virt:netnsh64_smp   |  414Mbps  |  515Mbps  | 491Mbps | 525Mbps |
| rv-virt:knetnsh64      |  515Mbps  |  457Mbps  | 606Mbps | 540Mbps |
| rv-virt:knetnsh64_smp  |  308Mbps  |  389Mbps  | 415Mbps | 474Mbps |
Note: Both CONFIG_IOB_NBUFFERS=64, using iperf command, all in Mbits/sec
      Tested in QEMU 7.2.2

Signed-off-by: wangbowen6 <wangbowen6@xiaomi.com>
Signed-off-by: Zhe Weng <wengzhe@xiaomi.com>
This commit is contained in:
wangbowen6
2023-03-22 11:49:43 +08:00
committed by Xiang Xiao
parent d010744582
commit 9aa57b6c53
34 changed files with 3646 additions and 2243 deletions
+46 -37
View File
@@ -5,50 +5,59 @@
menuconfig DRIVERS_VIRTIO
bool "Virtio Device Support"
depends on !OPENAMP
depends on OPENAMP
default n
if DRIVERS_VIRTIO
menuconfig DRIVERS_VIRTIO_MMIO_NUM
int "The number of virtio mmio devices"
default 1
config DRIVERS_VIRTIO_MMIO
bool "Virtio MMIO Device Support"
default n
if DRIVERS_VIRTIO_MMIO_NUM != 0
menuconfig DRIVERS_VIRTIO_MMIO_BASE
hex "Virtio-mmio base address"
menuconfig DRIVERS_VIRTIO_MMIO_REGSIZE
hex "Virtio-mmio register size"
config DRIVERS_VIRTIO_MMIO_QUEUE_LEN
int "Virtio MMIO Virtio Queue Length"
default 0
range 0 1024
depends on DRIVERS_VIRTIO_MMIO
---help---
If this value equals to 0, use the max queue length get from
mmio register.
menuconfig DRIVERS_VIRTIO_MMIO_IRQ
int "Virtio-mmio irq number"
endif
menuconfig DRIVERS_VIRTIO_NET
bool "Virtio network support"
default n
depends on DRIVERS_VIRTIO_MMIO_NUM > 0
select ARCH_HAVE_NETDEV_STATISTICS
if DRIVERS_VIRTIO_NET
config DRIVERS_VIRTIO_NET_QUEUE_LEN
int "Queue length"
default 16
endif
menuconfig DRIVERS_VIRTIO_BLK
config DRIVERS_VIRTIO_BLK
bool "Virtio block support"
depends on !DISABLE_MOUNTPOINT
default n
depends on DRIVERS_VIRTIO_MMIO_NUM > 0
endif
if DRIVERS_VIRTIO_BLK
config DRIVERS_VIRTIO_BLK_QUEUE_LEN
int "Queue length"
default 16
config DRIVERS_VIRTIO_NET
bool "Virtio network support"
depends on NETDEVICES
default n
select ARCH_HAVE_NETDEV_STATISTICS
select NETDEV_LATEINIT
config DRIVERS_VIRTIO_NET_BUFNUM
int "Virtio network driver buffer number"
default 0
depends on DRIVERS_VIRTIO_NET
---help---
The buffer number in each virtqueue. (We have 2 virtqueues.)
If this value equals to 0, use CONFIG_IOB_NBUFFERS / 4 for each.
Normally we get just a little improvement for >8 buffers, and very little for >32.
config DRIVERS_VIRTIO_RNG
bool "Virtio rng support"
default n
select ARCH_HAVE_RNG
config DRIVERS_VIRTIO_SERIAL
bool "Virtio serial support"
depends on SERIAL
default n
select SERIAL_RXDMA
select SERIAL_TXDMA
if DRIVERS_VIRTIO_SERIAL
config DRIVERS_VIRTIO_SERIAL_BUFSIZE
int "Virtio serial driver buffer size"
default 256
endif
endif # DRIVERS_VIRTIO