[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [Qemu-arm] [PATCH v4 11/14] ARM: Add basic code to emulate A7MPCore
From: |
Philippe Mathieu-Daudé |
Subject: |
Re: [Qemu-arm] [PATCH v4 11/14] ARM: Add basic code to emulate A7MPCore DAP block |
Date: |
Tue, 16 Jan 2018 01:32:40 -0300 |
User-agent: |
Mozilla/5.0 (X11; Linux x86_64; rv:52.0) Gecko/20100101 Thunderbird/52.5.2 |
Hi Andrey,
On 01/15/2018 10:37 PM, Andrey Smirnov wrote:
> Add minimal code to emulate A7MPCore DAP block needed to boot Linux
> guest.
I was not aware the DAP is accessed by upstream Linux...
You sure this isn't rather part of some bootloader built-in self-test?
> Cc: Peter Maydell <address@hidden>
> Cc: Jason Wang <address@hidden>
> Cc: Philippe Mathieu-Daudé <address@hidden>
> Cc: address@hidden
> Cc: address@hidden
> Cc: address@hidden
> Signed-off-by: Andrey Smirnov <address@hidden>
> ---
> hw/arm/Makefile.objs | 2 +-
> hw/arm/coresight.c | 120
> +++++++++++++++++++++++++++++++++++++++++++++
> include/hw/arm/coresight.h | 24 +++++++++
> 3 files changed, 145 insertions(+), 1 deletion(-)
> create mode 100644 hw/arm/coresight.c
> create mode 100644 include/hw/arm/coresight.h
>
> diff --git a/hw/arm/Makefile.objs b/hw/arm/Makefile.objs
> index 2794e086d6..692216e0cf 100644
> --- a/hw/arm/Makefile.objs
> +++ b/hw/arm/Makefile.objs
> @@ -1,4 +1,4 @@
> -obj-y += boot.o collie.o exynos4_boards.o gumstix.o highbank.o
> +obj-y += boot.o collie.o exynos4_boards.o gumstix.o highbank.o coresight.o
> obj-$(CONFIG_DIGIC) += digic_boards.o
> obj-y += integratorcp.o mainstone.o musicpal.o nseries.o
> obj-y += omap_sx1.o palm.o realview.o spitz.o stellaris.o
> diff --git a/hw/arm/coresight.c b/hw/arm/coresight.c
> new file mode 100644
> index 0000000000..d0a8c1b005
> --- /dev/null
> +++ b/hw/arm/coresight.c
> @@ -0,0 +1,120 @@
> +/*
> + * Copyright (c) 2017, Impinj, Inc.
> + *
> + * CoreSight block emulation code
> + *
> + * Author: Andrey Smirnov <address@hidden>
> + *
> + * This work is licensed under the terms of the GNU GPL, version 2 or later.
> + * See the COPYING file in the top-level directory.
> + */
> +
> +#include "qemu/osdep.h"
> +#include "hw/arm/coresight.h"
> +#include "qemu/log.h"
> +
> +static uint64_t coresight_read(void *opaque, hwaddr offset,
> + unsigned size)
> +{
> + return 0;
> +}
> +
> +static void coresight_write(void *opaque, hwaddr offset,
> + uint64_t value, unsigned size)
> +{
> +}
I assume you had to add this to bypass the memory_transaction_failures
check.
> +
> +static const struct MemoryRegionOps coresight_ops = {
> + .read = coresight_read,
> + .write = coresight_write,
> + .endianness = DEVICE_NATIVE_ENDIAN,
> + .impl = {
> + /*
> + * Our device would not work correctly if the guest was doing
> + * unaligned access. This might not be a limitation on the real
> + * device but in practice there is no reason for a guest to access
> + * this device unaligned.
> + */
> + .min_access_size = 4,
> + .max_access_size = 4,
> + .unaligned = false,
> + },
> +};
> +
> +static void a7mpcore_dap_init(Object *obj)
> +{
> + SysBusDevice *sd = SYS_BUS_DEVICE(obj);
> + A7MPCoreDAPState *s = A7MPCORE_DAP(obj);
> +
> + memory_region_init(&s->container, obj, "a7mpcore-dap-container",
> 0x100000);
You can just use add this in fsl_imx7_realize():
create_unimplemented_device("a7mpcore-dap-container",
FSL_IMX7_A7MPCORE_DAP_ADDR,
0x100000);
to register a background region for the DAP (see "hw/misc/unimp.h")
as a bonus, running with "-d unimp" you can trace the DAP access.
So this model and those files are not necessary.
> + sysbus_init_mmio(sd, &s->container);
> +
> + memory_region_init_io(&s->ca7_atb_funnel,
> + obj,
> + &coresight_ops,
> + s,
> + TYPE_A7MPCORE_DAP ".ca7-atb-funnel",
> + 0x1000);
> + memory_region_add_subregion(&s->container, 0x41000, &s->ca7_atb_funnel);
> +
> + memory_region_init_io(&s->cpu0_etm,
> + obj,
> + &coresight_ops,
> + s,
> + TYPE_A7MPCORE_DAP ".cpu0-etm",
> + 0x1000);
> + memory_region_add_subregion(&s->container, 0x7C000, &s->cpu0_etm);
> +
> + memory_region_init_io(&s->atb_funnel,
> + obj,
> + &coresight_ops,
> + s,
> + TYPE_A7MPCORE_DAP ".atb-funnel",
> + 0x1000);
> + memory_region_add_subregion(&s->container, 0x83000, &s->atb_funnel);
> +
> + memory_region_init_io(&s->tmc_etb,
> + obj,
> + &coresight_ops,
> + s,
> + TYPE_A7MPCORE_DAP ".tmc-etb",
> + 0x1000);
> + memory_region_add_subregion(&s->container, 0x84000, &s->tmc_etb);
> +
> + memory_region_init_io(&s->tmc_etr,
> + obj,
> + &coresight_ops,
> + s,
> + TYPE_A7MPCORE_DAP ".tmc-etr",
> + 0x1000);
> + memory_region_add_subregion(&s->container, 0x86000, &s->tmc_etr);
> +
> + memory_region_init_io(&s->tpiu,
> + obj,
> + &coresight_ops,
> + s,
> + TYPE_A7MPCORE_DAP ".tpiu",
> + 0x1000);
> + memory_region_add_subregion(&s->container, 0x87000, &s->tpiu);
> +}
> +
> +static void a7mpcore_dap_class_init(ObjectClass *klass, void *data)
> +{
> + DeviceClass *dc = DEVICE_CLASS(klass);
> +
> + dc->desc = "A7MPCore DAP Module";
> +}
> +
> +static const TypeInfo a7mpcore_dap_info = {
> + .name = TYPE_A7MPCORE_DAP,
> + .parent = TYPE_SYS_BUS_DEVICE,
> + .instance_size = sizeof(A7MPCoreDAPState),
> + .instance_init = a7mpcore_dap_init,
> + .class_init = a7mpcore_dap_class_init,
> +};
> +
> +static void coresight_register_type(void)
> +{
> + type_register_static(&a7mpcore_dap_info);
> +}
> +type_init(coresight_register_type)
> diff --git a/include/hw/arm/coresight.h b/include/hw/arm/coresight.h
> new file mode 100644
> index 0000000000..d1480e825b
> --- /dev/null
> +++ b/include/hw/arm/coresight.h
> @@ -0,0 +1,24 @@
> +#ifndef CORESIGHT_H
> +#define CORESIGHT_H
> +
> +#include "hw/sysbus.h"
> +
> +typedef struct A7MPCoreDAPState {
> + /*< private >*/
> + SysBusDevice parent_obj;
> +
> + MemoryRegion container;
> +
> + MemoryRegion ca7_atb_funnel;
> + MemoryRegion cpu0_etm;
> + MemoryRegion atb_funnel;
> + MemoryRegion tmc_etb;
> + MemoryRegion tmc_etr;
> + MemoryRegion tpiu;
> +
> +} A7MPCoreDAPState;
> +
> +#define TYPE_A7MPCORE_DAP "a7mpcore-dap"
> +#define A7MPCORE_DAP(obj) OBJECT_CHECK(A7MPCoreDAPState, (obj),
> TYPE_A7MPCORE_DAP)
> +
> +#endif /* CORESIGHT_H */
>