From: "Andreas Färber" <afaerber@suse.de>
To: Peter Crosthwaite <peter.crosthwaite@xilinx.com>,
Alistair Francis <alistair.francis@xilinx.com>
Cc: Peter Maydell <peter.maydell@linaro.org>,
"qemu-devel@nongnu.org Developers" <qemu-devel@nongnu.org>
Subject: Re: [Qemu-devel] [RFC v1 1/2] arm: Add the cortex-a9 CPU to the a9mpcore device
Date: Mon, 16 Jun 2014 12:19:29 +0200 [thread overview]
Message-ID: <539EC4B1.5090709@suse.de> (raw)
In-Reply-To: <CAEgOgz4N5myT410sNF9hCHZDW0AxM-r4ynkxq+78cO3d19C5HQ@mail.gmail.com>
Am 16.06.2014 06:43, schrieb Peter Crosthwaite:
> On Tue, Jun 10, 2014 at 11:32 AM, Alistair Francis
> <alistair.francis@xilinx.com> wrote:
>> This patch adds the Cortex-A9 ARM CPU to the A9MPCore. It
>> first does a check to make sure no other CPUs exist and if
>> they do the Cortex-A9 won't be added. This is implemented to
>> maintain compatibility and can be removed once all machines
>> have been updated
>>
>> This patch also allows the midr and reset-property to be set
>>
>> Signed-off-by: Alistair Francis <alistair.francis@xilinx.com>
>> ---
>> There comments in the code explaining the reason that the CPU
>> is initiated in the realize function. This is because it relies
>> on the num_cpu property, which isn't yet set in the initfn
>> Is this an acceptable compromise?
No, this is not OK as is. The CPUs need to be initialized before
realizing them through the parent, otherwise the CPUs can't have any
additional properties set by user/management.
>>
>> hw/cpu/a9mpcore.c | 43 +++++++++++++++++++++++++++++++++++++++++++
>> include/hw/cpu/a9mpcore.h | 4 ++++
>> 2 files changed, 47 insertions(+), 0 deletions(-)
>>
>> diff --git a/hw/cpu/a9mpcore.c b/hw/cpu/a9mpcore.c
>> index c09358c..1159044 100644
>> --- a/hw/cpu/a9mpcore.c
>> +++ b/hw/cpu/a9mpcore.c
>> @@ -21,6 +21,12 @@ static void a9mp_priv_initfn(Object *obj)
>> {
>> A9MPPrivState *s = A9MPCORE_PRIV(obj);
>>
>> + /* Ideally would init the CPUs here, but the num_cpu property has not been
>> + * set yet. So that only works if assuming a single CPU
>> + * object_initialize(&s->cpu, sizeof(s->cpu), "cortex-a9-" TYPE_ARM_CPU);
>> + * object_property_add_child(obj, "cpu", OBJECT(&s->cpu), NULL);
>> + */
>> +
>
> So you could add an integer property listener to init them earlier (or
> even do dynamic extending/freeing or the allocated CPUs). I'm not sure
> exactly what we are really supposed to do though, when the number of
> child object depends on a prop like this? Andreas?
PMM had added or looked into a property creating an array of properties.
However a more fundamental issue that PMM was unsure about is whether
the CPUs should be child<> of MPCore as done here or a sibling of the
MPCore container.
>> memory_region_init(&s->container, obj, "a9mp-priv-container", 0x2000);
>> sysbus_init_mmio(SYS_BUS_DEVICE(obj), &s->container);
>>
>> @@ -50,6 +56,40 @@ static void a9mp_priv_realize(DeviceState *dev, Error **errp)
>> Error *err = NULL;
>> int i;
>>
>> + /* Just a temporary measure to not break machines that init the CPU
>> + * seperatly */
>
> "separately"
>
>> + if (!first_cpu) {
>> + s->cpu = g_malloc(sizeof(ARMCPU) * s->num_cpu);
>
> g_new should be use to allocate arrays.
Whether malloc or new, more important is to 0-initialize the memory
before running object_initialize() on it! :)
>
>> + for (i = 0; i < s->num_cpu; i++) {
>> + object_initialize((s->cpu + i), sizeof(*(s->cpu + i)),
>
> &s->cpu[i] is more common and easier to read.
>
> sizeof(*s->cpu) is fine.
>
>> + "cortex-a9-" TYPE_ARM_CPU);
>
> Use cpu_class_by_name logic like in some of the boards, rather than
> the string concatenation. The specifics of the concatenation system is
> (supposed to be) private to target-arm code.
+1
>
>> +
>> + if (s->midr) {
>> + object_property_set_int(OBJECT((s->cpu + i)), s->midr,
>> + "midr", &err);
>> + if (err) {
>> + error_propagate(errp, err);
>> + exit(1);
>> + }
>> + }
>> + if (s->reset_cbar) {
>> + object_property_set_int(OBJECT((s->cpu + i)), s->reset_cbar,
>> + "reset-cbar", &err);
>> + if (err) {
>> + error_propagate(errp, err);
>> + exit(1);
>> + }
>> + }
>> + object_property_set_bool(OBJECT((s->cpu + i)), true,
>> + "realized", &err);
>> + if (err) {
>> + error_propagate(errp, err);
>> + return;
>> + }
>> + }
>> + g_free(s->cpu);
>
> Why free the just-initialized CPUs?
>
>> + }
>> +
>> scudev = DEVICE(&s->scu);
>> qdev_prop_set_uint32(scudev, "num-cpu", s->num_cpu);
>> object_property_set_bool(OBJECT(&s->scu), true, "realized", &err);
>> @@ -152,6 +192,9 @@ static Property a9mp_priv_properties[] = {
>> * Other boards may differ and should set this property appropriately.
>> */
>> DEFINE_PROP_UINT32("num-irq", A9MPPrivState, num_irq, 96),
>> + /* Properties for the A9 CPU */
>> + DEFINE_PROP_UINT32("midr", A9MPPrivState, midr, 0),
>> + DEFINE_PROP_UINT64("reset-cbar", A9MPPrivState, reset_cbar, 0),
>> DEFINE_PROP_END_OF_LIST(),
>> };
>>
>> diff --git a/include/hw/cpu/a9mpcore.h b/include/hw/cpu/a9mpcore.h
>> index 5d67ca2..8e395a4 100644
>> --- a/include/hw/cpu/a9mpcore.h
>> +++ b/include/hw/cpu/a9mpcore.h
>> @@ -29,6 +29,10 @@ typedef struct A9MPPrivState {
>> MemoryRegion container;
>> uint32_t num_irq;
>>
>> + ARMCPU *cpu;
>> + uint32_t midr;
>
> I'd preface this as "cpu_midr".
>
>> + uint64_t reset_cbar;
>
> MPCores refer to this as PERIPHBASE in their documentation.
Why have this as separate state at all? Can't those properties be passed
through to the CPUs once created earlier? When the CPUs are not
available, setter can return an Error.
Regards,
Andreas
>> +
>> A9SCUState scu;
>> GICState gic;
>> A9GTimerState gtimer;
>> --
>> 1.7.1
--
SUSE LINUX Products GmbH, Maxfeldstr. 5, 90409 Nürnberg, Germany
GF: Jeff Hawn, Jennifer Guild, Felix Imendörffer; HRB 16746 AG Nürnberg
next prev parent reply other threads:[~2014-06-16 10:19 UTC|newest]
Thread overview: 24+ messages / expand[flat|nested] mbox.gz Atom feed top
2014-06-10 1:32 [Qemu-devel] [RFC v1 1/2] arm: Add the cortex-a9 CPU to the a9mpcore device Alistair Francis
2014-06-10 1:33 ` [Qemu-devel] [RFC v1 2/2] zynq: Update Zynq to init the CPU in " Alistair Francis
2014-06-16 4:42 ` Peter Crosthwaite
2014-06-16 6:50 ` Alistair Francis
2014-06-16 1:17 ` [Qemu-devel] [RFC v1 1/2] arm: Add the cortex-a9 CPU to " Alistair Francis
2014-06-16 4:43 ` Peter Crosthwaite
2014-06-16 6:04 ` Alistair Francis
2014-06-16 10:26 ` Andreas Färber
2014-06-16 10:19 ` Andreas Färber [this message]
2014-06-16 10:34 ` Peter Crosthwaite
2014-06-16 10:58 ` Andreas Färber
2014-06-16 11:11 ` Peter Maydell
2014-06-16 11:17 ` Andreas Färber
2014-06-16 11:22 ` Peter Crosthwaite
2014-06-16 11:23 ` Andreas Färber
2014-06-16 10:44 ` Peter Maydell
2014-06-16 11:18 ` Andreas Färber
2014-06-16 11:20 ` Peter Maydell
2014-06-16 7:40 ` Peter Maydell
2014-06-16 7:46 ` Peter Crosthwaite
2014-06-17 7:16 ` Stefan Hajnoczi
2014-06-17 8:05 ` Paolo Bonzini
2014-06-17 10:12 ` Peter Crosthwaite
2014-06-17 23:33 ` Alistair Francis
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=539EC4B1.5090709@suse.de \
--to=afaerber@suse.de \
--cc=alistair.francis@xilinx.com \
--cc=peter.crosthwaite@xilinx.com \
--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 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).