All of lore.kernel.org
 help / color / mirror / Atom feed
From: "Marc Marí" <markmb@redhat.com>
To: qemu-devel@nongnu.org
Cc: Drew <drjones@redhat.com>, "Stefan Hajnoczi" <stefanha@gmail.com>,
	"Kevin O'Connor" <kevin@koconnor.net>,
	"Gerd Hoffmann" <kraxel@redhat.com>,
	"Marc Marí" <markmb@redhat.com>, Laszlo <lersek@redhat.com>
Subject: [Qemu-devel] [PATCH v3 2/5] fw_cfg DMA interface documentation
Date: Fri, 18 Sep 2015 10:58:46 +0200	[thread overview]
Message-ID: <1442566729-5133-3-git-send-email-markmb@redhat.com> (raw)
In-Reply-To: <1442566729-5133-1-git-send-email-markmb@redhat.com>

Add fw_cfg DMA interface specification in the documentation.

Based on Gerd Hoffman's initial implementation.

Signed-off-by: Marc Marí <markmb@redhat.com>
---
 docs/specs/fw_cfg.txt | 65 +++++++++++++++++++++++++++++++++++++++++++++++----
 1 file changed, 61 insertions(+), 4 deletions(-)

diff --git a/docs/specs/fw_cfg.txt b/docs/specs/fw_cfg.txt
index 5bc7b96..d5f9ddd 100644
--- a/docs/specs/fw_cfg.txt
+++ b/docs/specs/fw_cfg.txt
@@ -76,6 +76,13 @@ increasing address order, similar to memcpy().
 
 Selector Register IOport: 0x510
 Data Register IOport:     0x511
+DMA Address IOport:       0x514
+
+=== ARM Register Locations ===
+
+Selector Register address: Base + 8 (2 bytes)
+Data Register address:     Base + 0 (8 bytes)
+DMA Address address:       Base + 16 (8 bytes)
 
 == Firmware Configuration Items ==
 
@@ -86,11 +93,12 @@ 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".
 
-=== Revision (Key 0x0001, FW_CFG_ID) ===
+=== Revision / feature bitmap (Key 0x0001, FW_CFG_ID) ===
 
-A 32-bit little-endian unsigned int, this item is used as an interface
-revision number, and is currently set to 1 by QEMU when fw_cfg is
-initialized.
+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) ===
 
@@ -132,6 +140,55 @@ Selector Reg.    Range Usage
 In practice, the number of allowed firmware configuration items is given
 by the value of FW_CFG_MAX_ENTRY (see fw_cfg.h).
 
+= 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 lower half 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
+higher part.
+
+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.
+
+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 2 set (and not bit 1), a skip operation will be
+performed. The offset for the current selector will be advanced "length" bytes.
+
+To check 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).
+
 = Host-side API =
 
 The following functions are available to the QEMU programmer for adding
-- 
2.4.3

  parent reply	other threads:[~2015-09-18  8:59 UTC|newest]

Thread overview: 36+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2015-09-18  8:58 QEMU fw_cfg DMA interface Marc Marí
2015-09-18  8:58 ` [Qemu-devel] " Marc Marí
2015-09-18  8:58 ` Marc Marí
2015-09-18  8:58 ` [Qemu-devel] [PATCH v3 0/5] " Marc Marí
2015-09-18  8:58   ` [Qemu-devel] [PATCH v3 1/5] fw_cfg: document fw_cfg_modify_iXX() update functions Marc Marí
2015-09-18  8:58   ` Marc Marí [this message]
2015-09-18 15:15     ` [Qemu-devel] [PATCH v3 2/5] fw_cfg DMA interface documentation Peter Maydell
2015-09-18  8:58   ` [Qemu-devel] [PATCH v3 3/5] Implement fw_cfg DMA interface Marc Marí
2015-09-18 15:31     ` Peter Maydell
2015-09-18 18:29     ` Kevin O'Connor
2015-09-18  8:58   ` [Qemu-devel] [PATCH v3 4/5] Enable fw_cfg DMA interface for ARM Marc Marí
2015-09-18 15:15     ` Peter Maydell
2015-09-18 19:33     ` Laszlo Ersek
2015-09-18 20:16     ` Laszlo Ersek
2015-09-18 20:24       ` Marc Marí
2015-09-18 23:10         ` Laszlo Ersek
2015-09-19 13:09           ` Marc Marí
2015-10-22 21:22           ` Gabriel L. Somlo
2015-10-26 10:48             ` Stefan Hajnoczi
2015-10-26 12:49               ` Gabriel L. Somlo
2015-10-26 13:38                 ` Laszlo Ersek
2015-10-26 14:21                   ` Gabriel L. Somlo
2015-10-27 11:11                   ` Gerd Hoffmann
2015-10-27 12:43                     ` Laszlo Ersek
2015-10-28  1:12                       ` Gabriel L. Somlo
2015-10-28 10:42                         ` Laszlo Ersek
2015-09-18  8:58   ` [Qemu-devel] [PATCH v3 5/5] Enable fw_cfg DMA interface for x86 Marc Marí
2015-09-18 10:58     ` Gerd Hoffmann
2015-09-18 15:12       ` Peter Maydell
2015-09-18 18:25   ` [Qemu-devel] [PATCH v3 0/5] fw_cfg DMA interface Kevin O'Connor
2015-09-18 19:14     ` Marc Marí
2015-09-18 22:47     ` Peter Maydell
2015-09-18 23:43       ` Kevin O'Connor
2015-09-19  9:48         ` Peter Maydell
2015-09-19 15:15           ` Kevin O'Connor
2015-09-18  8:59 ` [PATCH v3] QEMU fw_cfg DMA interface documentation Marc Marí

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=1442566729-5133-3-git-send-email-markmb@redhat.com \
    --to=markmb@redhat.com \
    --cc=drjones@redhat.com \
    --cc=kevin@koconnor.net \
    --cc=kraxel@redhat.com \
    --cc=lersek@redhat.com \
    --cc=qemu-devel@nongnu.org \
    --cc=stefanha@gmail.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.