All of lore.kernel.org
 help / color / mirror / Atom feed
From: Paolo Bonzini <pbonzini@redhat.com>
To: Peter Maydell <peter.maydell@linaro.org>, qemu-devel@nongnu.org
Cc: Michael Casadevall <Michael.casadevall@linaro.org>,
	Christoffer Dall <christoffer.dall@linaro.org>,
	patches@linaro.org
Subject: Re: [Qemu-devel] [PATCH v2 1/2] hw/arm/virt: Provide flash devices for boot ROMs
Date: Tue, 10 Jun 2014 19:14:15 +0200	[thread overview]
Message-ID: <53973CE7.3090307@redhat.com> (raw)
In-Reply-To: <1402419999-26059-2-git-send-email-peter.maydell@linaro.org>

Il 10/06/2014 19:06, Peter Maydell ha scritto:
> Add two flash devices to the virt board, so that it can be used for
> running guests which want a bootrom image such as UEFI. We provide
> two flash devices to make it more convenient to provide both a
> read-only UEFI image and a read-write place to store guest-set
> UEFI config variables. The '-bios' command line option is set up
> to provide an image for the first of the two flash devices.
>
> Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
> ---
>  hw/arm/virt.c | 71 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++-
>  1 file changed, 70 insertions(+), 1 deletion(-)
>
> diff --git a/hw/arm/virt.c b/hw/arm/virt.c
> index 3b55a4b..e658eb0 100644
> --- a/hw/arm/virt.c
> +++ b/hw/arm/virt.c
> @@ -37,6 +37,7 @@
>  #include "sysemu/sysemu.h"
>  #include "sysemu/kvm.h"
>  #include "hw/boards.h"
> +#include "hw/loader.h"
>  #include "exec/address-spaces.h"
>  #include "qemu/bitops.h"
>  #include "qemu/error-report.h"
> @@ -94,7 +95,6 @@ typedef struct VirtBoardInfo {
>   * a 32 bit VM and leaving space for expansion and in particular for PCI.
>   */
>  static const MemMapEntry a15memmap[] = {
> -    /* Space up to 0x8000000 is reserved for a boot ROM */
>      [VIRT_FLASH] = { 0, 0x8000000 },
>      [VIRT_CPUPERIPHS] = { 0x8000000, 0x20000 },
>      /* GIC distributor and CPU interfaces sit inside the CPU peripheral space */
> @@ -375,6 +375,73 @@ static void create_virtio_devices(const VirtBoardInfo *vbi, qemu_irq *pic)
>      }
>  }
>
> +static void create_one_flash(const char *name, hwaddr flashbase,
> +                             hwaddr flashsize)
> +{
> +    /* Create and map a single flash device. We use the same
> +     * parameters as the flash devices on the Versatile Express board.
> +     */
> +    DriveInfo *dinfo = drive_get_next(IF_PFLASH);
> +    DeviceState *dev = qdev_create(NULL, "cfi.pflash01");
> +    const uint64_t sectorlength = 256 * 1024;
> +
> +    if (dinfo && qdev_prop_set_drive(dev, "drive", dinfo->bdrv)) {
> +        abort();
> +    }
> +
> +    qdev_prop_set_uint32(dev, "num-blocks", flashsize / sectorlength);
> +    qdev_prop_set_uint64(dev, "sector-length", sectorlength);
> +    qdev_prop_set_uint8(dev, "width", 4);
> +    qdev_prop_set_uint8(dev, "device-width", 2);
> +    qdev_prop_set_uint8(dev, "big-endian", 0);
> +    qdev_prop_set_uint16(dev, "id0", 0x89);
> +    qdev_prop_set_uint16(dev, "id1", 0x18);
> +    qdev_prop_set_uint16(dev, "id2", 0x00);
> +    qdev_prop_set_uint16(dev, "id3", 0x00);
> +    qdev_prop_set_string(dev, "name", name);
> +    qdev_init_nofail(dev);
> +
> +    sysbus_mmio_map(SYS_BUS_DEVICE(dev), 0, flashbase);
> +}
> +
> +static void create_flash(const VirtBoardInfo *vbi)
> +{
> +    /* Create two flash devices to fill the VIRT_FLASH space in the memmap.
> +     * Any file passed via -bios goes in the first of these.
> +     */
> +    hwaddr flashsize = vbi->memmap[VIRT_FLASH].size / 2;
> +    hwaddr flashbase = vbi->memmap[VIRT_FLASH].base;
> +    char *nodename;
> +
> +    if (bios_name) {
> +        const char *fn;
> +
> +        if (drive_get(IF_PFLASH, 0, 0)) {
> +            error_report("The contents of the first flash device may be "
> +                         "specified with -bios or with -drive if=pflash... "
> +                         "but you cannot use both options at once");
> +            exit(1);
> +        }
> +        fn = qemu_find_file(QEMU_FILE_TYPE_BIOS, bios_name);
> +        if (!fn || load_image_targphys(fn, flashbase, flashsize) < 0) {
> +            error_report("Could not load ROM image '%s'", bios_name);
> +            exit(1);
> +        }
> +    }
> +
> +    create_one_flash("virt.flash0", flashbase, flashsize);
> +    create_one_flash("virt.flash1", flashbase + flashsize, flashsize);
> +
> +    nodename = g_strdup_printf("/flash@%" PRIx64, flashbase);
> +    qemu_fdt_add_subnode(vbi->fdt, nodename);
> +    qemu_fdt_setprop_string(vbi->fdt, nodename, "compatible", "cfi-flash");
> +    qemu_fdt_setprop_sized_cells(vbi->fdt, nodename, "reg",
> +                                 2, flashbase, 2, flashsize,
> +                                 2, flashbase + flashsize, 2, flashsize);
> +    qemu_fdt_setprop_cell(vbi->fdt, nodename, "bank-width", 4);
> +    g_free(nodename);
> +}
> +
>  static void *machvirt_dtb(const struct arm_boot_info *binfo, int *fdt_size)
>  {
>      const VirtBoardInfo *board = (const VirtBoardInfo *)binfo;
> @@ -451,6 +518,8 @@ static void machvirt_init(MachineState *machine)
>      vmstate_register_ram_global(ram);
>      memory_region_add_subregion(sysmem, vbi->memmap[VIRT_MEM].base, ram);
>
> +    create_flash(vbi);
> +
>      create_gic(vbi, pic);
>
>      create_uart(vbi, pic);
>

Reviewed-by: Paolo Bonzini <pbonzini@redhat.com>

  reply	other threads:[~2014-06-10 17:14 UTC|newest]

Thread overview: 9+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2014-06-10 17:06 [Qemu-devel] [PATCH v2 0/2] hw/arm/virt: Add flash and RTC devices Peter Maydell
2014-06-10 17:06 ` [Qemu-devel] [PATCH v2 1/2] hw/arm/virt: Provide flash devices for boot ROMs Peter Maydell
2014-06-10 17:14   ` Paolo Bonzini [this message]
2014-06-11 10:45   ` Peter Crosthwaite
2014-06-10 17:06 ` [Qemu-devel] [PATCH v2 2/2] hw/arm/virt: Provide PL031 RTC Peter Maydell
2014-06-11 16:01   ` Claudio Fontana
2014-06-13 23:10     ` Peter Crosthwaite
2014-06-16  9:18       ` [Qemu-devel] hw/arm/virt: Provide PCI? Claudio Fontana
2014-06-16  9:31         ` Peter Maydell

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=53973CE7.3090307@redhat.com \
    --to=pbonzini@redhat.com \
    --cc=Michael.casadevall@linaro.org \
    --cc=christoffer.dall@linaro.org \
    --cc=patches@linaro.org \
    --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.