Loading...
.. SPDX-License-Identifier: GPL-2.0+

.. index::
   single: virtio (command)

virtio command
==============

Synopsis
--------

::

    virtio scan
    virtio info
    virtio list
    virtio device
    virtio part
    virtio read <addr> <blk#> <cnt>
    virtio write <addr> <blk#> <cnt>

Description
-----------

The *virtio* command is used to control a virtio block-device. It also provides
some more general features.

dev
    Device number fo select
addr
    memory address
blk#
    start block offset
cnt
    block count

virtio scan
~~~~~~~~~~~

This initiates a scan of the paravirtualized devices provided by QEMU. For each
QEMU device which U-Boot supports, a new device is bound, allowing it to be used
within U-Boot.

You can use *dm tree* to see all the devices.

virtio info
~~~~~~~~~~~

This lists the available block devices (only), including the name, type and
capacity.

virtio list
~~~~~~~~~~~

This shows a list of QEMU devices along with U-Boot each attached to each. Note
that QEMU devices that U-Boot doesn't support will not be assigned a driver.

virtio device
~~~~~~~~~~~~~

This selects a particular numbered device as the current one to be used for
virtio operations.

virtio part
~~~~~~~~~~~

This displays a list of the available partition on the selected device, or the
current one if the device is omitted.

virtio read
~~~~~~~~~~~

This reads raw data to memory address from a virtio block-device. Reading starts
at block number <blk#> (numbered from 0) and extends for <cnt> blocks. The
block size is typically 512 but you can change it in the QEMU configuration.
For example, to set the block size to 4K:

::
   qemu-system-x86_64
   -drive file=disk.img,if=none,id=drive0,format=raw \
   -device virtio-blk-pci,drive=drive0,id=virtio_disk0,logical_block_size=4096

virtio write
~~~~~~~~~~~~

This writes raw data to the virtio device from the given memory address. Writing
starts at block number <blk#> (numbered from 0) and extends for <cnt> blocks.

Examples
--------

For most of these examples, the following QEMU invocation was used with the
qemu-x86_64 build::

    qemu-system-x86_64 -bios u-boot.rom -nographic
       -drive if=virtio,file=root.img,format=raw,id=hd0
       -drive if=virtio,file=README,format=raw,id=hd1


This example shows scanning for devices and then listing them. You can see the
virtio device `virtio-pci.l#0` has a `virtio-blk#0` child. The 'No filesystem'
warning indicates that device 1 does not have a valid filesystem.

::

    => virtio scan
    => virtio info
    Device 0: 1af4 VirtIO Block Device
                Type: Hard Disk
                Capacity: 15360.0 MB = 15.0 GB (31457280 x 512)
    No filesystem (err -19)
    Device 1: 1af4 VirtIO Block Device
                Type: Hard Disk
                Capacity: 0.0 MB = 0.0 GB (171 x 512)
    => dm tree
    Class     Seq    Probed  Driver                Name
    -----------------------------------------------------------
    root          0  [ + ]   root_driver           root_driver
    qfw           0  [ + ]   qfw_pio               |-- qfw_pio
    bootdev       0  [   ]   qfw_bootdev           |   `-- qfw_pio.bootdev
    serial        0  [ + ]   ns16550_serial        |-- serial
    keyboard      0  [ + ]   i8042_kbd             |-- keyboard
    sysreset      0  [   ]   x86_reset             |-- reset
    rtc           0  [   ]   motorola_mc146818     |-- rtc
    timer         0  [ + ]   x86_tsc_timer         |-- tsc-timer
    sysinfo       0  [   ]   sysinfo_smbios        |-- smbios
    pci           0  [ + ]   pci_x86               |-- pci
    pch           0  [ + ]   intel-pch7            |   |-- pch@1,0
    pci_generi    0  [   ]   pci_generic_drv       |   |-- pci_0:0.0
    ide           0  [   ]   ide                   |   |-- ide
    pci_generi    1  [   ]   pci_generic_drv       |   |-- pci_0:1.3
    video         0  [ + ]   bochs_video           |   |-- bochs_video
    vidconsole    0  [ + ]   vidconsole_tt         |   |   `-- bochs_video.vidconsole_tt
    ethernet      0  [ + ]   eth_e1000             |   |-- e1000#0
    bootdev       1  [   ]   eth_bootdev           |   |   `-- e1000#0.bootdev
    virtio        0  [ + ]   virtio-pci.l          |   |-- virtio-pci.l#0
    blk           0  [ + ]   virtio-blk            |   |   |-- virtio-blk#0
    partition     0  [ + ]   blk_partition         |   |   |   |-- virtio-blk#0:1
    partition     1  [ + ]   blk_partition         |   |   |   `-- virtio-blk#0:2
    bootdev       2  [   ]   virtio_bootdev        |   |   `-- virtio-blk#0.bootdev
    virtio        1  [ + ]   virtio-pci.l          |   `-- virtio-pci.l#1
    blk           1  [   ]   virtio-blk            |       |-- virtio-blk#1
    bootdev       3  [   ]   virtio_bootdev        |       `-- virtio-blk#1.bootdev
    bootstd       0  [ + ]   bootstd_drv           |-- bootstd
    bootmeth      0  [   ]   bootmeth_extlinux     |   |-- extlinux
    bootmeth      1  [   ]   bootmeth_script       |   |-- script
    bootmeth      2  [   ]   bootmeth_efi_mgr      |   |-- efi_mgr
    bootmeth      3  [   ]   bootmeth_efi          |   |-- efi
    bootmeth      4  [   ]   bootmeth_cros         |   |-- cros
    bootmeth      5  [   ]   bootmeth_qfw          |   |-- qfw
    bootmeth      6  [   ]   bootmeth_pxe          |   |-- pxe
    bootmeth      7  [   ]   vbe_simple            |   `-- vbe_simple
    efi           0  [   ]   EFI block driver      |-- efi
    simple_bus    0  [   ]   cpu_bus               `-- cpus
    cpu           0  [   ]   cpu_qemu                  `-- cpu@0
    =>

This shows listing QEMU devices before and after scanning. Note that devices
which show '(none)' in the Driver column are not supported by U-Boot.

::

    => virtio list
    Name                  Type            Driver
    --------------------  --------------  ---------------
    virtio-pci.m#0         0: (unknown)   (none)
    virtio-pci.m#1         0: (unknown)   (none)
    virtio-pci.m#2         0: (unknown)   (none)
    virtio-pci.m#3         0: (unknown)   (none)
    virtio-pci.m#4         0: (unknown)   (none)
    virtio-pci.m#5         0: (unknown)   (none)
    virtio-pci.m#6         0: (unknown)   (none)
    virtio-pci.m#7         0: (unknown)   (none)
    virtio-pci.m#8         0: (unknown)   (none)
    virtio-pci.m#9         0: (unknown)   (none)
    virtio-pci.m#10        0: (unknown)   (none)
    => virtio scan
    => virtio list
    Name                  Type            Driver
    --------------------  --------------  ---------------
    virtio-pci.m#0         5: balloon     (none)
    virtio-pci.m#1         4: rng         (none)
    virtio-pci.m#2        12: input-host  (none)
    virtio-pci.m#3        12: input-host  (none)
    virtio-pci.m#4        13: vsock       (none)
    virtio-pci.m#5         3: serial      (none)
    virtio-pci.m#6         8: scsi        virtio-scsi#6
    virtio-pci.m#7         9: 9p          (none)
    virtio-pci.m#8        1a: fs          virtio-fs#8
    virtio-pci.m#9        10: gpu         (none)
    virtio-pci.m#10        1: net         virtio-net#a
    =>

This shows reading and displaying the partition table for device 0::

    => virtio part 0

    Partition Map for virtio device 0  --   Partition Type: EFI

    Part        Start LBA        End LBA                Name
            Attributes
            Type GUID
            Partition GUID
      1        0x00000800        0x00165fff        ""
            attrs:        0x0000000000000000
            type:        c12a7328-f81f-11d2-ba4b-00a0c93ec93b
                    (EFI System Partition)
            guid:        eccaac1c-b634-441b-a788-ab0f959111af
      2        0x00166000        0x01dff7ff        ""
            attrs:        0x0000000000000000
            type:        0fc63daf-8483-4772-8e79-3d69d8477de4
                    (linux)
            guid:        e71469a9-dba2-4f46-b959-75e732466bf8
    =>

This shows reading some data from device 1 (which is the README file)::

    => virtio dev 1

    Device 1: No filesystem (err -19)
    1af4 VirtIO Block Device
                Type: Hard Disk
                Capacity: 0.0 MB = 0.0 GB (171 x 512)
    ... is now current device
    => virtio read 1000 0 1

    virtio read: device 1 block # 0, count 1 ... 1 blocks read: OK
    => md 1000 20
    00001000: 50532023 4c2d5844 6e656369 492d6573  # SPDX-License-I
    00001010: 746e6564 65696669 47203a72 322d4c50  dentifier: GPL-2
    00001020: 0a2b302e 20230a23 20294328 79706f43  .0+.#.# (C) Copy
    00001030: 68676972 30322074 2d203030 31303220  right 2000 - 201
    00001040: 20230a33 666c6f57 676e6167 6e654420  3.# Wolfgang Den
    00001050: 44202c6b 20584e45 74666f53 65726177  k, DENX Software
    00001060: 676e4520 65656e69 676e6972 6477202c   Engineering, wd
    00001070: 6e656440 65642e78 530a0a2e 616d6d75  @denx.de...Summa
    =>

This shows modifying some data and writing it back. If you try this it will
modify the first character of the README file in your U-Boot tree::

    => virtio dev 1

    Device 1: No filesystem (err -19)
    1af4 VirtIO Block Device
                Type: Hard Disk
                Capacity: 0.0 MB = 0.0 GB (171 x 512)
    ... is now current device
    => mw.b 1000 61
    => md 1000 10
    00001000: 50532061 4c2d5844 6e656369 492d6573  a SPDX-License-I
    00001010: 746e6564 65696669 47203a72 322d4c50  dentifier: GPL-2
    00001020: 0a2b302e 20230a23 20294328 79706f43  .0+.#.# (C) Copy
    00001030: 68676972 30322074 2d203030 31303220  right 2000 - 201
    => virtio write 1000 0 1

    virtio write: device 1 block # 0, count 1 ... 1 blocks written: OK
    =>


Configuration
-------------

The `virtio` command is only available if `CONFIG_CMD_VIRTIO=y`.