From: Andrew Jones <drjones@redhat.com>
To: Laszlo Ersek <lersek@redhat.com>
Cc: peter.maydell@linaro.org, ard.biesheuvel@linaro.org,
mst@redhat.com, edk2-devel@lists.sourceforge.net,
qemu-devel@nongnu.org, imammedo@redhat.com
Subject: Re: [Qemu-devel] [qemu PATCH 2/2] arm: add fw_cfg to "virt" board
Date: Fri, 28 Nov 2014 12:17:48 +0100 [thread overview]
Message-ID: <20141128111747.GC3013@hawk.usersys.redhat.com> (raw)
In-Reply-To: <5478534C.1020904@redhat.com>
On Fri, Nov 28, 2014 at 11:49:48AM +0100, Laszlo Ersek wrote:
> On 11/28/14 11:43, Laszlo Ersek wrote:
> > On 11/28/14 11:38, Andrew Jones wrote:
> >> On Fri, Nov 28, 2014 at 12:18:27AM +0100, Laszlo Ersek wrote:
> >>> fw_cfg already supports exposure over MMIO (used in ppc/mac_newworld.c,
> >>> ppc/mac_oldworld.c, sparc/sun4m.c); we can easily add it to the "virt"
> >>> board.
> >>>
> >>> The mmio register block of fw_cfg is advertized in the device tree. As
> >>> base address we pick 0x09020000, which conforms to the comment preceding
> >>> "a15memmap": it falls in the miscellaneous device I/O range 128MB..256MB,
> >>> and it is aligned at 64KB.
> >>>
> >>> fw_cfg automatically exports a number of files to the guest; for example,
> >>> "bootorder" (see fw_cfg_machine_reset()).
> >>>
> >>> Signed-off-by: Laszlo Ersek <lersek@redhat.com>
> >>> ---
> >>> hw/arm/virt.c | 21 +++++++++++++++++++++
> >>> 1 file changed, 21 insertions(+)
> >>>
> >>> diff --git a/hw/arm/virt.c b/hw/arm/virt.c
> >>> index 314e55b..070bd34 100644
> >>> --- a/hw/arm/virt.c
> >>> +++ b/hw/arm/virt.c
> >>> @@ -68,6 +68,7 @@ enum {
> >>> VIRT_UART,
> >>> VIRT_MMIO,
> >>> VIRT_RTC,
> >>> + VIRT_FW_CFG,
> >>> };
> >>>
> >>> typedef struct MemMapEntry {
> >>> @@ -107,6 +108,7 @@ static const MemMapEntry a15memmap[] = {
> >>> [VIRT_GIC_CPU] = { 0x08010000, 0x00010000 },
> >>> [VIRT_UART] = { 0x09000000, 0x00001000 },
> >>> [VIRT_RTC] = { 0x09010000, 0x00001000 },
> >>> + [VIRT_FW_CFG] = { 0x09020000, FW_CFG_SIZE + FW_CFG_DATA_SIZE },
> >>> [VIRT_MMIO] = { 0x0a000000, 0x00000200 },
> >>> /* ...repeating for a total of NUM_VIRTIO_TRANSPORTS, each of that size */
> >>> /* 0x10000000 .. 0x40000000 reserved for PCI */
> >>> @@ -519,6 +521,23 @@ static void create_flash(const VirtBoardInfo *vbi)
> >>> g_free(nodename);
> >>> }
> >>>
> >>> +static void create_fw_cfg(const VirtBoardInfo *vbi)
> >>> +{
> >>> + hwaddr base = vbi->memmap[VIRT_FW_CFG].base;
> >>> + char *nodename;
> >>> +
> >>> + fw_cfg_init(0, 0, base, base + FW_CFG_SIZE);
> >>> +
> >>> + nodename = g_strdup_printf("/fw-cfg@%" PRIx64, base);
> >>> + qemu_fdt_add_subnode(vbi->fdt, nodename);
> >>> + qemu_fdt_setprop_string(vbi->fdt, nodename,
> >>> + "compatible", "fw-cfg,mmio");
> >>> + qemu_fdt_setprop_sized_cells(vbi->fdt, nodename, "reg",
> >>> + 2, base, 2, FW_CFG_SIZE,
> >>> + 2, base + FW_CFG_SIZE, 2, FW_CFG_DATA_SIZE);
> >>
> >> Overkill suggestion alert, but how about defining something like
> >>
> >> #define FW_CFG_SIZE_ALIGNED \
> >> MIN(QEMU_ALIGN_UP(FW_CFG_SIZE, FW_CFG_DATA_SIZE), \
> >> QEMU_ALIGN_UP(FW_CFG_SIZE, 4))
> >>
> >> and then using that in your memmap size calculation and fw-cfg-data base
> >> address calculation. The only reason I suggest this is because it's hard
> >> to tell that fw-cfg-data's address will be naturally aligned without
> >> hunting down the definition of FW_CFG_DATA_SIZE. And, if it were to change
> >> (which it probably never will), then it may not be.
> >
> > Why does it need to be aligned?
> >
> > The selector register is aligned at a 64KB boundary (for independent,
> > strict reasons).
> >
> > The data register is not aligned at all, and -- AFAICS -- it need not
> > be, because it's 1 byte wide. (In fact the ARM-specific
> > Mmio(Read|Write)XX functions in edk2 enforce natural alignment, and the
> > above layout passes without problems.)
> >
> > The full register block is 3 bytes wide. Is that a problem?
>
> Hm, I think I get it now. If FW_CFG_DATA_SIZE were to increase, then its
> alignment would have to increase as well, and whatever alignment
> FW_CFG_SIZE provides might not suffice. So, you'd calculate the natural
> alignment, but wouldn't increase it beyond 4.
>
> I do think this is a bit overkill :) but I can do it. Let's wait for
> more review comments first.
Actually, on second thought, completely scratch my overkill suggestion.
It's actually wrong to be concerned with it anyway. FW_CFG_DATA_SIZE
doesn't dictate how we should access the data port, the fw-cfg protocol
does, and that says we should access exactly one byte. So, regardless of
the fw-cfg-data size, we'll never have to worry about the data port's
alignment, as we'll never access more than one byte from it.
>
> Thanks!
> Laszlo
next prev parent reply other threads:[~2014-11-28 11:18 UTC|newest]
Thread overview: 26+ messages / expand[flat|nested] mbox.gz Atom feed top
2014-11-27 23:17 [Qemu-devel] expose QEMU's fw_cfg boot order to ARM guest firmware (Intel BDS) Laszlo Ersek
2014-11-27 23:18 ` [Qemu-devel] [qemu PATCH 0/2] DTB- and MMIO-based fw_cfg for hw/arm/virt Laszlo Ersek
2014-11-27 23:18 ` [Qemu-devel] [qemu PATCH 1/2] fw_cfg: make the FW_CFG_SIZE and FW_CFG_DATA_SIZE macros public Laszlo Ersek
2014-11-27 23:18 ` [Qemu-devel] [qemu PATCH 2/2] arm: add fw_cfg to "virt" board Laszlo Ersek
2014-11-27 23:28 ` Peter Maydell
2014-11-27 23:34 ` Laszlo Ersek
2014-11-27 23:37 ` Peter Maydell
2014-11-28 10:38 ` Andrew Jones
2014-11-28 10:43 ` Laszlo Ersek
2014-11-28 10:49 ` Laszlo Ersek
2014-11-28 11:17 ` Andrew Jones [this message]
2014-11-28 10:51 ` Andrew Jones
2014-11-27 23:19 ` [Qemu-devel] [edk2 PATCH 00/12] consume fw_cfg boot order in ArmVirtualizationQemu Laszlo Ersek
2014-11-27 23:19 ` [Qemu-devel] [edk2 PATCH 01/12] ArmVirtualizationPkg: VirtFdtDxe: forward FwCfg addresses from DTB to PCDs Laszlo Ersek
2014-12-05 17:39 ` [Qemu-devel] [edk2] " Laszlo Ersek
2014-11-27 23:19 ` [Qemu-devel] [edk2 PATCH 02/12] ArmVirtualizationPkg: introduce QemuFwCfgLib instance for DXE drivers Laszlo Ersek
2014-11-27 23:19 ` [Qemu-devel] [edk2 PATCH 03/12] ArmVirtualizationPkg: clone PlatformIntelBdsLib from ArmPlatformPkg Laszlo Ersek
2014-11-27 23:19 ` [Qemu-devel] [edk2 PATCH 04/12] ArmVirtualizationPkg: PlatformIntelBdsLib: add basic policy Laszlo Ersek
2014-11-27 23:19 ` [Qemu-devel] [edk2 PATCH 05/12] OvmfPkg: extract QemuBootOrderLib Laszlo Ersek
2014-11-27 23:19 ` [Qemu-devel] [edk2 PATCH 06/12] OvmfPkg: QemuBootOrderLib: featurize PCI-like device path translation Laszlo Ersek
2014-11-27 23:19 ` [Qemu-devel] [edk2 PATCH 07/12] OvmfPkg: introduce VIRTIO_MMIO_TRANSPORT_GUID Laszlo Ersek
2014-11-27 23:19 ` [Qemu-devel] [edk2 PATCH 08/12] ArmVirtualizationPkg: VirtFdtDxe: use dedicated VIRTIO_MMIO_TRANSPORT_GUID Laszlo Ersek
2014-11-27 23:19 ` [Qemu-devel] [edk2 PATCH 09/12] OvmfPkg: QemuBootOrderLib: widen ParseUnitAddressHexList() to UINT64 Laszlo Ersek
2014-11-27 23:19 ` [Qemu-devel] [edk2 PATCH 10/12] OvmfPkg: QemuBootOrderLib: OFW-to-UEFI translation for virtio-mmio Laszlo Ersek
2014-11-27 23:19 ` [Qemu-devel] [edk2 PATCH 11/12] ArmVirtualizationPkg: PlatformIntelBdsLib: adhere to QEMU's boot order Laszlo Ersek
2014-11-27 23:19 ` [Qemu-devel] [edk2 PATCH 12/12] ArmVirtualizationPkg: identify "new shell" as builtin shell for Intel BDS Laszlo Ersek
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=20141128111747.GC3013@hawk.usersys.redhat.com \
--to=drjones@redhat.com \
--cc=ard.biesheuvel@linaro.org \
--cc=edk2-devel@lists.sourceforge.net \
--cc=imammedo@redhat.com \
--cc=lersek@redhat.com \
--cc=mst@redhat.com \
--cc=peter.maydell@linaro.org \
--cc=qemu-devel@nongnu.org \
/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.