[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [Qemu-devel] [PATCH v3 4/7] arm: add fw_cfg to "virt" board
From: |
Peter Maydell |
Subject: |
Re: [Qemu-devel] [PATCH v3 4/7] arm: add fw_cfg to "virt" board |
Date: |
Fri, 12 Dec 2014 12:55:01 +0000 |
On 9 December 2014 at 01:13, Laszlo Ersek <address@hidden> 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.
>
> Because MMIO access is slow on ARM KVM, we enable the guest, with
> fw_cfg_init_data_memwidth(), to transfer up to 8 bytes with a single
> access. This has been measured to speed up transfers up to 7.5-fold,
> relative to single byte data access, on both ARM KVM and x86_64 TCG.
>
> 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. The DTB properties follow the documentation in
> the Linux source file "Documentation/devicetree/bindings/arm/fw-cfg.txt".
>
> fw_cfg automatically exports a number of files to the guest; for example,
> "bootorder" (see fw_cfg_machine_reset()).
>
> Signed-off-by: Laszlo Ersek <address@hidden>
> ---
>
> Notes:
> v3:
> - enable 8-byte wide access to fw_cfg MMIO data port [Drew]
> - expose the exact size of the fused region in the DTB [Peter]
> - reorder data register and control register so that we can keep the
> region contiguous and still conform to alignment requirements [Laszlo]
>
> hw/arm/virt.c | 21 +++++++++++++++++++++
> 1 file changed, 21 insertions(+)
>
> diff --git a/hw/arm/virt.c b/hw/arm/virt.c
> index 314e55b..274aaae 100644
> --- a/hw/arm/virt.c
> +++ b/hw/arm/virt.c
> @@ -67,8 +67,9 @@ enum {
> VIRT_GIC_CPU,
> VIRT_UART,
> VIRT_MMIO,
> VIRT_RTC,
> + VIRT_FW_CFG,
> };
>
> typedef struct MemMapEntry {
> hwaddr base;
> @@ -106,8 +107,9 @@ static const MemMapEntry a15memmap[] = {
> [VIRT_GIC_DIST] = { 0x08000000, 0x00010000 },
> [VIRT_GIC_CPU] = { 0x08010000, 0x00010000 },
> [VIRT_UART] = { 0x09000000, 0x00001000 },
> [VIRT_RTC] = { 0x09010000, 0x00001000 },
> + [VIRT_FW_CFG] = { 0x09020000, 0x0000000a },
> [VIRT_MMIO] = { 0x0a000000, 0x00000200 },
> /* ...repeating for a total of NUM_VIRTIO_TRANSPORTS, each of that size
> */
> /* 0x10000000 .. 0x40000000 reserved for PCI */
> [VIRT_MEM] = { 0x40000000, 30ULL * 1024 * 1024 * 1024 },
> @@ -518,8 +520,25 @@ static void create_flash(const VirtBoardInfo *vbi)
> qemu_fdt_setprop_cell(vbi->fdt, nodename, "bank-width", 4);
> g_free(nodename);
> }
>
> +static void create_fw_cfg(const VirtBoardInfo *vbi)
> +{
> + hwaddr base = vbi->memmap[VIRT_FW_CFG].base;
> + hwaddr size = vbi->memmap[VIRT_FW_CFG].size;
> + char *nodename;
> +
> + fw_cfg_init_data_memwidth(0, 0, base + 8, base, 8);
fw_cfg_init_data_memwidth() adds a bunch of FW_CFG keys
(bootsplash stuff, reboot timeouts, etc). Are you happy that
they all make sense to export on ARM? (I guess we're already doing
that on the other non-x86 fw_cfg users.)
Assuming so,
Reviewed-by: Peter Maydell <address@hidden>
-- PMM
- [Qemu-devel] [PATCH v3 0/7] fw_cfg, bootorder, and UEFI+'-kernel' on arm/virt, Laszlo Ersek, 2014/12/08
- [Qemu-devel] [PATCH v3 1/7] fw_cfg: max access size and region size are the same for MMIO data reg, Laszlo Ersek, 2014/12/08
- [Qemu-devel] [PATCH v3 2/7] fw_cfg: introduce the "data_memwidth" property, Laszlo Ersek, 2014/12/08
- [Qemu-devel] [PATCH v3 3/7] fw_cfg: expose the "data_memwidth" prop with fw_cfg_init_data_memwidth(), Laszlo Ersek, 2014/12/08
- [Qemu-devel] [PATCH v3 4/7] arm: add fw_cfg to "virt" board, Laszlo Ersek, 2014/12/08
- Re: [Qemu-devel] [PATCH v3 4/7] arm: add fw_cfg to "virt" board,
Peter Maydell <=
- [Qemu-devel] [PATCH v3 5/7] hw/loader: split out load_image_gzipped_buffer(), Laszlo Ersek, 2014/12/08
- [Qemu-devel] [PATCH v3 6/7] hw/arm: pass pristine kernel image to guest firmware over fw_cfg, Laszlo Ersek, 2014/12/08