From: Peter Maydell <peter.maydell@linaro.org>
To: Sebastian Huber <sebastian.huber@embedded-brains.de>
Cc: qemu-devel@nongnu.org, qemu-arm@nongnu.org
Subject: Re: [PATCH 2/2] hw/arm/xilinx_zynq: Support up to two CPU cores
Date: Mon, 20 May 2024 14:58:36 +0100 [thread overview]
Message-ID: <CAFEAcA_KBcL9UsqpOMk7GhWwokdEmC3fKZg_q7tdyt9LM7RFpA@mail.gmail.com> (raw)
In-Reply-To: <20240507130349.86851-3-sebastian.huber@embedded-brains.de>
On Tue, 7 May 2024 at 14:04, Sebastian Huber
<sebastian.huber@embedded-brains.de> wrote:
>
> The Zynq 7000 SoCs contain two Arm Cortex-A9 MPCore (the Zynq 7000S have only
> one core). Add support for up to two simulated cores.
>
> Signed-off-by: Sebastian Huber <sebastian.huber@embedded-brains.de>
> ---
> hw/arm/xilinx_zynq.c | 42 +++++++++++++++++++++++++++---------------
> 1 file changed, 27 insertions(+), 15 deletions(-)
>
> diff --git a/hw/arm/xilinx_zynq.c b/hw/arm/xilinx_zynq.c
> index 078abd77bd..3b858e3e9a 100644
> --- a/hw/arm/xilinx_zynq.c
> +++ b/hw/arm/xilinx_zynq.c
> @@ -184,6 +184,8 @@ static void zynq_init(MachineState *machine)
> SysBusDevice *busdev;
> qemu_irq pic[64];
> int n;
> + unsigned int smp_cpus = machine->smp.cpus;
> + qemu_irq cpu_irq[2];
We prefer not to have arrays of qemu_irq like this that are
just passing qemu_irqs from one place to another. Instead
at the point where you want the ARM_CPU_IRQ of a particular
CPU, call qdev_get_gpio_in() on the CPU object there.
I suggest dropping the "ARMCPU *cpu" local from this function
and instead adding an "ARMCPU *cpu[ZYNQ_MAX_CPUS]" array to
the ZynqMachineState struct.
> /* max 2GB ram */
> if (machine->ram_size > 2 * GiB) {
> @@ -191,21 +193,27 @@ static void zynq_init(MachineState *machine)
> exit(EXIT_FAILURE);
> }
>
> - cpu = ARM_CPU(object_new(machine->cpu_type));
> + for (n = 0; n < smp_cpus; n++) {
> + Object *cpuobj = object_new(machine->cpu_type);
>
> - /* By default A9 CPUs have EL3 enabled. This board does not
> - * currently support EL3 so the CPU EL3 property is disabled before
> - * realization.
> - */
> - if (object_property_find(OBJECT(cpu), "has_el3")) {
> - object_property_set_bool(OBJECT(cpu), "has_el3", false, &error_fatal);
> - }
> + /* By default A9 CPUs have EL3 enabled. This board does not
> + * currently support EL3 so the CPU EL3 property is disabled before
> + * realization.
> + */
If you're moving comment text around checkpatch will suggest that
you fix it up to our current coding standard, which is that
a multiline comment has the "/*" on a line of its own.
> + if (object_property_find(cpuobj, "has_el3")) {
> + object_property_set_bool(cpuobj, "has_el3", false, &error_fatal);
> + }
> +
> + object_property_set_int(cpuobj, "midr", ZYNQ_BOARD_MIDR,
> + &error_fatal);
> + object_property_set_int(cpuobj, "reset-cbar", MPCORE_PERIPHBASE,
> + &error_fatal);
>
> - object_property_set_int(OBJECT(cpu), "midr", ZYNQ_BOARD_MIDR,
> - &error_fatal);
> - object_property_set_int(OBJECT(cpu), "reset-cbar", MPCORE_PERIPHBASE,
> - &error_fatal);
> - qdev_realize(DEVICE(cpu), NULL, &error_fatal);
> + qdev_realize(DEVICE(cpuobj), NULL, &error_fatal);
> +
> + cpu_irq[n] = qdev_get_gpio_in(DEVICE(cpuobj), ARM_CPU_IRQ);
> + }
> + cpu = ARM_CPU(first_cpu);
>
> /* DDR remapped to address zero. */
> memory_region_add_subregion(address_space_mem, 0, machine->ram);
> @@ -238,10 +246,14 @@ static void zynq_init(MachineState *machine)
> sysbus_mmio_map(SYS_BUS_DEVICE(slcr), 0, 0xF8000000);
>
> dev = qdev_new(TYPE_A9MPCORE_PRIV);
> - qdev_prop_set_uint32(dev, "num-cpu", 1);
> + qdev_prop_set_uint32(dev, "num-cpu", smp_cpus);
> busdev = SYS_BUS_DEVICE(dev);
> sysbus_realize_and_unref(busdev, &error_fatal);
> sysbus_mmio_map(busdev, 0, MPCORE_PERIPHBASE);
> + for (n = 0; n < smp_cpus; n++) {
> + sysbus_connect_irq(busdev, n, cpu_irq[n]);
> + }
Looks like you have based this on a version of QEMU which doesn't
have commit 68a5827b80117973 which wires up the FIQ line of the
A9MPCORE_PRIV device to the CPUs.
> + zynq_binfo.gic_cpu_if_addr = MPCORE_PERIPHBASE + 0x100;
> sysbus_create_varargs("l2x0", MPCORE_PERIPHBASE + 0x2000, NULL);
> sysbus_connect_irq(busdev, 0,
> qdev_get_gpio_in(DEVICE(cpu), ARM_CPU_IRQ));
> @@ -357,7 +369,7 @@ static void zynq_machine_class_init(ObjectClass *oc, void *data)
> MachineClass *mc = MACHINE_CLASS(oc);
> mc->desc = "Xilinx Zynq Platform Baseboard for Cortex-A9";
> mc->init = zynq_init;
> - mc->max_cpus = 1;
> + mc->max_cpus = 2;
> mc->no_sdcard = 1;
> mc->ignore_memory_transaction_failures = true;
> mc->default_cpu_type = ARM_CPU_TYPE_NAME("cortex-a9");
> --
I'm not making this a condition for accepting this patch, but
since you're working on this board model would you consider
writing up some documentation for it? It's one of the boards
we do not currently have documented at all. This doesn't have to
be very extensive: a few paragraphs describing what the board
type is, maybe linking to a reference to the hardware, listing
what is and isn't implemented, and (if there are some convenient
examples available) perhaps listing some examples of use.
docs/system/arm/xlnx-versal-virt.rst is the docs for the
Xilinx Versal board; the rendered version of that is:
https://www.qemu.org/docs/master/system/arm/xlnx-versal-virt.html
or https://www.qemu.org/docs/master/system/arm/realview.html
is an example of a more minimal board documentation page.
thanks
-- PMM
next prev parent reply other threads:[~2024-05-20 13:59 UTC|newest]
Thread overview: 8+ messages / expand[flat|nested] mbox.gz Atom feed top
2024-05-07 13:03 [PATCH 0/2] Zynq 7000 SoC improvements Sebastian Huber
2024-05-07 13:03 ` [PATCH 1/2] hw/arm/xilinx_zynq: Add cache controller Sebastian Huber
2024-05-20 13:43 ` Peter Maydell
2024-05-07 13:03 ` [PATCH 2/2] hw/arm/xilinx_zynq: Support up to two CPU cores Sebastian Huber
2024-05-20 13:58 ` Peter Maydell [this message]
2024-05-24 11:45 ` Sebastian Huber
2024-05-17 8:30 ` [PATCH 0/2] Zynq 7000 SoC improvements Sebastian Huber
2024-05-17 9:58 ` 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=CAFEAcA_KBcL9UsqpOMk7GhWwokdEmC3fKZg_q7tdyt9LM7RFpA@mail.gmail.com \
--to=peter.maydell@linaro.org \
--cc=qemu-arm@nongnu.org \
--cc=qemu-devel@nongnu.org \
--cc=sebastian.huber@embedded-brains.de \
/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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).