[U-Boot] [PATCH v3 00/31] virtio: Introduce VirtIO driver support

Bin Meng bmeng.cn at gmail.com
Mon Oct 15 09:20:56 UTC 2018


This series brings in VirtIO driver support in U-Boot. The work is based
on Tuomas's virtio support on QEMU ARM targets.

VirtIO is a virtualization standard for network and disk device drivers
where just the guest's device driver "knows" it is running in a virtual
environment, and cooperates with the hypervisor. This enables guests to
get high performance network and disk operations, and gives most of the
performance benefits of paravirtualization. In the U-Boot case, the
guest is U-Boot itself, while the virtual environment are normally QEMU
targets like ARM, RISC-V and x86.

Both VirtIO MMIO and PCI transport options are supported. Only VirtIO
network and block device drivers are supported for now.

The following QEMU targets are supported.

  - qemu_arm_defconfig
  - qemu_arm64_defconfig
  - qemu-riscv32_defconfig
  - qemu-riscv64_defconfig
  - qemu-x86_defconfig
  - qemu-x86_64_defconfig

A new child_post_probe() uclass driver method is introduced to better
support virtio device driver. This also changes BLK uclass driver to
supply a post_probe() method which calls part_init(), so that we can
avoid duplicating such call in every BLK driver.

Not every checkpatch warning reported was fixed, but I tried to fix as
many as possible which makes sense. travis-ci build all pass.

This series is available at u-boot-x86/virtio-working for testing.

Changes in v3:
- Exclude VIRTIO_BLK in sandbox_noblk_defconfig build

Changes in v2:
- new patch to add test case for uclass driver's child_post_probe()
- new patch to add dm_remove_devices_flags() call to do_bootm_linux()
  for riscv bootm
- Added virtio spec link and a short statement of what virtio is
  in the header and source files
- Changed to use 'transport' over 'bus' in drivers/virtio/Kconfig
- Added UCLASS_VIRTIO ID in alphabetical order
- Moved the header file inclusion from virtio.h to C file
- Fixed code styling issue (blank line before return) in
  virtio_xxx() APIs
- Changed virtio_init() to return int if there is an error
- Added virtio_uclass_pre_probe() to check virtio transport driver
  ops here so that we don't need check these ops each time when
  the virtio_xxx APIs are called
- Implemented child_post_remove() method to reset the virtio device
- Changed virtio_driver_features_init() parameter 'feature' and
  'feature_legacy' to const, and adjust member of
  'struct virtio_dev_priv' accordingly
- Initialize uc_priv->vqs in virtio_uclass_post_probe()
- Changed virtio net driver feature table to const
- Correct desc->vendor for PCI transport
- imply VIRTIO_PCI for qemu-arm too
- use an internal function _dm_pci_find_next_capability() for
  dm_pci_find_capability() and dm_pci_find_next_capability()
- adjust swap_case driver to handle request from
  _dm_pci_find_next_capability()
- fix compiler warnings in 64-bit build
- adjust virtio_pci_find_capability() to avoid walking through capability
  list to find next one by ourselves
- new patch to add a Sandbox transport driver
- new patch to add test cases for virtio uclass
- Added driver remove and flags description in the documentation

Bin Meng (26):
  dm: core: Allow uclass to set up a device's child after it is probed
  test: dm: core: Add test case for uclass driver's child_post_probe()
  riscv: bootm: Add dm_remove_devices_flags() call to do_bootm_linux()
  dm: Add a new uclass driver for VirtIO transport devices
  virtio: Add virtio over mmio transport driver
  test: dm: blk: Correct blk_base test case
  sandbox: blk: Switch to use platdata_auto_alloc_size for the driver
    data
  efi_driver: blk: Switch to use platdata_auto_alloc_size for the driver
    data
  blk: Call part_init() in the post_probe() method
  blk: Drop blk_prepare_device()
  blk: Make blk_next_free_devnum() public
  riscv: qemu: Enumerate virtio bus during early boot
  riscv: qemu: Include some useful commands
  kconfig: Introduce HAVE_ARCH_IOMAP
  x86: Implement arch-specific io accessor routines
  virtio: Add virtio over pci transport driver
  arm: qemu: Add a Kconfig in the board directory
  arm: qemu: Enumerate virtio bus during early boot
  x86: qemu: Imply virtio PCI transport and device drivers
  dm: pci: Add APIs to find next capability and extended capability
  test: dm: pci: Add cases for finding next PCI capability APIs
  virtio: pci: Support non-legacy PCI transport device
  virtio: net: Support non-legacy device
  virtio: Add a Sandbox transport driver
  test: dm: virtio: Add test cases for virtio uclass
  doc: Document virtio support

Tuomas Tynkkynen (5):
  virtio: Add codes for virtual queue/ring management
  virtio: Add net driver support
  blk: Introduce IF_TYPE_VIRTIO
  virtio: Add block driver support
  virtio: cmd: Add virtio command for virtio devices

 arch/Kconfig                            |   6 +
 arch/arm/Kconfig                        |   1 +
 arch/riscv/lib/bootm.c                  |  11 +-
 arch/sandbox/dts/test.dts               |   8 +
 arch/x86/include/asm/io.h               |  66 +++
 board/emulation/qemu-arm/Kconfig        |  13 +
 board/emulation/qemu-arm/qemu-arm.c     |  10 +
 board/emulation/qemu-riscv/Kconfig      |  11 +
 board/emulation/qemu-riscv/qemu-riscv.c |   9 +
 board/emulation/qemu-x86/Kconfig        |   3 +
 cmd/Kconfig                             |   7 +
 cmd/Makefile                            |   1 +
 cmd/sata.c                              |   9 -
 cmd/virtio.c                            |  38 ++
 common/usb_storage.c                    |   4 +-
 configs/qemu_arm64_defconfig            |   1 -
 configs/qemu_arm_defconfig              |   1 -
 configs/sandbox_noblk_defconfig         |   1 +
 disk/part.c                             |   6 +
 doc/README.virtio                       | 253 ++++++++++++
 drivers/Kconfig                         |   2 +
 drivers/Makefile                        |   1 +
 drivers/block/blk-uclass.c              |  25 +-
 drivers/block/ide.c                     |   2 -
 drivers/block/sandbox.c                 |  17 +-
 drivers/core/uclass.c                   |  13 +-
 drivers/misc/swap_case.c                |   9 +
 drivers/mmc/mmc.c                       |   3 -
 drivers/nvme/nvme.c                     |   1 -
 drivers/pci/pci-uclass.c                |  51 ++-
 drivers/scsi/scsi.c                     |   1 -
 drivers/virtio/Kconfig                  |  62 +++
 drivers/virtio/Makefile                 |  11 +
 drivers/virtio/virtio-uclass.c          | 369 +++++++++++++++++
 drivers/virtio/virtio_blk.c             | 137 +++++++
 drivers/virtio/virtio_blk.h             | 129 ++++++
 drivers/virtio/virtio_mmio.c            | 413 +++++++++++++++++++
 drivers/virtio/virtio_mmio.h            | 129 ++++++
 drivers/virtio/virtio_net.c             | 239 +++++++++++
 drivers/virtio/virtio_net.h             | 268 ++++++++++++
 drivers/virtio/virtio_pci.h             | 173 ++++++++
 drivers/virtio/virtio_pci_legacy.c      | 421 +++++++++++++++++++
 drivers/virtio/virtio_pci_modern.c      | 609 +++++++++++++++++++++++++++
 drivers/virtio/virtio_ring.c            | 358 ++++++++++++++++
 drivers/virtio/virtio_sandbox.c         | 233 +++++++++++
 include/blk.h                           |  22 +-
 include/dm/test.h                       |   1 +
 include/dm/uclass-id.h                  |   1 +
 include/dm/uclass.h                     |   4 +-
 include/linux/io.h                      |   4 +
 include/pci.h                           |  48 +++
 include/virtio.h                        | 707 ++++++++++++++++++++++++++++++++
 include/virtio_ring.h                   | 320 +++++++++++++++
 include/virtio_types.h                  |  24 ++
 lib/Kconfig                             |   6 +
 lib/efi_driver/efi_block_device.c       |  26 +-
 test/dm/Makefile                        |   1 +
 test/dm/blk.c                           |  27 +-
 test/dm/bus.c                           |  45 ++
 test/dm/pci.c                           |  20 +
 test/dm/test-fdt.c                      |   7 +-
 test/dm/virtio.c                        | 122 ++++++
 62 files changed, 5421 insertions(+), 99 deletions(-)
 create mode 100644 board/emulation/qemu-arm/Kconfig
 create mode 100644 cmd/virtio.c
 create mode 100644 doc/README.virtio
 create mode 100644 drivers/virtio/Kconfig
 create mode 100644 drivers/virtio/Makefile
 create mode 100644 drivers/virtio/virtio-uclass.c
 create mode 100644 drivers/virtio/virtio_blk.c
 create mode 100644 drivers/virtio/virtio_blk.h
 create mode 100644 drivers/virtio/virtio_mmio.c
 create mode 100644 drivers/virtio/virtio_mmio.h
 create mode 100644 drivers/virtio/virtio_net.c
 create mode 100644 drivers/virtio/virtio_net.h
 create mode 100644 drivers/virtio/virtio_pci.h
 create mode 100644 drivers/virtio/virtio_pci_legacy.c
 create mode 100644 drivers/virtio/virtio_pci_modern.c
 create mode 100644 drivers/virtio/virtio_ring.c
 create mode 100644 drivers/virtio/virtio_sandbox.c
 create mode 100644 include/virtio.h
 create mode 100644 include/virtio_ring.h
 create mode 100644 include/virtio_types.h
 create mode 100644 test/dm/virtio.c

-- 
2.7.4



More information about the U-Boot mailing list