[PATCH 12/14] arc: Add Synopsys ARC emulation boards

Philippe Mathieu-Daudé f4bug at amsat.org
Wed Oct 7 00:31:01 EDT 2020


Hi Cupertino, Claudiu,

On 9/30/20 10:46 PM, cupertinomiranda at gmail.com wrote:
> From: Claudiu Zissulescu <claziss at synopsys.com>
> 
> Add the Synopsys ARC boards, arc_sim for testing, sim-hs main emulation
> board using standard UART and nsim which includes a Synopsys ARC specific
> UART implementation.
> 
> Signed-off-by: Claudiu Zissulescu <claziss at synopsys.com>
> ---
>  hw/arc/Makefile.objs      |  21 +++
>  hw/arc/arc_sim.c          | 143 ++++++++++++++++++++
>  hw/arc/arc_uart.c         | 267 ++++++++++++++++++++++++++++++++++++++
>  hw/arc/board-hsdk.c       | 107 +++++++++++++++
>  hw/arc/boot.c             |  95 ++++++++++++++
>  hw/arc/boot.h             |  21 +++
>  hw/arc/meson.build        |  13 ++
>  hw/arc/nsim.c             |  86 ++++++++++++
>  hw/arc/pic_cpu.c          | 111 ++++++++++++++++
>  hw/arc/sample.c           |  77 +++++++++++
>  hw/arc/sim-hs.c           | 107 +++++++++++++++
>  include/hw/arc/arc_uart.h |  43 ++++++
>  include/hw/arc/cpudevs.h  |  10 ++
>  13 files changed, 1101 insertions(+)
>  create mode 100644 hw/arc/Makefile.objs
>  create mode 100644 hw/arc/arc_sim.c
>  create mode 100644 hw/arc/arc_uart.c
>  create mode 100644 hw/arc/board-hsdk.c
>  create mode 100644 hw/arc/boot.c
>  create mode 100644 hw/arc/boot.h
>  create mode 100644 hw/arc/meson.build
>  create mode 100644 hw/arc/nsim.c
>  create mode 100644 hw/arc/pic_cpu.c
>  create mode 100644 hw/arc/sample.c
>  create mode 100644 hw/arc/sim-hs.c
>  create mode 100644 include/hw/arc/arc_uart.h
>  create mode 100644 include/hw/arc/cpudevs.h

Please split in various commits:

- hw/char/arc_uart
- hw/intc/synopsys_pic or something
- hw/arc/boot
- hw/arc/*sim*
- hw/arc/*hsdk*

(Also it would simplify differentiating the architectural
part of your patches from the hardware ones if you use the
target/arc/ prefix in your previous patches).

> 
> diff --git a/hw/arc/Makefile.objs b/hw/arc/Makefile.objs
> new file mode 100644
> index 0000000000..28d7766cd9
> --- /dev/null
> +++ b/hw/arc/Makefile.objs
> @@ -0,0 +1,21 @@
> +#
> +#  QEMU ARC CPU
> +#
> +#  Copyright (c) 2019
> +#
> +#  This library is free software; you can redistribute it and/or
> +#  modify it under the terms of the GNU Lesser General Public
> +#  License as published by the Free Software Foundation; either
> +#  version 2.1 of the License, or (at your option) any later version.
> +#
> +#  This library is distributed in the hope that it will be useful,
> +#  but WITHOUT ANY WARRANTY; without even the implied warranty of
> +#  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
> +#  Lesser General Public License for more details.
> +#
> +#  You should have received a copy of the GNU Lesser General Public
> +#  License along with this library; if not, see
> +#  http://www.gnu.org/licenses/lgpl-2.1.html
> +#
> +
> +obj-y   = arc_sim.o arc_uart.o sample.o pic_cpu.o boot.o board-hsdk.o sim-hs.o nsim.o

We don't use Makefile anymore.

> diff --git a/hw/arc/arc_sim.c b/hw/arc/arc_sim.c
> new file mode 100644
> index 0000000000..8020a03d85
> --- /dev/null
> +++ b/hw/arc/arc_sim.c
> @@ -0,0 +1,143 @@
> +/*
> + * This library is free software; you can redistribute it and/or
> + * modify it under the terms of the GNU Lesser General Public
> + * License as published by the Free Software Foundation; either
> + * version 2 of the License, or (at your option) any later version.
> + *
> + * This library is distributed in the hope that it will be useful,
> + * but WITHOUT ANY WARRANTY; without even the implied warranty of
> + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
> + * Lesser General Public License for more details.
> + *
> + * You should have received a copy of the GNU Lesser General Public
> + * License along with this library; if not, see <http://www.gnu.org/licenses/>.
> + */
> +
> +#include "qemu/osdep.h"
> +#include "qapi/error.h"
> +#include "cpu.h"
> +#include "hw/hw.h"
> +#include "hw/boards.h"
> +#include "elf.h"
> +#include "hw/char/serial.h"
> +#include "net/net.h"
> +#include "hw/loader.h"
> +#include "exec/memory.h"
> +#include "exec/address-spaces.h"
> +#include "sysemu/reset.h"
> +#include "sysemu/runstate.h"
> +#include "sysemu/sysemu.h"
> +#include "hw/sysbus.h"
> +#include "hw/arc/cpudevs.h"
> +#include "boot.h"
> +
> +static void arc_sim_net_init(MemoryRegion *address_space,
> +                             hwaddr base,
> +                             hwaddr descriptors,
> +                             qemu_irq irq, NICInfo *nd)
> +{
> +    DeviceState *dev;
> +    SysBusDevice *s;
> +
> +    dev = qdev_new("open_eth");
> +    qdev_set_nic_properties(dev, nd);
> +    sysbus_realize_and_unref(SYS_BUS_DEVICE(dev), &error_fatal);
> +
> +    s = SYS_BUS_DEVICE(dev);
> +    sysbus_connect_irq(s, 0, irq);
> +    memory_region_add_subregion(address_space, base,
> +                                sysbus_mmio_get_region(s, 0));
> +    memory_region_add_subregion(address_space, descriptors,
> +                                sysbus_mmio_get_region(s, 1));
> +}
> +
> +static uint64_t arc_io_read(void *opaque, hwaddr addr, unsigned size)
> +{
> +    return 0;
> +}
> +
> +static void arc_io_write(void *opaque, hwaddr addr,
> +                         uint64_t val, unsigned size)
> +{
> +    switch (addr) {
> +    case 0x08: /* board reset. */
> +        qemu_system_reset_request(SHUTDOWN_CAUSE_GUEST_RESET);
> +        break;
> +    default:
> +        break;
> +    }
> +}
> +
> +static const MemoryRegionOps arc_io_ops = {
> +    .read = arc_io_read,
> +    .write = arc_io_write,
> +    .endianness = DEVICE_NATIVE_ENDIAN,
> +};
> +
> +static void arc_sim_init(MachineState *machine)
> +{
> +    static struct arc_boot_info boot_info;
> +    unsigned int smp_cpus = machine->smp.cpus;
> +    ram_addr_t ram_base = 0;
> +    ram_addr_t ram_size = machine->ram_size;
> +    ARCCPU *cpu = NULL;
> +    MemoryRegion *ram, *system_io;
> +    int n;
> +
> +    boot_info.ram_start = ram_base;
> +    boot_info.ram_size = ram_size;
> +    boot_info.kernel_filename = machine->kernel_filename;
> +
> +    for (n = 0; n < smp_cpus; n++) {
> +        cpu = ARC_CPU(object_new(machine->cpu_type));
> +        if (cpu == NULL) {
> +            fprintf(stderr, "Unable to find CPU definition!\n");
> +            exit(1);
> +        }
> +
> +        /* Set the initial CPU properties. */
> +        object_property_set_uint(OBJECT(cpu), "freq_hz", 1000000, &error_fatal);
> +        object_property_set_bool(OBJECT(cpu), "rtc-opt", true, &error_fatal);
> +        object_property_set_bool(OBJECT(cpu), "realized", true, &error_fatal);
> +
> +        /* Initialize internal devices. */
> +        cpu_arc_pic_init(cpu);
> +        cpu_arc_clock_init(cpu);
> +
> +        qemu_register_reset(arc_cpu_reset, cpu);
> +    }
> +
> +    ram = g_new(MemoryRegion, 1);
> +    memory_region_init_ram(ram, NULL, "arc.ram", ram_size, &error_fatal);
> +    memory_region_add_subregion(get_system_memory(), ram_base, ram);
> +
> +    system_io = g_new(MemoryRegion, 1);
> +    memory_region_init_io(system_io, NULL, &arc_io_ops, NULL, "arc.io",
> +                           1024);
> +    memory_region_add_subregion(get_system_memory(), 0xf0000000, system_io);
> +
> +    serial_mm_init(get_system_memory(), 0x90000000, 2, cpu->env.irq[20],
> +                   115200, serial_hd(0), DEVICE_NATIVE_ENDIAN);
> +
> +    if (nd_table[0].used) {
> +        arc_sim_net_init(get_system_memory(), 0x92000000,
> +                         0x92000400, cpu->env.irq[4], nd_table);
> +    }
> +
> +    arc_load_kernel(cpu, &boot_info);
> +}
> +
> +static void arc_sim_machine_init(MachineClass *mc)
> +{
> +    mc->desc = "ARCxx simulation";
> +    mc->init = arc_sim_init;
> +    mc->max_cpus = 1;
> +    mc->is_default = false;
> +    mc->default_cpu_type = ARC_CPU_TYPE_NAME("archs");
> +}
> +
> +DEFINE_MACHINE("arc-sim", arc_sim_machine_init)

Can you share the link to the documentation of this simulator please?
I couldn't find it on the link you provided in the cover
(https://www.synopsys.com/designware-ip/processor-solutions.html)
and https://www.synopsys.com/dw/ipdir.php?ds=sim_nSIM doesn't
seem relevant.

> diff --git a/hw/arc/sample.c b/hw/arc/sample.c
> new file mode 100644
> index 0000000000..0ecc11cf15
> --- /dev/null
> +++ b/hw/arc/sample.c
> @@ -0,0 +1,77 @@
> +/*
> + * QEMU ARC CPU
> + *
> + * Copyright (c) 2016 Michael Rolnik
> + *
> + * This library is free software; you can redistribute it and/or
> + * modify it under the terms of the GNU Lesser General Public
> + * License as published by the Free Software Foundation; either
> + * version 2.1 of the License, or (at your option) any later version.
> + *
> + * This library is distributed in the hope that it will be useful,
> + * but WITHOUT ANY WARRANTY; without even the implied warranty of
> + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
> + * Lesser General Public License for more details.
> + *
> + * You should have received a copy of the GNU Lesser General Public
> + * License along with this library; if not, see
> + * http://www.gnu.org/licenses/lgpl-2.1.html
> + */
> +
> +#include "qemu/osdep.h"
> +#include "qapi/error.h"
> +#include "qemu-common.h"
> +#include "cpu.h"
> +#include "hw/hw.h"
> +#include "sysemu/sysemu.h"
> +#include "sysemu/qtest.h"
> +#include "ui/console.h"
> +#include "hw/boards.h"
> +#include "hw/loader.h"
> +#include "qemu/error-report.h"
> +#include "exec/address-spaces.h"
> +#include "include/hw/sysbus.h"
> +
> +#define SIZE_RAM 0x00020000
> +
> +static void sample_init(MachineState *machine)
> +{
> +    MemoryRegion *ram;
> +
> +    ARCCPU *cpu_arc ATTRIBUTE_UNUSED;
> +
> +    ram = g_new(MemoryRegion, 1);
> +
> +    cpu_arc = ARC_CPU(cpu_create("archs-" TYPE_ARC_CPU));
> +
> +    memory_region_init_ram(ram, NULL, "ram", SIZE_RAM, &error_fatal);
> +    memory_region_add_subregion(get_system_memory(), PHYS_BASE_RAM, ram);
> +
> +    char const *firmware = NULL;
> +    char const *filename;
> +
> +    if (machine->firmware) {
> +        firmware = machine->firmware;
> +    }
> +
> +    filename = qemu_find_file(QEMU_FILE_TYPE_BIOS, firmware);
> +    if (!filename) {
> +        error_report("Could not find flash image file '%s'", firmware);
> +        exit(1);
> +    }
> +
> +    load_image_targphys(filename, PHYS_BASE_RAM + 0x100, SIZE_RAM);
> +}
> +
> +static void sample_machine_init(MachineClass *mc)
> +{
> +    mc->desc = "ARC sample/example board";
> +    mc->init = sample_init;
> +    mc->is_default = false;
> +}
> +
> +DEFINE_MACHINE("sample", sample_machine_init)

You don't need a "sample" board, you can use the "none" machine instead.

Regards,

Phil.



More information about the linux-snps-arc mailing list