===========================================
QEMU Firmware Configuration (fw_cfg) Device
===========================================

Guest-side Hardware Interface
=============================

This hardware interface allows the guest to retrieve various data items
(blobs) that can influence how the firmware configures itself, or may
contain tables to be installed for the guest OS. Examples include device
boot order, ACPI and SMBIOS tables, virtual machine UUID, SMP and NUMA
information, kernel/initrd images for direct (Linux) kernel booting, etc.

Selector (Control) Register
---------------------------

* Write only
* Location: platform dependent (IOport or MMIO)
* Width: 16-bit
* Endianness: little-endian (if IOport), or big-endian (if MMIO)

A write to this register sets the index of a firmware configuration
item which can subsequently be accessed via the data register.

Setting the selector register will cause the data offset to be set
to zero. The data offset impacts which data is accessed via the data
register, and is explained below.

Bit14 of the selector register indicates whether the configuration
setting is being written. A value of 0 means the item is only being
read, and all write access to the data port will be ignored. A value
of 1 means the item's data can be overwritten by writes to the data
register. In other words, configuration write mode is enabled when
the selector value is between 0x4000-0x7fff or 0xc000-0xffff.

.. NOTE::
      As of QEMU v2.4, writes to the fw_cfg data register are no
      longer supported, and will be ignored (treated as no-ops)!

.. NOTE::
      As of QEMU v2.9, writes are reinstated, but only through the DMA
      interface (see below). Furthermore, writeability of any specific item is
      governed independently of Bit14 in the selector key value.

Bit15 of the selector register indicates whether the configuration
setting is architecture specific. A value of 0 means the item is a
generic configuration item. A value of 1 means the item is specific
to a particular architecture. In other words, generic configuration
items are accessed with a selector value between 0x0000-0x7fff, and
architecture specific configuration items are accessed with a selector
value between 0x8000-0xffff.

Data Register
-------------

* Read/Write (writes ignored as of QEMU v2.4, but see the DMA interface)
* Location: platform dependent (IOport [#]_ or MMIO)
* Width: 8-bit (if IOport), 8/16/32/64-bit (if MMIO)
* Endianness: string-preserving

.. [#]
    On platforms where the data register is exposed as an IOport, its
    port number will always be one greater than the port number of the
    selector register. In other words, the two ports overlap, and can not
    be mapped separately.

The data register allows access to an array of bytes for each firmware
configuration data item. The specific item is selected by writing to
the selector register, as described above.

Initially following a write to the selector register, the data offset
will be set to zero. Each successful access to the data register will
increment the data offset by the appropriate access width.

Each firmware configuration item has a maximum length of data
associated with the item. After the data offset has passed the
end of this maximum data length, then any reads will return a data
value of 0x00, and all writes will be ignored.

An N-byte wide read of the data register will return the next available
N bytes of the selected firmware configuration item, as a substring, in
increasing address order, similar to memcpy().

Register Locations
------------------

x86, x86_64
    * Selector Register IOport: 0x510
    * Data Register IOport:     0x511
    * DMA Address IOport:       0x514

Arm
    * Selector Register address: Base + 8 (2 bytes)
    * Data Register address:     Base + 0 (8 bytes)
    * DMA Address address:       Base + 16 (8 bytes)

ACPI Interface
--------------

The fw_cfg device is defined with ACPI ID ``QEMU0002``. Since we expect
ACPI tables to be passed into the guest through the fw_cfg device itself,
the guest-side firmware can not use ACPI to find fw_cfg. However, once the
firmware is finished setting up ACPI tables and hands control over to the
guest kernel, the latter can use the fw_cfg ACPI node for a more accurate
inventory of in-use IOport or MMIO regions.

Firmware Configuration Items
----------------------------

Signature (Key 0x0000, ``FW_CFG_SIGNATURE``)
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

The presence of the fw_cfg selector and data registers can be verified
by selecting the "signature" item using key 0x0000 (``FW_CFG_SIGNATURE``),
and reading four bytes from the data register. If the fw_cfg device is
present, the four bytes read will contain the characters ``QEMU``.

If the DMA interface is available, then reading the DMA Address
Register returns 0x51454d5520434647 (``QEMU CFG`` in big-endian format).

Revision / feature bitmap (Key 0x0001, ``FW_CFG_ID``)
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

A 32-bit little-endian unsigned int, this item is used to check for enabled
features.

- Bit 0: traditional interface. Always set.
- Bit 1: DMA interface.

File Directory (Key 0x0019, ``FW_CFG_FILE_DIR``)
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

.. highlight:: c

Firmware configuration items stored at selector keys 0x0020 or higher
(``FW_CFG_FILE_FIRST`` or higher) have an associated entry in a directory
structure, which makes it easier for guest-side firmware to identify
and retrieve them. The format of this file directory (from ``fw_cfg.h`` in
the QEMU source tree) is shown here, slightly annotated for clarity::

    struct FWCfgFiles {		/* the entire file directory fw_cfg item */
        uint32_t count;		/* number of entries, in big-endian format */
        struct FWCfgFile f[];	/* array of file entries, see below */
    };

    struct FWCfgFile {		/* an individual file entry, 64 bytes total */
        uint32_t size;		/* size of referenced fw_cfg item, big-endian */
        uint16_t select;	/* selector key of fw_cfg item, big-endian */
        uint16_t reserved;
        char name[56];		/* fw_cfg item name, NUL-terminated ascii */
    };

All Other Data Items
~~~~~~~~~~~~~~~~~~~~

Please consult the QEMU source for the most up-to-date and authoritative list
of selector keys and their respective items' purpose, format and writeability.

Ranges
~~~~~~

Theoretically, there may be up to 0x4000 generic firmware configuration
items, and up to 0x4000 architecturally specific ones.

===============  ===========
Selector Reg.    Range Usage
===============  ===========
0x0000 - 0x3fff  Generic (0x0000 - 0x3fff, generally RO, possibly RW through
                 the DMA interface in QEMU v2.9+)
0x4000 - 0x7fff  Generic (0x0000 - 0x3fff, RW, ignored in QEMU v2.4+)
0x8000 - 0xbfff  Arch. Specific (0x0000 - 0x3fff, generally RO, possibly RW
                 through the DMA interface in QEMU v2.9+)
0xc000 - 0xffff  Arch. Specific (0x0000 - 0x3fff, RW, ignored in v2.4+)
===============  ===========

In practice, the number of allowed firmware configuration items depends on the
machine type/version.

Guest-side DMA Interface
========================

If bit 1 of the feature bitmap is set, the DMA interface is present. This does
not replace the existing fw_cfg interface, it is an add-on. This interface
can be used through the 64-bit wide address register.

The address register is in big-endian format. The value for the register is 0
at startup and after an operation. A write to the least significant half (at
offset 4) triggers an operation. This means that operations with 32-bit
addresses can be triggered with just one write, whereas operations with
64-bit addresses can be triggered with one 64-bit write or two 32-bit writes,
starting with the most significant half (at offset 0).

In this register, the physical address of a ``FWCfgDmaAccess`` structure in RAM
should be written. This is the format of the ``FWCfgDmaAccess`` structure::

    typedef struct FWCfgDmaAccess {
        uint32_t control;
        uint32_t length;
        uint64_t address;
    } FWCfgDmaAccess;

The fields of the structure are in big endian mode, and the field at the lowest
address is the ``control`` field.

The ``control`` field has the following bits:

- Bit 0: Error
- Bit 1: Read
- Bit 2: Skip
- Bit 3: Select. The upper 16 bits are the selected index.
- Bit 4: Write

When an operation is triggered, if the ``control`` field has bit 3 set, the
upper 16 bits are interpreted as an index of a firmware configuration item.
This has the same effect as writing the selector register.

If the ``control`` field has bit 1 set, a read operation will be performed.
``length`` bytes for the current selector and offset will be copied into the
physical RAM address specified by the ``address`` field.

If the ``control`` field has bit 4 set (and not bit 1), a write operation will be
performed. ``length`` bytes will be copied from the physical RAM address
specified by the ``address`` field to the current selector and offset. QEMU
prevents starting or finishing the write beyond the end of the item associated
with the current selector (i.e., the item cannot be resized). Truncated writes
are dropped entirely. Writes to read-only items are also rejected. All of these
write errors set bit 0 (the error bit) in the ``control`` field.

If the ``control`` field has bit 2 set (and neither bit 1 nor bit 4), a skip
operation will be performed. The offset for the current selector will be
advanced ``length`` bytes.

To check the result, read the ``control`` field:

Error bit set
    Something went wrong.
All bits cleared
    Transfer finished successfully.
Otherwise
    Transfer still in progress
    (doesn't happen today due to implementation not being async,
    but may in the future).

Externally Provided Items
=========================

Since v2.4, "file" fw_cfg items (i.e., items with selector keys above
``FW_CFG_FILE_FIRST``, and with a corresponding entry in the fw_cfg file
directory structure) may be inserted via the QEMU command line, using
the following syntax::

    -fw_cfg [name=]<item_name>,file=<path>

Or::

    -fw_cfg [name=]<item_name>,string=<string>

Since v5.1, QEMU allows some objects to generate fw_cfg-specific content,
the content is then associated with a "file" item using the 'gen_id' option
in the command line, using the following syntax::

    -object <generator-type>,id=<generated_id>,[generator-specific-options] \
    -fw_cfg [name=]<item_name>,gen_id=<generated_id>

See QEMU man page for more documentation.

Using item_name with plain ASCII characters only is recommended.

Item names beginning with ``opt/`` are reserved for users.  QEMU will
never create entries with such names unless explicitly ordered by the
user.

To avoid clashes among different users, it is strongly recommended
that you use names beginning with ``opt/RFQDN/``, where RFQDN is a reverse
fully qualified domain name you control.  For instance, if SeaBIOS
wanted to define additional names, the prefix ``opt/org.seabios/`` would
be appropriate.

For historical reasons, ``opt/ovmf/`` is reserved for OVMF firmware.

Prefix ``opt/org.qemu/`` is reserved for QEMU itself.

Use of names not beginning with ``opt/`` is potentially dangerous and
entirely unsupported.  QEMU will warn if you try.

Use of names not beginning with ``opt/`` is tolerated with 'gen_id' (that
is, the warning is suppressed), but you must know exactly what you're
doing.

All externally provided fw_cfg items are read-only to the guest.
